From 24557bc2b37deb6a0edf497d547471832457b1dd Mon Sep 17 00:00:00 2001 From: Thinkofdeath Date: Wed, 26 Nov 2014 08:32:16 +1100 Subject: [PATCH] Update to Minecraft 1.8 For more information please see http://www.spigotmc.org/ --- .gitignore | 2 + makePatches.sh | 16 + nms-patches/BiomeTheEndDecorator.patch | 11 + nms-patches/Block.patch | 23 + nms-patches/BlockBloodStone.patch | 28 + nms-patches/BlockButtonAbstract.patch | 111 + nms-patches/BlockCactus.patch | 31 + nms-patches/BlockCake.patch | 22 + nms-patches/BlockCocoa.patch | 35 + nms-patches/BlockCommand.patch | 34 + nms-patches/BlockCrops.patch | 35 + nms-patches/BlockDaylightDetector.patch | 10 + nms-patches/BlockDiodeAbstract.patch | 30 + nms-patches/BlockDispenser.patch | 18 + nms-patches/BlockDoor.patch | 43 + nms-patches/BlockDragonEgg.patch | 30 + nms-patches/BlockDropper.patch | 41 + nms-patches/BlockEnderPortal.patch | 22 + nms-patches/BlockFire.patch | 110 + nms-patches/BlockFlowing.patch | 83 + nms-patches/BlockGrass.patch | 77 + nms-patches/BlockIce.patch | 15 + nms-patches/BlockLeaves.patch | 26 + nms-patches/BlockLever.patch | 32 + nms-patches/BlockMinecartDetector.patch | 29 + nms-patches/BlockMobSpawner.patch | 22 + nms-patches/BlockMonsterEggs.patch | 20 + nms-patches/BlockMushroom.patch | 57 + nms-patches/BlockMycel.patch | 58 + nms-patches/BlockNetherWart.patch | 12 + nms-patches/BlockOre.patch | 42 + nms-patches/BlockPiston.patch | 76 + nms-patches/BlockPortal.patch | 53 + nms-patches/BlockPoweredRail.patch | 25 + nms-patches/BlockPressurePlateAbstract.patch | 31 + nms-patches/BlockPressurePlateBinary.patch | 38 + nms-patches/BlockPressurePlateWeighted.patch | 43 + nms-patches/BlockPumpkin.patch | 117 + nms-patches/BlockRedstoneLamp.patch | 47 + nms-patches/BlockRedstoneOre.patch | 102 + nms-patches/BlockRedstoneTorch.patch | 55 + nms-patches/BlockRedstoneWire.patch | 27 + nms-patches/BlockReed.patch | 18 + nms-patches/BlockSapling.patch | 125 + nms-patches/BlockSkull.patch | 133 + nms-patches/BlockSnow.patch | 14 + nms-patches/BlockSoil.patch | 52 + nms-patches/BlockStationary.patch | 40 + nms-patches/BlockStem.patch | 41 + nms-patches/BlockTrapdoor.patch | 31 + nms-patches/BlockTripwire.patch | 52 + nms-patches/BlockTripwireHook.patch | 29 + nms-patches/BlockVine.patch | 76 + nms-patches/Chunk.patch | 169 + nms-patches/ChunkProviderServer.patch | 348 ++ nms-patches/ChunkRegionLoader.patch | 131 + nms-patches/ChunkSection.patch | 21 + .../CommandBlockListenerAbstract.patch | 162 + nms-patches/Container.patch | 204 ++ nms-patches/ContainerAnvil.patch | 51 + nms-patches/ContainerAnvilInventory.patch | 58 + nms-patches/ContainerBeacon.patch | 47 + nms-patches/ContainerBrewingStand.patch | 52 + nms-patches/ContainerChest.patch | 59 + nms-patches/ContainerDispenser.patch | 54 + nms-patches/ContainerEnchantTable.patch | 170 + .../ContainerEnchantTableInventory.patch | 58 + nms-patches/ContainerFurnace.patch | 51 + nms-patches/ContainerHopper.patch | 44 + nms-patches/ContainerHorse.patch | 36 + nms-patches/ContainerMerchant.patch | 36 + nms-patches/ContainerPlayer.patch | 74 + nms-patches/ContainerWorkbench.patch | 79 + nms-patches/ControllerLook.patch | 23 + nms-patches/ControllerMove.patch | 12 + nms-patches/CraftingManager.patch | 57 + nms-patches/CrashReport.patch | 10 + nms-patches/DedicatedServer.patch | 162 + nms-patches/DispenseBehaviorArmor.patch | 59 + nms-patches/DispenseBehaviorBoat.patch | 54 + nms-patches/DispenseBehaviorBonemeal.patch | 44 + nms-patches/DispenseBehaviorEmptyBucket.patch | 44 + .../DispenseBehaviorFilledBucket.patch | 65 + nms-patches/DispenseBehaviorFireball.patch | 55 + .../DispenseBehaviorFlintAndSteel.patch | 57 + nms-patches/DispenseBehaviorItem.patch | 76 + nms-patches/DispenseBehaviorMinecart.patch | 58 + nms-patches/DispenseBehaviorMonsterEgg.patch | 61 + nms-patches/DispenseBehaviorProjectile.patch | 54 + nms-patches/DispenseBehaviorTNT.patch | 56 + nms-patches/Enchantment.patch | 19 + nms-patches/Entity.patch | 578 ++++ nms-patches/EntityAgeable.patch | 48 + nms-patches/EntityArrow.patch | 106 + nms-patches/EntityBoat.patch | 249 ++ nms-patches/EntityChicken.patch | 14 + nms-patches/EntityCow.patch | 42 + nms-patches/EntityCreature.patch | 31 + nms-patches/EntityCreeper.patch | 104 + nms-patches/EntityDamageSourceIndirect.patch | 14 + nms-patches/EntityEgg.patch | 65 + nms-patches/EntityEnderCrystal.patch | 43 + nms-patches/EntityEnderDragon.patch | 330 ++ nms-patches/EntityEnderPearl.patch | 50 + nms-patches/EntityEnderman.patch | 34 + nms-patches/EntityExperienceOrb.patch | 82 + nms-patches/EntityFallingBlock.patch | 44 + nms-patches/EntityFireball.patch | 111 + nms-patches/EntityFishingHook.patch | 159 + nms-patches/EntityHanging.patch | 111 + nms-patches/EntityHorse.patch | 140 + nms-patches/EntityHuman.patch | 383 +++ nms-patches/EntityInsentient.patch | 164 + nms-patches/EntityIronGolem.patch | 11 + nms-patches/EntityItem.patch | 115 + nms-patches/EntityItemFrame.patch | 15 + nms-patches/EntityLargeFireball.patch | 38 + nms-patches/EntityLeash.patch | 61 + nms-patches/EntityLightning.patch | 111 + nms-patches/EntityLiving.patch | 440 +++ nms-patches/EntityMinecartAbstract.patch | 231 ++ .../EntityMinecartCommandBlockListener.patch | 10 + nms-patches/EntityMinecartContainer.patch | 61 + nms-patches/EntityMonster.patch | 26 + nms-patches/EntityMushroomCow.patch | 26 + nms-patches/EntityOcelot.patch | 30 + nms-patches/EntityPainting.patch | 10 + nms-patches/EntityPig.patch | 29 + nms-patches/EntityPlayer.patch | 542 ++++ nms-patches/EntityPotion.patch | 70 + nms-patches/EntityProjectile.patch | 31 + nms-patches/EntitySheep.patch | 54 + nms-patches/EntitySkeleton.patch | 60 + nms-patches/EntitySlime.patch | 40 + nms-patches/EntitySmallFireball.patch | 39 + nms-patches/EntitySnowman.patch | 42 + nms-patches/EntitySpider.patch | 11 + nms-patches/EntitySquid.patch | 37 + nms-patches/EntityTNTPrimed.patch | 52 + nms-patches/EntityThrownExpBottle.patch | 22 + nms-patches/EntityTrackerEntry.patch | 176 + nms-patches/EntityVillager.patch | 19 + nms-patches/EntityWither.patch | 78 + nms-patches/EntityWitherSkull.patch | 36 + nms-patches/EntityWolf.patch | 87 + nms-patches/EntityZombie.patch | 108 + nms-patches/ExpirableListEntry.patch | 42 + nms-patches/Explosion.patch | 127 + nms-patches/FoodMetaData.patch | 66 + nms-patches/HandshakeListener.patch | 69 + nms-patches/IDataManager.patch | 18 + nms-patches/IInventory.patch | 31 + nms-patches/IRecipe.patch | 9 + nms-patches/InventoryCraftResult.patch | 48 + nms-patches/InventoryCrafting.patch | 64 + nms-patches/InventoryEnderChest.patch | 51 + nms-patches/InventoryHorseChest.patch | 63 + nms-patches/InventoryLargeChest.patch | 66 + nms-patches/InventoryMerchant.patch | 59 + nms-patches/InventorySubcontainer.patch | 59 + nms-patches/ItemBoat.patch | 17 + nms-patches/ItemBow.patch | 49 + nms-patches/ItemBucket.patch | 102 + nms-patches/ItemDye.patch | 28 + nms-patches/ItemFireball.patch | 19 + nms-patches/ItemFishingRod.patch | 31 + nms-patches/ItemFlintAndSteel.patch | 47 + nms-patches/ItemHanging.patch | 41 + nms-patches/ItemLeash.patch | 35 + nms-patches/ItemMapEmpty.patch | 24 + nms-patches/ItemMinecart.patch | 16 + nms-patches/ItemMonsterEgg.patch | 25 + nms-patches/ItemStack.patch | 219 ++ nms-patches/ItemWaterLily.patch | 18 + nms-patches/ItemWorldMap.patch | 75 + nms-patches/JsonList.patch | 33 + nms-patches/LoginListener.patch | 35 + nms-patches/MethodProfiler.patch | 135 + nms-patches/MinecraftServer.patch | 726 +++++ nms-patches/MobEffectList.patch | 74 + nms-patches/MobSpawnerAbstract.patch | 38 + .../NameReferencingFileConverter.patch | 76 + nms-patches/NetworkManager.patch | 20 + nms-patches/Packet.patch | 14 + nms-patches/PacketDataSerializer.patch | 122 + nms-patches/PacketPlayInBlockPlace.patch | 32 + nms-patches/PacketPlayInCloseWindow.patch | 29 + nms-patches/PacketStatusListener.patch | 113 + nms-patches/Path.patch | 11 + nms-patches/PathfinderGoalBreakDoor.patch | 15 + nms-patches/PathfinderGoalBreed.patch | 23 + nms-patches/PathfinderGoalDefendVillage.patch | 11 + nms-patches/PathfinderGoalEatTile.patch | 34 + .../PathfinderGoalEndermanPickupBlock.patch | 17 + .../PathfinderGoalEndermanPlaceBlock.patch | 15 + .../PathfinderGoalGhastAttackTarget.patch | 12 + nms-patches/PathfinderGoalHurtByTarget.patch | 19 + nms-patches/PathfinderGoalMakeLove.patch | 11 + ...athfinderGoalNearestAttackableTarget.patch | 11 + ...oalNearestAttackableTargetInsentient.patch | 11 + .../PathfinderGoalOwnerHurtByTarget.patch | 11 + .../PathfinderGoalOwnerHurtTarget.patch | 11 + nms-patches/PathfinderGoalPanic.patch | 15 + nms-patches/PathfinderGoalSelector.patch | 32 + .../PathfinderGoalSilverfishHideInBlock.patch | 14 + .../PathfinderGoalSilverfishWakeOthers.patch | 14 + nms-patches/PathfinderGoalSit.patch | 11 + nms-patches/PathfinderGoalTame.patch | 31 + .../PathfinderGoalTargetNearestPlayer.patch | 11 + nms-patches/PlayerChunk.patch | 104 + nms-patches/PlayerChunkMap.patch | 208 ++ nms-patches/PlayerConnection.patch | 1458 +++++++++ nms-patches/PlayerDatFileConverter.patch | 33 + nms-patches/PlayerInteractManager.patch | 289 ++ nms-patches/PlayerInventory.patch | 100 + nms-patches/PlayerList.patch | 788 +++++ nms-patches/PlayerSelector.patch | 14 + nms-patches/PortalCreator.patch | 102 + nms-patches/PortalTravelAgent.patch | 273 ++ nms-patches/PropertyManager.patch | 94 + nms-patches/RecipeArmorDye.patch | 18 + nms-patches/RecipeBookClone.patch | 17 + nms-patches/RecipeFireworks.patch | 21 + nms-patches/RecipeMapClone.patch | 17 + nms-patches/RecipeRepair.patch | 39 + nms-patches/RecipesBannerInnerClass1.patch | 17 + nms-patches/RecipesBannerInnerClass2.patch | 17 + nms-patches/RecipesFurnace.patch | 49 + nms-patches/RegionFile.patch | 81 + .../RemoteControlCommandListener.patch | 15 + nms-patches/ScoreboardServer.patch | 126 + nms-patches/SecondaryWorldServer.patch | 15 + nms-patches/ShapedRecipes.patch | 77 + nms-patches/ShapelessRecipes.patch | 35 + nms-patches/SlotFurnaceResult.patch | 31 + nms-patches/SpawnerCreature.patch | 109 + nms-patches/StatisticManager.patch | 15 + nms-patches/SwitchHelperLogVariant.patch | 9 + nms-patches/ThreadCommandReader.patch | 43 + nms-patches/ThreadPlayerLookupUUID.patch | 72 + nms-patches/TileEntity.patch | 24 + nms-patches/TileEntityBeacon.patch | 54 + nms-patches/TileEntityBrewingStand.patch | 94 + nms-patches/TileEntityChest.patch | 104 + nms-patches/TileEntityCommandListener.patch | 10 + nms-patches/TileEntityDispenser.patch | 63 + nms-patches/TileEntityFurnace.patch | 183 ++ nms-patches/TileEntityHopper.patch | 154 + nms-patches/TileEntityNote.patch | 16 + nms-patches/TileEntityPiston.patch | 10 + nms-patches/TileEntityRecordPlayer.patch | 14 + nms-patches/TileEntitySkull.patch | 13 + nms-patches/Village.patch | 11 + nms-patches/VillageSiege.patch | 11 + nms-patches/World.patch | 560 ++++ nms-patches/WorldBorder.patch | 25 + nms-patches/WorldGenGroundBush.patch | 14 + nms-patches/WorldGenMegaTreeAbstract.patch | 11 + nms-patches/WorldGenVillagePiece.patch | 11 + nms-patches/WorldGenVillagePieces.patch | 0 nms-patches/WorldGenWitchHut.patch | 11 + nms-patches/WorldManager.patch | 28 + nms-patches/WorldMap.patch | 95 + nms-patches/WorldMapHumanTracker.patch | 31 + nms-patches/WorldNBTStorage.patch | 123 + nms-patches/WorldServer.patch | 550 ++++ pom.xml | 31 +- .../server/BiomeTheEndDecorator.java | 28 - src/main/java/net/minecraft/server/Block.java | 807 ----- .../minecraft/server/BlockActionDataList.java | 13 - .../net/minecraft/server/BlockBloodStone.java | 27 - .../minecraft/server/BlockButtonAbstract.java | 332 -- .../net/minecraft/server/BlockCactus.java | 86 - .../java/net/minecraft/server/BlockCake.java | 98 - .../java/net/minecraft/server/BlockCocoa.java | 144 - .../net/minecraft/server/BlockCommand.java | 87 - .../java/net/minecraft/server/BlockCrops.java | 136 - .../server/BlockDaylightDetector.java | 72 - .../minecraft/server/BlockDiodeAbstract.java | 259 -- .../net/minecraft/server/BlockDispenser.java | 189 -- .../java/net/minecraft/server/BlockDoor.java | 240 -- .../net/minecraft/server/BlockDragonEgg.java | 121 - .../net/minecraft/server/BlockDropper.java | 75 - .../minecraft/server/BlockEnderPortal.java | 66 - .../java/net/minecraft/server/BlockFire.java | 281 -- .../net/minecraft/server/BlockFlowing.java | 299 -- .../java/net/minecraft/server/BlockGrass.java | 121 - .../net/minecraft/server/BlockHopper.java | 166 - .../java/net/minecraft/server/BlockIce.java | 65 - .../net/minecraft/server/BlockLeaves.java | 203 -- .../java/net/minecraft/server/BlockLever.java | 278 -- .../server/BlockMinecartDetector.java | 120 - .../net/minecraft/server/BlockMobSpawner.java | 41 - .../minecraft/server/BlockMonsterEggs.java | 121 - .../net/minecraft/server/BlockMushroom.java | 126 - .../java/net/minecraft/server/BlockMycel.java | 64 - .../net/minecraft/server/BlockNetherWart.java | 62 - .../java/net/minecraft/server/BlockOre.java | 83 - .../net/minecraft/server/BlockPiston.java | 400 --- .../server/BlockPistonExtension.java | 169 - .../net/minecraft/server/BlockPortal.java | 122 - .../minecraft/server/BlockPoweredRail.java | 146 - .../server/BlockPressurePlateAbstract.java | 174 - .../server/BlockPressurePlateBinary.java | 74 - .../server/BlockPressurePlateWeighted.java | 58 - .../net/minecraft/server/BlockPumpkin.java | 98 - .../minecraft/server/BlockRedstoneLamp.java | 70 - .../minecraft/server/BlockRedstoneOre.java | 155 - .../minecraft/server/BlockRedstoneTorch.java | 176 - .../minecraft/server/BlockRedstoneWire.java | 323 -- .../java/net/minecraft/server/BlockReed.java | 81 - .../net/minecraft/server/BlockSapling.java | 203 -- .../java/net/minecraft/server/BlockSign.java | 127 - .../java/net/minecraft/server/BlockSkull.java | 244 -- .../java/net/minecraft/server/BlockSnow.java | 93 - .../java/net/minecraft/server/BlockSoil.java | 121 - .../net/minecraft/server/BlockStationary.java | 93 - .../java/net/minecraft/server/BlockStem.java | 190 -- .../net/minecraft/server/BlockTallPlant.java | 160 - .../net/minecraft/server/BlockTrapdoor.java | 212 -- .../net/minecraft/server/BlockTripwire.java | 201 -- .../minecraft/server/BlockTripwireHook.java | 300 -- .../java/net/minecraft/server/BlockVine.java | 304 -- src/main/java/net/minecraft/server/Chunk.java | 1093 ------- .../minecraft/server/ChunkProviderServer.java | 399 --- .../minecraft/server/ChunkRegionLoader.java | 406 --- .../net/minecraft/server/ChunkSection.java | 488 --- .../server/ClientCommandOrdinalWrapper.java | 27 - .../server/CommandBlockListenerAbstract.java | 230 -- .../java/net/minecraft/server/Container.java | 615 ---- .../net/minecraft/server/ContainerAnvil.java | 400 --- .../server/ContainerAnvilInventory.java | 58 - .../net/minecraft/server/ContainerBeacon.java | 114 - .../server/ContainerBrewingStand.java | 126 - .../net/minecraft/server/ContainerChest.java | 104 - .../minecraft/server/ContainerDispenser.java | 91 - .../server/ContainerEnchantTable.java | 284 -- .../ContainerEnchantTableInventory.java | 57 - .../minecraft/server/ContainerFurnace.java | 135 - .../net/minecraft/server/ContainerHopper.java | 85 - .../net/minecraft/server/ContainerHorse.java | 104 - .../minecraft/server/ContainerMerchant.java | 131 - .../net/minecraft/server/ContainerPlayer.java | 157 - .../minecraft/server/ContainerWorkbench.java | 145 - .../net/minecraft/server/ControllerLook.java | 87 - .../net/minecraft/server/ControllerMove.java | 71 - .../net/minecraft/server/CraftingManager.java | 313 -- .../net/minecraft/server/CrashReport.java | 235 -- .../net/minecraft/server/DedicatedServer.java | 472 --- .../server/DispenseBehaviorArmor.java | 67 - .../server/DispenseBehaviorBoat.java | 73 - .../server/DispenseBehaviorBonemeal.java | 67 - .../server/DispenseBehaviorEmptyBucket.java | 68 - .../server/DispenseBehaviorFilledBucket.java | 69 - .../server/DispenseBehaviorFireball.java | 65 - .../server/DispenseBehaviorFireworks.java | 58 - .../server/DispenseBehaviorFlintAndSteel.java | 71 - .../server/DispenseBehaviorItem.java | 98 - .../server/DispenseBehaviorMinecart.java | 78 - .../server/DispenseBehaviorMonsterEgg.java | 57 - .../server/DispenseBehaviorProjectile.java | 66 - .../minecraft/server/DispenseBehaviorTNT.java | 52 - .../net/minecraft/server/Enchantment.java | 122 - .../java/net/minecraft/server/Entity.java | 1892 ----------- .../net/minecraft/server/EntityAgeable.java | 124 - .../net/minecraft/server/EntityArrow.java | 462 --- .../java/net/minecraft/server/EntityBoat.java | 498 --- .../net/minecraft/server/EntityChicken.java | 158 - .../java/net/minecraft/server/EntityCow.java | 110 - .../net/minecraft/server/EntityCreature.java | 313 -- .../net/minecraft/server/EntityCreeper.java | 228 -- .../server/EntityDamageSourceIndirect.java | 34 - .../java/net/minecraft/server/EntityEgg.java | 68 - .../minecraft/server/EntityEnderCrystal.java | 88 - .../minecraft/server/EntityEnderDragon.java | 682 ---- .../minecraft/server/EntityEnderPearl.java | 60 - .../net/minecraft/server/EntityEnderman.java | 382 --- .../minecraft/server/EntityExperienceOrb.java | 188 -- .../minecraft/server/EntityFallingBlock.java | 233 -- .../net/minecraft/server/EntityFireball.java | 269 -- .../net/minecraft/server/EntityFireworks.java | 121 - .../minecraft/server/EntityFishingHook.java | 475 --- .../net/minecraft/server/EntityGhast.java | 238 -- .../net/minecraft/server/EntityHanging.java | 340 -- .../net/minecraft/server/EntityHorse.java | 1226 ------- .../net/minecraft/server/EntityHuman.java | 1599 --------- .../minecraft/server/EntityInsentient.java | 892 ----- .../net/minecraft/server/EntityIronGolem.java | 190 -- .../java/net/minecraft/server/EntityItem.java | 341 -- .../net/minecraft/server/EntityItemFrame.java | 152 - .../minecraft/server/EntityLargeFireball.java | 49 - .../net/minecraft/server/EntityLeash.java | 137 - .../net/minecraft/server/EntityLightning.java | 133 - .../net/minecraft/server/EntityLiving.java | 1720 ---------- .../server/EntityMinecartAbstract.java | 882 ----- .../EntityMinecartCommandBlockListener.java | 25 - .../server/EntityMinecartContainer.java | 243 -- .../net/minecraft/server/EntityMonster.java | 177 - .../minecraft/server/EntityMushroomCow.java | 72 - .../net/minecraft/server/EntityOcelot.java | 232 -- .../net/minecraft/server/EntityPainting.java | 81 - .../java/net/minecraft/server/EntityPig.java | 159 - .../net/minecraft/server/EntityPigZombie.java | 160 - .../net/minecraft/server/EntityPlayer.java | 1112 ------- .../net/minecraft/server/EntityPotion.java | 157 - .../minecraft/server/EntityProjectile.java | 249 -- .../net/minecraft/server/EntitySheep.java | 219 -- .../minecraft/server/EntitySilverfish.java | 171 - .../net/minecraft/server/EntitySkeleton.java | 294 -- .../net/minecraft/server/EntitySlime.java | 265 -- .../minecraft/server/EntitySmallFireball.java | 85 - .../net/minecraft/server/EntitySnowman.java | 89 - .../net/minecraft/server/EntitySpider.java | 162 - .../net/minecraft/server/EntitySquid.java | 151 - .../net/minecraft/server/EntityTNTPrimed.java | 98 - .../server/EntityThrownExpBottle.java | 53 - .../net/minecraft/server/EntityTracker.java | 211 -- .../minecraft/server/EntityTrackerEntry.java | 523 --- .../net/minecraft/server/EntityWither.java | 477 --- .../minecraft/server/EntityWitherSkull.java | 93 - .../java/net/minecraft/server/EntityWolf.java | 379 --- .../net/minecraft/server/EntityZombie.java | 524 --- .../minecraft/server/ExpirableListEntry.java | 95 - .../java/net/minecraft/server/Explosion.java | 269 -- .../server/FileConversionException.java | 22 - .../net/minecraft/server/FoodMetaData.java | 116 - .../net/minecraft/server/GroupDataZombie.java | 21 - .../minecraft/server/HandshakeListener.java | 99 - .../net/minecraft/server/IDataManager.java | 28 - .../java/net/minecraft/server/IInventory.java | 48 - .../java/net/minecraft/server/IRecipe.java | 14 - .../java/net/minecraft/server/IntHashMap.java | 167 - .../server/InventoryCraftResult.java | 96 - .../minecraft/server/InventoryCrafting.java | 149 - .../minecraft/server/InventoryEnderChest.java | 110 - .../minecraft/server/InventoryHorseChest.java | 60 - .../minecraft/server/InventoryLargeChest.java | 129 - .../minecraft/server/InventoryMerchant.java | 192 -- .../server/InventorySubcontainer.java | 120 - src/main/java/net/minecraft/server/Item.java | 503 --- .../java/net/minecraft/server/ItemBoat.java | 93 - .../java/net/minecraft/server/ItemBow.java | 109 - .../java/net/minecraft/server/ItemBucket.java | 171 - .../java/net/minecraft/server/ItemDye.java | 129 - .../net/minecraft/server/ItemFireball.java | 67 - .../net/minecraft/server/ItemFishingRod.java | 47 - .../minecraft/server/ItemFlintAndSteel.java | 72 - .../net/minecraft/server/ItemHanging.java | 67 - .../java/net/minecraft/server/ItemLeash.java | 70 - .../net/minecraft/server/ItemMapEmpty.java | 37 - .../net/minecraft/server/ItemMinecart.java | 40 - .../net/minecraft/server/ItemMonsterEgg.java | 124 - .../java/net/minecraft/server/ItemStack.java | 593 ---- .../net/minecraft/server/ItemWaterLily.java | 48 - .../net/minecraft/server/ItemWorldMap.java | 231 -- .../java/net/minecraft/server/JsonList.java | 166 - .../net/minecraft/server/JsonListEntry.java | 26 - .../server/JsonListEntrySerializer.java | 51 - .../net/minecraft/server/LoginListener.java | 151 - .../net/minecraft/server/MethodProfiler.java | 24 - .../net/minecraft/server/MinecraftServer.java | 1321 -------- .../net/minecraft/server/MobEffectList.java | 231 -- .../minecraft/server/MobSpawnerAbstract.java | 286 -- .../server/NameReferencingFileConverter.java | 402 --- .../net/minecraft/server/NetworkManager.java | 210 -- .../java/net/minecraft/server/Packet.java | 63 - .../server/PacketDataSerializer.java | 726 ----- .../PacketHandshakingInSetProtocol.java | 47 - .../minecraft/server/PacketPlayInChat.java | 49 - .../server/PacketPlayInCloseWindow.java | 29 - .../server/PacketPlayInCustomPayload.java | 45 - .../server/PacketPlayOutBlockChange.java | 48 - .../server/PacketPlayOutMapChunkBulk.java | 190 -- .../server/PacketPlayOutNamedEntitySpawn.java | 102 - .../server/PacketPlayOutSpawnPosition.java | 44 - .../server/PacketStatusListener.java | 128 - src/main/java/net/minecraft/server/Path.java | 128 - .../server/PathfinderGoalArrowAttack.java | 105 - .../server/PathfinderGoalBreakDoor.java | 59 - .../minecraft/server/PathfinderGoalBreed.java | 112 - .../server/PathfinderGoalEatTile.java | 75 - .../server/PathfinderGoalHurtByTarget.java | 48 - .../server/PathfinderGoalMakeLove.java | 90 - .../server/PathfinderGoalMeleeAttack.java | 103 - .../server/PathfinderGoalOcelotAttack.java | 63 - .../minecraft/server/PathfinderGoalPanic.java | 47 - .../server/PathfinderGoalSelector.java | 153 - .../minecraft/server/PathfinderGoalSit.java | 39 - .../minecraft/server/PathfinderGoalTame.java | 72 - .../server/PathfinderGoalTarget.java | 165 - .../net/minecraft/server/PlayerAbilities.java | 54 - .../net/minecraft/server/PlayerChunk.java | 215 -- .../net/minecraft/server/PlayerChunkMap.java | 371 --- .../minecraft/server/PlayerConnection.java | 1855 ----------- .../server/PlayerDatFileConverter.java | 98 - .../server/PlayerInteractManager.java | 411 --- .../net/minecraft/server/PlayerInventory.java | 539 ---- .../java/net/minecraft/server/PlayerList.java | 1216 ------- .../net/minecraft/server/PlayerSelector.java | 247 -- .../net/minecraft/server/PortalCreator.java | 197 -- .../minecraft/server/PortalTravelAgent.java | 533 --- .../net/minecraft/server/PropertyManager.java | 130 - .../server/ProtocolOrdinalWrapper.java | 21 - .../net/minecraft/server/QueuedPacket.java | 23 - .../net/minecraft/server/RecipeArmorDye.java | 124 - .../net/minecraft/server/RecipeBookClone.java | 68 - .../net/minecraft/server/RecipeFireworks.java | 176 - .../net/minecraft/server/RecipeMapClone.java | 82 - .../net/minecraft/server/RecipesFurnace.java | 121 - .../java/net/minecraft/server/RegionFile.java | 289 -- .../server/RemoteControlCommandListener.java | 47 - .../minecraft/server/ScoreboardServer.java | 222 -- .../server/SecondaryWorldServer.java | 14 - .../net/minecraft/server/ShapedRecipes.java | 159 - .../minecraft/server/ShapelessRecipes.java | 78 - src/main/java/net/minecraft/server/Slot.java | 74 - .../minecraft/server/SlotFurnaceResult.java | 85 - .../net/minecraft/server/SpawnerCreature.java | 255 -- .../minecraft/server/StatisticManager.java | 68 - .../minecraft/server/ThreadCommandReader.java | 45 - .../server/ThreadPlayerLookupUUID.java | 96 - .../java/net/minecraft/server/TileEntity.java | 183 -- .../minecraft/server/TileEntityBeacon.java | 276 -- .../server/TileEntityBrewingStand.java | 297 -- .../net/minecraft/server/TileEntityChest.java | 410 --- .../server/TileEntityCommandListener.java | 29 - .../minecraft/server/TileEntityDispenser.java | 188 -- .../minecraft/server/TileEntityFurnace.java | 343 -- .../minecraft/server/TileEntityHopper.java | 584 ---- .../net/minecraft/server/TileEntityNote.java | 61 - .../minecraft/server/TileEntityPiston.java | 132 - .../server/TileEntityRecordPlayer.java | 40 - .../net/minecraft/server/TileEntitySign.java | 63 - .../net/minecraft/server/TileEntitySkull.java | 97 - .../java/net/minecraft/server/Village.java | 446 --- .../net/minecraft/server/VillageSiege.java | 172 - src/main/java/net/minecraft/server/World.java | 2873 ----------------- .../net/minecraft/server/WorldGenBigTree.java | 372 --- .../minecraft/server/WorldGenGroundBush.java | 53 - .../server/WorldGenMegaTreeAbstract.java | 126 - .../server/WorldGenVillagePiece.java | 189 -- .../server/WorldGenVillagePieces.java | 199 -- .../minecraft/server/WorldGenWitchHut.java | 87 - .../net/minecraft/server/WorldManager.java | 73 - .../java/net/minecraft/server/WorldMap.java | 243 -- .../server/WorldMapHumanTracker.java | 103 - .../net/minecraft/server/WorldNBTStorage.java | 310 -- .../net/minecraft/server/WorldServer.java | 1006 ------ .../java/org/bukkit/craftbukkit/CraftArt.java | 12 +- .../org/bukkit/craftbukkit/CraftChunk.java | 62 +- .../craftbukkit/CraftOfflinePlayer.java | 2 +- .../craftbukkit/CraftProfileBanEntry.java | 2 +- .../craftbukkit/CraftProfileBanList.java | 2 +- .../org/bukkit/craftbukkit/CraftServer.java | 200 +- .../bukkit/craftbukkit/CraftStatistic.java | 16 +- .../bukkit/craftbukkit/CraftTravelAgent.java | 15 +- .../org/bukkit/craftbukkit/CraftWorld.java | 86 +- .../bukkit/craftbukkit/block/CraftBanner.java | 105 + .../bukkit/craftbukkit/block/CraftBlock.java | 119 +- .../craftbukkit/block/CraftBlockState.java | 3 +- .../bukkit/craftbukkit/block/CraftChest.java | 9 +- .../craftbukkit/block/CraftDispenser.java | 3 +- .../craftbukkit/block/CraftDropper.java | 3 +- .../craftbukkit/block/CraftJukebox.java | 15 +- .../craftbukkit/block/CraftNoteBlock.java | 7 +- .../bukkit/craftbukkit/block/CraftSign.java | 30 +- .../bukkit/craftbukkit/block/CraftSkull.java | 4 +- .../craftbukkit/chunkio/ChunkIOProvider.java | 6 +- .../command/CraftBlockCommandSender.java | 2 +- .../CraftRemoteConsoleCommandSender.java | 3 +- .../command/VanillaCommandWrapper.java | 68 +- .../craftbukkit/entity/CraftArmorStand.java | 214 ++ .../bukkit/craftbukkit/entity/CraftArrow.java | 2 +- .../craftbukkit/entity/CraftCreature.java | 13 +- .../craftbukkit/entity/CraftEnderman.java | 7 +- .../craftbukkit/entity/CraftEndermite.java | 23 + .../craftbukkit/entity/CraftEntity.java | 50 +- .../craftbukkit/entity/CraftFallingSand.java | 4 +- .../bukkit/craftbukkit/entity/CraftFish.java | 3 +- .../craftbukkit/entity/CraftGuardian.java | 23 + .../craftbukkit/entity/CraftHanging.java | 29 +- .../bukkit/craftbukkit/entity/CraftHorse.java | 2 +- .../craftbukkit/entity/CraftHumanEntity.java | 45 +- .../craftbukkit/entity/CraftLivingEntity.java | 49 +- .../craftbukkit/entity/CraftPainting.java | 4 +- .../craftbukkit/entity/CraftPlayer.java | 140 +- .../craftbukkit/entity/CraftRabbit.java | 23 + .../bukkit/craftbukkit/entity/CraftSheep.java | 5 +- .../entity/CraftTameableAnimal.java | 2 +- .../craftbukkit/entity/CraftVillager.java | 10 +- .../craftbukkit/entity/CraftWaterMob.java | 3 +- .../bukkit/craftbukkit/entity/CraftWolf.java | 5 +- .../craftbukkit/event/CraftEventFactory.java | 63 +- .../generator/CustomChunkGenerator.java | 70 +- .../generator/NormalChunkGenerator.java | 48 +- .../craftbukkit/inventory/CraftContainer.java | 36 +- .../craftbukkit/inventory/CraftInventory.java | 9 +- .../inventory/CraftInventoryCrafting.java | 2 +- .../inventory/CraftInventoryCustom.java | 61 +- .../inventory/CraftInventoryDoubleChest.java | 4 +- .../inventory/CraftInventoryEnchanting.java | 12 + .../inventory/CraftItemFactory.java | 2 + .../craftbukkit/inventory/CraftItemStack.java | 38 +- .../inventory/CraftMetaBanner.java | 196 ++ .../craftbukkit/inventory/CraftMetaBook.java | 51 +- .../inventory/CraftMetaCharge.java | 5 +- .../craftbukkit/inventory/CraftMetaSkull.java | 3 +- .../craftbukkit/map/CraftMapCanvas.java | 2 +- .../craftbukkit/map/CraftMapRenderer.java | 7 +- .../CraftBlockProjectileSource.java | 24 +- .../craftbukkit/scoreboard/CraftCriteria.java | 3 - .../scoreboard/CraftScoreboard.java | 8 +- .../craftbukkit/updater/ArtifactDetails.java | 128 - .../craftbukkit/updater/AutoUpdater.java | 127 - .../updater/BukkitDLUpdaterService.java | 102 - .../util/BlockStateListPopulator.java | 7 + .../craftbukkit/util/CraftChatMessage.java | 45 +- .../craftbukkit/util/CraftMagicNumbers.java | 11 +- .../craftbukkit/util/LazyPlayerSet.java | 50 +- .../craftbukkit/util/MojangNameLookup.java | 6 +- .../util/TerminalConsoleWriterThread.java | 2 +- src/main/resources/configurations/bukkit.yml | 7 - src/test/java/org/bukkit/DyeColorsTest.java | 5 +- src/test/java/org/bukkit/PerMaterialTest.java | 11 +- .../craftbukkit/inventory/ItemMetaTest.java | 14 +- .../updater/BukkitDLUpdaterServiceTest.java | 32 - .../bukkit/support/AbstractTestingBase.java | 55 +- .../org/bukkit/support/DummyEnchantments.java | 2 +- 628 files changed, 22151 insertions(+), 65098 deletions(-) create mode 100755 makePatches.sh create mode 100644 nms-patches/BiomeTheEndDecorator.patch create mode 100644 nms-patches/Block.patch create mode 100644 nms-patches/BlockBloodStone.patch create mode 100644 nms-patches/BlockButtonAbstract.patch create mode 100644 nms-patches/BlockCactus.patch create mode 100644 nms-patches/BlockCake.patch create mode 100644 nms-patches/BlockCocoa.patch create mode 100644 nms-patches/BlockCommand.patch create mode 100644 nms-patches/BlockCrops.patch create mode 100644 nms-patches/BlockDaylightDetector.patch create mode 100644 nms-patches/BlockDiodeAbstract.patch create mode 100644 nms-patches/BlockDispenser.patch create mode 100644 nms-patches/BlockDoor.patch create mode 100644 nms-patches/BlockDragonEgg.patch create mode 100644 nms-patches/BlockDropper.patch create mode 100644 nms-patches/BlockEnderPortal.patch create mode 100644 nms-patches/BlockFire.patch create mode 100644 nms-patches/BlockFlowing.patch create mode 100644 nms-patches/BlockGrass.patch create mode 100644 nms-patches/BlockIce.patch create mode 100644 nms-patches/BlockLeaves.patch create mode 100644 nms-patches/BlockLever.patch create mode 100644 nms-patches/BlockMinecartDetector.patch create mode 100644 nms-patches/BlockMobSpawner.patch create mode 100644 nms-patches/BlockMonsterEggs.patch create mode 100644 nms-patches/BlockMushroom.patch create mode 100644 nms-patches/BlockMycel.patch create mode 100644 nms-patches/BlockNetherWart.patch create mode 100644 nms-patches/BlockOre.patch create mode 100644 nms-patches/BlockPiston.patch create mode 100644 nms-patches/BlockPortal.patch create mode 100644 nms-patches/BlockPoweredRail.patch create mode 100644 nms-patches/BlockPressurePlateAbstract.patch create mode 100644 nms-patches/BlockPressurePlateBinary.patch create mode 100644 nms-patches/BlockPressurePlateWeighted.patch create mode 100644 nms-patches/BlockPumpkin.patch create mode 100644 nms-patches/BlockRedstoneLamp.patch create mode 100644 nms-patches/BlockRedstoneOre.patch create mode 100644 nms-patches/BlockRedstoneTorch.patch create mode 100644 nms-patches/BlockRedstoneWire.patch create mode 100644 nms-patches/BlockReed.patch create mode 100644 nms-patches/BlockSapling.patch create mode 100644 nms-patches/BlockSkull.patch create mode 100644 nms-patches/BlockSnow.patch create mode 100644 nms-patches/BlockSoil.patch create mode 100644 nms-patches/BlockStationary.patch create mode 100644 nms-patches/BlockStem.patch create mode 100644 nms-patches/BlockTrapdoor.patch create mode 100644 nms-patches/BlockTripwire.patch create mode 100644 nms-patches/BlockTripwireHook.patch create mode 100644 nms-patches/BlockVine.patch create mode 100644 nms-patches/Chunk.patch create mode 100644 nms-patches/ChunkProviderServer.patch create mode 100644 nms-patches/ChunkRegionLoader.patch create mode 100644 nms-patches/ChunkSection.patch create mode 100644 nms-patches/CommandBlockListenerAbstract.patch create mode 100644 nms-patches/Container.patch create mode 100644 nms-patches/ContainerAnvil.patch create mode 100644 nms-patches/ContainerAnvilInventory.patch create mode 100644 nms-patches/ContainerBeacon.patch create mode 100644 nms-patches/ContainerBrewingStand.patch create mode 100644 nms-patches/ContainerChest.patch create mode 100644 nms-patches/ContainerDispenser.patch create mode 100644 nms-patches/ContainerEnchantTable.patch create mode 100644 nms-patches/ContainerEnchantTableInventory.patch create mode 100644 nms-patches/ContainerFurnace.patch create mode 100644 nms-patches/ContainerHopper.patch create mode 100644 nms-patches/ContainerHorse.patch create mode 100644 nms-patches/ContainerMerchant.patch create mode 100644 nms-patches/ContainerPlayer.patch create mode 100644 nms-patches/ContainerWorkbench.patch create mode 100644 nms-patches/ControllerLook.patch create mode 100644 nms-patches/ControllerMove.patch create mode 100644 nms-patches/CraftingManager.patch create mode 100644 nms-patches/CrashReport.patch create mode 100644 nms-patches/DedicatedServer.patch create mode 100644 nms-patches/DispenseBehaviorArmor.patch create mode 100644 nms-patches/DispenseBehaviorBoat.patch create mode 100644 nms-patches/DispenseBehaviorBonemeal.patch create mode 100644 nms-patches/DispenseBehaviorEmptyBucket.patch create mode 100644 nms-patches/DispenseBehaviorFilledBucket.patch create mode 100644 nms-patches/DispenseBehaviorFireball.patch create mode 100644 nms-patches/DispenseBehaviorFlintAndSteel.patch create mode 100644 nms-patches/DispenseBehaviorItem.patch create mode 100644 nms-patches/DispenseBehaviorMinecart.patch create mode 100644 nms-patches/DispenseBehaviorMonsterEgg.patch create mode 100644 nms-patches/DispenseBehaviorProjectile.patch create mode 100644 nms-patches/DispenseBehaviorTNT.patch create mode 100644 nms-patches/Enchantment.patch create mode 100644 nms-patches/Entity.patch create mode 100644 nms-patches/EntityAgeable.patch create mode 100644 nms-patches/EntityArrow.patch create mode 100644 nms-patches/EntityBoat.patch create mode 100644 nms-patches/EntityChicken.patch create mode 100644 nms-patches/EntityCow.patch create mode 100644 nms-patches/EntityCreature.patch create mode 100644 nms-patches/EntityCreeper.patch create mode 100644 nms-patches/EntityDamageSourceIndirect.patch create mode 100644 nms-patches/EntityEgg.patch create mode 100644 nms-patches/EntityEnderCrystal.patch create mode 100644 nms-patches/EntityEnderDragon.patch create mode 100644 nms-patches/EntityEnderPearl.patch create mode 100644 nms-patches/EntityEnderman.patch create mode 100644 nms-patches/EntityExperienceOrb.patch create mode 100644 nms-patches/EntityFallingBlock.patch create mode 100644 nms-patches/EntityFireball.patch create mode 100644 nms-patches/EntityFishingHook.patch create mode 100644 nms-patches/EntityHanging.patch create mode 100644 nms-patches/EntityHorse.patch create mode 100644 nms-patches/EntityHuman.patch create mode 100644 nms-patches/EntityInsentient.patch create mode 100644 nms-patches/EntityIronGolem.patch create mode 100644 nms-patches/EntityItem.patch create mode 100644 nms-patches/EntityItemFrame.patch create mode 100644 nms-patches/EntityLargeFireball.patch create mode 100644 nms-patches/EntityLeash.patch create mode 100644 nms-patches/EntityLightning.patch create mode 100644 nms-patches/EntityLiving.patch create mode 100644 nms-patches/EntityMinecartAbstract.patch create mode 100644 nms-patches/EntityMinecartCommandBlockListener.patch create mode 100644 nms-patches/EntityMinecartContainer.patch create mode 100644 nms-patches/EntityMonster.patch create mode 100644 nms-patches/EntityMushroomCow.patch create mode 100644 nms-patches/EntityOcelot.patch create mode 100644 nms-patches/EntityPainting.patch create mode 100644 nms-patches/EntityPig.patch create mode 100644 nms-patches/EntityPlayer.patch create mode 100644 nms-patches/EntityPotion.patch create mode 100644 nms-patches/EntityProjectile.patch create mode 100644 nms-patches/EntitySheep.patch create mode 100644 nms-patches/EntitySkeleton.patch create mode 100644 nms-patches/EntitySlime.patch create mode 100644 nms-patches/EntitySmallFireball.patch create mode 100644 nms-patches/EntitySnowman.patch create mode 100644 nms-patches/EntitySpider.patch create mode 100644 nms-patches/EntitySquid.patch create mode 100644 nms-patches/EntityTNTPrimed.patch create mode 100644 nms-patches/EntityThrownExpBottle.patch create mode 100644 nms-patches/EntityTrackerEntry.patch create mode 100644 nms-patches/EntityVillager.patch create mode 100644 nms-patches/EntityWither.patch create mode 100644 nms-patches/EntityWitherSkull.patch create mode 100644 nms-patches/EntityWolf.patch create mode 100644 nms-patches/EntityZombie.patch create mode 100644 nms-patches/ExpirableListEntry.patch create mode 100644 nms-patches/Explosion.patch create mode 100644 nms-patches/FoodMetaData.patch create mode 100644 nms-patches/HandshakeListener.patch create mode 100644 nms-patches/IDataManager.patch create mode 100644 nms-patches/IInventory.patch create mode 100644 nms-patches/IRecipe.patch create mode 100644 nms-patches/InventoryCraftResult.patch create mode 100644 nms-patches/InventoryCrafting.patch create mode 100644 nms-patches/InventoryEnderChest.patch create mode 100644 nms-patches/InventoryHorseChest.patch create mode 100644 nms-patches/InventoryLargeChest.patch create mode 100644 nms-patches/InventoryMerchant.patch create mode 100644 nms-patches/InventorySubcontainer.patch create mode 100644 nms-patches/ItemBoat.patch create mode 100644 nms-patches/ItemBow.patch create mode 100644 nms-patches/ItemBucket.patch create mode 100644 nms-patches/ItemDye.patch create mode 100644 nms-patches/ItemFireball.patch create mode 100644 nms-patches/ItemFishingRod.patch create mode 100644 nms-patches/ItemFlintAndSteel.patch create mode 100644 nms-patches/ItemHanging.patch create mode 100644 nms-patches/ItemLeash.patch create mode 100644 nms-patches/ItemMapEmpty.patch create mode 100644 nms-patches/ItemMinecart.patch create mode 100644 nms-patches/ItemMonsterEgg.patch create mode 100644 nms-patches/ItemStack.patch create mode 100644 nms-patches/ItemWaterLily.patch create mode 100644 nms-patches/ItemWorldMap.patch create mode 100644 nms-patches/JsonList.patch create mode 100644 nms-patches/LoginListener.patch create mode 100644 nms-patches/MethodProfiler.patch create mode 100644 nms-patches/MinecraftServer.patch create mode 100644 nms-patches/MobEffectList.patch create mode 100644 nms-patches/MobSpawnerAbstract.patch create mode 100644 nms-patches/NameReferencingFileConverter.patch create mode 100644 nms-patches/NetworkManager.patch create mode 100644 nms-patches/Packet.patch create mode 100644 nms-patches/PacketDataSerializer.patch create mode 100644 nms-patches/PacketPlayInBlockPlace.patch create mode 100644 nms-patches/PacketPlayInCloseWindow.patch create mode 100644 nms-patches/PacketStatusListener.patch create mode 100644 nms-patches/Path.patch create mode 100644 nms-patches/PathfinderGoalBreakDoor.patch create mode 100644 nms-patches/PathfinderGoalBreed.patch create mode 100644 nms-patches/PathfinderGoalDefendVillage.patch create mode 100644 nms-patches/PathfinderGoalEatTile.patch create mode 100644 nms-patches/PathfinderGoalEndermanPickupBlock.patch create mode 100644 nms-patches/PathfinderGoalEndermanPlaceBlock.patch create mode 100644 nms-patches/PathfinderGoalGhastAttackTarget.patch create mode 100644 nms-patches/PathfinderGoalHurtByTarget.patch create mode 100644 nms-patches/PathfinderGoalMakeLove.patch create mode 100644 nms-patches/PathfinderGoalNearestAttackableTarget.patch create mode 100644 nms-patches/PathfinderGoalNearestAttackableTargetInsentient.patch create mode 100644 nms-patches/PathfinderGoalOwnerHurtByTarget.patch create mode 100644 nms-patches/PathfinderGoalOwnerHurtTarget.patch create mode 100644 nms-patches/PathfinderGoalPanic.patch create mode 100644 nms-patches/PathfinderGoalSelector.patch create mode 100644 nms-patches/PathfinderGoalSilverfishHideInBlock.patch create mode 100644 nms-patches/PathfinderGoalSilverfishWakeOthers.patch create mode 100644 nms-patches/PathfinderGoalSit.patch create mode 100644 nms-patches/PathfinderGoalTame.patch create mode 100644 nms-patches/PathfinderGoalTargetNearestPlayer.patch create mode 100644 nms-patches/PlayerChunk.patch create mode 100644 nms-patches/PlayerChunkMap.patch create mode 100644 nms-patches/PlayerConnection.patch create mode 100644 nms-patches/PlayerDatFileConverter.patch create mode 100644 nms-patches/PlayerInteractManager.patch create mode 100644 nms-patches/PlayerInventory.patch create mode 100644 nms-patches/PlayerList.patch create mode 100644 nms-patches/PlayerSelector.patch create mode 100644 nms-patches/PortalCreator.patch create mode 100644 nms-patches/PortalTravelAgent.patch create mode 100644 nms-patches/PropertyManager.patch create mode 100644 nms-patches/RecipeArmorDye.patch create mode 100644 nms-patches/RecipeBookClone.patch create mode 100644 nms-patches/RecipeFireworks.patch create mode 100644 nms-patches/RecipeMapClone.patch create mode 100644 nms-patches/RecipeRepair.patch create mode 100644 nms-patches/RecipesBannerInnerClass1.patch create mode 100644 nms-patches/RecipesBannerInnerClass2.patch create mode 100644 nms-patches/RecipesFurnace.patch create mode 100644 nms-patches/RegionFile.patch create mode 100644 nms-patches/RemoteControlCommandListener.patch create mode 100644 nms-patches/ScoreboardServer.patch create mode 100644 nms-patches/SecondaryWorldServer.patch create mode 100644 nms-patches/ShapedRecipes.patch create mode 100644 nms-patches/ShapelessRecipes.patch create mode 100644 nms-patches/SlotFurnaceResult.patch create mode 100644 nms-patches/SpawnerCreature.patch create mode 100644 nms-patches/StatisticManager.patch create mode 100644 nms-patches/SwitchHelperLogVariant.patch create mode 100644 nms-patches/ThreadCommandReader.patch create mode 100644 nms-patches/ThreadPlayerLookupUUID.patch create mode 100644 nms-patches/TileEntity.patch create mode 100644 nms-patches/TileEntityBeacon.patch create mode 100644 nms-patches/TileEntityBrewingStand.patch create mode 100644 nms-patches/TileEntityChest.patch create mode 100644 nms-patches/TileEntityCommandListener.patch create mode 100644 nms-patches/TileEntityDispenser.patch create mode 100644 nms-patches/TileEntityFurnace.patch create mode 100644 nms-patches/TileEntityHopper.patch create mode 100644 nms-patches/TileEntityNote.patch create mode 100644 nms-patches/TileEntityPiston.patch create mode 100644 nms-patches/TileEntityRecordPlayer.patch create mode 100644 nms-patches/TileEntitySkull.patch create mode 100644 nms-patches/Village.patch create mode 100644 nms-patches/VillageSiege.patch create mode 100644 nms-patches/World.patch create mode 100644 nms-patches/WorldBorder.patch create mode 100644 nms-patches/WorldGenGroundBush.patch create mode 100644 nms-patches/WorldGenMegaTreeAbstract.patch create mode 100644 nms-patches/WorldGenVillagePiece.patch create mode 100644 nms-patches/WorldGenVillagePieces.patch create mode 100644 nms-patches/WorldGenWitchHut.patch create mode 100644 nms-patches/WorldManager.patch create mode 100644 nms-patches/WorldMap.patch create mode 100644 nms-patches/WorldMapHumanTracker.patch create mode 100644 nms-patches/WorldNBTStorage.patch create mode 100644 nms-patches/WorldServer.patch delete mode 100644 src/main/java/net/minecraft/server/BiomeTheEndDecorator.java delete mode 100644 src/main/java/net/minecraft/server/Block.java delete mode 100644 src/main/java/net/minecraft/server/BlockActionDataList.java delete mode 100644 src/main/java/net/minecraft/server/BlockBloodStone.java delete mode 100644 src/main/java/net/minecraft/server/BlockButtonAbstract.java delete mode 100644 src/main/java/net/minecraft/server/BlockCactus.java delete mode 100644 src/main/java/net/minecraft/server/BlockCake.java delete mode 100644 src/main/java/net/minecraft/server/BlockCocoa.java delete mode 100644 src/main/java/net/minecraft/server/BlockCommand.java delete mode 100644 src/main/java/net/minecraft/server/BlockCrops.java delete mode 100644 src/main/java/net/minecraft/server/BlockDaylightDetector.java delete mode 100644 src/main/java/net/minecraft/server/BlockDiodeAbstract.java delete mode 100644 src/main/java/net/minecraft/server/BlockDispenser.java delete mode 100644 src/main/java/net/minecraft/server/BlockDoor.java delete mode 100644 src/main/java/net/minecraft/server/BlockDragonEgg.java delete mode 100644 src/main/java/net/minecraft/server/BlockDropper.java delete mode 100644 src/main/java/net/minecraft/server/BlockEnderPortal.java delete mode 100644 src/main/java/net/minecraft/server/BlockFire.java delete mode 100644 src/main/java/net/minecraft/server/BlockFlowing.java delete mode 100644 src/main/java/net/minecraft/server/BlockGrass.java delete mode 100644 src/main/java/net/minecraft/server/BlockHopper.java delete mode 100644 src/main/java/net/minecraft/server/BlockIce.java delete mode 100644 src/main/java/net/minecraft/server/BlockLeaves.java delete mode 100644 src/main/java/net/minecraft/server/BlockLever.java delete mode 100644 src/main/java/net/minecraft/server/BlockMinecartDetector.java delete mode 100644 src/main/java/net/minecraft/server/BlockMobSpawner.java delete mode 100644 src/main/java/net/minecraft/server/BlockMonsterEggs.java delete mode 100644 src/main/java/net/minecraft/server/BlockMushroom.java delete mode 100644 src/main/java/net/minecraft/server/BlockMycel.java delete mode 100644 src/main/java/net/minecraft/server/BlockNetherWart.java delete mode 100644 src/main/java/net/minecraft/server/BlockOre.java delete mode 100644 src/main/java/net/minecraft/server/BlockPiston.java delete mode 100644 src/main/java/net/minecraft/server/BlockPistonExtension.java delete mode 100644 src/main/java/net/minecraft/server/BlockPortal.java delete mode 100644 src/main/java/net/minecraft/server/BlockPoweredRail.java delete mode 100644 src/main/java/net/minecraft/server/BlockPressurePlateAbstract.java delete mode 100644 src/main/java/net/minecraft/server/BlockPressurePlateBinary.java delete mode 100644 src/main/java/net/minecraft/server/BlockPressurePlateWeighted.java delete mode 100644 src/main/java/net/minecraft/server/BlockPumpkin.java delete mode 100644 src/main/java/net/minecraft/server/BlockRedstoneLamp.java delete mode 100644 src/main/java/net/minecraft/server/BlockRedstoneOre.java delete mode 100644 src/main/java/net/minecraft/server/BlockRedstoneTorch.java delete mode 100644 src/main/java/net/minecraft/server/BlockRedstoneWire.java delete mode 100644 src/main/java/net/minecraft/server/BlockReed.java delete mode 100644 src/main/java/net/minecraft/server/BlockSapling.java delete mode 100644 src/main/java/net/minecraft/server/BlockSign.java delete mode 100644 src/main/java/net/minecraft/server/BlockSkull.java delete mode 100644 src/main/java/net/minecraft/server/BlockSnow.java delete mode 100644 src/main/java/net/minecraft/server/BlockSoil.java delete mode 100644 src/main/java/net/minecraft/server/BlockStationary.java delete mode 100644 src/main/java/net/minecraft/server/BlockStem.java delete mode 100644 src/main/java/net/minecraft/server/BlockTallPlant.java delete mode 100644 src/main/java/net/minecraft/server/BlockTrapdoor.java delete mode 100644 src/main/java/net/minecraft/server/BlockTripwire.java delete mode 100644 src/main/java/net/minecraft/server/BlockTripwireHook.java delete mode 100644 src/main/java/net/minecraft/server/BlockVine.java delete mode 100644 src/main/java/net/minecraft/server/Chunk.java delete mode 100644 src/main/java/net/minecraft/server/ChunkProviderServer.java delete mode 100644 src/main/java/net/minecraft/server/ChunkRegionLoader.java delete mode 100644 src/main/java/net/minecraft/server/ChunkSection.java delete mode 100644 src/main/java/net/minecraft/server/ClientCommandOrdinalWrapper.java delete mode 100644 src/main/java/net/minecraft/server/CommandBlockListenerAbstract.java delete mode 100644 src/main/java/net/minecraft/server/Container.java delete mode 100644 src/main/java/net/minecraft/server/ContainerAnvil.java delete mode 100644 src/main/java/net/minecraft/server/ContainerAnvilInventory.java delete mode 100644 src/main/java/net/minecraft/server/ContainerBeacon.java delete mode 100644 src/main/java/net/minecraft/server/ContainerBrewingStand.java delete mode 100644 src/main/java/net/minecraft/server/ContainerChest.java delete mode 100644 src/main/java/net/minecraft/server/ContainerDispenser.java delete mode 100644 src/main/java/net/minecraft/server/ContainerEnchantTable.java delete mode 100644 src/main/java/net/minecraft/server/ContainerEnchantTableInventory.java delete mode 100644 src/main/java/net/minecraft/server/ContainerFurnace.java delete mode 100644 src/main/java/net/minecraft/server/ContainerHopper.java delete mode 100644 src/main/java/net/minecraft/server/ContainerHorse.java delete mode 100644 src/main/java/net/minecraft/server/ContainerMerchant.java delete mode 100644 src/main/java/net/minecraft/server/ContainerPlayer.java delete mode 100644 src/main/java/net/minecraft/server/ContainerWorkbench.java delete mode 100644 src/main/java/net/minecraft/server/ControllerLook.java delete mode 100644 src/main/java/net/minecraft/server/ControllerMove.java delete mode 100644 src/main/java/net/minecraft/server/CraftingManager.java delete mode 100644 src/main/java/net/minecraft/server/CrashReport.java delete mode 100644 src/main/java/net/minecraft/server/DedicatedServer.java delete mode 100644 src/main/java/net/minecraft/server/DispenseBehaviorArmor.java delete mode 100644 src/main/java/net/minecraft/server/DispenseBehaviorBoat.java delete mode 100644 src/main/java/net/minecraft/server/DispenseBehaviorBonemeal.java delete mode 100644 src/main/java/net/minecraft/server/DispenseBehaviorEmptyBucket.java delete mode 100644 src/main/java/net/minecraft/server/DispenseBehaviorFilledBucket.java delete mode 100644 src/main/java/net/minecraft/server/DispenseBehaviorFireball.java delete mode 100644 src/main/java/net/minecraft/server/DispenseBehaviorFireworks.java delete mode 100644 src/main/java/net/minecraft/server/DispenseBehaviorFlintAndSteel.java delete mode 100644 src/main/java/net/minecraft/server/DispenseBehaviorItem.java delete mode 100644 src/main/java/net/minecraft/server/DispenseBehaviorMinecart.java delete mode 100644 src/main/java/net/minecraft/server/DispenseBehaviorMonsterEgg.java delete mode 100644 src/main/java/net/minecraft/server/DispenseBehaviorProjectile.java delete mode 100644 src/main/java/net/minecraft/server/DispenseBehaviorTNT.java delete mode 100644 src/main/java/net/minecraft/server/Enchantment.java delete mode 100644 src/main/java/net/minecraft/server/Entity.java delete mode 100644 src/main/java/net/minecraft/server/EntityAgeable.java delete mode 100644 src/main/java/net/minecraft/server/EntityArrow.java delete mode 100644 src/main/java/net/minecraft/server/EntityBoat.java delete mode 100644 src/main/java/net/minecraft/server/EntityChicken.java delete mode 100644 src/main/java/net/minecraft/server/EntityCow.java delete mode 100644 src/main/java/net/minecraft/server/EntityCreature.java delete mode 100644 src/main/java/net/minecraft/server/EntityCreeper.java delete mode 100644 src/main/java/net/minecraft/server/EntityDamageSourceIndirect.java delete mode 100644 src/main/java/net/minecraft/server/EntityEgg.java delete mode 100644 src/main/java/net/minecraft/server/EntityEnderCrystal.java delete mode 100644 src/main/java/net/minecraft/server/EntityEnderDragon.java delete mode 100644 src/main/java/net/minecraft/server/EntityEnderPearl.java delete mode 100644 src/main/java/net/minecraft/server/EntityEnderman.java delete mode 100644 src/main/java/net/minecraft/server/EntityExperienceOrb.java delete mode 100644 src/main/java/net/minecraft/server/EntityFallingBlock.java delete mode 100644 src/main/java/net/minecraft/server/EntityFireball.java delete mode 100644 src/main/java/net/minecraft/server/EntityFireworks.java delete mode 100644 src/main/java/net/minecraft/server/EntityFishingHook.java delete mode 100644 src/main/java/net/minecraft/server/EntityGhast.java delete mode 100644 src/main/java/net/minecraft/server/EntityHanging.java delete mode 100644 src/main/java/net/minecraft/server/EntityHorse.java delete mode 100644 src/main/java/net/minecraft/server/EntityHuman.java delete mode 100644 src/main/java/net/minecraft/server/EntityInsentient.java delete mode 100644 src/main/java/net/minecraft/server/EntityIronGolem.java delete mode 100644 src/main/java/net/minecraft/server/EntityItem.java delete mode 100644 src/main/java/net/minecraft/server/EntityItemFrame.java delete mode 100644 src/main/java/net/minecraft/server/EntityLargeFireball.java delete mode 100644 src/main/java/net/minecraft/server/EntityLeash.java delete mode 100644 src/main/java/net/minecraft/server/EntityLightning.java delete mode 100644 src/main/java/net/minecraft/server/EntityLiving.java delete mode 100644 src/main/java/net/minecraft/server/EntityMinecartAbstract.java delete mode 100644 src/main/java/net/minecraft/server/EntityMinecartCommandBlockListener.java delete mode 100644 src/main/java/net/minecraft/server/EntityMinecartContainer.java delete mode 100644 src/main/java/net/minecraft/server/EntityMonster.java delete mode 100644 src/main/java/net/minecraft/server/EntityMushroomCow.java delete mode 100644 src/main/java/net/minecraft/server/EntityOcelot.java delete mode 100644 src/main/java/net/minecraft/server/EntityPainting.java delete mode 100644 src/main/java/net/minecraft/server/EntityPig.java delete mode 100644 src/main/java/net/minecraft/server/EntityPigZombie.java delete mode 100644 src/main/java/net/minecraft/server/EntityPlayer.java delete mode 100644 src/main/java/net/minecraft/server/EntityPotion.java delete mode 100644 src/main/java/net/minecraft/server/EntityProjectile.java delete mode 100644 src/main/java/net/minecraft/server/EntitySheep.java delete mode 100644 src/main/java/net/minecraft/server/EntitySilverfish.java delete mode 100644 src/main/java/net/minecraft/server/EntitySkeleton.java delete mode 100644 src/main/java/net/minecraft/server/EntitySlime.java delete mode 100644 src/main/java/net/minecraft/server/EntitySmallFireball.java delete mode 100644 src/main/java/net/minecraft/server/EntitySnowman.java delete mode 100644 src/main/java/net/minecraft/server/EntitySpider.java delete mode 100644 src/main/java/net/minecraft/server/EntitySquid.java delete mode 100644 src/main/java/net/minecraft/server/EntityTNTPrimed.java delete mode 100644 src/main/java/net/minecraft/server/EntityThrownExpBottle.java delete mode 100644 src/main/java/net/minecraft/server/EntityTracker.java delete mode 100644 src/main/java/net/minecraft/server/EntityTrackerEntry.java delete mode 100644 src/main/java/net/minecraft/server/EntityWither.java delete mode 100644 src/main/java/net/minecraft/server/EntityWitherSkull.java delete mode 100644 src/main/java/net/minecraft/server/EntityWolf.java delete mode 100644 src/main/java/net/minecraft/server/EntityZombie.java delete mode 100644 src/main/java/net/minecraft/server/ExpirableListEntry.java delete mode 100644 src/main/java/net/minecraft/server/Explosion.java delete mode 100644 src/main/java/net/minecraft/server/FileConversionException.java delete mode 100644 src/main/java/net/minecraft/server/FoodMetaData.java delete mode 100644 src/main/java/net/minecraft/server/GroupDataZombie.java delete mode 100644 src/main/java/net/minecraft/server/HandshakeListener.java delete mode 100644 src/main/java/net/minecraft/server/IDataManager.java delete mode 100644 src/main/java/net/minecraft/server/IInventory.java delete mode 100644 src/main/java/net/minecraft/server/IRecipe.java delete mode 100644 src/main/java/net/minecraft/server/IntHashMap.java delete mode 100644 src/main/java/net/minecraft/server/InventoryCraftResult.java delete mode 100644 src/main/java/net/minecraft/server/InventoryCrafting.java delete mode 100644 src/main/java/net/minecraft/server/InventoryEnderChest.java delete mode 100644 src/main/java/net/minecraft/server/InventoryHorseChest.java delete mode 100644 src/main/java/net/minecraft/server/InventoryLargeChest.java delete mode 100644 src/main/java/net/minecraft/server/InventoryMerchant.java delete mode 100644 src/main/java/net/minecraft/server/InventorySubcontainer.java delete mode 100644 src/main/java/net/minecraft/server/Item.java delete mode 100644 src/main/java/net/minecraft/server/ItemBoat.java delete mode 100644 src/main/java/net/minecraft/server/ItemBow.java delete mode 100644 src/main/java/net/minecraft/server/ItemBucket.java delete mode 100644 src/main/java/net/minecraft/server/ItemDye.java delete mode 100644 src/main/java/net/minecraft/server/ItemFireball.java delete mode 100644 src/main/java/net/minecraft/server/ItemFishingRod.java delete mode 100644 src/main/java/net/minecraft/server/ItemFlintAndSteel.java delete mode 100644 src/main/java/net/minecraft/server/ItemHanging.java delete mode 100644 src/main/java/net/minecraft/server/ItemLeash.java delete mode 100644 src/main/java/net/minecraft/server/ItemMapEmpty.java delete mode 100644 src/main/java/net/minecraft/server/ItemMinecart.java delete mode 100644 src/main/java/net/minecraft/server/ItemMonsterEgg.java delete mode 100644 src/main/java/net/minecraft/server/ItemStack.java delete mode 100644 src/main/java/net/minecraft/server/ItemWaterLily.java delete mode 100644 src/main/java/net/minecraft/server/ItemWorldMap.java delete mode 100644 src/main/java/net/minecraft/server/JsonList.java delete mode 100644 src/main/java/net/minecraft/server/JsonListEntry.java delete mode 100644 src/main/java/net/minecraft/server/JsonListEntrySerializer.java delete mode 100644 src/main/java/net/minecraft/server/LoginListener.java delete mode 100644 src/main/java/net/minecraft/server/MethodProfiler.java delete mode 100644 src/main/java/net/minecraft/server/MinecraftServer.java delete mode 100644 src/main/java/net/minecraft/server/MobEffectList.java delete mode 100644 src/main/java/net/minecraft/server/MobSpawnerAbstract.java delete mode 100644 src/main/java/net/minecraft/server/NameReferencingFileConverter.java delete mode 100644 src/main/java/net/minecraft/server/NetworkManager.java delete mode 100644 src/main/java/net/minecraft/server/Packet.java delete mode 100644 src/main/java/net/minecraft/server/PacketDataSerializer.java delete mode 100644 src/main/java/net/minecraft/server/PacketHandshakingInSetProtocol.java delete mode 100644 src/main/java/net/minecraft/server/PacketPlayInChat.java delete mode 100644 src/main/java/net/minecraft/server/PacketPlayInCloseWindow.java delete mode 100644 src/main/java/net/minecraft/server/PacketPlayInCustomPayload.java delete mode 100644 src/main/java/net/minecraft/server/PacketPlayOutBlockChange.java delete mode 100644 src/main/java/net/minecraft/server/PacketPlayOutMapChunkBulk.java delete mode 100644 src/main/java/net/minecraft/server/PacketPlayOutNamedEntitySpawn.java delete mode 100644 src/main/java/net/minecraft/server/PacketPlayOutSpawnPosition.java delete mode 100644 src/main/java/net/minecraft/server/PacketStatusListener.java delete mode 100644 src/main/java/net/minecraft/server/Path.java delete mode 100644 src/main/java/net/minecraft/server/PathfinderGoalArrowAttack.java delete mode 100644 src/main/java/net/minecraft/server/PathfinderGoalBreakDoor.java delete mode 100644 src/main/java/net/minecraft/server/PathfinderGoalBreed.java delete mode 100644 src/main/java/net/minecraft/server/PathfinderGoalEatTile.java delete mode 100644 src/main/java/net/minecraft/server/PathfinderGoalHurtByTarget.java delete mode 100644 src/main/java/net/minecraft/server/PathfinderGoalMakeLove.java delete mode 100644 src/main/java/net/minecraft/server/PathfinderGoalMeleeAttack.java delete mode 100644 src/main/java/net/minecraft/server/PathfinderGoalOcelotAttack.java delete mode 100644 src/main/java/net/minecraft/server/PathfinderGoalPanic.java delete mode 100644 src/main/java/net/minecraft/server/PathfinderGoalSelector.java delete mode 100644 src/main/java/net/minecraft/server/PathfinderGoalSit.java delete mode 100644 src/main/java/net/minecraft/server/PathfinderGoalTame.java delete mode 100644 src/main/java/net/minecraft/server/PathfinderGoalTarget.java delete mode 100644 src/main/java/net/minecraft/server/PlayerAbilities.java delete mode 100644 src/main/java/net/minecraft/server/PlayerChunk.java delete mode 100644 src/main/java/net/minecraft/server/PlayerChunkMap.java delete mode 100644 src/main/java/net/minecraft/server/PlayerConnection.java delete mode 100644 src/main/java/net/minecraft/server/PlayerDatFileConverter.java delete mode 100644 src/main/java/net/minecraft/server/PlayerInteractManager.java delete mode 100644 src/main/java/net/minecraft/server/PlayerInventory.java delete mode 100644 src/main/java/net/minecraft/server/PlayerList.java delete mode 100644 src/main/java/net/minecraft/server/PlayerSelector.java delete mode 100644 src/main/java/net/minecraft/server/PortalCreator.java delete mode 100644 src/main/java/net/minecraft/server/PortalTravelAgent.java delete mode 100644 src/main/java/net/minecraft/server/PropertyManager.java delete mode 100644 src/main/java/net/minecraft/server/ProtocolOrdinalWrapper.java delete mode 100644 src/main/java/net/minecraft/server/QueuedPacket.java delete mode 100644 src/main/java/net/minecraft/server/RecipeArmorDye.java delete mode 100644 src/main/java/net/minecraft/server/RecipeBookClone.java delete mode 100644 src/main/java/net/minecraft/server/RecipeFireworks.java delete mode 100644 src/main/java/net/minecraft/server/RecipeMapClone.java delete mode 100644 src/main/java/net/minecraft/server/RecipesFurnace.java delete mode 100644 src/main/java/net/minecraft/server/RegionFile.java delete mode 100644 src/main/java/net/minecraft/server/RemoteControlCommandListener.java delete mode 100644 src/main/java/net/minecraft/server/ScoreboardServer.java delete mode 100644 src/main/java/net/minecraft/server/SecondaryWorldServer.java delete mode 100644 src/main/java/net/minecraft/server/ShapedRecipes.java delete mode 100644 src/main/java/net/minecraft/server/ShapelessRecipes.java delete mode 100644 src/main/java/net/minecraft/server/Slot.java delete mode 100644 src/main/java/net/minecraft/server/SlotFurnaceResult.java delete mode 100644 src/main/java/net/minecraft/server/SpawnerCreature.java delete mode 100644 src/main/java/net/minecraft/server/StatisticManager.java delete mode 100644 src/main/java/net/minecraft/server/ThreadCommandReader.java delete mode 100644 src/main/java/net/minecraft/server/ThreadPlayerLookupUUID.java delete mode 100644 src/main/java/net/minecraft/server/TileEntity.java delete mode 100644 src/main/java/net/minecraft/server/TileEntityBeacon.java delete mode 100644 src/main/java/net/minecraft/server/TileEntityBrewingStand.java delete mode 100644 src/main/java/net/minecraft/server/TileEntityChest.java delete mode 100644 src/main/java/net/minecraft/server/TileEntityCommandListener.java delete mode 100644 src/main/java/net/minecraft/server/TileEntityDispenser.java delete mode 100644 src/main/java/net/minecraft/server/TileEntityFurnace.java delete mode 100644 src/main/java/net/minecraft/server/TileEntityHopper.java delete mode 100644 src/main/java/net/minecraft/server/TileEntityNote.java delete mode 100644 src/main/java/net/minecraft/server/TileEntityPiston.java delete mode 100644 src/main/java/net/minecraft/server/TileEntityRecordPlayer.java delete mode 100644 src/main/java/net/minecraft/server/TileEntitySign.java delete mode 100644 src/main/java/net/minecraft/server/TileEntitySkull.java delete mode 100644 src/main/java/net/minecraft/server/Village.java delete mode 100644 src/main/java/net/minecraft/server/VillageSiege.java delete mode 100644 src/main/java/net/minecraft/server/World.java delete mode 100644 src/main/java/net/minecraft/server/WorldGenBigTree.java delete mode 100644 src/main/java/net/minecraft/server/WorldGenGroundBush.java delete mode 100644 src/main/java/net/minecraft/server/WorldGenMegaTreeAbstract.java delete mode 100644 src/main/java/net/minecraft/server/WorldGenVillagePiece.java delete mode 100644 src/main/java/net/minecraft/server/WorldGenVillagePieces.java delete mode 100644 src/main/java/net/minecraft/server/WorldGenWitchHut.java delete mode 100644 src/main/java/net/minecraft/server/WorldManager.java delete mode 100644 src/main/java/net/minecraft/server/WorldMap.java delete mode 100644 src/main/java/net/minecraft/server/WorldMapHumanTracker.java delete mode 100644 src/main/java/net/minecraft/server/WorldNBTStorage.java delete mode 100644 src/main/java/net/minecraft/server/WorldServer.java create mode 100644 src/main/java/org/bukkit/craftbukkit/block/CraftBanner.java create mode 100644 src/main/java/org/bukkit/craftbukkit/entity/CraftArmorStand.java create mode 100644 src/main/java/org/bukkit/craftbukkit/entity/CraftEndermite.java create mode 100644 src/main/java/org/bukkit/craftbukkit/entity/CraftGuardian.java create mode 100644 src/main/java/org/bukkit/craftbukkit/entity/CraftRabbit.java create mode 100644 src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaBanner.java delete mode 100644 src/main/java/org/bukkit/craftbukkit/updater/ArtifactDetails.java delete mode 100644 src/main/java/org/bukkit/craftbukkit/updater/AutoUpdater.java delete mode 100644 src/main/java/org/bukkit/craftbukkit/updater/BukkitDLUpdaterService.java delete mode 100644 src/test/java/org/bukkit/craftbukkit/updater/BukkitDLUpdaterServiceTest.java diff --git a/.gitignore b/.gitignore index c3faf57741..73c16b1d53 100644 --- a/.gitignore +++ b/.gitignore @@ -5,12 +5,14 @@ # netbeans /nbproject +nb*.xml # we use maven! /build.xml # maven /target +dependency-reduced-pom.xml # vim .*.sw[a-p] diff --git a/makePatches.sh b/makePatches.sh new file mode 100755 index 0000000000..771e39f804 --- /dev/null +++ b/makePatches.sh @@ -0,0 +1,16 @@ +#!/bin/bash + +if [ -z "$1" ] +then + echo "Please run this script again with the clean decompile sources as an argument. In most cases this will be ../work/decompile-XXXX" + exit +fi + +rm -f nms-patches/* + +for file in $(ls src/main/java/net/minecraft/server) +do + echo "Diffing $file" + dos2unix -q $1/net/minecraft/server/$file $1/net/minecraft/server/$file + diff -u $1/net/minecraft/server/$file src/main/java/net/minecraft/server/$file > nms-patches/"$(echo $file | cut -d. -f1)".patch +done diff --git a/nms-patches/BiomeTheEndDecorator.patch b/nms-patches/BiomeTheEndDecorator.patch new file mode 100644 index 0000000000..6c957c2a05 --- /dev/null +++ b/nms-patches/BiomeTheEndDecorator.patch @@ -0,0 +1,11 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/BiomeTheEndDecorator.java 2014-11-27 08:59:46.501422728 +1100 ++++ src/main/java/net/minecraft/server/BiomeTheEndDecorator.java 2014-11-27 08:42:10.136850942 +1100 +@@ -21,7 +21,7 @@ + EntityEnderDragon entityenderdragon = new EntityEnderDragon(this.a); + + entityenderdragon.setPositionRotation(0.0D, 128.0D, 0.0D, this.b.nextFloat() * 360.0F, 0.0F); +- this.a.addEntity(entityenderdragon); ++ this.a.addEntity(entityenderdragon, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.CHUNK_GEN); // CraftBukkit - add SpawnReason + } + + } diff --git a/nms-patches/Block.patch b/nms-patches/Block.patch new file mode 100644 index 0000000000..fc44dc750b --- /dev/null +++ b/nms-patches/Block.patch @@ -0,0 +1,23 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/Block.java 2014-11-27 08:59:46.537422569 +1100 ++++ src/main/java/net/minecraft/server/Block.java 2014-11-27 08:42:10.172850872 +1100 +@@ -295,7 +295,8 @@ + int j = this.getDropCount(i, world.random); + + for (int k = 0; k < j; ++k) { +- if (world.random.nextFloat() <= f) { ++ // CraftBukkit - <= to < to allow for plugins to completely disable block drops from explosions ++ if (world.random.nextFloat() < f) { + Item item = this.getDropType(iblockdata, world.random, i); + + if (item != null) { +@@ -920,4 +921,10 @@ + private static void a(int i, String s, Block block) { + a(i, new MinecraftKey(s), block); + } ++ ++ // CraftBukkit start ++ public int getExpDrop(World world, IBlockData data, int enchantmentLevel) { ++ return 0; ++ } ++ // CraftBukkit end + } diff --git a/nms-patches/BlockBloodStone.patch b/nms-patches/BlockBloodStone.patch new file mode 100644 index 0000000000..82233f90e0 --- /dev/null +++ b/nms-patches/BlockBloodStone.patch @@ -0,0 +1,28 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/BlockBloodStone.java 2014-11-27 08:59:46.505422709 +1100 ++++ src/main/java/net/minecraft/server/BlockBloodStone.java 2014-11-27 08:42:10.124850965 +1100 +@@ -1,5 +1,7 @@ + package net.minecraft.server; + ++import org.bukkit.event.block.BlockRedstoneEvent; // CraftBukkit ++ + public class BlockBloodStone extends Block { + + public BlockBloodStone() { +@@ -10,4 +12,17 @@ + public MaterialMapColor g(IBlockData iblockdata) { + return MaterialMapColor.K; + } ++ ++ // CraftBukkit start ++ @Override ++ public void doPhysics(World world, BlockPosition position, IBlockData iblockdata, Block block) { ++ if (block != null && block.isPowerSource()) { ++ org.bukkit.block.Block bl = world.getWorld().getBlockAt(position.getX(), position.getY(), position.getZ()); ++ int power = bl.getBlockPower(); ++ ++ BlockRedstoneEvent event = new BlockRedstoneEvent(bl, power, power); ++ world.getServer().getPluginManager().callEvent(event); ++ } ++ } ++ // CraftBukkit end + } diff --git a/nms-patches/BlockButtonAbstract.patch b/nms-patches/BlockButtonAbstract.patch new file mode 100644 index 0000000000..b41c8016fa --- /dev/null +++ b/nms-patches/BlockButtonAbstract.patch @@ -0,0 +1,111 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/BlockButtonAbstract.java 2014-11-27 08:59:46.505422709 +1100 ++++ src/main/java/net/minecraft/server/BlockButtonAbstract.java 2014-11-27 08:42:10.160850895 +1100 +@@ -3,6 +3,11 @@ + import java.util.List; + import java.util.Random; + ++// CraftBukkit start ++import org.bukkit.event.block.BlockRedstoneEvent; ++import org.bukkit.event.entity.EntityInteractEvent; ++// CraftBukkit end ++ + public abstract class BlockButtonAbstract extends Block { + + public static final BlockStateDirection FACING = BlockStateDirection.of("facing"); +@@ -122,6 +127,19 @@ + if (((Boolean) iblockdata.get(BlockButtonAbstract.POWERED)).booleanValue()) { + return true; + } else { ++ // CraftBukkit start ++ boolean powered = ((Boolean) iblockdata.get(POWERED)); ++ org.bukkit.block.Block block = world.getWorld().getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ()); ++ int old = (powered) ? 15 : 0; ++ int current = (!powered) ? 15 : 0; ++ ++ BlockRedstoneEvent eventRedstone = new BlockRedstoneEvent(block, old, current); ++ world.getServer().getPluginManager().callEvent(eventRedstone); ++ ++ if ((eventRedstone.getNewCurrent() > 0) != (!powered)) { ++ return true; ++ } ++ // CraftBukkit end + world.setTypeAndData(blockposition, iblockdata.set(BlockButtonAbstract.POWERED, Boolean.valueOf(true)), 3); + world.b(blockposition, blockposition); + world.makeSound((double) blockposition.getX() + 0.5D, (double) blockposition.getY() + 0.5D, (double) blockposition.getZ() + 0.5D, "random.click", 0.3F, 0.6F); +@@ -159,6 +177,16 @@ + if (this.M) { + this.f(world, blockposition, iblockdata); + } else { ++ // CraftBukkit start ++ org.bukkit.block.Block block = world.getWorld().getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ()); ++ ++ BlockRedstoneEvent eventRedstone = new BlockRedstoneEvent(block, 15, 0); ++ world.getServer().getPluginManager().callEvent(eventRedstone); ++ ++ if (eventRedstone.getNewCurrent() > 0) { ++ return; ++ } ++ // CraftBukkit end + world.setTypeUpdate(blockposition, iblockdata.set(BlockButtonAbstract.POWERED, Boolean.valueOf(false))); + this.b(world, blockposition, (EnumDirection) iblockdata.get(BlockButtonAbstract.FACING)); + world.makeSound((double) blockposition.getX() + 0.5D, (double) blockposition.getY() + 0.5D, (double) blockposition.getZ() + 0.5D, "random.click", 0.3F, 0.5F); +@@ -192,8 +220,42 @@ + List list = world.a(EntityArrow.class, new AxisAlignedBB((double) blockposition.getX() + this.minX, (double) blockposition.getY() + this.minY, (double) blockposition.getZ() + this.minZ, (double) blockposition.getX() + this.maxX, (double) blockposition.getY() + this.maxY, (double) blockposition.getZ() + this.maxZ)); + boolean flag = !list.isEmpty(); + boolean flag1 = ((Boolean) iblockdata.get(BlockButtonAbstract.POWERED)).booleanValue(); ++ ++ // CraftBukkit start - Call interact event when arrows turn on wooden buttons ++ if (flag1 != flag && flag) { ++ org.bukkit.block.Block block = world.getWorld().getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ()); ++ boolean allowed = false; ++ ++ // If all of the events are cancelled block the button press, else allow ++ for (Object object : list) { ++ if (object != null) { ++ EntityInteractEvent event = new EntityInteractEvent(((Entity) object).getBukkitEntity(), block); ++ world.getServer().getPluginManager().callEvent(event); ++ ++ if (!event.isCancelled()) { ++ allowed = true; ++ break; ++ } ++ } ++ } ++ ++ if (!allowed) { ++ return; ++ } ++ } ++ // CraftBukkit end + + if (flag && !flag1) { ++ // CraftBukkit start ++ org.bukkit.block.Block block = world.getWorld().getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ()); ++ ++ BlockRedstoneEvent eventRedstone = new BlockRedstoneEvent(block, 0, 15); ++ world.getServer().getPluginManager().callEvent(eventRedstone); ++ ++ if (eventRedstone.getNewCurrent() <= 0) { ++ return; ++ } ++ // CraftBukkit end + world.setTypeUpdate(blockposition, iblockdata.set(BlockButtonAbstract.POWERED, Boolean.valueOf(true))); + this.b(world, blockposition, (EnumDirection) iblockdata.get(BlockButtonAbstract.FACING)); + world.b(blockposition, blockposition); +@@ -201,6 +263,16 @@ + } + + if (!flag && flag1) { ++ // CraftBukkit start ++ org.bukkit.block.Block block = world.getWorld().getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ()); ++ ++ BlockRedstoneEvent eventRedstone = new BlockRedstoneEvent(block, 15, 0); ++ world.getServer().getPluginManager().callEvent(eventRedstone); ++ ++ if (eventRedstone.getNewCurrent() > 0) { ++ return; ++ } ++ // CraftBukkit end + world.setTypeUpdate(blockposition, iblockdata.set(BlockButtonAbstract.POWERED, Boolean.valueOf(false))); + this.b(world, blockposition, (EnumDirection) iblockdata.get(BlockButtonAbstract.FACING)); + world.b(blockposition, blockposition); diff --git a/nms-patches/BlockCactus.patch b/nms-patches/BlockCactus.patch new file mode 100644 index 0000000000..7159a89ee6 --- /dev/null +++ b/nms-patches/BlockCactus.patch @@ -0,0 +1,31 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/BlockCactus.java 2014-11-27 08:59:46.509422692 +1100 ++++ src/main/java/net/minecraft/server/BlockCactus.java 2014-11-27 08:42:10.152850911 +1100 +@@ -3,6 +3,8 @@ + import java.util.Iterator; + import java.util.Random; + ++import org.bukkit.craftbukkit.event.CraftEventFactory; // CraftBukkit ++ + public class BlockCactus extends Block { + + public static final BlockStateInteger AGE = BlockStateInteger.of("age", 0, 15); +@@ -31,7 +33,8 @@ + world.setTypeUpdate(blockposition1, this.getBlockData()); + IBlockData iblockdata1 = iblockdata.set(BlockCactus.AGE, Integer.valueOf(0)); + +- world.setTypeAndData(blockposition, iblockdata1, 4); ++ CraftEventFactory.handleBlockGrowEvent(world, blockposition1.getX(), blockposition1.getY(), blockposition1.getZ(), this, 0); // CraftBukkit ++ // world.setTypeAndData(blockposition, iblockdata1, 4); // CraftBukkit + this.doPhysics(world, blockposition1, iblockdata1, this); + } else { + world.setTypeAndData(blockposition, iblockdata.set(BlockCactus.AGE, Integer.valueOf(j + 1)), 4); +@@ -83,7 +86,9 @@ + } + + public void a(World world, BlockPosition blockposition, IBlockData iblockdata, Entity entity) { ++ CraftEventFactory.blockDamage = world.getWorld().getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ()); // CraftBukkit + entity.damageEntity(DamageSource.CACTUS, 1.0F); ++ CraftEventFactory.blockDamage = null; // CraftBukkit + } + + public IBlockData fromLegacyData(int i) { diff --git a/nms-patches/BlockCake.patch b/nms-patches/BlockCake.patch new file mode 100644 index 0000000000..facc1d4f00 --- /dev/null +++ b/nms-patches/BlockCake.patch @@ -0,0 +1,22 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/BlockCake.java 2014-11-27 08:59:46.509422692 +1100 ++++ src/main/java/net/minecraft/server/BlockCake.java 2014-11-27 08:42:10.168850880 +1100 +@@ -54,7 +54,18 @@ + + private void b(World world, BlockPosition blockposition, IBlockData iblockdata, EntityHuman entityhuman) { + if (entityhuman.j(false)) { +- entityhuman.getFoodData().eat(2, 0.1F); ++ // CraftBukkit start ++ // entityhuman.getFoodData().eat(2, 0.1F); ++ int oldFoodLevel = entityhuman.getFoodData().foodLevel; ++ ++ org.bukkit.event.entity.FoodLevelChangeEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callFoodLevelChangeEvent(entityhuman, 2 + oldFoodLevel); ++ ++ if (!event.isCancelled()) { ++ entityhuman.getFoodData().eat(event.getFoodLevel() - oldFoodLevel, 0.1F); ++ } ++ ++ ((EntityPlayer) entityhuman).playerConnection.sendPacket(new PacketPlayOutUpdateHealth(((EntityPlayer) entityhuman).getBukkitEntity().getScaledHealth(), entityhuman.getFoodData().foodLevel, entityhuman.getFoodData().saturationLevel)); ++ // CraftBukkit end + int i = ((Integer) iblockdata.get(BlockCake.BITES)).intValue(); + + if (i < 6) { diff --git a/nms-patches/BlockCocoa.patch b/nms-patches/BlockCocoa.patch new file mode 100644 index 0000000000..40006fffc5 --- /dev/null +++ b/nms-patches/BlockCocoa.patch @@ -0,0 +1,35 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/BlockCocoa.java 2014-11-27 08:59:46.513422674 +1100 ++++ src/main/java/net/minecraft/server/BlockCocoa.java 2014-11-27 08:42:10.152850911 +1100 +@@ -2,6 +2,8 @@ + + import java.util.Random; + ++import org.bukkit.craftbukkit.event.CraftEventFactory; // CraftBukkit ++ + public class BlockCocoa extends BlockDirectional implements IBlockFragilePlantElement { + + public static final BlockStateInteger AGE = BlockStateInteger.of("age", 0, 2); +@@ -19,7 +21,10 @@ + int i = ((Integer) iblockdata.get(BlockCocoa.AGE)).intValue(); + + if (i < 2) { +- world.setTypeAndData(blockposition, iblockdata.set(BlockCocoa.AGE, Integer.valueOf(i + 1)), 2); ++ // CraftBukkit start ++ IBlockData data = iblockdata.set(AGE, Integer.valueOf(i + 1)); ++ CraftEventFactory.handleBlockGrowEvent(world, blockposition.getX(), blockposition.getY(), blockposition.getZ(), this, toLegacyData(data)); ++ // CraftBukkit end + } + } + +@@ -125,7 +130,10 @@ + } + + public void b(World world, Random random, BlockPosition blockposition, IBlockData iblockdata) { +- world.setTypeAndData(blockposition, iblockdata.set(BlockCocoa.AGE, Integer.valueOf(((Integer) iblockdata.get(BlockCocoa.AGE)).intValue() + 1)), 2); ++ // CraftBukkit start ++ IBlockData data = iblockdata.set(AGE, Integer.valueOf(((Integer) iblockdata.get(AGE)).intValue() + 1)); ++ CraftEventFactory.handleBlockGrowEvent(world, blockposition.getX(), blockposition.getY(), blockposition.getZ(), this, toLegacyData(data)); ++ // CraftBukkit end + } + + public IBlockData fromLegacyData(int i) { diff --git a/nms-patches/BlockCommand.patch b/nms-patches/BlockCommand.patch new file mode 100644 index 0000000000..e7fe808da5 --- /dev/null +++ b/nms-patches/BlockCommand.patch @@ -0,0 +1,34 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/BlockCommand.java 2014-11-27 08:59:46.513422674 +1100 ++++ src/main/java/net/minecraft/server/BlockCommand.java 2014-11-27 08:42:10.152850911 +1100 +@@ -2,6 +2,8 @@ + + import java.util.Random; + ++import org.bukkit.event.block.BlockRedstoneEvent; // CraftBukkit ++ + public class BlockCommand extends BlockContainer { + + public static final BlockStateBoolean TRIGGERED = BlockStateBoolean.of("triggered"); +@@ -19,11 +21,20 @@ + if (!world.isStatic) { + boolean flag = world.isBlockIndirectlyPowered(blockposition); + boolean flag1 = ((Boolean) iblockdata.get(BlockCommand.TRIGGERED)).booleanValue(); ++ ++ // CraftBukkit start ++ org.bukkit.block.Block bukkitBlock = world.getWorld().getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ()); ++ int old = flag1 ? 15 : 0; ++ int current = flag ? 15 : 0; ++ ++ BlockRedstoneEvent eventRedstone = new BlockRedstoneEvent(bukkitBlock, old, current); ++ world.getServer().getPluginManager().callEvent(eventRedstone); ++ // CraftBukkit end + +- if (flag && !flag1) { ++ if (eventRedstone.getNewCurrent() > 0 && !(eventRedstone.getOldCurrent() > 0)) { // CraftBukkit + world.setTypeAndData(blockposition, iblockdata.set(BlockCommand.TRIGGERED, Boolean.valueOf(true)), 4); + world.a(blockposition, (Block) this, this.a(world)); +- } else if (!flag && flag1) { ++ } else if (!(eventRedstone.getNewCurrent() > 0) && eventRedstone.getOldCurrent() > 0) { // CraftBukkit + world.setTypeAndData(blockposition, iblockdata.set(BlockCommand.TRIGGERED, Boolean.valueOf(false)), 4); + } + } diff --git a/nms-patches/BlockCrops.patch b/nms-patches/BlockCrops.patch new file mode 100644 index 0000000000..fde60f42df --- /dev/null +++ b/nms-patches/BlockCrops.patch @@ -0,0 +1,35 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/BlockCrops.java 2014-11-27 08:59:46.517422657 +1100 ++++ src/main/java/net/minecraft/server/BlockCrops.java 2014-11-27 08:42:10.160850895 +1100 +@@ -2,6 +2,8 @@ + + import java.util.Random; + ++import org.bukkit.craftbukkit.event.CraftEventFactory; // CraftBukkit ++ + public class BlockCrops extends BlockPlant implements IBlockFragilePlantElement { + + public static final BlockStateInteger AGE = BlockStateInteger.of("age", 0, 7); +@@ -31,7 +33,10 @@ + float f = a((Block) this, world, blockposition); + + if (random.nextInt((int) (25.0F / f) + 1) == 0) { +- world.setTypeAndData(blockposition, iblockdata.set(BlockCrops.AGE, Integer.valueOf(i + 1)), 2); ++ // CraftBukkit start ++ IBlockData data = iblockdata.set(AGE, Integer.valueOf(i + 1)); ++ CraftEventFactory.handleBlockGrowEvent(world, blockposition.getX(), blockposition.getY(), blockposition.getZ(), this, toLegacyData(data)); ++ // CraftBukkit end + } + } + } +@@ -45,7 +50,10 @@ + i = 7; + } + +- world.setTypeAndData(blockposition, iblockdata.set(BlockCrops.AGE, Integer.valueOf(i)), 2); ++ // CraftBukkit start ++ IBlockData data = iblockdata.set(AGE, Integer.valueOf(i)); ++ CraftEventFactory.handleBlockGrowEvent(world, blockposition.getX(), blockposition.getY(), blockposition.getZ(), this, toLegacyData(data)); ++ // CraftBukkit end + } + + protected static float a(Block block, World world, BlockPosition blockposition) { diff --git a/nms-patches/BlockDaylightDetector.patch b/nms-patches/BlockDaylightDetector.patch new file mode 100644 index 0000000000..7f37a071ab --- /dev/null +++ b/nms-patches/BlockDaylightDetector.patch @@ -0,0 +1,10 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/BlockDaylightDetector.java 2014-11-27 08:59:46.517422657 +1100 ++++ src/main/java/net/minecraft/server/BlockDaylightDetector.java 2014-11-27 08:42:10.164850887 +1100 +@@ -41,6 +41,7 @@ + } + + if (((Integer) iblockdata.get(BlockDaylightDetector.POWER)).intValue() != i) { ++ i = org.bukkit.craftbukkit.event.CraftEventFactory.callRedstoneChange(world, blockposition.getX(), blockposition.getY(), blockposition.getZ(), ((Integer) iblockdata.get(POWER)), i).getNewCurrent(); // CraftBukkit - Call BlockRedstoneEvent + world.setTypeAndData(blockposition, iblockdata.set(BlockDaylightDetector.POWER, Integer.valueOf(i)), 3); + } + diff --git a/nms-patches/BlockDiodeAbstract.patch b/nms-patches/BlockDiodeAbstract.patch new file mode 100644 index 0000000000..f0c210d8a8 --- /dev/null +++ b/nms-patches/BlockDiodeAbstract.patch @@ -0,0 +1,30 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/BlockDiodeAbstract.java 2014-11-27 08:59:46.517422657 +1100 ++++ src/main/java/net/minecraft/server/BlockDiodeAbstract.java 2014-11-27 08:42:10.172850872 +1100 +@@ -2,6 +2,8 @@ + + import java.util.Random; + ++import org.bukkit.craftbukkit.event.CraftEventFactory; // CraftBukkit ++ + public abstract class BlockDiodeAbstract extends BlockDirectional { + + protected final boolean M; +@@ -31,8 +33,18 @@ + boolean flag = this.e(world, blockposition, iblockdata); + + if (this.M && !flag) { ++ // CraftBukkit start ++ if (CraftEventFactory.callRedstoneChange(world, blockposition.getX(), blockposition.getY(), blockposition.getZ(), 15, 0).getNewCurrent() != 0) { ++ return; ++ } ++ // CraftBukkit end + world.setTypeAndData(blockposition, this.k(iblockdata), 2); + } else if (!this.M) { ++ // CraftBukkit start ++ if (CraftEventFactory.callRedstoneChange(world, blockposition.getX(), blockposition.getY(), blockposition.getZ(), 0, 15).getNewCurrent() != 15) { ++ return; ++ } ++ // CraftBukkit end + world.setTypeAndData(blockposition, this.e(iblockdata), 2); + if (!flag) { + world.a(blockposition, this.e(iblockdata).getBlock(), this.m(iblockdata), -1); diff --git a/nms-patches/BlockDispenser.patch b/nms-patches/BlockDispenser.patch new file mode 100644 index 0000000000..35ad0d5874 --- /dev/null +++ b/nms-patches/BlockDispenser.patch @@ -0,0 +1,18 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/BlockDispenser.java 2014-11-27 08:59:46.521422639 +1100 ++++ src/main/java/net/minecraft/server/BlockDispenser.java 2014-11-27 08:42:10.084851043 +1100 +@@ -8,6 +8,7 @@ + public static final BlockStateBoolean TRIGGERED = BlockStateBoolean.of("triggered"); + public static final RegistryDefault M = new RegistryDefault(new DispenseBehaviorItem()); + protected Random N = new Random(); ++ public static boolean eventFired = false; // CraftBukkit + + protected BlockDispenser() { + super(Material.STONE); +@@ -78,6 +79,7 @@ + + if (idispensebehavior != IDispenseBehavior.a) { + ItemStack itemstack1 = idispensebehavior.a(sourceblock, itemstack); ++ eventFired = false; // CraftBukkit - reset event status + + tileentitydispenser.setItem(i, itemstack1.count == 0 ? null : itemstack1); + } diff --git a/nms-patches/BlockDoor.patch b/nms-patches/BlockDoor.patch new file mode 100644 index 0000000000..a14fff0ff3 --- /dev/null +++ b/nms-patches/BlockDoor.patch @@ -0,0 +1,43 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/BlockDoor.java 2014-11-27 08:59:46.521422639 +1100 ++++ src/main/java/net/minecraft/server/BlockDoor.java 2014-11-27 08:42:10.156850903 +1100 +@@ -3,6 +3,8 @@ + import com.google.common.base.Predicate; + import java.util.Random; + ++import org.bukkit.event.block.BlockRedstoneEvent; // CraftBukkit ++ + public class BlockDoor extends Block { + + public static final BlockStateDirection FACING = BlockStateDirection.of("facing", (Predicate) EnumDirectionLimit.HORIZONTAL); +@@ -151,9 +153,21 @@ + this.b(world, blockposition, iblockdata, 0); + } + } else { +- boolean flag1 = world.isBlockIndirectlyPowered(blockposition) || world.isBlockIndirectlyPowered(blockposition2); ++ // CraftBukkit start ++ org.bukkit.World bworld = world.getWorld(); ++ org.bukkit.block.Block bukkitBlock = bworld.getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ()); ++ org.bukkit.block.Block blockTop = bworld.getBlockAt(blockposition2.getX(), blockposition2.getY(), blockposition2.getZ()); ++ ++ int power = bukkitBlock.getBlockPower(); ++ int powerTop = blockTop.getBlockPower(); ++ if (powerTop > power) power = powerTop; ++ int oldPower = (Boolean)iblockdata2.get(POWERED) ? 15 : 0; ++ ++ if (oldPower == 0 ^ power == 0) { ++ BlockRedstoneEvent eventRedstone = new BlockRedstoneEvent(bukkitBlock, oldPower, power); ++ world.getServer().getPluginManager().callEvent(eventRedstone); + +- if ((flag1 || block.isPowerSource()) && block != this && flag1 != ((Boolean) iblockdata2.get(BlockDoor.POWERED)).booleanValue()) { ++ boolean flag1 = eventRedstone.getNewCurrent() > 0; + world.setTypeAndData(blockposition2, iblockdata2.set(BlockDoor.POWERED, Boolean.valueOf(flag1)), 2); + if (flag1 != ((Boolean) iblockdata.get(BlockDoor.OPEN)).booleanValue()) { + world.setTypeAndData(blockposition, iblockdata.set(BlockDoor.OPEN, Boolean.valueOf(flag1)), 2); +@@ -161,6 +175,7 @@ + world.a((EntityHuman) null, flag1 ? 1003 : 1006, blockposition, 0); + } + } ++ // CraftBukkit end + } + } + diff --git a/nms-patches/BlockDragonEgg.patch b/nms-patches/BlockDragonEgg.patch new file mode 100644 index 0000000000..d2415b9b9a --- /dev/null +++ b/nms-patches/BlockDragonEgg.patch @@ -0,0 +1,30 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/BlockDragonEgg.java 2014-11-27 08:59:46.525422622 +1100 ++++ src/main/java/net/minecraft/server/BlockDragonEgg.java 2014-11-27 08:42:10.152850911 +1100 +@@ -2,6 +2,8 @@ + + import java.util.Random; + ++import org.bukkit.event.block.BlockFromToEvent; // CraftBukkit ++ + public class BlockDragonEgg extends Block { + + public BlockDragonEgg() { +@@ -61,6 +63,18 @@ + BlockPosition blockposition1 = blockposition.a(world.random.nextInt(16) - world.random.nextInt(16), world.random.nextInt(8) - world.random.nextInt(8), world.random.nextInt(16) - world.random.nextInt(16)); + + if (world.getType(blockposition1).getBlock().material == Material.AIR) { ++ // CraftBukkit start ++ org.bukkit.block.Block from = world.getWorld().getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ()); ++ org.bukkit.block.Block to = world.getWorld().getBlockAt(blockposition1.getX(), blockposition1.getY(), blockposition1.getZ()); ++ BlockFromToEvent event = new BlockFromToEvent(from, to); ++ org.bukkit.Bukkit.getPluginManager().callEvent(event); ++ ++ if (event.isCancelled()) { ++ return; ++ } ++ ++ blockposition1 = new BlockPosition(event.getToBlock().getX(), event.getToBlock().getY(), event.getToBlock().getZ()); ++ // CraftBukkit end + if (world.isStatic) { + for (int j = 0; j < 128; ++j) { + double d0 = world.random.nextDouble(); diff --git a/nms-patches/BlockDropper.patch b/nms-patches/BlockDropper.patch new file mode 100644 index 0000000000..43df579c1a --- /dev/null +++ b/nms-patches/BlockDropper.patch @@ -0,0 +1,41 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/BlockDropper.java 2014-11-27 08:59:46.525422622 +1100 ++++ src/main/java/net/minecraft/server/BlockDropper.java 2014-11-27 08:42:10.124850965 +1100 +@@ -1,5 +1,10 @@ + package net.minecraft.server; + ++// CraftBukkit start ++import org.bukkit.craftbukkit.inventory.CraftItemStack; ++import org.bukkit.event.inventory.InventoryMoveItemEvent; ++// CraftBukkit end ++ + public class BlockDropper extends BlockDispenser { + + private final IDispenseBehavior O = new DispenseBehaviorItem(); +@@ -38,8 +43,25 @@ + itemstack1 = null; + } + } else { +- itemstack1 = TileEntityHopper.addItem(iinventory, itemstack.cloneItemStack().a(1), enumdirection.opposite()); +- if (itemstack1 == null) { ++ // CraftBukkit start - Fire event when pushing items into other inventories ++ CraftItemStack oitemstack = CraftItemStack.asCraftMirror(itemstack.cloneItemStack().a(1)); ++ ++ org.bukkit.inventory.Inventory destinationInventory; ++ // Have to special case large chests as they work oddly ++ if (iinventory instanceof InventoryLargeChest) { ++ destinationInventory = new org.bukkit.craftbukkit.inventory.CraftInventoryDoubleChest((InventoryLargeChest) iinventory); ++ } else { ++ destinationInventory = iinventory.getOwner().getInventory(); ++ } ++ ++ InventoryMoveItemEvent event = new InventoryMoveItemEvent(tileentitydispenser.getOwner().getInventory(), oitemstack.clone(), destinationInventory, true); ++ world.getServer().getPluginManager().callEvent(event); ++ if (event.isCancelled()) { ++ return; ++ } ++ itemstack1 = TileEntityHopper.addItem(iinventory, CraftItemStack.asNMSCopy(event.getItem()), enumdirection.opposite()); ++ if (event.getItem().equals(oitemstack) && itemstack1 == null) { ++ // CraftBukkit end + itemstack1 = itemstack.cloneItemStack(); + if (--itemstack1.count == 0) { + itemstack1 = null; diff --git a/nms-patches/BlockEnderPortal.patch b/nms-patches/BlockEnderPortal.patch new file mode 100644 index 0000000000..ae5743c2a7 --- /dev/null +++ b/nms-patches/BlockEnderPortal.patch @@ -0,0 +1,22 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/BlockEnderPortal.java 2014-11-27 08:59:46.529422604 +1100 ++++ src/main/java/net/minecraft/server/BlockEnderPortal.java 2014-11-27 08:42:10.104851005 +1100 +@@ -3,6 +3,8 @@ + import java.util.List; + import java.util.Random; + ++import org.bukkit.event.entity.EntityPortalEnterEvent; // CraftBukkit ++ + public class BlockEnderPortal extends BlockContainer { + + protected BlockEnderPortal(Material material) { +@@ -36,6 +38,10 @@ + + public void a(World world, BlockPosition blockposition, IBlockData iblockdata, Entity entity) { + if (entity.vehicle == null && entity.passenger == null && !world.isStatic) { ++ // CraftBukkit start - Entity in portal ++ EntityPortalEnterEvent event = new EntityPortalEnterEvent(entity.getBukkitEntity(), new org.bukkit.Location(world.getWorld(), blockposition.getX(), blockposition.getY(), blockposition.getZ())); ++ world.getServer().getPluginManager().callEvent(event); ++ // CraftBukkit end + entity.c(1); + } + diff --git a/nms-patches/BlockFire.patch b/nms-patches/BlockFire.patch new file mode 100644 index 0000000000..0abc00c033 --- /dev/null +++ b/nms-patches/BlockFire.patch @@ -0,0 +1,110 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/BlockFire.java 2014-11-27 08:59:46.529422604 +1100 ++++ src/main/java/net/minecraft/server/BlockFire.java 2014-11-27 08:42:10.168850880 +1100 +@@ -4,6 +4,12 @@ + import java.util.Map; + import java.util.Random; + ++// CraftBukkit start ++import org.bukkit.craftbukkit.event.CraftEventFactory; ++import org.bukkit.event.block.BlockBurnEvent; ++import org.bukkit.event.block.BlockSpreadEvent; ++// CraftBukkit end ++ + public class BlockFire extends Block { + + public static final BlockStateInteger AGE = BlockStateInteger.of("age", 0, 15); +@@ -109,7 +115,7 @@ + public void b(World world, BlockPosition blockposition, IBlockData iblockdata, Random random) { + if (world.getGameRules().getBoolean("doFireTick")) { + if (!this.canPlace(world, blockposition)) { +- world.setAir(blockposition); ++ fireExtinguished(world, blockposition); // CraftBukkit - invalid place location + } + + Block block = world.getType(blockposition.down()).getBlock(); +@@ -120,7 +126,7 @@ + } + + if (!flag && world.S() && this.d(world, blockposition)) { +- world.setAir(blockposition); ++ fireExtinguished(world, blockposition); // CraftBukkit - extinguished by rain + } else { + int i = ((Integer) iblockdata.get(BlockFire.AGE)).intValue(); + +@@ -186,7 +192,26 @@ + l1 = 15; + } + +- world.setTypeAndData(blockposition1, iblockdata.set(BlockFire.AGE, Integer.valueOf(l1)), 3); ++ // CraftBukkit start - Call to stop spread of fire ++ if (world.getType(blockposition1) != Blocks.FIRE) { ++ if (CraftEventFactory.callBlockIgniteEvent(world, i1, k1, j1, i, j, k).isCancelled()) { ++ continue; ++ } ++ ++ org.bukkit.Server server = world.getServer(); ++ org.bukkit.World bworld = world.getWorld(); ++ org.bukkit.block.BlockState blockState = bworld.getBlockAt(i1, k1, j1).getState(); ++ blockState.setTypeId(Block.getId(this)); ++ blockState.setData(new org.bukkit.material.MaterialData(Block.getId(this), (byte) l1)); ++ ++ BlockSpreadEvent spreadEvent = new BlockSpreadEvent(blockState.getBlock(), bworld.getBlockAt(i, j, k), blockState); ++ server.getPluginManager().callEvent(spreadEvent); ++ ++ if (!spreadEvent.isCancelled()) { ++ blockState.update(true); ++ } ++ } ++ // CraftBukkit end + } + } + } +@@ -223,6 +248,17 @@ + + if (random.nextInt(i) < k) { + IBlockData iblockdata = world.getType(blockposition); ++ ++ // CraftBukkit start ++ org.bukkit.block.Block theBlock = world.getWorld().getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ()); ++ ++ BlockBurnEvent event = new BlockBurnEvent(theBlock); ++ world.getServer().getPluginManager().callEvent(event); ++ ++ if (event.isCancelled()) { ++ return; ++ } ++ // CraftBukkit end + + if (random.nextInt(j + 10) < 5 && !world.isRainingAt(blockposition)) { + int l = j + random.nextInt(5) / 4; +@@ -290,7 +326,7 @@ + + public void doPhysics(World world, BlockPosition blockposition, IBlockData iblockdata, Block block) { + if (!World.a((IBlockAccess) world, blockposition.down()) && !this.e(world, blockposition)) { +- world.setAir(blockposition); ++ fireExtinguished(world, blockposition); // CraftBukkit - fuel block gone + } + + } +@@ -298,7 +334,7 @@ + public void onPlace(World world, BlockPosition blockposition, IBlockData iblockdata) { + if (world.worldProvider.getDimension() > 0 || !Blocks.PORTAL.d(world, blockposition)) { + if (!World.a((IBlockAccess) world, blockposition.down()) && !this.e(world, blockposition)) { +- world.setAir(blockposition); ++ fireExtinguished(world, blockposition); // CraftBukkit - fuel block broke + } else { + world.a(blockposition, (Block) this, this.a(world) + world.random.nextInt(10)); + } +@@ -320,4 +356,12 @@ + protected BlockStateList getStateList() { + return new BlockStateList(this, new IBlockState[] { BlockFire.AGE, BlockFire.NORTH, BlockFire.EAST, BlockFire.SOUTH, BlockFire.WEST, BlockFire.UPPER, BlockFire.FLIP, BlockFire.ALT}); + } ++ ++ // CraftBukkit start ++ private void fireExtinguished(World world, BlockPosition position) { ++ if (!CraftEventFactory.callBlockFadeEvent(world.getWorld().getBlockAt(position.getX(), position.getY(), position.getZ()), Blocks.AIR).isCancelled()) { ++ world.setAir(position); ++ } ++ } ++ // CraftBukkit end + } diff --git a/nms-patches/BlockFlowing.patch b/nms-patches/BlockFlowing.patch new file mode 100644 index 0000000000..84b3101d8d --- /dev/null +++ b/nms-patches/BlockFlowing.patch @@ -0,0 +1,83 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/BlockFlowing.java 2014-11-27 08:59:46.529422604 +1100 ++++ src/main/java/net/minecraft/server/BlockFlowing.java 2014-11-27 08:42:10.112850989 +1100 +@@ -5,6 +5,11 @@ + import java.util.Random; + import java.util.Set; + ++// CraftBukkit start ++import org.bukkit.block.BlockFace; ++import org.bukkit.event.block.BlockFromToEvent; ++// CraftBukkit end ++ + public class BlockFlowing extends BlockFluids { + + int a; +@@ -18,7 +23,12 @@ + } + + public void b(World world, BlockPosition blockposition, IBlockData iblockdata, Random random) { +- int i = ((Integer) iblockdata.get(BlockFlowing.LEVEL)).intValue(); ++ // CraftBukkit start ++ org.bukkit.World bworld = world.getWorld(); ++ org.bukkit.Server server = world.getServer(); ++ org.bukkit.block.Block source = bworld == null ? null : bworld.getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ()); ++ // CraftBukkit end ++ int i = ((Integer) iblockdata.get(LEVEL)).intValue(); + byte b0 = 1; + + if (this.material == Material.LAVA && !world.worldProvider.n()) { +@@ -88,17 +98,25 @@ + IBlockData iblockdata2 = world.getType(blockposition.down()); + + if (this.h(world, blockposition.down(), iblockdata2)) { +- if (this.material == Material.LAVA && world.getType(blockposition.down()).getBlock().getMaterial() == Material.WATER) { +- world.setTypeUpdate(blockposition.down(), Blocks.STONE.getBlockData()); +- this.fizz(world, blockposition.down()); +- return; +- } ++ // CraftBukkit start - Send "down" to the server ++ BlockFromToEvent event = new BlockFromToEvent(source, BlockFace.DOWN); ++ if (server != null) { ++ server.getPluginManager().callEvent(event); ++ } ++ if (!event.isCancelled()) { ++ if (this.material == Material.LAVA && world.getType(blockposition.down()).getBlock().getMaterial() == Material.WATER) { ++ world.setTypeUpdate(blockposition.down(), Blocks.STONE.getBlockData()); ++ this.fizz(world, blockposition.down()); ++ return; ++ } + +- if (i >= 8) { +- this.flow(world, blockposition.down(), iblockdata2, i); +- } else { +- this.flow(world, blockposition.down(), iblockdata2, i + 8); ++ if (i >= 8) { ++ this.flow(world, blockposition.down(), iblockdata2, i); ++ } else { ++ this.flow(world, blockposition.down(), iblockdata2, i + 8); ++ } + } ++ // CraftBukkit end + } else if (i >= 0 && (i == 0 || this.g(world, blockposition.down(), iblockdata2))) { + Set set = this.e(world, blockposition); + +@@ -115,8 +133,17 @@ + + while (iterator1.hasNext()) { + EnumDirection enumdirection1 = (EnumDirection) iterator1.next(); +- +- this.flow(world, blockposition.shift(enumdirection1), world.getType(blockposition.shift(enumdirection1)), k); ++ ++ // CraftBukkit start ++ BlockFromToEvent event = new BlockFromToEvent(source, org.bukkit.craftbukkit.block.CraftBlock.notchToBlockFace(enumdirection1)); ++ if (server != null) { ++ server.getPluginManager().callEvent(event); ++ } ++ ++ if (!event.isCancelled()) { ++ this.flow(world, blockposition.shift(enumdirection1), world.getType(blockposition.shift(enumdirection1)), k); ++ } ++ // CraftBukkit end + } + } + diff --git a/nms-patches/BlockGrass.patch b/nms-patches/BlockGrass.patch new file mode 100644 index 0000000000..b52f01fd6c --- /dev/null +++ b/nms-patches/BlockGrass.patch @@ -0,0 +1,77 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/BlockGrass.java 2014-11-27 08:59:46.533422586 +1100 ++++ src/main/java/net/minecraft/server/BlockGrass.java 2014-11-27 08:42:10.172850872 +1100 +@@ -2,6 +2,14 @@ + + import java.util.Random; + ++// CraftBukkit start ++import org.bukkit.block.BlockState; ++import org.bukkit.craftbukkit.event.CraftEventFactory; ++import org.bukkit.craftbukkit.util.CraftMagicNumbers; ++import org.bukkit.event.block.BlockSpreadEvent; ++import org.bukkit.event.block.BlockFadeEvent; ++// CraftBukkit end ++ + public class BlockGrass extends Block implements IBlockFragilePlantElement { + + public static final BlockStateBoolean SNOWY = BlockStateBoolean.of("snowy"); +@@ -22,7 +30,19 @@ + public void b(World world, BlockPosition blockposition, IBlockData iblockdata, Random random) { + if (!world.isStatic) { + if (world.getLightLevel(blockposition.up()) < 4 && world.getType(blockposition.up()).getBlock().n() > 2) { +- world.setTypeUpdate(blockposition, Blocks.DIRT.getBlockData()); ++ // CraftBukkit start ++ // world.setTypeUpdate(blockposition, Blocks.DIRT.getBlockData()); ++ org.bukkit.World bworld = world.getWorld(); ++ BlockState blockState = bworld.getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ()).getState(); ++ blockState.setType(CraftMagicNumbers.getMaterial(Blocks.DIRT)); ++ ++ BlockFadeEvent event = new BlockFadeEvent(blockState.getBlock(), blockState); ++ world.getServer().getPluginManager().callEvent(event); ++ ++ if (!event.isCancelled()) { ++ blockState.update(true); ++ } ++ // CraftBukkit end + } else { + if (world.getLightLevel(blockposition.up()) >= 9) { + for (int i = 0; i < 4; ++i) { +@@ -31,7 +51,19 @@ + IBlockData iblockdata1 = world.getType(blockposition1); + + if (iblockdata1.getBlock() == Blocks.DIRT && iblockdata1.get(BlockDirt.VARIANT) == EnumDirtVariant.DIRT && world.getLightLevel(blockposition1.up()) >= 4 && block.n() <= 2) { +- world.setTypeUpdate(blockposition1, Blocks.GRASS.getBlockData()); ++ // CraftBukkit start ++ // world.setTypeUpdate(blockposition1, Blocks.GRASS.getBlockData()); ++ org.bukkit.World bworld = world.getWorld(); ++ BlockState blockState = bworld.getBlockAt(blockposition1.getX(), blockposition1.getY(), blockposition1.getZ()).getState(); ++ blockState.setType(CraftMagicNumbers.getMaterial(Blocks.GRASS)); ++ ++ BlockSpreadEvent event = new BlockSpreadEvent(blockState.getBlock(), bworld.getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ()), blockState); ++ world.getServer().getPluginManager().callEvent(event); ++ ++ if (!event.isCancelled()) { ++ blockState.update(true); ++ } ++ // CraftBukkit end + } + } + } +@@ -74,13 +106,15 @@ + IBlockData iblockdata1 = blockflowers.getBlockData().set(blockflowers.l(), enumflowervarient); + + if (blockflowers.f(world, blockposition2, iblockdata1)) { +- world.setTypeAndData(blockposition2, iblockdata1, 3); ++ // world.setTypeAndData(blockposition2, iblockdata1, 3); // CraftBukkit ++ CraftEventFactory.handleBlockGrowEvent(world, blockposition2.getX(), blockposition2.getY(), blockposition2.getZ(), iblockdata1.getBlock(), iblockdata1.getBlock().toLegacyData(iblockdata1)); // CraftBukkit + } + } else { + IBlockData iblockdata2 = Blocks.TALLGRASS.getBlockData().set(BlockLongGrass.TYPE, EnumTallGrassType.GRASS); + + if (Blocks.TALLGRASS.f(world, blockposition2, iblockdata2)) { +- world.setTypeAndData(blockposition2, iblockdata2, 3); ++ // world.setTypeAndData(blockposition2, iblockdata2, 3); // CRaftBukkit ++ CraftEventFactory.handleBlockGrowEvent(world, blockposition2.getX(), blockposition2.getY(), blockposition2.getZ(), iblockdata2.getBlock(), iblockdata2.getBlock().toLegacyData(iblockdata2)); // CraftBukkit + } + } + } diff --git a/nms-patches/BlockIce.patch b/nms-patches/BlockIce.patch new file mode 100644 index 0000000000..91033f00ba --- /dev/null +++ b/nms-patches/BlockIce.patch @@ -0,0 +1,15 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/BlockIce.java 2014-11-27 08:59:46.533422586 +1100 ++++ src/main/java/net/minecraft/server/BlockIce.java 2014-11-27 08:42:10.168850880 +1100 +@@ -44,6 +44,12 @@ + + public void b(World world, BlockPosition blockposition, IBlockData iblockdata, Random random) { + if (world.b(EnumSkyBlock.BLOCK, blockposition) > 11 - this.n()) { ++ // CraftBukkit start ++ if (org.bukkit.craftbukkit.event.CraftEventFactory.callBlockFadeEvent(world.getWorld().getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ()), world.worldProvider.n() ? Blocks.AIR : Blocks.WATER).isCancelled()) { ++ return; ++ } ++ // CraftBukkit end ++ + if (world.worldProvider.n()) { + world.setAir(blockposition); + } else { diff --git a/nms-patches/BlockLeaves.patch b/nms-patches/BlockLeaves.patch new file mode 100644 index 0000000000..067c58081f --- /dev/null +++ b/nms-patches/BlockLeaves.patch @@ -0,0 +1,26 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/BlockLeaves.java 2014-11-27 08:59:46.537422569 +1100 ++++ src/main/java/net/minecraft/server/BlockLeaves.java 2014-11-27 08:42:10.132850949 +1100 +@@ -2,6 +2,8 @@ + + import java.util.Random; + ++import org.bukkit.event.block.LeavesDecayEvent; // CraftBukkit ++ + public abstract class BlockLeaves extends BlockTransparent { + + public static final BlockStateBoolean DECAYABLE = BlockStateBoolean.of("decayable"); +@@ -128,6 +130,14 @@ + } + + private void d(World world, BlockPosition blockposition) { ++ // CraftBukkit start ++ LeavesDecayEvent event = new LeavesDecayEvent(world.getWorld().getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ())); ++ world.getServer().getPluginManager().callEvent(event); ++ ++ if (event.isCancelled()) { ++ return; ++ } ++ // CraftBukkit end + this.b(world, blockposition, world.getType(blockposition), 0); + world.setAir(blockposition); + } diff --git a/nms-patches/BlockLever.patch b/nms-patches/BlockLever.patch new file mode 100644 index 0000000000..fa9482b1eb --- /dev/null +++ b/nms-patches/BlockLever.patch @@ -0,0 +1,32 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/BlockLever.java 2014-11-27 08:59:46.541422551 +1100 ++++ src/main/java/net/minecraft/server/BlockLever.java 2014-11-27 08:42:10.168850880 +1100 +@@ -2,6 +2,8 @@ + + import java.util.Iterator; + ++import org.bukkit.event.block.BlockRedstoneEvent; // CraftBukkit ++ + public class BlockLever extends Block { + + public static final BlockStateEnum FACING = BlockStateEnum.of("facing", EnumLeverPosition.class); +@@ -144,6 +146,20 @@ + if (world.isStatic) { + return true; + } else { ++ // CraftBukkit start - Interact Lever ++ boolean powered = (Boolean)iblockdata.get(POWERED); ++ org.bukkit.block.Block block = world.getWorld().getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ()); ++ int old = (powered) ? 15 : 0; ++ int current = (!powered) ? 15 : 0; ++ ++ BlockRedstoneEvent eventRedstone = new BlockRedstoneEvent(block, old, current); ++ world.getServer().getPluginManager().callEvent(eventRedstone); ++ ++ if ((eventRedstone.getNewCurrent() > 0) != (!powered)) { ++ return true; ++ } ++ // CraftBukkit end ++ + iblockdata = iblockdata.a(BlockLever.POWERED); + world.setTypeAndData(blockposition, iblockdata, 3); + world.makeSound((double) blockposition.getX() + 0.5D, (double) blockposition.getY() + 0.5D, (double) blockposition.getZ() + 0.5D, "random.click", 0.3F, ((Boolean) iblockdata.get(BlockLever.POWERED)).booleanValue() ? 0.6F : 0.5F); diff --git a/nms-patches/BlockMinecartDetector.patch b/nms-patches/BlockMinecartDetector.patch new file mode 100644 index 0000000000..4e33f43103 --- /dev/null +++ b/nms-patches/BlockMinecartDetector.patch @@ -0,0 +1,29 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/BlockMinecartDetector.java 2014-11-27 08:59:46.541422551 +1100 ++++ src/main/java/net/minecraft/server/BlockMinecartDetector.java 2014-11-27 08:42:10.124850965 +1100 +@@ -4,6 +4,8 @@ + import java.util.List; + import java.util.Random; + ++import org.bukkit.event.block.BlockRedstoneEvent; // CraftBukkit ++ + public class BlockMinecartDetector extends BlockMinecartTrackAbstract { + + public static final BlockStateEnum SHAPE = BlockStateEnum.a("shape", EnumTrackPosition.class, (Predicate) (new BlockMinecartDetectorInnerClass1())); +@@ -55,6 +57,17 @@ + if (!list.isEmpty()) { + flag1 = true; + } ++ ++ // CraftBukkit start ++ if (flag != flag1) { ++ org.bukkit.block.Block block = world.getWorld().getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ()); ++ ++ BlockRedstoneEvent eventRedstone = new BlockRedstoneEvent(block, flag ? 15 : 0, flag1 ? 15 : 0); ++ world.getServer().getPluginManager().callEvent(eventRedstone); ++ ++ flag1 = eventRedstone.getNewCurrent() > 0; ++ } ++ // CraftBukkit end + + if (flag1 && !flag) { + world.setTypeAndData(blockposition, iblockdata.set(BlockMinecartDetector.POWERED, Boolean.valueOf(true)), 3); diff --git a/nms-patches/BlockMobSpawner.patch b/nms-patches/BlockMobSpawner.patch new file mode 100644 index 0000000000..5be7f790df --- /dev/null +++ b/nms-patches/BlockMobSpawner.patch @@ -0,0 +1,22 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/BlockMobSpawner.java 2014-11-27 08:59:46.541422551 +1100 ++++ src/main/java/net/minecraft/server/BlockMobSpawner.java 2014-11-27 08:42:10.172850872 +1100 +@@ -22,9 +22,19 @@ + + public void dropNaturally(World world, BlockPosition blockposition, IBlockData iblockdata, float f, int i) { + super.dropNaturally(world, blockposition, iblockdata, f, i); ++ /* CraftBukkit start - Delegate to getExpDrop + int j = 15 + world.random.nextInt(15) + world.random.nextInt(15); + + this.dropExperience(world, blockposition, j); ++ */ ++ } ++ ++ @Override ++ public int getExpDrop(World world, IBlockData iblockdata, int enchantmentLevel) { ++ int j = 15 + world.random.nextInt(15) + world.random.nextInt(15); ++ ++ return j; ++ // CraftBukkit end + } + + public boolean c() { diff --git a/nms-patches/BlockMonsterEggs.patch b/nms-patches/BlockMonsterEggs.patch new file mode 100644 index 0000000000..9260842fa0 --- /dev/null +++ b/nms-patches/BlockMonsterEggs.patch @@ -0,0 +1,20 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/BlockMonsterEggs.java 2014-11-27 08:59:46.545422534 +1100 ++++ src/main/java/net/minecraft/server/BlockMonsterEggs.java 2014-11-27 08:42:10.136850942 +1100 +@@ -2,6 +2,8 @@ + + import java.util.Random; + ++import org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason; // CraftBukkit ++ + public class BlockMonsterEggs extends Block { + + public static final BlockStateEnum VARIANT = BlockStateEnum.of("variant", EnumMonsterEggVarient.class); +@@ -50,7 +52,7 @@ + EntitySilverfish entitysilverfish = new EntitySilverfish(world); + + entitysilverfish.setPositionRotation((double) blockposition.getX() + 0.5D, (double) blockposition.getY(), (double) blockposition.getZ() + 0.5D, 0.0F, 0.0F); +- world.addEntity(entitysilverfish); ++ world.addEntity(entitysilverfish, SpawnReason.SILVERFISH_BLOCK); // CraftBukkit - add SpawnReason + entitysilverfish.y(); + } + diff --git a/nms-patches/BlockMushroom.patch b/nms-patches/BlockMushroom.patch new file mode 100644 index 0000000000..5f2477b71d --- /dev/null +++ b/nms-patches/BlockMushroom.patch @@ -0,0 +1,57 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/BlockMushroom.java 2014-11-27 08:59:46.545422534 +1100 ++++ src/main/java/net/minecraft/server/BlockMushroom.java 2014-11-27 08:42:10.100851012 +1100 +@@ -3,6 +3,12 @@ + import java.util.Iterator; + import java.util.Random; + ++// CraftBukkit start ++import org.bukkit.TreeType; ++import org.bukkit.block.BlockState; ++import org.bukkit.event.block.BlockSpreadEvent; ++// CraftBukkit end ++ + public class BlockMushroom extends BlockPlant implements IBlockFragilePlantElement { + + protected BlockMushroom() { +@@ -13,6 +19,7 @@ + } + + public void b(World world, BlockPosition blockposition, IBlockData iblockdata, Random random) { ++ final int sourceX = blockposition.getX(), sourceY = blockposition.getY(), sourceZ = blockposition.getZ(); // CraftBukkit + if (random.nextInt(25) == 0) { + int i = 5; + boolean flag = true; +@@ -39,8 +46,20 @@ + blockposition2 = blockposition.a(random.nextInt(3) - 1, random.nextInt(2) - random.nextInt(2), random.nextInt(3) - 1); + } + +- if (world.isEmpty(blockposition2) && this.f(world, blockposition2, this.getBlockData())) { +- world.setTypeAndData(blockposition2, this.getBlockData(), 2); ++ if (world.isEmpty(blockposition2) && this.f(world, blockposition2, this.getBlockData())) { ++ // CraftBukkit start ++ // world.setTypeAndData(blockposition2, this.getBlockData(), 2); ++ org.bukkit.World bworld = world.getWorld(); ++ BlockState blockState = bworld.getBlockAt(blockposition2.getX(), blockposition2.getY(), blockposition2.getZ()).getState(); ++ blockState.setType(org.bukkit.craftbukkit.util.CraftMagicNumbers.getMaterial(this)); // nms: this.id, 0, 2 ++ ++ BlockSpreadEvent event = new BlockSpreadEvent(blockState.getBlock(), bworld.getBlockAt(sourceX, sourceY, sourceZ), blockState); ++ world.getServer().getPluginManager().callEvent(event); ++ ++ if (!event.isCancelled()) { ++ blockState.update(true); ++ } ++ // CraftBukkit end + } + } + +@@ -69,8 +88,10 @@ + WorldGenHugeMushroom worldgenhugemushroom = null; + + if (this == Blocks.BROWN_MUSHROOM) { ++ BlockSapling.treeType = TreeType.BROWN_MUSHROOM; // CraftBukkit + worldgenhugemushroom = new WorldGenHugeMushroom(0); + } else if (this == Blocks.RED_MUSHROOM) { ++ BlockSapling.treeType = TreeType.RED_MUSHROOM; // CraftBukkit + worldgenhugemushroom = new WorldGenHugeMushroom(1); + } + diff --git a/nms-patches/BlockMycel.patch b/nms-patches/BlockMycel.patch new file mode 100644 index 0000000000..0a0bd4fb6d --- /dev/null +++ b/nms-patches/BlockMycel.patch @@ -0,0 +1,58 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/BlockMycel.java 2014-11-27 08:59:46.549422516 +1100 ++++ src/main/java/net/minecraft/server/BlockMycel.java 2014-11-27 08:42:10.172850872 +1100 +@@ -2,6 +2,13 @@ + + import java.util.Random; + ++// CraftBukkit start ++import org.bukkit.block.BlockState; ++import org.bukkit.craftbukkit.util.CraftMagicNumbers; ++import org.bukkit.event.block.BlockFadeEvent; ++import org.bukkit.event.block.BlockSpreadEvent; ++// CraftBukkit end ++ + public class BlockMycel extends Block { + + public static final BlockStateBoolean SNOWY = BlockStateBoolean.of("snowy"); +@@ -22,7 +29,19 @@ + public void b(World world, BlockPosition blockposition, IBlockData iblockdata, Random random) { + if (!world.isStatic) { + if (world.getLightLevel(blockposition.up()) < 4 && world.getType(blockposition.up()).getBlock().n() > 2) { +- world.setTypeUpdate(blockposition, Blocks.DIRT.getBlockData().set(BlockDirt.VARIANT, EnumDirtVariant.DIRT)); ++ // CraftBukkit start ++ // world.setTypeUpdate(blockposition, Blocks.DIRT.getBlockData().set(BlockDirt.VARIANT, EnumDirtVariant.DIRT)); ++ org.bukkit.World bworld = world.getWorld(); ++ BlockState blockState = bworld.getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ()).getState(); ++ blockState.setType(CraftMagicNumbers.getMaterial(Blocks.DIRT)); ++ ++ BlockFadeEvent event = new BlockFadeEvent(blockState.getBlock(), blockState); ++ world.getServer().getPluginManager().callEvent(event); ++ ++ if (!event.isCancelled()) { ++ blockState.update(true); ++ } ++ // CraftBukkit end + } else { + if (world.getLightLevel(blockposition.up()) >= 9) { + for (int i = 0; i < 4; ++i) { +@@ -31,7 +50,19 @@ + Block block = world.getType(blockposition1.up()).getBlock(); + + if (iblockdata1.getBlock() == Blocks.DIRT && iblockdata1.get(BlockDirt.VARIANT) == EnumDirtVariant.DIRT && world.getLightLevel(blockposition1.up()) >= 4 && block.n() <= 2) { +- world.setTypeUpdate(blockposition1, this.getBlockData()); ++ // CraftBukkit start ++ // world.setTypeUpdate(blockposition1, this.getBlockData()); ++ org.bukkit.World bworld = world.getWorld(); ++ BlockState blockState = bworld.getBlockAt(blockposition1.getX(), blockposition1.getY(), blockposition1.getZ()).getState(); ++ blockState.setType(CraftMagicNumbers.getMaterial(this)); ++ ++ BlockSpreadEvent event = new BlockSpreadEvent(blockState.getBlock(), bworld.getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ()), blockState); ++ world.getServer().getPluginManager().callEvent(event); ++ ++ if (!event.isCancelled()) { ++ blockState.update(true); ++ } ++ // CraftBukkit end + } + } + } diff --git a/nms-patches/BlockNetherWart.patch b/nms-patches/BlockNetherWart.patch new file mode 100644 index 0000000000..c6f458ebf9 --- /dev/null +++ b/nms-patches/BlockNetherWart.patch @@ -0,0 +1,12 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/BlockNetherWart.java 2014-11-27 08:59:46.549422516 +1100 ++++ src/main/java/net/minecraft/server/BlockNetherWart.java 2014-11-27 08:42:10.140850934 +1100 +@@ -28,7 +28,8 @@ + + if (i < 3 && random.nextInt(10) == 0) { + iblockdata = iblockdata.set(BlockNetherWart.AGE, Integer.valueOf(i + 1)); +- world.setTypeAndData(blockposition, iblockdata, 2); ++ // world.setTypeAndData(blockposition, iblockdata, 2); // CraftBukkit ++ org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockGrowEvent(world, blockposition.getX(), blockposition.getY(), blockposition.getZ(), this, toLegacyData(iblockdata)); // CraftBukkit + } + + super.b(world, blockposition, iblockdata, random); diff --git a/nms-patches/BlockOre.patch b/nms-patches/BlockOre.patch new file mode 100644 index 0000000000..473fcbafd8 --- /dev/null +++ b/nms-patches/BlockOre.patch @@ -0,0 +1,42 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/BlockOre.java 2014-11-27 08:59:46.549422516 +1100 ++++ src/main/java/net/minecraft/server/BlockOre.java 2014-11-27 08:42:10.144850927 +1100 +@@ -33,6 +33,7 @@ + + public void dropNaturally(World world, BlockPosition blockposition, IBlockData iblockdata, float f, int i) { + super.dropNaturally(world, blockposition, iblockdata, f, i); ++ /* CraftBukkit start - Delegated to getExpDrop + if (this.getDropType(iblockdata, world.random, i) != Item.getItemOf(this)) { + int j = 0; + +@@ -50,7 +51,31 @@ + + this.dropExperience(world, blockposition, j); + } ++ // */ ++ } ++ ++ @Override ++ public int getExpDrop(World world, IBlockData iblockdata, int i) { ++ if (this.getDropType(iblockdata, world.random, i) != Item.getItemOf(this)) { ++ int j = 0; ++ ++ if (this == Blocks.COAL_ORE) { ++ j = MathHelper.nextInt(world.random, 0, 2); ++ } else if (this == Blocks.DIAMOND_ORE) { ++ j = MathHelper.nextInt(world.random, 3, 7); ++ } else if (this == Blocks.EMERALD_ORE) { ++ j = MathHelper.nextInt(world.random, 3, 7); ++ } else if (this == Blocks.LAPIS_ORE) { ++ j = MathHelper.nextInt(world.random, 2, 5); ++ } else if (this == Blocks.QUARTZ_ORE) { ++ j = MathHelper.nextInt(world.random, 2, 5); ++ } ++ ++ return j; ++ } + ++ return 0; ++ // CraftBukkit end + } + + public int getDropData(World world, BlockPosition blockposition) { diff --git a/nms-patches/BlockPiston.patch b/nms-patches/BlockPiston.patch new file mode 100644 index 0000000000..816eebdc40 --- /dev/null +++ b/nms-patches/BlockPiston.patch @@ -0,0 +1,76 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/BlockPiston.java 2014-11-27 08:59:46.553422499 +1100 ++++ src/main/java/net/minecraft/server/BlockPiston.java 2014-11-27 08:42:10.168850880 +1100 +@@ -1,6 +1,16 @@ + package net.minecraft.server; + ++import java.util.AbstractList; ++import java.util.Collection; ++import java.util.Iterator; + import java.util.List; ++import java.util.ListIterator; ++ ++// CraftBukkit start ++import org.bukkit.craftbukkit.block.CraftBlock; ++import org.bukkit.event.block.BlockPistonRetractEvent; ++import org.bukkit.event.block.BlockPistonExtendEvent; ++// CraftBukkit end + + public class BlockPiston extends Block { + +@@ -52,10 +62,19 @@ + boolean flag = this.b(world, blockposition, enumdirection); + + if (flag && !((Boolean) iblockdata.get(BlockPiston.EXTENDED)).booleanValue()) { +- if ((new PistonExtendsChecker(world, blockposition, enumdirection, true)).a()) { ++ if ((new PistonExtendsChecker(world, blockposition, enumdirection, true)).a()) { + world.playBlockAction(blockposition, this, 0, enumdirection.a()); + } + } else if (!flag && ((Boolean) iblockdata.get(BlockPiston.EXTENDED)).booleanValue()) { ++ // CraftBukkit start ++ org.bukkit.block.Block block = world.getWorld().getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ()); ++ BlockPistonRetractEvent event = new BlockPistonRetractEvent(block, CraftBlock.notchToBlockFace(enumdirection)); ++ world.getServer().getPluginManager().callEvent(event); ++ ++ if (event.isCancelled()) { ++ return; ++ } ++ // CraftBukkit end + world.setTypeAndData(blockposition, iblockdata.set(BlockPiston.EXTENDED, Boolean.valueOf(false)), 2); + world.playBlockAction(blockposition, this, 1, enumdirection.a()); + } +@@ -286,6 +305,35 @@ + if (!pistonextendschecker.a()) { + return false; + } else { ++ final org.bukkit.block.Block bblock = world.getWorld().getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ()); ++ ++ final List moved = pistonextendschecker.getMovedBlocks(); ++ final List broken = pistonextendschecker.getBrokenBlocks(); ++ ++ List blocks = new AbstractList() { ++ ++ @Override ++ public int size() { ++ return moved.size() + broken.size(); ++ } ++ ++ @Override ++ public org.bukkit.block.Block get(int index) { ++ if (index >= size() || index < 0) { ++ throw new ArrayIndexOutOfBoundsException(index); ++ } ++ BlockPosition pos = (BlockPosition) (index < moved.size() ? moved.get(index) : broken.get(index - moved.size())); ++ return bblock.getWorld().getBlockAt(pos.getX(), pos.getY(), pos.getZ()); ++ } ++ }; ++ ++ BlockPistonExtendEvent event = new BlockPistonExtendEvent(bblock, blocks, CraftBlock.notchToBlockFace(enumdirection)); ++ world.getServer().getPluginManager().callEvent(event); ++ ++ if (event.isCancelled()) { ++ return false; ++ } ++ // CraftBukkit end + int i = list.size() + list1.size(); + Block[] ablock = new Block[i]; + EnumDirection enumdirection1 = flag ? enumdirection : enumdirection.opposite(); diff --git a/nms-patches/BlockPortal.patch b/nms-patches/BlockPortal.patch new file mode 100644 index 0000000000..d575fc788a --- /dev/null +++ b/nms-patches/BlockPortal.patch @@ -0,0 +1,53 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/BlockPortal.java 2014-11-27 08:59:46.553422499 +1100 ++++ src/main/java/net/minecraft/server/BlockPortal.java 2014-11-27 08:42:10.172850872 +1100 +@@ -2,6 +2,8 @@ + + import java.util.Random; + ++import org.bukkit.event.entity.EntityPortalEnterEvent; // CraftBukkit ++ + public class BlockPortal extends BlockHalfTransparent { + + public static final BlockStateEnum AXIS = BlockStateEnum.of("axis", EnumAxis.class, new EnumAxis[] { EnumAxis.X, EnumAxis.Z}); +@@ -24,7 +26,8 @@ + } + + if (i > 0 && !world.getType(blockposition1.up()).getBlock().isOccluding()) { +- Entity entity = ItemMonsterEgg.a(world, 57, (double) blockposition1.getX() + 0.5D, (double) blockposition1.getY() + 1.1D, (double) blockposition1.getZ() + 0.5D); ++ // CraftBukkit - set spawn reason to NETHER_PORTAL ++ Entity entity = ItemMonsterEgg.spawnCreature(world, 57, (double) blockposition1.getX() + 0.5D, (double) blockposition1.getY() + 1.1D, (double) blockposition1.getZ() + 0.5D, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.NETHER_PORTAL); + + if (entity != null) { + entity.portalCooldown = entity.ar(); +@@ -66,14 +69,16 @@ + PortalCreator portalcreator = new PortalCreator(world, blockposition, EnumAxis.X); + + if (portalcreator.b() && PortalCreator.a(portalcreator) == 0) { +- portalcreator.c(); +- return true; ++ // CraftBukkit start - return portalcreator ++ return portalcreator.c(); ++ // return true; + } else { + PortalCreator portalcreator1 = new PortalCreator(world, blockposition, EnumAxis.Z); + + if (portalcreator1.b() && PortalCreator.a(portalcreator1) == 0) { +- portalcreator1.c(); +- return true; ++ return portalcreator1.c(); ++ // return true; ++ // CraftBukkit end + } else { + return false; + } +@@ -104,6 +109,10 @@ + + public void a(World world, BlockPosition blockposition, IBlockData iblockdata, Entity entity) { + if (entity.vehicle == null && entity.passenger == null) { ++ // CraftBukkit start - Entity in portal ++ EntityPortalEnterEvent event = new EntityPortalEnterEvent(entity.getBukkitEntity(), new org.bukkit.Location(world.getWorld(), blockposition.getX(), blockposition.getY(), blockposition.getZ())); ++ world.getServer().getPluginManager().callEvent(event); ++ // CraftBukkit end + entity.aq(); + } + diff --git a/nms-patches/BlockPoweredRail.patch b/nms-patches/BlockPoweredRail.patch new file mode 100644 index 0000000000..a43bdf2291 --- /dev/null +++ b/nms-patches/BlockPoweredRail.patch @@ -0,0 +1,25 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/BlockPoweredRail.java 2014-11-27 08:59:46.557422481 +1100 ++++ src/main/java/net/minecraft/server/BlockPoweredRail.java 2014-11-27 08:42:10.124850965 +1100 +@@ -2,6 +2,8 @@ + + import com.google.common.base.Predicate; + ++import org.bukkit.craftbukkit.event.CraftEventFactory; // CraftBukkit ++ + public class BlockPoweredRail extends BlockMinecartTrackAbstract { + + public static final BlockStateEnum SHAPE = BlockStateEnum.a("shape", EnumTrackPosition.class, (Predicate) (new BlockPoweredRailInnerClass1())); +@@ -108,6 +110,13 @@ + boolean flag1 = world.isBlockIndirectlyPowered(blockposition) || this.a(world, blockposition, iblockdata, true, 0) || this.a(world, blockposition, iblockdata, false, 0); + + if (flag1 != flag) { ++ // CraftBukkit start ++ int power = (Boolean)iblockdata.get(POWERED) ? 15 : 0; ++ int newPower = CraftEventFactory.callRedstoneChange(world, blockposition.getX(), blockposition.getY(), blockposition.getZ(), power, 15 - power).getNewCurrent(); ++ if (newPower == power) { ++ return; ++ } ++ // CraftBukkit end + world.setTypeAndData(blockposition, iblockdata.set(BlockPoweredRail.POWERED, Boolean.valueOf(flag1)), 3); + world.applyPhysics(blockposition.down(), this); + if (((EnumTrackPosition) iblockdata.get(BlockPoweredRail.SHAPE)).c()) { diff --git a/nms-patches/BlockPressurePlateAbstract.patch b/nms-patches/BlockPressurePlateAbstract.patch new file mode 100644 index 0000000000..a226e9c44e --- /dev/null +++ b/nms-patches/BlockPressurePlateAbstract.patch @@ -0,0 +1,31 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/BlockPressurePlateAbstract.java 2014-11-27 08:59:46.557422481 +1100 ++++ src/main/java/net/minecraft/server/BlockPressurePlateAbstract.java 2014-11-27 08:42:10.144850927 +1100 +@@ -2,6 +2,8 @@ + + import java.util.Random; + ++import org.bukkit.event.block.BlockRedstoneEvent; // CraftBukkit ++ + public abstract class BlockPressurePlateAbstract extends Block { + + protected BlockPressurePlateAbstract(Material material) { +@@ -90,6 +92,19 @@ + int j = this.e(world, blockposition); + boolean flag = i > 0; + boolean flag1 = j > 0; ++ ++ // CraftBukkit start - Interact Pressure Plate ++ org.bukkit.World bworld = world.getWorld(); ++ org.bukkit.plugin.PluginManager manager = world.getServer().getPluginManager(); ++ ++ if (flag != flag1) { ++ BlockRedstoneEvent eventRedstone = new BlockRedstoneEvent(bworld.getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ()), i, j); ++ manager.callEvent(eventRedstone); ++ ++ flag1 = eventRedstone.getNewCurrent() > 0; ++ j = eventRedstone.getNewCurrent(); ++ } ++ // CraftBukkit end + + if (i != j) { + iblockdata = this.a(iblockdata, j); diff --git a/nms-patches/BlockPressurePlateBinary.patch b/nms-patches/BlockPressurePlateBinary.patch new file mode 100644 index 0000000000..a1d38a1640 --- /dev/null +++ b/nms-patches/BlockPressurePlateBinary.patch @@ -0,0 +1,38 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/BlockPressurePlateBinary.java 2014-11-27 08:59:46.557422481 +1100 ++++ src/main/java/net/minecraft/server/BlockPressurePlateBinary.java 2014-11-27 08:42:10.152850911 +1100 +@@ -3,6 +3,8 @@ + import java.util.Iterator; + import java.util.List; + ++import org.bukkit.event.entity.EntityInteractEvent; // CraftBukkit ++ + public class BlockPressurePlateBinary extends BlockPressurePlateAbstract { + + public static final BlockStateBoolean POWERED = BlockStateBoolean.of("powered"); +@@ -44,6 +46,26 @@ + + while (iterator.hasNext()) { + Entity entity = (Entity) iterator.next(); ++ ++ // CraftBukkit start - Call interact event when turning on a pressure plate ++ if (this.e(world.getType(blockposition)) == 0) { ++ org.bukkit.World bworld = world.getWorld(); ++ org.bukkit.plugin.PluginManager manager = world.getServer().getPluginManager(); ++ org.bukkit.event.Cancellable cancellable; ++ ++ if (entity instanceof EntityHuman) { ++ cancellable = org.bukkit.craftbukkit.event.CraftEventFactory.callPlayerInteractEvent((EntityHuman) entity, org.bukkit.event.block.Action.PHYSICAL, blockposition, null, null); ++ } else { ++ cancellable = new EntityInteractEvent(entity.getBukkitEntity(), bworld.getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ())); ++ manager.callEvent((EntityInteractEvent) cancellable); ++ } ++ ++ // We only want to block turning the plate on if all events are cancelled ++ if (cancellable.isCancelled()) { ++ continue; ++ } ++ } ++ // CraftBukkit end + + if (!entity.aH()) { + return 15; diff --git a/nms-patches/BlockPressurePlateWeighted.patch b/nms-patches/BlockPressurePlateWeighted.patch new file mode 100644 index 0000000000..bd07b6a644 --- /dev/null +++ b/nms-patches/BlockPressurePlateWeighted.patch @@ -0,0 +1,43 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/BlockPressurePlateWeighted.java 2014-11-27 08:59:46.561422463 +1100 ++++ src/main/java/net/minecraft/server/BlockPressurePlateWeighted.java 2014-11-27 08:42:10.160850895 +1100 +@@ -1,5 +1,7 @@ + package net.minecraft.server; + ++import org.bukkit.event.entity.EntityInteractEvent; // CraftBukkit ++ + public class BlockPressurePlateWeighted extends BlockPressurePlateAbstract { + + public static final BlockStateInteger POWER = BlockStateInteger.of("power", 0, 15); +@@ -12,7 +14,31 @@ + } + + protected int e(World world, BlockPosition blockposition) { +- int i = Math.min(world.a(Entity.class, this.a(blockposition)).size(), this.b); ++ // CraftBukkit start ++ //int i = Math.min(world.a(Entity.class, this.a(blockposition)).size(), this.b); ++ int i = 0; ++ java.util.Iterator iterator = world.a(Entity.class, this.a(blockposition)).iterator(); ++ ++ while (iterator.hasNext()) { ++ Entity entity = (Entity) iterator.next(); ++ ++ org.bukkit.event.Cancellable cancellable; ++ ++ if (entity instanceof EntityHuman) { ++ cancellable = org.bukkit.craftbukkit.event.CraftEventFactory.callPlayerInteractEvent((EntityHuman) entity, org.bukkit.event.block.Action.PHYSICAL, blockposition, null, null); ++ } else { ++ cancellable = new EntityInteractEvent(entity.getBukkitEntity(), world.getWorld().getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ())); ++ world.getServer().getPluginManager().callEvent((EntityInteractEvent) cancellable); ++ } ++ ++ // We only want to block turning the plate on if all events are cancelled ++ if (!cancellable.isCancelled()) { ++ i++; ++ } ++ } ++ ++ i = Math.min(i, this.b); ++ // CraftBukkit end + + if (i > 0) { + float f = (float) Math.min(this.b, i) / (float) this.b; diff --git a/nms-patches/BlockPumpkin.patch b/nms-patches/BlockPumpkin.patch new file mode 100644 index 0000000000..abf3e858a7 --- /dev/null +++ b/nms-patches/BlockPumpkin.patch @@ -0,0 +1,117 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/BlockPumpkin.java 2014-11-27 08:59:46.561422463 +1100 ++++ src/main/java/net/minecraft/server/BlockPumpkin.java 2014-11-27 08:42:10.108850996 +1100 +@@ -1,5 +1,11 @@ + package net.minecraft.server; + ++// CraftBukkit start ++import org.bukkit.craftbukkit.util.BlockStateListPopulator; ++import org.bukkit.event.block.BlockRedstoneEvent; ++import org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason; ++// CraftBukkit end ++ + public class BlockPumpkin extends BlockDirectional { + + private ShapeDetector snowGolemPart; +@@ -29,31 +35,45 @@ + int j; + + if ((shapedetectorcollection = this.getDetectorSnowGolem().a(world, blockposition)) != null) { ++ BlockStateListPopulator blockList = new BlockStateListPopulator(world.getWorld()); // CraftBukkit - Use BlockStateListPopulator + for (i = 0; i < this.getDetectorSnowGolem().b(); ++i) { + ShapeDetectorBlock shapedetectorblock = shapedetectorcollection.a(0, i, 0); + +- world.setTypeAndData(shapedetectorblock.d(), Blocks.AIR.getBlockData(), 2); ++ // CraftBukkit start ++ // world.setTypeAndData(shapedetectorblock.d(), Blocks.AIR.getBlockData(), 2); ++ BlockPosition pos = shapedetectorblock.d(); ++ blockList.setTypeId(pos.getX(), pos.getY(), pos.getZ(), 0); ++ // CraftBukkit end + } + + EntitySnowman entitysnowman = new EntitySnowman(world); + BlockPosition blockposition1 = shapedetectorcollection.a(0, 2, 0).d(); + + entitysnowman.setPositionRotation((double) blockposition1.getX() + 0.5D, (double) blockposition1.getY() + 0.05D, (double) blockposition1.getZ() + 0.5D, 0.0F, 0.0F); +- world.addEntity(entitysnowman); ++ // CraftBukkit start ++ if (world.addEntity(entitysnowman, SpawnReason.BUILD_SNOWMAN)) { ++ blockList.updateList(); + +- for (j = 0; j < 120; ++j) { +- world.addParticle(EnumParticle.SNOW_SHOVEL, (double) blockposition1.getX() + world.random.nextDouble(), (double) blockposition1.getY() + world.random.nextDouble() * 2.5D, (double) blockposition1.getZ() + world.random.nextDouble(), 0.0D, 0.0D, 0.0D, new int[0]); +- } ++ for (j = 0; j < 120; ++j) { ++ world.addParticle(EnumParticle.SNOW_SHOVEL, (double) blockposition1.getX() + world.random.nextDouble(), (double) blockposition1.getY() + world.random.nextDouble() * 2.5D, (double) blockposition1.getZ() + world.random.nextDouble(), 0.0D, 0.0D, 0.0D, new int[0]); ++ } + +- for (j = 0; j < this.getDetectorSnowGolem().b(); ++j) { +- ShapeDetectorBlock shapedetectorblock1 = shapedetectorcollection.a(0, j, 0); ++ for (j = 0; j < this.getDetectorSnowGolem().b(); ++j) { ++ ShapeDetectorBlock shapedetectorblock1 = shapedetectorcollection.a(0, j, 0); + +- world.update(shapedetectorblock1.d(), Blocks.AIR); ++ world.update(shapedetectorblock1.d(), Blocks.AIR); ++ } + } ++ // CraftBukkit end + } else if ((shapedetectorcollection = this.getDetectorIronGolem().a(world, blockposition)) != null) { ++ BlockStateListPopulator blockList = new BlockStateListPopulator(world.getWorld()); // CraftBukkit - Use BlockStateListPopulator + for (i = 0; i < this.getDetectorIronGolem().c(); ++i) { + for (int k = 0; k < this.getDetectorIronGolem().b(); ++k) { +- world.setTypeAndData(shapedetectorcollection.a(i, k, 0).d(), Blocks.AIR.getBlockData(), 2); ++ // CraftBukkit start ++ // world.setTypeAndData(shapedetectorcollection.a(i, k, 0).d(), Blocks.AIR.getBlockData(), 2); ++ BlockPosition pos = shapedetectorcollection.a(i, k, 0).d(); ++ blockList.setTypeId(pos.getX(), pos.getY(), pos.getZ(), 0); ++ // CraftBukkit end + } + } + +@@ -62,22 +82,38 @@ + + entityirongolem.setPlayerCreated(true); + entityirongolem.setPositionRotation((double) blockposition2.getX() + 0.5D, (double) blockposition2.getY() + 0.05D, (double) blockposition2.getZ() + 0.5D, 0.0F, 0.0F); +- world.addEntity(entityirongolem); +- +- for (j = 0; j < 120; ++j) { +- world.addParticle(EnumParticle.SNOWBALL, (double) blockposition2.getX() + world.random.nextDouble(), (double) blockposition2.getY() + world.random.nextDouble() * 3.9D, (double) blockposition2.getZ() + world.random.nextDouble(), 0.0D, 0.0D, 0.0D, new int[0]); +- } ++ // CraftBukkit start ++ if (world.addEntity(entityirongolem, SpawnReason.BUILD_IRONGOLEM)) { ++ blockList.updateList(); ++ ++ for (j = 0; j < 120; ++j) { ++ world.addParticle(EnumParticle.SNOWBALL, (double) blockposition2.getX() + world.random.nextDouble(), (double) blockposition2.getY() + world.random.nextDouble() * 3.9D, (double) blockposition2.getZ() + world.random.nextDouble(), 0.0D, 0.0D, 0.0D, new int[0]); ++ } + +- for (j = 0; j < this.getDetectorIronGolem().c(); ++j) { +- for (int l = 0; l < this.getDetectorIronGolem().b(); ++l) { +- ShapeDetectorBlock shapedetectorblock2 = shapedetectorcollection.a(j, l, 0); ++ for (j = 0; j < this.getDetectorIronGolem().c(); ++j) { ++ for (int l = 0; l < this.getDetectorIronGolem().b(); ++l) { ++ ShapeDetectorBlock shapedetectorblock2 = shapedetectorcollection.a(j, l, 0); + +- world.update(shapedetectorblock2.d(), Blocks.AIR); ++ world.update(shapedetectorblock2.d(), Blocks.AIR); ++ } + } + } ++ // CraftBukkit end + } ++ } + ++ // CraftBukkit start ++ @Override ++ public void doPhysics(World world, BlockPosition position, IBlockData data, Block block) { ++ if (block != null && block.isPowerSource()) { ++ org.bukkit.block.Block bukkitBlock = world.getWorld().getBlockAt(position.getX(), position.getY(), position.getZ()); ++ int power = bukkitBlock.getBlockPower(); ++ ++ BlockRedstoneEvent eventRedstone = new BlockRedstoneEvent(bukkitBlock, power, power); ++ world.getServer().getPluginManager().callEvent(eventRedstone); ++ } + } ++ // CraftBukkit end + + public boolean canPlace(World world, BlockPosition blockposition) { + return world.getType(blockposition).getBlock().material.isReplaceable() && World.a((IBlockAccess) world, blockposition.down()); diff --git a/nms-patches/BlockRedstoneLamp.patch b/nms-patches/BlockRedstoneLamp.patch new file mode 100644 index 0000000000..66c8128089 --- /dev/null +++ b/nms-patches/BlockRedstoneLamp.patch @@ -0,0 +1,47 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/BlockRedstoneLamp.java 2014-11-27 08:59:46.565422446 +1100 ++++ src/main/java/net/minecraft/server/BlockRedstoneLamp.java 2014-11-27 08:42:10.140850934 +1100 +@@ -2,6 +2,8 @@ + + import java.util.Random; + ++import org.bukkit.craftbukkit.event.CraftEventFactory; // CraftBukkit ++ + public class BlockRedstoneLamp extends Block { + + private final boolean a; +@@ -20,6 +22,11 @@ + if (this.a && !world.isBlockIndirectlyPowered(blockposition)) { + world.setTypeAndData(blockposition, Blocks.REDSTONE_LAMP.getBlockData(), 2); + } else if (!this.a && world.isBlockIndirectlyPowered(blockposition)) { ++ // CraftBukkit start ++ if (CraftEventFactory.callRedstoneChange(world, blockposition.getX(), blockposition.getY(), blockposition.getZ(), 0, 15).getNewCurrent() != 15) { ++ return; ++ } ++ // CraftBukkit end + world.setTypeAndData(blockposition, Blocks.LIT_REDSTONE_LAMP.getBlockData(), 2); + } + +@@ -31,6 +38,11 @@ + if (this.a && !world.isBlockIndirectlyPowered(blockposition)) { + world.a(blockposition, (Block) this, 4); + } else if (!this.a && world.isBlockIndirectlyPowered(blockposition)) { ++ // CraftBukkit start ++ if (CraftEventFactory.callRedstoneChange(world, blockposition.getX(), blockposition.getY(), blockposition.getZ(), 0, 15).getNewCurrent() != 15) { ++ return; ++ } ++ // CraftBukkit end + world.setTypeAndData(blockposition, Blocks.LIT_REDSTONE_LAMP.getBlockData(), 2); + } + +@@ -40,6 +52,11 @@ + public void b(World world, BlockPosition blockposition, IBlockData iblockdata, Random random) { + if (!world.isStatic) { + if (this.a && !world.isBlockIndirectlyPowered(blockposition)) { ++ // CraftBukkit start ++ if (CraftEventFactory.callRedstoneChange(world, blockposition.getX(), blockposition.getY(), blockposition.getZ(), 15, 0).getNewCurrent() != 0) { ++ return; ++ } ++ // CraftBukkit end + world.setTypeAndData(blockposition, Blocks.REDSTONE_LAMP.getBlockData(), 2); + } + diff --git a/nms-patches/BlockRedstoneOre.patch b/nms-patches/BlockRedstoneOre.patch new file mode 100644 index 0000000000..fcc0a63783 --- /dev/null +++ b/nms-patches/BlockRedstoneOre.patch @@ -0,0 +1,102 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/BlockRedstoneOre.java 2014-11-27 08:59:46.565422446 +1100 ++++ src/main/java/net/minecraft/server/BlockRedstoneOre.java 2014-11-27 08:42:10.112850989 +1100 +@@ -2,6 +2,11 @@ + + import java.util.Random; + ++// CraftBukkit start ++import org.bukkit.craftbukkit.event.CraftEventFactory; ++import org.bukkit.event.entity.EntityInteractEvent; ++// CraftBukkit end ++ + public class BlockRedstoneOre extends Block { + + private final boolean a; +@@ -20,23 +25,44 @@ + } + + public void attack(World world, BlockPosition blockposition, EntityHuman entityhuman) { +- this.d(world, blockposition); ++ this.d(world, blockposition, entityhuman); // CraftBukkit - add entityhuman + super.attack(world, blockposition, entityhuman); + } + +- public void a(World world, BlockPosition blockposition, Entity entity) { +- this.d(world, blockposition); +- super.a(world, blockposition, entity); ++ public void a(World world, BlockPosition blockposition, Entity entity) { ++ // CraftBukkit start ++ // this.d(world, blockposition); ++ // super.a(world, blockposition, entity); ++ if (entity instanceof EntityHuman) { ++ org.bukkit.event.player.PlayerInteractEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callPlayerInteractEvent((EntityHuman) entity, org.bukkit.event.block.Action.PHYSICAL, blockposition, null, null); ++ if (!event.isCancelled()) { ++ this.d(world, blockposition, entity); // add entity ++ super.a(world, blockposition, entity); ++ } ++ } else { ++ EntityInteractEvent event = new EntityInteractEvent(entity.getBukkitEntity(), world.getWorld().getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ())); ++ world.getServer().getPluginManager().callEvent(event); ++ if (!event.isCancelled()) { ++ this.d(world, blockposition, entity); // add entity ++ super.a(world, blockposition, entity); ++ } ++ } ++ // CraftBukkit end + } + + public boolean interact(World world, BlockPosition blockposition, IBlockData iblockdata, EntityHuman entityhuman, EnumDirection enumdirection, float f, float f1, float f2) { +- this.d(world, blockposition); ++ this.d(world, blockposition, entityhuman); // CraftBukkit - add entityhuman + return super.interact(world, blockposition, iblockdata, entityhuman, enumdirection, f, f1, f2); + } + +- private void d(World world, BlockPosition blockposition) { ++ private void d(World world, BlockPosition blockposition, Entity entity) { // CraftBukkit - add Entity + this.e(world, blockposition); + if (this == Blocks.REDSTONE_ORE) { ++ // CraftBukkit start ++ if (CraftEventFactory.callEntityChangeBlockEvent(entity, blockposition.getX(), blockposition.getY(), blockposition.getZ(), Blocks.LIT_REDSTONE_ORE, 0).isCancelled()) { ++ return; ++ } ++ // CraftBukkit end + world.setTypeUpdate(blockposition, Blocks.LIT_REDSTONE_ORE.getBlockData()); + } + +@@ -44,6 +70,11 @@ + + public void b(World world, BlockPosition blockposition, IBlockData iblockdata, Random random) { + if (this == Blocks.LIT_REDSTONE_ORE) { ++ // CraftBukkit start ++ if (CraftEventFactory.callBlockFadeEvent(world.getWorld().getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ()), Blocks.REDSTONE_ORE).isCancelled()) { ++ return; ++ } ++ // CraftBukkit end + world.setTypeUpdate(blockposition, Blocks.REDSTONE_ORE.getBlockData()); + } + +@@ -63,12 +94,24 @@ + + public void dropNaturally(World world, BlockPosition blockposition, IBlockData iblockdata, float f, int i) { + super.dropNaturally(world, blockposition, iblockdata, f, i); ++ /* CraftBukkit start - Delegated to getExpDrop + if (this.getDropType(iblockdata, world.random, i) != Item.getItemOf(this)) { + int j = 1 + world.random.nextInt(5); + + this.dropExperience(world, blockposition, j); + } ++ // */ ++ } + ++ @Override ++ public int getExpDrop(World world, IBlockData data, int i) { ++ if (this.getDropType(data, world.random, i) != Item.getItemOf(this)) { ++ int j = 1 + world.random.nextInt(5); ++ ++ return j; ++ } ++ return 0; ++ // CraftBukkit end + } + + private void e(World world, BlockPosition blockposition) { diff --git a/nms-patches/BlockRedstoneTorch.patch b/nms-patches/BlockRedstoneTorch.patch new file mode 100644 index 0000000000..6051659314 --- /dev/null +++ b/nms-patches/BlockRedstoneTorch.patch @@ -0,0 +1,55 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/BlockRedstoneTorch.java 2014-11-27 08:59:46.565422446 +1100 ++++ src/main/java/net/minecraft/server/BlockRedstoneTorch.java 2014-11-27 08:42:10.156850903 +1100 +@@ -6,6 +6,8 @@ + import java.util.Map; + import java.util.Random; + ++import org.bukkit.event.block.BlockRedstoneEvent; // CraftBukkit ++ + public class BlockRedstoneTorch extends BlockTorch { + + private static Map b = Maps.newHashMap(); +@@ -95,9 +97,26 @@ + while (list != null && !list.isEmpty() && world.getTime() - ((RedstoneUpdateInfo) list.get(0)).b > 60L) { + list.remove(0); + } ++ ++ // CraftBukkit start ++ org.bukkit.plugin.PluginManager manager = world.getServer().getPluginManager(); ++ org.bukkit.block.Block block = world.getWorld().getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ()); ++ int oldCurrent = this.isOn ? 15 : 0; ++ ++ BlockRedstoneEvent event = new BlockRedstoneEvent(block, oldCurrent, oldCurrent); ++ // CraftBukkit end + + if (this.isOn) { + if (flag) { ++ // CraftBukkit start ++ if (oldCurrent != 0) { ++ event.setNewCurrent(0); ++ manager.callEvent(event); ++ if (event.getNewCurrent() != 0) { ++ return; ++ } ++ } ++ // CraftBukkit end + world.setTypeAndData(blockposition, Blocks.UNLIT_REDSTONE_TORCH.getBlockData().set(BlockRedstoneTorch.FACING, iblockdata.get(BlockRedstoneTorch.FACING)), 3); + if (this.a(world, blockposition, true)) { + world.makeSound((double) ((float) blockposition.getX() + 0.5F), (double) ((float) blockposition.getY() + 0.5F), (double) ((float) blockposition.getZ() + 0.5F), "random.fizz", 0.5F, 2.6F + (world.random.nextFloat() - world.random.nextFloat()) * 0.8F); +@@ -114,6 +133,16 @@ + } + } + } else if (!flag && !this.a(world, blockposition, false)) { ++ // CraftBukkit start ++ if (oldCurrent != 15) { ++ event.setNewCurrent(15); ++ manager.callEvent(event); ++ if (event.getNewCurrent() != 15) { ++ return; ++ } ++ } ++ // CraftBukkit end ++ + world.setTypeAndData(blockposition, Blocks.REDSTONE_TORCH.getBlockData().set(BlockRedstoneTorch.FACING, iblockdata.get(BlockRedstoneTorch.FACING)), 3); + } + diff --git a/nms-patches/BlockRedstoneWire.patch b/nms-patches/BlockRedstoneWire.patch new file mode 100644 index 0000000000..79e7b08fef --- /dev/null +++ b/nms-patches/BlockRedstoneWire.patch @@ -0,0 +1,27 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/BlockRedstoneWire.java 2014-11-27 08:59:46.569422428 +1100 ++++ src/main/java/net/minecraft/server/BlockRedstoneWire.java 2014-11-27 08:42:10.136850942 +1100 +@@ -8,6 +8,8 @@ + import java.util.Random; + import java.util.Set; + ++import org.bukkit.event.block.BlockRedstoneEvent; // CraftBukkit ++ + public class BlockRedstoneWire extends Block { + + public static final BlockStateEnum NORTH = BlockStateEnum.of("north", EnumRedstoneWireConnection.class); +@@ -123,6 +125,15 @@ + if (k > j - 1) { + j = k; + } ++ ++ // CraftBukkit start ++ if (i != j) { ++ BlockRedstoneEvent event = new BlockRedstoneEvent(world.getWorld().getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ()), i, j); ++ world.getServer().getPluginManager().callEvent(event); ++ ++ j = event.getNewCurrent(); ++ } ++ // CraftBukkit end + + if (i != j) { + iblockdata = iblockdata.set(BlockRedstoneWire.POWER, Integer.valueOf(j)); diff --git a/nms-patches/BlockReed.patch b/nms-patches/BlockReed.patch new file mode 100644 index 0000000000..667af180f5 --- /dev/null +++ b/nms-patches/BlockReed.patch @@ -0,0 +1,18 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/BlockReed.java 2014-11-27 08:59:46.569422428 +1100 ++++ src/main/java/net/minecraft/server/BlockReed.java 2014-11-27 08:42:10.120850973 +1100 +@@ -29,8 +29,13 @@ + int j = ((Integer) iblockdata.get(BlockReed.AGE)).intValue(); + + if (j == 15) { +- world.setTypeUpdate(blockposition.up(), this.getBlockData()); +- world.setTypeAndData(blockposition, iblockdata.set(BlockReed.AGE, Integer.valueOf(0)), 4); ++ // CraftBukkit start ++ // world.setTypeUpdate(blockposition.up(), this.getBlockData()); ++ // world.setTypeAndData(blockposition, iblockdata.set(BlockReed.AGE, Integer.valueOf(0)), 4); ++ BlockPosition upPos = blockposition.up(); ++ org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockGrowEvent(world, upPos.getX(), upPos.getY(), upPos.getZ(), this, 0); ++ // CraftBukkit end ++ + } else { + world.setTypeAndData(blockposition, iblockdata.set(BlockReed.AGE, Integer.valueOf(j + 1)), 4); + } diff --git a/nms-patches/BlockSapling.patch b/nms-patches/BlockSapling.patch new file mode 100644 index 0000000000..5212c9d9a5 --- /dev/null +++ b/nms-patches/BlockSapling.patch @@ -0,0 +1,125 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/BlockSapling.java 2014-11-27 08:59:46.573422410 +1100 ++++ src/main/java/net/minecraft/server/BlockSapling.java 2014-11-27 08:42:10.108850996 +1100 +@@ -2,10 +2,20 @@ + + import java.util.Random; + ++// CraftBukkit start ++import java.util.List; ++ ++import org.bukkit.Location; ++import org.bukkit.TreeType; ++import org.bukkit.block.BlockState; ++import org.bukkit.event.world.StructureGrowEvent; ++// CraftBukkit end ++ + public class BlockSapling extends BlockPlant implements IBlockFragilePlantElement { + + public static final BlockStateEnum TYPE = BlockStateEnum.of("type", EnumLogVariant.class); + public static final BlockStateInteger STAGE = BlockStateInteger.of("stage", 0, 1); ++ public static TreeType treeType; // CraftBukkit + + protected BlockSapling() { + this.j(this.blockStateList.getBlockData().set(BlockSapling.TYPE, EnumLogVariant.OAK).set(BlockSapling.STAGE, Integer.valueOf(0))); +@@ -19,7 +29,30 @@ + if (!world.isStatic) { + super.b(world, blockposition, iblockdata, random); + if (world.getLightLevel(blockposition.up()) >= 9 && random.nextInt(7) == 0) { ++ // CraftBukkit start ++ world.captureTreeGeneration = true; ++ // CraftBukkit end + this.grow(world, blockposition, iblockdata, random); ++ // CraftBukkit start ++ world.captureTreeGeneration = false; ++ if (world.capturedBlockStates.size() > 0) { ++ TreeType treeType = BlockSapling.treeType; ++ BlockSapling.treeType = null; ++ Location location = new Location(world.getWorld(), blockposition.getX(), blockposition.getY(), blockposition.getZ()); ++ List blocks = (List) world.capturedBlockStates.clone(); ++ world.capturedBlockStates.clear(); ++ StructureGrowEvent event = null; ++ if (treeType != null) { ++ event = new StructureGrowEvent(location, treeType, false, null, blocks); ++ org.bukkit.Bukkit.getPluginManager().callEvent(event); ++ } ++ if (event == null || !event.isCancelled()) { ++ for (BlockState blockstate : blocks) { ++ blockstate.update(true); ++ } ++ } ++ } ++ // CraftBukkit end + } + + } +@@ -35,7 +68,17 @@ + } + + public void e(World world, BlockPosition blockposition, IBlockData iblockdata, Random random) { +- Object object = random.nextInt(10) == 0 ? new WorldGenBigTree(true) : new WorldGenTrees(true); ++ // CraftBukkit start - Turn ternary operator into if statement to set treeType ++ // Object object = random.nextInt(10) == 0 ? new WorldGenBigTree(true) : new WorldGenTrees(true); ++ Object object; ++ if (random.nextInt(10) == 0) { ++ treeType = TreeType.BIG_TREE; ++ object = new WorldGenBigTree(true); ++ } else { ++ treeType = TreeType.TREE; ++ object = new WorldGenTrees(true); ++ } ++ // CraftBukkit end + int i = 0; + int j = 0; + boolean flag = false; +@@ -46,6 +89,7 @@ + for (i = 0; i >= -1; --i) { + for (j = 0; j >= -1; --j) { + if (this.a(world, blockposition.a(i, 0, j), EnumLogVariant.SPRUCE) && this.a(world, blockposition.a(i + 1, 0, j), EnumLogVariant.SPRUCE) && this.a(world, blockposition.a(i, 0, j + 1), EnumLogVariant.SPRUCE) && this.a(world, blockposition.a(i + 1, 0, j + 1), EnumLogVariant.SPRUCE)) { ++ treeType = TreeType.MEGA_REDWOOD; // CraftBukkit + object = new WorldGenMegaTree(false, random.nextBoolean()); + flag = true; + break label78; +@@ -56,11 +100,13 @@ + if (!flag) { + j = 0; + i = 0; ++ treeType = TreeType.REDWOOD; // CraftBukkit + object = new WorldGenTaiga2(true); + } + break; + + case 2: ++ treeType = TreeType.BIRCH; // CraftBukkit + object = new WorldGenForest(true, false); + break; + +@@ -69,6 +115,7 @@ + for (i = 0; i >= -1; --i) { + for (j = 0; j >= -1; --j) { + if (this.a(world, blockposition.a(i, 0, j), EnumLogVariant.JUNGLE) && this.a(world, blockposition.a(i + 1, 0, j), EnumLogVariant.JUNGLE) && this.a(world, blockposition.a(i, 0, j + 1), EnumLogVariant.JUNGLE) && this.a(world, blockposition.a(i + 1, 0, j + 1), EnumLogVariant.JUNGLE)) { ++ treeType = TreeType.JUNGLE; // CraftBukkit + object = new WorldGenJungleTree(true, 10, 20, EnumLogVariant.JUNGLE.a(), EnumLogVariant.JUNGLE.a()); + flag = true; + break label93; +@@ -79,11 +126,13 @@ + if (!flag) { + j = 0; + i = 0; ++ treeType = TreeType.SMALL_JUNGLE; // CraftBukkit + object = new WorldGenTrees(true, 4 + random.nextInt(7), EnumLogVariant.JUNGLE.a(), EnumLogVariant.JUNGLE.a(), false); + } + break; + + case 4: ++ treeType = TreeType.ACACIA; // CraftBukki + object = new WorldGenAcaciaTree(true); + break; + +@@ -92,6 +141,7 @@ + for (i = 0; i >= -1; --i) { + for (j = 0; j >= -1; --j) { + if (this.a(world, blockposition.a(i, 0, j), EnumLogVariant.DARK_OAK) && this.a(world, blockposition.a(i + 1, 0, j), EnumLogVariant.DARK_OAK) && this.a(world, blockposition.a(i, 0, j + 1), EnumLogVariant.DARK_OAK) && this.a(world, blockposition.a(i + 1, 0, j + 1), EnumLogVariant.DARK_OAK)) { ++ treeType = TreeType.DARK_OAK; // CraftBukkit + object = new WorldGenForestTree(true); + flag = true; + break label108; diff --git a/nms-patches/BlockSkull.patch b/nms-patches/BlockSkull.patch new file mode 100644 index 0000000000..0bebb84d91 --- /dev/null +++ b/nms-patches/BlockSkull.patch @@ -0,0 +1,133 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/BlockSkull.java 2014-11-27 08:59:46.573422410 +1100 ++++ src/main/java/net/minecraft/server/BlockSkull.java 2014-11-27 08:42:10.156850903 +1100 +@@ -4,6 +4,11 @@ + import java.util.Iterator; + import java.util.Random; + ++// CraftBukkit start ++import org.bukkit.craftbukkit.util.BlockStateListPopulator; ++import org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason; ++// CraftBukkit end ++ + public class BlockSkull extends BlockContainer { + + public static final BlockStateDirection FACING = BlockStateDirection.of("facing"); +@@ -69,8 +74,25 @@ + + return tileentity instanceof TileEntitySkull ? ((TileEntitySkull) tileentity).getSkullType() : super.getDropData(world, blockposition); + } ++ ++ // CraftBukkit start - Special case dropping so we can get info from the tile entity ++ public void dropNaturally(World world, BlockPosition blockposition, IBlockData iblockdata, float f, int i) { ++ if (world.random.nextFloat() < f) { ++ ItemStack itemstack = new ItemStack(Items.SKULL, 1, this.getDropData(world, blockposition)); ++ TileEntitySkull tileentityskull = (TileEntitySkull) world.getTileEntity(blockposition); ++ ++ if (tileentityskull.getSkullType() == 3 && tileentityskull.getGameProfile() != null) { ++ itemstack.setTag(new NBTTagCompound()); ++ NBTTagCompound nbttagcompound = new NBTTagCompound(); ++ ++ GameProfileSerializer.serialize(nbttagcompound, tileentityskull.getGameProfile()); ++ itemstack.getTag().set("SkullOwner", nbttagcompound); ++ } + +- public void dropNaturally(World world, BlockPosition blockposition, IBlockData iblockdata, float f, int i) {} ++ a(world, blockposition, itemstack); ++ } ++ } ++ // CraftBukkit end + + public void a(World world, BlockPosition blockposition, IBlockData iblockdata, EntityHuman entityhuman) { + if (entityhuman.abilities.canInstantlyBuild) { +@@ -83,7 +105,10 @@ + + public void remove(World world, BlockPosition blockposition, IBlockData iblockdata) { + if (!world.isStatic) { +- if (!((Boolean) iblockdata.get(BlockSkull.NODROP)).booleanValue()) { ++ // CraftBukkit start - Drop item in code above, not here ++ // if (!((Boolean) iblockdata.get(BlockSkull.NODROP)).booleanValue()) { ++ if (false) { ++ // CraftBukkit end + TileEntity tileentity = world.getTileEntity(blockposition); + + if (tileentity instanceof TileEntitySkull) { +@@ -120,19 +145,30 @@ + ShapeDetectorCollection shapedetectorcollection = shapedetector.a(world, blockposition); + + if (shapedetectorcollection != null) { ++ // CraftBukkit start - Use BlockStateListPopulator ++ BlockStateListPopulator blockList = new BlockStateListPopulator(world.getWorld()); + int i; + + for (i = 0; i < 3; ++i) { + ShapeDetectorBlock shapedetectorblock = shapedetectorcollection.a(i, 0, 0); + +- world.setTypeAndData(shapedetectorblock.d(), shapedetectorblock.a().set(BlockSkull.NODROP, Boolean.valueOf(true)), 2); ++ // CraftBukkit start ++ // world.setTypeAndData(shapedetectorblock.d(), shapedetectorblock.a().set(BlockSkull.NODROP, Boolean.valueOf(true)), 2); ++ BlockPosition pos = shapedetectorblock.d(); ++ IBlockData data = shapedetectorblock.a().set(BlockSkull.NODROP, Boolean.valueOf(true)); ++ blockList.setTypeAndData(pos.getX(), pos.getY(), pos.getZ(), data.getBlock(), data.getBlock().toLegacyData(data), 2); ++ // CraftBukkit end + } + + for (i = 0; i < shapedetector.c(); ++i) { + for (int j = 0; j < shapedetector.b(); ++j) { + ShapeDetectorBlock shapedetectorblock1 = shapedetectorcollection.a(i, j, 0); + +- world.setTypeAndData(shapedetectorblock1.d(), Blocks.AIR.getBlockData(), 2); ++ // CraftBukkit start ++ // world.setTypeAndData(shapedetectorblock1.d(), Blocks.AIR.getBlockData(), 2); ++ BlockPosition pos = shapedetectorblock1.d(); ++ blockList.setTypeAndData(pos.getX(), pos.getY(), pos.getZ(), Blocks.AIR, 0, 2); ++ // CraftBukkit end + } + } + +@@ -145,28 +181,31 @@ + entitywither.n(); + Iterator iterator = world.a(EntityHuman.class, entitywither.getBoundingBox().grow(50.0D, 50.0D, 50.0D)).iterator(); + +- while (iterator.hasNext()) { +- EntityHuman entityhuman = (EntityHuman) iterator.next(); ++ // CraftBukkit start ++ if (world.addEntity(entitywither, SpawnReason.BUILD_WITHER)) { ++ while (iterator.hasNext()) { ++ EntityHuman entityhuman = (EntityHuman) iterator.next(); + +- entityhuman.b((Statistic) AchievementList.I); +- } +- +- world.addEntity(entitywither); ++ entityhuman.b((Statistic) AchievementList.I); ++ } ++ ++ blockList.updateList(); + +- int k; ++ int k; + +- for (k = 0; k < 120; ++k) { +- world.addParticle(EnumParticle.SNOWBALL, (double) blockposition1.getX() + world.random.nextDouble(), (double) (blockposition1.getY() - 2) + world.random.nextDouble() * 3.9D, (double) blockposition1.getZ() + world.random.nextDouble(), 0.0D, 0.0D, 0.0D, new int[0]); +- } ++ for (k = 0; k < 120; ++k) { ++ world.addParticle(EnumParticle.SNOWBALL, (double) blockposition1.getX() + world.random.nextDouble(), (double) (blockposition1.getY() - 2) + world.random.nextDouble() * 3.9D, (double) blockposition1.getZ() + world.random.nextDouble(), 0.0D, 0.0D, 0.0D, new int[0]); ++ } + +- for (k = 0; k < shapedetector.c(); ++k) { +- for (int l = 0; l < shapedetector.b(); ++l) { +- ShapeDetectorBlock shapedetectorblock2 = shapedetectorcollection.a(k, l, 0); ++ for (k = 0; k < shapedetector.c(); ++k) { ++ for (int l = 0; l < shapedetector.b(); ++l) { ++ ShapeDetectorBlock shapedetectorblock2 = shapedetectorcollection.a(k, l, 0); + +- world.update(shapedetectorblock2.d(), Blocks.AIR); ++ world.update(shapedetectorblock2.d(), Blocks.AIR); ++ } + } + } +- ++ // CraftBukkit end + } + } + } diff --git a/nms-patches/BlockSnow.patch b/nms-patches/BlockSnow.patch new file mode 100644 index 0000000000..5727d5a58c --- /dev/null +++ b/nms-patches/BlockSnow.patch @@ -0,0 +1,14 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/BlockSnow.java 2014-11-27 08:59:46.577422392 +1100 ++++ src/main/java/net/minecraft/server/BlockSnow.java 2014-11-27 08:42:10.144850927 +1100 +@@ -85,6 +85,11 @@ + + public void b(World world, BlockPosition blockposition, IBlockData iblockdata, Random random) { + if (world.b(EnumSkyBlock.BLOCK, blockposition) > 11) { ++ // CraftBukkit start ++ if (org.bukkit.craftbukkit.event.CraftEventFactory.callBlockFadeEvent(world.getWorld().getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ()), Blocks.AIR).isCancelled()) { ++ return; ++ } ++ // CraftBukkit end + this.b(world, blockposition, world.getType(blockposition), 0); + world.setAir(blockposition); + } diff --git a/nms-patches/BlockSoil.patch b/nms-patches/BlockSoil.patch new file mode 100644 index 0000000000..cd0c3d504d --- /dev/null +++ b/nms-patches/BlockSoil.patch @@ -0,0 +1,52 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/BlockSoil.java 2014-11-27 08:59:46.577422392 +1100 ++++ src/main/java/net/minecraft/server/BlockSoil.java 2014-11-27 08:42:10.168850880 +1100 +@@ -3,6 +3,11 @@ + import java.util.Iterator; + import java.util.Random; + ++// CraftBukkit start ++import org.bukkit.event.entity.EntityInteractEvent; ++import org.bukkit.craftbukkit.event.CraftEventFactory; ++// CraftBukkit end ++ + public class BlockSoil extends Block { + + public static final BlockStateInteger MOISTURE = BlockStateInteger.of("moisture", 0, 7); +@@ -34,6 +39,12 @@ + if (i > 0) { + world.setTypeAndData(blockposition, iblockdata.set(BlockSoil.MOISTURE, Integer.valueOf(i - 1)), 2); + } else if (!this.d(world, blockposition)) { ++ // CraftBukkit start ++ org.bukkit.block.Block block = world.getWorld().getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ()); ++ if (CraftEventFactory.callBlockFadeEvent(block, Blocks.DIRT).isCancelled()) { ++ return; ++ } ++ // CraftBukkit end + world.setTypeUpdate(blockposition, Blocks.DIRT.getBlockData()); + } + } else if (i < 7) { +@@ -49,6 +60,24 @@ + return; + } + ++ // CraftBukkit start - Interact soil ++ org.bukkit.event.Cancellable cancellable; ++ if (entity instanceof EntityHuman) { ++ cancellable = CraftEventFactory.callPlayerInteractEvent((EntityHuman) entity, org.bukkit.event.block.Action.PHYSICAL, blockposition, null, null); ++ } else { ++ cancellable = new EntityInteractEvent(entity.getBukkitEntity(), world.getWorld().getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ())); ++ world.getServer().getPluginManager().callEvent((EntityInteractEvent) cancellable); ++ } ++ ++ if (cancellable.isCancelled()) { ++ return; ++ } ++ ++ if (CraftEventFactory.callEntityChangeBlockEvent(entity, blockposition.getX(), blockposition.getY(), blockposition.getZ(), Blocks.DIRT, 0).isCancelled()) { ++ return; ++ } ++ // CraftBukkit end ++ + world.setTypeUpdate(blockposition, Blocks.DIRT.getBlockData()); + } + diff --git a/nms-patches/BlockStationary.patch b/nms-patches/BlockStationary.patch new file mode 100644 index 0000000000..5ffd0a2e54 --- /dev/null +++ b/nms-patches/BlockStationary.patch @@ -0,0 +1,40 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/BlockStationary.java 2014-11-27 08:59:46.577422392 +1100 ++++ src/main/java/net/minecraft/server/BlockStationary.java 2014-11-27 08:42:10.152850911 +1100 +@@ -2,6 +2,8 @@ + + import java.util.Random; + ++import org.bukkit.craftbukkit.event.CraftEventFactory; // CraftBukkit ++ + public class BlockStationary extends BlockFluids { + + protected BlockStationary(Material material) { +@@ -41,6 +43,13 @@ + + if (block.material == Material.AIR) { + if (this.e(world, blockposition1)) { ++ // CraftBukkit start - Prevent lava putting something on fire ++ if (world.getType(blockposition1) != Blocks.FIRE) { ++ if (CraftEventFactory.callBlockIgniteEvent(world, blockposition1.getX(), blockposition1.getY(), blockposition1.getZ(), blockposition.getX(), blockposition.getY(), blockposition.getZ()).isCancelled()) { ++ continue; ++ } ++ } ++ // CraftBukkit end + world.setTypeUpdate(blockposition1, Blocks.FIRE.getBlockData()); + return; + } +@@ -53,6 +62,14 @@ + BlockPosition blockposition2 = blockposition.a(random.nextInt(3) - 1, 0, random.nextInt(3) - 1); + + if (world.isEmpty(blockposition2.up()) && this.m(world, blockposition2)) { ++ // CraftBukkit start - Prevent lava putting something on fire ++ BlockPosition up = blockposition2.up(); ++ if (world.getType(up) != Blocks.FIRE) { ++ if (CraftEventFactory.callBlockIgniteEvent(world, up.getX(), up.getY(), up.getZ(), blockposition.getX(), blockposition.getY(), blockposition.getZ()).isCancelled()) { ++ continue; ++ } ++ } ++ // CraftBukkit end + world.setTypeUpdate(blockposition2.up(), Blocks.FIRE.getBlockData()); + } + } diff --git a/nms-patches/BlockStem.patch b/nms-patches/BlockStem.patch new file mode 100644 index 0000000000..b20e09ca25 --- /dev/null +++ b/nms-patches/BlockStem.patch @@ -0,0 +1,41 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/BlockStem.java 2014-11-27 08:59:46.581422375 +1100 ++++ src/main/java/net/minecraft/server/BlockStem.java 2014-11-27 08:42:10.152850911 +1100 +@@ -4,6 +4,8 @@ + import java.util.Iterator; + import java.util.Random; + ++import org.bukkit.craftbukkit.event.CraftEventFactory; // CraftBukkit ++ + public class BlockStem extends BlockPlant implements IBlockFragilePlantElement { + + public static final BlockStateInteger AGE = BlockStateInteger.of("age", 0, 7); +@@ -50,7 +52,8 @@ + + if (i < 7) { + iblockdata = iblockdata.set(BlockStem.AGE, Integer.valueOf(i + 1)); +- world.setTypeAndData(blockposition, iblockdata, 2); ++ // world.setTypeAndData(blockposition, iblockdata, 2); // CraftBukkit ++ CraftEventFactory.handleBlockGrowEvent(world, blockposition.getX(), blockposition.getY(), blockposition.getZ(), this, toLegacyData(iblockdata)); // CraftBukkit + } else { + Iterator iterator = EnumDirectionLimit.HORIZONTAL.iterator(); + +@@ -66,7 +69,8 @@ + Block block = world.getType(blockposition.down()).getBlock(); + + if (world.getType(blockposition).getBlock().material == Material.AIR && (block == Blocks.FARMLAND || block == Blocks.DIRT || block == Blocks.GRASS)) { +- world.setTypeUpdate(blockposition, this.blockFruit.getBlockData()); ++ // world.setTypeUpdate(blockposition, this.blockFruit.getBlockData()); // CraftBukkit ++ CraftEventFactory.handleBlockGrowEvent(world, blockposition.getX(), blockposition.getY(), blockposition.getZ(), this.blockFruit, 0); // CraftBukkit + } + } + } +@@ -77,7 +81,8 @@ + public void g(World world, BlockPosition blockposition, IBlockData iblockdata) { + int i = ((Integer) iblockdata.get(BlockStem.AGE)).intValue() + MathHelper.nextInt(world.random, 2, 5); + +- world.setTypeAndData(blockposition, iblockdata.set(BlockStem.AGE, Integer.valueOf(Math.min(7, i))), 2); ++ // world.setTypeAndData(blockposition, iblockdata.set(BlockStem.AGE, Integer.valueOf(Math.min(7, i))), 2); ++ CraftEventFactory.handleBlockGrowEvent(world, blockposition.getX(), blockposition.getY(), blockposition.getZ(), this, Math.min(7, i)); // CraftBukkit + } + + public void h() { diff --git a/nms-patches/BlockTrapdoor.patch b/nms-patches/BlockTrapdoor.patch new file mode 100644 index 0000000000..8b2992a936 --- /dev/null +++ b/nms-patches/BlockTrapdoor.patch @@ -0,0 +1,31 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/BlockTrapdoor.java 2014-11-27 08:59:46.581422375 +1100 ++++ src/main/java/net/minecraft/server/BlockTrapdoor.java 2014-11-27 08:42:10.124850965 +1100 +@@ -2,6 +2,8 @@ + + import com.google.common.base.Predicate; + ++import org.bukkit.event.block.BlockRedstoneEvent; // CraftBukkit ++ + public class BlockTrapdoor extends Block { + + public static final BlockStateDirection FACING = BlockStateDirection.of("facing", (Predicate) EnumDirectionLimit.HORIZONTAL); +@@ -101,6 +103,19 @@ + boolean flag = world.isBlockIndirectlyPowered(blockposition); + + if (flag || block.isPowerSource()) { ++ // CraftBukkit start ++ org.bukkit.World bworld = world.getWorld(); ++ org.bukkit.block.Block bblock = bworld.getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ()); ++ ++ int power = bblock.getBlockPower(); ++ int oldPower = (Boolean) iblockdata.get(OPEN) ? 15 : 0; ++ ++ if (oldPower == 0 ^ power == 0 || block.isPowerSource()) { ++ BlockRedstoneEvent eventRedstone = new BlockRedstoneEvent(bblock, oldPower, power); ++ world.getServer().getPluginManager().callEvent(eventRedstone); ++ flag = eventRedstone.getNewCurrent() > 0; ++ } ++ // CraftBukkit end + boolean flag1 = ((Boolean) iblockdata.get(BlockTrapdoor.OPEN)).booleanValue(); + + if (flag1 != flag) { diff --git a/nms-patches/BlockTripwire.patch b/nms-patches/BlockTripwire.patch new file mode 100644 index 0000000000..f3954aa56a --- /dev/null +++ b/nms-patches/BlockTripwire.patch @@ -0,0 +1,52 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/BlockTripwire.java 2014-11-27 08:59:46.585422357 +1100 ++++ src/main/java/net/minecraft/server/BlockTripwire.java 2014-11-27 08:42:10.140850934 +1100 +@@ -4,6 +4,8 @@ + import java.util.List; + import java.util.Random; + ++import org.bukkit.event.entity.EntityInteractEvent; // CraftBukkit ++ + public class BlockTripwire extends Block { + + public static final BlockStateBoolean POWERED = BlockStateBoolean.of("powered"); +@@ -154,6 +156,40 @@ + } + } + } ++ ++ // CraftBukkit start - Call interact even when triggering connected tripwire ++ if (flag != flag1 && flag1 && (Boolean)iblockdata.get(ATTACHED)) { ++ org.bukkit.World bworld = world.getWorld(); ++ org.bukkit.plugin.PluginManager manager = world.getServer().getPluginManager(); ++ org.bukkit.block.Block block = bworld.getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ()); ++ boolean allowed = false; ++ ++ // If all of the events are cancelled block the tripwire trigger, else allow ++ for (Object object : list) { ++ if (object != null) { ++ org.bukkit.event.Cancellable cancellable; ++ ++ if (object instanceof EntityHuman) { ++ cancellable = org.bukkit.craftbukkit.event.CraftEventFactory.callPlayerInteractEvent((EntityHuman) object, org.bukkit.event.block.Action.PHYSICAL, blockposition, null, null); ++ } else if (object instanceof Entity) { ++ cancellable = new EntityInteractEvent(((Entity) object).getBukkitEntity(), block); ++ manager.callEvent((EntityInteractEvent) cancellable); ++ } else { ++ continue; ++ } ++ ++ if (!cancellable.isCancelled()) { ++ allowed = true; ++ break; ++ } ++ } ++ } ++ ++ if (!allowed) { ++ return; ++ } ++ } ++ // CraftBukkit end + + if (flag1 != flag) { + iblockdata = iblockdata.set(BlockTripwire.POWERED, Boolean.valueOf(flag1)); diff --git a/nms-patches/BlockTripwireHook.patch b/nms-patches/BlockTripwireHook.patch new file mode 100644 index 0000000000..d4da932616 --- /dev/null +++ b/nms-patches/BlockTripwireHook.patch @@ -0,0 +1,29 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/BlockTripwireHook.java 2014-11-27 08:59:46.585422357 +1100 ++++ src/main/java/net/minecraft/server/BlockTripwireHook.java 2014-11-27 08:42:10.144850927 +1100 +@@ -5,6 +5,8 @@ + import java.util.Iterator; + import java.util.Random; + ++import org.bukkit.event.block.BlockRedstoneEvent; // CraftBukkit ++ + public class BlockTripwireHook extends Block { + + public static final BlockStateDirection FACING = BlockStateDirection.of("facing", (Predicate) EnumDirectionLimit.HORIZONTAL); +@@ -141,6 +143,17 @@ + this.a(world, blockposition1, flag5, flag6, flag2, flag3); + } + ++ // CraftBukkit start ++ org.bukkit.block.Block block = world.getWorld().getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ()); ++ ++ BlockRedstoneEvent eventRedstone = new BlockRedstoneEvent(block, 15, 0); ++ world.getServer().getPluginManager().callEvent(eventRedstone); ++ ++ if (eventRedstone.getNewCurrent() > 0) { ++ return; ++ } ++ // CraftBukkit end ++ + this.a(world, blockposition, flag5, flag6, flag2, flag3); + if (!flag) { + world.setTypeAndData(blockposition, iblockdata3.set(BlockTripwireHook.FACING, enumdirection), 3); diff --git a/nms-patches/BlockVine.patch b/nms-patches/BlockVine.patch new file mode 100644 index 0000000000..5e920272dd --- /dev/null +++ b/nms-patches/BlockVine.patch @@ -0,0 +1,76 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/BlockVine.java 2014-11-27 08:59:46.589422340 +1100 ++++ src/main/java/net/minecraft/server/BlockVine.java 2014-11-27 08:42:10.156850903 +1100 +@@ -3,6 +3,8 @@ + import java.util.Iterator; + import java.util.Random; + ++import org.bukkit.craftbukkit.event.CraftEventFactory; // CraftBukkit ++ + public class BlockVine extends Block { + + public static final BlockStateBoolean UP = BlockStateBoolean.of("up"); +@@ -203,7 +205,13 @@ + } + + if (((Boolean) iblockdata1.get(BlockVine.NORTH)).booleanValue() || ((Boolean) iblockdata1.get(BlockVine.EAST)).booleanValue() || ((Boolean) iblockdata1.get(BlockVine.SOUTH)).booleanValue() || ((Boolean) iblockdata1.get(BlockVine.WEST)).booleanValue()) { +- world.setTypeAndData(blockposition.up(), iblockdata1, 2); ++ // CraftBukkit start - Call BlockSpreadEvent ++ // world.setTypeAndData(blockposition.up(), iblockdata1, 2); ++ BlockPosition target = blockposition.up(); ++ org.bukkit.block.Block source = world.getWorld().getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ()); ++ org.bukkit.block.Block block = world.getWorld().getBlockAt(target.getX(), target.getY(), target.getZ()); ++ CraftEventFactory.handleBlockSpreadEvent(block, source, this, toLegacyData(iblockdata1)); ++ // CraftBukkit end + } + + } +@@ -222,18 +230,30 @@ + boolean flag2 = ((Boolean) iblockdata.get(a(enumdirection2))).booleanValue(); + BlockPosition blockposition2 = blockposition1.shift(enumdirection1); + BlockPosition blockposition3 = blockposition1.shift(enumdirection2); ++ ++ // CraftBukkit start - Call BlockSpreadEvent ++ org.bukkit.block.Block source = world.getWorld().getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ()); ++ org.bukkit.block.Block bukkitBlock = world.getWorld().getBlockAt(blockposition1.getX(), blockposition1.getY(), blockposition1.getZ()); + + if (flag1 && this.c(world.getType(blockposition2).getBlock())) { +- world.setTypeAndData(blockposition1, this.getBlockData().set(a(enumdirection1), Boolean.valueOf(true)), 2); ++ // world.setTypeAndData(blockposition1, this.getBlockData().set(a(enumdirection1), Boolean.valueOf(true)), 2); ++ CraftEventFactory.handleBlockSpreadEvent(bukkitBlock, source, block, toLegacyData(this.getBlockData().set(a(enumdirection1), Boolean.valueOf(true)))); + } else if (flag2 && this.c(world.getType(blockposition3).getBlock())) { +- world.setTypeAndData(blockposition1, this.getBlockData().set(a(enumdirection2), Boolean.valueOf(true)), 2); ++ // world.setTypeAndData(blockposition1, this.getBlockData().set(a(enumdirection2), Boolean.valueOf(true)), 2); ++ CraftEventFactory.handleBlockSpreadEvent(bukkitBlock, source, block, toLegacyData(this.getBlockData().set(a(enumdirection2), Boolean.valueOf(true)))); + } else if (flag1 && world.isEmpty(blockposition2) && this.c(world.getType(blockposition.shift(enumdirection1)).getBlock())) { +- world.setTypeAndData(blockposition2, this.getBlockData().set(a(enumdirection.opposite()), Boolean.valueOf(true)), 2); ++ // world.setTypeAndData(blockposition2, this.getBlockData().set(a(enumdirection.opposite()), Boolean.valueOf(true)), 2); ++ bukkitBlock = world.getWorld().getBlockAt(blockposition2.getX(), blockposition2.getY(), blockposition2.getZ()); ++ CraftEventFactory.handleBlockSpreadEvent(bukkitBlock, source, block, toLegacyData(this.getBlockData().set(a(enumdirection.opposite()), Boolean.valueOf(true)))); + } else if (flag2 && world.isEmpty(blockposition3) && this.c(world.getType(blockposition.shift(enumdirection2)).getBlock())) { +- world.setTypeAndData(blockposition3, this.getBlockData().set(a(enumdirection.opposite()), Boolean.valueOf(true)), 2); ++ // world.setTypeAndData(blockposition3, this.getBlockData().set(a(enumdirection.opposite()), Boolean.valueOf(true)), 2); ++ bukkitBlock = world.getWorld().getBlockAt(blockposition3.getX(), blockposition3.getY(), blockposition3.getZ()); ++ CraftEventFactory.handleBlockSpreadEvent(bukkitBlock, source, block, toLegacyData(this.getBlockData().set(a(enumdirection.opposite()), Boolean.valueOf(true)))); + } else if (this.c(world.getType(blockposition1.up()).getBlock())) { +- world.setTypeAndData(blockposition1, this.getBlockData(), 2); ++ // world.setTypeAndData(blockposition1, this.getBlockData(), 2); ++ CraftEventFactory.handleBlockSpreadEvent(bukkitBlock, source, block, toLegacyData(this.getBlockData())); + } ++ // CraftBukkit end + } else if (block.material.k() && block.d()) { + world.setTypeAndData(blockposition, iblockdata.set(a(enumdirection), Boolean.valueOf(true)), 2); + } +@@ -260,7 +280,12 @@ + } + + if (((Boolean) iblockdata3.get(BlockVine.NORTH)).booleanValue() || ((Boolean) iblockdata3.get(BlockVine.EAST)).booleanValue() || ((Boolean) iblockdata3.get(BlockVine.SOUTH)).booleanValue() || ((Boolean) iblockdata3.get(BlockVine.WEST)).booleanValue()) { +- world.setTypeAndData(blockposition1, iblockdata3, 2); ++ // CraftBukkit start - Call BlockSpreadEvent ++ // world.setTypeAndData(blockposition1, iblockdata3, 2); ++ org.bukkit.block.Block source = world.getWorld().getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ()); ++ org.bukkit.block.Block bukkitBlock = world.getWorld().getBlockAt(blockposition1.getX(), blockposition1.getY(), blockposition1.getZ()); ++ CraftEventFactory.handleBlockSpreadEvent(bukkitBlock, source, this, toLegacyData(iblockdata3)); ++ // CraftBukkit end + } + } else if (block1 == this) { + iblockdata3 = iblockdata2; diff --git a/nms-patches/Chunk.patch b/nms-patches/Chunk.patch new file mode 100644 index 0000000000..d2f4392f86 --- /dev/null +++ b/nms-patches/Chunk.patch @@ -0,0 +1,169 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/Chunk.java 2014-11-27 08:59:46.589422340 +1100 ++++ src/main/java/net/minecraft/server/Chunk.java 2014-11-27 08:42:10.164850887 +1100 +@@ -1,6 +1,7 @@ + package net.minecraft.server; + + import com.google.common.base.Predicate; ++import com.google.common.collect.Lists; // CraftBukkit + import com.google.common.collect.Maps; + import com.google.common.collect.Queues; + import java.util.Arrays; +@@ -14,6 +15,8 @@ + import org.apache.logging.log4j.LogManager; + import org.apache.logging.log4j.Logger; + ++import org.bukkit.Bukkit; // CraftBukkit ++ + public class Chunk { + + private static final Logger c = LogManager.getLogger(); +@@ -23,7 +26,7 @@ + private final boolean[] g; + private boolean h; + public final World world; +- private final int[] heightMap; ++ public final int[] heightMap; // CraftBukkit - make public + public final int locX; + public final int locZ; + private boolean k; +@@ -40,6 +43,34 @@ + private int v; + private ConcurrentLinkedQueue w; + ++ // CraftBukkit start - Neighbor loaded cache for chunk lighting and entity ticking ++ private int neighbors = 0x1 << 12; ++ ++ public boolean areNeighborsLoaded(final int radius) { ++ switch (radius) { ++ case 2: ++ return this.neighbors == Integer.MAX_VALUE >> 6; ++ case 1: ++ final int mask = ++ // x z offset x z offset x z offset ++ (0x1 << (1 * 5 + 1 + 12)) | (0x1 << (0 * 5 + 1 + 12)) | (0x1 << (-1 * 5 + 1 + 12)) | ++ (0x1 << (1 * 5 + 0 + 12)) | (0x1 << (0 * 5 + 0 + 12)) | (0x1 << (-1 * 5 + 0 + 12)) | ++ (0x1 << (1 * 5 + -1 + 12)) | (0x1 << (0 * 5 + -1 + 12)) | (0x1 << (-1 * 5 + -1 + 12)); ++ return (this.neighbors & mask) == mask; ++ default: ++ throw new UnsupportedOperationException(String.valueOf(radius)); ++ } ++ } ++ ++ public void setNeighborLoaded(final int x, final int z) { ++ this.neighbors |= 0x1 << (x * 5 + 12 + z); ++ } ++ ++ public void setNeighborUnloaded(final int x, final int z) { ++ this.neighbors &= ~(0x1 << (x * 5 + 12 + z)); ++ } ++ // CraftBukkit end ++ + public Chunk(World world, int i, int j) { + this.sections = new ChunkSection[16]; + this.e = new byte[256]; +@@ -60,8 +91,17 @@ + + Arrays.fill(this.f, -999); + Arrays.fill(this.e, (byte) -1); ++ ++ // CraftBukkit start ++ if (!(this instanceof EmptyChunk)) { ++ this.bukkitChunk = new org.bukkit.craftbukkit.CraftChunk(this); ++ } + } + ++ public org.bukkit.Chunk bukkitChunk; ++ public boolean mustSave; ++ // CraftBukkit end ++ + public Chunk(World world, ChunkSnapshot chunksnapshot, int i, int j) { + this(world, i, j); + short short0 = 256; +@@ -465,7 +505,13 @@ + flag = j >= i1; + } + +- chunksection.setType(i, j & 15, k, iblockdata); ++ // CraftBukkit start - Delay removing containers until after they're cleaned up ++ if (!(block1 instanceof IContainer)) { ++ chunksection.setType(i, j & 15, k, iblockdata); ++ } ++ // CraftBukkit end ++ ++ + if (block1 != block) { + if (!this.world.isStatic) { + block1.remove(this.world, blockposition, iblockdata1); +@@ -474,6 +520,12 @@ + } + } + ++ // CraftBukkit start - Delay removing containers until after they're cleaned up ++ if (block1 instanceof IContainer) { ++ chunksection.setType(i, j & 15, k, iblockdata); ++ } ++ // CraftBukkit end ++ + if (chunksection.b(i, j & 15, k) != block) { + return null; + } else { +@@ -505,7 +557,8 @@ + } + } + +- if (!this.world.isStatic && block1 != block) { ++ // CraftBukkit - Don't place while processing the BlockPlaceEvent, unless it's a BlockContainer. Prevents blocks such as TNT from activating when cancelled. ++ if (!this.world.isStatic && block1 != block && (!this.world.captureBlockStates || block instanceof BlockContainer)) { + block.onPlace(this.world, blockposition, iblockdata); + } + +@@ -586,7 +639,11 @@ + int j = MathHelper.floor(entity.locZ / 16.0D); + + if (i != this.locX || j != this.locZ) { +- Chunk.c.warn("Wrong location! (" + i + ", " + j + ") should be (" + this.locX + ", " + this.locZ + "), " + entity, new Object[] { entity}); ++ // CraftBukkit start ++ Bukkit.getLogger().warning("Wrong location for " + entity + " in world '" + world.getWorld().getName() + "'!"); ++ // Chunk.c.warn("Wrong location! (" + i + ", " + j + ") should be (" + this.locX + ", " + this.locZ + "), " + entity, new Object[] { entity}); ++ Bukkit.getLogger().warning("Entity is at " + entity.locX + "," + entity.locZ + " (chunk " + i + "," + j + ") but was stored in chunk " + this.locX + "," + this.locZ); ++ // CraftBukkit end + entity.die(); + } + +@@ -673,6 +730,13 @@ + + tileentity.D(); + this.tileEntities.put(blockposition, tileentity); ++ // CraftBukkit start ++ } else { ++ System.out.println("Attempted to place a tile entity (" + tileentity + ") at " + tileentity.position.getX() + "," + tileentity.position.getY() + "," + tileentity.position.getZ() ++ + " (" + org.bukkit.craftbukkit.util.CraftMagicNumbers.getMaterial(getType(blockposition)) + ") where there was no entity tile!"); ++ System.out.println("Chunk coordinates: " + (this.locX * 16) + "," + (this.locZ * 16)); ++ new Exception().printStackTrace(); ++ // CraftBukkit end + } + } + +@@ -716,7 +780,21 @@ + } + + for (int i = 0; i < this.entitySlices.length; ++i) { +- this.world.c((Collection) this.entitySlices[i]); ++ // CraftBukkit start ++ List newList = Lists.newArrayList(this.entitySlices[i]); ++ java.util.Iterator iter = newList.iterator(); ++ while (iter.hasNext()) { ++ Entity entity = iter.next(); ++ ++ // Do not pass along players, as doing so can get them stuck outside of time. ++ // (which for example disables inventory icon updates and prevents block breaking) ++ if (entity instanceof EntityPlayer) { ++ iter.remove(); ++ } ++ } ++ ++ this.world.c((Collection) newList); ++ // CraftBukkit end + } + + } diff --git a/nms-patches/ChunkProviderServer.patch b/nms-patches/ChunkProviderServer.patch new file mode 100644 index 0000000000..bbe662e230 --- /dev/null +++ b/nms-patches/ChunkProviderServer.patch @@ -0,0 +1,348 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/ChunkProviderServer.java 2014-11-27 08:59:46.593422322 +1100 ++++ src/main/java/net/minecraft/server/ChunkProviderServer.java 2014-11-27 08:42:10.124850965 +1100 +@@ -10,17 +10,28 @@ + import org.apache.logging.log4j.LogManager; + import org.apache.logging.log4j.Logger; + ++// CraftBukkit start ++import java.util.Random; ++import java.util.logging.Level; ++ ++import org.bukkit.Server; ++import org.bukkit.craftbukkit.chunkio.ChunkIOExecutor; ++import org.bukkit.craftbukkit.util.LongHash; ++import org.bukkit.craftbukkit.util.LongHashSet; ++import org.bukkit.craftbukkit.util.LongObjectHashMap; ++import org.bukkit.event.world.ChunkUnloadEvent; ++// CraftBukkit end ++ + public class ChunkProviderServer implements IChunkProvider { + + private static final Logger b = LogManager.getLogger(); +- public Set unloadQueue = Collections.newSetFromMap(new ConcurrentHashMap()); ++ public LongHashSet unloadQueue = new LongHashSet(); // CraftBukkit - LongHashSet + public Chunk emptyChunk; + public IChunkProvider chunkProvider; + private IChunkLoader chunkLoader; +- public boolean forceChunkLoad = true; +- public LongHashMap chunks = new LongHashMap(); +- private List chunkList = Lists.newArrayList(); +- private WorldServer world; ++ public boolean forceChunkLoad = false; // CraftBukkit - true -> false ++ public LongObjectHashMap chunks = new LongObjectHashMap(); ++ public WorldServer world; // CraftBukkit- public + + public ChunkProviderServer(WorldServer worldserver, IChunkLoader ichunkloader, IChunkProvider ichunkprovider) { + this.emptyChunk = new EmptyChunk(worldserver, 0, 0); +@@ -30,40 +41,93 @@ + } + + public boolean isChunkLoaded(int i, int j) { +- return this.chunks.contains(ChunkCoordIntPair.a(i, j)); ++ return this.chunks.containsKey(LongHash.toLong(i, j)); // CraftBukkit + } + +- public List a() { +- return this.chunkList; ++ // CraftBukkit start - Change return type to Collection and return the values of our chunk map ++ public java.util.Collection a() { ++ // return this.chunkList; ++ return this.chunks.values(); ++ // CraftBukkit end + } + + public void queueUnload(int i, int j) { + if (this.world.worldProvider.e()) { + if (!this.world.c(i, j)) { +- this.unloadQueue.add(Long.valueOf(ChunkCoordIntPair.a(i, j))); ++ // CraftBukkit start ++ this.unloadQueue.add(i, j); ++ ++ Chunk c = chunks.get(LongHash.toLong(i, j)); ++ if (c != null) { ++ c.mustSave = true; ++ } ++ // CraftBukkit end + } + } else { +- this.unloadQueue.add(Long.valueOf(ChunkCoordIntPair.a(i, j))); ++ // CraftBukkit start ++ this.unloadQueue.add(i, j); ++ ++ Chunk c = chunks.get(LongHash.toLong(i, j)); ++ if (c != null) { ++ c.mustSave = true; ++ } ++ // CraftBukkit end + } + + } + + public void b() { +- Iterator iterator = this.chunkList.iterator(); ++ Iterator iterator = this.chunks.values().iterator(); + + while (iterator.hasNext()) { + Chunk chunk = (Chunk) iterator.next(); + + this.queueUnload(chunk.locX, chunk.locZ); + } +- ++ } ++ ++ // CraftBukkit start - Add async variant, provide compatibility ++ public Chunk getChunkIfLoaded(int x, int z) { ++ return chunks.get(LongHash.toLong(x, z)); + } + + public Chunk getChunkAt(int i, int j) { +- long k = ChunkCoordIntPair.a(i, j); +- +- this.unloadQueue.remove(Long.valueOf(k)); +- Chunk chunk = (Chunk) this.chunks.getEntry(k); ++ return getChunkAt(i, j, null); ++ } ++ ++ public Chunk getChunkAt(int i, int j, Runnable runnable) { ++ unloadQueue.remove(i, j); ++ Chunk chunk = chunks.get(LongHash.toLong(i, j)); ++ ChunkRegionLoader loader = null; ++ ++ if (this.chunkLoader instanceof ChunkRegionLoader) { ++ loader = (ChunkRegionLoader) this.chunkLoader; ++ ++ } ++ // We can only use the queue for already generated chunks ++ if (chunk == null && loader != null && loader.chunkExists(world, i, j)) { ++ if (runnable != null) { ++ ChunkIOExecutor.queueChunkLoad(world, loader, this, i, j, runnable); ++ return null; ++ } else { ++ chunk = ChunkIOExecutor.syncChunkLoad(world, loader, this, i, j); ++ } ++ } else if (chunk == null) { ++ chunk = originalGetChunkAt(i, j); ++ } ++ ++ // If we didn't load the chunk async and have a callback run it now ++ if (runnable != null) { ++ runnable.run(); ++ } ++ ++ return chunk; ++ } ++ public Chunk originalGetChunkAt(int i, int j) { ++ this.unloadQueue.remove(i, j); ++ Chunk chunk = (Chunk) this.chunks.get(LongHash.toLong(i, j)); ++ boolean newChunk = false; ++ // CraftBukkit end + + if (chunk == null) { + chunk = this.loadChunk(i, j); +@@ -78,16 +142,44 @@ + CrashReportSystemDetails crashreportsystemdetails = crashreport.a("Chunk to be generated"); + + crashreportsystemdetails.a("Location", (Object) String.format("%d,%d", new Object[] { Integer.valueOf(i), Integer.valueOf(j)})); +- crashreportsystemdetails.a("Position hash", (Object) Long.valueOf(k)); ++ crashreportsystemdetails.a("Position hash", (Object) Long.valueOf(LongHash.toLong(i, j))); // CraftBukkit - Use LongHash + crashreportsystemdetails.a("Generator", (Object) this.chunkProvider.getName()); + throw new ReportedException(crashreport); + } + } ++ newChunk = true; // CraftBukkit + } + +- this.chunks.put(k, chunk); +- this.chunkList.add(chunk); ++ this.chunks.put(LongHash.toLong(i, j), chunk); + chunk.addEntities(); ++ ++ // CraftBukkit start ++ Server server = world.getServer(); ++ if (server != null) { ++ /* ++ * If it's a new world, the first few chunks are generated inside ++ * the World constructor. We can't reliably alter that, so we have ++ * no way of creating a CraftWorld/CraftServer at that point. ++ */ ++ server.getPluginManager().callEvent(new org.bukkit.event.world.ChunkLoadEvent(chunk.bukkitChunk, newChunk)); ++ } ++ ++ // Update neighbor counts ++ for (int x = -2; x < 3; x++) { ++ for (int z = -2; z < 3; z++) { ++ if (x == 0 && z == 0) { ++ continue; ++ } ++ ++ Chunk neighbor = this.getChunkIfLoaded(chunk.locX + x, chunk.locZ + z); ++ if (neighbor != null) { ++ neighbor.setNeighborLoaded(-x, -z); ++ chunk.setNeighborLoaded(x, z); ++ } ++ } ++ } ++ // CraftBukkit end ++ + chunk.loadNearby(this, this, i, j); + } + +@@ -95,9 +187,22 @@ + } + + public Chunk getOrCreateChunk(int i, int j) { +- Chunk chunk = (Chunk) this.chunks.getEntry(ChunkCoordIntPair.a(i, j)); ++ // CraftBukkit start ++ Chunk chunk = (Chunk) this.chunks.get(LongHash.toLong(i, j)); + +- return chunk == null ? (!this.world.ad() && !this.forceChunkLoad ? this.emptyChunk : this.getChunkAt(i, j)) : chunk; ++ chunk = chunk == null ? (!this.world.ad() && !this.forceChunkLoad ? this.emptyChunk : this.getChunkAt(i, j)) : chunk; ++ ++ if (chunk == emptyChunk) return chunk; ++ if (i != chunk.locX || j != chunk.locZ) { ++ b.error("Chunk (" + chunk.locX + ", " + chunk.locZ + ") stored at (" + i + ", " + j + ") in world '" + world.getWorld().getName() + "'"); ++ b.error(chunk.getClass().getName()); ++ Throwable ex = new Throwable(); ++ ex.fillInStackTrace(); ++ ex.printStackTrace(); ++ } ++ ++ return chunk; ++ // CraftBukkit end + } + + public Chunk loadChunk(int i, int j) { +@@ -138,10 +243,13 @@ + try { + chunk.setLastSaved(this.world.getTime()); + this.chunkLoader.a(this.world, chunk); +- } catch (IOException ioexception) { ++ // CraftBukkit start - IOException to Exception ++ } catch (Exception ioexception) { + ChunkProviderServer.b.error("Couldn\'t save chunk", ioexception); ++ /* Remove extra exception + } catch (ExceptionWorldConflict exceptionworldconflict) { + ChunkProviderServer.b.error("Couldn\'t save chunk; already in use by another instance of Minecraft?", exceptionworldconflict); ++ // CraftBukkit end */ + } + + } +@@ -154,6 +262,30 @@ + chunk.n(); + if (this.chunkProvider != null) { + this.chunkProvider.getChunkAt(ichunkprovider, i, j); ++ ++ // CraftBukkit start ++ BlockSand.instaFall = true; ++ Random random = new Random(); ++ random.setSeed(world.getSeed()); ++ long xRand = random.nextLong() / 2L * 2L + 1L; ++ long zRand = random.nextLong() / 2L * 2L + 1L; ++ random.setSeed((long) i * xRand + (long) j * zRand ^ world.getSeed()); ++ ++ org.bukkit.World world = this.world.getWorld(); ++ if (world != null) { ++ this.world.populating = true; ++ try { ++ for (org.bukkit.generator.BlockPopulator populator : world.getPopulators()) { ++ populator.populate(world, random, chunk.bukkitChunk); ++ } ++ } finally { ++ this.world.populating = false; ++ } ++ } ++ BlockSand.instaFall = false; ++ this.world.getServer().getPluginManager().callEvent(new org.bukkit.event.world.ChunkPopulateEvent(chunk.bukkitChunk)); ++ // CraftBukkit end ++ + chunk.e(); + } + } +@@ -173,9 +305,12 @@ + + public boolean saveChunks(boolean flag, IProgressUpdate iprogressupdate) { + int i = 0; +- +- for (int j = 0; j < this.chunkList.size(); ++j) { +- Chunk chunk = (Chunk) this.chunkList.get(j); ++ ++ // CraftBukkit start ++ Iterator iterator = this.chunks.values().iterator(); ++ while (iterator.hasNext()) { ++ Chunk chunk = (Chunk) iterator.next(); ++ // CraftBukkit end + + if (flag) { + this.saveChunkNOP(chunk); +@@ -203,22 +338,42 @@ + + public boolean unloadChunks() { + if (!this.world.savingDisabled) { +- for (int i = 0; i < 100; ++i) { +- if (!this.unloadQueue.isEmpty()) { +- Long olong = (Long) this.unloadQueue.iterator().next(); +- Chunk chunk = (Chunk) this.chunks.getEntry(olong.longValue()); +- ++ // CraftBukkit start ++ Server server = this.world.getServer(); ++ for (int i = 0; i < 100 && !this.unloadQueue.isEmpty(); ++i) { ++ long chunkcoordinates = this.unloadQueue.popFirst(); ++ Chunk chunk = this.chunks.get(chunkcoordinates); ++ if (chunk == null) continue; ++ ++ ChunkUnloadEvent event = new ChunkUnloadEvent(chunk.bukkitChunk); ++ server.getPluginManager().callEvent(event); ++ if (!event.isCancelled()) { + if (chunk != null) { + chunk.removeEntities(); + this.saveChunk(chunk); + this.saveChunkNOP(chunk); +- this.chunks.remove(olong.longValue()); +- this.chunkList.remove(chunk); ++ this.chunks.remove(chunkcoordinates); // CraftBukkit + } + +- this.unloadQueue.remove(olong); ++ // this.unloadQueue.remove(olong); ++ ++ // Update neighbor counts ++ for (int x = -2; x < 3; x++) { ++ for (int z = -2; z < 3; z++) { ++ if (x == 0 && z == 0) { ++ continue; ++ } ++ ++ Chunk neighbor = this.getChunkIfLoaded(chunk.locX + x, chunk.locZ + z); ++ if (neighbor != null) { ++ neighbor.setNeighborUnloaded(-x, -z); ++ chunk.setNeighborUnloaded(x, z); ++ } ++ } ++ } + } +- } ++ } ++ // CraftBukkit end + + if (this.chunkLoader != null) { + this.chunkLoader.a(); +@@ -233,7 +388,8 @@ + } + + public String getName() { +- return "ServerChunkCache: " + this.chunks.count() + " Drop: " + this.unloadQueue.size(); ++ // CraftBukkit - this.chunks.count() -> .size() ++ return "ServerChunkCache: " + this.chunks.size() + " Drop: " + this.unloadQueue.size(); + } + + public List getMobsFor(EnumCreatureType enumcreaturetype, BlockPosition blockposition) { +@@ -245,7 +401,8 @@ + } + + public int getLoadedChunks() { +- return this.chunks.count(); ++ // CraftBukkit - this.chunks.count() -> this.chunks.size() ++ return this.chunks.size(); + } + + public void recreateStructures(Chunk chunk, int i, int j) {} diff --git a/nms-patches/ChunkRegionLoader.patch b/nms-patches/ChunkRegionLoader.patch new file mode 100644 index 0000000000..35c373ed68 --- /dev/null +++ b/nms-patches/ChunkRegionLoader.patch @@ -0,0 +1,131 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/ChunkRegionLoader.java 2014-11-27 08:59:46.593422322 +1100 ++++ src/main/java/net/minecraft/server/ChunkRegionLoader.java 2014-11-27 08:42:10.136850942 +1100 +@@ -23,8 +23,40 @@ + public ChunkRegionLoader(File file) { + this.e = file; + } ++ ++ // CraftBukkit start ++ public boolean chunkExists(World world, int i, int j) { ++ ChunkCoordIntPair chunkcoordintpair = new ChunkCoordIntPair(i, j); ++ ++ synchronized (this.d) { ++ if (this.c.contains(chunkcoordintpair)) { ++ for (int k = 0; k < this.b.size(); ++k) { ++ if (((PendingChunkToSave) this.b.get(k)).a.equals(chunkcoordintpair)) { ++ return true; ++ } ++ } ++ } ++ } ++ ++ return RegionFileCache.a(this.e, i, j).chunkExists(i & 31, j & 31); ++ } ++ // CraftBukkit end + ++ // CraftBukkit start - Add async variant, provide compatibility + public Chunk a(World world, int i, int j) { ++ Object[] data = loadChunk(world, i, j); ++ if (data != null) { ++ Chunk chunk = (Chunk) data[0]; ++ NBTTagCompound nbttagcompound = (NBTTagCompound) data[1]; ++ loadEntities(chunk, nbttagcompound.getCompound("Level"), world); ++ return chunk; ++ } ++ ++ return null; ++ } ++ ++ public Object[] loadChunk(World world, int i, int j) { ++ // CraftBukkit end + NBTTagCompound nbttagcompound = null; + ChunkCoordIntPair chunkcoordintpair = new ChunkCoordIntPair(i, j); + Object object = this.d; +@@ -53,7 +85,7 @@ + return this.a(world, i, j, nbttagcompound); + } + +- protected Chunk a(World world, int i, int j, NBTTagCompound nbttagcompound) { ++ protected Object[] a(World world, int i, int j, NBTTagCompound nbttagcompound) { // CraftBukkit - return Chunk -> Object[] + if (!nbttagcompound.hasKeyOfType("Level", 10)) { + ChunkRegionLoader.a.error("Chunk file at " + i + "," + j + " is missing level data, skipping"); + return null; +@@ -64,18 +96,42 @@ + Chunk chunk = this.a(world, nbttagcompound.getCompound("Level")); + + if (!chunk.a(i, j)) { +- ChunkRegionLoader.a.error("Chunk file at " + i + "," + j + " is in the wrong location; relocating. (Expected " + i + ", " + j + ", got " + chunk.locX + ", " + chunk.locZ + ")"); +- nbttagcompound.setInt("xPos", i); +- nbttagcompound.setInt("zPos", j); ++ a.error("Chunk file at " + i + "," + j + " is in the wrong location; relocating. (Expected " + i + ", " + j + ", got " + chunk.locX + ", " + chunk.locZ + ")"); ++ nbttagcompound.getCompound("Level").setInt("xPos", i); ++ nbttagcompound.getCompound("Level").setInt("zPos", j); ++ ++ // CraftBukkit start - Have to move tile entities since we don't load them at this stage ++ NBTTagList tileEntities = nbttagcompound.getCompound("Level").getList("TileEntities", 10); ++ if (tileEntities != null) { ++ for (int te = 0; te < tileEntities.size(); te++) { ++ NBTTagCompound tileEntity = (NBTTagCompound) tileEntities.get(te); ++ int x = tileEntity.getInt("x") - chunk.locX * 16; ++ int z = tileEntity.getInt("z") - chunk.locZ * 16; ++ tileEntity.setInt("x", i * 16 + x); ++ tileEntity.setInt("z", j * 16 + z); ++ } ++ } ++ // CraftBukkit end + chunk = this.a(world, nbttagcompound.getCompound("Level")); + } + +- return chunk; ++ // CraftBukkit start ++ Object[] data = new Object[2]; ++ data[0] = chunk; ++ data[1] = nbttagcompound; ++ return data; ++ // CraftBukkit end + } + } + + public void a(World world, Chunk chunk) { +- world.checkSession(); ++ // CraftBukkit start - "handle" exception ++ try { ++ world.checkSession(); ++ } catch (ExceptionWorldConflict ex) { ++ ex.printStackTrace(); ++ } ++ // CraftBukkit end + + try { + NBTTagCompound nbttagcompound = new NBTTagCompound(); +@@ -133,7 +189,7 @@ + return true; + } + +- public void a(PendingChunkToSave pendingchunktosave) { ++ public void a(PendingChunkToSave pendingchunktosave) throws java.io.IOException { // CraftBukkit - added throws + DataOutputStream dataoutputstream = RegionFileCache.d(this.e, pendingchunktosave.a.x, pendingchunktosave.a.z); + + NBTCompressedStreamTools.a(pendingchunktosave.b, (DataOutput) dataoutputstream); +@@ -320,7 +376,13 @@ + if (nbttagcompound.hasKeyOfType("Biomes", 7)) { + chunk.a(nbttagcompound.getByteArray("Biomes")); + } ++ ++ // CraftBukkit start - End this method here and split off entity loading to another method ++ return chunk; ++ } + ++ public void loadEntities(Chunk chunk, NBTTagCompound nbttagcompound, World world) { ++ // CraftBukkit end + NBTTagList nbttaglist1 = nbttagcompound.getList("Entities", 10); + + if (nbttaglist1 != null) { +@@ -379,6 +441,6 @@ + } + } + +- return chunk; ++ // return chunk; // CraftBukkit + } + } diff --git a/nms-patches/ChunkSection.patch b/nms-patches/ChunkSection.patch new file mode 100644 index 0000000000..4063d6cc3a --- /dev/null +++ b/nms-patches/ChunkSection.patch @@ -0,0 +1,21 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/ChunkSection.java 2014-11-27 08:59:46.597422305 +1100 ++++ src/main/java/net/minecraft/server/ChunkSection.java 2014-11-27 08:42:10.172850872 +1100 +@@ -19,6 +19,18 @@ + + } + ++ // CraftBukkit start ++ public ChunkSection(int y, boolean flag, char[] blockIds) { ++ this.yPos = y; ++ this.blockIds = blockIds; ++ this.emittedLight = new NibbleArray(); ++ if (flag) { ++ this.skyLight = new NibbleArray(); ++ } ++ recalcBlockCounts(); ++ } ++ // CraftBukkit end ++ + public IBlockData getType(int i, int j, int k) { + IBlockData iblockdata = (IBlockData) Block.d.a(this.blockIds[j << 8 | k << 4 | i]); + diff --git a/nms-patches/CommandBlockListenerAbstract.patch b/nms-patches/CommandBlockListenerAbstract.patch new file mode 100644 index 0000000000..c49fad99f0 --- /dev/null +++ b/nms-patches/CommandBlockListenerAbstract.patch @@ -0,0 +1,162 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/CommandBlockListenerAbstract.java 2014-11-27 08:59:46.597422305 +1100 ++++ src/main/java/net/minecraft/server/CommandBlockListenerAbstract.java 2014-11-27 08:42:10.172850872 +1100 +@@ -4,6 +4,13 @@ + import java.util.Date; + import java.util.concurrent.Callable; + ++// CraftBukkit start ++import java.util.ArrayList; ++import org.apache.logging.log4j.Level; ++import org.bukkit.craftbukkit.command.VanillaCommandWrapper; ++import com.google.common.base.Joiner; ++// CraftBukkit end ++ + public abstract class CommandBlockListenerAbstract implements ICommandListener { + + private static final SimpleDateFormat a = new SimpleDateFormat("HH:mm:ss"); +@@ -13,6 +20,7 @@ + public String e = ""; + private String f = "@"; + private final CommandObjectiveExecutor g = new CommandObjectiveExecutor(); ++ protected org.bukkit.command.CommandSender sender; // CraftBukkit - add sender + + public CommandBlockListenerAbstract() {} + +@@ -79,7 +87,109 @@ + + try { + this.d = null; +- this.b = icommandhandler.a(this, this.e); ++ // this.b = icommandhandler.a(this, this.e); ++ // CraftBukkit start - Handle command block commands using Bukkit dispatcher ++ org.bukkit.command.SimpleCommandMap commandMap = minecraftserver.server.getCommandMap(); ++ Joiner joiner = Joiner.on(" "); ++ String command = this.e; ++ if (this.e.startsWith("/")) { ++ command = this.e.substring(1); ++ } ++ String[] args = command.split(" "); ++ ArrayList commands = new ArrayList(); ++ ++ // Block disallowed commands ++ if (args[0].equalsIgnoreCase("stop") || args[0].equalsIgnoreCase("kick") || args[0].equalsIgnoreCase("op") || ++ args[0].equalsIgnoreCase("deop") || args[0].equalsIgnoreCase("ban") || args[0].equalsIgnoreCase("ban-ip") || ++ args[0].equalsIgnoreCase("pardon") || args[0].equalsIgnoreCase("pardon-ip") || args[0].equalsIgnoreCase("reload")) { ++ this.b = 0; ++ return; ++ } ++ ++ // If the world has no players don't run ++ if (this.getWorld().players.isEmpty()) { ++ this.b = 0; ++ return; ++ } ++ ++ // Handle vanilla commands; ++ if (minecraftserver.server.getCommandBlockOverride(args[0])) { ++ org.bukkit.command.Command commandBlockCommand = commandMap.getCommand("minecraft:" + args[0]); ++ if (commandBlockCommand instanceof VanillaCommandWrapper) { ++ this.b = ((VanillaCommandWrapper) commandBlockCommand).dispatchVanillaCommandBlock(this, this.e); ++ return; ++ } ++ } ++ ++ // Make sure this is a valid command ++ if (commandMap.getCommand(args[0]) == null) { ++ this.b = 0; ++ return; ++ } ++ ++ // testfor command requires special handling ++ if (args[0].equalsIgnoreCase("testfor")) { ++ if (args.length < 2) { ++ this.b = 0; ++ return; ++ } ++ ++ EntityPlayer[] players = ((java.util.List)PlayerSelector.getPlayers(this, args[1], EntityPlayer.class)).toArray(new EntityPlayer[0]); ++ ++ if (players != null && players.length > 0) { ++ this.b = players.length; ++ return; ++ } else { ++ EntityPlayer player = MinecraftServer.getServer().getPlayerList().getPlayer(args[1]); ++ if (player == null) { ++ this.b = 0; ++ return; ++ } else { ++ this.b = 1; ++ return; ++ } ++ } ++ } ++ ++ commands.add(args); ++ ++ // Find positions of command block syntax, if any ++ ArrayList newCommands = new ArrayList(); ++ for (int i = 0; i < args.length; i++) { ++ if (PlayerSelector.isPattern(args[i])) { ++ for (int j = 0; j < commands.size(); j++) { ++ newCommands.addAll(this.buildCommands(commands.get(j), i)); ++ } ++ ArrayList temp = commands; ++ commands = newCommands; ++ newCommands = temp; ++ newCommands.clear(); ++ } ++ } ++ ++ int completed = 0; ++ ++ // Now dispatch all of the commands we ended up with ++ for (int i = 0; i < commands.size(); i++) { ++ try { ++ if (commandMap.dispatch(sender, joiner.join(java.util.Arrays.asList(commands.get(i))))) { ++ completed++; ++ } ++ } catch (Throwable exception) { ++ if(this instanceof TileEntityCommandListener) { ++ TileEntityCommandListener listener = (TileEntityCommandListener) this; ++ MinecraftServer.getLogger().log(Level.WARN, String.format("CommandBlock at (%d,%d,%d) failed to handle command", listener.getChunkCoordinates().getX(), listener.getChunkCoordinates().getY(), listener.getChunkCoordinates().getZ()), exception); ++ } else if (this instanceof EntityMinecartCommandBlockListener) { ++ EntityMinecartCommandBlockListener listener = (EntityMinecartCommandBlockListener) this; ++ MinecraftServer.getLogger().log(Level.WARN, String.format("MinecartCommandBlock at (%d,%d,%d) failed to handle command", listener.getChunkCoordinates().getX(), listener.getChunkCoordinates().getY(), listener.getChunkCoordinates().getZ()), exception); ++ } else { ++ MinecraftServer.getLogger().log(Level.WARN, String.format("Unknown CommandBlock failed to handle command"), exception); ++ } ++ } ++ } ++ ++ this.b = completed; ++ // CraftBukkit end + } catch (Throwable throwable) { + CrashReport crashreport = CrashReport.a(throwable, "Executing command block"); + CrashReportSystemDetails crashreportsystemdetails = crashreport.a("Command to be executed"); +@@ -91,8 +201,26 @@ + } else { + this.b = 0; + } ++ } ++ ++ // CraftBukkit start ++ private ArrayList buildCommands(String[] args, int pos) { ++ ArrayList commands = new ArrayList(); ++ EntityPlayer[] players = ((java.util.List)PlayerSelector.getPlayers(this, args[pos], EntityPlayer.class)).toArray(new EntityPlayer[0]); ++ if (players != null) { ++ for (EntityPlayer player : players) { ++ if (player.world != this.getWorld()) { ++ continue; ++ } ++ String[] command = args.clone(); ++ command[pos] = player.getName(); ++ commands.add(command); ++ } ++ } + ++ return commands; + } ++ // CraftBukkit end + + public String getName() { + return this.f; diff --git a/nms-patches/Container.patch b/nms-patches/Container.patch new file mode 100644 index 0000000000..4891ecc55f --- /dev/null +++ b/nms-patches/Container.patch @@ -0,0 +1,204 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/Container.java 2014-11-27 08:59:46.617422217 +1100 ++++ src/main/java/net/minecraft/server/Container.java 2014-11-27 08:42:10.156850903 +1100 +@@ -7,6 +7,17 @@ + import java.util.List; + import java.util.Set; + ++// CraftBukkit start ++import java.util.HashMap; ++import java.util.Map; ++import org.bukkit.craftbukkit.inventory.CraftInventory; ++import org.bukkit.craftbukkit.inventory.CraftItemStack; ++import org.bukkit.event.Event.Result; ++import org.bukkit.event.inventory.InventoryDragEvent; ++import org.bukkit.event.inventory.InventoryType; ++import org.bukkit.inventory.InventoryView; ++// CraftBukkit end ++ + public abstract class Container { + + public List b = Lists.newArrayList(); +@@ -17,6 +28,18 @@ + private final Set h = Sets.newHashSet(); + protected List listeners = Lists.newArrayList(); + private Set i = Sets.newHashSet(); ++ ++ // CraftBukkit start ++ public boolean checkReachable = true; ++ public abstract InventoryView getBukkitView(); ++ public void transferTo(Container other, org.bukkit.craftbukkit.entity.CraftHumanEntity player) { ++ InventoryView source = this.getBukkitView(), destination = other.getBukkitView(); ++ ((CraftInventory) source.getTopInventory()).getInventory().onClose(player); ++ ((CraftInventory) source.getBottomInventory()).getInventory().onClose(player); ++ ((CraftInventory) destination.getTopInventory()).getInventory().onOpen(player); ++ ((CraftInventory) destination.getBottomInventory()).getInventory().onOpen(player); ++ } ++ // CraftBukkit end + + public Container() {} + +@@ -124,6 +147,7 @@ + l = playerinventory.getCarried().count; + Iterator iterator = this.h.iterator(); + ++ Map draggedSlots = new HashMap(); // CraftBukkit - Store slots from drag in map (raw slot id -> new stack) + while (iterator.hasNext()) { + Slot slot1 = (Slot) iterator.next(); + +@@ -141,16 +165,49 @@ + } + + l -= itemstack2.count - j1; +- slot1.set(itemstack2); ++ // slot1.set(itemstack2); ++ draggedSlots.put(slot1.rawSlotIndex, itemstack2); // CraftBukkit - Put in map instead of setting + } + } ++ ++ // CraftBukkit start - InventoryDragEvent ++ InventoryView view = getBukkitView(); ++ org.bukkit.inventory.ItemStack newcursor = CraftItemStack.asCraftMirror(itemstack1); ++ newcursor.setAmount(l); ++ Map eventmap = new HashMap(); ++ for (Map.Entry ditem : draggedSlots.entrySet()) { ++ eventmap.put(ditem.getKey(), CraftItemStack.asBukkitCopy(ditem.getValue())); ++ } ++ ++ // It's essential that we set the cursor to the new value here to prevent item duplication if a plugin closes the inventory. ++ ItemStack oldCursor = playerinventory.getCarried(); ++ playerinventory.setCarried(CraftItemStack.asNMSCopy(newcursor)); ++ ++ InventoryDragEvent event = new InventoryDragEvent(view, (newcursor.getType() != org.bukkit.Material.AIR ? newcursor : null), CraftItemStack.asBukkitCopy(oldCursor), this.dragType == 1, eventmap); ++ entityhuman.world.getServer().getPluginManager().callEvent(event); ++ ++ // Whether or not a change was made to the inventory that requires an update. ++ boolean needsUpdate = event.getResult() != Result.DEFAULT; ++ ++ if (event.getResult() != Result.DENY) { ++ for (Map.Entry dslot : draggedSlots.entrySet()) { ++ view.setItem(dslot.getKey(), CraftItemStack.asBukkitCopy(dslot.getValue())); ++ } ++ // The only time the carried item will be set to null is if the inventory is closed by the server. ++ // If the inventory is closed by the server, then the cursor items are dropped. This is why we change the cursor early. ++ if (playerinventory.getCarried() != null) { ++ playerinventory.setCarried(CraftItemStack.asNMSCopy(event.getCursor())); ++ needsUpdate = true; + +- itemstack1.count = l; +- if (itemstack1.count <= 0) { +- itemstack1 = null; ++ } ++ } else { ++ playerinventory.setCarried(oldCursor); + } + +- playerinventory.setCarried(itemstack1); ++ if (needsUpdate && entityhuman instanceof EntityPlayer) { ++ ((EntityPlayer) entityhuman).updateInventory(this); ++ } ++ // CraftBukkit end + } + + this.d(); +@@ -173,8 +230,14 @@ + } + + if (j == 1) { +- entityhuman.drop(playerinventory.getCarried().a(1), true); +- if (playerinventory.getCarried().count == 0) { ++ // CraftBukkit start - Store a reference ++ ItemStack itemstack4 = playerinventory.getCarried(); ++ if (itemstack4.count > 0) { ++ entityhuman.drop(itemstack4.a(1), true); ++ } ++ ++ if (itemstack4.count == 0) { ++ // CraftBukkit end + playerinventory.setCarried((ItemStack) null); + } + } +@@ -223,7 +286,11 @@ + + if (itemstack4.count == 0) { + playerinventory.setCarried((ItemStack) null); ++ // CraftBukkit start - Update client cursor if we didn't empty it ++ } else if (entityhuman instanceof EntityPlayer) { ++ ((EntityPlayer) entityhuman).playerConnection.sendPacket(new PacketPlayOutSetSlot(-1, -1, entityhuman.inventory.getCarried())); + } ++ // CraftBukkit end + } + } else if (slot2.isAllowed(entityhuman)) { + if (itemstack4 == null) { +@@ -249,7 +316,11 @@ + itemstack4.a(k1); + if (itemstack4.count == 0) { + playerinventory.setCarried((ItemStack) null); ++ // CraftBukkit start - Update client cursor if we didn't empty it ++ } else if (entityhuman instanceof EntityPlayer) { ++ ((EntityPlayer) entityhuman).playerConnection.sendPacket(new PacketPlayOutSetSlot(-1, -1, entityhuman.inventory.getCarried())); + } ++ // CraftBukkit end + + itemstack1.count += k1; + } else if (itemstack4.count <= slot2.getMaxStackSize(itemstack4)) { +@@ -258,7 +329,9 @@ + } + } else if (itemstack1.getItem() == itemstack4.getItem() && itemstack4.getMaxStackSize() > 1 && (!itemstack1.usesData() || itemstack1.getData() == itemstack4.getData()) && ItemStack.equals(itemstack1, itemstack4)) { + k1 = itemstack1.count; +- if (k1 > 0 && k1 + itemstack4.count <= itemstack4.getMaxStackSize()) { ++ // CraftBukkit start - itemstack4.getMaxStackSize() -> maxStack ++ int maxStack = Math.min(itemstack4.getMaxStackSize(), slot2.getMaxStackSize()); ++ if (k1 > 0 && k1 + itemstack4.count <= maxStack) { + itemstack4.count += k1; + itemstack1 = slot2.a(k1); + if (itemstack1.count == 0) { +@@ -266,11 +339,24 @@ + } + + slot2.a(entityhuman, playerinventory.getCarried()); ++ // CraftBukkit start - Update client cursor if we didn't empty it ++ } else if (entityhuman instanceof EntityPlayer) { ++ ((EntityPlayer) entityhuman).playerConnection.sendPacket(new PacketPlayOutSetSlot(-1, -1, entityhuman.inventory.getCarried())); + } ++ // CraftBukkit end + } + } + + slot2.f(); ++ // CraftBukkit start - Make sure the client has the right slot contents ++ if (entityhuman instanceof EntityPlayer && slot2.getMaxStackSize() != 64) { ++ ((EntityPlayer) entityhuman).playerConnection.sendPacket(new PacketPlayOutSetSlot(this.windowId, slot2.rawSlotIndex, slot2.getItem())); ++ // Updating a crafting inventory makes the client reset the result slot, have to send it again ++ if (this.getBukkitView().getType() == InventoryType.WORKBENCH || this.getBukkitView().getType() == InventoryType.CRAFTING) { ++ ((EntityPlayer) entityhuman).playerConnection.sendPacket(new PacketPlayOutSetSlot(this.windowId, 0, this.getSlot(0).getItem())); ++ } ++ } ++ // CraftBukkit end + } + } + } else if (k == 2 && j >= 0 && j < 9) { +@@ -411,17 +497,20 @@ + if (itemstack1 != null && itemstack1.getItem() == itemstack.getItem() && (!itemstack.usesData() || itemstack.getData() == itemstack1.getData()) && ItemStack.equals(itemstack, itemstack1)) { + int l = itemstack1.count + itemstack.count; + +- if (l <= itemstack.getMaxStackSize()) { ++ // CraftBukkit start - itemstack.getMaxStackSize() -> maxStack ++ int maxStack = Math.min(itemstack.getMaxStackSize(), slot.getMaxStackSize()); ++ if (l <= maxStack) { + itemstack.count = 0; + itemstack1.count = l; + slot.f(); + flag1 = true; +- } else if (itemstack1.count < itemstack.getMaxStackSize()) { +- itemstack.count -= itemstack.getMaxStackSize() - itemstack1.count; +- itemstack1.count = itemstack.getMaxStackSize(); ++ } else if (itemstack1.count < maxStack) { ++ itemstack.count -= maxStack - itemstack1.count; ++ itemstack1.count = maxStack; + slot.f(); + flag1 = true; + } ++ // CraftBukkit end + } + + if (flag) { diff --git a/nms-patches/ContainerAnvil.patch b/nms-patches/ContainerAnvil.patch new file mode 100644 index 0000000000..1c0c583a7e --- /dev/null +++ b/nms-patches/ContainerAnvil.patch @@ -0,0 +1,51 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/ContainerAnvil.java 2014-11-27 08:59:46.601422287 +1100 ++++ src/main/java/net/minecraft/server/ContainerAnvil.java 2014-11-27 08:42:10.144850927 +1100 +@@ -6,6 +6,8 @@ + import org.apache.logging.log4j.LogManager; + import org.apache.logging.log4j.Logger; + ++import org.bukkit.craftbukkit.inventory.CraftInventoryView; // CraftBukkit ++ + public class ContainerAnvil extends Container { + + private static final Logger f = LogManager.getLogger(); +@@ -17,8 +19,13 @@ + private int k; + private String l; + private final EntityHuman m; ++ // CraftBukkit start ++ private CraftInventoryView bukkitEntity = null; ++ private PlayerInventory player; ++ // CraftBukkit end + + public ContainerAnvil(PlayerInventory playerinventory, World world, BlockPosition blockposition, EntityHuman entityhuman) { ++ this.player = playerinventory; // CraftBukkit + this.j = blockposition; + this.i = world; + this.m = entityhuman; +@@ -265,6 +272,7 @@ + } + + public boolean a(EntityHuman entityhuman) { ++ if (!this.checkReachable) return true; // CraftBukkit + return this.i.getType(this.j).getBlock() != Blocks.ANVIL ? false : entityhuman.e((double) this.j.getX() + 0.5D, (double) this.j.getY() + 0.5D, (double) this.j.getZ() + 0.5D) <= 64.0D; + } + +@@ -328,4 +336,17 @@ + static int b(ContainerAnvil containeranvil) { + return containeranvil.k; + } ++ ++ // CraftBukkit start ++ @Override ++ public CraftInventoryView getBukkitView() { ++ if (bukkitEntity != null) { ++ return bukkitEntity; ++ } ++ ++ org.bukkit.craftbukkit.inventory.CraftInventory inventory = new org.bukkit.craftbukkit.inventory.CraftInventoryAnvil(this.h, this.g); ++ bukkitEntity = new CraftInventoryView(this.player.player.getBukkitEntity(), inventory, this); ++ return bukkitEntity; ++ } ++ // CraftBukkit end + } diff --git a/nms-patches/ContainerAnvilInventory.patch b/nms-patches/ContainerAnvilInventory.patch new file mode 100644 index 0000000000..16649334ad --- /dev/null +++ b/nms-patches/ContainerAnvilInventory.patch @@ -0,0 +1,58 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/ContainerAnvilInventory.java 2014-11-27 08:59:46.597422305 +1100 ++++ src/main/java/net/minecraft/server/ContainerAnvilInventory.java 2014-11-27 08:42:10.168850880 +1100 +@@ -1,8 +1,43 @@ + package net.minecraft.server; + ++// CraftBukkit start ++import java.util.List; ++import org.bukkit.craftbukkit.entity.CraftHumanEntity; ++import org.bukkit.entity.HumanEntity; ++// CraftBukkit end ++ + public class ContainerAnvilInventory extends InventorySubcontainer { + + final ContainerAnvil a; ++ ++ // CraftBukkit start ++ public List transaction = new java.util.ArrayList(); ++ public org.bukkit.entity.Player player; ++ private int maxStack = MAX_STACK; ++ ++ public ItemStack[] getContents() { ++ return this.items; ++ } ++ ++ public void onOpen(CraftHumanEntity who) { ++ transaction.add(who); ++ } ++ ++ public void onClose(CraftHumanEntity who) { ++ transaction.remove(who); ++ } ++ ++ public List getViewers() { ++ return transaction; ++ } ++ ++ public org.bukkit.inventory.InventoryHolder getOwner() { ++ return this.player; ++ } ++ ++ public void setMaxStackSize(int size) { ++ maxStack = size; ++ } + + ContainerAnvilInventory(ContainerAnvil containeranvil, String s, boolean flag, int i) { + super(s, flag, i); +@@ -13,4 +48,11 @@ + super.update(); + this.a.a((IInventory) this); + } ++ ++ // CraftBukkit start - override inherited maxStack from InventorySubcontainer ++ @Override ++ public int getMaxStackSize() { ++ return maxStack; ++ } ++ // CraftBukkit end + } diff --git a/nms-patches/ContainerBeacon.patch b/nms-patches/ContainerBeacon.patch new file mode 100644 index 0000000000..178e143c10 --- /dev/null +++ b/nms-patches/ContainerBeacon.patch @@ -0,0 +1,47 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/ContainerBeacon.java 2014-11-27 08:59:46.601422287 +1100 ++++ src/main/java/net/minecraft/server/ContainerBeacon.java 2014-11-27 08:42:10.156850903 +1100 +@@ -1,11 +1,18 @@ + package net.minecraft.server; + ++import org.bukkit.craftbukkit.inventory.CraftInventoryView; // CraftBukkit ++ + public class ContainerBeacon extends Container { + + private IInventory a; + private final SlotBeacon f; ++ // CraftBukkit start ++ private CraftInventoryView bukkitEntity = null; ++ private PlayerInventory player; ++ // CraftBukkit end + + public ContainerBeacon(IInventory iinventory, IInventory iinventory1) { ++ player = (PlayerInventory) iinventory; // CraftBukkit - TODO: check this + this.a = iinventory1; + this.a((Slot) (this.f = new SlotBeacon(this, iinventory1, 0, 136, 110))); + byte b0 = 36; +@@ -35,6 +42,7 @@ + } + + public boolean a(EntityHuman entityhuman) { ++ if (!this.checkReachable) return true; // CraftBukkit + return this.a.a(entityhuman); + } + +@@ -83,4 +91,17 @@ + + return itemstack; + } ++ ++ // CraftBukkit start ++ @Override ++ public CraftInventoryView getBukkitView() { ++ if (bukkitEntity != null) { ++ return bukkitEntity; ++ } ++ ++ org.bukkit.craftbukkit.inventory.CraftInventory inventory = new org.bukkit.craftbukkit.inventory.CraftInventoryBeacon((TileEntityBeacon) this.a); // TODO - check this ++ bukkitEntity = new CraftInventoryView(this.player.player.getBukkitEntity(), inventory, this); ++ return bukkitEntity; ++ } ++ // CraftBukkit end + } diff --git a/nms-patches/ContainerBrewingStand.patch b/nms-patches/ContainerBrewingStand.patch new file mode 100644 index 0000000000..b7aba135e1 --- /dev/null +++ b/nms-patches/ContainerBrewingStand.patch @@ -0,0 +1,52 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/ContainerBrewingStand.java 2014-11-27 08:59:46.605422269 +1100 ++++ src/main/java/net/minecraft/server/ContainerBrewingStand.java 2014-11-27 08:42:10.172850872 +1100 +@@ -1,12 +1,23 @@ + package net.minecraft.server; + ++// CraftBukkit start ++import org.bukkit.craftbukkit.inventory.CraftInventoryBrewer; ++import org.bukkit.craftbukkit.inventory.CraftInventoryView; ++// CraftBukkit end ++ + public class ContainerBrewingStand extends Container { + + private IInventory brewingStand; + private final Slot f; + private int g; ++ ++ // CraftBukkit start ++ private CraftInventoryView bukkitEntity = null; ++ private PlayerInventory player; ++ // CraftBukkit end + + public ContainerBrewingStand(PlayerInventory playerinventory, IInventory iinventory) { ++ player = playerinventory; // CraftBukkit + this.brewingStand = iinventory; + this.a((Slot) (new SlotPotionBottle(playerinventory.player, iinventory, 0, 56, 46))); + this.a((Slot) (new SlotPotionBottle(playerinventory.player, iinventory, 1, 79, 53))); +@@ -47,6 +58,7 @@ + } + + public boolean a(EntityHuman entityhuman) { ++ if (!this.checkReachable) return true; // CraftBukkit + return this.brewingStand.a(entityhuman); + } + +@@ -101,4 +113,17 @@ + + return itemstack; + } ++ ++ // CraftBukkit start ++ @Override ++ public CraftInventoryView getBukkitView() { ++ if (bukkitEntity != null) { ++ return bukkitEntity; ++ } ++ ++ CraftInventoryBrewer inventory = new CraftInventoryBrewer(this.brewingStand); ++ bukkitEntity = new CraftInventoryView(this.player.player.getBukkitEntity(), inventory, this); ++ return bukkitEntity; ++ } ++ // CraftBukkit end + } diff --git a/nms-patches/ContainerChest.patch b/nms-patches/ContainerChest.patch new file mode 100644 index 0000000000..7021c61b54 --- /dev/null +++ b/nms-patches/ContainerChest.patch @@ -0,0 +1,59 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/ContainerChest.java 2014-11-27 08:59:46.605422269 +1100 ++++ src/main/java/net/minecraft/server/ContainerChest.java 2014-11-27 08:42:10.172850872 +1100 +@@ -1,15 +1,48 @@ + package net.minecraft.server; + ++// CraftBukkit start ++import org.bukkit.craftbukkit.inventory.CraftInventory; ++import org.bukkit.craftbukkit.inventory.CraftInventoryView; ++// CraftBukkit end ++ + public class ContainerChest extends Container { + + public IInventory container; + private int f; ++ // CraftBukkit start ++ private CraftInventoryView bukkitEntity = null; ++ private PlayerInventory player; ++ ++ @Override ++ public CraftInventoryView getBukkitView() { ++ if (bukkitEntity != null) { ++ return bukkitEntity; ++ } ++ ++ CraftInventory inventory; ++ if (this.container instanceof PlayerInventory) { ++ inventory = new org.bukkit.craftbukkit.inventory.CraftInventoryPlayer((PlayerInventory) this.container); ++ } else if (this.container instanceof InventoryLargeChest) { ++ inventory = new org.bukkit.craftbukkit.inventory.CraftInventoryDoubleChest((InventoryLargeChest) this.container); ++ } else { ++ inventory = new CraftInventory(this.container); ++ } ++ ++ bukkitEntity = new CraftInventoryView(this.player.player.getBukkitEntity(), inventory, this); ++ return bukkitEntity; ++ } ++ // CraftBukkit end + + public ContainerChest(IInventory iinventory, IInventory iinventory1, EntityHuman entityhuman) { + this.container = iinventory1; + this.f = iinventory1.getSize() / 9; + iinventory1.startOpen(entityhuman); + int i = (this.f - 4) * 18; ++ ++ // CraftBukkit start - Save player ++ // TODO: Should we check to make sure it really is an InventoryPlayer? ++ this.player = (PlayerInventory) iinventory; ++ // CraftBukkit end + + int j; + int k; +@@ -33,6 +66,7 @@ + } + + public boolean a(EntityHuman entityhuman) { ++ if (!this.checkReachable) return true; // CraftBukkit + return this.container.a(entityhuman); + } + diff --git a/nms-patches/ContainerDispenser.patch b/nms-patches/ContainerDispenser.patch new file mode 100644 index 0000000000..cee5477961 --- /dev/null +++ b/nms-patches/ContainerDispenser.patch @@ -0,0 +1,54 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/ContainerDispenser.java 2014-11-27 08:59:46.605422269 +1100 ++++ src/main/java/net/minecraft/server/ContainerDispenser.java 2014-11-27 08:42:10.148850918 +1100 +@@ -1,11 +1,24 @@ + package net.minecraft.server; + ++// CraftBukkit start ++import org.bukkit.craftbukkit.inventory.CraftInventory; ++import org.bukkit.craftbukkit.inventory.CraftInventoryView; ++// CraftBukkit end ++ + public class ContainerDispenser extends Container { + +- private IInventory items; ++ public IInventory items; // CraftBukkit - private -> public ++ // CraftBukkit start ++ private CraftInventoryView bukkitEntity = null; ++ private PlayerInventory player; ++ // CraftBukkit end + + public ContainerDispenser(IInventory iinventory, IInventory iinventory1) { + this.items = iinventory1; ++ // CraftBukkit start - Save player ++ // TODO: Should we check to make sure it really is an InventoryPlayer? ++ this.player = (PlayerInventory)iinventory; ++ // CraftBukkit end + + int i; + int j; +@@ -29,6 +42,7 @@ + } + + public boolean a(EntityHuman entityhuman) { ++ if (!this.checkReachable) return true; // CraftBukkit + return this.items.a(entityhuman); + } + +@@ -63,4 +77,17 @@ + + return itemstack; + } ++ ++ // CraftBukkit start ++ @Override ++ public CraftInventoryView getBukkitView() { ++ if (bukkitEntity != null) { ++ return bukkitEntity; ++ } ++ ++ CraftInventory inventory = new CraftInventory(this.items); ++ bukkitEntity = new CraftInventoryView(this.player.player.getBukkitEntity(), inventory, this); ++ return bukkitEntity; ++ } ++ // CraftBukkit end + } diff --git a/nms-patches/ContainerEnchantTable.patch b/nms-patches/ContainerEnchantTable.patch new file mode 100644 index 0000000000..f2d866d89b --- /dev/null +++ b/nms-patches/ContainerEnchantTable.patch @@ -0,0 +1,170 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/ContainerEnchantTable.java 2014-11-27 08:59:46.609422252 +1100 ++++ src/main/java/net/minecraft/server/ContainerEnchantTable.java 2014-11-27 08:42:10.120850973 +1100 +@@ -3,15 +3,31 @@ + import java.util.List; + import java.util.Random; + ++// CraftBukkit start ++import java.util.Map; ++ ++import org.bukkit.craftbukkit.inventory.CraftInventoryEnchanting; ++import org.bukkit.craftbukkit.inventory.CraftInventoryView; ++import org.bukkit.craftbukkit.inventory.CraftItemStack; ++import org.bukkit.event.enchantment.EnchantItemEvent; ++import org.bukkit.event.enchantment.PrepareItemEnchantEvent; ++import org.bukkit.entity.Player; ++// CraftBukkit end ++ + public class ContainerEnchantTable extends Container { + +- public IInventory enchantSlots = new ContainerEnchantTableInventory(this, "Enchant", true, 2); ++ // CraftBukkit - make type specific (changed from IInventory) ++ public ContainerEnchantTableInventory enchantSlots = new ContainerEnchantTableInventory(this, "Enchant", true, 2); + private World world; + private BlockPosition position; + private Random k = new Random(); + public int f; + public int[] costs = new int[3]; + public int[] h = new int[] { -1, -1, -1}; ++ // CraftBukkit start ++ private CraftInventoryView bukkitEntity = null; ++ private Player player; ++ // CraftBukkit end + + public ContainerEnchantTable(PlayerInventory playerinventory, World world, BlockPosition blockposition) { + this.world = world; +@@ -31,7 +47,11 @@ + for (i = 0; i < 9; ++i) { + this.a(new Slot(playerinventory, i, 8 + i * 18, 142)); + } +- ++ ++ // CraftBukkit start ++ player = (Player) playerinventory.player.getBukkitEntity(); ++ enchantSlots.player = player; ++ // CraftBukkit end + } + + public void addSlotListener(ICrafting icrafting) { +@@ -67,7 +87,7 @@ + ItemStack itemstack = iinventory.getItem(0); + int i; + +- if (itemstack != null && itemstack.v()) { ++ if (itemstack != null) { // CraftBukkit - relax condition + if (!this.world.isStatic) { + i = 0; + +@@ -114,6 +134,20 @@ + this.costs[j] = 0; + } + } ++ ++ // CraftBukkit start ++ CraftItemStack item = CraftItemStack.asCraftMirror(itemstack); ++ PrepareItemEnchantEvent event = new PrepareItemEnchantEvent(player, this.getBukkitView(), this.world.getWorld().getBlockAt(position.getX(), position.getY(), position.getZ()), item, this.costs, i); ++ event.setCancelled(!itemstack.v()); ++ this.world.getServer().getPluginManager().callEvent(event); ++ ++ if (event.isCancelled()) { ++ for (i = 0; i < 3; ++i) { ++ this.costs[i] = 0; ++ } ++ return; ++ } ++ // CraftBukkit end + + for (j = 0; j < 3; ++j) { + if (this.costs[j] > 0) { +@@ -149,24 +183,56 @@ + } else if (this.costs[i] > 0 && itemstack != null && (entityhuman.expLevel >= j && entityhuman.expLevel >= this.costs[i] || entityhuman.abilities.canInstantlyBuild)) { + if (!this.world.isStatic) { + List list = this.a(itemstack, i, this.costs[i]); ++ // CraftBukkit start - Provide an empty enchantment list ++ if (list == null) { ++ list = new java.util.ArrayList(); ++ } ++ // CraftBukkit end + boolean flag = itemstack.getItem() == Items.BOOK; + + if (list != null) { +- entityhuman.b(j); ++ // CraftBukkit start ++ Map enchants = new java.util.HashMap(); ++ for (Object obj : list) { ++ WeightedRandomEnchant instance = (WeightedRandomEnchant) obj; ++ enchants.put(org.bukkit.enchantments.Enchantment.getById(instance.enchantment.id), instance.level); ++ } ++ CraftItemStack item = CraftItemStack.asCraftMirror(itemstack); ++ ++ EnchantItemEvent event = new EnchantItemEvent((Player) entityhuman.getBukkitEntity(), this.getBukkitView(), this.world.getWorld().getBlockAt(position.getX(), position.getY(), position.getZ()), item, this.costs[i], enchants, i); ++ this.world.getServer().getPluginManager().callEvent(event); ++ ++ int level = event.getExpLevelCost(); ++ if (event.isCancelled() || (level > entityhuman.expLevel && !entityhuman.abilities.canInstantlyBuild) || event.getEnchantsToAdd().isEmpty()) { ++ return false; ++ } ++ + if (flag) { + itemstack.setItem(Items.ENCHANTED_BOOK); + } ++ ++ for (Map.Entry entry : event.getEnchantsToAdd().entrySet()) { ++ try { ++ if (flag) { ++ int enchantId = entry.getKey().getId(); ++ if (Enchantment.getById(enchantId) == null) { ++ continue; ++ } + +- for (int k = 0; k < list.size(); ++k) { +- WeightedRandomEnchant weightedrandomenchant = (WeightedRandomEnchant) list.get(k); +- +- if (flag) { +- Items.ENCHANTED_BOOK.a(itemstack, weightedrandomenchant); +- } else { +- itemstack.addEnchantment(weightedrandomenchant.enchantment, weightedrandomenchant.level); ++ WeightedRandomEnchant enchantment = new WeightedRandomEnchant(Enchantment.getById(enchantId), entry.getValue()); ++ Items.ENCHANTED_BOOK.a(itemstack, enchantment); ++ } else { ++ item.addUnsafeEnchantment(entry.getKey(), entry.getValue()); ++ } ++ } catch (IllegalArgumentException e) { ++ /* Just swallow invalid enchantments */ + } + } ++ ++ entityhuman.b(level); ++ // CraftBukkit end + ++ // CraftBukkit - TODO: let plugins change this + if (!entityhuman.abilities.canInstantlyBuild) { + itemstack1.count -= j; + if (itemstack1.count <= 0) { +@@ -212,6 +278,7 @@ + } + + public boolean a(EntityHuman entityhuman) { ++ if (!this.checkReachable) return true; // CraftBukkit + return this.world.getType(this.position).getBlock() != Blocks.ENCHANTING_TABLE ? false : entityhuman.e((double) this.position.getX() + 0.5D, (double) this.position.getY() + 0.5D, (double) this.position.getZ() + 0.5D) <= 64.0D; + } + +@@ -263,5 +330,18 @@ + } + + return itemstack; ++ } ++ ++ // CraftBukkit start ++ @Override ++ public CraftInventoryView getBukkitView() { ++ if (bukkitEntity != null) { ++ return bukkitEntity; ++ } ++ ++ CraftInventoryEnchanting inventory = new CraftInventoryEnchanting(this.enchantSlots); ++ bukkitEntity = new CraftInventoryView(this.player, inventory, this); ++ return bukkitEntity; + } ++ // CraftBukkit end + } diff --git a/nms-patches/ContainerEnchantTableInventory.patch b/nms-patches/ContainerEnchantTableInventory.patch new file mode 100644 index 0000000000..f2f80b3e53 --- /dev/null +++ b/nms-patches/ContainerEnchantTableInventory.patch @@ -0,0 +1,58 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/ContainerEnchantTableInventory.java 2014-11-27 08:59:46.609422252 +1100 ++++ src/main/java/net/minecraft/server/ContainerEnchantTableInventory.java 2014-11-27 08:42:10.088851036 +1100 +@@ -1,8 +1,45 @@ + package net.minecraft.server; + +-class ContainerEnchantTableInventory extends InventorySubcontainer { ++// CraftBukkit start ++import java.util.List; ++import org.bukkit.craftbukkit.entity.CraftHumanEntity; ++import org.bukkit.entity.HumanEntity; ++// CraftBukkit end ++ ++// CraftBukkit -> public ++public class ContainerEnchantTableInventory extends InventorySubcontainer { + + final ContainerEnchantTable enchantTable; ++ ++ // CraftBukkit start ++ public List transaction = new java.util.ArrayList(); ++ public org.bukkit.entity.Player player; ++ private int maxStack = MAX_STACK; ++ ++ public ItemStack[] getContents() { ++ return this.items; ++ } ++ ++ public void onOpen(CraftHumanEntity who) { ++ transaction.add(who); ++ } ++ ++ public void onClose(CraftHumanEntity who) { ++ transaction.remove(who); ++ } ++ ++ public List getViewers() { ++ return transaction; ++ } ++ ++ public org.bukkit.inventory.InventoryHolder getOwner() { ++ return this.player; ++ } ++ ++ public void setMaxStackSize(int size) { ++ maxStack = size; ++ } ++ // CraftBukkit end + + ContainerEnchantTableInventory(ContainerEnchantTable containerenchanttable, String s, boolean flag, int i) { + super(s, flag, i); +@@ -10,7 +47,7 @@ + } + + public int getMaxStackSize() { +- return 64; ++ return maxStack; // CraftBukkit + } + + public void update() { diff --git a/nms-patches/ContainerFurnace.patch b/nms-patches/ContainerFurnace.patch new file mode 100644 index 0000000000..b299ee2055 --- /dev/null +++ b/nms-patches/ContainerFurnace.patch @@ -0,0 +1,51 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/ContainerFurnace.java 2014-11-27 08:59:46.613422234 +1100 ++++ src/main/java/net/minecraft/server/ContainerFurnace.java 2014-11-27 08:42:10.116850981 +1100 +@@ -1,5 +1,10 @@ + package net.minecraft.server; + ++// CraftBukkit start ++import org.bukkit.craftbukkit.inventory.CraftInventoryFurnace; ++import org.bukkit.craftbukkit.inventory.CraftInventoryView; ++// CraftBukkit end ++ + public class ContainerFurnace extends Container { + + private final IInventory furnace; +@@ -7,12 +12,29 @@ + private int g; + private int h; + private int i; ++ ++ // CraftBukkit start ++ private CraftInventoryView bukkitEntity = null; ++ private PlayerInventory player; ++ ++ @Override ++ public CraftInventoryView getBukkitView() { ++ if (bukkitEntity != null) { ++ return bukkitEntity; ++ } ++ ++ CraftInventoryFurnace inventory = new CraftInventoryFurnace((TileEntityFurnace) this.furnace); ++ bukkitEntity = new CraftInventoryView(this.player.player.getBukkitEntity(), inventory, this); ++ return bukkitEntity; ++ } ++ // CraftBukkit end + + public ContainerFurnace(PlayerInventory playerinventory, IInventory iinventory) { + this.furnace = iinventory; + this.a(new Slot(iinventory, 0, 56, 17)); + this.a((Slot) (new SlotFurnaceFuel(iinventory, 1, 56, 53))); + this.a((Slot) (new SlotFurnaceResult(playerinventory.player, iinventory, 2, 116, 35))); ++ this.player = playerinventory; // CraftBukkit - save player + + int i; + +@@ -63,6 +85,7 @@ + } + + public boolean a(EntityHuman entityhuman) { ++ if (!this.checkReachable) return true; // CraftBukkit + return this.furnace.a(entityhuman); + } + diff --git a/nms-patches/ContainerHopper.patch b/nms-patches/ContainerHopper.patch new file mode 100644 index 0000000000..4654d33ad2 --- /dev/null +++ b/nms-patches/ContainerHopper.patch @@ -0,0 +1,44 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/ContainerHopper.java 2014-11-27 08:59:46.613422234 +1100 ++++ src/main/java/net/minecraft/server/ContainerHopper.java 2014-11-27 08:42:10.168850880 +1100 +@@ -1,11 +1,33 @@ + package net.minecraft.server; + ++// CraftBukkit start ++import org.bukkit.craftbukkit.inventory.CraftInventory; ++import org.bukkit.craftbukkit.inventory.CraftInventoryView; ++// CraftBukkit end ++ + public class ContainerHopper extends Container { + + private final IInventory hopper; ++ ++ // CraftBukkit start ++ private CraftInventoryView bukkitEntity = null; ++ private PlayerInventory player; ++ ++ @Override ++ public CraftInventoryView getBukkitView() { ++ if (bukkitEntity != null) { ++ return bukkitEntity; ++ } ++ ++ CraftInventory inventory = new CraftInventory(this.hopper); ++ bukkitEntity = new CraftInventoryView(this.player.player.getBukkitEntity(), inventory, this); ++ return bukkitEntity; ++ } ++ // CraftBukkit end + + public ContainerHopper(PlayerInventory playerinventory, IInventory iinventory, EntityHuman entityhuman) { + this.hopper = iinventory; ++ this.player = playerinventory; // CraftBukkit - save player + iinventory.startOpen(entityhuman); + byte b0 = 51; + +@@ -28,6 +50,7 @@ + } + + public boolean a(EntityHuman entityhuman) { ++ if (!this.checkReachable) return true; // CraftBukkit + return this.hopper.a(entityhuman); + } + diff --git a/nms-patches/ContainerHorse.patch b/nms-patches/ContainerHorse.patch new file mode 100644 index 0000000000..9c9fa57aea --- /dev/null +++ b/nms-patches/ContainerHorse.patch @@ -0,0 +1,36 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/ContainerHorse.java 2014-11-27 08:59:46.613422234 +1100 ++++ src/main/java/net/minecraft/server/ContainerHorse.java 2014-11-27 08:42:10.124850965 +1100 +@@ -1,11 +1,33 @@ + package net.minecraft.server; + ++// CraftBukkit start ++import org.bukkit.craftbukkit.inventory.CraftInventory; ++import org.bukkit.craftbukkit.inventory.CraftInventoryView; ++import org.bukkit.inventory.InventoryView; ++// CraftBukkit end ++ + public class ContainerHorse extends Container { + + private IInventory a; + private EntityHorse f; ++ ++ // CraftBukkit start ++ org.bukkit.craftbukkit.inventory.CraftInventoryView bukkitEntity; ++ PlayerInventory player; ++ ++ @Override ++ public InventoryView getBukkitView() { ++ if (bukkitEntity != null) { ++ return bukkitEntity; ++ } ++ ++ CraftInventory inventory = new org.bukkit.craftbukkit.inventory.CraftInventoryHorse(this.a); ++ return bukkitEntity = new CraftInventoryView(player.player.getBukkitEntity(), inventory, this); ++ } + + public ContainerHorse(IInventory iinventory, IInventory iinventory1, EntityHorse entityhorse, EntityHuman entityhuman) { ++ player = (PlayerInventory) iinventory; ++ // CraftBukkit end + this.a = iinventory1; + this.f = entityhorse; + byte b0 = 3; diff --git a/nms-patches/ContainerMerchant.patch b/nms-patches/ContainerMerchant.patch new file mode 100644 index 0000000000..d62ffe9e1c --- /dev/null +++ b/nms-patches/ContainerMerchant.patch @@ -0,0 +1,36 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/ContainerMerchant.java 2014-11-27 08:59:46.617422217 +1100 ++++ src/main/java/net/minecraft/server/ContainerMerchant.java 2014-11-27 08:42:10.136850942 +1100 +@@ -1,10 +1,25 @@ + package net.minecraft.server; + ++import org.bukkit.craftbukkit.inventory.CraftInventoryView; // CraftBukkit ++ + public class ContainerMerchant extends Container { + + private IMerchant merchant; + private InventoryMerchant f; + private final World g; ++ ++ // CraftBukkit start ++ private CraftInventoryView bukkitEntity = null; ++ private PlayerInventory player; ++ ++ @Override ++ public CraftInventoryView getBukkitView() { ++ if (bukkitEntity == null) { ++ bukkitEntity = new CraftInventoryView(this.player.player.getBukkitEntity(), new org.bukkit.craftbukkit.inventory.CraftInventoryMerchant((InventoryMerchant) f), this); ++ } ++ return bukkitEntity; ++ } ++ // CraftBukkit end + + public ContainerMerchant(PlayerInventory playerinventory, IMerchant imerchant, World world) { + this.merchant = imerchant; +@@ -13,6 +28,7 @@ + this.a(new Slot(this.f, 0, 36, 53)); + this.a(new Slot(this.f, 1, 62, 53)); + this.a((Slot) (new SlotMerchantResult(playerinventory.player, imerchant, this.f, 2, 120, 53))); ++ this.player = playerinventory; // CraftBukkit - save player + + int i; + diff --git a/nms-patches/ContainerPlayer.patch b/nms-patches/ContainerPlayer.patch new file mode 100644 index 0000000000..8b2c347bd8 --- /dev/null +++ b/nms-patches/ContainerPlayer.patch @@ -0,0 +1,74 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/ContainerPlayer.java 2014-11-27 08:59:46.621422199 +1100 ++++ src/main/java/net/minecraft/server/ContainerPlayer.java 2014-11-27 08:42:10.104851005 +1100 +@@ -1,15 +1,28 @@ + package net.minecraft.server; + ++// CraftBukkit start ++import org.bukkit.craftbukkit.inventory.CraftInventoryCrafting; ++import org.bukkit.craftbukkit.inventory.CraftInventoryView; ++// CraftBukkit end ++ + public class ContainerPlayer extends Container { + + public InventoryCrafting craftInventory = new InventoryCrafting(this, 2, 2); + public IInventory resultInventory = new InventoryCraftResult(); + public boolean g; + private final EntityHuman h; ++ // CraftBukkit start ++ private CraftInventoryView bukkitEntity = null; ++ private PlayerInventory player; ++ // CraftBukkit end + + public ContainerPlayer(PlayerInventory playerinventory, boolean flag, EntityHuman entityhuman) { + this.g = flag; + this.h = entityhuman; ++ this.resultInventory = new InventoryCraftResult(); // CraftBukkit - moved to before InventoryCrafting construction ++ this.craftInventory = new InventoryCrafting(this, 2, 2, playerinventory.player); // CraftBukkit - pass player ++ this.craftInventory.resultInventory = this.resultInventory; // CraftBukkit - let InventoryCrafting know about its result slot ++ this.player = playerinventory; // CraftBukkit - save player + this.a((Slot) (new SlotResult(playerinventory.player, this.craftInventory, this.resultInventory, 0, 144, 36))); + + int i; +@@ -35,11 +48,22 @@ + this.a(new Slot(playerinventory, i, 8 + i * 18, 142)); + } + +- this.a((IInventory) this.craftInventory); ++ // this.a((IInventory) this.craftInventory); // CraftBukkit - unneeded since it just sets result slot to empty + } + + public void a(IInventory iinventory) { +- this.resultInventory.setItem(0, CraftingManager.getInstance().craft(this.craftInventory, this.h.world)); ++ // this.resultInventory.setItem(0, CraftingManager.getInstance().craft(this.craftInventory, this.h.world)); ++ // CraftBukkit start (Note: the following line would cause an error if called during construction) ++ CraftingManager.getInstance().lastCraftView = getBukkitView(); ++ ItemStack craftResult = CraftingManager.getInstance().craft(this.craftInventory, this.h.world); ++ this.resultInventory.setItem(0, craftResult); ++ if (super.listeners.size() < 1) { ++ return; ++ } ++ ++ EntityPlayer player = (EntityPlayer) super.listeners.get(0); // TODO: Is this _always_ correct? Seems like it. ++ player.playerConnection.sendPacket(new PacketPlayOutSetSlot(player.activeContainer.windowId, 0, craftResult)); ++ // CraftBukkit end + } + + public void b(EntityHuman entityhuman) { +@@ -119,4 +143,17 @@ + public boolean a(ItemStack itemstack, Slot slot) { + return slot.inventory != this.resultInventory && super.a(itemstack, slot); + } ++ ++ // CraftBukkit start ++ @Override ++ public CraftInventoryView getBukkitView() { ++ if (bukkitEntity != null) { ++ return bukkitEntity; ++ } ++ ++ CraftInventoryCrafting inventory = new CraftInventoryCrafting(this.craftInventory, this.resultInventory); ++ bukkitEntity = new CraftInventoryView(this.player.player.getBukkitEntity(), inventory, this); ++ return bukkitEntity; ++ } ++ // CraftBukkit end + } diff --git a/nms-patches/ContainerWorkbench.patch b/nms-patches/ContainerWorkbench.patch new file mode 100644 index 0000000000..045167c1b9 --- /dev/null +++ b/nms-patches/ContainerWorkbench.patch @@ -0,0 +1,79 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/ContainerWorkbench.java 2014-11-27 08:59:46.621422199 +1100 ++++ src/main/java/net/minecraft/server/ContainerWorkbench.java 2014-11-27 08:42:10.156850903 +1100 +@@ -1,13 +1,28 @@ + package net.minecraft.server; + ++// CraftBukkit start ++import org.bukkit.craftbukkit.inventory.CraftInventoryCrafting; ++import org.bukkit.craftbukkit.inventory.CraftInventoryView; ++// CraftBukkit end ++ + public class ContainerWorkbench extends Container { + +- public InventoryCrafting craftInventory = new InventoryCrafting(this, 3, 3); +- public IInventory resultInventory = new InventoryCraftResult(); ++ public InventoryCrafting craftInventory; // CraftBukkit - move initialization into constructor ++ public IInventory resultInventory; // CraftBukkit - move initialization into constructor + private World g; + private BlockPosition h; ++ // CraftBukkit start ++ private CraftInventoryView bukkitEntity = null; ++ private PlayerInventory player; ++ // CraftBukkit end + + public ContainerWorkbench(PlayerInventory playerinventory, World world, BlockPosition blockposition) { ++ // CraftBukkit start - Switched order of IInventory construction and stored player ++ this.resultInventory = new InventoryCraftResult(); ++ this.craftInventory = new InventoryCrafting(this, 3, 3, playerinventory.player); // CraftBukkit - pass player ++ this.craftInventory.resultInventory = this.resultInventory; ++ this.player = playerinventory; ++ // CraftBukkit end + this.g = world; + this.h = blockposition; + this.a((Slot) (new SlotResult(playerinventory.player, this.craftInventory, this.resultInventory, 0, 124, 35))); +@@ -35,7 +50,18 @@ + } + + public void a(IInventory iinventory) { +- this.resultInventory.setItem(0, CraftingManager.getInstance().craft(this.craftInventory, this.g)); ++ // this.resultInventory.setItem(0, CraftingManager.getInstance().craft(this.craftInventory, this.g)); ++ // CraftBukkit start ++ CraftingManager.getInstance().lastCraftView = getBukkitView(); ++ ItemStack craftResult = CraftingManager.getInstance().craft(this.craftInventory, this.g); ++ this.resultInventory.setItem(0, craftResult); ++ if (super.listeners.size() < 1) { ++ return; ++ } ++ ++ EntityPlayer player = (EntityPlayer) super.listeners.get(0); // TODO: Is this _always_ correct? Seems like it. ++ player.playerConnection.sendPacket(new PacketPlayOutSetSlot(player.activeContainer.windowId, 0, craftResult)); ++ // CraftBukkit end + } + + public void b(EntityHuman entityhuman) { +@@ -53,6 +79,7 @@ + } + + public boolean a(EntityHuman entityhuman) { ++ if (!this.checkReachable) return true; // CraftBukkit + return this.g.getType(this.h).getBlock() != Blocks.CRAFTING_TABLE ? false : entityhuman.e((double) this.h.getX() + 0.5D, (double) this.h.getY() + 0.5D, (double) this.h.getZ() + 0.5D) <= 64.0D; + } + +@@ -101,4 +128,17 @@ + public boolean a(ItemStack itemstack, Slot slot) { + return slot.inventory != this.resultInventory && super.a(itemstack, slot); + } ++ ++ // CraftBukkit start ++ @Override ++ public CraftInventoryView getBukkitView() { ++ if (bukkitEntity != null) { ++ return bukkitEntity; ++ } ++ ++ CraftInventoryCrafting inventory = new CraftInventoryCrafting(this.craftInventory, this.resultInventory); ++ bukkitEntity = new CraftInventoryView(this.player.player.getBukkitEntity(), inventory, this); ++ return bukkitEntity; ++ } ++ // CraftBukkit end + } diff --git a/nms-patches/ControllerLook.patch b/nms-patches/ControllerLook.patch new file mode 100644 index 0000000000..212d063ea8 --- /dev/null +++ b/nms-patches/ControllerLook.patch @@ -0,0 +1,23 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/ControllerLook.java 2014-11-27 08:59:46.621422199 +1100 ++++ src/main/java/net/minecraft/server/ControllerLook.java 2014-11-27 08:42:10.172850872 +1100 +@@ -1,5 +1,7 @@ + package net.minecraft.server; + ++import org.bukkit.craftbukkit.TrigMath; // CraftBukkit ++ + public class ControllerLook { + + private EntityInsentient a; +@@ -45,8 +47,10 @@ + double d1 = this.f - (this.a.locY + (double) this.a.getHeadHeight()); + double d2 = this.g - this.a.locZ; + double d3 = (double) MathHelper.sqrt(d0 * d0 + d2 * d2); +- float f = (float) (Math.atan2(d2, d0) * 180.0D / 3.1415927410125732D) - 90.0F; +- float f1 = (float) (-(Math.atan2(d1, d3) * 180.0D / 3.1415927410125732D)); ++ // CraftBukkit start - Math -> TrigMath ++ float f = (float) (TrigMath.atan2(d2, d0) * 180.0D / 3.1415927410125732D) - 90.0F; ++ float f1 = (float) (-(TrigMath.atan2(d1, d3) * 180.0D / 3.1415927410125732D)); ++ // CraftBukkit end + + this.a.pitch = this.a(this.a.pitch, f1, this.c); + this.a.aI = this.a(this.a.aI, f, this.b); diff --git a/nms-patches/ControllerMove.patch b/nms-patches/ControllerMove.patch new file mode 100644 index 0000000000..9963db77f5 --- /dev/null +++ b/nms-patches/ControllerMove.patch @@ -0,0 +1,12 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/ControllerMove.java 2014-11-27 08:59:46.625422182 +1100 ++++ src/main/java/net/minecraft/server/ControllerMove.java 2014-11-27 08:42:10.164850887 +1100 +@@ -43,7 +43,8 @@ + double d3 = d0 * d0 + d2 * d2 + d1 * d1; + + if (d3 >= 2.500000277905201E-7D) { +- float f = (float) (Math.atan2(d1, d0) * 180.0D / 3.1415927410125732D) - 90.0F; ++ // CraftBukkit - Math -> TrigMath ++ float f = (float) (org.bukkit.craftbukkit.TrigMath.atan2(d1, d0) * 180.0D / 3.1415927410125732D) - 90.0F; + + this.a.yaw = this.a(this.a.yaw, f, 30.0F); + this.a.j((float) (this.e * this.a.getAttributeInstance(GenericAttributes.d).getValue())); diff --git a/nms-patches/CraftingManager.patch b/nms-patches/CraftingManager.patch new file mode 100644 index 0000000000..8d0f4bde9d --- /dev/null +++ b/nms-patches/CraftingManager.patch @@ -0,0 +1,57 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/CraftingManager.java 2014-11-27 08:59:46.625422182 +1100 ++++ src/main/java/net/minecraft/server/CraftingManager.java 2014-11-27 08:42:10.112850989 +1100 +@@ -8,10 +8,16 @@ + import java.util.Iterator; + import java.util.List; + ++import org.bukkit.craftbukkit.event.CraftEventFactory; // CraftBukkit ++ + public class CraftingManager { + + private static final CraftingManager a = new CraftingManager(); + public List recipes = Lists.newArrayList(); ++ // CraftBukkit start ++ public IRecipe lastRecipe; ++ public org.bukkit.inventory.InventoryView lastCraftView; ++ // CraftBukkit end + + public static CraftingManager getInstance() { + return CraftingManager.a; +@@ -166,8 +172,15 @@ + this.registerShapedRecipe(new ItemStack(Blocks.DAYLIGHT_DETECTOR), new Object[] { "GGG", "QQQ", "WWW", Character.valueOf('G'), Blocks.GLASS, Character.valueOf('Q'), Items.QUARTZ, Character.valueOf('W'), Blocks.WOODEN_SLAB}); + this.registerShapedRecipe(new ItemStack(Blocks.HOPPER), new Object[] { "I I", "ICI", " I ", Character.valueOf('I'), Items.IRON_INGOT, Character.valueOf('C'), Blocks.CHEST}); + this.registerShapedRecipe(new ItemStack(Items.ARMOR_STAND, 1), new Object[] { "///", " / ", "/_/", Character.valueOf('/'), Items.STICK, Character.valueOf('_'), new ItemStack(Blocks.STONE_SLAB, 1, EnumStoneSlabVariant.STONE.a())}); ++ // Collections.sort(this.recipes, new RecipeSorter(this)); // CraftBukkit - moved below ++ sort(); ++ } ++ ++ // CraftBukkit start ++ public void sort() { + Collections.sort(this.recipes, new RecipeSorter(this)); + } ++ // CraftBukkit end + + public ShapedRecipes registerShapedRecipe(ItemStack itemstack, Object... aobject) { + String s = ""; +@@ -265,13 +278,18 @@ + + do { + if (!iterator.hasNext()) { ++ inventorycrafting.currentRecipe = null; // CraftBukkit - Clear recipe when no recipe is found + return null; + } + + irecipe = (IRecipe) iterator.next(); +- } while (!irecipe.a(inventorycrafting, world)); +- +- return irecipe.a(inventorycrafting); ++ } while (!irecipe.a(inventorycrafting, world)); ++ ++ // CraftBukkit start - INVENTORY_PRE_CRAFT event ++ inventorycrafting.currentRecipe = irecipe; ++ ItemStack result = irecipe.a(inventorycrafting); ++ return CraftEventFactory.callPreCraftEvent(inventorycrafting, result, lastCraftView, false); ++ // CraftBukkit end + } + + public ItemStack[] b(InventoryCrafting inventorycrafting, World world) { diff --git a/nms-patches/CrashReport.patch b/nms-patches/CrashReport.patch new file mode 100644 index 0000000000..3518bd3e81 --- /dev/null +++ b/nms-patches/CrashReport.patch @@ -0,0 +1,10 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/CrashReport.java 2014-11-27 08:59:46.629422164 +1100 ++++ src/main/java/net/minecraft/server/CrashReport.java 2014-11-27 08:42:10.172850872 +1100 +@@ -40,6 +40,7 @@ + this.d.a("Memory", (Callable) (new CrashReportMemory(this))); + this.d.a("JVM Flags", (Callable) (new CrashReportJVMFlags(this))); + this.d.a("IntCache", (Callable) (new CrashReportIntCacheSize(this))); ++ this.d.a("CraftBukkit Information", (Callable) (new org.bukkit.craftbukkit.CraftCrashReport())); // CraftBukkit + } + + public String a() { diff --git a/nms-patches/DedicatedServer.patch b/nms-patches/DedicatedServer.patch new file mode 100644 index 0000000000..814b166b5c --- /dev/null +++ b/nms-patches/DedicatedServer.patch @@ -0,0 +1,162 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/DedicatedServer.java 2014-11-27 08:59:46.629422164 +1100 ++++ src/main/java/net/minecraft/server/DedicatedServer.java 2014-11-27 08:42:10.172850872 +1100 +@@ -13,6 +13,14 @@ + import org.apache.logging.log4j.LogManager; + import org.apache.logging.log4j.Logger; + ++// CraftBukkit start ++import java.io.PrintStream; ++import org.apache.logging.log4j.Level; ++ ++import org.bukkit.craftbukkit.LoggerOutputStream; ++import org.bukkit.event.server.ServerCommandEvent; ++// CraftBukkit end ++ + public class DedicatedServer extends MinecraftServer implements IMinecraftServer { + + private static final Logger LOGGER = LogManager.getLogger(); +@@ -25,23 +33,48 @@ + private EnumGamemode q; + private boolean r; + +- public DedicatedServer(File file) { +- super(file, Proxy.NO_PROXY, DedicatedServer.a); ++ // CraftBukkit start - Signature changed ++ public DedicatedServer(joptsimple.OptionSet options) { ++ super(options, Proxy.NO_PROXY, a); ++ // super(file, Proxy.NO_PROXY, a); ++ // CraftBukkit end + new ThreadSleepForever(this, "Server Infinisleeper"); + } + +- protected boolean init() { ++ protected boolean init() throws java.net.UnknownHostException { // CraftBukkit - throws UnknownHostException + ThreadCommandReader threadcommandreader = new ThreadCommandReader(this, "Server console handler"); + + threadcommandreader.setDaemon(true); + threadcommandreader.start(); ++ ++ // CraftBukkit start - TODO: handle command-line logging arguments ++ java.util.logging.Logger global = java.util.logging.Logger.getLogger(""); ++ global.setUseParentHandlers(false); ++ for (java.util.logging.Handler handler : global.getHandlers()) { ++ global.removeHandler(handler); ++ } ++ global.addHandler(new org.bukkit.craftbukkit.util.ForwardLogHandler()); ++ ++ final org.apache.logging.log4j.core.Logger logger = ((org.apache.logging.log4j.core.Logger) LogManager.getRootLogger()); ++ for (org.apache.logging.log4j.core.Appender appender : logger.getAppenders().values()) { ++ if (appender instanceof org.apache.logging.log4j.core.appender.ConsoleAppender) { ++ logger.removeAppender(appender); ++ } ++ } ++ ++ new Thread(new org.bukkit.craftbukkit.util.TerminalConsoleWriterThread(System.out, this.reader)).start(); ++ ++ System.setOut(new PrintStream(new LoggerOutputStream(logger, Level.INFO), true)); ++ System.setErr(new PrintStream(new LoggerOutputStream(logger, Level.WARN), true)); ++ // CraftBukkit end ++ + DedicatedServer.LOGGER.info("Starting minecraft server version 1.8"); + if (Runtime.getRuntime().maxMemory() / 1024L / 1024L < 512L) { + DedicatedServer.LOGGER.warn("To start the server with more ram, launch it as \"java -Xmx1024M -Xms1024M -jar minecraft_server.jar\""); + } + + DedicatedServer.LOGGER.info("Loading properties"); +- this.propertyManager = new PropertyManager(new File("server.properties")); ++ this.propertyManager = new PropertyManager(this.options); // CraftBukkit - CLI argument support + this.o = new EULA(new File("eula.txt")); + if (!this.o.a()) { + DedicatedServer.LOGGER.info("You need to agree to the EULA in order to run the server. Go to eula.txt for more info."); +@@ -90,13 +123,15 @@ + + try { + this.ao().a(inetaddress, this.Q()); +- } catch (IOException ioexception) { ++ } catch (Throwable ioexception) { // CraftBukkit - IOException -> Throwable + DedicatedServer.LOGGER.warn("**** FAILED TO BIND TO PORT!"); + DedicatedServer.LOGGER.warn("The exception was: {}", new Object[] { ioexception.toString()}); + DedicatedServer.LOGGER.warn("Perhaps a server is already running on that port?"); + return false; + } + ++ this.a((PlayerList) (new DedicatedPlayerList(this))); // CraftBukkit ++ + if (!this.getOnlineMode()) { + DedicatedServer.LOGGER.warn("**** SERVER IS RUNNING IN OFFLINE/INSECURE MODE!"); + DedicatedServer.LOGGER.warn("The server will make no attempt to authenticate usernames. Beware."); +@@ -111,7 +146,8 @@ + if (!NameReferencingFileConverter.a(this.propertyManager)) { + return false; + } else { +- this.a((PlayerList) (new DedicatedPlayerList(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(); + + if (this.T() == null) { +@@ -166,7 +202,18 @@ + DedicatedServer.LOGGER.info("Starting remote control listener"); + this.m = new RemoteControlListener(this); + this.m.a(); ++ this.remoteConsole = new org.bukkit.craftbukkit.command.CraftRemoteConsoleCommandSender(); // CraftBukkit ++ } ++ ++ // CraftBukkit start ++ if (this.server.getBukkitSpawnRadius() > -1) { ++ DedicatedServer.LOGGER.info("'settings.spawn-radius' in bukkit.yml has been moved to 'spawn-protection' in server.properties. I will move your config for you."); ++ this.propertyManager.properties.remove("spawn-protection"); ++ this.propertyManager.getInt("spawn-protection", this.server.getBukkitSpawnRadius()); ++ this.server.removeBukkitSpawnRadius(); ++ this.propertyManager.savePropertiesFile(); + } ++ // CraftBukkit end + + if (this.aQ() > 0L) { + Thread thread = new Thread(new ThreadWatchdog(this)); +@@ -181,6 +228,12 @@ + } + } + ++ // CraftBukkit start ++ public PropertyManager getPropertyManager() { ++ return this.propertyManager; ++ } ++ // CraftBukkit end ++ + public void setGamemode(EnumGamemode enumgamemode) { + super.setGamemode(enumgamemode); + this.q = enumgamemode; +@@ -203,6 +256,7 @@ + } + + protected void a(CrashReport crashreport) { ++ /* CraftBukkit start - not sure why you would want to continue running commands once the server crashed + while (this.isRunning()) { + this.aM(); + +@@ -212,7 +266,7 @@ + ; + } + } +- ++ // CraftBukkit end */ + } + + public CrashReport b(CrashReport crashreport) { +@@ -257,7 +311,14 @@ + while (!this.k.isEmpty()) { + ServerCommand servercommand = (ServerCommand) this.k.remove(0); + +- this.getCommandHandler().a(servercommand.source, servercommand.command); ++ // CraftBukkit start - ServerCommand for preprocessing ++ ServerCommandEvent event = new ServerCommandEvent(console, servercommand.command); ++ server.getPluginManager().callEvent(event); ++ servercommand = new ServerCommand(event.getCommand(), servercommand.source); ++ ++ // this.getCommandHandler().a(servercommand.source, servercommand.command); // Called in dispatchServerCommand ++ server.dispatchServerCommand(console, servercommand); ++ // CraftBukkit end + } + + } diff --git a/nms-patches/DispenseBehaviorArmor.patch b/nms-patches/DispenseBehaviorArmor.patch new file mode 100644 index 0000000000..6c420e65e2 --- /dev/null +++ b/nms-patches/DispenseBehaviorArmor.patch @@ -0,0 +1,59 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/DispenseBehaviorArmor.java 2014-11-27 08:59:46.629422164 +1100 ++++ src/main/java/net/minecraft/server/DispenseBehaviorArmor.java 2014-11-27 08:42:10.144850927 +1100 +@@ -3,6 +3,11 @@ + import com.google.common.base.Predicates; + import java.util.List; + ++// CraftBukkit start ++import org.bukkit.craftbukkit.inventory.CraftItemStack; ++import org.bukkit.event.block.BlockDispenseEvent; ++// CraftBukkit end ++ + final class DispenseBehaviorArmor extends DispenseBehaviorItem { + + DispenseBehaviorArmor() {} +@@ -19,15 +24,42 @@ + EntityLiving entityliving = (EntityLiving) list.get(0); + int l = entityliving instanceof EntityHuman ? 1 : 0; + int i1 = EntityInsentient.c(itemstack); +- ItemStack itemstack1 = itemstack.cloneItemStack(); ++ ++ // CraftBukkit start ++ ItemStack itemstack1 = itemstack.a(1); ++ World world = isourceblock.i(); ++ org.bukkit.block.Block block = world.getWorld().getBlockAt(isourceblock.getBlockPosition().getX(), isourceblock.getBlockPosition().getY(), isourceblock.getBlockPosition().getZ()); ++ CraftItemStack craftItem = CraftItemStack.asCraftMirror(itemstack1); ++ ++ BlockDispenseEvent event = new BlockDispenseEvent(block, craftItem.clone(), new org.bukkit.util.Vector(0, 0, 0)); ++ if (!BlockDispenser.eventFired) { ++ world.getServer().getPluginManager().callEvent(event); ++ } + ++ if (event.isCancelled()) { ++ itemstack.count++; ++ return itemstack; ++ } ++ ++ if (!event.getItem().equals(craftItem)) { ++ itemstack.count++; ++ // Chain to handler for new item ++ ItemStack eventStack = CraftItemStack.asNMSCopy(event.getItem()); ++ IDispenseBehavior idispensebehavior = (IDispenseBehavior) BlockDispenser.M.get(eventStack.getItem()); ++ if (idispensebehavior != IDispenseBehavior.a && idispensebehavior != this) { ++ idispensebehavior.a(isourceblock, eventStack); ++ return itemstack; ++ } ++ } ++ // CraftBukkit end ++ + itemstack1.count = 1; + entityliving.setEquipment(i1 - l, itemstack1); + if (entityliving instanceof EntityInsentient) { + ((EntityInsentient) entityliving).a(i1, 2.0F); + } + +- --itemstack.count; ++ // --itemstack.count; // CraftBukkit - handled above + return itemstack; + } else { + return super.b(isourceblock, itemstack); diff --git a/nms-patches/DispenseBehaviorBoat.patch b/nms-patches/DispenseBehaviorBoat.patch new file mode 100644 index 0000000000..19daf555a2 --- /dev/null +++ b/nms-patches/DispenseBehaviorBoat.patch @@ -0,0 +1,54 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/DispenseBehaviorBoat.java 2014-11-27 08:59:46.633422146 +1100 ++++ src/main/java/net/minecraft/server/DispenseBehaviorBoat.java 2014-11-27 08:42:10.164850887 +1100 +@@ -1,5 +1,10 @@ + package net.minecraft.server; + ++// CraftBukkit start ++import org.bukkit.craftbukkit.inventory.CraftItemStack; ++import org.bukkit.event.block.BlockDispenseEvent; ++// CraftBukkit end ++ + final class DispenseBehaviorBoat extends DispenseBehaviorItem { + + private final DispenseBehaviorItem b = new DispenseBehaviorItem(); +@@ -26,10 +31,38 @@ + d3 = 0.0D; + } + +- EntityBoat entityboat = new EntityBoat(world, d0, d1 + d3, d2); ++ // EntityBoat entityboat = new EntityBoat(world, d0, d1 + d3, d2); ++ // CraftBukkit start ++ ItemStack itemstack1 = itemstack.a(1); ++ org.bukkit.block.Block block = world.getWorld().getBlockAt(isourceblock.getBlockPosition().getX(), isourceblock.getBlockPosition().getY(), isourceblock.getBlockPosition().getZ()); ++ CraftItemStack craftItem = CraftItemStack.asCraftMirror(itemstack1); ++ ++ BlockDispenseEvent event = new BlockDispenseEvent(block, craftItem.clone(), new org.bukkit.util.Vector(d0, d1 + d3, d2)); ++ if (!BlockDispenser.eventFired) { ++ world.getServer().getPluginManager().callEvent(event); ++ } ++ ++ if (event.isCancelled()) { ++ itemstack.count++; ++ return itemstack; ++ } ++ ++ if (!event.getItem().equals(craftItem)) { ++ itemstack.count++; ++ // Chain to handler for new item ++ ItemStack eventStack = CraftItemStack.asNMSCopy(event.getItem()); ++ IDispenseBehavior idispensebehavior = (IDispenseBehavior) BlockDispenser.M.get(eventStack.getItem()); ++ if (idispensebehavior != IDispenseBehavior.a && idispensebehavior != this) { ++ idispensebehavior.a(isourceblock, eventStack); ++ return itemstack; ++ } ++ } ++ ++ EntityBoat entityboat = new EntityBoat(world, event.getVelocity().getX(), event.getVelocity().getY(), event.getVelocity().getZ()); ++ // CraftBukkit end + + world.addEntity(entityboat); +- itemstack.a(1); ++ // itemstack.a(1); // CraftBukkit - handled during event processing + return itemstack; + } + diff --git a/nms-patches/DispenseBehaviorBonemeal.patch b/nms-patches/DispenseBehaviorBonemeal.patch new file mode 100644 index 0000000000..32cea5b74e --- /dev/null +++ b/nms-patches/DispenseBehaviorBonemeal.patch @@ -0,0 +1,44 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/DispenseBehaviorBonemeal.java 2014-11-27 08:59:46.633422146 +1100 ++++ src/main/java/net/minecraft/server/DispenseBehaviorBonemeal.java 2014-11-27 08:42:10.120850973 +1100 +@@ -1,5 +1,10 @@ + package net.minecraft.server; + ++// CraftBukkit start ++import org.bukkit.craftbukkit.inventory.CraftItemStack; ++import org.bukkit.event.block.BlockDispenseEvent; ++// CraftBukkit end ++ + final class DispenseBehaviorBonemeal extends DispenseBehaviorItem { + + private boolean b = true; +@@ -10,6 +15,30 @@ + if (EnumColor.WHITE == EnumColor.fromInvColorIndex(itemstack.getData())) { + World world = isourceblock.i(); + BlockPosition blockposition = isourceblock.getBlockPosition().shift(BlockDispenser.b(isourceblock.f())); ++ ++ // CraftBukkit start ++ org.bukkit.block.Block block = world.getWorld().getBlockAt(isourceblock.getBlockPosition().getX(), isourceblock.getBlockPosition().getY(), isourceblock.getBlockPosition().getZ()); ++ CraftItemStack craftItem = CraftItemStack.asNewCraftStack(itemstack.getItem()); ++ ++ BlockDispenseEvent event = new BlockDispenseEvent(block, craftItem.clone(), new org.bukkit.util.Vector(0, 0, 0)); ++ if (!BlockDispenser.eventFired) { ++ world.getServer().getPluginManager().callEvent(event); ++ } ++ ++ if (event.isCancelled()) { ++ return itemstack; ++ } ++ ++ if (!event.getItem().equals(craftItem)) { ++ // Chain to handler for new item ++ ItemStack eventStack = CraftItemStack.asNMSCopy(event.getItem()); ++ IDispenseBehavior idispensebehavior = (IDispenseBehavior) BlockDispenser.M.get(eventStack.getItem()); ++ if (idispensebehavior != IDispenseBehavior.a && idispensebehavior != this) { ++ idispensebehavior.a(isourceblock, eventStack); ++ return itemstack; ++ } ++ } ++ // CraftBukkit end + + if (ItemDye.a(itemstack, world, blockposition)) { + if (!world.isStatic) { diff --git a/nms-patches/DispenseBehaviorEmptyBucket.patch b/nms-patches/DispenseBehaviorEmptyBucket.patch new file mode 100644 index 0000000000..9727c367c8 --- /dev/null +++ b/nms-patches/DispenseBehaviorEmptyBucket.patch @@ -0,0 +1,44 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/DispenseBehaviorEmptyBucket.java 2014-11-27 08:59:46.633422146 +1100 ++++ src/main/java/net/minecraft/server/DispenseBehaviorEmptyBucket.java 2014-11-27 08:42:10.124850965 +1100 +@@ -1,5 +1,10 @@ + package net.minecraft.server; + ++// CraftBukkit start ++import org.bukkit.craftbukkit.inventory.CraftItemStack; ++import org.bukkit.event.block.BlockDispenseEvent; ++// CraftBukkit end ++ + final class DispenseBehaviorEmptyBucket extends DispenseBehaviorItem { + + private final DispenseBehaviorItem b = new DispenseBehaviorItem(); +@@ -23,6 +28,30 @@ + + item = Items.LAVA_BUCKET; + } ++ ++ // CraftBukkit start ++ org.bukkit.block.Block bukkitBlock = world.getWorld().getBlockAt(isourceblock.getBlockPosition().getX(), isourceblock.getBlockPosition().getY(), isourceblock.getBlockPosition().getZ()); ++ CraftItemStack craftItem = CraftItemStack.asCraftMirror(itemstack); ++ ++ BlockDispenseEvent event = new BlockDispenseEvent(bukkitBlock, craftItem.clone(), new org.bukkit.util.Vector(blockposition.getX(), blockposition.getY(), blockposition.getZ())); ++ if (!BlockDispenser.eventFired) { ++ world.getServer().getPluginManager().callEvent(event); ++ } ++ ++ if (event.isCancelled()) { ++ return itemstack; ++ } ++ ++ if (!event.getItem().equals(craftItem)) { ++ // Chain to handler for new item ++ ItemStack eventStack = CraftItemStack.asNMSCopy(event.getItem()); ++ IDispenseBehavior idispensebehavior = (IDispenseBehavior) BlockDispenser.M.get(eventStack.getItem()); ++ if (idispensebehavior != IDispenseBehavior.a && idispensebehavior != this) { ++ idispensebehavior.a(isourceblock, eventStack); ++ return itemstack; ++ } ++ } ++ // CraftBukkit end + + world.setAir(blockposition); + if (--itemstack.count == 0) { diff --git a/nms-patches/DispenseBehaviorFilledBucket.patch b/nms-patches/DispenseBehaviorFilledBucket.patch new file mode 100644 index 0000000000..e3bcc62e1a --- /dev/null +++ b/nms-patches/DispenseBehaviorFilledBucket.patch @@ -0,0 +1,65 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/DispenseBehaviorFilledBucket.java 2014-11-27 08:59:46.637422129 +1100 ++++ src/main/java/net/minecraft/server/DispenseBehaviorFilledBucket.java 2014-11-27 08:42:10.088851036 +1100 +@@ -1,5 +1,10 @@ + package net.minecraft.server; + ++// CraftBukkit start ++import org.bukkit.craftbukkit.inventory.CraftItemStack; ++import org.bukkit.event.block.BlockDispenseEvent; ++// CraftBukkit end ++ + final class DispenseBehaviorFilledBucket extends DispenseBehaviorItem { + + private final DispenseBehaviorItem b = new DispenseBehaviorItem(); +@@ -9,10 +14,49 @@ + public ItemStack b(ISourceBlock isourceblock, ItemStack itemstack) { + ItemBucket itembucket = (ItemBucket) itemstack.getItem(); + BlockPosition blockposition = isourceblock.getBlockPosition().shift(BlockDispenser.b(isourceblock.f())); ++ ++ // CraftBukkit start ++ World world = isourceblock.i(); ++ int x = blockposition.getX(); ++ int y = blockposition.getY(); ++ int z = blockposition.getZ(); ++ if (world.isEmpty(blockposition) || !world.getType(blockposition).getBlock().getMaterial().isBuildable()) { ++ org.bukkit.block.Block block = world.getWorld().getBlockAt(isourceblock.getBlockPosition().getX(), isourceblock.getBlockPosition().getY(), isourceblock.getBlockPosition().getZ()); ++ CraftItemStack craftItem = CraftItemStack.asCraftMirror(itemstack); ++ ++ BlockDispenseEvent event = new BlockDispenseEvent(block, craftItem.clone(), new org.bukkit.util.Vector(x, y, z)); ++ if (!BlockDispenser.eventFired) { ++ world.getServer().getPluginManager().callEvent(event); ++ } ++ ++ if (event.isCancelled()) { ++ return itemstack; ++ } ++ ++ if (!event.getItem().equals(craftItem)) { ++ // Chain to handler for new item ++ ItemStack eventStack = CraftItemStack.asNMSCopy(event.getItem()); ++ IDispenseBehavior idispensebehavior = (IDispenseBehavior) BlockDispenser.M.get(eventStack.getItem()); ++ if (idispensebehavior != IDispenseBehavior.a && idispensebehavior != this) { ++ idispensebehavior.a(isourceblock, eventStack); ++ return itemstack; ++ } ++ } ++ ++ itembucket = (ItemBucket) CraftItemStack.asNMSCopy(event.getItem()).getItem(); ++ } ++ // CraftBukkit end + + if (itembucket.a(isourceblock.i(), blockposition)) { +- itemstack.setItem(Items.BUCKET); +- itemstack.count = 1; ++ // CraftBukkit start - Handle stacked buckets ++ Item item = Items.BUCKET; ++ if (--itemstack.count == 0) { ++ itemstack.setItem(Items.BUCKET); ++ itemstack.count = 1; ++ } else if (((TileEntityDispenser) isourceblock.getTileEntity()).addItem(new ItemStack(item)) < 0) { ++ this.b.a(isourceblock, new ItemStack(item)); ++ } ++ // CraftBukkit end + return itemstack; + } else { + return this.b.a(isourceblock, itemstack); diff --git a/nms-patches/DispenseBehaviorFireball.patch b/nms-patches/DispenseBehaviorFireball.patch new file mode 100644 index 0000000000..1d21873fbb --- /dev/null +++ b/nms-patches/DispenseBehaviorFireball.patch @@ -0,0 +1,55 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/DispenseBehaviorFireball.java 2014-11-27 08:59:46.637422129 +1100 ++++ src/main/java/net/minecraft/server/DispenseBehaviorFireball.java 2014-11-27 08:42:10.172850872 +1100 +@@ -2,6 +2,11 @@ + + import java.util.Random; + ++// CraftBukkit start ++import org.bukkit.craftbukkit.inventory.CraftItemStack; ++import org.bukkit.event.block.BlockDispenseEvent; ++// CraftBukkit end ++ + final class DispenseBehaviorFireball extends DispenseBehaviorItem { + + DispenseBehaviorFireball() {} +@@ -18,8 +23,38 @@ + double d4 = random.nextGaussian() * 0.05D + (double) enumdirection.getAdjacentY(); + double d5 = random.nextGaussian() * 0.05D + (double) enumdirection.getAdjacentZ(); + +- world.addEntity(new EntitySmallFireball(world, d0, d1, d2, d3, d4, d5)); +- itemstack.a(1); ++ // CraftBukkit start ++ ItemStack itemstack1 = itemstack.a(1); ++ org.bukkit.block.Block block = world.getWorld().getBlockAt(isourceblock.getBlockPosition().getX(), isourceblock.getBlockPosition().getY(), isourceblock.getBlockPosition().getZ()); ++ CraftItemStack craftItem = CraftItemStack.asCraftMirror(itemstack1); ++ ++ BlockDispenseEvent event = new BlockDispenseEvent(block, craftItem.clone(), new org.bukkit.util.Vector(d3, d4, d5)); ++ if (!BlockDispenser.eventFired) { ++ world.getServer().getPluginManager().callEvent(event); ++ } ++ ++ if (event.isCancelled()) { ++ itemstack.count++; ++ return itemstack; ++ } ++ ++ if (!event.getItem().equals(craftItem)) { ++ itemstack.count++; ++ // Chain to handler for new item ++ ItemStack eventStack = CraftItemStack.asNMSCopy(event.getItem()); ++ IDispenseBehavior idispensebehavior = (IDispenseBehavior) BlockDispenser.M.get(eventStack.getItem()); ++ if (idispensebehavior != IDispenseBehavior.a && idispensebehavior != this) { ++ idispensebehavior.a(isourceblock, eventStack); ++ return itemstack; ++ } ++ } ++ ++ EntitySmallFireball entitysmallfireball = new EntitySmallFireball(world, d0, d1, d2, event.getVelocity().getX(), event.getVelocity().getY(), event.getVelocity().getZ()); ++ entitysmallfireball.projectileSource = new org.bukkit.craftbukkit.projectiles.CraftBlockProjectileSource((TileEntityDispenser) isourceblock.getTileEntity()); ++ ++ world.addEntity(entitysmallfireball); ++ // itemstack.a(1); // Handled during event processing ++ // CraftBukkit end + return itemstack; + } + diff --git a/nms-patches/DispenseBehaviorFlintAndSteel.patch b/nms-patches/DispenseBehaviorFlintAndSteel.patch new file mode 100644 index 0000000000..26ab2df077 --- /dev/null +++ b/nms-patches/DispenseBehaviorFlintAndSteel.patch @@ -0,0 +1,57 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/DispenseBehaviorFlintAndSteel.java 2014-11-27 08:59:46.641422111 +1100 ++++ src/main/java/net/minecraft/server/DispenseBehaviorFlintAndSteel.java 2014-11-27 08:42:10.168850880 +1100 +@@ -1,5 +1,10 @@ + package net.minecraft.server; + ++// CraftBukkit start ++import org.bukkit.craftbukkit.inventory.CraftItemStack; ++import org.bukkit.event.block.BlockDispenseEvent; ++// CraftBukkit end ++ + final class DispenseBehaviorFlintAndSteel extends DispenseBehaviorItem { + + private boolean b = true; +@@ -10,11 +15,39 @@ + World world = isourceblock.i(); + BlockPosition blockposition = isourceblock.getBlockPosition().shift(BlockDispenser.b(isourceblock.f())); + +- if (world.isEmpty(blockposition)) { +- world.setTypeUpdate(blockposition, Blocks.FIRE.getBlockData()); +- if (itemstack.isDamaged(1, world.random)) { +- itemstack.count = 0; ++ // CraftBukkit start ++ org.bukkit.block.Block block = world.getWorld().getBlockAt(isourceblock.getBlockPosition().getX(), isourceblock.getBlockPosition().getY(), isourceblock.getBlockPosition().getZ()); ++ CraftItemStack craftItem = CraftItemStack.asCraftMirror(itemstack); ++ ++ BlockDispenseEvent event = new BlockDispenseEvent(block, craftItem.clone(), new org.bukkit.util.Vector(0, 0, 0)); ++ if (!BlockDispenser.eventFired) { ++ world.getServer().getPluginManager().callEvent(event); ++ } ++ ++ if (event.isCancelled()) { ++ return itemstack; ++ } ++ ++ if (!event.getItem().equals(craftItem)) { ++ // Chain to handler for new item ++ ItemStack eventStack = CraftItemStack.asNMSCopy(event.getItem()); ++ IDispenseBehavior idispensebehavior = (IDispenseBehavior) BlockDispenser.M.get(eventStack.getItem()); ++ if (idispensebehavior != IDispenseBehavior.a && idispensebehavior != this) { ++ idispensebehavior.a(isourceblock, eventStack); ++ return itemstack; ++ } ++ } ++ // CraftBukkit end ++ ++ if (world.isEmpty(blockposition)) { ++ // CraftBukkit start - Ignition by dispensing flint and steel ++ if (!org.bukkit.craftbukkit.event.CraftEventFactory.callBlockIgniteEvent(world, blockposition.getX(), blockposition.getY(), blockposition.getZ(), isourceblock.getBlockPosition().getX(), isourceblock.getBlockPosition().getY(), isourceblock.getBlockPosition().getZ()).isCancelled()) { ++ world.setTypeUpdate(blockposition, Blocks.FIRE.getBlockData()); ++ if (itemstack.isDamaged(1, world.random)) { ++ itemstack.count = 0; ++ } + } ++ // CraftBukkit end + } else if (world.getType(blockposition).getBlock() == Blocks.TNT) { + Blocks.TNT.postBreak(world, blockposition, Blocks.TNT.getBlockData().set(BlockTNT.EXPLODE, Boolean.valueOf(true))); + world.setAir(blockposition); diff --git a/nms-patches/DispenseBehaviorItem.patch b/nms-patches/DispenseBehaviorItem.patch new file mode 100644 index 0000000000..b902b835b1 --- /dev/null +++ b/nms-patches/DispenseBehaviorItem.patch @@ -0,0 +1,76 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/DispenseBehaviorItem.java 2014-11-27 08:59:46.641422111 +1100 ++++ src/main/java/net/minecraft/server/DispenseBehaviorItem.java 2014-11-27 08:42:10.168850880 +1100 +@@ -1,5 +1,10 @@ + package net.minecraft.server; + ++// CraftBukkit start ++import org.bukkit.craftbukkit.inventory.CraftItemStack; ++import org.bukkit.event.block.BlockDispenseEvent; ++// CraftBukkit end ++ + public class DispenseBehaviorItem implements IDispenseBehavior { + + public DispenseBehaviorItem() {} +@@ -17,11 +22,18 @@ + IPosition iposition = BlockDispenser.a(isourceblock); + ItemStack itemstack1 = itemstack.a(1); + +- a(isourceblock.i(), itemstack1, 6, enumdirection, iposition); ++ // CraftBukkit start ++ if (!a(isourceblock.i(), itemstack1, 6, enumdirection, isourceblock)) { ++ itemstack.count++; ++ } ++ // CraftBukkit end + return itemstack; + } + +- public static void a(World world, ItemStack itemstack, int i, EnumDirection enumdirection, IPosition iposition) { ++ // CraftBukkit start - void -> boolean return, IPosition -> ISourceBlock last argument ++ public static boolean a(World world, ItemStack itemstack, int i, EnumDirection enumdirection, ISourceBlock isourceblock) { ++ IPosition iposition = BlockDispenser.a(isourceblock); ++ // CraftBukkit end + double d0 = iposition.getX(); + double d1 = iposition.getY(); + double d2 = iposition.getZ(); +@@ -41,7 +53,41 @@ + entityitem.motX += world.random.nextGaussian() * 0.007499999832361937D * (double) i; + entityitem.motY += world.random.nextGaussian() * 0.007499999832361937D * (double) i; + entityitem.motZ += world.random.nextGaussian() * 0.007499999832361937D * (double) i; ++ ++ // CraftBukkit start ++ org.bukkit.block.Block block = world.getWorld().getBlockAt(isourceblock.getBlockPosition().getX(), isourceblock.getBlockPosition().getY(), isourceblock.getBlockPosition().getZ()); ++ CraftItemStack craftItem = CraftItemStack.asCraftMirror(itemstack); ++ ++ BlockDispenseEvent event = new BlockDispenseEvent(block, craftItem.clone(), new org.bukkit.util.Vector(entityitem.motX, entityitem.motY, entityitem.motZ)); ++ if (!BlockDispenser.eventFired) { ++ world.getServer().getPluginManager().callEvent(event); ++ } ++ ++ if (event.isCancelled()) { ++ return false; ++ } ++ ++ entityitem.setItemStack(CraftItemStack.asNMSCopy(event.getItem())); ++ entityitem.motX = event.getVelocity().getX(); ++ entityitem.motY = event.getVelocity().getY(); ++ entityitem.motZ = event.getVelocity().getZ(); ++ ++ if (!event.getItem().equals(craftItem)) { ++ // Chain to handler for new item ++ ItemStack eventStack = CraftItemStack.asNMSCopy(event.getItem()); ++ IDispenseBehavior idispensebehavior = (IDispenseBehavior) BlockDispenser.M.get(eventStack.getItem()); ++ if (idispensebehavior != IDispenseBehavior.a && idispensebehavior.getClass() != DispenseBehaviorItem.class) { ++ idispensebehavior.a(isourceblock, eventStack); ++ } else { ++ world.addEntity(entityitem); ++ } ++ return false; ++ } ++ + world.addEntity(entityitem); ++ ++ return true; ++ // CraftBukkit end + } + + protected void a(ISourceBlock isourceblock) { diff --git a/nms-patches/DispenseBehaviorMinecart.patch b/nms-patches/DispenseBehaviorMinecart.patch new file mode 100644 index 0000000000..454c15b77c --- /dev/null +++ b/nms-patches/DispenseBehaviorMinecart.patch @@ -0,0 +1,58 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/DispenseBehaviorMinecart.java 2014-11-27 08:59:46.641422111 +1100 ++++ src/main/java/net/minecraft/server/DispenseBehaviorMinecart.java 2014-11-27 08:42:10.084851043 +1100 +@@ -1,5 +1,10 @@ + package net.minecraft.server; + ++// CraftBukkit start ++import org.bukkit.craftbukkit.inventory.CraftItemStack; ++import org.bukkit.event.block.BlockDispenseEvent; ++// CraftBukkit end ++ + final class DispenseBehaviorMinecart extends DispenseBehaviorItem { + + private final DispenseBehaviorItem b = new DispenseBehaviorItem(); +@@ -38,14 +43,42 @@ + } + } + +- EntityMinecartAbstract entityminecartabstract = EntityMinecartAbstract.a(world, d0, d1 + d3, d2, ItemMinecart.a((ItemMinecart) itemstack.getItem())); ++ // CraftBukkit start ++ // EntityMinecartAbstract entityminecartabstract = EntityMinecartAbstract.a(world, d0, d1 + d3, d2, ItemMinecart.a((ItemMinecart) itemstack.getItem())); ++ ItemStack itemstack1 = itemstack.a(1); ++ org.bukkit.block.Block block2 = world.getWorld().getBlockAt(isourceblock.getBlockPosition().getX(), isourceblock.getBlockPosition().getY(), isourceblock.getBlockPosition().getZ()); ++ CraftItemStack craftItem = CraftItemStack.asCraftMirror(itemstack1); ++ ++ BlockDispenseEvent event = new BlockDispenseEvent(block2, craftItem.clone(), new org.bukkit.util.Vector(d0, d1 + d3, d2)); ++ if (!BlockDispenser.eventFired) { ++ world.getServer().getPluginManager().callEvent(event); ++ } ++ ++ if (event.isCancelled()) { ++ itemstack.count++; ++ return itemstack; ++ } ++ ++ if (!event.getItem().equals(craftItem)) { ++ itemstack.count++; ++ // Chain to handler for new item ++ ItemStack eventStack = CraftItemStack.asNMSCopy(event.getItem()); ++ IDispenseBehavior idispensebehavior = (IDispenseBehavior) BlockDispenser.M.get(eventStack.getItem()); ++ if (idispensebehavior != IDispenseBehavior.a && idispensebehavior != this) { ++ idispensebehavior.a(isourceblock, eventStack); ++ return itemstack; ++ } ++ } ++ ++ itemstack1 = CraftItemStack.asNMSCopy(event.getItem()); ++ EntityMinecartAbstract entityminecartabstract = EntityMinecartAbstract.a(world, event.getVelocity().getX(), event.getVelocity().getY(), event.getVelocity().getZ(), ItemMinecart.a((ItemMinecart) itemstack1.getItem())); + + if (itemstack.hasName()) { + entityminecartabstract.setCustomName(itemstack.getName()); + } + + world.addEntity(entityminecartabstract); +- itemstack.a(1); ++ // itemstack.a(1); // CraftBukkit - handled during event processing + return itemstack; + } + diff --git a/nms-patches/DispenseBehaviorMonsterEgg.patch b/nms-patches/DispenseBehaviorMonsterEgg.patch new file mode 100644 index 0000000000..56a05a5401 --- /dev/null +++ b/nms-patches/DispenseBehaviorMonsterEgg.patch @@ -0,0 +1,61 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/DispenseBehaviorMonsterEgg.java 2014-11-27 08:59:46.645422093 +1100 ++++ src/main/java/net/minecraft/server/DispenseBehaviorMonsterEgg.java 2014-11-27 08:42:10.096851020 +1100 +@@ -1,5 +1,10 @@ + package net.minecraft.server; + ++// CraftBukkit start ++import org.bukkit.craftbukkit.inventory.CraftItemStack; ++import org.bukkit.event.block.BlockDispenseEvent; ++// CraftBukkit end ++ + final class DispenseBehaviorMonsterEgg extends DispenseBehaviorItem { + + DispenseBehaviorMonsterEgg() {} +@@ -9,13 +14,45 @@ + double d0 = isourceblock.getX() + (double) enumdirection.getAdjacentX(); + double d1 = (double) ((float) isourceblock.getBlockPosition().getY() + 0.2F); + double d2 = isourceblock.getZ() + (double) enumdirection.getAdjacentZ(); +- Entity entity = ItemMonsterEgg.a(isourceblock.i(), itemstack.getData(), d0, d1, d2); ++ // Entity entity = ItemMonsterEgg.a(isourceblock.i(), itemstack.getData(), d0, d1, d2); ++ ++ // CraftBukkit start ++ World world = isourceblock.i(); ++ ItemStack itemstack1 = itemstack.a(1); ++ org.bukkit.block.Block block = world.getWorld().getBlockAt(isourceblock.getBlockPosition().getX(), isourceblock.getBlockPosition().getY(), isourceblock.getBlockPosition().getZ()); ++ CraftItemStack craftItem = CraftItemStack.asCraftMirror(itemstack1); ++ ++ BlockDispenseEvent event = new BlockDispenseEvent(block, craftItem.clone(), new org.bukkit.util.Vector(d0, d1, d2)); ++ if (!BlockDispenser.eventFired) { ++ world.getServer().getPluginManager().callEvent(event); ++ } ++ ++ if (event.isCancelled()) { ++ itemstack.count++; ++ return itemstack; ++ } ++ ++ if (!event.getItem().equals(craftItem)) { ++ itemstack.count++; ++ // Chain to handler for new item ++ ItemStack eventStack = CraftItemStack.asNMSCopy(event.getItem()); ++ IDispenseBehavior idispensebehavior = (IDispenseBehavior) BlockDispenser.M.get(eventStack.getItem()); ++ if (idispensebehavior != IDispenseBehavior.a && idispensebehavior != this) { ++ idispensebehavior.a(isourceblock, eventStack); ++ return itemstack; ++ } ++ } ++ ++ itemstack1 = CraftItemStack.asNMSCopy(event.getItem()); ++ ++ Entity entity = ItemMonsterEgg.spawnCreature(isourceblock.i(), itemstack.getData(), event.getVelocity().getX(), event.getVelocity().getY(), event.getVelocity().getZ(), org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.DISPENSE_EGG); + + if (entity instanceof EntityLiving && itemstack.hasName()) { + ((EntityInsentient) entity).setCustomName(itemstack.getName()); + } + +- itemstack.a(1); ++ // itemstack.a(1); // Handled during event processing ++ // CraftBukkit end + return itemstack; + } + } diff --git a/nms-patches/DispenseBehaviorProjectile.patch b/nms-patches/DispenseBehaviorProjectile.patch new file mode 100644 index 0000000000..b4e7083b0f --- /dev/null +++ b/nms-patches/DispenseBehaviorProjectile.patch @@ -0,0 +1,54 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/DispenseBehaviorProjectile.java 2014-11-27 08:59:46.645422093 +1100 ++++ src/main/java/net/minecraft/server/DispenseBehaviorProjectile.java 2014-11-27 08:42:10.152850911 +1100 +@@ -1,5 +1,10 @@ + package net.minecraft.server; + ++// CraftBukkit start ++import org.bukkit.craftbukkit.inventory.CraftItemStack; ++import org.bukkit.event.block.BlockDispenseEvent; ++// CraftBukkit end ++ + public abstract class DispenseBehaviorProjectile extends DispenseBehaviorItem { + + public DispenseBehaviorProjectile() {} +@@ -10,9 +15,38 @@ + EnumDirection enumdirection = BlockDispenser.b(isourceblock.f()); + IProjectile iprojectile = this.a(world, iposition); + +- iprojectile.shoot((double) enumdirection.getAdjacentX(), (double) ((float) enumdirection.getAdjacentY() + 0.1F), (double) enumdirection.getAdjacentZ(), this.b(), this.a()); ++ // iprojectile.shoot((double) enumdirection.getAdjacentX(), (double) ((float) enumdirection.getAdjacentY() + 0.1F), (double) enumdirection.getAdjacentZ(), this.b(), this.a()); ++ // CraftBukkit start ++ ItemStack itemstack1 = itemstack.a(1); ++ org.bukkit.block.Block block = world.getWorld().getBlockAt(isourceblock.getBlockPosition().getX(), isourceblock.getBlockPosition().getY(), isourceblock.getBlockPosition().getZ()); ++ CraftItemStack craftItem = CraftItemStack.asCraftMirror(itemstack1); ++ ++ BlockDispenseEvent event = new BlockDispenseEvent(block, craftItem.clone(), new org.bukkit.util.Vector((double) enumdirection.getAdjacentX(), (double) ((float) enumdirection.getAdjacentY() + 0.1F), (double) enumdirection.getAdjacentZ())); ++ if (!BlockDispenser.eventFired) { ++ world.getServer().getPluginManager().callEvent(event); ++ } ++ ++ if (event.isCancelled()) { ++ itemstack.count++; ++ return itemstack; ++ } ++ ++ if (!event.getItem().equals(craftItem)) { ++ itemstack.count++; ++ // Chain to handler for new item ++ ItemStack eventStack = CraftItemStack.asNMSCopy(event.getItem()); ++ IDispenseBehavior idispensebehavior = (IDispenseBehavior) BlockDispenser.M.get(eventStack.getItem()); ++ if (idispensebehavior != IDispenseBehavior.a && idispensebehavior != this) { ++ idispensebehavior.a(isourceblock, eventStack); ++ return itemstack; ++ } ++ } ++ ++ iprojectile.shoot(event.getVelocity().getX(), event.getVelocity().getY(), event.getVelocity().getZ(), this.b(), this.a()); ++ ((Entity) iprojectile).projectileSource = new org.bukkit.craftbukkit.projectiles.CraftBlockProjectileSource((TileEntityDispenser) isourceblock.getTileEntity()); ++ // CraftBukkit end + world.addEntity((Entity) iprojectile); +- itemstack.a(1); ++ // itemstack.a(1); // CraftBukkit - Handled during event processing + return itemstack; + } + diff --git a/nms-patches/DispenseBehaviorTNT.patch b/nms-patches/DispenseBehaviorTNT.patch new file mode 100644 index 0000000000..1dd1d42c98 --- /dev/null +++ b/nms-patches/DispenseBehaviorTNT.patch @@ -0,0 +1,56 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/DispenseBehaviorTNT.java 2014-11-27 08:59:46.645422093 +1100 ++++ src/main/java/net/minecraft/server/DispenseBehaviorTNT.java 2014-11-27 08:42:10.140850934 +1100 +@@ -1,5 +1,10 @@ + package net.minecraft.server; + ++// CraftBukkit start ++import org.bukkit.craftbukkit.inventory.CraftItemStack; ++import org.bukkit.event.block.BlockDispenseEvent; ++// CraftBukkit end ++ + final class DispenseBehaviorTNT extends DispenseBehaviorItem { + + DispenseBehaviorTNT() {} +@@ -7,11 +12,40 @@ + protected ItemStack b(ISourceBlock isourceblock, ItemStack itemstack) { + World world = isourceblock.i(); + BlockPosition blockposition = isourceblock.getBlockPosition().shift(BlockDispenser.b(isourceblock.f())); +- EntityTNTPrimed entitytntprimed = new EntityTNTPrimed(world, (double) blockposition.getX() + 0.5D, (double) blockposition.getY(), (double) blockposition.getZ() + 0.5D, (EntityLiving) null); ++ // EntityTNTPrimed entitytntprimed = new EntityTNTPrimed(world, (double) blockposition.getX() + 0.5D, (double) blockposition.getY(), (double) blockposition.getZ() + 0.5D, (EntityLiving) null); ++ ++ // CraftBukkit start ++ ItemStack itemstack1 = itemstack.a(1); ++ org.bukkit.block.Block block = world.getWorld().getBlockAt(isourceblock.getBlockPosition().getX(), isourceblock.getBlockPosition().getY(), isourceblock.getBlockPosition().getZ()); ++ CraftItemStack craftItem = CraftItemStack.asCraftMirror(itemstack1); ++ ++ BlockDispenseEvent event = new BlockDispenseEvent(block, craftItem.clone(), new org.bukkit.util.Vector(blockposition.getX() + 0.5, blockposition.getY() + 0.5, blockposition.getZ() + 0.5)); ++ if (!BlockDispenser.eventFired) { ++ world.getServer().getPluginManager().callEvent(event); ++ } ++ ++ if (event.isCancelled()) { ++ itemstack.count++; ++ return itemstack; ++ } ++ ++ if (!event.getItem().equals(craftItem)) { ++ itemstack.count++; ++ // Chain to handler for new item ++ ItemStack eventStack = CraftItemStack.asNMSCopy(event.getItem()); ++ IDispenseBehavior idispensebehavior = (IDispenseBehavior) BlockDispenser.M.get(eventStack.getItem()); ++ if (idispensebehavior != IDispenseBehavior.a && idispensebehavior != this) { ++ idispensebehavior.a(isourceblock, eventStack); ++ return itemstack; ++ } ++ } ++ ++ EntityTNTPrimed entitytntprimed = new EntityTNTPrimed(world, event.getVelocity().getX(), event.getVelocity().getY(), event.getVelocity().getZ(), (EntityLiving) null); ++ // CraftBukkit end + + world.addEntity(entitytntprimed); + world.makeSound(entitytntprimed, "game.tnt.primed", 1.0F, 1.0F); +- --itemstack.count; ++ // --itemstack.count; // CraftBukkit - handled above + return itemstack; + } + } diff --git a/nms-patches/Enchantment.patch b/nms-patches/Enchantment.patch new file mode 100644 index 0000000000..8b09c515e4 --- /dev/null +++ b/nms-patches/Enchantment.patch @@ -0,0 +1,19 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/Enchantment.java 2014-11-27 08:59:46.649422075 +1100 ++++ src/main/java/net/minecraft/server/Enchantment.java 2014-11-27 08:42:10.096851020 +1100 +@@ -8,6 +8,7 @@ + + public abstract class Enchantment { + ++ // CraftBukkit - update CraftEnchant.getName(i) if this changes + private static final Enchantment[] byId = new Enchantment[256]; + public static final Enchantment[] b; + private static final Map E = Maps.newHashMap(); +@@ -55,6 +56,8 @@ + Enchantment.byId[i] = this; + Enchantment.E.put(minecraftkey, this); + } ++ ++ org.bukkit.enchantments.Enchantment.registerEnchantment(new org.bukkit.craftbukkit.enchantments.CraftEnchantment(this)); // CraftBukkit + } + + public static Enchantment getByName(String s) { diff --git a/nms-patches/Entity.patch b/nms-patches/Entity.patch new file mode 100644 index 0000000000..95a7509b2e --- /dev/null +++ b/nms-patches/Entity.patch @@ -0,0 +1,578 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/Entity.java 2014-11-27 08:59:46.697421864 +1100 ++++ src/main/java/net/minecraft/server/Entity.java 2014-11-27 08:42:10.176850864 +1100 +@@ -6,8 +6,40 @@ + import java.util.UUID; + import java.util.concurrent.Callable; + ++// CraftBukkit start ++import org.bukkit.Bukkit; ++import org.bukkit.Location; ++import org.bukkit.Server; ++import org.bukkit.TravelAgent; ++import org.bukkit.block.BlockFace; ++import org.bukkit.entity.Hanging; ++import org.bukkit.entity.LivingEntity; ++import org.bukkit.entity.Painting; ++import org.bukkit.entity.Vehicle; ++import org.bukkit.event.entity.EntityCombustByEntityEvent; ++import org.bukkit.event.hanging.HangingBreakByEntityEvent; ++import org.bukkit.event.painting.PaintingBreakByEntityEvent; ++import org.bukkit.event.vehicle.VehicleBlockCollisionEvent; ++import org.bukkit.event.vehicle.VehicleEnterEvent; ++import org.bukkit.event.vehicle.VehicleExitEvent; ++import org.bukkit.craftbukkit.CraftWorld; ++import org.bukkit.craftbukkit.entity.CraftEntity; ++import org.bukkit.craftbukkit.entity.CraftPlayer; ++import org.bukkit.craftbukkit.event.CraftEventFactory; ++import org.bukkit.event.entity.EntityCombustEvent; ++import org.bukkit.event.entity.EntityPortalEvent; ++import org.bukkit.plugin.PluginManager; ++// CraftBukkit end ++ + public abstract class Entity implements ICommandListener { + ++ // CraftBukkit start ++ private static final int CURRENT_LEVEL = 2; ++ static boolean isLevelAtLeast(NBTTagCompound tag, int level) { ++ return tag.hasKey("Bukkit.updateLevel") && tag.getInt("Bukkit.updateLevel") >= level; ++ } ++ // CraftBukikt end ++ + private static final AxisAlignedBB a = new AxisAlignedBB(0.0D, 0.0D, 0.0D, 0.0D, 0.0D, 0.0D); + private static int entityCount; + private int id; +@@ -77,6 +109,8 @@ + private boolean invulnerable; + public UUID uniqueID; + private final CommandObjectiveExecutor as; ++ public boolean valid; // CraftBukkit ++ public org.bukkit.projectiles.ProjectileSource projectileSource; // CraftBukkit - For projectiles only + + public int getId() { + return this.id; +@@ -150,6 +184,33 @@ + } + + protected void setYawPitch(float f, float f1) { ++ // CraftBukkit start - yaw was sometimes set to NaN, so we need to set it back to 0 ++ if (Float.isNaN(f)) { ++ f = 0; ++ } ++ ++ if (f == Float.POSITIVE_INFINITY || f == Float.NEGATIVE_INFINITY) { ++ if (this instanceof EntityPlayer) { ++ this.world.getServer().getLogger().warning(this.getName() + " was caught trying to crash the server with an invalid yaw"); ++ ((CraftPlayer) this.getBukkitEntity()).kickPlayer("Nope"); ++ } ++ f = 0; ++ } ++ ++ // pitch was sometimes set to NaN, so we need to set it back to 0 ++ if (Float.isNaN(f1)) { ++ f1 = 0; ++ } ++ ++ if (f1 == Float.POSITIVE_INFINITY || f1 == Float.NEGATIVE_INFINITY) { ++ if (this instanceof EntityPlayer) { ++ this.world.getServer().getLogger().warning(this.getName() + " was caught trying to crash the server with an invalid pitch"); ++ ((CraftPlayer) this.getBukkitEntity()).kickPlayer("Nope"); ++ } ++ f1 = 0; ++ } ++ // CraftBukkit end ++ + this.yaw = f % 360.0F; + this.pitch = f1 % 360.0F; + } +@@ -186,7 +247,7 @@ + int i = this.L(); + + if (this.ak) { +- if (minecraftserver.getAllowNether()) { ++ if (true || minecraftserver.getAllowNether()) { // CraftBukkit + if (this.vehicle == null && this.al++ >= i) { + this.al = i; + this.portalCooldown = this.ar(); +@@ -263,6 +324,27 @@ + protected void burnFromLava() { + if (!this.fireProof) { + this.damageEntity(DamageSource.LAVA, 4.0F); ++ ++ // CraftBukkit start - Fallen in lava TODO: this event spams! ++ if (this instanceof EntityLiving) { ++ if (fireTicks <= 0) { ++ // not on fire yet ++ // TODO: shouldn't be sending null for the block ++ org.bukkit.block.Block damager = null; // ((WorldServer) this.l).getWorld().getBlockAt(i, j, k); ++ org.bukkit.entity.Entity damagee = this.getBukkitEntity(); ++ EntityCombustEvent combustEvent = new org.bukkit.event.entity.EntityCombustByBlockEvent(damager, damagee, 15); ++ this.world.getServer().getPluginManager().callEvent(combustEvent); ++ ++ if (!combustEvent.isCancelled()) { ++ this.setOnFire(combustEvent.getDuration()); ++ } ++ } else { ++ // This will be called every single tick the entity is in lava, so don't throw an event ++ this.setOnFire(15); ++ } ++ return; ++ } ++ // CraftBukkit end - we also don't throw an event unless the object in lava is living, to save on some event calls + this.setOnFire(15); + } + } +@@ -300,6 +382,22 @@ + this.a(this.getBoundingBox().c(d0, d1, d2)); + this.recalcPosition(); + } else { ++ // CraftBukkit start - Don't do anything if we aren't moving ++ // We need to do this regardless of whether or not we are moving thanks to portals ++ try { ++ this.checkBlockCollisions(); ++ } catch (Throwable throwable) { ++ CrashReport crashreport = CrashReport.a(throwable, "Checking entity block collision"); ++ CrashReportSystemDetails crashreportsystemdetails = crashreport.a("Entity being checked for collision"); ++ ++ this.appendEntityCrashDetails(crashreportsystemdetails); ++ throw new ReportedException(crashreport); ++ } ++ // Check if we're moving ++ if (d0 == 0 && d1 == 0 && d2 == 0 && this.vehicle == null && this.passenger == null) { ++ return; ++ } ++ // CraftBukkit end + this.world.methodProfiler.a("move"); + double d3 = this.locX; + double d4 = this.locY; +@@ -520,6 +618,28 @@ + block.a(this.world, this); + } + ++ // CraftBukkit start ++ if (positionChanged && getBukkitEntity() instanceof Vehicle) { ++ Vehicle vehicle = (Vehicle) this.getBukkitEntity(); ++ org.bukkit.block.Block bl = this.world.getWorld().getBlockAt(MathHelper.floor(this.locX), MathHelper.floor(this.locY - (double) this.getHeadHeight()), MathHelper.floor(this.locZ)); ++ ++ // PAIL: using local vars may break between updates, name them above? ++ ++ if (d6 > d0) { ++ bl = bl.getRelative(BlockFace.EAST); ++ } else if (d6 < d0) { ++ bl = bl.getRelative(BlockFace.WEST); ++ } else if (d8 > d2) { ++ bl = bl.getRelative(BlockFace.SOUTH); ++ } else if (d8 < d2) { ++ bl = bl.getRelative(BlockFace.NORTH); ++ } ++ ++ VehicleBlockCollisionEvent event = new VehicleBlockCollisionEvent(vehicle, bl); ++ world.getServer().getPluginManager().callEvent(event); ++ } ++ // CraftBukkit end ++ + if (this.r_() && !flag && this.vehicle == null) { + double d21 = this.locX - d3; + double d22 = this.locY - d4; +@@ -530,7 +650,7 @@ + } + + if (block != null && this.onGround) { +- block.a(this.world, blockposition, this); ++ // block.a(this.world, blockposition, this); // CraftBukkit removed down + } + + this.M = (float) ((double) this.M + (double) MathHelper.sqrt(d21 * d21 + d23 * d23) * 0.6D); +@@ -548,9 +668,12 @@ + } + + this.a(blockposition, block); ++ block.a(this.world, blockposition, this); // CraftBukkit - moved from above + } + } + ++ // CraftBukkit start - Move to the top of the method ++ /* + try { + this.checkBlockCollisions(); + } catch (Throwable throwable) { +@@ -560,6 +683,8 @@ + this.appendEntityCrashDetails(crashreportsystemdetails); + throw new ReportedException(crashreport); + } ++ */ ++ // CraftBukkit end + + boolean flag2 = this.U(); + +@@ -567,7 +692,16 @@ + this.burn(1); + if (!flag2) { + ++this.fireTicks; +- if (this.fireTicks == 0) { ++ // CraftBukkit start - Not on fire yet ++ if (this.fireTicks <= 0) { // Only throw events on the first combust, otherwise it spams ++ EntityCombustEvent event = new EntityCombustEvent(getBukkitEntity(), 8); ++ world.getServer().getPluginManager().callEvent(event); ++ ++ if (!event.isCancelled()) { ++ setOnFire(event.getDuration()); ++ } ++ } else { ++ // CraftBukkit end + this.setOnFire(8); + } + } +@@ -673,7 +807,7 @@ + return null; + } + +- protected void burn(int i) { ++ protected void burn(float i) { // CraftBukkit - int -> float + if (!this.fireProof) { + this.damageEntity(DamageSource.FIRE, (float) i); + } +@@ -823,6 +957,13 @@ + } + + public void spawnIn(World world) { ++ // CraftBukkit start ++ if (world == null) { ++ die(); ++ this.world = ((CraftWorld) Bukkit.getServer().getWorlds().get(0)).getHandle(); ++ return; ++ } ++ // CraftBukkit end + this.world = world; + } + +@@ -1015,6 +1156,18 @@ + try { + nbttagcompound.set("Pos", this.a(new double[] { this.locX, this.locY, this.locZ})); + nbttagcompound.set("Motion", this.a(new double[] { this.motX, this.motY, this.motZ})); ++ ++ // CraftBukkit start - Checking for NaN pitch/yaw and resetting to zero ++ // TODO: make sure this is the best way to address this. ++ if (Float.isNaN(this.yaw)) { ++ this.yaw = 0; ++ } ++ ++ if (Float.isNaN(this.pitch)) { ++ this.pitch = 0; ++ } ++ // CraftBukkit end ++ + nbttagcompound.set("Rotation", this.a(new float[] { this.yaw, this.pitch})); + nbttagcompound.setFloat("FallDistance", this.fallDistance); + nbttagcompound.setShort("Fire", (short) this.fireTicks); +@@ -1025,6 +1178,11 @@ + nbttagcompound.setInt("PortalCooldown", this.portalCooldown); + nbttagcompound.setLong("UUIDMost", this.getUniqueID().getMostSignificantBits()); + nbttagcompound.setLong("UUIDLeast", this.getUniqueID().getLeastSignificantBits()); ++ // CraftBukkit start ++ nbttagcompound.setLong("WorldUUIDLeast", this.world.getDataManager().getUUID().getLeastSignificantBits()); ++ nbttagcompound.setLong("WorldUUIDMost", this.world.getDataManager().getUUID().getMostSignificantBits()); ++ nbttagcompound.setInt("Bukkit.updateLevel", CURRENT_LEVEL); ++ // CraftBukkit end + if (this.getCustomName() != null && this.getCustomName().length() > 0) { + nbttagcompound.setString("CustomName", this.getCustomName()); + nbttagcompound.setBoolean("CustomNameVisible", this.getCustomNameVisible()); +@@ -1062,6 +1220,7 @@ + this.motX = nbttaglist1.d(0); + this.motY = nbttaglist1.d(1); + this.motZ = nbttaglist1.d(2); ++ /* CraftBukkit start - Moved section down + if (Math.abs(this.motX) > 10.0D) { + this.motX = 0.0D; + } +@@ -1073,6 +1232,7 @@ + if (Math.abs(this.motZ) > 10.0D) { + this.motZ = 0.0D; + } ++ // CraftBukkit end */ + + this.lastX = this.P = this.locX = nbttaglist.d(0); + this.lastY = this.Q = this.locY = nbttaglist.d(1); +@@ -1105,7 +1265,57 @@ + if (this.af()) { + this.setPosition(this.locX, this.locY, this.locZ); + } ++ // CraftBukkit start ++ if (this instanceof EntityLiving) { ++ EntityLiving entity = (EntityLiving) this; ++ ++ // Reset the persistence for tamed animals ++ if (entity instanceof EntityTameableAnimal && !isLevelAtLeast(nbttagcompound, 2) && !nbttagcompound.getBoolean("PersistenceRequired")) { ++ EntityInsentient entityinsentient = (EntityInsentient) entity; ++ entityinsentient.persistent = !entityinsentient.isTypeNotPersistent(); ++ } ++ } ++ // CraftBukkit end ++ ++ // CraftBukkit start - Exempt Vehicles from notch's sanity check ++ if (!(getBukkitEntity() instanceof Vehicle)) { ++ if (Math.abs(this.motX) > 10.0D) { ++ this.motX = 0.0D; ++ } ++ ++ if (Math.abs(this.motY) > 10.0D) { ++ this.motY = 0.0D; ++ } ++ ++ if (Math.abs(this.motZ) > 10.0D) { ++ this.motZ = 0.0D; ++ } ++ } ++ // CraftBukkit end ++ ++ // CraftBukkit start - Reset world ++ if (this instanceof EntityPlayer) { ++ Server server = Bukkit.getServer(); ++ org.bukkit.World bworld = null; + ++ // TODO: Remove World related checks, replaced with WorldUID ++ String worldName = nbttagcompound.getString("world"); ++ ++ if (nbttagcompound.hasKey("WorldUUIDMost") && nbttagcompound.hasKey("WorldUUIDLeast")) { ++ UUID uid = new UUID(nbttagcompound.getLong("WorldUUIDMost"), nbttagcompound.getLong("WorldUUIDLeast")); ++ bworld = server.getWorld(uid); ++ } else { ++ bworld = server.getWorld(worldName); ++ } ++ ++ if (bworld == null) { ++ EntityPlayer entityPlayer = (EntityPlayer) this; ++ bworld = ((org.bukkit.craftbukkit.CraftServer) server).getServer().getWorldServer(entityPlayer.dimension).getWorld(); ++ } ++ ++ spawnIn(bworld == null? null : ((CraftWorld) bworld).getHandle()); ++ } ++ // CraftBukkit end + } catch (Throwable throwable) { + CrashReport crashreport = CrashReport.a(throwable, "Loading entity NBT"); + CrashReportSystemDetails crashreportsystemdetails = crashreport.a("Entity being loaded"); +@@ -1167,6 +1377,12 @@ + + public EntityItem a(ItemStack itemstack, float f) { + if (itemstack.count != 0 && itemstack.getItem() != null) { ++ // CraftBukkit start - Capture drops for death event ++ if (this instanceof EntityLiving && ((EntityLiving) this).drops != null) { ++ ((EntityLiving) this).drops.add(org.bukkit.craftbukkit.inventory.CraftItemStack.asBukkitCopy(itemstack)); ++ return null; ++ } ++ // CraftBukkit end + EntityItem entityitem = new EntityItem(this.world, this.locX, this.locY + (double) f, this.locZ, itemstack); + + entityitem.p(); +@@ -1276,16 +1492,76 @@ + } + + public void mount(Entity entity) { ++ // CraftBukkit start ++ setPassengerOf(entity); ++ } ++ ++ protected CraftEntity bukkitEntity; ++ ++ public CraftEntity getBukkitEntity() { ++ if (bukkitEntity == null) { ++ bukkitEntity = CraftEntity.getEntity(world.getServer(), this); ++ } ++ return bukkitEntity; ++ } ++ ++ public void setPassengerOf(Entity entity) { ++ // b(null) doesn't really fly for overloaded methods, ++ // so this method is needed ++ ++ Entity originalVehicle = this.vehicle; ++ Entity originalPassenger = this.vehicle == null ? null : this.vehicle.passenger; ++ PluginManager pluginManager = Bukkit.getPluginManager(); ++ getBukkitEntity(); // make sure bukkitEntity is initialised ++ // CraftBukkit end + this.ap = 0.0D; + this.aq = 0.0D; + if (entity == null) { + if (this.vehicle != null) { ++ // CraftBukkit start ++ if ((this.bukkitEntity instanceof LivingEntity) && (this.vehicle.getBukkitEntity() instanceof Vehicle)) { ++ VehicleExitEvent event = new VehicleExitEvent((Vehicle) this.vehicle.getBukkitEntity(), (LivingEntity) this.bukkitEntity); ++ pluginManager.callEvent(event); ++ ++ if (event.isCancelled() || vehicle != originalVehicle) { ++ return; ++ } ++ } ++ // CraftBukkit end + this.setPositionRotation(this.vehicle.locX, this.vehicle.getBoundingBox().b + (double) this.vehicle.length, this.vehicle.locZ, this.yaw, this.pitch); + this.vehicle.passenger = null; + } + + this.vehicle = null; + } else { ++ // CraftBukkit start ++ if ((this.bukkitEntity instanceof LivingEntity) && (entity.getBukkitEntity() instanceof Vehicle) && entity.world.isChunkLoaded((int) entity.locX >> 4, (int) entity.locZ >> 4, true)) { ++ // It's possible to move from one vehicle to another. We need to check if they're already in a vehicle, and fire an exit event if they are. ++ VehicleExitEvent exitEvent = null; ++ if (this.vehicle != null && this.vehicle.getBukkitEntity() instanceof Vehicle) { ++ exitEvent = new VehicleExitEvent((Vehicle) this.vehicle.getBukkitEntity(), (LivingEntity) this.bukkitEntity); ++ pluginManager.callEvent(exitEvent); ++ ++ if (exitEvent.isCancelled() || this.vehicle != originalVehicle || (this.vehicle != null && this.vehicle.passenger != originalPassenger)) { ++ return; ++ } ++ } ++ ++ VehicleEnterEvent event = new VehicleEnterEvent((Vehicle) entity.getBukkitEntity(), this.bukkitEntity); ++ pluginManager.callEvent(event); ++ ++ // If a plugin messes with the vehicle or the vehicle's passenger ++ if (event.isCancelled() || this.vehicle != originalVehicle || (this.vehicle != null && this.vehicle.passenger != originalPassenger)) { ++ // If we only cancelled the enterevent then we need to put the player in a decent position. ++ if (exitEvent != null && this.vehicle == originalVehicle && this.vehicle != null && this.vehicle.passenger == originalPassenger) { ++ this.setPositionRotation(this.vehicle.locX, this.vehicle.boundingBox.b + (double) this.vehicle.length, this.vehicle.locZ, this.yaw, this.pitch); ++ this.vehicle.passenger = null; ++ this.vehicle = null; ++ } ++ return; ++ } ++ } ++ // CraftBukkit end + if (this.vehicle != null) { + this.vehicle.passenger = null; + } +@@ -1406,10 +1682,50 @@ + } + + public void onLightningStrike(EntityLightning entitylightning) { +- this.damageEntity(DamageSource.LIGHTNING, 5.0F); ++ // CraftBukkit start ++ final org.bukkit.entity.Entity thisBukkitEntity = this.getBukkitEntity(); ++ final org.bukkit.entity.Entity stormBukkitEntity = entitylightning.getBukkitEntity(); ++ final PluginManager pluginManager = Bukkit.getPluginManager(); ++ ++ if (thisBukkitEntity instanceof Hanging) { ++ HangingBreakByEntityEvent hangingEvent = new HangingBreakByEntityEvent((Hanging) thisBukkitEntity, stormBukkitEntity); ++ PaintingBreakByEntityEvent paintingEvent = null; ++ ++ if (thisBukkitEntity instanceof Painting) { ++ paintingEvent = new PaintingBreakByEntityEvent((Painting) thisBukkitEntity, stormBukkitEntity); ++ } ++ ++ pluginManager.callEvent(hangingEvent); ++ ++ if (paintingEvent != null) { ++ paintingEvent.setCancelled(hangingEvent.isCancelled()); ++ pluginManager.callEvent(paintingEvent); ++ } ++ ++ if (hangingEvent.isCancelled() || (paintingEvent != null && paintingEvent.isCancelled())) { ++ return; ++ } ++ } ++ ++ if (this.fireProof) { ++ return; ++ } ++ CraftEventFactory.entityDamage = entitylightning; ++ if (!this.damageEntity(DamageSource.LIGHTNING, 5.0F)) { ++ CraftEventFactory.entityDamage = null; ++ return; ++ } ++ // CraftBukkit end + ++this.fireTicks; + if (this.fireTicks == 0) { + this.setOnFire(8); ++ // CraftBukkit start - Call a combust event when lightning strikes ++ EntityCombustByEntityEvent entityCombustEvent = new EntityCombustByEntityEvent(stormBukkitEntity, thisBukkitEntity, 8); ++ pluginManager.callEvent(entityCombustEvent); ++ if (!entityCombustEvent.isCancelled()) { ++ this.setOnFire(entityCombustEvent.getDuration()); ++ } ++ // CraftBukkit end + } + + } +@@ -1546,32 +1862,78 @@ + if (!this.world.isStatic && !this.dead) { + this.world.methodProfiler.a("changeDimension"); + MinecraftServer minecraftserver = MinecraftServer.getServer(); +- int j = this.dimension; +- WorldServer worldserver = minecraftserver.getWorldServer(j); +- WorldServer worldserver1 = minecraftserver.getWorldServer(i); ++ // CraftBukkit start - Move logic into new function "teleportToLocation" ++ // int j = this.dimension; ++ // WorldServer worldserver = minecraftserver.getWorldServer(j); ++ // WorldServer worldserver1 = minecraftserver.getWorldServer(i); ++ WorldServer exitWorld = null; ++ if (this.dimension < CraftWorld.CUSTOM_DIMENSION_OFFSET) { // Plugins must specify exit from custom Bukkit worlds ++ // Only target existing worlds (compensate for allow-nether/allow-end as false) ++ for (WorldServer world : minecraftserver.worlds) { ++ if (world.dimension == i) { ++ exitWorld = world; ++ } ++ } ++ } ++ ++ Location enter = this.getBukkitEntity().getLocation(); ++ Location exit = exitWorld != null ? minecraftserver.getPlayerList().calculateTarget(enter, minecraftserver.getWorldServer(i)) : null; ++ boolean useTravelAgent = exitWorld != null && !(this.dimension == 1 && exitWorld.dimension == 1); // don't use agent for custom worlds or return from THE_END ++ ++ TravelAgent agent = exit != null ? (TravelAgent) ((CraftWorld) exit.getWorld()).getHandle().getTravelAgent() : org.bukkit.craftbukkit.CraftTravelAgent.DEFAULT; // return arbitrary TA to compensate for implementation dependent plugins ++ EntityPortalEvent event = new EntityPortalEvent(this.getBukkitEntity(), enter, exit, agent); ++ event.useTravelAgent(useTravelAgent); ++ event.getEntity().getServer().getPluginManager().callEvent(event); ++ if (event.isCancelled() || event.getTo() == null || event.getTo().getWorld() == null || !this.isAlive()) { ++ return; ++ } ++ exit = event.useTravelAgent() ? event.getPortalTravelAgent().findOrCreate(event.getTo()) : event.getTo(); ++ this.teleportTo(exit, true); ++ } ++ } ++ ++ public void teleportTo(Location exit, boolean portal) { ++ if (true) { ++ WorldServer worldserver = ((CraftWorld) getBukkitEntity().getLocation().getWorld()).getHandle(); ++ WorldServer worldserver1 = ((CraftWorld) exit.getWorld()).getHandle(); ++ int i = worldserver1.dimension; ++ // CraftBukkit end + + this.dimension = i; ++ /* CraftBukkit start - TODO: Check if we need this + if (j == 1 && i == 1) { + worldserver1 = minecraftserver.getWorldServer(0); + this.dimension = 0; + } ++ // CraftBukkit end */ + + this.world.kill(this); + this.dead = false; + this.world.methodProfiler.a("reposition"); +- minecraftserver.getPlayerList().changeWorld(this, j, worldserver, worldserver1); ++ // CraftBukkit start - Ensure chunks are loaded in case TravelAgent is not used which would initially cause chunks to load during find/create ++ // minecraftserver.getPlayerList().changeWorld(this, j, worldserver, worldserver1); ++ boolean before = worldserver1.chunkProviderServer.forceChunkLoad; ++ worldserver1.chunkProviderServer.forceChunkLoad = true; ++ worldserver1.getMinecraftServer().getPlayerList().repositionEntity(this, exit, portal); ++ worldserver1.chunkProviderServer.forceChunkLoad = before; ++ // CraftBukkit end + this.world.methodProfiler.c("reloading"); + Entity entity = EntityTypes.createEntityByName(EntityTypes.b(this), worldserver1); + + if (entity != null) { + entity.n(this); ++ /* CraftBukkit start - We need to do this... + if (j == 1 && i == 1) { + BlockPosition blockposition = this.world.r(worldserver1.getSpawn()); + + entity.setPositionRotation(blockposition, entity.yaw, entity.pitch); + } +- ++ // CraftBukkit end */ + worldserver1.addEntity(entity); ++ // CraftBukkit start - Forward the CraftEntity to the new entity ++ this.getBukkitEntity().setHandle(entity); ++ entity.bukkitEntity = this.getBukkitEntity(); ++ // CraftBukkit end + } + + this.dead = true; diff --git a/nms-patches/EntityAgeable.patch b/nms-patches/EntityAgeable.patch new file mode 100644 index 0000000000..f1fe109bca --- /dev/null +++ b/nms-patches/EntityAgeable.patch @@ -0,0 +1,48 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/EntityAgeable.java 2014-11-27 08:59:46.649422075 +1100 ++++ src/main/java/net/minecraft/server/EntityAgeable.java 2014-11-27 08:42:10.144850927 +1100 +@@ -7,6 +7,7 @@ + protected int c; + private float bk = -1.0F; + private float bl; ++ public boolean ageLocked = false; // CraftBukkit + + public EntityAgeable(World world) { + super(world); +@@ -27,14 +28,14 @@ + if (entityageable != null) { + entityageable.setAgeRaw(-24000); + entityageable.setPositionRotation(this.locX, this.locY, this.locZ, 0.0F, 0.0F); +- this.world.addEntity(entityageable); ++ this.world.addEntity(entityageable, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.SPAWNER_EGG); // CraftBukkit + if (itemstack.hasName()) { + entityageable.setCustomName(itemstack.getName()); + } + + if (!entityhuman.abilities.canInstantlyBuild) { + --itemstack.count; +- if (itemstack.count <= 0) { ++ if (itemstack.count == 0) { // CraftBukkit - allow less than 0 stacks as "infinite" + entityhuman.inventory.setItem(entityhuman.inventory.itemInHandIndex, (ItemStack) null); + } + } +@@ -99,17 +100,19 @@ + super.b(nbttagcompound); + nbttagcompound.setInt("Age", this.getAge()); + nbttagcompound.setInt("ForcedAge", this.b); ++ nbttagcompound.setBoolean("AgeLocked", this.ageLocked); // CraftBukkit + } + + public void a(NBTTagCompound nbttagcompound) { + super.a(nbttagcompound); + this.setAgeRaw(nbttagcompound.getInt("Age")); + this.b = nbttagcompound.getInt("ForcedAge"); ++ this.ageLocked = nbttagcompound.getBoolean("AgeLocked"); // CraftBukkit + } + + public void m() { + super.m(); +- if (this.world.isStatic) { ++ if (this.world.isStatic || ageLocked) { // CraftBukkit + if (this.c > 0) { + if (this.c % 4 == 0) { + this.world.addParticle(EnumParticle.VILLAGER_HAPPY, this.locX + (double) (this.random.nextFloat() * this.width * 2.0F) - (double) this.width, this.locY + 0.5D + (double) (this.random.nextFloat() * this.length), this.locZ + (double) (this.random.nextFloat() * this.width * 2.0F) - (double) this.width, 0.0D, 0.0D, 0.0D, new int[0]); diff --git a/nms-patches/EntityArrow.patch b/nms-patches/EntityArrow.patch new file mode 100644 index 0000000000..2912f97b01 --- /dev/null +++ b/nms-patches/EntityArrow.patch @@ -0,0 +1,106 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/EntityArrow.java 2014-11-27 08:59:46.653422058 +1100 ++++ src/main/java/net/minecraft/server/EntityArrow.java 2014-11-27 08:42:10.100851012 +1100 +@@ -2,6 +2,12 @@ + + import java.util.List; + ++// CraftBukkit start ++import org.bukkit.entity.LivingEntity; ++import org.bukkit.event.entity.EntityCombustByEntityEvent; ++import org.bukkit.event.player.PlayerPickupItemEvent; ++// CraftBukkit end ++ + public class EntityArrow extends Entity implements IProjectile { + + private int d = -1; +@@ -35,6 +41,7 @@ + super(world); + this.j = 10.0D; + this.shooter = entityliving; ++ this.projectileSource = (LivingEntity) entityliving.getBukkitEntity(); // CraftBukkit + if (entityliving instanceof EntityHuman) { + this.fromPlayer = 1; + } +@@ -62,6 +69,7 @@ + super(world); + this.j = 10.0D; + this.shooter = entityliving; ++ this.projectileSource = (LivingEntity) entityliving.getBukkitEntity(); // CraftBukkit + if (entityliving instanceof EntityHuman) { + this.fromPlayer = 1; + } +@@ -175,7 +183,7 @@ + MovingObjectPosition movingobjectposition1 = axisalignedbb1.a(vec3d, vec3d1); + + if (movingobjectposition1 != null) { +- double d1 = vec3d.f(movingobjectposition1.pos); ++ double d1 = vec3d.distanceSquared(movingobjectposition1.pos); // CraftBukkit + + if (d1 < d0 || d0 == 0.0D) { + entity = entity1; +@@ -202,6 +210,8 @@ + float f4; + + if (movingobjectposition != null) { ++ org.bukkit.craftbukkit.event.CraftEventFactory.callProjectileHitEvent(this); // CraftBukkit - Call event ++ + if (movingobjectposition.entity != null) { + f2 = MathHelper.sqrt(this.motX * this.motX + this.motY * this.motY + this.motZ * this.motZ); + int k = MathHelper.f((double) f2 * this.damage); +@@ -217,12 +227,20 @@ + } else { + damagesource = DamageSource.arrow(this, this.shooter); + } ++ ++ // CraftBukkit start - Moved damage call ++ if (movingobjectposition.entity.damageEntity(damagesource, (float) k)) { ++ 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); + +- if (this.isBurning() && !(movingobjectposition.entity instanceof EntityEnderman)) { +- movingobjectposition.entity.setOnFire(5); ++ if (!combustEvent.isCancelled()) { ++ movingobjectposition.entity.setOnFire(combustEvent.getDuration()); ++ } ++ // CraftBukkit end + } + +- if (movingobjectposition.entity.damageEntity(damagesource, (float) k)) { ++ // if (movingobjectposition.entity.damageEntity(damagesource, (float) k)) { // CraftBukkit - moved up + if (movingobjectposition.entity instanceof EntityLiving) { + EntityLiving entityliving = (EntityLiving) movingobjectposition.entity; + +@@ -382,6 +400,21 @@ + + public void d(EntityHuman entityhuman) { + if (!this.world.isStatic && this.inGround && this.shake <= 0) { ++ // CraftBukkit start ++ ItemStack itemstack = new ItemStack(Items.ARROW); ++ if (this.fromPlayer == 1 && entityhuman.inventory.canHold(itemstack) > 0) { ++ EntityItem item = new EntityItem(this.world, this.locX, this.locY, this.locZ, itemstack); ++ ++ PlayerPickupItemEvent event = new PlayerPickupItemEvent((org.bukkit.entity.Player) entityhuman.getBukkitEntity(), new org.bukkit.craftbukkit.entity.CraftItem(this.world.getServer(), this, item), 0); ++ // event.setCancelled(!entityhuman.canPickUpLoot); TODO ++ this.world.getServer().getPluginManager().callEvent(event); ++ ++ if (event.isCancelled()) { ++ return; ++ } ++ } ++ // CraftBukkit end ++ + boolean flag = this.fromPlayer == 1 || this.fromPlayer == 2 && entityhuman.abilities.canInstantlyBuild; + + if (this.fromPlayer == 1 && !entityhuman.inventory.pickup(new ItemStack(Items.ARROW, 1))) { +@@ -433,4 +466,10 @@ + + return (b0 & 1) != 0; + } ++ ++ // CraftBukkit start ++ public boolean isInGround() { ++ return inGround; ++ } ++ // CraftBukkit end + } diff --git a/nms-patches/EntityBoat.patch b/nms-patches/EntityBoat.patch new file mode 100644 index 0000000000..6ab202bf16 --- /dev/null +++ b/nms-patches/EntityBoat.patch @@ -0,0 +1,249 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/EntityBoat.java 2014-11-27 08:59:46.653422058 +1100 ++++ src/main/java/net/minecraft/server/EntityBoat.java 2014-11-27 08:42:10.172850872 +1100 +@@ -2,6 +2,16 @@ + + import java.util.List; + ++// CraftBukkit start ++import org.bukkit.Location; ++import org.bukkit.craftbukkit.event.CraftEventFactory; ++import org.bukkit.entity.Vehicle; ++import org.bukkit.event.vehicle.VehicleDamageEvent; ++import org.bukkit.event.vehicle.VehicleDestroyEvent; ++import org.bukkit.event.vehicle.VehicleEntityCollisionEvent; ++import org.bukkit.event.vehicle.VehicleMoveEvent; ++// CraftBukkit end ++ + public class EntityBoat extends Entity { + + private boolean a; +@@ -12,6 +22,27 @@ + private double f; + private double g; + private double h; ++ ++ // CraftBukkit start ++ public double maxSpeed = 0.4D; ++ public double occupiedDeceleration = 0.2D; ++ public double unoccupiedDeceleration = -1; ++ public boolean landBoats = false; ++ ++ @Override ++ public void collide(Entity entity) { ++ org.bukkit.entity.Entity hitEntity = (entity == null) ? null : entity.getBukkitEntity(); ++ ++ VehicleEntityCollisionEvent event = new VehicleEntityCollisionEvent((Vehicle) this.getBukkitEntity(), hitEntity); ++ this.world.getServer().getPluginManager().callEvent(event); ++ ++ if (event.isCancelled()) { ++ return; ++ } ++ ++ super.collide(entity); ++ } ++ // CraftBukkit end + + public EntityBoat(World world) { + super(world); +@@ -52,6 +83,8 @@ + this.lastX = d0; + this.lastY = d1; + this.lastZ = d2; ++ ++ this.world.getServer().getPluginManager().callEvent(new org.bukkit.event.vehicle.VehicleCreateEvent((Vehicle) this.getBukkitEntity())); // CraftBukkit + } + + public double an() { +@@ -65,6 +98,19 @@ + if (this.passenger != null && this.passenger == damagesource.getEntity() && damagesource instanceof EntityDamageSourceIndirect) { + return false; + } else { ++ // CraftBukkit start ++ Vehicle vehicle = (Vehicle) this.getBukkitEntity(); ++ org.bukkit.entity.Entity attacker = (damagesource.getEntity() == null) ? null : damagesource.getEntity().getBukkitEntity(); ++ ++ VehicleDamageEvent event = new VehicleDamageEvent(vehicle, attacker, (double) f); ++ this.world.getServer().getPluginManager().callEvent(event); ++ ++ if (event.isCancelled()) { ++ return true; ++ } ++ // f = event.getDamage(); // TODO Why don't we do this? ++ // CraftBukkit end ++ + this.b(-this.m()); + this.a(10); + this.setDamage(this.j() + f * 10.0F); +@@ -72,6 +118,15 @@ + boolean flag = damagesource.getEntity() instanceof EntityHuman && ((EntityHuman) damagesource.getEntity()).abilities.canInstantlyBuild; + + if (flag || this.j() > 40.0F) { ++ // CraftBukkit start ++ VehicleDestroyEvent destroyEvent = new VehicleDestroyEvent(vehicle, attacker); ++ this.world.getServer().getPluginManager().callEvent(destroyEvent); ++ ++ if (destroyEvent.isCancelled()) { ++ this.setDamage(40F); // Maximize damage so this doesn't get triggered again right away ++ return true; ++ } ++ // CraftBukkit end + if (this.passenger != null) { + this.passenger.mount(this); + } +@@ -95,6 +150,13 @@ + } + + public void s_() { ++ // CraftBukkit start ++ double prevX = this.locX; ++ double prevY = this.locY; ++ double prevZ = this.locZ; ++ float prevYaw = this.yaw; ++ float prevPitch = this.pitch; ++ // CraftBukkit end + super.s_(); + if (this.l() > 0) { + this.a(this.l() - 1); +@@ -196,6 +258,19 @@ + this.motX += -Math.sin((double) (f * 3.1415927F / 180.0F)) * this.b * (double) entityliving.aY * 0.05000000074505806D; + this.motZ += Math.cos((double) (f * 3.1415927F / 180.0F)) * this.b * (double) entityliving.aY * 0.05000000074505806D; + } ++ // CraftBukkit start - Support unoccupied deceleration ++ else if (unoccupiedDeceleration >= 0) { ++ this.motX *= unoccupiedDeceleration; ++ this.motZ *= unoccupiedDeceleration; ++ // Kill lingering speed ++ if (motX <= 0.00001) { ++ motX = 0; ++ } ++ if (motZ <= 0.00001) { ++ motZ = 0; ++ } ++ } ++ // CraftBukkit end + + d4 = Math.sqrt(this.motX * this.motX + this.motZ * this.motZ); + if (d4 > 0.35D) { +@@ -230,16 +305,26 @@ + Block block = this.world.getType(blockposition).getBlock(); + + if (block == Blocks.SNOW_LAYER) { ++ // CraftBukkit start ++ if (CraftEventFactory.callEntityChangeBlockEvent(this, l, j1, j, Blocks.AIR, 0).isCancelled()) { ++ continue; ++ } ++ // CraftBukkit end + this.world.setAir(blockposition); + this.positionChanged = false; + } else if (block == Blocks.WATERLILY) { ++ // CraftBukkit start ++ if (CraftEventFactory.callEntityChangeBlockEvent(this, l, j1, j, Blocks.AIR, 0).isCancelled()) { ++ continue; ++ } ++ // CraftBukkit end + this.world.setAir(blockposition, true); + this.positionChanged = false; + } + } + } + +- if (this.onGround) { ++ if (this.onGround && !this.landBoats) { // CraftBukkit + this.motX *= 0.5D; + this.motY *= 0.5D; + this.motZ *= 0.5D; +@@ -247,16 +332,23 @@ + + this.move(this.motX, this.motY, this.motZ); + if (this.positionChanged && d3 > 0.2D) { +- if (!this.world.isStatic && !this.dead) { +- this.die(); ++ if (!this.world.isStatic && !this.dead) { ++ // CraftBukkit start ++ Vehicle vehicle = (Vehicle) this.getBukkitEntity(); ++ VehicleDestroyEvent destroyEvent = new VehicleDestroyEvent(vehicle, null); ++ this.world.getServer().getPluginManager().callEvent(destroyEvent); ++ if (!destroyEvent.isCancelled()) { ++ this.die(); + +- for (k = 0; k < 3; ++k) { +- this.a(Item.getItemOf(Blocks.PLANKS), 1, 0.0F); +- } ++ for (k = 0; k < 3; ++k) { ++ this.a(Item.getItemOf(Blocks.PLANKS), 1, 0.0F); ++ } + +- for (k = 0; k < 2; ++k) { +- this.a(Items.STICK, 1, 0.0F); ++ for (k = 0; k < 2; ++k) { ++ this.a(Items.STICK, 1, 0.0F); ++ } + } ++ // CraftBukkit end + } + } else { + this.motX *= 0.9900000095367432D; +@@ -284,6 +376,23 @@ + + this.yaw = (float) ((double) this.yaw + d12); + this.setYawPitch(this.yaw, this.pitch); ++ ++ // CraftBukkit start ++ org.bukkit.Server server = this.world.getServer(); ++ org.bukkit.World bworld = this.world.getWorld(); ++ ++ Location from = new Location(bworld, prevX, prevY, prevZ, prevYaw, prevPitch); ++ Location to = new Location(bworld, this.locX, this.locY, this.locZ, this.yaw, this.pitch); ++ Vehicle vehicle = (Vehicle) this.getBukkitEntity(); ++ ++ server.getPluginManager().callEvent(new org.bukkit.event.vehicle.VehicleUpdateEvent(vehicle)); ++ ++ if (!from.equals(to)) { ++ VehicleMoveEvent event = new VehicleMoveEvent(vehicle, from, to); ++ server.getPluginManager().callEvent(event); ++ } ++ // CraftBukkit end ++ + if (!this.world.isStatic) { + List list = this.world.getEntities(this, this.getBoundingBox().grow(0.20000000298023224D, 0.0D, 0.20000000298023224D)); + +@@ -298,6 +407,7 @@ + } + + if (this.passenger != null && this.passenger.dead) { ++ this.passenger.vehicle = null; // CraftBukkit + this.passenger = null; + } + +@@ -335,17 +445,24 @@ + if (this.fallDistance > 3.0F) { + this.e(this.fallDistance, 1.0F); + if (!this.world.isStatic && !this.dead) { +- this.die(); ++ // CraftBukkit start ++ Vehicle vehicle = (Vehicle) this.getBukkitEntity(); ++ VehicleDestroyEvent destroyEvent = new VehicleDestroyEvent(vehicle, null); ++ this.world.getServer().getPluginManager().callEvent(destroyEvent); ++ if (!destroyEvent.isCancelled()) { ++ this.die(); + +- int i; ++ int i; + +- for (i = 0; i < 3; ++i) { +- this.a(Item.getItemOf(Blocks.PLANKS), 1, 0.0F); +- } ++ for (i = 0; i < 3; ++i) { ++ this.a(Item.getItemOf(Blocks.PLANKS), 1, 0.0F); ++ } + +- for (i = 0; i < 2; ++i) { +- this.a(Items.STICK, 1, 0.0F); ++ for (i = 0; i < 2; ++i) { ++ this.a(Items.STICK, 1, 0.0F); ++ } + } ++ // CraftBukkit end + } + + this.fallDistance = 0.0F; diff --git a/nms-patches/EntityChicken.patch b/nms-patches/EntityChicken.patch new file mode 100644 index 0000000000..07602829a1 --- /dev/null +++ b/nms-patches/EntityChicken.patch @@ -0,0 +1,14 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/EntityChicken.java 2014-11-27 08:59:46.657422040 +1100 ++++ src/main/java/net/minecraft/server/EntityChicken.java 2014-11-27 08:42:10.104851005 +1100 +@@ -35,6 +35,11 @@ + } + + public void m() { ++ // CraftBukkit start ++ if (this.isChickenJockey()) { ++ this.persistent = !this.isTypeNotPersistent(); ++ } ++ // CraftBukkit end + super.m(); + this.bo = this.bk; + this.bn = this.bm; diff --git a/nms-patches/EntityCow.patch b/nms-patches/EntityCow.patch new file mode 100644 index 0000000000..c8aafbcc62 --- /dev/null +++ b/nms-patches/EntityCow.patch @@ -0,0 +1,42 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/EntityCow.java 2014-11-27 08:59:46.657422040 +1100 ++++ src/main/java/net/minecraft/server/EntityCow.java 2014-11-27 08:42:10.168850880 +1100 +@@ -1,5 +1,10 @@ + package net.minecraft.server; + ++// CraftBukkit start ++import org.bukkit.craftbukkit.event.CraftEventFactory; ++import org.bukkit.craftbukkit.inventory.CraftItemStack; ++// CraftBukkit end ++ + public class EntityCow extends EntityAnimal { + + public EntityCow(World world) { +@@ -69,13 +74,23 @@ + + public boolean a(EntityHuman entityhuman) { + ItemStack itemstack = entityhuman.inventory.getItemInHand(); +- ++ + if (itemstack != null && itemstack.getItem() == Items.BUCKET && !entityhuman.abilities.canInstantlyBuild) { +- if (itemstack.count-- == 1) { +- entityhuman.inventory.setItem(entityhuman.inventory.itemInHandIndex, new ItemStack(Items.MILK_BUCKET)); +- } else if (!entityhuman.inventory.pickup(new ItemStack(Items.MILK_BUCKET))) { +- entityhuman.drop(new ItemStack(Items.MILK_BUCKET, 1, 0), false); ++ // CraftBukkit start - Got milk? ++ org.bukkit.Location loc = this.getBukkitEntity().getLocation(); ++ org.bukkit.event.player.PlayerBucketFillEvent event = CraftEventFactory.callPlayerBucketFillEvent(entityhuman, loc.getBlockX(), loc.getBlockY(), loc.getBlockZ(), null, itemstack, Items.MILK_BUCKET); ++ ++ if (event.isCancelled()) { ++ return false; ++ } ++ ++ ItemStack result = CraftItemStack.asNMSCopy(event.getItemStack()); ++ if (--itemstack.count <= 0) { ++ entityhuman.inventory.setItem(entityhuman.inventory.itemInHandIndex, result); ++ } else if (!entityhuman.inventory.pickup(result)) { ++ entityhuman.drop(result, false); + } ++ // CraftBukkit end + + return true; + } else { diff --git a/nms-patches/EntityCreature.patch b/nms-patches/EntityCreature.patch new file mode 100644 index 0000000000..f9d70d5e81 --- /dev/null +++ b/nms-patches/EntityCreature.patch @@ -0,0 +1,31 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/EntityCreature.java 2014-11-27 08:59:46.657422040 +1100 ++++ src/main/java/net/minecraft/server/EntityCreature.java 2014-11-27 08:42:10.172850872 +1100 +@@ -2,6 +2,12 @@ + + import java.util.UUID; + ++// CraftBukkit start ++import org.bukkit.craftbukkit.entity.CraftEntity; ++import org.bukkit.event.entity.EntityTargetEvent; ++import org.bukkit.event.entity.EntityUnleashEvent; ++// CraftBukkit end ++ + public abstract class EntityCreature extends EntityInsentient { + + public static final UUID bi = UUID.fromString("E199AD21-BA8A-4C53-8D13-6182D5C69D3A"); +@@ -69,6 +75,7 @@ + + if (this instanceof EntityTameableAnimal && ((EntityTameableAnimal) this).isSitting()) { + if (f > 10.0F) { ++ this.world.getServer().getPluginManager().callEvent(new EntityUnleashEvent(this.getBukkitEntity(), EntityUnleashEvent.UnleashReason.DISTANCE)); // CraftBukkit + this.unleash(true, true); + } + +@@ -100,6 +107,7 @@ + } + + if (f > 10.0F) { ++ this.world.getServer().getPluginManager().callEvent(new EntityUnleashEvent(this.getBukkitEntity(), EntityUnleashEvent.UnleashReason.DISTANCE)); // CraftBukkit + this.unleash(true, true); + } + } else if (!this.cb() && this.bk) { diff --git a/nms-patches/EntityCreeper.patch b/nms-patches/EntityCreeper.patch new file mode 100644 index 0000000000..47e72258c9 --- /dev/null +++ b/nms-patches/EntityCreeper.patch @@ -0,0 +1,104 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/EntityCreeper.java 2014-11-27 08:59:46.661422023 +1100 ++++ src/main/java/net/minecraft/server/EntityCreeper.java 2014-11-27 08:42:10.168850880 +1100 +@@ -1,5 +1,10 @@ + package net.minecraft.server; + ++// CraftBukkit start ++import org.bukkit.craftbukkit.event.CraftEventFactory; ++import org.bukkit.event.entity.ExplosionPrimeEvent; ++// CraftBukkit end ++ + public class EntityCreeper extends EntityMonster { + + private int b; +@@ -7,6 +12,7 @@ + private int maxFuseTicks = 30; + private int explosionRadius = 3; + private int bm = 0; ++ private int record = -1; // CraftBukkit + + public EntityCreeper(World world) { + super(world); +@@ -111,19 +117,36 @@ + } + + public void die(DamageSource damagesource) { +- super.die(damagesource); ++ // super.die(damagesource); // CraftBukkit - Moved to end + if (damagesource.getEntity() instanceof EntitySkeleton) { + int i = Item.getId(Items.RECORD_13); + int j = Item.getId(Items.RECORD_WAIT); + int k = i + this.random.nextInt(j - i + 1); + +- this.a(Item.getById(k), 1); ++ // CraftBukkit start - Store record for now, drop in dropDeathLoot ++ // this.a(Item.getById(k), 1); ++ this.record = k; ++ // CraftBukkit end + } else if (damagesource.getEntity() instanceof EntityCreeper && damagesource.getEntity() != this && ((EntityCreeper) damagesource.getEntity()).isPowered() && ((EntityCreeper) damagesource.getEntity()).cn()) { + ((EntityCreeper) damagesource.getEntity()).co(); + this.a(new ItemStack(Items.SKULL, 1, 4), 0.0F); + } +- ++ ++ super.die(damagesource); // CraftBukkit - Moved from above ++ } ++ ++ // CraftBukkit start - Whole method ++ @Override ++ protected void dropDeathLoot(boolean flag, int i) { ++ super.dropDeathLoot(flag, i); ++ ++ // Drop a music disc? ++ if (this.record != -1) { ++ this.a(Item.getById(this.record), 1); ++ this.record = -1; ++ } + } ++ // CraftBukkit end + + public boolean r(Entity entity) { + return true; +@@ -147,7 +170,21 @@ + + public void onLightningStrike(EntityLightning entitylightning) { + super.onLightningStrike(entitylightning); +- this.datawatcher.watch(17, Byte.valueOf((byte) 1)); ++ // CraftBukkit start ++ if (CraftEventFactory.callCreeperPowerEvent(this, entitylightning, org.bukkit.event.entity.CreeperPowerEvent.PowerCause.LIGHTNING).isCancelled()) { ++ return; ++ } ++ ++ this.setPowered(true); ++ } ++ ++ public void setPowered(boolean powered) { ++ if (!powered) { ++ this.datawatcher.watch(17, Byte.valueOf((byte) 0)); ++ } else { ++ this.datawatcher.watch(17, Byte.valueOf((byte) 1)); ++ } ++ // CraftBukkit end + } + + protected boolean a(EntityHuman entityhuman) { +@@ -170,9 +207,16 @@ + if (!this.world.isStatic) { + boolean flag = this.world.getGameRules().getBoolean("mobGriefing"); + float f = this.isPowered() ? 2.0F : 1.0F; +- +- this.world.explode(this, this.locX, this.locY, this.locZ, (float) this.explosionRadius * f, flag); +- this.die(); ++ ++ ExplosionPrimeEvent event = new ExplosionPrimeEvent(this.getBukkitEntity(), this.explosionRadius * f, false); ++ this.world.getServer().getPluginManager().callEvent(event); ++ if (!event.isCancelled()) { ++ this.world.createExplosion(this, this.locX, this.locY, this.locZ, event.getRadius(), event.getFire(), flag); ++ this.die(); ++ } else { ++ fuseTicks = 0; ++ } ++ // CraftBukkit end + } + + } diff --git a/nms-patches/EntityDamageSourceIndirect.patch b/nms-patches/EntityDamageSourceIndirect.patch new file mode 100644 index 0000000000..efcfd591f6 --- /dev/null +++ b/nms-patches/EntityDamageSourceIndirect.patch @@ -0,0 +1,14 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/EntityDamageSourceIndirect.java 2014-11-27 08:59:46.661422023 +1100 ++++ src/main/java/net/minecraft/server/EntityDamageSourceIndirect.java 2014-11-27 08:42:10.164850887 +1100 +@@ -24,5 +24,11 @@ + String s1 = s + ".item"; + + return itemstack != null && itemstack.hasName() && LocaleI18n.c(s1) ? new ChatMessage(s1, new Object[] { entityliving.getScoreboardDisplayName(), ichatbasecomponent, itemstack.C()}) : new ChatMessage(s, new Object[] { entityliving.getScoreboardDisplayName(), ichatbasecomponent}); ++ } ++ ++ // CraftBukkit start ++ public Entity getProximateDamageSource() { ++ return super.getEntity(); + } ++ // CraftBukkit end + } diff --git a/nms-patches/EntityEgg.patch b/nms-patches/EntityEgg.patch new file mode 100644 index 0000000000..9b51e76638 --- /dev/null +++ b/nms-patches/EntityEgg.patch @@ -0,0 +1,65 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/EntityEgg.java 2014-11-27 08:59:46.665422005 +1100 ++++ src/main/java/net/minecraft/server/EntityEgg.java 2014-11-27 08:42:10.112850989 +1100 +@@ -1,5 +1,12 @@ + package net.minecraft.server; + ++// CraftBukkit start ++import org.bukkit.entity.Ageable; ++import org.bukkit.entity.EntityType; ++import org.bukkit.entity.Player; ++import org.bukkit.event.player.PlayerEggThrowEvent; ++// CraftBukkit end ++ + public class EntityEgg extends EntityProjectile { + + public EntityEgg(World world) { +@@ -19,21 +26,36 @@ + movingobjectposition.entity.damageEntity(DamageSource.projectile(this, this.getShooter()), 0.0F); + } + +- if (!this.world.isStatic && this.random.nextInt(8) == 0) { +- byte b0 = 1; ++ // CraftBukkit start - Fire PlayerEggThrowEvent ++ boolean hatching = !this.world.isStatic && this.random.nextInt(8) == 0; ++ int numHatching = (this.random.nextInt(32) == 0) ? 4 : 1; ++ if (!hatching) { ++ numHatching = 0; ++ } ++ ++ EntityType hatchingType = EntityType.CHICKEN; + +- if (this.random.nextInt(32) == 0) { +- b0 = 4; +- } +- +- for (int i = 0; i < b0; ++i) { +- EntityChicken entitychicken = new EntityChicken(this.world); +- +- entitychicken.setAgeRaw(-24000); +- entitychicken.setPositionRotation(this.locX, this.locY, this.locZ, this.yaw, 0.0F); +- this.world.addEntity(entitychicken); +- } ++ Entity shooter = this.getShooter(); ++ if (shooter instanceof EntityPlayer) { ++ Player player = (shooter == null) ? null : (Player) shooter.getBukkitEntity(); ++ ++ PlayerEggThrowEvent event = new PlayerEggThrowEvent(player, (org.bukkit.entity.Egg) this.getBukkitEntity(), hatching, (byte) numHatching, hatchingType); ++ this.world.getServer().getPluginManager().callEvent(event); ++ ++ hatching = event.isHatching(); ++ numHatching = event.getNumHatches(); ++ hatchingType = event.getHatchingType(); ++ } ++ ++ if (hatching) { ++ for (int k = 0; k < numHatching; k++) { ++ org.bukkit.entity.Entity entity = world.getWorld().spawn(new org.bukkit.Location(world.getWorld(), this.locX, this.locY, this.locZ, this.yaw, 0.0F), hatchingType.getEntityClass(), org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.EGG); ++ if (entity instanceof Ageable) { ++ ((Ageable) entity).setBaby(); ++ } ++ } + } ++ // CraftBukkit end + + double d0 = 0.08D; + diff --git a/nms-patches/EntityEnderCrystal.patch b/nms-patches/EntityEnderCrystal.patch new file mode 100644 index 0000000000..0bf41baa2f --- /dev/null +++ b/nms-patches/EntityEnderCrystal.patch @@ -0,0 +1,43 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/EntityEnderCrystal.java 2014-11-27 08:59:46.665422005 +1100 ++++ src/main/java/net/minecraft/server/EntityEnderCrystal.java 2014-11-27 08:42:10.172850872 +1100 +@@ -1,5 +1,10 @@ + package net.minecraft.server; + ++// CraftBukkit start ++import org.bukkit.craftbukkit.event.CraftEventFactory; ++import org.bukkit.event.entity.ExplosionPrimeEvent; ++// CraftBukkit end ++ + public class EntityEnderCrystal extends Entity { + + public int a; +@@ -32,7 +37,11 @@ + int k = MathHelper.floor(this.locZ); + + if (this.world.worldProvider instanceof WorldProviderTheEnd && this.world.getType(new BlockPosition(i, j, k)).getBlock() != Blocks.FIRE) { +- this.world.setTypeUpdate(new BlockPosition(i, j, k), Blocks.FIRE.getBlockData()); ++ // CraftBukkit start ++ if (!CraftEventFactory.callBlockIgniteEvent(this.world, i, j, k, this).isCancelled()) { ++ this.world.setTypeUpdate(new BlockPosition(i, j, k), Blocks.FIRE.getBlockData()); ++ } ++ // CraftBukkit end + } + + } +@@ -54,7 +63,15 @@ + if (this.b <= 0) { + this.die(); + if (!this.world.isStatic) { +- this.world.explode((Entity) null, this.locX, this.locY, this.locZ, 6.0F, true); ++ // CraftBukkit start ++ ExplosionPrimeEvent event = new ExplosionPrimeEvent(this.getBukkitEntity(), 6.0F, false); ++ this.world.getServer().getPluginManager().callEvent(event); ++ if (event.isCancelled()) { ++ this.dead = false; ++ return false; ++ } ++ this.world.createExplosion(this, this.locX, this.locY, this.locZ, event.getRadius(), event.getFire(), true); ++ // CraftBukkit end + } + } + } diff --git a/nms-patches/EntityEnderDragon.patch b/nms-patches/EntityEnderDragon.patch new file mode 100644 index 0000000000..a58d2f8fc7 --- /dev/null +++ b/nms-patches/EntityEnderDragon.patch @@ -0,0 +1,330 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/EntityEnderDragon.java 2014-11-27 08:59:46.665422005 +1100 ++++ src/main/java/net/minecraft/server/EntityEnderDragon.java 2014-11-27 08:42:10.116850981 +1100 +@@ -5,6 +5,17 @@ + import java.util.Iterator; + import java.util.List; + ++// CraftBukkit start ++import org.bukkit.block.BlockState; ++import org.bukkit.craftbukkit.event.CraftEventFactory; ++import org.bukkit.craftbukkit.util.BlockStateListPopulator; ++import org.bukkit.event.entity.EntityCreatePortalEvent; ++import org.bukkit.event.entity.EntityExplodeEvent; ++import org.bukkit.event.entity.EntityRegainHealthEvent; ++import org.bukkit.event.entity.EntityTargetEvent; ++import org.bukkit.Bukkit; ++// CraftBukkit end ++ + public class EntityEnderDragon extends EntityInsentient implements IComplex, IMonster { + + public double a; +@@ -27,6 +38,7 @@ + private Entity by; + public int bw; + public EntityEnderCrystal bx; ++ private Explosion explosionSource = new Explosion(null, this, Double.NaN, Double.NaN, Double.NaN, Float.NaN, true, true); // CraftBukkit - reusable source for CraftTNTPrimed.getSource() + + public EntityEnderDragon(World world) { + super(world); +@@ -120,21 +132,21 @@ + + if (this.world.isStatic) { + if (this.ba > 0) { +- d3 = this.locX + (this.bb - this.locX) / (double) this.ba; +- d0 = this.locY + (this.bc - this.locY) / (double) this.ba; +- d1 = this.locZ + (this.bd - this.locZ) / (double) this.ba; +- d2 = MathHelper.g(this.be - (double) this.yaw); +- this.yaw = (float) ((double) this.yaw + d2 / (double) this.ba); ++ d0 = this.locX + (this.bb - this.locX) / (double) this.ba; ++ d1 = this.locY + (this.bc - this.locY) / (double) this.ba; ++ d2 = this.locZ + (this.bd - this.locZ) / (double) this.ba; ++ d3 = MathHelper.g(this.be - (double) this.yaw); ++ this.yaw = (float) ((double) this.yaw + d3 / (double) this.ba); + this.pitch = (float) ((double) this.pitch + (this.bf - (double) this.pitch) / (double) this.ba); + --this.ba; +- this.setPosition(d3, d0, d1); ++ this.setPosition(d0, d1, d2); + this.setYawPitch(this.yaw, this.pitch); + } + } else { +- d3 = this.a - this.locX; +- d0 = this.b - this.locY; +- d1 = this.c - this.locZ; +- d2 = d3 * d3 + d0 * d0 + d1 * d1; ++ d0 = this.a - this.locX; ++ d1 = this.b - this.locY; ++ d2 = this.c - this.locZ; ++ d3 = d0 * d0 + d1 * d1 + d2 * d2; + double d4; + + if (this.by != null) { +@@ -155,16 +167,16 @@ + this.c += this.random.nextGaussian() * 2.0D; + } + +- if (this.bu || d2 < 100.0D || d2 > 22500.0D || this.positionChanged || this.E) { ++ if (this.bu || d3 < 100.0D || d3 > 22500.0D || this.positionChanged || this.E) { + this.cd(); + } + +- d0 /= (double) MathHelper.sqrt(d3 * d3 + d1 * d1); ++ d1 /= (double) MathHelper.sqrt(d0 * d0 + d2 * d2); + f3 = 0.6F; +- d0 = MathHelper.a(d0, (double) (-f3), (double) f3); +- this.motY += d0 * 0.10000000149011612D; ++ d1 = MathHelper.a(d1, (double) (-f3), (double) f3); ++ this.motY += d1 * 0.10000000149011612D; + this.yaw = MathHelper.g(this.yaw); +- double d8 = 180.0D - Math.atan2(d3, d1) * 180.0D / 3.1415927410125732D; ++ double d8 = 180.0D - Math.atan2(d0, d2) * 180.0D / 3.1415927410125732D; + double d9 = MathHelper.g(d8 - (double) this.yaw); + + if (d9 > 50.0D) { +@@ -290,12 +302,21 @@ + if (this.bx != null) { + if (this.bx.dead) { + if (!this.world.isStatic) { ++ CraftEventFactory.entityDamage = this.bx; // CraftBukkit + this.a(this.bl, DamageSource.explosion((Explosion) null), 10.0F); ++ CraftEventFactory.entityDamage = null; // CraftBukkit + } + + this.bx = null; + } else if (this.ticksLived % 10 == 0 && this.getHealth() < this.getMaxHealth()) { +- this.setHealth(this.getHealth() + 1.0F); ++ // CraftBukkit start ++ EntityRegainHealthEvent event = new EntityRegainHealthEvent(this.getBukkitEntity(), 1.0D, EntityRegainHealthEvent.RegainReason.ENDER_CRYSTAL); ++ this.world.getServer().getPluginManager().callEvent(event); ++ ++ if (!event.isCancelled()) { ++ this.setHealth((float) (this.getHealth() + event.getAmount())); ++ } ++ // CraftBukkit end + } + } + +@@ -364,7 +385,19 @@ + } + + if (this.random.nextInt(2) == 0 && !arraylist.isEmpty()) { +- this.by = (Entity) arraylist.get(this.random.nextInt(arraylist.size())); ++ // CraftBukkit start ++ Entity target = (Entity) this.world.players.get(this.random.nextInt(this.world.players.size())); ++ EntityTargetEvent event = new EntityTargetEvent(this.getBukkitEntity(), target.getBukkitEntity(), EntityTargetEvent.TargetReason.RANDOM_TARGET); ++ this.world.getServer().getPluginManager().callEvent(event); ++ ++ if (!event.isCancelled()) { ++ if (event.getTarget() == null) { ++ this.by = null; ++ } else { ++ this.by = ((org.bukkit.craftbukkit.entity.CraftEntity) event.getTarget()).getHandle(); ++ } ++ } ++ // CraftBukkit end + } else { + boolean flag; + +@@ -399,6 +432,11 @@ + int j1 = MathHelper.floor(axisalignedbb.f); + boolean flag = false; + boolean flag1 = false; ++ ++ // CraftBukkit start - Create a list to hold all the destroyed blocks ++ List destroyedBlocks = new java.util.ArrayList(); ++ org.bukkit.craftbukkit.CraftWorld craftWorld = this.world.getWorld(); ++ // CraftBukkit end + + for (int k1 = i; k1 <= l; ++k1) { + for (int l1 = j; l1 <= i1; ++l1) { +@@ -407,7 +445,11 @@ + + if (block.getMaterial() != Material.AIR) { + if (block != Blocks.BARRIER && block != Blocks.OBSIDIAN && block != Blocks.END_STONE && block != Blocks.BEDROCK && block != Blocks.COMMAND_BLOCK && this.world.getGameRules().getBoolean("mobGriefing")) { +- flag1 = this.world.setAir(new BlockPosition(k1, l1, i2)) || flag1; ++ // CraftBukkit start - Add blocks to list rather than destroying them ++ // flag1 = this.world.setAir(new BlockPosition(k1, l1, i2)) || flag1; ++ flag1 = true; ++ destroyedBlocks.add(craftWorld.getBlockAt(k1, l1, i2)); ++ // CraftBukkit end + } else { + flag = true; + } +@@ -417,6 +459,40 @@ + } + + if (flag1) { ++ // CraftBukkit start - Set off an EntityExplodeEvent for the dragon exploding all these blocks ++ org.bukkit.entity.Entity bukkitEntity = this.getBukkitEntity(); ++ EntityExplodeEvent event = new EntityExplodeEvent(bukkitEntity, bukkitEntity.getLocation(), destroyedBlocks, 0F); ++ Bukkit.getPluginManager().callEvent(event); ++ if (event.isCancelled()) { ++ // This flag literally means 'Dragon hit something hard' (Obsidian, White Stone or Bedrock) and will cause the dragon to slow down. ++ // We should consider adding an event extension for it, or perhaps returning true if the event is cancelled. ++ return flag; ++ } else if (event.getYield() == 0F) { ++ // Yield zero ==> no drops ++ for (org.bukkit.block.Block block : event.blockList()) { ++ this.world.setAir(new BlockPosition(block.getX(), block.getY(), block.getZ())); ++ } ++ } else { ++ for (org.bukkit.block.Block block : event.blockList()) { ++ org.bukkit.Material blockId = block.getType(); ++ if (blockId == org.bukkit.Material.AIR) { ++ continue; ++ } ++ ++ int blockX = block.getX(); ++ int blockY = block.getY(); ++ int blockZ = block.getZ(); ++ ++ Block nmsBlock = org.bukkit.craftbukkit.util.CraftMagicNumbers.getBlock(blockId); ++ if (nmsBlock.a(explosionSource)) { ++ nmsBlock.dropNaturally(this.world, new BlockPosition(blockX, blockY, blockZ), nmsBlock.fromLegacyData(block.getData()), event.getYield(), 0); ++ } ++ nmsBlock.wasExploded(world, new BlockPosition(blockX, blockY, blockZ), explosionSource); ++ ++ this.world.setAir(new BlockPosition(blockX, blockY, blockZ)); ++ } ++ } ++ // CraftBukkit end + double d0 = axisalignedbb.a + (axisalignedbb.d - axisalignedbb.a) * (double) this.random.nextFloat(); + double d1 = axisalignedbb.b + (axisalignedbb.e - axisalignedbb.b) * (double) this.random.nextFloat(); + double d2 = axisalignedbb.c + (axisalignedbb.f - axisalignedbb.c) * (double) this.random.nextFloat(); +@@ -464,6 +540,7 @@ + } + + protected void aY() { ++ if (this.dead) return; // CraftBukkit - can't kill what's already dead + ++this.bw; + if (this.bw >= 180 && this.bw <= 200) { + float f = (this.random.nextFloat() - 0.5F) * 8.0F; +@@ -478,7 +555,7 @@ + + if (!this.world.isStatic) { + if (this.bw > 150 && this.bw % 5 == 0 && this.world.getGameRules().getBoolean("doMobLoot")) { +- i = 1000; ++ i = this.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) { + j = EntityExperienceOrb.getOrbValue(i); +@@ -488,14 +565,30 @@ + } + + if (this.bw == 1) { +- this.world.a(1018, new BlockPosition(this), 0); ++ // CraftBukkit start - Use relative location for far away sounds ++ // this.world.a(1018, new BlockPosition(this), 0); ++ int viewDistance = ((WorldServer) this.world).getServer().getViewDistance() * 16; ++ for (EntityPlayer player : (List) this.world.players) { ++ double deltaX = this.locX - player.locX; ++ double deltaZ = this.locZ - player.locZ; ++ double distanceSquared = deltaX * deltaX + deltaZ * deltaZ; ++ if (distanceSquared > viewDistance * viewDistance) { ++ double deltaLength = Math.sqrt(distanceSquared); ++ double relativeX = player.locX + (deltaX / deltaLength) * viewDistance; ++ double relativeZ = player.locZ + (deltaZ / deltaLength) * viewDistance; ++ player.playerConnection.sendPacket(new PacketPlayOutWorldEvent(1018, new BlockPosition((int) relativeX, (int) this.locY, (int) relativeZ), 0, true)); ++ } else { ++ player.playerConnection.sendPacket(new PacketPlayOutWorldEvent(1018, new BlockPosition((int) this.locX, (int) this.locY, (int) this.locZ), 0, true)); ++ } ++ } ++ // CraftBukkit end + } + } + + this.move(0.0D, 0.10000000149011612D, 0.0D); + this.aG = this.yaw += 20.0F; + if (this.bw == 200 && !this.world.isStatic) { +- i = 2000; ++ i = this.expToDrop - (10 * this.expToDrop / 12); // CraftBukkit - drop the remaining experience + + while (i > 0) { + j = EntityExperienceOrb.getOrbValue(i); +@@ -513,6 +606,9 @@ + boolean flag = true; + double d0 = 12.25D; + double d1 = 6.25D; ++ ++ // CraftBukkit start - Replace any "this.world" in the following with just "world"! ++ BlockStateListPopulator world = new BlockStateListPopulator(this.world.getWorld()); + + for (int i = -1; i <= 32; ++i) { + for (int j = -4; j <= 4; ++j) { +@@ -524,31 +620,51 @@ + + if (i < 0) { + if (d2 <= 6.25D) { +- this.world.setTypeUpdate(blockposition1, Blocks.BEDROCK.getBlockData()); ++ world.setTypeUpdate(blockposition1, Blocks.BEDROCK.getBlockData()); + } + } else if (i > 0) { +- this.world.setTypeUpdate(blockposition1, Blocks.AIR.getBlockData()); ++ world.setTypeUpdate(blockposition1, Blocks.AIR.getBlockData()); + } else if (d2 > 6.25D) { +- this.world.setTypeUpdate(blockposition1, Blocks.BEDROCK.getBlockData()); ++ world.setTypeUpdate(blockposition1, Blocks.BEDROCK.getBlockData()); + } else { +- this.world.setTypeUpdate(blockposition1, Blocks.END_PORTAL.getBlockData()); ++ world.setTypeUpdate(blockposition1, Blocks.END_PORTAL.getBlockData()); + } + } + } + } + } + +- this.world.setTypeUpdate(blockposition, Blocks.BEDROCK.getBlockData()); +- this.world.setTypeUpdate(blockposition.up(), Blocks.BEDROCK.getBlockData()); ++ world.setTypeUpdate(blockposition, Blocks.BEDROCK.getBlockData()); ++ world.setTypeUpdate(blockposition.up(), Blocks.BEDROCK.getBlockData()); + BlockPosition blockposition2 = blockposition.up(2); + +- this.world.setTypeUpdate(blockposition2, Blocks.BEDROCK.getBlockData()); +- this.world.setTypeUpdate(blockposition2.west(), Blocks.TORCH.getBlockData().set(BlockTorch.FACING, EnumDirection.EAST)); +- this.world.setTypeUpdate(blockposition2.east(), Blocks.TORCH.getBlockData().set(BlockTorch.FACING, EnumDirection.WEST)); +- this.world.setTypeUpdate(blockposition2.north(), Blocks.TORCH.getBlockData().set(BlockTorch.FACING, EnumDirection.SOUTH)); +- this.world.setTypeUpdate(blockposition2.south(), Blocks.TORCH.getBlockData().set(BlockTorch.FACING, EnumDirection.NORTH)); +- this.world.setTypeUpdate(blockposition.up(3), Blocks.BEDROCK.getBlockData()); +- this.world.setTypeUpdate(blockposition.up(4), Blocks.DRAGON_EGG.getBlockData()); ++ world.setTypeUpdate(blockposition2, Blocks.BEDROCK.getBlockData()); ++ world.setTypeUpdate(blockposition2.west(), Blocks.TORCH.getBlockData().set(BlockTorch.FACING, EnumDirection.EAST)); ++ world.setTypeUpdate(blockposition2.east(), Blocks.TORCH.getBlockData().set(BlockTorch.FACING, EnumDirection.WEST)); ++ world.setTypeUpdate(blockposition2.north(), Blocks.TORCH.getBlockData().set(BlockTorch.FACING, EnumDirection.SOUTH)); ++ world.setTypeUpdate(blockposition2.south(), Blocks.TORCH.getBlockData().set(BlockTorch.FACING, EnumDirection.NORTH)); ++ world.setTypeUpdate(blockposition.up(3), Blocks.BEDROCK.getBlockData()); ++ world.setTypeUpdate(blockposition.up(4), Blocks.DRAGON_EGG.getBlockData()); ++ ++ EntityCreatePortalEvent event = new EntityCreatePortalEvent((org.bukkit.entity.LivingEntity) this.getBukkitEntity(), java.util.Collections.unmodifiableList(world.getList()), org.bukkit.PortalType.ENDER); ++ this.world.getServer().getPluginManager().callEvent(event); ++ ++ if (!event.isCancelled()) { ++ for (BlockState state : event.getBlocks()) { ++ state.update(true); ++ } ++ } else { ++ for (BlockState state : event.getBlocks()) { ++ PacketPlayOutBlockChange packet = new PacketPlayOutBlockChange(this.world, new BlockPosition(state.getX(), state.getY(), state.getZ())); ++ for (Iterator it = this.world.players.iterator(); it.hasNext();) { ++ EntityHuman entity = (EntityHuman) it.next(); ++ if (entity instanceof EntityPlayer) { ++ ((EntityPlayer) entity).playerConnection.sendPacket(packet); ++ } ++ } ++ } ++ } ++ // CraftBukkit end + } + + protected void D() {} +@@ -576,4 +692,12 @@ + protected float bA() { + return 5.0F; + } ++ ++ // CraftBukkit start ++ public int getExpReward() { ++ // This value is equal to the amount of experience dropped while falling from the sky (10 * 1000) ++ // plus what is dropped when the dragon hits the ground (2000) ++ return 12000; ++ } ++ // CraftBukkit end + } diff --git a/nms-patches/EntityEnderPearl.patch b/nms-patches/EntityEnderPearl.patch new file mode 100644 index 0000000000..de13eefd67 --- /dev/null +++ b/nms-patches/EntityEnderPearl.patch @@ -0,0 +1,50 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/EntityEnderPearl.java 2014-11-27 08:59:46.669421987 +1100 ++++ src/main/java/net/minecraft/server/EntityEnderPearl.java 2014-11-27 08:42:10.124850965 +1100 +@@ -1,5 +1,11 @@ + package net.minecraft.server; + ++// CraftBukkit start ++import org.bukkit.Bukkit; ++import org.bukkit.craftbukkit.event.CraftEventFactory; ++import org.bukkit.event.player.PlayerTeleportEvent; ++// CraftBukkit end ++ + public class EntityEnderPearl extends EntityProjectile { + + public EntityEnderPearl(World world, EntityLiving entityliving) { +@@ -29,14 +35,28 @@ + entityendermite.setPositionRotation(entityliving.locX, entityliving.locY, entityliving.locZ, entityliving.yaw, entityliving.pitch); + this.world.addEntity(entityendermite); + } +- +- if (entityliving.av()) { +- entityliving.mount((Entity) null); ++ ++ // CraftBukkit start - Fire PlayerTeleportEvent ++ org.bukkit.craftbukkit.entity.CraftPlayer player = entityplayer.getBukkitEntity(); ++ org.bukkit.Location location = getBukkitEntity().getLocation(); ++ location.setPitch(player.getLocation().getPitch()); ++ location.setYaw(player.getLocation().getYaw()); ++ ++ PlayerTeleportEvent teleEvent = new PlayerTeleportEvent(player, player.getLocation(), location, PlayerTeleportEvent.TeleportCause.ENDER_PEARL); ++ Bukkit.getPluginManager().callEvent(teleEvent); ++ ++ if (!teleEvent.isCancelled() && !entityplayer.playerConnection.isDisconnected()) { ++ if (entityliving.av()) { ++ entityliving.mount((Entity) null); ++ } ++ ++ entityplayer.playerConnection.teleport(teleEvent.getTo()); ++ entityliving.fallDistance = 0.0F; ++ CraftEventFactory.entityDamage = this; ++ entityliving.damageEntity(DamageSource.FALL, 5.0F); ++ CraftEventFactory.entityDamage = null; + } +- +- entityliving.enderTeleportTo(this.locX, this.locY, this.locZ); +- entityliving.fallDistance = 0.0F; +- entityliving.damageEntity(DamageSource.FALL, 5.0F); ++ // CraftBukkit end + } + } + diff --git a/nms-patches/EntityEnderman.patch b/nms-patches/EntityEnderman.patch new file mode 100644 index 0000000000..1fb9b6069d --- /dev/null +++ b/nms-patches/EntityEnderman.patch @@ -0,0 +1,34 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/EntityEnderman.java 2014-11-27 08:59:46.669421987 +1100 ++++ src/main/java/net/minecraft/server/EntityEnderman.java 2014-11-27 08:42:10.140850934 +1100 +@@ -4,6 +4,12 @@ + import java.util.Set; + import java.util.UUID; + ++// CraftBukkit start ++import org.bukkit.Location; ++import org.bukkit.craftbukkit.event.CraftEventFactory; ++import org.bukkit.event.entity.EntityTeleportEvent; ++// CraftBukkit end ++ + public class EntityEnderman extends EntityMonster { + + private static final UUID b = UUID.fromString("020E0DFB-87AE-4653-9556-831010E291A0"); +@@ -165,7 +171,17 @@ + } + + if (flag1) { +- super.enderTeleportTo(this.locX, this.locY, this.locZ); ++ // CraftBukkit start - Teleport event ++ // super.enderTeleportTo(this.locX, this.locY, this.locZ); ++ EntityTeleportEvent teleport = new EntityTeleportEvent(this.getBukkitEntity(), new Location(this.world.getWorld(), d3, d4, d5), new Location(this.world.getWorld(), this.locX, this.locY, this.locZ)); ++ this.world.getServer().getPluginManager().callEvent(teleport); ++ if (teleport.isCancelled()) { ++ return false; ++ } ++ ++ Location to = teleport.getTo(); ++ this.enderTeleportTo(to.getX(), to.getY(), to.getZ()); ++ // CraftBukkit end + if (this.world.getCubes(this, this.getBoundingBox()).isEmpty() && !this.world.containsLiquid(this.getBoundingBox())) { + flag = true; + } diff --git a/nms-patches/EntityExperienceOrb.patch b/nms-patches/EntityExperienceOrb.patch new file mode 100644 index 0000000000..0f389895b8 --- /dev/null +++ b/nms-patches/EntityExperienceOrb.patch @@ -0,0 +1,82 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/EntityExperienceOrb.java 2014-11-27 08:59:46.673421970 +1100 ++++ src/main/java/net/minecraft/server/EntityExperienceOrb.java 2014-11-27 08:42:10.100851012 +1100 +@@ -1,5 +1,11 @@ + package net.minecraft.server; + ++// CraftBukkit start ++import org.bukkit.craftbukkit.event.CraftEventFactory; ++import org.bukkit.event.entity.EntityTargetLivingEntityEvent; ++import org.bukkit.event.entity.EntityTargetEvent; ++// CraftBukkit end ++ + public class EntityExperienceOrb extends Entity { + + public int a; +@@ -34,6 +40,7 @@ + + public void s_() { + super.s_(); ++ EntityHuman prevTarget = this.targetPlayer;// CraftBukkit - store old target + if (this.c > 0) { + --this.c; + } +@@ -65,6 +72,16 @@ + } + + if (this.targetPlayer != null) { ++ // CraftBukkit start ++ boolean cancelled = false; ++ if (this.targetPlayer != prevTarget) { ++ EntityTargetLivingEntityEvent event = CraftEventFactory.callEntityTargetLivingEvent(this, targetPlayer, EntityTargetEvent.TargetReason.CLOSEST_PLAYER); ++ EntityLiving target = event.getTarget() == null ? null : ((org.bukkit.craftbukkit.entity.CraftLivingEntity) event.getTarget()).getHandle(); ++ targetPlayer = target instanceof EntityHuman ? (EntityHuman) target : null; ++ cancelled = event.isCancelled(); ++ } ++ ++ if (!cancelled && targetPlayer != null) { + double d1 = (this.targetPlayer.locX - this.locX) / d0; + double d2 = (this.targetPlayer.locY + (double) this.targetPlayer.getHeadHeight() - this.locY) / d0; + double d3 = (this.targetPlayer.locZ - this.locZ) / d0; +@@ -77,6 +94,8 @@ + this.motY += d2 / d4 * d5 * 0.1D; + this.motZ += d3 / d4 * d5 * 0.1D; + } ++ } ++ // CraftBukkit end + } + + this.move(this.motX, this.motY, this.motZ); +@@ -141,7 +160,7 @@ + entityhuman.bn = 2; + this.world.makeSound(entityhuman, "random.orb", 0.1F, 0.5F * ((this.random.nextFloat() - this.random.nextFloat()) * 0.7F + 1.8F)); + entityhuman.receive(this, 1); +- entityhuman.giveExp(this.value); ++ entityhuman.giveExp(CraftEventFactory.callPlayerExpChangeEvent(entityhuman, this.value).getAmount()); // CraftBukkit - this.value -> event.getAmount() + this.die(); + } + +@@ -153,6 +172,24 @@ + } + + public static int getOrbValue(int i) { ++ // CraftBukkit start ++ if (i > 162670129) return i - 100000; ++ if (i > 81335063) return 81335063; ++ if (i > 40667527) return 40667527; ++ if (i > 20333759) return 20333759; ++ if (i > 10166857) return 10166857; ++ if (i > 5083423) return 5083423; ++ if (i > 2541701) return 2541701; ++ if (i > 1270849) return 1270849; ++ if (i > 635413) return 635413; ++ if (i > 317701) return 317701; ++ if (i > 158849) return 158849; ++ if (i > 79423) return 79423; ++ if (i > 39709) return 39709; ++ if (i > 19853) return 19853; ++ if (i > 9923) return 9923; ++ if (i > 4957) return 4957; ++ // CraftBukkit end + return i >= 2477 ? 2477 : (i >= 1237 ? 1237 : (i >= 617 ? 617 : (i >= 307 ? 307 : (i >= 149 ? 149 : (i >= 73 ? 73 : (i >= 37 ? 37 : (i >= 17 ? 17 : (i >= 7 ? 7 : (i >= 3 ? 3 : 1))))))))); + } + diff --git a/nms-patches/EntityFallingBlock.patch b/nms-patches/EntityFallingBlock.patch new file mode 100644 index 0000000000..2b53c264e8 --- /dev/null +++ b/nms-patches/EntityFallingBlock.patch @@ -0,0 +1,44 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/EntityFallingBlock.java 2014-11-27 08:59:46.673421970 +1100 ++++ src/main/java/net/minecraft/server/EntityFallingBlock.java 2014-11-27 08:42:10.132850949 +1100 +@@ -4,6 +4,8 @@ + import java.util.ArrayList; + import java.util.Iterator; + ++import org.bukkit.craftbukkit.event.CraftEventFactory; // CraftBukkit ++ + public class EntityFallingBlock extends Entity { + + public IBlockData block; +@@ -56,7 +58,7 @@ + + if (this.ticksLived++ == 0) { + blockposition = new BlockPosition(this); +- if (this.world.getType(blockposition).getBlock() == block) { ++ if (this.world.getType(blockposition).getBlock() == block && !CraftEventFactory.callEntityChangeBlockEvent(this, blockposition.getX(), blockposition.getY(), blockposition.getZ(), Blocks.AIR, 0).isCancelled()) { + this.world.setAir(blockposition); + } else if (!this.world.isStatic) { + this.die(); +@@ -77,7 +79,12 @@ + this.motY *= -0.5D; + if (this.world.getType(blockposition).getBlock() != Blocks.PISTON_EXTENSION) { + this.die(); +- if (!this.e && this.world.a(block, blockposition, true, EnumDirection.UP, (Entity) null, (ItemStack) null) && !BlockFalling.canFall(this.world, blockposition.down()) && this.world.setTypeAndData(blockposition, this.block, 3)) { ++ if (!this.e && this.world.a(block, blockposition, true, EnumDirection.UP, (Entity) null, (ItemStack) null) && !BlockFalling.canFall(this.world, blockposition.down()) /* mimic the false conditions of setTypeIdAndData */ && blockposition.getX() >= -30000000 && blockposition.getZ() >= -30000000 && blockposition.getX() < 30000000 && blockposition.getZ() < 30000000 && blockposition.getY() >= 0 && blockposition.getY() < 256 && this.world.getType(blockposition) != this.block) { ++ if (CraftEventFactory.callEntityChangeBlockEvent(this, blockposition.getX(), blockposition.getY(), blockposition.getZ(), this.block.getBlock(), this.block.getBlock().toLegacyData(this.block)).isCancelled()) { ++ return; ++ } ++ this.world.setTypeAndData(blockposition, this.block, 3); ++ // CraftBukkit end + if (block instanceof BlockFalling) { + ((BlockFalling) block).a_(this.world, blockposition); + } +@@ -135,7 +142,9 @@ + while (iterator.hasNext()) { + Entity entity = (Entity) iterator.next(); + ++ CraftEventFactory.entityDamage = this; // CraftBukkit + entity.damageEntity(damagesource, (float) Math.min(MathHelper.d((float) i * this.fallHurtAmount), this.fallHurtMax)); ++ CraftEventFactory.entityDamage = null; // CraftBukkit + } + + if (flag && (double) this.random.nextFloat() < 0.05000000074505806D + (double) i * 0.05D) { diff --git a/nms-patches/EntityFireball.patch b/nms-patches/EntityFireball.patch new file mode 100644 index 0000000000..67022e164b --- /dev/null +++ b/nms-patches/EntityFireball.patch @@ -0,0 +1,111 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/EntityFireball.java 2014-11-27 08:59:46.677421952 +1100 ++++ src/main/java/net/minecraft/server/EntityFireball.java 2014-11-27 08:42:10.144850927 +1100 +@@ -2,6 +2,8 @@ + + import java.util.List; + ++import org.bukkit.craftbukkit.event.CraftEventFactory; // CraftBukkit ++ + public abstract class EntityFireball extends Entity { + + private int e = -1; +@@ -15,6 +17,8 @@ + public double dirX; + public double dirY; + public double dirZ; ++ public float bukkitYield = 1; // CraftBukkit ++ public boolean isIncendiary = true; // CraftBukkit + + public EntityFireball(World world) { + super(world); +@@ -38,10 +42,17 @@ + public EntityFireball(World world, EntityLiving entityliving, double d0, double d1, double d2) { + super(world); + this.shooter = entityliving; ++ this.projectileSource = (org.bukkit.entity.LivingEntity) entityliving.getBukkitEntity(); // CraftBukkit + this.a(1.0F, 1.0F); + this.setPositionRotation(entityliving.locX, entityliving.locY, entityliving.locZ, entityliving.yaw, entityliving.pitch); + this.setPosition(this.locX, this.locY, this.locZ); + this.motX = this.motY = this.motZ = 0.0D; ++ // CraftBukkit start - Added setDirection method ++ this.setDirection(d0, d1, d2); ++ } ++ ++ public void setDirection(double d0, double d1, double d2) { ++ // CraftBukkit end + d0 += this.random.nextGaussian() * 0.4D; + d1 += this.random.nextGaussian() * 0.4D; + d2 += this.random.nextGaussian() * 0.4D; +@@ -101,7 +112,7 @@ + MovingObjectPosition movingobjectposition1 = axisalignedbb.a(vec3d, vec3d1); + + if (movingobjectposition1 != null) { +- double d1 = vec3d.f(movingobjectposition1.pos); ++ double d1 = vec3d.distanceSquared(movingobjectposition1.pos); // CraftBukkit - distance efficiency + + if (d1 < d0 || d0 == 0.0D) { + entity = entity1; +@@ -117,6 +128,12 @@ + + if (movingobjectposition != null) { + this.a(movingobjectposition); ++ ++ // CraftBukkit start - Fire ProjectileHitEvent ++ if (this.dead) { ++ CraftEventFactory.callProjectileHitEvent(this); ++ } ++ // CraftBukkit end + } + + this.locX += this.motX; +@@ -181,7 +198,8 @@ + + nbttagcompound.setString("inTile", minecraftkey == null ? "" : minecraftkey.toString()); + nbttagcompound.setByte("inGround", (byte) (this.i ? 1 : 0)); +- nbttagcompound.set("direction", this.a(new double[] { this.motX, this.motY, this.motZ})); ++ // CraftBukkit - Fix direction being mismapped to invalid variables ++ nbttagcompound.set("power", this.a(new double[] { this.dirX, this.dirY, this.dirZ})); + } + + public void a(NBTTagCompound nbttagcompound) { +@@ -195,12 +213,14 @@ + } + + this.i = nbttagcompound.getByte("inGround") == 1; +- if (nbttagcompound.hasKeyOfType("direction", 9)) { +- NBTTagList nbttaglist = nbttagcompound.getList("direction", 6); +- +- this.motX = nbttaglist.d(0); +- this.motY = nbttaglist.d(1); +- this.motZ = nbttaglist.d(2); ++ // CraftBukkit start - direction -> power ++ if (nbttagcompound.hasKeyOfType("power", 9)) { ++ NBTTagList nbttaglist = nbttagcompound.getList("power", 6); ++ ++ this.dirX = nbttaglist.d(0); ++ this.dirY = nbttaglist.d(1); ++ this.dirZ = nbttaglist.d(2); ++ // CraftBukkit end + } else { + this.die(); + } +@@ -221,6 +241,11 @@ + } else { + this.ac(); + if (damagesource.getEntity() != null) { ++ // CraftBukkit start ++ if (CraftEventFactory.handleNonLivingEntityDamageEvent(this, damagesource, f)) { ++ return false; ++ } ++ // CraftBukkit end + Vec3D vec3d = damagesource.getEntity().ap(); + + if (vec3d != null) { +@@ -234,6 +259,7 @@ + + if (damagesource.getEntity() instanceof EntityLiving) { + this.shooter = (EntityLiving) damagesource.getEntity(); ++ this.projectileSource = (org.bukkit.projectiles.ProjectileSource) this.shooter.getBukkitEntity(); + } + + return true; diff --git a/nms-patches/EntityFishingHook.patch b/nms-patches/EntityFishingHook.patch new file mode 100644 index 0000000000..b2a015b838 --- /dev/null +++ b/nms-patches/EntityFishingHook.patch @@ -0,0 +1,159 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/EntityFishingHook.java 2014-11-27 08:59:46.677421952 +1100 ++++ src/main/java/net/minecraft/server/EntityFishingHook.java 2014-11-27 08:42:10.104851005 +1100 +@@ -3,6 +3,12 @@ + import java.util.Arrays; + import java.util.List; + ++// CraftBukkit start ++import org.bukkit.entity.Player; ++import org.bukkit.entity.Fish; ++import org.bukkit.event.player.PlayerFishEvent; ++// CraftBukkit end ++ + public class EntityFishingHook extends Entity { + + private static final List d = Arrays.asList(new PossibleFishingResult[] { (new PossibleFishingResult(new ItemStack(Items.LEATHER_BOOTS), 10)).a(0.9F), new PossibleFishingResult(new ItemStack(Items.LEATHER), 10), new PossibleFishingResult(new ItemStack(Items.BONE), 10), new PossibleFishingResult(new ItemStack(Items.POTION), 10), new PossibleFishingResult(new ItemStack(Items.STRING), 5), (new PossibleFishingResult(new ItemStack(Items.FISHING_ROD), 2)).a(0.9F), new PossibleFishingResult(new ItemStack(Items.BOWL), 10), new PossibleFishingResult(new ItemStack(Items.STICK), 5), new PossibleFishingResult(new ItemStack(Items.DYE, 10, EnumColor.BLACK.getInvColorIndex()), 1), new PossibleFishingResult(new ItemStack(Blocks.TRIPWIRE_HOOK), 10), new PossibleFishingResult(new ItemStack(Items.ROTTEN_FLESH), 10)}); +@@ -168,7 +174,7 @@ + MovingObjectPosition movingobjectposition1 = axisalignedbb.a(vec3d, vec3d1); + + if (movingobjectposition1 != null) { +- d6 = vec3d.f(movingobjectposition1.pos); ++ d6 = vec3d.distanceSquared(movingobjectposition1.pos); // CraftBukkit - distance efficiency + if (d6 < d5 || d5 == 0.0D) { + entity = entity1; + d5 = d6; +@@ -182,6 +188,7 @@ + } + + if (movingobjectposition != null) { ++ org.bukkit.craftbukkit.event.CraftEventFactory.callProjectileHitEvent(this); // Craftbukkit - Call event + if (movingobjectposition.entity != null) { + if (movingobjectposition.entity.damageEntity(DamageSource.projectile(this, this.owner), 0.0F)) { + this.hooked = movingobjectposition.entity; +@@ -261,8 +268,8 @@ + } else { + float f3; + float f4; +- double d11; + float f5; ++ double d11; + double d12; + + if (this.av > 0) { +@@ -277,20 +284,20 @@ + } else { + this.aw = (float) ((double) this.aw + this.random.nextGaussian() * 4.0D); + f3 = this.aw * 0.017453292F; +- f5 = MathHelper.sin(f3); +- f4 = MathHelper.cos(f3); +- d8 = this.locX + (double) (f5 * (float) this.av * 0.1F); +- d12 = (double) ((float) MathHelper.floor(this.getBoundingBox().b) + 1.0F); +- d11 = this.locZ + (double) (f4 * (float) this.av * 0.1F); ++ f4 = MathHelper.sin(f3); ++ f5 = MathHelper.cos(f3); ++ d8 = this.locX + (double) (f4 * (float) this.av * 0.1F); ++ d11 = (double) ((float) MathHelper.floor(this.getBoundingBox().b) + 1.0F); ++ d12 = this.locZ + (double) (f5 * (float) this.av * 0.1F); + if (this.random.nextFloat() < 0.15F) { +- worldserver.a(EnumParticle.WATER_BUBBLE, d8, d12 - 0.10000000149011612D, d11, 1, (double) f5, 0.1D, (double) f4, 0.0D, new int[0]); ++ worldserver.a(EnumParticle.WATER_BUBBLE, d8, d11 - 0.10000000149011612D, d12, 1, (double) f4, 0.1D, (double) f5, 0.0D, new int[0]); + } + +- float f6 = f5 * 0.04F; +- float f7 = f4 * 0.04F; ++ float f6 = f4 * 0.04F; ++ float f7 = f5 * 0.04F; + +- worldserver.a(EnumParticle.WATER_WAKE, d8, d12, d11, 0, (double) f7, 0.01D, (double) (-f6), 1.0D, new int[0]); +- worldserver.a(EnumParticle.WATER_WAKE, d8, d12, d11, 0, (double) (-f7), 0.01D, (double) f6, 1.0D, new int[0]); ++ worldserver.a(EnumParticle.WATER_WAKE, d8, d11, d12, 0, (double) f7, 0.01D, (double) (-f6), 1.0D, new int[0]); ++ worldserver.a(EnumParticle.WATER_WAKE, d8, d11, d12, 0, (double) (-f7), 0.01D, (double) f6, 1.0D, new int[0]); + } + } else if (this.au > 0) { + this.au -= k; +@@ -304,12 +311,12 @@ + } + + if (this.random.nextFloat() < f3) { +- f5 = MathHelper.a(this.random, 0.0F, 360.0F) * 0.017453292F; +- f4 = MathHelper.a(this.random, 25.0F, 60.0F); +- d8 = this.locX + (double) (MathHelper.sin(f5) * f4 * 0.1F); +- d12 = (double) ((float) MathHelper.floor(this.getBoundingBox().b) + 1.0F); +- d11 = this.locZ + (double) (MathHelper.cos(f5) * f4 * 0.1F); +- worldserver.a(EnumParticle.WATER_SPLASH, d8, d12, d11, 2 + this.random.nextInt(2), 0.10000000149011612D, 0.0D, 0.10000000149011612D, 0.0D, new int[0]); ++ f4 = MathHelper.a(this.random, 0.0F, 360.0F) * 0.017453292F; ++ f5 = MathHelper.a(this.random, 25.0F, 60.0F); ++ d8 = this.locX + (double) (MathHelper.sin(f4) * f5 * 0.1F); ++ d11 = (double) ((float) MathHelper.floor(this.getBoundingBox().b) + 1.0F); ++ d12 = this.locZ + (double) (MathHelper.cos(f4) * f5 * 0.1F); ++ worldserver.a(EnumParticle.WATER_SPLASH, d8, d11, d12, 2 + this.random.nextInt(2), 0.10000000149011612D, 0.0D, 0.10000000149011612D, 0.0D, new int[0]); + } + + if (this.au <= 0) { +@@ -374,6 +381,15 @@ + byte b0 = 0; + + if (this.hooked != null) { ++ // CraftBukkit start ++ PlayerFishEvent playerFishEvent = new PlayerFishEvent((Player) this.owner.getBukkitEntity(), this.hooked.getBukkitEntity(), (Fish) this.getBukkitEntity(), PlayerFishEvent.State.CAUGHT_ENTITY); ++ this.world.getServer().getPluginManager().callEvent(playerFishEvent); ++ ++ if (playerFishEvent.isCancelled()) { ++ return 0; ++ } ++ // CraftBukkit end ++ + double d0 = this.owner.locX - this.locX; + double d1 = this.owner.locY - this.locY; + double d2 = this.owner.locZ - this.locZ; +@@ -386,6 +402,16 @@ + b0 = 3; + } else if (this.at > 0) { + EntityItem entityitem = new EntityItem(this.world, this.locX, this.locY, this.locZ, this.m()); ++ // CraftBukkit start ++ PlayerFishEvent playerFishEvent = new PlayerFishEvent((Player) this.owner.getBukkitEntity(), entityitem.getBukkitEntity(), (Fish) this.getBukkitEntity(), PlayerFishEvent.State.CAUGHT_FISH); ++ playerFishEvent.setExpToDrop(this.random.nextInt(6) + 1); ++ this.world.getServer().getPluginManager().callEvent(playerFishEvent); ++ ++ if (playerFishEvent.isCancelled()) { ++ return 0; ++ } ++ // CraftBukkit end ++ + double d5 = this.owner.locX - this.locX; + double d6 = this.owner.locY - this.locY; + double d7 = this.owner.locZ - this.locZ; +@@ -396,13 +422,32 @@ + entityitem.motY = d6 * d9 + (double) MathHelper.sqrt(d8) * 0.08D; + entityitem.motZ = d7 * d9; + this.world.addEntity(entityitem); +- 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)); ++ // CraftBukkit - this.random.nextInt(6) + 1 -> playerFishEvent.getExpToDrop() ++ this.owner.world.addEntity(new EntityExperienceOrb(this.owner.world, this.owner.locX, this.owner.locY + 0.5D, this.owner.locZ + 0.5D, playerFishEvent.getExpToDrop())); + b0 = 1; + } + + if (this.aq) { ++ // CraftBukkit start ++ PlayerFishEvent playerFishEvent = new PlayerFishEvent((Player) this.owner.getBukkitEntity(), null, (Fish) this.getBukkitEntity(), PlayerFishEvent.State.IN_GROUND); ++ this.world.getServer().getPluginManager().callEvent(playerFishEvent); ++ ++ if (playerFishEvent.isCancelled()) { ++ return 0; ++ } ++ // CraftBukkit end + b0 = 2; + } ++ ++ // CraftBukkit start ++ if (b0 == 0) { ++ PlayerFishEvent playerFishEvent = new PlayerFishEvent((Player) this.owner.getBukkitEntity(), null, (Fish) this.getBukkitEntity(), PlayerFishEvent.State.FAILED_ATTEMPT); ++ this.world.getServer().getPluginManager().callEvent(playerFishEvent); ++ if (playerFishEvent.isCancelled()) { ++ return 0; ++ } ++ } ++ // CraftBukkit end + + this.die(); + this.owner.hookedFish = null; diff --git a/nms-patches/EntityHanging.patch b/nms-patches/EntityHanging.patch new file mode 100644 index 0000000000..d65c6dd9bc --- /dev/null +++ b/nms-patches/EntityHanging.patch @@ -0,0 +1,111 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/EntityHanging.java 2014-11-27 08:59:46.681421935 +1100 ++++ src/main/java/net/minecraft/server/EntityHanging.java 2014-11-27 08:42:10.168850880 +1100 +@@ -4,6 +4,13 @@ + import java.util.List; + import org.apache.commons.lang3.Validate; + ++// CraftBukkit start ++import org.bukkit.entity.Hanging; ++import org.bukkit.entity.Painting; ++import org.bukkit.event.hanging.HangingBreakEvent; ++import org.bukkit.event.painting.PaintingBreakEvent; ++// CraftBukkit end ++ + public abstract class EntityHanging extends Entity { + + private int c; +@@ -77,6 +84,33 @@ + if (this.c++ == 100 && !this.world.isStatic) { + this.c = 0; + if (!this.dead && !this.survives()) { ++ // CraftBukkit start - fire break events ++ Material material = this.world.getType(new BlockPosition(this)).getBlock().getMaterial(); ++ HangingBreakEvent.RemoveCause cause; ++ ++ if (!material.equals(Material.AIR)) { ++ // TODO: This feels insufficient to catch 100% of suffocation cases ++ cause = HangingBreakEvent.RemoveCause.OBSTRUCTION; ++ } else { ++ cause = HangingBreakEvent.RemoveCause.PHYSICS; ++ } ++ ++ HangingBreakEvent event = new HangingBreakEvent((Hanging) this.getBukkitEntity(), cause); ++ this.world.getServer().getPluginManager().callEvent(event); ++ ++ PaintingBreakEvent paintingEvent = null; ++ if (this instanceof EntityPainting) { ++ // Fire old painting event until it can be removed ++ paintingEvent = new PaintingBreakEvent((Painting) this.getBukkitEntity(), PaintingBreakEvent.RemoveCause.valueOf(cause.name())); ++ paintingEvent.setCancelled(event.isCancelled()); ++ this.world.getServer().getPluginManager().callEvent(paintingEvent); ++ } ++ ++ if (dead || event.isCancelled() || (paintingEvent != null && paintingEvent.isCancelled())) { ++ return; ++ } ++ // CraftBukkit end ++ + this.die(); + this.b((Entity) null); + } +@@ -138,6 +172,32 @@ + return false; + } else { + if (!this.dead && !this.world.isStatic) { ++ // CraftBukkit start - fire break events ++ HangingBreakEvent event = new HangingBreakEvent((Hanging) this.getBukkitEntity(), HangingBreakEvent.RemoveCause.DEFAULT); ++ PaintingBreakEvent paintingEvent = null; ++ if (damagesource.getEntity() != null) { ++ event = new org.bukkit.event.hanging.HangingBreakByEntityEvent((Hanging) this.getBukkitEntity(), damagesource.getEntity() == null ? null : damagesource.getEntity().getBukkitEntity()); ++ ++ if (this instanceof EntityPainting) { ++ // Fire old painting event until it can be removed ++ paintingEvent = new org.bukkit.event.painting.PaintingBreakByEntityEvent((Painting) this.getBukkitEntity(), damagesource.getEntity() == null ? null : damagesource.getEntity().getBukkitEntity()); ++ } ++ } else if (damagesource.isExplosion()) { ++ event = new HangingBreakEvent((Hanging) this.getBukkitEntity(), HangingBreakEvent.RemoveCause.EXPLOSION); ++ } ++ ++ this.world.getServer().getPluginManager().callEvent(event); ++ ++ if (paintingEvent != null) { ++ paintingEvent.setCancelled(event.isCancelled()); ++ this.world.getServer().getPluginManager().callEvent(paintingEvent); ++ } ++ ++ if (this.dead || event.isCancelled() || (paintingEvent != null && paintingEvent.isCancelled())) { ++ return true; ++ } ++ // CraftBukkit end ++ + this.die(); + this.ac(); + this.b(damagesource.getEntity()); +@@ -149,6 +209,18 @@ + + public void move(double d0, double d1, double d2) { + if (!this.world.isStatic && !this.dead && d0 * d0 + d1 * d1 + d2 * d2 > 0.0D) { ++ if (this.dead) return; // CraftBukkit ++ ++ // CraftBukkit start - fire break events ++ // TODO - Does this need its own cause? Seems to only be triggered by pistons ++ HangingBreakEvent event = new HangingBreakEvent((Hanging) this.getBukkitEntity(), HangingBreakEvent.RemoveCause.PHYSICS); ++ this.world.getServer().getPluginManager().callEvent(event); ++ ++ if (this.dead || event.isCancelled()) { ++ return; ++ } ++ // CraftBukkit end ++ + this.die(); + this.b((Entity) null); + } +@@ -156,7 +228,7 @@ + } + + public void g(double d0, double d1, double d2) { +- if (!this.world.isStatic && !this.dead && d0 * d0 + d1 * d1 + d2 * d2 > 0.0D) { ++ if (false && !this.world.isStatic && !this.dead && d0 * d0 + d1 * d1 + d2 * d2 > 0.0D) { // CraftBukkit - not needed + this.die(); + this.b((Entity) null); + } diff --git a/nms-patches/EntityHorse.patch b/nms-patches/EntityHorse.patch new file mode 100644 index 0000000000..f4ff42d080 --- /dev/null +++ b/nms-patches/EntityHorse.patch @@ -0,0 +1,140 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/EntityHorse.java 2014-11-27 08:59:46.681421935 +1100 ++++ src/main/java/net/minecraft/server/EntityHorse.java 2014-11-27 08:42:10.148850918 +1100 +@@ -4,6 +4,8 @@ + import java.util.Iterator; + import java.util.List; + ++import org.bukkit.event.entity.EntityRegainHealthEvent.RegainReason; // CraftBukkit ++ + public class EntityHorse extends EntityAnimal implements IInventoryListener { + + private static final Predicate bq = new EntitySelectorHorse(); +@@ -36,6 +38,7 @@ + private String bM; + private String[] bN = new String[3]; + private boolean bO = false; ++ public int maxDomestication = 100; // CraftBukkit - store max domestication value + + public EntityHorse(World world) { + super(world); +@@ -314,13 +317,13 @@ + private int cX() { + int i = this.getType(); + +- return this.hasChest() && (i == 1 || i == 2) ? 17 : 2; ++ return this.hasChest() /* && (i == 1 || i == 2) */ ? 17 : 2; // CraftBukkit - Remove type check + } + + public void loadChest() { + InventoryHorseChest inventoryhorsechest = this.inventoryChest; + +- this.inventoryChest = new InventoryHorseChest("HorseChest", this.cX()); ++ this.inventoryChest = new InventoryHorseChest("HorseChest", this.cX(), this); // CraftBukkit - add this horse + this.inventoryChest.a(this.getName()); + if (inventoryhorsechest != null) { + inventoryhorsechest.b(this); +@@ -485,7 +488,7 @@ + } + + public int getMaxDomestication() { +- return 100; ++ return this.maxDomestication; // CraftBukkit - return stored max domestication instead of 100 + } + + protected float bA() { +@@ -585,7 +588,7 @@ + } + + if (this.getHealth() < this.getMaxHealth() && f > 0.0F) { +- this.heal(f); ++ this.heal(f, RegainReason.EATING); // CraftBukkit + flag = true; + } + +@@ -692,11 +695,24 @@ + + public void die(DamageSource damagesource) { + super.die(damagesource); ++ /* CraftBukkit start - Handle chest dropping in dropDeathLoot below + if (!this.world.isStatic) { + this.dropChest(); + } ++ // CraftBukkit end */ ++ } + ++ // CraftBukkit start - Add method ++ @Override ++ protected void dropDeathLoot(boolean flag, int i) { ++ super.dropDeathLoot(flag, i); ++ ++ // Moved from die method above ++ if (!this.world.isStatic) { ++ this.dropChest(); ++ } + } ++ // CraftBukkit end + + public void m() { + if (this.random.nextInt(200) == 0) { +@@ -706,7 +722,7 @@ + super.m(); + if (!this.world.isStatic) { + if (this.random.nextInt(900) == 0 && this.deathTicks == 0) { +- this.heal(1.0F); ++ this.heal(1.0F, RegainReason.REGEN); // CraftBukkit + } + + if (!this.cw() && this.passenger == null && this.random.nextInt(300) == 0 && this.world.getType(new BlockPosition(MathHelper.floor(this.locX), MathHelper.floor(this.locY) - 1, MathHelper.floor(this.locZ))).getBlock() == Blocks.GRASS) { +@@ -949,6 +965,7 @@ + nbttagcompound.setInt("Temper", this.getTemper()); + nbttagcompound.setBoolean("Tame", this.isTame()); + nbttagcompound.setString("OwnerUUID", this.getOwnerUUID()); ++ nbttagcompound.setInt("Bukkit.MaxDomestication", this.maxDomestication); // CraftBukkit + if (this.hasChest()) { + NBTTagList nbttaglist = new NBTTagList(); + +@@ -1001,6 +1018,12 @@ + this.setOwnerUUID(s); + } + ++ // CraftBukkit start ++ if (nbttagcompound.hasKey("Bukkit.MaxDomestication")) { ++ this.maxDomestication = nbttagcompound.getInt("Bukkit.MaxDomestication"); ++ } ++ // CraftBukkit end ++ + AttributeInstance attributeinstance = this.getAttributeMap().a("Speed"); + + if (attributeinstance != null) { +@@ -1166,18 +1189,25 @@ + + public void v(int i) { + if (this.cE()) { ++ // CraftBukkit start - fire HorseJumpEvent, use event power + if (i < 0) { + i = 0; +- } else { +- this.bE = true; +- this.df(); + } +- ++ ++ float power; + if (i >= 90) { +- this.bp = 1.0F; ++ power = 1.0F; + } else { +- this.bp = 0.4F + 0.4F * (float) i / 90.0F; ++ power = 0.4F + 0.4F * (float) i / 90.0F; ++ } ++ ++ org.bukkit.event.entity.HorseJumpEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callHorseJumpEvent(this, power); ++ if (!event.isCancelled()) { ++ this.bE = true; ++ this.df(); ++ this.bp = power; + } ++ // CraftBukkit end + } + + } diff --git a/nms-patches/EntityHuman.patch b/nms-patches/EntityHuman.patch new file mode 100644 index 0000000000..185b52b4bf --- /dev/null +++ b/nms-patches/EntityHuman.patch @@ -0,0 +1,383 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/EntityHuman.java 2014-11-27 08:59:46.685421917 +1100 ++++ src/main/java/net/minecraft/server/EntityHuman.java 2014-11-27 08:42:10.120850973 +1100 +@@ -8,13 +8,25 @@ + import java.util.List; + import java.util.UUID; + ++// CraftBukkit start ++import org.bukkit.craftbukkit.entity.CraftHumanEntity; ++import org.bukkit.craftbukkit.entity.CraftItem; ++import org.bukkit.craftbukkit.inventory.CraftItemStack; ++import org.bukkit.entity.Player; ++import org.bukkit.event.entity.EntityCombustByEntityEvent; ++import org.bukkit.event.player.PlayerBedEnterEvent; ++import org.bukkit.event.player.PlayerBedLeaveEvent; ++import org.bukkit.event.player.PlayerDropItemEvent; ++import org.bukkit.event.player.PlayerItemConsumeEvent; ++// CraftBukkit end ++ + public abstract class EntityHuman extends EntityLiving { + + public PlayerInventory inventory = new PlayerInventory(this); + private InventoryEnderChest enderChest = new InventoryEnderChest(); + public Container defaultContainer; + public Container activeContainer; +- protected FoodMetaData foodData = new FoodMetaData(); ++ protected FoodMetaData foodData = new FoodMetaData(this); // CraftBukkit - add "this" to constructor + protected int bk; + public float bl; + public float bm; +@@ -34,6 +46,7 @@ + private boolean d; + private BlockPosition e; + public PlayerAbilities abilities = new PlayerAbilities(); ++ public int oldLevel = -1; // CraftBukkit - add field + public int expLevel; + public int expTotal; + public float exp; +@@ -46,6 +59,16 @@ + private final GameProfile bF; + private boolean bG = false; + public EntityFishingHook hookedFish; ++ ++ // CraftBukkit start ++ public boolean fauxSleeping; ++ public String spawnWorld = ""; ++ ++ @Override ++ public CraftHumanEntity getBukkitEntity() { ++ return (CraftHumanEntity) super.getBukkitEntity(); ++ } ++ // CraftBukkit end + + public EntityHuman(World world, GameProfile gameprofile) { + super(world); +@@ -265,6 +288,32 @@ + if (this.g != null) { + this.b(this.g, 16); + int i = this.g.count; ++ ++ // CraftBukkit start - fire PlayerItemConsumeEvent ++ org.bukkit.inventory.ItemStack craftItem = CraftItemStack.asBukkitCopy(this.g); ++ PlayerItemConsumeEvent event = new PlayerItemConsumeEvent((Player) this.getBukkitEntity(), craftItem); ++ world.getServer().getPluginManager().callEvent(event); ++ ++ if (event.isCancelled()) { ++ // Update client ++ if (this instanceof EntityPlayer) { ++ ((EntityPlayer) this).playerConnection.sendPacket(new PacketPlayOutSetSlot((byte) 0, activeContainer.getSlot((IInventory) this.inventory, this.inventory.itemInHandIndex).index, this.g)); ++ } ++ return; ++ } ++ ++ // Plugin modified the item, process it but don't remove it ++ if (!craftItem.equals(event.getItem())) { ++ CraftItemStack.asNMSCopy(event.getItem()).b(this.world, this); ++ ++ // Update client ++ if (this instanceof EntityPlayer) { ++ ((EntityPlayer) this).playerConnection.sendPacket(new PacketPlayOutSetSlot((byte) 0, activeContainer.getSlot((IInventory) this.inventory, this.inventory.itemInHandIndex).index, this.g)); ++ } ++ return; ++ } ++ // CraftBukkit end ++ + ItemStack itemstack = this.g.b(this.world, this); + + if (itemstack != this.g || itemstack != null && itemstack.count != i) { +@@ -324,7 +373,8 @@ + + if (this.world.getDifficulty() == EnumDifficulty.PEACEFUL && this.world.getGameRules().getBoolean("naturalRegeneration")) { + if (this.getHealth() < this.getMaxHealth() && this.ticksLived % 20 == 0) { +- this.heal(1.0F); ++ // CraftBukkit - added regain reason of "REGEN" for filtering purposes. ++ this.heal(1.0F, org.bukkit.event.entity.EntityRegainHealthEvent.RegainReason.REGEN); + } + + if (this.foodData.c() && this.ticksLived % 10 == 0) { +@@ -348,7 +398,7 @@ + + this.j((float) attributeinstance.getValue()); + float f = MathHelper.sqrt(this.motX * this.motX + this.motZ * this.motZ); +- float f1 = (float) (Math.atan(-this.motY * 0.20000000298023224D) * 15.0D); ++ float f1 = (float) ( org.bukkit.craftbukkit.TrigMath.atan(-this.motY * 0.20000000298023224D) * 15.0D); // CraftBukkit + + if (f > 0.1F) { + f = 0.1F; +@@ -438,11 +488,14 @@ + + public void b(Entity entity, int i) { + this.addScore(i); +- Collection collection = this.getScoreboard().getObjectivesForCriteria(IScoreboardCriteria.f); ++ // CraftBukkit - Get our scores instead ++ Collection collection = this.world.getServer().getScoreboardManager().getScoreboardScores(IScoreboardCriteria.e, this.getName(), new java.util.ArrayList()); ++ + + if (entity instanceof EntityHuman) { + this.b(StatisticList.B); +- collection.addAll(this.getScoreboard().getObjectivesForCriteria(IScoreboardCriteria.e)); ++ // CraftBukkit - Get our scores instead ++ this.world.getServer().getScoreboardManager().getScoreboardScores(IScoreboardCriteria.d, this.getName(), collection); + collection.addAll(this.e(entity)); + } else { + this.b(StatisticList.z); +@@ -451,8 +504,7 @@ + Iterator iterator = collection.iterator(); + + while (iterator.hasNext()) { +- ScoreboardObjective scoreboardobjective = (ScoreboardObjective) iterator.next(); +- ScoreboardScore scoreboardscore = this.getScoreboard().getPlayerScoreForObjective(this.getName(), scoreboardobjective); ++ ScoreboardScore scoreboardscore = (ScoreboardScore) iterator.next(); // CraftBukkit - Use our scores instead + + scoreboardscore.incrementScore(); + } +@@ -491,6 +543,7 @@ + } + + public EntityItem a(boolean flag) { ++ // Called only when dropped by Q or CTRL-Q + return this.a(this.inventory.splitStack(this.inventory.itemInHandIndex, flag && this.inventory.getItemInHand() != null ? this.inventory.getItemInHand().count : 1), false, true); + } + +@@ -532,6 +585,30 @@ + entityitem.motY += (double) ((this.random.nextFloat() - this.random.nextFloat()) * 0.1F); + entityitem.motZ += Math.sin((double) f1) * (double) f; + } ++ ++ // CraftBukkit start - fire PlayerDropItemEvent ++ Player player = (Player) this.getBukkitEntity(); ++ CraftItem drop = new CraftItem(this.world.getServer(), entityitem); ++ ++ PlayerDropItemEvent event = new PlayerDropItemEvent(player, drop); ++ this.world.getServer().getPluginManager().callEvent(event); ++ ++ if (event.isCancelled()) { ++ org.bukkit.inventory.ItemStack cur = player.getInventory().getItemInHand(); ++ if (flag1 && (cur == null || cur.getAmount() == 0)) { ++ // The complete stack was dropped ++ player.getInventory().setItemInHand(drop.getItemStack()); ++ } else if (flag1 && cur.isSimilar(drop.getItemStack()) && drop.getItemStack().getAmount() == 1) { ++ // Only one item is dropped ++ cur.setAmount(cur.getAmount() + 1); ++ player.getInventory().setItemInHand(cur); ++ } else { ++ // Fallback ++ player.getInventory().addItem(drop.getItemStack()); ++ } ++ return null; ++ } ++ // CraftBukkit end + + this.a(entityitem); + if (flag1) { +@@ -623,10 +700,18 @@ + this.bv = new BlockPosition(this); + this.a(true, true, false); + } ++ ++ // CraftBukkit start ++ this.spawnWorld = nbttagcompound.getString("SpawnWorld"); ++ if ("".equals(spawnWorld)) { ++ this.spawnWorld = this.world.getServer().getWorlds().get(0).getName(); ++ } ++ // CraftBukkit end + + if (nbttagcompound.hasKeyOfType("SpawnX", 99) && nbttagcompound.hasKeyOfType("SpawnY", 99) && nbttagcompound.hasKeyOfType("SpawnZ", 99)) { + this.c = new BlockPosition(nbttagcompound.getInt("SpawnX"), nbttagcompound.getInt("SpawnY"), nbttagcompound.getInt("SpawnZ")); + this.d = nbttagcompound.getBoolean("SpawnForced"); ++ nbttagcompound.setString("SpawnWorld", spawnWorld); // CraftBukkit - fixes bed spawns for multiworld worlds + } + + this.foodData.a(nbttagcompound); +@@ -684,7 +769,7 @@ + + if (damagesource.r()) { + if (this.world.getDifficulty() == EnumDifficulty.PEACEFUL) { +- f = 0.0F; ++ return false; // CraftBukkit - f = 0.0f -> return false + } + + if (this.world.getDifficulty() == EnumDifficulty.EASY) { +@@ -696,7 +781,7 @@ + } + } + +- if (f == 0.0F) { ++ if (false && f == 0.0F) { // CraftBukkit - Don't filter out 0 damage + return false; + } else { + Entity entity = damagesource.getEntity(); +@@ -712,10 +797,29 @@ + } + + public boolean a(EntityHuman entityhuman) { +- ScoreboardTeamBase scoreboardteambase = this.getScoreboardTeam(); +- ScoreboardTeamBase scoreboardteambase1 = entityhuman.getScoreboardTeam(); ++ // CraftBukkit start - Change to check OTHER player's scoreboard team according to API ++ // To summarize this method's logic, it's "Can parameter hurt this" ++ org.bukkit.scoreboard.Team team; ++ if (entityhuman instanceof EntityPlayer) { ++ EntityPlayer thatPlayer = (EntityPlayer) entityhuman; ++ team = thatPlayer.getBukkitEntity().getScoreboard().getPlayerTeam(thatPlayer.getBukkitEntity()); ++ if (team == null || team.allowFriendlyFire()) { ++ return true; ++ } ++ } else { ++ // This should never be called, but is implemented anyway ++ org.bukkit.OfflinePlayer thisPlayer = entityhuman.world.getServer().getOfflinePlayer(entityhuman.getName()); ++ team = entityhuman.world.getServer().getScoreboardManager().getMainScoreboard().getPlayerTeam(thisPlayer); ++ if (team == null || team.allowFriendlyFire()) { ++ return true; ++ } ++ } + +- return scoreboardteambase == null ? true : (!scoreboardteambase.isAlly(scoreboardteambase1) ? true : scoreboardteambase.allowFriendlyFire()); ++ if (this instanceof EntityPlayer) { ++ return !team.hasPlayer(((EntityPlayer) this).getBukkitEntity()); ++ } ++ return !team.hasPlayer(this.world.getServer().getOfflinePlayer(this.getName())); ++ // CraftBukkit end + } + + protected void damageArmor(float f) { +@@ -742,7 +846,12 @@ + return (float) i / (float) this.inventory.armor.length; + } + +- protected void d(DamageSource damagesource, float f) { ++ // CraftBukkit start ++ protected boolean d(DamageSource damagesource, float f) { // void -> boolean ++ if (true) { ++ return super.d(damagesource, f); ++ } ++ // CraftBukkit end + if (!this.isInvulnerable(damagesource)) { + if (!damagesource.ignoresArmor() && this.isBlocking() && f > 0.0F) { + f = (1.0F + f) * 0.5F; +@@ -766,6 +875,7 @@ + + } + } ++ return false; // CraftBukkit + } + + public void openSign(TileEntitySign tileentitysign) {} +@@ -800,7 +910,8 @@ + } + + if (itemstack.a(this, (EntityLiving) entity)) { +- if (itemstack.count <= 0 && !this.abilities.canInstantlyBuild) { ++ // CraftBukkit - bypass infinite items; <= 0 -> == 0 ++ if (itemstack.count == 0 && !this.abilities.canInstantlyBuild) { + this.bZ(); + } + +@@ -866,8 +977,15 @@ + int j = EnchantmentManager.getFireAspectEnchantmentLevel(this); + + if (entity instanceof EntityLiving && j > 0 && !entity.isBurning()) { +- flag1 = true; +- entity.setOnFire(1); ++ // CraftBukkit start - Call a combust event when somebody hits with a fire enchanted item ++ EntityCombustByEntityEvent combustEvent = new EntityCombustByEntityEvent(this.getBukkitEntity(), entity.getBukkitEntity(), 1); ++ org.bukkit.Bukkit.getPluginManager().callEvent(combustEvent); ++ ++ if (!combustEvent.isCancelled()) { ++ flag1 = true; ++ entity.setOnFire(combustEvent.getDuration()); ++ } ++ // CraftBukkit end + } + + double d0 = entity.motX; +@@ -922,7 +1040,8 @@ + + if (itemstack != null && object instanceof EntityLiving) { + itemstack.a((EntityLiving) object, this); +- if (itemstack.count <= 0) { ++ // CraftBukkit - bypass infinite items; <= 0 -> == 0 ++ if (itemstack.count == 0) { + this.bZ(); + } + } +@@ -930,7 +1049,14 @@ + if (entity instanceof EntityLiving) { + this.a(StatisticList.w, Math.round(f * 10.0F)); + if (j > 0) { +- entity.setOnFire(j * 4); ++ // CraftBukkit start - Call a combust event when somebody hits with a fire enchanted item ++ EntityCombustByEntityEvent combustEvent = new EntityCombustByEntityEvent(this.getBukkitEntity(), entity.getBukkitEntity(), j * 4); ++ org.bukkit.Bukkit.getPluginManager().callEvent(combustEvent); ++ ++ if (!combustEvent.isCancelled()) { ++ entity.setOnFire(combustEvent.getDuration()); ++ } ++ // CraftBukkit end + } + } + +@@ -995,6 +1121,20 @@ + if (this.av()) { + this.mount((Entity) null); + } ++ ++ // CraftBukkit start - fire PlayerBedEnterEvent ++ if (this.getBukkitEntity() instanceof Player) { ++ Player player = (Player) this.getBukkitEntity(); ++ org.bukkit.block.Block bed = this.world.getWorld().getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ()); ++ ++ PlayerBedEnterEvent event = new PlayerBedEnterEvent(player, bed); ++ this.world.getServer().getPluginManager().callEvent(event); ++ ++ if (event.isCancelled()) { ++ return EnumBedResult.OTHER_PROBLEM; ++ } ++ } ++ // CraftBukkit end + + this.a(0.2F, 0.2F); + if (this.world.isLoaded(blockposition)) { +@@ -1077,6 +1217,23 @@ + if (!this.world.isStatic && flag1) { + this.world.everyoneSleeping(); + } ++ ++ // CraftBukkit start - fire PlayerBedLeaveEvent ++ if (this.getBukkitEntity() instanceof Player) { ++ Player player = (Player) this.getBukkitEntity(); ++ ++ org.bukkit.block.Block bed; ++ BlockPosition blockposition = this.bv; ++ if (blockposition != null) { ++ bed = this.world.getWorld().getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ()); ++ } else { ++ bed = this.world.getWorld().getBlockAt(player.getLocation()); ++ } ++ ++ PlayerBedLeaveEvent event = new PlayerBedLeaveEvent(player, bed); ++ this.world.getServer().getPluginManager().callEvent(event); ++ } ++ // CraftBukkit end + + this.sleepTicks = flag ? 0 : 100; + if (flag2) { +@@ -1128,9 +1285,11 @@ + if (blockposition != null) { + this.c = blockposition; + this.d = flag; ++ this.spawnWorld = this.world.worldData.getName(); // CraftBukkit + } else { + this.c = null; + this.d = false; ++ this.spawnWorld = ""; // CraftBukkit + } + + } +@@ -1477,6 +1636,7 @@ + } + + public IChatBaseComponent getScoreboardDisplayName() { ++ // CraftBukkit - todo: fun + ChatComponentText chatcomponenttext = new ChatComponentText(ScoreboardTeam.getPlayerDisplayName(this.getScoreboardTeam(), this.getName())); + + chatcomponenttext.getChatModifier().setChatClickable(new ChatClickable(EnumClickAction.SUGGEST_COMMAND, "/msg " + this.getName() + " ")); diff --git a/nms-patches/EntityInsentient.patch b/nms-patches/EntityInsentient.patch new file mode 100644 index 0000000000..17867b8da3 --- /dev/null +++ b/nms-patches/EntityInsentient.patch @@ -0,0 +1,164 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/EntityInsentient.java 2014-11-27 08:59:46.689421900 +1100 ++++ src/main/java/net/minecraft/server/EntityInsentient.java 2014-11-27 08:42:10.156850903 +1100 +@@ -4,6 +4,15 @@ + import java.util.List; + import java.util.UUID; + ++// CraftBukkit start ++import org.bukkit.craftbukkit.event.CraftEventFactory; ++import org.bukkit.craftbukkit.entity.CraftLivingEntity; ++import org.bukkit.event.entity.EntityTargetLivingEntityEvent; ++import org.bukkit.event.entity.EntityTargetEvent; ++import org.bukkit.event.entity.EntityUnleashEvent; ++import org.bukkit.event.entity.EntityUnleashEvent.UnleashReason; ++// CraftBukkit end ++ + public abstract class EntityInsentient extends EntityLiving { + + public int a_; +@@ -39,7 +48,9 @@ + for (int i = 0; i < this.dropChances.length; ++i) { + this.dropChances[i] = 0.085F; + } +- ++ // CraftBukkit start - default persistance to type's persistance value ++ this.persistent = !isTypeNotPersistent(); ++ // CraftBukkit end + } + + protected void aW() { +@@ -76,7 +87,37 @@ + } + + public void setGoalTarget(EntityLiving entityliving) { ++ // CraftBukkit start - fire event ++ setGoalTarget(entityliving, EntityTargetEvent.TargetReason.UNKNOWN, true); ++ } ++ ++ public void setGoalTarget(EntityLiving entityliving, EntityTargetEvent.TargetReason reason, boolean fireEvent) { ++ if (getGoalTarget() == entityliving) return; ++ if (fireEvent) { ++ if (reason == EntityTargetEvent.TargetReason.UNKNOWN && getGoalTarget() != null && entityliving == null) { ++ reason = getGoalTarget().isAlive() ? EntityTargetEvent.TargetReason.FORGOT_TARGET : EntityTargetEvent.TargetReason.TARGET_DIED; ++ } ++ if (reason == EntityTargetEvent.TargetReason.UNKNOWN) { ++ world.getServer().getLogger().log(java.util.logging.Level.WARNING, "Unknown target reason, please report on the issue tracker", new Exception()); ++ } ++ CraftLivingEntity ctarget = null; ++ if (entityliving != null) { ++ ctarget = (CraftLivingEntity) entityliving.getBukkitEntity(); ++ } ++ EntityTargetLivingEntityEvent event = new EntityTargetLivingEntityEvent(this.getBukkitEntity(), ctarget, reason); ++ world.getServer().getPluginManager().callEvent(event); ++ if (event.isCancelled()) { ++ return; ++ } ++ ++ if (event.getTarget() != null) { ++ entityliving = ((CraftLivingEntity) event.getTarget()).getHandle(); ++ } else { ++ entityliving = null; ++ } ++ } + this.goalTarget = entityliving; ++ // CraftBukkit end + } + + public boolean a(Class oclass) { +@@ -235,11 +276,21 @@ + + public void a(NBTTagCompound nbttagcompound) { + super.a(nbttagcompound); ++ ++ // CraftBukkit start - If looting or persistence is false only use it if it was set after we started using it + if (nbttagcompound.hasKeyOfType("CanPickUpLoot", 1)) { +- this.j(nbttagcompound.getBoolean("CanPickUpLoot")); ++ boolean data = nbttagcompound.getBoolean("CanPickUpLoot"); ++ if (isLevelAtLeast(nbttagcompound, 1) || data) { ++ this.j(data); ++ } + } + +- this.persistent = nbttagcompound.getBoolean("PersistenceRequired"); ++ boolean data = nbttagcompound.getBoolean("PersistenceRequired"); ++ if (isLevelAtLeast(nbttagcompound, 1) || data) { ++ this.persistent = data; ++ } ++ // CraftBukkit end ++ + NBTTagList nbttaglist; + int i; + +@@ -380,11 +431,11 @@ + double d2 = entityhuman.locZ - this.locZ; + double d3 = d0 * d0 + d1 * d1 + d2 * d2; + +- if (this.isTypeNotPersistent() && d3 > 16384.0D) { ++ if (d3 > 16384.0D) { // CraftBukkit - remove isTypeNotPersistent() check + this.die(); + } + +- if (this.aO > 600 && this.random.nextInt(800) == 0 && d3 > 1024.0D && this.isTypeNotPersistent()) { ++ if (this.aO > 600 && this.random.nextInt(800) == 0 && d3 > 1024.0D) { // CraftBukkit - remove isTypeNotPersistent() check + this.die(); + } else if (d3 < 1024.0D) { + this.aO = 0; +@@ -707,6 +758,12 @@ + + public final boolean e(EntityHuman entityhuman) { + if (this.cb() && this.getLeashHolder() == entityhuman) { ++ // CraftBukkit start - fire PlayerUnleashEntityEvent ++ if (CraftEventFactory.callPlayerUnleashEntityEvent(this, entityhuman).isCancelled()) { ++ ((EntityPlayer) entityhuman).playerConnection.sendPacket(new PacketPlayOutAttachEntity(1, this, this.getLeashHolder())); ++ return false; ++ } ++ // CraftBukkit end + this.unleash(true, !entityhuman.abilities.canInstantlyBuild); + return true; + } else { +@@ -714,12 +771,24 @@ + + if (itemstack != null && itemstack.getItem() == Items.LEAD && this.ca()) { + if (!(this instanceof EntityTameableAnimal) || !((EntityTameableAnimal) this).isTamed()) { ++ // CraftBukkit start - fire PlayerLeashEntityEvent ++ if (CraftEventFactory.callPlayerLeashEntityEvent(this, entityhuman, entityhuman).isCancelled()) { ++ ((EntityPlayer) entityhuman).playerConnection.sendPacket(new PacketPlayOutAttachEntity(1, this, this.getLeashHolder())); ++ return false; ++ } ++ // CraftBukkit end + this.setLeashHolder(entityhuman, true); + --itemstack.count; + return true; + } + + if (((EntityTameableAnimal) this).e((EntityLiving) entityhuman)) { ++ // CraftBukkit start - fire PlayerLeashEntityEvent ++ if (CraftEventFactory.callPlayerLeashEntityEvent(this, entityhuman, entityhuman).isCancelled()) { ++ ((EntityPlayer) entityhuman).playerConnection.sendPacket(new PacketPlayOutAttachEntity(1, this, this.getLeashHolder())); ++ return false; ++ } ++ // CraftBukkit end + this.setLeashHolder(entityhuman, true); + --itemstack.count; + return true; +@@ -741,10 +810,12 @@ + + if (this.bm) { + if (!this.isAlive()) { ++ this.world.getServer().getPluginManager().callEvent(new EntityUnleashEvent(this.getBukkitEntity(), UnleashReason.PLAYER_UNLEASH)); // CraftBukkit + this.unleash(true, true); + } + + if (this.bn == null || this.bn.dead) { ++ this.world.getServer().getPluginManager().callEvent(new EntityUnleashEvent(this.getBukkitEntity(), UnleashReason.HOLDER_GONE)); // CraftBukkit + this.unleash(true, true); + } + } +@@ -811,6 +882,7 @@ + + this.bn = entityleash; + } else { ++ this.world.getServer().getPluginManager().callEvent(new EntityUnleashEvent(this.getBukkitEntity(), UnleashReason.UNKNOWN)); // CraftBukkit + this.unleash(false, true); + } + } diff --git a/nms-patches/EntityIronGolem.patch b/nms-patches/EntityIronGolem.patch new file mode 100644 index 0000000000..e71334e17f --- /dev/null +++ b/nms-patches/EntityIronGolem.patch @@ -0,0 +1,11 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/EntityIronGolem.java 2014-11-27 08:59:46.689421900 +1100 ++++ src/main/java/net/minecraft/server/EntityIronGolem.java 2014-11-27 08:42:10.100851012 +1100 +@@ -57,7 +57,7 @@ + + protected void s(Entity entity) { + if (entity instanceof IMonster && this.bb().nextInt(20) == 0) { +- this.setGoalTarget((EntityLiving) entity); ++ this.setGoalTarget((EntityLiving) entity, org.bukkit.event.entity.EntityTargetLivingEntityEvent.TargetReason.COLLISION, true); // CraftBukkit - set reason + } + + super.s(entity); diff --git a/nms-patches/EntityItem.patch b/nms-patches/EntityItem.patch new file mode 100644 index 0000000000..0873e363cb --- /dev/null +++ b/nms-patches/EntityItem.patch @@ -0,0 +1,115 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/EntityItem.java 2014-11-27 08:59:46.693421882 +1100 ++++ src/main/java/net/minecraft/server/EntityItem.java 2014-11-27 08:42:10.104851005 +1100 +@@ -4,6 +4,8 @@ + import org.apache.logging.log4j.LogManager; + import org.apache.logging.log4j.Logger; + ++import org.bukkit.event.player.PlayerPickupItemEvent; // CraftBukkit ++ + public class EntityItem extends Entity { + + private static final Logger b = LogManager.getLogger(); +@@ -13,6 +15,7 @@ + private String f; + private String g; + public float a; ++ private int lastTick = MinecraftServer.currentTick; // CraftBukkit + + public EntityItem(World world, double d0, double d1, double d2) { + super(world); +@@ -28,6 +31,11 @@ + + public EntityItem(World world, double d0, double d1, double d2, ItemStack itemstack) { + this(world, d0, d1, d2); ++ // CraftBukkit start - Can't set null items in the datawatcher ++ if (itemstack == null || itemstack.getItem() == null) { ++ return; ++ } ++ // CraftBukkit end + this.setItemStack(itemstack); + } + +@@ -52,9 +60,12 @@ + this.die(); + } else { + super.s_(); +- if (this.pickupDelay > 0 && this.pickupDelay != 32767) { +- --this.pickupDelay; +- } ++ // CraftBukkit start - Use wall time for pickup and despawn timers ++ int elapsedTicks = MinecraftServer.currentTick - this.lastTick; ++ this.pickupDelay -= elapsedTicks; ++ this.age += elapsedTicks; ++ this.lastTick = MinecraftServer.currentTick; ++ // CraftBukkit end + + this.lastX = this.locX; + this.lastY = this.locY; +@@ -90,12 +101,20 @@ + this.motY *= -0.5D; + } + ++ /* Craftbukkit start - moved up + if (this.age != -32768) { + ++this.age; + } ++ // Craftbukkit end */ + + this.W(); + if (!this.world.isStatic && this.age >= 6000) { ++ // CraftBukkit start - fire ItemDespawnEvent ++ if (org.bukkit.craftbukkit.event.CraftEventFactory.callItemDespawnEvent(this).isCancelled()) { ++ this.age = 0; ++ return; ++ } ++ // CraftBukkit end + this.die(); + } + +@@ -228,7 +247,18 @@ + + NBTTagCompound nbttagcompound1 = nbttagcompound.getCompound("Item"); + +- this.setItemStack(ItemStack.createStack(nbttagcompound1)); ++ // CraftBukkit start - Handle missing "Item" compounds ++ if (nbttagcompound1 != null) { ++ ItemStack itemstack = ItemStack.createStack(nbttagcompound1); ++ if (itemstack != null) { ++ this.setItemStack(itemstack); ++ } else { ++ this.die(); ++ } ++ } else { ++ this.die(); ++ } ++ // CraftBukkit end + if (this.getItemStack() == null) { + this.die(); + } +@@ -239,6 +269,26 @@ + if (!this.world.isStatic) { + ItemStack itemstack = this.getItemStack(); + int i = itemstack.count; ++ ++ // CraftBukkit start - fire PlayerPickupItemEvent ++ int canHold = entityhuman.inventory.canHold(itemstack); ++ int remaining = itemstack.count - canHold; ++ ++ if (this.pickupDelay <= 0 && canHold > 0) { ++ itemstack.count = canHold; ++ PlayerPickupItemEvent event = new PlayerPickupItemEvent((org.bukkit.entity.Player) entityhuman.getBukkitEntity(), (org.bukkit.entity.Item) this.getBukkitEntity(), remaining); ++ // event.setCancelled(!entityhuman.canPickUpLoot); TODO ++ this.world.getServer().getPluginManager().callEvent(event); ++ itemstack.count = canHold + remaining; ++ ++ if (event.isCancelled()) { ++ return; ++ } ++ ++ // Possibly < 0; fix here so we do not have to modify code below ++ this.pickupDelay = 0; ++ } ++ // CraftBukkit end + + if (this.pickupDelay == 0 && (this.g == null || 6000 - this.age <= 200 || this.g.equals(entityhuman.getName())) && entityhuman.inventory.pickup(itemstack)) { + if (itemstack.getItem() == Item.getItemOf(Blocks.LOG)) { diff --git a/nms-patches/EntityItemFrame.patch b/nms-patches/EntityItemFrame.patch new file mode 100644 index 0000000000..1ae52fd27a --- /dev/null +++ b/nms-patches/EntityItemFrame.patch @@ -0,0 +1,15 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/EntityItemFrame.java 2014-11-27 08:59:46.693421882 +1100 ++++ src/main/java/net/minecraft/server/EntityItemFrame.java 2014-11-27 08:42:10.176850864 +1100 +@@ -27,6 +27,12 @@ + return false; + } else if (!damagesource.isExplosion() && this.getItem() != null) { + if (!this.world.isStatic) { ++ // CraftBukkit start - fire EntityDamageEvent ++ if (org.bukkit.craftbukkit.event.CraftEventFactory.handleNonLivingEntityDamageEvent(this, damagesource, f, false) || this.dead) { ++ return true; ++ } ++ // CraftBukkit end ++ + this.a(damagesource.getEntity(), false); + this.setItem((ItemStack) null); + } diff --git a/nms-patches/EntityLargeFireball.patch b/nms-patches/EntityLargeFireball.patch new file mode 100644 index 0000000000..2e14fc4d4e --- /dev/null +++ b/nms-patches/EntityLargeFireball.patch @@ -0,0 +1,38 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/EntityLargeFireball.java 2014-11-27 08:59:46.697421864 +1100 ++++ src/main/java/net/minecraft/server/EntityLargeFireball.java 2014-11-27 08:42:10.152850911 +1100 +@@ -1,5 +1,7 @@ + package net.minecraft.server; + ++import org.bukkit.event.entity.ExplosionPrimeEvent; // CraftBukkit ++ + public class EntityLargeFireball extends EntityFireball { + + public int yield = 1; +@@ -21,7 +23,16 @@ + + boolean flag = this.world.getGameRules().getBoolean("mobGriefing"); + +- this.world.createExplosion((Entity) null, this.locX, this.locY, this.locZ, (float) this.yield, flag, flag); ++ // CraftBukkit start - fire ExplosionPrimeEvent ++ ExplosionPrimeEvent event = new ExplosionPrimeEvent((org.bukkit.entity.Explosive) org.bukkit.craftbukkit.entity.CraftEntity.getEntity(this.world.getServer(), this)); ++ this.world.getServer().getPluginManager().callEvent(event); ++ ++ if (!event.isCancelled()) { ++ // give 'this' instead of (Entity) null so we know what causes the damage ++ this.world.createExplosion(this, this.locX, this.locY, this.locZ, event.getRadius(), event.getFire(), flag); ++ } ++ // CraftBukkit end ++ + this.die(); + } + +@@ -35,7 +46,8 @@ + public void a(NBTTagCompound nbttagcompound) { + super.a(nbttagcompound); + if (nbttagcompound.hasKeyOfType("ExplosionPower", 99)) { +- this.yield = nbttagcompound.getInt("ExplosionPower"); ++ // CraftBukkit - set bukkitYield when setting explosionpower ++ bukkitYield = this.yield = nbttagcompound.getInt("ExplosionPower"); + } + + } diff --git a/nms-patches/EntityLeash.patch b/nms-patches/EntityLeash.patch new file mode 100644 index 0000000000..65d979ac56 --- /dev/null +++ b/nms-patches/EntityLeash.patch @@ -0,0 +1,61 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/EntityLeash.java 2014-11-27 08:59:46.701421847 +1100 ++++ src/main/java/net/minecraft/server/EntityLeash.java 2014-11-27 08:42:10.136850942 +1100 +@@ -3,6 +3,8 @@ + import java.util.Iterator; + import java.util.List; + ++import org.bukkit.craftbukkit.event.CraftEventFactory; // CraftBukkit ++ + public class EntityLeash extends EntityHanging { + + public EntityLeash(World world) { +@@ -63,6 +65,12 @@ + while (iterator.hasNext()) { + entityinsentient = (EntityInsentient) iterator.next(); + if (entityinsentient.cb() && entityinsentient.getLeashHolder() == entityhuman) { ++ // CraftBukkit start ++ if (CraftEventFactory.callPlayerLeashEntityEvent(entityinsentient, this, entityhuman).isCancelled()) { ++ ((EntityPlayer) entityhuman).playerConnection.sendPacket(new PacketPlayOutAttachEntity(1, entityinsentient, entityinsentient.getLeashHolder())); ++ continue; ++ } ++ // CraftBukkit end + entityinsentient.setLeashHolder(this, true); + flag = true; + } +@@ -70,8 +78,11 @@ + } + + if (!this.world.isStatic && !flag) { +- this.die(); +- if (entityhuman.abilities.canInstantlyBuild) { ++ // CraftBukkit start - Move below ++ // this.die(); ++ boolean die = true; ++ // CraftBukkit end ++ if (true || entityhuman.abilities.canInstantlyBuild) { // CraftBukkit - Process for non-creative as well + d0 = 7.0D; + list = this.world.a(EntityInsentient.class, new AxisAlignedBB(this.locX - d0, this.locY - d0, this.locZ - d0, this.locX + d0, this.locY + d0, this.locZ + d0)); + iterator = list.iterator(); +@@ -79,10 +90,21 @@ + while (iterator.hasNext()) { + entityinsentient = (EntityInsentient) iterator.next(); + if (entityinsentient.cb() && entityinsentient.getLeashHolder() == this) { +- entityinsentient.unleash(true, false); ++ // CraftBukkit start ++ if (CraftEventFactory.callPlayerUnleashEntityEvent(entityinsentient, entityhuman).isCancelled()) { ++ die = false; ++ continue; ++ } ++ entityinsentient.unleash(true, !entityhuman.abilities.canInstantlyBuild); // false -> survival mode boolean ++ // CraftBukkit end + } + } + } ++ // CraftBukkit start ++ if (die) { ++ this.die(); ++ } ++ // CraftBukkit end + } + + return true; diff --git a/nms-patches/EntityLightning.patch b/nms-patches/EntityLightning.patch new file mode 100644 index 0000000000..7e8633d295 --- /dev/null +++ b/nms-patches/EntityLightning.patch @@ -0,0 +1,111 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/EntityLightning.java 2014-11-27 08:59:46.701421847 +1100 ++++ src/main/java/net/minecraft/server/EntityLightning.java 2014-11-27 08:42:10.116850981 +1100 +@@ -2,30 +2,54 @@ + + import java.util.List; + ++import org.bukkit.craftbukkit.event.CraftEventFactory; // CraftBukkit ++ + public class EntityLightning extends EntityWeather { + + private int lifeTicks; + public long a; + private int c; ++ ++ // CraftBukkit start ++ public boolean isEffect = false; + + public EntityLightning(World world, double d0, double d1, double d2) { ++ this(world, d0, d1, d2, false); ++ } ++ ++ public EntityLightning(World world, double d0, double d1, double d2, boolean isEffect) { ++ // CraftBukkit end ++ + super(world); ++ ++ // CraftBukkit - Set isEffect ++ this.isEffect = isEffect; ++ + this.setPositionRotation(d0, d1, d2, 0.0F, 0.0F); + this.lifeTicks = 2; + this.a = this.random.nextLong(); + this.c = this.random.nextInt(3) + 1; +- if (!world.isStatic && world.getGameRules().getBoolean("doFireTick") && (world.getDifficulty() == EnumDifficulty.NORMAL || world.getDifficulty() == EnumDifficulty.HARD) && world.areChunksLoaded(new BlockPosition(this), 10)) { ++ // CraftBukkit - add "!isEffect" ++ if (!isEffect && !world.isStatic && world.getGameRules().getBoolean("doFireTick") && (world.getDifficulty() == EnumDifficulty.NORMAL || world.getDifficulty() == EnumDifficulty.HARD) && world.areChunksLoaded(new BlockPosition(this), 10)) { + BlockPosition blockposition = new BlockPosition(this); + +- if (world.getType(blockposition).getBlock().getMaterial() == Material.AIR && Blocks.FIRE.canPlace(world, blockposition)) { +- world.setTypeUpdate(blockposition, Blocks.FIRE.getBlockData()); ++ if (world.getType(blockposition).getBlock().getMaterial() == Material.AIR && Blocks.FIRE.canPlace(world, blockposition)) { ++ // CraftBukkit start ++ if (!CraftEventFactory.callBlockIgniteEvent(world, blockposition.getX(), blockposition.getY(), blockposition.getZ(), this).isCancelled()) { ++ world.setTypeUpdate(blockposition, Blocks.FIRE.getBlockData()); ++ } ++ // CraftBukkit end + } + + for (int i = 0; i < 4; ++i) { + BlockPosition blockposition1 = blockposition.a(this.random.nextInt(3) - 1, this.random.nextInt(3) - 1, this.random.nextInt(3) - 1); + +- if (world.getType(blockposition1).getBlock().getMaterial() == Material.AIR && Blocks.FIRE.canPlace(world, blockposition1)) { +- world.setTypeUpdate(blockposition1, Blocks.FIRE.getBlockData()); ++ if (world.getType(blockposition1).getBlock().getMaterial() == Material.AIR && Blocks.FIRE.canPlace(world, blockposition1)) { ++ // CraftBukkit start ++ if (!CraftEventFactory.callBlockIgniteEvent(world, blockposition1.getX(), blockposition1.getY(), blockposition1.getZ(), this).isCancelled()) { ++ world.setTypeUpdate(blockposition1, Blocks.FIRE.getBlockData()); ++ } ++ // CraftBukkit end + } + } + } +@@ -35,7 +59,24 @@ + public void s_() { + super.s_(); + if (this.lifeTicks == 2) { +- this.world.makeSound(this.locX, this.locY, this.locZ, "ambient.weather.thunder", 10000.0F, 0.8F + this.random.nextFloat() * 0.2F); ++ // CraftBukkit start - Use relative location for far away sounds ++ //this.world.makeSound(this.locX, this.locY, this.locZ, "ambient.weather.thunder", 10000.0F, 0.8F + this.random.nextFloat() * 0.2F); ++ float pitch = 0.8F + this.random.nextFloat() * 0.2F; ++ int viewDistance = ((WorldServer) this.world).getServer().getViewDistance() * 16; ++ for (EntityPlayer player : (List) this.world.players) { ++ double deltaX = this.locX - player.locX; ++ double deltaZ = this.locZ - player.locZ; ++ double distanceSquared = deltaX * deltaX + deltaZ * deltaZ; ++ if (distanceSquared > viewDistance * viewDistance) { ++ double deltaLength = Math.sqrt(distanceSquared); ++ double relativeX = player.locX + (deltaX / deltaLength) * viewDistance; ++ double relativeZ = player.locZ + (deltaZ / deltaLength) * viewDistance; ++ player.playerConnection.sendPacket(new PacketPlayOutNamedSoundEffect("ambient.weather.thunder", relativeX, this.locY, relativeZ, 10000.0F, pitch)); ++ } else { ++ player.playerConnection.sendPacket(new PacketPlayOutNamedSoundEffect("ambient.weather.thunder", this.locX, this.locY, this.locZ, 10000.0F, pitch)); ++ } ++ } ++ // CraftBukkit end + this.world.makeSound(this.locX, this.locY, this.locZ, "random.explode", 2.0F, 0.5F + this.random.nextFloat() * 0.2F); + } + +@@ -48,14 +89,18 @@ + this.lifeTicks = 1; + this.a = this.random.nextLong(); + BlockPosition blockposition = new BlockPosition(this); +- +- if (!this.world.isStatic && this.world.getGameRules().getBoolean("doFireTick") && this.world.areChunksLoaded(blockposition, 10) && this.world.getType(blockposition).getBlock().getMaterial() == Material.AIR && Blocks.FIRE.canPlace(this.world, blockposition)) { +- this.world.setTypeUpdate(blockposition, Blocks.FIRE.getBlockData()); ++ // CraftBukkit - add "!isEffect" ++ if (!isEffect && !this.world.isStatic && this.world.getGameRules().getBoolean("doFireTick") && this.world.areChunksLoaded(blockposition, 10) && this.world.getType(blockposition).getBlock().getMaterial() == Material.AIR && Blocks.FIRE.canPlace(this.world, blockposition)) { ++ // CraftBukkit start ++ if (!CraftEventFactory.callBlockIgniteEvent(world, blockposition.getX(), blockposition.getY(), blockposition.getZ(), this).isCancelled()) { ++ this.world.setTypeUpdate(blockposition, Blocks.FIRE.getBlockData()); ++ } ++ // CraftBukkit end + } + } + } + +- if (this.lifeTicks >= 0) { ++ if (this.lifeTicks >= 0 && !this.isEffect) { // CraftBukkit - add !this.isEffect + if (this.world.isStatic) { + this.world.c(2); + } else { diff --git a/nms-patches/EntityLiving.patch b/nms-patches/EntityLiving.patch new file mode 100644 index 0000000000..880a5b3296 --- /dev/null +++ b/nms-patches/EntityLiving.patch @@ -0,0 +1,440 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/EntityLiving.java 2014-11-27 08:59:46.705421829 +1100 ++++ src/main/java/net/minecraft/server/EntityLiving.java 2014-11-27 08:42:10.160850895 +1100 +@@ -8,6 +8,15 @@ + import java.util.Random; + import java.util.UUID; + ++// CraftBukkit start ++import java.util.ArrayList; ++import com.google.common.base.Function; ++import org.bukkit.craftbukkit.event.CraftEventFactory; ++import org.bukkit.event.entity.EntityDamageEvent; ++import org.bukkit.event.entity.EntityDamageEvent.DamageModifier; ++import org.bukkit.event.entity.EntityRegainHealthEvent; ++// CraftBukkit end ++ + public abstract class EntityLiving extends Entity { + + private static final UUID a = UUID.fromString("662A6B8D-DA3E-4C1C-8813-96EA6097278D"); +@@ -67,6 +76,11 @@ + private float bk; + private int bl; + private float bm; ++ // CraftBukkit start ++ public int expToDrop; ++ public int maxAirTicks = 300; ++ ArrayList drops = null; ++ // CraftBukkit end + + public void G() { + this.damageEntity(DamageSource.OUT_OF_WORLD, Float.MAX_VALUE); +@@ -75,7 +89,8 @@ + public EntityLiving(World world) { + super(world); + this.aW(); +- this.setHealth(this.getMaxHealth()); ++ // CraftBukkit - setHealth(getMaxHealth()) inlined and simplified to skip the instanceof check for EntityPlayer, as getBukkitEntity() is not initialized in constructor ++ this.datawatcher.watch(6, (float) this.getAttributeInstance(GenericAttributes.maxHealth).getValue()); + this.k = true; + this.aF = (float) ((Math.random() + 1.0D) * 0.009999999776482582D); + this.setPosition(this.locX, this.locY, this.locZ); +@@ -116,8 +131,14 @@ + } + + int i = (int) (150.0D * d1); +- +- ((WorldServer) this.world).a(EnumParticle.BLOCK_DUST, this.locX, this.locY, this.locZ, i, 0.0D, 0.0D, 0.0D, 0.15000000596046448D, new int[] { Block.getCombinedId(iblockdata)}); ++ ++ // CraftBukkit start - visiblity api ++ if (this instanceof EntityPlayer) { ++ ((WorldServer) this.world).sendParticles((EntityPlayer) this, EnumParticle.BLOCK_DUST, false, this.locX, this.locY, this.locZ, i, 0.0D, 0.0D, 0.0D, 0.15000000596046448D, new int[] { Block.getCombinedId(iblockdata)}); ++ } else { ++ ((WorldServer) this.world).a(EnumParticle.BLOCK_DUST, this.locX, this.locY, this.locZ, i, 0.0D, 0.0D, 0.0D, 0.15000000596046448D, new int[] { Block.getCombinedId(iblockdata)}); ++ } ++ // CraftBukkit end + } + } + +@@ -174,7 +195,11 @@ + this.mount((Entity) null); + } + } else { +- this.setAirTicks(300); ++ // CraftBukkit start - Only set if needed to work around a DataWatcher inefficiency ++ if (this.getAirTicks() != 300) { ++ this.setAirTicks(maxAirTicks); ++ } ++ // CraftBukkit end + } + + if (this.isAlive() && this.U()) { +@@ -220,6 +245,18 @@ + this.lastPitch = this.pitch; + this.world.methodProfiler.b(); + } ++ ++ // CraftBukkit start ++ public int getExpReward() { ++ int exp = this.getExpValue(this.killer); ++ ++ if (!this.world.isStatic && (this.lastDamageByPlayerTime > 0 || this.alwaysGivesExp()) && this.aZ() && this.world.getGameRules().getBoolean("doMobLoot")) { ++ return exp; ++ } else { ++ return 0; ++ } ++ } ++ // CraftBukkit end + + public boolean isBaby() { + return false; +@@ -227,19 +264,18 @@ + + protected void aY() { + ++this.deathTicks; +- if (this.deathTicks == 20) { ++ if (this.deathTicks >= 20 && !this.dead) { // CraftBukkit - (this.deathTicks == 20) -> (this.deathTicks >= 20 && !this.dead) + int i; + +- if (!this.world.isStatic && (this.lastDamageByPlayerTime > 0 || this.alwaysGivesExp()) && this.aZ() && this.world.getGameRules().getBoolean("doMobLoot")) { +- i = this.getExpValue(this.killer); +- +- while (i > 0) { +- int j = EntityExperienceOrb.getOrbValue(i); +- +- i -= j; +- this.world.addEntity(new EntityExperienceOrb(this.world, this.locX, this.locY, this.locZ, j)); +- } ++ // CraftBukkit start - Update getExpReward() above if the removed if() changes! ++ i = this.expToDrop; ++ while (i > 0) { ++ int j = EntityExperienceOrb.getOrbValue(i); ++ i -= j; ++ this.world.addEntity(new EntityExperienceOrb(this.world, this.locX, this.locY, this.locZ, j)); + } ++ this.expToDrop = 0; ++ // CraftBukkit end + + this.die(); + +@@ -375,6 +411,17 @@ + } + } + } ++ ++ // CraftBukkit start ++ if (nbttagcompound.hasKey("Bukkit.MaxHealth")) { ++ NBTBase nbtbase = nbttagcompound.get("Bukkit.MaxHealth"); ++ if (nbtbase.getTypeId() == 5) { ++ this.getAttributeInstance(GenericAttributes.maxHealth).setValue((double) ((NBTTagFloat) nbtbase).c()); ++ } else if (nbtbase.getTypeId() == 3) { ++ this.getAttributeInstance(GenericAttributes.maxHealth).setValue((double) ((NBTTagInt) nbtbase).d()); ++ } ++ } ++ // CraftBukkit end + + if (nbttagcompound.hasKeyOfType("HealF", 99)) { + this.setHealth(nbttagcompound.getFloat("HealF")); +@@ -486,7 +533,8 @@ + } + + public boolean hasEffect(int i) { +- return this.effects.containsKey(Integer.valueOf(i)); ++ // CraftBukkit - Add size check for efficiency ++ return this.effects.size() != 0 && this.effects.containsKey(Integer.valueOf(i)); + } + + public boolean hasEffect(MobEffectList mobeffectlist) { +@@ -560,20 +608,52 @@ + + } + ++ // CraftBukkit start - Delegate so we can handle providing a reason for health being regained + public void heal(float f) { ++ heal(f, EntityRegainHealthEvent.RegainReason.CUSTOM); ++ } ++ ++ public void heal(float f, EntityRegainHealthEvent.RegainReason regainReason) { + float f1 = this.getHealth(); + + if (f1 > 0.0F) { +- this.setHealth(f1 + f); ++ EntityRegainHealthEvent event = new EntityRegainHealthEvent(this.getBukkitEntity(), f, regainReason); ++ this.world.getServer().getPluginManager().callEvent(event); ++ ++ if (!event.isCancelled()) { ++ this.setHealth((float) (this.getHealth() + event.getAmount())); ++ } ++ // CraftBukkit end + } + + } + + public final float getHealth() { ++ // CraftBukkit start - Use unscaled health ++ if (this instanceof EntityPlayer) { ++ return (float) ((EntityPlayer) this).getBukkitEntity().getHealth(); ++ } ++ // CraftBukkit end + return this.datawatcher.getFloat(6); + } + + public void setHealth(float f) { ++ // CraftBukkit start - Handle scaled health ++ if (this instanceof EntityPlayer) { ++ org.bukkit.craftbukkit.entity.CraftPlayer player = ((EntityPlayer) this).getBukkitEntity(); ++ // Squeeze ++ if (f < 0.0F) { ++ player.setRealHealth(0.0D); ++ } else if (f > player.getMaxHealth()) { ++ player.setRealHealth(player.getMaxHealth()); ++ } else { ++ player.setRealHealth(f); ++ } ++ ++ this.datawatcher.watch(6, Float.valueOf(player.getScaledHealth())); ++ return; ++ } ++ // CraftBukkit end + this.datawatcher.watch(6, Float.valueOf(MathHelper.a(f, 0.0F, this.getMaxHealth()))); + } + +@@ -589,7 +669,8 @@ + } else if (damagesource.o() && this.hasEffect(MobEffectList.FIRE_RESISTANCE)) { + return false; + } else { +- if ((damagesource == DamageSource.ANVIL || damagesource == DamageSource.FALLING_BLOCK) && this.getEquipment(4) != null) { ++ // CraftBukkit - Moved into d(DamageSource, float) ++ if (false && (damagesource == DamageSource.ANVIL || damagesource == DamageSource.FALLING_BLOCK) && this.getEquipment(4) != null) { + this.getEquipment(4).damage((int) (f * 4.0F + this.random.nextFloat() * f * 2.0F), this); + f *= 0.75F; + } +@@ -602,13 +683,22 @@ + return false; + } + +- this.d(damagesource, f - this.lastDamage); ++ // CraftBukkit start ++ if (!this.d(damagesource, f - this.lastDamage)) { ++ return false; ++ } ++ // CraftBukkit end + this.lastDamage = f; + flag = false; + } else { ++ // CraftBukkit start ++ float previousHealth = this.getHealth(); ++ if (!this.d(damagesource, f)) { ++ return false; ++ } + this.lastDamage = f; + this.noDamageTicks = this.maxNoDamageTicks; +- this.d(damagesource, f); ++ // CraftBukkit end + this.hurtTicks = this.at = 10; + } + +@@ -717,11 +807,19 @@ + } + + if (this.aZ() && this.world.getGameRules().getBoolean("doMobLoot")) { ++ this.drops = new ArrayList(); // CraftBukkit - Setup drop capture ++ + this.dropDeathLoot(this.lastDamageByPlayerTime > 0, i); + this.dropEquipment(this.lastDamageByPlayerTime > 0, i); + if (this.lastDamageByPlayerTime > 0 && this.random.nextFloat() < 0.025F + (float) i * 0.01F) { + this.getRareDrop(); +- } ++ } ++ // CraftBukkit start - Call death event ++ CraftEventFactory.callEntityDeathEvent(this, this.drops); ++ this.drops = null; ++ } else { ++ CraftEventFactory.callEntityDeathEvent(this); ++ // CraftBukkit end + } + } + +@@ -781,8 +879,13 @@ + int i = MathHelper.f((f - 3.0F - f2) * f1); + + if (i > 0) { ++ // CraftBukkit start ++ if (!this.damageEntity(DamageSource.FALL, (float) i)) { ++ return; ++ } ++ // CraftBukkit end + this.makeSound(this.n(i), 1.0F, 1.0F); +- this.damageEntity(DamageSource.FALL, (float) i); ++ // this.damageEntity(DamageSource.FALL, (float) i); // CraftBukkit - moved up + int j = MathHelper.floor(this.locX); + int k = MathHelper.floor(this.locY - 0.20000000298023224D); + int l = MathHelper.floor(this.locZ); +@@ -826,7 +929,7 @@ + int i = 25 - this.bq(); + float f1 = f * (float) i; + +- this.damageArmor(f); ++ // this.damageArmor(f); // CraftBukkit - Moved into d(DamageSource, float) + f = f1 / 25.0F; + } + +@@ -840,8 +943,9 @@ + int i; + int j; + float f1; +- +- if (this.hasEffect(MobEffectList.RESISTANCE) && damagesource != DamageSource.OUT_OF_WORLD) { ++ ++ // CraftBukkit - Moved to d(DamageSource, float) ++ if (false && this.hasEffect(MobEffectList.RESISTANCE) && damagesource != DamageSource.OUT_OF_WORLD) { + i = (this.getEffect(MobEffectList.RESISTANCE).getAmplifier() + 1) * 5; + j = 25 - i; + f1 = f * (float) j; +@@ -867,22 +971,117 @@ + } + } + +- protected void d(DamageSource damagesource, float f) { ++ // CraftBukkit start ++ protected boolean d(final DamageSource damagesource, float f) { // void -> boolean, add final + if (!this.isInvulnerable(damagesource)) { +- f = this.applyArmorModifier(damagesource, f); +- f = this.applyMagicModifier(damagesource, f); +- float f1 = f; ++ final boolean human = this instanceof EntityHuman; ++ float originalDamage = f; ++ Function hardHat = new Function() { ++ @Override ++ public Double apply(Double f) { ++ if ((damagesource == DamageSource.ANVIL || damagesource == DamageSource.FALLING_BLOCK) && EntityLiving.this.getEquipment(4) != null) { ++ return -(f - (f * 0.75F)); ++ } ++ return -0.0; ++ } ++ }; ++ float hardHatModifier = hardHat.apply((double) f).floatValue(); ++ f += hardHatModifier; ++ ++ Function blocking = new Function() { ++ @Override ++ public Double apply(Double f) { ++ if (human) { ++ if (!damagesource.ignoresArmor() && ((EntityHuman) EntityLiving.this).isBlocking() && f > 0.0F) { ++ return -(f - ((1.0F + f) * 0.5F)); ++ } ++ } ++ return -0.0; ++ } ++ }; ++ float blockingModifier = blocking.apply((double) f).floatValue(); ++ f += blockingModifier; ++ ++ Function armor = new Function() { ++ @Override ++ public Double apply(Double f) { ++ return -(f - EntityLiving.this.applyArmorModifier(damagesource, f.floatValue())); ++ } ++ }; ++ float armorModifier = armor.apply((double) f).floatValue(); ++ f += armorModifier; ++ ++ Function resistance = new Function() { ++ @Override ++ public Double apply(Double f) { ++ if (!damagesource.isStarvation() && EntityLiving.this.hasEffect(MobEffectList.RESISTANCE) && damagesource != DamageSource.OUT_OF_WORLD) { ++ int i = (EntityLiving.this.getEffect(MobEffectList.RESISTANCE).getAmplifier() + 1) * 5; ++ int j = 25 - i; ++ float f1 = f.floatValue() * (float) j; ++ return -(f - (f1 / 25.0F)); ++ } ++ return -0.0; ++ } ++ }; ++ float resistanceModifier = resistance.apply((double) f).floatValue(); ++ f += resistanceModifier; ++ ++ Function magic = new Function() { ++ @Override ++ public Double apply(Double f) { ++ return -(f - EntityLiving.this.applyMagicModifier(damagesource, f.floatValue())); ++ } ++ }; ++ float magicModifier = magic.apply((double) f).floatValue(); ++ f += magicModifier; ++ ++ Function absorption = new Function() { ++ @Override ++ public Double apply(Double f) { ++ return -(Math.max(f - Math.max(f - EntityLiving.this.getAbsorptionHearts(), 0.0F), 0.0F)); ++ } ++ }; ++ float absorptionModifier = absorption.apply((double) f).floatValue(); ++ ++ EntityDamageEvent event = CraftEventFactory.handleLivingEntityDamageEvent(this, damagesource, originalDamage, hardHatModifier, blockingModifier, armorModifier, resistanceModifier, magicModifier, absorptionModifier, hardHat, blocking, armor, resistance, magic, absorption); ++ if (event.isCancelled()) { ++ return false; ++ } ++ ++ f = (float) event.getFinalDamage(); + +- f = Math.max(f - this.getAbsorptionHearts(), 0.0F); +- this.setAbsorptionHearts(this.getAbsorptionHearts() - (f1 - f)); ++ // Apply damage to helmet ++ if ((damagesource == DamageSource.ANVIL || damagesource == DamageSource.FALLING_BLOCK) && this.getEquipment(4) != null) { ++ this.getEquipment(4).damage((int) (event.getDamage() * 4.0F + this.random.nextFloat() * event.getDamage() * 2.0F), this); ++ } ++ ++ // Apply damage to armor ++ if (!damagesource.ignoresArmor()) { ++ float armorDamage = (float) (event.getDamage() + event.getDamage(DamageModifier.BLOCKING) + event.getDamage(DamageModifier.HARD_HAT)); ++ this.damageArmor(armorDamage); ++ } ++ ++ absorptionModifier = (float) -event.getDamage(DamageModifier.ABSORPTION); ++ this.setAbsorptionHearts(Math.max(this.getAbsorptionHearts() - absorptionModifier, 0.0F)); + if (f != 0.0F) { ++ if (human) { ++ ((EntityHuman) this).applyExhaustion(damagesource.getExhaustionCost()); ++ } ++ // CraftBukkit end + float f2 = this.getHealth(); + + this.setHealth(f2 - f); + this.br().a(damagesource, f2, f); ++ // CraftBukkit start ++ if (human) { ++ return true; ++ } ++ // CraftBukkit end + this.setAbsorptionHearts(this.getAbsorptionHearts() - f); + } ++ return true; // CraftBukkit + } ++ return false; // CraftBukkit + } + + public CombatTracker br() { +@@ -1236,7 +1435,8 @@ + if (f > 0.0025000002F) { + f3 = 1.0F; + f2 = (float) Math.sqrt((double) f) * 3.0F; +- f1 = (float) Math.atan2(d1, d0) * 180.0F / 3.1415927F - 90.0F; ++ // CraftBukkit - Math -> TrigMath ++ f1 = (float) org.bukkit.craftbukkit.TrigMath.atan2(d1, d0) * 180.0F / 3.1415927F - 90.0F; + } + + if (this.ax > 0.0F) { +@@ -1400,6 +1600,13 @@ + if (list != null && !list.isEmpty()) { + for (int i = 0; i < list.size(); ++i) { + Entity entity = (Entity) list.get(i); ++ ++ // TODO better check now? ++ // CraftBukkit start - Only handle mob (non-player) collisions every other tick ++ if (entity instanceof EntityLiving && !(this instanceof EntityPlayer) && this.ticksLived % 2 == 0) { ++ continue; ++ } ++ // CraftBukkit end + + if (entity.ae()) { + this.s(entity); diff --git a/nms-patches/EntityMinecartAbstract.patch b/nms-patches/EntityMinecartAbstract.patch new file mode 100644 index 0000000000..c8ed3d563a --- /dev/null +++ b/nms-patches/EntityMinecartAbstract.patch @@ -0,0 +1,231 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/EntityMinecartAbstract.java 2014-11-27 08:59:46.705421829 +1100 ++++ src/main/java/net/minecraft/server/EntityMinecartAbstract.java 2014-11-27 08:42:10.136850942 +1100 +@@ -2,6 +2,15 @@ + + import java.util.Iterator; + ++// CraftBukkit start ++import org.bukkit.Location; ++import org.bukkit.entity.Vehicle; ++import org.bukkit.event.vehicle.VehicleDamageEvent; ++import org.bukkit.event.vehicle.VehicleDestroyEvent; ++import org.bukkit.event.vehicle.VehicleEntityCollisionEvent; ++import org.bukkit.util.Vector; ++// CraftBukkit end ++ + public abstract class EntityMinecartAbstract extends Entity implements INamableTileEntity { + + private boolean a; +@@ -13,6 +22,17 @@ + private double g; + private double h; + private double i; ++ ++ // CraftBukkit start ++ public boolean slowWhenEmpty = true; ++ private double derailedX = 0.5; ++ private double derailedY = 0.5; ++ private double derailedZ = 0.5; ++ private double flyingX = 0.95; ++ private double flyingY = 0.95; ++ private double flyingZ = 0.95; ++ public double maxSpeed = 0.4D; ++ // CraftBukkit end + + public EntityMinecartAbstract(World world) { + super(world); +@@ -79,6 +99,8 @@ + this.lastX = d0; + this.lastY = d1; + this.lastZ = d2; ++ ++ this.world.getServer().getPluginManager().callEvent(new org.bukkit.event.vehicle.VehicleCreateEvent((Vehicle) this.getBukkitEntity())); // CraftBukkit + } + + public double an() { +@@ -90,16 +112,39 @@ + if (this.isInvulnerable(damagesource)) { + return false; + } else { ++ // CraftBukkit start - fire VehicleDamageEvent ++ Vehicle vehicle = (Vehicle) this.getBukkitEntity(); ++ org.bukkit.entity.Entity passenger = (damagesource.getEntity() == null) ? null : damagesource.getEntity().getBukkitEntity(); ++ ++ VehicleDamageEvent event = new VehicleDamageEvent(vehicle, passenger, f); ++ this.world.getServer().getPluginManager().callEvent(event); ++ ++ if (event.isCancelled()) { ++ return true; ++ } ++ ++ f = (float) event.getDamage(); ++ // CraftBukkit end ++ + this.k(-this.r()); + this.j(10); + this.ac(); + this.setDamage(this.getDamage() + f * 10.0F); + boolean flag = damagesource.getEntity() instanceof EntityHuman && ((EntityHuman) damagesource.getEntity()).abilities.canInstantlyBuild; + +- if (flag || this.getDamage() > 40.0F) { ++ if (flag || this.getDamage() > 40.0F) { // CraftBukkit - multi-world should still allow teleport even if default vanilla nether disabled + if (this.passenger != null) { + this.passenger.mount((Entity) null); + } ++ // CraftBukkit start ++ VehicleDestroyEvent destroyEvent = new VehicleDestroyEvent(vehicle, passenger); ++ this.world.getServer().getPluginManager().callEvent(destroyEvent); ++ ++ if (destroyEvent.isCancelled()) { ++ this.setDamage(40); // Maximize damage so this doesn't get triggered again right away ++ return true; ++ } ++ // CraftBukkit end + + if (flag && !this.hasCustomName()) { + this.die(); +@@ -135,6 +180,14 @@ + } + + public void s_() { ++ // CraftBukkit start ++ double prevX = this.locX; ++ double prevY = this.locY; ++ double prevZ = this.locZ; ++ float prevYaw = this.yaw; ++ float prevPitch = this.pitch; ++ // CraftBukkit end ++ + if (this.getType() > 0) { + this.j(this.getType() - 1); + } +@@ -155,7 +208,7 @@ + + i = this.L(); + if (this.ak) { +- if (minecraftserver.getAllowNether()) { ++ if (true || minecraftserver.getAllowNether()) { + if (this.vehicle == null && this.al++ >= i) { + this.al = i; + this.portalCooldown = this.ar(); +@@ -252,6 +305,20 @@ + } + + this.setYawPitch(this.yaw, this.pitch); ++ ++ // CraftBukkit start ++ org.bukkit.World bworld = this.world.getWorld(); ++ Location from = new Location(bworld, prevX, prevY, prevZ, prevYaw, prevPitch); ++ Location to = new Location(bworld, this.locX, this.locY, this.locZ, this.yaw, this.pitch); ++ Vehicle vehicle = (Vehicle) this.getBukkitEntity(); ++ ++ this.world.getServer().getPluginManager().callEvent(new org.bukkit.event.vehicle.VehicleUpdateEvent(vehicle)); ++ ++ if (!from.equals(to)) { ++ this.world.getServer().getPluginManager().callEvent(new org.bukkit.event.vehicle.VehicleMoveEvent(vehicle, from, to)); ++ } ++ // CraftBukkit end ++ + Iterator iterator = this.world.getEntities(this, this.getBoundingBox().grow(0.20000000298023224D, 0.0D, 0.20000000298023224D)).iterator(); + + while (iterator.hasNext()) { +@@ -275,7 +342,7 @@ + } + + protected double m() { +- return 0.4D; ++ return this.maxSpeed; // CraftBukkit + } + + public void a(int i, int j, int k, boolean flag) {} +@@ -286,16 +353,20 @@ + this.motX = MathHelper.a(this.motX, -d0, d0); + this.motZ = MathHelper.a(this.motZ, -d0, d0); + if (this.onGround) { +- this.motX *= 0.5D; +- this.motY *= 0.5D; +- this.motZ *= 0.5D; ++ // CraftBukkit start - replace magic numbers with our variables ++ this.motX *= this.derailedX; ++ this.motY *= this.derailedY; ++ this.motZ *= this.derailedZ; ++ // CraftBukkit end + } + + this.move(this.motX, this.motY, this.motZ); + if (!this.onGround) { +- this.motX *= 0.949999988079071D; +- this.motY *= 0.949999988079071D; +- this.motZ *= 0.949999988079071D; ++ // CraftBukkit start - replace magic numbers with our variables ++ this.motX *= this.flyingX; ++ this.motY *= this.flyingY; ++ this.motZ *= this.flyingZ; ++ // CraftBukkit end + } + + } +@@ -483,7 +554,7 @@ + } + + protected void o() { +- if (this.passenger != null) { ++ if (this.passenger != null || !this.slowWhenEmpty) { // CraftBukkit - add !this.slowWhenEmpty + this.motX *= 0.996999979019165D; + this.motY *= 0.0D; + this.motZ *= 0.996999979019165D; +@@ -611,6 +682,17 @@ + if (!this.world.isStatic) { + if (!entity.T && !this.T) { + if (entity != this.passenger) { ++ // CraftBukkit start ++ Vehicle vehicle = (Vehicle) this.getBukkitEntity(); ++ org.bukkit.entity.Entity hitEntity = (entity == null) ? null : entity.getBukkitEntity(); ++ ++ VehicleEntityCollisionEvent collisionEvent = new VehicleEntityCollisionEvent(vehicle, hitEntity); ++ this.world.getServer().getPluginManager().callEvent(collisionEvent); ++ ++ if (collisionEvent.isCancelled()) { ++ return; ++ } ++ // CraftBukkit end + if (entity instanceof EntityLiving && !(entity instanceof EntityHuman) && !(entity instanceof EntityIronGolem) && this.s() == EnumMinecartType.RIDEABLE && this.motX * this.motX + this.motZ * this.motZ > 0.01D && this.passenger == null && entity.vehicle == null) { + entity.mount(this); + } +@@ -619,7 +701,8 @@ + double d1 = entity.locZ - this.locZ; + double d2 = d0 * d0 + d1 * d1; + +- if (d2 >= 9.999999747378752E-5D) { ++ // CraftBukkit - collision ++ if (d2 >= 9.999999747378752E-5D && !collisionEvent.isCollisionCancelled()) { + d2 = (double) MathHelper.sqrt(d2); + d0 /= d2; + d1 /= d2; +@@ -775,4 +858,26 @@ + return chatmessage; + } + } ++ ++ // CraftBukkit start - Methods for getting and setting flying and derailed velocity modifiers ++ public Vector getFlyingVelocityMod() { ++ return new Vector(flyingX, flyingY, flyingZ); ++ } ++ ++ public void setFlyingVelocityMod(Vector flying) { ++ flyingX = flying.getX(); ++ flyingY = flying.getY(); ++ flyingZ = flying.getZ(); ++ } ++ ++ public Vector getDerailedVelocityMod() { ++ return new Vector(derailedX, derailedY, derailedZ); ++ } ++ ++ public void setDerailedVelocityMod(Vector derailed) { ++ derailedX = derailed.getX(); ++ derailedY = derailed.getY(); ++ derailedZ = derailed.getZ(); ++ } ++ // CraftBukkit end + } diff --git a/nms-patches/EntityMinecartCommandBlockListener.patch b/nms-patches/EntityMinecartCommandBlockListener.patch new file mode 100644 index 0000000000..ccfa4973c9 --- /dev/null +++ b/nms-patches/EntityMinecartCommandBlockListener.patch @@ -0,0 +1,10 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/EntityMinecartCommandBlockListener.java 2014-11-27 08:59:46.709421812 +1100 ++++ src/main/java/net/minecraft/server/EntityMinecartCommandBlockListener.java 2014-11-27 08:42:10.088851036 +1100 +@@ -6,6 +6,7 @@ + + EntityMinecartCommandBlockListener(EntityMinecartCommandBlock entityminecartcommandblock) { + this.a = entityminecartcommandblock; ++ this.sender = (org.bukkit.craftbukkit.entity.CraftMinecartCommand) entityminecartcommandblock.getBukkitEntity(); // CraftBukkit - Set the sender + } + + public void h() { diff --git a/nms-patches/EntityMinecartContainer.patch b/nms-patches/EntityMinecartContainer.patch new file mode 100644 index 0000000000..3a7c0c58f4 --- /dev/null +++ b/nms-patches/EntityMinecartContainer.patch @@ -0,0 +1,61 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/EntityMinecartContainer.java 2014-11-27 08:59:46.709421812 +1100 ++++ src/main/java/net/minecraft/server/EntityMinecartContainer.java 2014-11-27 08:42:10.120850973 +1100 +@@ -1,9 +1,48 @@ + package net.minecraft.server; + ++// CraftBukkit start ++import java.util.List; ++ ++import org.bukkit.craftbukkit.entity.CraftHumanEntity; ++import org.bukkit.entity.HumanEntity; ++import org.bukkit.inventory.InventoryHolder; ++// CraftBukkit end ++ + public abstract class EntityMinecartContainer extends EntityMinecartAbstract implements ITileInventory { + +- private ItemStack[] items = new ItemStack[36]; ++ private ItemStack[] items = new ItemStack[27]; // CraftBukkit - 36 -> 27 + private boolean b = true; ++ ++ // CraftBukkit start ++ public List transaction = new java.util.ArrayList(); ++ private int maxStack = MAX_STACK; ++ ++ public ItemStack[] getContents() { ++ return this.items; ++ } ++ ++ public void onOpen(CraftHumanEntity who) { ++ transaction.add(who); ++ } ++ ++ public void onClose(CraftHumanEntity who) { ++ transaction.remove(who); ++ } ++ ++ public List getViewers() { ++ return transaction; ++ } ++ ++ public InventoryHolder getOwner() { ++ org.bukkit.entity.Entity cart = getBukkitEntity(); ++ if(cart instanceof InventoryHolder) return (InventoryHolder) cart; ++ return null; ++ } ++ ++ public void setMaxStackSize(int size) { ++ maxStack = size; ++ } ++ // CraftBukkit end + + public EntityMinecartContainer(World world) { + super(world); +@@ -81,7 +120,7 @@ + } + + public int getMaxStackSize() { +- return 64; ++ return maxStack; // CraftBukkit + } + + public void c(int i) { diff --git a/nms-patches/EntityMonster.patch b/nms-patches/EntityMonster.patch new file mode 100644 index 0000000000..f5500facb8 --- /dev/null +++ b/nms-patches/EntityMonster.patch @@ -0,0 +1,26 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/EntityMonster.java 2014-11-27 08:59:46.709421812 +1100 ++++ src/main/java/net/minecraft/server/EntityMonster.java 2014-11-27 08:42:10.164850887 +1100 +@@ -1,5 +1,7 @@ + package net.minecraft.server; + ++import org.bukkit.event.entity.EntityCombustByEntityEvent; // CraftBukkit ++ + public abstract class EntityMonster extends EntityCreature implements IMonster { + + protected final PathfinderGoal a = new PathfinderGoalAvoidTarget(this, new EntitySelectorExplodingCreeper(this), 4.0F, 1.0D, 2.0D); +@@ -81,7 +83,14 @@ + int j = EnchantmentManager.getFireAspectEnchantmentLevel(this); + + if (j > 0) { +- entity.setOnFire(j * 4); ++ // CraftBukkit start - Call a combust event when somebody hits with a fire enchanted item ++ EntityCombustByEntityEvent combustEvent = new EntityCombustByEntityEvent(this.getBukkitEntity(), entity.getBukkitEntity(), j * 4); ++ org.bukkit.Bukkit.getPluginManager().callEvent(combustEvent); ++ ++ if (!combustEvent.isCancelled()) { ++ entity.setOnFire(combustEvent.getDuration()); ++ } ++ // CraftBukkit end + } + + this.a((EntityLiving) this, entity); diff --git a/nms-patches/EntityMushroomCow.patch b/nms-patches/EntityMushroomCow.patch new file mode 100644 index 0000000000..2d2507ed62 --- /dev/null +++ b/nms-patches/EntityMushroomCow.patch @@ -0,0 +1,26 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/EntityMushroomCow.java 2014-11-27 08:59:46.713421793 +1100 ++++ src/main/java/net/minecraft/server/EntityMushroomCow.java 2014-11-27 08:42:10.084851043 +1100 +@@ -1,5 +1,7 @@ + package net.minecraft.server; + ++import org.bukkit.event.player.PlayerShearEntityEvent; // CraftBukkit ++ + public class EntityMushroomCow extends EntityCow { + + public EntityMushroomCow(World world) { +@@ -24,6 +26,15 @@ + } + + if (itemstack != null && itemstack.getItem() == Items.SHEARS && this.getAge() >= 0) { ++ // CraftBukkit start ++ PlayerShearEntityEvent event = new PlayerShearEntityEvent((org.bukkit.entity.Player) entityhuman.getBukkitEntity(), this.getBukkitEntity()); ++ this.world.getServer().getPluginManager().callEvent(event); ++ ++ if (event.isCancelled()) { ++ return false; ++ } ++ // CraftBukkit end ++ + this.die(); + this.world.addParticle(EnumParticle.EXPLOSION_LARGE, this.locX, this.locY + (double) (this.length / 2.0F), this.locZ, 0.0D, 0.0D, 0.0D, new int[0]); + if (!this.world.isStatic) { diff --git a/nms-patches/EntityOcelot.patch b/nms-patches/EntityOcelot.patch new file mode 100644 index 0000000000..1abf343c8e --- /dev/null +++ b/nms-patches/EntityOcelot.patch @@ -0,0 +1,30 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/EntityOcelot.java 2014-11-27 08:59:46.713421793 +1100 ++++ src/main/java/net/minecraft/server/EntityOcelot.java 2014-11-27 08:42:10.160850895 +1100 +@@ -51,7 +51,7 @@ + } + + protected boolean isTypeNotPersistent() { +- return !this.isTamed() && this.ticksLived > 2400; ++ return !this.isTamed() /*&& this.ticksLived > 2400*/; // CraftBukkit + } + + protected void aW() { +@@ -124,7 +124,8 @@ + } + + if (!this.world.isStatic) { +- if (this.random.nextInt(3) == 0) { ++ // CraftBukkit - added event call and isCancelled check ++ if (this.random.nextInt(3) == 0 && !org.bukkit.craftbukkit.event.CraftEventFactory.callEntityTameEvent(this, entityhuman).isCancelled()) { + this.setTamed(true); + this.setCatType(1 + this.world.random.nextInt(3)); + this.setOwnerUUID(entityhuman.getUniqueID().toString()); +@@ -231,7 +232,7 @@ + + entityocelot.setPositionRotation(this.locX, this.locY, this.locZ, this.yaw, 0.0F); + entityocelot.setAgeRaw(-24000); +- this.world.addEntity(entityocelot); ++ this.world.addEntity(entityocelot, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.OCELOT_BABY); // CraftBukkit - add SpawnReason + } + } + diff --git a/nms-patches/EntityPainting.patch b/nms-patches/EntityPainting.patch new file mode 100644 index 0000000000..7c698b4f44 --- /dev/null +++ b/nms-patches/EntityPainting.patch @@ -0,0 +1,10 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/EntityPainting.java 2014-11-27 08:59:46.717421776 +1100 ++++ src/main/java/net/minecraft/server/EntityPainting.java 2014-11-27 08:42:10.132850949 +1100 +@@ -9,6 +9,7 @@ + + public EntityPainting(World world) { + super(world); ++ this.art = EnumArt.values()[this.random.nextInt(EnumArt.values().length)]; // CraftBukkit - generate a non-null painting + } + + public EntityPainting(World world, BlockPosition blockposition, EnumDirection enumdirection) { diff --git a/nms-patches/EntityPig.patch b/nms-patches/EntityPig.patch new file mode 100644 index 0000000000..064655a70a --- /dev/null +++ b/nms-patches/EntityPig.patch @@ -0,0 +1,29 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/EntityPig.java 2014-11-27 08:59:46.717421776 +1100 ++++ src/main/java/net/minecraft/server/EntityPig.java 2014-11-27 08:42:10.140850934 +1100 +@@ -1,5 +1,7 @@ + package net.minecraft.server; + ++import org.bukkit.craftbukkit.event.CraftEventFactory; // CraftBukkit ++ + public class EntityPig extends EntityAnimal { + + private final PathfinderGoalPassengerCarrotStick bk; +@@ -111,10 +113,17 @@ + public void onLightningStrike(EntityLightning entitylightning) { + if (!this.world.isStatic) { + EntityPigZombie entitypigzombie = new EntityPigZombie(this.world); ++ ++ // CraftBukkit start ++ if (CraftEventFactory.callPigZapEvent(this, entitylightning, entitypigzombie).isCancelled()) { ++ return; ++ } ++ // CraftBukkit end + + entitypigzombie.setEquipment(0, new ItemStack(Items.GOLDEN_SWORD)); + entitypigzombie.setPositionRotation(this.locX, this.locY, this.locZ, this.yaw, this.pitch); +- this.world.addEntity(entitypigzombie); ++ // CraftBukkit - added a reason for spawning this creature ++ this.world.addEntity(entitypigzombie, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.LIGHTNING); + this.die(); + } + } diff --git a/nms-patches/EntityPlayer.patch b/nms-patches/EntityPlayer.patch new file mode 100644 index 0000000000..e63348a005 --- /dev/null +++ b/nms-patches/EntityPlayer.patch @@ -0,0 +1,542 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/EntityPlayer.java 2014-11-27 08:59:46.721421758 +1100 ++++ src/main/java/net/minecraft/server/EntityPlayer.java 2014-11-27 08:42:10.164850887 +1100 +@@ -13,6 +13,17 @@ + import org.apache.logging.log4j.LogManager; + import org.apache.logging.log4j.Logger; + ++// CraftBukkit start ++import org.bukkit.Bukkit; ++import org.bukkit.WeatherType; ++import org.bukkit.craftbukkit.CraftWorld; ++import org.bukkit.craftbukkit.entity.CraftPlayer; ++import org.bukkit.craftbukkit.event.CraftEventFactory; ++import org.bukkit.craftbukkit.inventory.CraftItemStack; ++import org.bukkit.event.inventory.InventoryType; ++import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause; ++// CraftBukkit end ++ + public class EntityPlayer extends EntityHuman implements ICrafting { + + private static final Logger bF = LogManager.getLogger(); +@@ -39,6 +50,18 @@ + public boolean g; + public int ping; + public boolean viewingCredits; ++ ++ // CraftBukkit start ++ public String displayName; ++ public IChatBaseComponent listName; ++ public org.bukkit.Location compassTarget; ++ public int newExp = 0; ++ public int newLevel = 0; ++ public int newTotalExp = 0; ++ public boolean keepLevel = false; ++ public double maxHealthCache; ++ public boolean joining = true; ++ // CraftBukkit end + + public EntityPlayer(MinecraftServer minecraftserver, WorldServer worldserver, GameProfile gameprofile, PlayerInteractManager playerinteractmanager) { + super(worldserver, gameprofile); +@@ -69,7 +92,11 @@ + while (!worldserver.getCubes(this, this.getBoundingBox()).isEmpty() && this.locY < 255.0D) { + this.setPosition(this.locX, this.locY + 1.0D, this.locZ); + } +- ++ // CraftBukkit start ++ this.displayName = this.getName(); ++ // this.canPickUpLoot = true; TODO ++ this.maxHealthCache = this.getMaxHealth(); ++ // CraftBukkit end + } + + public void a(NBTTagCompound nbttagcompound) { +@@ -81,13 +108,39 @@ + this.playerInteractManager.setGameMode(EnumGamemode.getById(nbttagcompound.getInt("playerGameType"))); + } + } +- ++ this.getBukkitEntity().readExtraData(nbttagcompound); // CraftBukkit + } + + public void b(NBTTagCompound nbttagcompound) { + super.b(nbttagcompound); + nbttagcompound.setInt("playerGameType", this.playerInteractManager.getGameMode().getId()); ++ this.getBukkitEntity().setExtraData(nbttagcompound); // CraftBukkit ++ } ++ ++ // CraftBukkit start - World fallback code, either respawn location or global spawn ++ public void spawnIn(World world) { ++ super.spawnIn(world); ++ if (world == null) { ++ this.dead = false; ++ BlockPosition position = null; ++ if (this.spawnWorld != null && !this.spawnWorld.equals("")) { ++ CraftWorld cworld = (CraftWorld) Bukkit.getServer().getWorld(this.spawnWorld); ++ if (cworld != null && this.getBed() != null) { ++ world = cworld.getHandle(); ++ position = EntityHuman.getBed(cworld.getHandle(), this.getBed(), false); ++ } ++ } ++ if (world == null || position == null) { ++ world = ((CraftWorld) Bukkit.getServer().getWorlds().get(0)).getHandle(); ++ position = world.getSpawn(); ++ } ++ this.world = world; ++ this.setPosition(position.getX() + 0.5, position.getY(), position.getZ() + 0.5); ++ } ++ this.dimension = ((WorldServer) this.world).dimension; ++ this.playerInteractManager.a((WorldServer) world); + } ++ // CraftBukkit end + + public void levelDown(int i) { + super.levelDown(i); +@@ -114,6 +167,11 @@ + } + + public void s_() { ++ // CraftBukkit start ++ if (this.joining) { ++ this.joining = false; ++ } ++ // CraftBukkit end + this.playerInteractManager.a(); + --this.invulnerableTicks; + if (this.noDamageTicks > 0) { +@@ -155,7 +213,7 @@ + chunk = this.world.getChunkAt(chunkcoordintpair.x, chunkcoordintpair.z); + if (chunk.isReady()) { + arraylist.add(chunk); +- arraylist1.addAll(((WorldServer) this.world).getTileEntities(chunkcoordintpair.x * 16, 0, chunkcoordintpair.z * 16, chunkcoordintpair.x * 16 + 16, 256, chunkcoordintpair.z * 16 + 16)); ++ arraylist1.addAll(chunk.tileEntities.values()); // CraftBukkit - Get tile entities directly from the chunk instead of the world + iterator1.remove(); + } + } +@@ -220,8 +278,9 @@ + } + } + ++ // CraftBukkit - Optionally scale health + if (this.getHealth() != this.bK || this.bL != this.foodData.getFoodLevel() || this.foodData.getSaturationLevel() == 0.0F != this.bM) { +- this.playerConnection.sendPacket(new PacketPlayOutUpdateHealth(this.getHealth(), this.foodData.getFoodLevel(), this.foodData.getSaturationLevel())); ++ this.playerConnection.sendPacket(new PacketPlayOutUpdateHealth(this.getBukkitEntity().getScaledHealth(), this.foodData.getFoodLevel(), this.foodData.getSaturationLevel())); + this.bK = this.getHealth(); + this.bL = this.foodData.getFoodLevel(); + this.bM = this.foodData.getSaturationLevel() == 0.0F; +@@ -229,15 +288,14 @@ + + if (this.getHealth() + this.getAbsorptionHearts() != this.bJ) { + this.bJ = this.getHealth() + this.getAbsorptionHearts(); +- Collection collection = this.getScoreboard().getObjectivesForCriteria(IScoreboardCriteria.g); +- Iterator iterator = collection.iterator(); +- +- while (iterator.hasNext()) { +- ScoreboardObjective scoreboardobjective = (ScoreboardObjective) iterator.next(); +- +- this.getScoreboard().getPlayerScoreForObjective(this.getName(), scoreboardobjective).updateForList(Arrays.asList(new EntityHuman[] { this})); +- } ++ // CraftBukkit - Update ALL the scores! ++ this.world.getServer().getScoreboardManager().updateAllScoresForList(IScoreboardCriteria.f, this.getName(), com.google.common.collect.ImmutableList.of(this)); ++ } ++ // CraftBukkit start - Force max health updates ++ if (this.maxHealthCache != this.getMaxHealth()) { ++ this.getBukkitEntity().updateScaledHealth(); + } ++ // CraftBukkit end + + if (this.expTotal != this.lastSentExp) { + this.lastSentExp = this.expTotal; +@@ -247,7 +305,17 @@ + if (this.ticksLived % 20 * 5 == 0 && !this.getStatisticManager().hasAchievement(AchievementList.L)) { + this.h_(); + } ++ ++ // CraftBukkit start - initialize oldLevel and fire PlayerLevelChangeEvent ++ if (this.oldLevel == -1) { ++ this.oldLevel = this.expLevel; ++ } + ++ if (this.oldLevel != this.expLevel) { ++ CraftEventFactory.callPlayerLevelChangeEvent(this.world.getServer().getPlayer((EntityPlayer) this), this.oldLevel, this.expLevel); ++ this.oldLevel = this.expLevel; ++ } ++ // CraftBukkit end + } catch (Throwable throwable) { + CrashReport crashreport = CrashReport.a(throwable, "Ticking player"); + CrashReportSystemDetails crashreportsystemdetails = crashreport.a("Player being ticked"); +@@ -296,30 +364,64 @@ + } + + public void die(DamageSource damagesource) { +- if (this.world.getGameRules().getBoolean("showDeathMessages")) { +- ScoreboardTeamBase scoreboardteambase = this.getScoreboardTeam(); ++ // CraftBukkit start - fire PlayerDeathEvent ++ if (this.dead) { ++ return; ++ } ++ ++ java.util.List loot = new java.util.ArrayList(); ++ boolean keepInventory = this.world.getGameRules().getBoolean("keepInventory"); ++ ++ if (!keepInventory) { ++ for (int i = 0; i < this.inventory.items.length; ++i) { ++ if (this.inventory.items[i] != null) { ++ loot.add(CraftItemStack.asCraftMirror(this.inventory.items[i])); ++ } ++ } + +- if (scoreboardteambase != null && scoreboardteambase.j() != EnumNameTagVisibility.ALWAYS) { +- if (scoreboardteambase.j() == EnumNameTagVisibility.HIDE_FOR_OTHER_TEAMS) { +- this.server.getPlayerList().a((EntityHuman) this, this.br().b()); +- } else if (scoreboardteambase.j() == EnumNameTagVisibility.HIDE_FOR_OWN_TEAM) { +- this.server.getPlayerList().b((EntityHuman) this, this.br().b()); ++ for (int i = 0; i < this.inventory.armor.length; ++i) { ++ if (this.inventory.armor[i] != null) { ++ loot.add(CraftItemStack.asCraftMirror(this.inventory.armor[i])); + } ++ } ++ } ++ ++ IChatBaseComponent chatmessage = this.br().b(); ++ ++ String deathmessage = chatmessage.c(); ++ org.bukkit.event.entity.PlayerDeathEvent event = CraftEventFactory.callPlayerDeathEvent(this, loot, deathmessage, keepInventory); ++ ++ String deathMessage = event.getDeathMessage(); ++ ++ if (deathMessage != null && deathMessage.length() > 0 && this.world.getGameRules().getBoolean("showDeathMessages")) { // TODO: allow plugins to override? ++ if (deathMessage.equals(deathmessage)) { ++ this.server.getPlayerList().sendMessage(chatmessage); + } else { +- this.server.getPlayerList().sendMessage(this.br().b()); ++ this.server.getPlayerList().sendMessage(org.bukkit.craftbukkit.util.CraftChatMessage.fromString(deathMessage)); + } + } ++ ++ // we clean the player's inventory after the EntityDeathEvent is called so plugins can get the exact state of the inventory. ++ if (!event.getKeepInventory()) { ++ for (int i = 0; i < this.inventory.items.length; ++i) { ++ this.inventory.items[i] = null; ++ } + +- if (!this.world.getGameRules().getBoolean("keepInventory")) { +- this.inventory.n(); ++ for (int i = 0; i < this.inventory.armor.length; ++i) { ++ this.inventory.armor[i] = null; ++ } + } + +- Collection collection = this.world.getScoreboard().getObjectivesForCriteria(IScoreboardCriteria.d); ++ this.closeInventory(); ++ this.e((Entity) this); // Remove spectated target ++ // CraftBukkit end ++ ++ // CraftBukkit - Get our scores instead ++ Collection collection = this.world.getServer().getScoreboardManager().getScoreboardScores(IScoreboardCriteria.c, this.getName(), new java.util.ArrayList()); + Iterator iterator = collection.iterator(); + + while (iterator.hasNext()) { +- ScoreboardObjective scoreboardobjective = (ScoreboardObjective) iterator.next(); +- ScoreboardScore scoreboardscore = this.getScoreboard().getPlayerScoreForObjective(this.getName(), scoreboardobjective); ++ ScoreboardScore scoreboardscore = (ScoreboardScore) iterator.next(); // CraftBukkit - Use our scores instead + + scoreboardscore.incrementScore(); + } +@@ -376,7 +478,8 @@ + } + + private boolean cq() { +- return this.server.getPVP(); ++ // CraftBukkit - this.server.getPvP() -> this.world.pvpMode ++ return this.world.pvpMode; + } + + public void c(int i) { +@@ -388,6 +491,8 @@ + } else { + if (this.dimension == 0 && i == 1) { + this.b((Statistic) AchievementList.C); ++ // CraftBukkit start - Rely on custom portal management ++ /* + BlockPosition blockposition = this.server.getWorldServer(i).getDimensionSpawn(); + + if (blockposition != null) { +@@ -395,11 +500,16 @@ + } + + i = 1; ++ */ ++ // CraftBukkit end + } else { + this.b((Statistic) AchievementList.y); + } + +- this.server.getPlayerList().changeDimension(this, i); ++ // CraftBukkit start ++ TeleportCause cause = (this.dimension == 1 || i == 1) ? TeleportCause.END_PORTAL : TeleportCause.NETHER_PORTAL; ++ this.server.getPlayerList().changeDimension(this, i, cause); ++ // CraftBukkit end + this.lastSentExp = -1; + this.bK = -1.0F; + this.bL = -1; +@@ -442,6 +552,8 @@ + } + + public void a(boolean flag, boolean flag1, boolean flag2) { ++ if (!this.sleeping) return; // CraftBukkit - Can't leave bed if not in one! ++ + if (this.isSleeping()) { + this.u().getTracker().sendPacketToEntity(this, new PacketPlayOutAnimation(this, 2)); + } +@@ -454,14 +566,23 @@ + } + + public void mount(Entity entity) { +- Entity entity1 = this.vehicle; ++ // CraftBukkit start ++ this.setPassengerOf(entity); ++ } ++ ++ public void setPassengerOf(Entity entity) { ++ // mount(null) doesn't really fly for overloaded methods, ++ // so this method is needed ++ Entity currentVehicle = this.vehicle; ++ ++ super.setPassengerOf(entity); + +- super.mount(entity); +- if (entity != entity1) { ++ // Check if the vehicle actually changed. ++ if (currentVehicle != this.vehicle) { + this.playerConnection.sendPacket(new PacketPlayOutAttachEntity(0, this, this.vehicle)); + this.playerConnection.a(this.locX, this.locY, this.locZ, this.yaw, this.pitch); + } +- ++ // CraftBukkit end + } + + protected void a(double d0, boolean flag, Block block, BlockPosition blockposition) {} +@@ -490,19 +611,38 @@ + this.playerConnection.sendPacket(new PacketPlayOutOpenSignEditor(tileentitysign.getPosition())); + } + +- public void nextContainerCounter() { ++ public int nextContainerCounter() { // CraftBukkit - private void -> public int + this.containerCounter = this.containerCounter % 100 + 1; ++ return containerCounter; // CraftBukkit + } + + public void openTileEntity(ITileEntityContainer itileentitycontainer) { ++ // CraftBukkit start - Inventory open hook ++ Container container = CraftEventFactory.callInventoryOpenEvent(this, itileentitycontainer.createContainer(this.inventory, this)); ++ if (container == null) { ++ return; ++ } ++ // CraftBukkit end + this.nextContainerCounter(); + this.playerConnection.sendPacket(new PacketPlayOutOpenWindow(this.containerCounter, itileentitycontainer.getContainerName(), itileentitycontainer.getScoreboardDisplayName())); +- this.activeContainer = itileentitycontainer.createContainer(this.inventory, this); ++ this.activeContainer = container; // CraftBukkit + this.activeContainer.windowId = this.containerCounter; + this.activeContainer.addSlotListener(this); + } + + public void openContainer(IInventory iinventory) { ++ // CraftBukkit start - Inventory open hook ++ Container container; ++ if (iinventory instanceof ITileEntityContainer) { ++ container = ((ITileEntityContainer)iinventory).createContainer(this.inventory, this); ++ } else { ++ container = new ContainerChest(this.inventory, iinventory, this); ++ } ++ container = CraftEventFactory.callInventoryOpenEvent(this, container); ++ if (container == null) { ++ return; ++ } ++ // CraftBukkit end + if (this.activeContainer != this.defaultContainer) { + this.closeInventory(); + } +@@ -520,10 +660,10 @@ + this.nextContainerCounter(); + if (iinventory instanceof ITileEntityContainer) { + this.playerConnection.sendPacket(new PacketPlayOutOpenWindow(this.containerCounter, ((ITileEntityContainer) iinventory).getContainerName(), iinventory.getScoreboardDisplayName(), iinventory.getSize())); +- this.activeContainer = ((ITileEntityContainer) iinventory).createContainer(this.inventory, this); ++ this.activeContainer = container; // CraftBukkit + } else { + this.playerConnection.sendPacket(new PacketPlayOutOpenWindow(this.containerCounter, "minecraft:container", iinventory.getScoreboardDisplayName(), iinventory.getSize())); +- this.activeContainer = new ContainerChest(this.inventory, iinventory, this); ++ this.activeContainer = container; // CraftBukkit + } + + this.activeContainer.windowId = this.containerCounter; +@@ -531,8 +671,14 @@ + } + + public void openTrade(IMerchant imerchant) { ++ // CraftBukkit start - Inventory open hook ++ Container container = CraftEventFactory.callInventoryOpenEvent(this, new ContainerMerchant(this.inventory, imerchant, this.world)); ++ if (container == null) { ++ return; ++ } ++ // CraftBukkit end + this.nextContainerCounter(); +- this.activeContainer = new ContainerMerchant(this.inventory, imerchant, this.world); ++ this.activeContainer = container; // CraftBukkit + this.activeContainer.windowId = this.containerCounter; + this.activeContainer.addSlotListener(this); + InventoryMerchant inventorymerchant = ((ContainerMerchant) this.activeContainer).e(); +@@ -552,13 +698,20 @@ + } + + public void openHorseInventory(EntityHorse entityhorse, IInventory iinventory) { ++ // CraftBukkit start - Inventory open hook ++ Container container = CraftEventFactory.callInventoryOpenEvent(this, new ContainerHorse(this.inventory, iinventory, entityhorse, this)); ++ if (container == null) { ++ iinventory.closeContainer(this); ++ return; ++ } ++ // CraftBukkit end + if (this.activeContainer != this.defaultContainer) { + this.closeInventory(); + } + + this.nextContainerCounter(); + this.playerConnection.sendPacket(new PacketPlayOutOpenWindow(this.containerCounter, "EntityHorse", iinventory.getScoreboardDisplayName(), iinventory.getSize(), entityhorse.getId())); +- this.activeContainer = new ContainerHorse(this.inventory, iinventory, entityhorse, this); ++ this.activeContainer = container; + this.activeContainer.windowId = this.containerCounter; + this.activeContainer.addSlotListener(this); + } +@@ -587,6 +740,11 @@ + public void a(Container container, List list) { + this.playerConnection.sendPacket(new PacketPlayOutWindowItems(container.windowId, list)); + this.playerConnection.sendPacket(new PacketPlayOutSetSlot(-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.playerConnection.sendPacket(new PacketPlayOutSetSlot(container.windowId, 0, container.getSlot(0).getItem())); ++ } ++ // CraftBukkit end + } + + public void setContainerData(Container container, int i, int j) { +@@ -601,6 +759,7 @@ + } + + public void closeInventory() { ++ CraftEventFactory.handleInventoryCloseEvent(this); // CraftBukkit + this.playerConnection.sendPacket(new PacketPlayOutCloseWindow(this.activeContainer.windowId)); + this.p(); + } +@@ -681,7 +840,16 @@ + + public void triggerHealthUpdate() { + this.bK = -1.0E8F; ++ this.lastSentExp = -1; // CraftBukkit - Added to reset ++ } ++ ++ // CraftBukkit start - Support multi-line messages ++ public void sendMessage(IChatBaseComponent[] ichatbasecomponent) { ++ for (IChatBaseComponent component : ichatbasecomponent) { ++ this.sendMessage(component); ++ } + } ++ // CraftBukkit end + + public void b(IChatBaseComponent ichatbasecomponent) { + this.playerConnection.sendPacket(new PacketPlayOutChat(ichatbasecomponent)); +@@ -867,6 +1035,93 @@ + } + + public IChatBaseComponent getPlayerListName() { +- return null; ++ return listName; // CraftBukkit ++ } ++ ++ // CraftBukkit start - Add per-player time and weather. ++ public long timeOffset = 0; ++ public boolean relativeTime = true; ++ ++ public long getPlayerTime() { ++ if (this.relativeTime) { ++ // Adds timeOffset to the current server time. ++ return this.world.getDayTime() + this.timeOffset; ++ } else { ++ // Adds timeOffset to the beginning of this day. ++ return this.world.getDayTime() - (this.world.getDayTime() % 24000) + this.timeOffset; ++ } ++ } ++ ++ public WeatherType weather = null; ++ ++ public WeatherType getPlayerWeather() { ++ return this.weather; ++ } ++ ++ public void setPlayerWeather(WeatherType type, boolean plugin) { ++ if (!plugin && this.weather != null) { ++ return; ++ } ++ ++ if (plugin) { ++ this.weather = type; ++ } ++ ++ if (type == WeatherType.DOWNFALL) { ++ this.playerConnection.sendPacket(new PacketPlayOutGameStateChange(2, 0)); ++ // this.playerConnection.sendPacket(new PacketPlayOutGameStateChange(7, this.world.j(1.0F))); ++ // this.playerConnection.sendPacket(new PacketPlayOutGameStateChange(8, this.world.h(1.0F))); ++ } else { ++ this.playerConnection.sendPacket(new PacketPlayOutGameStateChange(1, 0)); ++ } ++ } ++ ++ public void resetPlayerWeather() { ++ this.weather = null; ++ this.setPlayerWeather(this.world.getWorldData().hasStorm() ? WeatherType.DOWNFALL : WeatherType.CLEAR, false); ++ } ++ ++ @Override ++ public String toString() { ++ return super.toString() + "(" + this.getName() + " at " + this.locX + "," + this.locY + "," + this.locZ + ")"; ++ } ++ ++ public void reset() { ++ float exp = 0; ++ boolean keepInventory = this.world.getGameRules().getBoolean("keepInventory"); ++ ++ if (this.keepLevel || keepInventory) { ++ exp = this.exp; ++ this.newTotalExp = this.expTotal; ++ this.newLevel = this.expLevel; ++ } ++ ++ this.setHealth(this.getMaxHealth()); ++ this.fireTicks = 0; ++ this.fallDistance = 0; ++ this.foodData = new FoodMetaData(this); ++ this.expLevel = this.newLevel; ++ this.expTotal = this.newTotalExp; ++ this.exp = 0; ++ this.deathTicks = 0; ++ this.removeAllEffects(); ++ this.updateEffects = true; ++ this.activeContainer = this.defaultContainer; ++ this.killer = null; ++ this.lastDamager = null; ++ this.combatTracker = new CombatTracker(this); ++ this.lastSentExp = -1; ++ if (this.keepLevel || keepInventory) { ++ this.exp = exp; ++ } else { ++ this.giveExp(this.newExp); ++ } ++ this.keepLevel = false; ++ } ++ ++ @Override ++ public CraftPlayer getBukkitEntity() { ++ return (CraftPlayer) super.getBukkitEntity(); + } ++ // CraftBukkit end + } diff --git a/nms-patches/EntityPotion.patch b/nms-patches/EntityPotion.patch new file mode 100644 index 0000000000..fd9e7d337b --- /dev/null +++ b/nms-patches/EntityPotion.patch @@ -0,0 +1,70 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/EntityPotion.java 2014-11-27 08:59:46.721421758 +1100 ++++ src/main/java/net/minecraft/server/EntityPotion.java 2014-11-27 08:42:10.112850989 +1100 +@@ -3,6 +3,13 @@ + import java.util.Iterator; + import java.util.List; + ++// CraftBukkit start ++import java.util.HashMap; ++ ++import org.bukkit.craftbukkit.entity.CraftLivingEntity; ++import org.bukkit.entity.LivingEntity; ++// CraftBukkit end ++ + public class EntityPotion extends EntityProjectile { + + public ItemStack item; +@@ -57,12 +64,15 @@ + if (!this.world.isStatic) { + List list = Items.POTION.h(this.item); + +- if (list != null && !list.isEmpty()) { ++ if (true || list != null && !list.isEmpty()) { // CraftBukkit - Call event even if no effects to apply + AxisAlignedBB axisalignedbb = this.getBoundingBox().grow(4.0D, 2.0D, 4.0D); + List list1 = this.world.a(EntityLiving.class, axisalignedbb); + +- if (!list1.isEmpty()) { ++ if (true || !list1.isEmpty()) { // CraftBukkit - Run code even if there are no entities around + Iterator iterator = list1.iterator(); ++ ++ // CraftBukkit ++ HashMap affected = new HashMap(); + + while (iterator.hasNext()) { + EntityLiving entityliving = (EntityLiving) iterator.next(); +@@ -74,12 +84,35 @@ + if (entityliving == movingobjectposition.entity) { + d1 = 1.0D; + } ++ ++ // CraftBukkit start ++ affected.put((LivingEntity) entityliving.getBukkitEntity(), d1); ++ } ++ } ++ ++ org.bukkit.event.entity.PotionSplashEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callPotionSplashEvent(this, affected); ++ if (!event.isCancelled() && list != null && !list.isEmpty()) { // do not process effects if there are no effects to process ++ for (LivingEntity victim : event.getAffectedEntities()) { ++ if (!(victim instanceof CraftLivingEntity)) { ++ continue; ++ } ++ ++ EntityLiving entityliving = ((CraftLivingEntity) victim).getHandle(); ++ double d1 = event.getIntensity(victim); ++ // CraftBukkit end + + Iterator iterator1 = list.iterator(); + + while (iterator1.hasNext()) { + MobEffect mobeffect = (MobEffect) iterator1.next(); + int i = mobeffect.getEffectId(); ++ ++ // CraftBukkit start - Abide by PVP settings - for players only! ++ if (!this.world.pvpMode && this.getShooter() instanceof EntityPlayer && entityliving instanceof EntityPlayer && entityliving != this.getShooter()) { ++ // Block SLOWER_MOVEMENT, SLOWER_DIG, HARM, BLINDNESS, HUNGER, WEAKNESS and POISON potions ++ if (i == 2 || i == 4 || i == 7 || i == 15 || i == 17 || i == 18 || i == 19) continue; ++ } ++ // CraftBukkit end + + if (MobEffectList.byId[i].isInstant()) { + MobEffectList.byId[i].applyInstantEffect(this, this.getShooter(), entityliving, mobeffect.getAmplifier(), d1); diff --git a/nms-patches/EntityProjectile.patch b/nms-patches/EntityProjectile.patch new file mode 100644 index 0000000000..bd4789e618 --- /dev/null +++ b/nms-patches/EntityProjectile.patch @@ -0,0 +1,31 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/EntityProjectile.java 2014-11-27 08:59:46.725421741 +1100 ++++ src/main/java/net/minecraft/server/EntityProjectile.java 2014-11-27 08:42:10.140850934 +1100 +@@ -25,6 +25,7 @@ + public EntityProjectile(World world, EntityLiving entityliving) { + super(world); + this.shooter = entityliving; ++ this.projectileSource = (org.bukkit.entity.LivingEntity) entityliving.getBukkitEntity(); // CraftBukkit + this.a(0.25F, 0.25F); + this.setPositionRotation(entityliving.locX, entityliving.locY + (double) entityliving.getHeadHeight(), entityliving.locZ, entityliving.yaw, entityliving.pitch); + this.locX -= (double) (MathHelper.cos(this.yaw / 180.0F * 3.1415927F) * 0.16F); +@@ -130,7 +131,7 @@ + MovingObjectPosition movingobjectposition1 = axisalignedbb.a(vec3d, vec3d1); + + if (movingobjectposition1 != null) { +- double d1 = vec3d.f(movingobjectposition1.pos); ++ double d1 = vec3d.distanceSquared(movingobjectposition1.pos); // CraftBukkit - distance efficiency + + if (d1 < d0 || d0 == 0.0D) { + entity = entity1; +@@ -150,6 +151,11 @@ + this.aq(); + } else { + this.a(movingobjectposition); ++ // CraftBukkit start ++ if (this.dead) { ++ org.bukkit.craftbukkit.event.CraftEventFactory.callProjectileHitEvent(this); ++ } ++ // CraftBukkit end + } + } + diff --git a/nms-patches/EntitySheep.patch b/nms-patches/EntitySheep.patch new file mode 100644 index 0000000000..b173759251 --- /dev/null +++ b/nms-patches/EntitySheep.patch @@ -0,0 +1,54 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/EntitySheep.java 2014-11-27 08:59:46.725421741 +1100 ++++ src/main/java/net/minecraft/server/EntitySheep.java 2014-11-27 08:42:10.124850965 +1100 +@@ -4,6 +4,11 @@ + import java.util.Map; + import java.util.Random; + ++// CraftBukkit start ++import org.bukkit.event.entity.SheepRegrowWoolEvent; ++import org.bukkit.event.player.PlayerShearEntityEvent; ++// CraftBukkit end ++ + public class EntitySheep extends EntityAnimal { + + private final InventoryCrafting bk = new InventoryCrafting(new ContainerSheepBreed(this), 2, 1); +@@ -30,6 +35,7 @@ + this.goalSelector.a(8, new PathfinderGoalRandomLookaround(this)); + this.bk.setItem(0, new ItemStack(Items.DYE, 1, 0)); + this.bk.setItem(1, new ItemStack(Items.DYE, 1, 0)); ++ this.bk.resultInventory = new InventoryCraftResult(); // CraftBukkit - add result slot for event + } + + protected void E() { +@@ -82,6 +88,15 @@ + + if (itemstack != null && itemstack.getItem() == Items.SHEARS && !this.isSheared() && !this.isBaby()) { + if (!this.world.isStatic) { ++ // CraftBukkit start ++ PlayerShearEntityEvent event = new PlayerShearEntityEvent((org.bukkit.entity.Player) entityhuman.getBukkitEntity(), this.getBukkitEntity()); ++ this.world.getServer().getPluginManager().callEvent(event); ++ ++ if (event.isCancelled()) { ++ return false; ++ } ++ // CraftBukkit end ++ + this.setSheared(true); + int i = 1 + this.random.nextInt(3); + +@@ -169,7 +184,14 @@ + } + + public void v() { +- this.setSheared(false); ++ // CraftBukkit start ++ SheepRegrowWoolEvent event = new SheepRegrowWoolEvent((org.bukkit.entity.Sheep) this.getBukkitEntity()); ++ this.world.getServer().getPluginManager().callEvent(event); ++ ++ if (!event.isCancelled()) { ++ this.setSheared(false); ++ } ++ // CraftBukkit end + if (this.isBaby()) { + this.setAge(60); + } diff --git a/nms-patches/EntitySkeleton.patch b/nms-patches/EntitySkeleton.patch new file mode 100644 index 0000000000..fe60351841 --- /dev/null +++ b/nms-patches/EntitySkeleton.patch @@ -0,0 +1,60 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/EntitySkeleton.java 2014-11-27 08:59:46.725421741 +1100 ++++ src/main/java/net/minecraft/server/EntitySkeleton.java 2014-11-27 08:42:10.136850942 +1100 +@@ -2,6 +2,8 @@ + + import java.util.Calendar; + ++import org.bukkit.event.entity.EntityCombustEvent; // CraftBukkit ++ + public class EntitySkeleton extends EntityMonster implements IRangedEntity { + + private PathfinderGoalArrowAttack b = new PathfinderGoalArrowAttack(this, 1.0D, 20, 60, 15.0F); +@@ -90,7 +92,14 @@ + } + + if (flag) { +- this.setOnFire(8); ++ // CraftBukkit start ++ EntityCombustEvent event = new EntityCombustEvent(this.getBukkitEntity(), 8); ++ this.world.getServer().getPluginManager().callEvent(event); ++ ++ if (!event.isCancelled()) { ++ this.setOnFire(event.getDuration()); ++ } ++ // CraftBukkit end + } + } + } +@@ -225,11 +234,30 @@ + } + + if (EnchantmentManager.getEnchantmentLevel(Enchantment.ARROW_FIRE.id, this.bz()) > 0 || this.getSkeletonType() == 1) { +- entityarrow.setOnFire(100); ++ // CraftBukkit start - call EntityCombustEvent ++ EntityCombustEvent event = new EntityCombustEvent(entityarrow.getBukkitEntity(), 100); ++ this.world.getServer().getPluginManager().callEvent(event); ++ ++ if (!event.isCancelled()) { ++ entityarrow.setOnFire(event.getDuration()); ++ } ++ // CraftBukkit end ++ } ++ ++ // CraftBukkit start ++ org.bukkit.event.entity.EntityShootBowEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callEntityShootBowEvent(this, this.bz(), entityarrow, 0.8F); ++ if (event.isCancelled()) { ++ event.getProjectile().remove(); ++ return; ++ } ++ ++ if (event.getProjectile() == entityarrow.getBukkitEntity()) { ++ world.addEntity(entityarrow); + } ++ // CraftBukkit end + + this.makeSound("random.bow", 1.0F, 1.0F / (this.bb().nextFloat() * 0.4F + 0.8F)); +- this.world.addEntity(entityarrow); ++ // this.world.addEntity(entityarrow); // CraftBukkit - moved up + } + + public int getSkeletonType() { diff --git a/nms-patches/EntitySlime.patch b/nms-patches/EntitySlime.patch new file mode 100644 index 0000000000..02d48970d8 --- /dev/null +++ b/nms-patches/EntitySlime.patch @@ -0,0 +1,40 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/EntitySlime.java 2014-11-27 08:59:46.729421723 +1100 ++++ src/main/java/net/minecraft/server/EntitySlime.java 2014-11-27 08:42:10.100851012 +1100 +@@ -1,5 +1,9 @@ + package net.minecraft.server; + ++// CraftBukkit start ++import org.bukkit.event.entity.SlimeSplitEvent; ++// CraftBukkit end ++ + public class EntitySlime extends EntityInsentient implements IMonster { + + public float a; +@@ -132,6 +136,18 @@ + + if (!this.world.isStatic && i > 1 && this.getHealth() <= 0.0F) { + int j = 2 + this.random.nextInt(3); ++ ++ // CraftBukkit start ++ SlimeSplitEvent event = new SlimeSplitEvent((org.bukkit.entity.Slime) this.getBukkitEntity(), j); ++ this.world.getServer().getPluginManager().callEvent(event); ++ ++ if (!event.isCancelled() && event.getCount() > 0) { ++ j = event.getCount(); ++ } else { ++ super.die(); ++ return; ++ } ++ // CraftBukkit end + + for (int k = 0; k < j; ++k) { + float f = ((float) (k % 2) - 0.5F) * (float) i / 4.0F; +@@ -148,7 +164,7 @@ + + entityslime.setSize(i / 2); + entityslime.setPositionRotation(this.locX + (double) f, this.locY + 0.5D, this.locZ + (double) f1, this.random.nextFloat() * 360.0F, 0.0F); +- this.world.addEntity(entityslime); ++ this.world.addEntity(entityslime, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.SLIME_SPLIT); // CraftBukkit - SpawnReason + } + } + diff --git a/nms-patches/EntitySmallFireball.patch b/nms-patches/EntitySmallFireball.patch new file mode 100644 index 0000000000..7d2e7589f1 --- /dev/null +++ b/nms-patches/EntitySmallFireball.patch @@ -0,0 +1,39 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/EntitySmallFireball.java 2014-11-27 08:59:46.729421723 +1100 ++++ src/main/java/net/minecraft/server/EntitySmallFireball.java 2014-11-27 08:42:10.152850911 +1100 +@@ -1,5 +1,7 @@ + package net.minecraft.server; + ++import org.bukkit.event.entity.EntityCombustByEntityEvent; // CraftBukkit ++ + public class EntitySmallFireball extends EntityFireball { + + public EntitySmallFireball(World world) { +@@ -26,7 +28,14 @@ + if (flag) { + this.a(this.shooter, movingobjectposition.entity); + if (!movingobjectposition.entity.isFireProof()) { +- movingobjectposition.entity.setOnFire(5); ++ // CraftBukkit start - Entity damage by entity event + combust event ++ EntityCombustByEntityEvent event = new EntityCombustByEntityEvent((org.bukkit.entity.Projectile) this.getBukkitEntity(), movingobjectposition.entity.getBukkitEntity(), 5); ++ movingobjectposition.entity.world.getServer().getPluginManager().callEvent(event); ++ ++ if (!event.isCancelled()) { ++ movingobjectposition.entity.setOnFire(event.getDuration()); ++ } ++ // CraftBukkit end + } + } + } else { +@@ -39,7 +48,11 @@ + BlockPosition blockposition = movingobjectposition.a().shift(movingobjectposition.direction); + + if (this.world.isEmpty(blockposition)) { +- this.world.setTypeUpdate(blockposition, Blocks.FIRE.getBlockData()); ++ // CraftBukkit start ++ if (!org.bukkit.craftbukkit.event.CraftEventFactory.callBlockIgniteEvent(world, blockposition.getX(), blockposition.getY(), blockposition.getZ(), this).isCancelled()) { ++ this.world.setTypeUpdate(blockposition, Blocks.FIRE.getBlockData()); ++ } ++ // CraftBukkit end + } + } + } diff --git a/nms-patches/EntitySnowman.patch b/nms-patches/EntitySnowman.patch new file mode 100644 index 0000000000..67e4371ff3 --- /dev/null +++ b/nms-patches/EntitySnowman.patch @@ -0,0 +1,42 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/EntitySnowman.java 2014-11-27 08:59:46.733421706 +1100 ++++ src/main/java/net/minecraft/server/EntitySnowman.java 2014-11-27 08:42:10.144850927 +1100 +@@ -1,5 +1,11 @@ + package net.minecraft.server; + ++// CraftBukkit start ++import org.bukkit.craftbukkit.event.CraftEventFactory; ++import org.bukkit.craftbukkit.util.CraftMagicNumbers; ++import org.bukkit.event.block.EntityBlockFormEvent; ++// CraftBukkit end ++ + public class EntitySnowman extends EntityGolem implements IRangedEntity { + + public EntitySnowman(World world) { +@@ -31,7 +37,7 @@ + } + + if (this.world.getBiome(new BlockPosition(i, 0, k)).a(new BlockPosition(i, j, k)) > 1.0F) { +- this.damageEntity(DamageSource.BURN, 1.0F); ++ this.damageEntity(CraftEventFactory.MELTING, 1.0F); // CraftBukkit - DamageSource.BURN -> CraftEventFactory.MELTING + } + + for (int l = 0; l < 4; ++l) { +@@ -39,7 +45,17 @@ + j = MathHelper.floor(this.locY); + k = MathHelper.floor(this.locZ + (double) ((float) (l / 2 % 2 * 2 - 1) * 0.25F)); + if (this.world.getType(new BlockPosition(i, j, k)).getBlock().getMaterial() == Material.AIR && this.world.getBiome(new BlockPosition(i, 0, k)).a(new BlockPosition(i, j, k)) < 0.8F && Blocks.SNOW_LAYER.canPlace(this.world, new BlockPosition(i, j, k))) { +- this.world.setTypeUpdate(new BlockPosition(i, j, k), Blocks.SNOW_LAYER.getBlockData()); ++ // CraftBukkit start ++ org.bukkit.block.BlockState blockState = this.world.getWorld().getBlockAt(i, j, k).getState(); ++ blockState.setType(CraftMagicNumbers.getMaterial(Blocks.SNOW_LAYER)); ++ ++ EntityBlockFormEvent event = new EntityBlockFormEvent(this.getBukkitEntity(), blockState.getBlock(), blockState); ++ this.world.getServer().getPluginManager().callEvent(event); ++ ++ if(!event.isCancelled()) { ++ blockState.update(true); ++ } ++ // CraftBukkit end + } + } + } diff --git a/nms-patches/EntitySpider.patch b/nms-patches/EntitySpider.patch new file mode 100644 index 0000000000..c9c70dc844 --- /dev/null +++ b/nms-patches/EntitySpider.patch @@ -0,0 +1,11 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/EntitySpider.java 2014-11-27 08:59:46.733421706 +1100 ++++ src/main/java/net/minecraft/server/EntitySpider.java 2014-11-27 08:42:10.096851020 +1100 +@@ -107,7 +107,7 @@ + + entityskeleton.setPositionRotation(this.locX, this.locY, this.locZ, this.yaw, 0.0F); + entityskeleton.prepare(difficultydamagescaler, (GroupDataEntity) null); +- this.world.addEntity(entityskeleton); ++ this.world.addEntity(entityskeleton, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.JOCKEY); // CraftBukkit - add SpawnReason + entityskeleton.mount(this); + } + diff --git a/nms-patches/EntitySquid.patch b/nms-patches/EntitySquid.patch new file mode 100644 index 0000000000..83d481ae78 --- /dev/null +++ b/nms-patches/EntitySquid.patch @@ -0,0 +1,37 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/EntitySquid.java 2014-11-27 08:59:46.733421706 +1100 ++++ src/main/java/net/minecraft/server/EntitySquid.java 2014-11-27 08:42:10.156850903 +1100 +@@ -1,5 +1,7 @@ + package net.minecraft.server; + ++import org.bukkit.craftbukkit.TrigMath; // CraftBukkit ++ + public class EntitySquid extends EntityWaterAnimal { + + public float a; +@@ -67,9 +69,11 @@ + + } + ++ /* CraftBukkit start - Delegate to Entity to use existing inWater value + public boolean V() { + return this.world.a(this.getBoundingBox().grow(0.0D, -0.6000000238418579D, 0.0D), Material.WATER, (Entity) this); + } ++ // CraftBukkit end */ + + public void m() { + super.m(); +@@ -116,10 +120,12 @@ + } + + f = MathHelper.sqrt(this.motX * this.motX + this.motZ * this.motZ); +- this.aG += (-((float) Math.atan2(this.motX, this.motZ)) * 180.0F / 3.1415927F - this.aG) * 0.1F; ++ // CraftBukkit - Math -> TrigMath ++ this.aG += (-((float) TrigMath.atan2(this.motX, this.motZ)) * 180.0F / 3.1415927F - this.aG) * 0.1F; + this.yaw = this.aG; + this.c = (float) ((double) this.c + 3.141592653589793D * (double) this.bp * 1.5D); +- this.a += (-((float) Math.atan2((double) f, this.motY)) * 180.0F / 3.1415927F - this.a) * 0.1F; ++ // CraftBukkit - Math -> TrigMath ++ this.a += (-((float) TrigMath.atan2((double) f, this.motY)) * 180.0F / 3.1415927F - this.a) * 0.1F; + } else { + this.bl = MathHelper.e(MathHelper.sin(this.bj)) * 3.1415927F * 0.25F; + if (!this.world.isStatic) { diff --git a/nms-patches/EntityTNTPrimed.patch b/nms-patches/EntityTNTPrimed.patch new file mode 100644 index 0000000000..96c3399a89 --- /dev/null +++ b/nms-patches/EntityTNTPrimed.patch @@ -0,0 +1,52 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/EntityTNTPrimed.java 2014-11-27 08:59:46.737421688 +1100 ++++ src/main/java/net/minecraft/server/EntityTNTPrimed.java 2014-11-27 08:42:10.120850973 +1100 +@@ -1,9 +1,13 @@ + package net.minecraft.server; + ++import org.bukkit.event.entity.ExplosionPrimeEvent; // CraftBukkit ++ + public class EntityTNTPrimed extends Entity { + + public int fuseTicks; + private EntityLiving source; ++ public float yield = 4; // CraftBukkit - add field ++ public boolean isIncendiary = false; // CraftBukkit - add field + + public EntityTNTPrimed(World world) { + super(world); +@@ -52,10 +56,13 @@ + } + + if (this.fuseTicks-- <= 0) { +- this.die(); ++ // CraftBukkit start - Need to reverse the order of the explosion and the entity death so we have a location for the event ++ // this.die(); + if (!this.world.isStatic) { + this.explode(); + } ++ this.die(); ++ // CraftBukkit end + } else { + this.W(); + this.world.addParticle(EnumParticle.SMOKE_NORMAL, this.locX, this.locY + 0.5D, this.locZ, 0.0D, 0.0D, 0.0D, new int[0]); +@@ -64,9 +71,18 @@ + } + + private void explode() { +- float f = 4.0F; ++ // CraftBukkit start ++ // float f = 4.0F; + +- this.world.explode(this, this.locX, this.locY + (double) (this.length / 2.0F), this.locZ, f, true); ++ org.bukkit.craftbukkit.CraftServer server = this.world.getServer(); ++ ++ ExplosionPrimeEvent event = new ExplosionPrimeEvent((org.bukkit.entity.Explosive) org.bukkit.craftbukkit.entity.CraftEntity.getEntity(server, this)); ++ server.getPluginManager().callEvent(event); ++ ++ if (!event.isCancelled()) { ++ this.world.createExplosion(this, this.locX, this.locY + (double) (this.length / 2.0F), this.locZ, event.getRadius(), event.getFire(), true); ++ } ++ // CraftBukkit end + } + + protected void b(NBTTagCompound nbttagcompound) { diff --git a/nms-patches/EntityThrownExpBottle.patch b/nms-patches/EntityThrownExpBottle.patch new file mode 100644 index 0000000000..c6b40039e2 --- /dev/null +++ b/nms-patches/EntityThrownExpBottle.patch @@ -0,0 +1,22 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/EntityThrownExpBottle.java 2014-11-27 08:59:46.737421688 +1100 ++++ src/main/java/net/minecraft/server/EntityThrownExpBottle.java 2014-11-27 08:42:10.112850989 +1100 +@@ -28,8 +28,17 @@ + + protected void a(MovingObjectPosition movingobjectposition) { + if (!this.world.isStatic) { +- this.world.triggerEffect(2002, new BlockPosition(this), 0); +- int i = 3 + this.world.random.nextInt(5) + this.world.random.nextInt(5); ++ // CraftBukkit - moved to after event ++ // this.world.triggerEffect(2002, new BlockPosition(this), 0); ++ int i = 3 + this.world.random.nextInt(5) + this.world.random.nextInt(5); ++ ++ // CraftBukkit start ++ org.bukkit.event.entity.ExpBottleEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callExpBottleEvent(this, i); ++ i = event.getExperience(); ++ if (event.getShowEffect()) { ++ this.world.triggerEffect(2002, new BlockPosition(this), 0); ++ } ++ // CraftBukkit end + + while (i > 0) { + int j = EntityExperienceOrb.getOrbValue(i); diff --git a/nms-patches/EntityTrackerEntry.patch b/nms-patches/EntityTrackerEntry.patch new file mode 100644 index 0000000000..9d0f38de61 --- /dev/null +++ b/nms-patches/EntityTrackerEntry.patch @@ -0,0 +1,176 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/EntityTrackerEntry.java 2014-11-27 08:59:46.741421670 +1100 ++++ src/main/java/net/minecraft/server/EntityTrackerEntry.java 2014-11-27 08:42:10.136850942 +1100 +@@ -8,6 +8,11 @@ + import org.apache.logging.log4j.LogManager; + import org.apache.logging.log4j.Logger; + ++// CraftBukkit start ++import org.bukkit.entity.Player; ++import org.bukkit.event.player.PlayerVelocityEvent; ++// CraftBukkit end ++ + public class EntityTrackerEntry { + + private static final Logger p = LogManager.getLogger(); +@@ -74,13 +79,13 @@ + this.broadcast(new PacketPlayOutAttachEntity(0, this.tracker, this.tracker.vehicle)); + } + +- if (this.tracker instanceof EntityItemFrame && this.m % 10 == 0) { ++ if (this.tracker instanceof EntityItemFrame /*&& this.m % 10 == 0*/) { // CraftBukkit - Moved below, should always enter this block + EntityItemFrame entityitemframe = (EntityItemFrame) this.tracker; + ItemStack itemstack = entityitemframe.getItem(); + +- if (itemstack != null && itemstack.getItem() instanceof ItemWorldMap) { ++ if (this.m % 10 == 0 && itemstack != null && itemstack.getItem() instanceof ItemWorldMap) { // CraftBukkit - Moved this.m % 10 logic here so item frames do not enter the other blocks + WorldMap worldmap = Items.FILLED_MAP.getSavedMap(itemstack, this.tracker.world); +- Iterator iterator = list.iterator(); ++ Iterator iterator = this.trackedPlayers.iterator(); // CraftBukkit + + while (iterator.hasNext()) { + EntityHuman entityhuman = (EntityHuman) iterator.next(); +@@ -115,6 +120,19 @@ + Object object = null; + boolean flag = Math.abs(j1) >= 4 || Math.abs(k1) >= 4 || Math.abs(l1) >= 4 || this.m % 60 == 0; + boolean flag1 = Math.abs(l - this.yRot) >= 4 || Math.abs(i1 - this.xRot) >= 4; ++ ++ // CraftBukkit start - Code moved from below ++ if (flag) { ++ this.xLoc = i; ++ this.yLoc = j; ++ this.zLoc = k; ++ } ++ ++ if (flag1) { ++ this.yRot = l; ++ this.xRot = i1; ++ } ++ // CraftBukkit end + + if (this.m > 0 || this.tracker instanceof EntityArrow) { + if (j1 >= -128 && j1 < 128 && k1 >= -128 && k1 < 128 && l1 >= -128 && l1 < 128 && this.v <= 400 && !this.x && this.y == this.tracker.onGround) { +@@ -128,6 +146,11 @@ + } else { + this.y = this.tracker.onGround; + this.v = 0; ++ // CraftBukkit start - Refresh list of who can see a player before sending teleport packet ++ if (this.tracker instanceof EntityPlayer) { ++ this.scanPlayers(new java.util.ArrayList(this.trackedPlayers)); ++ } ++ // CraftBukkit end + object = new PacketPlayOutEntityTeleport(this.tracker.getId(), i, j, k, (byte) l, (byte) i1, this.tracker.onGround); + } + } +@@ -152,6 +175,7 @@ + } + + this.b(); ++ /* CraftBukkit start - Code moved up + if (flag) { + this.xLoc = i; + this.yLoc = j; +@@ -162,6 +186,7 @@ + this.yRot = l; + this.xRot = i1; + } ++ // CraftBukkit end */ + + this.x = false; + } else { +@@ -193,7 +218,27 @@ + + ++this.m; + if (this.tracker.velocityChanged) { +- this.broadcastIncludingSelf(new PacketPlayOutEntityVelocity(this.tracker)); ++ // CraftBukkit start - Create PlayerVelocity event ++ boolean cancelled = false; ++ ++ if (this.tracker instanceof EntityPlayer) { ++ Player player = (Player) this.tracker.getBukkitEntity(); ++ org.bukkit.util.Vector velocity = player.getVelocity(); ++ ++ PlayerVelocityEvent event = new PlayerVelocityEvent(player, velocity); ++ this.tracker.world.getServer().getPluginManager().callEvent(event); ++ ++ if (event.isCancelled()) { ++ cancelled = true; ++ } else if (!velocity.equals(event.getVelocity())) { ++ player.setVelocity(velocity); ++ } ++ } ++ ++ if (!cancelled) { ++ this.broadcastIncludingSelf(new PacketPlayOutEntityVelocity(this.tracker)); ++ } ++ // CraftBukkit end + this.tracker.velocityChanged = false; + } + +@@ -211,6 +256,11 @@ + Set set = attributemapserver.getAttributes(); + + if (!set.isEmpty()) { ++ // CraftBukkit start - Send scaled max health ++ if (this.tracker instanceof EntityPlayer) { ++ ((EntityPlayer) this.tracker).getBukkitEntity().injectScaledMaxHealth(set, false); ++ } ++ // CraftBukkit end + this.broadcastIncludingSelf(new PacketPlayOutUpdateAttributes(this.tracker.getId(), set)); + } + +@@ -260,7 +310,17 @@ + public void updatePlayer(EntityPlayer entityplayer) { + if (entityplayer != this.tracker) { + if (this.c(entityplayer)) { +- if (!this.trackedPlayers.contains(entityplayer) && (this.e(entityplayer) || this.tracker.attachedToPlayer)) { ++ if (!this.trackedPlayers.contains(entityplayer) && (this.e(entityplayer) || this.tracker.attachedToPlayer)) { ++ // CraftBukkit start - respect vanish API ++ if (this.tracker instanceof EntityPlayer) { ++ Player player = ((EntityPlayer) this.tracker).getBukkitEntity(); ++ if (!entityplayer.getBukkitEntity().canSee(player)) { ++ return; ++ } ++ } ++ ++ entityplayer.removeQueue.remove(Integer.valueOf(this.tracker.getId())); ++ // CraftBukkit end + this.trackedPlayers.add(entityplayer); + Packet packet = this.c(); + +@@ -278,6 +338,12 @@ + if (this.tracker instanceof EntityLiving) { + AttributeMapServer attributemapserver = (AttributeMapServer) ((EntityLiving) this.tracker).getAttributeMap(); + Collection collection = attributemapserver.c(); ++ ++ // CraftBukkit start - If sending own attributes send scaled health instead of current maximum health ++ if (this.tracker.getId() == entityplayer.getId()) { ++ ((EntityPlayer) this.tracker).getBukkitEntity().injectScaledMaxHealth(collection, false); ++ } ++ // CraftBukkit end + + if (!collection.isEmpty()) { + entityplayer.playerConnection.sendPacket(new PacketPlayOutUpdateAttributes(this.tracker.getId(), collection)); +@@ -316,6 +382,11 @@ + entityplayer.playerConnection.sendPacket(new PacketPlayOutBed(entityhuman, new BlockPosition(this.tracker))); + } + } ++ ++ // CraftBukkit start - Fix for nonsensical head yaw ++ this.i = MathHelper.d(this.tracker.getHeadRotation() * 256.0F / 360.0F); ++ this.broadcast(new PacketPlayOutEntityHeadRotation(this.tracker, (byte) i)); ++ // CraftBukkit end + + if (this.tracker instanceof EntityLiving) { + EntityLiving entityliving = (EntityLiving) this.tracker; +@@ -356,7 +427,10 @@ + + private Packet c() { + if (this.tracker.dead) { +- EntityTrackerEntry.p.warn("Fetching addPacket for removed entity"); ++ // CraftBukkit start - Remove useless error spam, just return ++ // EntityTrackerEntry.p.warn("Fetching addPacket for removed entity"); ++ return null; ++ // CraftBukkit end + } + + if (this.tracker instanceof EntityItem) { diff --git a/nms-patches/EntityVillager.patch b/nms-patches/EntityVillager.patch new file mode 100644 index 0000000000..e2b327aebd --- /dev/null +++ b/nms-patches/EntityVillager.patch @@ -0,0 +1,19 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/EntityVillager.java 2014-11-27 08:59:46.741421670 +1100 ++++ src/main/java/net/minecraft/server/EntityVillager.java 2014-11-27 08:42:10.144850927 +1100 +@@ -1,6 +1,7 @@ + package net.minecraft.server; + + import java.util.Iterator; ++import org.bukkit.craftbukkit.entity.CraftVillager; + + public class EntityVillager extends EntityAgeable implements NPC, IMerchant { + +@@ -28,7 +29,7 @@ + + public EntityVillager(World world, int i) { + super(world); +- this.inventory = new InventorySubcontainer("Items", false, 8); ++ this.inventory = new InventorySubcontainer("Items", false, 8, (CraftVillager) this.getBukkitEntity()); // CraftBukkit add argument + this.setProfession(i); + this.a(0.6F, 1.8F); + ((Navigation) this.getNavigation()).b(true); diff --git a/nms-patches/EntityWither.patch b/nms-patches/EntityWither.patch new file mode 100644 index 0000000000..7caa58e9cc --- /dev/null +++ b/nms-patches/EntityWither.patch @@ -0,0 +1,78 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/EntityWither.java 2014-11-27 08:59:46.745421653 +1100 ++++ src/main/java/net/minecraft/server/EntityWither.java 2014-11-27 08:42:10.156850903 +1100 +@@ -5,6 +5,12 @@ + import java.util.Iterator; + import java.util.List; + ++// CraftBukkit start ++import org.bukkit.craftbukkit.event.CraftEventFactory; ++import org.bukkit.event.entity.EntityRegainHealthEvent; ++import org.bukkit.event.entity.ExplosionPrimeEvent; ++// CraftBukkit end ++ + public class EntityWither extends EntityMonster implements IRangedEntity { + + private float[] b = new float[2]; +@@ -160,13 +166,38 @@ + if (this.cj() > 0) { + i = this.cj() - 1; + if (i <= 0) { +- this.world.createExplosion(this, this.locX, this.locY + (double) this.getHeadHeight(), this.locZ, 7.0F, false, this.world.getGameRules().getBoolean("mobGriefing")); +- this.world.a(1013, new BlockPosition(this), 0); ++ // CraftBukkit start ++ // this.world.createExplosion(this, this.locX, this.locY + (double) this.getHeadHeight(), this.locZ, 7.0F, false, this.world.getGameRules().getBoolean("mobGriefing")); ++ ExplosionPrimeEvent event = new ExplosionPrimeEvent(this.getBukkitEntity(), 7.0F, false); ++ this.world.getServer().getPluginManager().callEvent(event); ++ ++ if (!event.isCancelled()) { ++ this.world.createExplosion(this, this.locX, this.locY + (double) this.getHeadHeight(), this.locZ, event.getRadius(), event.getFire(), this.world.getGameRules().getBoolean("mobGriefing")); ++ } ++ // CraftBukkit end ++ ++ // CraftBukkit start - Use relative location for far away sounds ++ // this.world.a(1013, new BlockPosition(this), 0); ++ int viewDistance = ((WorldServer) this.world).getServer().getViewDistance() * 16; ++ for (EntityPlayer player : (List) this.world.players) { ++ double deltaX = this.locX - player.locX; ++ double deltaZ = this.locZ - player.locZ; ++ double distanceSquared = deltaX * deltaX + deltaZ * deltaZ; ++ if (distanceSquared > viewDistance * viewDistance) { ++ double deltaLength = Math.sqrt(distanceSquared); ++ double relativeX = player.locX + (deltaX / deltaLength) * viewDistance; ++ double relativeZ = player.locZ + (deltaZ / deltaLength) * viewDistance; ++ player.playerConnection.sendPacket(new PacketPlayOutWorldEvent(1013, new BlockPosition((int) relativeX, (int) this.locY, (int) relativeZ), 0, true)); ++ } else { ++ player.playerConnection.sendPacket(new PacketPlayOutWorldEvent(1013, new BlockPosition((int) this.locX, (int) this.locY, (int) this.locZ), 0, true)); ++ } ++ } ++ // CraftBukkit end + } + + this.r(i); + if (this.ticksLived % 10 == 0) { +- this.heal(10.0F); ++ this.heal(10.0F, EntityRegainHealthEvent.RegainReason.WITHER_SPAWN); // CraftBukkit + } + + } else { +@@ -251,6 +282,11 @@ + Block block = this.world.getType(new BlockPosition(j2, k2, l2)).getBlock(); + + if (block.getMaterial() != Material.AIR && block != Blocks.BEDROCK && block != Blocks.END_PORTAL && block != Blocks.END_PORTAL_FRAME && block != Blocks.COMMAND_BLOCK && block != Blocks.BARRIER) { ++ // CraftBukkit start ++ if (CraftEventFactory.callEntityChangeBlockEvent(this, j2, k2, l2, Blocks.AIR, 0).isCancelled()) { ++ continue; ++ } ++ // CraftBukkit end + flag = this.world.setAir(new BlockPosition(j2, k2, l2), true) || flag; + } + } +@@ -264,7 +300,7 @@ + } + + if (this.ticksLived % 20 == 0) { +- this.heal(1.0F); ++ this.heal(1.0F, EntityRegainHealthEvent.RegainReason.REGEN); // CraftBukkit + } + + } diff --git a/nms-patches/EntityWitherSkull.patch b/nms-patches/EntityWitherSkull.patch new file mode 100644 index 0000000000..1428bf512e --- /dev/null +++ b/nms-patches/EntityWitherSkull.patch @@ -0,0 +1,36 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/EntityWitherSkull.java 2014-11-27 08:59:46.745421653 +1100 ++++ src/main/java/net/minecraft/server/EntityWitherSkull.java 2014-11-27 08:42:10.120850973 +1100 +@@ -1,5 +1,7 @@ + package net.minecraft.server; + ++import org.bukkit.event.entity.ExplosionPrimeEvent; // CraftBukkit ++ + public class EntityWitherSkull extends EntityFireball { + + public EntityWitherSkull(World world) { +@@ -36,7 +38,7 @@ + if (this.shooter != null) { + if (movingobjectposition.entity.damageEntity(DamageSource.mobAttack(this.shooter), 8.0F)) { + if (!movingobjectposition.entity.isAlive()) { +- this.shooter.heal(5.0F); ++ this.shooter.heal(5.0F, org.bukkit.event.entity.EntityRegainHealthEvent.RegainReason.WITHER); // CraftBukkit + } else { + this.a(this.shooter, movingobjectposition.entity); + } +@@ -60,7 +62,15 @@ + } + } + +- this.world.createExplosion(this, this.locX, this.locY, this.locZ, 1.0F, false, this.world.getGameRules().getBoolean("mobGriefing")); ++ // CraftBukkit start ++ // this.world.createExplosion(this, this.locX, this.locY, this.locZ, 1.0F, false, this.world.getGameRules().getBoolean("mobGriefing")); ++ ExplosionPrimeEvent event = new ExplosionPrimeEvent(this.getBukkitEntity(), 1.0F, false); ++ this.world.getServer().getPluginManager().callEvent(event); ++ ++ if (!event.isCancelled()) { ++ this.world.createExplosion(this, this.locX, this.locY, this.locZ, event.getRadius(), event.getFire(), this.world.getGameRules().getBoolean("mobGriefing")); ++ } ++ // CraftBukkit end + this.die(); + } + diff --git a/nms-patches/EntityWolf.patch b/nms-patches/EntityWolf.patch new file mode 100644 index 0000000000..1621a4842c --- /dev/null +++ b/nms-patches/EntityWolf.patch @@ -0,0 +1,87 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/EntityWolf.java 2014-11-27 08:59:46.749421635 +1100 ++++ src/main/java/net/minecraft/server/EntityWolf.java 2014-11-27 08:42:10.160850895 +1100 +@@ -1,5 +1,10 @@ + package net.minecraft.server; + ++// CraftBukkit start ++import org.bukkit.craftbukkit.event.CraftEventFactory; ++import org.bukkit.event.entity.EntityTargetEvent.TargetReason; ++// CraftBukkit end ++ + public class EntityWolf extends EntityTameableAnimal { + + private float bm; +@@ -51,8 +56,19 @@ + } else if (!this.isTamed()) { + this.setAngry(true); + } ++ } + ++ // CraftBukkit - add overriden version ++ @Override ++ public void setGoalTarget(EntityLiving entityliving, org.bukkit.event.entity.EntityTargetEvent.TargetReason reason, boolean fire) { ++ super.setGoalTarget(entityliving, reason, fire); ++ if (entityliving == null) { ++ this.setAngry(false); ++ } else if (!this.isTamed()) { ++ this.setAngry(true); ++ } + } ++ // CraftBukkit end + + protected void E() { + this.datawatcher.watch(18, Float.valueOf(this.getHealth())); +@@ -85,7 +101,8 @@ + } + + protected String z() { +- return this.isAngry() ? "mob.wolf.growl" : (this.random.nextInt(3) == 0 ? (this.isTamed() && this.datawatcher.getFloat(18) < 10.0F ? "mob.wolf.whine" : "mob.wolf.panting") : "mob.wolf.bark"); ++ // CraftBukkit - (getFloat(18) < 10) -> (getFloat(18) < this.getMaxHealth() / 2) ++ return this.isAngry() ? "mob.wolf.growl" : (this.random.nextInt(3) == 0 ? (this.isTamed() && this.datawatcher.getFloat(18) < this.getMaxHealth() / 2 ? "mob.wolf.whine" : "mob.wolf.panting") : "mob.wolf.bark"); + } + + protected String bn() { +@@ -219,7 +236,7 @@ + --itemstack.count; + } + +- this.heal((float) itemfood.getNutrition(itemstack)); ++ this.heal((float) itemfood.getNutrition(itemstack), org.bukkit.event.entity.EntityRegainHealthEvent.RegainReason.EATING); // CraftBukkit + if (itemstack.count <= 0) { + entityhuman.inventory.setItem(entityhuman.inventory.itemInHandIndex, (ItemStack) null); + } +@@ -244,7 +261,7 @@ + this.bk.setSitting(!this.isSitting()); + this.aW = false; + this.navigation.n(); +- this.setGoalTarget((EntityLiving) null); ++ this.setGoalTarget((EntityLiving) null, TargetReason.FORGOT_TARGET, true); // CraftBukkit - reason + } + } else if (itemstack != null && itemstack.getItem() == Items.BONE && !this.isAngry()) { + if (!entityhuman.abilities.canInstantlyBuild) { +@@ -256,12 +273,13 @@ + } + + if (!this.world.isStatic) { +- if (this.random.nextInt(3) == 0) { ++ // CraftBukkit - added event call and isCancelled check. ++ if (this.random.nextInt(3) == 0 && !CraftEventFactory.callEntityTameEvent(this, entityhuman).isCancelled()) { + this.setTamed(true); + this.navigation.n(); +- this.setGoalTarget((EntityLiving) null); ++ this.setGoalTarget((EntityLiving) null, TargetReason.FORGOT_TARGET, true); + this.bk.setSitting(true); +- this.setHealth(20.0F); ++ this.setHealth(this.getMaxHealth()); // CraftBukkit - 20.0 -> getMaxHealth() + this.setOwnerUUID(entityhuman.getUniqueID().toString()); + this.l(true); + this.world.broadcastEntityEffect(this, (byte) 7); +@@ -348,7 +366,7 @@ + } + + protected boolean isTypeNotPersistent() { +- return !this.isTamed() && this.ticksLived > 2400; ++ return !this.isTamed() /*&& this.ticksLived > 2400*/; // CraftBukkit + } + + public boolean a(EntityLiving entityliving, EntityLiving entityliving1) { diff --git a/nms-patches/EntityZombie.patch b/nms-patches/EntityZombie.patch new file mode 100644 index 0000000000..634ca93999 --- /dev/null +++ b/nms-patches/EntityZombie.patch @@ -0,0 +1,108 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/EntityZombie.java 2014-11-27 08:59:46.749421635 +1100 ++++ src/main/java/net/minecraft/server/EntityZombie.java 2014-11-27 08:42:10.144850927 +1100 +@@ -4,6 +4,14 @@ + import java.util.List; + import java.util.UUID; + ++//CraftBukkit start ++import org.bukkit.craftbukkit.entity.CraftLivingEntity; ++import org.bukkit.event.entity.CreatureSpawnEvent; ++import org.bukkit.event.entity.EntityCombustByEntityEvent; ++import org.bukkit.event.entity.EntityCombustEvent; ++import org.bukkit.event.entity.EntityTargetEvent; ++//CraftBukkit end ++ + public class EntityZombie extends EntityMonster { + + protected static final IAttribute b = (new AttributeRanged((IAttribute) null, "zombie.spawnReinforcements", 0.0D, 0.0D, 1.0D)).a("Spawn Reinforcements Chance"); +@@ -14,6 +22,7 @@ + private boolean bn = false; + private float bo = -1.0F; + private float bp; ++ private int lastTick = MinecraftServer.currentTick; // CraftBukkit - add field + + public EntityZombie(World world) { + super(world); +@@ -136,7 +145,14 @@ + } + + if (flag) { +- this.setOnFire(8); ++ // CraftBukkit start ++ EntityCombustEvent event = new EntityCombustEvent(this.getBukkitEntity(), 8); ++ this.world.getServer().getPluginManager().callEvent(event); ++ ++ if (!event.isCancelled()) { ++ this.setOnFire(event.getDuration()); ++ } ++ // CraftBukkit end + } + } + } +@@ -170,8 +186,8 @@ + if (World.a((IBlockAccess) this.world, new BlockPosition(i1, j1 - 1, k1)) && this.world.getLightLevel(new BlockPosition(i1, j1, k1)) < 10) { + entityzombie.setPosition((double) i1, (double) j1, (double) k1); + if (!this.world.isPlayerNearby((double) i1, (double) j1, (double) k1, 7.0D) && this.world.a(entityzombie.getBoundingBox(), (Entity) entityzombie) && this.world.getCubes(entityzombie, entityzombie.getBoundingBox()).isEmpty() && !this.world.containsLiquid(entityzombie.getBoundingBox())) { +- this.world.addEntity(entityzombie); +- entityzombie.setGoalTarget(entityliving); ++ this.world.addEntity(entityzombie, CreatureSpawnEvent.SpawnReason.REINFORCEMENTS); // CraftBukkit ++ entityzombie.setGoalTarget(entityliving, EntityTargetEvent.TargetReason.REINFORCEMENT_TARGET, true); + entityzombie.prepare(this.world.E(new BlockPosition(entityzombie)), (GroupDataEntity) null); + this.getAttributeInstance(EntityZombie.b).b(new AttributeModifier("Zombie reinforcement caller charge", -0.05000000074505806D, 0)); + entityzombie.getAttributeInstance(EntityZombie.b).b(new AttributeModifier("Zombie reinforcement callee charge", -0.05000000074505806D, 0)); +@@ -190,6 +206,12 @@ + public void s_() { + if (!this.world.isStatic && this.cn()) { + int i = this.cp(); ++ ++ // CraftBukkit start - Use wall time instead of ticks for villager conversion ++ int elapsedTicks = MinecraftServer.currentTick - this.lastTick; ++ this.lastTick = MinecraftServer.currentTick; ++ i *= elapsedTicks; ++ // CraftBukkit end + + this.bm -= i; + if (this.bm <= 0) { +@@ -207,7 +229,14 @@ + int i = this.world.getDifficulty().a(); + + if (this.bz() == null && this.isBurning() && this.random.nextFloat() < (float) i * 0.3F) { +- entity.setOnFire(2 * i); ++ // CraftBukkit start ++ EntityCombustByEntityEvent event = new EntityCombustByEntityEvent(this.getBukkitEntity(), entity.getBukkitEntity(), 2 * i); ++ this.world.getServer().getPluginManager().callEvent(event); ++ ++ if (!event.isCancelled()) { ++ entity.setOnFire(event.getDuration()); ++ } ++ // CraftBukkit end + } + } + +@@ -316,7 +345,7 @@ + entityzombie.setBaby(true); + } + +- this.world.addEntity(entityzombie); ++ this.world.addEntity(entityzombie, CreatureSpawnEvent.SpawnReason.INFECTION); // CraftBukkit - add SpawnReason + this.world.a((EntityHuman) null, 1016, new BlockPosition((int) this.locX, (int) this.locY, (int) this.locZ), 0); + } + +@@ -369,7 +398,7 @@ + entitychicken1.setPositionRotation(this.locX, this.locY, this.locZ, this.yaw, 0.0F); + entitychicken1.prepare(difficultydamagescaler, (GroupDataEntity) null); + entitychicken1.l(true); +- this.world.addEntity(entitychicken1); ++ this.world.addEntity(entitychicken1, CreatureSpawnEvent.SpawnReason.MOUNT); + this.mount(entitychicken1); + } + } +@@ -452,7 +481,7 @@ + } + + this.world.kill(this); +- this.world.addEntity(entityvillager); ++ this.world.addEntity(entityvillager, CreatureSpawnEvent.SpawnReason.CURED); // CraftBukkit - add SpawnReason + entityvillager.addEffect(new MobEffect(MobEffectList.CONFUSION.id, 200, 0)); + this.world.a((EntityHuman) null, 1017, new BlockPosition((int) this.locX, (int) this.locY, (int) this.locZ), 0); + } diff --git a/nms-patches/ExpirableListEntry.patch b/nms-patches/ExpirableListEntry.patch new file mode 100644 index 0000000000..6bb3d3918f --- /dev/null +++ b/nms-patches/ExpirableListEntry.patch @@ -0,0 +1,42 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/ExpirableListEntry.java 2014-11-27 08:59:46.749421635 +1100 ++++ src/main/java/net/minecraft/server/ExpirableListEntry.java 2014-11-27 08:42:10.096851020 +1100 +@@ -22,7 +22,7 @@ + } + + protected ExpirableListEntry(Object object, JsonObject jsonobject) { +- super(object, jsonobject); ++ super(checkExpiry(object, jsonobject), jsonobject); + + Date date; + +@@ -65,4 +65,30 @@ + jsonobject.addProperty("expires", this.d == null ? "forever" : ExpirableListEntry.a.format(this.d)); + jsonobject.addProperty("reason", this.e); + } ++ ++ // CraftBukkit start ++ public String getSource() { ++ return this.c; ++ } ++ ++ public Date getCreated() { ++ return this.b; ++ } ++ ++ private static Object checkExpiry(Object object, JsonObject jsonobject) { ++ Date expires = null; ++ ++ try { ++ expires = jsonobject.has("expires") ? a.parse(jsonobject.get("expires").getAsString()) : null; ++ } catch (ParseException ex) { ++ // Guess we don't have a date ++ } ++ ++ if (expires == null || expires.after(new Date())) { ++ return object; ++ } else { ++ return null; ++ } ++ } ++ // CraftBukkit end + } diff --git a/nms-patches/Explosion.patch b/nms-patches/Explosion.patch new file mode 100644 index 0000000000..3d0b5b84c2 --- /dev/null +++ b/nms-patches/Explosion.patch @@ -0,0 +1,127 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/Explosion.java 2014-11-27 08:59:46.753421618 +1100 ++++ src/main/java/net/minecraft/server/Explosion.java 2014-11-27 08:42:10.160850895 +1100 +@@ -8,6 +8,12 @@ + import java.util.List; + import java.util.Map; + import java.util.Random; ++ ++// CraftBukkit start ++import org.bukkit.craftbukkit.event.CraftEventFactory; ++import org.bukkit.event.entity.EntityExplodeEvent; ++import org.bukkit.Location; ++// CraftBukkit end + + public class Explosion { + +@@ -22,11 +28,12 @@ + private final float size; + private final List blocks = Lists.newArrayList(); + private final Map k = Maps.newHashMap(); ++ public boolean wasCanceled = false; // CraftBukkit - add field + + public Explosion(World world, Entity entity, double d0, double d1, double d2, float f, boolean flag, boolean flag1) { + this.world = world; + this.source = entity; +- this.size = f; ++ this.size = (float) Math.max(f, 0.0); // CraftBukkit - clamp bad values + this.posX = d0; + this.posY = d1; + this.posZ = d2; +@@ -35,6 +42,12 @@ + } + + public void a() { ++ // CraftBukkit start ++ if (this.size < 0.1F) { ++ return; ++ } ++ // CraftBukkit end ++ + HashSet hashset = Sets.newHashSet(); + boolean flag = true; + +@@ -68,7 +81,7 @@ + f -= (f2 + 0.3F) * 0.3F; + } + +- if (f > 0.0F && (this.source == null || this.source.a(this, this.world, blockposition, iblockdata, f))) { ++ if (f > 0.0F && (this.source == null || this.source.a(this, this.world, blockposition, iblockdata, f)) && blockposition.getY() < 256 && blockposition.getY() >= 0) { // CraftBukkit - don't wrap explosions + hashset.add(blockposition); + } + +@@ -112,7 +125,14 @@ + double d12 = (double) this.world.a(vec3d, entity.getBoundingBox()); + double d13 = (1.0D - d7) * d12; + ++ // entity.damageEntity(DamageSource.explosion(this), (float) ((int) ((d13 * d13 + d13) / 2.0D * 8.0D * (double) f3 + 1.0D))); ++ ++ // CraftBukkit start ++ CraftEventFactory.entityDamage = source; + entity.damageEntity(DamageSource.explosion(this), (float) ((int) ((d13 * d13 + d13) / 2.0D * 8.0D * (double) f3 + 1.0D))); ++ CraftEventFactory.entityDamage = null; ++ // CraftBukkit end ++ + double d14 = EnchantmentProtection.a(entity, d13); + + entity.motX += d8 * d14; +@@ -140,6 +160,35 @@ + BlockPosition blockposition; + + if (this.b) { ++ // CraftBukkit start ++ org.bukkit.World bworld = this.world.getWorld(); ++ org.bukkit.entity.Entity explode = this.source == null ? null : this.source.getBukkitEntity(); ++ Location location = new Location(bworld, this.posX, this.posY, this.posZ); ++ ++ List blockList = Lists.newArrayList(); ++ for (int i1 = this.blocks.size() - 1; i1 >= 0; i1--) { ++ BlockPosition cpos = (BlockPosition) this.blocks.get(i1); ++ org.bukkit.block.Block bblock = bworld.getBlockAt(cpos.getX(), cpos.getY(), cpos.getZ()); ++ if (bblock.getType() != org.bukkit.Material.AIR) { ++ blockList.add(bblock); ++ } ++ } ++ ++ EntityExplodeEvent event = new EntityExplodeEvent(explode, location, blockList, 0.3F); ++ this.world.getServer().getPluginManager().callEvent(event); ++ ++ this.blocks.clear(); ++ ++ for (org.bukkit.block.Block bblock : event.blockList()) { ++ BlockPosition coords = new BlockPosition(bblock.getX(), bblock.getY(), bblock.getZ()); ++ blocks.add(coords); ++ } ++ ++ if (event.isCancelled()) { ++ this.wasCanceled = true; ++ return; ++ } ++ // CraftBukkit end + iterator = this.blocks.iterator(); + + while (iterator.hasNext()) { +@@ -170,7 +219,8 @@ + + if (block.getMaterial() != Material.AIR) { + if (block.a(this)) { +- block.dropNaturally(this.world, blockposition, this.world.getType(blockposition), 1.0F / this.size, 0); ++ // CraftBukkit - add yield ++ block.dropNaturally(this.world, blockposition, this.world.getType(blockposition), event.getYield(), 0); + } + + this.world.setTypeAndData(blockposition, Blocks.AIR.getBlockData(), 3); +@@ -184,8 +234,12 @@ + + while (iterator.hasNext()) { + blockposition = (BlockPosition) iterator.next(); +- if (this.world.getType(blockposition).getBlock().getMaterial() == Material.AIR && this.world.getType(blockposition.down()).getBlock().m() && this.c.nextInt(3) == 0) { +- this.world.setTypeUpdate(blockposition, Blocks.FIRE.getBlockData()); ++ if (this.world.getType(blockposition).getBlock().getMaterial() == Material.AIR && this.world.getType(blockposition.down()).getBlock().m() && this.c.nextInt(3) == 0) { ++ // CraftBukkit start - Ignition by explosion ++ if (!org.bukkit.craftbukkit.event.CraftEventFactory.callBlockIgniteEvent(this.world, blockposition.getX(), blockposition.getY(), blockposition.getZ(), this).isCancelled()) { ++ this.world.setTypeUpdate(blockposition, Blocks.FIRE.getBlockData()); ++ } ++ // CraftBukkit end + } + } + } diff --git a/nms-patches/FoodMetaData.patch b/nms-patches/FoodMetaData.patch new file mode 100644 index 0000000000..bfd974b35a --- /dev/null +++ b/nms-patches/FoodMetaData.patch @@ -0,0 +1,66 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/FoodMetaData.java 2014-11-27 08:59:46.753421618 +1100 ++++ src/main/java/net/minecraft/server/FoodMetaData.java 2014-11-27 08:42:10.104851005 +1100 +@@ -6,9 +6,17 @@ + public float saturationLevel = 5.0F; + public float exhaustionLevel; + public int foodTickTimer; ++ private EntityHuman entityhuman; // CraftBukkit + private int e = 20; + +- public FoodMetaData() {} ++ public FoodMetaData() { throw new AssertionError("Whoopsie, we missed the bukkit."); } // CraftBukkit start - throw an error ++ ++ // CraftBukkit start - added EntityHuman constructor ++ public FoodMetaData(EntityHuman entityhuman) { ++ org.apache.commons.lang.Validate.notNull(entityhuman); ++ this.entityhuman = entityhuman; ++ } ++ // CraftBukkit end + + public void eat(int i, float f) { + this.foodLevel = Math.min(i + this.foodLevel, 20); +@@ -16,7 +24,17 @@ + } + + public void a(ItemFood itemfood, ItemStack itemstack) { +- this.eat(itemfood.getNutrition(itemstack), itemfood.getSaturationModifier(itemstack)); ++ // CraftBukkit start ++ int oldFoodLevel = foodLevel; ++ ++ org.bukkit.event.entity.FoodLevelChangeEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callFoodLevelChangeEvent(entityhuman, itemfood.getNutrition(itemstack) + oldFoodLevel); ++ ++ if (!event.isCancelled()) { ++ this.eat(event.getFoodLevel() - oldFoodLevel, itemfood.getSaturationModifier(itemstack)); ++ } ++ ++ ((EntityPlayer) entityhuman).playerConnection.sendPacket(new PacketPlayOutUpdateHealth(((EntityPlayer) entityhuman).getBukkitEntity().getScaledHealth(), entityhuman.getFoodData().foodLevel, entityhuman.getFoodData().saturationLevel)); ++ // CraftBukkit end + } + + public void a(EntityHuman entityhuman) { +@@ -28,14 +46,23 @@ + if (this.saturationLevel > 0.0F) { + this.saturationLevel = Math.max(this.saturationLevel - 1.0F, 0.0F); + } else if (enumdifficulty != EnumDifficulty.PEACEFUL) { +- this.foodLevel = Math.max(this.foodLevel - 1, 0); ++ // CraftBukkit start ++ org.bukkit.event.entity.FoodLevelChangeEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callFoodLevelChangeEvent(entityhuman, Math.max(this.foodLevel - 1, 0)); ++ ++ if (!event.isCancelled()) { ++ this.foodLevel = event.getFoodLevel(); ++ } ++ ++ ((EntityPlayer) entityhuman).playerConnection.sendPacket(new PacketPlayOutUpdateHealth(((EntityPlayer) entityhuman).getBukkitEntity().getScaledHealth(), this.foodLevel, this.saturationLevel)); ++ // CraftBukkit end + } + } + + if (entityhuman.world.getGameRules().getBoolean("naturalRegeneration") && this.foodLevel >= 18 && entityhuman.cl()) { + ++this.foodTickTimer; + if (this.foodTickTimer >= 80) { +- entityhuman.heal(1.0F); ++ // CraftBukkit - added RegainReason ++ entityhuman.heal(1.0F, org.bukkit.event.entity.EntityRegainHealthEvent.RegainReason.SATIATED); + this.a(3.0F); + this.foodTickTimer = 0; + } diff --git a/nms-patches/HandshakeListener.patch b/nms-patches/HandshakeListener.patch new file mode 100644 index 0000000000..651b7fee09 --- /dev/null +++ b/nms-patches/HandshakeListener.patch @@ -0,0 +1,69 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/HandshakeListener.java 2014-11-27 08:59:46.757421600 +1100 ++++ src/main/java/net/minecraft/server/HandshakeListener.java 2014-11-27 08:42:10.100851012 +1100 +@@ -1,6 +1,16 @@ + package net.minecraft.server; + ++// CraftBukkit start ++import java.net.InetAddress; ++import java.util.HashMap; ++// CraftBukkit end ++ + public class HandshakeListener implements PacketHandshakingInListener { ++ ++ // CraftBukkit start - add fields ++ private static final HashMap throttleTracker = new HashMap(); ++ private static int throttleCounter = 0; ++ // CraftBukkit end + + private final MinecraftServer a; + private final NetworkManager b; +@@ -15,6 +25,41 @@ + case 1: + this.b.a(EnumProtocol.LOGIN); + ChatComponentText chatcomponenttext; ++ ++ // CraftBukkit start - Connection throttle ++ try { ++ long currentTime = System.currentTimeMillis(); ++ long connectionThrottle = MinecraftServer.getServer().server.getConnectionThrottle(); ++ InetAddress address = ((java.net.InetSocketAddress) this.b.getSocketAddress()).getAddress(); ++ ++ synchronized (throttleTracker) { ++ if (throttleTracker.containsKey(address) && !"127.0.0.1".equals(address.getHostAddress()) && currentTime - throttleTracker.get(address) < connectionThrottle) { ++ throttleTracker.put(address, currentTime); ++ chatcomponenttext = new ChatComponentText("Connection throttled! Please wait before reconnecting."); ++ this.b.handle(new PacketLoginOutDisconnect(chatcomponenttext)); ++ this.b.close(chatcomponenttext); ++ return; ++ } ++ ++ throttleTracker.put(address, currentTime); ++ throttleCounter++; ++ if (throttleCounter > 200) { ++ throttleCounter = 0; ++ ++ // Cleanup stale entries ++ java.util.Iterator iter = throttleTracker.entrySet().iterator(); ++ while (iter.hasNext()) { ++ java.util.Map.Entry entry = (java.util.Map.Entry) iter.next(); ++ if (entry.getValue() > connectionThrottle) { ++ iter.remove(); ++ } ++ } ++ } ++ } ++ } catch (Throwable t) { ++ org.apache.logging.log4j.LogManager.getLogger().debug("Failed to check connection throttle", t); ++ } ++ // CraftBukkit end + + if (packethandshakinginsetprotocol.b() > 47) { + chatcomponenttext = new ChatComponentText("Outdated server! I\'m still on 1.8"); +@@ -26,6 +71,7 @@ + this.b.close(chatcomponenttext); + } else { + this.b.a((PacketListener) (new LoginListener(this.a, this.b))); ++ ((LoginListener) this.b.getPacketListener()).hostname = packethandshakinginsetprotocol.b + ":" + packethandshakinginsetprotocol.c; // CraftBukkit - set hostname + } + break; + diff --git a/nms-patches/IDataManager.patch b/nms-patches/IDataManager.patch new file mode 100644 index 0000000000..0c8a372309 --- /dev/null +++ b/nms-patches/IDataManager.patch @@ -0,0 +1,18 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/IDataManager.java 2014-11-27 08:59:46.757421600 +1100 ++++ src/main/java/net/minecraft/server/IDataManager.java 2014-11-27 08:42:10.104851005 +1100 +@@ -6,7 +6,7 @@ + + WorldData getWorldData(); + +- void checkSession(); ++ void checkSession() throws ExceptionWorldConflict; // CraftBukkit - throws ExceptionWorldConflict + + IChunkLoader createChunkLoader(WorldProvider worldprovider); + +@@ -23,4 +23,6 @@ + File getDataFile(String s); + + String g(); ++ ++ java.util.UUID getUUID(); // CraftBukkit + } diff --git a/nms-patches/IInventory.patch b/nms-patches/IInventory.patch new file mode 100644 index 0000000000..d65dcde87f --- /dev/null +++ b/nms-patches/IInventory.patch @@ -0,0 +1,31 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/IInventory.java 2014-11-27 08:59:46.757421600 +1100 ++++ src/main/java/net/minecraft/server/IInventory.java 2014-11-27 08:42:10.168850880 +1100 +@@ -1,5 +1,7 @@ + package net.minecraft.server; + ++import org.bukkit.craftbukkit.entity.CraftHumanEntity; // CraftBukkit ++ + public interface IInventory extends INamableTileEntity { + + int getSize(); +@@ -31,4 +33,20 @@ + int g(); + + void l(); ++ ++ // CraftBukkit start ++ ItemStack[] getContents(); ++ ++ void onOpen(CraftHumanEntity who); ++ ++ void onClose(CraftHumanEntity who); ++ ++ java.util.List getViewers(); ++ ++ org.bukkit.inventory.InventoryHolder getOwner(); ++ ++ void setMaxStackSize(int size); ++ ++ int MAX_STACK = 64; ++ // CraftBukkit end + } diff --git a/nms-patches/IRecipe.patch b/nms-patches/IRecipe.patch new file mode 100644 index 0000000000..cdc6680143 --- /dev/null +++ b/nms-patches/IRecipe.patch @@ -0,0 +1,9 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/IRecipe.java 2014-11-27 08:59:46.769421547 +1100 ++++ src/main/java/net/minecraft/server/IRecipe.java 2014-11-27 08:42:10.168850880 +1100 +@@ -11,4 +11,6 @@ + ItemStack b(); + + ItemStack[] b(InventoryCrafting inventorycrafting); ++ ++ org.bukkit.inventory.Recipe toBukkitRecipe(); // CraftBukkit + } diff --git a/nms-patches/InventoryCraftResult.patch b/nms-patches/InventoryCraftResult.patch new file mode 100644 index 0000000000..af51f97f94 --- /dev/null +++ b/nms-patches/InventoryCraftResult.patch @@ -0,0 +1,48 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/InventoryCraftResult.java 2014-11-27 08:59:46.761421583 +1100 ++++ src/main/java/net/minecraft/server/InventoryCraftResult.java 2014-11-27 08:42:10.140850934 +1100 +@@ -1,8 +1,36 @@ + package net.minecraft.server; + ++// CraftBukkit start ++import org.bukkit.craftbukkit.entity.CraftHumanEntity; ++import org.bukkit.entity.HumanEntity; ++// CraftBukkit end ++ + public class InventoryCraftResult implements IInventory { + + private ItemStack[] items = new ItemStack[1]; ++ ++ // CraftBukkit start ++ private int maxStack = MAX_STACK; ++ ++ public ItemStack[] getContents() { ++ return this.items; ++ } ++ ++ public org.bukkit.inventory.InventoryHolder getOwner() { ++ return null; // Result slots don't get an owner ++ } ++ ++ // Don't need a transaction; the InventoryCrafting keeps track of it for us ++ public void onOpen(CraftHumanEntity who) {} ++ public void onClose(CraftHumanEntity who) {} ++ public java.util.List getViewers() { ++ return new java.util.ArrayList(); ++ } ++ ++ public void setMaxStackSize(int size) { ++ maxStack = size; ++ } ++ // CraftBukkit end + + public InventoryCraftResult() {} + +@@ -53,7 +81,7 @@ + } + + public int getMaxStackSize() { +- return 64; ++ return maxStack; // CraftBukkit + } + + public void update() {} diff --git a/nms-patches/InventoryCrafting.patch b/nms-patches/InventoryCrafting.patch new file mode 100644 index 0000000000..84e27a9940 --- /dev/null +++ b/nms-patches/InventoryCrafting.patch @@ -0,0 +1,64 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/InventoryCrafting.java 2014-11-27 08:59:46.761421583 +1100 ++++ src/main/java/net/minecraft/server/InventoryCrafting.java 2014-11-27 08:42:10.152850911 +1100 +@@ -1,11 +1,61 @@ + package net.minecraft.server; + ++// CraftBukkit start ++import java.util.List; ++ ++import org.bukkit.craftbukkit.entity.CraftHumanEntity; ++import org.bukkit.entity.HumanEntity; ++import org.bukkit.event.inventory.InventoryType; ++// CraftBukkit end ++ + public class InventoryCrafting implements IInventory { + + private final ItemStack[] items; + private final int b; + private final int c; + private final Container d; ++ ++ // CraftBukkit start - add fields ++ public List transaction = new java.util.ArrayList(); ++ public IRecipe currentRecipe; ++ public IInventory resultInventory; ++ private EntityHuman owner; ++ private int maxStack = MAX_STACK; ++ ++ public ItemStack[] getContents() { ++ return this.items; ++ } ++ ++ public void onOpen(CraftHumanEntity who) { ++ transaction.add(who); ++ } ++ ++ public InventoryType getInvType() { ++ return items.length == 4 ? InventoryType.CRAFTING : InventoryType.WORKBENCH; ++ } ++ ++ public void onClose(CraftHumanEntity who) { ++ transaction.remove(who); ++ } ++ ++ public List getViewers() { ++ return transaction; ++ } ++ ++ public org.bukkit.inventory.InventoryHolder getOwner() { ++ return owner.getBukkitEntity(); ++ } ++ ++ public void setMaxStackSize(int size) { ++ maxStack = size; ++ resultInventory.setMaxStackSize(size); ++ } ++ ++ public InventoryCrafting(Container container, int i, int j, EntityHuman player) { ++ this(container, i, j); ++ this.owner = player; ++ } ++ // CraftBukkit end + + public InventoryCrafting(Container container, int i, int j) { + int k = i * j; diff --git a/nms-patches/InventoryEnderChest.patch b/nms-patches/InventoryEnderChest.patch new file mode 100644 index 0000000000..ee181fb3a0 --- /dev/null +++ b/nms-patches/InventoryEnderChest.patch @@ -0,0 +1,51 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/InventoryEnderChest.java 2014-11-27 08:59:46.761421583 +1100 ++++ src/main/java/net/minecraft/server/InventoryEnderChest.java 2014-11-27 08:42:10.096851020 +1100 +@@ -1,8 +1,48 @@ + package net.minecraft.server; + ++// CraftBukkit start ++import java.util.List; ++import org.bukkit.craftbukkit.entity.CraftHumanEntity; ++import org.bukkit.entity.HumanEntity; ++// CraftBukkit end ++ + public class InventoryEnderChest extends InventorySubcontainer { + + private TileEntityEnderChest a; ++ ++ // CraftBukkit start - add fields and methods ++ public List transaction = new java.util.ArrayList(); ++ public org.bukkit.entity.Player player; ++ private int maxStack = MAX_STACK; ++ ++ public ItemStack[] getContents() { ++ return this.items; ++ } ++ ++ public void onOpen(CraftHumanEntity who) { ++ transaction.add(who); ++ } ++ ++ public void onClose(CraftHumanEntity who) { ++ transaction.remove(who); ++ } ++ ++ public List getViewers() { ++ return transaction; ++ } ++ ++ public org.bukkit.inventory.InventoryHolder getOwner() { ++ return this.player; ++ } ++ ++ public void setMaxStackSize(int size) { ++ maxStack = size; ++ } ++ ++ public int getMaxStackSize() { ++ return maxStack; ++ } ++ // CraftBukkit end + + public InventoryEnderChest() { + super("container.enderchest", false, 27); diff --git a/nms-patches/InventoryHorseChest.patch b/nms-patches/InventoryHorseChest.patch new file mode 100644 index 0000000000..4146987edc --- /dev/null +++ b/nms-patches/InventoryHorseChest.patch @@ -0,0 +1,63 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/InventoryHorseChest.java 2014-11-27 08:59:46.765421565 +1100 ++++ src/main/java/net/minecraft/server/InventoryHorseChest.java 2014-11-27 08:42:10.172850872 +1100 +@@ -1,8 +1,60 @@ + package net.minecraft.server; + ++// CraftBukkit start ++import java.util.List; ++import org.bukkit.craftbukkit.entity.CraftHumanEntity; ++import org.bukkit.entity.HumanEntity; ++// CraftBukkit end ++ + public class InventoryHorseChest extends InventorySubcontainer { + + public InventoryHorseChest(String s, int i) { + super(s, false, i); + } ++ ++ // CraftBukkit start - add fields and methods ++ public List transaction = new java.util.ArrayList(); ++ private EntityHorse horse; ++ private int maxStack = MAX_STACK; ++ ++ public InventoryHorseChest(String s, int i, EntityHorse horse) { ++ super(s, false, i, (org.bukkit.craftbukkit.entity.CraftHorse) horse.getBukkitEntity()); ++ this.horse = horse; ++ } ++ ++ @Override ++ public ItemStack[] getContents() { ++ return this.items; ++ } ++ ++ @Override ++ public void onOpen(CraftHumanEntity who) { ++ transaction.add(who); ++ } ++ ++ @Override ++ public void onClose(CraftHumanEntity who) { ++ transaction.remove(who); ++ } ++ ++ @Override ++ public List getViewers() { ++ return transaction; ++ } ++ ++ @Override ++ public org.bukkit.inventory.InventoryHolder getOwner() { ++ return (org.bukkit.entity.Horse) this.horse.getBukkitEntity(); ++ } ++ ++ @Override ++ public void setMaxStackSize(int size) { ++ maxStack = size; ++ } ++ ++ @Override ++ public int getMaxStackSize() { ++ return maxStack; ++ } ++ // CraftBukkit end + } diff --git a/nms-patches/InventoryLargeChest.patch b/nms-patches/InventoryLargeChest.patch new file mode 100644 index 0000000000..2e1b2eaad7 --- /dev/null +++ b/nms-patches/InventoryLargeChest.patch @@ -0,0 +1,66 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/InventoryLargeChest.java 2014-11-27 08:59:46.765421565 +1100 ++++ src/main/java/net/minecraft/server/InventoryLargeChest.java 2014-11-27 08:42:10.164850887 +1100 +@@ -1,10 +1,54 @@ + package net.minecraft.server; + ++// CraftBukkit start ++import java.util.List; ++ ++import org.bukkit.craftbukkit.entity.CraftHumanEntity; ++import org.bukkit.entity.HumanEntity; ++// CraftBukkit end ++ + public class InventoryLargeChest implements ITileInventory { + + private String a; + public ITileInventory left; + public ITileInventory right; ++ ++ // CraftBukkit start - add fields and methods ++ public List transaction = new java.util.ArrayList(); ++ ++ public ItemStack[] getContents() { ++ ItemStack[] result = new ItemStack[this.getSize()]; ++ for (int i = 0; i < result.length; i++) { ++ result[i] = this.getItem(i); ++ } ++ return result; ++ } ++ ++ public void onOpen(CraftHumanEntity who) { ++ this.left.onOpen(who); ++ this.right.onOpen(who); ++ transaction.add(who); ++ } ++ ++ public void onClose(CraftHumanEntity who) { ++ this.left.onClose(who); ++ this.right.onClose(who); ++ transaction.remove(who); ++ } ++ ++ public List getViewers() { ++ return transaction; ++ } ++ ++ public org.bukkit.inventory.InventoryHolder getOwner() { ++ return null; // This method won't be called since CraftInventoryDoubleChest doesn't defer to here ++ } ++ ++ public void setMaxStackSize(int size) { ++ this.left.setMaxStackSize(size); ++ this.right.setMaxStackSize(size); ++ } ++ // CraftBukkit end + + public InventoryLargeChest(String s, ITileInventory itileinventory, ITileInventory itileinventory1) { + this.a = s; +@@ -68,7 +112,7 @@ + } + + public int getMaxStackSize() { +- return this.left.getMaxStackSize(); ++ return Math.min(this.left.getMaxStackSize(), this.right.getMaxStackSize()); // CraftBukkit - check both sides + } + + public void update() { diff --git a/nms-patches/InventoryMerchant.patch b/nms-patches/InventoryMerchant.patch new file mode 100644 index 0000000000..bc24b3dc6d --- /dev/null +++ b/nms-patches/InventoryMerchant.patch @@ -0,0 +1,59 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/InventoryMerchant.java 2014-11-27 08:59:46.769421547 +1100 ++++ src/main/java/net/minecraft/server/InventoryMerchant.java 2014-11-27 08:42:10.136850942 +1100 +@@ -1,5 +1,11 @@ + package net.minecraft.server; + ++// CraftBukkit start ++import java.util.List; ++import org.bukkit.craftbukkit.entity.CraftHumanEntity; ++import org.bukkit.entity.HumanEntity; ++// CraftBukkit end ++ + public class InventoryMerchant implements IInventory { + + private final IMerchant merchant; +@@ -8,6 +14,35 @@ + private MerchantRecipe recipe; + private int e; + ++ // CraftBukkit start - add fields and methods ++ public List transaction = new java.util.ArrayList(); ++ private int maxStack = MAX_STACK; ++ ++ public ItemStack[] getContents() { ++ return this.itemsInSlots; ++ } ++ ++ public void onOpen(CraftHumanEntity who) { ++ transaction.add(who); ++ } ++ ++ public void onClose(CraftHumanEntity who) { ++ transaction.remove(who); ++ } ++ ++ public List getViewers() { ++ return transaction; ++ } ++ ++ public void setMaxStackSize(int i) { ++ maxStack = i; ++ } ++ ++ public org.bukkit.inventory.InventoryHolder getOwner() { ++ return player.getBukkitEntity(); ++ } ++ // CraftBukkit end ++ + public InventoryMerchant(EntityHuman entityhuman, IMerchant imerchant) { + this.player = entityhuman; + this.merchant = imerchant; +@@ -94,7 +129,7 @@ + } + + public int getMaxStackSize() { +- return 64; ++ return maxStack; // CraftBukkit + } + + public boolean a(EntityHuman entityhuman) { diff --git a/nms-patches/InventorySubcontainer.patch b/nms-patches/InventorySubcontainer.patch new file mode 100644 index 0000000000..ddacf613b4 --- /dev/null +++ b/nms-patches/InventorySubcontainer.patch @@ -0,0 +1,59 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/InventorySubcontainer.java 2014-11-27 08:59:46.769421547 +1100 ++++ src/main/java/net/minecraft/server/InventorySubcontainer.java 2014-11-27 08:42:10.088851036 +1100 +@@ -3,6 +3,12 @@ + import com.google.common.collect.Lists; + import java.util.List; + ++// CraftBukkit start ++import java.util.List; ++import org.bukkit.craftbukkit.entity.CraftHumanEntity; ++import org.bukkit.entity.HumanEntity; ++// CraftBukkit end ++ + public class InventorySubcontainer implements IInventory { + + private String a; +@@ -10,8 +16,43 @@ + public ItemStack[] items; + private List d; + private boolean e; ++ ++ // CraftBukkit start - add fields and methods ++ public List transaction = new java.util.ArrayList(); ++ private int maxStack = MAX_STACK; ++ protected org.bukkit.inventory.InventoryHolder bukkitOwner; ++ ++ public ItemStack[] getContents() { ++ return this.items; ++ } ++ ++ public void onOpen(CraftHumanEntity who) { ++ transaction.add(who); ++ } + ++ public void onClose(CraftHumanEntity who) { ++ transaction.remove(who); ++ } ++ ++ public List getViewers() { ++ return transaction; ++ } ++ ++ public void setMaxStackSize(int i) { ++ maxStack = i; ++ } ++ ++ public org.bukkit.inventory.InventoryHolder getOwner() { ++ return bukkitOwner; ++ } ++ + public InventorySubcontainer(String s, boolean flag, int i) { ++ this(s, flag, i, null); ++ } ++ ++ public InventorySubcontainer(String s, boolean flag, int i, org.bukkit.inventory.InventoryHolder owner) { // Added argument ++ this.bukkitOwner = owner; ++ // CraftBukkit end + this.a = s; + this.e = flag; + this.b = i; diff --git a/nms-patches/ItemBoat.patch b/nms-patches/ItemBoat.patch new file mode 100644 index 0000000000..29142514bc --- /dev/null +++ b/nms-patches/ItemBoat.patch @@ -0,0 +1,17 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/ItemBoat.java 2014-11-27 08:59:46.773421530 +1100 ++++ src/main/java/net/minecraft/server/ItemBoat.java 2014-11-27 08:42:10.156850903 +1100 +@@ -53,6 +53,14 @@ + } else { + if (movingobjectposition.type == EnumMovingObjectType.BLOCK) { + BlockPosition blockposition = movingobjectposition.a(); ++ ++ // CraftBukkit start - Boat placement ++ org.bukkit.event.player.PlayerInteractEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callPlayerInteractEvent(entityhuman, org.bukkit.event.block.Action.RIGHT_CLICK_BLOCK, blockposition, movingobjectposition.direction, itemstack); ++ ++ if (event.isCancelled()) { ++ return itemstack; ++ } ++ // CraftBukkit end + + if (world.getType(blockposition).getBlock() == Blocks.SNOW_LAYER) { + blockposition = blockposition.down(); diff --git a/nms-patches/ItemBow.patch b/nms-patches/ItemBow.patch new file mode 100644 index 0000000000..9f8c9f513f --- /dev/null +++ b/nms-patches/ItemBow.patch @@ -0,0 +1,49 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/ItemBow.java 2014-11-27 08:59:46.773421530 +1100 ++++ src/main/java/net/minecraft/server/ItemBow.java 2014-11-27 08:42:10.140850934 +1100 +@@ -1,5 +1,7 @@ + package net.minecraft.server; + ++import org.bukkit.event.entity.EntityCombustEvent; // CraftBukkit ++ + public class ItemBow extends Item { + + public static final String[] a = new String[] { "pulling_0", "pulling_1", "pulling_2"}; +@@ -45,9 +47,28 @@ + } + + if (EnchantmentManager.getEnchantmentLevel(Enchantment.ARROW_FIRE.id, itemstack) > 0) { +- entityarrow.setOnFire(100); ++ // CraftBukkit start - call EntityCombustEvent ++ EntityCombustEvent event = new EntityCombustEvent(entityarrow.getBukkitEntity(), 100); ++ entityarrow.world.getServer().getPluginManager().callEvent(event); ++ ++ if (!event.isCancelled()) { ++ entityarrow.setOnFire(event.getDuration()); ++ } ++ // CraftBukkit end ++ } ++ ++ // CraftBukkit start ++ org.bukkit.event.entity.EntityShootBowEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callEntityShootBowEvent(entityhuman, itemstack, entityarrow, f); ++ if (event.isCancelled()) { ++ event.getProjectile().remove(); ++ return; + } + ++ if (event.getProjectile() == entityarrow.getBukkitEntity()) { ++ world.addEntity(entityarrow); ++ } ++ // CraftBukkit end ++ + itemstack.damage(1, entityhuman); + world.makeSound(entityhuman, "random.bow", 1.0F, 1.0F / (ItemBow.g.nextFloat() * 0.4F + 1.2F) + f * 0.5F); + if (flag) { +@@ -58,7 +79,7 @@ + + entityhuman.b(StatisticList.USE_ITEM_COUNT[Item.getId(this)]); + if (!world.isStatic) { +- world.addEntity(entityarrow); ++ // world.addEntity(entityarrow); // CraftBukkit - moved up + } + } + diff --git a/nms-patches/ItemBucket.patch b/nms-patches/ItemBucket.patch new file mode 100644 index 0000000000..d037c57b4b --- /dev/null +++ b/nms-patches/ItemBucket.patch @@ -0,0 +1,102 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/ItemBucket.java 2014-11-27 08:59:46.777421512 +1100 ++++ src/main/java/net/minecraft/server/ItemBucket.java 2014-11-27 08:42:10.156850903 +1100 +@@ -1,5 +1,12 @@ + package net.minecraft.server; + ++// CraftBukkit start ++import org.bukkit.craftbukkit.event.CraftEventFactory; ++import org.bukkit.craftbukkit.inventory.CraftItemStack; ++import org.bukkit.event.player.PlayerBucketEmptyEvent; ++import org.bukkit.event.player.PlayerBucketFillEvent; ++// CraftBukkit end ++ + public class ItemBucket extends Item { + + private Block a; +@@ -33,19 +40,41 @@ + Material material = iblockdata.getBlock().getMaterial(); + + if (material == Material.WATER && ((Integer) iblockdata.get(BlockFluids.LEVEL)).intValue() == 0) { ++ // CraftBukkit start ++ PlayerBucketFillEvent event = CraftEventFactory.callPlayerBucketFillEvent(entityhuman, blockposition.getX(), blockposition.getY(), blockposition.getZ(), null, itemstack, Items.WATER_BUCKET); ++ ++ if (event.isCancelled()) { ++ return itemstack; ++ } ++ // CraftBukkit end + world.setAir(blockposition); + entityhuman.b(StatisticList.USE_ITEM_COUNT[Item.getId(this)]); +- return this.a(itemstack, entityhuman, Items.WATER_BUCKET); ++ return this.a(itemstack, entityhuman, Items.WATER_BUCKET, event.getItemStack()); // CraftBukkit - added Event stack + } + + if (material == Material.LAVA && ((Integer) iblockdata.get(BlockFluids.LEVEL)).intValue() == 0) { ++ // CraftBukkit start ++ PlayerBucketFillEvent event = CraftEventFactory.callPlayerBucketFillEvent(entityhuman, blockposition.getX(), blockposition.getY(), blockposition.getZ(), null, itemstack, Items.LAVA_BUCKET); ++ ++ if (event.isCancelled()) { ++ return itemstack; ++ } ++ // CraftBukkit end + world.setAir(blockposition); + entityhuman.b(StatisticList.USE_ITEM_COUNT[Item.getId(this)]); +- return this.a(itemstack, entityhuman, Items.LAVA_BUCKET); ++ return this.a(itemstack, entityhuman, Items.LAVA_BUCKET, event.getItemStack()); // CraftBukkit - added Event stack + } + } else { + if (this.a == Blocks.AIR) { +- return new ItemStack(Items.BUCKET); ++ // CraftBukkit start ++ PlayerBucketEmptyEvent event = CraftEventFactory.callPlayerBucketEmptyEvent(entityhuman, blockposition.getX(), blockposition.getY(), blockposition.getZ(), movingobjectposition.direction, itemstack); ++ ++ if (event.isCancelled()) { ++ return itemstack; ++ } ++ ++ return CraftItemStack.asNMSCopy(event.getItemStack()); ++ // CraftBukkit end + } + + BlockPosition blockposition1 = blockposition.shift(movingobjectposition.direction); +@@ -53,10 +82,18 @@ + if (!entityhuman.a(blockposition1, movingobjectposition.direction, itemstack)) { + return itemstack; + } ++ ++ // CraftBukkit start ++ PlayerBucketEmptyEvent event = CraftEventFactory.callPlayerBucketEmptyEvent(entityhuman, blockposition.getX(), blockposition.getY(), blockposition.getZ(), movingobjectposition.direction, itemstack); ++ ++ if (event.isCancelled()) { ++ return itemstack; ++ } ++ // CraftBukkit end + + if (this.a(world, blockposition1) && !entityhuman.abilities.canInstantlyBuild) { + entityhuman.b(StatisticList.USE_ITEM_COUNT[Item.getId(this)]); +- return new ItemStack(Items.BUCKET); ++ return CraftItemStack.asNMSCopy(event.getItemStack()); // CraftBukkit + } + } + } +@@ -64,15 +101,16 @@ + return itemstack; + } + } +- +- private ItemStack a(ItemStack itemstack, EntityHuman entityhuman, Item item) { ++ ++ // CraftBukkit - added ob.ItemStack result - TODO: Is this... the right way to handle this? ++ private ItemStack a(ItemStack itemstack, EntityHuman entityhuman, Item item, org.bukkit.inventory.ItemStack result) { + if (entityhuman.abilities.canInstantlyBuild) { + return itemstack; + } else if (--itemstack.count <= 0) { +- return new ItemStack(item); ++ return CraftItemStack.asNMSCopy(result); // CraftBukkit + } else { +- if (!entityhuman.inventory.pickup(new ItemStack(item))) { +- entityhuman.drop(new ItemStack(item, 1, 0), false); ++ if (!entityhuman.inventory.pickup(CraftItemStack.asNMSCopy(result))) { ++ entityhuman.drop(CraftItemStack.asNMSCopy(result), false); + } + + return itemstack; diff --git a/nms-patches/ItemDye.patch b/nms-patches/ItemDye.patch new file mode 100644 index 0000000000..8586e78611 --- /dev/null +++ b/nms-patches/ItemDye.patch @@ -0,0 +1,28 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/ItemDye.java 2014-11-27 08:59:46.777421512 +1100 ++++ src/main/java/net/minecraft/server/ItemDye.java 2014-11-27 08:42:10.160850895 +1100 +@@ -1,5 +1,7 @@ + package net.minecraft.server; + ++import org.bukkit.event.entity.SheepDyeWoolEvent; // CraftBukkit ++ + public class ItemDye extends Item { + + public static final int[] a = new int[] { 1973019, 11743532, 3887386, 5320730, 2437522, 8073150, 2651799, 11250603, 4408131, 14188952, 4312372, 14602026, 6719955, 12801229, 15435844, 15790320}; +@@ -89,6 +91,17 @@ + EnumColor enumcolor = EnumColor.fromInvColorIndex(itemstack.getData()); + + if (!entitysheep.isSheared() && entitysheep.getColor() != enumcolor) { ++ // CraftBukkit start ++ byte bColor = (byte) enumcolor.getColorIndex(); ++ SheepDyeWoolEvent event = new SheepDyeWoolEvent((org.bukkit.entity.Sheep) entitysheep.getBukkitEntity(), org.bukkit.DyeColor.getByData(bColor)); ++ entitysheep.world.getServer().getPluginManager().callEvent(event); ++ ++ if (event.isCancelled()) { ++ return false; ++ } ++ ++ enumcolor = EnumColor.fromColorIndex((byte) event.getColor().getWoolData()); ++ // CraftBukkit end + entitysheep.setColor(enumcolor); + --itemstack.count; + } diff --git a/nms-patches/ItemFireball.patch b/nms-patches/ItemFireball.patch new file mode 100644 index 0000000000..6a754928cd --- /dev/null +++ b/nms-patches/ItemFireball.patch @@ -0,0 +1,19 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/ItemFireball.java 2014-11-27 08:59:46.777421512 +1100 ++++ src/main/java/net/minecraft/server/ItemFireball.java 2014-11-27 08:42:10.124850965 +1100 +@@ -15,7 +15,15 @@ + return false; + } else { + if (world.getType(blockposition).getBlock().getMaterial() == Material.AIR) { +- world.makeSound((double) blockposition.getX() + 0.5D, (double) blockposition.getY() + 0.5D, (double) blockposition.getZ() + 0.5D, "item.fireCharge.use", 1.0F, (ItemFireball.g.nextFloat() - ItemFireball.g.nextFloat()) * 0.2F + 1.0F); ++ // CraftBukkit start - fire BlockIgniteEvent ++ if (org.bukkit.craftbukkit.event.CraftEventFactory.callBlockIgniteEvent(world, blockposition.getX(), blockposition.getY(), blockposition.getZ(), org.bukkit.event.block.BlockIgniteEvent.IgniteCause.FIREBALL, entityhuman).isCancelled()) { ++ if (!entityhuman.abilities.canInstantlyBuild) { ++ --itemstack.count; ++ } ++ return false; ++ } ++ // CraftBukkit end ++ world.makeSound((double) blockposition.getX() + 0.5D, (double) blockposition.getY() + 0.5D, (double) blockposition.getZ() + 0.5D, "item.fireCharge.use", 1.0F, (g.nextFloat() - g.nextFloat()) * 0.2F + 1.0F); + world.setTypeUpdate(blockposition, Blocks.FIRE.getBlockData()); + } + diff --git a/nms-patches/ItemFishingRod.patch b/nms-patches/ItemFishingRod.patch new file mode 100644 index 0000000000..564c24b47a --- /dev/null +++ b/nms-patches/ItemFishingRod.patch @@ -0,0 +1,31 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/ItemFishingRod.java 2014-11-27 08:59:46.781421494 +1100 ++++ src/main/java/net/minecraft/server/ItemFishingRod.java 2014-11-27 08:42:10.168850880 +1100 +@@ -1,5 +1,7 @@ + package net.minecraft.server; + ++import org.bukkit.event.player.PlayerFishEvent; // CraftBukkit ++ + public class ItemFishingRod extends Item { + + public ItemFishingRod() { +@@ -15,9 +17,18 @@ + itemstack.damage(i, entityhuman); + entityhuman.bv(); + } else { +- world.makeSound(entityhuman, "random.bow", 0.5F, 0.4F / (ItemFishingRod.g.nextFloat() * 0.4F + 0.8F)); ++ // CraftBukkit start ++ EntityFishingHook hook = new EntityFishingHook(world, entityhuman); ++ PlayerFishEvent playerFishEvent = new PlayerFishEvent((org.bukkit.entity.Player) entityhuman.getBukkitEntity(), null, (org.bukkit.entity.Fish) hook.getBukkitEntity(), PlayerFishEvent.State.FISHING); ++ world.getServer().getPluginManager().callEvent(playerFishEvent); ++ ++ if (playerFishEvent.isCancelled()) { ++ return itemstack; ++ } ++ // CraftBukkit end ++ world.makeSound(entityhuman, "random.bow", 0.5F, 0.4F / (g.nextFloat() * 0.4F + 0.8F)); + if (!world.isStatic) { +- world.addEntity(new EntityFishingHook(world, entityhuman)); ++ world.addEntity(hook); // CraftBukkit - moved creation up + } + + entityhuman.bv(); diff --git a/nms-patches/ItemFlintAndSteel.patch b/nms-patches/ItemFlintAndSteel.patch new file mode 100644 index 0000000000..a27cc0b6ac --- /dev/null +++ b/nms-patches/ItemFlintAndSteel.patch @@ -0,0 +1,47 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/ItemFlintAndSteel.java 2014-11-27 08:59:46.781421494 +1100 ++++ src/main/java/net/minecraft/server/ItemFlintAndSteel.java 2014-11-27 08:42:10.152850911 +1100 +@@ -1,5 +1,10 @@ + package net.minecraft.server; + ++// CraftBukkit start ++import org.bukkit.craftbukkit.block.CraftBlockState; ++import org.bukkit.craftbukkit.event.CraftEventFactory; ++// CraftBukkit end ++ + public class ItemFlintAndSteel extends Item { + + public ItemFlintAndSteel() { +@@ -9,13 +14,32 @@ + } + + public boolean interactWith(ItemStack itemstack, EntityHuman entityhuman, World world, BlockPosition blockposition, EnumDirection enumdirection, float f, float f1, float f2) { ++ BlockPosition clicked = blockposition; // CraftBukkit + blockposition = blockposition.shift(enumdirection); + if (!entityhuman.a(blockposition, enumdirection, itemstack)) { + return false; + } else { + if (world.getType(blockposition).getBlock().getMaterial() == Material.AIR) { +- world.makeSound((double) blockposition.getX() + 0.5D, (double) blockposition.getY() + 0.5D, (double) blockposition.getZ() + 0.5D, "fire.ignite", 1.0F, ItemFlintAndSteel.g.nextFloat() * 0.4F + 0.8F); ++ // CraftBukkit start - Store the clicked block ++ if (CraftEventFactory.callBlockIgniteEvent(world, blockposition.getX(), blockposition.getY(), blockposition.getZ(), org.bukkit.event.block.BlockIgniteEvent.IgniteCause.FLINT_AND_STEEL, entityhuman).isCancelled()) { ++ itemstack.damage(1, entityhuman); ++ return false; ++ } ++ ++ CraftBlockState blockState = CraftBlockState.getBlockState(world, blockposition.getX(), blockposition.getY(), blockposition.getZ()); ++ // CraftBukkit end ++ ++ world.makeSound((double) blockposition.getX() + 0.5D, (double) blockposition.getY() + 0.5D, (double) blockposition.getZ() + 0.5D, "fire.ignite", 1.0F, g.nextFloat() * 0.4F + 0.8F); + world.setTypeUpdate(blockposition, Blocks.FIRE.getBlockData()); ++ ++ // CraftBukkit start ++ org.bukkit.event.block.BlockPlaceEvent placeEvent = CraftEventFactory.callBlockPlaceEvent(world, entityhuman, blockState, clicked.getX(), clicked.getY(), clicked.getZ()); ++ ++ if (placeEvent.isCancelled() || !placeEvent.canBuild()) { ++ placeEvent.getBlockPlaced().setTypeIdAndData(0, (byte) 0, false); ++ return false; ++ } ++ // CraftBukkit end + } + + itemstack.damage(1, entityhuman); diff --git a/nms-patches/ItemHanging.patch b/nms-patches/ItemHanging.patch new file mode 100644 index 0000000000..0a312a806a --- /dev/null +++ b/nms-patches/ItemHanging.patch @@ -0,0 +1,41 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/ItemHanging.java 2014-11-27 08:59:46.785421476 +1100 ++++ src/main/java/net/minecraft/server/ItemHanging.java 2014-11-27 08:42:10.144850927 +1100 +@@ -1,5 +1,11 @@ + package net.minecraft.server; + ++// CraftBukkit start ++import org.bukkit.entity.Player; ++import org.bukkit.event.hanging.HangingPlaceEvent; ++import org.bukkit.event.painting.PaintingPlaceEvent; ++// CraftBukkit end ++ + public class ItemHanging extends Item { + + private final Class a; +@@ -24,6 +30,26 @@ + + if (entityhanging != null && entityhanging.survives()) { + if (!world.isStatic) { ++ // CraftBukkit start - fire HangingPlaceEvent ++ Player who = (entityhuman == null) ? null : (Player) entityhuman.getBukkitEntity(); ++ org.bukkit.block.Block blockClicked = world.getWorld().getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ()); ++ org.bukkit.block.BlockFace blockFace = org.bukkit.craftbukkit.block.CraftBlock.notchToBlockFace(enumdirection); ++ ++ HangingPlaceEvent event = new HangingPlaceEvent((org.bukkit.entity.Hanging) entityhanging.getBukkitEntity(), who, blockClicked, blockFace); ++ world.getServer().getPluginManager().callEvent(event); ++ ++ PaintingPlaceEvent paintingEvent = null; ++ if (entityhanging instanceof EntityPainting) { ++ // Fire old painting event until it can be removed ++ paintingEvent = new PaintingPlaceEvent((org.bukkit.entity.Painting) entityhanging.getBukkitEntity(), who, blockClicked, blockFace); ++ paintingEvent.setCancelled(event.isCancelled()); ++ world.getServer().getPluginManager().callEvent(paintingEvent); ++ } ++ ++ if (event.isCancelled() || (paintingEvent != null && paintingEvent.isCancelled())) { ++ return false; ++ } ++ // CraftBukkit end + world.addEntity(entityhanging); + } + diff --git a/nms-patches/ItemLeash.patch b/nms-patches/ItemLeash.patch new file mode 100644 index 0000000000..2836ac93b4 --- /dev/null +++ b/nms-patches/ItemLeash.patch @@ -0,0 +1,35 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/ItemLeash.java 2014-11-27 08:59:46.785421476 +1100 ++++ src/main/java/net/minecraft/server/ItemLeash.java 2014-11-27 08:42:10.084851043 +1100 +@@ -3,6 +3,8 @@ + import java.util.Iterator; + import java.util.List; + ++import org.bukkit.event.hanging.HangingPlaceEvent; // CraftBukkit ++ + public class ItemLeash extends Item { + + public ItemLeash() { +@@ -40,7 +42,23 @@ + if (entityinsentient.cb() && entityinsentient.getLeashHolder() == entityhuman) { + if (entityleash == null) { + entityleash = EntityLeash.a(world, blockposition); ++ ++ // CraftBukkit start - fire HangingPlaceEvent ++ HangingPlaceEvent event = new HangingPlaceEvent((org.bukkit.entity.Hanging) entityleash.getBukkitEntity(), entityhuman != null ? (org.bukkit.entity.Player) entityhuman.getBukkitEntity() : null, world.getWorld().getBlockAt(i, j, k), org.bukkit.block.BlockFace.SELF); ++ world.getServer().getPluginManager().callEvent(event); ++ ++ if (event.isCancelled()) { ++ entityleash.die(); ++ return false; ++ } ++ // CraftBukkit end ++ } ++ ++ // CraftBukkit start ++ if (org.bukkit.craftbukkit.event.CraftEventFactory.callPlayerLeashEntityEvent(entityinsentient, entityleash, entityhuman).isCancelled()) { ++ continue; + } ++ // CraftBukkit end + + entityinsentient.setLeashHolder(entityleash, true); + flag = true; diff --git a/nms-patches/ItemMapEmpty.patch b/nms-patches/ItemMapEmpty.patch new file mode 100644 index 0000000000..9159a10675 --- /dev/null +++ b/nms-patches/ItemMapEmpty.patch @@ -0,0 +1,24 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/ItemMapEmpty.java 2014-11-27 08:59:46.785421476 +1100 ++++ src/main/java/net/minecraft/server/ItemMapEmpty.java 2014-11-27 08:42:10.164850887 +1100 +@@ -7,15 +7,19 @@ + } + + public ItemStack a(ItemStack itemstack, World world, EntityHuman entityhuman) { +- ItemStack itemstack1 = new ItemStack(Items.FILLED_MAP, 1, world.b("map")); ++ World worldMain = world.getServer().getServer().worlds.get(0); // CraftBukkit - store reference to primary world ++ ItemStack itemstack1 = new ItemStack(Items.FILLED_MAP, 1, worldMain.b("map")); // CraftBukkit - use primary world for maps + String s = "map_" + itemstack1.getData(); + WorldMap worldmap = new WorldMap(s); + + world.a(s, (PersistentBase) worldmap); + worldmap.scale = 0; + worldmap.a(entityhuman.locX, entityhuman.locZ, worldmap.scale); +- worldmap.map = (byte) world.worldProvider.getDimension(); ++ worldmap.map = (byte) ((WorldServer) world).dimension; // CraftBukkit - use bukkit dimension + worldmap.c(); ++ ++ org.bukkit.craftbukkit.event.CraftEventFactory.callEvent(new org.bukkit.event.server.MapInitializeEvent(worldmap.mapView)); // CraftBukkit ++ + --itemstack.count; + if (itemstack.count <= 0) { + return itemstack1; diff --git a/nms-patches/ItemMinecart.patch b/nms-patches/ItemMinecart.patch new file mode 100644 index 0000000000..5cff838fdd --- /dev/null +++ b/nms-patches/ItemMinecart.patch @@ -0,0 +1,16 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/ItemMinecart.java 2014-11-27 08:59:46.789421459 +1100 ++++ src/main/java/net/minecraft/server/ItemMinecart.java 2014-11-27 08:42:10.168850880 +1100 +@@ -23,6 +23,13 @@ + if (enumtrackposition.c()) { + d0 = 0.5D; + } ++ // CraftBukkit start - Minecarts ++ org.bukkit.event.player.PlayerInteractEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callPlayerInteractEvent(entityhuman, org.bukkit.event.block.Action.RIGHT_CLICK_BLOCK, blockposition, enumdirection, itemstack); ++ ++ if (event.isCancelled()) { ++ return false; ++ } ++ // CraftBukkit end + + EntityMinecartAbstract entityminecartabstract = EntityMinecartAbstract.a(world, (double) blockposition.getX() + 0.5D, (double) blockposition.getY() + 0.0625D + d0, (double) blockposition.getZ() + 0.5D, this.b); + diff --git a/nms-patches/ItemMonsterEgg.patch b/nms-patches/ItemMonsterEgg.patch new file mode 100644 index 0000000000..3a5fbee62e --- /dev/null +++ b/nms-patches/ItemMonsterEgg.patch @@ -0,0 +1,25 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/ItemMonsterEgg.java 2014-11-27 08:59:46.789421459 +1100 ++++ src/main/java/net/minecraft/server/ItemMonsterEgg.java 2014-11-27 08:42:10.172850872 +1100 +@@ -19,7 +19,8 @@ + } + + public boolean interactWith(ItemStack itemstack, EntityHuman entityhuman, World world, BlockPosition blockposition, EnumDirection enumdirection, float f, float f1, float f2) { +- if (world.isStatic) { ++ // CraftBukkit - check ItemStack data ++ if (world.isStatic || itemstack.getData() == 48 || itemstack.getData() == 49 || itemstack.getData() == 63 || itemstack.getData() == 64) { + return true; + } else if (!entityhuman.a(blockposition.shift(enumdirection), enumdirection, itemstack)) { + return false; +@@ -109,6 +110,12 @@ + } + + public static Entity a(World world, int i, double d0, double d1, double d2) { ++ // CraftBukkit start - delegate to spawnCreature ++ return spawnCreature(world, i, d0, d1, d2, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.SPAWNER_EGG); ++ } ++ ++ public static Entity spawnCreature(World world, int i, double d0, double d1, double d2, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason spawnReason) { ++ // CraftBukkit end + if (!EntityTypes.eggInfo.containsKey(Integer.valueOf(i))) { + return null; + } else { diff --git a/nms-patches/ItemStack.patch b/nms-patches/ItemStack.patch new file mode 100644 index 0000000000..da50d5cfdb --- /dev/null +++ b/nms-patches/ItemStack.patch @@ -0,0 +1,219 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/ItemStack.java 2014-11-27 08:59:46.789421459 +1100 ++++ src/main/java/net/minecraft/server/ItemStack.java 2014-11-27 08:42:10.156850903 +1100 +@@ -5,6 +5,18 @@ + import java.text.DecimalFormat; + import java.util.Random; + ++// CraftBukkit start ++import java.util.List; ++ ++import org.bukkit.Location; ++import org.bukkit.TreeType; ++import org.bukkit.block.BlockState; ++import org.bukkit.craftbukkit.block.CraftBlockState; ++import org.bukkit.craftbukkit.util.CraftMagicNumbers; ++import org.bukkit.entity.Player; ++import org.bukkit.event.world.StructureGrowEvent; ++// CraftBukkit end ++ + public final class ItemStack { + + public static final DecimalFormat a = new DecimalFormat("#.###"); +@@ -46,11 +58,13 @@ + this.k = false; + this.item = item; + this.count = i; +- this.damage = j; +- if (this.damage < 0) { +- this.damage = 0; +- } +- ++ // CraftBukkit start - Pass to setData to do filtering ++ this.setData(j); ++ //this.damage = j; ++ //if (this.damage < 0) { ++ // this.damage = 0; ++ //} ++ // CraftBukkit end + } + + public static ItemStack createStack(NBTTagCompound nbttagcompound) { +@@ -83,11 +97,96 @@ + } + + public boolean placeItem(EntityHuman entityhuman, World world, BlockPosition blockposition, EnumDirection enumdirection, float f, float f1, float f2) { ++ // CraftBukkit start - handle all block place event logic here ++ int data = this.getData(); ++ int count = this.count; ++ ++ if (!(this.getItem() instanceof ItemBucket)) { // if not bucket ++ world.captureBlockStates = true; ++ // special case bonemeal ++ if (this.getItem() instanceof ItemDye && this.getData() == 15) { ++ Block block = world.getType(blockposition).getBlock(); ++ if (block == Blocks.SAPLING || block instanceof BlockMushroom) { ++ world.captureTreeGeneration = true; ++ } ++ } ++ } + boolean flag = this.getItem().interactWith(this, entityhuman, world, blockposition, enumdirection, f, f1, f2); ++ int newData = this.getData(); ++ int newCount = this.count; ++ this.count = count; ++ this.setData(data); ++ world.captureBlockStates = false; ++ if (flag && world.captureTreeGeneration && world.capturedBlockStates.size() > 0) { ++ world.captureTreeGeneration = false; ++ Location location = new Location(world.getWorld(), blockposition.getX(), blockposition.getY(), blockposition.getZ()); ++ TreeType treeType = BlockSapling.treeType; ++ BlockSapling.treeType = null; ++ List blocks = (List) world.capturedBlockStates.clone(); ++ world.capturedBlockStates.clear(); ++ StructureGrowEvent event = null; ++ if (treeType != null) { ++ event = new StructureGrowEvent(location, treeType, false, (Player) entityhuman.getBukkitEntity(), blocks); ++ org.bukkit.Bukkit.getPluginManager().callEvent(event); ++ } ++ if (event == null || !event.isCancelled()) { ++ // Change the stack to its new contents if it hasn't been tampered with. ++ if (this.count == count && this.getData() == data) { ++ this.setData(newData); ++ this.count = newCount; ++ } ++ for (BlockState blockstate : blocks) { ++ blockstate.update(true); ++ } ++ } ++ ++ return flag; ++ } ++ world.captureTreeGeneration = false; + + if (flag) { +- entityhuman.b(StatisticList.USE_ITEM_COUNT[Item.getId(this.item)]); ++ org.bukkit.event.block.BlockPlaceEvent placeEvent = null; ++ List blocks = (List) world.capturedBlockStates.clone(); ++ world.capturedBlockStates.clear(); ++ if (blocks.size() > 1) { ++ placeEvent = org.bukkit.craftbukkit.event.CraftEventFactory.callBlockMultiPlaceEvent(world, entityhuman, blocks, blockposition.getX(), blockposition.getY(), blockposition.getZ()); ++ } else if (blocks.size() == 1) { ++ placeEvent = org.bukkit.craftbukkit.event.CraftEventFactory.callBlockPlaceEvent(world, entityhuman, blocks.get(0), blockposition.getX(), blockposition.getY(), blockposition.getZ()); ++ } ++ ++ if (placeEvent != null && (placeEvent.isCancelled() || !placeEvent.canBuild())) { ++ flag = false; // cancel placement ++ // revert back all captured blocks ++ for (BlockState blockstate : blocks) { ++ blockstate.update(true, false); ++ } ++ } else { ++ // Change the stack to its new contents if it hasn't been tampered with. ++ if (this.count == count && this.getData() == data) { ++ this.setData(newData); ++ this.count = newCount; ++ } ++ for (BlockState blockstate : blocks) { ++ int x = blockstate.getX(); ++ int y = blockstate.getY(); ++ int z = blockstate.getZ(); ++ int updateFlag = ((CraftBlockState) blockstate).getFlag(); ++ org.bukkit.Material mat = blockstate.getType(); ++ Block oldBlock = CraftMagicNumbers.getBlock(mat); ++ BlockPosition newblockposition = new BlockPosition(x, y, z); ++ IBlockData block = world.getType(newblockposition); ++ ++ if (!(block instanceof BlockContainer)) { // Containers get placed automatically ++ block.getBlock().onPlace(world, newblockposition, block); ++ } ++ ++ world.notifyAndUpdatePhysics(newblockposition, null, oldBlock, block.getBlock(), updateFlag); // send null chunk as chunk.k() returns false by this point ++ } ++ entityhuman.b(StatisticList.USE_ITEM_COUNT[Item.getId(this.item)]); ++ } + } ++ world.capturedBlockStates.clear(); ++ // CraftBukkit end + + return flag; + } +@@ -111,7 +210,7 @@ + nbttagcompound.setByte("Count", (byte) this.count); + nbttagcompound.setShort("Damage", (short) this.damage); + if (this.tag != null) { +- nbttagcompound.set("tag", this.tag); ++ nbttagcompound.set("tag", this.tag.clone()); // CraftBukkit - make defensive copy, data is going to another thread + } + + return nbttagcompound; +@@ -125,13 +224,18 @@ + } + + this.count = nbttagcompound.getByte("Count"); ++ /* CraftBukkit start - Route through setData for filtering + this.damage = nbttagcompound.getShort("Damage"); + if (this.damage < 0) { + this.damage = 0; + } ++ */ ++ this.setData(nbttagcompound.getShort("Damage")); ++ // CraftBukkit end + + if (nbttagcompound.hasKeyOfType("tag", 10)) { +- this.tag = nbttagcompound.getCompound("tag"); ++ // CraftBukkit - make defensive copy as this data may be coming from the save thread ++ this.tag = (NBTTagCompound) nbttagcompound.getCompound("tag").clone(); + if (this.item != null) { + this.item.a(this.tag); + } +@@ -168,8 +272,29 @@ + } + + public void setData(int i) { ++ // CraftBukkit start - Filter out data for items that shouldn't have it ++ // The crafting system uses this value for a special purpose so we have to allow it ++ if (i == 32767) { ++ this.damage = i; ++ return; ++ } ++ ++ // Is this a block? ++ if (CraftMagicNumbers.getBlock(CraftMagicNumbers.getId(this.getItem())) != Blocks.AIR) { ++ // If vanilla doesn't use data on it don't allow any ++ if (!(this.usesData() || this.getItem().usesDurability())) { ++ i = 0; ++ } ++ } ++ ++ // Filter invalid plant data ++ if (CraftMagicNumbers.getBlock(CraftMagicNumbers.getId(this.getItem())) == Blocks.DOUBLE_PLANT && (i > 5 || i < 0)) { ++ i = 0; ++ } ++ // CraftBukkit end ++ + this.damage = i; +- if (this.damage < 0) { ++ if (this.damage < -1) { // CraftBukkit + this.damage = 0; + } + +@@ -222,6 +347,12 @@ + if (this.count < 0) { + this.count = 0; + } ++ ++ // CraftBukkit start - Check for item breaking ++ if (this.count == 0 && entityliving instanceof EntityHuman) { ++ org.bukkit.craftbukkit.event.CraftEventFactory.callPlayerItemBreakEvent((EntityHuman) entityliving, this); ++ } ++ // CraftBukkit end + + this.damage = 0; + } +@@ -489,6 +620,7 @@ + + public void setItem(Item item) { + this.item = item; ++ this.setData(this.getData()); // CraftBukkit - Set data again to ensure it is filtered properly + } + + public IChatBaseComponent C() { diff --git a/nms-patches/ItemWaterLily.patch b/nms-patches/ItemWaterLily.patch new file mode 100644 index 0000000000..2158f6428b --- /dev/null +++ b/nms-patches/ItemWaterLily.patch @@ -0,0 +1,18 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/ItemWaterLily.java 2014-11-27 08:59:46.793421441 +1100 ++++ src/main/java/net/minecraft/server/ItemWaterLily.java 2014-11-27 08:42:10.152850911 +1100 +@@ -27,7 +27,15 @@ + IBlockData iblockdata = world.getType(blockposition); + + if (iblockdata.getBlock().getMaterial() == Material.WATER && ((Integer) iblockdata.get(BlockFluids.LEVEL)).intValue() == 0 && world.isEmpty(blockposition1)) { ++ // CraftBukkit start - special case for handling block placement with water lilies ++ org.bukkit.block.BlockState blockstate = org.bukkit.craftbukkit.block.CraftBlockState.getBlockState(world, blockposition1.getX(), blockposition1.getY(), blockposition1.getZ()); + world.setTypeUpdate(blockposition1, Blocks.WATERLILY.getBlockData()); ++ org.bukkit.event.block.BlockPlaceEvent placeEvent = org.bukkit.craftbukkit.event.CraftEventFactory.callBlockPlaceEvent(world, entityhuman, blockstate, blockposition.getX(), blockposition.getY(), blockposition.getZ()); ++ if (placeEvent != null && (placeEvent.isCancelled() || !placeEvent.canBuild())) { ++ blockstate.update(true, false); ++ return itemstack; ++ } ++ // CraftBukkit end + if (!entityhuman.abilities.canInstantlyBuild) { + --itemstack.count; + } diff --git a/nms-patches/ItemWorldMap.patch b/nms-patches/ItemWorldMap.patch new file mode 100644 index 0000000000..f85596fdc0 --- /dev/null +++ b/nms-patches/ItemWorldMap.patch @@ -0,0 +1,75 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/ItemWorldMap.java 2014-11-27 08:59:46.793421441 +1100 ++++ src/main/java/net/minecraft/server/ItemWorldMap.java 2014-11-27 08:42:10.144850927 +1100 +@@ -4,6 +4,11 @@ + import com.google.common.collect.Iterables; + import com.google.common.collect.Multisets; + ++// CraftBukkit start ++import org.bukkit.Bukkit; ++import org.bukkit.event.server.MapInitializeEvent; ++// CraftBukkit end ++ + public class ItemWorldMap extends ItemWorldMapBase { + + protected ItemWorldMap() { +@@ -11,25 +16,32 @@ + } + + public WorldMap getSavedMap(ItemStack itemstack, World world) { ++ World worldMain = world.getServer().getServer().worlds.get(0); // CraftBukkit - store reference to primary world + String s = "map_" + itemstack.getData(); +- WorldMap worldmap = (WorldMap) world.a(WorldMap.class, s); ++ WorldMap worldmap = (WorldMap) worldMain.a(WorldMap.class, s); // CraftBukkit - use primary world for maps + + if (worldmap == null && !world.isStatic) { +- itemstack.setData(world.b("map")); ++ itemstack.setData(worldMain.b("map")); // CraftBukkit - use primary world for maps + s = "map_" + itemstack.getData(); + worldmap = new WorldMap(s); + worldmap.scale = 3; + worldmap.a((double) world.getWorldData().c(), (double) world.getWorldData().e(), worldmap.scale); +- worldmap.map = (byte) world.worldProvider.getDimension(); ++ worldmap.map = (byte) ((WorldServer) world).dimension; // CraftBukkit - fixes Bukkit multiworld maps + worldmap.c(); +- world.a(s, (PersistentBase) worldmap); ++ worldMain.a(s, (PersistentBase) worldmap); // CraftBukkit - use primary world for maps ++ ++ // CraftBukkit start ++ MapInitializeEvent event = new MapInitializeEvent(worldmap.mapView); ++ Bukkit.getServer().getPluginManager().callEvent(event); ++ // CraftBukkit end + } + + return worldmap; + } + + public void a(World world, Entity entity, WorldMap worldmap) { +- if (world.worldProvider.getDimension() == worldmap.map && entity instanceof EntityHuman) { ++ // CraftBukkit - world.worldProvider -> ((WorldServer) world) ++ if (((WorldServer) world).dimension == worldmap.map && entity instanceof EntityHuman) { + int i = 1 << worldmap.scale; + int j = worldmap.centerX; + int k = worldmap.centerZ; +@@ -179,6 +191,8 @@ + if (itemstack.hasTag() && itemstack.getTag().getBoolean("map_is_scaling")) { + WorldMap worldmap = Items.FILLED_MAP.getSavedMap(itemstack, world); + ++ world = world.getServer().getServer().worlds.get(0); // CraftBukkit - use primary world for maps ++ + itemstack.setData(world.b("map")); + WorldMap worldmap1 = new WorldMap("map_" + itemstack.getData()); + +@@ -190,7 +204,12 @@ + worldmap1.a((double) worldmap.centerX, (double) worldmap.centerZ, worldmap1.scale); + worldmap1.map = worldmap.map; + worldmap1.c(); +- world.a("map_" + itemstack.getData(), (PersistentBase) worldmap1); ++ world.a("map_" + itemstack.getData(), (PersistentBase) worldmap1); ++ ++ // CraftBukkit start ++ MapInitializeEvent event = new MapInitializeEvent(worldmap1.mapView); ++ Bukkit.getServer().getPluginManager().callEvent(event); ++ // CraftBukkit end + } + + } diff --git a/nms-patches/JsonList.patch b/nms-patches/JsonList.patch new file mode 100644 index 0000000000..0dcf03529a --- /dev/null +++ b/nms-patches/JsonList.patch @@ -0,0 +1,33 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/JsonList.java 2014-11-27 08:59:46.797421424 +1100 ++++ src/main/java/net/minecraft/server/JsonList.java 2014-11-27 08:42:10.168850880 +1100 +@@ -79,6 +79,12 @@ + public String[] getEntries() { + return (String[]) this.d.keySet().toArray(new String[this.d.size()]); + } ++ ++ // CraftBukkit start ++ public Collection getValues() { ++ return this.d.values(); ++ } ++ // CraftBukkit end + + public boolean isEmpty() { + return this.d.size() < 1; +@@ -122,7 +128,7 @@ + return this.d; + } + +- public void save() { ++ public void save() throws IOException { // CraftBukkit - Added throws + Collection collection = this.d.values(); + String s = this.b.toJson(collection); + BufferedWriter bufferedwriter = null; +@@ -136,7 +142,7 @@ + + } + +- public void load() { ++ public void load() throws IOException { // CraftBukkit - Added throws + Collection collection = null; + BufferedReader bufferedreader = null; + diff --git a/nms-patches/LoginListener.patch b/nms-patches/LoginListener.patch new file mode 100644 index 0000000000..b80cdad040 --- /dev/null +++ b/nms-patches/LoginListener.patch @@ -0,0 +1,35 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/LoginListener.java 2014-11-27 08:59:46.797421424 +1100 ++++ src/main/java/net/minecraft/server/LoginListener.java 2014-11-27 08:42:10.172850872 +1100 +@@ -26,6 +26,7 @@ + private GameProfile i; + private String j; + private SecretKey loginKey; ++ public String hostname = ""; // CraftBukkit - add field + + public LoginListener(MinecraftServer minecraftserver, NetworkManager networkmanager) { + this.g = EnumProtocolState.HELLO; +@@ -64,10 +65,12 @@ + this.i = this.a(this.i); + } + +- String s = this.server.getPlayerList().attemptLogin(this.networkManager.getSocketAddress(), this.i); ++ // CraftBukkit start - fire PlayerLoginEvent ++ EntityPlayer s = this.server.getPlayerList().attemptLogin(this, this.i, hostname); + +- if (s != null) { +- this.disconnect(s); ++ if (s == null) { ++ // this.disconnect(s); ++ // CraftBukkit end + } else { + this.g = EnumProtocolState.ACCEPTED; + if (this.server.aI() >= 0 && !this.networkManager.c()) { +@@ -75,7 +78,7 @@ + } + + this.networkManager.handle(new PacketLoginOutSuccess(this.i)); +- this.server.getPlayerList().a(this.networkManager, this.server.getPlayerList().processLogin(this.i)); ++ this.server.getPlayerList().a(this.networkManager, this.server.getPlayerList().processLogin(this.i, s)); // CraftBukkit - add player reference + } + + } diff --git a/nms-patches/MethodProfiler.patch b/nms-patches/MethodProfiler.patch new file mode 100644 index 0000000000..624249838e --- /dev/null +++ b/nms-patches/MethodProfiler.patch @@ -0,0 +1,135 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/MethodProfiler.java 2014-11-27 08:59:46.797421424 +1100 ++++ src/main/java/net/minecraft/server/MethodProfiler.java 2014-11-27 08:42:10.132850949 +1100 +@@ -10,129 +10,29 @@ + import org.apache.logging.log4j.LogManager; + import org.apache.logging.log4j.Logger; + ++// CraftBukkit start - Strip down to empty methods, performance cost + public class MethodProfiler { +- +- private static final Logger b = LogManager.getLogger(); +- private final List c = Lists.newArrayList(); +- private final List d = Lists.newArrayList(); + public boolean a; +- private String e = ""; +- private final Map f = Maps.newHashMap(); + + public MethodProfiler() {} + + public void a() { +- this.f.clear(); +- this.e = ""; +- this.c.clear(); + } + + public void a(String s) { +- if (this.a) { +- if (this.e.length() > 0) { +- this.e = this.e + "."; +- } +- +- this.e = this.e + s; +- this.c.add(this.e); +- this.d.add(Long.valueOf(System.nanoTime())); +- } + } + + public void b() { +- if (this.a) { +- long i = System.nanoTime(); +- long j = ((Long) this.d.remove(this.d.size() - 1)).longValue(); +- +- this.c.remove(this.c.size() - 1); +- long k = i - j; +- +- if (this.f.containsKey(this.e)) { +- this.f.put(this.e, Long.valueOf(((Long) this.f.get(this.e)).longValue() + k)); +- } else { +- this.f.put(this.e, Long.valueOf(k)); +- } +- +- if (k > 100000000L) { +- MethodProfiler.b.warn("Something\'s taking too long! \'" + this.e + "\' took aprox " + (double) k / 1000000.0D + " ms"); +- } +- +- this.e = !this.c.isEmpty() ? (String) this.c.get(this.c.size() - 1) : ""; +- } + } + + public List b(String s) { +- if (!this.a) { +- return null; +- } else { +- long i = this.f.containsKey("root") ? ((Long) this.f.get("root")).longValue() : 0L; +- long j = this.f.containsKey(s) ? ((Long) this.f.get(s)).longValue() : -1L; +- ArrayList arraylist = Lists.newArrayList(); +- +- if (s.length() > 0) { +- s = s + "."; +- } +- +- long k = 0L; +- Iterator iterator = this.f.keySet().iterator(); +- +- while (iterator.hasNext()) { +- String s1 = (String) iterator.next(); +- +- if (s1.length() > s.length() && s1.startsWith(s) && s1.indexOf(".", s.length() + 1) < 0) { +- k += ((Long) this.f.get(s1)).longValue(); +- } +- } +- +- float f = (float) k; +- +- if (k < j) { +- k = j; +- } +- +- if (i < k) { +- i = k; +- } +- +- Iterator iterator1 = this.f.keySet().iterator(); +- +- String s2; +- +- while (iterator1.hasNext()) { +- s2 = (String) iterator1.next(); +- if (s2.length() > s.length() && s2.startsWith(s) && s2.indexOf(".", s.length() + 1) < 0) { +- long l = ((Long) this.f.get(s2)).longValue(); +- double d0 = (double) l * 100.0D / (double) k; +- double d1 = (double) l * 100.0D / (double) i; +- String s3 = s2.substring(s.length()); +- +- arraylist.add(new ProfilerInfo(s3, d0, d1)); +- } +- } +- +- iterator1 = this.f.keySet().iterator(); +- +- while (iterator1.hasNext()) { +- s2 = (String) iterator1.next(); +- this.f.put(s2, Long.valueOf(((Long) this.f.get(s2)).longValue() * 999L / 1000L)); +- } +- +- if ((float) k > f) { +- arraylist.add(new ProfilerInfo("unspecified", (double) ((float) k - f) * 100.0D / (double) k, (double) ((float) k - f) * 100.0D / (double) i)); +- } +- +- Collections.sort(arraylist); +- arraylist.add(0, new ProfilerInfo(s, 100.0D, (double) k * 100.0D / (double) i)); +- return arraylist; +- } ++ return null; + } + + public void c(String s) { +- this.b(); +- this.a(s); + } + + public String c() { +- return this.c.size() == 0 ? "[UNKNOWN]" : (String) this.c.get(this.c.size() - 1); ++ return null; + } + } diff --git a/nms-patches/MinecraftServer.patch b/nms-patches/MinecraftServer.patch new file mode 100644 index 0000000000..22d7748fda --- /dev/null +++ b/nms-patches/MinecraftServer.patch @@ -0,0 +1,726 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/MinecraftServer.java 2014-11-27 08:59:46.801421406 +1100 ++++ src/main/java/net/minecraft/server/MinecraftServer.java 2014-11-27 08:42:10.092851027 +1100 +@@ -37,6 +37,18 @@ + import org.apache.logging.log4j.LogManager; + import org.apache.logging.log4j.Logger; + ++// CraftBukkit start ++import java.io.IOException; ++ ++import jline.console.ConsoleReader; ++import joptsimple.OptionSet; ++ ++import org.bukkit.craftbukkit.Main; ++import org.bukkit.World.Environment; ++import org.bukkit.craftbukkit.util.Waitable; ++import org.bukkit.event.server.RemoteServerCommandEvent; ++import org.bukkit.event.world.WorldSaveEvent; ++// CraftBukkit end + public abstract class MinecraftServer implements ICommandListener, Runnable, IAsyncTaskHandler, IMojangStatistics { + + private static final Logger LOGGER = LogManager.getLogger(); +@@ -93,24 +105,66 @@ + private Thread serverThread; + private long ab = ax(); + +- public MinecraftServer(File file, Proxy proxy, File file1) { ++ // CraftBukkit start ++ public List worlds = new ArrayList(); ++ public org.bukkit.craftbukkit.CraftServer server; ++ public OptionSet options; ++ public org.bukkit.command.ConsoleCommandSender console; ++ public org.bukkit.command.RemoteConsoleCommandSender remoteConsole; ++ public ConsoleReader reader; ++ public static int currentTick = (int) (System.currentTimeMillis() / 50); ++ public final Thread primaryThread; ++ public java.util.Queue processQueue = new java.util.concurrent.ConcurrentLinkedQueue(); ++ public int autosavePeriod; ++ // CraftBukkit end ++ ++ public MinecraftServer(OptionSet options, Proxy proxy, File file1) { + this.d = proxy; + MinecraftServer.k = this; +- this.universe = file; ++ // this.universe = file; // CraftBukkit + this.q = new ServerConnection(this); + this.Z = new UserCache(this, file1); + this.p = this.h(); +- this.convertable = new WorldLoaderServer(file); ++ // this.convertable = new WorldLoaderServer(file); // CraftBukkit - moved to DedicatedServer.init + this.V = new YggdrasilAuthenticationService(proxy, UUID.randomUUID().toString()); + this.W = this.V.createMinecraftSessionService(); + this.Y = this.V.createProfileRepository(); ++ // CraftBukkit start ++ this.options = options; ++ // Try to see if we're actually running in a terminal, disable jline if not ++ if (System.console() == null) { ++ System.setProperty("jline.terminal", "jline.UnsupportedTerminal"); ++ Main.useJline = false; ++ } ++ ++ try { ++ reader = new ConsoleReader(System.in, System.out); ++ reader.setExpandEvents(false); // Avoid parsing exceptions for uncommonly used event designators ++ } catch (Throwable e) { ++ try { ++ // Try again with jline disabled for Windows users without C++ 2008 Redistributable ++ System.setProperty("jline.terminal", "jline.UnsupportedTerminal"); ++ System.setProperty("user.language", "en"); ++ Main.useJline = false; ++ reader = new ConsoleReader(System.in, System.out); ++ reader.setExpandEvents(false); ++ } catch (IOException ex) { ++ LOGGER.warn((String) null, ex); ++ } ++ } ++ Runtime.getRuntime().addShutdownHook(new org.bukkit.craftbukkit.util.ServerShutdownThread(this)); ++ ++ this.serverThread = primaryThread = new Thread(this, "Server thread"); // Moved from main + } + ++ public abstract PropertyManager getPropertyManager(); ++ // CraftBukkit end ++ + protected CommandDispatcher h() { + return new CommandDispatcher(); + } + +- protected abstract boolean init(); ++ protected abstract boolean init() throws java.net.UnknownHostException; // CraftBukkit - throws UnknownHostException + + protected void a(String s) { + if (this.getConvertable().isConvertable(s)) { +@@ -129,6 +183,7 @@ + this.a(s); + this.b("menu.loadingLevel"); + this.worldServer = new WorldServer[3]; ++ /* CraftBukkit start - Remove ticktime arrays and worldsettings + this.h = new long[this.worldServer.length][100]; + IDataManager idatamanager = this.convertable.a(s, true); + +@@ -152,37 +207,110 @@ + worlddata.a(s1); + worldsettings = new WorldSettings(worlddata); + } ++ */ ++ int worldCount = 3; + +- for (int j = 0; j < this.worldServer.length; ++j) { +- byte b0 = 0; ++ for (int j = 0; j < worldCount; ++j) { ++ WorldServer world; ++ byte dimension = 0; + + if (j == 1) { +- b0 = -1; ++ if (getAllowNether()) { ++ dimension = -1; ++ } else { ++ continue; ++ } + } + + if (j == 2) { +- b0 = 1; ++ if (server.getAllowEnd()) { ++ dimension = 1; ++ } else { ++ continue; ++ } + } + ++ String worldType = org.bukkit.World.Environment.getEnvironment(dimension).toString().toLowerCase(); ++ String name = (dimension == 0) ? s : s + "_" + worldType; ++ ++ org.bukkit.generator.ChunkGenerator gen = this.server.getGenerator(name); ++ WorldSettings worldsettings = new WorldSettings(i, this.getGamemode(), this.getGenerateStructures(), this.isHardcore(), worldtype); ++ worldsettings.setGeneratorSettings(s2); ++ + if (j == 0) { ++ IDataManager idatamanager = new ServerNBTManager(server.getWorldContainer(), s1, true); ++ WorldData worlddata = idatamanager.getWorldData(); ++ if (worlddata == null) { ++ worlddata = new WorldData(worldsettings, s1); ++ } + if (this.W()) { +- this.worldServer[j] = (WorldServer) (new DemoWorldServer(this, idatamanager, worlddata, b0, this.methodProfiler)).b(); ++ world = (WorldServer) (new DemoWorldServer(this, idatamanager, worlddata, dimension, this.methodProfiler)).b(); + } else { +- this.worldServer[j] = (WorldServer) (new WorldServer(this, idatamanager, worlddata, b0, this.methodProfiler)).b(); ++ world = (WorldServer) (new WorldServer(this, idatamanager, worlddata, dimension, this.methodProfiler, org.bukkit.World.Environment.getEnvironment(dimension), gen)).b(); + } + +- this.worldServer[j].a(worldsettings); ++ world.a(worldsettings); ++ this.server.scoreboardManager = new org.bukkit.craftbukkit.scoreboard.CraftScoreboardManager(this, world.getScoreboard()); + } else { +- this.worldServer[j] = (WorldServer) (new SecondaryWorldServer(this, idatamanager, b0, this.worldServer[0], this.methodProfiler)).b(); ++ String dim = "DIM" + dimension; ++ ++ File newWorld = new File(new File(name), dim); ++ File oldWorld = new File(new File(s), dim); ++ ++ if ((!newWorld.isDirectory()) && (oldWorld.isDirectory())) { ++ MinecraftServer.LOGGER.info("---- Migration of old " + worldType + " folder required ----"); ++ MinecraftServer.LOGGER.info("Unfortunately due to the way that Minecraft implemented multiworld support in 1.6, Bukkit requires that you move your " + worldType + " folder to a new location in order to operate correctly."); ++ MinecraftServer.LOGGER.info("We will move this folder for you, but it will mean that you need to move it back should you wish to stop using Bukkit in the future."); ++ MinecraftServer.LOGGER.info("Attempting to move " + oldWorld + " to " + newWorld + "..."); ++ ++ if (newWorld.exists()) { ++ MinecraftServer.LOGGER.warn("A file or folder already exists at " + newWorld + "!"); ++ MinecraftServer.LOGGER.info("---- Migration of old " + worldType + " folder failed ----"); ++ } else if (newWorld.getParentFile().mkdirs()) { ++ if (oldWorld.renameTo(newWorld)) { ++ MinecraftServer.LOGGER.info("Success! To restore " + worldType + " in the future, simply move " + newWorld + " to " + oldWorld); ++ // Migrate world data too. ++ try { ++ com.google.common.io.Files.copy(new File(new File(s), "level.dat"), new File(new File(name), "level.dat")); ++ } catch (IOException exception) { ++ MinecraftServer.LOGGER.warn("Unable to migrate world data."); ++ } ++ MinecraftServer.LOGGER.info("---- Migration of old " + worldType + " folder complete ----"); ++ } else { ++ MinecraftServer.LOGGER.warn("Could not move folder " + oldWorld + " to " + newWorld + "!"); ++ MinecraftServer.LOGGER.info("---- Migration of old " + worldType + " folder failed ----"); ++ } ++ } else { ++ MinecraftServer.LOGGER.warn("Could not create path for " + newWorld + "!"); ++ MinecraftServer.LOGGER.info("---- Migration of old " + worldType + " folder failed ----"); ++ } ++ } ++ ++ IDataManager idatamanager = new ServerNBTManager(server.getWorldContainer(), name, true); ++ // world =, b0 to dimension, s1 to name, added Environment and gen ++ WorldData worlddata = idatamanager.getWorldData(); ++ if (worlddata == null) { ++ worlddata = new WorldData(worldsettings, name); ++ } ++ world = (WorldServer) new SecondaryWorldServer(this, idatamanager, dimension, this.worlds.get(0), this.methodProfiler, worlddata, org.bukkit.World.Environment.getEnvironment(dimension), gen).b(); + } + +- this.worldServer[j].addIWorldAccess(new WorldManager(this, this.worldServer[j])); ++ if (gen != null) { ++ world.getWorld().getPopulators().addAll(gen.getDefaultPopulators(world.getWorld())); ++ } ++ ++ this.server.getPluginManager().callEvent(new org.bukkit.event.world.WorldInitEvent(world.getWorld())); ++ ++ world.addIWorldAccess(new WorldManager(this, world)); + if (!this.S()) { +- this.worldServer[j].getWorldData().setGameType(this.getGamemode()); ++ world.getWorldData().setGameType(this.getGamemode()); + } ++ ++ worlds.add(world); ++ getPlayerList().setPlayerFileData(worlds.toArray(new WorldServer[worlds.size()])); + } + +- this.v.setPlayerFileData(this.worldServer); ++ // CraftBukkit end + this.a(this.getDifficulty()); + this.k(); + } +@@ -197,25 +325,38 @@ + this.b("menu.generatingTerrain"); + byte b0 = 0; + +- MinecraftServer.LOGGER.info("Preparing start region for level " + b0); +- WorldServer worldserver = this.worldServer[b0]; +- BlockPosition blockposition = worldserver.getSpawn(); +- long j = ax(); +- +- for (int k = -192; k <= 192 && this.isRunning(); k += 16) { +- for (int l = -192; l <= 192 && this.isRunning(); l += 16) { +- long i1 = ax(); +- +- if (i1 - j > 1000L) { +- this.a_("Preparing spawn area", i * 100 / 625); +- j = i1; +- } ++ // CraftBukkit start - fire WorldLoadEvent and handle whether or not to keep the spawn in memory ++ for (int m = 0; m < worlds.size(); m++) { ++ WorldServer worldserver = this.worlds.get(m); ++ LOGGER.info("Preparing start region for level " + m + " (Seed: " + worldserver.getSeed() + ")"); ++ ++ if (!worldserver.getWorld().getKeepSpawnInMemory()) { ++ continue; ++ } ++ ++ BlockPosition blockposition = worldserver.getSpawn(); ++ long j = ax(); ++ i = 0; ++ ++ for (int k = -192; k <= 192 && this.isRunning(); k += 16) { ++ for (int l = -192; l <= 192 && this.isRunning(); l += 16) { ++ long i1 = ax(); ++ ++ if (i1 - j > 1000L) { ++ this.a_("Preparing spawn area", i * 100 / 625); ++ j = i1; ++ } + +- ++i; +- worldserver.chunkProviderServer.getChunkAt(blockposition.getX() + k >> 4, blockposition.getZ() + l >> 4); ++ ++i; ++ worldserver.chunkProviderServer.getChunkAt(blockposition.getX() + k >> 4, blockposition.getZ() + l >> 4); ++ } + } + } + ++ for (WorldServer world : this.worlds) { ++ this.server.getPluginManager().callEvent(new org.bukkit.event.world.WorldLoadEvent(world.getWorld())); ++ } ++ // CraftBukkit end + this.q(); + } + +@@ -247,35 +388,42 @@ + protected void q() { + this.e = null; + this.f = 0; ++ ++ this.server.enablePlugins(org.bukkit.plugin.PluginLoadOrder.POSTWORLD); // CraftBukkit + } + +- protected void saveChunks(boolean flag) { ++ protected void saveChunks(boolean flag) throws ExceptionWorldConflict { // CraftBukkit - added throws + if (!this.N) { +- WorldServer[] aworldserver = this.worldServer; +- int i = aworldserver.length; +- +- for (int j = 0; j < i; ++j) { +- WorldServer worldserver = aworldserver[j]; + ++ // CraftBukkit start ++ for (int j = 0; j < worlds.size(); ++j) { ++ WorldServer worldserver = worlds.get(j); ++ // CraftBukkit end + if (worldserver != null) { + if (!flag) { + MinecraftServer.LOGGER.info("Saving chunks for level \'" + worldserver.getWorldData().getName() + "\'/" + worldserver.worldProvider.getName()); + } + +- try { +- worldserver.save(true, (IProgressUpdate) null); +- } catch (ExceptionWorldConflict exceptionworldconflict) { +- MinecraftServer.LOGGER.warn(exceptionworldconflict.getMessage()); +- } ++ worldserver.save(true, (IProgressUpdate) null); ++ worldserver.saveLevel(); ++ ++ WorldSaveEvent event = new WorldSaveEvent(worldserver.getWorld()); ++ this.server.getPluginManager().callEvent(event); ++ // CraftBukkit end + } + } + + } + } + +- public void stop() { ++ public void stop() throws ExceptionWorldConflict { // CraftBukkit - added throws + if (!this.N) { + MinecraftServer.LOGGER.info("Stopping server"); ++ // CraftBukkit start ++ if (this.server != null) { ++ this.server.disablePlugins(); ++ } ++ // CraftBukkit end + if (this.ao() != null) { + this.ao().b(); + } +@@ -290,11 +438,13 @@ + MinecraftServer.LOGGER.info("Saving worlds"); + this.saveChunks(false); + ++ /* CraftBukkit start - Handled in saveChunks + for (int i = 0; i < this.worldServer.length; ++i) { + WorldServer worldserver = this.worldServer[i]; + + worldserver.saveLevel(); + } ++ // CraftBukkit end */ + } + + if (this.m.d()) { +@@ -335,6 +485,7 @@ + long k = j - this.ab; + + if (k > 2000L && this.ab - this.R >= 15000L) { ++ if (server.getWarnOnOverload()) // CraftBukkit + MinecraftServer.LOGGER.warn("Can\'t keep up! Did the system time change, or is the server overloaded? Running {}ms behind, skipping {} tick(s)", new Object[] { Long.valueOf(k), Long.valueOf(k / 50L)}); + k = 2000L; + this.R = this.ab; +@@ -347,11 +498,12 @@ + + i += k; + this.ab = j; +- if (this.worldServer[0].everyoneDeeplySleeping()) { ++ if (this.worlds.get(0).everyoneDeeplySleeping()) { // CraftBukkit + this.y(); + i = 0L; + } else { + while (i > 50L) { ++ MinecraftServer.currentTick = (int) (System.currentTimeMillis() / 50); // CraftBukkit + i -= 50L; + this.y(); + } +@@ -389,6 +541,12 @@ + } catch (Throwable throwable1) { + MinecraftServer.LOGGER.error("Exception stopping the server", throwable1); + } finally { ++ // CraftBukkit start - Restore terminal to original settings ++ try { ++ reader.getTerminal().restore(); ++ } catch (Exception ignored) { ++ } ++ // CraftBukkit end + this.x(); + } + +@@ -428,7 +586,7 @@ + + protected void x() {} + +- protected void y() { ++ protected void y() throws ExceptionWorldConflict { // CraftBukkit - added throws + long i = System.nanoTime(); + + ++this.ticks; +@@ -454,7 +612,7 @@ + this.r.b().a(agameprofile); + } + +- if (this.ticks % 900 == 0) { ++ if (autosavePeriod > 0 && this.ticks % autosavePeriod == 0) { // CraftBukkit + this.methodProfiler.a("save"); + this.v.savePlayers(); + this.saveChunks(true); +@@ -493,20 +651,40 @@ + + this.methodProfiler.c("levels"); + ++ // CraftBukkit start ++ this.server.getScheduler().mainThreadHeartbeat(this.ticks); ++ ++ // Run tasks that are waiting on processing ++ while (!processQueue.isEmpty()) { ++ processQueue.remove().run(); ++ } ++ ++ org.bukkit.craftbukkit.chunkio.ChunkIOExecutor.tick(); ++ ++ // Send time updates 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.getPlayerList().players.size(); ++i) { ++ EntityPlayer entityplayer = (EntityPlayer) this.getPlayerList().players.get(i); ++ entityplayer.playerConnection.sendPacket(new PacketPlayOutUpdateTime(entityplayer.world.getTime(), entityplayer.getPlayerTime(), entityplayer.world.getGameRules().getBoolean("doDaylightCycle"))); // Add support for per player time ++ } ++ } ++ + int i; + +- for (i = 0; i < this.worldServer.length; ++i) { ++ for (i = 0; i < this.worlds.size(); ++i) { + long j = System.nanoTime(); + +- if (i == 0 || this.getAllowNether()) { +- WorldServer worldserver = this.worldServer[i]; ++ // if (i == 0 || this.getAllowNether()) { ++ WorldServer worldserver = this.worlds.get(i); + + this.methodProfiler.a(worldserver.getWorldData().getName()); ++ /* Drop global time updates + if (this.ticks % 20 == 0) { + this.methodProfiler.a("timeSync"); + this.v.a(new PacketPlayOutUpdateTime(worldserver.getTime(), worldserver.getDayTime(), worldserver.getGameRules().getBoolean("doDaylightCycle")), worldserver.worldProvider.getDimension()); + this.methodProfiler.b(); + } ++ // CraftBukkit end */ + + this.methodProfiler.a("tick"); + +@@ -533,9 +711,9 @@ + worldserver.getTracker().updatePlayers(); + this.methodProfiler.b(); + this.methodProfiler.b(); +- } ++ // } // CraftBukkit + +- this.h[i][this.ticks % 100] = System.nanoTime() - j; ++ // this.h[i][this.ticks % 100] = System.nanoTime() - j; // CraftBukkit + } + + this.methodProfiler.c("connection"); +@@ -559,10 +737,11 @@ + this.o.add(iupdateplayerlistbox); + } + +- public static void main(String[] astring) { ++ public static void main(final OptionSet options) { // CraftBukkit - replaces main(String[] astring) + DispenserRegistry.c(); + + try { ++ /* CraftBukkit start - Replace everything + boolean flag = true; + String s = null; + String s1 = "."; +@@ -636,6 +815,29 @@ + + dedicatedserver.B(); + Runtime.getRuntime().addShutdownHook(new ThreadShutdown("Server Shutdown Thread", dedicatedserver)); ++ */ ++ ++ DedicatedServer dedicatedserver = new DedicatedServer(options); ++ ++ if (options.has("port")) { ++ int port = (Integer) options.valueOf("port"); ++ if (port > 0) { ++ dedicatedserver.setPort(port); ++ } ++ } ++ ++ if (options.has("universe")) { ++ dedicatedserver.universe = (File) options.valueOf("universe"); ++ } else { ++ dedicatedserver.universe = new File("."); ++ } ++ ++ if (options.has("world")) { ++ dedicatedserver.setWorld((String) options.valueOf("world")); ++ } ++ ++ dedicatedserver.primaryThread.start(); ++ // CraftBukkit end + } catch (Exception exception) { + MinecraftServer.LOGGER.fatal("Failed to start the minecraft server", exception); + } +@@ -643,8 +845,10 @@ + } + + public void B() { ++ /* CraftBukkit start - prevent abuse + this.serverThread = new Thread(this, "Server thread"); + this.serverThread.start(); ++ // CraftBukkit end */ + } + + public File d(String s) { +@@ -660,7 +864,14 @@ + } + + public WorldServer getWorldServer(int i) { +- return i == -1 ? this.worldServer[1] : (i == 1 ? this.worldServer[2] : this.worldServer[0]); ++ // CraftBukkit start ++ for (WorldServer world : worlds) { ++ if (world.dimension == i) { ++ return world; ++ } ++ } ++ return worlds.get(0); ++ // CraftBukkit end + } + + public String C() { +@@ -696,17 +907,62 @@ + } + + public String getPlugins() { +- return ""; +- } ++ // CraftBukkit start - Whole method ++ StringBuilder result = new StringBuilder(); ++ org.bukkit.plugin.Plugin[] plugins = server.getPluginManager().getPlugins(); ++ ++ result.append(server.getName()); ++ result.append(" on Bukkit "); ++ result.append(server.getBukkitVersion()); ++ ++ if (plugins.length > 0 && server.getQueryPlugins()) { ++ result.append(": "); ++ ++ for (int i = 0; i < plugins.length; i++) { ++ if (i > 0) { ++ result.append("; "); ++ } + +- public String executeRemoteCommand(String s) { +- RemoteControlCommandListener.getInstance().i(); +- this.p.a(RemoteControlCommandListener.getInstance(), s); +- return RemoteControlCommandListener.getInstance().j(); ++ result.append(plugins[i].getDescription().getName()); ++ result.append(" "); ++ result.append(plugins[i].getDescription().getVersion().replaceAll(";", ",")); ++ } ++ } ++ ++ return result.toString(); ++ // CraftBukkit end ++ } ++ ++ // CraftBukkit start - fire RemoteServerCommandEvent ++ public String executeRemoteCommand(final String s) { ++ Waitable waitable = new Waitable() { ++ @Override ++ protected String evaluate() { ++ RemoteControlCommandListener.getInstance().i(); ++ // Event changes start ++ RemoteServerCommandEvent event = new RemoteServerCommandEvent(remoteConsole, s); ++ server.getPluginManager().callEvent(event); ++ // Event change end ++ ServerCommand serverCommand = new ServerCommand(event.getCommand(), RemoteControlCommandListener.getInstance()); ++ server.dispatchServerCommand(remoteConsole, serverCommand); ++ // this.p.a(RemoteControlCommandListener.getInstance(), s); ++ return RemoteControlCommandListener.getInstance().j(); ++ } ++ }; ++ processQueue.add(waitable); ++ try { ++ return waitable.get(); ++ } catch (java.util.concurrent.ExecutionException e) { ++ throw new RuntimeException("Exception processing rcon command " + s, e.getCause()); ++ } catch (InterruptedException e) { ++ Thread.currentThread().interrupt(); // Maintain interrupted state ++ throw new RuntimeException("Interrupted processing rcon command " + s, e); ++ } ++ // CraftBukkit end + } + + public boolean isDebugging() { +- return false; ++ return this.getPropertyManager().getBoolean("debug", false); // CraftBukkit - don't hardcode + } + + public void h(String s) { +@@ -721,7 +977,7 @@ + } + + public String getServerModName() { +- return "vanilla"; ++ return server.getName(); // CraftBukkit - cb > vanilla! + } + + public CrashReport b(CrashReport crashreport) { +@@ -734,6 +990,7 @@ + } + + public List tabCompleteCommand(ICommandListener icommandlistener, String s, BlockPosition blockposition) { ++ /* CraftBukkit start - Allow tab-completion of Bukkit commands + ArrayList arraylist = Lists.newArrayList(); + + if (s.startsWith("/")) { +@@ -772,6 +1029,9 @@ + + return arraylist; + } ++ */ ++ return server.tabComplete(icommandlistener, s); ++ // CraftBukkit end + } + + public static MinecraftServer getServer() { +@@ -835,8 +1095,10 @@ + } + + public void a(EnumDifficulty enumdifficulty) { +- for (int i = 0; i < this.worldServer.length; ++i) { +- WorldServer worldserver = this.worldServer[i]; ++ // CraftBukkit start ++ for (int i = 0; i < this.worlds.size(); ++i) { ++ WorldServer worldserver = this.worlds.get(i); ++ // CraftBukkit end + + if (worldserver != null) { + if (worldserver.getWorldData().isHardcore()) { +@@ -878,15 +1140,17 @@ + this.N = true; + this.getConvertable().d(); + +- for (int i = 0; i < this.worldServer.length; ++i) { +- WorldServer worldserver = this.worldServer[i]; ++ // CraftBukkit start ++ for (int i = 0; i < this.worlds.size(); ++i) { ++ WorldServer worldserver = this.worlds.get(i); ++ // CraftBukkit end + + if (worldserver != null) { + worldserver.saveLevel(); + } + } + +- this.getConvertable().e(this.worldServer[0].getDataManager().g()); ++ this.getConvertable().e(this.worlds.get(0).getDataManager().g()); // CraftBukkit + this.safeShutdown(); + } + +@@ -919,9 +1183,11 @@ + int i = 0; + + if (this.worldServer != null) { +- for (int j = 0; j < this.worldServer.length; ++j) { +- if (this.worldServer[j] != null) { +- WorldServer worldserver = this.worldServer[j]; ++ // CraftBukkit start ++ for (int j = 0; j < this.worlds.size(); ++j) { ++ WorldServer worldserver = this.worlds.get(j); ++ if (worldserver != null) { ++ // CraftBukkit end + WorldData worlddata = worldserver.getWorldData(); + + mojangstatisticsgenerator.a("world[" + i + "][dimension]", Integer.valueOf(worldserver.worldProvider.getDimension())); +@@ -954,7 +1220,7 @@ + public abstract boolean ad(); + + public boolean getOnlineMode() { +- return this.onlineMode; ++ return server.getOnlineMode(); // CraftBukkit + } + + public void setOnlineMode(boolean flag) { +@@ -1024,8 +1290,10 @@ + } + + public void setGamemode(EnumGamemode enumgamemode) { +- for (int i = 0; i < this.worldServer.length; ++i) { +- getServer().worldServer[i].getWorldData().setGameType(enumgamemode); ++ // CraftBukkit start ++ for (int i = 0; i < this.worlds.size(); ++i) { ++ getServer().worlds.get(i).getWorldData().setGameType(enumgamemode); ++ // CraftBukkit end + } + + } +@@ -1057,7 +1325,7 @@ + } + + public World getWorld() { +- return this.worldServer[0]; ++ return this.worlds.get(0); // CraftBukkit + } + + public Entity f() { +@@ -1125,11 +1393,10 @@ + } + + public Entity a(UUID uuid) { +- WorldServer[] aworldserver = this.worldServer; +- int i = aworldserver.length; +- +- for (int j = 0; j < i; ++j) { +- WorldServer worldserver = aworldserver[j]; ++ // CraftBukkit start ++ for (int j = 0; j < worlds.size(); ++j) { ++ WorldServer worldserver = worlds.get(j); ++ // CraftBukkit end + + if (worldserver != null) { + Entity entity = worldserver.getEntity(uuid); +@@ -1144,7 +1411,7 @@ + } + + public boolean getSendCommandFeedback() { +- return getServer().worldServer[0].getGameRules().getBoolean("sendCommandFeedback"); ++ return getServer().worlds.get(0).getGameRules().getBoolean("sendCommandFeedback"); // CraftBukkit + } + + public void a(EnumCommandResult enumcommandresult, int i) {} diff --git a/nms-patches/MobEffectList.patch b/nms-patches/MobEffectList.patch new file mode 100644 index 0000000000..33ebcae25a --- /dev/null +++ b/nms-patches/MobEffectList.patch @@ -0,0 +1,74 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/MobEffectList.java 2014-11-27 08:59:46.801421406 +1100 ++++ src/main/java/net/minecraft/server/MobEffectList.java 2014-11-27 08:42:10.120850973 +1100 +@@ -6,6 +6,11 @@ + import java.util.UUID; + import java.util.Map.Entry; + ++// CraftBukkit start ++import org.bukkit.craftbukkit.event.CraftEventFactory; ++import org.bukkit.event.entity.EntityRegainHealthEvent.RegainReason; ++// CraftBukkit end ++ + public class MobEffectList { + + public static final MobEffectList[] byId = new MobEffectList[32]; +@@ -63,6 +68,8 @@ + } + + this.L = j; ++ org.bukkit.potion.PotionEffectType.registerPotionEffectType(new org.bukkit.craftbukkit.potion.CraftPotionEffectType(this)); // CraftBukkit ++ + } + + public static MobEffectList b(String s) { +@@ -94,11 +101,11 @@ + public void tick(EntityLiving entityliving, int i) { + if (this.id == MobEffectList.REGENERATION.id) { + if (entityliving.getHealth() < entityliving.getMaxHealth()) { +- entityliving.heal(1.0F); ++ entityliving.heal(1.0F, RegainReason.MAGIC_REGEN); // CraftBukkit + } + } else if (this.id == MobEffectList.POISON.id) { + if (entityliving.getHealth() > 1.0F) { +- entityliving.damageEntity(DamageSource.MAGIC, 1.0F); ++ entityliving.damageEntity(CraftEventFactory.POISON, 1.0F); // CraftBukkit - DamageSource.MAGIC -> CraftEventFactory.POISON + } + } else if (this.id == MobEffectList.WITHER.id) { + entityliving.damageEntity(DamageSource.WITHER, 1.0F); +@@ -106,14 +113,25 @@ + ((EntityHuman) entityliving).applyExhaustion(0.025F * (float) (i + 1)); + } else if (this.id == MobEffectList.SATURATION.id && entityliving instanceof EntityHuman) { + if (!entityliving.world.isStatic) { +- ((EntityHuman) entityliving).getFoodData().eat(i + 1, 1.0F); ++ // CraftBukkit start ++ EntityHuman entityhuman = (EntityHuman) entityliving; ++ int oldFoodLevel = entityhuman.getFoodData().foodLevel; ++ ++ org.bukkit.event.entity.FoodLevelChangeEvent event = CraftEventFactory.callFoodLevelChangeEvent(entityhuman, i + 1 + oldFoodLevel); ++ ++ if (!event.isCancelled()) { ++ entityhuman.getFoodData().eat(event.getFoodLevel() - oldFoodLevel, 1.0F); ++ } ++ ++ ((EntityPlayer) entityhuman).playerConnection.sendPacket(new PacketPlayOutUpdateHealth(((EntityPlayer) entityhuman).getBukkitEntity().getScaledHealth(), entityhuman.getFoodData().foodLevel, entityhuman.getFoodData().saturationLevel)); ++ // CraftBukkit end + } + } else if ((this.id != MobEffectList.HEAL.id || entityliving.bl()) && (this.id != MobEffectList.HARM.id || !entityliving.bl())) { + if (this.id == MobEffectList.HARM.id && !entityliving.bl() || this.id == MobEffectList.HEAL.id && entityliving.bl()) { + entityliving.damageEntity(DamageSource.MAGIC, (float) (6 << i)); + } + } else { +- entityliving.heal((float) Math.max(4 << i, 0)); ++ entityliving.heal((float) Math.max(4 << i, 0), RegainReason.MAGIC); // CraftBukkit + } + + } +@@ -132,7 +150,7 @@ + } + } else { + j = (int) (d0 * (double) (4 << i) + 0.5D); +- entityliving.heal((float) j); ++ entityliving.heal((float) j, RegainReason.MAGIC); // CraftBukkit + } + + } diff --git a/nms-patches/MobSpawnerAbstract.patch b/nms-patches/MobSpawnerAbstract.patch new file mode 100644 index 0000000000..1a93618353 --- /dev/null +++ b/nms-patches/MobSpawnerAbstract.patch @@ -0,0 +1,38 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/MobSpawnerAbstract.java 2014-11-27 08:59:46.805421389 +1100 ++++ src/main/java/net/minecraft/server/MobSpawnerAbstract.java 2014-11-27 08:42:10.108850996 +1100 +@@ -4,6 +4,8 @@ + import java.util.Iterator; + import java.util.List; + ++import org.bukkit.event.entity.CreatureSpawnEvent; // CraftBukkit ++ + public abstract class MobSpawnerAbstract { + + public int spawnDelay = 20; +@@ -129,7 +131,7 @@ + + entity.f(nbttagcompound); + if (entity.world != null && flag) { +- entity.world.addEntity(entity); ++ entity.world.addEntity(entity, CreatureSpawnEvent.SpawnReason.SPAWNER); // CraftBukkit + } + + NBTTagCompound nbttagcompound1; +@@ -154,7 +156,7 @@ + entity2.f(nbttagcompound2); + entity2.setPositionRotation(entity1.locX, entity1.locY, entity1.locZ, entity1.yaw, entity1.pitch); + if (entity.world != null && flag) { +- entity.world.addEntity(entity2); ++ entity.world.addEntity(entity2, CreatureSpawnEvent.SpawnReason.SPAWNER); // CraftBukkit + } + + entity1.mount(entity2); +@@ -164,7 +166,7 @@ + } + } else if (entity instanceof EntityLiving && entity.world != null && flag) { + ((EntityInsentient) entity).prepare(entity.world.E(new BlockPosition(entity)), (GroupDataEntity) null); +- entity.world.addEntity(entity); ++ entity.world.addEntity(entity, CreatureSpawnEvent.SpawnReason.SPAWNER); // CraftBukkit + } + + return entity; diff --git a/nms-patches/NameReferencingFileConverter.patch b/nms-patches/NameReferencingFileConverter.patch new file mode 100644 index 0000000000..621762db65 --- /dev/null +++ b/nms-patches/NameReferencingFileConverter.patch @@ -0,0 +1,76 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/NameReferencingFileConverter.java 2014-11-27 08:59:46.805421389 +1100 ++++ src/main/java/net/minecraft/server/NameReferencingFileConverter.java 2014-11-27 08:42:10.168850880 +1100 +@@ -32,7 +32,7 @@ + public static final File c = new File("ops.txt"); + public static final File d = new File("white-list.txt"); + +- static List a(File file, Map map) { ++ static List a(File file, Map map) throws IOException { // CraftBukkit - Added throws + List list = Files.readLines(file, Charsets.UTF_8); + Iterator iterator = list.iterator(); + +@@ -77,9 +77,11 @@ + if (gameprofilebanlist.c().exists()) { + try { + gameprofilebanlist.load(); +- } catch (FileNotFoundException filenotfoundexception) { +- NameReferencingFileConverter.e.warn("Could not load existing file " + gameprofilebanlist.c().getName(), filenotfoundexception); ++ // CraftBukkit start - FileNotFoundException -> IOException, don't print stacetrace ++ } catch (IOException filenotfoundexception) { ++ e.warn("Could not load existing file " + gameprofilebanlist.c().getName() + ", " + filenotfoundexception.getMessage()); + } ++ // CraftBukkit end + } + + try { +@@ -111,9 +113,11 @@ + if (ipbanlist.c().exists()) { + try { + ipbanlist.load(); +- } catch (FileNotFoundException filenotfoundexception) { +- NameReferencingFileConverter.e.warn("Could not load existing file " + ipbanlist.c().getName(), filenotfoundexception); ++ // CraftBukkit start - FileNotFoundException -> IOException, don't print stacetrace ++ } catch (IOException filenotfoundexception) { ++ e.warn("Could not load existing file " + ipbanlist.c().getName() + ", " + filenotfoundexception.getMessage()); + } ++ // CraftBukkit end + } + + try { +@@ -152,9 +156,11 @@ + if (oplist.c().exists()) { + try { + oplist.load(); +- } catch (FileNotFoundException filenotfoundexception) { +- NameReferencingFileConverter.e.warn("Could not load existing file " + oplist.c().getName(), filenotfoundexception); ++ // CraftBukkit start - FileNotFoundException -> IOException, don't print stacetrace ++ } catch (IOException filenotfoundexception) { ++ e.warn("Could not load existing file " + oplist.c().getName() + ", " + filenotfoundexception.getMessage()); + } ++ // CraftBukkit end + } + + try { +@@ -184,9 +190,11 @@ + if (whitelist.c().exists()) { + try { + whitelist.load(); +- } catch (FileNotFoundException filenotfoundexception) { +- NameReferencingFileConverter.e.warn("Could not load existing file " + whitelist.c().getName(), filenotfoundexception); ++ // CraftBukkit start - FileNotFoundException -> IOException, don't print stacetrace ++ } catch (IOException filenotfoundexception) { ++ e.warn("Could not load existing file " + whitelist.c().getName() + ", " + filenotfoundexception.getMessage()); + } ++ // CraftBukkit end + } + + try { +@@ -351,7 +359,7 @@ + + private static File d(PropertyManager propertymanager) { + String s = propertymanager.getString("level-name", "world"); +- File file = new File(s); ++ File file = new File(MinecraftServer.getServer().server.getWorldContainer(), s); // CraftBukkit - Respect container setting + + return new File(file, "players"); + } diff --git a/nms-patches/NetworkManager.patch b/nms-patches/NetworkManager.patch new file mode 100644 index 0000000000..99a6dc9109 --- /dev/null +++ b/nms-patches/NetworkManager.patch @@ -0,0 +1,20 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/NetworkManager.java 2014-11-27 08:59:46.809421371 +1100 ++++ src/main/java/net/minecraft/server/NetworkManager.java 2014-11-27 08:42:10.120850973 +1100 +@@ -41,7 +41,7 @@ + this.g = enumprotocoldirection; + } + +- public void channelActive(ChannelHandlerContext channelhandlercontext) { ++ public void channelActive(ChannelHandlerContext channelhandlercontext) throws Exception { // CraftBukkit - added throws + super.channelActive(channelhandlercontext); + this.i = channelhandlercontext.channel(); + this.j = this.i.remoteAddress(); +@@ -159,7 +159,7 @@ + + public void close(IChatBaseComponent ichatbasecomponent) { + if (this.i.isOpen()) { +- this.i.close().awaitUninterruptibly(); ++ this.i.close(); // We can't wait as this may be called from an event loop. + this.l = ichatbasecomponent; + } + diff --git a/nms-patches/Packet.patch b/nms-patches/Packet.patch new file mode 100644 index 0000000000..29864db4bc --- /dev/null +++ b/nms-patches/Packet.patch @@ -0,0 +1,14 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/Packet.java 2014-11-27 08:59:46.813421353 +1100 ++++ src/main/java/net/minecraft/server/Packet.java 2014-11-27 08:42:10.152850911 +1100 +@@ -2,9 +2,9 @@ + + public interface Packet { + +- void a(PacketDataSerializer packetdataserializer); ++ void a(PacketDataSerializer packetdataserializer) throws java.io.IOException; // CraftBukkit - added throws + +- void b(PacketDataSerializer packetdataserializer); ++ void b(PacketDataSerializer packetdataserializer) throws java.io.IOException; // CraftBukkit - added throws + + void a(PacketListener packetlistener); + } diff --git a/nms-patches/PacketDataSerializer.patch b/nms-patches/PacketDataSerializer.patch new file mode 100644 index 0000000000..20a1268c51 --- /dev/null +++ b/nms-patches/PacketDataSerializer.patch @@ -0,0 +1,122 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/PacketDataSerializer.java 2014-11-27 08:59:46.809421371 +1100 ++++ src/main/java/net/minecraft/server/PacketDataSerializer.java 2014-11-27 08:42:10.108850996 +1100 +@@ -8,7 +8,6 @@ + import io.netty.buffer.ByteBufProcessor; + import io.netty.handler.codec.DecoderException; + import io.netty.handler.codec.EncoderException; +-import io.netty.util.ReferenceCounted; + import java.io.DataInput; + import java.io.DataOutput; + import java.io.IOException; +@@ -21,6 +20,8 @@ + import java.nio.charset.Charset; + import java.util.UUID; + ++import org.bukkit.craftbukkit.inventory.CraftItemStack; // CraftBukkit ++ + public class PacketDataSerializer extends ByteBuf { + + private final ByteBuf a; +@@ -142,7 +143,7 @@ + } else { + try { + NBTCompressedStreamTools.a(nbttagcompound, (DataOutput) (new ByteBufOutputStream(this))); +- } catch (IOException ioexception) { ++ } catch (Exception ioexception) { // CraftBukkit - IOException -> Exception + throw new EncoderException(ioexception); + } + } +@@ -162,7 +163,7 @@ + } + + public void a(ItemStack itemstack) { +- if (itemstack == null) { ++ if (itemstack == null || itemstack.getItem() == null) { // CraftBukkit - NPE fix itemstack.getItem() + this.writeShort(-1); + } else { + this.writeShort(Item.getId(itemstack.getItem())); +@@ -189,6 +190,11 @@ + + itemstack = new ItemStack(Item.getById(short0), b0, short1); + itemstack.setTag(this.h()); ++ // CraftBukkit start ++ if (itemstack.getTag() != null) { ++ CraftItemStack.setItemMeta(itemstack, CraftItemStack.getItemMeta(itemstack)); ++ } ++ // CraftBukkit end + } + + return itemstack; +@@ -416,11 +422,11 @@ + return this.a.getBytes(i, bytebuffer); + } + +- public ByteBuf getBytes(int i, OutputStream outputstream, int j) { ++ public ByteBuf getBytes(int i, OutputStream outputstream, int j) throws IOException { // CraftBukkit - throws IOException + return this.a.getBytes(i, outputstream, j); + } + +- public int getBytes(int i, GatheringByteChannel gatheringbytechannel, int j) { ++ public int getBytes(int i, GatheringByteChannel gatheringbytechannel, int j) throws IOException { // CraftBukkit - throws IOException + return this.a.getBytes(i, gatheringbytechannel, j); + } + +@@ -484,11 +490,11 @@ + return this.a.setBytes(i, bytebuffer); + } + +- public int setBytes(int i, InputStream inputstream, int j) { ++ public int setBytes(int i, InputStream inputstream, int j) throws IOException { // CraftBukkit - throws IOException + return this.a.setBytes(i, inputstream, j); + } + +- public int setBytes(int i, ScatteringByteChannel scatteringbytechannel, int j) { ++ public int setBytes(int i, ScatteringByteChannel scatteringbytechannel, int j) throws IOException { // CraftBukkit - throws IOException + return this.a.setBytes(i, scatteringbytechannel, j); + } + +@@ -580,11 +586,11 @@ + return this.a.readBytes(bytebuffer); + } + +- public ByteBuf readBytes(OutputStream outputstream, int i) { ++ public ByteBuf readBytes(OutputStream outputstream, int i) throws IOException { // CraftBukkit - throws IOException + return this.a.readBytes(outputstream, i); + } + +- public int readBytes(GatheringByteChannel gatheringbytechannel, int i) { ++ public int readBytes(GatheringByteChannel gatheringbytechannel, int i) throws IOException { // CraftBukkit - throws IOException + return this.a.readBytes(gatheringbytechannel, i); + } + +@@ -652,11 +658,11 @@ + return this.a.writeBytes(bytebuffer); + } + +- public int writeBytes(InputStream inputstream, int i) { ++ public int writeBytes(InputStream inputstream, int i) throws IOException { // CraftBukkit - throws IOException + return this.a.writeBytes(inputstream, i); + } + +- public int writeBytes(ScatteringByteChannel scatteringbytechannel, int i) { ++ public int writeBytes(ScatteringByteChannel scatteringbytechannel, int i) throws IOException { // CraftBukkit - throws IOException + return this.a.writeBytes(scatteringbytechannel, i); + } + +@@ -803,16 +809,4 @@ + public boolean release(int i) { + return this.a.release(i); + } +- +- public ReferenceCounted retain(int i) { +- return this.retain(i); +- } +- +- public ReferenceCounted retain() { +- return this.retain(); +- } +- +- public int compareTo(Object object) { +- return this.compareTo((ByteBuf) object); +- } + } diff --git a/nms-patches/PacketPlayInBlockPlace.patch b/nms-patches/PacketPlayInBlockPlace.patch new file mode 100644 index 0000000000..d986bc094e --- /dev/null +++ b/nms-patches/PacketPlayInBlockPlace.patch @@ -0,0 +1,32 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/PacketPlayInBlockPlace.java 2014-11-27 08:59:46.813421353 +1100 ++++ src/main/java/net/minecraft/server/PacketPlayInBlockPlace.java 2014-11-27 08:42:10.152850911 +1100 +@@ -9,6 +9,8 @@ + private float e; + private float f; + private float g; ++ ++ public long timestamp; // CraftBukkit + + public PacketPlayInBlockPlace() {} + +@@ -26,6 +28,7 @@ + } + + public void a(PacketDataSerializer packetdataserializer) { ++ timestamp = System.currentTimeMillis(); // CraftBukkit + this.b = packetdataserializer.c(); + this.c = packetdataserializer.readUnsignedByte(); + this.d = packetdataserializer.i(); +@@ -71,7 +74,10 @@ + return this.g; + } + +- public void a(PacketListener packetlistener) { +- this.a((PacketListenerPlayIn) packetlistener); ++ // CraftBukkit start - fix decompile error ++ @Override ++ public void a(PacketListener pl) { ++ a((PacketListenerPlayIn)pl); + } ++ // CraftBukkit end + } diff --git a/nms-patches/PacketPlayInCloseWindow.patch b/nms-patches/PacketPlayInCloseWindow.patch new file mode 100644 index 0000000000..14efaf9ce0 --- /dev/null +++ b/nms-patches/PacketPlayInCloseWindow.patch @@ -0,0 +1,29 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/PacketPlayInCloseWindow.java 2014-11-27 08:59:46.817421336 +1100 ++++ src/main/java/net/minecraft/server/PacketPlayInCloseWindow.java 2014-11-27 08:42:10.168850880 +1100 +@@ -6,6 +6,17 @@ + + public PacketPlayInCloseWindow() {} + ++ // CraftBukkit start ++ @Override ++ public void a(PacketListener pl) { ++ a((PacketListenerPlayIn) pl); ++ } ++ ++ public PacketPlayInCloseWindow(int id) { ++ this.id = id; ++ } ++ // CraftBukkit end ++ + public void a(PacketListenerPlayIn packetlistenerplayin) { + packetlistenerplayin.a(this); + } +@@ -17,8 +28,4 @@ + public void b(PacketDataSerializer packetdataserializer) { + packetdataserializer.writeByte(this.id); + } +- +- public void a(PacketListener packetlistener) { +- this.a((PacketListenerPlayIn) packetlistener); +- } + } diff --git a/nms-patches/PacketStatusListener.patch b/nms-patches/PacketStatusListener.patch new file mode 100644 index 0000000000..b7aad22405 --- /dev/null +++ b/nms-patches/PacketStatusListener.patch @@ -0,0 +1,113 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/PacketStatusListener.java 2014-11-27 08:59:46.817421336 +1100 ++++ src/main/java/net/minecraft/server/PacketStatusListener.java 2014-11-27 08:42:10.168850880 +1100 +@@ -1,5 +1,15 @@ + package net.minecraft.server; + ++// CraftBukkit start ++import com.mojang.authlib.GameProfile; ++import java.net.InetSocketAddress; ++import java.util.Iterator; ++ ++import org.bukkit.craftbukkit.util.CraftIconCache; ++import org.bukkit.entity.Player; ++ ++// CraftBukkit end ++ + public class PacketStatusListener implements PacketStatusInListener { + + private final MinecraftServer minecraftServer; +@@ -13,7 +23,93 @@ + public void a(IChatBaseComponent ichatbasecomponent) {} + + public void a(PacketStatusInStart packetstatusinstart) { +- this.networkManager.handle(new PacketStatusOutServerInfo(this.minecraftServer.aE())); ++ // this.networkManager.handle(new PacketStatusOutServerInfo(this.minecraftServer.aE())); ++ // CraftBukkit start - fire ping event ++ final Object[] players = minecraftServer.getPlayerList().players.toArray(); ++ class ServerListPingEvent extends org.bukkit.event.server.ServerListPingEvent { ++ CraftIconCache icon = minecraftServer.server.getServerIcon(); ++ ++ ServerListPingEvent() { ++ super(((InetSocketAddress) networkManager.getSocketAddress()).getAddress(), minecraftServer.getMotd(), minecraftServer.getPlayerList().getMaxPlayers()); ++ } ++ ++ @Override ++ public void setServerIcon(org.bukkit.util.CachedServerIcon icon) { ++ if (!(icon instanceof CraftIconCache)) { ++ throw new IllegalArgumentException(icon + " was not created by " + org.bukkit.craftbukkit.CraftServer.class); ++ } ++ this.icon = (CraftIconCache) icon; ++ } ++ ++ @Override ++ public Iterator iterator() throws UnsupportedOperationException { ++ return new Iterator() { ++ int i; ++ int ret = Integer.MIN_VALUE; ++ EntityPlayer player; ++ ++ @Override ++ public boolean hasNext() { ++ if (player != null) { ++ return true; ++ } ++ final Object[] currentPlayers = players; ++ for (int length = currentPlayers.length, i = this.i; i < length; i++) { ++ final EntityPlayer player = (EntityPlayer) currentPlayers[i]; ++ if (player != null) { ++ this.i = i + 1; ++ this.player = player; ++ return true; ++ } ++ } ++ return false; ++ } ++ ++ @Override ++ public Player next() { ++ if (!hasNext()) { ++ throw new java.util.NoSuchElementException(); ++ } ++ final EntityPlayer player = this.player; ++ this.player = null; ++ this.ret = this.i - 1; ++ return player.getBukkitEntity(); ++ } ++ ++ @Override ++ public void remove() { ++ final Object[] currentPlayers = players; ++ final int i = this.ret; ++ if (i < 0 || currentPlayers[i] == null) { ++ throw new IllegalStateException(); ++ } ++ currentPlayers[i] = null; ++ } ++ }; ++ } ++ } ++ ++ ServerListPingEvent event = new ServerListPingEvent(); ++ this.minecraftServer.server.getPluginManager().callEvent(event); ++ ++ java.util.List profiles = new java.util.ArrayList(players.length); ++ for (Object player : players) { ++ if (player != null) { ++ profiles.add(((EntityPlayer) player).getProfile()); ++ } ++ } ++ ++ ServerPingPlayerSample playerSample = new ServerPingPlayerSample(event.getMaxPlayers(), profiles.size()); ++ playerSample.a(profiles.toArray(new GameProfile[profiles.size()])); ++ ++ ServerPing ping = new ServerPing(); ++ ping.setFavicon(event.icon.value); ++ ping.setMOTD(new ChatComponentText(event.getMotd())); ++ ping.setPlayerSample(playerSample); ++ ping.setServerInfo(new ServerPingServerData(minecraftServer.getServerModName() + " " + minecraftServer.getVersion(), 47)); // TODO: Update when protocol changes ++ ++ this.networkManager.handle(new PacketStatusOutServerInfo(ping)); ++ // CraftBukkit end + } + + public void a(PacketStatusInPing packetstatusinping) { diff --git a/nms-patches/Path.patch b/nms-patches/Path.patch new file mode 100644 index 0000000000..39db7a87d3 --- /dev/null +++ b/nms-patches/Path.patch @@ -0,0 +1,11 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/Path.java 2014-11-27 08:59:46.849421195 +1100 ++++ src/main/java/net/minecraft/server/Path.java 2014-11-27 08:42:10.088851036 +1100 +@@ -2,7 +2,7 @@ + + public class Path { + +- private PathPoint[] a = new PathPoint[1024]; ++ private PathPoint[] a = new PathPoint[128]; // CraftBukkit - reduce default size + private int b; + + public Path() {} diff --git a/nms-patches/PathfinderGoalBreakDoor.patch b/nms-patches/PathfinderGoalBreakDoor.patch new file mode 100644 index 0000000000..c690fcf577 --- /dev/null +++ b/nms-patches/PathfinderGoalBreakDoor.patch @@ -0,0 +1,15 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/PathfinderGoalBreakDoor.java 2014-11-27 08:59:46.817421336 +1100 ++++ src/main/java/net/minecraft/server/PathfinderGoalBreakDoor.java 2014-11-27 08:42:10.152850911 +1100 +@@ -63,6 +63,12 @@ + } + + if (this.g == 240 && this.a.world.getDifficulty() == EnumDifficulty.HARD) { ++ // CraftBukkit start ++ if (org.bukkit.craftbukkit.event.CraftEventFactory.callEntityBreakDoorEvent(this.a, this.b.getX(), this.b.getY(), this.b.getZ()).isCancelled()) { ++ this.c(); ++ return; ++ } ++ // CraftBukkit end + this.a.world.setAir(this.b); + this.a.world.triggerEffect(1012, this.b, 0); + this.a.world.triggerEffect(2001, this.b, Block.getId(this.c)); diff --git a/nms-patches/PathfinderGoalBreed.patch b/nms-patches/PathfinderGoalBreed.patch new file mode 100644 index 0000000000..50c079731a --- /dev/null +++ b/nms-patches/PathfinderGoalBreed.patch @@ -0,0 +1,23 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/PathfinderGoalBreed.java 2014-11-27 08:59:46.821421318 +1100 ++++ src/main/java/net/minecraft/server/PathfinderGoalBreed.java 2014-11-27 08:42:10.164850887 +1100 +@@ -70,6 +70,11 @@ + EntityAgeable entityageable = this.d.createChild(this.e); + + if (entityageable != null) { ++ // CraftBukkit start - set persistence for tame animals ++ if (entityageable instanceof EntityTameableAnimal && ((EntityTameableAnimal) entityageable).isTamed()) { ++ entityageable.persistent = true; ++ } ++ // CraftBukkit end + EntityHuman entityhuman = this.d.co(); + + if (entityhuman == null && this.e.co() != null) { +@@ -89,7 +94,7 @@ + this.e.cq(); + entityageable.setAgeRaw(-24000); + entityageable.setPositionRotation(this.d.locX, this.d.locY, this.d.locZ, 0.0F, 0.0F); +- this.a.addEntity(entityageable); ++ this.a.addEntity(entityageable, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.BREEDING); // CraftBukkit - added SpawnReason + Random random = this.d.bb(); + + for (int i = 0; i < 7; ++i) { diff --git a/nms-patches/PathfinderGoalDefendVillage.patch b/nms-patches/PathfinderGoalDefendVillage.patch new file mode 100644 index 0000000000..2f2260c34e --- /dev/null +++ b/nms-patches/PathfinderGoalDefendVillage.patch @@ -0,0 +1,11 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/PathfinderGoalDefendVillage.java 2014-11-27 08:59:46.821421318 +1100 ++++ src/main/java/net/minecraft/server/PathfinderGoalDefendVillage.java 2014-11-27 08:42:10.172850872 +1100 +@@ -32,7 +32,7 @@ + } + + public void c() { +- this.a.setGoalTarget(this.b); ++ this.a.setGoalTarget(this.b, org.bukkit.event.entity.EntityTargetEvent.TargetReason.DEFEND_VILLAGE, true); // CraftBukkit - reason + super.c(); + } + } diff --git a/nms-patches/PathfinderGoalEatTile.patch b/nms-patches/PathfinderGoalEatTile.patch new file mode 100644 index 0000000000..88f1cd7997 --- /dev/null +++ b/nms-patches/PathfinderGoalEatTile.patch @@ -0,0 +1,34 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/PathfinderGoalEatTile.java 2014-11-27 08:59:46.821421318 +1100 ++++ src/main/java/net/minecraft/server/PathfinderGoalEatTile.java 2014-11-27 08:42:10.108850996 +1100 +@@ -3,6 +3,11 @@ + import com.google.common.base.Predicate; + import com.google.common.base.Predicates; + ++// CraftBukkit start ++import org.bukkit.craftbukkit.event.CraftEventFactory; ++import org.bukkit.Material; ++// CraftBukkit end ++ + public class PathfinderGoalEatTile extends PathfinderGoal { + + private static final Predicate b = BlockStatePredicate.a((Block) Blocks.TALLGRASS).a(BlockLongGrass.TYPE, Predicates.equalTo(EnumTallGrassType.GRASS)); +@@ -50,7 +55,8 @@ + BlockPosition blockposition = new BlockPosition(this.c.locX, this.c.locY, this.c.locZ); + + if (PathfinderGoalEatTile.b.apply(this.d.getType(blockposition))) { +- if (this.d.getGameRules().getBoolean("mobGriefing")) { ++ // CraftBukkit ++ if (!CraftEventFactory.callEntityChangeBlockEvent(this.c, this.c.world.getWorld().getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ()), Material.AIR, !this.d.getGameRules().getBoolean("mobGriefing")).isCancelled()) { + this.d.setAir(blockposition, false); + } + +@@ -59,7 +65,8 @@ + BlockPosition blockposition1 = blockposition.down(); + + if (this.d.getType(blockposition1).getBlock() == Blocks.GRASS) { +- if (this.d.getGameRules().getBoolean("mobGriefing")) { ++ // CraftBukkit ++ if (!CraftEventFactory.callEntityChangeBlockEvent(this.c, this.c.world.getWorld().getBlockAt(blockposition1.getX(), blockposition1.getY(), blockposition1.getZ()), Material.DIRT, !this.d.getGameRules().getBoolean("mobGriefing")).isCancelled()) { + this.d.triggerEffect(2001, blockposition1, Block.getId(Blocks.GRASS)); + this.d.setTypeAndData(blockposition1, Blocks.DIRT.getBlockData(), 2); + } diff --git a/nms-patches/PathfinderGoalEndermanPickupBlock.patch b/nms-patches/PathfinderGoalEndermanPickupBlock.patch new file mode 100644 index 0000000000..31b450c1bd --- /dev/null +++ b/nms-patches/PathfinderGoalEndermanPickupBlock.patch @@ -0,0 +1,17 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/PathfinderGoalEndermanPickupBlock.java 2014-11-27 08:59:46.825421301 +1100 ++++ src/main/java/net/minecraft/server/PathfinderGoalEndermanPickupBlock.java 2014-11-27 08:42:10.164850887 +1100 +@@ -25,8 +25,12 @@ + Block block = iblockdata.getBlock(); + + if (EntityEnderman.co().contains(block)) { +- this.enderman.setCarried(iblockdata); +- world.setTypeUpdate(blockposition, Blocks.AIR.getBlockData()); ++ // CraftBukkit start - Pickup event ++ if (!org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(this.enderman, this.enderman.world.getWorld().getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ()), org.bukkit.Material.AIR).isCancelled()) { ++ this.enderman.setCarried(iblockdata); ++ world.setTypeUpdate(blockposition, Blocks.AIR.getBlockData()); ++ } ++ // CraftBukkit end + } + + } diff --git a/nms-patches/PathfinderGoalEndermanPlaceBlock.patch b/nms-patches/PathfinderGoalEndermanPlaceBlock.patch new file mode 100644 index 0000000000..e858f0527c --- /dev/null +++ b/nms-patches/PathfinderGoalEndermanPlaceBlock.patch @@ -0,0 +1,15 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/PathfinderGoalEndermanPlaceBlock.java 2014-11-27 08:59:46.825421301 +1100 ++++ src/main/java/net/minecraft/server/PathfinderGoalEndermanPlaceBlock.java 2014-11-27 08:42:10.172850872 +1100 +@@ -25,8 +25,12 @@ + Block block1 = world.getType(blockposition.down()).getBlock(); + + if (this.a(world, blockposition, this.a.getCarried().getBlock(), block, block1)) { ++ // CraftBukkit start - Place event ++ if (!org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(this.a, blockposition.getX(), blockposition.getY(), blockposition.getZ(), this.a.getCarried().getBlock(), this.a.getCarried().getBlock().toLegacyData(this.a.getCarried())).isCancelled()) { + world.setTypeAndData(blockposition, this.a.getCarried(), 3); + this.a.setCarried(Blocks.AIR.getBlockData()); ++ } ++ // CraftBukkit end + } + + } diff --git a/nms-patches/PathfinderGoalGhastAttackTarget.patch b/nms-patches/PathfinderGoalGhastAttackTarget.patch new file mode 100644 index 0000000000..adc48e2b82 --- /dev/null +++ b/nms-patches/PathfinderGoalGhastAttackTarget.patch @@ -0,0 +1,12 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/PathfinderGoalGhastAttackTarget.java 2014-11-27 08:59:46.829421283 +1100 ++++ src/main/java/net/minecraft/server/PathfinderGoalGhastAttackTarget.java 2014-11-27 08:42:10.152850911 +1100 +@@ -43,7 +43,8 @@ + world.a((EntityHuman) null, 1008, new BlockPosition(this.b), 0); + EntityLargeFireball entitylargefireball = new EntityLargeFireball(world, this.b, d2, d3, d4); + +- entitylargefireball.yield = this.b.cd(); ++ // CraftBukkit - set bukkitYield when setting explosionpower ++ entitylargefireball.bukkitYield = entitylargefireball.yield = this.b.cd(); + entitylargefireball.locX = this.b.locX + vec3d.a * d1; + entitylargefireball.locY = this.b.locY + (double) (this.b.length / 2.0F) + 0.5D; + entitylargefireball.locZ = this.b.locZ + vec3d.c * d1; diff --git a/nms-patches/PathfinderGoalHurtByTarget.patch b/nms-patches/PathfinderGoalHurtByTarget.patch new file mode 100644 index 0000000000..c0763af1b4 --- /dev/null +++ b/nms-patches/PathfinderGoalHurtByTarget.patch @@ -0,0 +1,19 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/PathfinderGoalHurtByTarget.java 2014-11-27 08:59:46.829421283 +1100 ++++ src/main/java/net/minecraft/server/PathfinderGoalHurtByTarget.java 2014-11-27 08:42:10.156850903 +1100 +@@ -23,7 +23,7 @@ + } + + public void c() { +- this.e.setGoalTarget(this.e.getLastDamager()); ++ this.e.setGoalTarget(this.e.getLastDamager(), org.bukkit.event.entity.EntityTargetEvent.TargetReason.TARGET_ATTACKED_NEARBY_ENTITY, true); // CraftBukkit - reason + this.b = this.e.bd(); + if (this.a) { + double d0 = this.f(); +@@ -58,6 +58,6 @@ + } + + protected void a(EntityCreature entitycreature, EntityLiving entityliving) { +- entitycreature.setGoalTarget(entityliving); ++ entitycreature.setGoalTarget(entityliving, org.bukkit.event.entity.EntityTargetEvent.TargetReason.TARGET_ATTACKED_NEARBY_ENTITY, true); // CraftBukkit - reason + } + } diff --git a/nms-patches/PathfinderGoalMakeLove.patch b/nms-patches/PathfinderGoalMakeLove.patch new file mode 100644 index 0000000000..ce58bcfe0b --- /dev/null +++ b/nms-patches/PathfinderGoalMakeLove.patch @@ -0,0 +1,11 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/PathfinderGoalMakeLove.java 2014-11-27 08:59:46.829421283 +1100 ++++ src/main/java/net/minecraft/server/PathfinderGoalMakeLove.java 2014-11-27 08:42:10.140850934 +1100 +@@ -87,7 +87,7 @@ + this.b.o(false); + entityvillager.setAgeRaw(-24000); + entityvillager.setPositionRotation(this.b.locX, this.b.locY, this.b.locZ, 0.0F, 0.0F); +- this.d.addEntity(entityvillager); ++ this.d.addEntity(entityvillager, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.BREEDING); // CraftBukkit - added SpawnReason + this.d.broadcastEntityEffect(entityvillager, (byte) 12); + } + } diff --git a/nms-patches/PathfinderGoalNearestAttackableTarget.patch b/nms-patches/PathfinderGoalNearestAttackableTarget.patch new file mode 100644 index 0000000000..438278b026 --- /dev/null +++ b/nms-patches/PathfinderGoalNearestAttackableTarget.patch @@ -0,0 +1,11 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/PathfinderGoalNearestAttackableTarget.java 2014-11-27 08:59:46.833421266 +1100 ++++ src/main/java/net/minecraft/server/PathfinderGoalNearestAttackableTarget.java 2014-11-27 08:42:10.168850880 +1100 +@@ -48,7 +48,7 @@ + } + + public void c() { +- this.e.setGoalTarget(this.d); ++ this.e.setGoalTarget(this.d, org.bukkit.event.entity.EntityTargetEvent.TargetReason.CLOSEST_PLAYER, true); // Craftbukkit - reason + super.c(); + } + } diff --git a/nms-patches/PathfinderGoalNearestAttackableTargetInsentient.patch b/nms-patches/PathfinderGoalNearestAttackableTargetInsentient.patch new file mode 100644 index 0000000000..fefd3ad8eb --- /dev/null +++ b/nms-patches/PathfinderGoalNearestAttackableTargetInsentient.patch @@ -0,0 +1,11 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/PathfinderGoalNearestAttackableTargetInsentient.java 2014-11-27 08:59:46.833421266 +1100 ++++ src/main/java/net/minecraft/server/PathfinderGoalNearestAttackableTargetInsentient.java 2014-11-27 08:42:10.084851043 +1100 +@@ -54,7 +54,7 @@ + } + + public void c() { +- this.b.setGoalTarget(this.e); ++ this.b.setGoalTarget(this.e, org.bukkit.event.entity.EntityTargetEvent.TargetReason.CLOSEST_ENTITY, true); // CraftBukkit - reason + super.c(); + } + diff --git a/nms-patches/PathfinderGoalOwnerHurtByTarget.patch b/nms-patches/PathfinderGoalOwnerHurtByTarget.patch new file mode 100644 index 0000000000..b8b709f2ba --- /dev/null +++ b/nms-patches/PathfinderGoalOwnerHurtByTarget.patch @@ -0,0 +1,11 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/PathfinderGoalOwnerHurtByTarget.java 2014-11-27 08:59:46.833421266 +1100 ++++ src/main/java/net/minecraft/server/PathfinderGoalOwnerHurtByTarget.java 2014-11-27 08:42:10.096851020 +1100 +@@ -30,7 +30,7 @@ + } + + public void c() { +- this.e.setGoalTarget(this.b); ++ this.e.setGoalTarget(this.b, org.bukkit.event.entity.EntityTargetEvent.TargetReason.TARGET_ATTACKED_OWNER, true); // CraftBukkit - reason + EntityLiving entityliving = this.a.getOwner(); + + if (entityliving != null) { diff --git a/nms-patches/PathfinderGoalOwnerHurtTarget.patch b/nms-patches/PathfinderGoalOwnerHurtTarget.patch new file mode 100644 index 0000000000..6e0843f118 --- /dev/null +++ b/nms-patches/PathfinderGoalOwnerHurtTarget.patch @@ -0,0 +1,11 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/PathfinderGoalOwnerHurtTarget.java 2014-11-27 08:59:46.837421248 +1100 ++++ src/main/java/net/minecraft/server/PathfinderGoalOwnerHurtTarget.java 2014-11-27 08:42:10.144850927 +1100 +@@ -30,7 +30,7 @@ + } + + public void c() { +- this.e.setGoalTarget(this.b); ++ this.e.setGoalTarget(this.b, org.bukkit.event.entity.EntityTargetEvent.TargetReason.OWNER_ATTACKED_TARGET, true); // CraftBukkit - reason + EntityLiving entityliving = this.a.getOwner(); + + if (entityliving != null) { diff --git a/nms-patches/PathfinderGoalPanic.patch b/nms-patches/PathfinderGoalPanic.patch new file mode 100644 index 0000000000..e6b5dc8064 --- /dev/null +++ b/nms-patches/PathfinderGoalPanic.patch @@ -0,0 +1,15 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/PathfinderGoalPanic.java 2014-11-27 08:59:46.837421248 +1100 ++++ src/main/java/net/minecraft/server/PathfinderGoalPanic.java 2014-11-27 08:42:10.084851043 +1100 +@@ -36,6 +36,12 @@ + } + + public boolean b() { ++ // CraftBukkit start - introduce a temporary timeout hack until this is fixed properly ++ if ((this.b.ticksLived - this.b.bd/*getHurtTimestamp*/()) > 100) { ++ this.b.b((EntityLiving) null); ++ return false; ++ } ++ // CraftBukkit end + return !this.b.getNavigation().m(); + } + } diff --git a/nms-patches/PathfinderGoalSelector.patch b/nms-patches/PathfinderGoalSelector.patch new file mode 100644 index 0000000000..e4b9428f3f --- /dev/null +++ b/nms-patches/PathfinderGoalSelector.patch @@ -0,0 +1,32 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/PathfinderGoalSelector.java 2014-11-27 08:59:46.837421248 +1100 ++++ src/main/java/net/minecraft/server/PathfinderGoalSelector.java 2014-11-27 08:42:10.164850887 +1100 +@@ -6,11 +6,15 @@ + import org.apache.logging.log4j.LogManager; + import org.apache.logging.log4j.Logger; + ++import org.bukkit.craftbukkit.util.UnsafeList; // CraftBukkit ++ + public class PathfinderGoalSelector { + + private static final Logger a = LogManager.getLogger(); +- private List b = Lists.newArrayList(); +- private List c = Lists.newArrayList(); ++ // CraftBukkit start - ArrayList -> UnsafeList ++ private List b = new UnsafeList(); ++ private List c = new UnsafeList(); ++ // CraftBukkit end + private final MethodProfiler d; + private int e; + private int f = 3; +@@ -107,9 +111,11 @@ + if (pathfindergoalselectoritem1 != pathfindergoalselectoritem) { + if (pathfindergoalselectoritem.b >= pathfindergoalselectoritem1.b) { + if (!this.a(pathfindergoalselectoritem, pathfindergoalselectoritem1) && this.c.contains(pathfindergoalselectoritem1)) { ++ ((UnsafeList.Itr) iterator).valid = false; // CraftBukkit - mark iterator for reuse + return false; + } + } else if (!pathfindergoalselectoritem1.a.i() && this.c.contains(pathfindergoalselectoritem1)) { ++ ((UnsafeList.Itr) iterator).valid = false; // CraftBukkit - mark iterator for reuse + return false; + } + } diff --git a/nms-patches/PathfinderGoalSilverfishHideInBlock.patch b/nms-patches/PathfinderGoalSilverfishHideInBlock.patch new file mode 100644 index 0000000000..31d6582bc8 --- /dev/null +++ b/nms-patches/PathfinderGoalSilverfishHideInBlock.patch @@ -0,0 +1,14 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/PathfinderGoalSilverfishHideInBlock.java 2014-11-27 08:59:46.841421230 +1100 ++++ src/main/java/net/minecraft/server/PathfinderGoalSilverfishHideInBlock.java 2014-11-27 08:42:10.176850864 +1100 +@@ -51,6 +51,11 @@ + IBlockData iblockdata = world.getType(blockposition); + + if (BlockMonsterEggs.d(iblockdata)) { ++ // CraftBukkit start ++ if (org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(this.silverfish, blockposition.getX(), blockposition.getY(), blockposition.getZ(), Blocks.MONSTER_EGG, Block.getId(BlockMonsterEggs.getById(iblockdata.getBlock().toLegacyData(iblockdata)))).isCancelled()) { ++ return; ++ } ++ // CraftBukkit end + world.setTypeAndData(blockposition, Blocks.MONSTER_EGG.getBlockData().set(BlockMonsterEggs.VARIANT, EnumMonsterEggVarient.a(iblockdata)), 3); + this.silverfish.y(); + this.silverfish.die(); diff --git a/nms-patches/PathfinderGoalSilverfishWakeOthers.patch b/nms-patches/PathfinderGoalSilverfishWakeOthers.patch new file mode 100644 index 0000000000..f8fb184597 --- /dev/null +++ b/nms-patches/PathfinderGoalSilverfishWakeOthers.patch @@ -0,0 +1,14 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/PathfinderGoalSilverfishWakeOthers.java 2014-11-27 08:59:46.841421230 +1100 ++++ src/main/java/net/minecraft/server/PathfinderGoalSilverfishWakeOthers.java 2014-11-27 08:42:10.144850927 +1100 +@@ -36,6 +36,11 @@ + IBlockData iblockdata = world.getType(blockposition1); + + if (iblockdata.getBlock() == Blocks.MONSTER_EGG) { ++ // CraftBukkit start ++ if (org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(this.silverfish, blockposition1.getX(), blockposition1.getY(), blockposition1.getZ(), Blocks.AIR, 0).isCancelled()) { ++ continue; ++ } ++ // CraftBukkit end + if (world.getGameRules().getBoolean("mobGriefing")) { + world.setAir(blockposition1, true); + } else { diff --git a/nms-patches/PathfinderGoalSit.patch b/nms-patches/PathfinderGoalSit.patch new file mode 100644 index 0000000000..f733332142 --- /dev/null +++ b/nms-patches/PathfinderGoalSit.patch @@ -0,0 +1,11 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/PathfinderGoalSit.java 2014-11-27 08:59:46.845421213 +1100 ++++ src/main/java/net/minecraft/server/PathfinderGoalSit.java 2014-11-27 08:42:10.096851020 +1100 +@@ -12,7 +12,7 @@ + + public boolean a() { + if (!this.entity.isTamed()) { +- return false; ++ return this.willSit && this.entity.getGoalTarget() == null; // CraftBukkit - Allow sitting for wild animals + } else if (this.entity.V()) { + return false; + } else if (!this.entity.onGround) { diff --git a/nms-patches/PathfinderGoalTame.patch b/nms-patches/PathfinderGoalTame.patch new file mode 100644 index 0000000000..94aa0e1bf1 --- /dev/null +++ b/nms-patches/PathfinderGoalTame.patch @@ -0,0 +1,31 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/PathfinderGoalTame.java 2014-11-27 08:59:46.845421213 +1100 ++++ src/main/java/net/minecraft/server/PathfinderGoalTame.java 2014-11-27 08:42:10.152850911 +1100 +@@ -45,7 +45,8 @@ + int i = this.entity.getTemper(); + int j = this.entity.getMaxDomestication(); + +- if (j > 0 && this.entity.bb().nextInt(j) < i) { ++ // CraftBukkit - fire EntityTameEvent ++ if (j > 0 && this.entity.bb().nextInt(j) < i && !org.bukkit.craftbukkit.event.CraftEventFactory.callEntityTameEvent(this.entity, (EntityHuman) this.entity.passenger).isCancelled() && this.entity.passenger instanceof EntityHuman) { + this.entity.h((EntityHuman) this.entity.passenger); + this.entity.world.broadcastEntityEffect(this.entity, (byte) 7); + return; +@@ -54,8 +55,16 @@ + this.entity.u(5); + } + +- this.entity.passenger.mount((Entity) null); +- this.entity.passenger = null; ++ // CraftBukkit start - Handle dismounting to account for VehicleExitEvent being fired. ++ if (this.entity.passenger != null) { ++ this.entity.passenger.mount((Entity) null); ++ // If the entity still has a passenger, then a plugin cancelled the event. ++ if (this.entity.passenger != null) { ++ return; ++ } ++ } ++ // this.entity.passenger = null; ++ // CraftBukkit end + this.entity.cU(); + this.entity.world.broadcastEntityEffect(this.entity, (byte) 6); + } diff --git a/nms-patches/PathfinderGoalTargetNearestPlayer.patch b/nms-patches/PathfinderGoalTargetNearestPlayer.patch new file mode 100644 index 0000000000..054d1b3ca6 --- /dev/null +++ b/nms-patches/PathfinderGoalTargetNearestPlayer.patch @@ -0,0 +1,11 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/PathfinderGoalTargetNearestPlayer.java 2014-11-27 08:59:46.845421213 +1100 ++++ src/main/java/net/minecraft/server/PathfinderGoalTargetNearestPlayer.java 2014-11-27 08:42:10.120850973 +1100 +@@ -59,7 +59,7 @@ + } + + public void c() { +- this.b.setGoalTarget(this.e); ++ this.b.setGoalTarget(this.e, org.bukkit.event.entity.EntityTargetEvent.TargetReason.CLOSEST_PLAYER, true); // CraftBukkit - added reason + super.c(); + } + diff --git a/nms-patches/PlayerChunk.patch b/nms-patches/PlayerChunk.patch new file mode 100644 index 0000000000..6170f804b6 --- /dev/null +++ b/nms-patches/PlayerChunk.patch @@ -0,0 +1,104 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/PlayerChunk.java 2014-11-27 08:59:46.849421195 +1100 ++++ src/main/java/net/minecraft/server/PlayerChunk.java 2014-11-27 08:42:10.136850942 +1100 +@@ -3,6 +3,11 @@ + import com.google.common.collect.Lists; + import java.util.List; + ++// CraftBukkit start ++import org.bukkit.craftbukkit.chunkio.ChunkIOExecutor; ++import java.util.HashMap; ++// CraftBukkit end ++ + class PlayerChunk { + + private final List b; +@@ -12,16 +17,26 @@ + private int f; + private long g; + final PlayerChunkMap playerChunkMap; ++ ++ // CraftBukkit start - add fields ++ private final HashMap players = new HashMap(); ++ private boolean loaded = false; ++ private Runnable loadedRunnable = new Runnable() { ++ public void run() { ++ PlayerChunk.this.loaded = true; ++ } ++ }; ++ // CraftBukkit end + + public PlayerChunk(PlayerChunkMap playerchunkmap, int i, int j) { + this.playerChunkMap = playerchunkmap; + this.b = Lists.newArrayList(); + this.dirtyBlocks = new short[64]; + this.location = new ChunkCoordIntPair(i, j); +- playerchunkmap.a().chunkProviderServer.getChunkAt(i, j); ++ playerchunkmap.a().chunkProviderServer.getChunkAt(i, j, loadedRunnable); // CraftBukkit + } + +- public void a(EntityPlayer entityplayer) { ++ public void a(final EntityPlayer entityplayer) { // CraftBukkit - added final to argument + if (this.b.contains(entityplayer)) { + PlayerChunkMap.c().debug("Failed to add player. {} already is in chunk {}, {}", new Object[] { entityplayer, Integer.valueOf(this.location.x), Integer.valueOf(this.location.z)}); + } else { +@@ -30,18 +45,50 @@ + } + + this.b.add(entityplayer); +- entityplayer.chunkCoordIntPairQueue.add(this.location); ++ // CraftBukkit start - use async chunk io ++ Runnable playerRunnable; ++ if (this.loaded) { ++ playerRunnable = null; ++ entityplayer.chunkCoordIntPairQueue.add(this.location); ++ } else { ++ playerRunnable = new Runnable() { ++ public void run() { ++ entityplayer.chunkCoordIntPairQueue.add(PlayerChunk.this.location); ++ } ++ }; ++ this.playerChunkMap.a().chunkProviderServer.getChunkAt(this.location.x, this.location.z, playerRunnable); ++ } ++ ++ this.players.put(entityplayer, playerRunnable); ++ // CraftBukkit end + } + } + + public void b(EntityPlayer entityplayer) { + if (this.b.contains(entityplayer)) { ++ // CraftBukkit start - If we haven't loaded yet don't load the chunk just so we can clean it up ++ if (!this.loaded) { ++ ChunkIOExecutor.dropQueuedChunkLoad(this.playerChunkMap.a(), this.location.x, this.location.z, this.players.get(entityplayer)); ++ this.b.remove(entityplayer); ++ this.players.remove(entityplayer); ++ ++ if (this.b.isEmpty()) { ++ ChunkIOExecutor.dropQueuedChunkLoad(this.playerChunkMap.a(), this.location.x, this.location.z, this.loadedRunnable); ++ long i = (long) this.location.x + 2147483647L | (long) this.location.z + 2147483647L << 32; ++ PlayerChunkMap.b(this.playerChunkMap).remove(i); ++ PlayerChunkMap.c(this.playerChunkMap).remove(this); ++ } ++ ++ return; ++ } ++ // CraftBukkit end + Chunk chunk = PlayerChunkMap.a(this.playerChunkMap).getChunkAt(this.location.x, this.location.z); + + if (chunk.isReady()) { + entityplayer.playerConnection.sendPacket(new PacketPlayOutMapChunk(chunk, true, 0)); + } + ++ this.players.remove(entityplayer); // CraftBukkit + this.b.remove(entityplayer); + entityplayer.chunkCoordIntPairQueue.remove(this.location); + if (this.b.isEmpty()) { +@@ -122,7 +169,7 @@ + if (this.dirtyCount == 64) { + i = this.location.x * 16; + j = this.location.z * 16; +- this.a((Packet) (new PacketPlayOutMapChunk(PlayerChunkMap.a(this.playerChunkMap).getChunkAt(this.location.x, this.location.z), false, this.f))); ++ this.a((Packet) (new PacketPlayOutMapChunk(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) { diff --git a/nms-patches/PlayerChunkMap.patch b/nms-patches/PlayerChunkMap.patch new file mode 100644 index 0000000000..48b86df849 --- /dev/null +++ b/nms-patches/PlayerChunkMap.patch @@ -0,0 +1,208 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/PlayerChunkMap.java 2014-11-27 08:59:46.849421195 +1100 ++++ src/main/java/net/minecraft/server/PlayerChunkMap.java 2014-11-27 08:42:10.152850911 +1100 +@@ -7,17 +7,24 @@ + import org.apache.logging.log4j.LogManager; + import org.apache.logging.log4j.Logger; + ++// CraftBukkit start ++import java.util.Collections; ++import java.util.Queue; ++import java.util.LinkedList; ++// CraftBukkit end ++ + public class PlayerChunkMap { + + private static final Logger a = LogManager.getLogger(); + private final WorldServer world; + private final List managedPlayers = Lists.newArrayList(); + private final LongHashMap d = new LongHashMap(); +- private final List e = Lists.newArrayList(); +- private final List f = Lists.newArrayList(); ++ private final Queue e = new java.util.concurrent.ConcurrentLinkedQueue(); // CraftBukkit ArrayList -> ConcurrentLinkedQueue ++ private final Queue f = new java.util.concurrent.ConcurrentLinkedQueue(); // CraftBukkit ArrayList -> ConcurrentLinkedQueue + private int g; + private long h; + private final int[][] i = new int[][] { { 1, 0}, { 0, 1}, { -1, 0}, { 0, -1}}; ++ private boolean wasNotEmpty; // CraftBukkit - add field + + public PlayerChunkMap(WorldServer worldserver) { + this.world = worldserver; +@@ -35,28 +42,39 @@ + + if (i - this.h > 8000L) { + this.h = i; +- +- for (j = 0; j < this.f.size(); ++j) { +- playerchunk = (PlayerChunk) this.f.get(j); ++ ++ // CraftBukkit start - Use iterator ++ java.util.Iterator iterator = this.f.iterator(); ++ while (iterator.hasNext()) { ++ playerchunk = (PlayerChunk) iterator.next(); + playerchunk.b(); + playerchunk.a(); + } + } else { +- for (j = 0; j < this.e.size(); ++j) { +- playerchunk = (PlayerChunk) this.e.get(j); ++ java.util.Iterator iterator = this.e.iterator(); ++ ++ while (iterator.hasNext()) { ++ playerchunk = (PlayerChunk) iterator.next(); + playerchunk.b(); ++ iterator.remove(); ++ // CraftBukkit end + } + } + +- this.e.clear(); ++ // this.e.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.b(); + } ++ // CraftBukkit start ++ wasNotEmpty = false; ++ } else { ++ wasNotEmpty = true; + } +- ++ // CraftBukkit end + } + + public boolean a(int i, int j) { +@@ -77,6 +95,16 @@ + + return playerchunk; + } ++ ++ // CraftBukkit start - add method ++ 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(BlockPosition blockposition) { + int i = blockposition.getX() >> 4; +@@ -95,13 +123,22 @@ + + entityplayer.d = entityplayer.locX; + entityplayer.e = entityplayer.locZ; ++ ++ // CraftBukkit start - Load nearby chunks first ++ List chunkList = new LinkedList(); + + for (int k = i - this.g; k <= i + this.g; ++k) { + for (int l = j - this.g; l <= j + this.g; ++l) { +- this.a(k, l, true).a(entityplayer); ++ 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); + } +@@ -188,12 +225,13 @@ + int i1 = this.g; + 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)) { +- this.a(l1, i2, true).a(entityplayer); ++ chunksToLoad.add(new ChunkCoordIntPair(l1, i2)); // CraftBukkit + } + + if (!this.a(l1 - j1, i2 - k1, i, j, i1)) { +@@ -209,6 +247,17 @@ + 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 (j1 > 1 || j1 < -1 || k1 > 1 || k1 < -1) { ++ Collections.sort(entityplayer.chunkCoordIntPairQueue, new ChunkCoordComparator(entityplayer)); ++ } ++ // CraftBukkit end + } + } + } +@@ -274,11 +323,54 @@ + return playerchunkmap.d; + } + +- static List c(PlayerChunkMap playerchunkmap) { ++ static Queue c(PlayerChunkMap playerchunkmap) { // CraftBukkit List -> Queue + return playerchunkmap.f; + } + +- static List d(PlayerChunkMap playerchunkmap) { ++ static Queue d(PlayerChunkMap playerchunkmap) { // CraftBukkit List -> Queue + return playerchunkmap.e; + } ++ ++ // 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/nms-patches/PlayerConnection.patch b/nms-patches/PlayerConnection.patch new file mode 100644 index 0000000000..577557e685 --- /dev/null +++ b/nms-patches/PlayerConnection.patch @@ -0,0 +1,1458 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/PlayerConnection.java 2014-11-27 08:59:46.853421177 +1100 ++++ src/main/java/net/minecraft/server/PlayerConnection.java 2014-11-27 08:42:10.148850918 +1100 +@@ -16,6 +16,48 @@ + import org.apache.logging.log4j.LogManager; + import org.apache.logging.log4j.Logger; + ++// CraftBukkit start ++import java.util.concurrent.ExecutionException; ++import java.util.concurrent.atomic.AtomicIntegerFieldUpdater; ++import java.util.HashSet; ++ ++import org.bukkit.craftbukkit.entity.CraftPlayer; ++import org.bukkit.craftbukkit.event.CraftEventFactory; ++import org.bukkit.craftbukkit.inventory.CraftInventoryView; ++import org.bukkit.craftbukkit.inventory.CraftItemStack; ++import org.bukkit.craftbukkit.util.CraftChatMessage; ++import org.bukkit.craftbukkit.util.LazyPlayerSet; ++import org.bukkit.craftbukkit.util.Waitable; ++ ++import org.bukkit.Location; ++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.inventory.ClickType; ++import org.bukkit.event.inventory.CraftItemEvent; ++import org.bukkit.event.inventory.InventoryAction; ++import org.bukkit.event.inventory.InventoryClickEvent; ++import org.bukkit.event.inventory.InventoryCreativeEvent; ++import org.bukkit.event.inventory.InventoryType.SlotType; ++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.PlayerInteractAtEntityEvent; ++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.PlayerToggleFlightEvent; ++import org.bukkit.event.player.PlayerToggleSneakEvent; ++import org.bukkit.event.player.PlayerToggleSprintEvent; ++import org.bukkit.inventory.CraftingInventory; ++import org.bukkit.inventory.InventoryView; ++import org.bukkit.util.NumberConversions; ++// CraftBukkit end ++ + public class PlayerConnection implements PacketListenerPlayIn, IUpdatePlayerListBox { + + private static final Logger c = LogManager.getLogger(); +@@ -29,13 +71,17 @@ + private int i; + private long j; + private long k; +- private int chatThrottle; ++ // CraftBukkit start - multithreaded fields ++ private volatile int chatThrottle; ++ private static final AtomicIntegerFieldUpdater chatSpamField = AtomicIntegerFieldUpdater.newUpdater(PlayerConnection.class, "chatThrottle"); ++ // CraftBukkit end + private int m; + private IntHashMap n = new IntHashMap(); + private double o; + private double p; + private double q; + public boolean checkMovement = true; ++ private boolean processedDisconnect; // CraftBukkit - added + + public PlayerConnection(MinecraftServer minecraftserver, NetworkManager networkmanager, EntityPlayer entityplayer) { + this.minecraftServer = minecraftserver; +@@ -43,7 +89,37 @@ + networkmanager.a((PacketListener) this); + this.player = entityplayer; + entityplayer.playerConnection = this; ++ ++ // CraftBukkit start - add fields and methods ++ 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 SURVIVAL_PLACE_DISTANCE_SQUARED = 6 * 6; ++ private static final int CREATIVE_PLACE_DISTANCE_SQUARED = 7 * 7; ++ ++ // 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 PacketPlayOutBlockPlace hack :( ++ Long lastPacket; ++ ++ // Store the last block right clicked and what type it was ++ private Item 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, 104, 105, 115, 117, 118, 119, 125, 127, 132, 140, 141, 142, 144)); // TODO: Check after every update. ++ // CraftBukkit end + + public void c() { + this.h = false; +@@ -57,9 +133,14 @@ + } + + this.minecraftServer.methodProfiler.b(); ++ // CraftBukkit start ++ for (int spam; (spam = this.chatThrottle) > 0 && !chatSpamField.compareAndSet(this, spam, spam - 1); ) ; ++ /* Use thread-safe field access instead + if (this.chatThrottle > 0) { + --this.chatThrottle; + } ++ */ ++ // CraftBukkit end + + if (this.m > 0) { + --this.m; +@@ -76,11 +157,27 @@ + } + + public void disconnect(String s) { ++ // CraftBukkit start - fire PlayerKickEvent ++ String leaveMessage = EnumChatFormat.YELLOW + this.player.getName() + " 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 + ChatComponentText chatcomponenttext = new ChatComponentText(s); + + this.networkManager.a(new PacketPlayOutKickDisconnect(chatcomponenttext), new PlayerConnectionFuture(this, chatcomponenttext), new GenericFutureListener[0]); + this.networkManager.k(); +- Futures.getUnchecked(this.minecraftServer.postToMainThread(new PlayerConnectionDisconnector(this))); ++ this.minecraftServer.postToMainThread(new PlayerConnectionDisconnector(this)); // CraftBukkit - Don't wait + } + + public void a(PacketPlayInSteerVehicle packetplayinsteervehicle) { +@@ -90,6 +187,13 @@ + + public void a(PacketPlayInFlying packetplayinflying) { + PlayerConnectionUtils.ensureMainThread(packetplayinflying, this, this.player.u()); ++ // CraftBukkit start - Check for NaN ++ if (Double.isNaN(packetplayinflying.x) || Double.isNaN(packetplayinflying.y) || Double.isNaN(packetplayinflying.z)) { ++ c.warn(player.getName() + " was caught trying to crash the server with an invalid position."); ++ getPlayer().kickPlayer("Nope!"); ++ return; ++ } ++ // CraftBukkit end + WorldServer worldserver = this.minecraftServer.getWorldServer(this.player.dimension); + + this.h = true; +@@ -108,8 +212,65 @@ + this.checkMovement = true; + } + } ++ // CraftBukkit start - fire PlayerMoveEvent ++ 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 (packetplayinflying.hasPos && !(packetplayinflying.hasPos && packetplayinflying.y == -999.0D)) { ++ to.setX(packetplayinflying.x); ++ to.setY(packetplayinflying.y); ++ to.setZ(packetplayinflying.z); ++ } ++ ++ // If the packet contains look information then we update the To location with the correct Yaw & Pitch. ++ if (packetplayinflying.hasLook) { ++ to.setYaw(packetplayinflying.yaw); ++ to.setPitch(packetplayinflying.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 PacketPlayOutPosition(from.getX(), from.getY() + 1.6200000047683716D, from.getZ(), from.getYaw(), from.getPitch(), Collections.emptySet())); ++ 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 (this.checkMovement) { ++ if (this.checkMovement && !this.player.dead) { ++ // CraftBukkit end + this.f = this.e; + double d7; + double d8; +@@ -203,12 +364,14 @@ + double d11 = d7 - this.player.locX; + double d12 = d8 - this.player.locY; + double d13 = d9 - this.player.locZ; +- double d14 = Math.min(Math.abs(d11), Math.abs(this.player.motX)); +- double d15 = Math.min(Math.abs(d12), Math.abs(this.player.motY)); +- double d16 = Math.min(Math.abs(d13), Math.abs(this.player.motZ)); ++ // CraftBukkit start - min to max ++ double d14 = Math.max(Math.abs(d11), Math.abs(this.player.motX)); ++ double d15 = Math.max(Math.abs(d12), Math.abs(this.player.motY)); ++ double d16 = Math.max(Math.abs(d13), Math.abs(this.player.motZ)); ++ // CraftBukkit end + double d17 = d14 * d14 + d15 * d15 + d16 * d16; + +- if (d17 > 100.0D && (!this.minecraftServer.S() || !this.minecraftServer.R().equals(this.player.getName()))) { ++ if (d17 > 100.0D && this.checkMovement && (!this.minecraftServer.S() || !this.minecraftServer.R().equals(this.player.getName()))) { // CraftBukkit - Added this.checkMovement condition to solve this check being triggered by teleports + PlayerConnection.c.warn(this.player.getName() + " moved too quickly! " + d11 + "," + d12 + "," + d13 + " (" + d14 + ", " + d15 + ", " + d16 + ")"); + this.a(this.o, this.p, this.q, this.player.yaw, this.player.pitch); + return; +@@ -281,6 +444,49 @@ + } + + public void a(double d0, double d1, double d2, float f, float f1, Set set) { ++ // 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, set); ++ } ++ ++ public void teleport(Location dest) { ++ teleport(dest, Collections.emptySet()); ++ } ++ ++ public void teleport(Location dest, Set set) { ++ 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.o = d0; + this.p = d1; +@@ -314,32 +520,49 @@ + + public void a(PacketPlayInBlockDig packetplayinblockdig) { + PlayerConnectionUtils.ensureMainThread(packetplayinblockdig, this, this.player.u()); ++ if (this.player.dead) return; // CraftBukkit + WorldServer worldserver = this.minecraftServer.getWorldServer(this.player.dimension); + BlockPosition blockposition = packetplayinblockdig.a(); + + this.player.z(); ++ // CraftBukkit start + switch (SwitchHelperCommandActionType.a[packetplayinblockdig.c().ordinal()]) { +- case 1: ++ case 1: // DROP_ITEM + if (!this.player.v()) { ++ // limit how quickly items can be dropped ++ // 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) { ++ this.c.warn(this.player.getName() + " dropped their items too quickly!"); ++ this.disconnect("You dropped your items too quickly (Hacking?)"); ++ return; ++ } ++ } ++ // CraftBukkit end + this.player.a(false); + } + + return; + +- case 2: ++ case 2: // DROP_ALL_ITEMS + if (!this.player.v()) { + this.player.a(true); + } + + return; + +- case 3: ++ case 3: // RELEASE_USE_ITEM + this.player.bT(); + return; + +- case 4: +- case 5: +- case 6: ++ case 4: // START_DESTROY_BLOCK ++ case 5: // ABORT_DESTROY_BLOCK ++ case 6: // STOP_DESTROY_BLOCK + double d0 = this.player.locX - ((double) blockposition.getX() + 0.5D); + double d1 = this.player.locY - ((double) blockposition.getY() + 0.5D) + 1.5D; + double d2 = this.player.locZ - ((double) blockposition.getZ() + 0.5D); +@@ -354,7 +577,15 @@ + if (!this.minecraftServer.a(worldserver, blockposition, this.player) && worldserver.af().a(blockposition)) { + this.player.playerInteractManager.a(blockposition, packetplayinblockdig.b()); + } else { ++ // CraftBukkit start - fire PlayerInteractEvent ++ CraftEventFactory.callPlayerInteractEvent(this.player, Action.LEFT_CLICK_BLOCK, blockposition, packetplayinblockdig.b(), this.player.inventory.getItemInHand()); + this.player.playerConnection.sendPacket(new PacketPlayOutBlockChange(worldserver, blockposition)); ++ // Update any tile entity data for this block ++ TileEntity tileentity = worldserver.getTileEntity(blockposition); ++ if (tileentity != null) { ++ this.player.playerConnection.sendPacket(tileentity.getUpdatePacket()); ++ } ++ // CraftBukkit end + } + } else { + if (packetplayinblockdig.c() == EnumPlayerDigType.STOP_DESTROY_BLOCK) { +@@ -374,11 +605,38 @@ + default: + throw new IllegalArgumentException("Invalid player action"); + } ++ // CraftBukkit end + } + + public void a(PacketPlayInBlockPlace packetplayinblockplace) { + PlayerConnectionUtils.ensureMainThread(packetplayinblockplace, this, this.player.u()); + 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 (packetplayinblockplace.getFace() == 255) { ++ if (packetplayinblockplace.getItemStack() != null && packetplayinblockplace.getItemStack().getItem() == this.lastMaterial && this.lastPacket != null && packetplayinblockplace.timestamp - this.lastPacket < 100) { ++ this.lastPacket = null; ++ return; ++ } ++ } else { ++ this.lastMaterial = packetplayinblockplace.getItemStack() == null ? null : packetplayinblockplace.getItemStack().getItem(); ++ this.lastPacket = packetplayinblockplace.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; + BlockPosition blockposition = packetplayinblockplace.a(); +@@ -390,7 +648,18 @@ + return; + } + +- this.player.playerInteractManager.useItem(this.player, worldserver, itemstack); ++ // 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) || itemstack.getItem() == Item.getItemOf(Blocks.WATERLILY); ++ // CraftBukkit end + } else if (blockposition.getY() >= this.minecraftServer.getMaxBuildHeight() - 1 && (enumdirection == EnumDirection.UP || blockposition.getY() >= this.minecraftServer.getMaxBuildHeight())) { + ChatMessage chatmessage = new ChatMessage("build.tooHigh", new Object[] { Integer.valueOf(this.minecraftServer.getMaxBuildHeight())}); + +@@ -398,9 +667,21 @@ + this.player.playerConnection.sendPacket(new PacketPlayOutChat(chatmessage)); + flag = true; + } else { ++ // CraftBukkit start - Check if we can actually do something over this large a distance ++ Location eyeLoc = this.getPlayer().getEyeLocation(); ++ double reachDistance = NumberConversions.square(eyeLoc.getX() - blockposition.getX()) + NumberConversions.square(eyeLoc.getY() - blockposition.getY()) + NumberConversions.square(eyeLoc.getZ() - blockposition.getZ()); ++ if (reachDistance > (this.getPlayer().getGameMode() == org.bukkit.GameMode.CREATIVE ? CREATIVE_PLACE_DISTANCE_SQUARED : SURVIVAL_PLACE_DISTANCE_SQUARED)) { ++ return; ++ } ++ ++ if (!worldserver.af().a(blockposition)) { ++ return; ++ } ++ + if (this.checkMovement && this.player.e((double) blockposition.getX() + 0.5D, (double) blockposition.getY() + 0.5D, (double) blockposition.getZ() + 0.5D) < 64.0D && !this.minecraftServer.a(worldserver, blockposition, this.player) && worldserver.af().a(blockposition)) { +- this.player.playerInteractManager.interact(this.player, worldserver, itemstack, blockposition, enumdirection, packetplayinblockplace.d(), packetplayinblockplace.e(), packetplayinblockplace.f()); ++ always = !this.player.playerInteractManager.interact(this.player, worldserver, itemstack, blockposition, enumdirection, packetplayinblockplace.d(), packetplayinblockplace.e(), packetplayinblockplace.f()); + } ++ // CraftBukkit end + + flag = true; + } +@@ -423,7 +704,8 @@ + + this.player.activeContainer.b(); + this.player.g = false; +- if (!ItemStack.matches(this.player.inventory.getItemInHand(), packetplayinblockplace.getItemStack())) { ++ // 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(), packetplayinblockplace.getItemStack()) || always) { + this.sendPacket(new PacketPlayOutSetSlot(this.player.activeContainer.windowId, slot.rawSlotIndex, this.player.inventory.getItemInHand())); + } + } +@@ -437,8 +719,8 @@ + WorldServer[] aworldserver = this.minecraftServer.worldServer; + int i = aworldserver.length; + +- for (int j = 0; j < i; ++j) { +- WorldServer worldserver = aworldserver[j]; ++ // CraftBukkit - use the worlds array list ++ for (WorldServer worldserver : minecraftServer.worlds) { + + if (worldserver != null) { + entity = packetplayinspectate.a(worldserver); +@@ -455,6 +737,7 @@ + WorldServer worldserver1 = this.player.u(); + WorldServer worldserver2 = (WorldServer) entity.world; + ++ /* CraftBukkit start - replace with bukkit handling for multi-world + this.player.dimension = entity.dimension; + this.sendPacket(new PacketPlayOutRespawn(this.player.dimension, worldserver1.getDifficulty(), worldserver1.getWorldData().getType(), this.player.playerInteractManager.getGameMode())); + worldserver1.removeEntity(this.player); +@@ -472,6 +755,9 @@ + this.player.playerInteractManager.a(worldserver2); + this.minecraftServer.getPlayerList().b(this.player, worldserver2); + this.minecraftServer.getPlayerList().updateClient(this.player); ++ */ ++ this.player.getBukkitEntity().teleport(entity.getBukkitEntity()); ++ // CraftBukkit end + } else { + this.player.enderTeleportTo(entity.locX, entity.locY, entity.locZ); + } +@@ -483,14 +769,29 @@ + public void a(PacketPlayInResourcePackStatus packetplayinresourcepackstatus) {} + + public void a(IChatBaseComponent ichatbasecomponent) { +- PlayerConnection.c.info(this.player.getName() + " lost connection: " + ichatbasecomponent); ++ // CraftBukkit start - Rarely it would send a disconnect line twice ++ if (this.processedDisconnect) { ++ return; ++ } else { ++ this.processedDisconnect = true; ++ } ++ // CraftBukkit end ++ c.info(this.player.getName() + " lost connection: " + ichatbasecomponent.c()); // CraftBukkit - Don't toString the component + this.minecraftServer.aF(); ++ // CraftBukkit start - Replace vanilla quit message handling with our own. ++ /* + ChatMessage chatmessage = new ChatMessage("multiplayer.player.left", new Object[] { this.player.getScoreboardDisplayName()}); + + chatmessage.getChatModifier().setColor(EnumChatFormat.YELLOW); + this.minecraftServer.getPlayerList().sendMessage(chatmessage); ++ */ ++ + this.player.q(); +- this.minecraftServer.getPlayerList().disconnect(this.player); ++ String quitMessage = this.minecraftServer.getPlayerList().disconnect(this.player); ++ if ((quitMessage != null) && (quitMessage.length() > 0)) { ++ this.minecraftServer.getPlayerList().sendMessage(CraftChatMessage.fromString(quitMessage)); ++ } ++ // CraftBukkit end + if (this.minecraftServer.S() && this.player.getName().equals(this.minecraftServer.R())) { + PlayerConnection.c.info("Stopping singleplayer server as player logged out"); + this.minecraftServer.safeShutdown(); +@@ -511,6 +812,15 @@ + return; + } + } ++ ++ // CraftBukkit start ++ if (packet == null) { ++ return; ++ } else if (packet instanceof PacketPlayOutSpawnPosition) { ++ PacketPlayOutSpawnPosition packet6 = (PacketPlayOutSpawnPosition) packet; ++ this.player.compassTarget = new Location(this.getPlayer().getWorld(), packet6.position.getX(), packet6.position.getY(), packet6.position.getZ()); ++ } ++ // CraftBukkit end + + try { + this.networkManager.handle(packet); +@@ -524,18 +834,34 @@ + } + + public void a(PacketPlayInHeldItemSlot packetplayinhelditemslot) { ++ // CraftBukkit start ++ if (this.player.dead) return; + PlayerConnectionUtils.ensureMainThread(packetplayinhelditemslot, this, this.player.u()); + if (packetplayinhelditemslot.a() >= 0 && packetplayinhelditemslot.a() < PlayerInventory.getHotbarSize()) { ++ PlayerItemHeldEvent event = new PlayerItemHeldEvent(this.getPlayer(), this.player.inventory.itemInHandIndex, packetplayinhelditemslot.a()); ++ this.server.getPluginManager().callEvent(event); ++ if (event.isCancelled()) { ++ this.sendPacket(new PacketPlayOutHeldItemSlot(this.player.inventory.itemInHandIndex)); ++ this.player.z(); // RENAME ++ return; ++ } ++ // CraftBukkit end + this.player.inventory.itemInHandIndex = packetplayinhelditemslot.a(); + this.player.z(); + } else { + PlayerConnection.c.warn(this.player.getName() + " tried to set an invalid carried item"); ++ this.disconnect("Nope!"); // CraftBukkit + } + } + + public void a(PacketPlayInChat packetplayinchat) { +- PlayerConnectionUtils.ensureMainThread(packetplayinchat, this, this.player.u()); +- if (this.player.getChatFlags() == EnumChatVisibility.HIDDEN) { ++ // CraftBukkit start - async chat ++ boolean isSync = packetplayinchat.a().startsWith("/"); ++ if (packetplayinchat.a().startsWith("/")) { ++ PlayerConnectionUtils.ensureMainThread(packetplayinchat, this, this.player.u()); ++ } ++ // CraftBukkit end ++ if (this.player.dead || this.player.getChatFlags() == EnumChatVisibility.HIDDEN) { // CraftBukkit - dead men tell no tales + ChatMessage chatmessage = new ChatMessage("chat.cannotSend", new Object[0]); + + chatmessage.getChatModifier().setColor(EnumChatFormat.RED); +@@ -548,39 +874,248 @@ + + for (int i = 0; i < s.length(); ++i) { + if (!SharedConstants.isAllowedChatCharacter(s.charAt(i))) { +- this.disconnect("Illegal characters in chat"); ++ // CraftBukkit start - threadsafety ++ if (!isSync) { ++ 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; + } + } + +- if (s.startsWith("/")) { +- this.handleCommand(s); ++ // CraftBukkit start ++ if (isSync) { ++ try { ++ this.minecraftServer.server.playerCommandState = true; ++ this.handleCommand(s); ++ } finally { ++ this.minecraftServer.server.playerCommandState = false; ++ } ++ } else if (s.isEmpty()) { ++ c.warn(this.player.getName() + " tried to send an empty message"); ++ } else if (getPlayer().isConversing()) { ++ getPlayer().acceptConversationInput(s); ++ } else if (this.player.getChatFlags() == EnumChatVisibility.SYSTEM) { // Re-add "Command Only" flag check ++ ChatMessage chatmessage = new ChatMessage("chat.cannotSend", new Object[0]); ++ ++ chatmessage.getChatModifier().setColor(EnumChatFormat.RED); ++ this.sendPacket(new PacketPlayOutChat(chatmessage)); ++ } else if (true) { ++ this.chat(s, true); ++ // CraftBukkit end - the below is for reference. :) + } else { + ChatMessage chatmessage1 = new ChatMessage("chat.type.text", new Object[] { this.player.getScoreboardDisplayName(), s}); + + this.minecraftServer.getPlayerList().sendMessage(chatmessage1, false); + } + +- this.chatThrottle += 20; +- if (this.chatThrottle > 200 && !this.minecraftServer.getPlayerList().isOp(this.player.getProfile())) { +- this.disconnect("disconnect.spam"); +- } ++ // CraftBukkit start - replaced with thread safe throttle ++ // this.chatThrottle += 20; ++ if (chatSpamField.addAndGet(this, 20) > 200 && !this.minecraftServer.getPlayerList().isOp(this.player.getProfile())) { ++ if (!isSync) { ++ 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 ++ } + } + } ++ ++ // CraftBukkit start - add method ++ public void chat(String s, boolean async) { ++ if (s.isEmpty() || this.player.getChatFlags() == EnumChatVisibility.HIDDEN) { ++ return; ++ } ++ ++ if (!async && s.startsWith("/")) { ++ this.handleCommand(s); ++ } else if (this.player.getChatFlags() == EnumChatVisibility.SYSTEM) { ++ // Do nothing, this is coming from a plugin ++ } 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() { ++ org.bukkit.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(CraftChatMessage.fromString(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(CraftChatMessage.fromString(s)); ++ } ++ } else { ++ for (Player recipient : event.getRecipients()) { ++ recipient.sendMessage(s); ++ } ++ } ++ } ++ } ++ } ++ // CraftBukkit end + + private void handleCommand(String s) { +- this.minecraftServer.getCommandHandler().a(this.player, s); ++ // CraftBukkit start - whole method ++ this.c.info(this.player.getName() + " issued server command: " + s); ++ ++ CraftPlayer player = this.getPlayer(); ++ ++ PlayerCommandPreprocessEvent event = new PlayerCommandPreprocessEvent(player, s, new LazyPlayerSet()); ++ this.server.getPluginManager().callEvent(event); ++ ++ if (event.isCancelled()) { ++ return; ++ } ++ ++ try { ++ 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"); ++ java.util.logging.Logger.getLogger(PlayerConnection.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); ++ return; ++ } ++ // this.minecraftServer.getCommandHandler().a(this.player, s); ++ // CraftBukkit end + } + + public void a(PacketPlayInArmAnimation packetplayinarmanimation) { ++ if (this.player.dead) return; // CraftBukkit + PlayerConnectionUtils.ensureMainThread(packetplayinarmanimation, this, this.player.u()); + this.player.z(); ++ // 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.getHeadHeight(); ++ double d2 = this.player.lastZ + (this.player.locZ - this.player.lastZ) * (double) f; ++ Vec3D vec3d = new Vec3D(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, false); ++ ++ if (movingobjectposition == null || movingobjectposition.type != EnumMovingObjectType.BLOCK) { ++ 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.bv(); + } + + public void a(PacketPlayInEntityAction packetplayinentityaction) { + PlayerConnectionUtils.ensureMainThread(packetplayinentityaction, this, this.player.u()); ++ // CraftBukkit start ++ if (this.player.dead) return; ++ switch (packetplayinentityaction.b()) { ++ case START_SNEAKING: ++ case STOP_SNEAKING: ++ PlayerToggleSneakEvent event = new PlayerToggleSneakEvent(this.getPlayer(), packetplayinentityaction.b() == EnumPlayerAction.START_SNEAKING); ++ this.server.getPluginManager().callEvent(event); ++ ++ if (event.isCancelled()) { ++ return; ++ } ++ break; ++ case START_SPRINTING: ++ case STOP_SPRINTING: ++ PlayerToggleSprintEvent e2 = new PlayerToggleSprintEvent(this.getPlayer(), packetplayinentityaction.b() == EnumPlayerAction.START_SPRINTING); ++ this.server.getPluginManager().callEvent(e2); ++ ++ if (e2.isCancelled()) { ++ return; ++ } ++ break; ++ } + this.player.z(); + switch (SwitchHelperCommandActionType.b[packetplayinentityaction.b().ordinal()]) { + case 1: +@@ -601,7 +1136,7 @@ + + case 5: + this.player.a(false, true, true); +- this.checkMovement = false; ++ // this.checkMovement = false; // CraftBukkit - this is handled in teleport + break; + + case 6: +@@ -623,6 +1158,7 @@ + } + + public void a(PacketPlayInUseEntity packetplayinuseentity) { ++ if (this.player.dead) return; // CraftBukkit + PlayerConnectionUtils.ensureMainThread(packetplayinuseentity, this, this.player.u()); + WorldServer worldserver = this.minecraftServer.getWorldServer(this.player.dimension); + Entity entity = packetplayinuseentity.a((World) worldserver); +@@ -637,18 +1173,72 @@ + } + + if (this.player.h(entity) < d0) { ++ ItemStack itemInHand = this.player.inventory.getItemInHand(); // CraftBukkit ++ ++ if (packetplayinuseentity.a() == EnumEntityUseAction.INTERACT ++ || packetplayinuseentity.a() == EnumEntityUseAction.INTERACT_AT) { ++ // CraftBukkit start ++ boolean triggerTagUpdate = itemInHand != null && itemInHand.getItem() == Items.NAME_TAG && entity instanceof EntityInsentient; ++ boolean triggerChestUpdate = itemInHand != null && itemInHand.getItem() == Item.getItemOf(Blocks.CHEST) && entity instanceof EntityHorse; ++ boolean triggerLeashUpdate = itemInHand != null && itemInHand.getItem() == Items.LEAD && entity instanceof EntityInsentient; ++ PlayerInteractEntityEvent event; ++ if (packetplayinuseentity.a() == EnumEntityUseAction.INTERACT) { ++ event = new PlayerInteractEntityEvent((Player) this.getPlayer(), entity.getBukkitEntity()); ++ } else { ++ Vec3D target = packetplayinuseentity.b(); ++ event = new PlayerInteractAtEntityEvent((Player) this.getPlayer(), entity.getBukkitEntity(), new org.bukkit.util.Vector(target.a, target.b, target.c)); ++ } ++ this.server.getPluginManager().callEvent(event); ++ ++ if (triggerLeashUpdate && (event.isCancelled() || this.player.inventory.getItemInHand() == null || this.player.inventory.getItemInHand().getItem() != Items.LEAD)) { ++ // Refresh the current leash state ++ this.sendPacket(new PacketPlayOutAttachEntity(1, entity, ((EntityInsentient) entity).getLeashHolder())); ++ } ++ ++ if (triggerTagUpdate && (event.isCancelled() || this.player.inventory.getItemInHand() == null || this.player.inventory.getItemInHand().getItem() != Items.NAME_TAG)) { ++ // Refresh the current entity metadata ++ this.sendPacket(new PacketPlayOutEntityMetadata(entity.getId(), entity.datawatcher, true)); ++ } ++ if (triggerChestUpdate && (event.isCancelled() || this.player.inventory.getItemInHand() == null || this.player.inventory.getItemInHand().getItem() != Item.getItemOf(Blocks.CHEST))) { ++ this.sendPacket(new PacketPlayOutEntityMetadata(entity.getId(), entity.datawatcher, true)); ++ } ++ ++ if (event.isCancelled()) { ++ return; ++ } ++ // CraftBukkit end ++ } ++ + if (packetplayinuseentity.a() == EnumEntityUseAction.INTERACT) { + this.player.u(entity); ++ ++ // CraftBukkit start ++ if (itemInHand != null && itemInHand.count <= -1) { ++ this.player.updateInventory(this.player.activeContainer); ++ } ++ // CraftBukkit end + } else if (packetplayinuseentity.a() == EnumEntityUseAction.INTERACT_AT) { + entity.a((EntityHuman) this.player, packetplayinuseentity.b()); ++ ++ // CraftBukkit start ++ if (itemInHand != null && itemInHand.count <= -1) { ++ this.player.updateInventory(this.player.activeContainer); ++ } ++ // CraftBukkit end + } else if (packetplayinuseentity.a() == EnumEntityUseAction.ATTACK) { +- if (entity instanceof EntityItem || entity instanceof EntityExperienceOrb || entity instanceof EntityArrow || entity == this.player) { ++ if (entity instanceof EntityItem || entity instanceof EntityExperienceOrb || entity instanceof EntityArrow || (entity == this.player && !player.v())) { // CraftBukkit, RENAME + this.disconnect("Attempting to attack an invalid entity"); + this.minecraftServer.warning("Player " + this.player.getName() + " tried to attack an invalid entity"); + return; + } + + this.player.attack(entity); ++ ++ // CraftBukkit start ++ if (itemInHand != null && itemInHand.count <= -1) { ++ this.player.updateInventory(this.player.activeContainer); ++ } ++ // CraftBukkit end + } + } + } +@@ -663,7 +1253,8 @@ + switch (SwitchHelperCommandActionType.c[enumclientcommand.ordinal()]) { + case 1: + if (this.player.viewingCredits) { +- this.player = this.minecraftServer.getPlayerList().moveToWorld(this.player, 0, true); ++ // this.player = this.minecraftServer.getPlayerList().moveToWorld(this.player, 0, true); ++ this.minecraftServer.getPlayerList().changeDimension(this.player, 0, PlayerTeleportEvent.TeleportCause.END_PORTAL); // CraftBukkit - reroute logic through custom portal management + } else if (this.player.u().getWorldData().isHardcore()) { + if (this.minecraftServer.S() && this.player.getName().equals(this.minecraftServer.R())) { + this.player.playerConnection.disconnect("You have died. Game over, man, it\'s game over!"); +@@ -694,11 +1285,17 @@ + } + + public void a(PacketPlayInCloseWindow packetplayinclosewindow) { ++ if (this.player.dead) return; // CraftBukkit + PlayerConnectionUtils.ensureMainThread(packetplayinclosewindow, this, this.player.u()); ++ ++ CraftEventFactory.handleInventoryCloseEvent(this.player); // CraftBukkit ++ + this.player.p(); + } + + public void a(PacketPlayInWindowClick packetplayinwindowclick) { ++ if (this.player.dead) return; // CraftBukkit ++ + PlayerConnectionUtils.ensureMainThread(packetplayinwindowclick, this, this.player.u()); + this.player.z(); + if (this.player.activeContainer.windowId == packetplayinwindowclick.a() && this.player.activeContainer.c(this.player)) { +@@ -711,7 +1308,263 @@ + + this.player.a(this.player.activeContainer, (List) arraylist); + } else { +- ItemStack itemstack = this.player.activeContainer.clickItem(packetplayinwindowclick.b(), packetplayinwindowclick.c(), packetplayinwindowclick.f(), this.player); ++ // ItemStack itemstack = this.player.activeContainer.clickItem(packetplayinwindowclick.b(), packetplayinwindowclick.c(), packetplayinwindowclick.f(), this.player); ++ // CraftBukkit start - Call InventoryClickEvent ++ if (packetplayinwindowclick.b() < -1 && packetplayinwindowclick.b() != -999) { ++ return; ++ } ++ ++ InventoryView inventory = this.player.activeContainer.getBukkitView(); ++ SlotType type = CraftInventoryView.getSlotType(inventory, packetplayinwindowclick.b()); ++ ++ InventoryClickEvent event = null; ++ ClickType click = ClickType.UNKNOWN; ++ InventoryAction action = InventoryAction.UNKNOWN; ++ ++ ItemStack itemstack = null; ++ ++ if (packetplayinwindowclick.b() == -1) { ++ type = SlotType.OUTSIDE; // override ++ click = packetplayinwindowclick.c() == 0 ? ClickType.WINDOW_BORDER_LEFT : ClickType.WINDOW_BORDER_RIGHT; ++ action = InventoryAction.NOTHING; ++ } else if (packetplayinwindowclick.f() == 0) { ++ if (packetplayinwindowclick.c() == 0) { ++ click = ClickType.LEFT; ++ } else if (packetplayinwindowclick.c() == 1) { ++ click = ClickType.RIGHT; ++ } ++ if (packetplayinwindowclick.c() == 0 || packetplayinwindowclick.c() == 1) { ++ action = InventoryAction.NOTHING; // Don't want to repeat ourselves ++ if (packetplayinwindowclick.b() == -999) { ++ if (player.inventory.getCarried() != null) { ++ action = packetplayinwindowclick.c() == 0 ? InventoryAction.DROP_ALL_CURSOR : InventoryAction.DROP_ONE_CURSOR; ++ } ++ } else { ++ Slot slot = this.player.activeContainer.getSlot(packetplayinwindowclick.b()); ++ if (slot != null) { ++ ItemStack clickedItem = slot.getItem(); ++ ItemStack cursor = player.inventory.getCarried(); ++ if (clickedItem == null) { ++ if (cursor != null) { ++ action = packetplayinwindowclick.c() == 0 ? InventoryAction.PLACE_ALL : InventoryAction.PLACE_ONE; ++ } ++ } else if (slot.isAllowed(player)) { ++ if (cursor == null) { ++ action = packetplayinwindowclick.c() == 0 ? InventoryAction.PICKUP_ALL : InventoryAction.PICKUP_HALF; ++ } else if (slot.isAllowed(cursor)) { ++ if (clickedItem.doMaterialsMatch(cursor) && ItemStack.equals(clickedItem, cursor)) { ++ int toPlace = packetplayinwindowclick.c() == 0 ? cursor.count : 1; ++ toPlace = Math.min(toPlace, clickedItem.getMaxStackSize() - clickedItem.count); ++ toPlace = Math.min(toPlace, slot.inventory.getMaxStackSize() - clickedItem.count); ++ if (toPlace == 1) { ++ action = InventoryAction.PLACE_ONE; ++ } else if (toPlace == cursor.count) { ++ action = InventoryAction.PLACE_ALL; ++ } else if (toPlace < 0) { ++ action = toPlace != -1 ? InventoryAction.PICKUP_SOME : InventoryAction.PICKUP_ONE; // this happens with oversized stacks ++ } else if (toPlace != 0) { ++ action = InventoryAction.PLACE_SOME; ++ } ++ } else if (cursor.count <= slot.getMaxStackSize()) { ++ action = InventoryAction.SWAP_WITH_CURSOR; ++ } ++ } else if (cursor.getItem() == clickedItem.getItem() && (!cursor.usesData() || cursor.getData() == clickedItem.getData()) && ItemStack.equals(cursor, clickedItem)) { ++ if (clickedItem.count >= 0) { ++ if (clickedItem.count + cursor.count <= cursor.getMaxStackSize()) { ++ // As of 1.5, this is result slots only ++ action = InventoryAction.PICKUP_ALL; ++ } ++ } ++ } ++ } ++ } ++ } ++ } ++ } else if (packetplayinwindowclick.f() == 1) { ++ if (packetplayinwindowclick.c() == 0) { ++ click = ClickType.SHIFT_LEFT; ++ } else if (packetplayinwindowclick.c() == 1) { ++ click = ClickType.SHIFT_RIGHT; ++ } ++ if (packetplayinwindowclick.c() == 0 || packetplayinwindowclick.c() == 1) { ++ if (packetplayinwindowclick.b() < 0) { ++ action = InventoryAction.NOTHING; ++ } else { ++ Slot slot = this.player.activeContainer.getSlot(packetplayinwindowclick.b()); ++ if (slot != null && slot.isAllowed(this.player) && slot.hasItem()) { ++ action = InventoryAction.MOVE_TO_OTHER_INVENTORY; ++ } else { ++ action = InventoryAction.NOTHING; ++ } ++ } ++ } ++ } else if (packetplayinwindowclick.f() == 2) { ++ if (packetplayinwindowclick.c() >= 0 && packetplayinwindowclick.c() < 9) { ++ click = ClickType.NUMBER_KEY; ++ Slot clickedSlot = this.player.activeContainer.getSlot(packetplayinwindowclick.b()); ++ if (clickedSlot.isAllowed(player)) { ++ ItemStack hotbar = this.player.inventory.getItem(packetplayinwindowclick.c()); ++ boolean canCleanSwap = hotbar == null || (clickedSlot.inventory == player.inventory && clickedSlot.isAllowed(hotbar)); // the slot will accept the hotbar item ++ if (clickedSlot.hasItem()) { ++ if (canCleanSwap) { ++ action = InventoryAction.HOTBAR_SWAP; ++ } else { ++ int firstEmptySlot = player.inventory.getFirstEmptySlotIndex(); ++ if (firstEmptySlot > -1) { ++ action = InventoryAction.HOTBAR_MOVE_AND_READD; ++ } else { ++ action = InventoryAction.NOTHING; // This is not sane! Mojang: You should test for other slots of same type ++ } ++ } ++ } else if (!clickedSlot.hasItem() && hotbar != null && clickedSlot.isAllowed(hotbar)) { ++ action = InventoryAction.HOTBAR_SWAP; ++ } else { ++ action = InventoryAction.NOTHING; ++ } ++ } else { ++ action = InventoryAction.NOTHING; ++ } ++ // Special constructor for number key ++ event = new InventoryClickEvent(inventory, type, packetplayinwindowclick.b(), click, action, packetplayinwindowclick.c()); ++ } ++ } else if (packetplayinwindowclick.f() == 3) { ++ if (packetplayinwindowclick.c() == 2) { ++ click = ClickType.MIDDLE; ++ if (packetplayinwindowclick.b() == -999) { ++ action = InventoryAction.NOTHING; ++ } else { ++ Slot slot = this.player.activeContainer.getSlot(packetplayinwindowclick.b()); ++ if (slot != null && slot.hasItem() && player.abilities.canInstantlyBuild && player.inventory.getCarried() == null) { ++ action = InventoryAction.CLONE_STACK; ++ } else { ++ action = InventoryAction.NOTHING; ++ } ++ } ++ } else { ++ click = ClickType.UNKNOWN; ++ action = InventoryAction.UNKNOWN; ++ } ++ } else if (packetplayinwindowclick.f() == 4) { ++ if (packetplayinwindowclick.b() >= 0) { ++ if (packetplayinwindowclick.c() == 0) { ++ click = ClickType.DROP; ++ Slot slot = this.player.activeContainer.getSlot(packetplayinwindowclick.b()); ++ if (slot != null && slot.hasItem() && slot.isAllowed(player) && slot.getItem() != null && slot.getItem().getItem() != Item.getItemOf(Blocks.AIR)) { ++ action = InventoryAction.DROP_ONE_SLOT; ++ } else { ++ action = InventoryAction.NOTHING; ++ } ++ } else if (packetplayinwindowclick.c() == 1) { ++ click = ClickType.CONTROL_DROP; ++ Slot slot = this.player.activeContainer.getSlot(packetplayinwindowclick.b()); ++ if (slot != null && slot.hasItem() && slot.isAllowed(player) && slot.getItem() != null && slot.getItem().getItem() != Item.getItemOf(Blocks.AIR)) { ++ action = InventoryAction.DROP_ALL_SLOT; ++ } else { ++ action = InventoryAction.NOTHING; ++ } ++ } ++ } else { ++ // Sane default (because this happens when they are holding nothing. Don't ask why.) ++ click = ClickType.LEFT; ++ if (packetplayinwindowclick.c() == 1) { ++ click = ClickType.RIGHT; ++ } ++ action = InventoryAction.NOTHING; ++ } ++ } else if (packetplayinwindowclick.f() == 5) { ++ itemstack = this.player.activeContainer.clickItem(packetplayinwindowclick.b(), packetplayinwindowclick.c(), 5, this.player); ++ } else if (packetplayinwindowclick.f() == 6) { ++ click = ClickType.DOUBLE_CLICK; ++ action = InventoryAction.NOTHING; ++ if (packetplayinwindowclick.b() >= 0 && this.player.inventory.getCarried() != null) { ++ ItemStack cursor = this.player.inventory.getCarried(); ++ action = InventoryAction.NOTHING; ++ // Quick check for if we have any of the item ++ if (inventory.getTopInventory().contains(org.bukkit.Material.getMaterial(Item.getId(cursor.getItem()))) || inventory.getBottomInventory().contains(org.bukkit.Material.getMaterial(Item.getId(cursor.getItem())))) { ++ action = InventoryAction.COLLECT_TO_CURSOR; ++ } ++ } ++ } ++ // TODO check on updates ++ ++ if (packetplayinwindowclick.f() != 5) { ++ if (click == ClickType.NUMBER_KEY) { ++ event = new InventoryClickEvent(inventory, type, packetplayinwindowclick.b(), click, action, packetplayinwindowclick.c()); ++ } else { ++ event = new InventoryClickEvent(inventory, type, packetplayinwindowclick.b(), click, action); ++ } ++ ++ org.bukkit.inventory.Inventory top = inventory.getTopInventory(); ++ if (packetplayinwindowclick.b() == 0 && top instanceof CraftingInventory) { ++ org.bukkit.inventory.Recipe recipe = ((CraftingInventory) top).getRecipe(); ++ if (recipe != null) { ++ if (click == ClickType.NUMBER_KEY) { ++ event = new CraftItemEvent(recipe, inventory, type, packetplayinwindowclick.b(), click, action, packetplayinwindowclick.c()); ++ } else { ++ event = new CraftItemEvent(recipe, inventory, type, packetplayinwindowclick.b(), click, action); ++ } ++ } ++ } ++ ++ server.getPluginManager().callEvent(event); ++ ++ switch (event.getResult()) { ++ case ALLOW: ++ case DEFAULT: ++ itemstack = this.player.activeContainer.clickItem(packetplayinwindowclick.b(), packetplayinwindowclick.c(), packetplayinwindowclick.f(), this.player); ++ break; ++ case DENY: ++ /* Needs enum constructor in InventoryAction ++ if (action.modifiesOtherSlots()) { ++ ++ } else { ++ if (action.modifiesCursor()) { ++ this.player.playerConnection.sendPacket(new Packet103SetSlot(-1, -1, this.player.inventory.getCarried())); ++ } ++ if (action.modifiesClicked()) { ++ this.player.playerConnection.sendPacket(new Packet103SetSlot(this.player.activeContainer.windowId, packet102windowclick.slot, this.player.activeContainer.getSlot(packet102windowclick.slot).getItem())); ++ } ++ }*/ ++ switch (action) { ++ // Modified other slots ++ case PICKUP_ALL: ++ case MOVE_TO_OTHER_INVENTORY: ++ case HOTBAR_MOVE_AND_READD: ++ case HOTBAR_SWAP: ++ case COLLECT_TO_CURSOR: ++ case UNKNOWN: ++ this.player.updateInventory(this.player.activeContainer); ++ break; ++ // Modified cursor and clicked ++ case PICKUP_SOME: ++ case PICKUP_HALF: ++ case PICKUP_ONE: ++ case PLACE_ALL: ++ case PLACE_SOME: ++ case PLACE_ONE: ++ case SWAP_WITH_CURSOR: ++ this.player.playerConnection.sendPacket(new PacketPlayOutSetSlot(-1, -1, this.player.inventory.getCarried())); ++ this.player.playerConnection.sendPacket(new PacketPlayOutSetSlot(this.player.activeContainer.windowId, packetplayinwindowclick.b(), this.player.activeContainer.getSlot(packetplayinwindowclick.b()).getItem())); ++ break; ++ // Modified clicked only ++ case DROP_ALL_SLOT: ++ case DROP_ONE_SLOT: ++ this.player.playerConnection.sendPacket(new PacketPlayOutSetSlot(this.player.activeContainer.windowId, packetplayinwindowclick.b(), this.player.activeContainer.getSlot(packetplayinwindowclick.b()).getItem())); ++ break; ++ // Modified cursor only ++ case DROP_ALL_CURSOR: ++ case DROP_ONE_CURSOR: ++ case CLONE_STACK: ++ this.player.playerConnection.sendPacket(new PacketPlayOutSetSlot(-1, -1, this.player.inventory.getCarried())); ++ break; ++ // Nothing ++ case NOTHING: ++ break; ++ } ++ return; ++ } ++ } ++ // CraftBukkit end + + if (ItemStack.matches(packetplayinwindowclick.e(), itemstack)) { + this.player.playerConnection.sendPacket(new PacketPlayOutTransaction(packetplayinwindowclick.a(), packetplayinwindowclick.d(), true)); +@@ -772,8 +1625,50 @@ + } + + boolean flag1 = packetplayinsetcreativeslot.a() >= 1 && packetplayinsetcreativeslot.a() < 36 + PlayerInventory.getHotbarSize(); +- boolean flag2 = itemstack == null || itemstack.getItem() != null; ++ // CraftBukkit - Add invalidItems check ++ boolean flag2 = itemstack == null || itemstack.getItem() != null && !invalidItems.contains(Item.getId(itemstack.getItem())); + boolean flag3 = itemstack == null || itemstack.getData() >= 0 && itemstack.count <= 64 && itemstack.count > 0; ++ ++ ++ // CraftBukkit start - Call click event ++ if (flag || (flag1 && !ItemStack.matches(this.player.defaultContainer.getSlot(packetplayinsetcreativeslot.a()).getItem(), packetplayinsetcreativeslot.getItemStack()))) { // Insist on valid slot ++ ++ org.bukkit.entity.HumanEntity player = this.player.getBukkitEntity(); ++ InventoryView inventory = new CraftInventoryView(player, player.getInventory(), this.player.defaultContainer); ++ org.bukkit.inventory.ItemStack item = CraftItemStack.asBukkitCopy(packetplayinsetcreativeslot.getItemStack()); ++ ++ SlotType type = SlotType.QUICKBAR; ++ if (flag) { ++ type = SlotType.OUTSIDE; ++ } else if (packetplayinsetcreativeslot.a() < 36) { ++ if (packetplayinsetcreativeslot.a() >= 5 && packetplayinsetcreativeslot.a() < 9) { ++ type = SlotType.ARMOR; ++ } else { ++ type = SlotType.CONTAINER; ++ } ++ } ++ InventoryCreativeEvent event = new InventoryCreativeEvent(inventory, type, flag ? -999 : packetplayinsetcreativeslot.a(), item); ++ server.getPluginManager().callEvent(event); ++ ++ itemstack = CraftItemStack.asNMSCopy(event.getCursor()); ++ ++ switch (event.getResult()) { ++ case ALLOW: ++ // Plugin cleared the id / stacksize checks ++ flag2 = flag3 = true; ++ break; ++ case DEFAULT: ++ break; ++ case DENY: ++ // Reset the slot ++ if (packetplayinsetcreativeslot.a() >= 0) { ++ this.player.playerConnection.sendPacket(new PacketPlayOutSetSlot(this.player.defaultContainer.windowId, packetplayinsetcreativeslot.a(), this.player.defaultContainer.getSlot(packetplayinsetcreativeslot.a()).getItem())); ++ this.player.playerConnection.sendPacket(new PacketPlayOutSetSlot(-1, -1, null)); ++ } ++ return; ++ } ++ } ++ // CraftBukkit end + + if (flag1 && flag2 && flag3) { + if (itemstack == null) { +@@ -796,6 +1691,7 @@ + } + + public void a(PacketPlayInTransaction packetplayintransaction) { ++ if (this.player.dead) return; // CraftBukkit + PlayerConnectionUtils.ensureMainThread(packetplayintransaction, this, this.player.u()); + Short oshort = (Short) this.n.get(this.player.activeContainer.windowId); + +@@ -806,6 +1702,7 @@ + } + + public void a(PacketPlayInUpdateSign packetplayinupdatesign) { ++ if (this.player.dead) return; // CraftBukkit + PlayerConnectionUtils.ensureMainThread(packetplayinupdatesign, this, this.player.u()); + this.player.z(); + WorldServer worldserver = this.minecraftServer.getWorldServer(this.player.dimension); +@@ -822,10 +1719,24 @@ + + if (!tileentitysign.b() || tileentitysign.c() != this.player) { + this.minecraftServer.warning("Player " + this.player.getName() + " just tried to change non-editable sign"); ++ this.sendPacket(new PacketPlayOutUpdateSign(tileentity.world, packetplayinupdatesign.a(), tileentitysign.lines)); // CraftBukkit + return; + } + +- System.arraycopy(packetplayinupdatesign.b(), 0, tileentitysign.lines, 0, 4); ++ // CraftBukkit start ++ Player player = this.server.getPlayer(this.player); ++ int x = packetplayinupdatesign.a().getX(); ++ int y = packetplayinupdatesign.a().getY(); ++ int z = packetplayinupdatesign.a().getZ(); ++ SignChangeEvent event = new SignChangeEvent((org.bukkit.craftbukkit.block.CraftBlock) player.getWorld().getBlockAt(x, y, z), this.server.getPlayer(this.player), org.bukkit.craftbukkit.block.CraftSign.revertComponents(packetplayinupdatesign.b())); ++ this.server.getPluginManager().callEvent(event); ++ ++ if (!event.isCancelled()) { ++ System.arraycopy(org.bukkit.craftbukkit.block.CraftSign.sanitizeLines(event.getLines()), 0, tileentitysign.lines, 0, 4); ++ tileentitysign.isEditable = false; ++ } ++ // System.arraycopy(packetplayinupdatesign.b(), 0, tileentitysign.lines, 0, 4); ++ // CraftBukkit end + tileentitysign.update(); + worldserver.notify(blockposition); + } +@@ -847,11 +1758,28 @@ + + public void a(PacketPlayInAbilities packetplayinabilities) { + PlayerConnectionUtils.ensureMainThread(packetplayinabilities, this, this.player.u()); +- this.player.abilities.isFlying = packetplayinabilities.isFlying() && this.player.abilities.canFly; ++ // CraftBukkit start ++ if (this.player.abilities.canFly && this.player.abilities.isFlying != packetplayinabilities.isFlying()) { ++ PlayerToggleFlightEvent event = new PlayerToggleFlightEvent(this.server.getPlayer(this.player), packetplayinabilities.isFlying()); ++ this.server.getPluginManager().callEvent(event); ++ if (!event.isCancelled()) { ++ this.player.abilities.isFlying = packetplayinabilities.isFlying(); // Actually set the player's flying status ++ } else { ++ this.player.updateAbilities(); // Tell the player their ability was reverted ++ } ++ } ++ // CraftBukkit end + } + + public void a(PacketPlayInTabComplete packetplayintabcomplete) { + PlayerConnectionUtils.ensureMainThread(packetplayintabcomplete, this, this.player.u()); ++ // CraftBukkit start ++ if (chatSpamField.addAndGet(this, 20) > 200 && !this.minecraftServer.getPlayerList().isOp(this.player.getProfile())) { ++ this.disconnect("disconnect.spam"); ++ return; ++ } ++ // CraftBukkit end ++ + ArrayList arraylist = Lists.newArrayList(); + Iterator iterator = this.minecraftServer.tabCompleteCommand(this.player, packetplayintabcomplete.a(), packetplayintabcomplete.b()).iterator(); + +@@ -891,13 +1819,15 @@ + itemstack1 = this.player.inventory.getItemInHand(); + if (itemstack1 != null) { + if (itemstack.getItem() == Items.WRITABLE_BOOK && itemstack.getItem() == itemstack1.getItem()) { +- itemstack1.a("pages", (NBTBase) itemstack.getTag().getList("pages", 8)); ++ // itemstack1.a("pages", (NBTBase) itemstack.getTag().getList("pages", 8)); ++ CraftEventFactory.handleEditBookEvent(player, itemstack); // CraftBukkit + } + + return; + } + } catch (Exception exception) { + PlayerConnection.c.error("Couldn\'t handle book info", exception); ++ this.disconnect("Invalid book data!"); // CraftBukkit + return; + } finally { + packetdataserializer.release(); +@@ -909,27 +1839,31 @@ + + try { + itemstack = packetdataserializer.i(); +- if (itemstack == null) { +- return; +- } ++ if (itemstack != null) { ++ if (!ItemWrittenBook.b(itemstack.getTag())) { ++ throw new IOException("Invalid book tag!"); ++ } + +- if (!ItemWrittenBook.b(itemstack.getTag())) { +- throw new IOException("Invalid book tag!"); +- } ++ itemstack1 = this.player.inventory.getItemInHand(); ++ if (itemstack1 == null) { ++ return; ++ } + +- itemstack1 = this.player.inventory.getItemInHand(); +- if (itemstack1 != null) { + if (itemstack.getItem() == Items.WRITTEN_BOOK && itemstack1.getItem() == Items.WRITABLE_BOOK) { +- itemstack1.a("author", (NBTBase) (new NBTTagString(this.player.getName()))); +- itemstack1.a("title", (NBTBase) (new NBTTagString(itemstack.getTag().getString("title")))); +- itemstack1.a("pages", (NBTBase) itemstack.getTag().getList("pages", 8)); +- itemstack1.setItem(Items.WRITTEN_BOOK); ++ // CraftBukkit start ++ // itemstack1.a("author", (NBTBase) (new NBTTagString(this.player.getName()))); ++ // itemstack1.a("title", (NBTBase) (new NBTTagString(itemstack.getTag().getString("title")))); ++ // itemstack1.a("pages", (NBTBase) itemstack.getTag().getList("pages", 8)); ++ // itemstack1.setItem(Items.WRITTEN_BOOK); ++ CraftEventFactory.handleEditBookEvent(player, itemstack); ++ // CraftBukkit end + } + + return; + } + } catch (Exception exception1) { + PlayerConnection.c.error("Couldn\'t sign book", exception1); ++ this.disconnect("Invalid book data!"); // CraftBukkit + return; + } finally { + packetdataserializer.release(); +@@ -946,6 +1880,7 @@ + } + } catch (Exception exception2) { + PlayerConnection.c.error("Couldn\'t select trade", exception2); ++ this.disconnect("Invalid trade data!"); // CraftBukkit + } + } else if ("MC|AdvCdm".equals(packetplayincustompayload.a())) { + if (!this.minecraftServer.getEnableCommandBlock()) { +@@ -986,6 +1921,7 @@ + } + } catch (Exception exception3) { + PlayerConnection.c.error("Couldn\'t set command block", exception3); ++ this.disconnect("Invalid CommandBlock data!"); // CraftBukkit + } finally { + packetdataserializer.release(); + } +@@ -1011,6 +1947,7 @@ + } + } catch (Exception exception4) { + PlayerConnection.c.error("Couldn\'t set beacon", exception4); ++ this.disconnect("Invalid beacon data!"); // CraftBukkit + } + } + } else if ("MC|ItemName".equals(packetplayincustompayload.a()) && this.player.activeContainer instanceof ContainerAnvil) { +@@ -1026,6 +1963,27 @@ + containeranvil.a(""); + } + } ++ // CraftBukkit start ++ else if (packetplayincustompayload.a().equals("REGISTER")) { ++ String channels = packetplayincustompayload.b().toString(com.google.common.base.Charsets.UTF_8); ++ for (String channel : channels.split("\0")) { ++ getPlayer().addChannel(channel); ++ } ++ } else if (packetplayincustompayload.a().equals("UNREGISTER")) { ++ String channels = packetplayincustompayload.b().toString(com.google.common.base.Charsets.UTF_8); ++ for (String channel : channels.split("\0")) { ++ getPlayer().removeChannel(channel); ++ } ++ } else { ++ byte[] data = new byte[packetplayincustompayload.b().readableBytes()]; ++ packetplayincustompayload.b().readBytes(data); ++ server.getMessenger().dispatchIncomingMessage(player.getBukkitEntity(), packetplayincustompayload.a(), data); ++ } ++ // CraftBukkit end ++ } + ++ // CraftBukkit start - Add "isDisconnected" method ++ public final boolean isDisconnected() { ++ return !this.player.joining && !NetworkManager.a(this.networkManager).config().isAutoRead(); + } + } diff --git a/nms-patches/PlayerDatFileConverter.patch b/nms-patches/PlayerDatFileConverter.patch new file mode 100644 index 0000000000..a1286509e6 --- /dev/null +++ b/nms-patches/PlayerDatFileConverter.patch @@ -0,0 +1,33 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/PlayerDatFileConverter.java 2014-11-27 08:59:46.857421159 +1100 ++++ src/main/java/net/minecraft/server/PlayerDatFileConverter.java 2014-11-27 08:42:10.168850880 +1100 +@@ -47,6 +47,30 @@ + private void a(File file, String s, String s1) { + File file1 = new File(this.d, s + ".dat"); + File file2 = new File(file, s1 + ".dat"); ++ ++ // CraftBukkit start - Use old file name to seed lastKnownName ++ NBTTagCompound root = null; ++ ++ try { ++ root = NBTCompressedStreamTools.a(new java.io.FileInputStream(file1)); ++ } catch (Exception exception) { ++ exception.printStackTrace(); ++ } ++ ++ if (root != null) { ++ if (!root.hasKey("bukkit")) { ++ root.set("bukkit", new NBTTagCompound()); ++ } ++ NBTTagCompound data = root.getCompound("bukkit"); ++ data.setString("lastKnownName", s); ++ ++ try { ++ NBTCompressedStreamTools.a(root, new java.io.FileOutputStream(file2)); ++ } catch (Exception exception) { ++ exception.printStackTrace(); ++ } ++ } ++ // CraftBukkit end + + NameReferencingFileConverter.a(file); + if (!file1.renameTo(file2)) { diff --git a/nms-patches/PlayerInteractManager.patch b/nms-patches/PlayerInteractManager.patch new file mode 100644 index 0000000000..ac0ab56914 --- /dev/null +++ b/nms-patches/PlayerInteractManager.patch @@ -0,0 +1,289 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/PlayerInteractManager.java 2014-11-27 08:59:46.857421159 +1100 ++++ src/main/java/net/minecraft/server/PlayerInteractManager.java 2014-11-27 08:42:10.108850996 +1100 +@@ -1,5 +1,13 @@ + 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; +@@ -50,7 +58,7 @@ + } + + public void a() { +- ++this.currentTick; ++ this.currentTick = MinecraftServer.currentTick; // CraftBukkit; + float f; + int i; + +@@ -95,6 +103,19 @@ + } + + public void a(BlockPosition blockposition, EnumDirection enumdirection) { ++ // CraftBukkit start ++ PlayerInteractEvent event = CraftEventFactory.callPlayerInteractEvent(this.player, Action.LEFT_CLICK_BLOCK, blockposition, enumdirection, this.player.inventory.getItemInHand()); ++ if (event.isCancelled()) { ++ // Let the client know the block still exists ++ ((EntityPlayer) this.player).playerConnection.sendPacket(new PacketPlayOutBlockChange(this.world, blockposition)); ++ // Update any tile entity data for this block ++ TileEntity tileentity = this.world.getTileEntity(blockposition); ++ if (tileentity != null) { ++ this.player.playerConnection.sendPacket(tileentity.getUpdatePacket()); ++ } ++ return; ++ } ++ // CraftBukkit end + if (this.isCreative()) { + if (!this.world.douseFire((EntityHuman) null, blockposition, enumdirection)) { + this.breakBlock(blockposition); +@@ -121,15 +142,49 @@ + } + } + +- this.world.douseFire((EntityHuman) null, blockposition, enumdirection); ++ // this.world.douseFire((EntityHuman) null, blockposition, enumdirection); // CraftBukkit - Moved down + this.lastDigTick = this.currentTick; + float f = 1.0F; + +- if (block.getMaterial() != Material.AIR) { ++ // 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. ++ IBlockData data = this.world.getType(blockposition); ++ if (block == Blocks.WOODEN_DOOR) { ++ // For some reason *BOTH* the bottom/top part have to be marked updated. ++ boolean bottom = data.get(BlockDoor.HALF) == EnumDoorHalf.LOWER; ++ ((EntityPlayer) this.player).playerConnection.sendPacket(new PacketPlayOutBlockChange(this.world, blockposition)); ++ ((EntityPlayer) this.player).playerConnection.sendPacket(new PacketPlayOutBlockChange(this.world, bottom ? blockposition.up() : blockposition.down())); ++ } else if (block == Blocks.TRAPDOOR) { ++ ((EntityPlayer) this.player).playerConnection.sendPacket(new PacketPlayOutBlockChange(this.world, blockposition)); ++ } ++ } else if (block.getMaterial() != Material.AIR) { + block.attack(this.world, blockposition, this.player); + f = block.getDamage(this.player, this.player.world, blockposition); ++ // Allow fire punching to be blocked ++ this.world.douseFire((EntityHuman) null, blockposition, enumdirection); ++ } ++ ++ 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 PacketPlayOutBlockChange(this.world, blockposition)); ++ } ++ return; ++ } ++ org.bukkit.event.block.BlockDamageEvent blockEvent = CraftEventFactory.callBlockDamageEvent(this.player, blockposition.getX(), blockposition.getY(), blockposition.getZ(), this.player.inventory.getItemInHand(), f >= 1.0f); ++ ++ if (blockEvent.isCancelled()) { ++ // Let the client know the block still exists ++ ((EntityPlayer) this.player).playerConnection.sendPacket(new PacketPlayOutBlockChange(this.world, blockposition)); ++ return; + } + ++ if (blockEvent.getInstaBreak()) { ++ f = 2.0f; ++ } ++ // CraftBukkit end ++ + if (block.getMaterial() != Material.AIR && f >= 1.0F) { + this.breakBlock(blockposition); + } else { +@@ -146,6 +201,7 @@ + + public void a(BlockPosition blockposition) { + if (blockposition.equals(this.f)) { ++ this.currentTick = MinecraftServer.currentTick; // CraftBukkit + int i = this.currentTick - this.lastDigTick; + Block block = this.world.getType(blockposition).getBlock(); + +@@ -163,6 +219,10 @@ + this.j = this.lastDigTick; + } + } ++ // CraftBukkit start - Force block reset to client ++ } else { ++ this.player.playerConnection.sendPacket(new PacketPlayOutBlockChange(this.world, blockposition)); ++ // CraftBukkit end + } + + } +@@ -186,12 +246,72 @@ + } + + public boolean breakBlock(BlockPosition blockposition) { +- if (this.gamemode.d() && this.player.bz() != null && this.player.bz().getItem() instanceof ItemSword) { ++ // CraftBukkit start - fire BlockBreakEvent ++ BlockBreakEvent event = null; ++ ++ if (this.player instanceof EntityPlayer) { ++ org.bukkit.block.Block block = this.world.getWorld().getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ()); ++ ++ // Sword + Creative mode pre-cancel ++ boolean isSwordNoBreak = this.gamemode.d() && this.player.bz() != null && this.player.bz().getItem() instanceof ItemSword; ++ ++ // Tell client the block is gone immediately then process events ++ // Don't tell the client if its a creative sword break because its not broken! ++ if (world.getTileEntity(blockposition) == null && !isSwordNoBreak) { ++ PacketPlayOutBlockChange packet = new PacketPlayOutBlockChange(this.world, blockposition); ++ packet.block = Blocks.AIR.getBlockData(); ++ ((EntityPlayer) this.player).playerConnection.sendPacket(packet); ++ } ++ ++ event = new BlockBreakEvent(block, this.player.getBukkitEntity()); ++ ++ // Sword + Creative mode pre-cancel ++ event.setCancelled(isSwordNoBreak); ++ ++ // Calculate default block experience ++ IBlockData nmsData = this.world.getType(blockposition); ++ Block nmsBlock = nmsData.getBlock(); ++ ++ if (nmsBlock != null && !event.isCancelled() && !this.isCreative() && this.player.b(nmsBlock)) { ++ // Copied from block.a(World world, EntityHuman entityhuman, BlockPosition blockposition, IBlockData iblockdata, TileEntity tileentity) ++ if (!(nmsBlock.G() && EnchantmentManager.hasSilkTouchEnchantment(this.player))) { ++ int data = block.getData(); ++ int bonusLevel = EnchantmentManager.getBonusBlockLootEnchantmentLevel(this.player); ++ ++ event.setExpToDrop(nmsBlock.getExpDrop(this.world, nmsData, bonusLevel)); ++ } ++ } ++ ++ this.world.getServer().getPluginManager().callEvent(event); ++ ++ if (event.isCancelled()) { ++ if (isSwordNoBreak) { ++ return false; ++ } ++ // Let the client know the block still exists ++ ((EntityPlayer) this.player).playerConnection.sendPacket(new PacketPlayOutBlockChange(this.world, blockposition)); ++ // Update any tile entity data for this block ++ TileEntity tileentity = this.world.getTileEntity(blockposition); ++ if (tileentity != null) { ++ this.player.playerConnection.sendPacket(tileentity.getUpdatePacket()); ++ } ++ return false; ++ } ++ } ++ if (false && this.gamemode.d() && this.player.bz() != null && this.player.bz().getItem() instanceof ItemSword) { + return false; + } else { + IBlockData iblockdata = this.world.getType(blockposition); ++ if (iblockdata.getBlock() == Blocks.AIR) return false; // CraftBukkit - A plugin set block to air without cancelling + TileEntity tileentity = this.world.getTileEntity(blockposition); +- ++ ++ // CraftBukkit start - Special case skulls, their item data comes from a tile entity ++ if (iblockdata.getBlock() == Blocks.SKULL && !this.isCreative()) { ++ iblockdata.getBlock().dropNaturally(world, blockposition, iblockdata, 1.0F, 0); ++ return this.c(blockposition); ++ } ++ // CraftBukkit end ++ + if (this.gamemode.c()) { + if (this.gamemode == EnumGamemode.SPECTATOR) { + return false; +@@ -229,7 +349,13 @@ + if (flag && flag1) { + iblockdata.getBlock().a(this.world, this.player, blockposition, iblockdata, tileentity); + } ++ } ++ ++ // CraftBukkit start - Drop event experience ++ if (flag && event != null) { ++ iblockdata.getBlock().dropExperience(this.world, blockposition, event.getExpToDrop()); + } ++ // CraftBukkit end + + return flag; + } +@@ -268,6 +394,7 @@ + } + + public boolean interact(EntityHuman entityhuman, World world, ItemStack itemstack, BlockPosition blockposition, EnumDirection enumdirection, float f, float f1, float f2) { ++ /* CraftBukkit start - whole method + if (this.gamemode == EnumGamemode.SPECTATOR) { + TileEntity tileentity = world.getTileEntity(blockposition); + +@@ -312,6 +439,75 @@ + return itemstack.placeItem(entityhuman, world, blockposition, enumdirection, f, f1, f2); + } + } ++ // Interract event */ ++ IBlockData blockdata = world.getType(blockposition); ++ boolean result = false; ++ if (blockdata.getBlock() != Blocks.AIR) { ++ boolean cancelledBlock = false; ++ ++ if (this.gamemode == EnumGamemode.SPECTATOR) { ++ TileEntity tileentity = world.getTileEntity(blockposition); ++ cancelledBlock = !(tileentity instanceof ITileInventory || tileentity instanceof IInventory); ++ } ++ ++ PlayerInteractEvent event = CraftEventFactory.callPlayerInteractEvent(entityhuman, Action.RIGHT_CLICK_BLOCK, blockposition, enumdirection, itemstack, cancelledBlock); ++ ++ 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 (blockdata.getBlock() instanceof BlockDoor) { ++ boolean bottom = blockdata.get(BlockDoor.HALF) == EnumDoorHalf.LOWER; ++ ((EntityPlayer) entityhuman).playerConnection.sendPacket(new PacketPlayOutBlockChange(world, bottom ? blockposition.up() : blockposition.down())); ++ } ++ result = (event.useItemInHand() != Event.Result.ALLOW); ++ } else if (this.gamemode == EnumGamemode.SPECTATOR) { ++ TileEntity tileentity = world.getTileEntity(blockposition); ++ ++ if (tileentity instanceof ITileInventory) { ++ Block block = world.getType(blockposition).getBlock(); ++ ITileInventory itileinventory = (ITileInventory) tileentity; ++ ++ if (itileinventory instanceof TileEntityChest && block instanceof BlockChest) { ++ itileinventory = ((BlockChest) block).d(world, blockposition); ++ } ++ ++ if (itileinventory != null) { ++ entityhuman.openContainer(itileinventory); ++ return true; ++ } ++ } else if (tileentity instanceof IInventory) { ++ entityhuman.openContainer((IInventory) tileentity); ++ return true; ++ } ++ ++ return false; ++ } else if (!entityhuman.isSneaking() || itemstack == null) { ++ result = blockdata.getBlock().interact(world, blockposition, blockdata, entityhuman, enumdirection, f, f1, f2); ++ } ++ ++ if (itemstack != null && !result) { ++ int j1 = itemstack.getData(); ++ int k1 = itemstack.count; ++ ++ result = itemstack.placeItem(entityhuman, world, blockposition, enumdirection, 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)) { ++ if (itemstack.getItem() instanceof ItemBucket) { ++ this.useItem(entityhuman, world, itemstack); ++ } else { ++ itemstack.placeItem(entityhuman, world, blockposition, enumdirection, f, f1, f2); ++ } ++ } ++ } ++ return result; ++ // CraftBukkit end + } + + public void a(WorldServer worldserver) { diff --git a/nms-patches/PlayerInventory.patch b/nms-patches/PlayerInventory.patch new file mode 100644 index 0000000000..e4b366708f --- /dev/null +++ b/nms-patches/PlayerInventory.patch @@ -0,0 +1,100 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/PlayerInventory.java 2014-11-27 08:59:46.861421142 +1100 ++++ src/main/java/net/minecraft/server/PlayerInventory.java 2014-11-27 08:42:10.172850872 +1100 +@@ -2,6 +2,13 @@ + + import java.util.concurrent.Callable; + ++// CraftBukkit start ++import java.util.List; ++ ++import org.bukkit.craftbukkit.entity.CraftHumanEntity; ++import org.bukkit.entity.HumanEntity; ++// CraftBukkit end ++ + public class PlayerInventory implements IInventory { + + public ItemStack[] items = new ItemStack[36]; +@@ -10,6 +17,39 @@ + public EntityHuman player; + private ItemStack f; + public boolean e; ++ ++ // CraftBukkit start - add fields and methods ++ public List transaction = new java.util.ArrayList(); ++ private int maxStack = MAX_STACK; ++ ++ public ItemStack[] getContents() { ++ return this.items; ++ } ++ ++ public ItemStack[] getArmorContents() { ++ return this.armor; ++ } ++ ++ public void onOpen(CraftHumanEntity who) { ++ transaction.add(who); ++ } ++ ++ public void onClose(CraftHumanEntity who) { ++ transaction.remove(who); ++ } ++ ++ public List getViewers() { ++ return transaction; ++ } ++ ++ public org.bukkit.inventory.InventoryHolder getOwner() { ++ return this.player.getBukkitEntity(); ++ } ++ ++ public void setMaxStackSize(int size) { ++ maxStack = size; ++ } ++ // CraftBukkit end + + public PlayerInventory(EntityHuman entityhuman) { + this.player = entityhuman; +@@ -42,6 +82,22 @@ + + return -1; + } ++ ++ // CraftBukkit start - Watch method above! :D ++ public int canHold(ItemStack itemstack) { ++ int remains = itemstack.count; ++ for (int i = 0; i < this.items.length; ++i) { ++ if (this.items[i] == null) return itemstack.count; ++ ++ // Taken from firstPartial(ItemStack) ++ if (this.items[i] != null && this.items[i].getItem() == itemstack.getItem() && this.items[i].isStackable() && this.items[i].count < this.items[i].getMaxStackSize() && this.items[i].count < this.getMaxStackSize() && (!this.items[i].usesData() || this.items[i].getData() == itemstack.getData()) && ItemStack.equals(this.items[i], itemstack)) { ++ remains -= (this.items[i].getMaxStackSize() < this.getMaxStackSize() ? this.items[i].getMaxStackSize() : this.getMaxStackSize()) - this.items[i].count; ++ } ++ if (remains <= 0) return itemstack.count; ++ } ++ return itemstack.count - remains; ++ } ++ // CraftBukkit end + + public int getFirstEmptySlotIndex() { + for (int i = 0; i < this.items.length; ++i) { +@@ -382,7 +438,7 @@ + } + + public int getMaxStackSize() { +- return 64; ++ return maxStack; // CraftBukkit + } + + public boolean b(Block block) { +@@ -458,6 +514,11 @@ + } + + public ItemStack getCarried() { ++ // CraftBukkit start ++ if (this.f != null && this.f.count == 0) { ++ this.setCarried(null); ++ } ++ // CraftBukkit end + return this.f; + } + diff --git a/nms-patches/PlayerList.patch b/nms-patches/PlayerList.patch new file mode 100644 index 0000000000..f38a5b9d37 --- /dev/null +++ b/nms-patches/PlayerList.patch @@ -0,0 +1,788 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/PlayerList.java 2014-11-27 08:59:46.861421142 +1100 ++++ src/main/java/net/minecraft/server/PlayerList.java 2014-11-27 08:42:10.160850895 +1100 +@@ -18,6 +18,25 @@ + import org.apache.logging.log4j.LogManager; + import org.apache.logging.log4j.Logger; + ++// CraftBukkit start ++import org.bukkit.craftbukkit.CraftServer; ++import org.bukkit.craftbukkit.CraftWorld; ++import org.bukkit.craftbukkit.chunkio.ChunkIOExecutor; ++ ++import org.bukkit.Bukkit; ++import org.bukkit.Location; ++import org.bukkit.TravelAgent; ++import org.bukkit.entity.Player; ++import org.bukkit.event.player.PlayerChangedWorldEvent; ++import org.bukkit.event.player.PlayerPortalEvent; ++import org.bukkit.event.player.PlayerJoinEvent; ++import org.bukkit.event.player.PlayerLoginEvent; ++import org.bukkit.event.player.PlayerQuitEvent; ++import org.bukkit.event.player.PlayerRespawnEvent; ++import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause; ++import org.bukkit.util.Vector; ++// CraftBukkit end ++ + public abstract class PlayerList { + + public static final File a = new File("banned-players.json"); +@@ -27,7 +46,7 @@ + private static final Logger h = LogManager.getLogger(); + private static final SimpleDateFormat i = new SimpleDateFormat("yyyy-MM-dd \'at\' HH:mm:ss z"); + private final MinecraftServer server; +- public final List players = Lists.newArrayList(); ++ public final List players = new java.util.concurrent.CopyOnWriteArrayList(); // CraftBukkit - ArrayList -> CopyOnWriteArrayList: Iterator safety + public final Map f = Maps.newHashMap(); + private final GameProfileBanList k; + private final IpBanList l; +@@ -42,7 +61,15 @@ + private boolean t; + private int u; + ++ // CraftBukkit start ++ private CraftServer cserver; ++ + public PlayerList(MinecraftServer minecraftserver) { ++ this.cserver = minecraftserver.server = new CraftServer(minecraftserver, this); ++ minecraftserver.console = org.bukkit.craftbukkit.command.ColouredConsoleSender.getInstance(); ++ minecraftserver.reader.addCompleter(new org.bukkit.craftbukkit.command.ConsoleCommandCompleter(minecraftserver.server)); ++ // CraftBukkit end ++ + this.k = new GameProfileBanList(PlayerList.a); + this.l = new IpBanList(PlayerList.b); + this.operators = new OpList(PlayerList.c); +@@ -71,7 +98,8 @@ + s1 = networkmanager.getSocketAddress().toString(); + } + +- PlayerList.h.info(entityplayer.getName() + "[" + s1 + "] logged in with entity id " + entityplayer.getId() + " at (" + entityplayer.locX + ", " + entityplayer.locY + ", " + entityplayer.locZ + ")"); ++ // CraftBukkit - Moved message to after join ++ // PlayerList.h.info(entityplayer.getName() + "[" + s1 + "] logged in with entity id " + entityplayer.getId() + " at (" + entityplayer.locX + ", " + entityplayer.locY + ", " + entityplayer.locZ + ")"); + WorldServer worldserver = this.server.getWorldServer(entityplayer.dimension); + WorldData worlddata = worldserver.getWorldData(); + BlockPosition blockposition = worldserver.getSpawn(); +@@ -80,6 +108,7 @@ + PlayerConnection playerconnection = new PlayerConnection(this.server, networkmanager, entityplayer); + + playerconnection.sendPacket(new PacketPlayOutLogin(entityplayer.getId(), entityplayer.playerInteractManager.getGameMode(), worlddata.isHardcore(), worldserver.worldProvider.getDimension(), worldserver.getDifficulty(), this.getMaxPlayers(), worlddata.getType(), worldserver.getGameRules().getBoolean("reducedDebugInfo"))); ++ entityplayer.getBukkitEntity().sendSupportedChannels(); // CraftBukkit + playerconnection.sendPacket(new PacketPlayOutCustomPayload("MC|Brand", (new PacketDataSerializer(Unpooled.buffer())).a(this.getServer().getServerModName()))); + playerconnection.sendPacket(new PacketPlayOutServerDifficulty(worlddata.y(), worlddata.z())); + playerconnection.sendPacket(new PacketPlayOutSpawnPosition(blockposition)); +@@ -89,6 +118,7 @@ + entityplayer.getStatisticManager().updateStatistics(entityplayer); + this.sendScoreboard((ScoreboardServer) worldserver.getScoreboard(), entityplayer); + this.server.aF(); ++ /* CraftBukkit start - login message is handled in the event + ChatMessage chatmessage; + + if (!entityplayer.getName().equalsIgnoreCase(s)) { +@@ -99,7 +129,9 @@ + + chatmessage.getChatModifier().setColor(EnumChatFormat.YELLOW); + this.sendMessage(chatmessage); ++ // CraftBukkit end */ + this.onPlayerJoin(entityplayer); ++ worldserver = server.getWorldServer(entityplayer.dimension); // CraftBukkit - Update in case join event changed it + playerconnection.a(entityplayer.locX, entityplayer.locY, entityplayer.locZ, entityplayer.yaw, entityplayer.pitch); + this.b(entityplayer, worldserver); + if (this.server.getResourcePack().length() > 0) { +@@ -126,6 +158,8 @@ + } + } + ++ // CraftBukkit - Moved from above, added world ++ PlayerList.h.info(entityplayer.getName() + "[" + s1 + "] logged in with entity id " + entityplayer.getId() + " at ([" + entityplayer.world.worldData.getName() + "] " + entityplayer.locX + ", " + entityplayer.locY + ", " + entityplayer.locZ + ")"); + } + + public void sendScoreboard(ScoreboardServer scoreboardserver, EntityPlayer entityplayer) { +@@ -158,6 +192,7 @@ + } + + public void setPlayerFileData(WorldServer[] aworldserver) { ++ if (playerFileData != null) return; // CraftBukkit + this.playerFileData = aworldserver[0].getDataManager().getPlayerFileData(); + aworldserver[0].af().a((IWorldBorderListener) (new WorldBorderListener(this))); + } +@@ -178,7 +213,7 @@ + } + + public NBTTagCompound a(EntityPlayer entityplayer) { +- NBTTagCompound nbttagcompound = this.server.worldServer[0].getWorldData().i(); ++ NBTTagCompound nbttagcompound = this.server.worlds.get(0).getWorldData().i(); // CraftBukkit + NBTTagCompound nbttagcompound1; + + if (entityplayer.getName().equals(this.server.R()) && nbttagcompound != null) { +@@ -205,30 +240,69 @@ + public void onPlayerJoin(EntityPlayer entityplayer) { + this.players.add(entityplayer); + this.f.put(entityplayer.getUniqueID(), entityplayer); +- this.sendAll(new PacketPlayOutPlayerInfo(EnumPlayerInfoAction.ADD_PLAYER, new EntityPlayer[] { entityplayer})); ++ // this.sendAll(new PacketPlayOutPlayerInfo(EnumPlayerInfoAction.ADD_PLAYER, new EntityPlayer[] { entityplayer})); // CraftBukkit - replaced with loop below + WorldServer worldserver = this.server.getWorldServer(entityplayer.dimension); + +- worldserver.addEntity(entityplayer); +- this.a(entityplayer, (WorldServer) null); ++ // CraftBukkit start ++ PlayerJoinEvent playerJoinEvent = new PlayerJoinEvent(cserver.getPlayer(entityplayer), "\u00A7e" + entityplayer.getName() + " joined the game."); ++ cserver.getPluginManager().callEvent(playerJoinEvent); ++ ++ String joinMessage = playerJoinEvent.getJoinMessage(); ++ ++ if (joinMessage != null && joinMessage.length() > 0) { ++ for (IChatBaseComponent line : org.bukkit.craftbukkit.util.CraftChatMessage.fromString(joinMessage)) { ++ server.getPlayerList().sendAll(new PacketPlayOutChat(line)); ++ } ++ } ++ ++ ChunkIOExecutor.adjustPoolSize(getPlayerCount()); ++ // CraftBukkit end ++ ++ // CraftBukkit start - sendAll above replaced with this loop ++ PacketPlayOutPlayerInfo packet = new PacketPlayOutPlayerInfo(EnumPlayerInfoAction.ADD_PLAYER, entityplayer); + + 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); ++ } ++ ++ if (!entityplayer.getBukkitEntity().canSee(entityplayer1.getBukkitEntity())) { ++ continue; ++ } ++ + entityplayer.playerConnection.sendPacket(new PacketPlayOutPlayerInfo(EnumPlayerInfoAction.ADD_PLAYER, new EntityPlayer[] { entityplayer1})); + } ++ // 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 + } + + public void d(EntityPlayer entityplayer) { + entityplayer.u().getPlayerChunkMap().movePlayer(entityplayer); + } + +- public void disconnect(EntityPlayer entityplayer) { ++ public String disconnect(EntityPlayer entityplayer) { // CraftBukkit - return string + entityplayer.b(StatisticList.f); ++ ++ // CraftBukkit start - Quitting must be before we do final save of data, in case plugins need to modify it ++ org.bukkit.craftbukkit.event.CraftEventFactory.handleInventoryCloseEvent(entityplayer); ++ ++ PlayerQuitEvent playerQuitEvent = new PlayerQuitEvent(cserver.getPlayer(entityplayer), "\u00A7e" + entityplayer.getName() + " left the game."); ++ cserver.getPluginManager().callEvent(playerQuitEvent); ++ entityplayer.getBukkitEntity().disconnect(playerQuitEvent.getQuitMessage()); ++ // CraftBukkit end ++ + this.savePlayerFile(entityplayer); + WorldServer worldserver = entityplayer.u(); + +- if (entityplayer.vehicle != null) { ++ if (entityplayer.vehicle != null && !(entityplayer.vehicle instanceof EntityPlayer)) { // CraftBukkit - Don't remove players + worldserver.removeEntity(entityplayer.vehicle); + PlayerList.h.debug("removing player mount"); + } +@@ -238,13 +312,40 @@ + this.players.remove(entityplayer); + this.f.remove(entityplayer.getUniqueID()); + this.o.remove(entityplayer.getUniqueID()); +- this.sendAll(new PacketPlayOutPlayerInfo(EnumPlayerInfoAction.REMOVE_PLAYER, new EntityPlayer[] { entityplayer})); ++ // CraftBukkit start ++ // this.sendAll(new PacketPlayOutPlayerInfo(EnumPlayerInfoAction.REMOVE_PLAYER, new EntityPlayer[] { entityplayer})); ++ PacketPlayOutPlayerInfo packet = new PacketPlayOutPlayerInfo(EnumPlayerInfoAction.REMOVE_PLAYER, entityplayer); ++ for (int i = 0; i < players.size(); i++) { ++ EntityPlayer entityplayer1 = (EntityPlayer) this.players.get(i); ++ ++ if (entityplayer1.getBukkitEntity().canSee(entityplayer.getBukkitEntity())) { ++ entityplayer1.playerConnection.sendPacket(packet); ++ } else { ++ entityplayer1.getBukkitEntity().removeDisconnectingPlayer(entityplayer.getBukkitEntity()); ++ } ++ } ++ // This removes the scoreboard (and player reference) for the specific player in the manager ++ cserver.getScoreboardManager().removePlayer(entityplayer.getBukkitEntity()); ++ // CraftBukkit end ++ ++ ChunkIOExecutor.adjustPoolSize(this.getPlayerCount()); // CraftBukkit ++ ++ return playerQuitEvent.getQuitMessage(); // CraftBukkit + } + +- public String attemptLogin(SocketAddress socketaddress, GameProfile gameprofile) { ++ // CraftBukkit start - Whole method, SocketAddress to LoginListener, added hostname to signature, return EntityPlayer ++ public EntityPlayer attemptLogin(LoginListener loginlistener, GameProfile gameprofile, 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. ++ SocketAddress socketaddress = loginlistener.networkManager.getSocketAddress(); ++ ++ EntityPlayer entity = new EntityPlayer(server, server.getWorldServer(0), gameprofile, new PlayerInteractManager(server.getWorldServer(0))); ++ Player player = entity.getBukkitEntity(); ++ PlayerLoginEvent event = new PlayerLoginEvent(player, hostname, ((java.net.InetSocketAddress) socketaddress).getAddress()); + String s; + +- if (this.k.isBanned(gameprofile)) { ++ if (getProfileBans().isBanned(gameprofile) && !getProfileBans().get(gameprofile).hasExpired()) { + GameProfileBanEntry gameprofilebanentry = (GameProfileBanEntry) this.k.get(gameprofile); + + s = "You are banned from this server!\nReason: " + gameprofilebanentry.getReason(); +@@ -252,10 +353,12 @@ + s = s + "\nYour ban will be removed on " + PlayerList.i.format(gameprofilebanentry.getExpires()); + } + +- return s; ++ // return s; ++ event.disallow(PlayerLoginEvent.Result.KICK_BANNED, s); + } else if (!this.isWhitelisted(gameprofile)) { +- return "You are not white-listed on this server!"; +- } else if (this.l.isBanned(socketaddress)) { ++ // return "You are not white-listed on this server!"; ++ event.disallow(PlayerLoginEvent.Result.KICK_WHITELIST, "You are not white-listed on this server!"); ++ } else if (getIPBans().isBanned(socketaddress) && !getIPBans().get(socketaddress).hasExpired()) { + IpBanEntry ipbanentry = this.l.get(socketaddress); + + s = "Your IP address is banned from this server!\nReason: " + ipbanentry.getReason(); +@@ -263,13 +366,24 @@ + s = s + "\nYour ban will be removed on " + PlayerList.i.format(ipbanentry.getExpires()); + } + +- return s; ++ // return s; ++ event.disallow(PlayerLoginEvent.Result.KICK_BANNED, s); + } else { +- return this.players.size() >= this.maxPlayers ? "The server is full!" : null; ++ // return this.players.size() >= this.maxPlayers ? "The server is full!" : null; ++ if (this.players.size() >= this.maxPlayers) { ++ event.disallow(PlayerLoginEvent.Result.KICK_FULL, "The server is full"); ++ } ++ } ++ ++ cserver.getPluginManager().callEvent(event); ++ if (event.getResult() != PlayerLoginEvent.Result.ALLOWED) { ++ loginlistener.disconnect(event.getKickMessage()); ++ return null; + } ++ return entity; + } + +- public EntityPlayer processLogin(GameProfile gameprofile) { ++ public EntityPlayer processLogin(GameProfile gameprofile, EntityPlayer player) { // CraftBukkit - added EntityPlayer + UUID uuid = EntityHuman.a(gameprofile); + ArrayList arraylist = Lists.newArrayList(); + +@@ -289,6 +403,7 @@ + entityplayer.playerConnection.disconnect("You logged in from another location"); + } + ++ /* CraftBukkit start + Object object; + + if (this.server.W()) { +@@ -298,17 +413,25 @@ + } + + return new EntityPlayer(this.server, this.server.getWorldServer(0), gameprofile, (PlayerInteractManager) object); ++ // */ ++ return player; ++ // CraftBukkit end + } + ++ // CraftBukkit start + public EntityPlayer moveToWorld(EntityPlayer entityplayer, int i, boolean flag) { ++ return this.moveToWorld(entityplayer, i, flag, null, true); ++ } ++ public EntityPlayer moveToWorld(EntityPlayer entityplayer, int i, boolean flag, Location location, boolean avoidSuffocation) { + entityplayer.u().getTracker().untrackPlayer(entityplayer); +- entityplayer.u().getTracker().untrackEntity(entityplayer); ++ // entityplayer.u().getTracker().untrackEntity(entityplayer); // CraftBukkit + entityplayer.u().getPlayerChunkMap().removePlayer(entityplayer); + this.players.remove(entityplayer); + this.server.getWorldServer(entityplayer.dimension).removeEntity(entityplayer); + BlockPosition blockposition = entityplayer.getBed(); + boolean flag1 = entityplayer.isRespawnForced(); + ++ /* CraftBukkit start + entityplayer.dimension = i; + Object object; + +@@ -319,80 +442,270 @@ + } + + EntityPlayer entityplayer1 = new EntityPlayer(this.server, this.server.getWorldServer(entityplayer.dimension), entityplayer.getProfile(), (PlayerInteractManager) object); ++ // */ ++ EntityPlayer entityplayer1 = entityplayer; ++ org.bukkit.World fromWorld = entityplayer.getBukkitEntity().getWorld(); ++ entityplayer.viewingCredits = false; ++ // CraftBukkit end + + entityplayer1.playerConnection = entityplayer.playerConnection; + entityplayer1.copyTo(entityplayer, flag); + entityplayer1.d(entityplayer.getId()); + entityplayer1.o(entityplayer); +- WorldServer worldserver = this.server.getWorldServer(entityplayer.dimension); ++ // WorldServer worldserver = this.server.getWorldServer(entityplayer.dimension); // CraftBukkit - handled later + +- this.a(entityplayer1, entityplayer, worldserver); ++ // this.a(entityplayer1, entityplayer, worldserver); // CraftBukkit - removed + BlockPosition blockposition1; + +- if (blockposition != null) { +- blockposition1 = EntityHuman.getBed(this.server.getWorldServer(entityplayer.dimension), blockposition, flag1); +- if (blockposition1 != null) { +- entityplayer1.setPositionRotation((double) ((float) blockposition1.getX() + 0.5F), (double) ((float) blockposition1.getY() + 0.1F), (double) ((float) blockposition1.getZ() + 0.5F), 0.0F, 0.0F); +- entityplayer1.setRespawnPosition(blockposition, flag1); +- } else { +- entityplayer1.playerConnection.sendPacket(new PacketPlayOutGameStateChange(0, 0.0F)); ++ // CraftBukkit start - fire PlayerRespawnEvent ++ if (location == null) { ++ boolean isBedSpawn = false; ++ CraftWorld cworld = (CraftWorld) this.server.server.getWorld(entityplayer.spawnWorld); ++ if (cworld != null && blockposition != null) { ++ blockposition1 = EntityHuman.getBed(cworld.getHandle(), blockposition, flag1); ++ if (blockposition1 != null) { ++ isBedSpawn = true; ++ location = new Location(cworld, blockposition1.getX() + 0.5, blockposition1.getY(), blockposition1.getZ() + 0.5); ++ } else { ++ entityplayer1.setRespawnPosition(null, true); ++ entityplayer1.playerConnection.sendPacket(new PacketPlayOutGameStateChange(0, 0.0F)); ++ } + } ++ ++ if (location == null) { ++ cworld = (CraftWorld) this.server.server.getWorlds().get(0); ++ blockposition = cworld.getHandle().getSpawn(); ++ location = new Location(cworld, blockposition.getX() + 0.5, blockposition.getY(), blockposition.getZ() + 0.5); ++ } ++ ++ Player respawnPlayer = cserver.getPlayer(entityplayer1); ++ PlayerRespawnEvent respawnEvent = new PlayerRespawnEvent(respawnPlayer, location, isBedSpawn); ++ cserver.getPluginManager().callEvent(respawnEvent); ++ ++ location = respawnEvent.getRespawnLocation(); ++ entityplayer.reset(); ++ } else { ++ location.setWorld(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.getBoundingBox()).isEmpty() && entityplayer1.locY < 256.0D) { ++ while (avoidSuffocation && !worldserver.getCubes(entityplayer1, entityplayer1.getBoundingBox()).isEmpty() && entityplayer1.locY < 256.0D) { // CraftBukkit + entityplayer1.setPosition(entityplayer1.locX, entityplayer1.locY + 1.0D, entityplayer1.locZ); + } + +- entityplayer1.playerConnection.sendPacket(new PacketPlayOutRespawn(entityplayer1.dimension, entityplayer1.world.getDifficulty(), entityplayer1.world.getWorldData().getType(), entityplayer1.playerInteractManager.getGameMode())); ++ // CraftBukkit start ++ byte actualDimension = (byte) (worldserver.getWorld().getEnvironment().getId()); ++ // Force the client to refresh their chunk cache ++ entityplayer1.playerConnection.sendPacket(new PacketPlayOutRespawn((byte) (actualDimension >= 0 ? -1 : 0), worldserver.getDifficulty(), worldserver.getWorldData().getType(), entityplayer.playerInteractManager.getGameMode())); ++ entityplayer1.playerConnection.sendPacket(new PacketPlayOutRespawn(actualDimension, worldserver.getDifficulty(), worldserver.getWorldData().getType(), entityplayer1.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); + blockposition1 = worldserver.getSpawn(); +- entityplayer1.playerConnection.a(entityplayer1.locX, entityplayer1.locY, entityplayer1.locZ, entityplayer1.yaw, entityplayer1.pitch); ++ // entityplayer1.playerConnection.a(entityplayer1.locX, entityplayer1.locY, entityplayer1.locZ, entityplayer1.yaw, entityplayer1.pitch); ++ // CraftBukkit end + entityplayer1.playerConnection.sendPacket(new PacketPlayOutSpawnPosition(blockposition1)); + entityplayer1.playerConnection.sendPacket(new PacketPlayOutExperience(entityplayer1.exp, entityplayer1.expTotal, entityplayer1.expLevel)); + this.b(entityplayer1, worldserver); +- worldserver.getPlayerChunkMap().addPlayer(entityplayer1); +- worldserver.addEntity(entityplayer1); +- this.players.add(entityplayer1); +- this.f.put(entityplayer1.getUniqueID(), entityplayer1); +- entityplayer1.syncInventory(); ++ if (!entityplayer.playerConnection.isDisconnected()) { ++ worldserver.getPlayerChunkMap().addPlayer(entityplayer1); ++ worldserver.addEntity(entityplayer1); ++ this.players.add(entityplayer1); ++ this.f.put(entityplayer1.getUniqueID(), entityplayer1); ++ } ++ // Added from changeDimension ++ updateClient(entityplayer); // Update health, etc... ++ entityplayer.updateAbilities(); ++ for (Object o1 : entityplayer.getEffects()) { ++ MobEffect mobEffect = (MobEffect) o1; ++ entityplayer.playerConnection.sendPacket(new PacketPlayOutEntityEffect(entityplayer.getId(), mobEffect)); ++ } ++ // entityplayer1.syncInventory(); ++ // CraftBukkit end + entityplayer1.setHealth(entityplayer1.getHealth()); ++ ++ // CraftBukkit start ++ // Don't fire on respawn ++ if (fromWorld != location.getWorld()) { ++ PlayerChangedWorldEvent event = new PlayerChangedWorldEvent(entityplayer.getBukkitEntity(), fromWorld); ++ server.server.getPluginManager().callEvent(event); ++ } ++ ++ // Save player file again if they were disconnected ++ if (entityplayer.playerConnection.isDisconnected()) { ++ this.savePlayerFile(entityplayer); ++ } ++ // CraftBukkit end ++ + return entityplayer1; + } + +- public void changeDimension(EntityPlayer entityplayer, int i) { +- int j = entityplayer.dimension; +- WorldServer worldserver = this.server.getWorldServer(entityplayer.dimension); ++ // CraftBukkit start - Replaced the standard handling of portals with a more customised method. ++ public void changeDimension(EntityPlayer entityplayer, int i, TeleportCause cause) { ++ WorldServer exitWorld = null; ++ if (entityplayer.dimension < CraftWorld.CUSTOM_DIMENSION_OFFSET) { // plugins must specify exit from custom Bukkit worlds ++ // only target existing worlds (compensate for allow-nether/allow-end as false) ++ for (WorldServer world : this.server.worlds) { ++ if (world.dimension == i) { ++ exitWorld = world; ++ } ++ } ++ } + +- entityplayer.dimension = i; +- WorldServer worldserver1 = this.server.getWorldServer(entityplayer.dimension); ++ Location enter = entityplayer.getBukkitEntity().getLocation(); ++ Location exit = null; ++ boolean useTravelAgent = false; // don't use agent for custom worlds or return from THE_END ++ if (exitWorld != null) { ++ if ((cause == TeleportCause.END_PORTAL) && (i == 0)) { ++ // THE_END -> NORMAL; use bed if available, otherwise default spawn ++ exit = ((org.bukkit.craftbukkit.entity.CraftPlayer) entityplayer.getBukkitEntity()).getBedSpawnLocation(); ++ if (exit == null || ((CraftWorld) exit.getWorld()).getHandle().dimension != 0) { ++ exit = exitWorld.getWorld().getSpawnLocation(); ++ } ++ } else { ++ // NORMAL <-> NETHER or NORMAL -> THE_END ++ exit = this.calculateTarget(enter, exitWorld); ++ useTravelAgent = true; ++ } ++ } + +- entityplayer.playerConnection.sendPacket(new PacketPlayOutRespawn(entityplayer.dimension, entityplayer.world.getDifficulty(), entityplayer.world.getWorldData().getType(), entityplayer.playerInteractManager.getGameMode())); +- worldserver.removeEntity(entityplayer); +- entityplayer.dead = false; +- this.changeWorld(entityplayer, j, worldserver, worldserver1); +- this.a(entityplayer, worldserver); +- entityplayer.playerConnection.a(entityplayer.locX, entityplayer.locY, entityplayer.locZ, entityplayer.yaw, entityplayer.pitch); +- entityplayer.playerInteractManager.a(worldserver1); +- this.b(entityplayer, worldserver1); +- this.updateClient(entityplayer); +- Iterator iterator = entityplayer.getEffects().iterator(); ++ TravelAgent agent = exit != null ? (TravelAgent) ((CraftWorld) exit.getWorld()).getHandle().getTravelAgent() : org.bukkit.craftbukkit.CraftTravelAgent.DEFAULT; // return arbitrary TA to compensate for implementation dependent plugins ++ PlayerPortalEvent event = new PlayerPortalEvent(entityplayer.getBukkitEntity(), enter, exit, agent, cause); ++ event.useTravelAgent(useTravelAgent); ++ Bukkit.getServer().getPluginManager().callEvent(event); ++ if (event.isCancelled() || event.getTo() == null) { ++ return; ++ } ++ ++ exit = event.useTravelAgent() ? event.getPortalTravelAgent().findOrCreate(event.getTo()) : event.getTo(); ++ if (exit == null) { ++ return; ++ } ++ exitWorld = ((CraftWorld) exit.getWorld()).getHandle(); ++ ++ Vector velocity = entityplayer.getBukkitEntity().getVelocity(); ++ boolean before = exitWorld.chunkProviderServer.forceChunkLoad; ++ exitWorld.chunkProviderServer.forceChunkLoad = true; ++ exitWorld.getTravelAgent().adjustExit(entityplayer, exit, velocity); ++ exitWorld.chunkProviderServer.forceChunkLoad = before; ++ ++ this.moveToWorld(entityplayer, exitWorld.dimension, true, exit, false); // Vanilla doesn't check for suffocation when handling portals, so neither should we ++ if (entityplayer.motX != velocity.getX() || entityplayer.motY != velocity.getY() || entityplayer.motZ != velocity.getZ()) { ++ entityplayer.getBukkitEntity().setVelocity(velocity); ++ } ++ } + +- while (iterator.hasNext()) { +- MobEffect mobeffect = (MobEffect) iterator.next(); ++ public void changeWorld(Entity entity, int i, WorldServer worldserver, WorldServer worldserver1) { ++ // CraftBukkit start - Split into modular functions ++ Location exit = calculateTarget(entity.getBukkitEntity().getLocation(), worldserver1); ++ repositionEntity(entity, exit, true); ++ } ++ ++ // Copy of original changeWorld(Entity, int, WorldServer, WorldServer) method with only location calculation logic ++ public Location calculateTarget(Location enter, World target) { ++ WorldServer worldserver = ((CraftWorld) enter.getWorld()).getHandle(); ++ WorldServer worldserver1 = ((CraftWorld) target.getWorld()).getHandle(); ++ int i = worldserver.dimension; ++ ++ double y = enter.getY(); ++ float yaw = enter.getYaw(); ++ float pitch = enter.getPitch(); ++ double d0 = enter.getX(); ++ double d1 = enter.getZ(); ++ double d2 = 8.0D; ++ /* ++ double d0 = entity.locX; ++ double d1 = entity.locZ; ++ double d2 = 8.0D; ++ float f = entity.yaw; ++ ++ worldserver.methodProfiler.a("moving"); ++ */ ++ if (worldserver1.dimension == -1) { ++ d0 = MathHelper.a(d0 / d2, worldserver1.af().b() + 16.0D, worldserver1.af().d() - 16.0D); ++ d1 = MathHelper.a(d1 / d2, worldserver1.af().c() + 16.0D, worldserver1.af().e() - 16.0D); ++ /* ++ entity.setPositionRotation(d0, entity.locY, d1, entity.yaw, entity.pitch); ++ if (entity.isAlive()) { ++ worldserver.entityJoinedWorld(entity, false); ++ } ++ */ ++ } else if (worldserver1.dimension == 0) { ++ d0 = MathHelper.a(d0 * d2, worldserver1.af().b() + 16.0D, worldserver1.af().d() - 16.0D); ++ d1 = MathHelper.a(d1 * d2, worldserver1.af().c() + 16.0D, worldserver1.af().e() - 16.0D); ++ /* ++ entity.setPositionRotation(d0, entity.locY, d1, entity.yaw, entity.pitch); ++ if (entity.isAlive()) { ++ worldserver.entityJoinedWorld(entity, false); ++ } ++ */ ++ } else { ++ BlockPosition blockposition; ++ ++ if (i == 1) { ++ // use default NORMAL world spawn instead of target ++ worldserver1 = this.server.worlds.get(0); ++ blockposition = worldserver1.getSpawn(); ++ } else { ++ blockposition = worldserver1.getDimensionSpawn(); ++ } ++ ++ d0 = (double) blockposition.getX(); ++ y = (double) blockposition.getY(); ++ d1 = (double) blockposition.getZ(); ++ /* ++ entity.setPositionRotation(d0, entity.locY, d1, 90.0F, 0.0F); ++ if (entity.isAlive()) { ++ worldserver.entityJoinedWorld(entity, false); ++ } ++ */ ++ } + +- entityplayer.playerConnection.sendPacket(new PacketPlayOutEntityEffect(entityplayer.getId(), mobeffect)); ++ // worldserver.methodProfiler.b(); ++ if (i != 1) { ++ worldserver.methodProfiler.a("placing"); ++ d0 = (double) MathHelper.clamp((int) d0, -29999872, 29999872); ++ d1 = (double) MathHelper.clamp((int) d1, -29999872, 29999872); ++ /* ++ if (entity.isAlive()) { ++ entity.setPositionRotation(d0, entity.locY, d1, entity.yaw, entity.pitch); ++ worldserver1.getTravelAgent().a(entity, f); ++ worldserver1.addEntity(entity); ++ worldserver1.entityJoinedWorld(entity, false); ++ } ++ ++ worldserver.methodProfiler.b(); ++ */ + } + ++ // entity.spawnIn(worldserver1); ++ return new Location(worldserver1.getWorld(), d0, y, d1, yaw, pitch); + } + +- public void changeWorld(Entity entity, int i, WorldServer worldserver, WorldServer worldserver1) { ++ // copy of original a(Entity, int, WorldServer, WorldServer) method with only entity repositioning logic ++ public void repositionEntity(Entity entity, Location exit, boolean portal) { ++ WorldServer worldserver = (WorldServer) entity.world; ++ WorldServer worldserver1 = ((CraftWorld) exit.getWorld()).getHandle(); ++ int i = worldserver.dimension; ++ ++ /* + double d0 = entity.locX; + double d1 = entity.locZ; + double d2 = 8.0D; + float f = entity.yaw; + + worldserver.methodProfiler.a("moving"); ++ */ ++ entity.setPositionRotation(exit.getX(), exit.getY(), exit.getZ(), exit.getYaw(), exit.getPitch()); ++ if (entity.isAlive()) { ++ worldserver.entityJoinedWorld(entity, false); ++ } ++ /* + if (entity.dimension == -1) { + d0 = MathHelper.a(d0 / d2, worldserver1.af().b() + 16.0D, worldserver1.af().d() - 16.0D); + d1 = MathHelper.a(d1 / d2, worldserver1.af().c() + 16.0D, worldserver1.af().e() - 16.0D); +@@ -411,6 +724,8 @@ + BlockPosition blockposition; + + if (i == 1) { ++ // use default NORMAL world spawn instead of target ++ worldserver1 = this.server.worlds.get(0); + blockposition = worldserver1.getSpawn(); + } else { + blockposition = worldserver1.getDimensionSpawn(); +@@ -424,15 +739,26 @@ + worldserver.entityJoinedWorld(entity, false); + } + } ++ */ + + worldserver.methodProfiler.b(); + if (i != 1) { + worldserver.methodProfiler.a("placing"); ++ /* + d0 = (double) MathHelper.clamp((int) d0, -29999872, 29999872); + d1 = (double) MathHelper.clamp((int) d1, -29999872, 29999872); ++ */ + if (entity.isAlive()) { +- entity.setPositionRotation(d0, entity.locY, d1, entity.yaw, entity.pitch); +- worldserver1.getTravelAgent().a(entity, f); ++ // entity.setPositionRotation(d0, entity.locY, d1, entity.yaw, entity.pitch); ++ // worldserver1.getTravelAgent().a(entity, f); ++ if (portal) { ++ Vector velocity = entity.getBukkitEntity().getVelocity(); ++ worldserver1.getTravelAgent().adjustExit(entity, exit, velocity); ++ entity.setPositionRotation(exit.getX(), exit.getY(), exit.getZ(), exit.getYaw(), exit.getPitch()); ++ if (entity.motX != velocity.getX() || entity.motY != velocity.getY() || entity.motZ != velocity.getZ()) { ++ entity.getBukkitEntity().setVelocity(velocity); ++ } ++ } + worldserver1.addEntity(entity); + worldserver1.entityJoinedWorld(entity, false); + } +@@ -441,6 +767,7 @@ + } + + entity.spawnIn(worldserver1); ++ // CraftBukkit end + } + + public void tick() { +@@ -549,10 +876,24 @@ + + public void addOp(GameProfile gameprofile) { + this.operators.add(new OpListEntry(gameprofile, this.server.p())); ++ ++ // CraftBukkit start ++ Player player = server.server.getPlayer(gameprofile.getId()); ++ if (player != null) { ++ player.recalculatePermissions(); ++ } ++ // CraftBukkit end + } + + public void removeOp(GameProfile gameprofile) { + this.operators.remove(gameprofile); ++ ++ // CraftBukkit start ++ Player player = server.server.getPlayer(gameprofile.getId()); ++ if (player != null) { ++ player.recalculatePermissions(); ++ } ++ // CraftBukkit end + } + + public boolean isWhitelisted(GameProfile gameprofile) { +@@ -560,7 +901,7 @@ + } + + public boolean isOp(GameProfile gameprofile) { +- return this.operators.d(gameprofile) || this.server.S() && this.server.worldServer[0].getWorldData().v() && this.server.R().equalsIgnoreCase(gameprofile.getName()) || this.t; ++ return this.operators.d(gameprofile) || this.server.S() && this.server.worlds.get(0).getWorldData().v() && this.server.R().equalsIgnoreCase(gameprofile.getName()) || this.t; // CraftBukkit + } + + public EntityPlayer getPlayer(String s) { +@@ -587,6 +928,12 @@ + 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; +@@ -634,21 +981,25 @@ + public void reloadWhitelist() {} + + public void b(EntityPlayer entityplayer, WorldServer worldserver) { +- WorldBorder worldborder = this.server.worldServer[0].af(); ++ WorldBorder worldborder = this.server.worlds.get(0).af(); // CraftBukkit + + entityplayer.playerConnection.sendPacket(new PacketPlayOutWorldBorder(worldborder, EnumWorldBorderAction.INITIALIZE)); + entityplayer.playerConnection.sendPacket(new PacketPlayOutUpdateTime(worldserver.getTime(), worldserver.getDayTime(), worldserver.getGameRules().getBoolean("doDaylightCycle"))); + if (worldserver.S()) { +- entityplayer.playerConnection.sendPacket(new PacketPlayOutGameStateChange(1, 0.0F)); +- entityplayer.playerConnection.sendPacket(new PacketPlayOutGameStateChange(7, worldserver.j(1.0F))); +- entityplayer.playerConnection.sendPacket(new PacketPlayOutGameStateChange(8, worldserver.h(1.0F))); ++ // CraftBukkit start - handle player weather ++ // entityplayer.playerConnection.sendPacket(new PacketPlayOutGameStateChange(1, 0.0F)); ++ // entityplayer.playerConnection.sendPacket(new PacketPlayOutGameStateChange(7, worldserver.j(1.0F))); ++ // entityplayer.playerConnection.sendPacket(new PacketPlayOutGameStateChange(8, worldserver.h(1.0F))); ++ entityplayer.setPlayerWeather(org.bukkit.WeatherType.DOWNFALL, false); ++ // CraftBukkit end + } + + } + + public void updateClient(EntityPlayer entityplayer) { + entityplayer.updateInventory(entityplayer.defaultContainer); +- entityplayer.triggerHealthUpdate(); ++ // entityplayer.triggerHealthUpdate(); ++ entityplayer.getBukkitEntity().updateScaledHealth(); // CraftBukkit - Update scaled health on respawn and worldchange + entityplayer.playerConnection.sendPacket(new PacketPlayOutHeldItemSlot(entityplayer.inventory.itemInHandIndex)); + } + +@@ -661,7 +1012,7 @@ + } + + public String[] getSeenPlayers() { +- return this.server.worldServer[0].getDataManager().getPlayerFileData().getSeenPlayers(); ++ return this.server.worlds.get(0).getDataManager().getPlayerFileData().getSeenPlayers(); // CraftBukkit + } + + public boolean getHasWhitelist() { +@@ -711,10 +1062,17 @@ + + public void v() { + for (int i = 0; i < this.players.size(); ++i) { +- ((EntityPlayer) this.players.get(i)).playerConnection.disconnect("Server closed"); ++ ((EntityPlayer) this.players.get(i)).playerConnection.disconnect(this.server.server.getShutdownMessage()); // CraftBukkit - add custom shutdown message + } ++ } + ++ // CraftBukkit start ++ public void sendMessage(IChatBaseComponent[] iChatBaseComponents) { ++ for (IChatBaseComponent component : iChatBaseComponents) { ++ sendMessage(component, true); ++ } + } ++ // CraftBukkit end + + public void sendMessage(IChatBaseComponent ichatbasecomponent, boolean flag) { + this.server.sendMessage(ichatbasecomponent); +@@ -754,11 +1112,10 @@ + public void a(int i) { + this.r = i; + if (this.server.worldServer != null) { +- WorldServer[] aworldserver = this.server.worldServer; +- int j = aworldserver.length; +- +- for (int k = 0; k < j; ++k) { +- WorldServer worldserver = aworldserver[k]; ++ // CraftBukkit start ++ for (int k = 0; k < server.worlds.size(); ++k) { ++ WorldServer worldserver = server.worlds.get(0); ++ // CraftBukkit end + + if (worldserver != null) { + worldserver.getPlayerChunkMap().a(i); diff --git a/nms-patches/PlayerSelector.patch b/nms-patches/PlayerSelector.patch new file mode 100644 index 0000000000..e5583a10ca --- /dev/null +++ b/nms-patches/PlayerSelector.patch @@ -0,0 +1,14 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/PlayerSelector.java 2014-11-27 08:59:46.865421124 +1100 ++++ src/main/java/net/minecraft/server/PlayerSelector.java 2014-11-27 08:42:10.140850934 +1100 +@@ -52,6 +52,11 @@ + } + + public static List getPlayers(ICommandListener icommandlistener, String s, Class oclass) { ++ // CraftBukkit start - disable playerselections for ICommandListeners other than command blocks ++ if (!(icommandlistener instanceof CommandBlockListenerAbstract)) { ++ return com.google.common.collect.ImmutableList.of(); ++ } ++ // CraftBukkit end + Matcher matcher = PlayerSelector.a.matcher(s); + + if (matcher.matches() && icommandlistener.a(1, "@")) { diff --git a/nms-patches/PortalCreator.patch b/nms-patches/PortalCreator.patch new file mode 100644 index 0000000000..5bb4eae90b --- /dev/null +++ b/nms-patches/PortalCreator.patch @@ -0,0 +1,102 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/PortalCreator.java 2014-11-27 08:59:46.865421124 +1100 ++++ src/main/java/net/minecraft/server/PortalCreator.java 2014-11-27 08:42:10.132850949 +1100 +@@ -1,5 +1,7 @@ + package net.minecraft.server; + ++import org.bukkit.event.world.PortalCreateEvent; // CraftBukkit ++ + public class PortalCreator { + + private final World a; +@@ -10,6 +12,7 @@ + private BlockPosition f; + private int g; + private int h; ++ java.util.Collection blocks = new java.util.HashSet(); // CraftBukkit - add field + + public PortalCreator(World world, BlockPosition blockposition, EnumAxis enumaxis) { + this.a = world; +@@ -60,6 +63,10 @@ + } + + protected int a() { ++ // CraftBukkit start ++ this.blocks.clear(); ++ org.bukkit.World bworld = this.a.getWorld(); ++ // CraftBukkit end + int i; + + label56: +@@ -80,11 +87,21 @@ + block = this.a.getType(blockposition.shift(this.d)).getBlock(); + if (block != Blocks.OBSIDIAN) { + break label56; ++ // CraftBukkit start - add the block to our list ++ } else { ++ BlockPosition pos = blockposition.shift(this.d); ++ blocks.add(bworld.getBlockAt(pos.getX(), pos.getY(), pos.getZ())); ++ // CraftBukkit end + } + } else if (i == this.h - 1) { + block = this.a.getType(blockposition.shift(this.c)).getBlock(); + if (block != Blocks.OBSIDIAN) { + break label56; ++ // CraftBukkit start - add the block to our list ++ } else { ++ BlockPosition pos = blockposition.shift(this.c); ++ blocks.add(bworld.getBlockAt(pos.getX(), pos.getY(), pos.getZ())); ++ // CraftBukkit end + } + } + } +@@ -94,6 +111,11 @@ + if (this.a.getType(this.f.shift(this.c, i).up(this.g)).getBlock() != Blocks.OBSIDIAN) { + this.g = 0; + break; ++ // CraftBukkit start - add the block to our list ++ } else { ++ BlockPosition pos = this.f.shift(this.c, i).up(this.g); ++ blocks.add(bworld.getBlockAt(pos.getX(), pos.getY(), pos.getZ())); ++ // CraftBukkit end + } + } + +@@ -115,15 +137,36 @@ + return this.f != null && this.h >= 2 && this.h <= 21 && this.g >= 3 && this.g <= 21; + } + +- public void c() { ++ // CraftBukkit start - return boolean ++ public boolean c() { ++ org.bukkit.World bworld = this.a.getWorld(); ++ ++ // Copy below for loop + for (int i = 0; i < this.h; ++i) { + BlockPosition blockposition = this.f.shift(this.c, i); + + for (int j = 0; j < this.g; ++j) { +- this.a.setTypeAndData(blockposition.up(j), Blocks.PORTAL.getBlockData().set(BlockPortal.AXIS, this.b), 2); ++ BlockPosition pos = blockposition.up(j); ++ blocks.add(bworld.getBlockAt(pos.getX(), pos.getY(), pos.getZ())); + } + } + ++ PortalCreateEvent event = new PortalCreateEvent(blocks, bworld, PortalCreateEvent.CreateReason.FIRE); ++ this.a.getServer().getPluginManager().callEvent(event); ++ ++ if (event.isCancelled()) { ++ return false; ++ } ++ // CraftBukkit end ++ for (int i = 0; i < this.h; ++i) { ++ BlockPosition blockposition = this.f.shift(this.c, i); ++ ++ for (int j = 0; j < this.g; ++j) { ++ this.a.setTypeAndData(blockposition.up(j), Blocks.PORTAL.getBlockData().set(BlockPortal.AXIS, this.b), 2); ++ } ++ } ++ ++ return true; // Craft Bukkit + } + + public static int a(PortalCreator portalcreator) { diff --git a/nms-patches/PortalTravelAgent.patch b/nms-patches/PortalTravelAgent.patch new file mode 100644 index 0000000000..1a6d02d98c --- /dev/null +++ b/nms-patches/PortalTravelAgent.patch @@ -0,0 +1,273 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/PortalTravelAgent.java 2014-11-27 08:59:46.869421107 +1100 ++++ src/main/java/net/minecraft/server/PortalTravelAgent.java 2014-11-27 08:42:10.096851020 +1100 +@@ -5,6 +5,12 @@ + import java.util.List; + import java.util.Random; + ++// CraftBukkit start ++import org.bukkit.Location; ++import org.bukkit.event.entity.EntityPortalExitEvent; ++import org.bukkit.util.Vector; ++// CraftBukkit end ++ + public class PortalTravelAgent { + + private final WorldServer a; +@@ -27,8 +33,21 @@ + int i = MathHelper.floor(entity.locX); + int j = MathHelper.floor(entity.locY) - 1; + int k = MathHelper.floor(entity.locZ); ++ // CraftBukkit start - Modularize end portal creation ++ BlockPosition created = this.createEndPortal(entity.locX, entity.locY, entity.locZ); ++ entity.setPositionRotation((double) created.getX(), (double) created.getY(), (double) created.getZ(), entity.yaw, 0.0F); ++ entity.motX = entity.motY = entity.motZ = 0.0D; ++ } ++ } ++ ++ // Split out from original a(Entity, double, double, double, float) method in order to enable being called from createPortal ++ private BlockPosition createEndPortal(double x, double y, double z) { ++ int i = MathHelper.floor(x); ++ int j = MathHelper.floor(y) - 1; ++ int k = MathHelper.floor(z); + byte b0 = 1; + byte b1 = 0; ++ // CraftBukkit end + + for (int l = -2; l <= 2; ++l) { + for (int i1 = -2; i1 <= 2; ++i1) { +@@ -43,16 +62,63 @@ + } + } + +- entity.setPositionRotation((double) i, (double) j, (double) k, entity.yaw, 0.0F); +- entity.motX = entity.motY = entity.motZ = 0.0D; ++ // CraftBukkit start ++ return new BlockPosition(i, k, k); ++ } ++ ++ // use logic based on creation to verify end portal ++ private BlockPosition findEndPortal(BlockPosition portal) { ++ int i = portal.getX(); ++ int j = portal.getY() - 1; ++ int k = portal.getZ(); ++ byte b0 = 1; ++ byte b1 = 0; ++ ++ for (int l = -2; l <= 2; ++l) { ++ for (int i1 = -2; i1 <= 2; ++i1) { ++ for (int j1 = -1; j1 < 3; ++j1) { ++ int k1 = i + i1 * b0 + l * b1; ++ int l1 = j + j1; ++ int i2 = k + i1 * b1 - l * b0; ++ boolean flag = j1 < 0; ++ ++ if (this.a.getType(new BlockPosition(k1, l1, i2)).getBlock() != (flag ? Blocks.OBSIDIAN : Blocks.AIR)) { ++ return null; ++ } ++ } ++ } + } ++ return new BlockPosition(i, j, k); + } ++ // CraftBukkit end + + public boolean b(Entity entity, float f) { +- boolean flag = true; ++ // CraftBukkit start - Modularize portal search process and entity teleportation ++ BlockPosition found = this.findPortal(entity.locX, entity.locY, entity.locZ, 128); ++ if (found == null) { ++ return false; ++ } ++ ++ Location exit = new Location(this.a.getWorld(), found.getX(), found.getY(), found.getZ(), f, entity.pitch); ++ Vector velocity = entity.getBukkitEntity().getVelocity(); ++ this.adjustExit(entity, exit, velocity); ++ entity.setPositionRotation(exit.getX(), exit.getY(), exit.getZ(), exit.getYaw(), exit.getPitch()); ++ if (entity.motX != velocity.getX() || entity.motY != velocity.getY() || entity.motZ != velocity.getZ()) { ++ entity.getBukkitEntity().setVelocity(velocity); ++ } ++ return true; ++ } ++ ++ public BlockPosition findPortal(double x, double y, double z, int short1) { ++ if (this.a.getWorld().getEnvironment() == org.bukkit.World.Environment.THE_END) { ++ return this.findEndPortal(this.a.worldProvider.h()); ++ } ++ // CraftBukkit end + double d0 = -1.0D; +- int i = MathHelper.floor(entity.locX); +- int j = MathHelper.floor(entity.locZ); ++ // CraftBukkit start ++ int i = MathHelper.floor(x); ++ int j = MathHelper.floor(z); ++ // CraftBukkit end + boolean flag1 = true; + Object object = BlockPosition.ZERO; + long k = ChunkCoordIntPair.a(i, j); +@@ -65,7 +131,7 @@ + chunkcoordinatesportal.b = this.a.getTime(); + flag1 = false; + } else { +- BlockPosition blockposition = new BlockPosition(entity); ++ BlockPosition blockposition = new BlockPosition(x, y, z); + + for (int l = -128; l <= 128; ++l) { + BlockPosition blockposition1; +@@ -95,7 +161,29 @@ + this.c.put(k, new ChunkCoordinatesPortal(this, (BlockPosition) object, this.a.getTime())); + this.d.add(Long.valueOf(k)); + } ++ // CraftBukkit start - Move entity teleportation logic into exit ++ return (BlockPosition) object; ++ } else { ++ return null; ++ } ++ } + ++ // Entity repositioning logic split out from original b method and combined with repositioning logic for The End from original a method ++ public void adjustExit(Entity entity, Location position, Vector velocity) { ++ Location from = position.clone(); ++ Vector before = velocity.clone(); ++ BlockPosition object = new BlockPosition(position.getBlockX(), position.getBlockY(), position.getBlockZ()); ++ float f = position.getYaw(); ++ ++ if (this.a.getWorld().getEnvironment() == org.bukkit.World.Environment.THE_END) { ++ // entity.setPositionRotation((double) i, (double) j, (double) k, entity.yaw, 0.0F); ++ // entity.motX = entity.motY = entity.motZ = 0.0D; ++ position.setPitch(0.0F); ++ velocity.setX(0); ++ velocity.setY(0); ++ velocity.setZ(0); ++ } else { ++ // CraftBukkit end + double d2 = (double) ((BlockPosition) object).getX() + 0.5D; + double d3 = (double) ((BlockPosition) object).getY() + 0.5D; + double d4 = (double) ((BlockPosition) object).getZ() + 0.5D; +@@ -170,21 +258,46 @@ + f6 = 1.0F; + } + +- double d5 = entity.motX; +- double d6 = entity.motZ; +- +- entity.motX = d5 * (double) f3 + d6 * (double) f6; +- entity.motZ = d5 * (double) f5 + d6 * (double) f4; +- entity.yaw = f - (float) (enumdirection1.b() * 90) + (float) (enumdirection.b() * 90); ++ // CraftBukkit start ++ double d5 = velocity.getX(); ++ double d6 = velocity.getZ(); ++ // CraftBukkit end ++ ++ // CraftBukkit start - Adjust position and velocity instances instead of entity ++ velocity.setX(d5 * (double) f3 + d6 * (double) f6); ++ velocity.setZ(d5 * (double) f5 + d6 * (double) f4); ++ f = f - (float) (enumdirection1.b() * 90) + (float) (enumdirection.b() * 90); + } else { +- entity.motX = entity.motY = entity.motZ = 0.0D; ++ velocity.setX(0); ++ velocity.setY(0); ++ velocity.setZ(0); + } + +- entity.setPositionRotation(d2, d3, d4, entity.yaw, entity.pitch); +- return true; ++ // entity.setPositionRotation(d2, d3, d4, entity.yaw, entity.pitch); ++ position.setX(d2); ++ position.setY(d3); ++ position.setZ(d4); ++ position.setYaw(f); ++ } ++ EntityPortalExitEvent event = new EntityPortalExitEvent(entity.getBukkitEntity(), from, position, before, velocity); ++ this.a.getServer().getPluginManager().callEvent(event); ++ Location to = event.getTo(); ++ if (event.isCancelled() || to == null || !entity.isAlive()) { ++ position.setX(from.getX()); ++ position.setY(from.getY()); ++ position.setZ(from.getZ()); ++ position.setYaw(from.getYaw()); ++ position.setPitch(from.getPitch()); ++ velocity.copy(before); + } else { +- return false; ++ position.setX(to.getX()); ++ position.setY(to.getY()); ++ position.setZ(to.getZ()); ++ position.setYaw(to.getYaw()); ++ position.setPitch(to.getPitch()); ++ velocity.copy(event.getAfter()); // event.getAfter() will never be null, as setAfter() will cause an NPE if null is passed in + } ++ // CraftBukkit end + } + + private boolean a(BlockPosition blockposition) { +@@ -192,11 +305,22 @@ + } + + public boolean a(Entity entity) { +- byte b0 = 16; ++ // CraftBukkit start - Allow for portal creation to be based on coordinates instead of entity ++ return this.createPortal(entity.locX, entity.locY, entity.locZ, 16); ++ } ++ ++ public boolean createPortal(double x, double y, double z, int b0) { ++ if (this.a.getWorld().getEnvironment() == org.bukkit.World.Environment.THE_END) { ++ createEndPortal(x, y, z); ++ return true; ++ } ++ // CraftBukkit end + double d0 = -1.0D; +- int i = MathHelper.floor(entity.locX); +- int j = MathHelper.floor(entity.locY); +- int k = MathHelper.floor(entity.locZ); ++ // CraftBukkit start ++ int i = MathHelper.floor(x); ++ int j = MathHelper.floor(y); ++ int k = MathHelper.floor(z); ++ // CraftBukkit end + int l = i; + int i1 = j; + int j1 = k; +@@ -220,10 +344,10 @@ + double d4; + + for (i2 = i - b0; i2 <= i + b0; ++i2) { +- d1 = (double) i2 + 0.5D - entity.locX; ++ d1 = (double) i2 + 0.5D - x; // CraftBukkit + + for (j2 = k - b0; j2 <= k + b0; ++j2) { +- d2 = (double) j2 + 0.5D - entity.locZ; ++ d2 = (double) j2 + 0.5D - z; // CraftBukkit + + label271: + for (k2 = this.a.V() - 1; k2 >= 0; --k2) { +@@ -254,7 +378,7 @@ + } + } + +- d3 = (double) k2 + 0.5D - entity.locY; ++ d3 = (double) k2 + 0.5D - y; // CraftBukkit + d4 = d1 * d1 + d3 * d3 + d2 * d2; + if (d0 < 0.0D || d4 < d0) { + d0 = d4; +@@ -271,10 +395,10 @@ + + if (d0 < 0.0D) { + for (i2 = i - b0; i2 <= i + b0; ++i2) { +- d1 = (double) i2 + 0.5D - entity.locX; ++ d1 = (double) i2 + 0.5D - x; // CraftBukkit + + for (j2 = k - b0; j2 <= k + b0; ++j2) { +- d2 = (double) j2 + 0.5D - entity.locZ; ++ d2 = (double) j2 + 0.5D - z; // CraftBukkit + + label219: + for (k2 = this.a.V() - 1; k2 >= 0; --k2) { +@@ -298,7 +422,7 @@ + } + } + +- d3 = (double) k2 + 0.5D - entity.locY; ++ d3 = (double) k2 + 0.5D - y; // CraftBukkit + d4 = d1 * d1 + d3 * d3 + d2 * d2; + if (d0 < 0.0D || d4 < d0) { + d0 = d4; diff --git a/nms-patches/PropertyManager.patch b/nms-patches/PropertyManager.patch new file mode 100644 index 0000000000..9812b4397a --- /dev/null +++ b/nms-patches/PropertyManager.patch @@ -0,0 +1,94 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/PropertyManager.java 2014-11-27 08:59:46.869421107 +1100 ++++ src/main/java/net/minecraft/server/PropertyManager.java 2014-11-27 08:42:10.100851012 +1100 +@@ -8,6 +8,8 @@ + import org.apache.logging.log4j.LogManager; + import org.apache.logging.log4j.Logger; + ++import joptsimple.OptionSet; // CraftBukkit ++ + public class PropertyManager { + + private static final Logger a = LogManager.getLogger(); +@@ -39,8 +41,25 @@ + PropertyManager.a.warn(file + " does not exist"); + this.a(); + } ++ } ++ ++ // CraftBukkit start ++ private OptionSet options = null; ++ ++ public PropertyManager(final OptionSet options) { ++ this((File) options.valueOf("config")); ++ ++ this.options = options; ++ } ++ ++ private T getOverride(String name, T value) { ++ if ((this.options != null) && (this.options.has(name))) { ++ return (T) this.options.valueOf(name); ++ } + ++ return value; + } ++ // CraftBukkit end + + public void a() { + PropertyManager.a.info("Generating new properties file"); +@@ -51,6 +70,12 @@ + FileOutputStream fileoutputstream = null; + + try { ++ // CraftBukkit start - Don't attempt writing to file if it's read only ++ if (this.file.exists() && !this.file.canWrite()) { ++ return; ++ } ++ // CraftBukkit end ++ + fileoutputstream = new FileOutputStream(this.file); + this.properties.store(fileoutputstream, "Minecraft server properties"); + } catch (Exception exception) { +@@ -80,36 +105,36 @@ + this.savePropertiesFile(); + } + +- return this.properties.getProperty(s, s1); ++ return getOverride(s, this.properties.getProperty(s, s1)); // CraftBukkit + } + + public int getInt(String s, int i) { + try { +- return Integer.parseInt(this.getString(s, "" + i)); ++ return getOverride(s, Integer.parseInt(this.getString(s, "" + i))); // CraftBukkit + } catch (Exception exception) { + this.properties.setProperty(s, "" + i); + this.savePropertiesFile(); +- return i; ++ return getOverride(s, i); // CraftBukkit + } + } + + public long getLong(String s, long i) { + try { +- return Long.parseLong(this.getString(s, "" + i)); ++ return getOverride(s, Long.parseLong(this.getString(s, "" + i))); // CraftBukkit + } catch (Exception exception) { + this.properties.setProperty(s, "" + i); + this.savePropertiesFile(); +- return i; ++ return getOverride(s ,i); // CraftBukkit + } + } + + public boolean getBoolean(String s, boolean flag) { + try { +- return Boolean.parseBoolean(this.getString(s, "" + flag)); ++ return getOverride(s, Boolean.parseBoolean(this.getString(s, "" + flag))); // CraftBukkit + } catch (Exception exception) { + this.properties.setProperty(s, "" + flag); + this.savePropertiesFile(); +- return flag; ++ return getOverride(s, flag); // CraftBukkit + } + } + diff --git a/nms-patches/RecipeArmorDye.patch b/nms-patches/RecipeArmorDye.patch new file mode 100644 index 0000000000..80002455b4 --- /dev/null +++ b/nms-patches/RecipeArmorDye.patch @@ -0,0 +1,18 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/RecipeArmorDye.java 2014-11-27 08:59:46.869421107 +1100 ++++ src/main/java/net/minecraft/server/RecipeArmorDye.java 2014-11-27 08:42:10.116850981 +1100 +@@ -3,9 +3,13 @@ + import com.google.common.collect.Lists; + import java.util.ArrayList; + +-public class RecipeArmorDye implements IRecipe { ++public class RecipeArmorDye extends ShapelessRecipes implements IRecipe { // CraftBukkit - added extends + +- public RecipeArmorDye() {} ++ // CraftBukkit start - Delegate to new parent class with bogus info ++ public RecipeArmorDye() { ++ super(new ItemStack(Items.LEATHER_HELMET, 0, 0), java.util.Arrays.asList(new ItemStack(Items.DYE, 0, 5))); ++ } ++ // CraftBukkit end + + public boolean a(InventoryCrafting inventorycrafting, World world) { + ItemStack itemstack = null; diff --git a/nms-patches/RecipeBookClone.patch b/nms-patches/RecipeBookClone.patch new file mode 100644 index 0000000000..5d14c2dbaa --- /dev/null +++ b/nms-patches/RecipeBookClone.patch @@ -0,0 +1,17 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/RecipeBookClone.java 2014-11-27 08:59:46.873421089 +1100 ++++ src/main/java/net/minecraft/server/RecipeBookClone.java 2014-11-27 08:42:10.144850927 +1100 +@@ -1,8 +1,12 @@ + package net.minecraft.server; + +-public class RecipeBookClone implements IRecipe { ++public class RecipeBookClone extends ShapelessRecipes implements IRecipe { // CraftBukkit - added extends + +- public RecipeBookClone() {} ++ // CraftBukkit start - Delegate to new parent class ++ public RecipeBookClone() { ++ super(new ItemStack(Items.WRITTEN_BOOK, 0, -1), java.util.Arrays.asList(new ItemStack(Items.WRITABLE_BOOK, 0, 0))); ++ } ++ // CraftBukkit end + + public boolean a(InventoryCrafting inventorycrafting, World world) { + int i = 0; diff --git a/nms-patches/RecipeFireworks.patch b/nms-patches/RecipeFireworks.patch new file mode 100644 index 0000000000..b7b388d0ba --- /dev/null +++ b/nms-patches/RecipeFireworks.patch @@ -0,0 +1,21 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/RecipeFireworks.java 2014-11-27 08:59:46.873421089 +1100 ++++ src/main/java/net/minecraft/server/RecipeFireworks.java 2014-11-27 08:42:10.088851036 +1100 +@@ -3,11 +3,15 @@ + import com.google.common.collect.Lists; + import java.util.ArrayList; + +-public class RecipeFireworks implements IRecipe { ++public class RecipeFireworks extends ShapelessRecipes implements IRecipe { // CraftBukkit - added extends + + private ItemStack a; +- +- public RecipeFireworks() {} ++ ++ // CraftBukkit start - Delegate to new parent class with bogus info ++ public RecipeFireworks() { ++ super(new ItemStack(Items.FIREWORKS, 0, 0), java.util.Arrays.asList(new ItemStack(Items.GUNPOWDER, 0, 5))); ++ } ++ // CraftBukkit end + + public boolean a(InventoryCrafting inventorycrafting, World world) { + this.a = null; diff --git a/nms-patches/RecipeMapClone.patch b/nms-patches/RecipeMapClone.patch new file mode 100644 index 0000000000..a33ee9e9a7 --- /dev/null +++ b/nms-patches/RecipeMapClone.patch @@ -0,0 +1,17 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/RecipeMapClone.java 2014-11-27 08:59:46.873421089 +1100 ++++ src/main/java/net/minecraft/server/RecipeMapClone.java 2014-11-27 08:42:10.152850911 +1100 +@@ -1,8 +1,12 @@ + package net.minecraft.server; + +-public class RecipeMapClone implements IRecipe { ++public class RecipeMapClone extends ShapelessRecipes implements IRecipe { // CraftBukkit - added extends + +- public RecipeMapClone() {} ++ // CraftBukkit start - Delegate to new parent class ++ public RecipeMapClone() { ++ super(new ItemStack(Items.MAP, 0, -1), java.util.Arrays.asList(new ItemStack(Items.MAP, 0, 0))); ++ } ++ // CraftBukkit end + + public boolean a(InventoryCrafting inventorycrafting, World world) { + int i = 0; diff --git a/nms-patches/RecipeRepair.patch b/nms-patches/RecipeRepair.patch new file mode 100644 index 0000000000..51349bb2ce --- /dev/null +++ b/nms-patches/RecipeRepair.patch @@ -0,0 +1,39 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/RecipeRepair.java 2014-11-27 08:59:46.877421071 +1100 ++++ src/main/java/net/minecraft/server/RecipeRepair.java 2014-11-27 08:42:10.148850918 +1100 +@@ -3,9 +3,13 @@ + import com.google.common.collect.Lists; + import java.util.ArrayList; + +-public class RecipeRepair implements IRecipe { ++public class RecipeRepair extends ShapelessRecipes implements IRecipe { // CraftBukkit - added extends + +- public RecipeRepair() {} ++ // CraftBukkit start - Delegate to new parent class ++ public RecipeRepair() { ++ super(new ItemStack(Items.LEATHER_HELMET), java.util.Arrays.asList(new ItemStack(Items.LEATHER_HELMET))); ++ } ++ // CraftBukkit end + + public boolean a(InventoryCrafting inventorycrafting, World world) { + ArrayList arraylist = Lists.newArrayList(); +@@ -61,8 +65,18 @@ + if (i1 < 0) { + i1 = 0; + } +- +- return new ItemStack(itemstack2.getItem(), 1, i1); ++ ++ // CraftBukkit start - Construct a dummy repair recipe ++ ItemStack result = new ItemStack(itemstack.getItem(), 1, i1); ++ java.util.List ingredients = new ArrayList(); ++ ingredients.add(itemstack2.cloneItemStack()); ++ ingredients.add(itemstack.cloneItemStack()); ++ ShapelessRecipes recipe = new ShapelessRecipes(result.cloneItemStack(), ingredients); ++ inventorycrafting.currentRecipe = recipe; ++ result = org.bukkit.craftbukkit.event.CraftEventFactory.callPreCraftEvent(inventorycrafting, result, CraftingManager.getInstance().lastCraftView, true); ++ return result; ++ // return new ItemStack(itemstack2.getItem(), 1, i1); ++ // CraftBukkit end + } + } + diff --git a/nms-patches/RecipesBannerInnerClass1.patch b/nms-patches/RecipesBannerInnerClass1.patch new file mode 100644 index 0000000000..7847163241 --- /dev/null +++ b/nms-patches/RecipesBannerInnerClass1.patch @@ -0,0 +1,17 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/RecipesBannerInnerClass1.java 2014-11-27 08:59:46.877421071 +1100 ++++ src/main/java/net/minecraft/server/RecipesBannerInnerClass1.java 2014-11-27 08:42:10.084851043 +1100 +@@ -1,8 +1,12 @@ + package net.minecraft.server; + +-class RecipesBannerInnerClass1 implements IRecipe { ++class RecipesBannerInnerClass1 extends ShapelessRecipes implements IRecipe { // CraftBukkit - added extends + +- private RecipesBannerInnerClass1() {} ++ // CraftBukkit start - Delegate to new parent class with bogus info ++ private RecipesBannerInnerClass1() { ++ super(new ItemStack(Items.BANNER, 0, 0), java.util.Arrays.asList(new ItemStack(Items.BANNER))); ++ } ++ // CraftBukkit end + + public boolean a(InventoryCrafting inventorycrafting, World world) { + ItemStack itemstack = null; diff --git a/nms-patches/RecipesBannerInnerClass2.patch b/nms-patches/RecipesBannerInnerClass2.patch new file mode 100644 index 0000000000..3fa03250a4 --- /dev/null +++ b/nms-patches/RecipesBannerInnerClass2.patch @@ -0,0 +1,17 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/RecipesBannerInnerClass2.java 2014-11-27 08:59:46.881421054 +1100 ++++ src/main/java/net/minecraft/server/RecipesBannerInnerClass2.java 2014-11-27 08:42:10.164850887 +1100 +@@ -1,8 +1,12 @@ + package net.minecraft.server; + +-class RecipesBannerInnerClass2 implements IRecipe { ++class RecipesBannerInnerClass2 extends ShapelessRecipes implements IRecipe { // CraftBukkit - added extends + +- private RecipesBannerInnerClass2() {} ++ // CraftBukkit start - Delegate to new parent class with bogus info ++ private RecipesBannerInnerClass2() { ++ super(new ItemStack(Items.BANNER, 0, 0), java.util.Arrays.asList(new ItemStack(Items.DYE, 0, 5))); ++ } ++ // CraftBukkit end + + public boolean a(InventoryCrafting inventorycrafting, World world) { + boolean flag = false; diff --git a/nms-patches/RecipesFurnace.patch b/nms-patches/RecipesFurnace.patch new file mode 100644 index 0000000000..be4d28fbdd --- /dev/null +++ b/nms-patches/RecipesFurnace.patch @@ -0,0 +1,49 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/RecipesFurnace.java 2014-11-27 08:59:46.881421054 +1100 ++++ src/main/java/net/minecraft/server/RecipesFurnace.java 2014-11-27 08:42:10.132850949 +1100 +@@ -10,6 +10,7 @@ + private static final RecipesFurnace a = new RecipesFurnace(); + public Map recipes = Maps.newHashMap(); + private Map c = Maps.newHashMap(); ++ public Map customRecipes = Maps.newHashMap(); // CraftBukkit - add field + + public static RecipesFurnace getInstance() { + return RecipesFurnace.a; +@@ -52,6 +53,12 @@ + this.registerRecipe(Blocks.LAPIS_ORE, new ItemStack(Items.DYE, 1, EnumColor.BLUE.getInvColorIndex()), 0.2F); + this.registerRecipe(Blocks.QUARTZ_ORE, new ItemStack(Items.QUARTZ), 0.2F); + } ++ ++ // CraftBukkit start - add method ++ public void registerRecipe(ItemStack itemstack, ItemStack itemstack1) { ++ this.customRecipes.put(itemstack, itemstack1); ++ } ++ // CraftBukkit end + + public void registerRecipe(Block block, ItemStack itemstack, float f) { + this.a(Item.getItemOf(block), itemstack, f); +@@ -67,13 +74,23 @@ + } + + public ItemStack getResult(ItemStack itemstack) { +- Iterator iterator = this.recipes.entrySet().iterator(); ++ // CraftBukkit start - initialize to customRecipes ++ boolean vanilla = false; ++ Iterator iterator = this.customRecipes.entrySet().iterator(); ++ // CraftBukkit end + + Entry entry; + + do { + if (!iterator.hasNext()) { +- return null; ++ // CraftBukkit start - fall back to vanilla recipes ++ if (!vanilla && !recipes.isEmpty()) { ++ iterator = this.recipes.entrySet().iterator(); ++ vanilla = true; ++ } else { ++ return null; ++ } ++ // CraftBukkit end + } + + entry = (Entry) iterator.next(); diff --git a/nms-patches/RegionFile.patch b/nms-patches/RegionFile.patch new file mode 100644 index 0000000000..80999d9c12 --- /dev/null +++ b/nms-patches/RegionFile.patch @@ -0,0 +1,81 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/RegionFile.java 2014-11-27 08:59:46.881421054 +1100 ++++ src/main/java/net/minecraft/server/RegionFile.java 2014-11-27 08:42:10.160850895 +1100 +@@ -86,8 +86,46 @@ + } catch (IOException ioexception) { + ioexception.printStackTrace(); + } ++ } ++ ++ // CraftBukkit start - This is a copy (sort of) of the method below it, make sure they stay in sync ++ public synchronized boolean chunkExists(int i, int j) { ++ if (this.d(i, j)) { ++ return false; ++ } else { ++ try { ++ int k = this.e(i, j); ++ ++ if (k == 0) { ++ return false; ++ } else { ++ int l = k >> 8; ++ int i1 = k & 255; ++ ++ if (l + i1 > this.f.size()) { ++ return false; ++ } ++ ++ this.c.seek((long) (l * 4096)); ++ int j1 = this.c.readInt(); ++ ++ if (j1 > 4096 * i1 || j1 <= 0) { ++ return false; ++ } ++ ++ byte b0 = this.c.readByte(); ++ if (b0 == 1 || b0 == 2) { ++ return true; ++ } ++ } ++ } catch (IOException ioexception) { ++ return false; ++ } ++ } + ++ return false; + } ++ // CraftBukkit end + + public synchronized DataInputStream a(int i, int j) { + if (this.d(i, j)) { +@@ -214,7 +252,7 @@ + + } + +- private void a(int i, byte[] abyte, int j) { ++ private void a(int i, byte[] abyte, int j) throws IOException { // CraftBukkit - added throws + this.c.seek((long) (i * 4096)); + this.c.writeInt(j + 1); + this.c.writeByte(2); +@@ -233,19 +271,19 @@ + return this.e(i, j) != 0; + } + +- private void a(int i, int j, int k) { ++ private void a(int i, int j, int k) throws IOException { // CraftBukkit - added throws + this.d[i + j * 32] = k; + this.c.seek((long) ((i + j * 32) * 4)); + this.c.writeInt(k); + } + +- private void b(int i, int j, int k) { ++ private void b(int i, int j, int k) throws IOException { // CraftBukkit - added throws + this.e[i + j * 32] = k; + this.c.seek((long) (4096 + (i + j * 32) * 4)); + this.c.writeInt(k); + } + +- public void c() { ++ public void c() throws IOException { // CraftBukkit - added throws + if (this.c != null) { + this.c.close(); + } diff --git a/nms-patches/RemoteControlCommandListener.patch b/nms-patches/RemoteControlCommandListener.patch new file mode 100644 index 0000000000..9cf48bf63d --- /dev/null +++ b/nms-patches/RemoteControlCommandListener.patch @@ -0,0 +1,15 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/RemoteControlCommandListener.java 2014-11-27 08:59:46.885421036 +1100 ++++ src/main/java/net/minecraft/server/RemoteControlCommandListener.java 2014-11-27 08:42:10.152850911 +1100 +@@ -26,6 +26,12 @@ + public IChatBaseComponent getScoreboardDisplayName() { + return new ChatComponentText(this.getName()); + } ++ ++ // CraftBukkit start - Send a String ++ public void sendMessage(String message) { ++ this.b.append(message); ++ } ++ // CraftBukkit end + + public void sendMessage(IChatBaseComponent ichatbasecomponent) { + this.b.append(ichatbasecomponent.c()); diff --git a/nms-patches/ScoreboardServer.patch b/nms-patches/ScoreboardServer.patch new file mode 100644 index 0000000000..4b480d137c --- /dev/null +++ b/nms-patches/ScoreboardServer.patch @@ -0,0 +1,126 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/ScoreboardServer.java 2014-11-27 08:59:46.885421036 +1100 ++++ src/main/java/net/minecraft/server/ScoreboardServer.java 2014-11-27 08:42:10.164850887 +1100 +@@ -21,7 +21,7 @@ + public void handleScoreChanged(ScoreboardScore scoreboardscore) { + super.handleScoreChanged(scoreboardscore); + if (this.b.contains(scoreboardscore.getObjective())) { +- this.a.getPlayerList().sendAll(new PacketPlayOutScoreboardScore(scoreboardscore)); ++ this.sendAll(new PacketPlayOutScoreboardScore(scoreboardscore)); // CraftBukkit - Internal packet method + } + + this.b(); +@@ -29,13 +29,13 @@ + + public void handlePlayerRemoved(String s) { + super.handlePlayerRemoved(s); +- this.a.getPlayerList().sendAll(new PacketPlayOutScoreboardScore(s)); ++ this.sendAll(new PacketPlayOutScoreboardScore(s)); // CraftBukkit - Internal packet method + this.b(); + } + + public void a(String s, ScoreboardObjective scoreboardobjective) { + super.a(s, scoreboardobjective); +- this.a.getPlayerList().sendAll(new PacketPlayOutScoreboardScore(s, scoreboardobjective)); ++ this.sendAll(new PacketPlayOutScoreboardScore(s, scoreboardobjective)); // CraftBukkit - Internal packet method + this.b(); + } + +@@ -45,7 +45,7 @@ + super.setDisplaySlot(i, scoreboardobjective); + if (scoreboardobjective1 != scoreboardobjective && scoreboardobjective1 != null) { + if (this.h(scoreboardobjective1) > 0) { +- this.a.getPlayerList().sendAll(new PacketPlayOutScoreboardDisplayObjective(i, scoreboardobjective)); ++ this.sendAll(new PacketPlayOutScoreboardDisplayObjective(i, scoreboardobjective)); // CraftBukkit - Internal packet method + } else { + this.g(scoreboardobjective1); + } +@@ -53,7 +53,7 @@ + + if (scoreboardobjective != null) { + if (this.b.contains(scoreboardobjective)) { +- this.a.getPlayerList().sendAll(new PacketPlayOutScoreboardDisplayObjective(i, scoreboardobjective)); ++ this.sendAll(new PacketPlayOutScoreboardDisplayObjective(i, scoreboardobjective)); // CraftBukkit - Internal packet method + } else { + this.e(scoreboardobjective); + } +@@ -66,7 +66,7 @@ + if (super.addPlayerToTeam(s, s1)) { + ScoreboardTeam scoreboardteam = this.getTeam(s1); + +- this.a.getPlayerList().sendAll(new PacketPlayOutScoreboardTeam(scoreboardteam, Arrays.asList(new String[] { s}), 3)); ++ this.sendAll(new PacketPlayOutScoreboardTeam(scoreboardteam, Arrays.asList(new String[] { s}), 3)); // CraftBukkit - Internal packet method + this.b(); + return true; + } else { +@@ -76,7 +76,7 @@ + + public void removePlayerFromTeam(String s, ScoreboardTeam scoreboardteam) { + super.removePlayerFromTeam(s, scoreboardteam); +- this.a.getPlayerList().sendAll(new PacketPlayOutScoreboardTeam(scoreboardteam, Arrays.asList(new String[] { s}), 4)); ++ this.sendAll(new PacketPlayOutScoreboardTeam(scoreboardteam, Arrays.asList(new String[] { s}), 4)); // CraftBukkit - Internal packet method + this.b(); + } + +@@ -88,7 +88,7 @@ + public void handleObjectiveChanged(ScoreboardObjective scoreboardobjective) { + super.handleObjectiveChanged(scoreboardobjective); + if (this.b.contains(scoreboardobjective)) { +- this.a.getPlayerList().sendAll(new PacketPlayOutScoreboardObjective(scoreboardobjective, 2)); ++ this.sendAll(new PacketPlayOutScoreboardObjective(scoreboardobjective, 2)); // CraftBukkit - Internal packet method + } + + this.b(); +@@ -105,19 +105,19 @@ + + public void handleTeamAdded(ScoreboardTeam scoreboardteam) { + super.handleTeamAdded(scoreboardteam); +- this.a.getPlayerList().sendAll(new PacketPlayOutScoreboardTeam(scoreboardteam, 0)); ++ this.sendAll(new PacketPlayOutScoreboardTeam(scoreboardteam, 0)); // CraftBukkit - Internal packet method + this.b(); + } + + public void handleTeamChanged(ScoreboardTeam scoreboardteam) { + super.handleTeamChanged(scoreboardteam); +- this.a.getPlayerList().sendAll(new PacketPlayOutScoreboardTeam(scoreboardteam, 2)); ++ this.sendAll(new PacketPlayOutScoreboardTeam(scoreboardteam, 2)); // CraftBukkit - Internal packet method + this.b(); + } + + public void handleTeamRemoved(ScoreboardTeam scoreboardteam) { + super.handleTeamRemoved(scoreboardteam); +- this.a.getPlayerList().sendAll(new PacketPlayOutScoreboardTeam(scoreboardteam, 1)); ++ this.sendAll(new PacketPlayOutScoreboardTeam(scoreboardteam, 1)); // CraftBukkit - Internal packet method + this.b(); + } + +@@ -160,6 +160,7 @@ + + while (iterator.hasNext()) { + EntityPlayer entityplayer = (EntityPlayer) iterator.next(); ++ if (entityplayer.getBukkitEntity().getScoreboard().getHandle() != this) continue; // CraftBukkit - Only players on this board + Iterator iterator1 = list.iterator(); + + while (iterator1.hasNext()) { +@@ -192,6 +193,7 @@ + + while (iterator.hasNext()) { + EntityPlayer entityplayer = (EntityPlayer) iterator.next(); ++ if (entityplayer.getBukkitEntity().getScoreboard().getHandle() != this) continue; // CraftBukkit - Only players on this board + Iterator iterator1 = list.iterator(); + + while (iterator1.hasNext()) { +@@ -215,4 +217,14 @@ + + return i; + } ++ ++ // CraftBukkit start - Send to players ++ private void sendAll(Packet packet) { ++ for (EntityPlayer entityplayer : (List) this.a.getPlayerList().players) { ++ if (entityplayer.getBukkitEntity().getScoreboard().getHandle() == this) { ++ entityplayer.playerConnection.sendPacket(packet); ++ } ++ } ++ } ++ // CraftBukkit end + } diff --git a/nms-patches/SecondaryWorldServer.patch b/nms-patches/SecondaryWorldServer.patch new file mode 100644 index 0000000000..935246b60c --- /dev/null +++ b/nms-patches/SecondaryWorldServer.patch @@ -0,0 +1,15 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/SecondaryWorldServer.java 2014-11-27 08:59:46.889421019 +1100 ++++ src/main/java/net/minecraft/server/SecondaryWorldServer.java 2014-11-27 08:42:10.088851036 +1100 +@@ -4,8 +4,10 @@ + + private WorldServer a; + +- public SecondaryWorldServer(MinecraftServer minecraftserver, IDataManager idatamanager, int i, WorldServer worldserver, MethodProfiler methodprofiler) { +- super(minecraftserver, idatamanager, new SecondaryWorldData(worldserver.getWorldData()), i, methodprofiler); ++ // CraftBukkit start - Add WorldData, Environment and ChunkGenerator arguments ++ public SecondaryWorldServer(MinecraftServer minecraftserver, IDataManager idatamanager, int i, WorldServer worldserver, MethodProfiler methodprofiler, WorldData worldData, org.bukkit.World.Environment env, org.bukkit.generator.ChunkGenerator gen) { ++ super(minecraftserver, idatamanager, worldData, i, methodprofiler, env, gen); ++ // CraftBukkit end + this.a = worldserver; + worldserver.af().a((IWorldBorderListener) (new SecondaryWorldServerInnerClass1(this))); + } diff --git a/nms-patches/ShapedRecipes.patch b/nms-patches/ShapedRecipes.patch new file mode 100644 index 0000000000..5b3908ceb2 --- /dev/null +++ b/nms-patches/ShapedRecipes.patch @@ -0,0 +1,77 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/ShapedRecipes.java 2014-11-27 08:59:46.889421019 +1100 ++++ src/main/java/net/minecraft/server/ShapedRecipes.java 2014-11-27 08:42:10.164850887 +1100 +@@ -1,5 +1,11 @@ + package net.minecraft.server; + ++// CraftBukkit start ++import org.bukkit.craftbukkit.inventory.CraftItemStack; ++import org.bukkit.craftbukkit.inventory.CraftShapedRecipe; ++// CraftBukkit end ++ ++ + public class ShapedRecipes implements IRecipe { + + private final int width; +@@ -14,6 +20,62 @@ + this.items = aitemstack; + this.result = itemstack; + } ++ ++ // CraftBukkit start ++ public org.bukkit.inventory.ShapedRecipe toBukkitRecipe() { ++ CraftItemStack result = CraftItemStack.asCraftMirror(this.result); ++ CraftShapedRecipe recipe = new CraftShapedRecipe(result, this); ++ switch (this.height) { ++ case 1: ++ switch (this.width) { ++ case 1: ++ recipe.shape("a"); ++ break; ++ case 2: ++ recipe.shape("ab"); ++ break; ++ case 3: ++ recipe.shape("abc"); ++ break; ++ } ++ break; ++ case 2: ++ switch (this.width) { ++ case 1: ++ recipe.shape("a","b"); ++ break; ++ case 2: ++ recipe.shape("ab","cd"); ++ break; ++ case 3: ++ recipe.shape("abc","def"); ++ break; ++ } ++ break; ++ case 3: ++ switch (this.width) { ++ case 1: ++ recipe.shape("a","b","c"); ++ break; ++ case 2: ++ recipe.shape("ab","cd","ef"); ++ break; ++ case 3: ++ recipe.shape("abc","def","ghi"); ++ break; ++ } ++ break; ++ } ++ char c = 'a'; ++ for (ItemStack stack : this.items) { ++ if (stack != null) { ++ recipe.setIngredient(c, org.bukkit.craftbukkit.util.CraftMagicNumbers.getMaterial(stack.getItem()), stack.getData()); ++ } ++ c++; ++ } ++ return recipe; ++ } ++ // CraftBukkit end + + public ItemStack b() { + return this.result; diff --git a/nms-patches/ShapelessRecipes.patch b/nms-patches/ShapelessRecipes.patch new file mode 100644 index 0000000000..7e4230c91e --- /dev/null +++ b/nms-patches/ShapelessRecipes.patch @@ -0,0 +1,35 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/ShapelessRecipes.java 2014-11-27 08:59:46.889421019 +1100 ++++ src/main/java/net/minecraft/server/ShapelessRecipes.java 2014-11-27 08:42:10.128850958 +1100 +@@ -5,6 +5,11 @@ + import java.util.Iterator; + import java.util.List; + ++// CraftBukkit start ++import org.bukkit.craftbukkit.inventory.CraftItemStack; ++import org.bukkit.craftbukkit.inventory.CraftShapelessRecipe; ++// CraftBukkit end ++ + public class ShapelessRecipes implements IRecipe { + + private final ItemStack result; +@@ -14,6 +19,20 @@ + this.result = itemstack; + this.ingredients = list; + } ++ ++ // CraftBukkit start ++ @SuppressWarnings("unchecked") ++ public org.bukkit.inventory.ShapelessRecipe toBukkitRecipe() { ++ CraftItemStack result = CraftItemStack.asCraftMirror(this.result); ++ CraftShapelessRecipe recipe = new CraftShapelessRecipe(result, this); ++ for (ItemStack stack : (List) this.ingredients) { ++ if (stack != null) { ++ recipe.addIngredient(org.bukkit.craftbukkit.util.CraftMagicNumbers.getMaterial(stack.getItem()), stack.getData()); ++ } ++ } ++ return recipe; ++ } ++ // CraftBukkit end + + public ItemStack b() { + return this.result; diff --git a/nms-patches/SlotFurnaceResult.patch b/nms-patches/SlotFurnaceResult.patch new file mode 100644 index 0000000000..626529dee6 --- /dev/null +++ b/nms-patches/SlotFurnaceResult.patch @@ -0,0 +1,31 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/SlotFurnaceResult.java 2014-11-27 08:59:46.893421001 +1100 ++++ src/main/java/net/minecraft/server/SlotFurnaceResult.java 2014-11-27 08:42:10.128850958 +1100 +@@ -1,5 +1,10 @@ + package net.minecraft.server; + ++// CraftBukkit start ++import org.bukkit.entity.Player; ++import org.bukkit.event.inventory.FurnaceExtractEvent; ++// CraftBukkit end ++ + public class SlotFurnaceResult extends Slot { + + private EntityHuman a; +@@ -49,6 +54,17 @@ + + i = j; + } ++ ++ // CraftBukkit start - fire FurnaceExtractEvent ++ Player player = (Player) a.getBukkitEntity(); ++ TileEntityFurnace furnace = ((TileEntityFurnace) this.inventory); ++ org.bukkit.block.Block block = a.world.getWorld().getBlockAt(furnace.position.getX(), furnace.position.getY(), furnace.position.getZ()); ++ ++ FurnaceExtractEvent event = new FurnaceExtractEvent(player, block, org.bukkit.craftbukkit.util.CraftMagicNumbers.getMaterial(itemstack.getItem()), itemstack.count, i); ++ a.world.getServer().getPluginManager().callEvent(event); ++ ++ i = event.getExpToDrop(); ++ // CraftBukkit end + + while (i > 0) { + j = EntityExperienceOrb.getOrbValue(i); diff --git a/nms-patches/SpawnerCreature.patch b/nms-patches/SpawnerCreature.patch new file mode 100644 index 0000000000..968281733c --- /dev/null +++ b/nms-patches/SpawnerCreature.patch @@ -0,0 +1,109 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/SpawnerCreature.java 2014-11-27 08:59:46.893421001 +1100 ++++ src/main/java/net/minecraft/server/SpawnerCreature.java 2014-11-27 08:42:10.164850887 +1100 +@@ -6,10 +6,16 @@ + import java.util.Random; + import java.util.Set; + ++// CraftBukkit start ++import org.bukkit.craftbukkit.util.LongHash; ++import org.bukkit.craftbukkit.util.LongHashSet; ++import org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason; ++// CraftBukkit end ++ + public final class SpawnerCreature { + + private static final int a = (int) Math.pow(17.0D, 2.0D); +- private final Set b = Sets.newHashSet(); ++ private final LongHashSet b = new LongHashSet(); + + public SpawnerCreature() {} + +@@ -36,14 +42,18 @@ + for (int i1 = -b0; i1 <= b0; ++i1) { + for (k = -b0; k <= b0; ++k) { + boolean flag3 = i1 == -b0 || i1 == b0 || k == -b0 || k == b0; +- ChunkCoordIntPair chunkcoordintpair = new ChunkCoordIntPair(i1 + l, k + j); ++ // ChunkCoordIntPair chunkcoordintpair = new ChunkCoordIntPair(i1 + l, k + j); + +- if (!this.b.contains(chunkcoordintpair)) { ++ // CraftBukkit start - use LongHash and LongHashSet ++ long chunkCoords = LongHash.toLong(i1 + l, k + j); ++ ++ if (!this.b.contains(chunkCoords)) { + ++i; +- if (!flag3 && worldserver.af().isInBounds(chunkcoordintpair)) { +- this.b.add(chunkcoordintpair); ++ if (!flag3 && worldserver.af().isInBounds(chunkCoords)) { ++ this.b.add(chunkCoords); + } + } ++ // CraftBukkit end + } + } + } +@@ -57,18 +67,41 @@ + + for (int k1 = 0; k1 < j; ++k1) { + EnumCreatureType enumcreaturetype = aenumcreaturetype[k1]; ++ ++ // CraftBukkit start - Use per-world spawn limits ++ int limit = enumcreaturetype.b(); ++ switch (enumcreaturetype) { ++ case MONSTER: ++ limit = worldserver.getWorld().getMonsterSpawnLimit(); ++ break; ++ case CREATURE: ++ limit = worldserver.getWorld().getAnimalSpawnLimit(); ++ break; ++ case WATER_CREATURE: ++ limit = worldserver.getWorld().getWaterAnimalSpawnLimit(); ++ break; ++ case AMBIENT: ++ limit = worldserver.getWorld().getAmbientSpawnLimit(); ++ break; ++ } ++ ++ if (limit == 0) { ++ continue; ++ } ++ // CraftBukkit end + + if ((!enumcreaturetype.d() || flag1) && (enumcreaturetype.d() || flag) && (!enumcreaturetype.e() || flag2)) { + k = worldserver.a(enumcreaturetype.a()); +- int l1 = enumcreaturetype.b() * i / SpawnerCreature.a; ++ int l1 = limit * i / a; // CraftBukkit - use per-world limits + + if (k <= l1) { + Iterator iterator1 = this.b.iterator(); + + label115: + while (iterator1.hasNext()) { +- ChunkCoordIntPair chunkcoordintpair1 = (ChunkCoordIntPair) iterator1.next(); +- BlockPosition blockposition1 = getRandomPosition(worldserver, chunkcoordintpair1.x, chunkcoordintpair1.z); ++ // CraftBukkit start = use LongHash and LongObjectHashMap ++ long key = ((Long) iterator1.next()).longValue(); ++ BlockPosition blockposition1 = getRandomPosition(worldserver, LongHash.msw(key), LongHash.lsw(key)); + int i2 = blockposition1.getX(); + int j2 = blockposition1.getY(); + int k2 = blockposition1.getZ(); +@@ -120,7 +153,7 @@ + groupdataentity = entityinsentient.prepare(worldserver.E(new BlockPosition(entityinsentient)), groupdataentity); + if (entityinsentient.canSpawn()) { + ++l2; +- worldserver.addEntity(entityinsentient); ++ worldserver.addEntity(entityinsentient, SpawnReason.NATURAL); // CraftBukkit - Added a reason for spawning this creature + } + + if (l2 >= entityinsentient.bU()) { +@@ -214,8 +247,10 @@ + } + + entityinsentient.setPositionRotation((double) ((float) j1 + 0.5F), (double) blockposition.getY(), (double) ((float) k1 + 0.5F), random.nextFloat() * 360.0F, 0.0F); +- world.addEntity(entityinsentient); ++ // CraftBukkit start - Added a reason for spawning this creature, moved entityinsentient.prepare(groupdataentity) up + groupdataentity = entityinsentient.prepare(world.E(new BlockPosition(entityinsentient)), groupdataentity); ++ world.addEntity(entityinsentient, SpawnReason.CHUNK_GEN); ++ // CraftBukkit end + flag = true; + } + diff --git a/nms-patches/StatisticManager.patch b/nms-patches/StatisticManager.patch new file mode 100644 index 0000000000..5b9486b3f7 --- /dev/null +++ b/nms-patches/StatisticManager.patch @@ -0,0 +1,15 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/StatisticManager.java 2014-11-27 08:59:46.893421001 +1100 ++++ src/main/java/net/minecraft/server/StatisticManager.java 2014-11-27 08:42:10.172850872 +1100 +@@ -19,6 +19,12 @@ + + public void b(EntityHuman entityhuman, Statistic statistic, int i) { + if (!statistic.d() || this.b((Achievement) statistic)) { ++ // CraftBukkit start - fire Statistic events ++ org.bukkit.event.Cancellable cancellable = org.bukkit.craftbukkit.event.CraftEventFactory.handleStatisticsIncrease(entityhuman, statistic, this.getStatisticValue(statistic), i); ++ if (cancellable != null && cancellable.isCancelled()) { ++ return; ++ } ++ // CraftBukkit end + this.setStatistic(entityhuman, statistic, this.getStatisticValue(statistic) + i); + } + } diff --git a/nms-patches/SwitchHelperLogVariant.patch b/nms-patches/SwitchHelperLogVariant.patch new file mode 100644 index 0000000000..e6b38cc5f3 --- /dev/null +++ b/nms-patches/SwitchHelperLogVariant.patch @@ -0,0 +1,9 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/SwitchHelperLogVariant.java 2014-11-27 08:59:46.897420984 +1100 ++++ src/main/java/net/minecraft/server/SwitchHelperLogVariant.java 2014-11-27 08:42:10.084851043 +1100 +@@ -1,5 +1,6 @@ + package net.minecraft.server; + ++// CraftBukkit - imported for visibility + class SwitchHelperLogVariant { + + static final int[] a = new int[EnumLogVariant.values().length]; diff --git a/nms-patches/ThreadCommandReader.patch b/nms-patches/ThreadCommandReader.patch new file mode 100644 index 0000000000..87bf341a32 --- /dev/null +++ b/nms-patches/ThreadCommandReader.patch @@ -0,0 +1,43 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/ThreadCommandReader.java 2014-11-27 08:59:46.897420984 +1100 ++++ src/main/java/net/minecraft/server/ThreadCommandReader.java 2014-11-27 08:42:10.084851043 +1100 +@@ -4,6 +4,8 @@ + import java.io.IOException; + import java.io.InputStreamReader; + ++import static org.bukkit.craftbukkit.Main.*; // CraftBukkit ++ + class ThreadCommandReader extends Thread { + + final DedicatedServer server; +@@ -14,13 +16,28 @@ + } + + public void run() { +- BufferedReader bufferedreader = new BufferedReader(new InputStreamReader(System.in)); ++ // CraftBukkit start ++ if (!useConsole) { ++ return; ++ } ++ // CraftBukkit end ++ ++ jline.console.ConsoleReader bufferedreader = this.server.reader; // CraftBukkit + + String s; + + try { +- while (!this.server.isStopped() && this.server.isRunning() && (s = bufferedreader.readLine()) != null) { +- this.server.issueCommand(s, this.server); ++ // CraftBukkit start - JLine disabling compatibility ++ while (!this.server.isStopped() && this.server.isRunning()) { ++ if (useJline) { ++ s = bufferedreader.readLine(">", null); ++ } else { ++ s = bufferedreader.readLine(); ++ } ++ if (s != null && s.trim().length() > 0) { // Trim to filter lines which are just spaces ++ this.server.issueCommand(s, this.server); ++ } ++ // CraftBukkit end + } + } catch (IOException ioexception) { + DedicatedServer.aR().error("Exception handling console input", ioexception); diff --git a/nms-patches/ThreadPlayerLookupUUID.patch b/nms-patches/ThreadPlayerLookupUUID.patch new file mode 100644 index 0000000000..d073269099 --- /dev/null +++ b/nms-patches/ThreadPlayerLookupUUID.patch @@ -0,0 +1,72 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/ThreadPlayerLookupUUID.java 2014-11-27 08:59:46.901420966 +1100 ++++ src/main/java/net/minecraft/server/ThreadPlayerLookupUUID.java 2014-11-27 08:42:10.164850887 +1100 +@@ -5,6 +5,12 @@ + import java.math.BigInteger; + import java.util.UUID; + ++// CraftBukkit start ++import org.bukkit.craftbukkit.util.Waitable; ++import org.bukkit.event.player.AsyncPlayerPreLoginEvent; ++import org.bukkit.event.player.PlayerPreLoginEvent; ++// CraftBukkit end ++ + class ThreadPlayerLookupUUID extends Thread { + + final LoginListener a; +@@ -22,6 +28,44 @@ + + LoginListener.a(this.a, LoginListener.a(this.a).aB().hasJoinedServer(new GameProfile((UUID) null, gameprofile.getName()), s)); + if (LoginListener.b(this.a) != null) { ++ // CraftBukkit start - fire PlayerPreLoginEvent ++ if (!this.a.networkManager.g()) { ++ return; ++ } ++ ++ String playerName = LoginListener.a(this.a).getName(); ++ java.net.InetAddress address = ((java.net.InetSocketAddress) a.networkManager.getSocketAddress()).getAddress(); ++ java.util.UUID uniqueId = LoginListener.b(this.a).getId(); ++ final org.bukkit.craftbukkit.CraftServer server = LoginListener.a(this.a).server; ++ ++ AsyncPlayerPreLoginEvent asyncEvent = new AsyncPlayerPreLoginEvent(playerName, address, uniqueId); ++ server.getPluginManager().callEvent(asyncEvent); ++ ++ if (PlayerPreLoginEvent.getHandlerList().getRegisteredListeners().length != 0) { ++ final PlayerPreLoginEvent event = new PlayerPreLoginEvent(playerName, address, uniqueId); ++ if (asyncEvent.getResult() != PlayerPreLoginEvent.Result.ALLOWED) { ++ event.disallow(asyncEvent.getResult(), asyncEvent.getKickMessage()); ++ } ++ Waitable waitable = new Waitable() { ++ @Override ++ protected PlayerPreLoginEvent.Result evaluate() { ++ server.getPluginManager().callEvent(event); ++ return event.getResult(); ++ }}; ++ ++ LoginListener.a(this.a).processQueue.add(waitable); ++ if (waitable.get() != PlayerPreLoginEvent.Result.ALLOWED) { ++ this.a.disconnect(event.getKickMessage()); ++ return; ++ } ++ } else { ++ if (asyncEvent.getLoginResult() != AsyncPlayerPreLoginEvent.Result.ALLOWED) { ++ this.a.disconnect(asyncEvent.getKickMessage()); ++ return; ++ } ++ } ++ // CraftBukkit end ++ + LoginListener.e().info("UUID of player " + LoginListener.b(this.a).getName() + " is " + LoginListener.b(this.a).getId()); + LoginListener.a(this.a, EnumProtocolState.READY_TO_ACCEPT); + } else if (LoginListener.a(this.a).S()) { +@@ -41,6 +85,11 @@ + this.a.disconnect("Authentication servers are down. Please try again later, sorry!"); + LoginListener.e().error("Couldn\'t verify username because servers are unavailable"); + } ++ // CraftBukkit start - catch all exceptions ++ } catch (Exception exception) { ++ this.a.disconnect("Failed to verify username!"); ++ LoginListener.a(this.a).server.getLogger().log(java.util.logging.Level.WARNING, "Exception verifying " + LoginListener.a(this.a).getName(), exception); ++ // CraftBukkit end + } + + } diff --git a/nms-patches/TileEntity.patch b/nms-patches/TileEntity.patch new file mode 100644 index 0000000000..dd76aea170 --- /dev/null +++ b/nms-patches/TileEntity.patch @@ -0,0 +1,24 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/TileEntity.java 2014-11-27 08:59:46.913420913 +1100 ++++ src/main/java/net/minecraft/server/TileEntity.java 2014-11-27 08:42:10.148850918 +1100 +@@ -6,6 +6,8 @@ + import org.apache.logging.log4j.LogManager; + import org.apache.logging.log4j.Logger; + ++import org.bukkit.inventory.InventoryHolder; // CraftBukkit ++ + public abstract class TileEntity { + + private static final Logger a = LogManager.getLogger(); +@@ -182,4 +184,12 @@ + a(TileEntityFlowerPot.class, "FlowerPot"); + a(TileEntityBanner.class, "Banner"); + } ++ ++ // CraftBukkit start - add method ++ public InventoryHolder getOwner() { ++ org.bukkit.block.BlockState state = world.getWorld().getBlockAt(position.getX(), position.getY(), position.getZ()).getState(); ++ if (state instanceof InventoryHolder) return (InventoryHolder) state; ++ return null; ++ } ++ // CraftBukkit end + } diff --git a/nms-patches/TileEntityBeacon.patch b/nms-patches/TileEntityBeacon.patch new file mode 100644 index 0000000000..a5179536c2 --- /dev/null +++ b/nms-patches/TileEntityBeacon.patch @@ -0,0 +1,54 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/TileEntityBeacon.java 2014-11-27 08:59:46.901420966 +1100 ++++ src/main/java/net/minecraft/server/TileEntityBeacon.java 2014-11-27 08:42:10.152850911 +1100 +@@ -5,6 +5,11 @@ + import java.util.Iterator; + import java.util.List; + ++// CraftBukkit start ++import org.bukkit.craftbukkit.entity.CraftHumanEntity; ++import org.bukkit.entity.HumanEntity; ++// CraftBukkit end ++ + public class TileEntityBeacon extends TileEntityContainer implements IUpdatePlayerListBox, IInventory { + + public static final MobEffectList[][] a = new MobEffectList[][] { { MobEffectList.FASTER_MOVEMENT, MobEffectList.FASTER_DIG}, { MobEffectList.RESISTANCE, MobEffectList.JUMP}, { MobEffectList.INCREASE_DAMAGE}, { MobEffectList.REGENERATION}}; +@@ -15,6 +20,30 @@ + private int l; + private ItemStack inventorySlot; + private String n; ++ // CraftBukkit start - add fields and methods ++ public List transaction = new java.util.ArrayList(); ++ private int maxStack = MAX_STACK; ++ ++ public ItemStack[] getContents() { ++ return new ItemStack[] { this.inventorySlot }; ++ } ++ ++ public void onOpen(CraftHumanEntity who) { ++ transaction.add(who); ++ } ++ ++ public void onClose(CraftHumanEntity who) { ++ transaction.remove(who); ++ } ++ ++ public List getViewers() { ++ return transaction; ++ } ++ ++ public void setMaxStackSize(int size) { ++ maxStack = size; ++ } ++ // CraftBukkit end + + public TileEntityBeacon() {} + +@@ -182,7 +211,7 @@ + } + + public int getSize() { +- return 1; ++ return maxStack; // CraftBukkit + } + + public ItemStack getItem(int i) { diff --git a/nms-patches/TileEntityBrewingStand.patch b/nms-patches/TileEntityBrewingStand.patch new file mode 100644 index 0000000000..80e791ada7 --- /dev/null +++ b/nms-patches/TileEntityBrewingStand.patch @@ -0,0 +1,94 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/TileEntityBrewingStand.java 2014-11-27 08:59:46.901420966 +1100 ++++ src/main/java/net/minecraft/server/TileEntityBrewingStand.java 2014-11-27 08:42:10.132850949 +1100 +@@ -3,6 +3,12 @@ + import java.util.Arrays; + import java.util.List; + ++// CraftBukkit start ++import org.bukkit.craftbukkit.entity.CraftHumanEntity; ++import org.bukkit.entity.HumanEntity; ++import org.bukkit.event.inventory.BrewEvent; ++// CraftBukkit end ++ + public class TileEntityBrewingStand extends TileEntityContainer implements IUpdatePlayerListBox, IWorldInventory { + + private static final int[] a = new int[] { 3}; +@@ -12,8 +18,35 @@ + private boolean[] i; + private Item j; + private String k; ++ private int lastTick = MinecraftServer.currentTick; // CraftBukkit - add field + + public TileEntityBrewingStand() {} ++ ++ ++ // CraftBukkit start - add fields and methods ++ public List transaction = new java.util.ArrayList(); ++ private int maxStack = 64; ++ ++ public void onOpen(CraftHumanEntity who) { ++ transaction.add(who); ++ } ++ ++ public void onClose(CraftHumanEntity who) { ++ transaction.remove(who); ++ } ++ ++ public List getViewers() { ++ return transaction; ++ } ++ ++ public ItemStack[] getContents() { ++ return this.items; ++ } ++ ++ public void setMaxStackSize(int size) { ++ maxStack = size; ++ } ++ // CraftBukkit end + + public String getName() { + return this.hasCustomName() ? this.k : "container.brewing"; +@@ -32,9 +65,14 @@ + } + + public void c() { ++ // CraftBukkit start - Use wall time instead of ticks for brewing ++ int elapsedTicks = MinecraftServer.currentTick - this.lastTick; ++ this.lastTick = MinecraftServer.currentTick; ++ + if (this.brewTime > 0) { +- --this.brewTime; +- if (this.brewTime == 0) { ++ this.brewTime -= elapsedTicks; ++ if (this.brewTime <= 0) { // == -> <= ++ // CraftBukkit end + this.o(); + this.update(); + } else if (!this.n()) { +@@ -109,6 +147,16 @@ + private void o() { + if (this.n()) { + ItemStack itemstack = this.items[3]; ++ ++ // CraftBukkit start ++ if (getOwner() != null) { ++ BrewEvent event = new BrewEvent(world.getWorld().getBlockAt(position.getX(), position.getY(), position.getZ()), (org.bukkit.inventory.BrewerInventory) this.getOwner().getInventory()); ++ org.bukkit.Bukkit.getPluginManager().callEvent(event); ++ if (event.isCancelled()) { ++ return; ++ } ++ } ++ // CraftBukkit end + + for (int i = 0; i < 3; ++i) { + if (this.items[i] != null && this.items[i].getItem() == Items.POTION) { +@@ -221,7 +269,7 @@ + } + + public int getMaxStackSize() { +- return 64; ++ return this.maxStack; // CraftBukkit + } + + public boolean a(EntityHuman entityhuman) { diff --git a/nms-patches/TileEntityChest.patch b/nms-patches/TileEntityChest.patch new file mode 100644 index 0000000000..52d98548f9 --- /dev/null +++ b/nms-patches/TileEntityChest.patch @@ -0,0 +1,104 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/TileEntityChest.java 2014-11-27 08:59:46.905420949 +1100 ++++ src/main/java/net/minecraft/server/TileEntityChest.java 2014-11-27 08:42:10.168850880 +1100 +@@ -3,6 +3,11 @@ + import java.util.Iterator; + import java.util.List; + ++// CraftBukkit start ++import org.bukkit.craftbukkit.entity.CraftHumanEntity; ++import org.bukkit.entity.HumanEntity; ++// CraftBukkit end ++ + public class TileEntityChest extends TileEntityContainer implements IUpdatePlayerListBox, IInventory { + + private ItemStack[] items = new ItemStack[27]; +@@ -19,6 +24,31 @@ + private String p; + + public TileEntityChest() {} ++ ++ // CraftBukkit start - add fields and methods ++ public List transaction = new java.util.ArrayList(); ++ private int maxStack = MAX_STACK; ++ ++ public ItemStack[] getContents() { ++ return this.items; ++ } ++ ++ public void onOpen(CraftHumanEntity who) { ++ transaction.add(who); ++ } ++ ++ public void onClose(CraftHumanEntity who) { ++ transaction.remove(who); ++ } ++ ++ public List getViewers() { ++ return transaction; ++ } ++ ++ public void setMaxStackSize(int size) { ++ maxStack = size; ++ } ++ // CraftBukkit end + + public int getSize() { + return 27; +@@ -125,10 +155,11 @@ + } + + public int getMaxStackSize() { +- return 64; ++ return maxStack; // CraftBukkit + } + + public boolean a(EntityHuman entityhuman) { ++ if (this.world == null) return true; // CraftBukkit + return this.world.getTileEntity(this.position) != this ? false : entityhuman.e((double) this.position.getX() + 0.5D, (double) this.position.getY() + 0.5D, (double) this.position.getZ() + 0.5D) <= 64.0D; + } + +@@ -304,9 +335,22 @@ + if (this.l < 0) { + this.l = 0; + } ++ ++ int oldPower = Math.max(0, Math.min(15, this.l)); // CraftBukkit - Get power before new viewer is added + + ++this.l; ++ if (this.world == null) return; // CraftBukkit + this.world.playBlockAction(this.position, this.w(), 1, this.l); ++ ++ // CraftBukkit start - Call redstone event ++ if (this.w() == Blocks.TRAPPED_CHEST) { ++ int newPower = Math.max(0, Math.min(15, this.l)); ++ ++ if (oldPower != newPower) { ++ org.bukkit.craftbukkit.event.CraftEventFactory.callRedstoneChange(world, position.getX(), position.getY(), position.getZ(), oldPower, newPower); ++ } ++ } ++ // CraftBukkit end + this.world.applyPhysics(this.position, this.w()); + this.world.applyPhysics(this.position.down(), this.w()); + } +@@ -315,8 +359,21 @@ + + public void closeContainer(EntityHuman entityhuman) { + if (!entityhuman.v() && this.w() instanceof BlockChest) { ++ int oldPower = Math.max(0, Math.min(15, this.l)); // CraftBukkit - Get power before new viewer is added ++ + --this.l; ++ if (this.world == null) return; // CraftBukkit + this.world.playBlockAction(this.position, this.w(), 1, this.l); ++ ++ // CraftBukkit start - Call redstone event ++ if (this.w() == Blocks.TRAPPED_CHEST) { ++ int newPower = Math.max(0, Math.min(15, this.l)); ++ ++ if (oldPower != newPower) { ++ org.bukkit.craftbukkit.event.CraftEventFactory.callRedstoneChange(world, position.getX(), position.getY(), position.getZ(), oldPower, newPower); ++ } ++ } ++ // CraftBukkit end + this.world.applyPhysics(this.position, this.w()); + this.world.applyPhysics(this.position.down(), this.w()); + } diff --git a/nms-patches/TileEntityCommandListener.patch b/nms-patches/TileEntityCommandListener.patch new file mode 100644 index 0000000000..92b43a413b --- /dev/null +++ b/nms-patches/TileEntityCommandListener.patch @@ -0,0 +1,10 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/TileEntityCommandListener.java 2014-11-27 08:59:46.905420949 +1100 ++++ src/main/java/net/minecraft/server/TileEntityCommandListener.java 2014-11-27 08:42:10.132850949 +1100 +@@ -6,6 +6,7 @@ + + TileEntityCommandListener(TileEntityCommand tileentitycommand) { + this.a = tileentitycommand; ++ sender = new org.bukkit.craftbukkit.command.CraftBlockCommandSender(this); // CraftBukkit - add sender + } + + public BlockPosition getChunkCoordinates() { diff --git a/nms-patches/TileEntityDispenser.patch b/nms-patches/TileEntityDispenser.patch new file mode 100644 index 0000000000..918eb349ae --- /dev/null +++ b/nms-patches/TileEntityDispenser.patch @@ -0,0 +1,63 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/TileEntityDispenser.java 2014-11-27 08:59:46.905420949 +1100 ++++ src/main/java/net/minecraft/server/TileEntityDispenser.java 2014-11-27 08:42:10.116850981 +1100 +@@ -2,11 +2,43 @@ + + import java.util.Random; + ++// CraftBukkit start ++import java.util.List; ++ ++import org.bukkit.craftbukkit.entity.CraftHumanEntity; ++import org.bukkit.entity.HumanEntity; ++// CraftBukkit end ++ + public class TileEntityDispenser extends TileEntityContainer implements IInventory { + + private static final Random f = new Random(); + private ItemStack[] items = new ItemStack[9]; + protected String a; ++ ++ // CraftBukkit start - add fields and methods ++ public List transaction = new java.util.ArrayList(); ++ private int maxStack = MAX_STACK; ++ ++ public ItemStack[] getContents() { ++ return this.items; ++ } ++ ++ public void onOpen(CraftHumanEntity who) { ++ transaction.add(who); ++ } ++ ++ public void onClose(CraftHumanEntity who) { ++ transaction.remove(who); ++ } ++ ++ public List getViewers() { ++ return transaction; ++ } ++ ++ public void setMaxStackSize(int size) { ++ maxStack = size; ++ } ++ // CraftBukkit end + + public TileEntityDispenser() {} + +@@ -58,6 +90,7 @@ + + for (int k = 0; k < this.items.length; ++k) { + if (this.items[k] != null && TileEntityDispenser.f.nextInt(j++) == 0) { ++ if (this.items[k].count == 0) continue; // CraftBukkit + i = k; + } + } +@@ -140,7 +173,7 @@ + } + + public int getMaxStackSize() { +- return 64; ++ return maxStack; // CraftBukkit + } + + public boolean a(EntityHuman entityhuman) { diff --git a/nms-patches/TileEntityFurnace.patch b/nms-patches/TileEntityFurnace.patch new file mode 100644 index 0000000000..911664c52c --- /dev/null +++ b/nms-patches/TileEntityFurnace.patch @@ -0,0 +1,183 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/TileEntityFurnace.java 2014-11-27 08:59:46.909420931 +1100 ++++ src/main/java/net/minecraft/server/TileEntityFurnace.java 2014-11-27 08:42:10.156850903 +1100 +@@ -1,5 +1,15 @@ + package net.minecraft.server; + ++// CraftBukkit start ++import java.util.List; ++ ++import org.bukkit.craftbukkit.inventory.CraftItemStack; ++import org.bukkit.entity.HumanEntity; ++import org.bukkit.event.inventory.FurnaceBurnEvent; ++import org.bukkit.event.inventory.FurnaceSmeltEvent; ++import org.bukkit.craftbukkit.entity.CraftHumanEntity; ++// CraftBukkit end ++ + public class TileEntityFurnace extends TileEntityContainer implements IUpdatePlayerListBox, IWorldInventory { + + private static final int[] a = new int[] { 0}; +@@ -11,6 +21,32 @@ + public int cookTime; + private int cookTimeTotal; + private String m; ++ ++ // CraftBukkit start - add fields and methods ++ private int lastTick = MinecraftServer.currentTick; ++ private int maxStack = MAX_STACK; ++ public List transaction = new java.util.ArrayList(); ++ ++ public ItemStack[] getContents() { ++ return this.items; ++ } ++ ++ public void onOpen(CraftHumanEntity who) { ++ transaction.add(who); ++ } ++ ++ public void onClose(CraftHumanEntity who) { ++ transaction.remove(who); ++ } ++ ++ public List getViewers() { ++ return transaction; ++ } ++ ++ public void setMaxStackSize(int size) { ++ maxStack = size; ++ } ++ // CraftBukkit end + + public TileEntityFurnace() {} + +@@ -132,7 +168,7 @@ + } + + public int getMaxStackSize() { +- return 64; ++ return maxStack; // CraftBukkit + } + + public boolean isBurning() { +@@ -142,9 +178,27 @@ + public void c() { + boolean flag = this.isBurning(); + boolean flag1 = false; ++ ++ // CraftBukkit start - Use wall time instead of ticks for cooking ++ int elapsedTicks = MinecraftServer.currentTick - this.lastTick; ++ this.lastTick = MinecraftServer.currentTick; ++ ++ // CraftBukkit - moved from below ++ if (this.isBurning() && this.canBurn()) { ++ this.cookTime += elapsedTicks; ++ if (this.cookTime >= this.cookTimeTotal) { ++ this.cookTime = 0; ++ this.cookTimeTotal = this.a(this.items[0]); ++ this.burn(); ++ flag1 = true; ++ } ++ } else { ++ this.cookTime = 0; ++ } ++ // CraftBukkit end + + if (this.isBurning()) { +- --this.burnTime; ++ this.burnTime -= elapsedTicks; // CraftBukkit - use elapsedTicks in place of constant + } + + if (!this.world.isStatic) { +@@ -153,9 +207,21 @@ + this.cookTime = MathHelper.clamp(this.cookTime - 2, 0, this.cookTimeTotal); + } + } else { +- if (!this.isBurning() && this.canBurn()) { +- this.ticksForCurrentFuel = this.burnTime = fuelTime(this.items[1]); +- if (this.isBurning()) { ++ // CraftBukkit start - Handle multiple elapsed ticks ++ if (this.burnTime <= 0 && this.canBurn()) { // CraftBukkit - == to <= ++ CraftItemStack fuel = CraftItemStack.asCraftMirror(this.items[1]); ++ ++ FurnaceBurnEvent furnaceBurnEvent = new FurnaceBurnEvent(this.world.getWorld().getBlockAt(position.getX(), position.getY(), position.getZ()), fuel, fuelTime(this.items[1])); ++ this.world.getServer().getPluginManager().callEvent(furnaceBurnEvent); ++ ++ if (furnaceBurnEvent.isCancelled()) { ++ return; ++ } ++ ++ this.ticksForCurrentFuel = furnaceBurnEvent.getBurnTime(); ++ this.burnTime += this.ticksForCurrentFuel; ++ if (this.burnTime > 0 && furnaceBurnEvent.isBurning()) { ++ // CraftBukkit end + flag1 = true; + if (this.items[1] != null) { + --this.items[1].count; +@@ -167,7 +233,8 @@ + } + } + } +- ++ ++ /* CraftBukkit start - Moved up + if (this.isBurning() && this.canBurn()) { + ++this.cookTime; + if (this.cookTime == this.cookTimeTotal) { +@@ -179,6 +246,7 @@ + } else { + this.cookTime = 0; + } ++ */ + } + + if (flag != this.isBurning()) { +@@ -202,20 +270,48 @@ + return false; + } else { + ItemStack itemstack = RecipesFurnace.getInstance().getResult(this.items[0]); +- +- return itemstack == null ? false : (this.items[2] == null ? true : (!this.items[2].doMaterialsMatch(itemstack) ? false : (this.items[2].count < this.getMaxStackSize() && this.items[2].count < this.items[2].getMaxStackSize() ? true : this.items[2].count < itemstack.getMaxStackSize()))); ++ // CraftBukkit - consider resultant count instead of current count ++ return itemstack == null ? false : (this.items[2] == null ? true : (!this.items[2].doMaterialsMatch(itemstack) ? false : (this.items[2].count + itemstack.count <= this.getMaxStackSize() && this.items[2].count < this.items[2].getMaxStackSize() ? true : this.items[2].count + itemstack.count <= itemstack.getMaxStackSize()))); ++ + } + } + + public void burn() { + if (this.canBurn()) { + ItemStack itemstack = RecipesFurnace.getInstance().getResult(this.items[0]); ++ ++ // CraftBukkit start - fire FurnaceSmeltEvent ++ CraftItemStack source = CraftItemStack.asCraftMirror(this.items[0]); ++ org.bukkit.inventory.ItemStack result = CraftItemStack.asBukkitCopy(itemstack); + ++ FurnaceSmeltEvent furnaceSmeltEvent = new FurnaceSmeltEvent(this.world.getWorld().getBlockAt(position.getX(), position.getY(), position.getZ()), source, result); ++ this.world.getServer().getPluginManager().callEvent(furnaceSmeltEvent); ++ ++ if (furnaceSmeltEvent.isCancelled()) { ++ return; ++ } ++ ++ result = furnaceSmeltEvent.getResult(); ++ itemstack = CraftItemStack.asNMSCopy(result); ++ ++ if (itemstack != null) { ++ if (this.items[2] == null) { ++ this.items[2] = itemstack; ++ } else if (CraftItemStack.asCraftMirror(this.items[2]).isSimilar(result)) { ++ this.items[2].count += itemstack.count; ++ } else { ++ return; ++ } ++ } ++ ++ /* + if (this.items[2] == null) { + this.items[2] = itemstack.cloneItemStack(); + } else if (this.items[2].getItem() == itemstack.getItem()) { + ++this.items[2].count; + } ++ */ ++ // CraftBukkit end + + if (this.items[0].getItem() == Item.getItemOf(Blocks.SPONGE) && this.items[0].getData() == 1 && this.items[1] != null && this.items[1].getItem() == Items.BUCKET) { + this.items[1] = new ItemStack(Items.WATER_BUCKET); diff --git a/nms-patches/TileEntityHopper.patch b/nms-patches/TileEntityHopper.patch new file mode 100644 index 0000000000..a8f1dc5740 --- /dev/null +++ b/nms-patches/TileEntityHopper.patch @@ -0,0 +1,154 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/TileEntityHopper.java 2014-11-27 08:59:46.909420931 +1100 ++++ src/main/java/net/minecraft/server/TileEntityHopper.java 2014-11-27 08:42:10.132850949 +1100 +@@ -2,11 +2,45 @@ + + import java.util.List; + ++// CraftBukkit start ++import org.bukkit.craftbukkit.entity.CraftHumanEntity; ++import org.bukkit.craftbukkit.inventory.CraftItemStack; ++import org.bukkit.entity.HumanEntity; ++import org.bukkit.event.inventory.InventoryMoveItemEvent; ++import org.bukkit.event.inventory.InventoryPickupItemEvent; ++import org.bukkit.inventory.Inventory; ++// CraftBukkit end ++ + public class TileEntityHopper extends TileEntityContainer implements IHopper, IUpdatePlayerListBox { + + private ItemStack[] items = new ItemStack[5]; + private String f; + private int g = -1; ++ ++ // CraftBukkit start - add fields and methods ++ public List transaction = new java.util.ArrayList(); ++ private int maxStack = MAX_STACK; ++ ++ public ItemStack[] getContents() { ++ return this.items; ++ } ++ ++ public void onOpen(CraftHumanEntity who) { ++ transaction.add(who); ++ } ++ ++ public void onClose(CraftHumanEntity who) { ++ transaction.remove(who); ++ } ++ ++ public List getViewers() { ++ return transaction; ++ } ++ ++ public void setMaxStackSize(int size) { ++ maxStack = size; ++ } ++ // CraftBukkit end + + public TileEntityHopper() {} + +@@ -119,7 +153,7 @@ + } + + public int getMaxStackSize() { +- return 64; ++ return maxStack; // CraftBukkit + } + + public boolean a(EntityHuman entityhuman) { +@@ -215,10 +249,35 @@ + for (int i = 0; i < this.getSize(); ++i) { + if (this.getItem(i) != null) { + ItemStack itemstack = this.getItem(i).cloneItemStack(); +- ItemStack itemstack1 = addItem(iinventory, this.splitStack(i, 1), enumdirection); ++ // ItemStack itemstack1 = addItem(iinventory, this.splitStack(i, 1), enumdirection); ++ ++ // CraftBukkit start - Call event when pushing items into other inventories ++ CraftItemStack oitemstack = CraftItemStack.asCraftMirror(this.splitStack(i, 1)); ++ ++ Inventory destinationInventory; ++ // Have to special case large chests as they work oddly ++ if (iinventory instanceof InventoryLargeChest) { ++ destinationInventory = new org.bukkit.craftbukkit.inventory.CraftInventoryDoubleChest((InventoryLargeChest) iinventory); ++ } else { ++ destinationInventory = iinventory.getOwner().getInventory(); ++ } ++ ++ InventoryMoveItemEvent event = new InventoryMoveItemEvent(this.getOwner().getInventory(), oitemstack.clone(), destinationInventory, true); ++ this.getWorld().getServer().getPluginManager().callEvent(event); ++ if (event.isCancelled()) { ++ this.setItem(i, itemstack); ++ this.d(8); // Delay hopper checks ++ return false; ++ } ++ ItemStack itemstack1 = addItem(iinventory, CraftItemStack.asNMSCopy(event.getItem()), enumdirection); + + if (itemstack1 == null || itemstack1.count == 0) { +- iinventory.update(); ++ if (event.getItem().equals(oitemstack)) { ++ iinventory.update(); ++ } else { ++ this.setItem(i, itemstack); ++ } ++ // CraftBukkit end + return true; + } + +@@ -325,10 +384,41 @@ + + if (itemstack != null && b(iinventory, itemstack, i, enumdirection)) { + ItemStack itemstack1 = itemstack.cloneItemStack(); +- ItemStack itemstack2 = addItem(ihopper, iinventory.splitStack(i, 1), (EnumDirection) null); ++ // ItemStack itemstack2 = addItem(ihopper, iinventory.splitStack(i, 1), (EnumDirection) null); ++ // CraftBukkit start - Call event on collection of items from inventories into the hopper ++ CraftItemStack oitemstack = CraftItemStack.asCraftMirror(iinventory.splitStack(i, 1)); ++ ++ Inventory sourceInventory; ++ // Have to special case large chests as they work oddly ++ if (iinventory instanceof InventoryLargeChest) { ++ sourceInventory = new org.bukkit.craftbukkit.inventory.CraftInventoryDoubleChest((InventoryLargeChest) iinventory); ++ } else { ++ sourceInventory = iinventory.getOwner().getInventory(); ++ } ++ ++ InventoryMoveItemEvent event = new InventoryMoveItemEvent(sourceInventory, oitemstack.clone(), ihopper.getOwner().getInventory(), false); ++ ++ ihopper.getWorld().getServer().getPluginManager().callEvent(event); ++ if (event.isCancelled()) { ++ iinventory.setItem(i, itemstack1); ++ ++ if (ihopper instanceof TileEntityHopper) { ++ ((TileEntityHopper) ihopper).d(8); // Delay hopper checks ++ } else if (ihopper instanceof EntityMinecartHopper) { ++ ((EntityMinecartHopper) ihopper).l(4); // Delay hopper minecart checks ++ } ++ ++ return false; ++ } ++ ItemStack itemstack2 = addItem(ihopper, CraftItemStack.asNMSCopy(event.getItem()), null); + + if (itemstack2 == null || itemstack2.count == 0) { +- iinventory.update(); ++ if (event.getItem().equals(oitemstack)) { ++ iinventory.update(); ++ } else { ++ iinventory.setItem(i, itemstack1); ++ } ++ // CraftBukkit end + return true; + } + +@@ -344,6 +434,14 @@ + if (entityitem == null) { + return false; + } else { ++ // CraftBukkit start ++ InventoryPickupItemEvent event = new InventoryPickupItemEvent(iinventory.getOwner().getInventory(), (org.bukkit.entity.Item) entityitem.getBukkitEntity()); ++ entityitem.world.getServer().getPluginManager().callEvent(event); ++ if (event.isCancelled()) { ++ return false; ++ } ++ // CraftBukkit end ++ + ItemStack itemstack = entityitem.getItemStack().cloneItemStack(); + ItemStack itemstack1 = addItem(iinventory, itemstack, (EnumDirection) null); + diff --git a/nms-patches/TileEntityNote.patch b/nms-patches/TileEntityNote.patch new file mode 100644 index 0000000000..fd9a329bb9 --- /dev/null +++ b/nms-patches/TileEntityNote.patch @@ -0,0 +1,16 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/TileEntityNote.java 2014-11-27 08:59:46.913420913 +1100 ++++ src/main/java/net/minecraft/server/TileEntityNote.java 2014-11-27 08:42:10.172850872 +1100 +@@ -44,7 +44,12 @@ + b0 = 4; + } + +- world.playBlockAction(blockposition, Blocks.NOTEBLOCK, b0, this.note); ++ // CraftBukkit start ++ org.bukkit.event.block.NotePlayEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callNotePlayEvent(this.world, blockposition.getX(), blockposition.getY(), blockposition.getZ(), b0, this.note); ++ if (!event.isCancelled()) { ++ world.playBlockAction(blockposition, Blocks.NOTEBLOCK, event.getInstrument().getType(), event.getNote().getId()); ++ } ++ // CraftBukkit end + } + } + } diff --git a/nms-patches/TileEntityPiston.patch b/nms-patches/TileEntityPiston.patch new file mode 100644 index 0000000000..0c1fa1d0d6 --- /dev/null +++ b/nms-patches/TileEntityPiston.patch @@ -0,0 +1,10 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/TileEntityPiston.java 2014-11-27 08:59:46.917420896 +1100 ++++ src/main/java/net/minecraft/server/TileEntityPiston.java 2014-11-27 08:42:10.152850911 +1100 +@@ -104,6 +104,7 @@ + } + + public void c() { ++ if (this.world == null) return; // CraftBukkit + this.j = this.i; + if (this.j >= 1.0F) { + this.a(1.0F, 0.25F); diff --git a/nms-patches/TileEntityRecordPlayer.patch b/nms-patches/TileEntityRecordPlayer.patch new file mode 100644 index 0000000000..068fc0b296 --- /dev/null +++ b/nms-patches/TileEntityRecordPlayer.patch @@ -0,0 +1,14 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/TileEntityRecordPlayer.java 2014-11-27 08:59:46.917420896 +1100 ++++ src/main/java/net/minecraft/server/TileEntityRecordPlayer.java 2014-11-27 08:42:10.164850887 +1100 +@@ -29,6 +29,11 @@ + } + + public void setRecord(ItemStack itemstack) { ++ // CraftBukkit start - There can only be one ++ if (itemstack != null) { ++ itemstack.count = 1; ++ } ++ // CraftBukkit end + this.record = itemstack; + this.update(); + } diff --git a/nms-patches/TileEntitySkull.patch b/nms-patches/TileEntitySkull.patch new file mode 100644 index 0000000000..1504054f29 --- /dev/null +++ b/nms-patches/TileEntitySkull.patch @@ -0,0 +1,13 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/TileEntitySkull.java 2014-11-27 08:59:46.917420896 +1100 ++++ src/main/java/net/minecraft/server/TileEntitySkull.java 2014-11-27 08:42:10.168850880 +1100 +@@ -105,4 +105,10 @@ + public void setRotation(int i) { + this.rotation = i; + } ++ ++ // CraftBukkit start - add method ++ public int getRotation() { ++ return this.rotation; ++ } ++ // CraftBukkit end + } diff --git a/nms-patches/Village.patch b/nms-patches/Village.patch new file mode 100644 index 0000000000..9b58e72473 --- /dev/null +++ b/nms-patches/Village.patch @@ -0,0 +1,11 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/Village.java 2014-11-27 08:59:46.921420877 +1100 ++++ src/main/java/net/minecraft/server/Village.java 2014-11-27 08:42:10.104851005 +1100 +@@ -60,7 +60,7 @@ + EntityIronGolem entityirongolem = new EntityIronGolem(this.a); + + entityirongolem.setPosition(vec3d.a, vec3d.b, vec3d.c); +- this.a.addEntity(entityirongolem); ++ this.a.addEntity(entityirongolem, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.VILLAGE_DEFENSE); // CraftBukkit + ++this.l; + } + } diff --git a/nms-patches/VillageSiege.patch b/nms-patches/VillageSiege.patch new file mode 100644 index 0000000000..f6da3f1009 --- /dev/null +++ b/nms-patches/VillageSiege.patch @@ -0,0 +1,11 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/VillageSiege.java 2014-11-27 08:59:46.921420877 +1100 ++++ src/main/java/net/minecraft/server/VillageSiege.java 2014-11-27 08:42:10.100851012 +1100 +@@ -140,7 +140,7 @@ + } + + entityzombie.setPositionRotation(vec3d.a, vec3d.b, vec3d.c, this.a.random.nextFloat() * 360.0F, 0.0F); +- this.a.addEntity(entityzombie); ++ this.a.addEntity(entityzombie, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.VILLAGE_INVASION); // CraftBukkit + BlockPosition blockposition = this.f.a(); + + entityzombie.a(blockposition, this.f.b()); diff --git a/nms-patches/World.patch b/nms-patches/World.patch new file mode 100644 index 0000000000..03912ea05a --- /dev/null +++ b/nms-patches/World.patch @@ -0,0 +1,560 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/World.java 2014-11-27 08:59:46.933420825 +1100 ++++ src/main/java/net/minecraft/server/World.java 2014-11-27 08:42:10.132850949 +1100 +@@ -13,6 +13,22 @@ + import java.util.UUID; + import java.util.concurrent.Callable; + ++// CraftBukkit start ++import org.bukkit.Bukkit; ++import org.bukkit.block.BlockState; ++import org.bukkit.craftbukkit.util.CraftMagicNumbers; ++import org.bukkit.craftbukkit.util.LongHashSet; ++import org.bukkit.generator.ChunkGenerator; ++import org.bukkit.craftbukkit.CraftServer; ++import org.bukkit.craftbukkit.CraftWorld; ++import org.bukkit.craftbukkit.event.CraftEventFactory; ++import org.bukkit.event.block.BlockCanBuildEvent; ++import org.bukkit.event.block.BlockPhysicsEvent; ++import org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason; ++import org.bukkit.event.weather.WeatherChangeEvent; ++import org.bukkit.event.weather.ThunderChangeEvent; ++// CraftBukkit end ++ + public abstract class World implements IBlockAccess { + + protected boolean e; +@@ -47,7 +63,8 @@ + private final Calendar J = Calendar.getInstance(); + public Scoreboard scoreboard = new Scoreboard(); + public final boolean isStatic; +- protected Set chunkTickList = Sets.newHashSet(); ++ // CraftBukkit - longhashset ++ protected LongHashSet chunkTickList = new LongHashSet(); + private int K; + public boolean allowMonsters; + public boolean allowAnimals; +@@ -55,7 +72,39 @@ + private final WorldBorder M; + int[] H; + +- protected World(IDataManager idatamanager, WorldData worlddata, WorldProvider worldprovider, MethodProfiler methodprofiler, boolean flag) { ++ // CraftBukkit start Added the following ++ private final CraftWorld world; ++ public boolean pvpMode; ++ public boolean keepSpawnInMemory = true; ++ public ChunkGenerator generator; ++ ++ public boolean captureBlockStates = false; ++ public boolean captureTreeGeneration = false; ++ public ArrayList capturedBlockStates= new ArrayList(); ++ public long ticksPerAnimalSpawns; ++ public long ticksPerMonsterSpawns; ++ public boolean populating; ++ private int tickPosition; ++ ++ public CraftWorld getWorld() { ++ return this.world; ++ } ++ ++ public CraftServer getServer() { ++ return (CraftServer) Bukkit.getServer(); ++ } ++ ++ public Chunk getChunkIfLoaded(int x, int z) { ++ return ((ChunkProviderServer) this.chunkProvider).getChunkIfLoaded(x, z); ++ } ++ ++ protected World(IDataManager idatamanager, WorldData worlddata, WorldProvider worldprovider, MethodProfiler methodprofiler, boolean flag, ChunkGenerator gen, org.bukkit.World.Environment env) { ++ this.generator = gen; ++ this.world = new CraftWorld((WorldServer) this, gen, env); ++ this.ticksPerAnimalSpawns = this.getServer().getTicksPerAnimalSpawns(); // CraftBukkit ++ this.ticksPerMonsterSpawns = this.getServer().getTicksPerMonsterSpawns(); // CraftBukkit ++ // CraftBukkit end ++ + this.K = this.random.nextInt(12000); + this.allowMonsters = true; + this.allowAnimals = true; +@@ -66,6 +115,8 @@ + this.worldProvider = worldprovider; + this.isStatic = flag; + this.M = worldprovider.getWorldBorder(); ++ ++ this.getServer().addWorld(this.world); // CraftBukkit + } + + public World b() { +@@ -184,6 +235,27 @@ + } + + public boolean setTypeAndData(BlockPosition blockposition, IBlockData iblockdata, int i) { ++ // CraftBukkit start - tree generation ++ if (this.captureTreeGeneration) { ++ BlockState blockstate = null; ++ Iterator it = capturedBlockStates.iterator(); ++ while (it.hasNext()) { ++ BlockState previous = it.next(); ++ if (previous.getX() == blockposition.getX() && previous.getY() == blockposition.getY() && previous.getZ() == blockposition.getZ()) { ++ blockstate = previous; ++ it.remove(); ++ break; ++ } ++ } ++ if (blockstate == null) { ++ blockstate = org.bukkit.craftbukkit.block.CraftBlockState.getBlockState(this, blockposition.getX(), blockposition.getY(), blockposition.getZ(), i); ++ } ++ blockstate.setTypeId(CraftMagicNumbers.getId(iblockdata.getBlock())); ++ blockstate.setRawData((byte) iblockdata.getBlock().toLegacyData(iblockdata)); ++ this.capturedBlockStates.add(blockstate); ++ return true; ++ } ++ // CraftBukkit end + if (!this.isValidLocation(blockposition)) { + return false; + } else if (!this.isStatic && this.worldData.getType() == WorldType.DEBUG_ALL_BLOCK_STATES) { +@@ -191,9 +263,23 @@ + } else { + Chunk chunk = this.getChunkAtWorldCoords(blockposition); + Block block = iblockdata.getBlock(); ++ ++ // CraftBukkit start - capture blockstates ++ BlockState blockstate = null; ++ if (this.captureBlockStates) { ++ blockstate = org.bukkit.craftbukkit.block.CraftBlockState.getBlockState(this, blockposition.getX(), blockposition.getY(), blockposition.getZ(), i); ++ this.capturedBlockStates.add(blockstate); ++ } ++ // CraftBukkit end ++ + IBlockData iblockdata1 = chunk.a(blockposition, iblockdata); + + if (iblockdata1 == null) { ++ // CraftBukkit start - remove blockstate if failed ++ if (!this.captureBlockStates) { ++ this.capturedBlockStates.remove(blockstate); ++ } ++ // CraftBukkit end + return false; + } else { + Block block1 = iblockdata1.getBlock(); +@@ -204,6 +290,7 @@ + this.methodProfiler.b(); + } + ++ /* + if ((i & 2) != 0 && (!this.isStatic || (i & 4) == 0) && chunk.isReady()) { + this.notify(blockposition); + } +@@ -214,12 +301,35 @@ + this.updateAdjacentComparators(blockposition, block); + } + } ++ */ ++ ++ // CraftBukkit start ++ if (!this.captureBlockStates) { // Don't notify clients or update physics while capturing blockstates ++ // Modularize client and physic updates ++ notifyAndUpdatePhysics(blockposition, chunk, block1, block, i); ++ } ++ // CraftBukkit end + + return true; + } + } + } + ++ // CraftBukkit start - Split off from original setTypeAndData(int i, int j, int k, Block block, int l, int i1) method in order to directly send client and physic updates ++ public void notifyAndUpdatePhysics(BlockPosition blockposition, Chunk chunk, Block oldBlock, Block newBLock, int flag) { ++ if ((flag & 2) != 0 && (chunk == null || chunk.isReady())) { // allow chunk to be null here as chunk.isReady() is false when we send our notification during block placement ++ this.notify(blockposition); ++ } ++ ++ if (!this.isStatic && (flag & 1) != 0) { ++ this.update(blockposition, oldBlock); ++ if (newBLock.isComplexRedstone()) { ++ this.updateAdjacentComparators(blockposition, newBLock); ++ } ++ } ++ } ++ // CraftBukkit end ++ + public boolean setAir(BlockPosition blockposition) { + return this.setTypeAndData(blockposition, Blocks.AIR.getBlockData(), 3); + } +@@ -253,6 +363,11 @@ + + public void update(BlockPosition blockposition, Block block) { + if (this.worldData.getType() != WorldType.DEBUG_ALL_BLOCK_STATES) { ++ // CraftBukkit start ++ if (populating) { ++ return; ++ } ++ // CraftBukkit end + this.applyPhysics(blockposition, block); + } + +@@ -328,6 +443,17 @@ + IBlockData iblockdata = this.getType(blockposition); + + try { ++ // CraftBukkit start ++ CraftWorld world = ((WorldServer) this).getWorld(); ++ if (world != null) { ++ BlockPhysicsEvent event = new BlockPhysicsEvent(world.getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ()), CraftMagicNumbers.getId(block)); ++ this.getServer().getPluginManager().callEvent(event); ++ ++ if (event.isCancelled()) { ++ return; ++ } ++ } ++ // CraftBukkit end + iblockdata.getBlock().doPhysics(this, blockposition, iblockdata, block); + } catch (Throwable throwable) { + CrashReport crashreport = CrashReport.a(throwable, "Exception while updating neighbours"); +@@ -497,6 +623,17 @@ + } + + public IBlockData getType(BlockPosition blockposition) { ++ // CraftBukkit start - tree generation ++ if (captureTreeGeneration) { ++ Iterator it = capturedBlockStates.iterator(); ++ while (it.hasNext()) { ++ BlockState previous = it.next(); ++ if (previous.getX() == blockposition.getX() && previous.getY() == blockposition.getY() && previous.getZ() == blockposition.getZ()) { ++ return CraftMagicNumbers.getBlock(previous.getTypeId()).fromLegacyData(previous.getRawData()); ++ } ++ } ++ } ++ // CraftBukkit end + if (!this.isValidLocation(blockposition)) { + return Blocks.AIR.getBlockData(); + } else { +@@ -704,6 +841,13 @@ + } + + public boolean addEntity(Entity entity) { ++ // CraftBukkit start - Used for entities other than creatures ++ return addEntity(entity, SpawnReason.DEFAULT); ++ } ++ ++ public boolean addEntity(Entity entity, SpawnReason spawnReason) { // Changed signature, added SpawnReason ++ if (entity == null) return false; ++ // CraftBukkit end + int i = MathHelper.floor(entity.locX / 16.0D); + int j = MathHelper.floor(entity.locZ / 16.0D); + boolean flag = entity.attachedToPlayer; +@@ -712,7 +856,35 @@ + flag = true; + } + ++ // CraftBukkit start ++ org.bukkit.event.Cancellable event = null; ++ if (entity instanceof EntityLiving && !(entity instanceof EntityPlayer)) { ++ boolean isAnimal = entity instanceof EntityAnimal || entity instanceof EntityWaterAnimal || entity instanceof EntityGolem; ++ boolean isMonster = entity instanceof EntityMonster || entity instanceof EntityGhast || entity instanceof EntitySlime; ++ ++ if (spawnReason != SpawnReason.CUSTOM) { ++ if (isAnimal && !allowAnimals || isMonster && !allowMonsters) { ++ entity.dead = true; ++ return false; ++ } ++ } ++ ++ event = CraftEventFactory.callCreatureSpawnEvent((EntityLiving) entity, spawnReason); ++ } else if (entity instanceof EntityItem) { ++ event = CraftEventFactory.callItemSpawnEvent((EntityItem) entity); ++ } else if (entity.getBukkitEntity() instanceof org.bukkit.entity.Projectile) { ++ // Not all projectiles extend EntityProjectile, so check for Bukkit interface instead ++ event = CraftEventFactory.callProjectileLaunchEvent(entity); ++ } ++ ++ if (event != null && (event.isCancelled() || entity.dead)) { ++ entity.dead = true; ++ return false; ++ } ++ // CraftBukkit end ++ + if (!flag && !this.isChunkLoaded(i, j, true)) { ++ entity.dead = true; + return false; + } else { + if (entity instanceof EntityHuman) { +@@ -734,6 +906,7 @@ + ((IWorldAccess) this.u.get(i)).a(entity); + } + ++ entity.valid = true; // CraftBukkit + } + + protected void b(Entity entity) { +@@ -741,6 +914,7 @@ + ((IWorldAccess) this.u.get(i)).b(entity); + } + ++ entity.valid = false; // CraftBukkit + } + + public void kill(Entity entity) { +@@ -775,7 +949,15 @@ + this.getChunkAt(i, j).b(entity); + } + +- this.entityList.remove(entity); ++ // CraftBukkit start - Decrement loop variable field if we've already ticked this entity ++ int index = this.entityList.indexOf(entity); ++ if (index != -1) { ++ if (index <= this.tickPosition) { ++ this.tickPosition--; ++ } ++ this.entityList.remove(index); ++ } ++ // CraftBukkit end + this.b(entity); + } + +@@ -958,6 +1140,11 @@ + + for (i = 0; i < this.k.size(); ++i) { + entity = (Entity) this.k.get(i); ++ // CraftBukkit start - Fixed an NPE ++ if (entity == null) { ++ continue; ++ } ++ // CraftBukkit end + + try { + ++entity.ticksLived; +@@ -1001,8 +1188,10 @@ + this.g.clear(); + this.methodProfiler.c("regular"); + +- for (i = 0; i < this.entityList.size(); ++i) { +- entity = (Entity) this.entityList.get(i); ++ // CraftBukkit start - Use field for loop variable ++ for (this.tickPosition = 0; this.tickPosition < this.entityList.size(); ++this.tickPosition) { ++ entity = (Entity) this.entityList.get(this.tickPosition); ++ // CraftBukkit end + if (entity.vehicle != null) { + if (!entity.vehicle.dead && entity.vehicle.passenger == entity) { + continue; +@@ -1033,7 +1222,7 @@ + this.getChunkAt(j, k).b(entity); + } + +- this.entityList.remove(i--); ++ this.entityList.remove(this.tickPosition--); // CraftBukkit - Use field for loop variable + this.b(entity); + } + +@@ -1042,6 +1231,14 @@ + + this.methodProfiler.c("blockEntities"); + this.L = true; ++ // CraftBukkit start - From below, clean up tile entities before ticking them ++ if (!this.b.isEmpty()) { ++ this.tileEntityList.removeAll(this.b); ++ this.h.removeAll(this.b); ++ this.b.clear(); ++ } ++ // CraftBukkit end ++ + Iterator iterator = this.tileEntityList.iterator(); + + while (iterator.hasNext()) { +@@ -1073,11 +1270,13 @@ + } + + this.L = false; ++ /* CraftBukkit start - Moved up + if (!this.b.isEmpty()) { + this.tileEntityList.removeAll(this.b); + this.h.removeAll(this.b); + this.b.clear(); + } ++ */ // CraftBukkit end + + this.methodProfiler.c("pendingBlockEntities"); + if (!this.a.isEmpty()) { +@@ -1085,9 +1284,11 @@ + TileEntity tileentity1 = (TileEntity) this.a.get(l); + + if (!tileentity1.x()) { ++ /* CraftBukkit start - Order matters, moved down + if (!this.h.contains(tileentity1)) { + this.a(tileentity1); + } ++ // CraftBukkit end */ + + if (this.isLoaded(tileentity1.getPosition())) { + this.getChunkAtWorldCoords(tileentity1.getPosition()).a(tileentity1.getPosition(), tileentity1); +@@ -1141,7 +1342,10 @@ + int j = MathHelper.floor(entity.locZ); + byte b0 = 32; + +- if (!flag || this.isAreaLoaded(i - b0, 0, j - b0, i + b0, 0, j + b0, true)) { ++ // CraftBukkit start - Use neighbor cache instead of looking up ++ Chunk startingChunk = this.getChunkIfLoaded(i >> 4, j >> 4); ++ if (!flag || (startingChunk != null && startingChunk.areNeighborsLoaded(2)) /* this.isAreaLoaded(i - b0, 0, j - b0, i + b0, 0, j + b0) */) { ++ // CraftBukkit end + entity.P = entity.locX; + entity.Q = entity.locY; + entity.R = entity.locZ; +@@ -1615,7 +1819,13 @@ + --j; + this.worldData.setThunderDuration(j); + if (j <= 0) { +- this.worldData.setThundering(!this.worldData.isThundering()); ++ // CraftBukkit start ++ ThunderChangeEvent thunder = new ThunderChangeEvent(this.getWorld(), !this.worldData.isThundering()); ++ this.getServer().getPluginManager().callEvent(thunder); ++ if (!thunder.isCancelled()) { ++ this.worldData.setThundering(!this.worldData.isThundering()); ++ } ++ // CraftBukkit end + } + } + +@@ -1639,7 +1849,14 @@ + --k; + this.worldData.setWeatherDuration(k); + if (k <= 0) { +- this.worldData.setStorm(!this.worldData.hasStorm()); ++ // CraftBukkit start ++ WeatherChangeEvent weather = new WeatherChangeEvent(this.getWorld(), !this.worldData.hasStorm()); ++ this.getServer().getPluginManager().callEvent(weather); ++ ++ if (!weather.isCancelled()) { ++ this.worldData.setStorm(!this.worldData.hasStorm()); ++ } ++ // CraftBukkit end + } + } + +@@ -1656,7 +1873,7 @@ + } + + protected void D() { +- this.chunkTickList.clear(); ++ // this.chunkTickList.clear(); // CraftBukkit - removed + this.methodProfiler.a("buildList"); + + int i; +@@ -1673,7 +1890,7 @@ + + for (int i1 = -l; i1 <= l; ++i1) { + for (int j1 = -l; j1 <= l; ++j1) { +- this.chunkTickList.add(new ChunkCoordIntPair(i1 + j, j1 + k)); ++ this.chunkTickList.add(org.bukkit.craftbukkit.util.LongHash.toLong(i1 + j, j1 + k)); + } + } + } +@@ -1851,7 +2068,10 @@ + } + + public boolean c(EnumSkyBlock enumskyblock, BlockPosition blockposition) { +- if (!this.areChunksLoaded(blockposition, 17, false)) { ++ // CraftBukkit start - Use neighbor cache instead of looking up ++ Chunk chunk = this.getChunkIfLoaded(blockposition.getX() >> 4, blockposition.getZ() >> 4); ++ if (chunk == null || !chunk.areNeighborsLoaded(1) /*!this.areChunksLoaded(blockposition, 17, false)*/) { ++ // CraftBukkit end + return false; + } else { + int i = 0; +@@ -2095,8 +2315,17 @@ + + while (iterator.hasNext()) { + Entity entity = (Entity) iterator.next(); ++ // CraftBukkit start - Split out persistent check, don't apply it to special persistent mobs ++ if (entity instanceof EntityInsentient) { ++ EntityInsentient entityinsentient = (EntityInsentient) entity; ++ if (entityinsentient.isTypeNotPersistent() && entityinsentient.isPersistent()) { ++ continue; ++ } ++ } + +- if ((!(entity instanceof EntityInsentient) || !((EntityInsentient) entity).isPersistent()) && oclass.isAssignableFrom(entity.getClass())) { ++ if (oclass.isAssignableFrom(entity.getClass())) { ++ // if ((!(entity instanceof EntityInsentient) || !((EntityInsentient) entity).isPersistent()) && oclass.isAssignableFrom(entity.getClass())) { ++ // CraftBukkit end + ++i; + } + } +@@ -2105,12 +2334,17 @@ + } + + public void b(Collection collection) { +- this.entityList.addAll(collection); ++ // CraftBukkit start ++ // this.entityList.addAll(collection); + Iterator iterator = collection.iterator(); + + while (iterator.hasNext()) { + Entity entity = (Entity) iterator.next(); +- ++ if (entity == null) { ++ continue; ++ } ++ this.entityList.add(entity); ++ // CraftBukkit end + this.a(entity); + } + +@@ -2124,7 +2358,13 @@ + Block block1 = this.getType(blockposition).getBlock(); + AxisAlignedBB axisalignedbb = flag ? null : block.a(this, blockposition, block.getBlockData()); + +- return axisalignedbb != null && !this.a(axisalignedbb, entity) ? false : (block1.getMaterial() == Material.ORIENTABLE && block == Blocks.ANVIL ? true : block1.getMaterial().isReplaceable() && block.canPlace(this, blockposition, enumdirection, itemstack)); ++ // CraftBukkit start - store default return ++ boolean defaultReturn = axisalignedbb != null && !this.a(axisalignedbb, entity) ? false : (block1.getMaterial() == Material.ORIENTABLE && block == Blocks.ANVIL ? true : block1.getMaterial().isReplaceable() && block.canPlace(this, blockposition, enumdirection, itemstack)); ++ BlockCanBuildEvent event = new BlockCanBuildEvent(this.getWorld().getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ()), CraftMagicNumbers.getId(block), defaultReturn); ++ this.getServer().getPluginManager().callEvent(event); ++ ++ return event.isBuildable(); ++ // CraftBukkit end + } + + public int getBlockPower(BlockPosition blockposition, EnumDirection enumdirection) { +@@ -2215,6 +2455,11 @@ + + for (int i = 0; i < this.players.size(); ++i) { + EntityHuman entityhuman1 = (EntityHuman) this.players.get(i); ++ // CraftBukkit start - Fixed an NPE ++ if (entityhuman1 == null || entityhuman1.dead) { ++ continue; ++ } ++ // CraftBukkit end + + if (IEntitySelector.d.apply(entityhuman1)) { + double d5 = entityhuman1.e(d0, d1, d2); +@@ -2269,7 +2514,7 @@ + return null; + } + +- public void checkSession() { ++ public void checkSession() throws ExceptionWorldConflict { // CraftBukkit - added throws + this.dataManager.checkSession(); + } + +@@ -2331,6 +2576,16 @@ + + public void everyoneSleeping() {} + ++ // CraftBukkit start ++ // Calls the method that checks to see if players are sleeping ++ // Called by CraftPlayer.setPermanentSleeping() ++ public void checkSleepStatus() { ++ if (!this.isStatic) { ++ this.everyoneSleeping(); ++ } ++ } ++ // CraftBukkit end ++ + public float h(float f) { + return (this.q + (this.r - this.q) * f) * this.j(f); + } +@@ -2538,6 +2793,6 @@ + int l = j * 16 + 8 - blockposition.getZ(); + short short0 = 128; + +- return k >= -short0 && k <= short0 && l >= -short0 && l <= short0; ++ return k >= -short0 && k <= short0 && l >= -short0 && l <= short0 || !this.keepSpawnInMemory; // CraftBukkit - Added 'this.world.keepSpawnInMemory' + } + } diff --git a/nms-patches/WorldBorder.patch b/nms-patches/WorldBorder.patch new file mode 100644 index 0000000000..37416ef7df --- /dev/null +++ b/nms-patches/WorldBorder.patch @@ -0,0 +1,25 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/WorldBorder.java 2014-11-27 08:59:46.925420860 +1100 ++++ src/main/java/net/minecraft/server/WorldBorder.java 2014-11-27 08:42:10.168850880 +1100 +@@ -32,9 +32,21 @@ + return (double) (blockposition.getX() + 1) > this.b() && (double) blockposition.getX() < this.d() && (double) (blockposition.getZ() + 1) > this.c() && (double) blockposition.getZ() < this.e(); + } + ++ // CraftBukkit start - split method + public boolean isInBounds(ChunkCoordIntPair chunkcoordintpair) { +- return (double) chunkcoordintpair.e() > this.b() && (double) chunkcoordintpair.c() < this.d() && (double) chunkcoordintpair.f() > this.c() && (double) chunkcoordintpair.d() < this.e(); ++ return isInBounds(chunkcoordintpair.x, chunkcoordintpair.z); + } ++ ++ // Inlined the getters from ChunkCoordIntPair ++ public boolean isInBounds(long chunkcoords) { ++ return isInBounds(org.bukkit.craftbukkit.util.LongHash.msw(chunkcoords), org.bukkit.craftbukkit.util.LongHash.lsw(chunkcoords)); ++ } ++ ++ // Inlined the getters from ChunkCoordIntPair ++ public boolean isInBounds(int x, int z) { ++ return (double) ((x << 4) + 15) > this.b() && (double) (x << 4) < this.d() && (double) ((z << 4) + 15) > this.c() && (double) (x << 4) < this.e(); ++ } ++ // CraftBukkit end + + public boolean a(AxisAlignedBB axisalignedbb) { + return axisalignedbb.d > this.b() && axisalignedbb.a < this.d() && axisalignedbb.f > this.c() && axisalignedbb.c < this.e(); diff --git a/nms-patches/WorldGenGroundBush.patch b/nms-patches/WorldGenGroundBush.patch new file mode 100644 index 0000000000..9a633c3bde --- /dev/null +++ b/nms-patches/WorldGenGroundBush.patch @@ -0,0 +1,14 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/WorldGenGroundBush.java 2014-11-27 08:59:46.925420860 +1100 ++++ src/main/java/net/minecraft/server/WorldGenGroundBush.java 2014-11-27 08:42:10.144850927 +1100 +@@ -46,7 +46,11 @@ + } + } + } ++ // CraftBukkit start - Return false if gen was unsuccessful ++ } else { ++ return false; + } ++ // CraftBukkit end + + return true; + } diff --git a/nms-patches/WorldGenMegaTreeAbstract.patch b/nms-patches/WorldGenMegaTreeAbstract.patch new file mode 100644 index 0000000000..4dcc862538 --- /dev/null +++ b/nms-patches/WorldGenMegaTreeAbstract.patch @@ -0,0 +1,11 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/WorldGenMegaTreeAbstract.java 2014-11-27 08:59:46.925420860 +1100 ++++ src/main/java/net/minecraft/server/WorldGenMegaTreeAbstract.java 2014-11-27 08:42:10.140850934 +1100 +@@ -42,7 +42,7 @@ + + for (int k = -b0; k <= b0 && flag; ++k) { + for (int l = -b0; l <= b0 && flag; ++l) { +- if (blockposition.getY() + j < 0 || blockposition.getY() + j >= 256 || !this.a(world.getType(blockposition.a(k, j, l)).getBlock())) { ++ if (blockposition.getY() + j < 0 || blockposition.getY() + j >= 256 || (!this.a(world.getType(blockposition.a(k, j, l)).getBlock()) && world.getType(blockposition.a(k, j, l)).getBlock() != Blocks.SAPLING)) { // CraftBukkit - ignore our own saplings + flag = false; + } + } diff --git a/nms-patches/WorldGenVillagePiece.patch b/nms-patches/WorldGenVillagePiece.patch new file mode 100644 index 0000000000..ff11ea6a91 --- /dev/null +++ b/nms-patches/WorldGenVillagePiece.patch @@ -0,0 +1,11 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/WorldGenVillagePiece.java 2014-11-27 08:59:46.929420842 +1100 ++++ src/main/java/net/minecraft/server/WorldGenVillagePiece.java 2014-11-27 08:42:10.144850927 +1100 +@@ -114,7 +114,7 @@ + entityvillager.setPositionRotation((double) j1 + 0.5D, (double) k1, (double) l1 + 0.5D, 0.0F, 0.0F); + entityvillager.prepare(world.E(new BlockPosition(entityvillager)), (GroupDataEntity) null); + entityvillager.setProfession(this.c(i1, entityvillager.getProfession())); +- world.addEntity(entityvillager); ++ world.addEntity(entityvillager, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.CHUNK_GEN); // CraftBukkit - add SpawnReason + } + + } diff --git a/nms-patches/WorldGenVillagePieces.patch b/nms-patches/WorldGenVillagePieces.patch new file mode 100644 index 0000000000..e69de29bb2 diff --git a/nms-patches/WorldGenWitchHut.patch b/nms-patches/WorldGenWitchHut.patch new file mode 100644 index 0000000000..cfd76bed0f --- /dev/null +++ b/nms-patches/WorldGenWitchHut.patch @@ -0,0 +1,11 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/WorldGenWitchHut.java 2014-11-27 08:59:46.933420825 +1100 ++++ src/main/java/net/minecraft/server/WorldGenWitchHut.java 2014-11-27 08:42:10.152850911 +1100 +@@ -77,7 +77,7 @@ + + entitywitch.setPositionRotation((double) i1 + 0.5D, (double) j1, (double) k1 + 0.5D, 0.0F, 0.0F); + entitywitch.prepare(world.E(new BlockPosition(i1, j1, k1)), (GroupDataEntity) null); +- world.addEntity(entitywitch); ++ world.addEntity(entitywitch, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.CHUNK_GEN); // CraftBukkit - add SpawnReason + } + } + diff --git a/nms-patches/WorldManager.patch b/nms-patches/WorldManager.patch new file mode 100644 index 0000000000..a7f97b030b --- /dev/null +++ b/nms-patches/WorldManager.patch @@ -0,0 +1,28 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/WorldManager.java 2014-11-27 08:59:46.937420807 +1100 ++++ src/main/java/net/minecraft/server/WorldManager.java 2014-11-27 08:42:10.132850949 +1100 +@@ -23,11 +23,13 @@ + } + + public void a(String s, double d0, double d1, double d2, float f, float f1) { +- this.a.getPlayerList().sendPacketNearby(d0, d1, d2, f > 1.0F ? (double) (16.0F * f) : 16.0D, this.world.worldProvider.getDimension(), new PacketPlayOutNamedSoundEffect(s, d0, d1, d2, f, f1)); ++ // CraftBukkit - this.world.dimension ++ this.a.getPlayerList().sendPacketNearby(d0, d1, d2, f > 1.0F ? (double) (16.0F * f) : 16.0D, this.world.dimension, new PacketPlayOutNamedSoundEffect(s, d0, d1, d2, f, f1)); + } + + public void a(EntityHuman entityhuman, String s, double d0, double d1, double d2, float f, float f1) { +- this.a.getPlayerList().sendPacketNearby(entityhuman, d0, d1, d2, f > 1.0F ? (double) (16.0F * f) : 16.0D, this.world.worldProvider.getDimension(), new PacketPlayOutNamedSoundEffect(s, d0, d1, d2, f, f1)); ++ // CraftBukkit - this.world.dimension ++ this.a.getPlayerList().sendPacketNearby(entityhuman, d0, d1, d2, f > 1.0F ? (double) (16.0F * f) : 16.0D, this.world.dimension, new PacketPlayOutNamedSoundEffect(s, d0, d1, d2, f, f1)); + } + + public void a(int i, int j, int k, int l, int i1, int j1) {} +@@ -41,7 +43,8 @@ + public void a(String s, BlockPosition blockposition) {} + + public void a(EntityHuman entityhuman, int i, BlockPosition blockposition, int j) { +- this.a.getPlayerList().sendPacketNearby(entityhuman, (double) blockposition.getX(), (double) blockposition.getY(), (double) blockposition.getZ(), 64.0D, this.world.worldProvider.getDimension(), new PacketPlayOutWorldEvent(i, blockposition, j, false)); ++ // CraftBukkit - this.world.dimension ++ this.a.getPlayerList().sendPacketNearby(entityhuman, (double) blockposition.getX(), (double) blockposition.getY(), (double) blockposition.getZ(), 64.0D, this.world.dimension, new PacketPlayOutWorldEvent(i, blockposition, j, false)); + } + + public void a(int i, BlockPosition blockposition, int j) { diff --git a/nms-patches/WorldMap.patch b/nms-patches/WorldMap.patch new file mode 100644 index 0000000000..86ba2aa672 --- /dev/null +++ b/nms-patches/WorldMap.patch @@ -0,0 +1,95 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/WorldMap.java 2014-11-27 08:59:46.941420790 +1100 ++++ src/main/java/net/minecraft/server/WorldMap.java 2014-11-27 08:42:10.152850911 +1100 +@@ -6,6 +6,14 @@ + import java.util.List; + import java.util.Map; + ++// CraftBukkit start ++import java.util.UUID; ++ ++import org.bukkit.craftbukkit.CraftServer; ++import org.bukkit.craftbukkit.CraftWorld; ++import org.bukkit.craftbukkit.map.CraftMapView; ++// CraftBukkit end ++ + public class WorldMap extends PersistentBase { + + public int centerX; +@@ -16,9 +24,19 @@ + public List g = Lists.newArrayList(); + private Map i = Maps.newHashMap(); + public Map decorations = Maps.newLinkedHashMap(); ++ ++ // CraftBukkit start ++ public final CraftMapView mapView; ++ private CraftServer server; ++ private UUID uniqueId = null; ++ // CraftBukkit end + + public WorldMap(String s) { + super(s); ++ // CraftBukkit start ++ mapView = new CraftMapView(this); ++ server = (CraftServer) org.bukkit.Bukkit.getServer(); ++ // CraftBukkit end + } + + public void a(double d0, double d1, int i) { +@@ -31,7 +49,30 @@ + } + + public void a(NBTTagCompound nbttagcompound) { +- this.map = nbttagcompound.getByte("dimension"); ++ // CraftBukkit start ++ byte dimension = nbttagcompound.getByte("dimension"); ++ ++ if (dimension >= 10) { ++ long least = nbttagcompound.getLong("UUIDLeast"); ++ long most = nbttagcompound.getLong("UUIDMost"); ++ ++ if (least != 0L && most != 0L) { ++ this.uniqueId = new UUID(most, least); ++ ++ CraftWorld world = (CraftWorld) server.getWorld(this.uniqueId); ++ // Check if the stored world details are correct. ++ if (world == null) { ++ /* All Maps which do not have their valid world loaded are set to a dimension which hopefully won't be reached. ++ This is to prevent them being corrupted with the wrong map data. */ ++ dimension = 127; ++ } else { ++ dimension = (byte) world.getHandle().dimension; ++ } ++ } ++ } ++ ++ this.map = dimension; ++ // CraftBukkit end + this.centerX = nbttagcompound.getInt("xCenter"); + this.centerZ = nbttagcompound.getInt("zCenter"); + this.scale = nbttagcompound.getByte("scale"); +@@ -66,6 +107,25 @@ + } + + public void b(NBTTagCompound nbttagcompound) { ++ // CraftBukkit start ++ if (this.map >= 10) { ++ if (this.uniqueId == null) { ++ for (org.bukkit.World world : server.getWorlds()) { ++ CraftWorld cWorld = (CraftWorld) world; ++ if (cWorld.getHandle().dimension == this.map) { ++ this.uniqueId = cWorld.getUID(); ++ break; ++ } ++ } ++ } ++ /* Perform a second check to see if a matching world was found, this is a necessary ++ change incase Maps are forcefully unlinked from a World and lack a UID.*/ ++ if (this.uniqueId != null) { ++ nbttagcompound.setLong("UUIDLeast", this.uniqueId.getLeastSignificantBits()); ++ nbttagcompound.setLong("UUIDMost", this.uniqueId.getMostSignificantBits()); ++ } ++ } ++ // CraftBukkit end + nbttagcompound.setByte("dimension", this.map); + nbttagcompound.setInt("xCenter", this.centerX); + nbttagcompound.setInt("zCenter", this.centerZ); diff --git a/nms-patches/WorldMapHumanTracker.patch b/nms-patches/WorldMapHumanTracker.patch new file mode 100644 index 0000000000..627bbbfde7 --- /dev/null +++ b/nms-patches/WorldMapHumanTracker.patch @@ -0,0 +1,31 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/WorldMapHumanTracker.java 2014-11-27 08:59:46.937420807 +1100 ++++ src/main/java/net/minecraft/server/WorldMapHumanTracker.java 2014-11-27 08:42:10.168850880 +1100 +@@ -23,12 +23,26 @@ + } + + public Packet a(ItemStack itemstack) { ++ // CraftBukkit start ++ org.bukkit.craftbukkit.map.RenderData render = this.worldMap.mapView.render((org.bukkit.craftbukkit.entity.CraftPlayer) this.trackee.getBukkitEntity()); // CraftBukkit ++ ++ java.util.Collection icons = new java.util.ArrayList(); ++ ++ for ( org.bukkit.map.MapCursor cursor : render.cursors) { ++ ++ if (cursor.isVisible()) { ++ icons.add(new MapIcon(cursor.getRawType(), cursor.getX(), cursor.getY(), cursor.getDirection())); ++ } ++ } ++ ++ + if (this.d) { + this.d = false; +- return new PacketPlayOutMap(itemstack.getData(), this.worldMap.scale, this.worldMap.decorations.values(), this.worldMap.colors, this.e, this.f, this.g + 1 - this.e, this.h + 1 - this.f); ++ return new PacketPlayOutMap(itemstack.getData(), this.worldMap.scale, icons, render.buffer, this.e, this.f, this.g + 1 - this.e, this.h + 1 - this.f); + } else { +- return this.i++ % 5 == 0 ? new PacketPlayOutMap(itemstack.getData(), this.worldMap.scale, this.worldMap.decorations.values(), this.worldMap.colors, 0, 0, 0, 0) : null; ++ return this.i++ % 5 == 0 ? new PacketPlayOutMap(itemstack.getData(), this.worldMap.scale, icons, render.buffer, 0, 0, 0, 0) : null; + } ++ // CraftBukkit end + } + + public void a(int i, int j) { diff --git a/nms-patches/WorldNBTStorage.patch b/nms-patches/WorldNBTStorage.patch new file mode 100644 index 0000000000..503af702a2 --- /dev/null +++ b/nms-patches/WorldNBTStorage.patch @@ -0,0 +1,123 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/WorldNBTStorage.java 2014-11-27 08:59:46.941420790 +1100 ++++ src/main/java/net/minecraft/server/WorldNBTStorage.java 2014-11-27 08:42:10.156850903 +1100 +@@ -11,6 +11,12 @@ + import org.apache.logging.log4j.LogManager; + import org.apache.logging.log4j.Logger; + ++// CraftBukkit start ++import java.util.UUID; ++ ++import org.bukkit.craftbukkit.entity.CraftPlayer; ++// CraftBukkit end ++ + public class WorldNBTStorage implements IDataManager, IPlayerFileData { + + private static final Logger a = LogManager.getLogger(); +@@ -19,6 +25,7 @@ + private final File dataDir; + private final long sessionId = MinecraftServer.ax(); + private final String f; ++ private UUID uuid = null; // CraftBukkit + + public WorldNBTStorage(File file, String s, boolean flag) { + this.baseDir = new File(file, s); +@@ -55,7 +62,7 @@ + return this.baseDir; + } + +- public void checkSession() { ++ public void checkSession() throws ExceptionWorldConflict { // CraftBukkit - throws ExceptionWorldConflict + try { + File file = new File(this.baseDir, "session.lock"); + DataInputStream datainputstream = new DataInputStream(new FileInputStream(file)); +@@ -202,12 +209,39 @@ + } + + if (nbttagcompound != null) { ++ // CraftBukkit start ++ if (entityhuman instanceof EntityPlayer) { ++ CraftPlayer player = (CraftPlayer) entityhuman.getBukkitEntity(); ++ // Only update first played if it is older than the one we have ++ long modified = new File(this.playerDir, entityhuman.getUniqueID().toString() + ".dat").lastModified(); ++ if (modified < player.getFirstPlayed()) { ++ player.setFirstPlayed(modified); ++ } ++ } ++ // CraftBukkit end ++ + entityhuman.f(nbttagcompound); + } + + return nbttagcompound; + } + ++ // CraftBukkit start ++ public NBTTagCompound getPlayerData(String s) { ++ try { ++ File file1 = new File(this.playerDir, s + ".dat"); ++ ++ if (file1.exists()) { ++ return NBTCompressedStreamTools.a((InputStream) (new FileInputStream(file1))); ++ } ++ } catch (Exception exception) { ++ a.warn("Failed to load player data for " + s); ++ } ++ ++ return null; ++ } ++ // CraftBukkit end ++ + public IPlayerFileData getPlayerFileData() { + return this; + } +@@ -237,4 +271,50 @@ + public String g() { + return this.f; + } ++ ++ // CraftBukkit start ++ public UUID getUUID() { ++ if (uuid != null) return uuid; ++ File file1 = new File(this.baseDir, "uid.dat"); ++ if (file1.exists()) { ++ DataInputStream dis = null; ++ try { ++ dis = new DataInputStream(new FileInputStream(file1)); ++ return uuid = new UUID(dis.readLong(), dis.readLong()); ++ } catch (IOException ex) { ++ a.warn("Failed to read " + file1 + ", generating new random UUID", ex); ++ } finally { ++ if (dis != null) { ++ try { ++ dis.close(); ++ } catch (IOException ex) { ++ // NOOP ++ } ++ } ++ } ++ } ++ uuid = UUID.randomUUID(); ++ DataOutputStream dos = null; ++ try { ++ dos = new DataOutputStream(new FileOutputStream(file1)); ++ dos.writeLong(uuid.getMostSignificantBits()); ++ dos.writeLong(uuid.getLeastSignificantBits()); ++ } catch (IOException ex) { ++ a.warn("Failed to write " + file1, ex); ++ } finally { ++ if (dos != null) { ++ try { ++ dos.close(); ++ } catch (IOException ex) { ++ // NOOP ++ } ++ } ++ } ++ return uuid; ++ } ++ ++ public File getPlayerDir() { ++ return playerDir; ++ } ++ // CraftBukkit end + } diff --git a/nms-patches/WorldServer.patch b/nms-patches/WorldServer.patch new file mode 100644 index 0000000000..b1ad5607b7 --- /dev/null +++ b/nms-patches/WorldServer.patch @@ -0,0 +1,550 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/WorldServer.java 2014-11-27 08:59:46.945420772 +1100 ++++ src/main/java/net/minecraft/server/WorldServer.java 2014-11-27 08:42:10.140850934 +1100 +@@ -16,6 +16,20 @@ + import org.apache.logging.log4j.LogManager; + import org.apache.logging.log4j.Logger; + ++// CraftBukkit start ++import java.util.*; ++import java.util.logging.Level; ++ ++import org.bukkit.WeatherType; ++import org.bukkit.block.BlockState; ++import org.bukkit.craftbukkit.util.LongHash; ++ ++import org.bukkit.event.block.BlockFormEvent; ++import org.bukkit.event.weather.LightningStrikeEvent; ++import org.bukkit.event.weather.ThunderChangeEvent; ++import org.bukkit.event.weather.WeatherChangeEvent; ++// CraftBukkit end ++ + public class WorldServer extends World implements IAsyncTaskHandler { + + private static final Logger a = LogManager.getLogger(); +@@ -37,14 +51,21 @@ + private static final List U = Lists.newArrayList(new StructurePieceTreasure[] { new StructurePieceTreasure(Items.STICK, 0, 1, 3, 10), new StructurePieceTreasure(Item.getItemOf(Blocks.PLANKS), 0, 1, 3, 10), new StructurePieceTreasure(Item.getItemOf(Blocks.LOG), 0, 1, 3, 10), new StructurePieceTreasure(Items.STONE_AXE, 0, 1, 1, 3), new StructurePieceTreasure(Items.WOODEN_AXE, 0, 1, 1, 5), new StructurePieceTreasure(Items.STONE_PICKAXE, 0, 1, 1, 3), new StructurePieceTreasure(Items.WOODEN_PICKAXE, 0, 1, 1, 5), new StructurePieceTreasure(Items.APPLE, 0, 2, 3, 5), new StructurePieceTreasure(Items.BREAD, 0, 2, 3, 3), new StructurePieceTreasure(Item.getItemOf(Blocks.LOG2), 0, 1, 3, 10)}); + private List V = Lists.newArrayList(); + +- public WorldServer(MinecraftServer minecraftserver, IDataManager idatamanager, WorldData worlddata, int i, MethodProfiler methodprofiler) { +- super(idatamanager, worlddata, WorldProvider.byDimension(i), methodprofiler, false); ++ // CraftBukkit start ++ public final int dimension; ++ ++ // Add env and gen to constructor ++ public WorldServer(MinecraftServer minecraftserver, IDataManager idatamanager, WorldData worlddata, int i, MethodProfiler methodprofiler, org.bukkit.World.Environment env, org.bukkit.generator.ChunkGenerator gen) { ++ super(idatamanager, worlddata, WorldProvider.byDimension(env.getId()), methodprofiler, false, gen, env); ++ this.dimension = i; ++ this.pvpMode = minecraftserver.getPVP(); ++ // CraftBukkit end + this.server = minecraftserver; + this.tracker = new EntityTracker(this); + this.manager = new PlayerChunkMap(this); + this.worldProvider.a(this); + this.chunkProvider = this.k(); +- this.Q = new PortalTravelAgent(this); ++ this.Q = new org.bukkit.craftbukkit.CraftTravelAgent(this); // CraftBukkit + this.B(); + this.C(); + this.af().a(minecraftserver.aG()); +@@ -86,6 +107,89 @@ + + return this; + } ++ ++ // CraftBukkit start ++ @Override ++ public TileEntity getTileEntity(BlockPosition pos) { ++ TileEntity result = super.getTileEntity(pos); ++ Block type = getType(pos).getBlock(); ++ ++ if (type == Blocks.CHEST) { ++ if (!(result instanceof TileEntityChest)) { ++ result = fixTileEntity(pos, type, result); ++ } ++ } else if (type == Blocks.FURNACE) { ++ if (!(result instanceof TileEntityFurnace)) { ++ result = fixTileEntity(pos, type, result); ++ } ++ } else if (type == Blocks.DROPPER) { ++ if (!(result instanceof TileEntityDropper)) { ++ result = fixTileEntity(pos, type, result); ++ } ++ } else if (type == Blocks.DISPENSER) { ++ if (!(result instanceof TileEntityDispenser)) { ++ result = fixTileEntity(pos, type, result); ++ } ++ } else if (type == Blocks.JUKEBOX) { ++ if (!(result instanceof TileEntityRecordPlayer)) { ++ result = fixTileEntity(pos, type, result); ++ } ++ } else if (type == Blocks.NOTEBLOCK) { ++ if (!(result instanceof TileEntityNote)) { ++ result = fixTileEntity(pos, type, result); ++ } ++ } else if (type == Blocks.MOB_SPAWNER) { ++ if (!(result instanceof TileEntityMobSpawner)) { ++ result = fixTileEntity(pos, type, result); ++ } ++ } else if ((type == Blocks.STANDING_SIGN) || (type == Blocks.WALL_SIGN)) { ++ if (!(result instanceof TileEntitySign)) { ++ result = fixTileEntity(pos, type, result); ++ } ++ } else if (type == Blocks.ENDER_CHEST) { ++ if (!(result instanceof TileEntityEnderChest)) { ++ result = fixTileEntity(pos, type, result); ++ } ++ } else if (type == Blocks.BREWING_STAND) { ++ if (!(result instanceof TileEntityBrewingStand)) { ++ result = fixTileEntity(pos, type, result); ++ } ++ } else if (type == Blocks.BEACON) { ++ if (!(result instanceof TileEntityBeacon)) { ++ result = fixTileEntity(pos, type, result); ++ } ++ } else if (type == Blocks.HOPPER) { ++ if (!(result instanceof TileEntityHopper)) { ++ result = fixTileEntity(pos, type, result); ++ } ++ } ++ ++ return result; ++ } ++ ++ private TileEntity fixTileEntity(BlockPosition pos, Block type, TileEntity found) { ++ this.getServer().getLogger().log(Level.SEVERE, "Block at {0},{1},{2} is {3} but has {4}" + ". " ++ + "Bukkit will attempt to fix this, but there may be additional damage that we cannot recover.", new Object[]{pos.getX(), pos.getY(), pos.getZ(), org.bukkit.Material.getMaterial(Block.getId(type)).toString(), found}); ++ ++ if (type instanceof IContainer) { ++ TileEntity replacement = ((IContainer) type).a(this, type.toLegacyData(this.getType(pos))); ++ replacement.world = this; ++ this.setTileEntity(pos, replacement); ++ return replacement; ++ } else { ++ this.getServer().getLogger().severe("Don't know how to fix for this type... Can't do anything! :("); ++ return found; ++ } ++ } ++ ++ private boolean canSpawn(int x, int z) { ++ if (this.generator != null) { ++ return this.generator.canSpawn(this.getWorld(), x, z); ++ } else { ++ return this.worldProvider.canSpawn(x, z); ++ } ++ } ++ // CraftBukkit end + + public void doTick() { + super.doTick(); +@@ -105,8 +209,11 @@ + } + + this.methodProfiler.a("mobSpawner"); +- if (this.getGameRules().getBoolean("doMobSpawning") && this.worldData.getType() != WorldType.DEBUG_ALL_BLOCK_STATES) { +- this.R.a(this, this.allowMonsters, this.allowAnimals, this.worldData.getTime() % 400L == 0L); ++ // CraftBukkit start - Only call spawner if we have players online and the world allows for mobs or animals ++ long time = this.worldData.getTime(); ++ if (this.getGameRules().getBoolean("doMobSpawning") && this.worldData.getType() != WorldType.DEBUG_ALL_BLOCK_STATES && (this.allowMonsters || this.allowAnimals) && (this instanceof WorldServer && this.players.size() > 0)) { ++ this.R.a(this, this.allowMonsters && (this.ticksPerMonsterSpawns != 0 && time % this.ticksPerMonsterSpawns == 0L), this.allowAnimals && (this.ticksPerAnimalSpawns != 0 && time % this.ticksPerAnimalSpawns == 0L), this.worldData.getTime() % 400L == 0L); ++ // CraftBukkit end + } + + this.methodProfiler.c("chunkSource"); +@@ -135,6 +242,8 @@ + this.Q.a(this.getTime()); + this.methodProfiler.b(); + this.ak(); ++ ++ this.getWorld().processChunkGC(); // CraftBukkit + } + + public BiomeMeta a(EnumCreatureType enumcreaturetype, BlockPosition blockposition) { +@@ -161,7 +270,7 @@ + + if (entityhuman.v()) { + ++i; +- } else if (entityhuman.isSleeping()) { ++ } else if (entityhuman.isSleeping() || entityhuman.fauxSleeping) { // CraftBukkit + ++j; + } + } +@@ -187,26 +296,45 @@ + } + + private void ag() { +- this.worldData.setWeatherDuration(0); +- this.worldData.setStorm(false); +- this.worldData.setThunderDuration(0); +- this.worldData.setThundering(false); ++ // CraftBukkit start ++ WeatherChangeEvent weather = new WeatherChangeEvent(this.getWorld(), false); ++ this.getServer().getPluginManager().callEvent(weather); ++ ++ ThunderChangeEvent thunder = new ThunderChangeEvent(this.getWorld(), false); ++ this.getServer().getPluginManager().callEvent(thunder); ++ if (!weather.isCancelled()) { ++ this.worldData.setWeatherDuration(0); ++ this.worldData.setStorm(false); ++ } ++ if (!thunder.isCancelled()) { ++ this.worldData.setThunderDuration(0); ++ this.worldData.setThundering(false); ++ } ++ // CraftBukkit end + } + + public boolean everyoneDeeplySleeping() { + if (this.O && !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 ++ boolean foundActualSleepers = false; ++ + EntityHuman entityhuman; + + do { + if (!iterator.hasNext()) { +- return true; ++ return foundActualSleepers; + } + + entityhuman = (EntityHuman) iterator.next(); +- } while (!entityhuman.v() && entityhuman.isDeeplySleeping()); +- ++ // CraftBukkit start ++ if (entityhuman.isDeeplySleeping()) { ++ foundActualSleepers = true; ++ } ++ } while (!entityhuman.v() && (entityhuman.isDeeplySleeping() || entityhuman.fauxSleeping)); ++ // CraftBukkit end ++ + return false; + } else { + return false; +@@ -227,15 +355,22 @@ + } else { + int i = 0; + int j = 0; +- +- for (Iterator iterator1 = this.chunkTickList.iterator(); iterator1.hasNext(); this.methodProfiler.b()) { +- ChunkCoordIntPair chunkcoordintpair1 = (ChunkCoordIntPair) iterator1.next(); +- int k = chunkcoordintpair1.x * 16; +- int l = chunkcoordintpair1.z * 16; +- ++ ++ // CraftBukkit start ++ //for (Iterator iterator1 = this.chunkTickList.iterator(); iterator1.hasNext(); this.methodProfiler.b()) { ++ // ChunkCoordIntPair chunkcoordintpair1 = (ChunkCoordIntPair) iterator1.next(); ++ // int k = chunkcoordintpair1.x * 16; ++ // int l = chunkcoordintpair1.z * 16; ++ for (long chunkCoord : chunkTickList.popAll()) { ++ int chunkX = LongHash.msw(chunkCoord); ++ int chunkZ = LongHash.lsw(chunkCoord); ++ int k = chunkX * 16; ++ int l = chunkZ * 16; ++ + this.methodProfiler.a("getChunk"); +- Chunk chunk = this.getChunkAt(chunkcoordintpair1.x, chunkcoordintpair1.z); +- ++ Chunk chunk = this.getChunkAt(chunkX, chunkZ); ++ // CraftBukkit end ++ + this.a(k, l, chunk); + this.methodProfiler.c("tickChunk"); + chunk.b(false); +@@ -260,11 +395,29 @@ + BlockPosition blockposition1 = blockposition.down(); + + if (this.w(blockposition1)) { +- this.setTypeUpdate(blockposition1, Blocks.ICE.getBlockData()); ++ // CraftBukkit start ++ BlockState blockState = this.getWorld().getBlockAt(blockposition1.getX(), blockposition1.getY(), blockposition1.getZ()).getState(); ++ blockState.setTypeId(Block.getId(Blocks.ICE)); ++ ++ BlockFormEvent iceBlockForm = new BlockFormEvent(blockState.getBlock(), blockState); ++ this.getServer().getPluginManager().callEvent(iceBlockForm); ++ if (!iceBlockForm.isCancelled()) { ++ blockState.update(true); ++ } ++ // CraftBukkit end + } + + if (this.S() && this.f(blockposition, true)) { +- this.setTypeUpdate(blockposition, Blocks.SNOW_LAYER.getBlockData()); ++ // CraftBukkit start ++ BlockState blockState = this.getWorld().getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ()).getState(); ++ blockState.setTypeId(Block.getId(Blocks.SNOW_LAYER)); ++ ++ BlockFormEvent snow = new BlockFormEvent(blockState.getBlock(), blockState); ++ this.getServer().getPluginManager().callEvent(snow); ++ if (!snow.isCancelled()) { ++ blockState.update(true); ++ } ++ // CraftBukkit end + } + + if (this.S() && this.getBiome(blockposition1).e()) { +@@ -376,7 +529,7 @@ + } + + public void tickEntities() { +- if (this.players.isEmpty()) { ++ if (false && this.players.isEmpty()) { // CraftBukkit - this prevents entity cleanup, other issues on servers with no players + if (this.emptyTime++ >= 1200) { + return; + } +@@ -401,7 +554,13 @@ + throw new IllegalStateException("TickNextTick list out of synch"); + } else { + if (i > 1000) { +- i = 1000; ++ // CraftBukkit start - If the server has too much to process over time, try to alleviate that ++ if (i > 20 * 1000) { ++ i = i / 20; ++ } else { ++ i = 1000; ++ } ++ // CraftBukkit end + } + + this.methodProfiler.a("cleaning"); +@@ -501,6 +660,7 @@ + return arraylist; + } + ++ /* CraftBukkit start - We prevent spawning in general, so this butchering is not needed + public void entityJoinedWorld(Entity entity, boolean flag) { + if (!this.getSpawnAnimals() && (entity instanceof EntityAnimal || entity instanceof EntityWaterAnimal)) { + entity.die(); +@@ -511,7 +671,9 @@ + } + + super.entityJoinedWorld(entity, flag); ++ + } ++ // CraftBukkit end */ + + private boolean getSpawnNPCs() { + return this.server.getSpawnNPCs(); +@@ -523,14 +685,44 @@ + + protected IChunkProvider k() { + IChunkLoader ichunkloader = this.dataManager.createChunkLoader(this.worldProvider); ++ ++ // CraftBukkit start ++ org.bukkit.craftbukkit.generator.InternalChunkGenerator gen; ++ ++ if (this.generator != null) { ++ gen = new org.bukkit.craftbukkit.generator.CustomChunkGenerator(this, this.getSeed(), this.generator); ++ } else if (this.worldProvider instanceof WorldProviderHell) { ++ gen = new org.bukkit.craftbukkit.generator.NetherChunkGenerator(this, this.getSeed()); ++ } else if (this.worldProvider instanceof WorldProviderTheEnd) { ++ gen = new org.bukkit.craftbukkit.generator.SkyLandsChunkGenerator(this, this.getSeed()); ++ } else { ++ gen = new org.bukkit.craftbukkit.generator.NormalChunkGenerator(this, this.getSeed()); ++ } + +- this.chunkProviderServer = new ChunkProviderServer(this, ichunkloader, this.worldProvider.getChunkProvider()); ++ this.chunkProviderServer = new ChunkProviderServer(this, ichunkloader, gen); ++ // CraftBukkit end + return this.chunkProviderServer; + } + + public List getTileEntities(int i, int j, int k, int l, int i1, int j1) { + ArrayList arraylist = Lists.newArrayList(); +- ++ ++ // CraftBukkit start - Get tile entities from chunks instead of world ++ for (int chunkX = (i >> 4); chunkX <= ((l - 1) >> 4); chunkX++) { ++ for (int chunkZ = (k >> 4); chunkZ <= ((j1 - 1) >> 4); chunkZ++) { ++ Chunk chunk = getChunkAt(chunkX, chunkZ); ++ if (chunk == null) { ++ continue; ++ } ++ for (Object te : chunk.tileEntities.values()) { ++ TileEntity tileentity = (TileEntity) te; ++ if ((tileentity.position.getX() >= i) && (tileentity.position.getY() >= j) && (tileentity.position.getZ() >= k) && (tileentity.position.getX() < l) && (tileentity.position.getY() < i1) && (tileentity.position.getZ() < j1)) { ++ arraylist.add(tileentity); ++ } ++ } ++ } ++ } ++ /* + for (int k1 = 0; k1 < this.h.size(); ++k1) { + TileEntity tileentity = (TileEntity) this.h.get(k1); + BlockPosition blockposition = tileentity.getPosition(); +@@ -539,6 +731,8 @@ + arraylist.add(tileentity); + } + } ++ */ ++ // CraftBukkit end + + return arraylist; + } +@@ -601,6 +795,23 @@ + int i = 0; + int j = this.worldProvider.getSeaLevel(); + int k = 0; ++ ++ // CraftBukkit start ++ if (this.generator != null) { ++ Random rand = new Random(this.getSeed()); ++ org.bukkit.Location spawn = this.generator.getFixedSpawnLocation(((WorldServer) this).getWorld(), rand); ++ ++ if (spawn != null) { ++ if (spawn.getWorld() != ((WorldServer) this).getWorld()) { ++ throw new IllegalStateException("Cannot set spawn point for " + this.worldData.getName() + " to be in another world (" + spawn.getWorld().getName() + ")"); ++ } else { ++ this.worldData.setSpawn(new BlockPosition(spawn.getBlockX(), spawn.getBlockY(), spawn.getBlockZ())); ++ this.isLoading = false; ++ return; ++ } ++ } ++ } ++ // CraftBukkit end + + if (blockposition != null) { + i = blockposition.getX(); +@@ -611,7 +822,7 @@ + + int l = 0; + +- while (!this.worldProvider.canSpawn(i, k)) { ++ while (!this.canSpawn(i, k)) { // CraftBukkit - use our own canSpawn + i += random.nextInt(64) - random.nextInt(64); + k += random.nextInt(64) - random.nextInt(64); + ++l; +@@ -648,7 +859,7 @@ + return this.worldProvider.h(); + } + +- public void save(boolean flag, IProgressUpdate iprogressupdate) { ++ public void save(boolean flag, IProgressUpdate iprogressupdate) throws ExceptionWorldConflict { // CraftBukkit - added throws + if (this.chunkProvider.canSave()) { + if (iprogressupdate != null) { + iprogressupdate.a("Saving level"); +@@ -660,7 +871,8 @@ + } + + this.chunkProvider.saveChunks(flag, iprogressupdate); +- List list = this.chunkProviderServer.a(); ++ // CraftBukkit - ArrayList -> Collection ++ Collection list = this.chunkProviderServer.a(); + Iterator iterator = list.iterator(); + + while (iterator.hasNext()) { +@@ -680,7 +892,7 @@ + } + } + +- protected void a() { ++ protected void a() throws ExceptionWorldConflict { // CraftBukkit - added throws + this.checkSession(); + this.worldData.a(this.af().h()); + this.worldData.d(this.af().f()); +@@ -692,7 +904,11 @@ + this.worldData.b(this.af().j()); + this.worldData.e(this.af().i()); + this.dataManager.saveWorldData(this.worldData, this.server.getPlayerList().u()); +- this.worldMaps.a(); ++ // CraftBukkit start - save worldMaps once, rather than once per shared world ++ if (!(this instanceof SecondaryWorldServer)) { ++ this.worldMaps.a(); ++ } ++ // CraftBukkit end + } + + protected void a(Entity entity) { +@@ -724,8 +940,16 @@ + } + + public boolean strikeLightning(Entity entity) { ++ // CraftBukkit start ++ LightningStrikeEvent lightning = new LightningStrikeEvent(this.getWorld(), (org.bukkit.entity.LightningStrike) entity.getBukkitEntity()); ++ this.getServer().getPluginManager().callEvent(lightning); ++ ++ if (lightning.isCancelled()) { ++ return false; ++ } + if (super.strikeLightning(entity)) { +- this.server.getPlayerList().sendPacketNearby(entity.locX, entity.locY, entity.locZ, 512.0D, this.worldProvider.getDimension(), new PacketPlayOutSpawnEntityWeather(entity)); ++ this.server.getPlayerList().sendPacketNearby(entity.locX, entity.locY, entity.locZ, 512.0D, this.dimension, new PacketPlayOutSpawnEntityWeather(entity)); ++ // CraftBukkit end + return true; + } else { + return false; +@@ -737,10 +961,20 @@ + } + + public Explosion createExplosion(Entity entity, double d0, double d1, double d2, float f, boolean flag, boolean flag1) { ++ // CraftBukkit start ++ Explosion explosion = super.createExplosion(entity, d0, d1, d2, f, flag, flag1); ++ ++ if (explosion.wasCanceled) { ++ return explosion; ++ } ++ ++ /* Remove + Explosion explosion = new Explosion(this, entity, d0, d1, d2, f, flag, flag1); + + explosion.a(); + explosion.a(false); ++ */ ++ // CraftBukkit end - TODO: Check if explosions are still properly implemented + if (!flag1) { + explosion.clearBlocks(); + } +@@ -786,7 +1020,8 @@ + BlockActionData blockactiondata = (BlockActionData) iterator.next(); + + if (this.a(blockactiondata)) { +- this.server.getPlayerList().sendPacketNearby((double) blockactiondata.a().getX(), (double) blockactiondata.a().getY(), (double) blockactiondata.a().getZ(), 64.0D, this.worldProvider.getDimension(), new PacketPlayOutBlockAction(blockactiondata.a(), blockactiondata.d(), blockactiondata.b(), blockactiondata.c())); ++ // CraftBukkit - this.worldProvider.dimension -> this.dimension ++ this.server.getPlayerList().sendPacketNearby((double) blockactiondata.a().getX(), (double) blockactiondata.a().getY(), (double) blockactiondata.a().getZ(), 64.0D, this.dimension, new PacketPlayOutBlockAction(blockactiondata.a(), blockactiondata.d(), blockactiondata.b(), blockactiondata.c())); + } + } + +@@ -809,6 +1044,7 @@ + boolean flag = this.S(); + + super.p(); ++ /* CraftBukkit start + if (this.o != this.p) { + this.server.getPlayerList().a(new PacketPlayOutGameStateChange(7, this.p), this.worldProvider.getDimension()); + } +@@ -827,6 +1063,16 @@ + this.server.getPlayerList().sendAll(new PacketPlayOutGameStateChange(7, this.p)); + this.server.getPlayerList().sendAll(new PacketPlayOutGameStateChange(8, this.r)); + } ++ // */ ++ if (flag != this.S()) { ++ // Only send 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)).setPlayerWeather((!flag ? WeatherType.DOWNFALL : WeatherType.CLEAR), false); ++ } ++ } ++ // CraftBukkit end ++ } + + } + +@@ -855,10 +1101,17 @@ + } + + public void a(EnumParticle enumparticle, boolean flag, double d0, double d1, double d2, int i, double d3, double d4, double d5, double d6, int... aint) { ++ // CraftBukkit - visibility api support ++ sendParticles(null, enumparticle, flag, d0, d1, d2, i, d3, d4, d5, d6, aint); ++ } ++ ++ public void sendParticles(EntityPlayer sender, EnumParticle enumparticle, boolean flag, double d0, double d1, double d2, int i, double d3, double d4, double d5, double d6, int... aint) { ++ // CraftBukkit end + PacketPlayOutWorldParticles packetplayoutworldparticles = new PacketPlayOutWorldParticles(enumparticle, flag, (float) d0, (float) d1, (float) d2, (float) d3, (float) d4, (float) d5, (float) d6, i, aint); + + for (int j = 0; j < this.players.size(); ++j) { + EntityPlayer entityplayer = (EntityPlayer) this.players.get(j); ++ if (sender != null && !sender.getBukkitEntity().canSee(entityplayer.getBukkitEntity())) continue; // CraftBukkit + BlockPosition blockposition = entityplayer.getChunkCoordinates(); + double d7 = blockposition.c(d0, d1, d2); + diff --git a/pom.xml b/pom.xml index 8dc82eb7e1..e2d4c7de43 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ org.bukkit craftbukkit jar - 1.7.10-R0.1-SNAPSHOT + 1.8-R0.1-SNAPSHOT CraftBukkit http://www.bukkit.org @@ -12,31 +12,12 @@ UTF-8 unknown 4.11 - 1.7.10 - 1_7_R4 + 1.8 + 1_8_R1 git-Bukkit- - - scm:git:git://github.com/Bukkit/CraftBukkit.git - scm:git:ssh://git@github.com/Bukkit/CraftBukkit.git - https://github.com/Bukkit/CraftBukkit - - - - - repobo-rel - repo.bukkit.org Releases - http://repo.bukkit.org/content/repositories/releases/ - - - repobo-snap - repo.bukkit.org Snapshots - http://repo.bukkit.org/content/repositories/snapshots/ - - - repobo-snap @@ -60,9 +41,9 @@ compile - org.bukkit + org.spigotmc minecraft-server - ${minecraft.version} + ${minecraft.version}-SNAPSHOT jar compile @@ -124,7 +105,7 @@ com.google.guava guava - 10.0 + 17.0 jar provided diff --git a/src/main/java/net/minecraft/server/BiomeTheEndDecorator.java b/src/main/java/net/minecraft/server/BiomeTheEndDecorator.java deleted file mode 100644 index 2f4e7495c9..0000000000 --- a/src/main/java/net/minecraft/server/BiomeTheEndDecorator.java +++ /dev/null @@ -1,28 +0,0 @@ -package net.minecraft.server; - -public class BiomeTheEndDecorator extends BiomeDecorator { - - protected WorldGenerator J; - - public BiomeTheEndDecorator() { - this.J = new WorldGenEnder(Blocks.WHITESTONE); - } - - protected void a(BiomeBase biomebase) { - this.a(); - if (this.b.nextInt(5) == 0) { - int i = this.c + this.b.nextInt(16) + 8; - int j = this.d + this.b.nextInt(16) + 8; - int k = this.a.i(i, j); - - this.J.generate(this.a, this.b, i, k, j); - } - - if (this.c == 0 && this.d == 0) { - EntityEnderDragon entityenderdragon = new EntityEnderDragon(this.a); - - entityenderdragon.setPositionRotation(0.0D, 128.0D, 0.0D, this.b.nextFloat() * 360.0F, 0.0F); - this.a.addEntity(entityenderdragon, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.CHUNK_GEN); // CraftBukkit - add SpawnReason - } - } -} diff --git a/src/main/java/net/minecraft/server/Block.java b/src/main/java/net/minecraft/server/Block.java deleted file mode 100644 index 9876ebfa4e..0000000000 --- a/src/main/java/net/minecraft/server/Block.java +++ /dev/null @@ -1,807 +0,0 @@ -package net.minecraft.server; - -import java.util.Iterator; -import java.util.List; -import java.util.Random; - -public class Block { - - public static final RegistryMaterials REGISTRY = new RegistryBlocks("air"); - private CreativeModeTab creativeTab; - protected String d; - public static final StepSound e = new StepSound("stone", 1.0F, 1.0F); - public static final StepSound f = new StepSound("wood", 1.0F, 1.0F); - public static final StepSound g = new StepSound("gravel", 1.0F, 1.0F); - public static final StepSound h = new StepSound("grass", 1.0F, 1.0F); - public static final StepSound i = new StepSound("stone", 1.0F, 1.0F); - public static final StepSound j = new StepSound("stone", 1.0F, 1.5F); - public static final StepSound k = new StepSoundStone("stone", 1.0F, 1.0F); - public static final StepSound l = new StepSound("cloth", 1.0F, 1.0F); - public static final StepSound m = new StepSound("sand", 1.0F, 1.0F); - public static final StepSound n = new StepSound("snow", 1.0F, 1.0F); - public static final StepSound o = new StepSoundLadder("ladder", 1.0F, 1.0F); - public static final StepSound p = new StepSoundAnvil("anvil", 0.3F, 1.0F); - protected boolean q; - protected int r; - protected boolean s; - protected int t; - protected boolean u; - protected float strength; - protected float durability; - protected boolean x = true; - protected boolean y = true; - protected boolean z; - protected boolean isTileEntity; - protected double minX; - protected double minY; - protected double minZ; - protected double maxX; - protected double maxY; - protected double maxZ; - public StepSound stepSound; - public float I; - protected final Material material; - public float frictionFactor; - private String name; - - public static int getId(Block block) { - return REGISTRY.b(block); - } - - public static Block getById(int i) { - return (Block) REGISTRY.a(i); - } - - public static Block a(Item item) { - return getById(Item.getId(item)); - } - - public static Block b(String s) { - if (REGISTRY.b(s)) { - return (Block) REGISTRY.get(s); - } else { - try { - return (Block) REGISTRY.a(Integer.parseInt(s)); - } catch (NumberFormatException numberformatexception) { - return null; - } - } - } - - public boolean j() { - return this.q; - } - - public int k() { - return this.r; - } - - public int m() { - return this.t; - } - - public boolean n() { - return this.u; - } - - public Material getMaterial() { - return this.material; - } - - public MaterialMapColor f(int i) { - return this.getMaterial().r(); - } - - public static void p() { - REGISTRY.a(0, "air", (new BlockAir()).c("air")); - REGISTRY.a(1, "stone", (new BlockStone()).c(1.5F).b(10.0F).a(i).c("stone").d("stone")); - REGISTRY.a(2, "grass", (new BlockGrass()).c(0.6F).a(h).c("grass").d("grass")); - REGISTRY.a(3, "dirt", (new BlockDirt()).c(0.5F).a(g).c("dirt").d("dirt")); - Block block = (new Block(Material.STONE)).c(2.0F).b(10.0F).a(i).c("stonebrick").a(CreativeModeTab.b).d("cobblestone"); - - REGISTRY.a(4, "cobblestone", block); - Block block1 = (new BlockWood()).c(2.0F).b(5.0F).a(f).c("wood").d("planks"); - - REGISTRY.a(5, "planks", block1); - REGISTRY.a(6, "sapling", (new BlockSapling()).c(0.0F).a(h).c("sapling").d("sapling")); - REGISTRY.a(7, "bedrock", (new Block(Material.STONE)).s().b(6000000.0F).a(i).c("bedrock").H().a(CreativeModeTab.b).d("bedrock")); - REGISTRY.a(8, "flowing_water", (new BlockFlowing(Material.WATER)).c(100.0F).g(3).c("water").H().d("water_flow")); - REGISTRY.a(9, "water", (new BlockStationary(Material.WATER)).c(100.0F).g(3).c("water").H().d("water_still")); - REGISTRY.a(10, "flowing_lava", (new BlockFlowing(Material.LAVA)).c(100.0F).a(1.0F).c("lava").H().d("lava_flow")); - REGISTRY.a(11, "lava", (new BlockStationary(Material.LAVA)).c(100.0F).a(1.0F).c("lava").H().d("lava_still")); - REGISTRY.a(12, "sand", (new BlockSand()).c(0.5F).a(m).c("sand").d("sand")); - REGISTRY.a(13, "gravel", (new BlockGravel()).c(0.6F).a(g).c("gravel").d("gravel")); - REGISTRY.a(14, "gold_ore", (new BlockOre()).c(3.0F).b(5.0F).a(i).c("oreGold").d("gold_ore")); - REGISTRY.a(15, "iron_ore", (new BlockOre()).c(3.0F).b(5.0F).a(i).c("oreIron").d("iron_ore")); - REGISTRY.a(16, "coal_ore", (new BlockOre()).c(3.0F).b(5.0F).a(i).c("oreCoal").d("coal_ore")); - REGISTRY.a(17, "log", (new BlockLog1()).c("log").d("log")); - REGISTRY.a(18, "leaves", (new BlockLeaves1()).c("leaves").d("leaves")); - REGISTRY.a(19, "sponge", (new BlockSponge()).c(0.6F).a(h).c("sponge").d("sponge")); - REGISTRY.a(20, "glass", (new BlockGlass(Material.SHATTERABLE, false)).c(0.3F).a(k).c("glass").d("glass")); - REGISTRY.a(21, "lapis_ore", (new BlockOre()).c(3.0F).b(5.0F).a(i).c("oreLapis").d("lapis_ore")); - REGISTRY.a(22, "lapis_block", (new BlockOreBlock(MaterialMapColor.H)).c(3.0F).b(5.0F).a(i).c("blockLapis").a(CreativeModeTab.b).d("lapis_block")); - REGISTRY.a(23, "dispenser", (new BlockDispenser()).c(3.5F).a(i).c("dispenser").d("dispenser")); - Block block2 = (new BlockSandStone()).a(i).c(0.8F).c("sandStone").d("sandstone"); - - REGISTRY.a(24, "sandstone", block2); - REGISTRY.a(25, "noteblock", (new BlockNote()).c(0.8F).c("musicBlock").d("noteblock")); - REGISTRY.a(26, "bed", (new BlockBed()).c(0.2F).c("bed").H().d("bed")); - REGISTRY.a(27, "golden_rail", (new BlockPoweredRail()).c(0.7F).a(j).c("goldenRail").d("rail_golden")); - REGISTRY.a(28, "detector_rail", (new BlockMinecartDetector()).c(0.7F).a(j).c("detectorRail").d("rail_detector")); - REGISTRY.a(29, "sticky_piston", (new BlockPiston(true)).c("pistonStickyBase")); - REGISTRY.a(30, "web", (new BlockWeb()).g(1).c(4.0F).c("web").d("web")); - REGISTRY.a(31, "tallgrass", (new BlockLongGrass()).c(0.0F).a(h).c("tallgrass")); - REGISTRY.a(32, "deadbush", (new BlockDeadBush()).c(0.0F).a(h).c("deadbush").d("deadbush")); - REGISTRY.a(33, "piston", (new BlockPiston(false)).c("pistonBase")); - REGISTRY.a(34, "piston_head", new BlockPistonExtension()); - REGISTRY.a(35, "wool", (new BlockCloth(Material.CLOTH)).c(0.8F).a(l).c("cloth").d("wool_colored")); - REGISTRY.a(36, "piston_extension", new BlockPistonMoving()); - REGISTRY.a(37, "yellow_flower", (new BlockFlowers(0)).c(0.0F).a(h).c("flower1").d("flower_dandelion")); - REGISTRY.a(38, "red_flower", (new BlockFlowers(1)).c(0.0F).a(h).c("flower2").d("flower_rose")); - REGISTRY.a(39, "brown_mushroom", (new BlockMushroom()).c(0.0F).a(h).a(0.125F).c("mushroom").d("mushroom_brown")); - REGISTRY.a(40, "red_mushroom", (new BlockMushroom()).c(0.0F).a(h).c("mushroom").d("mushroom_red")); - REGISTRY.a(41, "gold_block", (new BlockOreBlock(MaterialMapColor.F)).c(3.0F).b(10.0F).a(j).c("blockGold").d("gold_block")); - REGISTRY.a(42, "iron_block", (new BlockOreBlock(MaterialMapColor.h)).c(5.0F).b(10.0F).a(j).c("blockIron").d("iron_block")); - REGISTRY.a(43, "double_stone_slab", (new BlockStep(true)).c(2.0F).b(10.0F).a(i).c("stoneSlab")); - REGISTRY.a(44, "stone_slab", (new BlockStep(false)).c(2.0F).b(10.0F).a(i).c("stoneSlab")); - Block block3 = (new Block(Material.STONE)).c(2.0F).b(10.0F).a(i).c("brick").a(CreativeModeTab.b).d("brick"); - - REGISTRY.a(45, "brick_block", block3); - REGISTRY.a(46, "tnt", (new BlockTNT()).c(0.0F).a(h).c("tnt").d("tnt")); - REGISTRY.a(47, "bookshelf", (new BlockBookshelf()).c(1.5F).a(f).c("bookshelf").d("bookshelf")); - REGISTRY.a(48, "mossy_cobblestone", (new Block(Material.STONE)).c(2.0F).b(10.0F).a(i).c("stoneMoss").a(CreativeModeTab.b).d("cobblestone_mossy")); - REGISTRY.a(49, "obsidian", (new BlockObsidian()).c(50.0F).b(2000.0F).a(i).c("obsidian").d("obsidian")); - REGISTRY.a(50, "torch", (new BlockTorch()).c(0.0F).a(0.9375F).a(f).c("torch").d("torch_on")); - REGISTRY.a(51, "fire", (new BlockFire()).c(0.0F).a(1.0F).a(f).c("fire").H().d("fire")); - REGISTRY.a(52, "mob_spawner", (new BlockMobSpawner()).c(5.0F).a(j).c("mobSpawner").H().d("mob_spawner")); - REGISTRY.a(53, "oak_stairs", (new BlockStairs(block1, 0)).c("stairsWood")); - REGISTRY.a(54, "chest", (new BlockChest(0)).c(2.5F).a(f).c("chest")); - REGISTRY.a(55, "redstone_wire", (new BlockRedstoneWire()).c(0.0F).a(e).c("redstoneDust").H().d("redstone_dust")); - REGISTRY.a(56, "diamond_ore", (new BlockOre()).c(3.0F).b(5.0F).a(i).c("oreDiamond").d("diamond_ore")); - REGISTRY.a(57, "diamond_block", (new BlockOreBlock(MaterialMapColor.G)).c(5.0F).b(10.0F).a(j).c("blockDiamond").d("diamond_block")); - REGISTRY.a(58, "crafting_table", (new BlockWorkbench()).c(2.5F).a(f).c("workbench").d("crafting_table")); - REGISTRY.a(59, "wheat", (new BlockCrops()).c("crops").d("wheat")); - Block block4 = (new BlockSoil()).c(0.6F).a(g).c("farmland").d("farmland"); - - REGISTRY.a(60, "farmland", block4); - REGISTRY.a(61, "furnace", (new BlockFurnace(false)).c(3.5F).a(i).c("furnace").a(CreativeModeTab.c)); - REGISTRY.a(62, "lit_furnace", (new BlockFurnace(true)).c(3.5F).a(i).a(0.875F).c("furnace")); - REGISTRY.a(63, "standing_sign", (new BlockSign(TileEntitySign.class, true)).c(1.0F).a(f).c("sign").H()); - REGISTRY.a(64, "wooden_door", (new BlockDoor(Material.WOOD)).c(3.0F).a(f).c("doorWood").H().d("door_wood")); - REGISTRY.a(65, "ladder", (new BlockLadder()).c(0.4F).a(o).c("ladder").d("ladder")); - REGISTRY.a(66, "rail", (new BlockMinecartTrack()).c(0.7F).a(j).c("rail").d("rail_normal")); - REGISTRY.a(67, "stone_stairs", (new BlockStairs(block, 0)).c("stairsStone")); - REGISTRY.a(68, "wall_sign", (new BlockSign(TileEntitySign.class, false)).c(1.0F).a(f).c("sign").H()); - REGISTRY.a(69, "lever", (new BlockLever()).c(0.5F).a(f).c("lever").d("lever")); - REGISTRY.a(70, "stone_pressure_plate", (new BlockPressurePlateBinary("stone", Material.STONE, EnumMobType.MOBS)).c(0.5F).a(i).c("pressurePlate")); - REGISTRY.a(71, "iron_door", (new BlockDoor(Material.ORE)).c(5.0F).a(j).c("doorIron").H().d("door_iron")); - REGISTRY.a(72, "wooden_pressure_plate", (new BlockPressurePlateBinary("planks_oak", Material.WOOD, EnumMobType.EVERYTHING)).c(0.5F).a(f).c("pressurePlate")); - REGISTRY.a(73, "redstone_ore", (new BlockRedstoneOre(false)).c(3.0F).b(5.0F).a(i).c("oreRedstone").a(CreativeModeTab.b).d("redstone_ore")); - REGISTRY.a(74, "lit_redstone_ore", (new BlockRedstoneOre(true)).a(0.625F).c(3.0F).b(5.0F).a(i).c("oreRedstone").d("redstone_ore")); - REGISTRY.a(75, "unlit_redstone_torch", (new BlockRedstoneTorch(false)).c(0.0F).a(f).c("notGate").d("redstone_torch_off")); - REGISTRY.a(76, "redstone_torch", (new BlockRedstoneTorch(true)).c(0.0F).a(0.5F).a(f).c("notGate").a(CreativeModeTab.d).d("redstone_torch_on")); - REGISTRY.a(77, "stone_button", (new BlockStoneButton()).c(0.5F).a(i).c("button")); - REGISTRY.a(78, "snow_layer", (new BlockSnow()).c(0.1F).a(n).c("snow").g(0).d("snow")); - REGISTRY.a(79, "ice", (new BlockIce()).c(0.5F).g(3).a(k).c("ice").d("ice")); - REGISTRY.a(80, "snow", (new BlockSnowBlock()).c(0.2F).a(n).c("snow").d("snow")); - REGISTRY.a(81, "cactus", (new BlockCactus()).c(0.4F).a(l).c("cactus").d("cactus")); - REGISTRY.a(82, "clay", (new BlockClay()).c(0.6F).a(g).c("clay").d("clay")); - REGISTRY.a(83, "reeds", (new BlockReed()).c(0.0F).a(h).c("reeds").H().d("reeds")); - REGISTRY.a(84, "jukebox", (new BlockJukeBox()).c(2.0F).b(10.0F).a(i).c("jukebox").d("jukebox")); - REGISTRY.a(85, "fence", (new BlockFence("planks_oak", Material.WOOD)).c(2.0F).b(5.0F).a(f).c("fence")); - Block block5 = (new BlockPumpkin(false)).c(1.0F).a(f).c("pumpkin").d("pumpkin"); - - REGISTRY.a(86, "pumpkin", block5); - REGISTRY.a(87, "netherrack", (new BlockBloodStone()).c(0.4F).a(i).c("hellrock").d("netherrack")); - REGISTRY.a(88, "soul_sand", (new BlockSlowSand()).c(0.5F).a(m).c("hellsand").d("soul_sand")); - REGISTRY.a(89, "glowstone", (new BlockLightStone(Material.SHATTERABLE)).c(0.3F).a(k).a(1.0F).c("lightgem").d("glowstone")); - REGISTRY.a(90, "portal", (new BlockPortal()).c(-1.0F).a(k).a(0.75F).c("portal").d("portal")); - REGISTRY.a(91, "lit_pumpkin", (new BlockPumpkin(true)).c(1.0F).a(f).a(1.0F).c("litpumpkin").d("pumpkin")); - REGISTRY.a(92, "cake", (new BlockCake()).c(0.5F).a(l).c("cake").H().d("cake")); - REGISTRY.a(93, "unpowered_repeater", (new BlockRepeater(false)).c(0.0F).a(f).c("diode").H().d("repeater_off")); - REGISTRY.a(94, "powered_repeater", (new BlockRepeater(true)).c(0.0F).a(0.625F).a(f).c("diode").H().d("repeater_on")); - REGISTRY.a(95, "stained_glass", (new BlockStainedGlass(Material.SHATTERABLE)).c(0.3F).a(k).c("stainedGlass").d("glass")); - REGISTRY.a(96, "trapdoor", (new BlockTrapdoor(Material.WOOD)).c(3.0F).a(f).c("trapdoor").H().d("trapdoor")); - REGISTRY.a(97, "monster_egg", (new BlockMonsterEggs()).c(0.75F).c("monsterStoneEgg")); - Block block6 = (new BlockSmoothBrick()).c(1.5F).b(10.0F).a(i).c("stonebricksmooth").d("stonebrick"); - - REGISTRY.a(98, "stonebrick", block6); - REGISTRY.a(99, "brown_mushroom_block", (new BlockHugeMushroom(Material.WOOD, 0)).c(0.2F).a(f).c("mushroom").d("mushroom_block")); - REGISTRY.a(100, "red_mushroom_block", (new BlockHugeMushroom(Material.WOOD, 1)).c(0.2F).a(f).c("mushroom").d("mushroom_block")); - REGISTRY.a(101, "iron_bars", (new BlockThin("iron_bars", "iron_bars", Material.ORE, true)).c(5.0F).b(10.0F).a(j).c("fenceIron")); - REGISTRY.a(102, "glass_pane", (new BlockThin("glass", "glass_pane_top", Material.SHATTERABLE, false)).c(0.3F).a(k).c("thinGlass")); - Block block7 = (new BlockMelon()).c(1.0F).a(f).c("melon").d("melon"); - - REGISTRY.a(103, "melon_block", block7); - REGISTRY.a(104, "pumpkin_stem", (new BlockStem(block5)).c(0.0F).a(f).c("pumpkinStem").d("pumpkin_stem")); - REGISTRY.a(105, "melon_stem", (new BlockStem(block7)).c(0.0F).a(f).c("pumpkinStem").d("melon_stem")); - REGISTRY.a(106, "vine", (new BlockVine()).c(0.2F).a(h).c("vine").d("vine")); - REGISTRY.a(107, "fence_gate", (new BlockFenceGate()).c(2.0F).b(5.0F).a(f).c("fenceGate")); - REGISTRY.a(108, "brick_stairs", (new BlockStairs(block3, 0)).c("stairsBrick")); - REGISTRY.a(109, "stone_brick_stairs", (new BlockStairs(block6, 0)).c("stairsStoneBrickSmooth")); - REGISTRY.a(110, "mycelium", (new BlockMycel()).c(0.6F).a(h).c("mycel").d("mycelium")); - REGISTRY.a(111, "waterlily", (new BlockWaterLily()).c(0.0F).a(h).c("waterlily").d("waterlily")); - Block block8 = (new Block(Material.STONE)).c(2.0F).b(10.0F).a(i).c("netherBrick").a(CreativeModeTab.b).d("nether_brick"); - - REGISTRY.a(112, "nether_brick", block8); - REGISTRY.a(113, "nether_brick_fence", (new BlockFence("nether_brick", Material.STONE)).c(2.0F).b(10.0F).a(i).c("netherFence")); - REGISTRY.a(114, "nether_brick_stairs", (new BlockStairs(block8, 0)).c("stairsNetherBrick")); - REGISTRY.a(115, "nether_wart", (new BlockNetherWart()).c("netherStalk").d("nether_wart")); - REGISTRY.a(116, "enchanting_table", (new BlockEnchantmentTable()).c(5.0F).b(2000.0F).c("enchantmentTable").d("enchanting_table")); - REGISTRY.a(117, "brewing_stand", (new BlockBrewingStand()).c(0.5F).a(0.125F).c("brewingStand").d("brewing_stand")); - REGISTRY.a(118, "cauldron", (new BlockCauldron()).c(2.0F).c("cauldron").d("cauldron")); - REGISTRY.a(119, "end_portal", (new BlockEnderPortal(Material.PORTAL)).c(-1.0F).b(6000000.0F)); - REGISTRY.a(120, "end_portal_frame", (new BlockEnderPortalFrame()).a(k).a(0.125F).c(-1.0F).c("endPortalFrame").b(6000000.0F).a(CreativeModeTab.c).d("endframe")); - REGISTRY.a(121, "end_stone", (new Block(Material.STONE)).c(3.0F).b(15.0F).a(i).c("whiteStone").a(CreativeModeTab.b).d("end_stone")); - REGISTRY.a(122, "dragon_egg", (new BlockDragonEgg()).c(3.0F).b(15.0F).a(i).a(0.125F).c("dragonEgg").d("dragon_egg")); - REGISTRY.a(123, "redstone_lamp", (new BlockRedstoneLamp(false)).c(0.3F).a(k).c("redstoneLight").a(CreativeModeTab.d).d("redstone_lamp_off")); - REGISTRY.a(124, "lit_redstone_lamp", (new BlockRedstoneLamp(true)).c(0.3F).a(k).c("redstoneLight").d("redstone_lamp_on")); - REGISTRY.a(125, "double_wooden_slab", (new BlockWoodStep(true)).c(2.0F).b(5.0F).a(f).c("woodSlab")); - REGISTRY.a(126, "wooden_slab", (new BlockWoodStep(false)).c(2.0F).b(5.0F).a(f).c("woodSlab")); - REGISTRY.a(127, "cocoa", (new BlockCocoa()).c(0.2F).b(5.0F).a(f).c("cocoa").d("cocoa")); - REGISTRY.a(128, "sandstone_stairs", (new BlockStairs(block2, 0)).c("stairsSandStone")); - REGISTRY.a(129, "emerald_ore", (new BlockOre()).c(3.0F).b(5.0F).a(i).c("oreEmerald").d("emerald_ore")); - REGISTRY.a(130, "ender_chest", (new BlockEnderChest()).c(22.5F).b(1000.0F).a(i).c("enderChest").a(0.5F)); - REGISTRY.a(131, "tripwire_hook", (new BlockTripwireHook()).c("tripWireSource").d("trip_wire_source")); - REGISTRY.a(132, "tripwire", (new BlockTripwire()).c("tripWire").d("trip_wire")); - REGISTRY.a(133, "emerald_block", (new BlockOreBlock(MaterialMapColor.I)).c(5.0F).b(10.0F).a(j).c("blockEmerald").d("emerald_block")); - REGISTRY.a(134, "spruce_stairs", (new BlockStairs(block1, 1)).c("stairsWoodSpruce")); - REGISTRY.a(135, "birch_stairs", (new BlockStairs(block1, 2)).c("stairsWoodBirch")); - REGISTRY.a(136, "jungle_stairs", (new BlockStairs(block1, 3)).c("stairsWoodJungle")); - REGISTRY.a(137, "command_block", (new BlockCommand()).s().b(6000000.0F).c("commandBlock").d("command_block")); - REGISTRY.a(138, "beacon", (new BlockBeacon()).c("beacon").a(1.0F).d("beacon")); - REGISTRY.a(139, "cobblestone_wall", (new BlockCobbleWall(block)).c("cobbleWall")); - REGISTRY.a(140, "flower_pot", (new BlockFlowerPot()).c(0.0F).a(e).c("flowerPot").d("flower_pot")); - REGISTRY.a(141, "carrots", (new BlockCarrots()).c("carrots").d("carrots")); - REGISTRY.a(142, "potatoes", (new BlockPotatoes()).c("potatoes").d("potatoes")); - REGISTRY.a(143, "wooden_button", (new BlockWoodButton()).c(0.5F).a(f).c("button")); - REGISTRY.a(144, "skull", (new BlockSkull()).c(1.0F).a(i).c("skull").d("skull")); - REGISTRY.a(145, "anvil", (new BlockAnvil()).c(5.0F).a(p).b(2000.0F).c("anvil")); - REGISTRY.a(146, "trapped_chest", (new BlockChest(1)).c(2.5F).a(f).c("chestTrap")); - REGISTRY.a(147, "light_weighted_pressure_plate", (new BlockPressurePlateWeighted("gold_block", Material.ORE, 15)).c(0.5F).a(f).c("weightedPlate_light")); - REGISTRY.a(148, "heavy_weighted_pressure_plate", (new BlockPressurePlateWeighted("iron_block", Material.ORE, 150)).c(0.5F).a(f).c("weightedPlate_heavy")); - REGISTRY.a(149, "unpowered_comparator", (new BlockRedstoneComparator(false)).c(0.0F).a(f).c("comparator").H().d("comparator_off")); - REGISTRY.a(150, "powered_comparator", (new BlockRedstoneComparator(true)).c(0.0F).a(0.625F).a(f).c("comparator").H().d("comparator_on")); - REGISTRY.a(151, "daylight_detector", (new BlockDaylightDetector()).c(0.2F).a(f).c("daylightDetector").d("daylight_detector")); - REGISTRY.a(152, "redstone_block", (new BlockRedstone(MaterialMapColor.f)).c(5.0F).b(10.0F).a(j).c("blockRedstone").d("redstone_block")); - REGISTRY.a(153, "quartz_ore", (new BlockOre()).c(3.0F).b(5.0F).a(i).c("netherquartz").d("quartz_ore")); - REGISTRY.a(154, "hopper", (new BlockHopper()).c(3.0F).b(8.0F).a(f).c("hopper").d("hopper")); - Block block9 = (new BlockQuartz()).a(i).c(0.8F).c("quartzBlock").d("quartz_block"); - - REGISTRY.a(155, "quartz_block", block9); - REGISTRY.a(156, "quartz_stairs", (new BlockStairs(block9, 0)).c("stairsQuartz")); - REGISTRY.a(157, "activator_rail", (new BlockPoweredRail()).c(0.7F).a(j).c("activatorRail").d("rail_activator")); - REGISTRY.a(158, "dropper", (new BlockDropper()).c(3.5F).a(i).c("dropper").d("dropper")); - REGISTRY.a(159, "stained_hardened_clay", (new BlockCloth(Material.STONE)).c(1.25F).b(7.0F).a(i).c("clayHardenedStained").d("hardened_clay_stained")); - REGISTRY.a(160, "stained_glass_pane", (new BlockStainedGlassPane()).c(0.3F).a(k).c("thinStainedGlass").d("glass")); - REGISTRY.a(161, "leaves2", (new BlockLeaves2()).c("leaves").d("leaves")); - REGISTRY.a(162, "log2", (new BlockLog2()).c("log").d("log")); - REGISTRY.a(163, "acacia_stairs", (new BlockStairs(block1, 4)).c("stairsWoodAcacia")); - REGISTRY.a(164, "dark_oak_stairs", (new BlockStairs(block1, 5)).c("stairsWoodDarkOak")); - REGISTRY.a(170, "hay_block", (new BlockHay()).c(0.5F).a(h).c("hayBlock").a(CreativeModeTab.b).d("hay_block")); - REGISTRY.a(171, "carpet", (new BlockCarpet()).c(0.1F).a(l).c("woolCarpet").g(0)); - REGISTRY.a(172, "hardened_clay", (new BlockHardenedClay()).c(1.25F).b(7.0F).a(i).c("clayHardened").d("hardened_clay")); - REGISTRY.a(173, "coal_block", (new Block(Material.STONE)).c(5.0F).b(10.0F).a(i).c("blockCoal").a(CreativeModeTab.b).d("coal_block")); - REGISTRY.a(174, "packed_ice", (new BlockPackedIce()).c(0.5F).a(k).c("icePacked").d("ice_packed")); - REGISTRY.a(175, "double_plant", new BlockTallPlant()); - Iterator iterator = REGISTRY.iterator(); - - while (iterator.hasNext()) { - Block block10 = (Block) iterator.next(); - - if (block10.material == Material.AIR) { - block10.u = false; - } else { - boolean flag = false; - boolean flag1 = block10.b() == 10; - boolean flag2 = block10 instanceof BlockStepAbstract; - boolean flag3 = block10 == block4; - boolean flag4 = block10.s; - boolean flag5 = block10.r == 0; - - if (flag1 || flag2 || flag3 || flag4 || flag5) { - flag = true; - } - - block10.u = flag; - } - } - } - - protected Block(Material material) { - this.stepSound = e; - this.I = 1.0F; - this.frictionFactor = 0.6F; - this.material = material; - this.a(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F); - this.q = this.c(); - this.r = this.c() ? 255 : 0; - this.s = !material.blocksLight(); - } - - protected Block a(StepSound stepsound) { - this.stepSound = stepsound; - return this; - } - - protected Block g(int i) { - this.r = i; - return this; - } - - protected Block a(float f) { - this.t = (int) (15.0F * f); - return this; - } - - protected Block b(float f) { - this.durability = f * 3.0F; - return this; - } - - public boolean r() { - return this.material.k() && this.d() && !this.isPowerSource(); - } - - public boolean d() { - return true; - } - - public boolean b(IBlockAccess iblockaccess, int i, int j, int k) { - return !this.material.isSolid(); - } - - public int b() { - return 0; - } - - protected Block c(float f) { - this.strength = f; - if (this.durability < f * 5.0F) { - this.durability = f * 5.0F; - } - - return this; - } - - protected Block s() { - this.c(-1.0F); - return this; - } - - public float f(World world, int i, int j, int k) { - return this.strength; - } - - protected Block a(boolean flag) { - this.z = flag; - return this; - } - - public boolean isTicking() { - return this.z; - } - - public boolean isTileEntity() { - return this.isTileEntity; - } - - protected final void a(float f, float f1, float f2, float f3, float f4, float f5) { - this.minX = (double) f; - this.minY = (double) f1; - this.minZ = (double) f2; - this.maxX = (double) f3; - this.maxY = (double) f4; - this.maxZ = (double) f5; - } - - public boolean d(IBlockAccess iblockaccess, int i, int j, int k, int l) { - return iblockaccess.getType(i, j, k).getMaterial().isBuildable(); - } - - public void a(World world, int i, int j, int k, AxisAlignedBB axisalignedbb, List list, Entity entity) { - AxisAlignedBB axisalignedbb1 = this.a(world, i, j, k); - - if (axisalignedbb1 != null && axisalignedbb.b(axisalignedbb1)) { - list.add(axisalignedbb1); - } - } - - public AxisAlignedBB a(World world, int i, int j, int k) { - return AxisAlignedBB.a((double) i + this.minX, (double) j + this.minY, (double) k + this.minZ, (double) i + this.maxX, (double) j + this.maxY, (double) k + this.maxZ); - } - - public boolean c() { - return true; - } - - public boolean a(int i, boolean flag) { - return this.v(); - } - - public boolean v() { - return true; - } - - public void a(World world, int i, int j, int k, Random random) {} - - public void postBreak(World world, int i, int j, int k, int l) {} - - public void doPhysics(World world, int i, int j, int k, Block block) {} - - public int a(World world) { - return 10; - } - - public void onPlace(World world, int i, int j, int k) {} - - public void remove(World world, int i, int j, int k, Block block, int l) {} - - public int a(Random random) { - return 1; - } - - public Item getDropType(int i, Random random, int j) { - return Item.getItemOf(this); - } - - public float getDamage(EntityHuman entityhuman, World world, int i, int j, int k) { - float f = this.f(world, i, j, k); - - return f < 0.0F ? 0.0F : (!entityhuman.a(this) ? entityhuman.a(this, false) / f / 100.0F : entityhuman.a(this, true) / f / 30.0F); - } - - public final void b(World world, int i, int j, int k, int l, int i1) { - this.dropNaturally(world, i, j, k, l, 1.0F, i1); - } - - public void dropNaturally(World world, int i, int j, int k, int l, float f, int i1) { - if (!world.isStatic) { - int j1 = this.getDropCount(i1, world.random); - - for (int k1 = 0; k1 < j1; ++k1) { - // CraftBukkit - <= to < to allow for plugins to completely disable block drops from explosions - if (world.random.nextFloat() < f) { - Item item = this.getDropType(l, world.random, i1); - - if (item != null) { - this.a(world, i, j, k, new ItemStack(item, 1, this.getDropData(l))); - } - } - } - } - } - - protected void a(World world, int i, int j, int k, ItemStack itemstack) { - if (!world.isStatic && world.getGameRules().getBoolean("doTileDrops")) { - float f = 0.7F; - double d0 = (double) (world.random.nextFloat() * f) + (double) (1.0F - f) * 0.5D; - double d1 = (double) (world.random.nextFloat() * f) + (double) (1.0F - f) * 0.5D; - double d2 = (double) (world.random.nextFloat() * f) + (double) (1.0F - f) * 0.5D; - EntityItem entityitem = new EntityItem(world, (double) i + d0, (double) j + d1, (double) k + d2, itemstack); - - entityitem.pickupDelay = 10; - world.addEntity(entityitem); - } - } - - protected void dropExperience(World world, int i, int j, int k, int l) { - if (!world.isStatic) { - while (l > 0) { - int i1 = EntityExperienceOrb.getOrbValue(l); - - l -= i1; - world.addEntity(new EntityExperienceOrb(world, (double) i + 0.5D, (double) j + 0.5D, (double) k + 0.5D, i1)); - } - } - } - - public int getDropData(int i) { - return 0; - } - - public float a(Entity entity) { - return this.durability / 5.0F; - } - - public MovingObjectPosition a(World world, int i, int j, int k, Vec3D vec3d, Vec3D vec3d1) { - this.updateShape(world, i, j, k); - vec3d = vec3d.add((double) (-i), (double) (-j), (double) (-k)); - vec3d1 = vec3d1.add((double) (-i), (double) (-j), (double) (-k)); - Vec3D vec3d2 = vec3d.b(vec3d1, this.minX); - Vec3D vec3d3 = vec3d.b(vec3d1, this.maxX); - Vec3D vec3d4 = vec3d.c(vec3d1, this.minY); - Vec3D vec3d5 = vec3d.c(vec3d1, this.maxY); - Vec3D vec3d6 = vec3d.d(vec3d1, this.minZ); - Vec3D vec3d7 = vec3d.d(vec3d1, this.maxZ); - - if (!this.a(vec3d2)) { - vec3d2 = null; - } - - if (!this.a(vec3d3)) { - vec3d3 = null; - } - - if (!this.b(vec3d4)) { - vec3d4 = null; - } - - if (!this.b(vec3d5)) { - vec3d5 = null; - } - - if (!this.c(vec3d6)) { - vec3d6 = null; - } - - if (!this.c(vec3d7)) { - vec3d7 = null; - } - - Vec3D vec3d8 = null; - - if (vec3d2 != null && (vec3d8 == null || vec3d.distanceSquared(vec3d2) < vec3d.distanceSquared(vec3d8))) { - vec3d8 = vec3d2; - } - - if (vec3d3 != null && (vec3d8 == null || vec3d.distanceSquared(vec3d3) < vec3d.distanceSquared(vec3d8))) { - vec3d8 = vec3d3; - } - - if (vec3d4 != null && (vec3d8 == null || vec3d.distanceSquared(vec3d4) < vec3d.distanceSquared(vec3d8))) { - vec3d8 = vec3d4; - } - - if (vec3d5 != null && (vec3d8 == null || vec3d.distanceSquared(vec3d5) < vec3d.distanceSquared(vec3d8))) { - vec3d8 = vec3d5; - } - - if (vec3d6 != null && (vec3d8 == null || vec3d.distanceSquared(vec3d6) < vec3d.distanceSquared(vec3d8))) { - vec3d8 = vec3d6; - } - - if (vec3d7 != null && (vec3d8 == null || vec3d.distanceSquared(vec3d7) < vec3d.distanceSquared(vec3d8))) { - vec3d8 = vec3d7; - } - - if (vec3d8 == null) { - return null; - } else { - byte b0 = -1; - - if (vec3d8 == vec3d2) { - b0 = 4; - } - - if (vec3d8 == vec3d3) { - b0 = 5; - } - - if (vec3d8 == vec3d4) { - b0 = 0; - } - - if (vec3d8 == vec3d5) { - b0 = 1; - } - - if (vec3d8 == vec3d6) { - b0 = 2; - } - - if (vec3d8 == vec3d7) { - b0 = 3; - } - - return new MovingObjectPosition(i, j, k, b0, vec3d8.add((double) i, (double) j, (double) k)); - } - } - - private boolean a(Vec3D vec3d) { - return vec3d == null ? false : vec3d.b >= this.minY && vec3d.b <= this.maxY && vec3d.c >= this.minZ && vec3d.c <= this.maxZ; - } - - private boolean b(Vec3D vec3d) { - return vec3d == null ? false : vec3d.a >= this.minX && vec3d.a <= this.maxX && vec3d.c >= this.minZ && vec3d.c <= this.maxZ; - } - - private boolean c(Vec3D vec3d) { - return vec3d == null ? false : vec3d.a >= this.minX && vec3d.a <= this.maxX && vec3d.b >= this.minY && vec3d.b <= this.maxY; - } - - public void wasExploded(World world, int i, int j, int k, Explosion explosion) {} - - public boolean canPlace(World world, int i, int j, int k, int l, ItemStack itemstack) { - return this.canPlace(world, i, j, k, l); - } - - public boolean canPlace(World world, int i, int j, int k, int l) { - return this.canPlace(world, i, j, k); - } - - public boolean canPlace(World world, int i, int j, int k) { - return world.getType(i, j, k).material.isReplaceable(); - } - - public boolean interact(World world, int i, int j, int k, EntityHuman entityhuman, int l, float f, float f1, float f2) { - return false; - } - - public void b(World world, int i, int j, int k, Entity entity) {} - - public int getPlacedData(World world, int i, int j, int k, int l, float f, float f1, float f2, int i1) { - return i1; - } - - public void attack(World world, int i, int j, int k, EntityHuman entityhuman) {} - - public void a(World world, int i, int j, int k, Entity entity, Vec3D vec3d) {} - - public void updateShape(IBlockAccess iblockaccess, int i, int j, int k) {} - - public final double x() { - return this.minX; - } - - public final double y() { - return this.maxX; - } - - public final double z() { - return this.minY; - } - - public final double A() { - return this.maxY; - } - - public final double B() { - return this.minZ; - } - - public final double C() { - return this.maxZ; - } - - public int b(IBlockAccess iblockaccess, int i, int j, int k, int l) { - return 0; - } - - public boolean isPowerSource() { - return false; - } - - public void a(World world, int i, int j, int k, Entity entity) {} - - public int c(IBlockAccess iblockaccess, int i, int j, int k, int l) { - return 0; - } - - public void g() {} - - public void a(World world, EntityHuman entityhuman, int i, int j, int k, int l) { - entityhuman.a(StatisticList.MINE_BLOCK_COUNT[getId(this)], 1); - entityhuman.applyExhaustion(0.025F); - if (this.E() && EnchantmentManager.hasSilkTouchEnchantment(entityhuman)) { - ItemStack itemstack = this.j(l); - - if (itemstack != null) { - this.a(world, i, j, k, itemstack); - } - } else { - int i1 = EnchantmentManager.getBonusBlockLootEnchantmentLevel(entityhuman); - - this.b(world, i, j, k, l, i1); - } - } - - protected boolean E() { - return this.d() && !this.isTileEntity; - } - - protected ItemStack j(int i) { - int j = 0; - Item item = Item.getItemOf(this); - - if (item != null && item.n()) { - j = i; - } - - return new ItemStack(item, 1, j); - } - - public int getDropCount(int i, Random random) { - return this.a(random); - } - - public boolean j(World world, int i, int j, int k) { - return true; - } - - public void postPlace(World world, int i, int j, int k, EntityLiving entityliving, ItemStack itemstack) {} - - public void postPlace(World world, int i, int j, int k, int l) {} - - public Block c(String s) { - this.name = s; - return this; - } - - public String getName() { - return LocaleI18n.get(this.a() + ".name"); - } - - public String a() { - return "tile." + this.name; - } - - public boolean a(World world, int i, int j, int k, int l, int i1) { - return false; - } - - public boolean G() { - return this.y; - } - - protected Block H() { - this.y = false; - return this; - } - - public int h() { - return this.material.getPushReaction(); - } - - public void a(World world, int i, int j, int k, Entity entity, float f) {} - - public int getDropData(World world, int i, int j, int k) { - return this.getDropData(world.getData(i, j, k)); - } - - public Block a(CreativeModeTab creativemodetab) { - this.creativeTab = creativemodetab; - return this; - } - - public void a(World world, int i, int j, int k, int l, EntityHuman entityhuman) {} - - public void f(World world, int i, int j, int k, int l) {} - - public void l(World world, int i, int j, int k) {} - - public boolean L() { - return true; - } - - public boolean a(Explosion explosion) { - return true; - } - - public boolean c(Block block) { - return this == block; - } - - public static boolean a(Block block, Block block1) { - return block != null && block1 != null ? (block == block1 ? true : block.c(block1)) : false; - } - - public boolean isComplexRedstone() { - return false; - } - - public int g(World world, int i, int j, int k, int l) { - return 0; - } - - protected Block d(String s) { - this.d = s; - return this; - } - - // CraftBukkit start - public int getExpDrop(World world, int data, int enchantmentLevel) { - return 0; - } - // CraftBukkit end -} diff --git a/src/main/java/net/minecraft/server/BlockActionDataList.java b/src/main/java/net/minecraft/server/BlockActionDataList.java deleted file mode 100644 index 30109ecc6c..0000000000 --- a/src/main/java/net/minecraft/server/BlockActionDataList.java +++ /dev/null @@ -1,13 +0,0 @@ -package net.minecraft.server; - -import java.util.ArrayList; - -// CraftBukkit - imported class because the constructor is package private -class BlockActionDataList extends ArrayList { - - private BlockActionDataList() {} - - BlockActionDataList(BananaAPI bananaapi) { - this(); - } -} diff --git a/src/main/java/net/minecraft/server/BlockBloodStone.java b/src/main/java/net/minecraft/server/BlockBloodStone.java deleted file mode 100644 index ca46ea627c..0000000000 --- a/src/main/java/net/minecraft/server/BlockBloodStone.java +++ /dev/null @@ -1,27 +0,0 @@ -package net.minecraft.server; - -import org.bukkit.event.block.BlockRedstoneEvent; // CraftBukkit - -public class BlockBloodStone extends Block { - - public BlockBloodStone() { - super(Material.STONE); - this.a(CreativeModeTab.b); - } - - public MaterialMapColor f(int i) { - return MaterialMapColor.K; - } - - // CraftBukkit start - public void doPhysics(World world, int i, int j, int k, int l) { - if (net.minecraft.server.Block.getById(l) != null && net.minecraft.server.Block.getById(l).isPowerSource()) { - org.bukkit.block.Block block = world.getWorld().getBlockAt(i, j, k); - int power = block.getBlockPower(); - - BlockRedstoneEvent event = new BlockRedstoneEvent(block, power, power); - world.getServer().getPluginManager().callEvent(event); - } - } - // CraftBukkit end -} diff --git a/src/main/java/net/minecraft/server/BlockButtonAbstract.java b/src/main/java/net/minecraft/server/BlockButtonAbstract.java deleted file mode 100644 index 6e542058e1..0000000000 --- a/src/main/java/net/minecraft/server/BlockButtonAbstract.java +++ /dev/null @@ -1,332 +0,0 @@ -package net.minecraft.server; - -import java.util.List; -import java.util.Random; - -// CraftBukkit start -import org.bukkit.event.block.BlockRedstoneEvent; -import org.bukkit.event.entity.EntityInteractEvent; -// CraftBukkit end - -public abstract class BlockButtonAbstract extends Block { - - private final boolean a; - - protected BlockButtonAbstract(boolean flag) { - super(Material.ORIENTABLE); - this.a(true); - this.a(CreativeModeTab.d); - this.a = flag; - } - - public AxisAlignedBB a(World world, int i, int j, int k) { - return null; - } - - public int a(World world) { - return this.a ? 30 : 20; - } - - public boolean c() { - return false; - } - - public boolean d() { - return false; - } - - public boolean canPlace(World world, int i, int j, int k, int l) { - return l == 2 && world.getType(i, j, k + 1).r() ? true : (l == 3 && world.getType(i, j, k - 1).r() ? true : (l == 4 && world.getType(i + 1, j, k).r() ? true : l == 5 && world.getType(i - 1, j, k).r())); - } - - public boolean canPlace(World world, int i, int j, int k) { - return world.getType(i - 1, j, k).r() ? true : (world.getType(i + 1, j, k).r() ? true : (world.getType(i, j, k - 1).r() ? true : world.getType(i, j, k + 1).r())); - } - - public int getPlacedData(World world, int i, int j, int k, int l, float f, float f1, float f2, int i1) { - int j1 = world.getData(i, j, k); - int k1 = j1 & 8; - - j1 &= 7; - if (l == 2 && world.getType(i, j, k + 1).r()) { - j1 = 4; - } else if (l == 3 && world.getType(i, j, k - 1).r()) { - j1 = 3; - } else if (l == 4 && world.getType(i + 1, j, k).r()) { - j1 = 2; - } else if (l == 5 && world.getType(i - 1, j, k).r()) { - j1 = 1; - } else { - j1 = this.e(world, i, j, k); - } - - return j1 + k1; - } - - private int e(World world, int i, int j, int k) { - return world.getType(i - 1, j, k).r() ? 1 : (world.getType(i + 1, j, k).r() ? 2 : (world.getType(i, j, k - 1).r() ? 3 : (world.getType(i, j, k + 1).r() ? 4 : 1))); - } - - public void doPhysics(World world, int i, int j, int k, Block block) { - if (this.m(world, i, j, k)) { - int l = world.getData(i, j, k) & 7; - boolean flag = false; - - if (!world.getType(i - 1, j, k).r() && l == 1) { - flag = true; - } - - if (!world.getType(i + 1, j, k).r() && l == 2) { - flag = true; - } - - if (!world.getType(i, j, k - 1).r() && l == 3) { - flag = true; - } - - if (!world.getType(i, j, k + 1).r() && l == 4) { - flag = true; - } - - if (flag) { - this.b(world, i, j, k, world.getData(i, j, k), 0); - world.setAir(i, j, k); - } - } - } - - private boolean m(World world, int i, int j, int k) { - if (!this.canPlace(world, i, j, k)) { - this.b(world, i, j, k, world.getData(i, j, k), 0); - world.setAir(i, j, k); - return false; - } else { - return true; - } - } - - public void updateShape(IBlockAccess iblockaccess, int i, int j, int k) { - int l = iblockaccess.getData(i, j, k); - - this.b(l); - } - - private void b(int i) { - int j = i & 7; - boolean flag = (i & 8) > 0; - float f = 0.375F; - float f1 = 0.625F; - float f2 = 0.1875F; - float f3 = 0.125F; - - if (flag) { - f3 = 0.0625F; - } - - if (j == 1) { - this.a(0.0F, f, 0.5F - f2, f3, f1, 0.5F + f2); - } else if (j == 2) { - this.a(1.0F - f3, f, 0.5F - f2, 1.0F, f1, 0.5F + f2); - } else if (j == 3) { - this.a(0.5F - f2, f, 0.0F, 0.5F + f2, f1, f3); - } else if (j == 4) { - this.a(0.5F - f2, f, 1.0F - f3, 0.5F + f2, f1, 1.0F); - } - } - - public void attack(World world, int i, int j, int k, EntityHuman entityhuman) {} - - public boolean interact(World world, int i, int j, int k, EntityHuman entityhuman, int l, float f, float f1, float f2) { - int i1 = world.getData(i, j, k); - int j1 = i1 & 7; - int k1 = 8 - (i1 & 8); - - if (k1 == 0) { - return true; - } else { - // CraftBukkit start - org.bukkit.block.Block block = world.getWorld().getBlockAt(i, j, k); - int old = (k1 != 8) ? 15 : 0; - int current = (k1 == 8) ? 15 : 0; - - BlockRedstoneEvent eventRedstone = new BlockRedstoneEvent(block, old, current); - world.getServer().getPluginManager().callEvent(eventRedstone); - - if ((eventRedstone.getNewCurrent() > 0) != (k1 == 8)) { - return true; - } - // CraftBukkit end - - world.setData(i, j, k, j1 + k1, 3); - world.c(i, j, k, i, j, k); - world.makeSound((double) i + 0.5D, (double) j + 0.5D, (double) k + 0.5D, "random.click", 0.3F, 0.6F); - this.a(world, i, j, k, j1); - world.a(i, j, k, this, this.a(world)); - return true; - } - } - - public void remove(World world, int i, int j, int k, Block block, int l) { - if ((l & 8) > 0) { - int i1 = l & 7; - - this.a(world, i, j, k, i1); - } - - super.remove(world, i, j, k, block, l); - } - - public int b(IBlockAccess iblockaccess, int i, int j, int k, int l) { - return (iblockaccess.getData(i, j, k) & 8) > 0 ? 15 : 0; - } - - public int c(IBlockAccess iblockaccess, int i, int j, int k, int l) { - int i1 = iblockaccess.getData(i, j, k); - - if ((i1 & 8) == 0) { - return 0; - } else { - int j1 = i1 & 7; - - return j1 == 5 && l == 1 ? 15 : (j1 == 4 && l == 2 ? 15 : (j1 == 3 && l == 3 ? 15 : (j1 == 2 && l == 4 ? 15 : (j1 == 1 && l == 5 ? 15 : 0)))); - } - } - - public boolean isPowerSource() { - return true; - } - - public void a(World world, int i, int j, int k, Random random) { - if (!world.isStatic) { - int l = world.getData(i, j, k); - - if ((l & 8) != 0) { - if (this.a) { - this.n(world, i, j, k); - } else { - // CraftBukkit start - org.bukkit.block.Block block = world.getWorld().getBlockAt(i, j, k); - - BlockRedstoneEvent eventRedstone = new BlockRedstoneEvent(block, 15, 0); - world.getServer().getPluginManager().callEvent(eventRedstone); - - if (eventRedstone.getNewCurrent() > 0) { - return; - } - // CraftBukkit end - world.setData(i, j, k, l & 7, 3); - int i1 = l & 7; - - this.a(world, i, j, k, i1); - world.makeSound((double) i + 0.5D, (double) j + 0.5D, (double) k + 0.5D, "random.click", 0.3F, 0.5F); - world.c(i, j, k, i, j, k); - } - } - } - } - - public void g() { - float f = 0.1875F; - float f1 = 0.125F; - float f2 = 0.125F; - - this.a(0.5F - f, 0.5F - f1, 0.5F - f2, 0.5F + f, 0.5F + f1, 0.5F + f2); - } - - public void a(World world, int i, int j, int k, Entity entity) { - if (!world.isStatic) { - if (this.a) { - if ((world.getData(i, j, k) & 8) == 0) { - this.n(world, i, j, k); - } - } - } - } - - private void n(World world, int i, int j, int k) { - int l = world.getData(i, j, k); - int i1 = l & 7; - boolean flag = (l & 8) != 0; - - this.b(l); - List list = world.a(EntityArrow.class, AxisAlignedBB.a((double) i + this.minX, (double) j + this.minY, (double) k + this.minZ, (double) i + this.maxX, (double) j + this.maxY, (double) k + this.maxZ)); - boolean flag1 = !list.isEmpty(); - - // CraftBukkit start - Call interact event when arrows turn on wooden buttons - if (flag != flag1 && flag1) { - org.bukkit.block.Block block = world.getWorld().getBlockAt(i, j, k); - boolean allowed = false; - - // If all of the events are cancelled block the button press, else allow - for (Object object : list) { - if (object != null) { - EntityInteractEvent event = new EntityInteractEvent(((Entity) object).getBukkitEntity(), block); - world.getServer().getPluginManager().callEvent(event); - - if (!event.isCancelled()) { - allowed = true; - break; - } - } - } - - if (!allowed) { - return; - } - } - // CraftBukkit end - - if (flag1 && !flag) { - // CraftBukkit start - org.bukkit.block.Block block = world.getWorld().getBlockAt(i, j, k); - - BlockRedstoneEvent eventRedstone = new BlockRedstoneEvent(block, 0, 15); - world.getServer().getPluginManager().callEvent(eventRedstone); - - if (eventRedstone.getNewCurrent() <= 0) { - return; - } - // CraftBukkit end - world.setData(i, j, k, i1 | 8, 3); - this.a(world, i, j, k, i1); - world.c(i, j, k, i, j, k); - world.makeSound((double) i + 0.5D, (double) j + 0.5D, (double) k + 0.5D, "random.click", 0.3F, 0.6F); - } - - if (!flag1 && flag) { - // CraftBukkit start - org.bukkit.block.Block block = world.getWorld().getBlockAt(i, j, k); - - BlockRedstoneEvent eventRedstone = new BlockRedstoneEvent(block, 15, 0); - world.getServer().getPluginManager().callEvent(eventRedstone); - - if (eventRedstone.getNewCurrent() > 0) { - return; - } - // CraftBukkit end - world.setData(i, j, k, i1, 3); - this.a(world, i, j, k, i1); - world.c(i, j, k, i, j, k); - world.makeSound((double) i + 0.5D, (double) j + 0.5D, (double) k + 0.5D, "random.click", 0.3F, 0.5F); - } - - if (flag1) { - world.a(i, j, k, this, this.a(world)); - } - } - - private void a(World world, int i, int j, int k, int l) { - world.applyPhysics(i, j, k, this); - if (l == 1) { - world.applyPhysics(i - 1, j, k, this); - } else if (l == 2) { - world.applyPhysics(i + 1, j, k, this); - } else if (l == 3) { - world.applyPhysics(i, j, k - 1, this); - } else if (l == 4) { - world.applyPhysics(i, j, k + 1, this); - } else { - world.applyPhysics(i, j - 1, k, this); - } - } -} diff --git a/src/main/java/net/minecraft/server/BlockCactus.java b/src/main/java/net/minecraft/server/BlockCactus.java deleted file mode 100644 index e920c6f48e..0000000000 --- a/src/main/java/net/minecraft/server/BlockCactus.java +++ /dev/null @@ -1,86 +0,0 @@ -package net.minecraft.server; - -import java.util.Random; - -import org.bukkit.craftbukkit.event.CraftEventFactory; // CraftBukkit - -public class BlockCactus extends Block { - - protected BlockCactus() { - super(Material.CACTUS); - this.a(true); - this.a(CreativeModeTab.c); - } - - public void a(World world, int i, int j, int k, Random random) { - if (world.isEmpty(i, j + 1, k)) { - int l; - - for (l = 1; world.getType(i, j - l, k) == this; ++l) { - ; - } - - if (l < 3) { - int i1 = world.getData(i, j, k); - - if (i1 == 15) { - CraftEventFactory.handleBlockGrowEvent(world, i, j + 1, k, this, 0); // CraftBukkit - world.setData(i, j, k, 0, 4); - this.doPhysics(world, i, j + 1, k, this); - } else { - world.setData(i, j, k, i1 + 1, 4); - } - } - } - } - - public AxisAlignedBB a(World world, int i, int j, int k) { - float f = 0.0625F; - - return AxisAlignedBB.a((double) ((float) i + f), (double) j, (double) ((float) k + f), (double) ((float) (i + 1) - f), (double) ((float) (j + 1) - f), (double) ((float) (k + 1) - f)); - } - - public boolean d() { - return false; - } - - public boolean c() { - return false; - } - - public int b() { - return 13; - } - - public boolean canPlace(World world, int i, int j, int k) { - return !super.canPlace(world, i, j, k) ? false : this.j(world, i, j, k); - } - - public void doPhysics(World world, int i, int j, int k, Block block) { - if (!this.j(world, i, j, k)) { - world.setAir(i, j, k, true); - } - } - - public boolean j(World world, int i, int j, int k) { - if (world.getType(i - 1, j, k).getMaterial().isBuildable()) { - return false; - } else if (world.getType(i + 1, j, k).getMaterial().isBuildable()) { - return false; - } else if (world.getType(i, j, k - 1).getMaterial().isBuildable()) { - return false; - } else if (world.getType(i, j, k + 1).getMaterial().isBuildable()) { - return false; - } else { - Block block = world.getType(i, j - 1, k); - - return block == Blocks.CACTUS || block == Blocks.SAND; - } - } - - public void a(World world, int i, int j, int k, Entity entity) { - CraftEventFactory.blockDamage = world.getWorld().getBlockAt(i, j, k); // CraftBukkit - entity.damageEntity(DamageSource.CACTUS, 1.0F); - CraftEventFactory.blockDamage = null; // CraftBukkit - } -} diff --git a/src/main/java/net/minecraft/server/BlockCake.java b/src/main/java/net/minecraft/server/BlockCake.java deleted file mode 100644 index e65a27052b..0000000000 --- a/src/main/java/net/minecraft/server/BlockCake.java +++ /dev/null @@ -1,98 +0,0 @@ -package net.minecraft.server; - -import java.util.Random; - -public class BlockCake extends Block { - - protected BlockCake() { - super(Material.CAKE); - this.a(true); - } - - public void updateShape(IBlockAccess iblockaccess, int i, int j, int k) { - int l = iblockaccess.getData(i, j, k); - float f = 0.0625F; - float f1 = (float) (1 + l * 2) / 16.0F; - float f2 = 0.5F; - - this.a(f1, 0.0F, f, 1.0F - f, f2, 1.0F - f); - } - - public void g() { - float f = 0.0625F; - float f1 = 0.5F; - - this.a(f, 0.0F, f, 1.0F - f, f1, 1.0F - f); - } - - public AxisAlignedBB a(World world, int i, int j, int k) { - int l = world.getData(i, j, k); - float f = 0.0625F; - float f1 = (float) (1 + l * 2) / 16.0F; - float f2 = 0.5F; - - return AxisAlignedBB.a((double) ((float) i + f1), (double) j, (double) ((float) k + f), (double) ((float) (i + 1) - f), (double) ((float) j + f2 - f), (double) ((float) (k + 1) - f)); - } - - public boolean d() { - return false; - } - - public boolean c() { - return false; - } - - public boolean interact(World world, int i, int j, int k, EntityHuman entityhuman, int l, float f, float f1, float f2) { - this.b(world, i, j, k, entityhuman); - return true; - } - - public void attack(World world, int i, int j, int k, EntityHuman entityhuman) { - this.b(world, i, j, k, entityhuman); - } - - private void b(World world, int i, int j, int k, EntityHuman entityhuman) { - if (entityhuman.g(false)) { - // CraftBukkit start - int oldFoodLevel = entityhuman.getFoodData().foodLevel; - - org.bukkit.event.entity.FoodLevelChangeEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callFoodLevelChangeEvent(entityhuman, 2 + oldFoodLevel); - - if (!event.isCancelled()) { - entityhuman.getFoodData().eat(event.getFoodLevel() - oldFoodLevel, 0.1F); - } - - ((EntityPlayer) entityhuman).playerConnection.sendPacket(new PacketPlayOutUpdateHealth(((EntityPlayer) entityhuman).getBukkitEntity().getScaledHealth(), entityhuman.getFoodData().foodLevel, entityhuman.getFoodData().saturationLevel)); - // CraftBukkit end - int l = world.getData(i, j, k) + 1; - - if (l >= 6) { - world.setAir(i, j, k); - } else { - world.setData(i, j, k, l, 2); - } - } - } - - public boolean canPlace(World world, int i, int j, int k) { - return !super.canPlace(world, i, j, k) ? false : this.j(world, i, j, k); - } - - public void doPhysics(World world, int i, int j, int k, Block block) { - if (!this.j(world, i, j, k)) { - world.setAir(i, j, k); - } - } - - public boolean j(World world, int i, int j, int k) { - return world.getType(i, j - 1, k).getMaterial().isBuildable(); - } - - public int a(Random random) { - return 0; - } - - public Item getDropType(int i, Random random, int j) { - return null; - } -} diff --git a/src/main/java/net/minecraft/server/BlockCocoa.java b/src/main/java/net/minecraft/server/BlockCocoa.java deleted file mode 100644 index 5584fbd924..0000000000 --- a/src/main/java/net/minecraft/server/BlockCocoa.java +++ /dev/null @@ -1,144 +0,0 @@ -package net.minecraft.server; - -import java.util.Random; - -import org.bukkit.craftbukkit.event.CraftEventFactory; // CraftBukkit - -public class BlockCocoa extends BlockDirectional implements IBlockFragilePlantElement { - - public BlockCocoa() { - super(Material.PLANT); - this.a(true); - } - - public void a(World world, int i, int j, int k, Random random) { - if (!this.j(world, i, j, k)) { - this.b(world, i, j, k, world.getData(i, j, k), 0); - world.setTypeAndData(i, j, k, getById(0), 0, 2); - } else if (world.random.nextInt(5) == 0) { - int l = world.getData(i, j, k); - int i1 = c(l); - - if (i1 < 2) { - ++i1; - // CraftBukkit - CraftEventFactory.handleBlockGrowEvent(world, i, j, k, this, i1 << 2 | l(l)); - } - } - } - - public boolean j(World world, int i, int j, int k) { - int l = l(world.getData(i, j, k)); - - i += Direction.a[l]; - k += Direction.b[l]; - Block block = world.getType(i, j, k); - - return block == Blocks.LOG && BlockLogAbstract.c(world.getData(i, j, k)) == 3; - } - - public int b() { - return 28; - } - - public boolean d() { - return false; - } - - public boolean c() { - return false; - } - - public AxisAlignedBB a(World world, int i, int j, int k) { - this.updateShape(world, i, j, k); - return super.a(world, i, j, k); - } - - public void updateShape(IBlockAccess iblockaccess, int i, int j, int k) { - int l = iblockaccess.getData(i, j, k); - int i1 = l(l); - int j1 = c(l); - int k1 = 4 + j1 * 2; - int l1 = 5 + j1 * 2; - float f = (float) k1 / 2.0F; - - switch (i1) { - case 0: - this.a((8.0F - f) / 16.0F, (12.0F - (float) l1) / 16.0F, (15.0F - (float) k1) / 16.0F, (8.0F + f) / 16.0F, 0.75F, 0.9375F); - break; - - case 1: - this.a(0.0625F, (12.0F - (float) l1) / 16.0F, (8.0F - f) / 16.0F, (1.0F + (float) k1) / 16.0F, 0.75F, (8.0F + f) / 16.0F); - break; - - case 2: - this.a((8.0F - f) / 16.0F, (12.0F - (float) l1) / 16.0F, 0.0625F, (8.0F + f) / 16.0F, 0.75F, (1.0F + (float) k1) / 16.0F); - break; - - case 3: - this.a((15.0F - (float) k1) / 16.0F, (12.0F - (float) l1) / 16.0F, (8.0F - f) / 16.0F, 0.9375F, 0.75F, (8.0F + f) / 16.0F); - } - } - - public void postPlace(World world, int i, int j, int k, EntityLiving entityliving, ItemStack itemstack) { - int l = ((MathHelper.floor((double) (entityliving.yaw * 4.0F / 360.0F) + 0.5D) & 3) + 0) % 4; - - world.setData(i, j, k, l, 2); - } - - public int getPlacedData(World world, int i, int j, int k, int l, float f, float f1, float f2, int i1) { - if (l == 1 || l == 0) { - l = 2; - } - - return Direction.f[Direction.e[l]]; - } - - public void doPhysics(World world, int i, int j, int k, Block block) { - if (!this.j(world, i, j, k)) { - this.b(world, i, j, k, world.getData(i, j, k), 0); - world.setTypeAndData(i, j, k, getById(0), 0, 2); - } - } - - public static int c(int i) { - return (i & 12) >> 2; - } - - public void dropNaturally(World world, int i, int j, int k, int l, float f, int i1) { - int j1 = c(l); - byte b0 = 1; - - if (j1 >= 2) { - b0 = 3; - } - - for (int k1 = 0; k1 < b0; ++k1) { - this.a(world, i, j, k, new ItemStack(Items.INK_SACK, 1, 3)); - } - } - - public int getDropData(World world, int i, int j, int k) { - return 3; - } - - public boolean a(World world, int i, int j, int k, boolean flag) { - int l = world.getData(i, j, k); - int i1 = c(l); - - return i1 < 2; - } - - public boolean a(World world, Random random, int i, int j, int k) { - return true; - } - - public void b(World world, Random random, int i, int j, int k) { - int l = world.getData(i, j, k); - int i1 = BlockDirectional.l(l); - int j1 = c(l); - - ++j1; - CraftEventFactory.handleBlockGrowEvent(world, i, j, k, this, j1 << 2 | i1); // CraftBukkit - } -} diff --git a/src/main/java/net/minecraft/server/BlockCommand.java b/src/main/java/net/minecraft/server/BlockCommand.java deleted file mode 100644 index c60f0a9495..0000000000 --- a/src/main/java/net/minecraft/server/BlockCommand.java +++ /dev/null @@ -1,87 +0,0 @@ -package net.minecraft.server; - -import java.util.Random; - -import org.bukkit.event.block.BlockRedstoneEvent; // CraftBukkit - -public class BlockCommand extends BlockContainer { - - public BlockCommand() { - super(Material.ORE); - } - - public TileEntity a(World world, int i) { - return new TileEntityCommand(); - } - - public void doPhysics(World world, int i, int j, int k, Block block) { - if (!world.isStatic) { - boolean flag = world.isBlockIndirectlyPowered(i, j, k); - int l = world.getData(i, j, k); - boolean flag1 = (l & 1) != 0; - - // CraftBukkit start - org.bukkit.block.Block bukkitBlock = world.getWorld().getBlockAt(i, j, k); - int old = flag1 ? 15 : 0; - int current = flag ? 15 : 0; - - BlockRedstoneEvent eventRedstone = new BlockRedstoneEvent(bukkitBlock, old, current); - world.getServer().getPluginManager().callEvent(eventRedstone); - // CraftBukkit end - - if (eventRedstone.getNewCurrent() > 0 && !(eventRedstone.getOldCurrent() > 0)) { // CraftBukkit - world.setData(i, j, k, l | 1, 4); - world.a(i, j, k, this, this.a(world)); - } else if (!(eventRedstone.getNewCurrent() > 0) && eventRedstone.getOldCurrent() > 0) { // CraftBukkit - world.setData(i, j, k, l & -2, 4); - } - } - } - - public void a(World world, int i, int j, int k, Random random) { - TileEntity tileentity = world.getTileEntity(i, j, k); - - if (tileentity != null && tileentity instanceof TileEntityCommand) { - CommandBlockListenerAbstract commandblocklistenerabstract = ((TileEntityCommand) tileentity).getCommandBlock(); - - commandblocklistenerabstract.a(world); - world.updateAdjacentComparators(i, j, k, this); - } - } - - public int a(World world) { - return 1; - } - - public boolean interact(World world, int i, int j, int k, EntityHuman entityhuman, int l, float f, float f1, float f2) { - TileEntityCommand tileentitycommand = (TileEntityCommand) world.getTileEntity(i, j, k); - - if (tileentitycommand != null) { - entityhuman.a((TileEntity) tileentitycommand); - } - - return true; - } - - public boolean isComplexRedstone() { - return true; - } - - public int g(World world, int i, int j, int k, int l) { - TileEntity tileentity = world.getTileEntity(i, j, k); - - return tileentity != null && tileentity instanceof TileEntityCommand ? ((TileEntityCommand) tileentity).getCommandBlock().g() : 0; - } - - public void postPlace(World world, int i, int j, int k, EntityLiving entityliving, ItemStack itemstack) { - TileEntityCommand tileentitycommand = (TileEntityCommand) world.getTileEntity(i, j, k); - - if (itemstack.hasName()) { - tileentitycommand.getCommandBlock().setName(itemstack.getName()); - } - } - - public int a(Random random) { - return 0; - } -} diff --git a/src/main/java/net/minecraft/server/BlockCrops.java b/src/main/java/net/minecraft/server/BlockCrops.java deleted file mode 100644 index 875181f58b..0000000000 --- a/src/main/java/net/minecraft/server/BlockCrops.java +++ /dev/null @@ -1,136 +0,0 @@ -package net.minecraft.server; - -import java.util.Random; - -import org.bukkit.craftbukkit.event.CraftEventFactory; // CraftBukkit - -public class BlockCrops extends BlockPlant implements IBlockFragilePlantElement { - - protected BlockCrops() { - this.a(true); - float f = 0.5F; - - this.a(0.5F - f, 0.0F, 0.5F - f, 0.5F + f, 0.25F, 0.5F + f); - this.a((CreativeModeTab) null); - this.c(0.0F); - this.a(h); - this.H(); - } - - protected boolean a(Block block) { - return block == Blocks.SOIL; - } - - public void a(World world, int i, int j, int k, Random random) { - super.a(world, i, j, k, random); - if (world.getLightLevel(i, j + 1, k) >= 9) { - int l = world.getData(i, j, k); - - if (l < 7) { - float f = this.n(world, i, j, k); - - if (random.nextInt((int) (25.0F / f) + 1) == 0) { - ++l; - CraftEventFactory.handleBlockGrowEvent(world, i, j, k, this, l); // CraftBukkit - } - } - } - } - - public void m(World world, int i, int j, int k) { - int l = world.getData(i, j, k) + MathHelper.nextInt(world.random, 2, 5); - - if (l > 7) { - l = 7; - } - - CraftEventFactory.handleBlockGrowEvent(world, i, j, k, this, l); // CraftBukkit - } - - private float n(World world, int i, int j, int k) { - float f = 1.0F; - Block block = world.getType(i, j, k - 1); - Block block1 = world.getType(i, j, k + 1); - Block block2 = world.getType(i - 1, j, k); - Block block3 = world.getType(i + 1, j, k); - Block block4 = world.getType(i - 1, j, k - 1); - Block block5 = world.getType(i + 1, j, k - 1); - Block block6 = world.getType(i + 1, j, k + 1); - Block block7 = world.getType(i - 1, j, k + 1); - boolean flag = block2 == this || block3 == this; - boolean flag1 = block == this || block1 == this; - boolean flag2 = block4 == this || block5 == this || block6 == this || block7 == this; - - for (int l = i - 1; l <= i + 1; ++l) { - for (int i1 = k - 1; i1 <= k + 1; ++i1) { - float f1 = 0.0F; - - if (world.getType(l, j - 1, i1) == Blocks.SOIL) { - f1 = 1.0F; - if (world.getData(l, j - 1, i1) > 0) { - f1 = 3.0F; - } - } - - if (l != i || i1 != k) { - f1 /= 4.0F; - } - - f += f1; - } - } - - if (flag2 || flag && flag1) { - f /= 2.0F; - } - - return f; - } - - public int b() { - return 6; - } - - protected Item i() { - return Items.SEEDS; - } - - protected Item P() { - return Items.WHEAT; - } - - public void dropNaturally(World world, int i, int j, int k, int l, float f, int i1) { - super.dropNaturally(world, i, j, k, l, f, 0); - if (!world.isStatic) { - if (l >= 7) { - int j1 = 3 + i1; - - for (int k1 = 0; k1 < j1; ++k1) { - if (world.random.nextInt(15) <= l) { - this.a(world, i, j, k, new ItemStack(this.i(), 1, 0)); - } - } - } - } - } - - public Item getDropType(int i, Random random, int j) { - return i == 7 ? this.P() : this.i(); - } - - public int a(Random random) { - return 1; - } - - public boolean a(World world, int i, int j, int k, boolean flag) { - return world.getData(i, j, k) != 7; - } - - public boolean a(World world, Random random, int i, int j, int k) { - return true; - } - - public void b(World world, Random random, int i, int j, int k) { - this.m(world, i, j, k); - } -} diff --git a/src/main/java/net/minecraft/server/BlockDaylightDetector.java b/src/main/java/net/minecraft/server/BlockDaylightDetector.java deleted file mode 100644 index 96e9c37e3a..0000000000 --- a/src/main/java/net/minecraft/server/BlockDaylightDetector.java +++ /dev/null @@ -1,72 +0,0 @@ -package net.minecraft.server; - -import java.util.Random; - -public class BlockDaylightDetector extends BlockContainer { - - private IIcon[] a = new IIcon[2]; - - public BlockDaylightDetector() { - super(Material.WOOD); - this.a(0.0F, 0.0F, 0.0F, 1.0F, 0.375F, 1.0F); - this.a(CreativeModeTab.d); - } - - public void updateShape(IBlockAccess iblockaccess, int i, int j, int k) { - this.a(0.0F, 0.0F, 0.0F, 1.0F, 0.375F, 1.0F); - } - - public int b(IBlockAccess iblockaccess, int i, int j, int k, int l) { - return iblockaccess.getData(i, j, k); - } - - public void a(World world, int i, int j, int k, Random random) {} - - public void doPhysics(World world, int i, int j, int k, Block block) {} - - public void onPlace(World world, int i, int j, int k) {} - - public void e(World world, int i, int j, int k) { - if (!world.worldProvider.g) { - int l = world.getData(i, j, k); - int i1 = world.b(EnumSkyBlock.SKY, i, j, k) - world.j; - float f = world.d(1.0F); - - if (f < 3.1415927F) { - f += (0.0F - f) * 0.2F; - } else { - f += (6.2831855F - f) * 0.2F; - } - - i1 = Math.round((float) i1 * MathHelper.cos(f)); - if (i1 < 0) { - i1 = 0; - } - - if (i1 > 15) { - i1 = 15; - } - - if (l != i1) { - i1 = org.bukkit.craftbukkit.event.CraftEventFactory.callRedstoneChange(world, i, j, k, l, i1).getNewCurrent(); // CraftBukkit - Call BlockRedstoneEvent - world.setData(i, j, k, i1, 3); - } - } - } - - public boolean d() { - return false; - } - - public boolean c() { - return false; - } - - public boolean isPowerSource() { - return true; - } - - public TileEntity a(World world, int i) { - return new TileEntityLightDetector(); - } -} diff --git a/src/main/java/net/minecraft/server/BlockDiodeAbstract.java b/src/main/java/net/minecraft/server/BlockDiodeAbstract.java deleted file mode 100644 index ec581e0f4d..0000000000 --- a/src/main/java/net/minecraft/server/BlockDiodeAbstract.java +++ /dev/null @@ -1,259 +0,0 @@ -package net.minecraft.server; - -import java.util.Random; - -import org.bukkit.craftbukkit.event.CraftEventFactory; // CraftBukkit - -public abstract class BlockDiodeAbstract extends BlockDirectional { - - protected final boolean a; - - protected BlockDiodeAbstract(boolean flag) { - super(Material.ORIENTABLE); - this.a = flag; - this.a(0.0F, 0.0F, 0.0F, 1.0F, 0.125F, 1.0F); - } - - public boolean d() { - return false; - } - - public boolean canPlace(World world, int i, int j, int k) { - return !World.a((IBlockAccess) world, i, j - 1, k) ? false : super.canPlace(world, i, j, k); - } - - public boolean j(World world, int i, int j, int k) { - return !World.a((IBlockAccess) world, i, j - 1, k) ? false : super.j(world, i, j, k); - } - - public void a(World world, int i, int j, int k, Random random) { - int l = world.getData(i, j, k); - - if (!this.g((IBlockAccess) world, i, j, k, l)) { // CraftBukkit - Cast world to IBlockAccess to call the right method. - boolean flag = this.a(world, i, j, k, l); - - if (this.a && !flag) { - // CraftBukkit start - if (CraftEventFactory.callRedstoneChange(world, i, j, k, 15, 0).getNewCurrent() != 0) { - return; - } - // CraftBukkit end - - world.setTypeAndData(i, j, k, this.i(), l, 2); - } else if (!this.a) { - // CraftBukkit start - if (CraftEventFactory.callRedstoneChange(world, i, j, k, 0, 15).getNewCurrent() != 15) { - return; - } - // CraftBukkit end - - world.setTypeAndData(i, j, k, this.e(), l, 2); - if (!flag) { - world.a(i, j, k, this.e(), this.k(l), -1); - } - } - } - } - - public int b() { - return 36; - } - - protected boolean c(int i) { - return this.a; - } - - public int c(IBlockAccess iblockaccess, int i, int j, int k, int l) { - return this.b(iblockaccess, i, j, k, l); - } - - public int b(IBlockAccess iblockaccess, int i, int j, int k, int l) { - int i1 = iblockaccess.getData(i, j, k); - - if (!this.c(i1)) { - return 0; - } else { - int j1 = l(i1); - - return j1 == 0 && l == 3 ? this.f(iblockaccess, i, j, k, i1) : (j1 == 1 && l == 4 ? this.f(iblockaccess, i, j, k, i1) : (j1 == 2 && l == 2 ? this.f(iblockaccess, i, j, k, i1) : (j1 == 3 && l == 5 ? this.f(iblockaccess, i, j, k, i1) : 0))); - } - } - - public void doPhysics(World world, int i, int j, int k, Block block) { - if (!this.j(world, i, j, k)) { - this.b(world, i, j, k, world.getData(i, j, k), 0); - world.setAir(i, j, k); - world.applyPhysics(i + 1, j, k, this); - world.applyPhysics(i - 1, j, k, this); - world.applyPhysics(i, j, k + 1, this); - world.applyPhysics(i, j, k - 1, this); - world.applyPhysics(i, j - 1, k, this); - world.applyPhysics(i, j + 1, k, this); - } else { - this.b(world, i, j, k, block); - } - } - - protected void b(World world, int i, int j, int k, Block block) { - int l = world.getData(i, j, k); - - if (!this.g((IBlockAccess) world, i, j, k, l)) { // CraftBukkit - Cast world to IBlockAccess to call the right method. - boolean flag = this.a(world, i, j, k, l); - - if ((this.a && !flag || !this.a && flag) && !world.a(i, j, k, (Block) this)) { - byte b0 = -1; - - if (this.i(world, i, j, k, l)) { - b0 = -3; - } else if (this.a) { - b0 = -2; - } - - world.a(i, j, k, this, this.b(l), b0); - } - } - } - - public boolean g(IBlockAccess iblockaccess, int i, int j, int k, int l) { - return false; - } - - protected boolean a(World world, int i, int j, int k, int l) { - return this.h(world, i, j, k, l) > 0; - } - - protected int h(World world, int i, int j, int k, int l) { - int i1 = l(l); - int j1 = i + Direction.a[i1]; - int k1 = k + Direction.b[i1]; - int l1 = world.getBlockFacePower(j1, j, k1, Direction.d[i1]); - - return l1 >= 15 ? l1 : Math.max(l1, world.getType(j1, j, k1) == Blocks.REDSTONE_WIRE ? world.getData(j1, j, k1) : 0); - } - - protected int h(IBlockAccess iblockaccess, int i, int j, int k, int l) { - int i1 = l(l); - - switch (i1) { - case 0: - case 2: - return Math.max(this.i(iblockaccess, i - 1, j, k, 4), this.i(iblockaccess, i + 1, j, k, 5)); - - case 1: - case 3: - return Math.max(this.i(iblockaccess, i, j, k + 1, 3), this.i(iblockaccess, i, j, k - 1, 2)); - - default: - return 0; - } - } - - protected int i(IBlockAccess iblockaccess, int i, int j, int k, int l) { - Block block = iblockaccess.getType(i, j, k); - - return this.a(block) ? (block == Blocks.REDSTONE_WIRE ? iblockaccess.getData(i, j, k) : iblockaccess.getBlockPower(i, j, k, l)) : 0; - } - - public boolean isPowerSource() { - return true; - } - - public void postPlace(World world, int i, int j, int k, EntityLiving entityliving, ItemStack itemstack) { - int l = ((MathHelper.floor((double) (entityliving.yaw * 4.0F / 360.0F) + 0.5D) & 3) + 2) % 4; - - world.setData(i, j, k, l, 3); - boolean flag = this.a(world, i, j, k, l); - - if (flag) { - world.a(i, j, k, this, 1); - } - } - - public void onPlace(World world, int i, int j, int k) { - this.e(world, i, j, k); - } - - protected void e(World world, int i, int j, int k) { - int l = l(world.getData(i, j, k)); - - if (l == 1) { - world.e(i + 1, j, k, this); - world.b(i + 1, j, k, this, 4); - } - - if (l == 3) { - world.e(i - 1, j, k, this); - world.b(i - 1, j, k, this, 5); - } - - if (l == 2) { - world.e(i, j, k + 1, this); - world.b(i, j, k + 1, this, 2); - } - - if (l == 0) { - world.e(i, j, k - 1, this); - world.b(i, j, k - 1, this, 3); - } - } - - public void postBreak(World world, int i, int j, int k, int l) { - if (this.a) { - world.applyPhysics(i + 1, j, k, this); - world.applyPhysics(i - 1, j, k, this); - world.applyPhysics(i, j, k + 1, this); - world.applyPhysics(i, j, k - 1, this); - world.applyPhysics(i, j - 1, k, this); - world.applyPhysics(i, j + 1, k, this); - } - - super.postBreak(world, i, j, k, l); - } - - public boolean c() { - return false; - } - - protected boolean a(Block block) { - return block.isPowerSource(); - } - - protected int f(IBlockAccess iblockaccess, int i, int j, int k, int l) { - return 15; - } - - public static boolean d(Block block) { - return Blocks.DIODE_OFF.e(block) || Blocks.REDSTONE_COMPARATOR_OFF.e(block); - } - - public boolean e(Block block) { - return block == this.e() || block == this.i(); - } - - public boolean i(World world, int i, int j, int k, int l) { - int i1 = l(l); - - if (d(world.getType(i - Direction.a[i1], j, k - Direction.b[i1]))) { - int j1 = world.getData(i - Direction.a[i1], j, k - Direction.b[i1]); - int k1 = l(j1); - - return k1 != i1; - } else { - return false; - } - } - - protected int k(int i) { - return this.b(i); - } - - protected abstract int b(int i); - - protected abstract BlockDiodeAbstract e(); - - protected abstract BlockDiodeAbstract i(); - - public boolean c(Block block) { - return this.e(block); - } -} diff --git a/src/main/java/net/minecraft/server/BlockDispenser.java b/src/main/java/net/minecraft/server/BlockDispenser.java deleted file mode 100644 index 9450df9b5e..0000000000 --- a/src/main/java/net/minecraft/server/BlockDispenser.java +++ /dev/null @@ -1,189 +0,0 @@ -package net.minecraft.server; - -import java.util.Random; - -public class BlockDispenser extends BlockContainer { - - public static final IRegistry a = new RegistryDefault(new DispenseBehaviorItem()); - protected Random b = new Random(); - public static boolean eventFired = false; // CraftBukkit - - protected BlockDispenser() { - super(Material.STONE); - this.a(CreativeModeTab.d); - } - - public int a(World world) { - return 4; - } - - public void onPlace(World world, int i, int j, int k) { - super.onPlace(world, i, j, k); - this.m(world, i, j, k); - } - - private void m(World world, int i, int j, int k) { - if (!world.isStatic) { - Block block = world.getType(i, j, k - 1); - Block block1 = world.getType(i, j, k + 1); - Block block2 = world.getType(i - 1, j, k); - Block block3 = world.getType(i + 1, j, k); - byte b0 = 3; - - if (block.j() && !block1.j()) { - b0 = 3; - } - - if (block1.j() && !block.j()) { - b0 = 2; - } - - if (block2.j() && !block3.j()) { - b0 = 5; - } - - if (block3.j() && !block2.j()) { - b0 = 4; - } - - world.setData(i, j, k, b0, 2); - } - } - - public boolean interact(World world, int i, int j, int k, EntityHuman entityhuman, int l, float f, float f1, float f2) { - if (world.isStatic) { - return true; - } else { - TileEntityDispenser tileentitydispenser = (TileEntityDispenser) world.getTileEntity(i, j, k); - - if (tileentitydispenser != null) { - entityhuman.openDispenser(tileentitydispenser); - } - - return true; - } - } - - // CraftBukkit - protected -> public - public void dispense(World world, int i, int j, int k) { - SourceBlock sourceblock = new SourceBlock(world, i, j, k); - TileEntityDispenser tileentitydispenser = (TileEntityDispenser) sourceblock.getTileEntity(); - - if (tileentitydispenser != null) { - int l = tileentitydispenser.i(); - - if (l < 0) { - world.triggerEffect(1001, i, j, k, 0); - } else { - ItemStack itemstack = tileentitydispenser.getItem(l); - IDispenseBehavior idispensebehavior = this.a(itemstack); - - if (idispensebehavior != IDispenseBehavior.a) { - ItemStack itemstack1 = idispensebehavior.a(sourceblock, itemstack); - eventFired = false; // CraftBukkit - reset event status - - tileentitydispenser.setItem(l, itemstack1.count == 0 ? null : itemstack1); - } - } - } - } - - protected IDispenseBehavior a(ItemStack itemstack) { - return (IDispenseBehavior) a.get(itemstack.getItem()); - } - - public void doPhysics(World world, int i, int j, int k, Block block) { - boolean flag = world.isBlockIndirectlyPowered(i, j, k) || world.isBlockIndirectlyPowered(i, j + 1, k); - int l = world.getData(i, j, k); - boolean flag1 = (l & 8) != 0; - - if (flag && !flag1) { - world.a(i, j, k, this, this.a(world)); - world.setData(i, j, k, l | 8, 4); - } else if (!flag && flag1) { - world.setData(i, j, k, l & -9, 4); - } - } - - public void a(World world, int i, int j, int k, Random random) { - if (!world.isStatic) { - this.dispense(world, i, j, k); - } - } - - public TileEntity a(World world, int i) { - return new TileEntityDispenser(); - } - - public void postPlace(World world, int i, int j, int k, EntityLiving entityliving, ItemStack itemstack) { - int l = BlockPiston.a(world, i, j, k, entityliving); - - world.setData(i, j, k, l, 2); - if (itemstack.hasName()) { - ((TileEntityDispenser) world.getTileEntity(i, j, k)).a(itemstack.getName()); - } - } - - public void remove(World world, int i, int j, int k, Block block, int l) { - TileEntityDispenser tileentitydispenser = (TileEntityDispenser) world.getTileEntity(i, j, k); - - if (tileentitydispenser != null) { - for (int i1 = 0; i1 < tileentitydispenser.getSize(); ++i1) { - ItemStack itemstack = tileentitydispenser.getItem(i1); - - if (itemstack != null) { - float f = this.b.nextFloat() * 0.8F + 0.1F; - float f1 = this.b.nextFloat() * 0.8F + 0.1F; - float f2 = this.b.nextFloat() * 0.8F + 0.1F; - - while (itemstack.count > 0) { - int j1 = this.b.nextInt(21) + 10; - - if (j1 > itemstack.count) { - j1 = itemstack.count; - } - - itemstack.count -= j1; - EntityItem entityitem = new EntityItem(world, (double) ((float) i + f), (double) ((float) j + f1), (double) ((float) k + f2), new ItemStack(itemstack.getItem(), j1, itemstack.getData())); - - if (itemstack.hasTag()) { - entityitem.getItemStack().setTag((NBTTagCompound) itemstack.getTag().clone()); - } - - float f3 = 0.05F; - - entityitem.motX = (double) ((float) this.b.nextGaussian() * f3); - entityitem.motY = (double) ((float) this.b.nextGaussian() * f3 + 0.2F); - entityitem.motZ = (double) ((float) this.b.nextGaussian() * f3); - world.addEntity(entityitem); - } - } - } - - world.updateAdjacentComparators(i, j, k, block); - } - - super.remove(world, i, j, k, block, l); - } - - public static IPosition a(ISourceBlock isourceblock) { - EnumFacing enumfacing = b(isourceblock.h()); - double d0 = isourceblock.getX() + 0.7D * (double) enumfacing.getAdjacentX(); - double d1 = isourceblock.getY() + 0.7D * (double) enumfacing.getAdjacentY(); - double d2 = isourceblock.getZ() + 0.7D * (double) enumfacing.getAdjacentZ(); - - return new Position(d0, d1, d2); - } - - public static EnumFacing b(int i) { - return EnumFacing.a(i & 7); - } - - public boolean isComplexRedstone() { - return true; - } - - public int g(World world, int i, int j, int k, int l) { - return Container.b((IInventory) world.getTileEntity(i, j, k)); - } -} diff --git a/src/main/java/net/minecraft/server/BlockDoor.java b/src/main/java/net/minecraft/server/BlockDoor.java deleted file mode 100644 index 9c3ae2e1e4..0000000000 --- a/src/main/java/net/minecraft/server/BlockDoor.java +++ /dev/null @@ -1,240 +0,0 @@ -package net.minecraft.server; - -import java.util.Random; - -import org.bukkit.event.block.BlockRedstoneEvent; // CraftBukkit - -public class BlockDoor extends Block { - - protected BlockDoor(Material material) { - super(material); - float f = 0.5F; - float f1 = 1.0F; - - this.a(0.5F - f, 0.0F, 0.5F - f, 0.5F + f, f1, 0.5F + f); - } - - public boolean c() { - return false; - } - - public boolean b(IBlockAccess iblockaccess, int i, int j, int k) { - int l = this.g(iblockaccess, i, j, k); - - return (l & 4) != 0; - } - - public boolean d() { - return false; - } - - public int b() { - return 7; - } - - public AxisAlignedBB a(World world, int i, int j, int k) { - this.updateShape(world, i, j, k); - return super.a(world, i, j, k); - } - - public void updateShape(IBlockAccess iblockaccess, int i, int j, int k) { - this.b(this.g(iblockaccess, i, j, k)); - } - - public int e(IBlockAccess iblockaccess, int i, int j, int k) { - return this.g(iblockaccess, i, j, k) & 3; - } - - public boolean f(IBlockAccess iblockaccess, int i, int j, int k) { - return (this.g(iblockaccess, i, j, k) & 4) != 0; - } - - private void b(int i) { - float f = 0.1875F; - - this.a(0.0F, 0.0F, 0.0F, 1.0F, 2.0F, 1.0F); - int j = i & 3; - boolean flag = (i & 4) != 0; - boolean flag1 = (i & 16) != 0; - - if (j == 0) { - if (flag) { - if (!flag1) { - this.a(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, f); - } else { - this.a(0.0F, 0.0F, 1.0F - f, 1.0F, 1.0F, 1.0F); - } - } else { - this.a(0.0F, 0.0F, 0.0F, f, 1.0F, 1.0F); - } - } else if (j == 1) { - if (flag) { - if (!flag1) { - this.a(1.0F - f, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F); - } else { - this.a(0.0F, 0.0F, 0.0F, f, 1.0F, 1.0F); - } - } else { - this.a(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, f); - } - } else if (j == 2) { - if (flag) { - if (!flag1) { - this.a(0.0F, 0.0F, 1.0F - f, 1.0F, 1.0F, 1.0F); - } else { - this.a(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, f); - } - } else { - this.a(1.0F - f, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F); - } - } else if (j == 3) { - if (flag) { - if (!flag1) { - this.a(0.0F, 0.0F, 0.0F, f, 1.0F, 1.0F); - } else { - this.a(1.0F - f, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F); - } - } else { - this.a(0.0F, 0.0F, 1.0F - f, 1.0F, 1.0F, 1.0F); - } - } - } - - public void attack(World world, int i, int j, int k, EntityHuman entityhuman) {} - - public boolean interact(World world, int i, int j, int k, EntityHuman entityhuman, int l, float f, float f1, float f2) { - if (this.material == Material.ORE) { - return true; - } else { - int i1 = this.g(world, i, j, k); - int j1 = i1 & 7; - - j1 ^= 4; - if ((i1 & 8) == 0) { - world.setData(i, j, k, j1, 2); - world.c(i, j, k, i, j, k); - } else { - world.setData(i, j - 1, k, j1, 2); - world.c(i, j - 1, k, i, j, k); - } - - world.a(entityhuman, 1003, i, j, k, 0); - return true; - } - } - - public void setDoor(World world, int i, int j, int k, boolean flag) { - int l = this.g(world, i, j, k); - boolean flag1 = (l & 4) != 0; - - if (flag1 != flag) { - int i1 = l & 7; - - i1 ^= 4; - if ((l & 8) == 0) { - world.setData(i, j, k, i1, 2); - world.c(i, j, k, i, j, k); - } else { - world.setData(i, j - 1, k, i1, 2); - world.c(i, j - 1, k, i, j, k); - } - - world.a((EntityHuman) null, 1003, i, j, k, 0); - } - } - - public void doPhysics(World world, int i, int j, int k, Block block) { - int l = world.getData(i, j, k); - - if ((l & 8) == 0) { - boolean flag = false; - - if (world.getType(i, j + 1, k) != this) { - world.setAir(i, j, k); - flag = true; - } - - if (!World.a((IBlockAccess) world, i, j - 1, k)) { - world.setAir(i, j, k); - flag = true; - if (world.getType(i, j + 1, k) == this) { - world.setAir(i, j + 1, k); - } - } - - if (flag) { - if (!world.isStatic) { - this.b(world, i, j, k, l, 0); - } - // CraftBukkit start - } else if (block.isPowerSource()) { - org.bukkit.World bworld = world.getWorld(); - org.bukkit.block.Block bukkitBlock = bworld.getBlockAt(i, j, k); - org.bukkit.block.Block blockTop = bworld.getBlockAt(i, j + 1, k); - - int power = bukkitBlock.getBlockPower(); - int powerTop = blockTop.getBlockPower(); - if (powerTop > power) power = powerTop; - int oldPower = (world.getData(i, j, k) & 4) > 0 ? 15 : 0; - - if (oldPower == 0 ^ power == 0) { - BlockRedstoneEvent eventRedstone = new BlockRedstoneEvent(bukkitBlock, oldPower, power); - world.getServer().getPluginManager().callEvent(eventRedstone); - - this.setDoor(world, i, j, k, eventRedstone.getNewCurrent() > 0); - } - // CraftBukkit end - } - } else { - if (world.getType(i, j - 1, k) != this) { - world.setAir(i, j, k); - } - - if (block != this) { - this.doPhysics(world, i, j - 1, k, block); - } - } - } - - public Item getDropType(int i, Random random, int j) { - return (i & 8) != 0 ? null : (this.material == Material.ORE ? Items.IRON_DOOR : Items.WOOD_DOOR); - } - - public MovingObjectPosition a(World world, int i, int j, int k, Vec3D vec3d, Vec3D vec3d1) { - this.updateShape(world, i, j, k); - return super.a(world, i, j, k, vec3d, vec3d1); - } - - public boolean canPlace(World world, int i, int j, int k) { - return j >= 255 ? false : World.a((IBlockAccess) world, i, j - 1, k) && super.canPlace(world, i, j, k) && super.canPlace(world, i, j + 1, k); - } - - public int h() { - return 1; - } - - public int g(IBlockAccess iblockaccess, int i, int j, int k) { - int l = iblockaccess.getData(i, j, k); - boolean flag = (l & 8) != 0; - int i1; - int j1; - - if (flag) { - i1 = iblockaccess.getData(i, j - 1, k); - j1 = l; - } else { - i1 = l; - j1 = iblockaccess.getData(i, j + 1, k); - } - - boolean flag1 = (j1 & 1) != 0; - - return i1 & 7 | (flag ? 8 : 0) | (flag1 ? 16 : 0); - } - - public void a(World world, int i, int j, int k, int l, EntityHuman entityhuman) { - if (entityhuman.abilities.canInstantlyBuild && (l & 8) != 0 && world.getType(i, j - 1, k) == this) { - world.setAir(i, j - 1, k); - } - } -} diff --git a/src/main/java/net/minecraft/server/BlockDragonEgg.java b/src/main/java/net/minecraft/server/BlockDragonEgg.java deleted file mode 100644 index b1c3f10e50..0000000000 --- a/src/main/java/net/minecraft/server/BlockDragonEgg.java +++ /dev/null @@ -1,121 +0,0 @@ -package net.minecraft.server; - -import java.util.Random; - -import org.bukkit.event.block.BlockFromToEvent; // CraftBukkit - -public class BlockDragonEgg extends Block { - - public BlockDragonEgg() { - super(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) { - world.a(i, j, k, this, this.a(world)); - } - - public void doPhysics(World world, int i, int j, int k, Block block) { - world.a(i, j, k, this, this.a(world)); - } - - public void a(World world, int i, int j, int k, Random random) { - this.e(world, i, j, k); - } - - private void e(World world, int i, int j, int k) { - if (BlockFalling.canFall(world, i, j - 1, k) && j >= 0) { - byte b0 = 32; - - if (!BlockFalling.instaFall && world.b(i - b0, j - b0, k - b0, i + b0, j + b0, k + b0)) { - // CraftBukkit - added data - EntityFallingBlock entityfallingblock = new EntityFallingBlock(world, (double) ((float) i + 0.5F), (double) ((float) j + 0.5F), (double) ((float) k + 0.5F), this, world.getData(i, j, k)); - - world.addEntity(entityfallingblock); - } else { - world.setAir(i, j, k); - - while (BlockFalling.canFall(world, i, j - 1, k) && j > 0) { - --j; - } - - if (j > 0) { - world.setTypeAndData(i, j, k, this, 0, 2); - } - } - } - } - - public boolean interact(World world, int i, int j, int k, EntityHuman entityhuman, int l, float f, float f1, float f2) { - this.m(world, i, j, k); - return true; - } - - public void attack(World world, int i, int j, int k, EntityHuman entityhuman) { - this.m(world, i, j, k); - } - - private void m(World world, int i, int j, int k) { - if (world.getType(i, j, k) == this) { - for (int l = 0; l < 1000; ++l) { - int i1 = i + world.random.nextInt(16) - world.random.nextInt(16); - int j1 = j + world.random.nextInt(8) - world.random.nextInt(8); - int k1 = k + world.random.nextInt(16) - world.random.nextInt(16); - - if (world.getType(i1, j1, k1).material == Material.AIR) { - // CraftBukkit start - org.bukkit.block.Block from = world.getWorld().getBlockAt(i, j, k); - org.bukkit.block.Block to = world.getWorld().getBlockAt(i1, j1, k1); - BlockFromToEvent event = new BlockFromToEvent(from, to); - org.bukkit.Bukkit.getPluginManager().callEvent(event); - - if (event.isCancelled()) { - return; - } - - i1 = event.getToBlock().getX(); - j1 = event.getToBlock().getY(); - k1 = event.getToBlock().getZ(); - // CraftBukkit end - - if (!world.isStatic) { - world.setTypeAndData(i1, j1, k1, this, world.getData(i, j, k), 2); - world.setAir(i, j, k); - } else { - short short1 = 128; - - for (int l1 = 0; l1 < short1; ++l1) { - double d0 = world.random.nextDouble(); - float f = (world.random.nextFloat() - 0.5F) * 0.2F; - float f1 = (world.random.nextFloat() - 0.5F) * 0.2F; - float f2 = (world.random.nextFloat() - 0.5F) * 0.2F; - double d1 = (double) i1 + (double) (i - i1) * d0 + (world.random.nextDouble() - 0.5D) * 1.0D + 0.5D; - double d2 = (double) j1 + (double) (j - j1) * d0 + world.random.nextDouble() * 1.0D - 0.5D; - double d3 = (double) k1 + (double) (k - k1) * d0 + (world.random.nextDouble() - 0.5D) * 1.0D + 0.5D; - - world.addParticle("portal", d1, d2, d3, (double) f, (double) f1, (double) f2); - } - } - - return; - } - } - } - } - - public int a(World world) { - return 5; - } - - public boolean c() { - return false; - } - - public boolean d() { - return false; - } - - public int b() { - return 27; - } -} diff --git a/src/main/java/net/minecraft/server/BlockDropper.java b/src/main/java/net/minecraft/server/BlockDropper.java deleted file mode 100644 index 039afd3937..0000000000 --- a/src/main/java/net/minecraft/server/BlockDropper.java +++ /dev/null @@ -1,75 +0,0 @@ -package net.minecraft.server; - -// CraftBukkit start -import org.bukkit.craftbukkit.inventory.CraftItemStack; -import org.bukkit.event.inventory.InventoryMoveItemEvent; -// CraftBukkit end - -public class BlockDropper extends BlockDispenser { - - private final IDispenseBehavior P = new DispenseBehaviorItem(); - - public BlockDropper() {} - - protected IDispenseBehavior a(ItemStack itemstack) { - return this.P; - } - - public TileEntity a(World world, int i) { - return new TileEntityDropper(); - } - - public void dispense(World world, int i, int j, int k) { // CraftBukkit - protected -> public - SourceBlock sourceblock = new SourceBlock(world, i, j, k); - TileEntityDispenser tileentitydispenser = (TileEntityDispenser) sourceblock.getTileEntity(); - - if (tileentitydispenser != null) { - int l = tileentitydispenser.i(); - - if (l < 0) { - world.triggerEffect(1001, i, j, k, 0); - } else { - ItemStack itemstack = tileentitydispenser.getItem(l); - int i1 = world.getData(i, j, k) & 7; - IInventory iinventory = TileEntityHopper.getInventoryAt(world, (double) (i + Facing.b[i1]), (double) (j + Facing.c[i1]), (double) (k + Facing.d[i1])); - ItemStack itemstack1; - - if (iinventory != null) { - // CraftBukkit start - Fire event when pushing items into other inventories - CraftItemStack oitemstack = CraftItemStack.asCraftMirror(itemstack.cloneItemStack().a(1)); - - org.bukkit.inventory.Inventory destinationInventory; - // Have to special case large chests as they work oddly - if (iinventory instanceof InventoryLargeChest) { - destinationInventory = new org.bukkit.craftbukkit.inventory.CraftInventoryDoubleChest((InventoryLargeChest) iinventory); - } else { - destinationInventory = iinventory.getOwner().getInventory(); - } - - InventoryMoveItemEvent event = new InventoryMoveItemEvent(tileentitydispenser.getOwner().getInventory(), oitemstack.clone(), destinationInventory, true); - world.getServer().getPluginManager().callEvent(event); - if (event.isCancelled()) { - return; - } - itemstack1 = TileEntityHopper.addItem(iinventory, CraftItemStack.asNMSCopy(event.getItem()), Facing.OPPOSITE_FACING[i1]); - if (event.getItem().equals(oitemstack) && itemstack1 == null) { - // CraftBukkit end - itemstack1 = itemstack.cloneItemStack(); - if (--itemstack1.count == 0) { - itemstack1 = null; - } - } else { - itemstack1 = itemstack.cloneItemStack(); - } - } else { - itemstack1 = this.P.a(sourceblock, itemstack); - if (itemstack1 != null && itemstack1.count == 0) { - itemstack1 = null; - } - } - - tileentitydispenser.setItem(l, itemstack1); - } - } - } -} diff --git a/src/main/java/net/minecraft/server/BlockEnderPortal.java b/src/main/java/net/minecraft/server/BlockEnderPortal.java deleted file mode 100644 index 0b24c153d2..0000000000 --- a/src/main/java/net/minecraft/server/BlockEnderPortal.java +++ /dev/null @@ -1,66 +0,0 @@ -package net.minecraft.server; - -import java.util.List; -import java.util.Random; - -import org.bukkit.event.entity.EntityPortalEnterEvent; // CraftBukkit - -public class BlockEnderPortal extends BlockContainer { - - public static boolean a; - - protected BlockEnderPortal(Material material) { - super(material); - this.a(1.0F); - } - - public TileEntity a(World world, int i) { - return new TileEntityEnderPortal(); - } - - public void updateShape(IBlockAccess iblockaccess, int i, int j, int k) { - float f = 0.0625F; - - this.a(0.0F, 0.0F, 0.0F, 1.0F, f, 1.0F); - } - - public void a(World world, int i, int j, int k, AxisAlignedBB axisalignedbb, List list, Entity entity) {} - - public boolean c() { - return false; - } - - public boolean d() { - return false; - } - - public int a(Random random) { - return 0; - } - - public void a(World world, int i, int j, int k, Entity entity) { - if (entity.vehicle == null && entity.passenger == null && !world.isStatic) { - // CraftBukkit start - Entity in portal - EntityPortalEnterEvent event = new EntityPortalEnterEvent(entity.getBukkitEntity(), new org.bukkit.Location(world.getWorld(), i, j, k)); - world.getServer().getPluginManager().callEvent(event); - // CraftBukkit end - entity.b(1); - } - } - - public int b() { - return -1; - } - - public void onPlace(World world, int i, int j, int k) { - if (!a) { - if (world.worldProvider.dimension != 0) { - world.setAir(i, j, k); - } - } - } - - public MaterialMapColor f(int i) { - return MaterialMapColor.J; - } -} diff --git a/src/main/java/net/minecraft/server/BlockFire.java b/src/main/java/net/minecraft/server/BlockFire.java deleted file mode 100644 index 44994a14a3..0000000000 --- a/src/main/java/net/minecraft/server/BlockFire.java +++ /dev/null @@ -1,281 +0,0 @@ -package net.minecraft.server; - -import java.util.Random; - -// CraftBukkit start -import org.bukkit.craftbukkit.event.CraftEventFactory; -import org.bukkit.event.block.BlockBurnEvent; -import org.bukkit.event.block.BlockSpreadEvent; -// CraftBukkit end - -public class BlockFire extends Block { - - private int[] a = new int[256]; - private int[] b = new int[256]; - - protected BlockFire() { - super(Material.FIRE); - this.a(true); - } - - public static void e() { - Blocks.FIRE.a(getId(Blocks.WOOD), 5, 20); - Blocks.FIRE.a(getId(Blocks.WOOD_DOUBLE_STEP), 5, 20); - Blocks.FIRE.a(getId(Blocks.WOOD_STEP), 5, 20); - Blocks.FIRE.a(getId(Blocks.FENCE), 5, 20); - Blocks.FIRE.a(getId(Blocks.WOOD_STAIRS), 5, 20); - Blocks.FIRE.a(getId(Blocks.BIRCH_WOOD_STAIRS), 5, 20); - Blocks.FIRE.a(getId(Blocks.SPRUCE_WOOD_STAIRS), 5, 20); - Blocks.FIRE.a(getId(Blocks.JUNGLE_WOOD_STAIRS), 5, 20); - Blocks.FIRE.a(getId(Blocks.LOG), 5, 5); - Blocks.FIRE.a(getId(Blocks.LOG2), 5, 5); - Blocks.FIRE.a(getId(Blocks.LEAVES), 30, 60); - Blocks.FIRE.a(getId(Blocks.LEAVES2), 30, 60); - Blocks.FIRE.a(getId(Blocks.BOOKSHELF), 30, 20); - Blocks.FIRE.a(getId(Blocks.TNT), 15, 100); - Blocks.FIRE.a(getId(Blocks.LONG_GRASS), 60, 100); - Blocks.FIRE.a(getId(Blocks.DOUBLE_PLANT), 60, 100); - Blocks.FIRE.a(getId(Blocks.YELLOW_FLOWER), 60, 100); - Blocks.FIRE.a(getId(Blocks.RED_ROSE), 60, 100); - Blocks.FIRE.a(getId(Blocks.WOOL), 30, 60); - Blocks.FIRE.a(getId(Blocks.VINE), 15, 100); - Blocks.FIRE.a(getId(Blocks.COAL_BLOCK), 5, 5); - Blocks.FIRE.a(getId(Blocks.HAY_BLOCK), 60, 20); - Blocks.FIRE.a(getId(Blocks.WOOL_CARPET), 60, 20); - } - - public void a(int i, int j, int k) { - this.a[i] = j; - this.b[i] = k; - } - - public AxisAlignedBB a(World world, int i, int j, int k) { - return null; - } - - public boolean c() { - return false; - } - - public boolean d() { - return false; - } - - public int b() { - return 3; - } - - public int a(Random random) { - return 0; - } - - public int a(World world) { - return 30; - } - - public void a(World world, int i, int j, int k, Random random) { - if (world.getGameRules().getBoolean("doFireTick")) { - boolean flag = world.getType(i, j - 1, k) == Blocks.NETHERRACK; - - if (world.worldProvider instanceof WorldProviderTheEnd && world.getType(i, j - 1, k) == Blocks.BEDROCK) { - flag = true; - } - - if (!this.canPlace(world, i, j, k)) { - fireExtinguished(world, i, j, k); // CraftBukkit - invalid place location - } - - if (!flag && world.Q() && (world.isRainingAt(i, j, k) || world.isRainingAt(i - 1, j, k) || world.isRainingAt(i + 1, j, k) || world.isRainingAt(i, j, k - 1) || world.isRainingAt(i, j, k + 1))) { - fireExtinguished(world, i, j, k); // CraftBukkit - extinguished by rain - } else { - int l = world.getData(i, j, k); - - if (l < 15) { - world.setData(i, j, k, l + random.nextInt(3) / 2, 4); - } - - world.a(i, j, k, this, this.a(world) + random.nextInt(10)); - if (!flag && !this.e(world, i, j, k)) { - if (!World.a((IBlockAccess) world, i, j - 1, k) || l > 3) { - fireExtinguished(world, i, j, k); // CraftBukkit - burn out of inflammable block - } - } else if (!flag && !this.e((IBlockAccess) world, i, j - 1, k) && l == 15 && random.nextInt(4) == 0) { - fireExtinguished(world, i, j, k); // CraftBukkit - burn out - } else { - boolean flag1 = world.z(i, j, k); - byte b0 = 0; - - if (flag1) { - b0 = -50; - } - - this.a(world, i + 1, j, k, 300 + b0, random, l); - this.a(world, i - 1, j, k, 300 + b0, random, l); - this.a(world, i, j - 1, k, 250 + b0, random, l); - this.a(world, i, j + 1, k, 250 + b0, random, l); - this.a(world, i, j, k - 1, 300 + b0, random, l); - this.a(world, i, j, k + 1, 300 + b0, random, l); - - for (int i1 = i - 1; i1 <= i + 1; ++i1) { - for (int j1 = k - 1; j1 <= k + 1; ++j1) { - for (int k1 = j - 1; k1 <= j + 4; ++k1) { - if (i1 != i || k1 != j || j1 != k) { - int l1 = 100; - - if (k1 > j + 1) { - l1 += (k1 - (j + 1)) * 100; - } - - int i2 = this.m(world, i1, k1, j1); - - if (i2 > 0) { - int j2 = (i2 + 40 + world.difficulty.a() * 7) / (l + 30); - - if (flag1) { - j2 /= 2; - } - - if (j2 > 0 && random.nextInt(l1) <= j2 && (!world.Q() || !world.isRainingAt(i1, k1, j1)) && !world.isRainingAt(i1 - 1, k1, k) && !world.isRainingAt(i1 + 1, k1, j1) && !world.isRainingAt(i1, k1, j1 - 1) && !world.isRainingAt(i1, k1, j1 + 1)) { - int k2 = l + random.nextInt(5) / 4; - - if (k2 > 15) { - k2 = 15; - } - - // CraftBukkit start - Call to stop spread of fire - if (world.getType(i1, k1, j1) != Blocks.FIRE) { - if (CraftEventFactory.callBlockIgniteEvent(world, i1, k1, j1, i, j, k).isCancelled()) { - continue; - } - - org.bukkit.Server server = world.getServer(); - org.bukkit.World bworld = world.getWorld(); - org.bukkit.block.BlockState blockState = bworld.getBlockAt(i1, k1, j1).getState(); - blockState.setTypeId(Block.getId(this)); - blockState.setData(new org.bukkit.material.MaterialData(Block.getId(this), (byte) k2)); - - BlockSpreadEvent spreadEvent = new BlockSpreadEvent(blockState.getBlock(), bworld.getBlockAt(i, j, k), blockState); - server.getPluginManager().callEvent(spreadEvent); - - if (!spreadEvent.isCancelled()) { - blockState.update(true); - } - } - // CraftBukkit end - } - } - } - } - } - } - } - } - } - } - - public boolean L() { - return false; - } - - private void a(World world, int i, int j, int k, int l, Random random, int i1) { - int j1 = this.b[Block.getId(world.getType(i, j, k))]; - - if (random.nextInt(l) < j1) { - boolean flag = world.getType(i, j, k) == Blocks.TNT; - - // CraftBukkit start - org.bukkit.block.Block theBlock = world.getWorld().getBlockAt(i, j, k); - - BlockBurnEvent event = new BlockBurnEvent(theBlock); - world.getServer().getPluginManager().callEvent(event); - - if (event.isCancelled()) { - return; - } - // CraftBukkit end - - if (random.nextInt(i1 + 10) < 5 && !world.isRainingAt(i, j, k)) { - int k1 = i1 + random.nextInt(5) / 4; - - if (k1 > 15) { - k1 = 15; - } - - world.setTypeAndData(i, j, k, this, k1, 3); - } else { - world.setAir(i, j, k); - } - - if (flag) { - Blocks.TNT.postBreak(world, i, j, k, 1); - } - } - } - - private boolean e(World world, int i, int j, int k) { - return this.e((IBlockAccess) world, i + 1, j, k) ? true : (this.e((IBlockAccess) world, i - 1, j, k) ? true : (this.e((IBlockAccess) world, i, j - 1, k) ? true : (this.e((IBlockAccess) world, i, j + 1, k) ? true : (this.e((IBlockAccess) world, i, j, k - 1) ? true : this.e((IBlockAccess) world, i, j, k + 1))))); - } - - private int m(World world, int i, int j, int k) { - byte b0 = 0; - - if (!world.isEmpty(i, j, k)) { - return 0; - } else { - int l = this.a(world, i + 1, j, k, b0); - - l = this.a(world, i - 1, j, k, l); - l = this.a(world, i, j - 1, k, l); - l = this.a(world, i, j + 1, k, l); - l = this.a(world, i, j, k - 1, l); - l = this.a(world, i, j, k + 1, l); - return l; - } - } - - public boolean v() { - return false; - } - - public boolean e(IBlockAccess iblockaccess, int i, int j, int k) { - return this.a[Block.getId(iblockaccess.getType(i, j, k))] > 0; - } - - public int a(World world, int i, int j, int k, int l) { - int i1 = this.a[Block.getId(world.getType(i, j, k))]; - - return i1 > l ? i1 : l; - } - - public boolean canPlace(World world, int i, int j, int k) { - return World.a((IBlockAccess) world, i, j - 1, k) || this.e(world, i, j, k); - } - - public void doPhysics(World world, int i, int j, int k, Block block) { - if (!World.a((IBlockAccess) world, i, j - 1, k) && !this.e(world, i, j, k)) { - fireExtinguished(world, i, j, k); // CraftBukkit - fuel block gone - } - } - - public void onPlace(World world, int i, int j, int k) { - if (world.worldProvider.dimension > 0 || !Blocks.PORTAL.e(world, i, j, k)) { - if (!World.a((IBlockAccess) world, i, j - 1, k) && !this.e(world, i, j, k)) { - fireExtinguished(world, i, j, k); // CraftBukkit - fuel block broke - } else { - world.a(i, j, k, this, this.a(world) + world.random.nextInt(10)); - } - } - } - - public MaterialMapColor f(int i) { - return MaterialMapColor.f; - } - - // CraftBukkit start - private void fireExtinguished(World world, int x, int y, int z) { - if (!CraftEventFactory.callBlockFadeEvent(world.getWorld().getBlockAt(x, y, z), Blocks.AIR).isCancelled()) { - world.setAir(x, y, z); - } - } - // CraftBukkit end -} diff --git a/src/main/java/net/minecraft/server/BlockFlowing.java b/src/main/java/net/minecraft/server/BlockFlowing.java deleted file mode 100644 index cdce3ff13b..0000000000 --- a/src/main/java/net/minecraft/server/BlockFlowing.java +++ /dev/null @@ -1,299 +0,0 @@ -package net.minecraft.server; - -import java.util.Random; - -// CraftBukkit start -import org.bukkit.block.BlockFace; -import org.bukkit.event.block.BlockFromToEvent; -// CraftBukkit end - -public class BlockFlowing extends BlockFluids { - - int a; - boolean[] b = new boolean[4]; - int[] M = new int[4]; - - protected BlockFlowing(Material material) { - super(material); - } - - private void n(World world, int i, int j, int k) { - int l = world.getData(i, j, k); - - world.setTypeAndData(i, j, k, Block.getById(Block.getId(this) + 1), l, 2); - } - - public void a(World world, int i, int j, int k, Random random) { - // CraftBukkit start - org.bukkit.World bworld = world.getWorld(); - org.bukkit.Server server = world.getServer(); - org.bukkit.block.Block source = bworld == null ? null : bworld.getBlockAt(i, j, k); - // CraftBukkit end - - int l = this.e(world, i, j, k); - byte b0 = 1; - - if (this.material == Material.LAVA && !world.worldProvider.f) { - b0 = 2; - } - - boolean flag = true; - int i1 = this.a(world); - int j1; - - if (l > 0) { - byte b1 = -100; - - this.a = 0; - int k1 = this.a(world, i - 1, j, k, b1); - - k1 = this.a(world, i + 1, j, k, k1); - k1 = this.a(world, i, j, k - 1, k1); - k1 = this.a(world, i, j, k + 1, k1); - j1 = k1 + b0; - if (j1 >= 8 || k1 < 0) { - j1 = -1; - } - - if (this.e(world, i, j + 1, k) >= 0) { - int l1 = this.e(world, i, j + 1, k); - - if (l1 >= 8) { - j1 = l1; - } else { - j1 = l1 + 8; - } - } - - if (this.a >= 2 && this.material == Material.WATER) { - if (world.getType(i, j - 1, k).getMaterial().isBuildable()) { - j1 = 0; - } else if (world.getType(i, j - 1, k).getMaterial() == this.material && world.getData(i, j - 1, k) == 0) { - j1 = 0; - } - } - - if (this.material == Material.LAVA && l < 8 && j1 < 8 && j1 > l && random.nextInt(4) != 0) { - i1 *= 4; - } - - if (j1 == l) { - if (flag) { - this.n(world, i, j, k); - } - } else { - l = j1; - if (j1 < 0) { - world.setAir(i, j, k); - } else { - world.setData(i, j, k, j1, 2); - world.a(i, j, k, this, i1); - world.applyPhysics(i, j, k, this); - } - } - } else { - this.n(world, i, j, k); - } - - if (this.q(world, i, j - 1, k)) { - // CraftBukkit start - Send "down" to the server - BlockFromToEvent event = new BlockFromToEvent(source, BlockFace.DOWN); - if (server != null) { - server.getPluginManager().callEvent(event); - } - - if (!event.isCancelled()) { - if (this.material == Material.LAVA && world.getType(i, j - 1, k).getMaterial() == Material.WATER) { - world.setTypeUpdate(i, j - 1, k, Blocks.STONE); - this.fizz(world, i, j - 1, k); - return; - } - - if (l >= 8) { - this.flow(world, i, j - 1, k, l); - } else { - this.flow(world, i, j - 1, k, l + 8); - } - } - // CraftBukkit end - } else if (l >= 0 && (l == 0 || this.p(world, i, j - 1, k))) { - boolean[] aboolean = this.o(world, i, j, k); - - j1 = l + b0; - if (l >= 8) { - j1 = 1; - } - - if (j1 >= 8) { - return; - } - - // CraftBukkit start - All four cardinal directions. Do not change the order! - BlockFace[] faces = new BlockFace[] { BlockFace.WEST, BlockFace.EAST, BlockFace.NORTH, BlockFace.SOUTH }; - int index = 0; - - for (BlockFace currentFace : faces) { - if (aboolean[index]) { - BlockFromToEvent event = new BlockFromToEvent(source, currentFace); - - if (server != null) { - server.getPluginManager().callEvent(event); - } - - if (!event.isCancelled()) { - this.flow(world, i + currentFace.getModX(), j, k + currentFace.getModZ(), j1); - } - } - index++; - } - // CraftBukkit end - } - } - - private void flow(World world, int i, int j, int k, int l) { - if (this.q(world, i, j, k)) { - Block block = world.getType(i, j, k); - - if (this.material == Material.LAVA) { - this.fizz(world, i, j, k); - } else { - block.b(world, i, j, k, world.getData(i, j, k), 0); - } - - world.setTypeAndData(i, j, k, this, l, 3); - } - } - - private int c(World world, int i, int j, int k, int l, int i1) { - int j1 = 1000; - - for (int k1 = 0; k1 < 4; ++k1) { - if ((k1 != 0 || i1 != 1) && (k1 != 1 || i1 != 0) && (k1 != 2 || i1 != 3) && (k1 != 3 || i1 != 2)) { - int l1 = i; - int i2 = k; - - if (k1 == 0) { - l1 = i - 1; - } - - if (k1 == 1) { - ++l1; - } - - if (k1 == 2) { - i2 = k - 1; - } - - if (k1 == 3) { - ++i2; - } - - if (!this.p(world, l1, j, i2) && (world.getType(l1, j, i2).getMaterial() != this.material || world.getData(l1, j, i2) != 0)) { - if (!this.p(world, l1, j - 1, i2)) { - return l; - } - - if (l < 4) { - int j2 = this.c(world, l1, j, i2, l + 1, k1); - - if (j2 < j1) { - j1 = j2; - } - } - } - } - } - - return j1; - } - - private boolean[] o(World world, int i, int j, int k) { - int l; - int i1; - - for (l = 0; l < 4; ++l) { - this.M[l] = 1000; - i1 = i; - int j1 = k; - - if (l == 0) { - i1 = i - 1; - } - - if (l == 1) { - ++i1; - } - - if (l == 2) { - j1 = k - 1; - } - - if (l == 3) { - ++j1; - } - - if (!this.p(world, i1, j, j1) && (world.getType(i1, j, j1).getMaterial() != this.material || world.getData(i1, j, j1) != 0)) { - if (this.p(world, i1, j - 1, j1)) { - this.M[l] = this.c(world, i1, j, j1, 1, l); - } else { - this.M[l] = 0; - } - } - } - - l = this.M[0]; - - for (i1 = 1; i1 < 4; ++i1) { - if (this.M[i1] < l) { - l = this.M[i1]; - } - } - - for (i1 = 0; i1 < 4; ++i1) { - this.b[i1] = this.M[i1] == l; - } - - return this.b; - } - - private boolean p(World world, int i, int j, int k) { - Block block = world.getType(i, j, k); - - return block != Blocks.WOODEN_DOOR && block != Blocks.IRON_DOOR_BLOCK && block != Blocks.SIGN_POST && block != Blocks.LADDER && block != Blocks.SUGAR_CANE_BLOCK ? (block.material == Material.PORTAL ? true : block.material.isSolid()) : true; - } - - protected int a(World world, int i, int j, int k, int l) { - int i1 = this.e(world, i, j, k); - - if (i1 < 0) { - return l; - } else { - if (i1 == 0) { - ++this.a; - } - - if (i1 >= 8) { - i1 = 0; - } - - return l >= 0 && i1 >= l ? l : i1; - } - } - - private boolean q(World world, int i, int j, int k) { - Material material = world.getType(i, j, k).getMaterial(); - - return material == this.material ? false : (material == Material.LAVA ? false : !this.p(world, i, j, k)); - } - - public void onPlace(World world, int i, int j, int k) { - super.onPlace(world, i, j, k); - if (world.getType(i, j, k) == this) { - world.a(i, j, k, this, this.a(world)); - } - } - - public boolean L() { - return true; - } -} diff --git a/src/main/java/net/minecraft/server/BlockGrass.java b/src/main/java/net/minecraft/server/BlockGrass.java deleted file mode 100644 index abd991b41f..0000000000 --- a/src/main/java/net/minecraft/server/BlockGrass.java +++ /dev/null @@ -1,121 +0,0 @@ -package net.minecraft.server; - -import java.util.Random; - -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; - -// CraftBukkit start -import org.bukkit.block.BlockState; -import org.bukkit.craftbukkit.event.CraftEventFactory; -import org.bukkit.craftbukkit.util.CraftMagicNumbers; -import org.bukkit.event.block.BlockSpreadEvent; -import org.bukkit.event.block.BlockFadeEvent; -// CraftBukkit end - -public class BlockGrass extends Block implements IBlockFragilePlantElement { - - private static final Logger a = LogManager.getLogger(); - - protected BlockGrass() { - super(Material.GRASS); - this.a(true); - this.a(CreativeModeTab.b); - } - - public void a(World world, int i, int j, int k, Random random) { - if (!world.isStatic) { - if (world.getLightLevel(i, j + 1, k) < 4 && world.getType(i, j + 1, k).k() > 2) { - // CraftBukkit start - org.bukkit.World bworld = world.getWorld(); - BlockState blockState = bworld.getBlockAt(i, j, k).getState(); - blockState.setType(CraftMagicNumbers.getMaterial(Blocks.DIRT)); - - BlockFadeEvent event = new BlockFadeEvent(blockState.getBlock(), blockState); - world.getServer().getPluginManager().callEvent(event); - - if (!event.isCancelled()) { - blockState.update(true); - } - // CraftBukkit end - } else if (world.getLightLevel(i, j + 1, k) >= 9) { - for (int l = 0; l < 4; ++l) { - int i1 = i + random.nextInt(3) - 1; - int j1 = j + random.nextInt(5) - 3; - int k1 = k + random.nextInt(3) - 1; - Block block = world.getType(i1, j1 + 1, k1); - - if (world.getType(i1, j1, k1) == Blocks.DIRT && world.getData(i1, j1, k1) == 0 && world.getLightLevel(i1, j1 + 1, k1) >= 4 && block.k() <= 2) { - // CraftBukkit start - org.bukkit.World bworld = world.getWorld(); - BlockState blockState = bworld.getBlockAt(i1, j1, k1).getState(); - blockState.setType(CraftMagicNumbers.getMaterial(Blocks.GRASS)); - - BlockSpreadEvent event = new BlockSpreadEvent(blockState.getBlock(), bworld.getBlockAt(i, j, k), blockState); - world.getServer().getPluginManager().callEvent(event); - - if (!event.isCancelled()) { - blockState.update(true); - } - // CraftBukkit end - } - } - } - } - } - - public Item getDropType(int i, Random random, int j) { - return Blocks.DIRT.getDropType(0, random, j); - } - - public boolean a(World world, int i, int j, int k, boolean flag) { - return true; - } - - public boolean a(World world, Random random, int i, int j, int k) { - return true; - } - - public void b(World world, Random random, int i, int j, int k) { - int l = 0; - - while (l < 128) { - int i1 = i; - int j1 = j + 1; - int k1 = k; - int l1 = 0; - - while (true) { - if (l1 < l / 16) { - i1 += random.nextInt(3) - 1; - j1 += (random.nextInt(3) - 1) * random.nextInt(3) / 2; - k1 += random.nextInt(3) - 1; - if (world.getType(i1, j1 - 1, k1) == Blocks.GRASS && !world.getType(i1, j1, k1).r()) { - ++l1; - continue; - } - } else if (world.getType(i1, j1, k1).material == Material.AIR) { - if (random.nextInt(8) != 0) { - if (Blocks.LONG_GRASS.j(world, i1, j1, k1)) { - CraftEventFactory.handleBlockGrowEvent(world, i1, j1, k1, Blocks.LONG_GRASS, 1); // CraftBukkit - } - } else { - String s = world.getBiome(i1, k1).a(random, i1, j1, k1); - - a.debug("Flower in " + world.getBiome(i1, k1).af + ": " + s); - BlockFlowers blockflowers = BlockFlowers.e(s); - - if (blockflowers != null && blockflowers.j(world, i1, j1, k1)) { - int i2 = BlockFlowers.f(s); - - CraftEventFactory.handleBlockGrowEvent(world, i1, j1, k1, blockflowers, i2); // CraftBukkit - } - } - } - - ++l; - break; - } - } - } -} diff --git a/src/main/java/net/minecraft/server/BlockHopper.java b/src/main/java/net/minecraft/server/BlockHopper.java deleted file mode 100644 index b85b72f31a..0000000000 --- a/src/main/java/net/minecraft/server/BlockHopper.java +++ /dev/null @@ -1,166 +0,0 @@ -package net.minecraft.server; - -import java.util.List; -import java.util.Random; - -public class BlockHopper extends BlockContainer { - - private final Random a = new Random(); - - public BlockHopper() { - super(Material.ORE); - this.a(CreativeModeTab.d); - this.a(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F); - } - - public void updateShape(IBlockAccess iblockaccess, int i, int j, int k) { - this.a(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F); - } - - public void a(World world, int i, int j, int k, AxisAlignedBB axisalignedbb, List list, Entity entity) { - this.a(0.0F, 0.0F, 0.0F, 1.0F, 0.625F, 1.0F); - super.a(world, i, j, k, axisalignedbb, list, entity); - float f = 0.125F; - - this.a(0.0F, 0.0F, 0.0F, f, 1.0F, 1.0F); - super.a(world, i, j, k, axisalignedbb, list, entity); - this.a(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, f); - super.a(world, i, j, k, axisalignedbb, list, entity); - this.a(1.0F - f, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F); - super.a(world, i, j, k, axisalignedbb, list, entity); - this.a(0.0F, 0.0F, 1.0F - f, 1.0F, 1.0F, 1.0F); - super.a(world, i, j, k, axisalignedbb, list, entity); - this.a(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F); - } - - public int getPlacedData(World world, int i, int j, int k, int l, float f, float f1, float f2, int i1) { - int j1 = Facing.OPPOSITE_FACING[l]; - - if (j1 == 1) { - j1 = 0; - } - - return j1; - } - - public TileEntity a(World world, int i) { - return new TileEntityHopper(); - } - - public void postPlace(World world, int i, int j, int k, EntityLiving entityliving, ItemStack itemstack) { - super.postPlace(world, i, j, k, entityliving, itemstack); - if (itemstack.hasName()) { - TileEntityHopper tileentityhopper = e((IBlockAccess) world, i, j, k); - - tileentityhopper.a(itemstack.getName()); - } - } - - public void onPlace(World world, int i, int j, int k) { - super.onPlace(world, i, j, k); - this.e(world, i, j, k); - } - - public boolean interact(World world, int i, int j, int k, EntityHuman entityhuman, int l, float f, float f1, float f2) { - if (world.isStatic) { - return true; - } else { - TileEntityHopper tileentityhopper = e((IBlockAccess) world, i, j, k); - - if (tileentityhopper != null) { - entityhuman.openHopper(tileentityhopper); - } - - return true; - } - } - - public void doPhysics(World world, int i, int j, int k, Block block) { - this.e(world, i, j, k); - } - - private void e(World world, int i, int j, int k) { - int l = world.getData(i, j, k); - int i1 = b(l); - boolean flag = !world.isBlockIndirectlyPowered(i, j, k); - boolean flag1 = c(l); - - if (flag != flag1) { - world.setData(i, j, k, i1 | (flag ? 0 : 8), 4); - } - } - - public void remove(World world, int i, int j, int k, Block block, int l) { - TileEntityHopper tileentityhopper = (TileEntityHopper) world.getTileEntity(i, j, k); - - if (tileentityhopper != null) { - for (int i1 = 0; i1 < tileentityhopper.getSize(); ++i1) { - ItemStack itemstack = tileentityhopper.getItem(i1); - - if (itemstack != null) { - float f = this.a.nextFloat() * 0.8F + 0.1F; - float f1 = this.a.nextFloat() * 0.8F + 0.1F; - float f2 = this.a.nextFloat() * 0.8F + 0.1F; - - while (itemstack.count > 0) { - int j1 = this.a.nextInt(21) + 10; - - if (j1 > itemstack.count) { - j1 = itemstack.count; - } - - itemstack.count -= j1; - EntityItem entityitem = new EntityItem(world, (double) ((float) i + f), (double) ((float) j + f1), (double) ((float) k + f2), new ItemStack(itemstack.getItem(), j1, itemstack.getData())); - - if (itemstack.hasTag()) { - entityitem.getItemStack().setTag((NBTTagCompound) itemstack.getTag().clone()); - } - - float f3 = 0.05F; - - entityitem.motX = (double) ((float) this.a.nextGaussian() * f3); - entityitem.motY = (double) ((float) this.a.nextGaussian() * f3 + 0.2F); - entityitem.motZ = (double) ((float) this.a.nextGaussian() * f3); - world.addEntity(entityitem); - } - } - } - - world.updateAdjacentComparators(i, j, k, block); - } - - super.remove(world, i, j, k, block, l); - } - - public int b() { - return 38; - } - - public boolean d() { - return false; - } - - public boolean c() { - return false; - } - - public static int b(int i) { - return Math.min(i & 7, 5); // CraftBukkit - Fix AIOOBE in callers - } - - public static boolean c(int i) { - return (i & 8) != 8; - } - - public boolean isComplexRedstone() { - return true; - } - - public int g(World world, int i, int j, int k, int l) { - return Container.b((IInventory) e((IBlockAccess) world, i, j, k)); - } - - public static TileEntityHopper e(IBlockAccess iblockaccess, int i, int j, int k) { - return (TileEntityHopper) iblockaccess.getTileEntity(i, j, k); - } -} diff --git a/src/main/java/net/minecraft/server/BlockIce.java b/src/main/java/net/minecraft/server/BlockIce.java deleted file mode 100644 index 25cb327116..0000000000 --- a/src/main/java/net/minecraft/server/BlockIce.java +++ /dev/null @@ -1,65 +0,0 @@ -package net.minecraft.server; - -import java.util.Random; - -public class BlockIce extends BlockHalfTransparent { - - public BlockIce() { - super("ice", Material.ICE, false); - this.frictionFactor = 0.98F; - this.a(true); - this.a(CreativeModeTab.b); - } - - public void a(World world, EntityHuman entityhuman, int i, int j, int k, int l) { - entityhuman.a(StatisticList.MINE_BLOCK_COUNT[Block.getId(this)], 1); - entityhuman.applyExhaustion(0.025F); - if (this.E() && EnchantmentManager.hasSilkTouchEnchantment(entityhuman)) { - ItemStack itemstack = this.j(l); - - if (itemstack != null) { - this.a(world, i, j, k, itemstack); - } - } else { - if (world.worldProvider.f) { - world.setAir(i, j, k); - return; - } - - int i1 = EnchantmentManager.getBonusBlockLootEnchantmentLevel(entityhuman); - - this.b(world, i, j, k, l, i1); - Material material = world.getType(i, j - 1, k).getMaterial(); - - if (material.isSolid() || material.isLiquid()) { - world.setTypeUpdate(i, j, k, Blocks.WATER); - } - } - } - - public int a(Random random) { - return 0; - } - - public void a(World world, int i, int j, int k, Random random) { - if (world.b(EnumSkyBlock.BLOCK, i, j, k) > 11 - this.k()) { - // CraftBukkit start - if (org.bukkit.craftbukkit.event.CraftEventFactory.callBlockFadeEvent(world.getWorld().getBlockAt(i, j, k), world.worldProvider.f ? Blocks.AIR : Blocks.STATIONARY_WATER).isCancelled()) { - return; - } - // CraftBukkit end - - if (world.worldProvider.f) { - world.setAir(i, j, k); - return; - } - - this.b(world, i, j, k, world.getData(i, j, k), 0); - world.setTypeUpdate(i, j, k, Blocks.STATIONARY_WATER); - } - } - - public int h() { - return 0; - } -} diff --git a/src/main/java/net/minecraft/server/BlockLeaves.java b/src/main/java/net/minecraft/server/BlockLeaves.java deleted file mode 100644 index d6afe5b08b..0000000000 --- a/src/main/java/net/minecraft/server/BlockLeaves.java +++ /dev/null @@ -1,203 +0,0 @@ -package net.minecraft.server; - -import java.util.Random; - -import org.bukkit.event.block.LeavesDecayEvent; // CraftBukkit - -public abstract class BlockLeaves extends BlockTransparent { - - int[] a; - protected IIcon[][] M = new IIcon[2][]; - - public BlockLeaves() { - super(Material.LEAVES, false); - this.a(true); - this.a(CreativeModeTab.c); - this.c(0.2F); - this.g(1); - this.a(h); - } - - public void remove(World world, int i, int j, int k, Block block, int l) { - byte b0 = 1; - int i1 = b0 + 1; - - if (world.b(i - i1, j - i1, k - i1, i + i1, j + i1, k + i1)) { - for (int j1 = -b0; j1 <= b0; ++j1) { - for (int k1 = -b0; k1 <= b0; ++k1) { - for (int l1 = -b0; l1 <= b0; ++l1) { - if (world.getType(i + j1, j + k1, k + l1).getMaterial() == Material.LEAVES) { - int i2 = world.getData(i + j1, j + k1, k + l1); - - world.setData(i + j1, j + k1, k + l1, i2 | 8, 4); - } - } - } - } - } - } - - public void a(World world, int i, int j, int k, Random random) { - if (!world.isStatic) { - int l = world.getData(i, j, k); - - if ((l & 8) != 0 && (l & 4) == 0) { - byte b0 = 4; - int i1 = b0 + 1; - byte b1 = 32; - int j1 = b1 * b1; - int k1 = b1 / 2; - - if (this.a == null) { - this.a = new int[b1 * b1 * b1]; - } - - int l1; - - if (world.b(i - i1, j - i1, k - i1, i + i1, j + i1, k + i1)) { - int i2; - int j2; - - for (l1 = -b0; l1 <= b0; ++l1) { - for (i2 = -b0; i2 <= b0; ++i2) { - for (j2 = -b0; j2 <= b0; ++j2) { - Block block = world.getType(i + l1, j + i2, k + j2); - - if (block != Blocks.LOG && block != Blocks.LOG2) { - if (block.getMaterial() == Material.LEAVES) { - this.a[(l1 + k1) * j1 + (i2 + k1) * b1 + j2 + k1] = -2; - } else { - this.a[(l1 + k1) * j1 + (i2 + k1) * b1 + j2 + k1] = -1; - } - } else { - this.a[(l1 + k1) * j1 + (i2 + k1) * b1 + j2 + k1] = 0; - } - } - } - } - - for (l1 = 1; l1 <= 4; ++l1) { - for (i2 = -b0; i2 <= b0; ++i2) { - for (j2 = -b0; j2 <= b0; ++j2) { - for (int k2 = -b0; k2 <= b0; ++k2) { - if (this.a[(i2 + k1) * j1 + (j2 + k1) * b1 + k2 + k1] == l1 - 1) { - if (this.a[(i2 + k1 - 1) * j1 + (j2 + k1) * b1 + k2 + k1] == -2) { - this.a[(i2 + k1 - 1) * j1 + (j2 + k1) * b1 + k2 + k1] = l1; - } - - if (this.a[(i2 + k1 + 1) * j1 + (j2 + k1) * b1 + k2 + k1] == -2) { - this.a[(i2 + k1 + 1) * j1 + (j2 + k1) * b1 + k2 + k1] = l1; - } - - if (this.a[(i2 + k1) * j1 + (j2 + k1 - 1) * b1 + k2 + k1] == -2) { - this.a[(i2 + k1) * j1 + (j2 + k1 - 1) * b1 + k2 + k1] = l1; - } - - if (this.a[(i2 + k1) * j1 + (j2 + k1 + 1) * b1 + k2 + k1] == -2) { - this.a[(i2 + k1) * j1 + (j2 + k1 + 1) * b1 + k2 + k1] = l1; - } - - if (this.a[(i2 + k1) * j1 + (j2 + k1) * b1 + (k2 + k1 - 1)] == -2) { - this.a[(i2 + k1) * j1 + (j2 + k1) * b1 + (k2 + k1 - 1)] = l1; - } - - if (this.a[(i2 + k1) * j1 + (j2 + k1) * b1 + k2 + k1 + 1] == -2) { - this.a[(i2 + k1) * j1 + (j2 + k1) * b1 + k2 + k1 + 1] = l1; - } - } - } - } - } - } - } - - l1 = this.a[k1 * j1 + k1 * b1 + k1]; - if (l1 >= 0) { - world.setData(i, j, k, l & -9, 4); - } else { - this.e(world, i, j, k); - } - } - } - } - - private void e(World world, int i, int j, int k) { - // CraftBukkit start - LeavesDecayEvent event = new LeavesDecayEvent(world.getWorld().getBlockAt(i, j, k)); - world.getServer().getPluginManager().callEvent(event); - - if (event.isCancelled()) { - return; - } - // CraftBukkit end - - this.b(world, i, j, k, world.getData(i, j, k), 0); - world.setAir(i, j, k); - } - - public int a(Random random) { - return random.nextInt(20) == 0 ? 1 : 0; - } - - public Item getDropType(int i, Random random, int j) { - return Item.getItemOf(Blocks.SAPLING); - } - - public void dropNaturally(World world, int i, int j, int k, int l, float f, int i1) { - if (!world.isStatic) { - int j1 = this.b(l); - - if (i1 > 0) { - j1 -= 2 << i1; - if (j1 < 10) { - j1 = 10; - } - } - - if (world.random.nextInt(j1) == 0) { - Item item = this.getDropType(l, world.random, i1); - - this.a(world, i, j, k, new ItemStack(item, 1, this.getDropData(l))); - } - - j1 = 200; - if (i1 > 0) { - j1 -= 10 << i1; - if (j1 < 40) { - j1 = 40; - } - } - - this.c(world, i, j, k, l, j1); - } - } - - protected void c(World world, int i, int j, int k, int l, int i1) {} - - protected int b(int i) { - return 20; - } - - public void a(World world, EntityHuman entityhuman, int i, int j, int k, int l) { - if (!world.isStatic && entityhuman.bF() != null && entityhuman.bF().getItem() == Items.SHEARS) { - entityhuman.a(StatisticList.MINE_BLOCK_COUNT[Block.getId(this)], 1); - this.a(world, i, j, k, new ItemStack(Item.getItemOf(this), 1, l & 3)); - } else { - super.a(world, entityhuman, i, j, k, l); - } - } - - public int getDropData(int i) { - return i & 3; - } - - public boolean c() { - return !this.P; - } - - protected ItemStack j(int i) { - return new ItemStack(Item.getItemOf(this), 1, i & 3); - } - - public abstract String[] e(); -} diff --git a/src/main/java/net/minecraft/server/BlockLever.java b/src/main/java/net/minecraft/server/BlockLever.java deleted file mode 100644 index e00cea3d0b..0000000000 --- a/src/main/java/net/minecraft/server/BlockLever.java +++ /dev/null @@ -1,278 +0,0 @@ -package net.minecraft.server; - -import org.bukkit.event.block.BlockRedstoneEvent; // CraftBukkit - -public class BlockLever extends Block { - - protected BlockLever() { - super(Material.ORIENTABLE); - this.a(CreativeModeTab.d); - } - - public AxisAlignedBB a(World world, int i, int j, int k) { - return null; - } - - public boolean c() { - return false; - } - - public boolean d() { - return false; - } - - public int b() { - return 12; - } - - public boolean canPlace(World world, int i, int j, int k, int l) { - return l == 0 && world.getType(i, j + 1, k).r() ? true : (l == 1 && World.a((IBlockAccess) world, i, j - 1, k) ? true : (l == 2 && world.getType(i, j, k + 1).r() ? true : (l == 3 && world.getType(i, j, k - 1).r() ? true : (l == 4 && world.getType(i + 1, j, k).r() ? true : l == 5 && world.getType(i - 1, j, k).r())))); - } - - public boolean canPlace(World world, int i, int j, int k) { - return world.getType(i - 1, j, k).r() ? true : (world.getType(i + 1, j, k).r() ? true : (world.getType(i, j, k - 1).r() ? true : (world.getType(i, j, k + 1).r() ? true : (World.a((IBlockAccess) world, i, j - 1, k) ? true : world.getType(i, j + 1, k).r())))); - } - - public int getPlacedData(World world, int i, int j, int k, int l, float f, float f1, float f2, int i1) { - int j1 = i1 & 8; - int k1 = i1 & 7; - byte b0 = -1; - - if (l == 0 && world.getType(i, j + 1, k).r()) { - b0 = 0; - } - - if (l == 1 && World.a((IBlockAccess) world, i, j - 1, k)) { - b0 = 5; - } - - if (l == 2 && world.getType(i, j, k + 1).r()) { - b0 = 4; - } - - if (l == 3 && world.getType(i, j, k - 1).r()) { - b0 = 3; - } - - if (l == 4 && world.getType(i + 1, j, k).r()) { - b0 = 2; - } - - if (l == 5 && world.getType(i - 1, j, k).r()) { - b0 = 1; - } - - return b0 + j1; - } - - public void postPlace(World world, int i, int j, int k, EntityLiving entityliving, ItemStack itemstack) { - int l = world.getData(i, j, k); - int i1 = l & 7; - int j1 = l & 8; - - if (i1 == b(1)) { - if ((MathHelper.floor((double) (entityliving.yaw * 4.0F / 360.0F) + 0.5D) & 1) == 0) { - world.setData(i, j, k, 5 | j1, 2); - } else { - world.setData(i, j, k, 6 | j1, 2); - } - } else if (i1 == b(0)) { - if ((MathHelper.floor((double) (entityliving.yaw * 4.0F / 360.0F) + 0.5D) & 1) == 0) { - world.setData(i, j, k, 7 | j1, 2); - } else { - world.setData(i, j, k, 0 | j1, 2); - } - } - } - - public static int b(int i) { - switch (i) { - case 0: - return 0; - - case 1: - return 5; - - case 2: - return 4; - - case 3: - return 3; - - case 4: - return 2; - - case 5: - return 1; - - default: - return -1; - } - } - - public void doPhysics(World world, int i, int j, int k, Block block) { - if (this.e(world, i, j, k)) { - int l = world.getData(i, j, k) & 7; - boolean flag = false; - - if (!world.getType(i - 1, j, k).r() && l == 1) { - flag = true; - } - - if (!world.getType(i + 1, j, k).r() && l == 2) { - flag = true; - } - - if (!world.getType(i, j, k - 1).r() && l == 3) { - flag = true; - } - - if (!world.getType(i, j, k + 1).r() && l == 4) { - flag = true; - } - - if (!World.a((IBlockAccess) world, i, j - 1, k) && l == 5) { - flag = true; - } - - if (!World.a((IBlockAccess) world, i, j - 1, k) && l == 6) { - flag = true; - } - - if (!world.getType(i, j + 1, k).r() && l == 0) { - flag = true; - } - - if (!world.getType(i, j + 1, k).r() && l == 7) { - flag = true; - } - - if (flag) { - this.b(world, i, j, k, world.getData(i, j, k), 0); - world.setAir(i, j, k); - } - } - } - - private boolean e(World world, int i, int j, int k) { - if (!this.canPlace(world, i, j, k)) { - this.b(world, i, j, k, world.getData(i, j, k), 0); - world.setAir(i, j, k); - return false; - } else { - return true; - } - } - - public void updateShape(IBlockAccess iblockaccess, int i, int j, int k) { - int l = iblockaccess.getData(i, j, k) & 7; - float f = 0.1875F; - - if (l == 1) { - this.a(0.0F, 0.2F, 0.5F - f, f * 2.0F, 0.8F, 0.5F + f); - } else if (l == 2) { - this.a(1.0F - f * 2.0F, 0.2F, 0.5F - f, 1.0F, 0.8F, 0.5F + f); - } else if (l == 3) { - this.a(0.5F - f, 0.2F, 0.0F, 0.5F + f, 0.8F, f * 2.0F); - } else if (l == 4) { - this.a(0.5F - f, 0.2F, 1.0F - f * 2.0F, 0.5F + f, 0.8F, 1.0F); - } else if (l != 5 && l != 6) { - if (l == 0 || l == 7) { - f = 0.25F; - this.a(0.5F - f, 0.4F, 0.5F - f, 0.5F + f, 1.0F, 0.5F + f); - } - } else { - f = 0.25F; - this.a(0.5F - f, 0.0F, 0.5F - f, 0.5F + f, 0.6F, 0.5F + f); - } - } - - public boolean interact(World world, int i, int j, int k, EntityHuman entityhuman, int l, float f, float f1, float f2) { - if (world.isStatic) { - return true; - } else { - int i1 = world.getData(i, j, k); - int j1 = i1 & 7; - int k1 = 8 - (i1 & 8); - - // CraftBukkit start - Interact Lever - org.bukkit.block.Block block = world.getWorld().getBlockAt(i, j, k); - int old = (k1 != 8) ? 15 : 0; - int current = (k1 == 8) ? 15 : 0; - - BlockRedstoneEvent eventRedstone = new BlockRedstoneEvent(block, old, current); - world.getServer().getPluginManager().callEvent(eventRedstone); - - if ((eventRedstone.getNewCurrent() > 0) != (k1 == 8)) { - return true; - } - // CraftBukkit end - - world.setData(i, j, k, j1 + k1, 3); - world.makeSound((double) i + 0.5D, (double) j + 0.5D, (double) k + 0.5D, "random.click", 0.3F, k1 > 0 ? 0.6F : 0.5F); - world.applyPhysics(i, j, k, this); - if (j1 == 1) { - world.applyPhysics(i - 1, j, k, this); - } else if (j1 == 2) { - world.applyPhysics(i + 1, j, k, this); - } else if (j1 == 3) { - world.applyPhysics(i, j, k - 1, this); - } else if (j1 == 4) { - world.applyPhysics(i, j, k + 1, this); - } else if (j1 != 5 && j1 != 6) { - if (j1 == 0 || j1 == 7) { - world.applyPhysics(i, j + 1, k, this); - } - } else { - world.applyPhysics(i, j - 1, k, this); - } - - return true; - } - } - - public void remove(World world, int i, int j, int k, Block block, int l) { - if ((l & 8) > 0) { - world.applyPhysics(i, j, k, this); - int i1 = l & 7; - - if (i1 == 1) { - world.applyPhysics(i - 1, j, k, this); - } else if (i1 == 2) { - world.applyPhysics(i + 1, j, k, this); - } else if (i1 == 3) { - world.applyPhysics(i, j, k - 1, this); - } else if (i1 == 4) { - world.applyPhysics(i, j, k + 1, this); - } else if (i1 != 5 && i1 != 6) { - if (i1 == 0 || i1 == 7) { - world.applyPhysics(i, j + 1, k, this); - } - } else { - world.applyPhysics(i, j - 1, k, this); - } - } - - super.remove(world, i, j, k, block, l); - } - - public int b(IBlockAccess iblockaccess, int i, int j, int k, int l) { - return (iblockaccess.getData(i, j, k) & 8) > 0 ? 15 : 0; - } - - public int c(IBlockAccess iblockaccess, int i, int j, int k, int l) { - int i1 = iblockaccess.getData(i, j, k); - - if ((i1 & 8) == 0) { - return 0; - } else { - int j1 = i1 & 7; - - return j1 == 0 && l == 0 ? 15 : (j1 == 7 && l == 0 ? 15 : (j1 == 6 && l == 1 ? 15 : (j1 == 5 && l == 1 ? 15 : (j1 == 4 && l == 2 ? 15 : (j1 == 3 && l == 3 ? 15 : (j1 == 2 && l == 4 ? 15 : (j1 == 1 && l == 5 ? 15 : 0))))))); - } - } - - public boolean isPowerSource() { - return true; - } -} diff --git a/src/main/java/net/minecraft/server/BlockMinecartDetector.java b/src/main/java/net/minecraft/server/BlockMinecartDetector.java deleted file mode 100644 index 207da2438d..0000000000 --- a/src/main/java/net/minecraft/server/BlockMinecartDetector.java +++ /dev/null @@ -1,120 +0,0 @@ -package net.minecraft.server; - -import java.util.List; -import java.util.Random; - -import org.bukkit.event.block.BlockRedstoneEvent; // CraftBukkit - -public class BlockMinecartDetector extends BlockMinecartTrackAbstract { - - public BlockMinecartDetector() { - super(true); - this.a(true); - } - - public int a(World world) { - return 20; - } - - public boolean isPowerSource() { - return true; - } - - public void a(World world, int i, int j, int k, Entity entity) { - if (!world.isStatic) { - int l = world.getData(i, j, k); - - if ((l & 8) == 0) { - this.a(world, i, j, k, l); - } - } - } - - public void a(World world, int i, int j, int k, Random random) { - if (!world.isStatic) { - int l = world.getData(i, j, k); - - if ((l & 8) != 0) { - this.a(world, i, j, k, l); - } - } - } - - public int b(IBlockAccess iblockaccess, int i, int j, int k, int l) { - return (iblockaccess.getData(i, j, k) & 8) != 0 ? 15 : 0; - } - - public int c(IBlockAccess iblockaccess, int i, int j, int k, int l) { - return (iblockaccess.getData(i, j, k) & 8) == 0 ? 0 : (l == 1 ? 15 : 0); - } - - private void a(World world, int i, int j, int k, int l) { - boolean flag = (l & 8) != 0; - boolean flag1 = false; - float f = 0.125F; - List list = world.a(EntityMinecartAbstract.class, AxisAlignedBB.a((double) ((float) i + f), (double) j, (double) ((float) k + f), (double) ((float) (i + 1) - f), (double) ((float) (j + 1) - f), (double) ((float) (k + 1) - f))); - - if (!list.isEmpty()) { - flag1 = true; - } - - // CraftBukkit start - if (flag != flag1) { - org.bukkit.block.Block block = world.getWorld().getBlockAt(i, j, k); - - BlockRedstoneEvent eventRedstone = new BlockRedstoneEvent(block, flag ? 15 : 0, flag1 ? 15 : 0); - world.getServer().getPluginManager().callEvent(eventRedstone); - - flag1 = eventRedstone.getNewCurrent() > 0; - } - // CraftBukkit end - - if (flag1 && !flag) { - world.setData(i, j, k, l | 8, 3); - world.applyPhysics(i, j, k, this); - world.applyPhysics(i, j - 1, k, this); - world.c(i, j, k, i, j, k); - } - - if (!flag1 && flag) { - world.setData(i, j, k, l & 7, 3); - world.applyPhysics(i, j, k, this); - world.applyPhysics(i, j - 1, k, this); - world.c(i, j, k, i, j, k); - } - - if (flag1) { - world.a(i, j, k, this, this.a(world)); - } - - world.updateAdjacentComparators(i, j, k, this); - } - - public void onPlace(World world, int i, int j, int k) { - super.onPlace(world, i, j, k); - this.a(world, i, j, k, world.getData(i, j, k)); - } - - public boolean isComplexRedstone() { - return true; - } - - public int g(World world, int i, int j, int k, int l) { - if ((world.getData(i, j, k) & 8) > 0) { - float f = 0.125F; - List list = world.a(EntityMinecartCommandBlock.class, AxisAlignedBB.a((double) ((float) i + f), (double) j, (double) ((float) k + f), (double) ((float) (i + 1) - f), (double) ((float) (j + 1) - f), (double) ((float) (k + 1) - f))); - - if (list.size() > 0) { - return ((EntityMinecartCommandBlock) list.get(0)).getCommandBlock().g(); - } - - List list1 = world.a(EntityMinecartAbstract.class, AxisAlignedBB.a((double) ((float) i + f), (double) j, (double) ((float) k + f), (double) ((float) (i + 1) - f), (double) ((float) (j + 1) - f), (double) ((float) (k + 1) - f)), IEntitySelector.c); - - if (list1.size() > 0) { - return Container.b((IInventory) list1.get(0)); - } - } - - return 0; - } -} diff --git a/src/main/java/net/minecraft/server/BlockMobSpawner.java b/src/main/java/net/minecraft/server/BlockMobSpawner.java deleted file mode 100644 index c32db8f6ec..0000000000 --- a/src/main/java/net/minecraft/server/BlockMobSpawner.java +++ /dev/null @@ -1,41 +0,0 @@ -package net.minecraft.server; - -import java.util.Random; - -public class BlockMobSpawner extends BlockContainer { - - protected BlockMobSpawner() { - super(Material.STONE); - } - - public TileEntity a(World world, int i) { - return new TileEntityMobSpawner(); - } - - public Item getDropType(int i, Random random, int j) { - return null; - } - - public int a(Random random) { - return 0; - } - - public void dropNaturally(World world, int i, int j, int k, int l, float f, int i1) { - super.dropNaturally(world, i, j, k, l, f, i1); - /* CraftBukkit start - Delegate to getExpDrop - int j1 = 15 + world.random.nextInt(15) + world.random.nextInt(15); - - this.dropExperience(world, i, j, k, j1)*/ - } - - public int getExpDrop(World world, int data, int enchantmentLevel) { - int j1 = 15 + world.random.nextInt(15) + world.random.nextInt(15); - - return j1; - // CraftBukkit end - } - - public boolean c() { - return false; - } -} diff --git a/src/main/java/net/minecraft/server/BlockMonsterEggs.java b/src/main/java/net/minecraft/server/BlockMonsterEggs.java deleted file mode 100644 index d9f874151b..0000000000 --- a/src/main/java/net/minecraft/server/BlockMonsterEggs.java +++ /dev/null @@ -1,121 +0,0 @@ -package net.minecraft.server; - -import java.util.Random; - -import net.minecraft.util.org.apache.commons.lang3.tuple.ImmutablePair; - -import org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason; // CraftBukkit - -public class BlockMonsterEggs extends Block { - - public static final String[] a = new String[] { "stone", "cobble", "brick", "mossybrick", "crackedbrick", "chiseledbrick"}; - - public BlockMonsterEggs() { - super(Material.CLAY); - this.c(0.0F); - this.a(CreativeModeTab.c); - } - - public void postBreak(World world, int i, int j, int k, int l) { - if (!world.isStatic) { - EntitySilverfish entitysilverfish = new EntitySilverfish(world); - - entitysilverfish.setPositionRotation((double) i + 0.5D, (double) j, (double) k + 0.5D, 0.0F, 0.0F); - world.addEntity(entitysilverfish, SpawnReason.SILVERFISH_BLOCK); // CraftBukkit - add SpawnReason - entitysilverfish.s(); - } - - super.postBreak(world, i, j, k, l); - } - - public int a(Random random) { - return 0; - } - - public static boolean a(Block block) { - return block == Blocks.STONE || block == Blocks.COBBLESTONE || block == Blocks.SMOOTH_BRICK; - } - - public static int a(Block block, int i) { - if (i == 0) { - if (block == Blocks.COBBLESTONE) { - return 1; - } - - if (block == Blocks.SMOOTH_BRICK) { - return 2; - } - } else if (block == Blocks.SMOOTH_BRICK) { - switch (i) { - case 1: - return 3; - - case 2: - return 4; - - case 3: - return 5; - } - } - - return 0; - } - - public static ImmutablePair b(int i) { - switch (i) { - case 1: - return new ImmutablePair(Blocks.COBBLESTONE, Integer.valueOf(0)); - - case 2: - return new ImmutablePair(Blocks.SMOOTH_BRICK, Integer.valueOf(0)); - - case 3: - return new ImmutablePair(Blocks.SMOOTH_BRICK, Integer.valueOf(1)); - - case 4: - return new ImmutablePair(Blocks.SMOOTH_BRICK, Integer.valueOf(2)); - - case 5: - return new ImmutablePair(Blocks.SMOOTH_BRICK, Integer.valueOf(3)); - - default: - return new ImmutablePair(Blocks.STONE, Integer.valueOf(0)); - } - } - - protected ItemStack j(int i) { - switch (i) { - case 1: - return new ItemStack(Blocks.COBBLESTONE); - - case 2: - return new ItemStack(Blocks.SMOOTH_BRICK); - - case 3: - return new ItemStack(Blocks.SMOOTH_BRICK, 1, 1); - - case 4: - return new ItemStack(Blocks.SMOOTH_BRICK, 1, 2); - - case 5: - return new ItemStack(Blocks.SMOOTH_BRICK, 1, 3); - - default: - return new ItemStack(Blocks.STONE); - } - } - - public void dropNaturally(World world, int i, int j, int k, int l, float f, int i1) { - if (!world.isStatic) { - EntitySilverfish entitysilverfish = new EntitySilverfish(world); - - entitysilverfish.setPositionRotation((double) i + 0.5D, (double) j, (double) k + 0.5D, 0.0F, 0.0F); - world.addEntity(entitysilverfish, SpawnReason.SILVERFISH_BLOCK); // CraftBukkit - add SpawnReason - entitysilverfish.s(); - } - } - - public int getDropData(World world, int i, int j, int k) { - return world.getData(i, j, k); - } -} diff --git a/src/main/java/net/minecraft/server/BlockMushroom.java b/src/main/java/net/minecraft/server/BlockMushroom.java deleted file mode 100644 index 6671a84bed..0000000000 --- a/src/main/java/net/minecraft/server/BlockMushroom.java +++ /dev/null @@ -1,126 +0,0 @@ -package net.minecraft.server; - -import java.util.Random; - -// CraftBukkit start -import org.bukkit.TreeType; -import org.bukkit.block.BlockState; -import org.bukkit.event.block.BlockSpreadEvent; -// CraftBukkit end - -public class BlockMushroom extends BlockPlant implements IBlockFragilePlantElement { - - protected BlockMushroom() { - float f = 0.2F; - - this.a(0.5F - f, 0.0F, 0.5F - f, 0.5F + f, f * 2.0F, 0.5F + f); - this.a(true); - } - - public void a(World world, int i, int j, int k, Random random) { - final int sourceX = i, sourceY = j, sourceZ = k; // CraftBukkit - if (random.nextInt(25) == 0) { - byte b0 = 4; - int l = 5; - - int i1; - int j1; - int k1; - - for (i1 = i - b0; i1 <= i + b0; ++i1) { - for (j1 = k - b0; j1 <= k + b0; ++j1) { - for (k1 = j - 1; k1 <= j + 1; ++k1) { - if (world.getType(i1, k1, j1) == this) { - --l; - if (l <= 0) { - return; - } - } - } - } - } - - i1 = i + random.nextInt(3) - 1; - j1 = j + random.nextInt(2) - random.nextInt(2); - k1 = k + random.nextInt(3) - 1; - - for (int l1 = 0; l1 < 4; ++l1) { - if (world.isEmpty(i1, j1, k1) && this.j(world, i1, j1, k1)) { - i = i1; - j = j1; - k = k1; - } - - i1 = i + random.nextInt(3) - 1; - j1 = j + random.nextInt(2) - random.nextInt(2); - k1 = k + random.nextInt(3) - 1; - } - - if (world.isEmpty(i1, j1, k1) && this.j(world, i1, j1, k1)) { - // CraftBukkit start - org.bukkit.World bworld = world.getWorld(); - BlockState blockState = bworld.getBlockAt(i1, j1, k1).getState(); - blockState.setType(org.bukkit.craftbukkit.util.CraftMagicNumbers.getMaterial(this)); // nms: this.id, 0, 2 - - BlockSpreadEvent event = new BlockSpreadEvent(blockState.getBlock(), bworld.getBlockAt(sourceX, sourceY, sourceZ), blockState); - world.getServer().getPluginManager().callEvent(event); - - if (!event.isCancelled()) { - blockState.update(true); - } - // CraftBukkit end - } - } - } - - public boolean canPlace(World world, int i, int j, int k) { - return super.canPlace(world, i, j, k) && this.j(world, i, j, k); - } - - protected boolean a(Block block) { - return block.j(); - } - - public boolean j(World world, int i, int j, int k) { - if (j >= 0 && j < 256) { - Block block = world.getType(i, j - 1, k); - - return block == Blocks.MYCEL || block == Blocks.DIRT && world.getData(i, j - 1, k) == 2 || world.j(i, j, k) < 13 && this.a(block); - } else { - return false; - } - } - - public boolean grow(World world, int i, int j, int k, Random random) { - int l = world.getData(i, j, k); - world.setAir(i, j, k); - WorldGenHugeMushroom worldgenhugemushroom = null; - - if (this == Blocks.BROWN_MUSHROOM) { - BlockSapling.treeType = TreeType.BROWN_MUSHROOM; // CraftBukkit - worldgenhugemushroom = new WorldGenHugeMushroom(0); - } else if (this == Blocks.RED_MUSHROOM) { - BlockSapling.treeType = TreeType.RED_MUSHROOM; // CraftBukkit - worldgenhugemushroom = new WorldGenHugeMushroom(1); - } - - if (worldgenhugemushroom != null && worldgenhugemushroom.generate(world, random, i, j, k)) { - return true; - } else { - world.setTypeAndData(i, j, k, this, l, 3); - return false; - } - } - - public boolean a(World world, int i, int j, int k, boolean flag) { - return true; - } - - public boolean a(World world, Random random, int i, int j, int k) { - return (double) random.nextFloat() < 0.4D; - } - - public void b(World world, Random random, int i, int j, int k) { - this.grow(world, i, j, k, random); - } -} diff --git a/src/main/java/net/minecraft/server/BlockMycel.java b/src/main/java/net/minecraft/server/BlockMycel.java deleted file mode 100644 index a01a6e62a0..0000000000 --- a/src/main/java/net/minecraft/server/BlockMycel.java +++ /dev/null @@ -1,64 +0,0 @@ -package net.minecraft.server; - -import java.util.Random; - -// CraftBukkit start -import org.bukkit.block.BlockState; -import org.bukkit.craftbukkit.util.CraftMagicNumbers; -import org.bukkit.event.block.BlockFadeEvent; -import org.bukkit.event.block.BlockSpreadEvent; -// CraftBukkit end - -public class BlockMycel extends Block { - - protected BlockMycel() { - super(Material.GRASS); - this.a(true); - this.a(CreativeModeTab.b); - } - - public void a(World world, int i, int j, int k, Random random) { - if (!world.isStatic) { - if (world.getLightLevel(i, j + 1, k) < 4 && world.getType(i, j + 1, k).k() > 2) { - // CraftBukkit start - org.bukkit.World bworld = world.getWorld(); - BlockState blockState = bworld.getBlockAt(i, j, k).getState(); - blockState.setType(CraftMagicNumbers.getMaterial(Blocks.DIRT)); - - BlockFadeEvent event = new BlockFadeEvent(blockState.getBlock(), blockState); - world.getServer().getPluginManager().callEvent(event); - - if (!event.isCancelled()) { - blockState.update(true); - } - // CraftBukkit end - } else if (world.getLightLevel(i, j + 1, k) >= 9) { - for (int l = 0; l < 4; ++l) { - int i1 = i + random.nextInt(3) - 1; - int j1 = j + random.nextInt(5) - 3; - int k1 = k + random.nextInt(3) - 1; - Block block = world.getType(i1, j1 + 1, k1); - - if (world.getType(i1, j1, k1) == Blocks.DIRT && world.getData(i1, j1, k1) == 0 && world.getLightLevel(i1, j1 + 1, k1) >= 4 && block.k() <= 2) { - // CraftBukkit start - org.bukkit.World bworld = world.getWorld(); - BlockState blockState = bworld.getBlockAt(i1, j1, k1).getState(); - blockState.setType(CraftMagicNumbers.getMaterial(this)); - - BlockSpreadEvent event = new BlockSpreadEvent(blockState.getBlock(), bworld.getBlockAt(i, j, k), blockState); - world.getServer().getPluginManager().callEvent(event); - - if (!event.isCancelled()) { - blockState.update(true); - } - // CraftBukkit end - } - } - } - } - } - - public Item getDropType(int i, Random random, int j) { - return Blocks.DIRT.getDropType(0, random, j); - } -} diff --git a/src/main/java/net/minecraft/server/BlockNetherWart.java b/src/main/java/net/minecraft/server/BlockNetherWart.java deleted file mode 100644 index ea12b91724..0000000000 --- a/src/main/java/net/minecraft/server/BlockNetherWart.java +++ /dev/null @@ -1,62 +0,0 @@ -package net.minecraft.server; - -import java.util.Random; - -public class BlockNetherWart extends BlockPlant { - - protected BlockNetherWart() { - this.a(true); - float f = 0.5F; - - this.a(0.5F - f, 0.0F, 0.5F - f, 0.5F + f, 0.25F, 0.5F + f); - this.a((CreativeModeTab) null); - } - - protected boolean a(Block block) { - return block == Blocks.SOUL_SAND; - } - - public boolean j(World world, int i, int j, int k) { - return this.a(world.getType(i, j - 1, k)); - } - - public void a(World world, int i, int j, int k, Random random) { - int l = world.getData(i, j, k); - - if (l < 3 && random.nextInt(10) == 0) { - ++l; - org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockGrowEvent(world, i, j, k, this, l); // CraftBukkit - } - - super.a(world, i, j, k, random); - } - - public int b() { - return 6; - } - - public void dropNaturally(World world, int i, int j, int k, int l, float f, int i1) { - if (!world.isStatic) { - int j1 = 1; - - if (l >= 3) { - j1 = 2 + world.random.nextInt(3); - if (i1 > 0) { - j1 += world.random.nextInt(i1 + 1); - } - } - - for (int k1 = 0; k1 < j1; ++k1) { - this.a(world, i, j, k, new ItemStack(Items.NETHER_STALK)); - } - } - } - - public Item getDropType(int i, Random random, int j) { - return null; - } - - public int a(Random random) { - return 0; - } -} diff --git a/src/main/java/net/minecraft/server/BlockOre.java b/src/main/java/net/minecraft/server/BlockOre.java deleted file mode 100644 index 42f44006d5..0000000000 --- a/src/main/java/net/minecraft/server/BlockOre.java +++ /dev/null @@ -1,83 +0,0 @@ -package net.minecraft.server; - -import java.util.Random; - -public class BlockOre extends Block { - - public BlockOre() { - super(Material.STONE); - this.a(CreativeModeTab.b); - } - - public Item getDropType(int i, Random random, int j) { - return this == Blocks.COAL_ORE ? Items.COAL : (this == Blocks.DIAMOND_ORE ? Items.DIAMOND : (this == Blocks.LAPIS_ORE ? Items.INK_SACK : (this == Blocks.EMERALD_ORE ? Items.EMERALD : (this == Blocks.QUARTZ_ORE ? Items.QUARTZ : Item.getItemOf(this))))); - } - - public int a(Random random) { - return this == Blocks.LAPIS_ORE ? 4 + random.nextInt(5) : 1; - } - - public int getDropCount(int i, Random random) { - if (i > 0 && Item.getItemOf(this) != this.getDropType(0, random, i)) { - int j = random.nextInt(i + 2) - 1; - - if (j < 0) { - j = 0; - } - - return this.a(random) * (j + 1); - } else { - return this.a(random); - } - } - - public void dropNaturally(World world, int i, int j, int k, int l, float f, int i1) { - super.dropNaturally(world, i, j, k, l, f, i1); - /* CraftBukkit start - Delegated to getExpDrop - if (this.getDropType(l, world.random, i1) != Item.getItemOf(this)) { - int j1 = 0; - - if (this == Blocks.COAL_ORE) { - j1 = MathHelper.nextInt(world.random, 0, 2); - } else if (this == Blocks.DIAMOND_ORE) { - j1 = MathHelper.nextInt(world.random, 3, 7); - } else if (this == Blocks.EMERALD_ORE) { - j1 = MathHelper.nextInt(world.random, 3, 7); - } else if (this == Blocks.LAPIS_ORE) { - j1 = MathHelper.nextInt(world.random, 2, 5); - } else if (this == Blocks.QUARTZ_ORE) { - j1 = MathHelper.nextInt(world.random, 2, 5); - } - - this.dropExperience(world, i, j, k, j1); - } - // */ - } - - public int getExpDrop(World world, int l, int i1) { - if (this.getDropType(l, world.random, i1) != Item.getItemOf(this)) { - int j1 = 0; - - if (this == Blocks.COAL_ORE) { - j1 = MathHelper.nextInt(world.random, 0, 2); - } else if (this == Blocks.DIAMOND_ORE) { - j1 = MathHelper.nextInt(world.random, 3, 7); - } else if (this == Blocks.EMERALD_ORE) { - j1 = MathHelper.nextInt(world.random, 3, 7); - } else if (this == Blocks.LAPIS_ORE) { - j1 = MathHelper.nextInt(world.random, 2, 5); - } else if (this == Blocks.QUARTZ_ORE) { - j1 = MathHelper.nextInt(world.random, 2, 5); - } - - return j1; - } - - return 0; - // CraftBukkit end - } - - public int getDropData(int i) { - return this == Blocks.LAPIS_ORE ? 4 : 0; - } -} diff --git a/src/main/java/net/minecraft/server/BlockPiston.java b/src/main/java/net/minecraft/server/BlockPiston.java deleted file mode 100644 index 8d8963cca1..0000000000 --- a/src/main/java/net/minecraft/server/BlockPiston.java +++ /dev/null @@ -1,400 +0,0 @@ -package net.minecraft.server; - -import java.util.List; - -// CraftBukkit start -import org.bukkit.craftbukkit.block.CraftBlock; -import org.bukkit.event.block.BlockPistonRetractEvent; -import org.bukkit.event.block.BlockPistonExtendEvent; -// CraftBukkit end - -public class BlockPiston extends Block { - - private final boolean a; - - public BlockPiston(boolean flag) { - super(Material.PISTON); - this.a = flag; - this.a(i); - this.c(0.5F); - this.a(CreativeModeTab.d); - } - - public int b() { - return 16; - } - - public boolean c() { - return false; - } - - public boolean interact(World world, int i, int j, int k, EntityHuman entityhuman, int l, float f, float f1, float f2) { - return false; - } - - public void postPlace(World world, int i, int j, int k, EntityLiving entityliving, ItemStack itemstack) { - int l = a(world, i, j, k, entityliving); - - world.setData(i, j, k, l, 2); - if (!world.isStatic) { - this.e(world, i, j, k); - } - } - - public void doPhysics(World world, int i, int j, int k, Block block) { - if (!world.isStatic) { - this.e(world, i, j, k); - } - } - - public void onPlace(World world, int i, int j, int k) { - if (!world.isStatic && world.getTileEntity(i, j, k) == null) { - this.e(world, i, j, k); - } - } - - private void e(World world, int i, int j, int k) { - int l = world.getData(i, j, k); - int i1 = b(l); - - if (i1 != 7) { - boolean flag = this.a(world, i, j, k, i1); - - if (flag && !c(l)) { - // CraftBukkit start - int length = h(world, i, j, k, i1); - if (length >= 0) { - org.bukkit.block.Block block = world.getWorld().getBlockAt(i, j, k); - BlockPistonExtendEvent event = new BlockPistonExtendEvent(block, length, CraftBlock.notchToBlockFace(i1)); - world.getServer().getPluginManager().callEvent(event); - - if (event.isCancelled()) { - return; - } - // CraftBukkit end - - world.playBlockAction(i, j, k, this, 0, i1); - } - } else if (!flag && c(l)) { - // CraftBukkit start - org.bukkit.block.Block block = world.getWorld().getBlockAt(i, j, k); - BlockPistonRetractEvent event = new BlockPistonRetractEvent(block, CraftBlock.notchToBlockFace(i1)); - world.getServer().getPluginManager().callEvent(event); - - if (event.isCancelled()) { - return; - } - // CraftBukkit end - - world.setData(i, j, k, i1, 2); - world.playBlockAction(i, j, k, this, 1, i1); - } - } - } - - private boolean a(World world, int i, int j, int k, int l) { - return l != 0 && world.isBlockFacePowered(i, j - 1, k, 0) ? true : (l != 1 && world.isBlockFacePowered(i, j + 1, k, 1) ? true : (l != 2 && world.isBlockFacePowered(i, j, k - 1, 2) ? true : (l != 3 && world.isBlockFacePowered(i, j, k + 1, 3) ? true : (l != 5 && world.isBlockFacePowered(i + 1, j, k, 5) ? true : (l != 4 && world.isBlockFacePowered(i - 1, j, k, 4) ? true : (world.isBlockFacePowered(i, j, k, 0) ? true : (world.isBlockFacePowered(i, j + 2, k, 1) ? true : (world.isBlockFacePowered(i, j + 1, k - 1, 2) ? true : (world.isBlockFacePowered(i, j + 1, k + 1, 3) ? true : (world.isBlockFacePowered(i - 1, j + 1, k, 4) ? true : world.isBlockFacePowered(i + 1, j + 1, k, 5))))))))))); - } - - public boolean a(World world, int i, int j, int k, int l, int i1) { - if (!world.isStatic) { - boolean flag = this.a(world, i, j, k, i1); - - if (flag && l == 1) { - world.setData(i, j, k, i1 | 8, 2); - return false; - } - - if (!flag && l == 0) { - return false; - } - } - - if (l == 0) { - if (!this.i(world, i, j, k, i1)) { - return false; - } - - world.setData(i, j, k, i1 | 8, 2); - world.makeSound((double) i + 0.5D, (double) j + 0.5D, (double) k + 0.5D, "tile.piston.out", 0.5F, world.random.nextFloat() * 0.25F + 0.6F); - } else if (l == 1) { - TileEntity tileentity = world.getTileEntity(i + Facing.b[i1], j + Facing.c[i1], k + Facing.d[i1]); - - if (tileentity instanceof TileEntityPiston) { - ((TileEntityPiston) tileentity).f(); - } - - world.setTypeAndData(i, j, k, Blocks.PISTON_MOVING, i1, 3); - world.setTileEntity(i, j, k, BlockPistonMoving.a(this, i1, i1, false, true)); - if (this.a) { - int j1 = i + Facing.b[i1] * 2; - int k1 = j + Facing.c[i1] * 2; - int l1 = k + Facing.d[i1] * 2; - Block block = world.getType(j1, k1, l1); - int i2 = world.getData(j1, k1, l1); - boolean flag1 = false; - - if (block == Blocks.PISTON_MOVING) { - TileEntity tileentity1 = world.getTileEntity(j1, k1, l1); - - if (tileentity1 instanceof TileEntityPiston) { - TileEntityPiston tileentitypiston = (TileEntityPiston) tileentity1; - - if (tileentitypiston.c() == i1 && tileentitypiston.b()) { - tileentitypiston.f(); - block = tileentitypiston.a(); - i2 = tileentitypiston.p(); - flag1 = true; - } - } - } - - if (!flag1 && block.getMaterial() != Material.AIR && a(block, world, j1, k1, l1, false) && (block.h() == 0 || block == Blocks.PISTON || block == Blocks.PISTON_STICKY)) { - i += Facing.b[i1]; - j += Facing.c[i1]; - k += Facing.d[i1]; - world.setTypeAndData(i, j, k, Blocks.PISTON_MOVING, i2, 3); - world.setTileEntity(i, j, k, BlockPistonMoving.a(block, i2, i1, false, false)); - world.setAir(j1, k1, l1); - } else if (!flag1) { - world.setAir(i + Facing.b[i1], j + Facing.c[i1], k + Facing.d[i1]); - } - } else { - world.setAir(i + Facing.b[i1], j + Facing.c[i1], k + Facing.d[i1]); - } - - world.makeSound((double) i + 0.5D, (double) j + 0.5D, (double) k + 0.5D, "tile.piston.in", 0.5F, world.random.nextFloat() * 0.15F + 0.6F); - } - - return true; - } - - public void updateShape(IBlockAccess iblockaccess, int i, int j, int k) { - int l = iblockaccess.getData(i, j, k); - - if (c(l)) { - float f = 0.25F; - - switch (b(l)) { - case 0: - this.a(0.0F, 0.25F, 0.0F, 1.0F, 1.0F, 1.0F); - break; - - case 1: - this.a(0.0F, 0.0F, 0.0F, 1.0F, 0.75F, 1.0F); - break; - - case 2: - this.a(0.0F, 0.0F, 0.25F, 1.0F, 1.0F, 1.0F); - break; - - case 3: - this.a(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 0.75F); - break; - - case 4: - this.a(0.25F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F); - break; - - case 5: - this.a(0.0F, 0.0F, 0.0F, 0.75F, 1.0F, 1.0F); - } - } else { - this.a(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F); - } - } - - public void g() { - this.a(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F); - } - - public void a(World world, int i, int j, int k, AxisAlignedBB axisalignedbb, List list, Entity entity) { - this.a(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F); - super.a(world, i, j, k, axisalignedbb, list, entity); - } - - public AxisAlignedBB a(World world, int i, int j, int k) { - this.updateShape(world, i, j, k); - return super.a(world, i, j, k); - } - - public boolean d() { - return false; - } - - public static int b(int i) { - if ((i & 7) >= Facing.OPPOSITE_FACING.length) return 7; // CraftBukkit - check for AIOOB on piston data - return i & 7; - } - - public static boolean c(int i) { - return (i & 8) != 0; - } - - public static int a(World world, int i, int j, int k, EntityLiving entityliving) { - if (MathHelper.abs((float) entityliving.locX - (float) i) < 2.0F && MathHelper.abs((float) entityliving.locZ - (float) k) < 2.0F) { - double d0 = entityliving.locY + 1.82D - (double) entityliving.height; - - if (d0 - (double) j > 2.0D) { - return 1; - } - - if ((double) j - d0 > 0.0D) { - return 0; - } - } - - int l = MathHelper.floor((double) (entityliving.yaw * 4.0F / 360.0F) + 0.5D) & 3; - - return l == 0 ? 2 : (l == 1 ? 5 : (l == 2 ? 3 : (l == 3 ? 4 : 0))); - } - - private static boolean a(Block block, World world, int i, int j, int k, boolean flag) { - if (block == Blocks.OBSIDIAN) { - return false; - } else { - if (block != Blocks.PISTON && block != Blocks.PISTON_STICKY) { - if (block.f(world, i, j, k) == -1.0F) { - return false; - } - - if (block.h() == 2) { - return false; - } - - if (block.h() == 1) { - if (!flag) { - return false; - } - - return true; - } - } else if (c(world.getData(i, j, k))) { - return false; - } - - return !(block instanceof IContainer); - } - } - - // CraftBukkit - boolean -> int return - private static int h(World world, int i, int j, int k, int l) { - int i1 = i + Facing.b[l]; - int j1 = j + Facing.c[l]; - int k1 = k + Facing.d[l]; - int l1 = 0; - - while (true) { - if (l1 < 13) { - if (j1 <= 0 || j1 >= 255) { - return -1; // CraftBukkit - } - - Block block = world.getType(i1, j1, k1); - - if (block.getMaterial() != Material.AIR) { - if (!a(block, world, i1, j1, k1, true)) { - return -1; // CraftBukkit - } - - if (block.h() != 1) { - if (l1 == 12) { - return -1; // CraftBukkit - } - - i1 += Facing.b[l]; - j1 += Facing.c[l]; - k1 += Facing.d[l]; - ++l1; - continue; - } - } - } - - return l1; // CraftBukkit - } - } - - private boolean i(World world, int i, int j, int k, int l) { - int i1 = i + Facing.b[l]; - int j1 = j + Facing.c[l]; - int k1 = k + Facing.d[l]; - int l1 = 0; - - while (true) { - if (l1 < 13) { - if (j1 <= 0 || j1 >= 255) { - return false; - } - - Block block = world.getType(i1, j1, k1); - - if (block.getMaterial() != Material.AIR) { - if (!a(block, world, i1, j1, k1, true)) { - return false; - } - - if (block.h() != 1) { - if (l1 == 12) { - return false; - } - - i1 += Facing.b[l]; - j1 += Facing.c[l]; - k1 += Facing.d[l]; - ++l1; - continue; - } - - block.b(world, i1, j1, k1, world.getData(i1, j1, k1), 0); - world.setAir(i1, j1, k1); - } - } - - l1 = i1; - int i2 = j1; - int j2 = k1; - int k2 = 0; - - Block[] ablock; - int l2; - int i3; - int j3; - - for (ablock = new Block[13]; i1 != i || j1 != j || k1 != k; k1 = j3) { - l2 = i1 - Facing.b[l]; - i3 = j1 - Facing.c[l]; - j3 = k1 - Facing.d[l]; - Block block1 = world.getType(l2, i3, j3); - int k3 = world.getData(l2, i3, j3); - - if (block1 == this && l2 == i && i3 == j && j3 == k) { - world.setTypeAndData(i1, j1, k1, Blocks.PISTON_MOVING, l | (this.a ? 8 : 0), 4); - world.setTileEntity(i1, j1, k1, BlockPistonMoving.a(Blocks.PISTON_EXTENSION, l | (this.a ? 8 : 0), l, true, false)); - } else { - world.setTypeAndData(i1, j1, k1, Blocks.PISTON_MOVING, k3, 4); - world.setTileEntity(i1, j1, k1, BlockPistonMoving.a(block1, k3, l, true, false)); - } - - ablock[k2++] = block1; - i1 = l2; - j1 = i3; - } - - i1 = l1; - j1 = i2; - k1 = j2; - - for (k2 = 0; i1 != i || j1 != j || k1 != k; k1 = j3) { - l2 = i1 - Facing.b[l]; - i3 = j1 - Facing.c[l]; - j3 = k1 - Facing.d[l]; - world.applyPhysics(l2, i3, j3, ablock[k2++]); - i1 = l2; - j1 = i3; - } - - return true; - } - } -} diff --git a/src/main/java/net/minecraft/server/BlockPistonExtension.java b/src/main/java/net/minecraft/server/BlockPistonExtension.java deleted file mode 100644 index cb7455da28..0000000000 --- a/src/main/java/net/minecraft/server/BlockPistonExtension.java +++ /dev/null @@ -1,169 +0,0 @@ -package net.minecraft.server; - -import java.util.List; -import java.util.Random; - -public class BlockPistonExtension extends Block { - - public BlockPistonExtension() { - super(Material.PISTON); - this.a(i); - this.c(0.5F); - } - - public void a(World world, int i, int j, int k, int l, EntityHuman entityhuman) { - if (entityhuman.abilities.canInstantlyBuild) { - int i1 = b(l); - Block block = world.getType(i - Facing.b[i1], j - Facing.c[i1], k - Facing.d[i1]); - - if (block == Blocks.PISTON || block == Blocks.PISTON_STICKY) { - world.setAir(i - Facing.b[i1], j - Facing.c[i1], k - Facing.d[i1]); - } - } - - super.a(world, i, j, k, l, entityhuman); - } - - public void remove(World world, int i, int j, int k, Block block, int l) { - super.remove(world, i, j, k, block, l); - if ((l & 7) >= Facing.OPPOSITE_FACING.length) return; // CraftBukkit - fix a piston AIOOBE issue - int i1 = Facing.OPPOSITE_FACING[b(l)]; - - i += Facing.b[i1]; - j += Facing.c[i1]; - k += Facing.d[i1]; - Block block1 = world.getType(i, j, k); - - if (block1 == Blocks.PISTON || block1 == Blocks.PISTON_STICKY) { - l = world.getData(i, j, k); - if (BlockPiston.c(l)) { - block1.b(world, i, j, k, l, 0); - world.setAir(i, j, k); - } - } - } - - public int b() { - return 17; - } - - public boolean c() { - return false; - } - - public boolean d() { - return false; - } - - public boolean canPlace(World world, int i, int j, int k) { - return false; - } - - public boolean canPlace(World world, int i, int j, int k, int l) { - return false; - } - - public int a(Random random) { - return 0; - } - - public void a(World world, int i, int j, int k, AxisAlignedBB axisalignedbb, List list, Entity entity) { - int l = world.getData(i, j, k); - float f = 0.25F; - float f1 = 0.375F; - float f2 = 0.625F; - float f3 = 0.25F; - float f4 = 0.75F; - - switch (b(l)) { - case 0: - this.a(0.0F, 0.0F, 0.0F, 1.0F, 0.25F, 1.0F); - super.a(world, i, j, k, axisalignedbb, list, entity); - this.a(0.375F, 0.25F, 0.375F, 0.625F, 1.0F, 0.625F); - super.a(world, i, j, k, axisalignedbb, list, entity); - break; - - case 1: - this.a(0.0F, 0.75F, 0.0F, 1.0F, 1.0F, 1.0F); - super.a(world, i, j, k, axisalignedbb, list, entity); - this.a(0.375F, 0.0F, 0.375F, 0.625F, 0.75F, 0.625F); - super.a(world, i, j, k, axisalignedbb, list, entity); - break; - - case 2: - this.a(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 0.25F); - super.a(world, i, j, k, axisalignedbb, list, entity); - this.a(0.25F, 0.375F, 0.25F, 0.75F, 0.625F, 1.0F); - super.a(world, i, j, k, axisalignedbb, list, entity); - break; - - case 3: - this.a(0.0F, 0.0F, 0.75F, 1.0F, 1.0F, 1.0F); - super.a(world, i, j, k, axisalignedbb, list, entity); - this.a(0.25F, 0.375F, 0.0F, 0.75F, 0.625F, 0.75F); - super.a(world, i, j, k, axisalignedbb, list, entity); - break; - - case 4: - this.a(0.0F, 0.0F, 0.0F, 0.25F, 1.0F, 1.0F); - super.a(world, i, j, k, axisalignedbb, list, entity); - this.a(0.375F, 0.25F, 0.25F, 0.625F, 0.75F, 1.0F); - super.a(world, i, j, k, axisalignedbb, list, entity); - break; - - case 5: - this.a(0.75F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F); - super.a(world, i, j, k, axisalignedbb, list, entity); - this.a(0.0F, 0.375F, 0.25F, 0.75F, 0.625F, 0.75F); - super.a(world, i, j, k, axisalignedbb, list, entity); - } - - this.a(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F); - } - - public void updateShape(IBlockAccess iblockaccess, int i, int j, int k) { - int l = iblockaccess.getData(i, j, k); - float f = 0.25F; - - switch (b(l)) { - case 0: - this.a(0.0F, 0.0F, 0.0F, 1.0F, 0.25F, 1.0F); - break; - - case 1: - this.a(0.0F, 0.75F, 0.0F, 1.0F, 1.0F, 1.0F); - break; - - case 2: - this.a(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 0.25F); - break; - - case 3: - this.a(0.0F, 0.0F, 0.75F, 1.0F, 1.0F, 1.0F); - break; - - case 4: - this.a(0.0F, 0.0F, 0.0F, 0.25F, 1.0F, 1.0F); - break; - - case 5: - this.a(0.75F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F); - } - } - - public void doPhysics(World world, int i, int j, int k, Block block) { - int l = b(world.getData(i, j, k)); - if ((l & 7) >= Facing.OPPOSITE_FACING.length) return; // CraftBukkit - fix a piston AIOOBE issue - Block block1 = world.getType(i - Facing.b[l], j - Facing.c[l], k - Facing.d[l]); - - if (block1 != Blocks.PISTON && block1 != Blocks.PISTON_STICKY) { - world.setAir(i, j, k); - } else { - block1.doPhysics(world, i - Facing.b[l], j - Facing.c[l], k - Facing.d[l], block); - } - } - - public static int b(int i) { - return MathHelper.a(i & 7, 0, Facing.b.length - 1); - } -} diff --git a/src/main/java/net/minecraft/server/BlockPortal.java b/src/main/java/net/minecraft/server/BlockPortal.java deleted file mode 100644 index bec5aa8a50..0000000000 --- a/src/main/java/net/minecraft/server/BlockPortal.java +++ /dev/null @@ -1,122 +0,0 @@ -package net.minecraft.server; - -import java.util.Random; - -import org.bukkit.event.entity.EntityPortalEnterEvent; // CraftBukkit - -public class BlockPortal extends BlockHalfTransparent { - - public static final int[][] a = new int[][] { new int[0], { 3, 1}, { 2, 0}}; - - public BlockPortal() { - super("portal", Material.PORTAL, false); - this.a(true); - } - - public void a(World world, int i, int j, int k, Random random) { - super.a(world, i, j, k, random); - if (world.worldProvider.d() && world.getGameRules().getBoolean("doMobSpawning") && random.nextInt(2000) < world.difficulty.a()) { - int l; - - for (l = j; !World.a((IBlockAccess) world, i, l, k) && l > 0; --l) { - ; - } - - if (l > 0 && !world.getType(i, l + 1, k).r()) { - // CraftBukkit - set spawn reason to NETHER_PORTAL - Entity entity = ItemMonsterEgg.spawnCreature(world, 57, (double) i + 0.5D, (double) l + 1.1D, (double) k + 0.5D, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.NETHER_PORTAL); - - if (entity != null) { - entity.portalCooldown = entity.ai(); - } - } - } - } - - public AxisAlignedBB a(World world, int i, int j, int k) { - return null; - } - - public void updateShape(IBlockAccess iblockaccess, int i, int j, int k) { - int l = b(iblockaccess.getData(i, j, k)); - - if (l == 0) { - if (iblockaccess.getType(i - 1, j, k) != this && iblockaccess.getType(i + 1, j, k) != this) { - l = 2; - } else { - l = 1; - } - - if (iblockaccess instanceof World && !((World) iblockaccess).isStatic) { - ((World) iblockaccess).setData(i, j, k, l, 2); - } - } - - float f = 0.125F; - float f1 = 0.125F; - - if (l == 1) { - f = 0.5F; - } - - if (l == 2) { - f1 = 0.5F; - } - - this.a(0.5F - f, 0.0F, 0.5F - f1, 0.5F + f, 1.0F, 0.5F + f1); - } - - public boolean d() { - return false; - } - - public boolean e(World world, int i, int j, int k) { - PortalCreator portalcreator = new PortalCreator(world, i, j, k, 1); - PortalCreator portalcreator1 = new PortalCreator(world, i, j, k, 2); - - if (portalcreator.b() && PortalCreator.a(portalcreator) == 0) { - // CraftBukkit start - return portalcreator - return portalcreator.c(); - // return true; - } else if (portalcreator1.b() && PortalCreator.a(portalcreator1) == 0) { - return portalcreator1.c(); - // return true; - // CraftBukkit end - } else { - return false; - } - } - - public void doPhysics(World world, int i, int j, int k, Block block) { - int l = b(world.getData(i, j, k)); - PortalCreator portalcreator = new PortalCreator(world, i, j, k, 1); - PortalCreator portalcreator1 = new PortalCreator(world, i, j, k, 2); - - if (l == 1 && (!portalcreator.b() || PortalCreator.a(portalcreator) < PortalCreator.b(portalcreator) * PortalCreator.c(portalcreator))) { - world.setTypeUpdate(i, j, k, Blocks.AIR); - } else if (l == 2 && (!portalcreator1.b() || PortalCreator.a(portalcreator1) < PortalCreator.b(portalcreator1) * PortalCreator.c(portalcreator1))) { - world.setTypeUpdate(i, j, k, Blocks.AIR); - } else if (l == 0 && !portalcreator.b() && !portalcreator1.b()) { - world.setTypeUpdate(i, j, k, Blocks.AIR); - } - } - - public int a(Random random) { - return 0; - } - - public void a(World world, int i, int j, int k, Entity entity) { - if (entity.vehicle == null && entity.passenger == null) { - // CraftBukkit start - Entity in portal - EntityPortalEnterEvent event = new EntityPortalEnterEvent(entity.getBukkitEntity(), new org.bukkit.Location(world.getWorld(), i, j, k)); - world.getServer().getPluginManager().callEvent(event); - // CraftBukkit end - - entity.ah(); - } - } - - public static int b(int i) { - return i & 3; - } -} diff --git a/src/main/java/net/minecraft/server/BlockPoweredRail.java b/src/main/java/net/minecraft/server/BlockPoweredRail.java deleted file mode 100644 index cd20905862..0000000000 --- a/src/main/java/net/minecraft/server/BlockPoweredRail.java +++ /dev/null @@ -1,146 +0,0 @@ -package net.minecraft.server; - -import org.bukkit.craftbukkit.event.CraftEventFactory; // CraftBukkit - -public class BlockPoweredRail extends BlockMinecartTrackAbstract { - protected BlockPoweredRail() { - super(true); - } - - protected boolean a(World world, int i, int j, int k, int l, boolean flag, int i1) { - if (i1 >= 8) { - return false; - } else { - int j1 = l & 0x7; - boolean flag1 = true; - - switch (j1) { - case 0: - if (flag) { - ++k; - } else { - --k; - } - break; - - case 1: - if (flag) { - --i; - } else { - ++i; - } - break; - - case 2: - if (flag) { - i--; - } else { - ++i; - ++j; - flag1 = false; - } - - j1 = 1; - break; - - case 3: - if (flag) { - --i; - ++j; - flag1 = false; - } else { - ++i; - } - - j1 = 1; - break; - - case 4: - if (flag) { - ++k; - } else { - --k; - ++j; - flag1 = false; - } - - j1 = 0; - break; - - case 5: - if (flag) { - ++k; - ++j; - flag1 = false; - } else { - --k; - } - - j1 = 0; - } - - return this.a(world, i, j, k, flag, i1, j1) ? true : flag1 && this.a(world, i, j - 1, k, flag, i1, j1); - } - } - - protected boolean a(World world, int i, int j, int k, boolean flag, int l, int i1) { - Block block = world.getType(i, j, k); - - if (block == this) { - int j1 = world.getData(i, j, k); - int k1 = j1 & 0x7; - - if (i1 == 1 && (k1 == 0 || k1 == 4 || k1 == 5)) { - return false; - } - - if (i1 == 0 && (k1 == 1 || k1 == 2 || k1 == 3)) { - return false; - } - - if ((j1 & 0x8) != 0) { - if (world.isBlockIndirectlyPowered(i, j, k)) { - return true; - } - - return this.a(world, i, j, k, j1, flag, l + 1); - } - } - - return false; - } - - protected void a(World world, int i, int j, int k, int l, int i1, Block block) { - boolean flag = world.isBlockIndirectlyPowered(i, j, k); - - flag = flag || this.a(world, i, j, k, l, true, 0) || this.a(world, i, j, k, l, false, 0); - boolean flag1 = false; - - if (flag && (l & 0x8) == 0) { - // CraftBukkit start - if (CraftEventFactory.callRedstoneChange(world, i, j, k, 0, 15).getNewCurrent() <= 0) { - return; - } - // CraftBukkit end - - world.setData(i, j, k, i1 | 0x8, 3); - flag1 = true; - } else if (!flag && (l & 0x8) != 0) { - // CraftBukkit start - if (CraftEventFactory.callRedstoneChange(world, i, j, k, 15, 0).getNewCurrent() > 0) { - return; - } - // CraftBukkit end - - world.setData(i, j, k, i1, 3); - flag1 = true; - } - - if (flag1) { - world.applyPhysics(i, j - 1, k, this); - if (i1 == 2 || i1 == 3 || i1 == 4 || i1 == 5) { - world.applyPhysics(i, j + 1, k, this); - } - } - } -} diff --git a/src/main/java/net/minecraft/server/BlockPressurePlateAbstract.java b/src/main/java/net/minecraft/server/BlockPressurePlateAbstract.java deleted file mode 100644 index c2dfc861b7..0000000000 --- a/src/main/java/net/minecraft/server/BlockPressurePlateAbstract.java +++ /dev/null @@ -1,174 +0,0 @@ -package net.minecraft.server; - -import java.util.Random; - -import org.bukkit.event.block.BlockRedstoneEvent; // CraftBukkit - -public abstract class BlockPressurePlateAbstract extends Block { - - private String a; - - protected BlockPressurePlateAbstract(String s, Material material) { - super(material); - this.a = s; - this.a(CreativeModeTab.d); - this.a(true); - this.b(this.d(15)); - } - - public void updateShape(IBlockAccess iblockaccess, int i, int j, int k) { - this.b(iblockaccess.getData(i, j, k)); - } - - protected void b(int i) { - boolean flag = this.c(i) > 0; - float f = 0.0625F; - - if (flag) { - this.a(f, 0.0F, f, 1.0F - f, 0.03125F, 1.0F - f); - } else { - this.a(f, 0.0F, f, 1.0F - f, 0.0625F, 1.0F - f); - } - } - - public int a(World world) { - return 20; - } - - public AxisAlignedBB a(World world, int i, int j, int k) { - return null; - } - - public boolean c() { - return false; - } - - public boolean d() { - return false; - } - - public boolean b(IBlockAccess iblockaccess, int i, int j, int k) { - return true; - } - - public boolean canPlace(World world, int i, int j, int k) { - return World.a((IBlockAccess) world, i, j - 1, k) || BlockFence.a(world.getType(i, j - 1, k)); - } - - public void doPhysics(World world, int i, int j, int k, Block block) { - boolean flag = false; - - if (!World.a((IBlockAccess) world, i, j - 1, k) && !BlockFence.a(world.getType(i, j - 1, k))) { - flag = true; - } - - if (flag) { - this.b(world, i, j, k, world.getData(i, j, k), 0); - world.setAir(i, j, k); - } - } - - public void a(World world, int i, int j, int k, Random random) { - if (!world.isStatic) { - int l = this.c(world.getData(i, j, k)); - - if (l > 0) { - this.a(world, i, j, k, l); - } - } - } - - public void a(World world, int i, int j, int k, Entity entity) { - if (!world.isStatic) { - int l = this.c(world.getData(i, j, k)); - - if (l == 0) { - this.a(world, i, j, k, l); - } - } - } - - protected void a(World world, int i, int j, int k, int l) { - int i1 = this.e(world, i, j, k); - boolean flag = l > 0; - boolean flag1 = i1 > 0; - - // CraftBukkit start - Interact Pressure Plate - org.bukkit.World bworld = world.getWorld(); - org.bukkit.plugin.PluginManager manager = world.getServer().getPluginManager(); - - if (flag != flag1) { - BlockRedstoneEvent eventRedstone = new BlockRedstoneEvent(bworld.getBlockAt(i, j, k), l, i1); - manager.callEvent(eventRedstone); - - flag1 = eventRedstone.getNewCurrent() > 0; - i1 = eventRedstone.getNewCurrent(); - } - // CraftBukkit end - - if (l != i1) { - world.setData(i, j, k, this.d(i1), 2); - this.a_(world, i, j, k); - world.c(i, j, k, i, j, k); - } - - if (!flag1 && flag) { - world.makeSound((double) i + 0.5D, (double) j + 0.1D, (double) k + 0.5D, "random.click", 0.3F, 0.5F); - } else if (flag1 && !flag) { - world.makeSound((double) i + 0.5D, (double) j + 0.1D, (double) k + 0.5D, "random.click", 0.3F, 0.6F); - } - - if (flag1) { - world.a(i, j, k, this, this.a(world)); - } - } - - protected AxisAlignedBB a(int i, int j, int k) { - float f = 0.125F; - - return AxisAlignedBB.a((double) ((float) i + f), (double) j, (double) ((float) k + f), (double) ((float) (i + 1) - f), (double) j + 0.25D, (double) ((float) (k + 1) - f)); - } - - public void remove(World world, int i, int j, int k, Block block, int l) { - if (this.c(l) > 0) { - this.a_(world, i, j, k); - } - - super.remove(world, i, j, k, block, l); - } - - protected void a_(World world, int i, int j, int k) { - world.applyPhysics(i, j, k, this); - world.applyPhysics(i, j - 1, k, this); - } - - public int b(IBlockAccess iblockaccess, int i, int j, int k, int l) { - return this.c(iblockaccess.getData(i, j, k)); - } - - public int c(IBlockAccess iblockaccess, int i, int j, int k, int l) { - return l == 1 ? this.c(iblockaccess.getData(i, j, k)) : 0; - } - - public boolean isPowerSource() { - return true; - } - - public void g() { - float f = 0.5F; - float f1 = 0.125F; - float f2 = 0.5F; - - this.a(0.5F - f, 0.5F - f1, 0.5F - f2, 0.5F + f, 0.5F + f1, 0.5F + f2); - } - - public int h() { - return 1; - } - - protected abstract int e(World world, int i, int j, int k); - - protected abstract int c(int i); - - protected abstract int d(int i); -} diff --git a/src/main/java/net/minecraft/server/BlockPressurePlateBinary.java b/src/main/java/net/minecraft/server/BlockPressurePlateBinary.java deleted file mode 100644 index 25ef883d56..0000000000 --- a/src/main/java/net/minecraft/server/BlockPressurePlateBinary.java +++ /dev/null @@ -1,74 +0,0 @@ -package net.minecraft.server; - -import java.util.Iterator; -import java.util.List; - -import org.bukkit.event.entity.EntityInteractEvent; // CraftBukkit - -public class BlockPressurePlateBinary extends BlockPressurePlateAbstract { - - private EnumMobType a; - - protected BlockPressurePlateBinary(String s, Material material, EnumMobType enummobtype) { - super(s, material); - this.a = enummobtype; - } - - protected int d(int i) { - return i > 0 ? 1 : 0; - } - - protected int c(int i) { - return i == 1 ? 15 : 0; - } - - protected int e(World world, int i, int j, int k) { - List list = null; - - if (this.a == EnumMobType.EVERYTHING) { - list = world.getEntities((Entity) null, this.a(i, j, k)); - } - - if (this.a == EnumMobType.MOBS) { - list = world.a(EntityLiving.class, this.a(i, j, k)); - } - - if (this.a == EnumMobType.PLAYERS) { - list = world.a(EntityHuman.class, this.a(i, j, k)); - } - - if (list != null && !list.isEmpty()) { - Iterator iterator = list.iterator(); - - while (iterator.hasNext()) { - Entity entity = (Entity) iterator.next(); - - // CraftBukkit start - Call interact event when turning on a pressure plate - if (this.c(world.getData(i, j, k)) == 0) { - org.bukkit.World bworld = world.getWorld(); - org.bukkit.plugin.PluginManager manager = world.getServer().getPluginManager(); - org.bukkit.event.Cancellable cancellable; - - if (entity instanceof EntityHuman) { - cancellable = org.bukkit.craftbukkit.event.CraftEventFactory.callPlayerInteractEvent((EntityHuman) entity, org.bukkit.event.block.Action.PHYSICAL, i, j, k, -1, null); - } else { - cancellable = new EntityInteractEvent(entity.getBukkitEntity(), bworld.getBlockAt(i, j, k)); - manager.callEvent((EntityInteractEvent) cancellable); - } - - // We only want to block turning the plate on if all events are cancelled - if (cancellable.isCancelled()) { - continue; - } - } - // CraftBukkit end - - if (!entity.az()) { - return 15; - } - } - } - - return 0; - } -} diff --git a/src/main/java/net/minecraft/server/BlockPressurePlateWeighted.java b/src/main/java/net/minecraft/server/BlockPressurePlateWeighted.java deleted file mode 100644 index b6f22f02d9..0000000000 --- a/src/main/java/net/minecraft/server/BlockPressurePlateWeighted.java +++ /dev/null @@ -1,58 +0,0 @@ -package net.minecraft.server; - -import org.bukkit.event.entity.EntityInteractEvent; // CraftBukkit - -public class BlockPressurePlateWeighted extends BlockPressurePlateAbstract { - private final int a; - - protected BlockPressurePlateWeighted(String s, Material material, int i) { - super(s, material); - this.a = i; - } - - protected int e(World world, int i, int j, int k) { - // CraftBukkit start - int l = 0; - java.util.Iterator iterator = world.a(Entity.class, this.a(i, j, k)).iterator(); - - while (iterator.hasNext()) { - Entity entity = (Entity) iterator.next(); - - org.bukkit.event.Cancellable cancellable; - - if (entity instanceof EntityHuman) { - cancellable = org.bukkit.craftbukkit.event.CraftEventFactory.callPlayerInteractEvent((EntityHuman) entity, org.bukkit.event.block.Action.PHYSICAL, i, j, k, -1, null); - } else { - cancellable = new EntityInteractEvent(entity.getBukkitEntity(), world.getWorld().getBlockAt(i, j, k)); - world.getServer().getPluginManager().callEvent((EntityInteractEvent) cancellable); - } - - // We only want to block turning the plate on if all events are cancelled - if (!cancellable.isCancelled()) { - l++; - } - } - - l = Math.min(l, this.a); - // CraftBukkit end - - if (l <= 0) { - return 0; - } - - float f = (float) Math.min(this.a, l) / (float) this.a; - return MathHelper.f(f * 15.0F); - } - - protected int c(int i) { - return i; - } - - protected int d(int i) { - return i; - } - - public int a(World world) { - return 10; - } -} diff --git a/src/main/java/net/minecraft/server/BlockPumpkin.java b/src/main/java/net/minecraft/server/BlockPumpkin.java deleted file mode 100644 index a8632a77c6..0000000000 --- a/src/main/java/net/minecraft/server/BlockPumpkin.java +++ /dev/null @@ -1,98 +0,0 @@ -package net.minecraft.server; - -// CraftBukkit start -import org.bukkit.craftbukkit.util.BlockStateListPopulator; -import org.bukkit.event.block.BlockRedstoneEvent; -import org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason; -// CraftBukkit end - -public class BlockPumpkin extends BlockDirectional { - - private boolean a; - - protected BlockPumpkin(boolean flag) { - super(Material.PUMPKIN); - this.a(true); - this.a = flag; - this.a(CreativeModeTab.b); - } - - public void onPlace(World world, int i, int j, int k) { - super.onPlace(world, i, j, k); - if (world.getType(i, j - 1, k) == Blocks.SNOW_BLOCK && world.getType(i, j - 2, k) == Blocks.SNOW_BLOCK) { - if (!world.isStatic) { - // CraftBukkit start - Use BlockStateListPopulator - BlockStateListPopulator blockList = new BlockStateListPopulator(world.getWorld()); - - blockList.setTypeId(i, j, k, 0); - blockList.setTypeId(i, j - 1, k, 0); - blockList.setTypeId(i, j - 2, k, 0); - EntitySnowman entitysnowman = new EntitySnowman(world); - - entitysnowman.setPositionRotation((double) i + 0.5D, (double) j - 1.95D, (double) k + 0.5D, 0.0F, 0.0F); - if (world.addEntity(entitysnowman, SpawnReason.BUILD_SNOWMAN)) { - blockList.updateList(); - } - // CraftBukkit end - } - - for (int l = 0; l < 120; ++l) { - world.addParticle("snowshovel", (double) i + world.random.nextDouble(), (double) (j - 2) + world.random.nextDouble() * 2.5D, (double) k + world.random.nextDouble(), 0.0D, 0.0D, 0.0D); - } - } else if (world.getType(i, j - 1, k) == Blocks.IRON_BLOCK && world.getType(i, j - 2, k) == Blocks.IRON_BLOCK) { - boolean flag = world.getType(i - 1, j - 1, k) == Blocks.IRON_BLOCK && world.getType(i + 1, j - 1, k) == Blocks.IRON_BLOCK; - boolean flag1 = world.getType(i, j - 1, k - 1) == Blocks.IRON_BLOCK && world.getType(i, j - 1, k + 1) == Blocks.IRON_BLOCK; - - if (flag || flag1) { - // CraftBukkit start - Use BlockStateListPopulator - BlockStateListPopulator blockList = new BlockStateListPopulator(world.getWorld()); - - blockList.setTypeId(i, j, k, 0); - blockList.setTypeId(i, j - 1, k, 0); - blockList.setTypeId(i, j - 2, k, 0); - if (flag) { - blockList.setTypeId(i - 1, j - 1, k, 0); - blockList.setTypeId(i + 1, j - 1, k, 0); - } else { - blockList.setTypeId(i, j - 1, k - 1, 0); - blockList.setTypeId(i, j - 1, k + 1, 0); - } - - EntityIronGolem entityirongolem = new EntityIronGolem(world); - - entityirongolem.setPlayerCreated(true); - entityirongolem.setPositionRotation((double) i + 0.5D, (double) j - 1.95D, (double) k + 0.5D, 0.0F, 0.0F); - if (world.addEntity(entityirongolem, SpawnReason.BUILD_IRONGOLEM)) { - for (int i1 = 0; i1 < 120; ++i1) { - world.addParticle("snowballpoof", (double) i + world.random.nextDouble(), (double) (j - 2) + world.random.nextDouble() * 3.9D, (double) k + world.random.nextDouble(), 0.0D, 0.0D, 0.0D); - } - - blockList.updateList(); - } - // CraftBukkit end - } - } - } - - public boolean canPlace(World world, int i, int j, int k) { - return world.getType(i, j, k).material.isReplaceable() && World.a((IBlockAccess) world, i, j - 1, k); - } - - public void postPlace(World world, int i, int j, int k, EntityLiving entityliving, ItemStack itemstack) { - int l = MathHelper.floor((double) (entityliving.yaw * 4.0F / 360.0F) + 2.5D) & 3; - - world.setData(i, j, k, l, 2); - } - - // CraftBukkit start - public void doPhysics(World world, int i, int j, int k, Block block) { - if (block != null && block.isPowerSource()) { - org.bukkit.block.Block bukkitBlock = world.getWorld().getBlockAt(i, j, k); - int power = bukkitBlock.getBlockPower(); - - BlockRedstoneEvent eventRedstone = new BlockRedstoneEvent(bukkitBlock, power, power); - world.getServer().getPluginManager().callEvent(eventRedstone); - } - } - // CraftBukkit end -} diff --git a/src/main/java/net/minecraft/server/BlockRedstoneLamp.java b/src/main/java/net/minecraft/server/BlockRedstoneLamp.java deleted file mode 100644 index cb802e8026..0000000000 --- a/src/main/java/net/minecraft/server/BlockRedstoneLamp.java +++ /dev/null @@ -1,70 +0,0 @@ -package net.minecraft.server; - -import java.util.Random; - -import org.bukkit.craftbukkit.event.CraftEventFactory; // CraftBukkit - -public class BlockRedstoneLamp extends Block { - - private final boolean a; - - public BlockRedstoneLamp(boolean flag) { - super(Material.BUILDABLE_GLASS); - this.a = flag; - if (flag) { - this.a(1.0F); - } - } - - public void onPlace(World world, int i, int j, int k) { - if (!world.isStatic) { - if (this.a && !world.isBlockIndirectlyPowered(i, j, k)) { - world.a(i, j, k, this, 4); - } else if (!this.a && world.isBlockIndirectlyPowered(i, j, k)) { - // CraftBukkit start - if (CraftEventFactory.callRedstoneChange(world, i, j, k, 0, 15).getNewCurrent() != 15) { - return; - } - // CraftBukkit end - - world.setTypeAndData(i, j, k, Blocks.REDSTONE_LAMP_ON, 0, 2); - } - } - } - - public void doPhysics(World world, int i, int j, int k, Block block) { - if (!world.isStatic) { - if (this.a && !world.isBlockIndirectlyPowered(i, j, k)) { - world.a(i, j, k, this, 4); - } else if (!this.a && world.isBlockIndirectlyPowered(i, j, k)) { - // CraftBukkit start - if (CraftEventFactory.callRedstoneChange(world, i, j, k, 0, 15).getNewCurrent() != 15) { - return; - } - // CraftBukkit end - - world.setTypeAndData(i, j, k, Blocks.REDSTONE_LAMP_ON, 0, 2); - } - } - } - - public void a(World world, int i, int j, int k, Random random) { - if (!world.isStatic && this.a && !world.isBlockIndirectlyPowered(i, j, k)) { - // CraftBukkit start - if (CraftEventFactory.callRedstoneChange(world, i, j, k, 15, 0).getNewCurrent() != 0) { - return; - } - // CraftBukkit end - - world.setTypeAndData(i, j, k, Blocks.REDSTONE_LAMP_OFF, 0, 2); - } - } - - public Item getDropType(int i, Random random, int j) { - return Item.getItemOf(Blocks.REDSTONE_LAMP_OFF); - } - - protected ItemStack j(int i) { - return new ItemStack(Blocks.REDSTONE_LAMP_OFF); - } -} diff --git a/src/main/java/net/minecraft/server/BlockRedstoneOre.java b/src/main/java/net/minecraft/server/BlockRedstoneOre.java deleted file mode 100644 index 0cd2e04efc..0000000000 --- a/src/main/java/net/minecraft/server/BlockRedstoneOre.java +++ /dev/null @@ -1,155 +0,0 @@ -package net.minecraft.server; - -import java.util.Random; - -// CraftBukkit start -import org.bukkit.craftbukkit.event.CraftEventFactory; -import org.bukkit.event.entity.EntityInteractEvent; -// CraftBukkit end - -public class BlockRedstoneOre extends Block { - - private boolean a; - - public BlockRedstoneOre(boolean flag) { - super(Material.STONE); - if (flag) { - this.a(true); - } - - this.a = flag; - } - - public int a(World world) { - return 30; - } - - public void attack(World world, int i, int j, int k, EntityHuman entityhuman) { - this.e(world, i, j, k, entityhuman); // CraftBukkit - add entityhuman - super.attack(world, i, j, k, entityhuman); - } - - public void b(World world, int i, int j, int k, Entity entity) { - // CraftBukkit start - if (entity instanceof EntityHuman) { - org.bukkit.event.player.PlayerInteractEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callPlayerInteractEvent((EntityHuman) entity, org.bukkit.event.block.Action.PHYSICAL, i, j, k, -1, null); - if (!event.isCancelled()) { - this.e(world, i, j, k, entity); // add entity - super.b(world, i, j, k, entity); - } - } else { - EntityInteractEvent event = new EntityInteractEvent(entity.getBukkitEntity(), world.getWorld().getBlockAt(i, j, k)); - world.getServer().getPluginManager().callEvent(event); - if (!event.isCancelled()) { - this.e(world, i, j, k, entity); // add entity - super.b(world, i, j, k, entity); - } - } - // CraftBukkit end - } - - public boolean interact(World world, int i, int j, int k, EntityHuman entityhuman, int l, float f, float f1, float f2) { - this.e(world, i, j, k, entityhuman); // CraftBukkit - add entityhuman - return super.interact(world, i, j, k, entityhuman, l, f, f1, f2); - } - - private void e(World world, int i, int j, int k, Entity entity) { // CraftBukkit - add Entity - this.m(world, i, j, k); - if (this == Blocks.REDSTONE_ORE) { - // CraftBukkit start - if (CraftEventFactory.callEntityChangeBlockEvent(entity, i, j, k, Blocks.GLOWING_REDSTONE_ORE, 0).isCancelled()) { - return; - } - // CraftBukkit end - world.setTypeUpdate(i, j, k, Blocks.GLOWING_REDSTONE_ORE); - } - } - - public void a(World world, int i, int j, int k, Random random) { - if (this == Blocks.GLOWING_REDSTONE_ORE) { - // CraftBukkit start - if (CraftEventFactory.callBlockFadeEvent(world.getWorld().getBlockAt(i, j, k), Blocks.REDSTONE_ORE).isCancelled()) { - return; - } - // CraftBukkit end - world.setTypeUpdate(i, j, k, Blocks.REDSTONE_ORE); - } - } - - public Item getDropType(int i, Random random, int j) { - return Items.REDSTONE; - } - - public int getDropCount(int i, Random random) { - return this.a(random) + random.nextInt(i + 1); - } - - public int a(Random random) { - return 4 + random.nextInt(2); - } - - public void dropNaturally(World world, int i, int j, int k, int l, float f, int i1) { - super.dropNaturally(world, i, j, k, l, f, i1); - /* CraftBukkit start - Delegated to getExpDrop - if (this.getDropType(l, world.random, i1) != Item.getItemOf(this)) { - int j1 = 1 + world.random.nextInt(5); - - this.dropExperience(world, i, j, k, j1); - } - // */ - } - - public int getExpDrop(World world, int l, int i1) { - if (this.getDropType(l, world.random, i1) != Item.getItemOf(this)) { - int j1 = 1 + world.random.nextInt(5); - - return j1; - } - - return 0; - // CraftBukkit end - } - - private void m(World world, int i, int j, int k) { - Random random = world.random; - double d0 = 0.0625D; - - for (int l = 0; l < 6; ++l) { - double d1 = (double) ((float) i + random.nextFloat()); - double d2 = (double) ((float) j + random.nextFloat()); - double d3 = (double) ((float) k + random.nextFloat()); - - if (l == 0 && !world.getType(i, j + 1, k).c()) { - d2 = (double) (j + 1) + d0; - } - - if (l == 1 && !world.getType(i, j - 1, k).c()) { - d2 = (double) (j + 0) - d0; - } - - if (l == 2 && !world.getType(i, j, k + 1).c()) { - d3 = (double) (k + 1) + d0; - } - - if (l == 3 && !world.getType(i, j, k - 1).c()) { - d3 = (double) (k + 0) - d0; - } - - if (l == 4 && !world.getType(i + 1, j, k).c()) { - d1 = (double) (i + 1) + d0; - } - - if (l == 5 && !world.getType(i - 1, j, k).c()) { - d1 = (double) (i + 0) - d0; - } - - if (d1 < (double) i || d1 > (double) (i + 1) || d2 < 0.0D || d2 > (double) (j + 1) || d3 < (double) k || d3 > (double) (k + 1)) { - world.addParticle("reddust", d1, d2, d3, 0.0D, 0.0D, 0.0D); - } - } - } - - protected ItemStack j(int i) { - return new ItemStack(Blocks.REDSTONE_ORE); - } -} diff --git a/src/main/java/net/minecraft/server/BlockRedstoneTorch.java b/src/main/java/net/minecraft/server/BlockRedstoneTorch.java deleted file mode 100644 index 8e014149bf..0000000000 --- a/src/main/java/net/minecraft/server/BlockRedstoneTorch.java +++ /dev/null @@ -1,176 +0,0 @@ -package net.minecraft.server; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Random; - -import org.bukkit.event.block.BlockRedstoneEvent; // CraftBukkit - -public class BlockRedstoneTorch extends BlockTorch { - - private boolean isOn; - private static Map b = new HashMap(); - - private boolean a(World world, int i, int j, int k, boolean flag) { - if (!b.containsKey(world)) { - b.put(world, new ArrayList()); - } - - List list = (List) b.get(world); - - if (flag) { - list.add(new RedstoneUpdateInfo(i, j, k, world.getTime())); - } - - int l = 0; - - for (int i1 = 0; i1 < list.size(); ++i1) { - RedstoneUpdateInfo redstoneupdateinfo = (RedstoneUpdateInfo) list.get(i1); - - if (redstoneupdateinfo.a == i && redstoneupdateinfo.b == j && redstoneupdateinfo.c == k) { - ++l; - if (l >= 8) { - return true; - } - } - } - - return false; - } - - protected BlockRedstoneTorch(boolean flag) { - this.isOn = flag; - this.a(true); - this.a((CreativeModeTab) null); - } - - public int a(World world) { - return 2; - } - - public void onPlace(World world, int i, int j, int k) { - if (world.getData(i, j, k) == 0) { - super.onPlace(world, i, j, k); - } - - if (this.isOn) { - world.applyPhysics(i, j - 1, k, this); - world.applyPhysics(i, j + 1, k, this); - world.applyPhysics(i - 1, j, k, this); - world.applyPhysics(i + 1, j, k, this); - world.applyPhysics(i, j, k - 1, this); - world.applyPhysics(i, j, k + 1, this); - } - } - - public void remove(World world, int i, int j, int k, Block block, int l) { - if (this.isOn) { - world.applyPhysics(i, j - 1, k, this); - world.applyPhysics(i, j + 1, k, this); - world.applyPhysics(i - 1, j, k, this); - world.applyPhysics(i + 1, j, k, this); - world.applyPhysics(i, j, k - 1, this); - world.applyPhysics(i, j, k + 1, this); - } - } - - public int b(IBlockAccess iblockaccess, int i, int j, int k, int l) { - if (!this.isOn) { - return 0; - } else { - int i1 = iblockaccess.getData(i, j, k); - - return i1 == 5 && l == 1 ? 0 : (i1 == 3 && l == 3 ? 0 : (i1 == 4 && l == 2 ? 0 : (i1 == 1 && l == 5 ? 0 : (i1 == 2 && l == 4 ? 0 : 15)))); - } - } - - private boolean m(World world, int i, int j, int k) { - int l = world.getData(i, j, k); - - return l == 5 && world.isBlockFacePowered(i, j - 1, k, 0) ? true : (l == 3 && world.isBlockFacePowered(i, j, k - 1, 2) ? true : (l == 4 && world.isBlockFacePowered(i, j, k + 1, 3) ? true : (l == 1 && world.isBlockFacePowered(i - 1, j, k, 4) ? true : l == 2 && world.isBlockFacePowered(i + 1, j, k, 5)))); - } - - public void a(World world, int i, int j, int k, Random random) { - boolean flag = this.m(world, i, j, k); - List list = (List) b.get(world); - - while (list != null && !list.isEmpty() && world.getTime() - ((RedstoneUpdateInfo) list.get(0)).d > 60L) { - list.remove(0); - } - - // CraftBukkit start - org.bukkit.plugin.PluginManager manager = world.getServer().getPluginManager(); - org.bukkit.block.Block block = world.getWorld().getBlockAt(i, j, k); - int oldCurrent = this.isOn ? 15 : 0; - - BlockRedstoneEvent event = new BlockRedstoneEvent(block, oldCurrent, oldCurrent); - // CraftBukkit end - - if (this.isOn) { - if (flag) { - // CraftBukkit start - if (oldCurrent != 0) { - event.setNewCurrent(0); - manager.callEvent(event); - if (event.getNewCurrent() != 0) { - return; - } - } - // CraftBukkit end - - world.setTypeAndData(i, j, k, Blocks.REDSTONE_TORCH_OFF, world.getData(i, j, k), 3); - if (this.a(world, i, j, k, true)) { - world.makeSound((double) ((float) i + 0.5F), (double) ((float) j + 0.5F), (double) ((float) k + 0.5F), "random.fizz", 0.5F, 2.6F + (world.random.nextFloat() - world.random.nextFloat()) * 0.8F); - - for (int l = 0; l < 5; ++l) { - double d0 = (double) i + random.nextDouble() * 0.6D + 0.2D; - double d1 = (double) j + random.nextDouble() * 0.6D + 0.2D; - double d2 = (double) k + random.nextDouble() * 0.6D + 0.2D; - - world.addParticle("smoke", d0, d1, d2, 0.0D, 0.0D, 0.0D); - } - } - } - } else if (!flag && !this.a(world, i, j, k, false)) { - // CraftBukkit start - if (oldCurrent != 15) { - event.setNewCurrent(15); - manager.callEvent(event); - if (event.getNewCurrent() != 15) { - return; - } - } - // CraftBukkit end - - world.setTypeAndData(i, j, k, Blocks.REDSTONE_TORCH_ON, world.getData(i, j, k), 3); - } - } - - public void doPhysics(World world, int i, int j, int k, Block block) { - if (!this.b(world, i, j, k, block)) { - boolean flag = this.m(world, i, j, k); - - if (this.isOn && flag || !this.isOn && !flag) { - world.a(i, j, k, this, this.a(world)); - } - } - } - - public int c(IBlockAccess iblockaccess, int i, int j, int k, int l) { - return l == 0 ? this.b(iblockaccess, i, j, k, l) : 0; - } - - public Item getDropType(int i, Random random, int j) { - return Item.getItemOf(Blocks.REDSTONE_TORCH_ON); - } - - public boolean isPowerSource() { - return true; - } - - public boolean c(Block block) { - return block == Blocks.REDSTONE_TORCH_OFF || block == Blocks.REDSTONE_TORCH_ON; - } -} diff --git a/src/main/java/net/minecraft/server/BlockRedstoneWire.java b/src/main/java/net/minecraft/server/BlockRedstoneWire.java deleted file mode 100644 index 3cec378966..0000000000 --- a/src/main/java/net/minecraft/server/BlockRedstoneWire.java +++ /dev/null @@ -1,323 +0,0 @@ -package net.minecraft.server; - -import java.util.ArrayList; -import java.util.HashSet; -import java.util.Random; -import java.util.Set; - -import org.bukkit.event.block.BlockRedstoneEvent; // CraftBukkit - -public class BlockRedstoneWire extends Block { - - private boolean a = true; - private Set b = new HashSet(); - - public BlockRedstoneWire() { - super(Material.ORIENTABLE); - this.a(0.0F, 0.0F, 0.0F, 1.0F, 0.0625F, 1.0F); - } - - public AxisAlignedBB a(World world, int i, int j, int k) { - return null; - } - - public boolean c() { - return false; - } - - public boolean d() { - return false; - } - - public int b() { - return 5; - } - - public boolean canPlace(World world, int i, int j, int k) { - return World.a((IBlockAccess) world, i, j - 1, k) || world.getType(i, j - 1, k) == Blocks.GLOWSTONE; - } - - private void e(World world, int i, int j, int k) { - this.a(world, i, j, k, i, j, k); - ArrayList arraylist = new ArrayList(this.b); - - this.b.clear(); - - for (int l = 0; l < arraylist.size(); ++l) { - ChunkPosition chunkposition = (ChunkPosition) arraylist.get(l); - - world.applyPhysics(chunkposition.x, chunkposition.y, chunkposition.z, this); - } - } - - private void a(World world, int i, int j, int k, int l, int i1, int j1) { - int k1 = world.getData(i, j, k); - byte b0 = 0; - int l1 = this.getPower(world, l, i1, j1, b0); - - this.a = false; - int i2 = world.getHighestNeighborSignal(i, j, k); - - this.a = true; - if (i2 > 0 && i2 > l1 - 1) { - l1 = i2; - } - - int j2 = 0; - - for (int k2 = 0; k2 < 4; ++k2) { - int l2 = i; - int i3 = k; - - if (k2 == 0) { - l2 = i - 1; - } - - if (k2 == 1) { - ++l2; - } - - if (k2 == 2) { - i3 = k - 1; - } - - if (k2 == 3) { - ++i3; - } - - if (l2 != l || i3 != j1) { - j2 = this.getPower(world, l2, j, i3, j2); - } - - if (world.getType(l2, j, i3).r() && !world.getType(i, j + 1, k).r()) { - if ((l2 != l || i3 != j1) && j >= i1) { - j2 = this.getPower(world, l2, j + 1, i3, j2); - } - } else if (!world.getType(l2, j, i3).r() && (l2 != l || i3 != j1) && j <= i1) { - j2 = this.getPower(world, l2, j - 1, i3, j2); - } - } - - if (j2 > l1) { - l1 = j2 - 1; - } else if (l1 > 0) { - --l1; - } else { - l1 = 0; - } - - if (i2 > l1 - 1) { - l1 = i2; - } - - // CraftBukkit start - if (k1 != l1) { - BlockRedstoneEvent event = new BlockRedstoneEvent(world.getWorld().getBlockAt(i, j, k), k1, l1); - world.getServer().getPluginManager().callEvent(event); - - l1 = event.getNewCurrent(); - } - // CraftBukkit end - if (k1 != l1) { - world.setData(i, j, k, l1, 2); - this.b.add(new ChunkPosition(i, j, k)); - this.b.add(new ChunkPosition(i - 1, j, k)); - this.b.add(new ChunkPosition(i + 1, j, k)); - this.b.add(new ChunkPosition(i, j - 1, k)); - this.b.add(new ChunkPosition(i, j + 1, k)); - this.b.add(new ChunkPosition(i, j, k - 1)); - this.b.add(new ChunkPosition(i, j, k + 1)); - } - } - - private void m(World world, int i, int j, int k) { - if (world.getType(i, j, k) == this) { - world.applyPhysics(i, j, k, this); - world.applyPhysics(i - 1, j, k, this); - world.applyPhysics(i + 1, j, k, this); - world.applyPhysics(i, j, k - 1, this); - world.applyPhysics(i, j, k + 1, this); - world.applyPhysics(i, j - 1, k, this); - world.applyPhysics(i, j + 1, k, this); - } - } - - public void onPlace(World world, int i, int j, int k) { - super.onPlace(world, i, j, k); - if (!world.isStatic) { - this.e(world, i, j, k); - world.applyPhysics(i, j + 1, k, this); - world.applyPhysics(i, j - 1, k, this); - this.m(world, i - 1, j, k); - this.m(world, i + 1, j, k); - this.m(world, i, j, k - 1); - this.m(world, i, j, k + 1); - if (world.getType(i - 1, j, k).r()) { - this.m(world, i - 1, j + 1, k); - } else { - this.m(world, i - 1, j - 1, k); - } - - if (world.getType(i + 1, j, k).r()) { - this.m(world, i + 1, j + 1, k); - } else { - this.m(world, i + 1, j - 1, k); - } - - if (world.getType(i, j, k - 1).r()) { - this.m(world, i, j + 1, k - 1); - } else { - this.m(world, i, j - 1, k - 1); - } - - if (world.getType(i, j, k + 1).r()) { - this.m(world, i, j + 1, k + 1); - } else { - this.m(world, i, j - 1, k + 1); - } - } - } - - public void remove(World world, int i, int j, int k, Block block, int l) { - super.remove(world, i, j, k, block, l); - if (!world.isStatic) { - world.applyPhysics(i, j + 1, k, this); - world.applyPhysics(i, j - 1, k, this); - world.applyPhysics(i + 1, j, k, this); - world.applyPhysics(i - 1, j, k, this); - world.applyPhysics(i, j, k + 1, this); - world.applyPhysics(i, j, k - 1, this); - this.e(world, i, j, k); - this.m(world, i - 1, j, k); - this.m(world, i + 1, j, k); - this.m(world, i, j, k - 1); - this.m(world, i, j, k + 1); - if (world.getType(i - 1, j, k).r()) { - this.m(world, i - 1, j + 1, k); - } else { - this.m(world, i - 1, j - 1, k); - } - - if (world.getType(i + 1, j, k).r()) { - this.m(world, i + 1, j + 1, k); - } else { - this.m(world, i + 1, j - 1, k); - } - - if (world.getType(i, j, k - 1).r()) { - this.m(world, i, j + 1, k - 1); - } else { - this.m(world, i, j - 1, k - 1); - } - - if (world.getType(i, j, k + 1).r()) { - this.m(world, i, j + 1, k + 1); - } else { - this.m(world, i, j - 1, k + 1); - } - } - } - - // CraftBukkit - private -> public - public int getPower(World world, int i, int j, int k, int l) { - if (world.getType(i, j, k) != this) { - return l; - } else { - int i1 = world.getData(i, j, k); - - return i1 > l ? i1 : l; - } - } - - public void doPhysics(World world, int i, int j, int k, Block block) { - if (!world.isStatic) { - boolean flag = this.canPlace(world, i, j, k); - - if (flag) { - this.e(world, i, j, k); - } else { - this.b(world, i, j, k, 0, 0); - world.setAir(i, j, k); - } - - super.doPhysics(world, i, j, k, block); - } - } - - public Item getDropType(int i, Random random, int j) { - return Items.REDSTONE; - } - - public int c(IBlockAccess iblockaccess, int i, int j, int k, int l) { - return !this.a ? 0 : this.b(iblockaccess, i, j, k, l); - } - - public int b(IBlockAccess iblockaccess, int i, int j, int k, int l) { - if (!this.a) { - return 0; - } else { - int i1 = iblockaccess.getData(i, j, k); - - if (i1 == 0) { - return 0; - } else if (l == 1) { - return i1; - } else { - boolean flag = g(iblockaccess, i - 1, j, k, 1) || !iblockaccess.getType(i - 1, j, k).r() && g(iblockaccess, i - 1, j - 1, k, -1); - boolean flag1 = g(iblockaccess, i + 1, j, k, 3) || !iblockaccess.getType(i + 1, j, k).r() && g(iblockaccess, i + 1, j - 1, k, -1); - boolean flag2 = g(iblockaccess, i, j, k - 1, 2) || !iblockaccess.getType(i, j, k - 1).r() && g(iblockaccess, i, j - 1, k - 1, -1); - boolean flag3 = g(iblockaccess, i, j, k + 1, 0) || !iblockaccess.getType(i, j, k + 1).r() && g(iblockaccess, i, j - 1, k + 1, -1); - - if (!iblockaccess.getType(i, j + 1, k).r()) { - if (iblockaccess.getType(i - 1, j, k).r() && g(iblockaccess, i - 1, j + 1, k, -1)) { - flag = true; - } - - if (iblockaccess.getType(i + 1, j, k).r() && g(iblockaccess, i + 1, j + 1, k, -1)) { - flag1 = true; - } - - if (iblockaccess.getType(i, j, k - 1).r() && g(iblockaccess, i, j + 1, k - 1, -1)) { - flag2 = true; - } - - if (iblockaccess.getType(i, j, k + 1).r() && g(iblockaccess, i, j + 1, k + 1, -1)) { - flag3 = true; - } - } - - return !flag2 && !flag1 && !flag && !flag3 && l >= 2 && l <= 5 ? i1 : (l == 2 && flag2 && !flag && !flag1 ? i1 : (l == 3 && flag3 && !flag && !flag1 ? i1 : (l == 4 && flag && !flag2 && !flag3 ? i1 : (l == 5 && flag1 && !flag2 && !flag3 ? i1 : 0)))); - } - } - } - - public boolean isPowerSource() { - return this.a; - } - - public static boolean f(IBlockAccess iblockaccess, int i, int j, int k, int l) { - Block block = iblockaccess.getType(i, j, k); - - if (block == Blocks.REDSTONE_WIRE) { - return true; - } else if (!Blocks.DIODE_OFF.e(block)) { - return block.isPowerSource() && l != -1; - } else { - int i1 = iblockaccess.getData(i, j, k); - - return l == (i1 & 3) || l == Direction.f[i1 & 3]; - } - } - - public static boolean g(IBlockAccess iblockaccess, int i, int j, int k, int l) { - if (f(iblockaccess, i, j, k, l)) { - return true; - } else if (iblockaccess.getType(i, j, k) == Blocks.DIODE_ON) { - int i1 = iblockaccess.getData(i, j, k); - - return l == (i1 & 3); - } else { - return false; - } - } -} diff --git a/src/main/java/net/minecraft/server/BlockReed.java b/src/main/java/net/minecraft/server/BlockReed.java deleted file mode 100644 index a1350f6216..0000000000 --- a/src/main/java/net/minecraft/server/BlockReed.java +++ /dev/null @@ -1,81 +0,0 @@ -package net.minecraft.server; - -import java.util.Random; - -public class BlockReed extends Block { - - protected BlockReed() { - super(Material.PLANT); - float f = 0.375F; - - this.a(0.5F - f, 0.0F, 0.5F - f, 0.5F + f, 1.0F, 0.5F + f); - this.a(true); - } - - public void a(World world, int i, int j, int k, Random random) { - if (world.getType(i, j - 1, k) == Blocks.SUGAR_CANE_BLOCK || this.e(world, i, j, k)) { - if (world.isEmpty(i, j + 1, k)) { - int l; - - for (l = 1; world.getType(i, j - l, k) == this; ++l) { - ; - } - - if (l < 3) { - int i1 = world.getData(i, j, k); - - if (i1 == 15) { - org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockGrowEvent(world, i, j + 1, k, this, 0); // CraftBukkit - world.setData(i, j, k, 0, 4); - } else { - world.setData(i, j, k, i1 + 1, 4); - } - } - } - } - } - - public boolean canPlace(World world, int i, int j, int k) { - Block block = world.getType(i, j - 1, k); - - return block == this ? true : (block != Blocks.GRASS && block != Blocks.DIRT && block != Blocks.SAND ? false : (world.getType(i - 1, j - 1, k).getMaterial() == Material.WATER ? true : (world.getType(i + 1, j - 1, k).getMaterial() == Material.WATER ? true : (world.getType(i, j - 1, k - 1).getMaterial() == Material.WATER ? true : world.getType(i, j - 1, k + 1).getMaterial() == Material.WATER)))); - } - - public void doPhysics(World world, int i, int j, int k, Block block) { - this.e(world, i, j, k); - } - - protected final boolean e(World world, int i, int j, int k) { - if (!this.j(world, i, j, k)) { - this.b(world, i, j, k, world.getData(i, j, k), 0); - world.setAir(i, j, k); - return false; - } else { - return true; - } - } - - public boolean j(World world, int i, int j, int k) { - return this.canPlace(world, i, j, k); - } - - public AxisAlignedBB a(World world, int i, int j, int k) { - return null; - } - - public Item getDropType(int i, Random random, int j) { - return Items.SUGAR_CANE; - } - - public boolean c() { - return false; - } - - public boolean d() { - return false; - } - - public int b() { - return 1; - } -} diff --git a/src/main/java/net/minecraft/server/BlockSapling.java b/src/main/java/net/minecraft/server/BlockSapling.java deleted file mode 100644 index 89e60a88f8..0000000000 --- a/src/main/java/net/minecraft/server/BlockSapling.java +++ /dev/null @@ -1,203 +0,0 @@ -package net.minecraft.server; - -import java.util.Random; - -// CraftBukkit start -import java.util.List; - -import org.bukkit.Location; -import org.bukkit.TreeType; -import org.bukkit.block.BlockState; -import org.bukkit.event.world.StructureGrowEvent; -// CraftBukkit end - -public class BlockSapling extends BlockPlant implements IBlockFragilePlantElement { - - public static final String[] a = new String[] { "oak", "spruce", "birch", "jungle", "acacia", "roofed_oak"}; - private static final IIcon[] b = new IIcon[a.length]; - public static TreeType treeType; // CraftBukkit - - protected BlockSapling() { - float f = 0.4F; - - this.a(0.5F - f, 0.0F, 0.5F - f, 0.5F + f, f * 2.0F, 0.5F + f); - this.a(CreativeModeTab.c); - } - - public void a(World world, int i, int j, int k, Random random) { - if (!world.isStatic) { - super.a(world, i, j, k, random); - if (world.getLightLevel(i, j + 1, k) >= 9 && random.nextInt(7) == 0) { - // CraftBukkit start - world.captureTreeGeneration = true; - // CraftBukkit end - this.grow(world, i, j, k, random); - // CraftBukkit start - world.captureTreeGeneration = false; - if (world.capturedBlockStates.size() > 0) { - TreeType treeType = BlockSapling.treeType; - BlockSapling.treeType = null; - Location location = new Location(world.getWorld(), i, j, k); - List blocks = (List) world.capturedBlockStates.clone(); - world.capturedBlockStates.clear(); - StructureGrowEvent event = null; - if (treeType != null) { - event = new StructureGrowEvent(location, treeType, false, null, blocks); - org.bukkit.Bukkit.getPluginManager().callEvent(event); - } - if (event == null || !event.isCancelled()) { - for (BlockState blockstate : blocks) { - blockstate.update(true); - } - } - } - // CraftBukkit end - } - } - } - - public void grow(World world, int i, int j, int k, Random random) { - int l = world.getData(i, j, k); - - if ((l & 8) == 0) { - world.setData(i, j, k, l | 8, 4); - } else { - this.d(world, i, j, k, random); - } - } - - public void d(World world, int i, int j, int k, Random random) { - int l = world.getData(i, j, k) & 7; - // CraftBukkit start - Turn ternary operator into if statement to set treeType - // Object object = random.nextInt(10) == 0 ? new WorldGenBigTree(true) : new WorldGenTrees(true); - Object object; - if (random.nextInt(10) == 0) { - treeType = TreeType.BIG_TREE; - object = new WorldGenBigTree(true); - } else { - treeType = TreeType.TREE; - object = new WorldGenTrees(true); - } - // CraftBukkit end - int i1 = 0; - int j1 = 0; - boolean flag = false; - - switch (l) { - case 0: - default: - break; - - case 1: - label78: - for (i1 = 0; i1 >= -1; --i1) { - for (j1 = 0; j1 >= -1; --j1) { - if (this.a(world, i + i1, j, k + j1, 1) && this.a(world, i + i1 + 1, j, k + j1, 1) && this.a(world, i + i1, j, k + j1 + 1, 1) && this.a(world, i + i1 + 1, j, k + j1 + 1, 1)) { - treeType = TreeType.MEGA_REDWOOD; // CraftBukkit - object = new WorldGenMegaTree(false, random.nextBoolean()); - flag = true; - break label78; - } - } - } - - if (!flag) { - j1 = 0; - i1 = 0; - treeType = TreeType.REDWOOD; // CraftBukkit - object = new WorldGenTaiga2(true); - } - break; - - case 2: - treeType = TreeType.BIRCH; // CraftBukkit - object = new WorldGenForest(true, false); - break; - - case 3: - label93: - for (i1 = 0; i1 >= -1; --i1) { - for (j1 = 0; j1 >= -1; --j1) { - if (this.a(world, i + i1, j, k + j1, 3) && this.a(world, i + i1 + 1, j, k + j1, 3) && this.a(world, i + i1, j, k + j1 + 1, 3) && this.a(world, i + i1 + 1, j, k + j1 + 1, 3)) { - treeType = TreeType.JUNGLE; // CraftBukkit - object = new WorldGenJungleTree(true, 10, 20, 3, 3); - flag = true; - break label93; - } - } - } - - if (!flag) { - j1 = 0; - i1 = 0; - treeType = TreeType.SMALL_JUNGLE; // CraftBukkit - object = new WorldGenTrees(true, 4 + random.nextInt(7), 3, 3, false); - } - break; - - case 4: - treeType = TreeType.ACACIA; // CraftBukkit - object = new WorldGenAcaciaTree(true); - break; - - case 5: - label108: - for (i1 = 0; i1 >= -1; --i1) { - for (j1 = 0; j1 >= -1; --j1) { - if (this.a(world, i + i1, j, k + j1, 5) && this.a(world, i + i1 + 1, j, k + j1, 5) && this.a(world, i + i1, j, k + j1 + 1, 5) && this.a(world, i + i1 + 1, j, k + j1 + 1, 5)) { - object = new WorldGenForestTree(true); - treeType = TreeType.DARK_OAK; // CraftBukkit - flag = true; - break label108; - } - } - } - - if (!flag) { - return; - } - } - - Block block = Blocks.AIR; - - if (flag) { - world.setTypeAndData(i + i1, j, k + j1, block, 0, 4); - world.setTypeAndData(i + i1 + 1, j, k + j1, block, 0, 4); - world.setTypeAndData(i + i1, j, k + j1 + 1, block, 0, 4); - world.setTypeAndData(i + i1 + 1, j, k + j1 + 1, block, 0, 4); - } else { - world.setTypeAndData(i, j, k, block, 0, 4); - } - - if (!((WorldGenerator) object).generate(world, random, i + i1, j, k + j1)) { - if (flag) { - world.setTypeAndData(i + i1, j, k + j1, this, l, 4); - world.setTypeAndData(i + i1 + 1, j, k + j1, this, l, 4); - world.setTypeAndData(i + i1, j, k + j1 + 1, this, l, 4); - world.setTypeAndData(i + i1 + 1, j, k + j1 + 1, this, l, 4); - } else { - world.setTypeAndData(i, j, k, this, l, 4); - } - } - } - - public boolean a(World world, int i, int j, int k, int l) { - return world.getType(i, j, k) == this && (world.getData(i, j, k) & 7) == l; - } - - public int getDropData(int i) { - return MathHelper.a(i & 7, 0, 5); - } - - public boolean a(World world, int i, int j, int k, boolean flag) { - return true; - } - - public boolean a(World world, Random random, int i, int j, int k) { - return (double) world.random.nextFloat() < 0.45D; - } - - public void b(World world, Random random, int i, int j, int k) { - this.grow(world, i, j, k, random); - } -} diff --git a/src/main/java/net/minecraft/server/BlockSign.java b/src/main/java/net/minecraft/server/BlockSign.java deleted file mode 100644 index 4ee331976e..0000000000 --- a/src/main/java/net/minecraft/server/BlockSign.java +++ /dev/null @@ -1,127 +0,0 @@ -package net.minecraft.server; - -import java.util.Random; - -import org.bukkit.event.block.BlockRedstoneEvent; // CraftBukkit - -public class BlockSign extends BlockContainer { - - private Class a; - private boolean b; - - protected BlockSign(Class oclass, boolean flag) { - super(Material.WOOD); - this.b = flag; - this.a = oclass; - float f = 0.25F; - float f1 = 1.0F; - - this.a(0.5F - f, 0.0F, 0.5F - f, 0.5F + f, f1, 0.5F + f); - } - - public AxisAlignedBB a(World world, int i, int j, int k) { - return null; - } - - public void updateShape(IBlockAccess iblockaccess, int i, int j, int k) { - if (!this.b) { - int l = iblockaccess.getData(i, j, k); - float f = 0.28125F; - float f1 = 0.78125F; - float f2 = 0.0F; - float f3 = 1.0F; - float f4 = 0.125F; - - this.a(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F); - if (l == 2) { - this.a(f2, f, 1.0F - f4, f3, f1, 1.0F); - } - - if (l == 3) { - this.a(f2, f, 0.0F, f3, f1, f4); - } - - if (l == 4) { - this.a(1.0F - f4, f, f2, 1.0F, f1, f3); - } - - if (l == 5) { - this.a(0.0F, f, f2, f4, f1, f3); - } - } - } - - public int b() { - return -1; - } - - public boolean d() { - return false; - } - - public boolean b(IBlockAccess iblockaccess, int i, int j, int k) { - return true; - } - - public boolean c() { - return false; - } - - public TileEntity a(World world, int i) { - try { - return (TileEntity) this.a.newInstance(); - } catch (Exception exception) { - throw new RuntimeException(exception); - } - } - - public Item getDropType(int i, Random random, int j) { - return Items.SIGN; - } - - public void doPhysics(World world, int i, int j, int k, Block block) { - boolean flag = false; - - if (this.b) { - if (!world.getType(i, j - 1, k).getMaterial().isBuildable()) { - flag = true; - } - } else { - int l = world.getData(i, j, k); - - flag = true; - if (l == 2 && world.getType(i, j, k + 1).getMaterial().isBuildable()) { - flag = false; - } - - if (l == 3 && world.getType(i, j, k - 1).getMaterial().isBuildable()) { - flag = false; - } - - if (l == 4 && world.getType(i + 1, j, k).getMaterial().isBuildable()) { - flag = false; - } - - if (l == 5 && world.getType(i - 1, j, k).getMaterial().isBuildable()) { - flag = false; - } - } - - if (flag) { - this.b(world, i, j, k, world.getData(i, j, k), 0); - world.setAir(i, j, k); - } - - super.doPhysics(world, i, j, k, block); - - // CraftBukkit start - if (block != null && block.isPowerSource()) { - org.bukkit.block.Block bukkitBlock = world.getWorld().getBlockAt(i, j, k); - int power = bukkitBlock.getBlockPower(); - - BlockRedstoneEvent eventRedstone = new BlockRedstoneEvent(bukkitBlock, power, power); - world.getServer().getPluginManager().callEvent(eventRedstone); - } - // CraftBukkit end - } -} diff --git a/src/main/java/net/minecraft/server/BlockSkull.java b/src/main/java/net/minecraft/server/BlockSkull.java deleted file mode 100644 index 3075dbc8ad..0000000000 --- a/src/main/java/net/minecraft/server/BlockSkull.java +++ /dev/null @@ -1,244 +0,0 @@ -package net.minecraft.server; - -import java.util.Iterator; -import java.util.Random; - -// CraftBukkit start -import org.bukkit.craftbukkit.util.BlockStateListPopulator; -import org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason; -// CraftBukkit end - -public class BlockSkull extends BlockContainer { - - protected BlockSkull() { - super(Material.ORIENTABLE); - this.a(0.25F, 0.0F, 0.25F, 0.75F, 0.5F, 0.75F); - } - - public int b() { - return -1; - } - - public boolean c() { - return false; - } - - public boolean d() { - return false; - } - - public void updateShape(IBlockAccess iblockaccess, int i, int j, int k) { - int l = iblockaccess.getData(i, j, k) & 7; - - switch (l) { - case 1: - default: - this.a(0.25F, 0.0F, 0.25F, 0.75F, 0.5F, 0.75F); - break; - - case 2: - this.a(0.25F, 0.25F, 0.5F, 0.75F, 0.75F, 1.0F); - break; - - case 3: - this.a(0.25F, 0.25F, 0.0F, 0.75F, 0.75F, 0.5F); - break; - - case 4: - this.a(0.5F, 0.25F, 0.25F, 1.0F, 0.75F, 0.75F); - break; - - case 5: - this.a(0.0F, 0.25F, 0.25F, 0.5F, 0.75F, 0.75F); - } - } - - public AxisAlignedBB a(World world, int i, int j, int k) { - this.updateShape(world, i, j, k); - return super.a(world, i, j, k); - } - - public void postPlace(World world, int i, int j, int k, EntityLiving entityliving, ItemStack itemstack) { - int l = MathHelper.floor((double) (entityliving.yaw * 4.0F / 360.0F) + 2.5D) & 3; - - world.setData(i, j, k, l, 2); - } - - public TileEntity a(World world, int i) { - return new TileEntitySkull(); - } - - public int getDropData(World world, int i, int j, int k) { - TileEntity tileentity = world.getTileEntity(i, j, k); - - return tileentity != null && tileentity instanceof TileEntitySkull ? ((TileEntitySkull) tileentity).getSkullType() : super.getDropData(world, i, j, k); - } - - public int getDropData(int i) { - return i; - } - - // CraftBukkit start - Special case dropping so we can get info from the tile entity - public void dropNaturally(World world, int i, int j, int k, int l, float f, int i1) { - if (world.random.nextFloat() < f) { - ItemStack itemstack = new ItemStack(Items.SKULL, 1, this.getDropData(world, i, j, k)); - TileEntitySkull tileentityskull = (TileEntitySkull) world.getTileEntity(i, j, k); - - if (tileentityskull.getSkullType() == 3 && tileentityskull.getGameProfile() != null) { - itemstack.setTag(new NBTTagCompound()); - NBTTagCompound nbttagcompound = new NBTTagCompound(); - - GameProfileSerializer.serialize(nbttagcompound, tileentityskull.getGameProfile()); - itemstack.getTag().set("SkullOwner", nbttagcompound); - } - - this.a(world, i, j, k, itemstack); - } - } - // CraftBukkit end - - public void a(World world, int i, int j, int k, int l, EntityHuman entityhuman) { - if (entityhuman.abilities.canInstantlyBuild) { - l |= 8; - world.setData(i, j, k, l, 4); - } - - super.a(world, i, j, k, l, entityhuman); - } - - public void remove(World world, int i, int j, int k, Block block, int l) { - if (!world.isStatic) { - // CraftBukkit start - Drop item in code above, not here - // if ((l & 8) == 0) { - if (false) { - // CraftBukkit end - ItemStack itemstack = new ItemStack(Items.SKULL, 1, this.getDropData(world, i, j, k)); - TileEntitySkull tileentityskull = (TileEntitySkull) world.getTileEntity(i, j, k); - - if (tileentityskull.getSkullType() == 3 && tileentityskull.getGameProfile() != null) { - itemstack.setTag(new NBTTagCompound()); - NBTTagCompound nbttagcompound = new NBTTagCompound(); - - GameProfileSerializer.serialize(nbttagcompound, tileentityskull.getGameProfile()); - itemstack.getTag().set("SkullOwner", nbttagcompound); - } - - this.a(world, i, j, k, itemstack); - } - - super.remove(world, i, j, k, block, l); - } - } - - public Item getDropType(int i, Random random, int j) { - return Items.SKULL; - } - - public void a(World world, int i, int j, int k, TileEntitySkull tileentityskull) { - if (tileentityskull.getSkullType() == 1 && j >= 2 && world.difficulty != EnumDifficulty.PEACEFUL && !world.isStatic) { - int l; - EntityWither entitywither; - Iterator iterator; - EntityHuman entityhuman; - int i1; - - for (l = -2; l <= 0; ++l) { - if (world.getType(i, j - 1, k + l) == Blocks.SOUL_SAND && world.getType(i, j - 1, k + l + 1) == Blocks.SOUL_SAND && world.getType(i, j - 2, k + l + 1) == Blocks.SOUL_SAND && world.getType(i, j - 1, k + l + 2) == Blocks.SOUL_SAND && this.a(world, i, j, k + l, 1) && this.a(world, i, j, k + l + 1, 1) && this.a(world, i, j, k + l + 2, 1)) { - // CraftBukkit start - Use BlockStateListPopulator - BlockStateListPopulator blockList = new BlockStateListPopulator(world.getWorld()); - - world.setData(i, j, k + l, 8, 2); - world.setData(i, j, k + l + 1, 8, 2); - world.setData(i, j, k + l + 2, 8, 2); - - blockList.setTypeAndData(i, j, k + l, getById(0), 0, 2); - blockList.setTypeAndData(i, j, k + l + 1, getById(0), 0, 2); - blockList.setTypeAndData(i, j, k + l + 2, getById(0), 0, 2); - blockList.setTypeAndData(i, j - 1, k + l, getById(0), 0, 2); - blockList.setTypeAndData(i, j - 1, k + l + 1, getById(0), 0, 2); - blockList.setTypeAndData(i, j - 1, k + l + 2, getById(0), 0, 2); - blockList.setTypeAndData(i, j - 2, k + l + 1, getById(0), 0, 2); - - if (!world.isStatic) { - entitywither = new EntityWither(world); - entitywither.setPositionRotation((double) i + 0.5D, (double) j - 1.45D, (double) (k + l) + 1.5D, 90.0F, 0.0F); - entitywither.aM = 90.0F; - entitywither.bZ(); - - if (world.addEntity(entitywither, SpawnReason.BUILD_WITHER)) { - if (!world.isStatic) { - iterator = world.a(EntityHuman.class, entitywither.boundingBox.grow(50.0D, 50.0D, 50.0D)).iterator(); - - while (iterator.hasNext()) { - entityhuman = (EntityHuman) iterator.next(); - entityhuman.a((Statistic) AchievementList.I); - } - } - - blockList.updateList(); - } - } - - for (i1 = 0; i1 < 120; ++i1) { - world.addParticle("snowballpoof", (double) i + world.random.nextDouble(), (double) (j - 2) + world.random.nextDouble() * 3.9D, (double) (k + l + 1) + world.random.nextDouble(), 0.0D, 0.0D, 0.0D); - } - // CraftBukkit end - return; - } - } - - for (l = -2; l <= 0; ++l) { - if (world.getType(i + l, j - 1, k) == Blocks.SOUL_SAND && world.getType(i + l + 1, j - 1, k) == Blocks.SOUL_SAND && world.getType(i + l + 1, j - 2, k) == Blocks.SOUL_SAND && world.getType(i + l + 2, j - 1, k) == Blocks.SOUL_SAND && this.a(world, i + l, j, k, 1) && this.a(world, i + l + 1, j, k, 1) && this.a(world, i + l + 2, j, k, 1)) { - // CraftBukkit start - Use BlockStateListPopulator - BlockStateListPopulator blockList = new BlockStateListPopulator(world.getWorld()); - - world.setData(i + l, j, k, 8, 2); - world.setData(i + l + 1, j, k, 8, 2); - world.setData(i + l + 2, j, k, 8, 2); - - blockList.setTypeAndData(i + l, j, k, getById(0), 0, 2); - blockList.setTypeAndData(i + l + 1, j, k, getById(0), 0, 2); - blockList.setTypeAndData(i + l + 2, j, k, getById(0), 0, 2); - blockList.setTypeAndData(i + l, j - 1, k, getById(0), 0, 2); - blockList.setTypeAndData(i + l + 1, j - 1, k, getById(0), 0, 2); - blockList.setTypeAndData(i + l + 2, j - 1, k, getById(0), 0, 2); - blockList.setTypeAndData(i + l + 1, j - 2, k, getById(0), 0, 2); - if (!world.isStatic) { - entitywither = new EntityWither(world); - entitywither.setPositionRotation((double) (i + l) + 1.5D, (double) j - 1.45D, (double) k + 0.5D, 0.0F, 0.0F); - entitywither.bZ(); - - if (world.addEntity(entitywither, SpawnReason.BUILD_WITHER)) { - if (!world.isStatic) { - iterator = world.a(EntityHuman.class, entitywither.boundingBox.grow(50.0D, 50.0D, 50.0D)).iterator(); - - while (iterator.hasNext()) { - entityhuman = (EntityHuman) iterator.next(); - entityhuman.a((Statistic) AchievementList.I); - } - } - blockList.updateList(); - } - } - - for (i1 = 0; i1 < 120; ++i1) { - world.addParticle("snowballpoof", (double) (i + l + 1) + world.random.nextDouble(), (double) (j - 2) + world.random.nextDouble() * 3.9D, (double) k + world.random.nextDouble(), 0.0D, 0.0D, 0.0D); - } - // CraftBukkit end - - return; - } - } - } - } - - private boolean a(World world, int i, int j, int k, int l) { - if (world.getType(i, j, k) != this) { - return false; - } else { - TileEntity tileentity = world.getTileEntity(i, j, k); - - return tileentity != null && tileentity instanceof TileEntitySkull ? ((TileEntitySkull) tileentity).getSkullType() == l : false; - } - } -} diff --git a/src/main/java/net/minecraft/server/BlockSnow.java b/src/main/java/net/minecraft/server/BlockSnow.java deleted file mode 100644 index 02f428e51c..0000000000 --- a/src/main/java/net/minecraft/server/BlockSnow.java +++ /dev/null @@ -1,93 +0,0 @@ -package net.minecraft.server; - -import java.util.Random; - -public class BlockSnow extends Block { - - protected BlockSnow() { - super(Material.PACKED_ICE); - this.a(0.0F, 0.0F, 0.0F, 1.0F, 0.125F, 1.0F); - this.a(true); - this.a(CreativeModeTab.c); - this.b(0); - } - - public AxisAlignedBB a(World world, int i, int j, int k) { - int l = world.getData(i, j, k) & 7; - float f = 0.125F; - - return AxisAlignedBB.a((double) i + this.minX, (double) j + this.minY, (double) k + this.minZ, (double) i + this.maxX, (double) ((float) j + (float) l * f), (double) k + this.maxZ); - } - - public boolean c() { - return false; - } - - public boolean d() { - return false; - } - - public void g() { - this.b(0); - } - - public void updateShape(IBlockAccess iblockaccess, int i, int j, int k) { - this.b(iblockaccess.getData(i, j, k)); - } - - protected void b(int i) { - int j = i & 7; - float f = (float) (2 * (1 + j)) / 16.0F; - - this.a(0.0F, 0.0F, 0.0F, 1.0F, f, 1.0F); - } - - public boolean canPlace(World world, int i, int j, int k) { - Block block = world.getType(i, j - 1, k); - - return block != Blocks.ICE && block != Blocks.PACKED_ICE ? (block.getMaterial() == Material.LEAVES ? true : (block == this && (world.getData(i, j - 1, k) & 7) == 7 ? true : block.c() && block.material.isSolid())) : false; - } - - public void doPhysics(World world, int i, int j, int k, Block block) { - this.m(world, i, j, k); - } - - private boolean m(World world, int i, int j, int k) { - if (!this.canPlace(world, i, j, k)) { - this.b(world, i, j, k, world.getData(i, j, k), 0); - world.setAir(i, j, k); - return false; - } else { - return true; - } - } - - public void a(World world, EntityHuman entityhuman, int i, int j, int k, int l) { - int i1 = l & 7; - - this.a(world, i, j, k, new ItemStack(Items.SNOW_BALL, i1 + 1, 0)); - world.setAir(i, j, k); - entityhuman.a(StatisticList.MINE_BLOCK_COUNT[Block.getId(this)], 1); - } - - public Item getDropType(int i, Random random, int j) { - return Items.SNOW_BALL; - } - - public int a(Random random) { - return 0; - } - - public void a(World world, int i, int j, int k, Random random) { - if (world.b(EnumSkyBlock.BLOCK, i, j, k) > 11) { - // CraftBukkit start - if (org.bukkit.craftbukkit.event.CraftEventFactory.callBlockFadeEvent(world.getWorld().getBlockAt(i, j, k), Blocks.AIR).isCancelled()) { - return; - } - // CraftBukkit end - - this.b(world, i, j, k, world.getData(i, j, k), 0); - world.setAir(i, j, k); - } - } -} diff --git a/src/main/java/net/minecraft/server/BlockSoil.java b/src/main/java/net/minecraft/server/BlockSoil.java deleted file mode 100644 index b234a5378b..0000000000 --- a/src/main/java/net/minecraft/server/BlockSoil.java +++ /dev/null @@ -1,121 +0,0 @@ -package net.minecraft.server; - -import java.util.Random; - -// CraftBukkit start -import org.bukkit.event.entity.EntityInteractEvent; -import org.bukkit.craftbukkit.event.CraftEventFactory; -// CraftBukkit end - -public class BlockSoil extends Block { - - protected BlockSoil() { - super(Material.EARTH); - this.a(true); - this.a(0.0F, 0.0F, 0.0F, 1.0F, 0.9375F, 1.0F); - this.g(255); - } - - public AxisAlignedBB a(World world, int i, int j, int k) { - return AxisAlignedBB.a((double) (i + 0), (double) (j + 0), (double) (k + 0), (double) (i + 1), (double) (j + 1), (double) (k + 1)); - } - - public boolean c() { - return false; - } - - public boolean d() { - return false; - } - - public void a(World world, int i, int j, int k, Random random) { - if (!this.m(world, i, j, k) && !world.isRainingAt(i, j + 1, k)) { - int l = world.getData(i, j, k); - - if (l > 0) { - world.setData(i, j, k, l - 1, 2); - } else if (!this.e(world, i, j, k)) { - // CraftBukkit start - org.bukkit.block.Block block = world.getWorld().getBlockAt(i, j, k); - if (CraftEventFactory.callBlockFadeEvent(block, Blocks.DIRT).isCancelled()) { - return; - } - // CraftBukkit end - - world.setTypeUpdate(i, j, k, Blocks.DIRT); - } - } else { - world.setData(i, j, k, 7, 2); - } - } - - 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) { - cancellable = CraftEventFactory.callPlayerInteractEvent((EntityHuman) entity, org.bukkit.event.block.Action.PHYSICAL, i, j, k, -1, null); - } else { - cancellable = new EntityInteractEvent(entity.getBukkitEntity(), world.getWorld().getBlockAt(i, j, k)); - world.getServer().getPluginManager().callEvent((EntityInteractEvent) cancellable); - } - - if (cancellable.isCancelled()) { - return; - } - - if (CraftEventFactory.callEntityChangeBlockEvent(entity, i, j, k, Blocks.DIRT, 0).isCancelled()) { - return; - } - // CraftBukkit end - world.setTypeUpdate(i, j, k, Blocks.DIRT); - } - } - - private boolean e(World world, int i, int j, int k) { - byte b0 = 0; - - for (int l = i - b0; l <= i + b0; ++l) { - for (int i1 = k - b0; i1 <= k + b0; ++i1) { - Block block = world.getType(l, j + 1, i1); - - if (block == Blocks.CROPS || block == Blocks.MELON_STEM || block == Blocks.PUMPKIN_STEM || block == Blocks.POTATOES || block == Blocks.CARROTS) { - return true; - } - } - } - - return false; - } - - private boolean m(World world, int i, int j, int k) { - for (int l = i - 4; l <= i + 4; ++l) { - for (int i1 = j; i1 <= j + 1; ++i1) { - for (int j1 = k - 4; j1 <= k + 4; ++j1) { - if (world.getType(l, i1, j1).getMaterial() == Material.WATER) { - return true; - } - } - } - } - - return false; - } - - public void doPhysics(World world, int i, int j, int k, Block block) { - super.doPhysics(world, i, j, k, block); - Material material = world.getType(i, j + 1, k).getMaterial(); - - if (material.isBuildable()) { - world.setTypeUpdate(i, j, k, Blocks.DIRT); - } - } - - public Item getDropType(int i, Random random, int j) { - return Blocks.DIRT.getDropType(0, random, j); - } -} diff --git a/src/main/java/net/minecraft/server/BlockStationary.java b/src/main/java/net/minecraft/server/BlockStationary.java deleted file mode 100644 index 51b9604ae7..0000000000 --- a/src/main/java/net/minecraft/server/BlockStationary.java +++ /dev/null @@ -1,93 +0,0 @@ -package net.minecraft.server; - -import java.util.Random; - -import org.bukkit.craftbukkit.event.CraftEventFactory; // CraftBukkit - -public class BlockStationary extends BlockFluids { - - protected BlockStationary(Material material) { - super(material); - this.a(false); - if (material == Material.LAVA) { - this.a(true); - } - } - - public void doPhysics(World world, int i, int j, int k, Block block) { - super.doPhysics(world, i, j, k, block); - if (world.getType(i, j, k) == this) { - this.n(world, i, j, k); - } - } - - private void n(World world, int i, int j, int k) { - int l = world.getData(i, j, k); - - world.setTypeAndData(i, j, k, Block.getById(Block.getId(this) - 1), l, 2); - world.a(i, j, k, Block.getById(Block.getId(this) - 1), this.a(world)); - } - - public void a(World world, int i, int j, int k, Random random) { - if (this.material == Material.LAVA) { - int l = random.nextInt(3); - - int i1; - - // CraftBukkit start - Prevent lava putting something on fire, remember igniter block coords - int x = i; - int y = j; - int z = k; - // CraftBukkit end - - for (i1 = 0; i1 < l; ++i1) { - i += random.nextInt(3) - 1; - ++j; - k += random.nextInt(3) - 1; - Block block = world.getType(i, j, k); - - if (block.material == Material.AIR) { - if (this.o(world, i - 1, j, k) || this.o(world, i + 1, j, k) || this.o(world, i, j, k - 1) || this.o(world, i, j, k + 1) || this.o(world, i, j - 1, k) || this.o(world, i, j + 1, k)) { - // CraftBukkit start - Prevent lava putting something on fire - if (world.getType(i, j, k) != Blocks.FIRE) { - if (CraftEventFactory.callBlockIgniteEvent(world, i, j, k, x, y, z).isCancelled()) { - continue; - } - } - // CraftBukkit end - - world.setTypeUpdate(i, j, k, Blocks.FIRE); - return; - } - } else if (block.material.isSolid()) { - return; - } - } - - if (l == 0) { - i1 = i; - int j1 = k; - - for (int k1 = 0; k1 < 3; ++k1) { - i = i1 + random.nextInt(3) - 1; - k = j1 + random.nextInt(3) - 1; - if (world.isEmpty(i, j + 1, k) && this.o(world, i, j, k)) { - // CraftBukkit start - Prevent lava putting something on fire - if (world.getType(i, j + 1, k) != Blocks.FIRE) { - if (CraftEventFactory.callBlockIgniteEvent(world, i, j + 1, k, x, y, z).isCancelled()) { - continue; - } - } - // CraftBukkit end - - world.setTypeUpdate(i, j + 1, k, Blocks.FIRE); - } - } - } - } - } - - private boolean o(World world, int i, int j, int k) { - return world.getType(i, j, k).getMaterial().isBurnable(); - } -} diff --git a/src/main/java/net/minecraft/server/BlockStem.java b/src/main/java/net/minecraft/server/BlockStem.java deleted file mode 100644 index 40ad1c65c2..0000000000 --- a/src/main/java/net/minecraft/server/BlockStem.java +++ /dev/null @@ -1,190 +0,0 @@ -package net.minecraft.server; - -import java.util.Random; - -import org.bukkit.craftbukkit.event.CraftEventFactory; // CraftBukkit - -public class BlockStem extends BlockPlant implements IBlockFragilePlantElement { - - private final Block blockFruit; - - protected BlockStem(Block block) { - this.blockFruit = block; - this.a(true); - float f = 0.125F; - - this.a(0.5F - f, 0.0F, 0.5F - f, 0.5F + f, 0.25F, 0.5F + f); - this.a((CreativeModeTab) null); - } - - protected boolean a(Block block) { - return block == Blocks.SOIL; - } - - public void a(World world, int i, int j, int k, Random random) { - super.a(world, i, j, k, random); - if (world.getLightLevel(i, j + 1, k) >= 9) { - float f = this.n(world, i, j, k); - - if (random.nextInt((int) (25.0F / f) + 1) == 0) { - int l = world.getData(i, j, k); - - if (l < 7) { - ++l; - CraftEventFactory.handleBlockGrowEvent(world, i, j, k, this, l); // CraftBukkit - } else { - if (world.getType(i - 1, j, k) == this.blockFruit) { - return; - } - - if (world.getType(i + 1, j, k) == this.blockFruit) { - return; - } - - if (world.getType(i, j, k - 1) == this.blockFruit) { - return; - } - - if (world.getType(i, j, k + 1) == this.blockFruit) { - return; - } - - int i1 = random.nextInt(4); - int j1 = i; - int k1 = k; - - if (i1 == 0) { - j1 = i - 1; - } - - if (i1 == 1) { - ++j1; - } - - if (i1 == 2) { - k1 = k - 1; - } - - if (i1 == 3) { - ++k1; - } - - Block block = world.getType(j1, j - 1, k1); - - if (world.getType(j1, j, k1).material == Material.AIR && (block == Blocks.SOIL || block == Blocks.DIRT || block == Blocks.GRASS)) { - CraftEventFactory.handleBlockGrowEvent(world, j1, j, k1, this.blockFruit, 0); // CraftBukkit - } - } - } - } - } - - public void m(World world, int i, int j, int k) { - int l = world.getData(i, j, k) + MathHelper.nextInt(world.random, 2, 5); - - if (l > 7) { - l = 7; - } - - CraftEventFactory.handleBlockGrowEvent(world, i, j, k, this, l); // CraftBukkit - } - - private float n(World world, int i, int j, int k) { - float f = 1.0F; - Block block = world.getType(i, j, k - 1); - Block block1 = world.getType(i, j, k + 1); - Block block2 = world.getType(i - 1, j, k); - Block block3 = world.getType(i + 1, j, k); - Block block4 = world.getType(i - 1, j, k - 1); - Block block5 = world.getType(i + 1, j, k - 1); - Block block6 = world.getType(i + 1, j, k + 1); - Block block7 = world.getType(i - 1, j, k + 1); - boolean flag = block2 == this || block3 == this; - boolean flag1 = block == this || block1 == this; - boolean flag2 = block4 == this || block5 == this || block6 == this || block7 == this; - - for (int l = i - 1; l <= i + 1; ++l) { - for (int i1 = k - 1; i1 <= k + 1; ++i1) { - Block block8 = world.getType(l, j - 1, i1); - float f1 = 0.0F; - - if (block8 == Blocks.SOIL) { - f1 = 1.0F; - if (world.getData(l, j - 1, i1) > 0) { - f1 = 3.0F; - } - } - - if (l != i || i1 != k) { - f1 /= 4.0F; - } - - f += f1; - } - } - - if (flag2 || flag && flag1) { - f /= 2.0F; - } - - return f; - } - - public void g() { - float f = 0.125F; - - this.a(0.5F - f, 0.0F, 0.5F - f, 0.5F + f, 0.25F, 0.5F + f); - } - - public void updateShape(IBlockAccess iblockaccess, int i, int j, int k) { - this.maxY = (double) ((float) (iblockaccess.getData(i, j, k) * 2 + 2) / 16.0F); - float f = 0.125F; - - this.a(0.5F - f, 0.0F, 0.5F - f, 0.5F + f, (float) this.maxY, 0.5F + f); - } - - public int b() { - return 19; - } - - public void dropNaturally(World world, int i, int j, int k, int l, float f, int i1) { - super.dropNaturally(world, i, j, k, l, f, i1); - if (!world.isStatic) { - Item item = null; - - if (this.blockFruit == Blocks.PUMPKIN) { - item = Items.PUMPKIN_SEEDS; - } - - if (this.blockFruit == Blocks.MELON) { - item = Items.MELON_SEEDS; - } - - for (int j1 = 0; j1 < 3; ++j1) { - if (world.random.nextInt(15) <= l) { - this.a(world, i, j, k, new ItemStack(item)); - } - } - } - } - - public Item getDropType(int i, Random random, int j) { - return null; - } - - public int a(Random random) { - return 1; - } - - public boolean a(World world, int i, int j, int k, boolean flag) { - return world.getData(i, j, k) != 7; - } - - public boolean a(World world, Random random, int i, int j, int k) { - return true; - } - - public void b(World world, Random random, int i, int j, int k) { - this.m(world, i, j, k); - } -} diff --git a/src/main/java/net/minecraft/server/BlockTallPlant.java b/src/main/java/net/minecraft/server/BlockTallPlant.java deleted file mode 100644 index f8adc614f9..0000000000 --- a/src/main/java/net/minecraft/server/BlockTallPlant.java +++ /dev/null @@ -1,160 +0,0 @@ -package net.minecraft.server; - -import java.util.Random; - -public class BlockTallPlant extends BlockPlant implements IBlockFragilePlantElement { - - public static final String[] a = new String[] { "sunflower", "syringa", "grass", "fern", "rose", "paeonia"}; - - public BlockTallPlant() { - super(Material.PLANT); - this.c(0.0F); - this.a(h); - this.c("doublePlant"); - } - - public int b() { - return 40; - } - - public void updateShape(IBlockAccess iblockaccess, int i, int j, int k) { - this.a(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F); - } - - public int e(IBlockAccess iblockaccess, int i, int j, int k) { - int l = iblockaccess.getData(i, j, k); - - return !c(l) ? l & 7 : iblockaccess.getData(i, j - 1, k) & 7; - } - - public boolean canPlace(World world, int i, int j, int k) { - return super.canPlace(world, i, j, k) && world.isEmpty(i, j + 1, k); - } - - protected void e(World world, int i, int j, int k) { - if (!this.j(world, i, j, k)) { - int l = world.getData(i, j, k); - - if (!c(l)) { - this.b(world, i, j, k, l, 0); - if (world.getType(i, j + 1, k) == this) { - world.setTypeAndData(i, j + 1, k, Blocks.AIR, 0, 2); - } - } - - world.setTypeAndData(i, j, k, Blocks.AIR, 0, 2); - } - } - - public boolean j(World world, int i, int j, int k) { - int l = world.getData(i, j, k); - - return c(l) ? world.getType(i, j - 1, k) == this : world.getType(i, j + 1, k) == this && super.j(world, i, j, k); - } - - public Item getDropType(int i, Random random, int j) { - if (c(i)) { - return null; - } else { - int k = d(i); - - return k != 3 && k != 2 ? Item.getItemOf(this) : null; - } - } - - public int getDropData(int i) { - return c(i) ? 0 : i & 7; - } - - public static boolean c(int i) { - return (i & 8) != 0; - } - - public static int d(int i) { - return i & 7; - } - - public void c(World world, int i, int j, int k, int l, int i1) { - world.setTypeAndData(i, j, k, this, l, i1); - org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockGrowEvent(world, i, j + 1, k, this, 8); // CraftBukkit - } - - public void postPlace(World world, int i, int j, int k, EntityLiving entityliving, ItemStack itemstack) { - int l = ((MathHelper.floor((double) (entityliving.yaw * 4.0F / 360.0F) + 0.5D) & 3) + 2) % 4; - - world.setTypeAndData(i, j + 1, k, this, 8 | l, 2); - } - - public void a(World world, EntityHuman entityhuman, int i, int j, int k, int l) { - if (world.isStatic || entityhuman.bF() == null || entityhuman.bF().getItem() != Items.SHEARS || c(l) || !this.b(world, i, j, k, l, entityhuman)) { - super.a(world, entityhuman, i, j, k, l); - } - } - - public void a(World world, int i, int j, int k, int l, EntityHuman entityhuman) { - if (c(l)) { - if (world.getType(i, j - 1, k) == this) { - if (!entityhuman.abilities.canInstantlyBuild) { - int i1 = world.getData(i, j - 1, k); - int j1 = d(i1); - - if (j1 != 3 && j1 != 2) { - world.setAir(i, j - 1, k, true); - } else { - if (!world.isStatic && entityhuman.bF() != null && entityhuman.bF().getItem() == Items.SHEARS) { - this.b(world, i, j, k, i1, entityhuman); - } - - world.setAir(i, j - 1, k); - } - } else { - world.setAir(i, j - 1, k); - } - } - } else if (entityhuman.abilities.canInstantlyBuild && world.getType(i, j + 1, k) == this) { - world.setTypeAndData(i, j + 1, k, Blocks.AIR, 0, 2); - } - - super.a(world, i, j, k, l, entityhuman); - } - - private boolean b(World world, int i, int j, int k, int l, EntityHuman entityhuman) { - int i1 = d(l); - - if (i1 != 3 && i1 != 2) { - return false; - } else { - entityhuman.a(StatisticList.MINE_BLOCK_COUNT[Block.getId(this)], 1); - byte b0 = 1; - - if (i1 == 3) { - b0 = 2; - } - - this.a(world, i, j, k, new ItemStack(Blocks.LONG_GRASS, 2, b0)); - return true; - } - } - - public int getDropData(World world, int i, int j, int k) { - int l = world.getData(i, j, k); - - return c(l) ? d(world.getData(i, j - 1, k)) : d(l); - } - - public boolean a(World world, int i, int j, int k, boolean flag) { - int l = this.e((IBlockAccess) world, i, j, k); - - return l != 2 && l != 3; - } - - public boolean a(World world, Random random, int i, int j, int k) { - return true; - } - - public void b(World world, Random random, int i, int j, int k) { - int l = this.e((IBlockAccess) world, i, j, k); - - this.a(world, i, j, k, new ItemStack(this, 1, l)); - } -} diff --git a/src/main/java/net/minecraft/server/BlockTrapdoor.java b/src/main/java/net/minecraft/server/BlockTrapdoor.java deleted file mode 100644 index ecc429ea91..0000000000 --- a/src/main/java/net/minecraft/server/BlockTrapdoor.java +++ /dev/null @@ -1,212 +0,0 @@ -package net.minecraft.server; - -import org.bukkit.event.block.BlockRedstoneEvent; // CraftBukkit - -public class BlockTrapdoor extends Block { - - protected BlockTrapdoor(Material material) { - super(material); - float f = 0.5F; - float f1 = 1.0F; - - this.a(0.5F - f, 0.0F, 0.5F - f, 0.5F + f, f1, 0.5F + f); - this.a(CreativeModeTab.d); - } - - public boolean c() { - return false; - } - - public boolean d() { - return false; - } - - public boolean b(IBlockAccess iblockaccess, int i, int j, int k) { - return !d(iblockaccess.getData(i, j, k)); - } - - public int b() { - return 0; - } - - public AxisAlignedBB a(World world, int i, int j, int k) { - this.updateShape(world, i, j, k); - return super.a(world, i, j, k); - } - - public void updateShape(IBlockAccess iblockaccess, int i, int j, int k) { - this.b(iblockaccess.getData(i, j, k)); - } - - public void g() { - float f = 0.1875F; - - this.a(0.0F, 0.5F - f / 2.0F, 0.0F, 1.0F, 0.5F + f / 2.0F, 1.0F); - } - - public void b(int i) { - float f = 0.1875F; - - if ((i & 8) != 0) { - this.a(0.0F, 1.0F - f, 0.0F, 1.0F, 1.0F, 1.0F); - } else { - this.a(0.0F, 0.0F, 0.0F, 1.0F, f, 1.0F); - } - - if (d(i)) { - if ((i & 3) == 0) { - this.a(0.0F, 0.0F, 1.0F - f, 1.0F, 1.0F, 1.0F); - } - - if ((i & 3) == 1) { - this.a(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, f); - } - - if ((i & 3) == 2) { - this.a(1.0F - f, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F); - } - - if ((i & 3) == 3) { - this.a(0.0F, 0.0F, 0.0F, f, 1.0F, 1.0F); - } - } - } - - public void attack(World world, int i, int j, int k, EntityHuman entityhuman) {} - - public boolean interact(World world, int i, int j, int k, EntityHuman entityhuman, int l, float f, float f1, float f2) { - if (this.material == Material.ORE) { - return true; - } else { - int i1 = world.getData(i, j, k); - - world.setData(i, j, k, i1 ^ 4, 2); - world.a(entityhuman, 1003, i, j, k, 0); - return true; - } - } - - public void setOpen(World world, int i, int j, int k, boolean flag) { - int l = world.getData(i, j, k); - boolean flag1 = (l & 4) > 0; - - if (flag1 != flag) { - world.setData(i, j, k, l ^ 4, 2); - world.a((EntityHuman) null, 1003, i, j, k, 0); - } - } - - public void doPhysics(World world, int i, int j, int k, Block block) { - if (!world.isStatic) { - int l = world.getData(i, j, k); - int i1 = i; - int j1 = k; - - if ((l & 3) == 0) { - j1 = k + 1; - } - - if ((l & 3) == 1) { - --j1; - } - - if ((l & 3) == 2) { - i1 = i + 1; - } - - if ((l & 3) == 3) { - --i1; - } - - if (!a(world.getType(i1, j, j1))) { - world.setAir(i, j, k); - this.b(world, i, j, k, l, 0); - } - - boolean flag = world.isBlockIndirectlyPowered(i, j, k); - - if (flag || block.isPowerSource()) { - // CraftBukkit start - org.bukkit.World bworld = world.getWorld(); - org.bukkit.block.Block bblock = bworld.getBlockAt(i, j, k); - - int power = bblock.getBlockPower(); - int oldPower = (world.getData(i, j, k) & 4) > 0 ? 15 : 0; - - if (oldPower == 0 ^ power == 0 || block.isPowerSource()) { - BlockRedstoneEvent eventRedstone = new BlockRedstoneEvent(bblock, oldPower, power); - world.getServer().getPluginManager().callEvent(eventRedstone); - flag = eventRedstone.getNewCurrent() > 0; - } - // CraftBukkit end - - this.setOpen(world, i, j, k, flag); - } - } - } - - public MovingObjectPosition a(World world, int i, int j, int k, Vec3D vec3d, Vec3D vec3d1) { - this.updateShape(world, i, j, k); - return super.a(world, i, j, k, vec3d, vec3d1); - } - - public int getPlacedData(World world, int i, int j, int k, int l, float f, float f1, float f2, int i1) { - int j1 = 0; - - if (l == 2) { - j1 = 0; - } - - if (l == 3) { - j1 = 1; - } - - if (l == 4) { - j1 = 2; - } - - if (l == 5) { - j1 = 3; - } - - if (l != 1 && l != 0 && f1 > 0.5F) { - j1 |= 8; - } - - return j1; - } - - public boolean canPlace(World world, int i, int j, int k, int l) { - if (l == 0) { - return false; - } else if (l == 1) { - return false; - } else { - if (l == 2) { - ++k; - } - - if (l == 3) { - --k; - } - - if (l == 4) { - ++i; - } - - if (l == 5) { - --i; - } - - return a(world.getType(i, j, k)); - } - } - - public static boolean d(int i) { - return (i & 4) != 0; - } - - private static boolean a(Block block) { - return block.material.k() && block.d() || block == Blocks.GLOWSTONE || block instanceof BlockStepAbstract || block instanceof BlockStairs; - } -} diff --git a/src/main/java/net/minecraft/server/BlockTripwire.java b/src/main/java/net/minecraft/server/BlockTripwire.java deleted file mode 100644 index cf84d794c0..0000000000 --- a/src/main/java/net/minecraft/server/BlockTripwire.java +++ /dev/null @@ -1,201 +0,0 @@ -package net.minecraft.server; - -import java.util.Iterator; -import java.util.List; -import java.util.Random; - -import org.bukkit.event.entity.EntityInteractEvent; // CraftBukkit - -public class BlockTripwire extends Block { - - public BlockTripwire() { - super(Material.ORIENTABLE); - this.a(0.0F, 0.0F, 0.0F, 1.0F, 0.15625F, 1.0F); - this.a(true); - } - - public int a(World world) { - return 10; - } - - public AxisAlignedBB a(World world, int i, int j, int k) { - return null; - } - - public boolean c() { - return false; - } - - public boolean d() { - return false; - } - - public int b() { - return 30; - } - - public Item getDropType(int i, Random random, int j) { - return Items.STRING; - } - - public void doPhysics(World world, int i, int j, int k, Block block) { - int l = world.getData(i, j, k); - boolean flag = (l & 2) == 2; - boolean flag1 = !World.a((IBlockAccess) world, i, j - 1, k); - - if (flag != flag1) { - this.b(world, i, j, k, l, 0); - world.setAir(i, j, k); - } - } - - public void updateShape(IBlockAccess iblockaccess, int i, int j, int k) { - int l = iblockaccess.getData(i, j, k); - boolean flag = (l & 4) == 4; - boolean flag1 = (l & 2) == 2; - - if (!flag1) { - this.a(0.0F, 0.0F, 0.0F, 1.0F, 0.09375F, 1.0F); - } else if (!flag) { - this.a(0.0F, 0.0F, 0.0F, 1.0F, 0.5F, 1.0F); - } else { - this.a(0.0F, 0.0625F, 0.0F, 1.0F, 0.15625F, 1.0F); - } - } - - public void onPlace(World world, int i, int j, int k) { - int l = World.a((IBlockAccess) world, i, j - 1, k) ? 0 : 2; - - world.setData(i, j, k, l, 3); - this.a(world, i, j, k, l); - } - - public void remove(World world, int i, int j, int k, Block block, int l) { - this.a(world, i, j, k, l | 1); - } - - public void a(World world, int i, int j, int k, int l, EntityHuman entityhuman) { - if (!world.isStatic) { - if (entityhuman.bF() != null && entityhuman.bF().getItem() == Items.SHEARS) { - world.setData(i, j, k, l | 8, 4); - } - } - } - - private void a(World world, int i, int j, int k, int l) { - int i1 = 0; - - while (i1 < 2) { - int j1 = 1; - - while (true) { - if (j1 < 42) { - int k1 = i + Direction.a[i1] * j1; - int l1 = k + Direction.b[i1] * j1; - Block block = world.getType(k1, j, l1); - - if (block == Blocks.TRIPWIRE_SOURCE) { - int i2 = world.getData(k1, j, l1) & 3; - - if (i2 == Direction.f[i1]) { - Blocks.TRIPWIRE_SOURCE.a(world, k1, j, l1, false, world.getData(k1, j, l1), true, j1, l); - } - } else if (block == Blocks.TRIPWIRE) { - ++j1; - continue; - } - } - - ++i1; - break; - } - } - } - - public void a(World world, int i, int j, int k, Entity entity) { - if (!world.isStatic) { - if ((world.getData(i, j, k) & 1) != 1) { - this.e(world, i, j, k); - } - } - } - - public void a(World world, int i, int j, int k, Random random) { - if (!world.isStatic) { - if ((world.getData(i, j, k) & 1) == 1) { - this.e(world, i, j, k); - } - } - } - - private void e(World world, int i, int j, int k) { - int l = world.getData(i, j, k); - boolean flag = (l & 1) == 1; - boolean flag1 = false; - List list = world.getEntities((Entity) null, AxisAlignedBB.a((double) i + this.minX, (double) j + this.minY, (double) k + this.minZ, (double) i + this.maxX, (double) j + this.maxY, (double) k + this.maxZ)); - - if (!list.isEmpty()) { - Iterator iterator = list.iterator(); - - while (iterator.hasNext()) { - Entity entity = (Entity) iterator.next(); - - if (!entity.az()) { - flag1 = true; - break; - } - } - } - - // CraftBukkit start - Call interact even when triggering connected tripwire - if (flag != flag1 && flag1 && (world.getData(i, j, k) & 4) == 4) { - org.bukkit.World bworld = world.getWorld(); - org.bukkit.plugin.PluginManager manager = world.getServer().getPluginManager(); - org.bukkit.block.Block block = bworld.getBlockAt(i, j, k); - boolean allowed = false; - - // If all of the events are cancelled block the tripwire trigger, else allow - for (Object object : list) { - if (object != null) { - org.bukkit.event.Cancellable cancellable; - - if (object instanceof EntityHuman) { - cancellable = org.bukkit.craftbukkit.event.CraftEventFactory.callPlayerInteractEvent((EntityHuman) object, org.bukkit.event.block.Action.PHYSICAL, i, j, k, -1, null); - } else if (object instanceof Entity) { - cancellable = new EntityInteractEvent(((Entity) object).getBukkitEntity(), block); - manager.callEvent((EntityInteractEvent) cancellable); - } else { - continue; - } - - if (!cancellable.isCancelled()) { - allowed = true; - break; - } - } - } - - if (!allowed) { - return; - } - } - // CraftBukkit end - - if (flag1 && !flag) { - l |= 1; - } - - if (!flag1 && flag) { - l &= -2; - } - - if (flag1 != flag) { - world.setData(i, j, k, l, 3); - this.a(world, i, j, k, l); - } - - if (flag1) { - world.a(i, j, k, this, this.a(world)); - } - } -} diff --git a/src/main/java/net/minecraft/server/BlockTripwireHook.java b/src/main/java/net/minecraft/server/BlockTripwireHook.java deleted file mode 100644 index c23426583e..0000000000 --- a/src/main/java/net/minecraft/server/BlockTripwireHook.java +++ /dev/null @@ -1,300 +0,0 @@ -package net.minecraft.server; - -import java.util.Random; - -import org.bukkit.event.block.BlockRedstoneEvent; // CraftBukkit - -public class BlockTripwireHook extends Block { - - public BlockTripwireHook() { - super(Material.ORIENTABLE); - this.a(CreativeModeTab.d); - this.a(true); - } - - public AxisAlignedBB a(World world, int i, int j, int k) { - return null; - } - - public boolean c() { - return false; - } - - public boolean d() { - return false; - } - - public int b() { - return 29; - } - - public int a(World world) { - return 10; - } - - public boolean canPlace(World world, int i, int j, int k, int l) { - return l == 2 && world.getType(i, j, k + 1).r() ? true : (l == 3 && world.getType(i, j, k - 1).r() ? true : (l == 4 && world.getType(i + 1, j, k).r() ? true : l == 5 && world.getType(i - 1, j, k).r())); - } - - public boolean canPlace(World world, int i, int j, int k) { - return world.getType(i - 1, j, k).r() ? true : (world.getType(i + 1, j, k).r() ? true : (world.getType(i, j, k - 1).r() ? true : world.getType(i, j, k + 1).r())); - } - - public int getPlacedData(World world, int i, int j, int k, int l, float f, float f1, float f2, int i1) { - byte b0 = 0; - - if (l == 2 && world.c(i, j, k + 1, true)) { - b0 = 2; - } - - if (l == 3 && world.c(i, j, k - 1, true)) { - b0 = 0; - } - - if (l == 4 && world.c(i + 1, j, k, true)) { - b0 = 1; - } - - if (l == 5 && world.c(i - 1, j, k, true)) { - b0 = 3; - } - - return b0; - } - - public void postPlace(World world, int i, int j, int k, int l) { - this.a(world, i, j, k, false, l, false, -1, 0); - } - - public void doPhysics(World world, int i, int j, int k, Block block) { - if (block != this) { - if (this.e(world, i, j, k)) { - int l = world.getData(i, j, k); - int i1 = l & 3; - boolean flag = false; - - if (!world.getType(i - 1, j, k).r() && i1 == 3) { - flag = true; - } - - if (!world.getType(i + 1, j, k).r() && i1 == 1) { - flag = true; - } - - if (!world.getType(i, j, k - 1).r() && i1 == 0) { - flag = true; - } - - if (!world.getType(i, j, k + 1).r() && i1 == 2) { - flag = true; - } - - if (flag) { - this.b(world, i, j, k, l, 0); - world.setAir(i, j, k); - } - } - } - } - - public void a(World world, int i, int j, int k, boolean flag, int l, boolean flag1, int i1, int j1) { - int k1 = l & 3; - boolean flag2 = (l & 4) == 4; - boolean flag3 = (l & 8) == 8; - boolean flag4 = !flag; - boolean flag5 = false; - boolean flag6 = !World.a((IBlockAccess) world, i, j - 1, k); - int l1 = Direction.a[k1]; - int i2 = Direction.b[k1]; - int j2 = 0; - int[] aint = new int[42]; - - int k2; - int l2; - int i3; - int j3; - - for (l2 = 1; l2 < 42; ++l2) { - k2 = i + l1 * l2; - i3 = k + i2 * l2; - Block block = world.getType(k2, j, i3); - - if (block == Blocks.TRIPWIRE_SOURCE) { - j3 = world.getData(k2, j, i3); - if ((j3 & 3) == Direction.f[k1]) { - j2 = l2; - } - break; - } - - if (block != Blocks.TRIPWIRE && l2 != i1) { - aint[l2] = -1; - flag4 = false; - } else { - j3 = l2 == i1 ? j1 : world.getData(k2, j, i3); - boolean flag7 = (j3 & 8) != 8; - boolean flag8 = (j3 & 1) == 1; - boolean flag9 = (j3 & 2) == 2; - - flag4 &= flag9 == flag6; - flag5 |= flag7 && flag8; - aint[l2] = j3; - if (l2 == i1) { - world.a(i, j, k, this, this.a(world)); - flag4 &= flag7; - } - } - } - - flag4 &= j2 > 1; - flag5 &= flag4; - l2 = (flag4 ? 4 : 0) | (flag5 ? 8 : 0); - l = k1 | l2; - int k3; - - if (j2 > 0) { - k2 = i + l1 * j2; - i3 = k + i2 * j2; - k3 = Direction.f[k1]; - world.setData(k2, j, i3, k3 | l2, 3); - this.a(world, k2, j, i3, k3); - this.a(world, k2, j, i3, flag4, flag5, flag2, flag3); - } - - // CraftBukkit start - org.bukkit.block.Block block = world.getWorld().getBlockAt(i, j, k); - - BlockRedstoneEvent eventRedstone = new BlockRedstoneEvent(block, 15, 0); - world.getServer().getPluginManager().callEvent(eventRedstone); - - if (eventRedstone.getNewCurrent() > 0) { - return; - } - // CraftBukkit end - - this.a(world, i, j, k, flag4, flag5, flag2, flag3); - if (!flag) { - world.setData(i, j, k, l, 3); - if (flag1) { - this.a(world, i, j, k, k1); - } - } - - if (flag2 != flag4) { - for (k2 = 1; k2 < j2; ++k2) { - i3 = i + l1 * k2; - k3 = k + i2 * k2; - j3 = aint[k2]; - if (j3 >= 0) { - if (flag4) { - j3 |= 4; - } else { - j3 &= -5; - } - - world.setData(i3, j, k3, j3, 3); - } - } - } - } - - public void a(World world, int i, int j, int k, Random random) { - this.a(world, i, j, k, false, world.getData(i, j, k), true, -1, 0); - } - - private void a(World world, int i, int j, int k, boolean flag, boolean flag1, boolean flag2, boolean flag3) { - if (flag1 && !flag3) { - world.makeSound((double) i + 0.5D, (double) j + 0.1D, (double) k + 0.5D, "random.click", 0.4F, 0.6F); - } else if (!flag1 && flag3) { - world.makeSound((double) i + 0.5D, (double) j + 0.1D, (double) k + 0.5D, "random.click", 0.4F, 0.5F); - } else if (flag && !flag2) { - world.makeSound((double) i + 0.5D, (double) j + 0.1D, (double) k + 0.5D, "random.click", 0.4F, 0.7F); - } else if (!flag && flag2) { - world.makeSound((double) i + 0.5D, (double) j + 0.1D, (double) k + 0.5D, "random.bowhit", 0.4F, 1.2F / (world.random.nextFloat() * 0.2F + 0.9F)); - } - } - - private void a(World world, int i, int j, int k, int l) { - world.applyPhysics(i, j, k, this); - if (l == 3) { - world.applyPhysics(i - 1, j, k, this); - } else if (l == 1) { - world.applyPhysics(i + 1, j, k, this); - } else if (l == 0) { - world.applyPhysics(i, j, k - 1, this); - } else if (l == 2) { - world.applyPhysics(i, j, k + 1, this); - } - } - - private boolean e(World world, int i, int j, int k) { - if (!this.canPlace(world, i, j, k)) { - this.b(world, i, j, k, world.getData(i, j, k), 0); - world.setAir(i, j, k); - return false; - } else { - return true; - } - } - - public void updateShape(IBlockAccess iblockaccess, int i, int j, int k) { - int l = iblockaccess.getData(i, j, k) & 3; - float f = 0.1875F; - - if (l == 3) { - this.a(0.0F, 0.2F, 0.5F - f, f * 2.0F, 0.8F, 0.5F + f); - } else if (l == 1) { - this.a(1.0F - f * 2.0F, 0.2F, 0.5F - f, 1.0F, 0.8F, 0.5F + f); - } else if (l == 0) { - this.a(0.5F - f, 0.2F, 0.0F, 0.5F + f, 0.8F, f * 2.0F); - } else if (l == 2) { - this.a(0.5F - f, 0.2F, 1.0F - f * 2.0F, 0.5F + f, 0.8F, 1.0F); - } - } - - public void remove(World world, int i, int j, int k, Block block, int l) { - boolean flag = (l & 4) == 4; - boolean flag1 = (l & 8) == 8; - - if (flag || flag1) { - this.a(world, i, j, k, true, l, false, -1, 0); - } - - if (flag1) { - world.applyPhysics(i, j, k, this); - int i1 = l & 3; - - if (i1 == 3) { - world.applyPhysics(i - 1, j, k, this); - } else if (i1 == 1) { - world.applyPhysics(i + 1, j, k, this); - } else if (i1 == 0) { - world.applyPhysics(i, j, k - 1, this); - } else if (i1 == 2) { - world.applyPhysics(i, j, k + 1, this); - } - } - - super.remove(world, i, j, k, block, l); - } - - public int b(IBlockAccess iblockaccess, int i, int j, int k, int l) { - return (iblockaccess.getData(i, j, k) & 8) == 8 ? 15 : 0; - } - - public int c(IBlockAccess iblockaccess, int i, int j, int k, int l) { - int i1 = iblockaccess.getData(i, j, k); - - if ((i1 & 8) != 8) { - return 0; - } else { - int j1 = i1 & 3; - - return j1 == 2 && l == 2 ? 15 : (j1 == 0 && l == 3 ? 15 : (j1 == 1 && l == 4 ? 15 : (j1 == 3 && l == 5 ? 15 : 0))); - } - } - - public boolean isPowerSource() { - return true; - } -} diff --git a/src/main/java/net/minecraft/server/BlockVine.java b/src/main/java/net/minecraft/server/BlockVine.java deleted file mode 100644 index ed00714013..0000000000 --- a/src/main/java/net/minecraft/server/BlockVine.java +++ /dev/null @@ -1,304 +0,0 @@ -package net.minecraft.server; - -import java.util.Random; - -import org.bukkit.craftbukkit.event.CraftEventFactory; // CraftBukkit - -public class BlockVine extends Block { - - public BlockVine() { - super(Material.REPLACEABLE_PLANT); - this.a(true); - this.a(CreativeModeTab.c); - } - - public void g() { - this.a(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F); - } - - public int b() { - return 20; - } - - public boolean c() { - return false; - } - - public boolean d() { - return false; - } - - public void updateShape(IBlockAccess iblockaccess, int i, int j, int k) { - float f = 0.0625F; - int l = iblockaccess.getData(i, j, k); - float f1 = 1.0F; - float f2 = 1.0F; - float f3 = 1.0F; - float f4 = 0.0F; - float f5 = 0.0F; - float f6 = 0.0F; - boolean flag = l > 0; - - if ((l & 2) != 0) { - f4 = Math.max(f4, 0.0625F); - f1 = 0.0F; - f2 = 0.0F; - f5 = 1.0F; - f3 = 0.0F; - f6 = 1.0F; - flag = true; - } - - if ((l & 8) != 0) { - f1 = Math.min(f1, 0.9375F); - f4 = 1.0F; - f2 = 0.0F; - f5 = 1.0F; - f3 = 0.0F; - f6 = 1.0F; - flag = true; - } - - if ((l & 4) != 0) { - f6 = Math.max(f6, 0.0625F); - f3 = 0.0F; - f1 = 0.0F; - f4 = 1.0F; - f2 = 0.0F; - f5 = 1.0F; - flag = true; - } - - if ((l & 1) != 0) { - f3 = Math.min(f3, 0.9375F); - f6 = 1.0F; - f1 = 0.0F; - f4 = 1.0F; - f2 = 0.0F; - f5 = 1.0F; - flag = true; - } - - if (!flag && this.a(iblockaccess.getType(i, j + 1, k))) { - f2 = Math.min(f2, 0.9375F); - f5 = 1.0F; - f1 = 0.0F; - f4 = 1.0F; - f3 = 0.0F; - f6 = 1.0F; - } - - this.a(f1, f2, f3, f4, f5, f6); - } - - public AxisAlignedBB a(World world, int i, int j, int k) { - return null; - } - - public boolean canPlace(World world, int i, int j, int k, int l) { - switch (l) { - case 1: - return this.a(world.getType(i, j + 1, k)); - - case 2: - return this.a(world.getType(i, j, k + 1)); - - case 3: - return this.a(world.getType(i, j, k - 1)); - - case 4: - return this.a(world.getType(i + 1, j, k)); - - case 5: - return this.a(world.getType(i - 1, j, k)); - - default: - return false; - } - } - - private boolean a(Block block) { - return block.d() && block.material.isSolid(); - } - - private boolean e(World world, int i, int j, int k) { - int l = world.getData(i, j, k); - int i1 = l; - - if (l > 0) { - for (int j1 = 0; j1 <= 3; ++j1) { - int k1 = 1 << j1; - - if ((l & k1) != 0 && !this.a(world.getType(i + Direction.a[j1], j, k + Direction.b[j1])) && (world.getType(i, j + 1, k) != this || (world.getData(i, j + 1, k) & k1) == 0)) { - i1 &= ~k1; - } - } - } - - if (i1 == 0 && !this.a(world.getType(i, j + 1, k))) { - return false; - } else { - if (i1 != l) { - world.setData(i, j, k, i1, 2); - } - - return true; - } - } - - public void doPhysics(World world, int i, int j, int k, Block block) { - if (!world.isStatic && !this.e(world, i, j, k)) { - this.b(world, i, j, k, world.getData(i, j, k), 0); - world.setAir(i, j, k); - } - } - - public void a(World world, int i, int j, int k, Random random) { - if (!world.isStatic && world.random.nextInt(4) == 0) { - byte b0 = 4; - int l = 5; - boolean flag = false; - - int i1; - int j1; - int k1; - - label134: - for (i1 = i - b0; i1 <= i + b0; ++i1) { - for (j1 = k - b0; j1 <= k + b0; ++j1) { - for (k1 = j - 1; k1 <= j + 1; ++k1) { - if (world.getType(i1, k1, j1) == this) { - --l; - if (l <= 0) { - flag = true; - break label134; - } - } - } - } - } - - i1 = world.getData(i, j, k); - j1 = world.random.nextInt(6); - k1 = Direction.e[j1]; - int l1; - - if (j1 == 1 && j < 255 && world.isEmpty(i, j + 1, k)) { - if (flag) { - return; - } - - int i2 = world.random.nextInt(16) & i1; - - if (i2 > 0) { - for (l1 = 0; l1 <= 3; ++l1) { - if (!this.a(world.getType(i + Direction.a[l1], j + 1, k + Direction.b[l1]))) { - i2 &= ~(1 << l1); - } - } - - if (i2 > 0) { - // CraftBukkit start - Call BlockSpreadEvent - org.bukkit.block.Block source = world.getWorld().getBlockAt(i, j, k); - org.bukkit.block.Block block = world.getWorld().getBlockAt(i, j + 1, k); - CraftEventFactory.handleBlockSpreadEvent(block, source, this, l1); - // CraftBukkit end - } - } - } else { - Block block; - int j2; - - if (j1 >= 2 && j1 <= 5 && (i1 & 1 << k1) == 0) { - if (flag) { - return; - } - - block = world.getType(i + Direction.a[k1], j, k + Direction.b[k1]); - if (block.material == Material.AIR) { - l1 = k1 + 1 & 3; - j2 = k1 + 3 & 3; - - // CraftBukkit start - Call BlockSpreadEvent - org.bukkit.block.Block source = world.getWorld().getBlockAt(i, j, k); - org.bukkit.block.Block bukkitBlock = world.getWorld().getBlockAt(i + Direction.a[k1], j, k + Direction.b[k1]); - if ((i1 & 1 << l1) != 0 && this.a(world.getType(i + Direction.a[k1] + Direction.a[l1], j, k + Direction.b[k1] + Direction.b[l1]))) { - CraftEventFactory.handleBlockSpreadEvent(bukkitBlock, source, this, 1 << l1); - } else if ((i1 & 1 << j2) != 0 && this.a(world.getType(i + Direction.a[k1] + Direction.a[j2], j, k + Direction.b[k1] + Direction.b[j2]))) { - CraftEventFactory.handleBlockSpreadEvent(bukkitBlock, source, this, 1 << j2); - } else if ((i1 & 1 << l1) != 0 && world.isEmpty(i + Direction.a[k1] + Direction.a[l1], j, k + Direction.b[k1] + Direction.b[l1]) && this.a(world.getType(i + Direction.a[l1], j, k + Direction.b[l1]))) { - bukkitBlock = world.getWorld().getBlockAt(i + Direction.a[k1] + Direction.a[l1], j, k + Direction.b[k1] + Direction.b[l1]); - CraftEventFactory.handleBlockSpreadEvent(bukkitBlock, source, this, 1 << (k1 + 2 & 3)); - } else if ((i1 & 1 << j2) != 0 && world.isEmpty(i + Direction.a[k1] + Direction.a[j2], j, k + Direction.b[k1] + Direction.b[j2]) && this.a(world.getType(i + Direction.a[j2], j, k + Direction.b[j2]))) { - bukkitBlock = world.getWorld().getBlockAt(i + Direction.a[k1] + Direction.a[j2], j, k + Direction.b[k1] + Direction.b[j2]); - CraftEventFactory.handleBlockSpreadEvent(bukkitBlock, source, this, 1 << (k1 + 2 & 3)); - } else if (this.a(world.getType(i + Direction.a[k1], j + 1, k + Direction.b[k1]))) { - CraftEventFactory.handleBlockSpreadEvent(bukkitBlock, source, this, 0); - } - // CraftBukkit end - } else if (block.material.k() && block.d()) { - world.setData(i, j, k, i1 | 1 << k1, 2); - } - } else if (j > 1) { - block = world.getType(i, j - 1, k); - if (block.material == Material.AIR) { - l1 = world.random.nextInt(16) & i1; - if (l1 > 0) { - // CraftBukkit start - Call BlockSpreadEvent - org.bukkit.block.Block source = world.getWorld().getBlockAt(i, j, k); - org.bukkit.block.Block bukkitBlock = world.getWorld().getBlockAt(i, j - 1, k); - CraftEventFactory.handleBlockSpreadEvent(bukkitBlock, source, this, l1); - // CraftBukkit end - } - } else if (block == this) { - l1 = world.random.nextInt(16) & i1; - j2 = world.getData(i, j - 1, k); - if (j2 != (j2 | l1)) { - world.setData(i, j - 1, k, j2 | l1, 2); - } - } - } - } - } - } - - public int getPlacedData(World world, int i, int j, int k, int l, float f, float f1, float f2, int i1) { - byte b0 = 0; - - switch (l) { - case 2: - b0 = 1; - break; - - case 3: - b0 = 4; - break; - - case 4: - b0 = 8; - break; - - case 5: - b0 = 2; - } - - return b0 != 0 ? b0 : i1; - } - - public Item getDropType(int i, Random random, int j) { - return null; - } - - public int a(Random random) { - return 0; - } - - public void a(World world, EntityHuman entityhuman, int i, int j, int k, int l) { - if (!world.isStatic && entityhuman.bF() != null && entityhuman.bF().getItem() == Items.SHEARS) { - entityhuman.a(StatisticList.MINE_BLOCK_COUNT[Block.getId(this)], 1); - this.a(world, i, j, k, new ItemStack(Blocks.VINE, 1, 0)); - } else { - super.a(world, entityhuman, i, j, k, l); - } - } -} diff --git a/src/main/java/net/minecraft/server/Chunk.java b/src/main/java/net/minecraft/server/Chunk.java deleted file mode 100644 index 3ac0ae474a..0000000000 --- a/src/main/java/net/minecraft/server/Chunk.java +++ /dev/null @@ -1,1093 +0,0 @@ -package net.minecraft.server; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Random; -import java.util.concurrent.Callable; - -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; - -import org.bukkit.Bukkit; // CraftBukkit - -public class Chunk { - - private static final Logger t = LogManager.getLogger(); - public static boolean a; - private ChunkSection[] sections; - private byte[] v; - public int[] b; - public boolean[] c; - public boolean d; - public World world; - public int[] heightMap; - public final int locX; - public final int locZ; - private boolean w; - public Map tileEntities; - public List[] entitySlices; - public boolean done; - public boolean lit; - public boolean m; - public boolean n; - public boolean o; - public long lastSaved; - public boolean q; - public int r; - public long s; - private int x; - - // CraftBukkit start - Neighbor loaded cache for chunk lighting and entity ticking - private int neighbors = 0x1 << 12; - - public boolean areNeighborsLoaded(final int radius) { - switch(radius) { - case 2: - return this.neighbors == Integer.MAX_VALUE >> 6; - case 1: - final int mask = - // x z offset x z offset x z offset - ( 0x1 << (1 * 5 + 1 + 12) ) | ( 0x1 << (0 * 5 + 1 + 12) ) | ( 0x1 << (-1 * 5 + 1 + 12) ) | - ( 0x1 << (1 * 5 + 0 + 12) ) | ( 0x1 << (0 * 5 + 0 + 12) ) | ( 0x1 << (-1 * 5 + 0 + 12) ) | - ( 0x1 << (1 * 5 + -1 + 12) ) | ( 0x1 << (0 * 5 + -1 + 12) ) | ( 0x1 << (-1 * 5 + -1 + 12) ); - return (this.neighbors & mask) == mask; - default: - throw new UnsupportedOperationException(String.valueOf(radius)); - } - } - - public void setNeighborLoaded(final int x, final int z) { - this.neighbors |= 0x1 << (x * 5 + 12 + z); - } - - public void setNeighborUnloaded(final int x, final int z) { - this.neighbors &= ~(0x1 << (x * 5 + 12 + z)); - } - // CraftBukkit end - - public Chunk(World world, int i, int j) { - this.sections = new ChunkSection[16]; - this.v = new byte[256]; - this.b = new int[256]; - this.c = new boolean[256]; - this.tileEntities = new HashMap(); - this.x = 4096; - this.entitySlices = new List[16]; - this.world = world; - this.locX = i; - this.locZ = j; - this.heightMap = new int[256]; - - for (int k = 0; k < this.entitySlices.length; ++k) { - this.entitySlices[k] = new org.bukkit.craftbukkit.util.UnsafeList(); // CraftBukkit - ArrayList -> UnsafeList - } - - Arrays.fill(this.b, -999); - Arrays.fill(this.v, (byte) -1); - - // CraftBukkit start - if (!(this instanceof EmptyChunk)) { - this.bukkitChunk = new org.bukkit.craftbukkit.CraftChunk(this); - } - } - - public org.bukkit.Chunk bukkitChunk; - public boolean mustSave; - // CraftBukkit end - - public Chunk(World world, Block[] ablock, int i, int j) { - this(world, i, j); - int k = ablock.length / 256; - boolean flag = !world.worldProvider.g; - - for (int l = 0; l < 16; ++l) { - for (int i1 = 0; i1 < 16; ++i1) { - for (int j1 = 0; j1 < k; ++j1) { - Block block = ablock[l << 11 | i1 << 7 | j1]; - - if (block != null && block.getMaterial() != Material.AIR) { - int k1 = j1 >> 4; - - if (this.sections[k1] == null) { - this.sections[k1] = new ChunkSection(k1 << 4, flag); - } - - this.sections[k1].setTypeId(l, j1 & 15, i1, block); - } - } - } - } - } - - public Chunk(World world, Block[] ablock, byte[] abyte, int i, int j) { - this(world, i, j); - int k = ablock.length / 256; - boolean flag = !world.worldProvider.g; - - for (int l = 0; l < 16; ++l) { - for (int i1 = 0; i1 < 16; ++i1) { - for (int j1 = 0; j1 < k; ++j1) { - int k1 = l * k * 16 | i1 * k | j1; - Block block = ablock[k1]; - - if (block != null && block != Blocks.AIR) { - int l1 = j1 >> 4; - - if (this.sections[l1] == null) { - this.sections[l1] = new ChunkSection(l1 << 4, flag); - } - - this.sections[l1].setTypeId(l, j1 & 15, i1, block); - this.sections[l1].setData(l, j1 & 15, i1, abyte[k1]); - } - } - } - } - } - - public boolean a(int i, int j) { - return i == this.locX && j == this.locZ; - } - - public int b(int i, int j) { - return this.heightMap[j << 4 | i]; - } - - public int h() { - for (int i = this.sections.length - 1; i >= 0; --i) { - if (this.sections[i] != null) { - return this.sections[i].getYPosition(); - } - } - - return 0; - } - - public ChunkSection[] getSections() { - return this.sections; - } - - public void initLighting() { - int i = this.h(); - - this.r = Integer.MAX_VALUE; - - for (int j = 0; j < 16; ++j) { - int k = 0; - - while (k < 16) { - this.b[j + (k << 4)] = -999; - int l = i + 16 - 1; - - while (true) { - if (l > 0) { - if (this.b(j, l - 1, k) == 0) { - --l; - continue; - } - - this.heightMap[k << 4 | j] = l; - if (l < this.r) { - this.r = l; - } - } - - if (!this.world.worldProvider.g) { - l = 15; - int i1 = i + 16 - 1; - - do { - int j1 = this.b(j, i1, k); - - if (j1 == 0 && l != 15) { - j1 = 1; - } - - l -= j1; - if (l > 0) { - ChunkSection chunksection = this.sections[i1 >> 4]; - - if (chunksection != null) { - chunksection.setSkyLight(j, i1 & 15, k, l); - this.world.m((this.locX << 4) + j, i1, (this.locZ << 4) + k); - } - } - - --i1; - } while (i1 > 0 && l > 0); - } - - ++k; - break; - } - } - } - - this.n = true; - } - - private void e(int i, int j) { - this.c[i + j * 16] = true; - this.w = true; - } - - private void c(boolean flag) { - this.world.methodProfiler.a("recheckGaps"); - if (this.world.areChunksLoaded(this.locX * 16 + 8, 0, this.locZ * 16 + 8, 16)) { - for (int i = 0; i < 16; ++i) { - for (int j = 0; j < 16; ++j) { - if (this.c[i + j * 16]) { - this.c[i + j * 16] = false; - int k = this.b(i, j); - int l = this.locX * 16 + i; - int i1 = this.locZ * 16 + j; - int j1 = this.world.g(l - 1, i1); - int k1 = this.world.g(l + 1, i1); - int l1 = this.world.g(l, i1 - 1); - int i2 = this.world.g(l, i1 + 1); - - if (k1 < j1) { - j1 = k1; - } - - if (l1 < j1) { - j1 = l1; - } - - if (i2 < j1) { - j1 = i2; - } - - this.g(l, i1, j1); - this.g(l - 1, i1, k); - this.g(l + 1, i1, k); - this.g(l, i1 - 1, k); - this.g(l, i1 + 1, k); - if (flag) { - this.world.methodProfiler.b(); - return; - } - } - } - } - - this.w = false; - } - - this.world.methodProfiler.b(); - } - - private void g(int i, int j, int k) { - int l = this.world.getHighestBlockYAt(i, j); - - if (l > k) { - this.c(i, j, k, l + 1); - } else if (l < k) { - this.c(i, j, l, k + 1); - } - } - - private void c(int i, int j, int k, int l) { - if (l > k && this.world.areChunksLoaded(i, 0, j, 16)) { - for (int i1 = k; i1 < l; ++i1) { - this.world.c(EnumSkyBlock.SKY, i, i1, j); - } - - this.n = true; - } - } - - private void h(int i, int j, int k) { - int l = this.heightMap[k << 4 | i] & 255; - int i1 = l; - - if (j > l) { - i1 = j; - } - - while (i1 > 0 && this.b(i, i1 - 1, k) == 0) { - --i1; - } - - if (i1 != l) { - this.world.b(i + this.locX * 16, k + this.locZ * 16, i1, l); - this.heightMap[k << 4 | i] = i1; - int j1 = this.locX * 16 + i; - int k1 = this.locZ * 16 + k; - int l1; - int i2; - - if (!this.world.worldProvider.g) { - ChunkSection chunksection; - - if (i1 < l) { - for (l1 = i1; l1 < l; ++l1) { - chunksection = this.sections[l1 >> 4]; - if (chunksection != null) { - chunksection.setSkyLight(i, l1 & 15, k, 15); - this.world.m((this.locX << 4) + i, l1, (this.locZ << 4) + k); - } - } - } else { - for (l1 = l; l1 < i1; ++l1) { - chunksection = this.sections[l1 >> 4]; - if (chunksection != null) { - chunksection.setSkyLight(i, l1 & 15, k, 0); - this.world.m((this.locX << 4) + i, l1, (this.locZ << 4) + k); - } - } - } - - l1 = 15; - - while (i1 > 0 && l1 > 0) { - --i1; - i2 = this.b(i, i1, k); - if (i2 == 0) { - i2 = 1; - } - - l1 -= i2; - if (l1 < 0) { - l1 = 0; - } - - ChunkSection chunksection1 = this.sections[i1 >> 4]; - - if (chunksection1 != null) { - chunksection1.setSkyLight(i, i1 & 15, k, l1); - } - } - } - - l1 = this.heightMap[k << 4 | i]; - i2 = l; - int j2 = l1; - - if (l1 < l) { - i2 = l1; - j2 = l; - } - - if (l1 < this.r) { - this.r = l1; - } - - if (!this.world.worldProvider.g) { - this.c(j1 - 1, k1, i2, j2); - this.c(j1 + 1, k1, i2, j2); - this.c(j1, k1 - 1, i2, j2); - this.c(j1, k1 + 1, i2, j2); - this.c(j1, k1, i2, j2); - } - - this.n = true; - } - } - - public int b(int i, int j, int k) { - return this.getType(i, j, k).k(); - } - - public Block getType(int i, int j, int k) { - Block block = Blocks.AIR; - - if (j >> 4 < this.sections.length) { - ChunkSection chunksection = this.sections[j >> 4]; - - if (chunksection != null) { - try { - block = chunksection.getTypeId(i, j & 15, k); - } catch (Throwable throwable) { - CrashReport crashreport = CrashReport.a(throwable, "Getting block"); - CrashReportSystemDetails crashreportsystemdetails = crashreport.a("Block being got"); - - crashreportsystemdetails.a("Location", (Callable) (new CrashReportLocation(this, i, j, k))); - throw new ReportedException(crashreport); - } - } - } - - return block; - } - - public int getData(int i, int j, int k) { - if (j >> 4 >= this.sections.length) { - return 0; - } else { - ChunkSection chunksection = this.sections[j >> 4]; - - return chunksection != null ? chunksection.getData(i, j & 15, k) : 0; - } - } - - public boolean a(int i, int j, int k, Block block, int l) { - int i1 = k << 4 | i; - - if (j >= this.b[i1] - 1) { - this.b[i1] = -999; - } - - int j1 = this.heightMap[i1]; - Block block1 = this.getType(i, j, k); - int k1 = this.getData(i, j, k); - - if (block1 == block && k1 == l) { - return false; - } else { - ChunkSection chunksection = this.sections[j >> 4]; - boolean flag = false; - - if (chunksection == null) { - if (block == Blocks.AIR) { - return false; - } - - chunksection = this.sections[j >> 4] = new ChunkSection(j >> 4 << 4, !this.world.worldProvider.g); - flag = j >= j1; - } - - int l1 = this.locX * 16 + i; - int i2 = this.locZ * 16 + k; - - if (!this.world.isStatic) { - block1.f(this.world, l1, j, i2, k1); - } - - // CraftBukkit start - Delay removing containers until after they're cleaned up - if (!(block1 instanceof IContainer)) { - chunksection.setTypeId(i, j & 15, k, block); - } - // CraftBukkit end - - if (!this.world.isStatic) { - block1.remove(this.world, l1, j, i2, block1, k1); - } else if (block1 instanceof IContainer && block1 != block) { - this.world.p(l1, j, i2); - } - - // CraftBukkit start - Remove containers now after cleanup - if (block1 instanceof IContainer) { - chunksection.setTypeId(i, j & 15, k, block); - } - // CraftBukkit end - - if (chunksection.getTypeId(i, j & 15, k) != block) { - return false; - } else { - chunksection.setData(i, j & 15, k, l); - if (flag) { - this.initLighting(); - } else { - int j2 = block.k(); - int k2 = block1.k(); - - if (j2 > 0) { - if (j >= j1) { - this.h(i, j + 1, k); - } - } else if (j == j1 - 1) { - this.h(i, j, k); - } - - if (j2 != k2 && (j2 < k2 || this.getBrightness(EnumSkyBlock.SKY, i, j, k) > 0 || this.getBrightness(EnumSkyBlock.BLOCK, i, j, k) > 0)) { - this.e(i, k); - } - } - - TileEntity tileentity; - - if (block1 instanceof IContainer) { - tileentity = this.e(i, j, k); - if (tileentity != null) { - tileentity.u(); - } - } - - // CraftBukkit - Don't place while processing the BlockPlaceEvent, unless it's a BlockContainer. Prevents blocks such as TNT from activating when cancelled. - if (!this.world.isStatic && (!this.world.captureBlockStates || block instanceof BlockContainer)) { - block.onPlace(this.world, l1, j, i2); - } - - if (block instanceof IContainer) { - - tileentity = this.e(i, j, k); - if (tileentity == null) { - tileentity = ((IContainer) block).a(this.world, l); - this.world.setTileEntity(l1, j, i2, tileentity); - } - - if (tileentity != null) { - tileentity.u(); - } - } - - this.n = true; - return true; - } - } - } - - public boolean a(int i, int j, int k, int l) { - ChunkSection chunksection = this.sections[j >> 4]; - - if (chunksection == null) { - return false; - } else { - int i1 = chunksection.getData(i, j & 15, k); - - if (i1 == l) { - return false; - } else { - this.n = true; - chunksection.setData(i, j & 15, k, l); - if (chunksection.getTypeId(i, j & 15, k) instanceof IContainer) { - TileEntity tileentity = this.e(i, j, k); - - if (tileentity != null) { - tileentity.u(); - tileentity.g = l; - } - } - - return true; - } - } - } - - 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 ? (this.world.worldProvider.g ? 0 : chunksection.getSkyLight(i, j & 15, k)) : (enumskyblock == EnumSkyBlock.BLOCK ? chunksection.getEmittedLight(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, !this.world.worldProvider.g); - this.initLighting(); - } - - this.n = true; - if (enumskyblock == EnumSkyBlock.SKY) { - if (!this.world.worldProvider.g) { - chunksection.setSkyLight(i, j & 15, k, l); - } - } else if (enumskyblock == EnumSkyBlock.BLOCK) { - chunksection.setEmittedLight(i, j & 15, k, l); - } - } - - public int b(int i, int j, int k, int l) { - ChunkSection chunksection = this.sections[j >> 4]; - - if (chunksection == null) { - return !this.world.worldProvider.g && l < EnumSkyBlock.SKY.c ? EnumSkyBlock.SKY.c - l : 0; - } else { - int i1 = this.world.worldProvider.g ? 0 : chunksection.getSkyLight(i, j & 15, k); - - if (i1 > 0) { - a = true; - } - - i1 -= l; - int j1 = chunksection.getEmittedLight(i, j & 15, k); - - if (j1 > i1) { - i1 = j1; - } - - return i1; - } - } - - public void a(Entity entity) { - this.o = true; - int i = MathHelper.floor(entity.locX / 16.0D); - int j = MathHelper.floor(entity.locZ / 16.0D); - - if (i != this.locX || j != this.locZ) { - // CraftBukkit start - Bukkit.getLogger().warning("Wrong location for " + entity + " in world '" + world.getWorld().getName() + "'!"); - // t.warn("Wrong location! " + entity + " (at " + i + ", " + j + " instead of " + this.locX + ", " + this.locZ + ")"); - // Thread.dumpStack(); - Bukkit.getLogger().warning("Entity is at " + entity.locX + "," + entity.locZ + " (chunk " + i + "," + j + ") but was stored in chunk " + this.locX + "," + this.locZ); - // CraftBukkit end - } - - int k = MathHelper.floor(entity.locY / 16.0D); - - if (k < 0) { - k = 0; - } - - if (k >= this.entitySlices.length) { - k = this.entitySlices.length - 1; - } - - entity.ag = true; - entity.ah = this.locX; - entity.ai = k; - entity.aj = this.locZ; - this.entitySlices[k].add(entity); - } - - public void b(Entity entity) { - this.a(entity, entity.ai); - } - - public void a(Entity entity, int i) { - if (i < 0) { - i = 0; - } - - if (i >= this.entitySlices.length) { - i = this.entitySlices.length - 1; - } - - this.entitySlices[i].remove(entity); - } - - public boolean d(int i, int j, int k) { - return j >= this.heightMap[k << 4 | i]; - } - - public TileEntity e(int i, int j, int k) { - ChunkPosition chunkposition = new ChunkPosition(i, j, k); - TileEntity tileentity = (TileEntity) this.tileEntities.get(chunkposition); - - if (tileentity == null) { - Block block = this.getType(i, j, k); - - if (!block.isTileEntity()) { - return null; - } - - tileentity = ((IContainer) block).a(this.world, this.getData(i, j, k)); - this.world.setTileEntity(this.locX * 16 + i, j, this.locZ * 16 + k, tileentity); - } - - if (tileentity != null && tileentity.r()) { - this.tileEntities.remove(chunkposition); - return null; - } else { - return tileentity; - } - } - - public void a(TileEntity tileentity) { - int i = tileentity.x - this.locX * 16; - int j = tileentity.y; - int k = tileentity.z - this.locZ * 16; - - this.a(i, j, k, tileentity); - if (this.d) { - this.world.tileEntityList.add(tileentity); - } - } - - public void a(int i, int j, int k, TileEntity tileentity) { - ChunkPosition chunkposition = new ChunkPosition(i, j, k); - - tileentity.a(this.world); - tileentity.x = this.locX * 16 + i; - tileentity.y = j; - tileentity.z = this.locZ * 16 + k; - if (this.getType(i, j, k) instanceof IContainer) { - if (this.tileEntities.containsKey(chunkposition)) { - ((TileEntity) this.tileEntities.get(chunkposition)).s(); - } - - tileentity.t(); - this.tileEntities.put(chunkposition, tileentity); - // CraftBukkit start - } else { - System.out.println("Attempted to place a tile entity (" + tileentity + ") at " + tileentity.x + "," + tileentity.y + "," + tileentity.z - + " (" + org.bukkit.craftbukkit.util.CraftMagicNumbers.getMaterial(getType(i, j, k)) + ") where there was no entity tile!"); - System.out.println("Chunk coordinates: " + (this.locX * 16) + "," + (this.locZ * 16)); - new Exception().printStackTrace(); - // CraftBukkit end - } - } - - public void f(int i, int j, int k) { - ChunkPosition chunkposition = new ChunkPosition(i, j, k); - - if (this.d) { - TileEntity tileentity = (TileEntity) this.tileEntities.remove(chunkposition); - - if (tileentity != null) { - tileentity.s(); - } - } - } - - public void addEntities() { - this.d = true; - this.world.a(this.tileEntities.values()); - - for (int i = 0; i < this.entitySlices.length; ++i) { - Iterator iterator = this.entitySlices[i].iterator(); - - while (iterator.hasNext()) { - Entity entity = (Entity) iterator.next(); - - entity.X(); - } - - this.world.a(this.entitySlices[i]); - } - } - - public void removeEntities() { - this.d = false; - Iterator iterator = this.tileEntities.values().iterator(); - - while (iterator.hasNext()) { - TileEntity tileentity = (TileEntity) iterator.next(); - - this.world.a(tileentity); - } - - for (int i = 0; i < this.entitySlices.length; ++i) { - // CraftBukkit start - java.util.Iterator iter = this.entitySlices[i].iterator(); - while (iter.hasNext()) { - Entity entity = (Entity) iter.next(); - - // Do not pass along players, as doing so can get them stuck outside of time. - // (which for example disables inventory icon updates and prevents block breaking) - if (entity instanceof EntityPlayer) { - iter.remove(); - } - } - // CraftBukkit end - - this.world.b(this.entitySlices[i]); - } - } - - public void e() { - this.n = true; - } - - public void a(Entity entity, AxisAlignedBB axisalignedbb, List list, IEntitySelector ientityselector) { - int i = MathHelper.floor((axisalignedbb.b - 2.0D) / 16.0D); - int j = MathHelper.floor((axisalignedbb.e + 2.0D) / 16.0D); - - i = MathHelper.a(i, 0, this.entitySlices.length - 1); - j = MathHelper.a(j, 0, this.entitySlices.length - 1); - - for (int k = i; k <= j; ++k) { - List list1 = this.entitySlices[k]; - - for (int l = 0; l < list1.size(); ++l) { - Entity entity1 = (Entity) list1.get(l); - - if (entity1 != entity && entity1.boundingBox.b(axisalignedbb) && (ientityselector == null || ientityselector.a(entity1))) { - list.add(entity1); - Entity[] aentity = entity1.at(); - - if (aentity != null) { - for (int i1 = 0; i1 < aentity.length; ++i1) { - entity1 = aentity[i1]; - if (entity1 != entity && entity1.boundingBox.b(axisalignedbb) && (ientityselector == null || ientityselector.a(entity1))) { - list.add(entity1); - } - } - } - } - } - } - } - - public void a(Class oclass, AxisAlignedBB axisalignedbb, List list, IEntitySelector ientityselector) { - int i = MathHelper.floor((axisalignedbb.b - 2.0D) / 16.0D); - int j = MathHelper.floor((axisalignedbb.e + 2.0D) / 16.0D); - - i = MathHelper.a(i, 0, this.entitySlices.length - 1); - j = MathHelper.a(j, 0, this.entitySlices.length - 1); - - for (int k = i; k <= j; ++k) { - List list1 = this.entitySlices[k]; - - for (int l = 0; l < list1.size(); ++l) { - Entity entity = (Entity) list1.get(l); - - if (oclass.isAssignableFrom(entity.getClass()) && entity.boundingBox.b(axisalignedbb) && (ientityselector == null || ientityselector.a(entity))) { - list.add(entity); - } - } - } - } - - public boolean a(boolean flag) { - if (flag) { - if (this.o && this.world.getTime() != this.lastSaved || this.n) { - return true; - } - } else if (this.o && this.world.getTime() >= this.lastSaved + 600L) { - return true; - } - - return this.n; - } - - public Random a(long i) { - return new Random(this.world.getSeed() + (long) (this.locX * this.locX * 4987142) + (long) (this.locX * 5947611) + (long) (this.locZ * this.locZ) * 4392871L + (long) (this.locZ * 389711) ^ i); - } - - public boolean isEmpty() { - return false; - } - - public void loadNearby(IChunkProvider ichunkprovider, IChunkProvider ichunkprovider1, int i, int j) { - if (!this.done && ichunkprovider.isChunkLoaded(i + 1, j + 1) && ichunkprovider.isChunkLoaded(i, j + 1) && ichunkprovider.isChunkLoaded(i + 1, j)) { - ichunkprovider.getChunkAt(ichunkprovider1, i, j); - } - - if (ichunkprovider.isChunkLoaded(i - 1, j) && !ichunkprovider.getOrCreateChunk(i - 1, j).done && ichunkprovider.isChunkLoaded(i - 1, j + 1) && ichunkprovider.isChunkLoaded(i, j + 1) && ichunkprovider.isChunkLoaded(i - 1, j + 1)) { - ichunkprovider.getChunkAt(ichunkprovider1, i - 1, j); - } - - if (ichunkprovider.isChunkLoaded(i, j - 1) && !ichunkprovider.getOrCreateChunk(i, j - 1).done && ichunkprovider.isChunkLoaded(i + 1, j - 1) && ichunkprovider.isChunkLoaded(i + 1, j - 1) && ichunkprovider.isChunkLoaded(i + 1, j)) { - ichunkprovider.getChunkAt(ichunkprovider1, i, j - 1); - } - - if (ichunkprovider.isChunkLoaded(i - 1, j - 1) && !ichunkprovider.getOrCreateChunk(i - 1, j - 1).done && ichunkprovider.isChunkLoaded(i, j - 1) && ichunkprovider.isChunkLoaded(i - 1, j)) { - ichunkprovider.getChunkAt(ichunkprovider1, i - 1, j - 1); - } - } - - public int d(int i, int j) { - int k = i | j << 4; - int l = this.b[k]; - - if (l == -999) { - int i1 = this.h() + 15; - - l = -1; - - while (i1 > 0 && l == -1) { - Block block = this.getType(i, i1, j); - Material material = block.getMaterial(); - - if (!material.isSolid() && !material.isLiquid()) { - --i1; - } else { - l = i1 + 1; - } - } - - this.b[k] = l; - } - - return l; - } - - public void b(boolean flag) { - if (this.w && !this.world.worldProvider.g && !flag) { - this.c(this.world.isStatic); - } - - this.m = true; - if (!this.lit && this.done) { - this.p(); - } - } - - public boolean isReady() { - return this.m && this.done && this.lit; - } - - public ChunkCoordIntPair l() { - return new ChunkCoordIntPair(this.locX, this.locZ); - } - - public boolean c(int i, int j) { - if (i < 0) { - i = 0; - } - - if (j >= 256) { - j = 255; - } - - for (int k = i; k <= j; k += 16) { - ChunkSection chunksection = this.sections[k >> 4]; - - if (chunksection != null && !chunksection.isEmpty()) { - return false; - } - } - - return true; - } - - public void a(ChunkSection[] achunksection) { - this.sections = achunksection; - } - - public BiomeBase getBiome(int i, int j, WorldChunkManager worldchunkmanager) { - int k = this.v[j << 4 | i] & 255; - - if (k == 255) { - BiomeBase biomebase = worldchunkmanager.getBiome((this.locX << 4) + i, (this.locZ << 4) + j); - - k = biomebase.id; - this.v[j << 4 | i] = (byte) (k & 255); - } - - return BiomeBase.getBiome(k) == null ? BiomeBase.PLAINS : BiomeBase.getBiome(k); - } - - public byte[] m() { - return this.v; - } - - public void a(byte[] abyte) { - this.v = abyte; - } - - public void n() { - this.x = 0; - } - - public void o() { - for (int i = 0; i < 8; ++i) { - if (this.x >= 4096) { - return; - } - - int j = this.x % 16; - int k = this.x / 16 % 16; - int l = this.x / 256; - - ++this.x; - int i1 = (this.locX << 4) + k; - int j1 = (this.locZ << 4) + l; - - for (int k1 = 0; k1 < 16; ++k1) { - int l1 = (j << 4) + k1; - - if (this.sections[j] == null && (k1 == 0 || k1 == 15 || k == 0 || k == 15 || l == 0 || l == 15) || this.sections[j] != null && this.sections[j].getTypeId(k, k1, l).getMaterial() == Material.AIR) { - if (this.world.getType(i1, l1 - 1, j1).m() > 0) { - this.world.t(i1, l1 - 1, j1); - } - - if (this.world.getType(i1, l1 + 1, j1).m() > 0) { - this.world.t(i1, l1 + 1, j1); - } - - if (this.world.getType(i1 - 1, l1, j1).m() > 0) { - this.world.t(i1 - 1, l1, j1); - } - - if (this.world.getType(i1 + 1, l1, j1).m() > 0) { - this.world.t(i1 + 1, l1, j1); - } - - if (this.world.getType(i1, l1, j1 - 1).m() > 0) { - this.world.t(i1, l1, j1 - 1); - } - - if (this.world.getType(i1, l1, j1 + 1).m() > 0) { - this.world.t(i1, l1, j1 + 1); - } - - this.world.t(i1, l1, j1); - } - } - } - } - - public void p() { - this.done = true; - this.lit = true; - if (!this.world.worldProvider.g) { - if (this.world.b(this.locX * 16 - 1, 0, this.locZ * 16 - 1, this.locX * 16 + 1, 63, this.locZ * 16 + 1)) { - for (int i = 0; i < 16; ++i) { - for (int j = 0; j < 16; ++j) { - if (!this.f(i, j)) { - this.lit = false; - break; - } - } - } - - if (this.lit) { - Chunk chunk = this.world.getChunkAtWorldCoords(this.locX * 16 - 1, this.locZ * 16); - - chunk.a(3); - chunk = this.world.getChunkAtWorldCoords(this.locX * 16 + 16, this.locZ * 16); - chunk.a(1); - chunk = this.world.getChunkAtWorldCoords(this.locX * 16, this.locZ * 16 - 1); - chunk.a(0); - chunk = this.world.getChunkAtWorldCoords(this.locX * 16, this.locZ * 16 + 16); - chunk.a(2); - } - } else { - this.lit = false; - } - } - } - - private void a(int i) { - if (this.done) { - int j; - - if (i == 3) { - for (j = 0; j < 16; ++j) { - this.f(15, j); - } - } else if (i == 1) { - for (j = 0; j < 16; ++j) { - this.f(0, j); - } - } else if (i == 0) { - for (j = 0; j < 16; ++j) { - this.f(j, 15); - } - } else if (i == 2) { - for (j = 0; j < 16; ++j) { - this.f(j, 0); - } - } - } - } - - private boolean f(int i, int j) { - int k = this.h(); - boolean flag = false; - boolean flag1 = false; - - int l; - - for (l = k + 16 - 1; l > 63 || l > 0 && !flag1; --l) { - int i1 = this.b(i, l, j); - - if (i1 == 255 && l < 63) { - flag1 = true; - } - - if (!flag && i1 > 0) { - flag = true; - } else if (flag && i1 == 0 && !this.world.t(this.locX * 16 + i, l, this.locZ * 16 + j)) { - return false; - } - } - - for (; l > 0; --l) { - if (this.getType(i, l, j).m() > 0) { - this.world.t(this.locX * 16 + i, l, this.locZ * 16 + j); - } - } - - return true; - } -} diff --git a/src/main/java/net/minecraft/server/ChunkProviderServer.java b/src/main/java/net/minecraft/server/ChunkProviderServer.java deleted file mode 100644 index c88d5d4d5a..0000000000 --- a/src/main/java/net/minecraft/server/ChunkProviderServer.java +++ /dev/null @@ -1,399 +0,0 @@ -package net.minecraft.server; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.Collections; -import java.util.Iterator; -import java.util.List; -import java.util.Set; -import java.util.concurrent.ConcurrentHashMap; - -import net.minecraft.util.com.google.common.collect.Lists; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; - -// CraftBukkit start -import java.util.Random; - -import org.bukkit.Server; -import org.bukkit.craftbukkit.chunkio.ChunkIOExecutor; -import org.bukkit.craftbukkit.util.LongHash; -import org.bukkit.craftbukkit.util.LongHashSet; -import org.bukkit.craftbukkit.util.LongObjectHashMap; -import org.bukkit.event.world.ChunkUnloadEvent; -// CraftBukkit end - -public class ChunkProviderServer implements IChunkProvider { - - private static final Logger b = LogManager.getLogger(); - // CraftBukkit start - private -> public - public LongHashSet unloadQueue = new LongHashSet(); // LongHashSet - public Chunk emptyChunk; - public IChunkProvider chunkProvider; - private IChunkLoader f; - public boolean forceChunkLoad = false; // true -> false - public LongObjectHashMap chunks = new LongObjectHashMap(); - public WorldServer world; - // CraftBukkit end - - public ChunkProviderServer(WorldServer worldserver, IChunkLoader ichunkloader, IChunkProvider ichunkprovider) { - this.emptyChunk = new EmptyChunk(worldserver, 0, 0); - this.world = worldserver; - this.f = ichunkloader; - this.chunkProvider = ichunkprovider; - } - - public boolean isChunkLoaded(int i, int j) { - return this.chunks.containsKey(LongHash.toLong(i, j)); // CraftBukkit - } - - // CraftBukkit start - Change return type to Collection and return the values of our chunk map - public java.util.Collection a() { - // return this.chunkList; - return this.chunks.values(); - // CraftBukkit end - } - - public void queueUnload(int i, int j) { - if (this.world.worldProvider.e()) { - ChunkCoordinates chunkcoordinates = this.world.getSpawn(); - int k = i * 16 + 8 - chunkcoordinates.x; - int l = j * 16 + 8 - chunkcoordinates.z; - short short1 = 128; - - // CraftBukkit start - if (k < -short1 || k > short1 || l < -short1 || l > short1 || !(this.world.keepSpawnInMemory)) { // Added 'this.world.keepSpawnInMemory' - this.unloadQueue.add(i, j); - - Chunk c = this.chunks.get(LongHash.toLong(i, j)); - if (c != null) { - c.mustSave = true; - } - } - // CraftBukkit end - } else { - // CraftBukkit start - this.unloadQueue.add(i, j); - - Chunk c = this.chunks.get(LongHash.toLong(i, j)); - if (c != null) { - c.mustSave = true; - } - // CraftBukkit end - } - } - - public void b() { - Iterator iterator = this.chunks.values().iterator(); // CraftBukkit - - while (iterator.hasNext()) { - Chunk chunk = (Chunk) iterator.next(); - - this.queueUnload(chunk.locX, chunk.locZ); - } - } - - // CraftBukkit start - Add async variant, provide compatibility - public Chunk getChunkIfLoaded(int x, int z) { - return this.chunks.get(LongHash.toLong(x, z)); - } - - public Chunk getChunkAt(int i, int j) { - return getChunkAt(i, j, null); - } - - public Chunk getChunkAt(int i, int j, Runnable runnable) { - this.unloadQueue.remove(i, j); - Chunk chunk = this.chunks.get(LongHash.toLong(i, j)); - ChunkRegionLoader loader = null; - - if (this.f instanceof ChunkRegionLoader) { - loader = (ChunkRegionLoader) this.f; - } - - // We can only use the queue for already generated chunks - if (chunk == null && loader != null && loader.chunkExists(this.world, i, j)) { - if (runnable != null) { - ChunkIOExecutor.queueChunkLoad(this.world, loader, this, i, j, runnable); - return null; - } else { - chunk = ChunkIOExecutor.syncChunkLoad(this.world, loader, this, i, j); - } - } else if (chunk == null) { - chunk = this.originalGetChunkAt(i, j); - } - - // If we didn't load the chunk async and have a callback run it now - if (runnable != null) { - runnable.run(); - } - - return chunk; - } - - public Chunk originalGetChunkAt(int i, int j) { - this.unloadQueue.remove(i, j); - Chunk chunk = (Chunk) this.chunks.get(LongHash.toLong(i, j)); - boolean newChunk = false; - - if (chunk == null) { - chunk = this.loadChunk(i, j); - if (chunk == null) { - if (this.chunkProvider == null) { - chunk = this.emptyChunk; - } else { - try { - chunk = this.chunkProvider.getOrCreateChunk(i, j); - } catch (Throwable throwable) { - CrashReport crashreport = CrashReport.a(throwable, "Exception generating new chunk"); - CrashReportSystemDetails crashreportsystemdetails = crashreport.a("Chunk to be generated"); - - crashreportsystemdetails.a("Location", String.format("%d,%d", new Object[] { Integer.valueOf(i), Integer.valueOf(j)})); - crashreportsystemdetails.a("Position hash", Long.valueOf(LongHash.toLong(i, j))); // CraftBukkit - Use LongHash - crashreportsystemdetails.a("Generator", this.chunkProvider.getName()); - throw new ReportedException(crashreport); - } - } - newChunk = true; // CraftBukkit - } - - this.chunks.put(LongHash.toLong(i, j), chunk); // CraftBukkit - chunk.addEntities(); - - // CraftBukkit start - Server server = this.world.getServer(); - if (server != null) { - /* - * If it's a new world, the first few chunks are generated inside - * the World constructor. We can't reliably alter that, so we have - * no way of creating a CraftWorld/CraftServer at that point. - */ - server.getPluginManager().callEvent(new org.bukkit.event.world.ChunkLoadEvent(chunk.bukkitChunk, newChunk)); - } - - // Update neighbor counts - for (int x = -2; x < 3; x++) { - for (int z = -2; z < 3; z++) { - if (x == 0 && z == 0) { - continue; - } - - Chunk neighbor = this.getChunkIfLoaded(chunk.locX + x, chunk.locZ + z); - if (neighbor != null) { - neighbor.setNeighborLoaded(-x, -z); - chunk.setNeighborLoaded(x, z); - } - } - } - // CraftBukkit end - chunk.loadNearby(this, this, i, j); - } - - return chunk; - } - - public Chunk getOrCreateChunk(int i, int j) { - // CraftBukkit start - Chunk chunk = (Chunk) this.chunks.get(LongHash.toLong(i, j)); - - chunk = chunk == null ? (!this.world.isLoading && !this.forceChunkLoad ? this.emptyChunk : this.getChunkAt(i, j)) : chunk; - if (chunk == this.emptyChunk) return chunk; - if (i != chunk.locX || j != chunk.locZ) { - b.error("Chunk (" + chunk.locX + ", " + chunk.locZ + ") stored at (" + i + ", " + j + ") in world '" + world.getWorld().getName() + "'"); - b.error(chunk.getClass().getName()); - Throwable ex = new Throwable(); - ex.fillInStackTrace(); - ex.printStackTrace(); - } - return chunk; - // CraftBukkit end - } - - public Chunk loadChunk(int i, int j) { // CraftBukkit - private -> public - if (this.f == null) { - return null; - } else { - try { - Chunk chunk = this.f.a(this.world, i, j); - - if (chunk != null) { - chunk.lastSaved = this.world.getTime(); - if (this.chunkProvider != null) { - this.chunkProvider.recreateStructures(i, j); - } - } - - return chunk; - } catch (Exception exception) { - b.error("Couldn\'t load chunk", exception); - return null; - } - } - } - - public void saveChunkNOP(Chunk chunk) { // CraftBukkit - private -> public - if (this.f != null) { - try { - this.f.b(this.world, chunk); - } catch (Exception exception) { - b.error("Couldn\'t save entities", exception); - } - } - } - - public void saveChunk(Chunk chunk) { // CraftBukkit - private -> public - if (this.f != null) { - try { - chunk.lastSaved = this.world.getTime(); - this.f.a(this.world, chunk); - // CraftBukkit start - IOException to Exception - } catch (Exception ioexception) { - b.error("Couldn\'t save chunk", ioexception); - /* Remove extra exception - } catch (ExceptionWorldConflict exceptionworldconflict) { - b.error("Couldn\'t save chunk; already in use by another instance of Minecraft?", exceptionworldconflict); - // CraftBukkit end */ - } - } - } - - public void getChunkAt(IChunkProvider ichunkprovider, int i, int j) { - Chunk chunk = this.getOrCreateChunk(i, j); - - if (!chunk.done) { - chunk.p(); - if (this.chunkProvider != null) { - this.chunkProvider.getChunkAt(ichunkprovider, i, j); - - // CraftBukkit start - BlockSand.instaFall = true; - Random random = new Random(); - random.setSeed(world.getSeed()); - long xRand = random.nextLong() / 2L * 2L + 1L; - long zRand = random.nextLong() / 2L * 2L + 1L; - random.setSeed((long) i * xRand + (long) j * zRand ^ world.getSeed()); - - org.bukkit.World world = this.world.getWorld(); - if (world != null) { - this.world.populating = true; - try { - for (org.bukkit.generator.BlockPopulator populator : world.getPopulators()) { - populator.populate(world, random, chunk.bukkitChunk); - } - } finally { - this.world.populating = false; - } - } - BlockSand.instaFall = false; - this.world.getServer().getPluginManager().callEvent(new org.bukkit.event.world.ChunkPopulateEvent(chunk.bukkitChunk)); - // CraftBukkit end - - chunk.e(); - } - } - } - - public boolean saveChunks(boolean flag, IProgressUpdate iprogressupdate) { - int i = 0; - // CraftBukkit start - Iterator iterator = this.chunks.values().iterator(); - - while (iterator.hasNext()) { - Chunk chunk = (Chunk) iterator.next(); - // CraftBukkit end - - if (flag) { - this.saveChunkNOP(chunk); - } - - if (chunk.a(flag)) { - this.saveChunk(chunk); - chunk.n = false; - ++i; - if (i == 24 && !flag) { - return false; - } - } - } - - return true; - } - - public void c() { - if (this.f != null) { - this.f.b(); - } - } - - public boolean unloadChunks() { - if (!this.world.savingDisabled) { - // CraftBukkit start - Server server = this.world.getServer(); - for (int i = 0; i < 100 && !this.unloadQueue.isEmpty(); i++) { - long chunkcoordinates = this.unloadQueue.popFirst(); - Chunk chunk = this.chunks.get(chunkcoordinates); - if (chunk == null) continue; - - ChunkUnloadEvent event = new ChunkUnloadEvent(chunk.bukkitChunk); - server.getPluginManager().callEvent(event); - if (!event.isCancelled()) { - if (chunk != null) { - chunk.removeEntities(); - this.saveChunk(chunk); - this.saveChunkNOP(chunk); - this.chunks.remove(chunkcoordinates); // CraftBukkit - } - - // this.unloadQueue.remove(olong); - // this.chunks.remove(olong.longValue()); - - // Update neighbor counts - for (int x = -2; x < 3; x++) { - for (int z = -2; z < 3; z++) { - if (x == 0 && z == 0) { - continue; - } - - Chunk neighbor = this.getChunkIfLoaded(chunk.locX + x, chunk.locZ + z); - if (neighbor != null) { - neighbor.setNeighborUnloaded(-x, -z); - chunk.setNeighborUnloaded(x, z); - } - } - } - } - } - // CraftBukkit end - - if (this.f != null) { - this.f.a(); - } - } - - return this.chunkProvider.unloadChunks(); - } - - public boolean canSave() { - return !this.world.savingDisabled; - } - - public String getName() { - // CraftBukkit - this.chunks.count() -> .values().size() - return "ServerChunkCache: " + this.chunks.values().size() + " Drop: " + this.unloadQueue.size(); - } - - public List getMobsFor(EnumCreatureType enumcreaturetype, int i, int j, int k) { - return this.chunkProvider.getMobsFor(enumcreaturetype, i, j, k); - } - - public ChunkPosition findNearestMapFeature(World world, String s, int i, int j, int k) { - return this.chunkProvider.findNearestMapFeature(world, s, i, j, k); - } - - public int getLoadedChunks() { - // CraftBukkit - this.chunks.count() -> this.chunks.size() - return this.chunks.size(); - } - - public void recreateStructures(int i, int j) {} -} diff --git a/src/main/java/net/minecraft/server/ChunkRegionLoader.java b/src/main/java/net/minecraft/server/ChunkRegionLoader.java deleted file mode 100644 index 9402f0fd7d..0000000000 --- a/src/main/java/net/minecraft/server/ChunkRegionLoader.java +++ /dev/null @@ -1,406 +0,0 @@ -package net.minecraft.server; - -import java.io.DataInputStream; -import java.io.DataOutput; -import java.io.DataOutputStream; -import java.io.File; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Set; - -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; - -public class ChunkRegionLoader implements IChunkLoader, IAsyncChunkSaver { - - private static final Logger a = LogManager.getLogger(); - private List b = new ArrayList(); - private Set c = new HashSet(); - private Object d = new Object(); - private final File e; - - public ChunkRegionLoader(File file1) { - this.e = file1; - } - - // CraftBukkit start - public boolean chunkExists(World world, int i, int j) { - ChunkCoordIntPair chunkcoordintpair = new ChunkCoordIntPair(i, j); - - synchronized (this.d) { - if (this.c.contains(chunkcoordintpair)) { - for (int k = 0; k < this.b.size(); ++k) { - if (((PendingChunkToSave) this.b.get(k)).a.equals(chunkcoordintpair)) { - return true; - } - } - } - } - - return RegionFileCache.a(this.e, i, j).chunkExists(i & 31, j & 31); - } - // CraftBukkit end - - // CraftBukkit start - Add async variant, provide compatibility - public Chunk a(World world, int i, int j) { - Object[] data = this.loadChunk(world, i, j); - if (data != null) { - Chunk chunk = (Chunk) data[0]; - NBTTagCompound nbttagcompound = (NBTTagCompound) data[1]; - this.loadEntities(chunk, nbttagcompound.getCompound("Level"), world); - return chunk; - } - - return null; - } - - public Object[] loadChunk(World world, int i, int j) { - // CraftBukkit end - NBTTagCompound nbttagcompound = null; - ChunkCoordIntPair chunkcoordintpair = new ChunkCoordIntPair(i, j); - Object object = this.d; - - synchronized (this.d) { - if (this.c.contains(chunkcoordintpair)) { - for (int k = 0; k < this.b.size(); ++k) { - if (((PendingChunkToSave) this.b.get(k)).a.equals(chunkcoordintpair)) { - nbttagcompound = ((PendingChunkToSave) this.b.get(k)).b; - break; - } - } - } - } - - if (nbttagcompound == null) { - DataInputStream datainputstream = RegionFileCache.c(this.e, i, j); - - if (datainputstream == null) { - return null; - } - - nbttagcompound = NBTCompressedStreamTools.a(datainputstream); - } - - return this.a(world, i, j, nbttagcompound); - } - - protected Object[] a(World world, int i, int j, NBTTagCompound nbttagcompound) { // CraftBukkit - return Chunk -> Object[] - if (!nbttagcompound.hasKeyOfType("Level", 10)) { - a.error("Chunk file at " + i + "," + j + " is missing level data, skipping"); - return null; - } else if (!nbttagcompound.getCompound("Level").hasKeyOfType("Sections", 9)) { - a.error("Chunk file at " + i + "," + j + " is missing block data, skipping"); - return null; - } else { - Chunk chunk = this.a(world, nbttagcompound.getCompound("Level")); - - if (!chunk.a(i, j)) { - a.error("Chunk file at " + i + "," + j + " is in the wrong location; relocating. (Expected " + i + ", " + j + ", got " + chunk.locX + ", " + chunk.locZ + ")"); - nbttagcompound.getCompound("Level").setInt("xPos", i); // CraftBukkit - .getCompound("Level") - nbttagcompound.getCompound("Level").setInt("zPos", j); // CraftBukkit - .getCompound("Level") - - // CraftBukkit start - Have to move tile entities since we don't load them at this stage - NBTTagList tileEntities = nbttagcompound.getCompound("Level").getList("TileEntities", 10); - if (tileEntities != null) { - for (int te = 0; te < tileEntities.size(); te++) { - NBTTagCompound tileEntity = (NBTTagCompound) tileEntities.get(te); - int x = tileEntity.getInt("x") - chunk.locX * 16; - int z = tileEntity.getInt("z") - chunk.locZ * 16; - tileEntity.setInt("x", i * 16 + x); - tileEntity.setInt("z", j * 16 + z); - } - } - // CraftBukkit end - chunk = this.a(world, nbttagcompound.getCompound("Level")); - } - - // CraftBukkit start - Object[] data = new Object[2]; - data[0] = chunk; - data[1] = nbttagcompound; - return data; - // CraftBukkit end - } - } - - public void a(World world, Chunk chunk) { - // CraftBukkit start - "handle" exception - try { - world.G(); - } catch (ExceptionWorldConflict ex) { - ex.printStackTrace(); - } - // CraftBukkit end - - try { - NBTTagCompound nbttagcompound = new NBTTagCompound(); - NBTTagCompound nbttagcompound1 = new NBTTagCompound(); - - nbttagcompound.set("Level", nbttagcompound1); - this.a(chunk, world, nbttagcompound1); - this.a(chunk.l(), nbttagcompound); - } catch (Exception exception) { - exception.printStackTrace(); - } - } - - protected void a(ChunkCoordIntPair chunkcoordintpair, NBTTagCompound nbttagcompound) { - Object object = this.d; - - synchronized (this.d) { - if (this.c.contains(chunkcoordintpair)) { - for (int i = 0; i < this.b.size(); ++i) { - if (((PendingChunkToSave) this.b.get(i)).a.equals(chunkcoordintpair)) { - this.b.set(i, new PendingChunkToSave(chunkcoordintpair, nbttagcompound)); - return; - } - } - } - - this.b.add(new PendingChunkToSave(chunkcoordintpair, nbttagcompound)); - this.c.add(chunkcoordintpair); - FileIOThread.a.a(this); - } - } - - public boolean c() { - PendingChunkToSave pendingchunktosave = null; - Object object = this.d; - - synchronized (this.d) { - if (this.b.isEmpty()) { - return false; - } - - pendingchunktosave = (PendingChunkToSave) this.b.remove(0); - this.c.remove(pendingchunktosave.a); - } - - if (pendingchunktosave != null) { - try { - this.a(pendingchunktosave); - } catch (Exception exception) { - exception.printStackTrace(); - } - } - - return true; - } - - public void a(PendingChunkToSave pendingchunktosave) throws java.io.IOException { // CraftBukkit - public -> private, added throws - DataOutputStream dataoutputstream = RegionFileCache.d(this.e, pendingchunktosave.a.x, pendingchunktosave.a.z); - - NBTCompressedStreamTools.a(pendingchunktosave.b, (DataOutput) dataoutputstream); - dataoutputstream.close(); - } - - public void b(World world, Chunk chunk) {} - - public void a() {} - - public void b() { - while (this.c()) { - ; - } - } - - private void a(Chunk chunk, World world, NBTTagCompound nbttagcompound) { - nbttagcompound.setByte("V", (byte) 1); - nbttagcompound.setInt("xPos", chunk.locX); - nbttagcompound.setInt("zPos", chunk.locZ); - nbttagcompound.setLong("LastUpdate", world.getTime()); - nbttagcompound.setIntArray("HeightMap", chunk.heightMap); - nbttagcompound.setBoolean("TerrainPopulated", chunk.done); - nbttagcompound.setBoolean("LightPopulated", chunk.lit); - nbttagcompound.setLong("InhabitedTime", chunk.s); - ChunkSection[] achunksection = chunk.getSections(); - NBTTagList nbttaglist = new NBTTagList(); - boolean flag = !world.worldProvider.g; - ChunkSection[] achunksection1 = achunksection; - int i = achunksection.length; - - NBTTagCompound nbttagcompound1; - - for (int j = 0; j < i; ++j) { - ChunkSection chunksection = achunksection1[j]; - - if (chunksection != null) { - nbttagcompound1 = new NBTTagCompound(); - nbttagcompound1.setByte("Y", (byte) (chunksection.getYPosition() >> 4 & 255)); - nbttagcompound1.setByteArray("Blocks", chunksection.getIdArray()); - if (chunksection.getExtendedIdArray() != null) { - nbttagcompound1.setByteArray("Add", chunksection.getExtendedIdArray().a); - } - - nbttagcompound1.setByteArray("Data", chunksection.getDataArray().a); - nbttagcompound1.setByteArray("BlockLight", chunksection.getEmittedLightArray().a); - if (flag) { - nbttagcompound1.setByteArray("SkyLight", chunksection.getSkyLightArray().a); - } else { - nbttagcompound1.setByteArray("SkyLight", new byte[chunksection.getEmittedLightArray().a.length]); - } - - nbttaglist.add(nbttagcompound1); - } - } - - nbttagcompound.set("Sections", nbttaglist); - nbttagcompound.setByteArray("Biomes", chunk.m()); - chunk.o = false; - NBTTagList nbttaglist1 = new NBTTagList(); - - Iterator iterator; - - for (i = 0; i < chunk.entitySlices.length; ++i) { - iterator = chunk.entitySlices[i].iterator(); - - while (iterator.hasNext()) { - Entity entity = (Entity) iterator.next(); - - nbttagcompound1 = new NBTTagCompound(); - if (entity.d(nbttagcompound1)) { - chunk.o = true; - nbttaglist1.add(nbttagcompound1); - } - } - } - - nbttagcompound.set("Entities", nbttaglist1); - NBTTagList nbttaglist2 = new NBTTagList(); - - iterator = chunk.tileEntities.values().iterator(); - - while (iterator.hasNext()) { - TileEntity tileentity = (TileEntity) iterator.next(); - - nbttagcompound1 = new NBTTagCompound(); - tileentity.b(nbttagcompound1); - nbttaglist2.add(nbttagcompound1); - } - - nbttagcompound.set("TileEntities", nbttaglist2); - List list = world.a(chunk, false); - - if (list != null) { - long k = world.getTime(); - NBTTagList nbttaglist3 = new NBTTagList(); - Iterator iterator1 = list.iterator(); - - while (iterator1.hasNext()) { - NextTickListEntry nextticklistentry = (NextTickListEntry) iterator1.next(); - NBTTagCompound nbttagcompound2 = new NBTTagCompound(); - - nbttagcompound2.setInt("i", Block.getId(nextticklistentry.a())); - nbttagcompound2.setInt("x", nextticklistentry.a); - nbttagcompound2.setInt("y", nextticklistentry.b); - nbttagcompound2.setInt("z", nextticklistentry.c); - nbttagcompound2.setInt("t", (int) (nextticklistentry.d - k)); - nbttagcompound2.setInt("p", nextticklistentry.e); - nbttaglist3.add(nbttagcompound2); - } - - nbttagcompound.set("TileTicks", nbttaglist3); - } - } - - private Chunk a(World world, NBTTagCompound nbttagcompound) { - int i = nbttagcompound.getInt("xPos"); - int j = nbttagcompound.getInt("zPos"); - Chunk chunk = new Chunk(world, i, j); - - chunk.heightMap = nbttagcompound.getIntArray("HeightMap"); - chunk.done = nbttagcompound.getBoolean("TerrainPopulated"); - chunk.lit = nbttagcompound.getBoolean("LightPopulated"); - chunk.s = nbttagcompound.getLong("InhabitedTime"); - NBTTagList nbttaglist = nbttagcompound.getList("Sections", 10); - byte b0 = 16; - ChunkSection[] achunksection = new ChunkSection[b0]; - boolean flag = !world.worldProvider.g; - - for (int k = 0; k < nbttaglist.size(); ++k) { - NBTTagCompound nbttagcompound1 = nbttaglist.get(k); - byte b1 = nbttagcompound1.getByte("Y"); - ChunkSection chunksection = new ChunkSection(b1 << 4, flag); - - chunksection.setIdArray(nbttagcompound1.getByteArray("Blocks")); - if (nbttagcompound1.hasKeyOfType("Add", 7)) { - chunksection.setExtendedIdArray(new NibbleArray(nbttagcompound1.getByteArray("Add"), 4)); - } - - chunksection.setDataArray(new NibbleArray(nbttagcompound1.getByteArray("Data"), 4)); - chunksection.setEmittedLightArray(new NibbleArray(nbttagcompound1.getByteArray("BlockLight"), 4)); - if (flag) { - chunksection.setSkyLightArray(new NibbleArray(nbttagcompound1.getByteArray("SkyLight"), 4)); - } - - chunksection.recalcBlockCounts(); - achunksection[b1] = chunksection; - } - - chunk.a(achunksection); - if (nbttagcompound.hasKeyOfType("Biomes", 7)) { - chunk.a(nbttagcompound.getByteArray("Biomes")); - } - - // CraftBukkit start - End this method here and split off entity loading to another method - return chunk; - } - - public void loadEntities(Chunk chunk, NBTTagCompound nbttagcompound, World world) { - // CraftBukkit end - NBTTagList nbttaglist1 = nbttagcompound.getList("Entities", 10); - - if (nbttaglist1 != null) { - for (int l = 0; l < nbttaglist1.size(); ++l) { - NBTTagCompound nbttagcompound2 = nbttaglist1.get(l); - Entity entity = EntityTypes.a(nbttagcompound2, world); - - chunk.o = true; - if (entity != null) { - chunk.a(entity); - Entity entity1 = entity; - - for (NBTTagCompound nbttagcompound3 = nbttagcompound2; nbttagcompound3.hasKeyOfType("Riding", 10); nbttagcompound3 = nbttagcompound3.getCompound("Riding")) { - Entity entity2 = EntityTypes.a(nbttagcompound3.getCompound("Riding"), world); - - if (entity2 != null) { - chunk.a(entity2); - entity1.mount(entity2); - } - - entity1 = entity2; - } - } - } - } - - NBTTagList nbttaglist2 = nbttagcompound.getList("TileEntities", 10); - - if (nbttaglist2 != null) { - for (int i1 = 0; i1 < nbttaglist2.size(); ++i1) { - NBTTagCompound nbttagcompound4 = nbttaglist2.get(i1); - TileEntity tileentity = TileEntity.c(nbttagcompound4); - - if (tileentity != null) { - chunk.a(tileentity); - } - } - } - - if (nbttagcompound.hasKeyOfType("TileTicks", 9)) { - NBTTagList nbttaglist3 = nbttagcompound.getList("TileTicks", 10); - - if (nbttaglist3 != null) { - for (int j1 = 0; j1 < nbttaglist3.size(); ++j1) { - NBTTagCompound nbttagcompound5 = nbttaglist3.get(j1); - - world.b(nbttagcompound5.getInt("x"), nbttagcompound5.getInt("y"), nbttagcompound5.getInt("z"), Block.getById(nbttagcompound5.getInt("i")), nbttagcompound5.getInt("t"), nbttagcompound5.getInt("p")); - } - } - } - - // return chunk; // CraftBukkit - } -} diff --git a/src/main/java/net/minecraft/server/ChunkSection.java b/src/main/java/net/minecraft/server/ChunkSection.java deleted file mode 100644 index db1e52c98e..0000000000 --- a/src/main/java/net/minecraft/server/ChunkSection.java +++ /dev/null @@ -1,488 +0,0 @@ -package net.minecraft.server; - -import java.util.Arrays; // CraftBukkit - -public class ChunkSection { - - private int yPos; - private int nonEmptyBlockCount; - private int tickingBlockCount; - private byte[] blockIds; - private NibbleArray extBlockIds; - private NibbleArray blockData; - private NibbleArray emittedLight; - private NibbleArray skyLight; - // CraftBukkit start - Compact storage - private int compactId; - private byte compactExtId; - private byte compactData; - private byte compactEmitted; - private byte compactSky; - - // Pre-generated (read-only!) NibbleArrays for every possible value, used for chunk saving - private static NibbleArray[] compactPregen = new NibbleArray[16]; - static { - for (int i = 0; i < 16; i++) { - compactPregen[i] = expandCompactNibble((byte) i); - } - } - - private static NibbleArray expandCompactNibble(byte value) { - byte[] data = new byte[2048]; - Arrays.fill(data, (byte) (value | (value << 4))); - return new NibbleArray(data, 4); - } - - private boolean canBeCompact(byte[] array) { - byte value = array[0]; - for (int i = 1; i < array.length; i++) { - if (value != array[i]) { - return false; - } - } - - return true; - } - // CraftBukkit end - - public ChunkSection(int i, boolean flag) { - this.yPos = i; - /* CraftBukkit - Start as null, using compact storage - this.blockIds = new byte[4096]; - this.blockData = new NibbleArray(this.blockIds.length, 4); - this.emittedLight = new NibbleArray(this.blockIds.length, 4); - if (flag) { - this.skyLight = new NibbleArray(this.blockIds.length, 4); - } - */ - if (!flag) { - this.compactSky = -1; - } - // CraftBukkit end - } - - // CraftBukkit start - public ChunkSection(int y, boolean flag, byte[] blkIds, byte[] extBlkIds) { - this.yPos = y; - this.setIdArray(blkIds); - if (extBlkIds != null) { - this.setExtendedIdArray(new NibbleArray(extBlkIds, 4)); - } - if (!flag) { - this.compactSky = -1; - } - this.recalcBlockCounts(); - } - // CraftBukkit end - - public Block getTypeId(int i, int j, int k) { - // CraftBukkit start - Compact storage - if (this.blockIds == null) { - int id = this.compactId; - if (this.extBlockIds == null) { - id |= this.compactExtId << 8; - } else { - id |= this.extBlockIds.a(i, j, k) << 8; - } - - return Block.getById(id); - } - // CraftBukkit end - - int l = this.blockIds[j << 8 | k << 4 | i] & 255; - - if (this.extBlockIds != null) { - l |= this.extBlockIds.a(i, j, k) << 8; - } - - return Block.getById(l); - } - - public void setTypeId(int i, int j, int k, Block block) { - // CraftBukkit start - Compact storage - Block block1 = this.getTypeId(i, j, k); - if (block == block1) { - return; - } - // CraftBukkit end - - if (block1 != Blocks.AIR) { - --this.nonEmptyBlockCount; - if (block1.isTicking()) { - --this.tickingBlockCount; - } - } - - if (block != Blocks.AIR) { - ++this.nonEmptyBlockCount; - if (block.isTicking()) { - ++this.tickingBlockCount; - } - } - - int i1 = Block.getId(block); - - // CraftBukkit start - Compact storage - if (this.blockIds == null) { - this.blockIds = new byte[4096]; - Arrays.fill(this.blockIds, (byte) (this.compactId & 255)); - } - // CraftBukkit end - - this.blockIds[j << 8 | k << 4 | i] = (byte) (i1 & 255); - if (i1 > 255) { - if (this.extBlockIds == null) { - this.extBlockIds = expandCompactNibble(this.compactExtId); // CraftBukkit - Compact storage - } - - this.extBlockIds.a(i, j, k, (i1 & 3840) >> 8); - } else if (this.extBlockIds != null) { - this.extBlockIds.a(i, j, k, 0); - } - } - - public int getData(int i, int j, int k) { - // CraftBukkit start - Compact storage - if (this.blockData == null) { - return this.compactData; - } - // CraftBukkit end - return this.blockData.a(i, j, k); - } - - public void setData(int i, int j, int k, int l) { - // CraftBukkit start - Compact storage - if (this.blockData == null) { - if (this.compactData == l) { - return; - } - this.blockData = expandCompactNibble(this.compactData); - } - // CraftBukkit end - this.blockData.a(i, j, k, l); - } - - public boolean isEmpty() { - return this.nonEmptyBlockCount == 0; - } - - public boolean shouldTick() { - return this.tickingBlockCount > 0; - } - - public int getYPosition() { - return this.yPos; - } - - public void setSkyLight(int i, int j, int k, int l) { - // CraftBukkit start - Compact storage - if (this.skyLight == null) { - if (this.compactSky == l) { - return; - } - this.skyLight = expandCompactNibble(this.compactSky); - } - // CraftBukkit end - this.skyLight.a(i, j, k, l); - } - - public int getSkyLight(int i, int j, int k) { - // CraftBukkit start - Compact storage - if (this.skyLight == null) { - return this.compactSky; - } - // CraftBukkit end - return this.skyLight.a(i, j, k); - } - - public void setEmittedLight(int i, int j, int k, int l) { - // CraftBukkit start - Compact storage - if (this.emittedLight == null) { - if (this.compactEmitted == l) { - return; - } - this.emittedLight = expandCompactNibble(this.compactEmitted); - } - // CraftBukkit end - this.emittedLight.a(i, j, k, l); - } - - public int getEmittedLight(int i, int j, int k) { - // CraftBukkit start - Compact storage - if (this.emittedLight == null) { - return this.compactEmitted; - } - // CraftBukkit end - return this.emittedLight.a(i, j, k); - } - - public void recalcBlockCounts() { - // CraftBukkit start - Optimize for speed - int cntNonEmpty = 0; - int cntTicking = 0; - - if (this.blockIds == null) { - int id = this.compactId; - if (this.extBlockIds == null) { - id |= this.compactExtId << 8; - if (id > 0) { - Block block = Block.getById(id); - if (block == null) { - this.compactId = 0; - this.compactExtId = 0; - } else { - cntNonEmpty = 4096; - if (block.isTicking()) { - cntTicking = 4096; - } - } - } - } else { - byte[] ext = this.extBlockIds.a; - for (int off = 0, off2 = 0; off < 4096;) { - byte extid = ext[off2]; - int l = (id & 0xFF) | ((extid & 0xF) << 8); // Even data - if (l > 0) { - Block block = Block.getById(l); - if (block == null) { - this.compactId = 0; - ext[off2] &= 0xF0; - } else { - ++cntNonEmpty; - if (block.isTicking()) { - ++cntTicking; - } - } - } - off++; - l = (id & 0xFF) | ((extid & 0xF0) << 4); // Odd data - if (l > 0) { - Block block = Block.getById(l); - if (block == null) { - this.compactId = 0; - ext[off2] &= 0x0F; - } else { - ++cntNonEmpty; - if (block.isTicking()) { - ++cntTicking; - } - } - } - off++; - off2++; - } - } - } else { - byte[] blkIds = this.blockIds; - if (this.extBlockIds == null) { // No extended block IDs? Don't waste time messing with them - for (int off = 0; off < blkIds.length; off++) { - int l = blkIds[off] & 0xFF; - if (l > 0) { - if (Block.getById(l) == null) { - blkIds[off] = 0; - } else { - ++cntNonEmpty; - if (Block.getById(l).isTicking()) { - ++cntTicking; - } - } - } - } - } else { - byte[] ext = this.extBlockIds.a; - for (int off = 0, off2 = 0; off < blkIds.length;) { - byte extid = ext[off2]; - int l = (blkIds[off] & 0xFF) | ((extid & 0xF) << 8); // Even data - if (l > 0) { - if (Block.getById(l) == null) { - blkIds[off] = 0; - ext[off2] &= 0xF0; - } else { - ++cntNonEmpty; - if (Block.getById(l).isTicking()) { - ++cntTicking; - } - } - } - off++; - l = (blkIds[off] & 0xFF) | ((extid & 0xF0) << 4); // Odd data - if (l > 0) { - if (Block.getById(l) == null) { - blkIds[off] = 0; - ext[off2] &= 0x0F; - } else { - ++cntNonEmpty; - if (Block.getById(l).isTicking()) { - ++cntTicking; - } - } - } - off++; - off2++; - } - } - } - this.nonEmptyBlockCount = cntNonEmpty; - this.tickingBlockCount = cntTicking; - } - - public void old_recalcBlockCounts() { - // CraftBukkit end - this.nonEmptyBlockCount = 0; - this.tickingBlockCount = 0; - - for (int i = 0; i < 16; ++i) { - for (int j = 0; j < 16; ++j) { - for (int k = 0; k < 16; ++k) { - Block block = this.getTypeId(i, j, k); - - if (block != Blocks.AIR) { - ++this.nonEmptyBlockCount; - if (block.isTicking()) { - ++this.tickingBlockCount; - } - } - } - } - } - } - - public byte[] getIdArray() { - // CraftBukkit start - Compact storage - if (this.blockIds == null) { - byte[] ids = new byte[4096]; - Arrays.fill(ids, (byte) (this.compactId & 255)); - return ids; - } - // CraftBukkit end - return this.blockIds; - } - - public NibbleArray getExtendedIdArray() { - // CraftBukkit start - Compact storage - if (this.extBlockIds == null && this.compactExtId != 0) { - return compactPregen[this.compactExtId]; - } - // CraftBukkit end - return this.extBlockIds; - } - - public NibbleArray getDataArray() { - // CraftBukkit start - Compact storage - if (this.blockData == null) { - return compactPregen[this.compactData]; - } - // CraftBukkit end - return this.blockData; - } - - public NibbleArray getEmittedLightArray() { - // CraftBukkit start - Compact storage - if (this.emittedLight == null) { - return compactPregen[this.compactEmitted]; - } - // CraftBukkit end - return this.emittedLight; - } - - public NibbleArray getSkyLightArray() { - // CraftBukkit start - Compact storage - if (this.skyLight == null && this.compactSky != -1) { - return compactPregen[this.compactSky]; - } - // CraftBukkit end - return this.skyLight; - } - - public void setIdArray(byte[] abyte) { - // CraftBukkit start - Compact storage - if (abyte == null) { - this.compactId = 0; - this.blockIds = null; - return; - } else if (canBeCompact(abyte)) { - this.compactId = abyte[0] & 255; - return; - } - // CraftBukkit end - this.blockIds = this.validateByteArray(abyte); // CraftBukkit - Validate data - } - - public void setExtendedIdArray(NibbleArray nibblearray) { - // CraftBukkit start - Compact storage - if (nibblearray == null) { - this.compactExtId = 0; - this.extBlockIds = null; - return; - } else if (canBeCompact(nibblearray.a)) { - this.compactExtId = (byte) (nibblearray.a(0, 0, 0) & 0xF); - return; - } - // CraftBukkit end - this.extBlockIds = this.validateNibbleArray(nibblearray); // CraftBukkit - Validate data - } - - public void setDataArray(NibbleArray nibblearray) { - // CraftBukkit start - Compact storage - if (nibblearray == null) { - this.compactData = 0; - this.blockData = null; - return; - } else if (canBeCompact(nibblearray.a)) { - this.compactData = (byte) (nibblearray.a(0, 0, 0) & 0xF); - return; - } - // CraftBukkit end - this.blockData = this.validateNibbleArray(nibblearray); // CraftBukkit - Validate data - } - - public void setEmittedLightArray(NibbleArray nibblearray) { - // CraftBukkit start - Compact storage - if (nibblearray == null) { - this.compactEmitted = 0; - this.emittedLight = null; - return; - } else if (canBeCompact(nibblearray.a)) { - this.compactEmitted = (byte) (nibblearray.a(0, 0, 0) & 0xF); - return; - } - // CraftBukkit end - this.emittedLight = this.validateNibbleArray(nibblearray); // CraftBukkit - Validate data - } - - public void setSkyLightArray(NibbleArray nibblearray) { - // CraftBukkit start - Compact storage - if (nibblearray == null) { - this.compactSky = -1; - this.skyLight = null; - return; - } else if (canBeCompact(nibblearray.a)) { - this.compactSky = (byte) (nibblearray.a(0, 0, 0) & 0xF); - return; - } - // CraftBukkit end - this.skyLight = this.validateNibbleArray(nibblearray); // CraftBukkit - Validate data - } - - // CraftBukkit start - Validate array lengths - private NibbleArray validateNibbleArray(NibbleArray nibbleArray) { - if (nibbleArray != null && nibbleArray.a.length < 2048) { - byte[] newArray = new byte[2048]; - System.arraycopy(nibbleArray.a, 0, newArray, 0, nibbleArray.a.length); - nibbleArray = new NibbleArray(newArray, 4); - } - - return nibbleArray; - } - - private byte[] validateByteArray(byte[] byteArray) { - if (byteArray != null && byteArray.length < 4096) { - byte[] newArray = new byte[4096]; - System.arraycopy(byteArray, 0, newArray, 0, byteArray.length); - byteArray = newArray; - } - - return byteArray; - } - // CraftBukkit end -} diff --git a/src/main/java/net/minecraft/server/ClientCommandOrdinalWrapper.java b/src/main/java/net/minecraft/server/ClientCommandOrdinalWrapper.java deleted file mode 100644 index 04eacb8ed8..0000000000 --- a/src/main/java/net/minecraft/server/ClientCommandOrdinalWrapper.java +++ /dev/null @@ -1,27 +0,0 @@ -package net.minecraft.server; - -// CraftBukkit - import package private class -class ClientCommandOrdinalWrapper { - - static final int[] a = new int[EnumClientCommand.values().length]; - - static { - try { - a[EnumClientCommand.PERFORM_RESPAWN.ordinal()] = 1; - } catch (NoSuchFieldError nosuchfielderror) { - ; - } - - try { - a[EnumClientCommand.REQUEST_STATS.ordinal()] = 2; - } catch (NoSuchFieldError nosuchfielderror1) { - ; - } - - try { - a[EnumClientCommand.OPEN_INVENTORY_ACHIEVEMENT.ordinal()] = 3; - } catch (NoSuchFieldError nosuchfielderror2) { - ; - } - } -} diff --git a/src/main/java/net/minecraft/server/CommandBlockListenerAbstract.java b/src/main/java/net/minecraft/server/CommandBlockListenerAbstract.java deleted file mode 100644 index 0cd512d55e..0000000000 --- a/src/main/java/net/minecraft/server/CommandBlockListenerAbstract.java +++ /dev/null @@ -1,230 +0,0 @@ -package net.minecraft.server; - -import java.text.SimpleDateFormat; -import java.util.Date; - -// CraftBukkit start -import java.util.ArrayList; -import org.apache.logging.log4j.Level; -import org.bukkit.craftbukkit.command.VanillaCommandWrapper; -import com.google.common.base.Joiner; -// CraftBukkit end - -public abstract class CommandBlockListenerAbstract implements ICommandListener { - - private static final SimpleDateFormat a = new SimpleDateFormat("HH:mm:ss"); - private int b; - private boolean c = true; - private IChatBaseComponent d = null; - public String e = ""; // CraftBukkit - private -> public - private String f = "@"; - protected org.bukkit.command.CommandSender sender; // CraftBukkit - add sender; - - public CommandBlockListenerAbstract() {} - - public int g() { - return this.b; - } - - public IChatBaseComponent h() { - return this.d; - } - - public void a(NBTTagCompound nbttagcompound) { - nbttagcompound.setString("Command", this.e); - nbttagcompound.setInt("SuccessCount", this.b); - nbttagcompound.setString("CustomName", this.f); - if (this.d != null) { - nbttagcompound.setString("LastOutput", ChatSerializer.a(this.d)); - } - - nbttagcompound.setBoolean("TrackOutput", this.c); - } - - public void b(NBTTagCompound nbttagcompound) { - this.e = nbttagcompound.getString("Command"); - this.b = nbttagcompound.getInt("SuccessCount"); - if (nbttagcompound.hasKeyOfType("CustomName", 8)) { - this.f = nbttagcompound.getString("CustomName"); - } - - if (nbttagcompound.hasKeyOfType("LastOutput", 8)) { - this.d = ChatSerializer.a(nbttagcompound.getString("LastOutput")); - } - - if (nbttagcompound.hasKeyOfType("TrackOutput", 1)) { - this.c = nbttagcompound.getBoolean("TrackOutput"); - } - } - - public boolean a(int i, String s) { - return i <= 2; - } - - public void setCommand(String s) { - this.e = s; - } - - public String getCommand() { - return this.e; - } - - public void a(World world) { - if (world.isStatic) { - this.b = 0; - } - - MinecraftServer minecraftserver = MinecraftServer.getServer(); - - if (minecraftserver != null && minecraftserver.getEnableCommandBlock()) { - // CraftBukkit start - Handle command block commands using Bukkit dispatcher - org.bukkit.command.SimpleCommandMap commandMap = minecraftserver.server.getCommandMap(); - Joiner joiner = Joiner.on(" "); - String command = this.e; - if (this.e.startsWith("/")) { - command = this.e.substring(1); - } - String[] args = command.split(" "); - ArrayList commands = new ArrayList(); - - // Block disallowed commands - if (args[0].equalsIgnoreCase("stop") || args[0].equalsIgnoreCase("kick") || args[0].equalsIgnoreCase("op") || - args[0].equalsIgnoreCase("deop") || args[0].equalsIgnoreCase("ban") || args[0].equalsIgnoreCase("ban-ip") || - args[0].equalsIgnoreCase("pardon") || args[0].equalsIgnoreCase("pardon-ip") || args[0].equalsIgnoreCase("reload")) { - this.b = 0; - return; - } - - // If the world has no players don't run - if (this.getWorld().players.isEmpty()) { - this.b = 0; - return; - } - - // Handle vanilla commands; - if (minecraftserver.server.getCommandBlockOverride(args[0])) { - org.bukkit.command.Command commandBlockCommand = commandMap.getCommand("minecraft:" + args[0]); - if (commandBlockCommand instanceof VanillaCommandWrapper) { - this.b = ((VanillaCommandWrapper) commandBlockCommand).dispatchVanillaCommandBlock(this, this.e); - return; - } - } - - // Make sure this is a valid command - if (commandMap.getCommand(args[0]) == null) { - this.b = 0; - return; - } - - // testfor command requires special handling - if (args[0].equalsIgnoreCase("testfor")) { - if (args.length < 2) { - this.b = 0; - return; - } - - EntityPlayer[] players = PlayerSelector.getPlayers(this, args[1]); - - if (players != null && players.length > 0) { - this.b = players.length; - return; - } else { - EntityPlayer player = MinecraftServer.getServer().getPlayerList().getPlayer(args[1]); - if (player == null) { - this.b = 0; - return; - } else { - this.b = 1; - return; - } - } - } - - commands.add(args); - - // Find positions of command block syntax, if any - ArrayList newCommands = new ArrayList(); - for (int i = 0; i < args.length; i++) { - if (PlayerSelector.isPattern(args[i])) { - for (int j = 0; j < commands.size(); j++) { - newCommands.addAll(this.buildCommands(commands.get(j), i)); - } - ArrayList temp = commands; - commands = newCommands; - newCommands = temp; - newCommands.clear(); - } - } - - int completed = 0; - - // Now dispatch all of the commands we ended up with - for (int i = 0; i < commands.size(); i++) { - try { - if (commandMap.dispatch(sender, joiner.join(java.util.Arrays.asList(commands.get(i))))) { - completed++; - } - } catch (Throwable exception) { - if(this instanceof TileEntityCommandListener) { - TileEntityCommandListener listener = (TileEntityCommandListener) this; - MinecraftServer.getLogger().log(Level.WARN, String.format("CommandBlock at (%d,%d,%d) failed to handle command", listener.getChunkCoordinates().x, listener.getChunkCoordinates().y, listener.getChunkCoordinates().z), exception); - } else if (this instanceof EntityMinecartCommandBlockListener) { - EntityMinecartCommandBlockListener listener = (EntityMinecartCommandBlockListener) this; - MinecraftServer.getLogger().log(Level.WARN, String.format("MinecartCommandBlock at (%d,%d,%d) failed to handle command", listener.getChunkCoordinates().x, listener.getChunkCoordinates().y, listener.getChunkCoordinates().z), exception); - } else { - MinecraftServer.getLogger().log(Level.WARN, String.format("Unknown CommandBlock failed to handle command"), exception); - } - } - } - - this.b = completed; - // CraftBukkit end - } else { - this.b = 0; - } - } - - // CraftBukkit start - private ArrayList buildCommands(String[] args, int pos) { - ArrayList commands = new ArrayList(); - EntityPlayer[] players = PlayerSelector.getPlayers(this, args[pos]); - if (players != null) { - for (EntityPlayer player : players) { - if (player.world != this.getWorld()) { - continue; - } - String[] command = args.clone(); - command[pos] = player.getName(); - commands.add(command); - } - } - - return commands; - } - // CraftBukkit end - - public String getName() { - return this.f; - } - - public IChatBaseComponent getScoreboardDisplayName() { - return new ChatComponentText(this.getName()); - } - - public void setName(String s) { - this.f = s; - } - - public void sendMessage(IChatBaseComponent ichatbasecomponent) { - if (this.c && this.getWorld() != null && !this.getWorld().isStatic) { - this.d = (new ChatComponentText("[" + a.format(new Date()) + "] ")).addSibling(ichatbasecomponent); - this.e(); - } - } - - public abstract void e(); - - public void b(IChatBaseComponent ichatbasecomponent) { - this.d = ichatbasecomponent; - } -} diff --git a/src/main/java/net/minecraft/server/Container.java b/src/main/java/net/minecraft/server/Container.java deleted file mode 100644 index a10108b9fd..0000000000 --- a/src/main/java/net/minecraft/server/Container.java +++ /dev/null @@ -1,615 +0,0 @@ -package net.minecraft.server; - -import java.util.ArrayList; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Set; - -// CraftBukkit start -import java.util.HashMap; -import java.util.Map; -import org.bukkit.craftbukkit.inventory.CraftInventory; -import org.bukkit.craftbukkit.inventory.CraftItemStack; -import org.bukkit.event.Event.Result; -import org.bukkit.event.inventory.InventoryDragEvent; -import org.bukkit.event.inventory.InventoryType; -import org.bukkit.inventory.InventoryView; -// CraftBukkit end - -public abstract class Container { - - public List b = new ArrayList(); - public List c = new ArrayList(); - public int windowId; - private int dragType = -1; - public int g; // CraftBukkit - private -> public - private final Set h = new HashSet(); - protected List listeners = new ArrayList(); - private Set i = new HashSet(); - - // CraftBukkit start - public boolean checkReachable = true; - public abstract InventoryView getBukkitView(); - public void transferTo(Container other, org.bukkit.craftbukkit.entity.CraftHumanEntity player) { - InventoryView source = this.getBukkitView(), destination = other.getBukkitView(); - ((CraftInventory) source.getTopInventory()).getInventory().onClose(player); - ((CraftInventory) source.getBottomInventory()).getInventory().onClose(player); - ((CraftInventory) destination.getTopInventory()).getInventory().onOpen(player); - ((CraftInventory) destination.getBottomInventory()).getInventory().onOpen(player); - } - // CraftBukkit end - - public Container() {} - - protected Slot a(Slot slot) { - slot.rawSlotIndex = this.c.size(); - this.c.add(slot); - this.b.add(null); - return slot; - } - - public void addSlotListener(ICrafting icrafting) { - if (this.listeners.contains(icrafting)) { - throw new IllegalArgumentException("Listener already listening"); - } else { - this.listeners.add(icrafting); - icrafting.a(this, this.a()); - this.b(); - } - } - - public List a() { - ArrayList arraylist = new ArrayList(); - - for (int i = 0; i < this.c.size(); ++i) { - arraylist.add(((Slot) this.c.get(i)).getItem()); - } - - return arraylist; - } - - public void b() { - for (int i = 0; i < this.c.size(); ++i) { - ItemStack itemstack = ((Slot) this.c.get(i)).getItem(); - ItemStack itemstack1 = (ItemStack) this.b.get(i); - - if (!ItemStack.matches(itemstack1, itemstack)) { - itemstack1 = itemstack == null ? null : itemstack.cloneItemStack(); - this.b.set(i, itemstack1); - - for (int j = 0; j < this.listeners.size(); ++j) { - ((ICrafting) this.listeners.get(j)).a(this, i, itemstack1); - } - } - } - } - - public boolean a(EntityHuman entityhuman, int i) { - return false; - } - - public Slot getSlot(IInventory iinventory, int i) { - for (int j = 0; j < this.c.size(); ++j) { - Slot slot = (Slot) this.c.get(j); - - if (slot.a(iinventory, i)) { - return slot; - } - } - - return null; - } - - public Slot getSlot(int i) { - return (Slot) this.c.get(i); - } - - public ItemStack b(EntityHuman entityhuman, int i) { - Slot slot = (Slot) this.c.get(i); - - return slot != null ? slot.getItem() : null; - } - - public ItemStack clickItem(int i, int j, int k, EntityHuman entityhuman) { - ItemStack itemstack = null; - PlayerInventory playerinventory = entityhuman.inventory; - int l; - ItemStack itemstack1; - - if (k == 5) { - int i1 = this.g; - - this.g = c(j); - if ((i1 != 1 || this.g != 2) && i1 != this.g) { - this.d(); - } else if (playerinventory.getCarried() == null) { - this.d(); - } else if (this.g == 0) { - this.dragType = b(j); - if (d(this.dragType)) { - this.g = 1; - this.h.clear(); - } else { - this.d(); - } - } else if (this.g == 1) { - Slot slot = (Slot) this.c.get(i); - - if (slot != null && a(slot, playerinventory.getCarried(), true) && slot.isAllowed(playerinventory.getCarried()) && playerinventory.getCarried().count > this.h.size() && this.b(slot)) { - this.h.add(slot); - } - } else if (this.g == 2) { - if (!this.h.isEmpty()) { - itemstack1 = playerinventory.getCarried().cloneItemStack(); - l = playerinventory.getCarried().count; - Iterator iterator = this.h.iterator(); - - Map draggedSlots = new HashMap(); // CraftBukkit - Store slots from drag in map (raw slot id -> new stack) - while (iterator.hasNext()) { - Slot slot1 = (Slot) iterator.next(); - - if (slot1 != null && a(slot1, playerinventory.getCarried(), true) && slot1.isAllowed(playerinventory.getCarried()) && playerinventory.getCarried().count >= this.h.size() && this.b(slot1)) { - ItemStack itemstack2 = itemstack1.cloneItemStack(); - int j1 = slot1.hasItem() ? slot1.getItem().count : 0; - - a(this.h, this.dragType, itemstack2, j1); - if (itemstack2.count > itemstack2.getMaxStackSize()) { - itemstack2.count = itemstack2.getMaxStackSize(); - } - - if (itemstack2.count > slot1.getMaxStackSize()) { - itemstack2.count = slot1.getMaxStackSize(); - } - - l -= itemstack2.count - j1; - draggedSlots.put(slot1.rawSlotIndex, itemstack2); // CraftBukkit - Put in map instead of setting - } - } - - // CraftBukkit start - InventoryDragEvent - InventoryView view = getBukkitView(); - org.bukkit.inventory.ItemStack newcursor = CraftItemStack.asCraftMirror(itemstack1); - newcursor.setAmount(l); - Map eventmap = new HashMap(); - for (Map.Entry ditem : draggedSlots.entrySet()) { - eventmap.put(ditem.getKey(), CraftItemStack.asBukkitCopy(ditem.getValue())); - } - - // It's essential that we set the cursor to the new value here to prevent item duplication if a plugin closes the inventory. - ItemStack oldCursor = playerinventory.getCarried(); - playerinventory.setCarried(CraftItemStack.asNMSCopy(newcursor)); - - InventoryDragEvent event = new InventoryDragEvent(view, (newcursor.getType() != org.bukkit.Material.AIR ? newcursor : null), CraftItemStack.asBukkitCopy(oldCursor), this.dragType == 1, eventmap); - entityhuman.world.getServer().getPluginManager().callEvent(event); - - // Whether or not a change was made to the inventory that requires an update. - boolean needsUpdate = event.getResult() != Result.DEFAULT; - - if (event.getResult() != Result.DENY) { - for (Map.Entry dslot : draggedSlots.entrySet()) { - view.setItem(dslot.getKey(), CraftItemStack.asBukkitCopy(dslot.getValue())); - } - // The only time the carried item will be set to null is if the inventory is closed by the server. - // If the inventory is closed by the server, then the cursor items are dropped. This is why we change the cursor early. - if (playerinventory.getCarried() != null) { - playerinventory.setCarried(CraftItemStack.asNMSCopy(event.getCursor())); - needsUpdate = true; - - } - } else { - playerinventory.setCarried(oldCursor); - } - - if (needsUpdate && entityhuman instanceof EntityPlayer) { - ((EntityPlayer) entityhuman).updateInventory(this); - } - // CraftBukkit end - } - - this.d(); - } else { - this.d(); - } - } else if (this.g != 0) { - this.d(); - } else { - Slot slot2; - int k1; - ItemStack itemstack3; - - if ((k == 0 || k == 1) && (j == 0 || j == 1)) { - if (i == -999) { - if (playerinventory.getCarried() != null && i == -999) { - if (j == 0) { - entityhuman.drop(playerinventory.getCarried(), true); - playerinventory.setCarried((ItemStack) null); - } - - if (j == 1) { - // CraftBukkit start - Store a reference - ItemStack itemstack4 = playerinventory.getCarried(); - if (itemstack4.count > 0) { - entityhuman.drop(itemstack4.a(1), true); - } - - if (itemstack4.count == 0) { - // CraftBukkit end - playerinventory.setCarried((ItemStack) null); - } - } - } - } else if (k == 1) { - if (i < 0) { - return null; - } - - slot2 = (Slot) this.c.get(i); - if (slot2 != null && slot2.isAllowed(entityhuman)) { - itemstack1 = this.b(entityhuman, i); - if (itemstack1 != null) { - Item item = itemstack1.getItem(); - - itemstack = itemstack1.cloneItemStack(); - if (slot2.getItem() != null && slot2.getItem().getItem() == item) { - this.a(i, j, true, entityhuman); - } - } - } - } else { - if (i < 0) { - return null; - } - - slot2 = (Slot) this.c.get(i); - if (slot2 != null) { - itemstack1 = slot2.getItem(); - ItemStack itemstack4 = playerinventory.getCarried(); - - if (itemstack1 != null) { - itemstack = itemstack1.cloneItemStack(); - } - - if (itemstack1 == null) { - if (itemstack4 != null && slot2.isAllowed(itemstack4)) { - k1 = j == 0 ? itemstack4.count : 1; - if (k1 > slot2.getMaxStackSize()) { - k1 = slot2.getMaxStackSize(); - } - - if (itemstack4.count >= k1) { - slot2.set(itemstack4.a(k1)); - } - - if (itemstack4.count == 0) { - playerinventory.setCarried((ItemStack) null); - // CraftBukkit start - Update client cursor if we didn't empty it - } else if (entityhuman instanceof EntityPlayer) { - ((EntityPlayer) entityhuman).playerConnection.sendPacket(new PacketPlayOutSetSlot(-1, -1, entityhuman.inventory.getCarried())); - } - // CraftBukkit end - } - } else if (slot2.isAllowed(entityhuman)) { - if (itemstack4 == null) { - k1 = j == 0 ? itemstack1.count : (itemstack1.count + 1) / 2; - itemstack3 = slot2.a(k1); - playerinventory.setCarried(itemstack3); - if (itemstack1.count == 0) { - slot2.set((ItemStack) null); - } - - slot2.a(entityhuman, playerinventory.getCarried()); - } else if (slot2.isAllowed(itemstack4)) { - if (itemstack1.getItem() == itemstack4.getItem() && itemstack1.getData() == itemstack4.getData() && ItemStack.equals(itemstack1, itemstack4)) { - k1 = j == 0 ? itemstack4.count : 1; - if (k1 > slot2.getMaxStackSize() - itemstack1.count) { - k1 = slot2.getMaxStackSize() - itemstack1.count; - } - - if (k1 > itemstack4.getMaxStackSize() - itemstack1.count) { - k1 = itemstack4.getMaxStackSize() - itemstack1.count; - } - - itemstack4.a(k1); - if (itemstack4.count == 0) { - playerinventory.setCarried((ItemStack) null); - // CraftBukkit start - Update client cursor if we didn't empty it - } else if (entityhuman instanceof EntityPlayer) { - ((EntityPlayer) entityhuman).playerConnection.sendPacket(new PacketPlayOutSetSlot(-1, -1, entityhuman.inventory.getCarried())); - } - // CraftBukkit end - - itemstack1.count += k1; - } else if (itemstack4.count <= slot2.getMaxStackSize()) { - slot2.set(itemstack4); - playerinventory.setCarried(itemstack1); - } - } else if (itemstack1.getItem() == itemstack4.getItem() && itemstack4.getMaxStackSize() > 1 && (!itemstack1.usesData() || itemstack1.getData() == itemstack4.getData()) && ItemStack.equals(itemstack1, itemstack4)) { - k1 = itemstack1.count; - // CraftBukkit start - itemstack4.getMaxStackSize() -> maxStack - int maxStack = Math.min(itemstack4.getMaxStackSize(), slot2.getMaxStackSize()); - if (k1 > 0 && k1 + itemstack4.count <= maxStack) { - // CraftBukkit end - itemstack4.count += k1; - itemstack1 = slot2.a(k1); - if (itemstack1.count == 0) { - slot2.set((ItemStack) null); - } - - slot2.a(entityhuman, playerinventory.getCarried()); - // CraftBukkit start - Update client cursor if we didn't empty it - } else if (entityhuman instanceof EntityPlayer) { - ((EntityPlayer) entityhuman).playerConnection.sendPacket(new PacketPlayOutSetSlot(-1, -1, entityhuman.inventory.getCarried())); - } - // CraftBukkit end - } - } - - slot2.f(); - // CraftBukkit start - Make sure the client has the right slot contents - if (entityhuman instanceof EntityPlayer && slot2.getMaxStackSize() != 64) { - ((EntityPlayer) entityhuman).playerConnection.sendPacket(new PacketPlayOutSetSlot(this.windowId, slot2.rawSlotIndex, slot2.getItem())); - // Updating a crafting inventory makes the client reset the result slot, have to send it again - if (this.getBukkitView().getType() == InventoryType.WORKBENCH || this.getBukkitView().getType() == InventoryType.CRAFTING) { - ((EntityPlayer) entityhuman).playerConnection.sendPacket(new PacketPlayOutSetSlot(this.windowId, 0, this.getSlot(0).getItem())); - } - } - // CraftBukkit end - } - } - } else if (k == 2 && j >= 0 && j < 9) { - slot2 = (Slot) this.c.get(i); - if (slot2.isAllowed(entityhuman)) { - itemstack1 = playerinventory.getItem(j); - boolean flag = itemstack1 == null || slot2.inventory == playerinventory && slot2.isAllowed(itemstack1); - - k1 = -1; - if (!flag) { - k1 = playerinventory.getFirstEmptySlotIndex(); - flag |= k1 > -1; - } - - if (slot2.hasItem() && flag) { - itemstack3 = slot2.getItem(); - playerinventory.setItem(j, itemstack3.cloneItemStack()); - if ((slot2.inventory != playerinventory || !slot2.isAllowed(itemstack1)) && itemstack1 != null) { - if (k1 > -1) { - playerinventory.pickup(itemstack1); - slot2.a(itemstack3.count); - slot2.set((ItemStack) null); - slot2.a(entityhuman, itemstack3); - } - } else { - slot2.a(itemstack3.count); - slot2.set(itemstack1); - slot2.a(entityhuman, itemstack3); - } - } else if (!slot2.hasItem() && itemstack1 != null && slot2.isAllowed(itemstack1)) { - playerinventory.setItem(j, (ItemStack) null); - slot2.set(itemstack1); - } - } - } else if (k == 3 && entityhuman.abilities.canInstantlyBuild && playerinventory.getCarried() == null && i >= 0) { - slot2 = (Slot) this.c.get(i); - if (slot2 != null && slot2.hasItem()) { - itemstack1 = slot2.getItem().cloneItemStack(); - itemstack1.count = itemstack1.getMaxStackSize(); - playerinventory.setCarried(itemstack1); - } - } else if (k == 4 && playerinventory.getCarried() == null && i >= 0) { - slot2 = (Slot) this.c.get(i); - if (slot2 != null && slot2.hasItem() && slot2.isAllowed(entityhuman)) { - itemstack1 = slot2.a(j == 0 ? 1 : slot2.getItem().count); - slot2.a(entityhuman, itemstack1); - entityhuman.drop(itemstack1, true); - } - } else if (k == 6 && i >= 0) { - slot2 = (Slot) this.c.get(i); - itemstack1 = playerinventory.getCarried(); - if (itemstack1 != null && (slot2 == null || !slot2.hasItem() || !slot2.isAllowed(entityhuman))) { - l = j == 0 ? 0 : this.c.size() - 1; - k1 = j == 0 ? 1 : -1; - - for (int l1 = 0; l1 < 2; ++l1) { - for (int i2 = l; i2 >= 0 && i2 < this.c.size() && itemstack1.count < itemstack1.getMaxStackSize(); i2 += k1) { - Slot slot3 = (Slot) this.c.get(i2); - - if (slot3.hasItem() && a(slot3, itemstack1, true) && slot3.isAllowed(entityhuman) && this.a(itemstack1, slot3) && (l1 != 0 || slot3.getItem().count != slot3.getItem().getMaxStackSize())) { - int j2 = Math.min(itemstack1.getMaxStackSize() - itemstack1.count, slot3.getItem().count); - ItemStack itemstack5 = slot3.a(j2); - - itemstack1.count += j2; - if (itemstack5.count <= 0) { - slot3.set((ItemStack) null); - } - - slot3.a(entityhuman, itemstack5); - } - } - } - } - - this.b(); - } - } - - return itemstack; - } - - public boolean a(ItemStack itemstack, Slot slot) { - return true; - } - - protected void a(int i, int j, boolean flag, EntityHuman entityhuman) { - this.clickItem(i, j, 1, entityhuman); - } - - public void b(EntityHuman entityhuman) { - PlayerInventory playerinventory = entityhuman.inventory; - - if (playerinventory.getCarried() != null) { - entityhuman.drop(playerinventory.getCarried(), false); - playerinventory.setCarried((ItemStack) null); - } - } - - public void a(IInventory iinventory) { - this.b(); - } - - public void setItem(int i, ItemStack itemstack) { - this.getSlot(i).set(itemstack); - } - - public boolean c(EntityHuman entityhuman) { - return !this.i.contains(entityhuman); - } - - public void a(EntityHuman entityhuman, boolean flag) { - if (flag) { - this.i.remove(entityhuman); - } else { - this.i.add(entityhuman); - } - } - - public abstract boolean a(EntityHuman entityhuman); - - protected boolean a(ItemStack itemstack, int i, int j, boolean flag) { - boolean flag1 = false; - int k = i; - - if (flag) { - k = j - 1; - } - - Slot slot; - ItemStack itemstack1; - - if (itemstack.isStackable()) { - while (itemstack.count > 0 && (!flag && k < j || flag && k >= i)) { - slot = (Slot) this.c.get(k); - itemstack1 = slot.getItem(); - if (itemstack1 != null && itemstack1.getItem() == itemstack.getItem() && (!itemstack.usesData() || itemstack.getData() == itemstack1.getData()) && ItemStack.equals(itemstack, itemstack1)) { - int l = itemstack1.count + itemstack.count; - - // CraftBukkit start - itemstack.getMaxStackSize() -> maxStack - int maxStack = Math.min(itemstack.getMaxStackSize(), slot.getMaxStackSize()); - if (l <= maxStack) { - itemstack.count = 0; - itemstack1.count = l; - slot.f(); - flag1 = true; - } else if (itemstack1.count < maxStack) { - itemstack.count -= maxStack - itemstack1.count; - itemstack1.count = maxStack; - slot.f(); - flag1 = true; - } - // CraftBukkit end - } - - if (flag) { - --k; - } else { - ++k; - } - } - } - - if (itemstack.count > 0) { - if (flag) { - k = j - 1; - } else { - k = i; - } - - while (!flag && k < j || flag && k >= i) { - slot = (Slot) this.c.get(k); - itemstack1 = slot.getItem(); - if (itemstack1 == null) { - slot.set(itemstack.cloneItemStack()); - slot.f(); - itemstack.count = 0; - flag1 = true; - break; - } - - if (flag) { - --k; - } else { - ++k; - } - } - } - - return flag1; - } - - public static int b(int i) { - return i >> 2 & 3; - } - - public static int c(int i) { - return i & 3; - } - - public static boolean d(int i) { - return i == 0 || i == 1; - } - - protected void d() { - this.g = 0; - this.h.clear(); - } - - public static boolean a(Slot slot, ItemStack itemstack, boolean flag) { - boolean flag1 = slot == null || !slot.hasItem(); - - if (slot != null && slot.hasItem() && itemstack != null && itemstack.doMaterialsMatch(slot.getItem()) && ItemStack.equals(slot.getItem(), itemstack)) { - int i = flag ? 0 : itemstack.count; - - flag1 |= slot.getItem().count + i <= itemstack.getMaxStackSize(); - } - - return flag1; - } - - public static void a(Set set, int i, ItemStack itemstack, int j) { - switch (i) { - case 0: - itemstack.count = MathHelper.d((float) itemstack.count / (float) set.size()); - break; - - case 1: - itemstack.count = 1; - } - - itemstack.count += j; - } - - public boolean b(Slot slot) { - return true; - } - - public static int b(IInventory iinventory) { - if (iinventory == null) { - return 0; - } else { - int i = 0; - float f = 0.0F; - - for (int j = 0; j < iinventory.getSize(); ++j) { - ItemStack itemstack = iinventory.getItem(j); - - if (itemstack != null) { - f += (float) itemstack.count / (float) Math.min(iinventory.getMaxStackSize(), itemstack.getMaxStackSize()); - ++i; - } - } - - f /= (float) iinventory.getSize(); - return MathHelper.d(f * 14.0F) + (i > 0 ? 1 : 0); - } - } -} diff --git a/src/main/java/net/minecraft/server/ContainerAnvil.java b/src/main/java/net/minecraft/server/ContainerAnvil.java deleted file mode 100644 index af8847f137..0000000000 --- a/src/main/java/net/minecraft/server/ContainerAnvil.java +++ /dev/null @@ -1,400 +0,0 @@ -package net.minecraft.server; - -import java.util.Iterator; -import java.util.Map; - -import net.minecraft.util.org.apache.commons.lang3.StringUtils; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; - -import org.bukkit.craftbukkit.inventory.CraftInventoryView; // CraftBukkit - -public class ContainerAnvil extends Container { - - private static final Logger f = LogManager.getLogger(); - private IInventory g = new InventoryCraftResult(); - private IInventory h = new ContainerAnvilInventory(this, "Repair", true, 2); - private World i; - private int j; - private int k; - private int l; - public int a; - private int m; - private String n; - private final EntityHuman o; - // CraftBukkit start - private CraftInventoryView bukkitEntity = null; - private PlayerInventory player; - // CraftBukkit end - - public ContainerAnvil(PlayerInventory playerinventory, World world, int i, int j, int k, EntityHuman entityhuman) { - this.player = playerinventory; // CraftBukkit - this.i = world; - this.j = i; - this.k = j; - this.l = k; - this.o = entityhuman; - this.a(new Slot(this.h, 0, 27, 47)); - this.a(new Slot(this.h, 1, 76, 47)); - this.a((Slot) (new SlotAnvilResult(this, this.g, 2, 134, 47, world, i, j, k))); - - int l; - - for (l = 0; l < 3; ++l) { - for (int i1 = 0; i1 < 9; ++i1) { - this.a(new Slot(playerinventory, i1 + l * 9 + 9, 8 + i1 * 18, 84 + l * 18)); - } - } - - for (l = 0; l < 9; ++l) { - this.a(new Slot(playerinventory, l, 8 + l * 18, 142)); - } - } - - public void a(IInventory iinventory) { - super.a(iinventory); - if (iinventory == this.h) { - this.e(); - } - } - - public void e() { - ItemStack itemstack = this.h.getItem(0); - - this.a = 0; - int i = 0; - byte b0 = 0; - int j = 0; - - if (itemstack == null) { - this.g.setItem(0, (ItemStack) null); - this.a = 0; - } else { - ItemStack itemstack1 = itemstack.cloneItemStack(); - ItemStack itemstack2 = this.h.getItem(1); - Map map = EnchantmentManager.a(itemstack1); - boolean flag = false; - int k = b0 + itemstack.getRepairCost() + (itemstack2 == null ? 0 : itemstack2.getRepairCost()); - - this.m = 0; - int l; - int i1; - int j1; - int k1; - int l1; - Iterator iterator; - Enchantment enchantment; - - if (itemstack2 != null) { - flag = itemstack2.getItem() == Items.ENCHANTED_BOOK && Items.ENCHANTED_BOOK.g(itemstack2).size() > 0; - if (itemstack1.g() && itemstack1.getItem().a(itemstack, itemstack2)) { - l = Math.min(itemstack1.j(), itemstack1.l() / 4); - if (l <= 0) { - this.g.setItem(0, (ItemStack) null); - this.a = 0; - return; - } - - for (i1 = 0; l > 0 && i1 < itemstack2.count; ++i1) { - j1 = itemstack1.j() - l; - itemstack1.setData(j1); - i += Math.max(1, l / 100) + map.size(); - l = Math.min(itemstack1.j(), itemstack1.l() / 4); - } - - this.m = i1; - } else { - if (!flag && (itemstack1.getItem() != itemstack2.getItem() || !itemstack1.g())) { - this.g.setItem(0, (ItemStack) null); - this.a = 0; - return; - } - - if (itemstack1.g() && !flag) { - l = itemstack.l() - itemstack.j(); - i1 = itemstack2.l() - itemstack2.j(); - j1 = i1 + itemstack1.l() * 12 / 100; - int i2 = l + j1; - - k1 = itemstack1.l() - i2; - if (k1 < 0) { - k1 = 0; - } - - if (k1 < itemstack1.getData()) { - itemstack1.setData(k1); - i += Math.max(1, j1 / 100); - } - } - - Map map1 = EnchantmentManager.a(itemstack2); - - iterator = map1.keySet().iterator(); - - while (iterator.hasNext()) { - j1 = ((Integer) iterator.next()).intValue(); - enchantment = Enchantment.byId[j1]; - k1 = map.containsKey(Integer.valueOf(j1)) ? ((Integer) map.get(Integer.valueOf(j1))).intValue() : 0; - l1 = ((Integer) map1.get(Integer.valueOf(j1))).intValue(); - int j2; - - if (k1 == l1) { - ++l1; - j2 = l1; - } else { - j2 = Math.max(l1, k1); - } - - l1 = j2; - int k2 = l1 - k1; - boolean flag1 = enchantment.canEnchant(itemstack); - - if (this.o.abilities.canInstantlyBuild || itemstack.getItem() == Items.ENCHANTED_BOOK) { - flag1 = true; - } - - Iterator iterator1 = map.keySet().iterator(); - - while (iterator1.hasNext()) { - int l2 = ((Integer) iterator1.next()).intValue(); - - if (l2 != j1 && !enchantment.a(Enchantment.byId[l2])) { - flag1 = false; - i += k2; - } - } - - if (flag1) { - if (l1 > enchantment.getMaxLevel()) { - l1 = enchantment.getMaxLevel(); - } - - map.put(Integer.valueOf(j1), Integer.valueOf(l1)); - int i3 = 0; - - switch (enchantment.getRandomWeight()) { - case 1: - i3 = 8; - break; - - case 2: - i3 = 4; - - case 3: - case 4: - case 6: - case 7: - case 8: - case 9: - default: - break; - - case 5: - i3 = 2; - break; - - case 10: - i3 = 1; - } - - if (flag) { - i3 = Math.max(1, i3 / 2); - } - - i += i3 * k2; - } - } - } - } - - if (StringUtils.isBlank(this.n)) { - if (itemstack.hasName()) { - j = itemstack.g() ? 7 : itemstack.count * 5; - i += j; - itemstack1.t(); - } - } else if (!this.n.equals(itemstack.getName())) { - j = itemstack.g() ? 7 : itemstack.count * 5; - i += j; - if (itemstack.hasName()) { - k += j / 2; - } - - itemstack1.c(this.n); - } - - l = 0; - - 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(); - l1 = 0; - ++l; - switch (enchantment.getRandomWeight()) { - case 1: - l1 = 8; - break; - - case 2: - l1 = 4; - - case 3: - case 4: - case 6: - case 7: - case 8: - case 9: - default: - break; - - case 5: - l1 = 2; - break; - - case 10: - 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; - } - - if (j == i && j > 0 && this.a >= 40) { - this.a = 39; - } - - if (this.a >= 40 && !this.o.abilities.canInstantlyBuild) { - itemstack1 = null; - } - - if (itemstack1 != null) { - i1 = itemstack1.getRepairCost(); - if (itemstack2 != null && i1 < itemstack2.getRepairCost()) { - i1 = itemstack2.getRepairCost(); - } - - if (itemstack1.hasName()) { - i1 -= 9; - } - - if (i1 < 0) { - i1 = 0; - } - - i1 += 2; - itemstack1.setRepairCost(i1); - EnchantmentManager.a(map, itemstack1); - } - - this.g.setItem(0, itemstack1); - this.b(); - } - } - - public void addSlotListener(ICrafting icrafting) { - super.addSlotListener(icrafting); - icrafting.setContainerData(this, 0, this.a); - } - - public void b(EntityHuman entityhuman) { - super.b(entityhuman); - if (!this.i.isStatic) { - for (int i = 0; i < this.h.getSize(); ++i) { - ItemStack itemstack = this.h.splitWithoutUpdate(i); - - if (itemstack != null) { - entityhuman.drop(itemstack, false); - } - } - } - } - - public boolean a(EntityHuman entityhuman) { - if (!this.checkReachable) return true; // CraftBukkit - return this.i.getType(this.j, this.k, this.l) != Blocks.ANVIL ? false : entityhuman.e((double) this.j + 0.5D, (double) this.k + 0.5D, (double) this.l + 0.5D) <= 64.0D; - } - - public ItemStack b(EntityHuman entityhuman, int i) { - ItemStack itemstack = null; - Slot slot = (Slot) this.c.get(i); - - if (slot != null && slot.hasItem()) { - ItemStack itemstack1 = slot.getItem(); - - itemstack = itemstack1.cloneItemStack(); - if (i == 2) { - if (!this.a(itemstack1, 3, 39, true)) { - return null; - } - - slot.a(itemstack1, itemstack); - } else if (i != 0 && i != 1) { - if (i >= 3 && i < 39 && !this.a(itemstack1, 0, 2, false)) { - return null; - } - } else if (!this.a(itemstack1, 3, 39, false)) { - return null; - } - - if (itemstack1.count == 0) { - slot.set((ItemStack) null); - } else { - slot.f(); - } - - if (itemstack1.count == itemstack.count) { - return null; - } - - slot.a(entityhuman, itemstack1); - } - - return itemstack; - } - - public void a(String s) { - this.n = s; - if (this.getSlot(2).hasItem()) { - ItemStack itemstack = this.getSlot(2).getItem(); - - if (StringUtils.isBlank(s)) { - itemstack.t(); - } else { - itemstack.c(this.n); - } - } - - this.e(); - } - - static IInventory a(ContainerAnvil containeranvil) { - return containeranvil.h; - } - - static int b(ContainerAnvil containeranvil) { - return containeranvil.m; - } - - // CraftBukkit start - public CraftInventoryView getBukkitView() { - if (bukkitEntity != null) { - return bukkitEntity; - } - - org.bukkit.craftbukkit.inventory.CraftInventory inventory = new org.bukkit.craftbukkit.inventory.CraftInventoryAnvil(this.h, this.g); - bukkitEntity = new CraftInventoryView(this.player.player.getBukkitEntity(), inventory, this); - return bukkitEntity; - } - // CraftBukkit end -} diff --git a/src/main/java/net/minecraft/server/ContainerAnvilInventory.java b/src/main/java/net/minecraft/server/ContainerAnvilInventory.java deleted file mode 100644 index 6cc0d924cc..0000000000 --- a/src/main/java/net/minecraft/server/ContainerAnvilInventory.java +++ /dev/null @@ -1,58 +0,0 @@ -package net.minecraft.server; - -// CraftBukkit start -import java.util.List; -import org.bukkit.craftbukkit.entity.CraftHumanEntity; -import org.bukkit.entity.HumanEntity; -// CraftBukkit end - -public class ContainerAnvilInventory extends InventorySubcontainer { // CraftBukkit - public - - final ContainerAnvil a; - - // CraftBukkit start - public List transaction = new java.util.ArrayList(); - public org.bukkit.entity.Player player; - private int maxStack = MAX_STACK; - - public ItemStack[] getContents() { - return this.items; - } - - public void onOpen(CraftHumanEntity who) { - transaction.add(who); - } - - public void onClose(CraftHumanEntity who) { - transaction.remove(who); - } - - public List getViewers() { - return transaction; - } - - public org.bukkit.inventory.InventoryHolder getOwner() { - return this.player; - } - - public void setMaxStackSize(int size) { - maxStack = size; - } - // CraftBukkit end - - ContainerAnvilInventory(ContainerAnvil containeranvil, String s, boolean flag, int i) { - super(s, flag, i); - this.a = containeranvil; - } - - // CraftBukkit start - override inherited maxStack from InventorySubcontainer - public int getMaxStackSize() { - return maxStack; - } - // CraftBukkit end - - public void update() { - super.update(); - this.a.a((IInventory) this); - } -} diff --git a/src/main/java/net/minecraft/server/ContainerBeacon.java b/src/main/java/net/minecraft/server/ContainerBeacon.java deleted file mode 100644 index b7fa7b4278..0000000000 --- a/src/main/java/net/minecraft/server/ContainerBeacon.java +++ /dev/null @@ -1,114 +0,0 @@ -package net.minecraft.server; - -import org.bukkit.craftbukkit.inventory.CraftInventoryView; // CraftBukkit - -public class ContainerBeacon extends Container { - - private TileEntityBeacon a; - private final SlotBeacon f; - private int g; - private int h; - private int i; - // CraftBukkit start - private CraftInventoryView bukkitEntity = null; - private PlayerInventory player; - // CraftBukkit end - - public ContainerBeacon(PlayerInventory playerinventory, TileEntityBeacon tileentitybeacon) { - player = playerinventory; // CraftBukkit - this.a = tileentitybeacon; - this.a(this.f = new SlotBeacon(this, tileentitybeacon, 0, 136, 110)); - byte b0 = 36; - short short1 = 137; - - int i; - - for (i = 0; i < 3; ++i) { - for (int j = 0; j < 9; ++j) { - this.a(new Slot(playerinventory, j + i * 9 + 9, b0 + j * 18, short1 + i * 18)); - } - } - - for (i = 0; i < 9; ++i) { - this.a(new Slot(playerinventory, i, b0 + i * 18, 58 + short1)); - } - - this.g = tileentitybeacon.l(); - this.h = tileentitybeacon.j(); - this.i = tileentitybeacon.k(); - } - - public void addSlotListener(ICrafting icrafting) { - super.addSlotListener(icrafting); - icrafting.setContainerData(this, 0, this.g); - icrafting.setContainerData(this, 1, this.h); - icrafting.setContainerData(this, 2, this.i); - } - - public TileEntityBeacon e() { - return this.a; - } - - public boolean a(EntityHuman entityhuman) { - if (!this.checkReachable) return true; // CraftBukkit - return this.a.a(entityhuman); - } - - public ItemStack b(EntityHuman entityhuman, int i) { - ItemStack itemstack = null; - Slot slot = (Slot) this.c.get(i); - - if (slot != null && slot.hasItem()) { - ItemStack itemstack1 = slot.getItem(); - - itemstack = itemstack1.cloneItemStack(); - if (i == 0) { - if (!this.a(itemstack1, 1, 37, true)) { - return null; - } - - slot.a(itemstack1, itemstack); - } else if (!this.f.hasItem() && this.f.isAllowed(itemstack1) && itemstack1.count == 1) { - if (!this.a(itemstack1, 0, 1, false)) { - return null; - } - } else if (i >= 1 && i < 28) { - if (!this.a(itemstack1, 28, 37, false)) { - return null; - } - } else if (i >= 28 && i < 37) { - if (!this.a(itemstack1, 1, 28, false)) { - return null; - } - } else if (!this.a(itemstack1, 1, 37, false)) { - return null; - } - - if (itemstack1.count == 0) { - slot.set((ItemStack) null); - } else { - slot.f(); - } - - if (itemstack1.count == itemstack.count) { - return null; - } - - slot.a(entityhuman, itemstack1); - } - - return itemstack; - } - - // CraftBukkit start - public CraftInventoryView getBukkitView() { - if (bukkitEntity != null) { - return bukkitEntity; - } - - org.bukkit.craftbukkit.inventory.CraftInventory inventory = new org.bukkit.craftbukkit.inventory.CraftInventoryBeacon(this.a); - bukkitEntity = new CraftInventoryView(this.player.player.getBukkitEntity(), inventory, this); - return bukkitEntity; - } - // CraftBukkit end -} diff --git a/src/main/java/net/minecraft/server/ContainerBrewingStand.java b/src/main/java/net/minecraft/server/ContainerBrewingStand.java deleted file mode 100644 index 903489aeb3..0000000000 --- a/src/main/java/net/minecraft/server/ContainerBrewingStand.java +++ /dev/null @@ -1,126 +0,0 @@ -package net.minecraft.server; - -// CraftBukkit start -import org.bukkit.craftbukkit.inventory.CraftInventoryBrewer; -import org.bukkit.craftbukkit.inventory.CraftInventoryView; -// CraftBukkit end - -public class ContainerBrewingStand extends Container { - - private TileEntityBrewingStand brewingStand; - private final Slot f; - private int g; - // CraftBukkit start - private CraftInventoryView bukkitEntity = null; - private PlayerInventory player; - // CraftBukkit end - - public ContainerBrewingStand(PlayerInventory playerinventory, TileEntityBrewingStand tileentitybrewingstand) { - player = playerinventory; // CraftBukkit - this.brewingStand = tileentitybrewingstand; - this.a(new SlotPotionBottle(playerinventory.player, tileentitybrewingstand, 0, 56, 46)); - this.a(new SlotPotionBottle(playerinventory.player, tileentitybrewingstand, 1, 79, 53)); - this.a(new SlotPotionBottle(playerinventory.player, tileentitybrewingstand, 2, 102, 46)); - this.f = this.a(new SlotBrewing(this, tileentitybrewingstand, 3, 79, 17)); - - int i; - - for (i = 0; i < 3; ++i) { - for (int j = 0; j < 9; ++j) { - this.a(new Slot(playerinventory, j + i * 9 + 9, 8 + j * 18, 84 + i * 18)); - } - } - - for (i = 0; i < 9; ++i) { - this.a(new Slot(playerinventory, i, 8 + i * 18, 142)); - } - } - - public void addSlotListener(ICrafting icrafting) { - super.addSlotListener(icrafting); - icrafting.setContainerData(this, 0, this.brewingStand.i()); - } - - public void b() { - super.b(); - - for (int i = 0; i < this.listeners.size(); ++i) { - ICrafting icrafting = (ICrafting) this.listeners.get(i); - - if (this.g != this.brewingStand.i()) { - icrafting.setContainerData(this, 0, this.brewingStand.i()); - } - } - - this.g = this.brewingStand.i(); - } - - public boolean a(EntityHuman entityhuman) { - if (!this.checkReachable) return true; // CraftBukkit - return this.brewingStand.a(entityhuman); - } - - public ItemStack b(EntityHuman entityhuman, int i) { - ItemStack itemstack = null; - Slot slot = (Slot) this.c.get(i); - - if (slot != null && slot.hasItem()) { - ItemStack itemstack1 = slot.getItem(); - - itemstack = itemstack1.cloneItemStack(); - if ((i < 0 || i > 2) && i != 3) { - if (!this.f.hasItem() && this.f.isAllowed(itemstack1)) { - if (!this.a(itemstack1, 3, 4, false)) { - return null; - } - } else if (SlotPotionBottle.b_(itemstack)) { - if (!this.a(itemstack1, 0, 3, false)) { - return null; - } - } else if (i >= 4 && i < 31) { - if (!this.a(itemstack1, 31, 40, false)) { - return null; - } - } else if (i >= 31 && i < 40) { - if (!this.a(itemstack1, 4, 31, false)) { - return null; - } - } else if (!this.a(itemstack1, 4, 40, false)) { - return null; - } - } else { - if (!this.a(itemstack1, 4, 40, true)) { - return null; - } - - slot.a(itemstack1, itemstack); - } - - if (itemstack1.count == 0) { - slot.set((ItemStack) null); - } else { - slot.f(); - } - - if (itemstack1.count == itemstack.count) { - return null; - } - - slot.a(entityhuman, itemstack1); - } - - return itemstack; - } - - // CraftBukkit start - public CraftInventoryView getBukkitView() { - if (bukkitEntity != null) { - return bukkitEntity; - } - - CraftInventoryBrewer inventory = new CraftInventoryBrewer(this.brewingStand); - bukkitEntity = new CraftInventoryView(this.player.player.getBukkitEntity(), inventory, this); - return bukkitEntity; - } - // CraftBukkit end -} diff --git a/src/main/java/net/minecraft/server/ContainerChest.java b/src/main/java/net/minecraft/server/ContainerChest.java deleted file mode 100644 index c2c4fb5364..0000000000 --- a/src/main/java/net/minecraft/server/ContainerChest.java +++ /dev/null @@ -1,104 +0,0 @@ -package net.minecraft.server; - -// CraftBukkit start -import org.bukkit.craftbukkit.inventory.CraftInventory; -import org.bukkit.craftbukkit.inventory.CraftInventoryView; -// CraftBukkit end - -public class ContainerChest extends Container { - - public IInventory container; // CraftBukkit - private->public - private int f; - // CraftBukkit start - private CraftInventoryView bukkitEntity = null; - private PlayerInventory player; - - public CraftInventoryView getBukkitView() { - if (bukkitEntity != null) { - return bukkitEntity; - } - - CraftInventory inventory; - if (this.container instanceof PlayerInventory) { - inventory = new org.bukkit.craftbukkit.inventory.CraftInventoryPlayer((PlayerInventory) this.container); - } else if (this.container instanceof InventoryLargeChest) { - inventory = new org.bukkit.craftbukkit.inventory.CraftInventoryDoubleChest((InventoryLargeChest) this.container); - } else { - inventory = new CraftInventory(this.container); - } - - bukkitEntity = new CraftInventoryView(this.player.player.getBukkitEntity(), inventory, this); - return bukkitEntity; - } - // CraftBukkit end - - public ContainerChest(IInventory iinventory, IInventory iinventory1) { - this.container = iinventory1; - this.f = iinventory1.getSize() / 9; - iinventory1.startOpen(); - int i = (this.f - 4) * 18; - // CraftBukkit start - Save player - // TODO: Should we check to make sure it really is an InventoryPlayer? - this.player = (PlayerInventory) iinventory; - // CraftBukkit end - - int j; - int k; - - for (j = 0; j < this.f; ++j) { - for (k = 0; k < 9; ++k) { - this.a(new Slot(iinventory1, k + j * 9, 8 + k * 18, 18 + j * 18)); - } - } - - for (j = 0; j < 3; ++j) { - for (k = 0; k < 9; ++k) { - this.a(new Slot(iinventory, k + j * 9 + 9, 8 + k * 18, 103 + j * 18 + i)); - } - } - - for (j = 0; j < 9; ++j) { - this.a(new Slot(iinventory, j, 8 + j * 18, 161 + i)); - } - } - - public boolean a(EntityHuman entityhuman) { - if (!this.checkReachable) return true; // CraftBukkit - return this.container.a(entityhuman); - } - - public ItemStack b(EntityHuman entityhuman, int i) { - ItemStack itemstack = null; - Slot slot = (Slot) this.c.get(i); - - if (slot != null && slot.hasItem()) { - ItemStack itemstack1 = slot.getItem(); - - itemstack = itemstack1.cloneItemStack(); - if (i < this.f * 9) { - if (!this.a(itemstack1, this.f * 9, this.c.size(), true)) { - return null; - } - } else if (!this.a(itemstack1, 0, this.f * 9, false)) { - return null; - } - - if (itemstack1.count == 0) { - slot.set((ItemStack) null); - } else { - slot.f(); - } - } - - return itemstack; - } - - public void b(EntityHuman entityhuman) { - super.b(entityhuman); - this.container.closeContainer(); - } - - public IInventory e() { - return this.container; - } -} diff --git a/src/main/java/net/minecraft/server/ContainerDispenser.java b/src/main/java/net/minecraft/server/ContainerDispenser.java deleted file mode 100644 index 32187ec1ee..0000000000 --- a/src/main/java/net/minecraft/server/ContainerDispenser.java +++ /dev/null @@ -1,91 +0,0 @@ -package net.minecraft.server; - -// CraftBukkit start -import org.bukkit.craftbukkit.inventory.CraftInventory; -import org.bukkit.craftbukkit.inventory.CraftInventoryView; -// CraftBukkit end - -public class ContainerDispenser extends Container { - - public TileEntityDispenser items; // CraftBukkit - private -> public - // CraftBukkit start - private CraftInventoryView bukkitEntity = null; - private PlayerInventory player; - // CraftBukkit end - - public ContainerDispenser(IInventory iinventory, TileEntityDispenser tileentitydispenser) { - this.items = tileentitydispenser; - // CraftBukkit start - Save player - // TODO: Should we check to make sure it really is an InventoryPlayer? - this.player = (PlayerInventory)iinventory; - // CraftBukkit end - - int i; - int j; - - for (i = 0; i < 3; ++i) { - for (j = 0; j < 3; ++j) { - this.a(new Slot(tileentitydispenser, j + i * 3, 62 + j * 18, 17 + i * 18)); - } - } - - for (i = 0; i < 3; ++i) { - for (j = 0; j < 9; ++j) { - this.a(new Slot(iinventory, j + i * 9 + 9, 8 + j * 18, 84 + i * 18)); - } - } - - for (i = 0; i < 9; ++i) { - this.a(new Slot(iinventory, i, 8 + i * 18, 142)); - } - } - - public boolean a(EntityHuman entityhuman) { - if (!this.checkReachable) return true; // CraftBukkit - return this.items.a(entityhuman); - } - - public ItemStack b(EntityHuman entityhuman, int i) { - ItemStack itemstack = null; - Slot slot = (Slot) this.c.get(i); - - if (slot != null && slot.hasItem()) { - ItemStack itemstack1 = slot.getItem(); - - itemstack = itemstack1.cloneItemStack(); - if (i < 9) { - if (!this.a(itemstack1, 9, 45, true)) { - return null; - } - } else if (!this.a(itemstack1, 0, 9, false)) { - return null; - } - - if (itemstack1.count == 0) { - slot.set((ItemStack) null); - } else { - slot.f(); - } - - if (itemstack1.count == itemstack.count) { - return null; - } - - slot.a(entityhuman, itemstack1); - } - - return itemstack; - } - - // CraftBukkit start - public CraftInventoryView getBukkitView() { - if (bukkitEntity != null) { - return bukkitEntity; - } - - CraftInventory inventory = new CraftInventory(this.items); - bukkitEntity = new CraftInventoryView(this.player.player.getBukkitEntity(), inventory, this); - return bukkitEntity; - } - // CraftBukkit end -} diff --git a/src/main/java/net/minecraft/server/ContainerEnchantTable.java b/src/main/java/net/minecraft/server/ContainerEnchantTable.java deleted file mode 100644 index 5f948e47dc..0000000000 --- a/src/main/java/net/minecraft/server/ContainerEnchantTable.java +++ /dev/null @@ -1,284 +0,0 @@ -package net.minecraft.server; - -import java.util.List; -import java.util.Random; - -// CraftBukkit start -import java.util.Map; - -import org.bukkit.craftbukkit.inventory.CraftInventoryEnchanting; -import org.bukkit.craftbukkit.inventory.CraftInventoryView; -import org.bukkit.craftbukkit.inventory.CraftItemStack; -import org.bukkit.event.enchantment.EnchantItemEvent; -import org.bukkit.event.enchantment.PrepareItemEnchantEvent; -import org.bukkit.entity.Player; -// CraftBukkit end - -public class ContainerEnchantTable extends Container { - - // CraftBukkit - make type specific (changed from IInventory) - public ContainerEnchantTableInventory enchantSlots = new ContainerEnchantTableInventory(this, "Enchant", true, 1); - private World world; - private int x; - private int y; - private int z; - private Random l = new Random(); - public long f; - public int[] costs = new int[3]; - // CraftBukkit start - private CraftInventoryView bukkitEntity = null; - private Player player; - // CraftBukkit end - - public ContainerEnchantTable(PlayerInventory playerinventory, World world, int i, int j, int k) { - this.world = world; - this.x = i; - this.y = j; - this.z = k; - this.a((Slot) (new SlotEnchant(this, this.enchantSlots, 0, 25, 47))); - - int l; - - for (l = 0; l < 3; ++l) { - for (int i1 = 0; i1 < 9; ++i1) { - this.a(new Slot(playerinventory, i1 + l * 9 + 9, 8 + i1 * 18, 84 + l * 18)); - } - } - - for (l = 0; l < 9; ++l) { - this.a(new Slot(playerinventory, l, 8 + l * 18, 142)); - } - - // CraftBukkit start - player = (Player) playerinventory.player.getBukkitEntity(); - enchantSlots.player = player; - // CraftBukkit end - } - - public void addSlotListener(ICrafting icrafting) { - super.addSlotListener(icrafting); - icrafting.setContainerData(this, 0, this.costs[0]); - icrafting.setContainerData(this, 1, this.costs[1]); - icrafting.setContainerData(this, 2, this.costs[2]); - } - - public void b() { - super.b(); - - for (int i = 0; i < this.listeners.size(); ++i) { - ICrafting icrafting = (ICrafting) this.listeners.get(i); - - icrafting.setContainerData(this, 0, this.costs[0]); - icrafting.setContainerData(this, 1, this.costs[1]); - icrafting.setContainerData(this, 2, this.costs[2]); - } - } - - public void a(IInventory iinventory) { - if (iinventory == this.enchantSlots) { - ItemStack itemstack = iinventory.getItem(0); - int i; - - if (itemstack != null) { // CraftBukkit - relax condition - this.f = this.l.nextLong(); - if (!this.world.isStatic) { - i = 0; - - int j; - - for (j = -1; j <= 1; ++j) { - for (int k = -1; k <= 1; ++k) { - if ((j != 0 || k != 0) && this.world.isEmpty(this.x + k, this.y, this.z + j) && this.world.isEmpty(this.x + k, this.y + 1, this.z + j)) { - if (this.world.getType(this.x + k * 2, this.y, this.z + j * 2) == Blocks.BOOKSHELF) { - ++i; - } - - if (this.world.getType(this.x + k * 2, this.y + 1, this.z + j * 2) == Blocks.BOOKSHELF) { - ++i; - } - - if (k != 0 && j != 0) { - if (this.world.getType(this.x + k * 2, this.y, this.z + j) == Blocks.BOOKSHELF) { - ++i; - } - - if (this.world.getType(this.x + k * 2, this.y + 1, this.z + j) == Blocks.BOOKSHELF) { - ++i; - } - - if (this.world.getType(this.x + k, this.y, this.z + j * 2) == Blocks.BOOKSHELF) { - ++i; - } - - if (this.world.getType(this.x + k, this.y + 1, this.z + j * 2) == Blocks.BOOKSHELF) { - ++i; - } - } - } - } - } - - for (j = 0; j < 3; ++j) { - this.costs[j] = EnchantmentManager.a(this.l, j, i, itemstack); - } - - // CraftBukkit start - CraftItemStack item = CraftItemStack.asCraftMirror(itemstack); - PrepareItemEnchantEvent event = new PrepareItemEnchantEvent(player, this.getBukkitView(), this.world.getWorld().getBlockAt(this.x, this.y, this.z), item, this.costs, i); - event.setCancelled(!itemstack.x()); - this.world.getServer().getPluginManager().callEvent(event); - - if (event.isCancelled()) { - for (i = 0; i < 3; ++i) { - this.costs[i] = 0; - } - return; - } - // CraftBukkit end - - this.b(); - } - } else { - for (i = 0; i < 3; ++i) { - this.costs[i] = 0; - } - } - } - } - - public boolean a(EntityHuman entityhuman, int i) { - ItemStack itemstack = this.enchantSlots.getItem(0); - - 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]); - // CraftBukkit start - Provide an empty enchantment list - if (list == null) { - list = new java.util.ArrayList(); - } - // CraftBukkit end - - boolean flag = itemstack.getItem() == Items.BOOK; - - if (list != null) { - // CraftBukkit start - Map enchants = new java.util.HashMap(); - for (Object obj : list) { - EnchantmentInstance instance = (EnchantmentInstance) obj; - enchants.put(org.bukkit.enchantments.Enchantment.getById(instance.enchantment.id), instance.level); - } - CraftItemStack item = CraftItemStack.asCraftMirror(itemstack); - - EnchantItemEvent event = new EnchantItemEvent((Player) entityhuman.getBukkitEntity(), this.getBukkitView(), this.world.getWorld().getBlockAt(this.x, this.y, this.z), item, this.costs[i], enchants, i); - this.world.getServer().getPluginManager().callEvent(event); - - int level = event.getExpLevelCost(); - if (event.isCancelled() || (level > entityhuman.expLevel && !entityhuman.abilities.canInstantlyBuild) || event.getEnchantsToAdd().isEmpty()) { - return false; - } - - if (flag) { - itemstack.setItem(Items.ENCHANTED_BOOK); - } - - for (Map.Entry entry : event.getEnchantsToAdd().entrySet()) { - try { - if (flag) { - int enchantId = entry.getKey().getId(); - if (Enchantment.byId[enchantId] == null) { - continue; - } - - EnchantmentInstance enchantment = new EnchantmentInstance(enchantId, entry.getValue()); - Items.ENCHANTED_BOOK.a(itemstack, enchantment); - } else { - item.addUnsafeEnchantment(entry.getKey(), entry.getValue()); - } - } catch (IllegalArgumentException e) { - /* Just swallow invalid enchantments */ - } - } - - entityhuman.levelDown(-level); - // CraftBukkit end - - this.a(this.enchantSlots); - } - } - - return true; - } else { - return false; - } - } - - public void b(EntityHuman entityhuman) { - super.b(entityhuman); - if (!this.world.isStatic) { - ItemStack itemstack = this.enchantSlots.splitWithoutUpdate(0); - - if (itemstack != null) { - entityhuman.drop(itemstack, false); - } - } - } - - public boolean a(EntityHuman entityhuman) { - if (!this.checkReachable) return true; // CraftBukkit - return this.world.getType(this.x, this.y, this.z) != Blocks.ENCHANTMENT_TABLE ? false : entityhuman.e((double) this.x + 0.5D, (double) this.y + 0.5D, (double) this.z + 0.5D) <= 64.0D; - } - - public ItemStack b(EntityHuman entityhuman, int i) { - ItemStack itemstack = null; - Slot slot = (Slot) this.c.get(i); - - if (slot != null && slot.hasItem()) { - ItemStack itemstack1 = slot.getItem(); - - itemstack = itemstack1.cloneItemStack(); - if (i == 0) { - if (!this.a(itemstack1, 1, 37, true)) { - return null; - } - } else { - if (((Slot) this.c.get(0)).hasItem() || !((Slot) this.c.get(0)).isAllowed(itemstack1)) { - return null; - } - - if (itemstack1.hasTag() && itemstack1.count == 1) { - ((Slot) this.c.get(0)).set(itemstack1.cloneItemStack()); - itemstack1.count = 0; - } else if (itemstack1.count >= 1) { - ((Slot) this.c.get(0)).set(new ItemStack(itemstack1.getItem(), 1, itemstack1.getData())); - --itemstack1.count; - } - } - - if (itemstack1.count == 0) { - slot.set((ItemStack) null); - } else { - slot.f(); - } - - if (itemstack1.count == itemstack.count) { - return null; - } - - slot.a(entityhuman, itemstack1); - } - - return itemstack; - } - - // CraftBukkit start - public CraftInventoryView getBukkitView() { - if (bukkitEntity != null) { - return bukkitEntity; - } - - CraftInventoryEnchanting inventory = new CraftInventoryEnchanting(this.enchantSlots); - bukkitEntity = new CraftInventoryView(this.player, inventory, this); - return bukkitEntity; - } - // CraftBukkit end -} diff --git a/src/main/java/net/minecraft/server/ContainerEnchantTableInventory.java b/src/main/java/net/minecraft/server/ContainerEnchantTableInventory.java deleted file mode 100644 index b9dbf60a86..0000000000 --- a/src/main/java/net/minecraft/server/ContainerEnchantTableInventory.java +++ /dev/null @@ -1,57 +0,0 @@ -package net.minecraft.server; - -// CraftBukkit start -import java.util.List; -import org.bukkit.craftbukkit.entity.CraftHumanEntity; -import org.bukkit.entity.HumanEntity; -// CraftBukkit end - -public class ContainerEnchantTableInventory extends InventorySubcontainer { // CraftBukkit -> public - - final ContainerEnchantTable enchantTable; - - // CraftBukkit start - public List transaction = new java.util.ArrayList(); - public org.bukkit.entity.Player player; - private int maxStack = MAX_STACK; - - public ItemStack[] getContents() { - return this.items; - } - - public void onOpen(CraftHumanEntity who) { - transaction.add(who); - } - - public void onClose(CraftHumanEntity who) { - transaction.remove(who); - } - - public List getViewers() { - return transaction; - } - - public org.bukkit.inventory.InventoryHolder getOwner() { - return this.player; - } - - public void setMaxStackSize(int size) { - maxStack = size; - } - // CraftBukkit end - - ContainerEnchantTableInventory(ContainerEnchantTable containerenchanttable, String s, boolean flag, int i) { - super(s, flag, i); - this.enchantTable = containerenchanttable; - this.setMaxStackSize(1); // CraftBukkit - } - - public int getMaxStackSize() { - return maxStack; // CraftBukkit - } - - public void update() { - super.update(); - this.enchantTable.a((IInventory) this); - } -} diff --git a/src/main/java/net/minecraft/server/ContainerFurnace.java b/src/main/java/net/minecraft/server/ContainerFurnace.java deleted file mode 100644 index 2438528281..0000000000 --- a/src/main/java/net/minecraft/server/ContainerFurnace.java +++ /dev/null @@ -1,135 +0,0 @@ -package net.minecraft.server; - -// CraftBukkit start -import org.bukkit.craftbukkit.inventory.CraftInventoryFurnace; -import org.bukkit.craftbukkit.inventory.CraftInventoryView; -// CraftBukkit end - -public class ContainerFurnace extends Container { - - private TileEntityFurnace furnace; - private int f; - private int g; - private int h; - - // CraftBukkit start - private CraftInventoryView bukkitEntity = null; - private PlayerInventory player; - - public CraftInventoryView getBukkitView() { - if (bukkitEntity != null) { - return bukkitEntity; - } - - CraftInventoryFurnace inventory = new CraftInventoryFurnace(this.furnace); - bukkitEntity = new CraftInventoryView(this.player.player.getBukkitEntity(), inventory, this); - return bukkitEntity; - } - // CraftBukkit end - - public ContainerFurnace(PlayerInventory playerinventory, TileEntityFurnace tileentityfurnace) { - this.furnace = tileentityfurnace; - this.a(new Slot(tileentityfurnace, 0, 56, 17)); - this.a(new Slot(tileentityfurnace, 1, 56, 53)); - this.a(new SlotFurnaceResult(playerinventory.player, tileentityfurnace, 2, 116, 35)); - this.player = playerinventory; // CraftBukkit - save player - - int i; - - for (i = 0; i < 3; ++i) { - for (int j = 0; j < 9; ++j) { - this.a(new Slot(playerinventory, j + i * 9 + 9, 8 + j * 18, 84 + i * 18)); - } - } - - for (i = 0; i < 9; ++i) { - this.a(new Slot(playerinventory, i, 8 + i * 18, 142)); - } - } - - public void addSlotListener(ICrafting icrafting) { - super.addSlotListener(icrafting); - icrafting.setContainerData(this, 0, this.furnace.cookTime); - icrafting.setContainerData(this, 1, this.furnace.burnTime); - icrafting.setContainerData(this, 2, this.furnace.ticksForCurrentFuel); - } - - public void b() { - super.b(); - - for (int i = 0; i < this.listeners.size(); ++i) { - ICrafting icrafting = (ICrafting) this.listeners.get(i); - - if (this.f != this.furnace.cookTime) { - icrafting.setContainerData(this, 0, this.furnace.cookTime); - } - - if (this.g != this.furnace.burnTime) { - icrafting.setContainerData(this, 1, this.furnace.burnTime); - } - - if (this.h != this.furnace.ticksForCurrentFuel) { - icrafting.setContainerData(this, 2, this.furnace.ticksForCurrentFuel); - } - } - - this.f = this.furnace.cookTime; - this.g = this.furnace.burnTime; - this.h = this.furnace.ticksForCurrentFuel; - } - - public boolean a(EntityHuman entityhuman) { - if (!this.checkReachable) return true; // CraftBukkit - return this.furnace.a(entityhuman); - } - - public ItemStack b(EntityHuman entityhuman, int i) { - ItemStack itemstack = null; - Slot slot = (Slot) this.c.get(i); - - if (slot != null && slot.hasItem()) { - ItemStack itemstack1 = slot.getItem(); - - itemstack = itemstack1.cloneItemStack(); - if (i == 2) { - if (!this.a(itemstack1, 3, 39, true)) { - return null; - } - - slot.a(itemstack1, itemstack); - } else if (i != 1 && i != 0) { - if (RecipesFurnace.getInstance().getResult(itemstack1) != null) { - if (!this.a(itemstack1, 0, 1, false)) { - return null; - } - } else if (TileEntityFurnace.isFuel(itemstack1)) { - if (!this.a(itemstack1, 1, 2, false)) { - return null; - } - } else if (i >= 3 && i < 30) { - if (!this.a(itemstack1, 30, 39, false)) { - return null; - } - } else if (i >= 30 && i < 39 && !this.a(itemstack1, 3, 30, false)) { - return null; - } - } else if (!this.a(itemstack1, 3, 39, false)) { - return null; - } - - if (itemstack1.count == 0) { - slot.set((ItemStack) null); - } else { - slot.f(); - } - - if (itemstack1.count == itemstack.count) { - return null; - } - - slot.a(entityhuman, itemstack1); - } - - return itemstack; - } -} diff --git a/src/main/java/net/minecraft/server/ContainerHopper.java b/src/main/java/net/minecraft/server/ContainerHopper.java deleted file mode 100644 index e2c789b453..0000000000 --- a/src/main/java/net/minecraft/server/ContainerHopper.java +++ /dev/null @@ -1,85 +0,0 @@ -package net.minecraft.server; - -// CraftBukkit start -import org.bukkit.craftbukkit.inventory.CraftInventory; -import org.bukkit.craftbukkit.inventory.CraftInventoryView; -// CraftBukkit end - -public class ContainerHopper extends Container { - - private final IInventory hopper; - - // CraftBukkit start - private CraftInventoryView bukkitEntity = null; - private PlayerInventory player; - - public CraftInventoryView getBukkitView() { - if (bukkitEntity != null) { - return bukkitEntity; - } - - CraftInventory inventory = new CraftInventory(this.hopper); - bukkitEntity = new CraftInventoryView(this.player.player.getBukkitEntity(), inventory, this); - return bukkitEntity; - } - // CraftBukkit end - - public ContainerHopper(PlayerInventory playerinventory, IInventory iinventory) { - this.hopper = iinventory; - this.player = playerinventory; // CraftBukkit - save player - iinventory.startOpen(); - byte b0 = 51; - - int i; - - for (i = 0; i < iinventory.getSize(); ++i) { - this.a(new Slot(iinventory, i, 44 + i * 18, 20)); - } - - for (i = 0; i < 3; ++i) { - for (int j = 0; j < 9; ++j) { - this.a(new Slot(playerinventory, j + i * 9 + 9, 8 + j * 18, i * 18 + b0)); - } - } - - for (i = 0; i < 9; ++i) { - this.a(new Slot(playerinventory, i, 8 + i * 18, 58 + b0)); - } - } - - public boolean a(EntityHuman entityhuman) { - if (!this.checkReachable) return true; // CraftBukkit - return this.hopper.a(entityhuman); - } - - public ItemStack b(EntityHuman entityhuman, int i) { - ItemStack itemstack = null; - Slot slot = (Slot) this.c.get(i); - - if (slot != null && slot.hasItem()) { - ItemStack itemstack1 = slot.getItem(); - - itemstack = itemstack1.cloneItemStack(); - if (i < this.hopper.getSize()) { - if (!this.a(itemstack1, this.hopper.getSize(), this.c.size(), true)) { - return null; - } - } else if (!this.a(itemstack1, 0, this.hopper.getSize(), false)) { - return null; - } - - if (itemstack1.count == 0) { - slot.set((ItemStack) null); - } else { - slot.f(); - } - } - - return itemstack; - } - - public void b(EntityHuman entityhuman) { - super.b(entityhuman); - this.hopper.closeContainer(); - } -} diff --git a/src/main/java/net/minecraft/server/ContainerHorse.java b/src/main/java/net/minecraft/server/ContainerHorse.java deleted file mode 100644 index 79aa1826e5..0000000000 --- a/src/main/java/net/minecraft/server/ContainerHorse.java +++ /dev/null @@ -1,104 +0,0 @@ -package net.minecraft.server; - -// CraftBukkit start -import org.bukkit.craftbukkit.inventory.CraftInventory; -import org.bukkit.craftbukkit.inventory.CraftInventoryView; -import org.bukkit.inventory.InventoryView; -// CraftBukkit end - -public class ContainerHorse extends Container { - - private IInventory a; - private EntityHorse f; - - // CraftBukkit start - org.bukkit.craftbukkit.inventory.CraftInventoryView bukkitEntity; - PlayerInventory player; - - @Override - public InventoryView getBukkitView() { - if (bukkitEntity != null) { - return bukkitEntity; - } - - CraftInventory inventory = new org.bukkit.craftbukkit.inventory.CraftInventoryHorse(this.a); - return bukkitEntity = new CraftInventoryView(player.player.getBukkitEntity(), inventory, this); - } - - public ContainerHorse(IInventory iinventory, IInventory iinventory1, EntityHorse entityhorse) { - player = (PlayerInventory) iinventory; - // CraftBukkit end - this.a = iinventory1; - this.f = entityhorse; - byte b0 = 3; - - iinventory1.startOpen(); - int i = (b0 - 4) * 18; - - this.a(new SlotHorseSaddle(this, iinventory1, 0, 8, 18)); - this.a(new SlotHorseArmor(this, iinventory1, 1, 8, 36, entityhorse)); - int j; - int k; - - if (entityhorse.hasChest()) { - for (j = 0; j < b0; ++j) { - for (k = 0; k < 5; ++k) { - this.a(new Slot(iinventory1, 2 + k + j * 5, 80 + k * 18, 18 + j * 18)); - } - } - } - - for (j = 0; j < 3; ++j) { - for (k = 0; k < 9; ++k) { - this.a(new Slot(iinventory, k + j * 9 + 9, 8 + k * 18, 102 + j * 18 + i)); - } - } - - for (j = 0; j < 9; ++j) { - this.a(new Slot(iinventory, j, 8 + j * 18, 160 + i)); - } - } - - public boolean a(EntityHuman entityhuman) { - return this.a.a(entityhuman) && this.f.isAlive() && this.f.e(entityhuman) < 8.0F; - } - - public ItemStack b(EntityHuman entityhuman, int i) { - ItemStack itemstack = null; - Slot slot = (Slot) this.c.get(i); - - if (slot != null && slot.hasItem()) { - ItemStack itemstack1 = slot.getItem(); - - itemstack = itemstack1.cloneItemStack(); - if (i < this.a.getSize()) { - if (!this.a(itemstack1, this.a.getSize(), this.c.size(), true)) { - return null; - } - } else if (this.getSlot(1).isAllowed(itemstack1) && !this.getSlot(1).hasItem()) { - if (!this.a(itemstack1, 1, 2, false)) { - return null; - } - } else if (this.getSlot(0).isAllowed(itemstack1)) { - if (!this.a(itemstack1, 0, 1, false)) { - return null; - } - } else if (this.a.getSize() <= 2 || !this.a(itemstack1, 2, this.a.getSize(), false)) { - return null; - } - - if (itemstack1.count == 0) { - slot.set((ItemStack) null); - } else { - slot.f(); - } - } - - return itemstack; - } - - public void b(EntityHuman entityhuman) { - super.b(entityhuman); - this.a.closeContainer(); - } -} diff --git a/src/main/java/net/minecraft/server/ContainerMerchant.java b/src/main/java/net/minecraft/server/ContainerMerchant.java deleted file mode 100644 index 97f97f3ee6..0000000000 --- a/src/main/java/net/minecraft/server/ContainerMerchant.java +++ /dev/null @@ -1,131 +0,0 @@ -package net.minecraft.server; - -import org.bukkit.craftbukkit.inventory.CraftInventoryView; // CraftBukkit - -public class ContainerMerchant extends Container { - - private IMerchant merchant; - private InventoryMerchant f; - private final World g; - - // CraftBukkit start - private CraftInventoryView bukkitEntity = null; - private PlayerInventory player; - - @Override - public CraftInventoryView getBukkitView() { - if (bukkitEntity == null) { - bukkitEntity = new CraftInventoryView(this.player.player.getBukkitEntity(), new org.bukkit.craftbukkit.inventory.CraftInventoryMerchant(this.getMerchantInventory()), this); - } - return bukkitEntity; - } - // CraftBukkit end - - - public ContainerMerchant(PlayerInventory playerinventory, IMerchant imerchant, World world) { - this.merchant = imerchant; - this.g = world; - this.f = new InventoryMerchant(playerinventory.player, imerchant); - this.a(new Slot(this.f, 0, 36, 53)); - this.a(new Slot(this.f, 1, 62, 53)); - this.a((Slot) (new SlotMerchantResult(playerinventory.player, imerchant, this.f, 2, 120, 53))); - this.player = playerinventory; // CraftBukkit - save player - - int i; - - for (i = 0; i < 3; ++i) { - for (int j = 0; j < 9; ++j) { - this.a(new Slot(playerinventory, j + i * 9 + 9, 8 + j * 18, 84 + i * 18)); - } - } - - for (i = 0; i < 9; ++i) { - this.a(new Slot(playerinventory, i, 8 + i * 18, 142)); - } - } - - public InventoryMerchant getMerchantInventory() { - return this.f; - } - - public void addSlotListener(ICrafting icrafting) { - super.addSlotListener(icrafting); - } - - public void b() { - super.b(); - } - - public void a(IInventory iinventory) { - this.f.h(); - super.a(iinventory); - } - - public void e(int i) { - this.f.c(i); - } - - public boolean a(EntityHuman entityhuman) { - return this.merchant.b() == entityhuman; - } - - public ItemStack b(EntityHuman entityhuman, int i) { - ItemStack itemstack = null; - Slot slot = (Slot) this.c.get(i); - - if (slot != null && slot.hasItem()) { - ItemStack itemstack1 = slot.getItem(); - - itemstack = itemstack1.cloneItemStack(); - if (i == 2) { - if (!this.a(itemstack1, 3, 39, true)) { - return null; - } - - slot.a(itemstack1, itemstack); - } else if (i != 0 && i != 1) { - if (i >= 3 && i < 30) { - if (!this.a(itemstack1, 30, 39, false)) { - return null; - } - } else if (i >= 30 && i < 39 && !this.a(itemstack1, 3, 30, false)) { - return null; - } - } else if (!this.a(itemstack1, 3, 39, false)) { - return null; - } - - if (itemstack1.count == 0) { - slot.set((ItemStack) null); - } else { - slot.f(); - } - - if (itemstack1.count == itemstack.count) { - return null; - } - - slot.a(entityhuman, itemstack1); - } - - return itemstack; - } - - public void b(EntityHuman entityhuman) { - super.b(entityhuman); - this.merchant.a_((EntityHuman) null); - super.b(entityhuman); - if (!this.g.isStatic) { - ItemStack itemstack = this.f.splitWithoutUpdate(0); - - if (itemstack != null) { - entityhuman.drop(itemstack, false); - } - - itemstack = this.f.splitWithoutUpdate(1); - if (itemstack != null) { - entityhuman.drop(itemstack, false); - } - } - } -} diff --git a/src/main/java/net/minecraft/server/ContainerPlayer.java b/src/main/java/net/minecraft/server/ContainerPlayer.java deleted file mode 100644 index 587ee26173..0000000000 --- a/src/main/java/net/minecraft/server/ContainerPlayer.java +++ /dev/null @@ -1,157 +0,0 @@ -package net.minecraft.server; - -// CraftBukkit start -import org.bukkit.craftbukkit.inventory.CraftInventoryCrafting; -import org.bukkit.craftbukkit.inventory.CraftInventoryView; -// CraftBukkit end - -public class ContainerPlayer extends Container { - - public InventoryCrafting craftInventory = new InventoryCrafting(this, 2, 2); - public IInventory resultInventory = new InventoryCraftResult(); - public boolean g; - private final EntityHuman h; - // CraftBukkit start - private CraftInventoryView bukkitEntity = null; - private PlayerInventory player; - // CraftBukkit end - - public ContainerPlayer(PlayerInventory playerinventory, boolean flag, EntityHuman entityhuman) { - this.g = flag; - this.h = entityhuman; - this.resultInventory = new InventoryCraftResult(); // CraftBukkit - moved to before InventoryCrafting construction - this.craftInventory = new InventoryCrafting(this, 2, 2, playerinventory.player); // CraftBukkit - pass player - this.craftInventory.resultInventory = this.resultInventory; // CraftBukkit - let InventoryCrafting know about its result slot - this.player = playerinventory; // CraftBukkit - save player - this.a((Slot) (new SlotResult(playerinventory.player, this.craftInventory, this.resultInventory, 0, 144, 36))); - - int i; - int j; - - for (i = 0; i < 2; ++i) { - for (j = 0; j < 2; ++j) { - this.a(new Slot(this.craftInventory, j + i * 2, 88 + j * 18, 26 + i * 18)); - } - } - - for (i = 0; i < 4; ++i) { - this.a((Slot) (new SlotArmor(this, playerinventory, playerinventory.getSize() - 1 - i, 8, 8 + i * 18, i))); - } - - for (i = 0; i < 3; ++i) { - for (j = 0; j < 9; ++j) { - this.a(new Slot(playerinventory, j + (i + 1) * 9, 8 + j * 18, 84 + i * 18)); - } - } - - for (i = 0; i < 9; ++i) { - this.a(new Slot(playerinventory, i, 8 + i * 18, 142)); - } - - // this.a((IInventory) this.craftInventory); // CraftBukkit - unneeded since it just sets result slot to empty - } - - public void a(IInventory iinventory) { - // CraftBukkit start (Note: the following line would cause an error if called during construction) - CraftingManager.getInstance().lastCraftView = getBukkitView(); - ItemStack craftResult = CraftingManager.getInstance().craft(this.craftInventory, this.h.world); - this.resultInventory.setItem(0, craftResult); - if (super.listeners.size() < 1) { - return; - } - - EntityPlayer player = (EntityPlayer) super.listeners.get(0); // TODO: Is this _always_ correct? Seems like it. - player.playerConnection.sendPacket(new PacketPlayOutSetSlot(player.activeContainer.windowId, 0, craftResult)); - // CraftBukkit end - } - - public void b(EntityHuman entityhuman) { - super.b(entityhuman); - - for (int i = 0; i < 4; ++i) { - ItemStack itemstack = this.craftInventory.splitWithoutUpdate(i); - - if (itemstack != null) { - entityhuman.drop(itemstack, false); - } - } - - this.resultInventory.setItem(0, (ItemStack) null); - } - - public boolean a(EntityHuman entityhuman) { - return true; - } - - public ItemStack b(EntityHuman entityhuman, int i) { - ItemStack itemstack = null; - Slot slot = (Slot) this.c.get(i); - - if (slot != null && slot.hasItem()) { - ItemStack itemstack1 = slot.getItem(); - - itemstack = itemstack1.cloneItemStack(); - if (i == 0) { - if (!this.a(itemstack1, 9, 45, true)) { - return null; - } - - slot.a(itemstack1, itemstack); - } else if (i >= 1 && i < 5) { - if (!this.a(itemstack1, 9, 45, false)) { - return null; - } - } else if (i >= 5 && i < 9) { - if (!this.a(itemstack1, 9, 45, false)) { - return null; - } - } else if (itemstack.getItem() instanceof ItemArmor && !((Slot) this.c.get(5 + ((ItemArmor) itemstack.getItem()).b)).hasItem()) { - int j = 5 + ((ItemArmor) itemstack.getItem()).b; - - if (!this.a(itemstack1, j, j + 1, false)) { - return null; - } - } else if (i >= 9 && i < 36) { - if (!this.a(itemstack1, 36, 45, false)) { - return null; - } - } else if (i >= 36 && i < 45) { - if (!this.a(itemstack1, 9, 36, false)) { - return null; - } - } else if (!this.a(itemstack1, 9, 45, false)) { - return null; - } - - if (itemstack1.count == 0) { - slot.set((ItemStack) null); - } else { - slot.f(); - } - - if (itemstack1.count == itemstack.count) { - return null; - } - - slot.a(entityhuman, itemstack1); - } - - return itemstack; - } - - public boolean a(ItemStack itemstack, Slot slot) { - return slot.inventory != this.resultInventory && super.a(itemstack, slot); - } - - // CraftBukkit start - public CraftInventoryView getBukkitView() { - if (bukkitEntity != null) { - return bukkitEntity; - } - - CraftInventoryCrafting inventory = new CraftInventoryCrafting(this.craftInventory, this.resultInventory); - bukkitEntity = new CraftInventoryView(this.player.player.getBukkitEntity(), inventory, this); - return bukkitEntity; - } - // CraftBukkit end -} diff --git a/src/main/java/net/minecraft/server/ContainerWorkbench.java b/src/main/java/net/minecraft/server/ContainerWorkbench.java deleted file mode 100644 index 37c6105414..0000000000 --- a/src/main/java/net/minecraft/server/ContainerWorkbench.java +++ /dev/null @@ -1,145 +0,0 @@ -package net.minecraft.server; - -// CraftBukkit start -import org.bukkit.craftbukkit.inventory.CraftInventoryCrafting; -import org.bukkit.craftbukkit.inventory.CraftInventoryView; -// CraftBukkit end - -public class ContainerWorkbench extends Container { - - public InventoryCrafting craftInventory; // CraftBukkit - move initialization into constructor - public IInventory resultInventory; // CraftBukkit - move initialization into constructor - private World g; - private int h; - private int i; - private int j; - // CraftBukkit start - private CraftInventoryView bukkitEntity = null; - private PlayerInventory player; - // CraftBukkit end - - public ContainerWorkbench(PlayerInventory playerinventory, World world, int i, int j, int k) { - // CraftBukkit start - Switched order of IInventory construction and stored player - this.resultInventory = new InventoryCraftResult(); - this.craftInventory = new InventoryCrafting(this, 3, 3, playerinventory.player); // CraftBukkit - pass player - this.craftInventory.resultInventory = this.resultInventory; - this.player = playerinventory; - // CraftBukkit end - this.g = world; - this.h = i; - this.i = j; - this.j = k; - this.a((Slot) (new SlotResult(playerinventory.player, this.craftInventory, this.resultInventory, 0, 124, 35))); - - int l; - int i1; - - for (l = 0; l < 3; ++l) { - for (i1 = 0; i1 < 3; ++i1) { - this.a(new Slot(this.craftInventory, i1 + l * 3, 30 + i1 * 18, 17 + l * 18)); - } - } - - for (l = 0; l < 3; ++l) { - for (i1 = 0; i1 < 9; ++i1) { - this.a(new Slot(playerinventory, i1 + l * 9 + 9, 8 + i1 * 18, 84 + l * 18)); - } - } - - for (l = 0; l < 9; ++l) { - this.a(new Slot(playerinventory, l, 8 + l * 18, 142)); - } - - this.a((IInventory) this.craftInventory); - } - - public void a(IInventory iinventory) { - // CraftBukkit start - CraftingManager.getInstance().lastCraftView = getBukkitView(); - ItemStack craftResult = CraftingManager.getInstance().craft(this.craftInventory, this.g); - this.resultInventory.setItem(0, craftResult); - if (super.listeners.size() < 1) { - return; - } - - EntityPlayer player = (EntityPlayer) super.listeners.get(0); // TODO: Is this _always_ correct? Seems like it. - player.playerConnection.sendPacket(new PacketPlayOutSetSlot(player.activeContainer.windowId, 0, craftResult)); - // CraftBukkit end - } - - public void b(EntityHuman entityhuman) { - super.b(entityhuman); - if (!this.g.isStatic) { - for (int i = 0; i < 9; ++i) { - ItemStack itemstack = this.craftInventory.splitWithoutUpdate(i); - - if (itemstack != null) { - entityhuman.drop(itemstack, false); - } - } - } - } - - public boolean a(EntityHuman entityhuman) { - if (!this.checkReachable) return true; // CraftBukkit - return this.g.getType(this.h, this.i, this.j) != Blocks.WORKBENCH ? false : entityhuman.e((double) this.h + 0.5D, (double) this.i + 0.5D, (double) this.j + 0.5D) <= 64.0D; - } - - public ItemStack b(EntityHuman entityhuman, int i) { - ItemStack itemstack = null; - Slot slot = (Slot) this.c.get(i); - - if (slot != null && slot.hasItem()) { - ItemStack itemstack1 = slot.getItem(); - - itemstack = itemstack1.cloneItemStack(); - if (i == 0) { - if (!this.a(itemstack1, 10, 46, true)) { - return null; - } - - slot.a(itemstack1, itemstack); - } else if (i >= 10 && i < 37) { - if (!this.a(itemstack1, 37, 46, false)) { - return null; - } - } else if (i >= 37 && i < 46) { - if (!this.a(itemstack1, 10, 37, false)) { - return null; - } - } else if (!this.a(itemstack1, 10, 46, false)) { - return null; - } - - if (itemstack1.count == 0) { - slot.set((ItemStack) null); - } else { - slot.f(); - } - - if (itemstack1.count == itemstack.count) { - return null; - } - - slot.a(entityhuman, itemstack1); - } - - return itemstack; - } - - public boolean a(ItemStack itemstack, Slot slot) { - return slot.inventory != this.resultInventory && super.a(itemstack, slot); - } - - // CraftBukkit start - public CraftInventoryView getBukkitView() { - if (bukkitEntity != null) { - return bukkitEntity; - } - - CraftInventoryCrafting inventory = new CraftInventoryCrafting(this.craftInventory, this.resultInventory); - bukkitEntity = new CraftInventoryView(this.player.player.getBukkitEntity(), inventory, this); - return bukkitEntity; - } - // CraftBukkit end -} diff --git a/src/main/java/net/minecraft/server/ControllerLook.java b/src/main/java/net/minecraft/server/ControllerLook.java deleted file mode 100644 index f1e8b3dcee..0000000000 --- a/src/main/java/net/minecraft/server/ControllerLook.java +++ /dev/null @@ -1,87 +0,0 @@ -package net.minecraft.server; - -import org.bukkit.craftbukkit.TrigMath; // CraftBukkit - -public class ControllerLook { - - private EntityInsentient a; - private float b; - private float c; - private boolean d; - private double e; - private double f; - private double g; - - public ControllerLook(EntityInsentient entityinsentient) { - this.a = entityinsentient; - } - - public void a(Entity entity, float f, float f1) { - this.e = entity.locX; - if (entity instanceof EntityLiving) { - this.f = entity.locY + (double) entity.getHeadHeight(); - } else { - this.f = (entity.boundingBox.b + entity.boundingBox.e) / 2.0D; - } - - this.g = entity.locZ; - this.b = f; - this.c = f1; - this.d = true; - } - - public void a(double d0, double d1, double d2, float f, float f1) { - this.e = d0; - this.f = d1; - this.g = d2; - this.b = f; - this.c = f1; - this.d = true; - } - - public void a() { - this.a.pitch = 0.0F; - if (this.d) { - this.d = false; - double d0 = this.e - this.a.locX; - double d1 = this.f - (this.a.locY + (double) this.a.getHeadHeight()); - double d2 = this.g - this.a.locZ; - double d3 = (double) MathHelper.sqrt(d0 * d0 + d2 * d2); - // CraftBukkit start - Math -> TrigMath - float f = (float) (TrigMath.atan2(d2, d0) * 180.0D / 3.1415927410125732D) - 90.0F; - float f1 = (float) (-(TrigMath.atan2(d1, d3) * 180.0D / 3.1415927410125732D)); - // CraftBukkit end - - this.a.pitch = this.a(this.a.pitch, f1, this.c); - this.a.aO = this.a(this.a.aO, f, this.b); - } else { - this.a.aO = this.a(this.a.aO, this.a.aM, 10.0F); - } - - float f2 = MathHelper.g(this.a.aO - this.a.aM); - - if (!this.a.getNavigation().g()) { - if (f2 < -75.0F) { - this.a.aO = this.a.aM - 75.0F; - } - - if (f2 > 75.0F) { - this.a.aO = this.a.aM + 75.0F; - } - } - } - - private float a(float f, float f1, float f2) { - float f3 = MathHelper.g(f1 - f); - - if (f3 > f2) { - f3 = f2; - } - - if (f3 < -f2) { - f3 = -f2; - } - - return f + f3; - } -} diff --git a/src/main/java/net/minecraft/server/ControllerMove.java b/src/main/java/net/minecraft/server/ControllerMove.java deleted file mode 100644 index 525a4d1745..0000000000 --- a/src/main/java/net/minecraft/server/ControllerMove.java +++ /dev/null @@ -1,71 +0,0 @@ -package net.minecraft.server; - -public class ControllerMove { - - private EntityInsentient a; - private double b; - private double c; - private double d; - private double e; - private boolean f; - - public ControllerMove(EntityInsentient entityinsentient) { - this.a = entityinsentient; - this.b = entityinsentient.locX; - this.c = entityinsentient.locY; - this.d = entityinsentient.locZ; - } - - public boolean a() { - return this.f; - } - - public double b() { - return this.e; - } - - public void a(double d0, double d1, double d2, double d3) { - this.b = d0; - this.c = d1; - this.d = d2; - this.e = d3; - this.f = true; - } - - public void c() { - this.a.n(0.0F); - if (this.f) { - this.f = false; - int i = MathHelper.floor(this.a.boundingBox.b + 0.5D); - double d0 = this.b - this.a.locX; - double d1 = this.d - this.a.locZ; - double d2 = this.c - (double) i; - double d3 = d0 * d0 + d2 * d2 + d1 * d1; - - if (d3 >= 2.500000277905201E-7D) { - // CraftBukkit - Math -> TrigMath - float f = (float) (org.bukkit.craftbukkit.TrigMath.atan2(d1, d0) * 180.0D / 3.1415927410125732D) - 90.0F; - - this.a.yaw = this.a(this.a.yaw, f, 30.0F); - this.a.i((float) (this.e * this.a.getAttributeInstance(GenericAttributes.d).getValue())); - if (d2 > 0.0D && d0 * d0 + d1 * d1 < 1.0D) { - this.a.getControllerJump().a(); - } - } - } - } - - private float a(float f, float f1, float f2) { - float f3 = MathHelper.g(f1 - f); - - if (f3 > f2) { - f3 = f2; - } - - if (f3 < -f2) { - f3 = -f2; - } - - return f + f3; - } -} diff --git a/src/main/java/net/minecraft/server/CraftingManager.java b/src/main/java/net/minecraft/server/CraftingManager.java deleted file mode 100644 index 9675edb2db..0000000000 --- a/src/main/java/net/minecraft/server/CraftingManager.java +++ /dev/null @@ -1,313 +0,0 @@ -package net.minecraft.server; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; - -import org.bukkit.craftbukkit.event.CraftEventFactory; // CraftBukkit - -public class CraftingManager { - - private static final CraftingManager a = new CraftingManager(); - // CraftBukkit start - public List recipes = new ArrayList(); // private -> public - public IRecipe lastRecipe; - public org.bukkit.inventory.InventoryView lastCraftView; - // CraftBukkit end - - public static final CraftingManager getInstance() { - return a; - } - - // CraftBukkit - private -> public - public CraftingManager() { - (new RecipesTools()).a(this); - (new RecipesWeapons()).a(this); - (new RecipeIngots()).a(this); - (new RecipesFood()).a(this); - (new RecipesCrafting()).a(this); - (new RecipesArmor()).a(this); - (new RecipesDyes()).a(this); - this.recipes.add(new RecipeArmorDye()); - this.recipes.add(new RecipeBookClone()); - this.recipes.add(new RecipeMapClone()); - this.recipes.add(new RecipeMapExtend()); - this.recipes.add(new RecipeFireworks()); - this.registerShapedRecipe(new ItemStack(Items.PAPER, 3), new Object[] { "###", Character.valueOf('#'), Items.SUGAR_CANE}); - this.registerShapelessRecipe(new ItemStack(Items.BOOK, 1), new Object[] { Items.PAPER, Items.PAPER, Items.PAPER, Items.LEATHER}); - this.registerShapelessRecipe(new ItemStack(Items.BOOK_AND_QUILL, 1), new Object[] { Items.BOOK, new ItemStack(Items.INK_SACK, 1, 0), Items.FEATHER}); - this.registerShapedRecipe(new ItemStack(Blocks.FENCE, 2), new Object[] { "###", "###", Character.valueOf('#'), Items.STICK}); - this.registerShapedRecipe(new ItemStack(Blocks.COBBLE_WALL, 6, 0), new Object[] { "###", "###", Character.valueOf('#'), Blocks.COBBLESTONE}); - this.registerShapedRecipe(new ItemStack(Blocks.COBBLE_WALL, 6, 1), new Object[] { "###", "###", Character.valueOf('#'), Blocks.MOSSY_COBBLESTONE}); - this.registerShapedRecipe(new ItemStack(Blocks.NETHER_FENCE, 6), new Object[] { "###", "###", Character.valueOf('#'), Blocks.NETHER_BRICK}); - this.registerShapedRecipe(new ItemStack(Blocks.FENCE_GATE, 1), new Object[] { "#W#", "#W#", Character.valueOf('#'), Items.STICK, Character.valueOf('W'), Blocks.WOOD}); - this.registerShapedRecipe(new ItemStack(Blocks.JUKEBOX, 1), new Object[] { "###", "#X#", "###", Character.valueOf('#'), Blocks.WOOD, Character.valueOf('X'), Items.DIAMOND}); - this.registerShapedRecipe(new ItemStack(Items.LEASH, 2), new Object[] { "~~ ", "~O ", " ~", Character.valueOf('~'), Items.STRING, Character.valueOf('O'), Items.SLIME_BALL}); - this.registerShapedRecipe(new ItemStack(Blocks.NOTE_BLOCK, 1), new Object[] { "###", "#X#", "###", Character.valueOf('#'), Blocks.WOOD, Character.valueOf('X'), Items.REDSTONE}); - this.registerShapedRecipe(new ItemStack(Blocks.BOOKSHELF, 1), new Object[] { "###", "XXX", "###", Character.valueOf('#'), Blocks.WOOD, Character.valueOf('X'), Items.BOOK}); - this.registerShapedRecipe(new ItemStack(Blocks.SNOW_BLOCK, 1), new Object[] { "##", "##", Character.valueOf('#'), Items.SNOW_BALL}); - this.registerShapedRecipe(new ItemStack(Blocks.SNOW, 6), new Object[] { "###", Character.valueOf('#'), Blocks.SNOW_BLOCK}); - this.registerShapedRecipe(new ItemStack(Blocks.CLAY, 1), new Object[] { "##", "##", Character.valueOf('#'), Items.CLAY_BALL}); - this.registerShapedRecipe(new ItemStack(Blocks.BRICK, 1), new Object[] { "##", "##", Character.valueOf('#'), Items.CLAY_BRICK}); - this.registerShapedRecipe(new ItemStack(Blocks.GLOWSTONE, 1), new Object[] { "##", "##", Character.valueOf('#'), Items.GLOWSTONE_DUST}); - this.registerShapedRecipe(new ItemStack(Blocks.QUARTZ_BLOCK, 1), new Object[] { "##", "##", Character.valueOf('#'), Items.QUARTZ}); - this.registerShapedRecipe(new ItemStack(Blocks.WOOL, 1), new Object[] { "##", "##", Character.valueOf('#'), Items.STRING}); - this.registerShapedRecipe(new ItemStack(Blocks.TNT, 1), new Object[] { "X#X", "#X#", "X#X", Character.valueOf('X'), Items.SULPHUR, Character.valueOf('#'), Blocks.SAND}); - this.registerShapedRecipe(new ItemStack(Blocks.STEP, 6, 3), new Object[] { "###", Character.valueOf('#'), Blocks.COBBLESTONE}); - this.registerShapedRecipe(new ItemStack(Blocks.STEP, 6, 0), new Object[] { "###", Character.valueOf('#'), Blocks.STONE}); - this.registerShapedRecipe(new ItemStack(Blocks.STEP, 6, 1), new Object[] { "###", Character.valueOf('#'), Blocks.SANDSTONE}); - this.registerShapedRecipe(new ItemStack(Blocks.STEP, 6, 4), new Object[] { "###", Character.valueOf('#'), Blocks.BRICK}); - this.registerShapedRecipe(new ItemStack(Blocks.STEP, 6, 5), new Object[] { "###", Character.valueOf('#'), Blocks.SMOOTH_BRICK}); - this.registerShapedRecipe(new ItemStack(Blocks.STEP, 6, 6), new Object[] { "###", Character.valueOf('#'), Blocks.NETHER_BRICK}); - this.registerShapedRecipe(new ItemStack(Blocks.STEP, 6, 7), new Object[] { "###", Character.valueOf('#'), Blocks.QUARTZ_BLOCK}); - this.registerShapedRecipe(new ItemStack(Blocks.WOOD_STEP, 6, 0), new Object[] { "###", Character.valueOf('#'), new ItemStack(Blocks.WOOD, 1, 0)}); - this.registerShapedRecipe(new ItemStack(Blocks.WOOD_STEP, 6, 2), new Object[] { "###", Character.valueOf('#'), new ItemStack(Blocks.WOOD, 1, 2)}); - this.registerShapedRecipe(new ItemStack(Blocks.WOOD_STEP, 6, 1), new Object[] { "###", Character.valueOf('#'), new ItemStack(Blocks.WOOD, 1, 1)}); - this.registerShapedRecipe(new ItemStack(Blocks.WOOD_STEP, 6, 3), new Object[] { "###", Character.valueOf('#'), new ItemStack(Blocks.WOOD, 1, 3)}); - this.registerShapedRecipe(new ItemStack(Blocks.WOOD_STEP, 6, 4), new Object[] { "###", Character.valueOf('#'), new ItemStack(Blocks.WOOD, 1, 4)}); - this.registerShapedRecipe(new ItemStack(Blocks.WOOD_STEP, 6, 5), new Object[] { "###", Character.valueOf('#'), new ItemStack(Blocks.WOOD, 1, 5)}); - this.registerShapedRecipe(new ItemStack(Blocks.LADDER, 3), new Object[] { "# #", "###", "# #", Character.valueOf('#'), Items.STICK}); - this.registerShapedRecipe(new ItemStack(Items.WOOD_DOOR, 1), new Object[] { "##", "##", "##", Character.valueOf('#'), Blocks.WOOD}); - this.registerShapedRecipe(new ItemStack(Blocks.TRAP_DOOR, 2), new Object[] { "###", "###", Character.valueOf('#'), Blocks.WOOD}); - this.registerShapedRecipe(new ItemStack(Items.IRON_DOOR, 1), new Object[] { "##", "##", "##", Character.valueOf('#'), Items.IRON_INGOT}); - this.registerShapedRecipe(new ItemStack(Items.SIGN, 3), new Object[] { "###", "###", " X ", Character.valueOf('#'), Blocks.WOOD, Character.valueOf('X'), Items.STICK}); - this.registerShapedRecipe(new ItemStack(Items.CAKE, 1), new Object[] { "AAA", "BEB", "CCC", Character.valueOf('A'), Items.MILK_BUCKET, Character.valueOf('B'), Items.SUGAR, Character.valueOf('C'), Items.WHEAT, Character.valueOf('E'), Items.EGG}); - this.registerShapedRecipe(new ItemStack(Items.SUGAR, 1), new Object[] { "#", Character.valueOf('#'), Items.SUGAR_CANE}); - this.registerShapedRecipe(new ItemStack(Blocks.WOOD, 4, 0), new Object[] { "#", Character.valueOf('#'), new ItemStack(Blocks.LOG, 1, 0)}); - this.registerShapedRecipe(new ItemStack(Blocks.WOOD, 4, 1), new Object[] { "#", Character.valueOf('#'), new ItemStack(Blocks.LOG, 1, 1)}); - this.registerShapedRecipe(new ItemStack(Blocks.WOOD, 4, 2), new Object[] { "#", Character.valueOf('#'), new ItemStack(Blocks.LOG, 1, 2)}); - this.registerShapedRecipe(new ItemStack(Blocks.WOOD, 4, 3), new Object[] { "#", Character.valueOf('#'), new ItemStack(Blocks.LOG, 1, 3)}); - this.registerShapedRecipe(new ItemStack(Blocks.WOOD, 4, 4), new Object[] { "#", Character.valueOf('#'), new ItemStack(Blocks.LOG2, 1, 0)}); - this.registerShapedRecipe(new ItemStack(Blocks.WOOD, 4, 5), new Object[] { "#", Character.valueOf('#'), new ItemStack(Blocks.LOG2, 1, 1)}); - this.registerShapedRecipe(new ItemStack(Items.STICK, 4), new Object[] { "#", "#", Character.valueOf('#'), Blocks.WOOD}); - this.registerShapedRecipe(new ItemStack(Blocks.TORCH, 4), new Object[] { "X", "#", Character.valueOf('X'), Items.COAL, Character.valueOf('#'), Items.STICK}); - this.registerShapedRecipe(new ItemStack(Blocks.TORCH, 4), new Object[] { "X", "#", Character.valueOf('X'), new ItemStack(Items.COAL, 1, 1), Character.valueOf('#'), Items.STICK}); - this.registerShapedRecipe(new ItemStack(Items.BOWL, 4), new Object[] { "# #", " # ", Character.valueOf('#'), Blocks.WOOD}); - this.registerShapedRecipe(new ItemStack(Items.GLASS_BOTTLE, 3), new Object[] { "# #", " # ", Character.valueOf('#'), Blocks.GLASS}); - this.registerShapedRecipe(new ItemStack(Blocks.RAILS, 16), new Object[] { "X X", "X#X", "X X", Character.valueOf('X'), Items.IRON_INGOT, Character.valueOf('#'), Items.STICK}); - this.registerShapedRecipe(new ItemStack(Blocks.GOLDEN_RAIL, 6), new Object[] { "X X", "X#X", "XRX", Character.valueOf('X'), Items.GOLD_INGOT, Character.valueOf('R'), Items.REDSTONE, Character.valueOf('#'), Items.STICK}); - this.registerShapedRecipe(new ItemStack(Blocks.ACTIVATOR_RAIL, 6), new Object[] { "XSX", "X#X", "XSX", Character.valueOf('X'), Items.IRON_INGOT, Character.valueOf('#'), Blocks.REDSTONE_TORCH_ON, Character.valueOf('S'), Items.STICK}); - this.registerShapedRecipe(new ItemStack(Blocks.DETECTOR_RAIL, 6), new Object[] { "X X", "X#X", "XRX", Character.valueOf('X'), Items.IRON_INGOT, Character.valueOf('R'), Items.REDSTONE, Character.valueOf('#'), Blocks.STONE_PLATE}); - this.registerShapedRecipe(new ItemStack(Items.MINECART, 1), new Object[] { "# #", "###", Character.valueOf('#'), Items.IRON_INGOT}); - this.registerShapedRecipe(new ItemStack(Items.CAULDRON, 1), new Object[] { "# #", "# #", "###", Character.valueOf('#'), Items.IRON_INGOT}); - this.registerShapedRecipe(new ItemStack(Items.BREWING_STAND, 1), new Object[] { " B ", "###", Character.valueOf('#'), Blocks.COBBLESTONE, Character.valueOf('B'), Items.BLAZE_ROD}); - this.registerShapedRecipe(new ItemStack(Blocks.JACK_O_LANTERN, 1), new Object[] { "A", "B", Character.valueOf('A'), Blocks.PUMPKIN, Character.valueOf('B'), Blocks.TORCH}); - this.registerShapedRecipe(new ItemStack(Items.STORAGE_MINECART, 1), new Object[] { "A", "B", Character.valueOf('A'), Blocks.CHEST, Character.valueOf('B'), Items.MINECART}); - this.registerShapedRecipe(new ItemStack(Items.POWERED_MINECART, 1), new Object[] { "A", "B", Character.valueOf('A'), Blocks.FURNACE, Character.valueOf('B'), Items.MINECART}); - this.registerShapedRecipe(new ItemStack(Items.MINECART_TNT, 1), new Object[] { "A", "B", Character.valueOf('A'), Blocks.TNT, Character.valueOf('B'), Items.MINECART}); - this.registerShapedRecipe(new ItemStack(Items.MINECART_HOPPER, 1), new Object[] { "A", "B", Character.valueOf('A'), Blocks.HOPPER, Character.valueOf('B'), Items.MINECART}); - this.registerShapedRecipe(new ItemStack(Items.BOAT, 1), new Object[] { "# #", "###", Character.valueOf('#'), Blocks.WOOD}); - this.registerShapedRecipe(new ItemStack(Items.BUCKET, 1), new Object[] { "# #", " # ", Character.valueOf('#'), Items.IRON_INGOT}); - this.registerShapedRecipe(new ItemStack(Items.FLOWER_POT, 1), new Object[] { "# #", " # ", Character.valueOf('#'), Items.CLAY_BRICK}); - this.registerShapelessRecipe(new ItemStack(Items.FLINT_AND_STEEL, 1), new Object[] { new ItemStack(Items.IRON_INGOT, 1), new ItemStack(Items.FLINT, 1)}); - this.registerShapedRecipe(new ItemStack(Items.BREAD, 1), new Object[] { "###", Character.valueOf('#'), Items.WHEAT}); - this.registerShapedRecipe(new ItemStack(Blocks.WOOD_STAIRS, 4), new Object[] { "# ", "## ", "###", Character.valueOf('#'), new ItemStack(Blocks.WOOD, 1, 0)}); - this.registerShapedRecipe(new ItemStack(Blocks.BIRCH_WOOD_STAIRS, 4), new Object[] { "# ", "## ", "###", Character.valueOf('#'), new ItemStack(Blocks.WOOD, 1, 2)}); - this.registerShapedRecipe(new ItemStack(Blocks.SPRUCE_WOOD_STAIRS, 4), new Object[] { "# ", "## ", "###", Character.valueOf('#'), new ItemStack(Blocks.WOOD, 1, 1)}); - this.registerShapedRecipe(new ItemStack(Blocks.JUNGLE_WOOD_STAIRS, 4), new Object[] { "# ", "## ", "###", Character.valueOf('#'), new ItemStack(Blocks.WOOD, 1, 3)}); - this.registerShapedRecipe(new ItemStack(Blocks.ACACIA_STAIRS, 4), new Object[] { "# ", "## ", "###", Character.valueOf('#'), new ItemStack(Blocks.WOOD, 1, 4)}); - this.registerShapedRecipe(new ItemStack(Blocks.DARK_OAK_STAIRS, 4), new Object[] { "# ", "## ", "###", Character.valueOf('#'), new ItemStack(Blocks.WOOD, 1, 5)}); - this.registerShapedRecipe(new ItemStack(Items.FISHING_ROD, 1), new Object[] { " #", " #X", "# X", Character.valueOf('#'), Items.STICK, Character.valueOf('X'), Items.STRING}); - this.registerShapedRecipe(new ItemStack(Items.CARROT_STICK, 1), new Object[] { "# ", " X", Character.valueOf('#'), Items.FISHING_ROD, Character.valueOf('X'), Items.CARROT}).c(); - this.registerShapedRecipe(new ItemStack(Blocks.COBBLESTONE_STAIRS, 4), new Object[] { "# ", "## ", "###", Character.valueOf('#'), Blocks.COBBLESTONE}); - this.registerShapedRecipe(new ItemStack(Blocks.BRICK_STAIRS, 4), new Object[] { "# ", "## ", "###", Character.valueOf('#'), Blocks.BRICK}); - this.registerShapedRecipe(new ItemStack(Blocks.STONE_STAIRS, 4), new Object[] { "# ", "## ", "###", Character.valueOf('#'), Blocks.SMOOTH_BRICK}); - this.registerShapedRecipe(new ItemStack(Blocks.NETHER_BRICK_STAIRS, 4), new Object[] { "# ", "## ", "###", Character.valueOf('#'), Blocks.NETHER_BRICK}); - this.registerShapedRecipe(new ItemStack(Blocks.SANDSTONE_STAIRS, 4), new Object[] { "# ", "## ", "###", Character.valueOf('#'), Blocks.SANDSTONE}); - this.registerShapedRecipe(new ItemStack(Blocks.QUARTZ_STAIRS, 4), new Object[] { "# ", "## ", "###", Character.valueOf('#'), Blocks.QUARTZ_BLOCK}); - this.registerShapedRecipe(new ItemStack(Items.PAINTING, 1), new Object[] { "###", "#X#", "###", Character.valueOf('#'), Items.STICK, Character.valueOf('X'), Blocks.WOOL}); - this.registerShapedRecipe(new ItemStack(Items.ITEM_FRAME, 1), new Object[] { "###", "#X#", "###", Character.valueOf('#'), Items.STICK, Character.valueOf('X'), Items.LEATHER}); - this.registerShapedRecipe(new ItemStack(Items.GOLDEN_APPLE, 1, 0), new Object[] { "###", "#X#", "###", Character.valueOf('#'), Items.GOLD_INGOT, Character.valueOf('X'), Items.APPLE}); - this.registerShapedRecipe(new ItemStack(Items.GOLDEN_APPLE, 1, 1), new Object[] { "###", "#X#", "###", Character.valueOf('#'), Blocks.GOLD_BLOCK, Character.valueOf('X'), Items.APPLE}); - this.registerShapedRecipe(new ItemStack(Items.CARROT_GOLDEN, 1, 0), new Object[] { "###", "#X#", "###", Character.valueOf('#'), Items.GOLD_NUGGET, Character.valueOf('X'), Items.CARROT}); - this.registerShapedRecipe(new ItemStack(Items.SPECKLED_MELON, 1), new Object[] { "###", "#X#", "###", Character.valueOf('#'), Items.GOLD_NUGGET, Character.valueOf('X'), Items.MELON}); - this.registerShapedRecipe(new ItemStack(Blocks.LEVER, 1), new Object[] { "X", "#", Character.valueOf('#'), Blocks.COBBLESTONE, Character.valueOf('X'), Items.STICK}); - this.registerShapedRecipe(new ItemStack(Blocks.TRIPWIRE_SOURCE, 2), new Object[] { "I", "S", "#", Character.valueOf('#'), Blocks.WOOD, Character.valueOf('S'), Items.STICK, Character.valueOf('I'), Items.IRON_INGOT}); - this.registerShapedRecipe(new ItemStack(Blocks.REDSTONE_TORCH_ON, 1), new Object[] { "X", "#", Character.valueOf('#'), Items.STICK, Character.valueOf('X'), Items.REDSTONE}); - this.registerShapedRecipe(new ItemStack(Items.DIODE, 1), new Object[] { "#X#", "III", Character.valueOf('#'), Blocks.REDSTONE_TORCH_ON, Character.valueOf('X'), Items.REDSTONE, Character.valueOf('I'), Blocks.STONE}); - this.registerShapedRecipe(new ItemStack(Items.REDSTONE_COMPARATOR, 1), new Object[] { " # ", "#X#", "III", Character.valueOf('#'), Blocks.REDSTONE_TORCH_ON, Character.valueOf('X'), Items.QUARTZ, Character.valueOf('I'), Blocks.STONE}); - this.registerShapedRecipe(new ItemStack(Items.WATCH, 1), new Object[] { " # ", "#X#", " # ", Character.valueOf('#'), Items.GOLD_INGOT, Character.valueOf('X'), Items.REDSTONE}); - this.registerShapedRecipe(new ItemStack(Items.COMPASS, 1), new Object[] { " # ", "#X#", " # ", Character.valueOf('#'), Items.IRON_INGOT, Character.valueOf('X'), Items.REDSTONE}); - this.registerShapedRecipe(new ItemStack(Items.MAP_EMPTY, 1), new Object[] { "###", "#X#", "###", Character.valueOf('#'), Items.PAPER, Character.valueOf('X'), Items.COMPASS}); - this.registerShapedRecipe(new ItemStack(Blocks.STONE_BUTTON, 1), new Object[] { "#", Character.valueOf('#'), Blocks.STONE}); - this.registerShapedRecipe(new ItemStack(Blocks.WOOD_BUTTON, 1), new Object[] { "#", Character.valueOf('#'), Blocks.WOOD}); - this.registerShapedRecipe(new ItemStack(Blocks.STONE_PLATE, 1), new Object[] { "##", Character.valueOf('#'), Blocks.STONE}); - this.registerShapedRecipe(new ItemStack(Blocks.WOOD_PLATE, 1), new Object[] { "##", Character.valueOf('#'), Blocks.WOOD}); - this.registerShapedRecipe(new ItemStack(Blocks.IRON_PLATE, 1), new Object[] { "##", Character.valueOf('#'), Items.IRON_INGOT}); - this.registerShapedRecipe(new ItemStack(Blocks.GOLD_PLATE, 1), new Object[] { "##", Character.valueOf('#'), Items.GOLD_INGOT}); - this.registerShapedRecipe(new ItemStack(Blocks.DISPENSER, 1), new Object[] { "###", "#X#", "#R#", Character.valueOf('#'), Blocks.COBBLESTONE, Character.valueOf('X'), Items.BOW, Character.valueOf('R'), Items.REDSTONE}); - this.registerShapedRecipe(new ItemStack(Blocks.DROPPER, 1), new Object[] { "###", "# #", "#R#", Character.valueOf('#'), Blocks.COBBLESTONE, Character.valueOf('R'), Items.REDSTONE}); - this.registerShapedRecipe(new ItemStack(Blocks.PISTON, 1), new Object[] { "TTT", "#X#", "#R#", Character.valueOf('#'), Blocks.COBBLESTONE, Character.valueOf('X'), Items.IRON_INGOT, Character.valueOf('R'), Items.REDSTONE, Character.valueOf('T'), Blocks.WOOD}); - this.registerShapedRecipe(new ItemStack(Blocks.PISTON_STICKY, 1), new Object[] { "S", "P", Character.valueOf('S'), Items.SLIME_BALL, Character.valueOf('P'), Blocks.PISTON}); - this.registerShapedRecipe(new ItemStack(Items.BED, 1), new Object[] { "###", "XXX", Character.valueOf('#'), Blocks.WOOL, Character.valueOf('X'), Blocks.WOOD}); - this.registerShapedRecipe(new ItemStack(Blocks.ENCHANTMENT_TABLE, 1), new Object[] { " B ", "D#D", "###", Character.valueOf('#'), Blocks.OBSIDIAN, Character.valueOf('B'), Items.BOOK, Character.valueOf('D'), Items.DIAMOND}); - this.registerShapedRecipe(new ItemStack(Blocks.ANVIL, 1), new Object[] { "III", " i ", "iii", Character.valueOf('I'), Blocks.IRON_BLOCK, Character.valueOf('i'), Items.IRON_INGOT}); - this.registerShapelessRecipe(new ItemStack(Items.EYE_OF_ENDER, 1), new Object[] { Items.ENDER_PEARL, Items.BLAZE_POWDER}); - this.registerShapelessRecipe(new ItemStack(Items.FIREBALL, 3), new Object[] { Items.SULPHUR, Items.BLAZE_POWDER, Items.COAL}); - this.registerShapelessRecipe(new ItemStack(Items.FIREBALL, 3), new Object[] { Items.SULPHUR, Items.BLAZE_POWDER, new ItemStack(Items.COAL, 1, 1)}); - this.registerShapedRecipe(new ItemStack(Blocks.DAYLIGHT_DETECTOR), new Object[] { "GGG", "QQQ", "WWW", Character.valueOf('G'), Blocks.GLASS, Character.valueOf('Q'), Items.QUARTZ, Character.valueOf('W'), Blocks.WOOD_STEP}); - this.registerShapedRecipe(new ItemStack(Blocks.HOPPER), new Object[] { "I I", "ICI", " I ", Character.valueOf('I'), Items.IRON_INGOT, Character.valueOf('C'), Blocks.CHEST}); - // Collections.sort(this.recipes, new RecipeSorter(this)); // CraftBukkit - moved below - this.sort(); // CraftBukkit - call new sort method - } - - // CraftBukkit start - public void sort() { - Collections.sort(this.recipes, new RecipeSorter(this)); - } - // CraftBukkit end - - // CraftBukkit - default -> public - public ShapedRecipes registerShapedRecipe(ItemStack itemstack, Object... aobject) { - String s = ""; - int i = 0; - int j = 0; - int k = 0; - - if (aobject[i] instanceof String[]) { - String[] astring = (String[]) ((String[]) aobject[i++]); - - for (int l = 0; l < astring.length; ++l) { - String s1 = astring[l]; - - ++k; - j = s1.length(); - s = s + s1; - } - } else { - while (aobject[i] instanceof String) { - String s2 = (String) aobject[i++]; - - ++k; - j = s2.length(); - s = s + s2; - } - } - - HashMap hashmap; - - for (hashmap = new HashMap(); i < aobject.length; i += 2) { - Character character = (Character) aobject[i]; - ItemStack itemstack1 = null; - - if (aobject[i + 1] instanceof Item) { - itemstack1 = new ItemStack((Item) aobject[i + 1]); - } else if (aobject[i + 1] instanceof Block) { - itemstack1 = new ItemStack((Block) aobject[i + 1], 1, 32767); - } else if (aobject[i + 1] instanceof ItemStack) { - itemstack1 = (ItemStack) aobject[i + 1]; - } - - hashmap.put(character, itemstack1); - } - - ItemStack[] aitemstack = new ItemStack[j * k]; - - for (int i1 = 0; i1 < j * k; ++i1) { - char c0 = s.charAt(i1); - - if (hashmap.containsKey(Character.valueOf(c0))) { - aitemstack[i1] = ((ItemStack) hashmap.get(Character.valueOf(c0))).cloneItemStack(); - } else { - aitemstack[i1] = null; - } - } - - ShapedRecipes shapedrecipes = new ShapedRecipes(j, k, aitemstack, itemstack); - - this.recipes.add(shapedrecipes); - return shapedrecipes; - } - - // CraftBukkit - default -> public - public void registerShapelessRecipe(ItemStack itemstack, Object... aobject) { - ArrayList arraylist = new ArrayList(); - Object[] aobject1 = aobject; - int i = aobject.length; - - for (int j = 0; j < i; ++j) { - Object object = aobject1[j]; - - if (object instanceof ItemStack) { - arraylist.add(((ItemStack) object).cloneItemStack()); - } else if (object instanceof Item) { - arraylist.add(new ItemStack((Item) object)); - } else { - if (!(object instanceof Block)) { - throw new RuntimeException("Invalid shapeless recipy!"); - } - - arraylist.add(new ItemStack((Block) object)); - } - } - - this.recipes.add(new ShapelessRecipes(itemstack, arraylist)); - } - - public ItemStack craft(InventoryCrafting inventorycrafting, World world) { - int i = 0; - ItemStack itemstack = null; - ItemStack itemstack1 = null; - - int j; - - for (j = 0; j < inventorycrafting.getSize(); ++j) { - ItemStack itemstack2 = inventorycrafting.getItem(j); - - if (itemstack2 != null) { - if (i == 0) { - itemstack = itemstack2; - } - - if (i == 1) { - itemstack1 = itemstack2; - } - - ++i; - } - } - - if (i == 2 && itemstack.getItem() == itemstack1.getItem() && itemstack.count == 1 && itemstack1.count == 1 && itemstack.getItem().usesDurability()) { - Item item = itemstack.getItem(); - int k = item.getMaxDurability() - itemstack.j(); - int l = item.getMaxDurability() - itemstack1.j(); - int i1 = k + l + item.getMaxDurability() * 5 / 100; - int j1 = item.getMaxDurability() - i1; - - if (j1 < 0) { - j1 = 0; - } - - // CraftBukkit start - Construct a dummy repair recipe - ItemStack result = new ItemStack(itemstack.getItem(), 1, j1); - List ingredients = new ArrayList(); - ingredients.add(itemstack.cloneItemStack()); - ingredients.add(itemstack1.cloneItemStack()); - ShapelessRecipes recipe = new ShapelessRecipes(result.cloneItemStack(), ingredients); - inventorycrafting.currentRecipe = recipe; - result = CraftEventFactory.callPreCraftEvent(inventorycrafting, result, lastCraftView, true); - return result; - // CraftBukkit end - } else { - for (j = 0; j < this.recipes.size(); ++j) { - IRecipe irecipe = (IRecipe) this.recipes.get(j); - - if (irecipe.a(inventorycrafting, world)) { - // CraftBukkit start - INVENTORY_PRE_CRAFT event - inventorycrafting.currentRecipe = irecipe; - ItemStack result = irecipe.a(inventorycrafting); - return CraftEventFactory.callPreCraftEvent(inventorycrafting, result, lastCraftView, false); - // CraftBukkit end - } - } - - inventorycrafting.currentRecipe = null; // CraftBukkit - Clear recipe when no recipe is found - return null; - } - } - - public List getRecipes() { - return this.recipes; - } -} diff --git a/src/main/java/net/minecraft/server/CrashReport.java b/src/main/java/net/minecraft/server/CrashReport.java deleted file mode 100644 index 7e06002722..0000000000 --- a/src/main/java/net/minecraft/server/CrashReport.java +++ /dev/null @@ -1,235 +0,0 @@ -package net.minecraft.server; - -import java.io.File; -import java.io.FileWriter; -import java.io.PrintWriter; -import java.io.StringWriter; -import java.text.SimpleDateFormat; -import java.util.ArrayList; -import java.util.Date; -import java.util.Iterator; -import java.util.List; -import java.util.concurrent.Callable; - -import net.minecraft.util.org.apache.commons.io.IOUtils; -import net.minecraft.util.org.apache.commons.lang3.ArrayUtils; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; - -public class CrashReport { - - private static final Logger a = LogManager.getLogger(); - private final String b; - private final Throwable c; - private final CrashReportSystemDetails d = new CrashReportSystemDetails(this, "System Details"); - private final List e = new ArrayList(); - private File f; - private boolean g = true; - private StackTraceElement[] h = new StackTraceElement[0]; - - public CrashReport(String s, Throwable throwable) { - this.b = s; - this.c = throwable; - this.h(); - } - - private void h() { - this.d.a("Minecraft Version", (Callable) (new CrashReportVersion(this))); - this.d.a("Operating System", (Callable) (new CrashReportOperatingSystem(this))); - this.d.a("Java Version", (Callable) (new CrashReportJavaVersion(this))); - this.d.a("Java VM Version", (Callable) (new CrashReportJavaVMVersion(this))); - this.d.a("Memory", (Callable) (new CrashReportMemory(this))); - this.d.a("JVM Flags", (Callable) (new CrashReportJVMFlags(this))); - this.d.a("AABB Pool Size", (Callable) (new CrashReportAABBPoolSize(this))); - this.d.a("IntCache", (Callable) (new CrashReportIntCacheSize(this))); - this.d.a("CraftBukkit Information", (Callable) (new org.bukkit.craftbukkit.CraftCrashReport())); // CraftBukkit - } - - public String a() { - return this.b; - } - - public Throwable b() { - return this.c; - } - - public void a(StringBuilder stringbuilder) { - if ((this.h == null || this.h.length <= 0) && this.e.size() > 0) { - this.h = (StackTraceElement[]) ArrayUtils.subarray(((CrashReportSystemDetails) this.e.get(0)).a(), 0, 1); - } - - if (this.h != null && this.h.length > 0) { - stringbuilder.append("-- Head --\n"); - stringbuilder.append("Stacktrace:\n"); - StackTraceElement[] astacktraceelement = this.h; - int i = astacktraceelement.length; - - for (int j = 0; j < i; ++j) { - StackTraceElement stacktraceelement = astacktraceelement[j]; - - stringbuilder.append("\t").append("at ").append(stacktraceelement.toString()); - stringbuilder.append("\n"); - } - - stringbuilder.append("\n"); - } - - Iterator iterator = this.e.iterator(); - - while (iterator.hasNext()) { - CrashReportSystemDetails crashreportsystemdetails = (CrashReportSystemDetails) iterator.next(); - - crashreportsystemdetails.a(stringbuilder); - stringbuilder.append("\n\n"); - } - - this.d.a(stringbuilder); - } - - public String d() { - StringWriter stringwriter = null; - PrintWriter printwriter = null; - Object object = this.c; - - if (((Throwable) object).getMessage() == null) { - if (object instanceof NullPointerException) { - object = new NullPointerException(this.b); - } else if (object instanceof StackOverflowError) { - object = new StackOverflowError(this.b); - } else if (object instanceof OutOfMemoryError) { - object = new OutOfMemoryError(this.b); - } - - ((Throwable) object).setStackTrace(this.c.getStackTrace()); - } - - String s = ((Throwable) object).toString(); - - try { - stringwriter = new StringWriter(); - printwriter = new PrintWriter(stringwriter); - ((Throwable) object).printStackTrace(printwriter); - s = stringwriter.toString(); - } finally { - IOUtils.closeQuietly(stringwriter); - IOUtils.closeQuietly(printwriter); - } - - return s; - } - - public String e() { - StringBuilder stringbuilder = new StringBuilder(); - - stringbuilder.append("---- Minecraft Crash Report ----\n"); - stringbuilder.append("// "); - stringbuilder.append(i()); - stringbuilder.append("\n\n"); - stringbuilder.append("Time: "); - stringbuilder.append((new SimpleDateFormat()).format(new Date())); - stringbuilder.append("\n"); - stringbuilder.append("Description: "); - stringbuilder.append(this.b); - stringbuilder.append("\n\n"); - stringbuilder.append(this.d()); - stringbuilder.append("\n\nA detailed walkthrough of the error, its code path and all known details is as follows:\n"); - - for (int i = 0; i < 87; ++i) { - stringbuilder.append("-"); - } - - stringbuilder.append("\n\n"); - this.a(stringbuilder); - return stringbuilder.toString(); - } - - public boolean a(File file1) { - if (this.f != null) { - return false; - } else { - if (file1.getParentFile() != null) { - file1.getParentFile().mkdirs(); - } - - try { - FileWriter filewriter = new FileWriter(file1); - - filewriter.write(this.e()); - filewriter.close(); - this.f = file1; - return true; - } catch (Throwable throwable) { - a.error("Could not save crash report to " + file1, throwable); - return false; - } - } - } - - public CrashReportSystemDetails g() { - return this.d; - } - - public CrashReportSystemDetails a(String s) { - return this.a(s, 1); - } - - public CrashReportSystemDetails a(String s, int i) { - CrashReportSystemDetails crashreportsystemdetails = new CrashReportSystemDetails(this, s); - - if (this.g) { - int j = crashreportsystemdetails.a(i); - StackTraceElement[] astacktraceelement = this.c.getStackTrace(); - StackTraceElement stacktraceelement = null; - StackTraceElement stacktraceelement1 = null; - int k = astacktraceelement.length - j; - - if (k < 0) { - System.out.println("Negative index in crash report handler (" + astacktraceelement.length + "/" + j + ")"); - } - - if (astacktraceelement != null && 0 <= k && k < astacktraceelement.length) { - stacktraceelement = astacktraceelement[k]; - if (astacktraceelement.length + 1 - j < astacktraceelement.length) { - stacktraceelement1 = astacktraceelement[astacktraceelement.length + 1 - j]; - } - } - - this.g = crashreportsystemdetails.a(stacktraceelement, stacktraceelement1); - if (j > 0 && !this.e.isEmpty()) { - CrashReportSystemDetails crashreportsystemdetails1 = (CrashReportSystemDetails) this.e.get(this.e.size() - 1); - - crashreportsystemdetails1.b(j); - } else if (astacktraceelement != null && astacktraceelement.length >= j && 0 <= k && k < astacktraceelement.length) { - this.h = new StackTraceElement[astacktraceelement.length - j]; - System.arraycopy(astacktraceelement, 0, this.h, 0, this.h.length); - } else { - this.g = false; - } - } - - this.e.add(crashreportsystemdetails); - return crashreportsystemdetails; - } - - private static String i() { - String[] astring = new String[] { "Who set us up the TNT?", "Everything\'s going to plan. No, really, that was supposed to happen.", "Uh... Did I do that?", "Oops.", "Why did you do that?", "I feel sad now :(", "My bad.", "I\'m sorry, Dave.", "I let you down. Sorry :(", "On the bright side, I bought you a teddy bear!", "Daisy, daisy...", "Oh - I know what I did wrong!", "Hey, that tickles! Hehehe!", "I blame Dinnerbone.", "You should try our sister game, Minceraft!", "Don\'t be sad. I\'ll do better next time, I promise!", "Don\'t be sad, have a hug! <3", "I just don\'t know what went wrong :(", "Shall we play a game?", "Quite honestly, I wouldn\'t worry myself about that.", "I bet Cylons wouldn\'t have this problem.", "Sorry :(", "Surprise! Haha. Well, this is awkward.", "Would you like a cupcake?", "Hi. I\'m Minecraft, and I\'m a crashaholic.", "Ooh. Shiny.", "This doesn\'t make any sense!", "Why is it breaking :(", "Don\'t do that.", "Ouch. That hurt :(", "You\'re mean.", "This is a token for 1 free hug. Redeem at your nearest Mojangsta: [~~HUG~~]", "There are four lights!", "But it works on my machine."}; - - try { - return astring[(int) (System.nanoTime() % (long) astring.length)]; - } catch (Throwable throwable) { - return "Witty comment unavailable :("; - } - } - - public static CrashReport a(Throwable throwable, String s) { - CrashReport crashreport; - - if (throwable instanceof ReportedException) { - crashreport = ((ReportedException) throwable).a(); - } else { - crashreport = new CrashReport(s, throwable); - } - - return crashreport; - } -} diff --git a/src/main/java/net/minecraft/server/DedicatedServer.java b/src/main/java/net/minecraft/server/DedicatedServer.java deleted file mode 100644 index 83f2dad532..0000000000 --- a/src/main/java/net/minecraft/server/DedicatedServer.java +++ /dev/null @@ -1,472 +0,0 @@ -package net.minecraft.server; - -import java.io.File; -import java.io.IOException; -import java.net.InetAddress; -import java.net.Proxy; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.Random; -import java.util.concurrent.Callable; - -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; - -// CraftBukkit start -import java.io.PrintStream; -import org.apache.logging.log4j.Level; - -import org.bukkit.craftbukkit.LoggerOutputStream; -import org.bukkit.event.server.ServerCommandEvent; -// CraftBukkit end - -public class DedicatedServer extends MinecraftServer implements IMinecraftServer { - - private static final Logger i = LogManager.getLogger(); - private final List j = Collections.synchronizedList(new ArrayList()); - private RemoteStatusListener k; - private RemoteControlListener l; - public PropertyManager propertyManager; // CraftBukkit - private -> public - private EULA n; - private boolean generateStructures; - private EnumGamemode p; - private boolean q; - - // CraftBukkit start - Signature changed - public DedicatedServer(joptsimple.OptionSet options) { - super(options, Proxy.NO_PROXY); - // super(file1, Proxy.NO_PROXY); - // CraftBukkit end - new ThreadSleepForever(this, "Server Infinisleeper"); - } - - protected boolean init() throws java.net.UnknownHostException { // CraftBukkit - throws UnknownHostException - ThreadCommandReader threadcommandreader = new ThreadCommandReader(this, "Server console handler"); - - threadcommandreader.setDaemon(true); - threadcommandreader.start(); - - // CraftBukkit start - TODO: handle command-line logging arguments - java.util.logging.Logger global = java.util.logging.Logger.getLogger(""); - global.setUseParentHandlers(false); - for (java.util.logging.Handler handler : global.getHandlers()) { - global.removeHandler(handler); - } - global.addHandler(new org.bukkit.craftbukkit.util.ForwardLogHandler()); - - final org.apache.logging.log4j.core.Logger logger = ((org.apache.logging.log4j.core.Logger) LogManager.getRootLogger()); - for (org.apache.logging.log4j.core.Appender appender : logger.getAppenders().values()) { - if (appender instanceof org.apache.logging.log4j.core.appender.ConsoleAppender) { - logger.removeAppender(appender); - } - } - - new Thread(new org.bukkit.craftbukkit.util.TerminalConsoleWriterThread(System.out, this.reader)).start(); - - System.setOut(new PrintStream(new LoggerOutputStream(logger, Level.INFO), true)); - System.setErr(new PrintStream(new LoggerOutputStream(logger, Level.WARN), true)); - // CraftBukkit end - - i.info("Starting minecraft server version 1.7.10"); - if (Runtime.getRuntime().maxMemory() / 1024L / 1024L < 512L) { - i.warn("To start the server with more ram, launch it as \"java -Xmx1024M -Xms1024M -jar minecraft_server.jar\""); - } - - i.info("Loading properties"); - this.propertyManager = new PropertyManager(this.options); // CraftBukkit - CLI argument support - this.n = new EULA(new File("eula.txt")); - if (!this.n.a()) { - i.info("You need to agree to the EULA in order to run the server. Go to eula.txt for more info."); - this.n.b(); - return false; - } else { - if (this.N()) { - this.c("127.0.0.1"); - } else { - this.setOnlineMode(this.propertyManager.getBoolean("online-mode", true)); - this.c(this.propertyManager.getString("server-ip", "")); - } - - this.setSpawnAnimals(this.propertyManager.getBoolean("spawn-animals", true)); - this.setSpawnNPCs(this.propertyManager.getBoolean("spawn-npcs", true)); - this.setPvP(this.propertyManager.getBoolean("pvp", true)); - this.setAllowFlight(this.propertyManager.getBoolean("allow-flight", false)); - this.setTexturePack(this.propertyManager.getString("resource-pack", "")); - this.setMotd(this.propertyManager.getString("motd", "A Minecraft Server")); - this.setForceGamemode(this.propertyManager.getBoolean("force-gamemode", false)); - this.setIdleTimeout(this.propertyManager.getInt("player-idle-timeout", 0)); - if (this.propertyManager.getInt("difficulty", 1) < 0) { - this.propertyManager.setProperty("difficulty", Integer.valueOf(0)); - } else if (this.propertyManager.getInt("difficulty", 1) > 3) { - this.propertyManager.setProperty("difficulty", Integer.valueOf(3)); - } - - this.generateStructures = this.propertyManager.getBoolean("generate-structures", true); - int gamemode = this.propertyManager.getInt("gamemode", EnumGamemode.SURVIVAL.getId()); // CraftBukkit - Unique name to avoid stomping on logger - - this.p = WorldSettings.a(gamemode); // CraftBukkit - Use new name - i.info("Default game type: " + this.p); - InetAddress inetaddress = null; - - if (this.getServerIp().length() > 0) { - inetaddress = InetAddress.getByName(this.getServerIp()); - } - - if (this.L() < 0) { - this.setPort(this.propertyManager.getInt("server-port", 25565)); - } - - i.info("Generating keypair"); - this.a(MinecraftEncryption.b()); - i.info("Starting Minecraft server on " + (this.getServerIp().length() == 0 ? "*" : this.getServerIp()) + ":" + this.L()); - - try { - this.ai().a(inetaddress, this.L()); - } catch (Throwable ioexception) { // CraftBukkit - IOException -> Throwable - i.warn("**** FAILED TO BIND TO PORT!"); - i.warn("The exception was: {}", new Object[] { ioexception.toString()}); - i.warn("Perhaps a server is already running on that port?"); - return false; - } - - this.a((PlayerList) (new DedicatedPlayerList(this))); // CraftBukkit - - if (!this.getOnlineMode()) { - i.warn("**** SERVER IS RUNNING IN OFFLINE/INSECURE MODE!"); - i.warn("The server will make no attempt to authenticate usernames. Beware."); - i.warn("While this makes the game possible to play without internet access, it also opens up the ability for hackers to connect with any username they choose."); - i.warn("To change this, set \"online-mode\" to \"true\" in the server.properties file."); - } - - if (this.aE()) { - this.getUserCache().c(); - } - - if (!NameReferencingFileConverter.a(this.propertyManager)) { - return false; - } else { - // this.a((PlayerList) (new DedicatedPlayerList(this))); // CraftBukkit - moved up - this.convertable = new WorldLoaderServer(server.getWorldContainer()); // CraftBukkit - moved from MinecraftServer constructor - long j = System.nanoTime(); - - if (this.O() == null) { - this.k(this.propertyManager.getString("level-name", "world")); - } - - String s = this.propertyManager.getString("level-seed", ""); - String s1 = this.propertyManager.getString("level-type", "DEFAULT"); - String s2 = this.propertyManager.getString("generator-settings", ""); - long k = (new Random()).nextLong(); - - if (s.length() > 0) { - try { - long l = Long.parseLong(s); - - if (l != 0L) { - k = l; - } - } catch (NumberFormatException numberformatexception) { - k = (long) s.hashCode(); - } - } - - WorldType worldtype = WorldType.getType(s1); - - if (worldtype == null) { - worldtype = WorldType.NORMAL; - } - - this.at(); - this.getEnableCommandBlock(); - this.l(); - this.getSnooperEnabled(); - this.c(this.propertyManager.getInt("max-build-height", 256)); - this.c((this.getMaxBuildHeight() + 8) / 16 * 16); - this.c(MathHelper.a(this.getMaxBuildHeight(), 64, 256)); - this.propertyManager.setProperty("max-build-height", Integer.valueOf(this.getMaxBuildHeight())); - i.info("Preparing level \"" + this.O() + "\""); - this.a(this.O(), this.O(), k, worldtype, s2); - long i1 = System.nanoTime() - j; - String s3 = String.format("%.3fs", new Object[] { Double.valueOf((double) i1 / 1.0E9D)}); - - i.info("Done (" + s3 + ")! For help, type \"help\" or \"?\""); - if (this.propertyManager.getBoolean("enable-query", false)) { - i.info("Starting GS4 status listener"); - this.k = new RemoteStatusListener(this); - this.k.a(); - } - - if (this.propertyManager.getBoolean("enable-rcon", false)) { - i.info("Starting remote control listener"); - this.l = new RemoteControlListener(this); - this.l.a(); - this.remoteConsole = new org.bukkit.craftbukkit.command.CraftRemoteConsoleCommandSender(); // CraftBukkit - } - - // CraftBukkit start - if (this.server.getBukkitSpawnRadius() > -1) { - i.info("'settings.spawn-radius' in bukkit.yml has been moved to 'spawn-protection' in server.properties. I will move your config for you."); - this.propertyManager.properties.remove("spawn-protection"); - this.propertyManager.getInt("spawn-protection", this.server.getBukkitSpawnRadius()); - this.server.removeBukkitSpawnRadius(); - this.propertyManager.savePropertiesFile(); - } - // CraftBukkit end - - return true; - } - } - } - - // CraftBukkit start - public PropertyManager getPropertyManager() { - return this.propertyManager; - } - // CraftBukkit end - - public boolean getGenerateStructures() { - return this.generateStructures; - } - - public EnumGamemode getGamemode() { - return this.p; - } - - public EnumDifficulty getDifficulty() { - return EnumDifficulty.getById(this.propertyManager.getInt("difficulty", 1)); - } - - public boolean isHardcore() { - return this.propertyManager.getBoolean("hardcore", false); - } - - protected void a(CrashReport crashreport) {} - - public CrashReport b(CrashReport crashreport) { - crashreport = super.b(crashreport); - crashreport.g().a("Is Modded", (Callable) (new CrashReportModded(this))); - crashreport.g().a("Type", (Callable) (new CrashReportType(this))); - return crashreport; - } - - protected void t() { - System.exit(0); - } - - public void v() { // CraftBukkit - protected -> public (decompile error?) - super.v(); - this.aB(); - } - - public boolean getAllowNether() { - return this.propertyManager.getBoolean("allow-nether", true); - } - - public boolean getSpawnMonsters() { - return this.propertyManager.getBoolean("spawn-monsters", true); - } - - public void a(MojangStatisticsGenerator mojangstatisticsgenerator) { - mojangstatisticsgenerator.a("whitelist_enabled", Boolean.valueOf(this.aC().getHasWhitelist())); - mojangstatisticsgenerator.a("whitelist_count", Integer.valueOf(this.aC().getWhitelisted().length)); - super.a(mojangstatisticsgenerator); - } - - public boolean getSnooperEnabled() { - return this.propertyManager.getBoolean("snooper-enabled", true); - } - - public void issueCommand(String s, ICommandListener icommandlistener) { - this.j.add(new ServerCommand(s, icommandlistener)); - } - - public void aB() { - while (!this.j.isEmpty()) { - ServerCommand servercommand = (ServerCommand) this.j.remove(0); - - // CraftBukkit start - ServerCommand for preprocessing - ServerCommandEvent event = new ServerCommandEvent(this.console, servercommand.command); - this.server.getPluginManager().callEvent(event); - servercommand = new ServerCommand(event.getCommand(), servercommand.source); - - // this.getCommandHandler().a(servercommand.source, servercommand.command); // Called in dispatchServerCommand - this.server.dispatchServerCommand(this.console, servercommand); - // CraftBukkit end - } - } - - public boolean X() { - return true; - } - - public DedicatedPlayerList aC() { - return (DedicatedPlayerList) super.getPlayerList(); - } - - public int a(String s, int i) { - return this.propertyManager.getInt(s, i); - } - - public String a(String s, String s1) { - return this.propertyManager.getString(s, s1); - } - - public boolean a(String s, boolean flag) { - return this.propertyManager.getBoolean(s, flag); - } - - public void a(String s, Object object) { - this.propertyManager.setProperty(s, object); - } - - public void a() { - this.propertyManager.savePropertiesFile(); - } - - public String b() { - File file1 = this.propertyManager.c(); - - return file1 != null ? file1.getAbsolutePath() : "No settings file"; - } - - public void aD() { - ServerGUI.a(this); - this.q = true; - } - - public boolean ak() { - return this.q; - } - - public String a(EnumGamemode enumgamemode, boolean flag) { - return ""; - } - - public boolean getEnableCommandBlock() { - return this.propertyManager.getBoolean("enable-command-block", false); - } - - public int getSpawnProtection() { - return this.propertyManager.getInt("spawn-protection", super.getSpawnProtection()); - } - - public boolean a(World world, int i, int j, int k, EntityHuman entityhuman) { - if (world.worldProvider.dimension != 0) { - return false; - } else if (this.aC().getOPs().isEmpty()) { - return false; - } else if (this.aC().isOp(entityhuman.getProfile())) { - return false; - } else if (this.getSpawnProtection() <= 0) { - return false; - } else { - ChunkCoordinates chunkcoordinates = world.getSpawn(); - int l = MathHelper.a(i - chunkcoordinates.x); - int i1 = MathHelper.a(k - chunkcoordinates.z); - int j1 = Math.max(l, i1); - - return j1 <= this.getSpawnProtection(); - } - } - - public int l() { - return this.propertyManager.getInt("op-permission-level", 4); - } - - public void setIdleTimeout(int i) { - super.setIdleTimeout(i); - this.propertyManager.setProperty("player-idle-timeout", Integer.valueOf(i)); - this.a(); - } - - public boolean m() { - return this.propertyManager.getBoolean("broadcast-rcon-to-ops", true); - } - - public boolean at() { - return this.propertyManager.getBoolean("announce-player-achievements", true); - } - - protected boolean aE() { - boolean flag = false; - - int i; - - for (i = 0; !flag && i <= 2; ++i) { - if (i > 0) { - // CraftBukkit - Fix decompiler stomping on field - DedicatedServer.i.warn("Encountered a problem while converting the user banlist, retrying in a few seconds"); - this.aG(); - } - - flag = NameReferencingFileConverter.a((MinecraftServer) this); - } - - boolean flag1 = false; - - for (i = 0; !flag1 && i <= 2; ++i) { - if (i > 0) { - // CraftBukkit - Fix decompiler stomping on field - DedicatedServer.i.warn("Encountered a problem while converting the ip banlist, retrying in a few seconds"); - this.aG(); - } - - flag1 = NameReferencingFileConverter.b((MinecraftServer) this); - } - - boolean flag2 = false; - - for (i = 0; !flag2 && i <= 2; ++i) { - if (i > 0) { - // CraftBukkit - Fix decompiler stomping on field - DedicatedServer.i.warn("Encountered a problem while converting the op list, retrying in a few seconds"); - this.aG(); - } - - flag2 = NameReferencingFileConverter.c((MinecraftServer) this); - } - - boolean flag3 = false; - - for (i = 0; !flag3 && i <= 2; ++i) { - if (i > 0) { - // CraftBukkit - Fix decompiler stomping on field - DedicatedServer.i.warn("Encountered a problem while converting the whitelist, retrying in a few seconds"); - this.aG(); - } - - flag3 = NameReferencingFileConverter.d((MinecraftServer) this); - } - - boolean flag4 = false; - - for (i = 0; !flag4 && i <= 2; ++i) { - if (i > 0) { - // CraftBukkit - Fix decompiler stomping on field - DedicatedServer.i.warn("Encountered a problem while converting the player save files, retrying in a few seconds"); - this.aG(); - } - - flag4 = NameReferencingFileConverter.a(this, this.propertyManager); - } - - return flag || flag1 || flag2 || flag3 || flag4; - } - - private void aG() { - try { - Thread.sleep(5000L); - } catch (InterruptedException interruptedexception) { - ; - } - } - - public PlayerList getPlayerList() { - return this.aC(); - } - - static Logger aF() { - return i; - } -} diff --git a/src/main/java/net/minecraft/server/DispenseBehaviorArmor.java b/src/main/java/net/minecraft/server/DispenseBehaviorArmor.java deleted file mode 100644 index 9df12c0f62..0000000000 --- a/src/main/java/net/minecraft/server/DispenseBehaviorArmor.java +++ /dev/null @@ -1,67 +0,0 @@ -package net.minecraft.server; - -import java.util.List; - -// CraftBukkit start -import org.bukkit.craftbukkit.inventory.CraftItemStack; -import org.bukkit.event.block.BlockDispenseEvent; -// CraftBukkit end - -final class DispenseBehaviorArmor extends DispenseBehaviorItem { - - DispenseBehaviorArmor() {} - - protected ItemStack b(ISourceBlock isourceblock, ItemStack itemstack) { - EnumFacing enumfacing = BlockDispenser.b(isourceblock.h()); - int i = isourceblock.getBlockX() + enumfacing.getAdjacentX(); - int j = isourceblock.getBlockY() + enumfacing.getAdjacentY(); - int k = isourceblock.getBlockZ() + enumfacing.getAdjacentZ(); - AxisAlignedBB axisalignedbb = AxisAlignedBB.a((double) i, (double) j, (double) k, (double) (i + 1), (double) (j + 1), (double) (k + 1)); - List list = isourceblock.k().a(EntityLiving.class, axisalignedbb, (IEntitySelector) (new EntitySelectorEquipable(itemstack))); - - if (list.size() > 0) { - EntityLiving entityliving = (EntityLiving) list.get(0); - int l = entityliving instanceof EntityHuman ? 1 : 0; - int i1 = EntityInsentient.b(itemstack); - - // CraftBukkit start - ItemStack itemstack1 = itemstack.a(1); - World world = isourceblock.k(); - org.bukkit.block.Block block = world.getWorld().getBlockAt(isourceblock.getBlockX(), isourceblock.getBlockY(), isourceblock.getBlockZ()); - CraftItemStack craftItem = CraftItemStack.asCraftMirror(itemstack1); - - BlockDispenseEvent event = new BlockDispenseEvent(block, craftItem.clone(), new org.bukkit.util.Vector(0, 0, 0)); - if (!BlockDispenser.eventFired) { - world.getServer().getPluginManager().callEvent(event); - } - - if (event.isCancelled()) { - itemstack.count++; - return itemstack; - } - - if (!event.getItem().equals(craftItem)) { - itemstack.count++; - // Chain to handler for new item - ItemStack eventStack = CraftItemStack.asNMSCopy(event.getItem()); - IDispenseBehavior idispensebehavior = (IDispenseBehavior) BlockDispenser.a.get(eventStack.getItem()); - if (idispensebehavior != IDispenseBehavior.a && idispensebehavior != this) { - idispensebehavior.a(isourceblock, eventStack); - return itemstack; - } - } - // CraftBukkit end - - itemstack1.count = 1; - entityliving.setEquipment(i1 - l, itemstack1); - if (entityliving instanceof EntityInsentient) { - ((EntityInsentient) entityliving).a(i1, 2.0F); - } - - // --itemstack.count; // CraftBukkit - handled above - return itemstack; - } else { - return super.b(isourceblock, itemstack); - } - } -} diff --git a/src/main/java/net/minecraft/server/DispenseBehaviorBoat.java b/src/main/java/net/minecraft/server/DispenseBehaviorBoat.java deleted file mode 100644 index 5bd6ec7510..0000000000 --- a/src/main/java/net/minecraft/server/DispenseBehaviorBoat.java +++ /dev/null @@ -1,73 +0,0 @@ -package net.minecraft.server; - -// CraftBukkit start -import org.bukkit.craftbukkit.inventory.CraftItemStack; -import org.bukkit.event.block.BlockDispenseEvent; -// CraftBukkit end - -final class DispenseBehaviorBoat extends DispenseBehaviorItem { - - private final DispenseBehaviorItem b = new DispenseBehaviorItem(); - - DispenseBehaviorBoat() {} - - public ItemStack b(ISourceBlock isourceblock, ItemStack itemstack) { - EnumFacing enumfacing = BlockDispenser.b(isourceblock.h()); - World world = isourceblock.k(); - double d0 = isourceblock.getX() + (double) ((float) enumfacing.getAdjacentX() * 1.125F); - double d1 = isourceblock.getY() + (double) ((float) enumfacing.getAdjacentY() * 1.125F); - double d2 = isourceblock.getZ() + (double) ((float) enumfacing.getAdjacentZ() * 1.125F); - int i = isourceblock.getBlockX() + enumfacing.getAdjacentX(); - int j = isourceblock.getBlockY() + enumfacing.getAdjacentY(); - int k = isourceblock.getBlockZ() + enumfacing.getAdjacentZ(); - Material material = world.getType(i, j, k).getMaterial(); - double d3; - - if (Material.WATER.equals(material)) { - d3 = 1.0D; - } else { - if (!Material.AIR.equals(material) || !Material.WATER.equals(world.getType(i, j - 1, k).getMaterial())) { - return this.b.a(isourceblock, itemstack); - } - - d3 = 0.0D; - } - - // CraftBukkit start - ItemStack itemstack1 = itemstack.a(1); - org.bukkit.block.Block block = world.getWorld().getBlockAt(isourceblock.getBlockX(), isourceblock.getBlockY(), isourceblock.getBlockZ()); - CraftItemStack craftItem = CraftItemStack.asCraftMirror(itemstack1); - - BlockDispenseEvent event = new BlockDispenseEvent(block, craftItem.clone(), new org.bukkit.util.Vector(d0, d1 + d3, d2)); - if (!BlockDispenser.eventFired) { - world.getServer().getPluginManager().callEvent(event); - } - - if (event.isCancelled()) { - itemstack.count++; - return itemstack; - } - - if (!event.getItem().equals(craftItem)) { - itemstack.count++; - // Chain to handler for new item - ItemStack eventStack = CraftItemStack.asNMSCopy(event.getItem()); - IDispenseBehavior idispensebehavior = (IDispenseBehavior) BlockDispenser.a.get(eventStack.getItem()); - if (idispensebehavior != IDispenseBehavior.a && idispensebehavior != this) { - idispensebehavior.a(isourceblock, eventStack); - return itemstack; - } - } - - EntityBoat entityboat = new EntityBoat(world, event.getVelocity().getX(), event.getVelocity().getY(), event.getVelocity().getZ()); - // CraftBukkit end - - world.addEntity(entityboat); - // itemstack.a(1); // CraftBukkit - handled during event processing - return itemstack; - } - - protected void a(ISourceBlock isourceblock) { - isourceblock.k().triggerEffect(1000, isourceblock.getBlockX(), isourceblock.getBlockY(), isourceblock.getBlockZ(), 0); - } -} diff --git a/src/main/java/net/minecraft/server/DispenseBehaviorBonemeal.java b/src/main/java/net/minecraft/server/DispenseBehaviorBonemeal.java deleted file mode 100644 index b547bc970a..0000000000 --- a/src/main/java/net/minecraft/server/DispenseBehaviorBonemeal.java +++ /dev/null @@ -1,67 +0,0 @@ -package net.minecraft.server; - -// CraftBukkit start -import org.bukkit.craftbukkit.inventory.CraftItemStack; -import org.bukkit.event.block.BlockDispenseEvent; -// CraftBukkit end - -final class DispenseBehaviorBonemeal extends DispenseBehaviorItem { - - private boolean b = true; - - DispenseBehaviorBonemeal() {} - - protected ItemStack b(ISourceBlock isourceblock, ItemStack itemstack) { - if (itemstack.getData() == 15) { - EnumFacing enumfacing = BlockDispenser.b(isourceblock.h()); - World world = isourceblock.k(); - int i = isourceblock.getBlockX() + enumfacing.getAdjacentX(); - int j = isourceblock.getBlockY() + enumfacing.getAdjacentY(); - int k = isourceblock.getBlockZ() + enumfacing.getAdjacentZ(); - - // CraftBukkit start - org.bukkit.block.Block block = world.getWorld().getBlockAt(isourceblock.getBlockX(), isourceblock.getBlockY(), isourceblock.getBlockZ()); - CraftItemStack craftItem = CraftItemStack.asNewCraftStack(itemstack.getItem()); - - BlockDispenseEvent event = new BlockDispenseEvent(block, craftItem.clone(), new org.bukkit.util.Vector(0, 0, 0)); - if (!BlockDispenser.eventFired) { - world.getServer().getPluginManager().callEvent(event); - } - - if (event.isCancelled()) { - return itemstack; - } - - if (!event.getItem().equals(craftItem)) { - // Chain to handler for new item - ItemStack eventStack = CraftItemStack.asNMSCopy(event.getItem()); - IDispenseBehavior idispensebehavior = (IDispenseBehavior) BlockDispenser.a.get(eventStack.getItem()); - if (idispensebehavior != IDispenseBehavior.a && idispensebehavior != this) { - idispensebehavior.a(isourceblock, eventStack); - return itemstack; - } - } - // CraftBukkit end - - if (ItemDye.a(itemstack, world, i, j, k)) { - if (!world.isStatic) { - world.triggerEffect(2005, i, j, k, 0); - } - } else { - this.b = false; - } - - return itemstack; - } else { - return super.b(isourceblock, itemstack); - } - } - - protected void a(ISourceBlock isourceblock) { - if (this.b) { - isourceblock.k().triggerEffect(1000, isourceblock.getBlockX(), isourceblock.getBlockY(), isourceblock.getBlockZ(), 0); - } else { - isourceblock.k().triggerEffect(1001, isourceblock.getBlockX(), isourceblock.getBlockY(), isourceblock.getBlockZ(), 0); - } - } -} diff --git a/src/main/java/net/minecraft/server/DispenseBehaviorEmptyBucket.java b/src/main/java/net/minecraft/server/DispenseBehaviorEmptyBucket.java deleted file mode 100644 index d7decfced6..0000000000 --- a/src/main/java/net/minecraft/server/DispenseBehaviorEmptyBucket.java +++ /dev/null @@ -1,68 +0,0 @@ -package net.minecraft.server; - -// CraftBukkit start -import org.bukkit.craftbukkit.inventory.CraftItemStack; -import org.bukkit.event.block.BlockDispenseEvent; -// CraftBukkit end - -final class DispenseBehaviorEmptyBucket extends DispenseBehaviorItem { - - private final DispenseBehaviorItem b = new DispenseBehaviorItem(); - - DispenseBehaviorEmptyBucket() {} - - public ItemStack b(ISourceBlock isourceblock, ItemStack itemstack) { - EnumFacing enumfacing = BlockDispenser.b(isourceblock.h()); - World world = isourceblock.k(); - int i = isourceblock.getBlockX() + enumfacing.getAdjacentX(); - int j = isourceblock.getBlockY() + enumfacing.getAdjacentY(); - int k = isourceblock.getBlockZ() + enumfacing.getAdjacentZ(); - Material material = world.getType(i, j, k).getMaterial(); - int l = world.getData(i, j, k); - Item item; - - if (Material.WATER.equals(material) && l == 0) { - item = Items.WATER_BUCKET; - } else { - if (!Material.LAVA.equals(material) || l != 0) { - return super.b(isourceblock, itemstack); - } - - item = Items.LAVA_BUCKET; - } - - // CraftBukkit start - org.bukkit.block.Block block = world.getWorld().getBlockAt(isourceblock.getBlockX(), isourceblock.getBlockY(), isourceblock.getBlockZ()); - CraftItemStack craftItem = CraftItemStack.asCraftMirror(itemstack); - - BlockDispenseEvent event = new BlockDispenseEvent(block, craftItem.clone(), new org.bukkit.util.Vector(i, j, k)); - if (!BlockDispenser.eventFired) { - world.getServer().getPluginManager().callEvent(event); - } - - if (event.isCancelled()) { - return itemstack; - } - - if (!event.getItem().equals(craftItem)) { - // Chain to handler for new item - ItemStack eventStack = CraftItemStack.asNMSCopy(event.getItem()); - IDispenseBehavior idispensebehavior = (IDispenseBehavior) BlockDispenser.a.get(eventStack.getItem()); - if (idispensebehavior != IDispenseBehavior.a && idispensebehavior != this) { - idispensebehavior.a(isourceblock, eventStack); - return itemstack; - } - } - // CraftBukkit end - - world.setAir(i, j, k); - if (--itemstack.count == 0) { - itemstack.setItem(item); - itemstack.count = 1; - } else if (((TileEntityDispenser) isourceblock.getTileEntity()).addItem(new ItemStack(item)) < 0) { - this.b.a(isourceblock, new ItemStack(item)); - } - - return itemstack; - } -} diff --git a/src/main/java/net/minecraft/server/DispenseBehaviorFilledBucket.java b/src/main/java/net/minecraft/server/DispenseBehaviorFilledBucket.java deleted file mode 100644 index 4a3691a11c..0000000000 --- a/src/main/java/net/minecraft/server/DispenseBehaviorFilledBucket.java +++ /dev/null @@ -1,69 +0,0 @@ -package net.minecraft.server; - -// CraftBukkit start -import org.bukkit.craftbukkit.inventory.CraftItemStack; -import org.bukkit.event.block.BlockDispenseEvent; -// CraftBukkit end - -final class DispenseBehaviorFilledBucket extends DispenseBehaviorItem { - - private final DispenseBehaviorItem b = new DispenseBehaviorItem(); - - DispenseBehaviorFilledBucket() {} - - public ItemStack b(ISourceBlock isourceblock, ItemStack itemstack) { - ItemBucket itembucket = (ItemBucket) itemstack.getItem(); - int i = isourceblock.getBlockX(); - int j = isourceblock.getBlockY(); - int k = isourceblock.getBlockZ(); - EnumFacing enumfacing = BlockDispenser.b(isourceblock.h()); - - // CraftBukkit start - World world = isourceblock.k(); - int x = i + enumfacing.getAdjacentX(); - int y = j + enumfacing.getAdjacentY(); - int z = k + enumfacing.getAdjacentZ(); - if (world.isEmpty(x, y, z) || !world.getType(x, y, z).getMaterial().isBuildable()) { - org.bukkit.block.Block block = world.getWorld().getBlockAt(i, j, k); - CraftItemStack craftItem = CraftItemStack.asCraftMirror(itemstack); - - BlockDispenseEvent event = new BlockDispenseEvent(block, craftItem.clone(), new org.bukkit.util.Vector(x, y, z)); - if (!BlockDispenser.eventFired) { - world.getServer().getPluginManager().callEvent(event); - } - - if (event.isCancelled()) { - return itemstack; - } - - if (!event.getItem().equals(craftItem)) { - // Chain to handler for new item - ItemStack eventStack = CraftItemStack.asNMSCopy(event.getItem()); - IDispenseBehavior idispensebehavior = (IDispenseBehavior) BlockDispenser.a.get(eventStack.getItem()); - if (idispensebehavior != IDispenseBehavior.a && idispensebehavior != this) { - idispensebehavior.a(isourceblock, eventStack); - return itemstack; - } - } - - itembucket = (ItemBucket) CraftItemStack.asNMSCopy(event.getItem()).getItem(); - } - // CraftBukkit end - - if (itembucket.a(isourceblock.k(), i + enumfacing.getAdjacentX(), j + enumfacing.getAdjacentY(), k + enumfacing.getAdjacentZ())) { - // CraftBukkit start - Handle stacked buckets - Item item = Items.BUCKET; - if (--itemstack.count == 0) { - itemstack.setItem(Items.BUCKET); - itemstack.count = 1; - } else if (((TileEntityDispenser) isourceblock.getTileEntity()).addItem(new ItemStack(item)) < 0) { - this.b.a(isourceblock, new ItemStack(item)); - } - // CraftBukkit end - - return itemstack; - } else { - return this.b.a(isourceblock, itemstack); - } - } -} diff --git a/src/main/java/net/minecraft/server/DispenseBehaviorFireball.java b/src/main/java/net/minecraft/server/DispenseBehaviorFireball.java deleted file mode 100644 index d16f035f7a..0000000000 --- a/src/main/java/net/minecraft/server/DispenseBehaviorFireball.java +++ /dev/null @@ -1,65 +0,0 @@ -package net.minecraft.server; - -import java.util.Random; - -// CraftBukkit start -import org.bukkit.craftbukkit.inventory.CraftItemStack; -import org.bukkit.event.block.BlockDispenseEvent; -// CraftBukkit end - -final class DispenseBehaviorFireball extends DispenseBehaviorItem { - - DispenseBehaviorFireball() {} - - public ItemStack b(ISourceBlock isourceblock, ItemStack itemstack) { - EnumFacing enumfacing = BlockDispenser.b(isourceblock.h()); - IPosition iposition = BlockDispenser.a(isourceblock); - double d0 = iposition.getX() + (double) ((float) enumfacing.getAdjacentX() * 0.3F); - double d1 = iposition.getY() + (double) ((float) enumfacing.getAdjacentY() * 0.3F); - double d2 = iposition.getZ() + (double) ((float) enumfacing.getAdjacentZ() * 0.3F); - World world = isourceblock.k(); - Random random = world.random; - double d3 = random.nextGaussian() * 0.05D + (double) enumfacing.getAdjacentX(); - double d4 = random.nextGaussian() * 0.05D + (double) enumfacing.getAdjacentY(); - double d5 = random.nextGaussian() * 0.05D + (double) enumfacing.getAdjacentZ(); - - // CraftBukkit start - ItemStack itemstack1 = itemstack.a(1); - org.bukkit.block.Block block = world.getWorld().getBlockAt(isourceblock.getBlockX(), isourceblock.getBlockY(), isourceblock.getBlockZ()); - CraftItemStack craftItem = CraftItemStack.asCraftMirror(itemstack1); - - BlockDispenseEvent event = new BlockDispenseEvent(block, craftItem.clone(), new org.bukkit.util.Vector(d3, d4, d5)); - if (!BlockDispenser.eventFired) { - world.getServer().getPluginManager().callEvent(event); - } - - if (event.isCancelled()) { - itemstack.count++; - return itemstack; - } - - if (!event.getItem().equals(craftItem)) { - itemstack.count++; - // Chain to handler for new item - ItemStack eventStack = CraftItemStack.asNMSCopy(event.getItem()); - IDispenseBehavior idispensebehavior = (IDispenseBehavior) BlockDispenser.a.get(eventStack.getItem()); - if (idispensebehavior != IDispenseBehavior.a && idispensebehavior != this) { - idispensebehavior.a(isourceblock, eventStack); - return itemstack; - } - } - - EntitySmallFireball entitysmallfireball = new EntitySmallFireball(world, d0, d1, d2, event.getVelocity().getX(), event.getVelocity().getY(), event.getVelocity().getZ()); - entitysmallfireball.projectileSource = new org.bukkit.craftbukkit.projectiles.CraftBlockProjectileSource((TileEntityDispenser) isourceblock.getTileEntity()); - - world.addEntity(entitysmallfireball); - // itemstack.a(1); // Handled during event processing - // CraftBukkit end - - return itemstack; - } - - protected void a(ISourceBlock isourceblock) { - isourceblock.k().triggerEffect(1009, isourceblock.getBlockX(), isourceblock.getBlockY(), isourceblock.getBlockZ(), 0); - } -} diff --git a/src/main/java/net/minecraft/server/DispenseBehaviorFireworks.java b/src/main/java/net/minecraft/server/DispenseBehaviorFireworks.java deleted file mode 100644 index 09a0842baf..0000000000 --- a/src/main/java/net/minecraft/server/DispenseBehaviorFireworks.java +++ /dev/null @@ -1,58 +0,0 @@ -package net.minecraft.server; - -// CraftBukkit start -import org.bukkit.craftbukkit.inventory.CraftItemStack; -import org.bukkit.event.block.BlockDispenseEvent; -// CraftBukkit end - -final class DispenseBehaviorFireworks extends DispenseBehaviorItem { - - DispenseBehaviorFireworks() {} - - public ItemStack b(ISourceBlock isourceblock, ItemStack itemstack) { - EnumFacing enumfacing = BlockDispenser.b(isourceblock.h()); - double d0 = isourceblock.getX() + (double) enumfacing.getAdjacentX(); - double d1 = (double) ((float) isourceblock.getBlockY() + 0.2F); - double d2 = isourceblock.getZ() + (double) enumfacing.getAdjacentZ(); - - // CraftBukkit start - World world = isourceblock.k(); - ItemStack itemstack1 = itemstack.a(1); - org.bukkit.block.Block block = world.getWorld().getBlockAt(isourceblock.getBlockX(), isourceblock.getBlockY(), isourceblock.getBlockZ()); - CraftItemStack craftItem = CraftItemStack.asCraftMirror(itemstack1); - - BlockDispenseEvent event = new BlockDispenseEvent(block, craftItem.clone(), new org.bukkit.util.Vector(d0, d1, d2)); - if (!BlockDispenser.eventFired) { - world.getServer().getPluginManager().callEvent(event); - } - - if (event.isCancelled()) { - itemstack.count++; - return itemstack; - } - - if (!event.getItem().equals(craftItem)) { - itemstack.count++; - // Chain to handler for new item - ItemStack eventStack = CraftItemStack.asNMSCopy(event.getItem()); - IDispenseBehavior idispensebehavior = (IDispenseBehavior) BlockDispenser.a.get(eventStack.getItem()); - if (idispensebehavior != IDispenseBehavior.a && idispensebehavior != this) { - idispensebehavior.a(isourceblock, eventStack); - return itemstack; - } - } - - itemstack1 = CraftItemStack.asNMSCopy(event.getItem()); - EntityFireworks entityfireworks = new EntityFireworks(isourceblock.k(), event.getVelocity().getX(), event.getVelocity().getY(), event.getVelocity().getZ(), itemstack1); - - isourceblock.k().addEntity(entityfireworks); - // itemstack.a(1); // Handled during event processing - // 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/DispenseBehaviorFlintAndSteel.java b/src/main/java/net/minecraft/server/DispenseBehaviorFlintAndSteel.java deleted file mode 100644 index c4bbd6b373..0000000000 --- a/src/main/java/net/minecraft/server/DispenseBehaviorFlintAndSteel.java +++ /dev/null @@ -1,71 +0,0 @@ -package net.minecraft.server; - -// CraftBukkit start -import org.bukkit.craftbukkit.inventory.CraftItemStack; -import org.bukkit.event.block.BlockDispenseEvent; -// CraftBukkit end - -final class DispenseBehaviorFlintAndSteel extends DispenseBehaviorItem { - - private boolean b = true; - - DispenseBehaviorFlintAndSteel() {} - - protected ItemStack b(ISourceBlock isourceblock, ItemStack itemstack) { - EnumFacing enumfacing = BlockDispenser.b(isourceblock.h()); - World world = isourceblock.k(); - int i = isourceblock.getBlockX() + enumfacing.getAdjacentX(); - int j = isourceblock.getBlockY() + enumfacing.getAdjacentY(); - int k = isourceblock.getBlockZ() + enumfacing.getAdjacentZ(); - - // CraftBukkit start - org.bukkit.block.Block block = world.getWorld().getBlockAt(isourceblock.getBlockX(), isourceblock.getBlockY(), isourceblock.getBlockZ()); - CraftItemStack craftItem = CraftItemStack.asCraftMirror(itemstack); - - BlockDispenseEvent event = new BlockDispenseEvent(block, craftItem.clone(), new org.bukkit.util.Vector(0, 0, 0)); - if (!BlockDispenser.eventFired) { - world.getServer().getPluginManager().callEvent(event); - } - - if (event.isCancelled()) { - return itemstack; - } - - if (!event.getItem().equals(craftItem)) { - // Chain to handler for new item - ItemStack eventStack = CraftItemStack.asNMSCopy(event.getItem()); - IDispenseBehavior idispensebehavior = (IDispenseBehavior) BlockDispenser.a.get(eventStack.getItem()); - if (idispensebehavior != IDispenseBehavior.a && idispensebehavior != this) { - idispensebehavior.a(isourceblock, eventStack); - return itemstack; - } - } - // CraftBukkit end - - if (world.isEmpty(i, j, k)) { - // CraftBukkit start - Ignition by dispensing flint and steel - if (!org.bukkit.craftbukkit.event.CraftEventFactory.callBlockIgniteEvent(world, i, j, k, isourceblock.getBlockX(), isourceblock.getBlockY(), isourceblock.getBlockZ()).isCancelled()) { - world.setTypeUpdate(i, j, k, Blocks.FIRE); - if (itemstack.isDamaged(1, world.random)) { - itemstack.count = 0; - } - } - // CraftBukkit end - } else if (world.getType(i, j, k) == Blocks.TNT) { - Blocks.TNT.postBreak(world, i, j, k, 1); - world.setAir(i, j, k); - } else { - this.b = false; - } - - return itemstack; - } - - protected void a(ISourceBlock isourceblock) { - if (this.b) { - isourceblock.k().triggerEffect(1000, isourceblock.getBlockX(), isourceblock.getBlockY(), isourceblock.getBlockZ(), 0); - } else { - isourceblock.k().triggerEffect(1001, isourceblock.getBlockX(), isourceblock.getBlockY(), isourceblock.getBlockZ(), 0); - } - } -} diff --git a/src/main/java/net/minecraft/server/DispenseBehaviorItem.java b/src/main/java/net/minecraft/server/DispenseBehaviorItem.java deleted file mode 100644 index e7196db0fe..0000000000 --- a/src/main/java/net/minecraft/server/DispenseBehaviorItem.java +++ /dev/null @@ -1,98 +0,0 @@ -package net.minecraft.server; - -// CraftBukkit start -import org.bukkit.craftbukkit.inventory.CraftItemStack; -import org.bukkit.event.block.BlockDispenseEvent; -// CraftBukkit end - -public class DispenseBehaviorItem implements IDispenseBehavior { - - public DispenseBehaviorItem() {} - - public final ItemStack a(ISourceBlock isourceblock, ItemStack itemstack) { - ItemStack itemstack1 = this.b(isourceblock, itemstack); - - this.a(isourceblock); - this.a(isourceblock, BlockDispenser.b(isourceblock.h())); - return itemstack1; - } - - protected ItemStack b(ISourceBlock isourceblock, ItemStack itemstack) { - EnumFacing enumfacing = BlockDispenser.b(isourceblock.h()); - IPosition iposition = BlockDispenser.a(isourceblock); - ItemStack itemstack1 = itemstack.a(1); - - // CraftBukkit start - if (!a(isourceblock.k(), itemstack1, 6, enumfacing, isourceblock)) { - itemstack.count++; - } - // CraftBukkit end - - return itemstack; - } - - // CraftBukkit start - void -> boolean return, IPosition -> ISourceBlock last argument - public static boolean a(World world, ItemStack itemstack, int i, EnumFacing enumfacing, ISourceBlock isourceblock) { - IPosition iposition = BlockDispenser.a(isourceblock); - // CraftBukkit end - double d0 = iposition.getX(); - double d1 = iposition.getY(); - double d2 = iposition.getZ(); - EntityItem entityitem = new EntityItem(world, d0, d1 - 0.3D, d2, itemstack); - double d3 = world.random.nextDouble() * 0.1D + 0.2D; - - entityitem.motX = (double) enumfacing.getAdjacentX() * d3; - entityitem.motY = 0.20000000298023224D; - entityitem.motZ = (double) enumfacing.getAdjacentZ() * d3; - entityitem.motX += world.random.nextGaussian() * 0.007499999832361937D * (double) i; - entityitem.motY += world.random.nextGaussian() * 0.007499999832361937D * (double) i; - entityitem.motZ += world.random.nextGaussian() * 0.007499999832361937D * (double) i; - - // CraftBukkit start - org.bukkit.block.Block block = world.getWorld().getBlockAt(isourceblock.getBlockX(), isourceblock.getBlockY(), isourceblock.getBlockZ()); - CraftItemStack craftItem = CraftItemStack.asCraftMirror(itemstack); - - BlockDispenseEvent event = new BlockDispenseEvent(block, craftItem.clone(), new org.bukkit.util.Vector(entityitem.motX, entityitem.motY, entityitem.motZ)); - if (!BlockDispenser.eventFired) { - world.getServer().getPluginManager().callEvent(event); - } - - if (event.isCancelled()) { - return false; - } - - entityitem.setItemStack(CraftItemStack.asNMSCopy(event.getItem())); - entityitem.motX = event.getVelocity().getX(); - entityitem.motY = event.getVelocity().getY(); - entityitem.motZ = event.getVelocity().getZ(); - - if (!event.getItem().equals(craftItem)) { - // Chain to handler for new item - ItemStack eventStack = CraftItemStack.asNMSCopy(event.getItem()); - IDispenseBehavior idispensebehavior = (IDispenseBehavior) BlockDispenser.a.get(eventStack.getItem()); - if (idispensebehavior != IDispenseBehavior.a && idispensebehavior.getClass() != DispenseBehaviorItem.class) { - idispensebehavior.a(isourceblock, eventStack); - } else { - world.addEntity(entityitem); - } - return false; - } - - world.addEntity(entityitem); - - return true; - // CraftBukkit end - } - - protected void a(ISourceBlock isourceblock) { - isourceblock.k().triggerEffect(1000, isourceblock.getBlockX(), isourceblock.getBlockY(), isourceblock.getBlockZ(), 0); - } - - protected void a(ISourceBlock isourceblock, EnumFacing enumfacing) { - isourceblock.k().triggerEffect(2000, isourceblock.getBlockX(), isourceblock.getBlockY(), isourceblock.getBlockZ(), this.a(enumfacing)); - } - - private int a(EnumFacing enumfacing) { - return enumfacing.getAdjacentX() + 1 + (enumfacing.getAdjacentZ() + 1) * 3; - } -} diff --git a/src/main/java/net/minecraft/server/DispenseBehaviorMinecart.java b/src/main/java/net/minecraft/server/DispenseBehaviorMinecart.java deleted file mode 100644 index 3df54aad92..0000000000 --- a/src/main/java/net/minecraft/server/DispenseBehaviorMinecart.java +++ /dev/null @@ -1,78 +0,0 @@ -package net.minecraft.server; - -// CraftBukkit start -import org.bukkit.craftbukkit.inventory.CraftItemStack; -import org.bukkit.event.block.BlockDispenseEvent; -// CraftBukkit end - -final class DispenseBehaviorMinecart extends DispenseBehaviorItem { - - private final DispenseBehaviorItem b = new DispenseBehaviorItem(); - - DispenseBehaviorMinecart() {} - - public ItemStack b(ISourceBlock isourceblock, ItemStack itemstack) { - EnumFacing enumfacing = BlockDispenser.b(isourceblock.h()); - World world = isourceblock.k(); - double d0 = isourceblock.getX() + (double) ((float) enumfacing.getAdjacentX() * 1.125F); - double d1 = isourceblock.getY() + (double) ((float) enumfacing.getAdjacentY() * 1.125F); - double d2 = isourceblock.getZ() + (double) ((float) enumfacing.getAdjacentZ() * 1.125F); - int i = isourceblock.getBlockX() + enumfacing.getAdjacentX(); - int j = isourceblock.getBlockY() + enumfacing.getAdjacentY(); - int k = isourceblock.getBlockZ() + enumfacing.getAdjacentZ(); - Block block = world.getType(i, j, k); - double d3; - - if (BlockMinecartTrackAbstract.a(block)) { - d3 = 0.0D; - } else { - if (block.getMaterial() != Material.AIR || !BlockMinecartTrackAbstract.a(world.getType(i, j - 1, k))) { - return this.b.a(isourceblock, itemstack); - } - - d3 = -1.0D; - } - - // CraftBukkit start - ItemStack itemstack1 = itemstack.a(1); - org.bukkit.block.Block block2 = world.getWorld().getBlockAt(isourceblock.getBlockX(), isourceblock.getBlockY(), isourceblock.getBlockZ()); - CraftItemStack craftItem = CraftItemStack.asCraftMirror(itemstack1); - - BlockDispenseEvent event = new BlockDispenseEvent(block2, craftItem.clone(), new org.bukkit.util.Vector(d0, d1 + d3, d2)); - if (!BlockDispenser.eventFired) { - world.getServer().getPluginManager().callEvent(event); - } - - if (event.isCancelled()) { - itemstack.count++; - return itemstack; - } - - if (!event.getItem().equals(craftItem)) { - itemstack.count++; - // Chain to handler for new item - ItemStack eventStack = CraftItemStack.asNMSCopy(event.getItem()); - IDispenseBehavior idispensebehavior = (IDispenseBehavior) BlockDispenser.a.get(eventStack.getItem()); - if (idispensebehavior != IDispenseBehavior.a && idispensebehavior != this) { - idispensebehavior.a(isourceblock, eventStack); - return itemstack; - } - } - - itemstack1 = CraftItemStack.asNMSCopy(event.getItem()); - EntityMinecartAbstract entityminecartabstract = EntityMinecartAbstract.a(world, event.getVelocity().getX(), event.getVelocity().getY(), event.getVelocity().getZ(), ((ItemMinecart) itemstack1.getItem()).a); - // CraftBukkit end - - if (itemstack.hasName()) { - entityminecartabstract.a(itemstack.getName()); - } - - world.addEntity(entityminecartabstract); - // itemstack.a(1); // CraftBukkit - handled during event processing - return itemstack; - } - - protected void a(ISourceBlock isourceblock) { - isourceblock.k().triggerEffect(1000, isourceblock.getBlockX(), isourceblock.getBlockY(), isourceblock.getBlockZ(), 0); - } -} diff --git a/src/main/java/net/minecraft/server/DispenseBehaviorMonsterEgg.java b/src/main/java/net/minecraft/server/DispenseBehaviorMonsterEgg.java deleted file mode 100644 index c3454101cd..0000000000 --- a/src/main/java/net/minecraft/server/DispenseBehaviorMonsterEgg.java +++ /dev/null @@ -1,57 +0,0 @@ -package net.minecraft.server; - -// CraftBukkit start -import org.bukkit.craftbukkit.inventory.CraftItemStack; -import org.bukkit.event.block.BlockDispenseEvent; -// CraftBukkit end - -final class DispenseBehaviorMonsterEgg extends DispenseBehaviorItem { - - DispenseBehaviorMonsterEgg() {} - - public ItemStack b(ISourceBlock isourceblock, ItemStack itemstack) { - EnumFacing enumfacing = BlockDispenser.b(isourceblock.h()); - double d0 = isourceblock.getX() + (double) enumfacing.getAdjacentX(); - double d1 = (double) ((float) isourceblock.getBlockY() + 0.2F); - double d2 = isourceblock.getZ() + (double) enumfacing.getAdjacentZ(); - - // CraftBukkit start - World world = isourceblock.k(); - ItemStack itemstack1 = itemstack.a(1); - org.bukkit.block.Block block = world.getWorld().getBlockAt(isourceblock.getBlockX(), isourceblock.getBlockY(), isourceblock.getBlockZ()); - CraftItemStack craftItem = CraftItemStack.asCraftMirror(itemstack1); - - BlockDispenseEvent event = new BlockDispenseEvent(block, craftItem.clone(), new org.bukkit.util.Vector(d0, d1, d2)); - if (!BlockDispenser.eventFired) { - world.getServer().getPluginManager().callEvent(event); - } - - if (event.isCancelled()) { - itemstack.count++; - return itemstack; - } - - if (!event.getItem().equals(craftItem)) { - itemstack.count++; - // Chain to handler for new item - ItemStack eventStack = CraftItemStack.asNMSCopy(event.getItem()); - IDispenseBehavior idispensebehavior = (IDispenseBehavior) BlockDispenser.a.get(eventStack.getItem()); - if (idispensebehavior != IDispenseBehavior.a && idispensebehavior != this) { - idispensebehavior.a(isourceblock, eventStack); - return itemstack; - } - } - - itemstack1 = CraftItemStack.asNMSCopy(event.getItem()); - - Entity entity = ItemMonsterEgg.spawnCreature(isourceblock.k(), itemstack.getData(), event.getVelocity().getX(), event.getVelocity().getY(), event.getVelocity().getZ(), org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.DISPENSE_EGG); - - if (entity instanceof EntityLiving && itemstack.hasName()) { - ((EntityInsentient) entity).setCustomName(itemstack.getName()); - } - - // itemstack.a(1); // Handled during event processing - // CraftBukkit end - return itemstack; - } -} diff --git a/src/main/java/net/minecraft/server/DispenseBehaviorProjectile.java b/src/main/java/net/minecraft/server/DispenseBehaviorProjectile.java deleted file mode 100644 index b90637357b..0000000000 --- a/src/main/java/net/minecraft/server/DispenseBehaviorProjectile.java +++ /dev/null @@ -1,66 +0,0 @@ -package net.minecraft.server; - -// CraftBukkit start -import org.bukkit.craftbukkit.inventory.CraftItemStack; -import org.bukkit.event.block.BlockDispenseEvent; -// CraftBukkit end - -public abstract class DispenseBehaviorProjectile extends DispenseBehaviorItem { - - public DispenseBehaviorProjectile() {} - - public ItemStack b(ISourceBlock isourceblock, ItemStack itemstack) { - World world = isourceblock.k(); - IPosition iposition = BlockDispenser.a(isourceblock); - EnumFacing enumfacing = BlockDispenser.b(isourceblock.h()); - IProjectile iprojectile = this.a(world, iposition); - - // CraftBukkit start - ItemStack itemstack1 = itemstack.a(1); - org.bukkit.block.Block block = world.getWorld().getBlockAt(isourceblock.getBlockX(), isourceblock.getBlockY(), isourceblock.getBlockZ()); - CraftItemStack craftItem = CraftItemStack.asCraftMirror(itemstack1); - - BlockDispenseEvent event = new BlockDispenseEvent(block, craftItem.clone(), new org.bukkit.util.Vector((double) enumfacing.getAdjacentX(), (double) ((float) enumfacing.getAdjacentY() + 0.1F), (double) enumfacing.getAdjacentZ())); - if (!BlockDispenser.eventFired) { - world.getServer().getPluginManager().callEvent(event); - } - - if (event.isCancelled()) { - itemstack.count++; - return itemstack; - } - - if (!event.getItem().equals(craftItem)) { - itemstack.count++; - // Chain to handler for new item - ItemStack eventStack = CraftItemStack.asNMSCopy(event.getItem()); - IDispenseBehavior idispensebehavior = (IDispenseBehavior) BlockDispenser.a.get(eventStack.getItem()); - if (idispensebehavior != IDispenseBehavior.a && idispensebehavior != this) { - idispensebehavior.a(isourceblock, eventStack); - return itemstack; - } - } - - iprojectile.shoot(event.getVelocity().getX(), event.getVelocity().getY(), event.getVelocity().getZ(), this.b(), this.a()); - ((Entity) iprojectile).projectileSource = new org.bukkit.craftbukkit.projectiles.CraftBlockProjectileSource((TileEntityDispenser) isourceblock.getTileEntity()); - // CraftBukkit end - - world.addEntity((Entity) iprojectile); - // itemstack.a(1); // CraftBukkit - Handled during event processing - return itemstack; - } - - protected void a(ISourceBlock isourceblock) { - isourceblock.k().triggerEffect(1002, isourceblock.getBlockX(), isourceblock.getBlockY(), isourceblock.getBlockZ(), 0); - } - - protected abstract IProjectile a(World world, IPosition iposition); - - protected float a() { - return 6.0F; - } - - protected float b() { - return 1.1F; - } -} diff --git a/src/main/java/net/minecraft/server/DispenseBehaviorTNT.java b/src/main/java/net/minecraft/server/DispenseBehaviorTNT.java deleted file mode 100644 index d9493393aa..0000000000 --- a/src/main/java/net/minecraft/server/DispenseBehaviorTNT.java +++ /dev/null @@ -1,52 +0,0 @@ -package net.minecraft.server; - -// CraftBukkit start -import org.bukkit.craftbukkit.inventory.CraftItemStack; -import org.bukkit.event.block.BlockDispenseEvent; -// CraftBukkit end - -final class DispenseBehaviorTNT extends DispenseBehaviorItem { - - DispenseBehaviorTNT() {} - - protected ItemStack b(ISourceBlock isourceblock, ItemStack itemstack) { - EnumFacing enumfacing = BlockDispenser.b(isourceblock.h()); - World world = isourceblock.k(); - int i = isourceblock.getBlockX() + enumfacing.getAdjacentX(); - int j = isourceblock.getBlockY() + enumfacing.getAdjacentY(); - int k = isourceblock.getBlockZ() + enumfacing.getAdjacentZ(); - - // CraftBukkit start - ItemStack itemstack1 = itemstack.a(1); - org.bukkit.block.Block block = world.getWorld().getBlockAt(isourceblock.getBlockX(), isourceblock.getBlockY(), isourceblock.getBlockZ()); - CraftItemStack craftItem = CraftItemStack.asCraftMirror(itemstack1); - - BlockDispenseEvent event = new BlockDispenseEvent(block, craftItem.clone(), new org.bukkit.util.Vector(i + 0.5, j + 0.5, k + 0.5)); - if (!BlockDispenser.eventFired) { - world.getServer().getPluginManager().callEvent(event); - } - - if (event.isCancelled()) { - itemstack.count++; - return itemstack; - } - - if (!event.getItem().equals(craftItem)) { - itemstack.count++; - // Chain to handler for new item - ItemStack eventStack = CraftItemStack.asNMSCopy(event.getItem()); - IDispenseBehavior idispensebehavior = (IDispenseBehavior) BlockDispenser.a.get(eventStack.getItem()); - if (idispensebehavior != IDispenseBehavior.a && idispensebehavior != this) { - idispensebehavior.a(isourceblock, eventStack); - return itemstack; - } - } - - EntityTNTPrimed entitytntprimed = new EntityTNTPrimed(world, event.getVelocity().getX(), event.getVelocity().getY(), event.getVelocity().getZ(), (EntityLiving) null); - // CraftBukkit end - - world.addEntity(entitytntprimed); - // --itemstack.count; // CraftBukkit - handled above - return itemstack; - } -} diff --git a/src/main/java/net/minecraft/server/Enchantment.java b/src/main/java/net/minecraft/server/Enchantment.java deleted file mode 100644 index d96ca7d443..0000000000 --- a/src/main/java/net/minecraft/server/Enchantment.java +++ /dev/null @@ -1,122 +0,0 @@ -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); - public static final Enchantment PROTECTION_EXPLOSIONS = new EnchantmentProtection(3, 2, 3); - 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); - public static final Enchantment KNOCKBACK = new EnchantmentKnockback(19, 5); - public static final Enchantment FIRE_ASPECT = new EnchantmentFire(20, 2); - public static final Enchantment LOOT_BONUS_MOBS = new EnchantmentLootBonus(21, 2, EnchantmentSlotType.WEAPON); - public static final Enchantment DIG_SPEED = new EnchantmentDigging(32, 10); - public static final Enchantment SILK_TOUCH = new EnchantmentSilkTouch(33, 1); - public static final Enchantment DURABILITY = new EnchantmentDurability(34, 5); - public static final Enchantment LOOT_BONUS_BLOCKS = new EnchantmentLootBonus(35, 2, EnchantmentSlotType.DIGGER); - public static final Enchantment ARROW_DAMAGE = new EnchantmentArrowDamage(48, 10); - public static final Enchantment ARROW_KNOCKBACK = new EnchantmentArrowKnockback(49, 2); - public static final Enchantment ARROW_FIRE = new EnchantmentFlameArrows(50, 2); - public static final Enchantment ARROW_INFINITE = new EnchantmentInfiniteArrows(51, 1); - public static final Enchantment LUCK = new EnchantmentLootBonus(61, 2, EnchantmentSlotType.FISHING_ROD); - public static final Enchantment LURE = new EnchantmentLure(62, 2, EnchantmentSlotType.FISHING_ROD); - public final int id; - private final int weight; - public EnchantmentSlotType slot; - protected String name; - - protected Enchantment(int i, int j, EnchantmentSlotType enchantmentslottype) { - this.id = i; - this.weight = j; - this.slot = enchantmentslottype; - if (byId[i] != null) { - throw new IllegalArgumentException("Duplicate enchantment id!"); - } else { - byId[i] = this; - } - - org.bukkit.enchantments.Enchantment.registerEnchantment(new org.bukkit.craftbukkit.enchantments.CraftEnchantment(this)); // CraftBukkit - } - - public int getRandomWeight() { - return this.weight; - } - - public int getStartLevel() { - return 1; - } - - public int getMaxLevel() { - return 1; - } - - public int a(int i) { - return 1 + i * 10; - } - - public int b(int i) { - return this.a(i) + 5; - } - - public int a(int i, DamageSource damagesource) { - return 0; - } - - public float a(int i, EnumMonsterType enummonstertype) { - return 0.0F; - } - - public boolean a(Enchantment enchantment) { - return this != enchantment; - } - - public Enchantment b(String s) { - this.name = s; - return this; - } - - public String a() { - return "enchantment." + this.name; - } - - public String c(int i) { - String s = LocaleI18n.get(this.a()); - - return s + " " + LocaleI18n.get("enchantment.level." + i); - } - - public boolean canEnchant(ItemStack itemstack) { - return this.slot.canEnchant(itemstack.getItem()); - } - - public void a(EntityLiving entityliving, Entity entity, int i) {} - - public void b(EntityLiving entityliving, Entity entity, int i) {} - - 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 deleted file mode 100644 index 09c9c8eebb..0000000000 --- a/src/main/java/net/minecraft/server/Entity.java +++ /dev/null @@ -1,1892 +0,0 @@ -package net.minecraft.server; - -import java.util.List; -import java.util.Random; -import java.util.UUID; -import java.util.concurrent.Callable; - -// CraftBukkit start -import org.bukkit.Bukkit; -import org.bukkit.Location; -import org.bukkit.Server; -import org.bukkit.TravelAgent; -import org.bukkit.block.BlockFace; -import org.bukkit.entity.Hanging; -import org.bukkit.entity.LivingEntity; -import org.bukkit.entity.Painting; -import org.bukkit.entity.Vehicle; -import org.bukkit.event.entity.EntityCombustByEntityEvent; -import org.bukkit.event.hanging.HangingBreakByEntityEvent; -import org.bukkit.event.painting.PaintingBreakByEntityEvent; -import org.bukkit.event.vehicle.VehicleBlockCollisionEvent; -import org.bukkit.event.vehicle.VehicleEnterEvent; -import org.bukkit.event.vehicle.VehicleExitEvent; -import org.bukkit.craftbukkit.CraftWorld; -import org.bukkit.craftbukkit.entity.CraftEntity; -import org.bukkit.craftbukkit.entity.CraftPlayer; -import org.bukkit.craftbukkit.event.CraftEventFactory; -import org.bukkit.event.entity.EntityCombustEvent; -import org.bukkit.event.entity.EntityPortalEvent; -import org.bukkit.plugin.PluginManager; -// CraftBukkit end - -public abstract class Entity { - - // CraftBukkit start - private static final int CURRENT_LEVEL = 2; - static boolean isLevelAtLeast(NBTTagCompound tag, int level) { - return tag.hasKey("Bukkit.updateLevel") && tag.getInt("Bukkit.updateLevel") >= level; - } - // CraftBukkit end - - private static int entityCount; - private int id; - public double j; - public boolean k; - public Entity passenger; - public Entity vehicle; - public boolean attachedToPlayer; - public World world; - public double lastX; - public double lastY; - public double lastZ; - public double locX; - public double locY; - public double locZ; - public double motX; - public double motY; - public double motZ; - public float yaw; - public float pitch; - public float lastYaw; - public float lastPitch; - public final AxisAlignedBB boundingBox; - public boolean onGround; - public boolean positionChanged; - public boolean F; - public boolean G; - public boolean velocityChanged; - protected boolean I; - public boolean J; - public boolean dead; - public float height; - public float width; - public float length; - public float O; - public float P; - public float Q; - public float fallDistance; - private int d; - public double S; - public double T; - public double U; - public float V; - public float W; - public boolean X; - public float Y; - public float Z; - protected Random random; - public int ticksLived; - public int maxFireTicks; - public int fireTicks; // CraftBukkit - private -> public - protected boolean inWater; - public int noDamageTicks; - private boolean justCreated; - protected boolean fireProof; - protected DataWatcher datawatcher; - private double g; - private double h; - public boolean ag; - public int ah; - public int ai; - public int aj; - public boolean ak; - public boolean al; - public int portalCooldown; - protected boolean an; - protected int ao; - public int dimension; - protected int aq; - private boolean invulnerable; - public UUID uniqueID; // CraftBukkit - protected -> public - public EnumEntitySize as; - public boolean valid; // CraftBukkit - public org.bukkit.projectiles.ProjectileSource projectileSource; // CraftBukkit - For projectiles only - - public int getId() { - return this.id; - } - - public void d(int i) { - this.id = i; - } - - public Entity(World world) { - this.id = entityCount++; - this.j = 1.0D; - this.boundingBox = AxisAlignedBB.a(0.0D, 0.0D, 0.0D, 0.0D, 0.0D, 0.0D); - this.J = true; - this.width = 0.6F; - this.length = 1.8F; - this.d = 1; - this.random = new Random(); - this.maxFireTicks = 1; - this.justCreated = true; - this.uniqueID = UUID.randomUUID(); - this.as = EnumEntitySize.SIZE_2; - this.world = world; - this.setPosition(0.0D, 0.0D, 0.0D); - if (world != null) { - this.dimension = world.worldProvider.dimension; - } - - this.datawatcher = new DataWatcher(this); - this.datawatcher.a(0, Byte.valueOf((byte) 0)); - this.datawatcher.a(1, Short.valueOf((short) 300)); - this.c(); - } - - protected abstract void c(); - - public DataWatcher getDataWatcher() { - return this.datawatcher; - } - - public boolean equals(Object object) { - return object instanceof Entity ? ((Entity) object).id == this.id : false; - } - - public int hashCode() { - return this.id; - } - - public void die() { - this.dead = true; - } - - protected void a(float f, float f1) { - float f2; - - if (f != this.width || f1 != this.length) { - f2 = this.width; - this.width = f; - this.length = f1; - this.boundingBox.d = this.boundingBox.a + (double) this.width; - this.boundingBox.f = this.boundingBox.c + (double) this.width; - this.boundingBox.e = this.boundingBox.b + (double) this.length; - if (this.width > f2 && !this.justCreated && !this.world.isStatic) { - this.move((double) (f2 - this.width), 0.0D, (double) (f2 - this.width)); - } - } - - f2 = f % 2.0F; - if ((double) f2 < 0.375D) { - this.as = EnumEntitySize.SIZE_1; - } else if ((double) f2 < 0.75D) { - this.as = EnumEntitySize.SIZE_2; - } else if ((double) f2 < 1.0D) { - this.as = EnumEntitySize.SIZE_3; - } else if ((double) f2 < 1.375D) { - this.as = EnumEntitySize.SIZE_4; - } else if ((double) f2 < 1.75D) { - this.as = EnumEntitySize.SIZE_5; - } else { - this.as = EnumEntitySize.SIZE_6; - } - } - - protected void b(float f, float f1) { - // CraftBukkit start - yaw was sometimes set to NaN, so we need to set it back to 0 - if (Float.isNaN(f)) { - f = 0; - } - - if ((f == Float.POSITIVE_INFINITY) || (f == Float.NEGATIVE_INFINITY)) { - if (this instanceof EntityPlayer) { - this.world.getServer().getLogger().warning(((CraftPlayer) this.getBukkitEntity()).getName() + " was caught trying to crash the server with an invalid yaw"); - ((CraftPlayer) this.getBukkitEntity()).kickPlayer("Nope"); - } - f = 0; - } - - // pitch was sometimes set to NaN, so we need to set it back to 0. - if (Float.isNaN(f1)) { - f1 = 0; - } - - if ((f1 == Float.POSITIVE_INFINITY) || (f1 == Float.NEGATIVE_INFINITY)) { - if (this instanceof EntityPlayer) { - this.world.getServer().getLogger().warning(((CraftPlayer) this.getBukkitEntity()).getName() + " was caught trying to crash the server with an invalid pitch"); - ((CraftPlayer) this.getBukkitEntity()).kickPlayer("Nope"); - } - f1 = 0; - } - // CraftBukkit end - - this.yaw = f % 360.0F; - this.pitch = f1 % 360.0F; - } - - public void setPosition(double d0, double d1, double d2) { - this.locX = d0; - this.locY = d1; - this.locZ = d2; - float f = this.width / 2.0F; - float f1 = this.length; - - this.boundingBox.b(d0 - (double) f, d1 - (double) this.height + (double) this.V, d2 - (double) f, d0 + (double) f, d1 - (double) this.height + (double) this.V + (double) f1, d2 + (double) f); - } - - public void h() { - this.C(); - } - - public void C() { - this.world.methodProfiler.a("entityBaseTick"); - if (this.vehicle != null && this.vehicle.dead) { - this.vehicle = null; - } - - this.O = this.P; - this.lastX = this.locX; - this.lastY = this.locY; - this.lastZ = this.locZ; - this.lastPitch = this.pitch; - this.lastYaw = this.yaw; - int i; - - if (!this.world.isStatic && this.world instanceof WorldServer) { - this.world.methodProfiler.a("portal"); - MinecraftServer minecraftserver = ((WorldServer) this.world).getMinecraftServer(); - - i = this.D(); - if (this.an) { - if (true || minecraftserver.getAllowNether()) { // CraftBukkit - if (this.vehicle == null && this.ao++ >= i) { - this.ao = i; - this.portalCooldown = this.ai(); - byte b0; - - if (this.world.worldProvider.dimension == -1) { - b0 = 0; - } else { - b0 = -1; - } - - this.b(b0); - } - - this.an = false; - } - } else { - if (this.ao > 0) { - this.ao -= 4; - } - - if (this.ao < 0) { - this.ao = 0; - } - } - - if (this.portalCooldown > 0) { - --this.portalCooldown; - } - - this.world.methodProfiler.b(); - } - - if (this.isSprinting() && !this.M()) { - int j = MathHelper.floor(this.locX); - - i = MathHelper.floor(this.locY - 0.20000000298023224D - (double) this.height); - int k = MathHelper.floor(this.locZ); - Block block = this.world.getType(j, i, k); - - if (block.getMaterial() != Material.AIR) { - this.world.addParticle("blockcrack_" + Block.getId(block) + "_" + this.world.getData(j, i, k), this.locX + ((double) this.random.nextFloat() - 0.5D) * (double) this.width, this.boundingBox.b + 0.1D, this.locZ + ((double) this.random.nextFloat() - 0.5D) * (double) this.width, -this.motX * 4.0D, 1.5D, -this.motZ * 4.0D); - } - } - - this.N(); - if (this.world.isStatic) { - this.fireTicks = 0; - } else if (this.fireTicks > 0) { - if (this.fireProof) { - this.fireTicks -= 4; - if (this.fireTicks < 0) { - this.fireTicks = 0; - } - } else { - if (this.fireTicks % 20 == 0) { - this.damageEntity(DamageSource.BURN, 1.0F); - } - - --this.fireTicks; - } - } - - if (this.P()) { - this.E(); - this.fallDistance *= 0.5F; - } - - if (this.locY < -64.0D) { - this.G(); - } - - if (!this.world.isStatic) { - this.a(0, this.fireTicks > 0); - } - - this.justCreated = false; - this.world.methodProfiler.b(); - } - - public int D() { - return 0; - } - - protected void E() { - if (!this.fireProof) { - this.damageEntity(DamageSource.LAVA, 4); - - // CraftBukkit start - Fallen in lava TODO: this event spams! - if (this instanceof EntityLiving) { - if (this.fireTicks <= 0) { - // not on fire yet - // TODO: shouldn't be sending null for the block. - org.bukkit.block.Block damager = null; // ((WorldServer) this.l).getWorld().getBlockAt(i, j, k); - org.bukkit.entity.Entity damagee = this.getBukkitEntity(); - EntityCombustEvent combustEvent = new org.bukkit.event.entity.EntityCombustByBlockEvent(damager, damagee, 15); - this.world.getServer().getPluginManager().callEvent(combustEvent); - - if (!combustEvent.isCancelled()) { - this.setOnFire(combustEvent.getDuration()); - } - } else { - // This will be called every single tick the entity is in lava, so don't throw an event - this.setOnFire(15); - } - return; - } - // CraftBukkit end - we also don't throw an event unless the object in lava is living, to save on some event calls - - this.setOnFire(15); - } - } - - public void setOnFire(int i) { - int j = i * 20; - - j = EnchantmentProtection.a(this, j); - if (this.fireTicks < j) { - this.fireTicks = j; - } - } - - public void extinguish() { - this.fireTicks = 0; - } - - protected void G() { - this.die(); - } - - public boolean c(double d0, double d1, double d2) { - AxisAlignedBB axisalignedbb = this.boundingBox.c(d0, d1, d2); - List list = this.world.getCubes(this, axisalignedbb); - - return !list.isEmpty() ? false : !this.world.containsLiquid(axisalignedbb); - } - - public void move(double d0, double d1, double d2) { - // CraftBukkit start - Don't do anything if we aren't moving - // We need to do this regardless of whether or not we are moving thanks to portals - try { - this.I(); - } catch (Throwable throwable) { - CrashReport crashreport = CrashReport.a(throwable, "Checking entity block collision"); - CrashReportSystemDetails crashreportsystemdetails = crashreport.a("Entity being checked for collision"); - - this.a(crashreportsystemdetails); - throw new ReportedException(crashreport); - } - // Check if we're moving - if (d0 == 0 && d1 == 0 && d2 == 0 && this.vehicle == null && this.passenger == null) { - return; - } - // CraftBukkit end - if (this.X) { - this.boundingBox.d(d0, d1, d2); - this.locX = (this.boundingBox.a + this.boundingBox.d) / 2.0D; - this.locY = this.boundingBox.b + (double) this.height - (double) this.V; - this.locZ = (this.boundingBox.c + this.boundingBox.f) / 2.0D; - } else { - this.world.methodProfiler.a("move"); - this.V *= 0.4F; - double d3 = this.locX; - double d4 = this.locY; - double d5 = this.locZ; - - if (this.I) { - this.I = false; - d0 *= 0.25D; - d1 *= 0.05000000074505806D; - d2 *= 0.25D; - this.motX = 0.0D; - this.motY = 0.0D; - this.motZ = 0.0D; - } - - double d6 = d0; - double d7 = d1; - double d8 = d2; - AxisAlignedBB axisalignedbb = this.boundingBox.clone(); - boolean flag = this.onGround && this.isSneaking() && this instanceof EntityHuman; - - if (flag) { - double d9; - - for (d9 = 0.05D; d0 != 0.0D && this.world.getCubes(this, this.boundingBox.c(d0, -1.0D, 0.0D)).isEmpty(); d6 = d0) { - if (d0 < d9 && d0 >= -d9) { - d0 = 0.0D; - } else if (d0 > 0.0D) { - d0 -= d9; - } else { - d0 += d9; - } - } - - for (; d2 != 0.0D && this.world.getCubes(this, this.boundingBox.c(0.0D, -1.0D, d2)).isEmpty(); d8 = d2) { - if (d2 < d9 && d2 >= -d9) { - d2 = 0.0D; - } else if (d2 > 0.0D) { - d2 -= d9; - } else { - d2 += d9; - } - } - - while (d0 != 0.0D && d2 != 0.0D && this.world.getCubes(this, this.boundingBox.c(d0, -1.0D, d2)).isEmpty()) { - if (d0 < d9 && d0 >= -d9) { - d0 = 0.0D; - } else if (d0 > 0.0D) { - d0 -= d9; - } else { - d0 += d9; - } - - if (d2 < d9 && d2 >= -d9) { - d2 = 0.0D; - } else if (d2 > 0.0D) { - d2 -= d9; - } else { - d2 += d9; - } - - d6 = d0; - d8 = d2; - } - } - - List list = this.world.getCubes(this, this.boundingBox.a(d0, d1, d2)); - - for (int i = 0; i < list.size(); ++i) { - d1 = ((AxisAlignedBB) list.get(i)).b(this.boundingBox, d1); - } - - this.boundingBox.d(0.0D, d1, 0.0D); - if (!this.J && d7 != d1) { - d2 = 0.0D; - d1 = 0.0D; - d0 = 0.0D; - } - - boolean flag1 = this.onGround || d7 != d1 && d7 < 0.0D; - - int j; - - for (j = 0; j < list.size(); ++j) { - d0 = ((AxisAlignedBB) list.get(j)).a(this.boundingBox, d0); - } - - this.boundingBox.d(d0, 0.0D, 0.0D); - if (!this.J && d6 != d0) { - d2 = 0.0D; - d1 = 0.0D; - d0 = 0.0D; - } - - for (j = 0; j < list.size(); ++j) { - d2 = ((AxisAlignedBB) list.get(j)).c(this.boundingBox, d2); - } - - this.boundingBox.d(0.0D, 0.0D, d2); - if (!this.J && d8 != d2) { - d2 = 0.0D; - d1 = 0.0D; - d0 = 0.0D; - } - - double d10; - double d11; - double d12; - int k; - - if (this.W > 0.0F && flag1 && (flag || this.V < 0.05F) && (d6 != d0 || d8 != d2)) { - d10 = d0; - d11 = d1; - d12 = d2; - d0 = d6; - d1 = (double) this.W; - d2 = d8; - AxisAlignedBB axisalignedbb1 = this.boundingBox.clone(); - - this.boundingBox.d(axisalignedbb); - list = this.world.getCubes(this, this.boundingBox.a(d6, d1, d8)); - - for (k = 0; k < list.size(); ++k) { - d1 = ((AxisAlignedBB) list.get(k)).b(this.boundingBox, d1); - } - - this.boundingBox.d(0.0D, d1, 0.0D); - if (!this.J && d7 != d1) { - d2 = 0.0D; - d1 = 0.0D; - d0 = 0.0D; - } - - for (k = 0; k < list.size(); ++k) { - d0 = ((AxisAlignedBB) list.get(k)).a(this.boundingBox, d0); - } - - this.boundingBox.d(d0, 0.0D, 0.0D); - if (!this.J && d6 != d0) { - d2 = 0.0D; - d1 = 0.0D; - d0 = 0.0D; - } - - for (k = 0; k < list.size(); ++k) { - d2 = ((AxisAlignedBB) list.get(k)).c(this.boundingBox, d2); - } - - this.boundingBox.d(0.0D, 0.0D, d2); - if (!this.J && d8 != d2) { - d2 = 0.0D; - d1 = 0.0D; - d0 = 0.0D; - } - - if (!this.J && d7 != d1) { - d2 = 0.0D; - d1 = 0.0D; - d0 = 0.0D; - } else { - d1 = (double) (-this.W); - - for (k = 0; k < list.size(); ++k) { - d1 = ((AxisAlignedBB) list.get(k)).b(this.boundingBox, d1); - } - - this.boundingBox.d(0.0D, d1, 0.0D); - } - - if (d10 * d10 + d12 * d12 >= d0 * d0 + d2 * d2) { - d0 = d10; - d1 = d11; - d2 = d12; - this.boundingBox.d(axisalignedbb1); - } - } - - this.world.methodProfiler.b(); - this.world.methodProfiler.a("rest"); - this.locX = (this.boundingBox.a + this.boundingBox.d) / 2.0D; - this.locY = this.boundingBox.b + (double) this.height - (double) this.V; - this.locZ = (this.boundingBox.c + this.boundingBox.f) / 2.0D; - this.positionChanged = d6 != d0 || d8 != d2; - this.F = d7 != d1; - this.onGround = d7 != d1 && d7 < 0.0D; - this.G = this.positionChanged || this.F; - this.a(d1, this.onGround); - if (d6 != d0) { - this.motX = 0.0D; - } - - if (d7 != d1) { - this.motY = 0.0D; - } - - if (d8 != d2) { - this.motZ = 0.0D; - } - - d10 = this.locX - d3; - d11 = this.locY - d4; - d12 = this.locZ - d5; - - // CraftBukkit start - if ((this.positionChanged) && (this.getBukkitEntity() instanceof Vehicle)) { - Vehicle vehicle = (Vehicle) this.getBukkitEntity(); - org.bukkit.block.Block block = this.world.getWorld().getBlockAt(MathHelper.floor(this.locX), MathHelper.floor(this.locY - (double) this.height), MathHelper.floor(this.locZ)); - - if (d6 > d0) { - block = block.getRelative(BlockFace.EAST); - } else if (d6 < d0) { - block = block.getRelative(BlockFace.WEST); - } else if (d8 > d2) { - block = block.getRelative(BlockFace.SOUTH); - } else if (d8 < d2) { - block = block.getRelative(BlockFace.NORTH); - } - - VehicleBlockCollisionEvent event = new VehicleBlockCollisionEvent(vehicle, block); - this.world.getServer().getPluginManager().callEvent(event); - } - // CraftBukkit end - - if (this.g_() && !flag && this.vehicle == null) { - int l = MathHelper.floor(this.locX); - - k = MathHelper.floor(this.locY - 0.20000000298023224D - (double) this.height); - int i1 = MathHelper.floor(this.locZ); - Block block = this.world.getType(l, k, i1); - int j1 = this.world.getType(l, k - 1, i1).b(); - - if (j1 == 11 || j1 == 32 || j1 == 21) { - block = this.world.getType(l, k - 1, i1); - } - - if (block != Blocks.LADDER) { - d11 = 0.0D; - } - - this.P = (float) ((double) this.P + (double) MathHelper.sqrt(d10 * d10 + d12 * d12) * 0.6D); - this.Q = (float) ((double) this.Q + (double) MathHelper.sqrt(d10 * d10 + d11 * d11 + d12 * d12) * 0.6D); - if (this.Q > (float) this.d && block.getMaterial() != Material.AIR) { - this.d = (int) this.Q + 1; - if (this.M()) { - float f = MathHelper.sqrt(this.motX * this.motX * 0.20000000298023224D + this.motY * this.motY + this.motZ * this.motZ * 0.20000000298023224D) * 0.35F; - - if (f > 1.0F) { - f = 1.0F; - } - - this.makeSound(this.H(), f, 1.0F + (this.random.nextFloat() - this.random.nextFloat()) * 0.4F); - } - - this.a(l, k, i1, block); - block.b(this.world, l, k, i1, this); - } - } - - // CraftBukkit start - Move to the top of the method - /* - try { - this.I(); - } catch (Throwable throwable) { - CrashReport crashreport = CrashReport.a(throwable, "Checking entity block collision"); - CrashReportSystemDetails crashreportsystemdetails = crashreport.a("Entity being checked for collision"); - - this.a(crashreportsystemdetails); - throw new ReportedException(crashreport); - } - */ - // CraftBukkit end - boolean flag2 = this.L(); - - if (this.world.e(this.boundingBox.shrink(0.001D, 0.001D, 0.001D))) { - this.burn(1); - if (!flag2) { - ++this.fireTicks; - // CraftBukkit start - Not on fire yet - if (this.fireTicks <= 0) { // Only throw events on the first combust, otherwise it spams - EntityCombustEvent event = new EntityCombustEvent(this.getBukkitEntity(), 8); - this.world.getServer().getPluginManager().callEvent(event); - - if (!event.isCancelled()) { - this.setOnFire(event.getDuration()); - } - } else { - // CraftBukkit end - this.setOnFire(8); - } - } - } else if (this.fireTicks <= 0) { - this.fireTicks = -this.maxFireTicks; - } - - if (flag2 && this.fireTicks > 0) { - this.makeSound("random.fizz", 0.7F, 1.6F + (this.random.nextFloat() - this.random.nextFloat()) * 0.4F); - this.fireTicks = -this.maxFireTicks; - } - - this.world.methodProfiler.b(); - } - } - - protected String H() { - return "game.neutral.swim"; - } - - protected void I() { - int i = MathHelper.floor(this.boundingBox.a + 0.001D); - int j = MathHelper.floor(this.boundingBox.b + 0.001D); - int k = MathHelper.floor(this.boundingBox.c + 0.001D); - int l = MathHelper.floor(this.boundingBox.d - 0.001D); - int i1 = MathHelper.floor(this.boundingBox.e - 0.001D); - int j1 = MathHelper.floor(this.boundingBox.f - 0.001D); - - if (this.world.b(i, j, k, l, i1, j1)) { - for (int k1 = i; k1 <= l; ++k1) { - for (int l1 = j; l1 <= i1; ++l1) { - for (int i2 = k; i2 <= j1; ++i2) { - Block block = this.world.getType(k1, l1, i2); - - try { - block.a(this.world, k1, l1, i2, this); - } catch (Throwable throwable) { - CrashReport crashreport = CrashReport.a(throwable, "Colliding entity with block"); - CrashReportSystemDetails crashreportsystemdetails = crashreport.a("Block being collided with"); - - CrashReportSystemDetails.a(crashreportsystemdetails, k1, l1, i2, block, this.world.getData(k1, l1, i2)); - throw new ReportedException(crashreport); - } - } - } - } - } - } - - protected void a(int i, int j, int k, Block block) { - StepSound stepsound = block.stepSound; - - if (this.world.getType(i, j + 1, k) == Blocks.SNOW) { - stepsound = Blocks.SNOW.stepSound; - this.makeSound(stepsound.getStepSound(), stepsound.getVolume1() * 0.15F, stepsound.getVolume2()); - } else if (!block.getMaterial().isLiquid()) { - this.makeSound(stepsound.getStepSound(), stepsound.getVolume1() * 0.15F, stepsound.getVolume2()); - } - } - - public void makeSound(String s, float f, float f1) { - this.world.makeSound(this, s, f, f1); - } - - protected boolean g_() { - return true; - } - - protected void a(double d0, boolean flag) { - if (flag) { - if (this.fallDistance > 0.0F) { - this.b(this.fallDistance); - this.fallDistance = 0.0F; - } - } else if (d0 < 0.0D) { - this.fallDistance = (float) ((double) this.fallDistance - d0); - } - } - - public AxisAlignedBB J() { - return null; - } - - protected void burn(float i) { // CraftBukkit - int -> float - if (!this.fireProof) { - this.damageEntity(DamageSource.FIRE, (float) i); - } - } - - public final boolean isFireproof() { - return this.fireProof; - } - - protected void b(float f) { - if (this.passenger != null) { - this.passenger.b(f); - } - } - - public boolean L() { - return this.inWater || this.world.isRainingAt(MathHelper.floor(this.locX), MathHelper.floor(this.locY), MathHelper.floor(this.locZ)) || this.world.isRainingAt(MathHelper.floor(this.locX), MathHelper.floor(this.locY + (double) this.length), MathHelper.floor(this.locZ)); - } - - public boolean M() { - return this.inWater; - } - - public boolean N() { - if (this.world.a(this.boundingBox.grow(0.0D, -0.4000000059604645D, 0.0D).shrink(0.001D, 0.001D, 0.001D), Material.WATER, this)) { - if (!this.inWater && !this.justCreated) { - float f = MathHelper.sqrt(this.motX * this.motX * 0.20000000298023224D + this.motY * this.motY + this.motZ * this.motZ * 0.20000000298023224D) * 0.2F; - - if (f > 1.0F) { - f = 1.0F; - } - - this.makeSound(this.O(), f, 1.0F + (this.random.nextFloat() - this.random.nextFloat()) * 0.4F); - float f1 = (float) MathHelper.floor(this.boundingBox.b); - - int i; - float f2; - float f3; - - for (i = 0; (float) i < 1.0F + this.width * 20.0F; ++i) { - f2 = (this.random.nextFloat() * 2.0F - 1.0F) * this.width; - f3 = (this.random.nextFloat() * 2.0F - 1.0F) * this.width; - this.world.addParticle("bubble", this.locX + (double) f2, (double) (f1 + 1.0F), this.locZ + (double) f3, this.motX, this.motY - (double) (this.random.nextFloat() * 0.2F), this.motZ); - } - - for (i = 0; (float) i < 1.0F + this.width * 20.0F; ++i) { - f2 = (this.random.nextFloat() * 2.0F - 1.0F) * this.width; - f3 = (this.random.nextFloat() * 2.0F - 1.0F) * this.width; - this.world.addParticle("splash", this.locX + (double) f2, (double) (f1 + 1.0F), this.locZ + (double) f3, this.motX, this.motY, this.motZ); - } - } - - this.fallDistance = 0.0F; - this.inWater = true; - this.fireTicks = 0; - } else { - this.inWater = false; - } - - return this.inWater; - } - - protected String O() { - return "game.neutral.swim.splash"; - } - - public boolean a(Material material) { - double d0 = this.locY + (double) this.getHeadHeight(); - int i = MathHelper.floor(this.locX); - int j = MathHelper.d((float) MathHelper.floor(d0)); - int k = MathHelper.floor(this.locZ); - Block block = this.world.getType(i, j, k); - - if (block.getMaterial() == material) { - float f = BlockFluids.b(this.world.getData(i, j, k)) - 0.11111111F; - float f1 = (float) (j + 1) - f; - - return d0 < (double) f1; - } else { - return false; - } - } - - public float getHeadHeight() { - return 0.0F; - } - - public boolean P() { - return this.world.a(this.boundingBox.grow(-0.10000000149011612D, -0.4000000059604645D, -0.10000000149011612D), Material.LAVA); - } - - public void a(float f, float f1, float f2) { - float f3 = f * f + f1 * f1; - - if (f3 >= 1.0E-4F) { - f3 = MathHelper.c(f3); - if (f3 < 1.0F) { - f3 = 1.0F; - } - - f3 = f2 / f3; - f *= f3; - f1 *= f3; - float f4 = MathHelper.sin(this.yaw * 3.1415927F / 180.0F); - float f5 = MathHelper.cos(this.yaw * 3.1415927F / 180.0F); - - this.motX += (double) (f * f5 - f1 * f4); - this.motZ += (double) (f1 * f5 + f * f4); - } - } - - public float d(float f) { - int i = MathHelper.floor(this.locX); - int j = MathHelper.floor(this.locZ); - - if (this.world.isLoaded(i, 0, j)) { - double d0 = (this.boundingBox.e - this.boundingBox.b) * 0.66D; - int k = MathHelper.floor(this.locY - (double) this.height + d0); - - return this.world.n(i, k, j); - } else { - return 0.0F; - } - } - - public void spawnIn(World world) { - // CraftBukkit start - if (world == null) { - this.die(); - this.world = ((CraftWorld) Bukkit.getServer().getWorlds().get(0)).getHandle(); - return; - } - // CraftBukkit end - - this.world = world; - } - - public void setLocation(double d0, double d1, double d2, float f, float f1) { - this.lastX = this.locX = d0; - this.lastY = this.locY = d1; - this.lastZ = this.locZ = d2; - this.lastYaw = this.yaw = f; - this.lastPitch = this.pitch = f1; - this.V = 0.0F; - double d3 = (double) (this.lastYaw - f); - - if (d3 < -180.0D) { - this.lastYaw += 360.0F; - } - - if (d3 >= 180.0D) { - this.lastYaw -= 360.0F; - } - - this.setPosition(this.locX, this.locY, this.locZ); - this.b(f, f1); - } - - public void setPositionRotation(double d0, double d1, double d2, float f, float f1) { - this.S = this.lastX = this.locX = d0; - this.T = this.lastY = this.locY = d1 + (double) this.height; - this.U = this.lastZ = this.locZ = d2; - this.yaw = f; - this.pitch = f1; - this.setPosition(this.locX, this.locY, this.locZ); - } - - public float e(Entity entity) { - float f = (float) (this.locX - entity.locX); - float f1 = (float) (this.locY - entity.locY); - float f2 = (float) (this.locZ - entity.locZ); - - return MathHelper.c(f * f + f1 * f1 + f2 * f2); - } - - public double e(double d0, double d1, double d2) { - double d3 = this.locX - d0; - double d4 = this.locY - d1; - double d5 = this.locZ - d2; - - return d3 * d3 + d4 * d4 + d5 * d5; - } - - public double f(double d0, double d1, double d2) { - double d3 = this.locX - d0; - double d4 = this.locY - d1; - double d5 = this.locZ - d2; - - return (double) MathHelper.sqrt(d3 * d3 + d4 * d4 + d5 * d5); - } - - public double f(Entity entity) { - double d0 = this.locX - entity.locX; - double d1 = this.locY - entity.locY; - double d2 = this.locZ - entity.locZ; - - return d0 * d0 + d1 * d1 + d2 * d2; - } - - public void b_(EntityHuman entityhuman) {} - - public void collide(Entity entity) { - if (entity.passenger != this && entity.vehicle != this) { - double d0 = entity.locX - this.locX; - double d1 = entity.locZ - this.locZ; - double d2 = MathHelper.a(d0, d1); - - if (d2 >= 0.009999999776482582D) { - d2 = (double) MathHelper.sqrt(d2); - d0 /= d2; - d1 /= d2; - double d3 = 1.0D / d2; - - if (d3 > 1.0D) { - d3 = 1.0D; - } - - d0 *= d3; - d1 *= d3; - d0 *= 0.05000000074505806D; - d1 *= 0.05000000074505806D; - d0 *= (double) (1.0F - this.Y); - d1 *= (double) (1.0F - this.Y); - this.g(-d0, 0.0D, -d1); - entity.g(d0, 0.0D, d1); - } - } - } - - public void g(double d0, double d1, double d2) { - this.motX += d0; - this.motY += d1; - this.motZ += d2; - this.al = true; - } - - protected void Q() { - this.velocityChanged = true; - } - - public boolean damageEntity(DamageSource damagesource, float f) { - if (this.isInvulnerable()) { - return false; - } else { - this.Q(); - return false; - } - } - - public boolean R() { - return false; - } - - public boolean S() { - return false; - } - - public void b(Entity entity, int i) {} - - public boolean c(NBTTagCompound nbttagcompound) { - String s = this.W(); - - if (!this.dead && s != null) { - nbttagcompound.setString("id", s); - this.e(nbttagcompound); - return true; - } else { - return false; - } - } - - public boolean d(NBTTagCompound nbttagcompound) { - String s = this.W(); - - if (!this.dead && s != null && this.passenger == null) { - nbttagcompound.setString("id", s); - this.e(nbttagcompound); - return true; - } else { - return false; - } - } - - public void e(NBTTagCompound nbttagcompound) { - try { - nbttagcompound.set("Pos", this.a(new double[] { this.locX, this.locY + (double) this.V, this.locZ})); - nbttagcompound.set("Motion", this.a(new double[] { this.motX, this.motY, this.motZ})); - - // CraftBukkit start - Checking for NaN pitch/yaw and resetting to zero - // TODO: make sure this is the best way to address this. - if (Float.isNaN(this.yaw)) { - this.yaw = 0; - } - - if (Float.isNaN(this.pitch)) { - this.pitch = 0; - } - // CraftBukkit end - - nbttagcompound.set("Rotation", this.a(new float[] { this.yaw, this.pitch})); - nbttagcompound.setFloat("FallDistance", this.fallDistance); - nbttagcompound.setShort("Fire", (short) this.fireTicks); - nbttagcompound.setShort("Air", (short) this.getAirTicks()); - nbttagcompound.setBoolean("OnGround", this.onGround); - nbttagcompound.setInt("Dimension", this.dimension); - nbttagcompound.setBoolean("Invulnerable", this.invulnerable); - nbttagcompound.setInt("PortalCooldown", this.portalCooldown); - nbttagcompound.setLong("UUIDMost", this.getUniqueID().getMostSignificantBits()); - nbttagcompound.setLong("UUIDLeast", this.getUniqueID().getLeastSignificantBits()); - // CraftBukkit start - nbttagcompound.setLong("WorldUUIDLeast", this.world.getDataManager().getUUID().getLeastSignificantBits()); - nbttagcompound.setLong("WorldUUIDMost", this.world.getDataManager().getUUID().getMostSignificantBits()); - nbttagcompound.setInt("Bukkit.updateLevel", CURRENT_LEVEL); - // CraftBukkit end - this.b(nbttagcompound); - if (this.vehicle != null) { - NBTTagCompound nbttagcompound1 = new NBTTagCompound(); - - if (this.vehicle.c(nbttagcompound1)) { - nbttagcompound.set("Riding", nbttagcompound1); - } - } - } catch (Throwable throwable) { - CrashReport crashreport = CrashReport.a(throwable, "Saving entity NBT"); - CrashReportSystemDetails crashreportsystemdetails = crashreport.a("Entity being saved"); - - this.a(crashreportsystemdetails); - throw new ReportedException(crashreport); - } - } - - public void f(NBTTagCompound nbttagcompound) { - try { - NBTTagList nbttaglist = nbttagcompound.getList("Pos", 6); - NBTTagList nbttaglist1 = nbttagcompound.getList("Motion", 6); - NBTTagList nbttaglist2 = nbttagcompound.getList("Rotation", 5); - - this.motX = nbttaglist1.d(0); - this.motY = nbttaglist1.d(1); - this.motZ = nbttaglist1.d(2); - /* CraftBukkit start - Moved section down - if (Math.abs(this.motX) > 10.0D) { - this.motX = 0.0D; - } - - if (Math.abs(this.motY) > 10.0D) { - this.motY = 0.0D; - } - - if (Math.abs(this.motZ) > 10.0D) { - this.motZ = 0.0D; - } - // CraftBukkit end */ - - this.lastX = this.S = this.locX = nbttaglist.d(0); - this.lastY = this.T = this.locY = nbttaglist.d(1); - this.lastZ = this.U = this.locZ = nbttaglist.d(2); - this.lastYaw = this.yaw = nbttaglist2.e(0); - this.lastPitch = this.pitch = nbttaglist2.e(1); - this.fallDistance = nbttagcompound.getFloat("FallDistance"); - this.fireTicks = nbttagcompound.getShort("Fire"); - this.setAirTicks(nbttagcompound.getShort("Air")); - this.onGround = nbttagcompound.getBoolean("OnGround"); - this.dimension = nbttagcompound.getInt("Dimension"); - this.invulnerable = nbttagcompound.getBoolean("Invulnerable"); - this.portalCooldown = nbttagcompound.getInt("PortalCooldown"); - if (nbttagcompound.hasKeyOfType("UUIDMost", 4) && nbttagcompound.hasKeyOfType("UUIDLeast", 4)) { - this.uniqueID = new UUID(nbttagcompound.getLong("UUIDMost"), nbttagcompound.getLong("UUIDLeast")); - } - - this.setPosition(this.locX, this.locY, this.locZ); - this.b(this.yaw, this.pitch); - this.a(nbttagcompound); - if (this.V()) { - this.setPosition(this.locX, this.locY, this.locZ); - } - - // CraftBukkit start - if (this instanceof EntityLiving) { - EntityLiving entity = (EntityLiving) this; - - // Reset the persistence for tamed animals - if (entity instanceof EntityTameableAnimal && !isLevelAtLeast(nbttagcompound, 2) && !nbttagcompound.getBoolean("PersistenceRequired")) { - EntityInsentient entityinsentient = (EntityInsentient) entity; - entityinsentient.persistent = !entityinsentient.isTypeNotPersistent(); - } - } - // CraftBukkit end - - // CraftBukkit start - Exempt Vehicles from notch's sanity check - if (!(this.getBukkitEntity() instanceof Vehicle)) { - if (Math.abs(this.motX) > 10.0D) { - this.motX = 0.0D; - } - - if (Math.abs(this.motY) > 10.0D) { - this.motY = 0.0D; - } - - if (Math.abs(this.motZ) > 10.0D) { - this.motZ = 0.0D; - } - } - // CraftBukkit end - - // CraftBukkit start - Reset world - if (this instanceof EntityPlayer) { - Server server = Bukkit.getServer(); - org.bukkit.World bworld = null; - - // TODO: Remove World related checks, replaced with WorldUID. - String worldName = nbttagcompound.getString("World"); - - if (nbttagcompound.hasKey("WorldUUIDMost") && nbttagcompound.hasKey("WorldUUIDLeast")) { - UUID uid = new UUID(nbttagcompound.getLong("WorldUUIDMost"), nbttagcompound.getLong("WorldUUIDLeast")); - bworld = server.getWorld(uid); - } else { - bworld = server.getWorld(worldName); - } - - if (bworld == null) { - EntityPlayer entityPlayer = (EntityPlayer) this; - bworld = ((org.bukkit.craftbukkit.CraftServer) server).getServer().getWorldServer(entityPlayer.dimension).getWorld(); - } - - this.spawnIn(bworld == null ? null : ((CraftWorld) bworld).getHandle()); - } - // CraftBukkit end - } catch (Throwable throwable) { - CrashReport crashreport = CrashReport.a(throwable, "Loading entity NBT"); - CrashReportSystemDetails crashreportsystemdetails = crashreport.a("Entity being loaded"); - - this.a(crashreportsystemdetails); - throw new ReportedException(crashreport); - } - } - - protected boolean V() { - return true; - } - - protected final String W() { - return EntityTypes.b(this); - } - - protected abstract void a(NBTTagCompound nbttagcompound); - - protected abstract void b(NBTTagCompound nbttagcompound); - - public void X() {} - - protected NBTTagList a(double... adouble) { - NBTTagList nbttaglist = new NBTTagList(); - double[] adouble1 = adouble; - int i = adouble.length; - - for (int j = 0; j < i; ++j) { - double d0 = adouble1[j]; - - nbttaglist.add(new NBTTagDouble(d0)); - } - - return nbttaglist; - } - - protected NBTTagList a(float... afloat) { - NBTTagList nbttaglist = new NBTTagList(); - float[] afloat1 = afloat; - int i = afloat.length; - - for (int j = 0; j < i; ++j) { - float f = afloat1[j]; - - nbttaglist.add(new NBTTagFloat(f)); - } - - return nbttaglist; - } - - public EntityItem a(Item item, int i) { - return this.a(item, i, 0.0F); - } - - public EntityItem a(Item item, int i, float f) { - return this.a(new ItemStack(item, i, 0), f); - } - - public EntityItem a(ItemStack itemstack, float f) { - if (itemstack.count != 0 && itemstack.getItem() != null) { - // CraftBukkit start - Capture drops for death event - if (this instanceof EntityLiving && ((EntityLiving) this).drops != null) { - ((EntityLiving) this).drops.add(org.bukkit.craftbukkit.inventory.CraftItemStack.asBukkitCopy(itemstack)); - return null; - } - // CraftBukkit end - - EntityItem entityitem = new EntityItem(this.world, this.locX, this.locY + (double) f, this.locZ, itemstack); - - entityitem.pickupDelay = 10; - this.world.addEntity(entityitem); - return entityitem; - } else { - return null; - } - } - - public boolean isAlive() { - return !this.dead; - } - - public boolean inBlock() { - for (int i = 0; i < 8; ++i) { - float f = ((float) ((i >> 0) % 2) - 0.5F) * this.width * 0.8F; - float f1 = ((float) ((i >> 1) % 2) - 0.5F) * 0.1F; - float f2 = ((float) ((i >> 2) % 2) - 0.5F) * this.width * 0.8F; - int j = MathHelper.floor(this.locX + (double) f); - int k = MathHelper.floor(this.locY + (double) this.getHeadHeight() + (double) f1); - int l = MathHelper.floor(this.locZ + (double) f2); - - if (this.world.getType(j, k, l).r()) { - return true; - } - } - - return false; - } - - public boolean c(EntityHuman entityhuman) { - return false; - } - - public AxisAlignedBB h(Entity entity) { - return null; - } - - public void ab() { - if (this.vehicle.dead) { - this.vehicle = null; - } else { - this.motX = 0.0D; - this.motY = 0.0D; - this.motZ = 0.0D; - this.h(); - if (this.vehicle != null) { - this.vehicle.ac(); - this.h += (double) (this.vehicle.yaw - this.vehicle.lastYaw); - - for (this.g += (double) (this.vehicle.pitch - this.vehicle.lastPitch); this.h >= 180.0D; this.h -= 360.0D) { - ; - } - - while (this.h < -180.0D) { - this.h += 360.0D; - } - - while (this.g >= 180.0D) { - this.g -= 360.0D; - } - - while (this.g < -180.0D) { - this.g += 360.0D; - } - - double d0 = this.h * 0.5D; - double d1 = this.g * 0.5D; - float f = 10.0F; - - if (d0 > (double) f) { - d0 = (double) f; - } - - if (d0 < (double) (-f)) { - d0 = (double) (-f); - } - - if (d1 > (double) f) { - d1 = (double) f; - } - - if (d1 < (double) (-f)) { - d1 = (double) (-f); - } - - this.h -= d0; - this.g -= d1; - } - } - } - - public void ac() { - if (this.passenger != null) { - this.passenger.setPosition(this.locX, this.locY + this.ad() + this.passenger.ad(), this.locZ); - } - } - - public double ad() { - return (double) this.height; - } - - public double ae() { - return (double) this.length * 0.75D; - } - - public void mount(Entity entity) { - // CraftBukkit start - this.setPassengerOf(entity); - } - - protected CraftEntity bukkitEntity; - - public CraftEntity getBukkitEntity() { - if (this.bukkitEntity == null) { - this.bukkitEntity = CraftEntity.getEntity(this.world.getServer(), this); - } - return this.bukkitEntity; - } - - public void setPassengerOf(Entity entity) { - // b(null) doesn't really fly for overloaded methods, - // so this method is needed - - Entity originalVehicle = this.vehicle; - Entity originalPassenger = this.vehicle == null ? null : this.vehicle.passenger; - PluginManager pluginManager = Bukkit.getPluginManager(); - this.getBukkitEntity(); // make sure bukkitEntity is initialised - // CraftBukkit end - this.g = 0.0D; - this.h = 0.0D; - if (entity == null) { - if (this.vehicle != null) { - // CraftBukkit start - if ((this.bukkitEntity instanceof LivingEntity) && (this.vehicle.getBukkitEntity() instanceof Vehicle)) { - VehicleExitEvent event = new VehicleExitEvent((Vehicle) this.vehicle.getBukkitEntity(), (LivingEntity) this.bukkitEntity); - pluginManager.callEvent(event); - - if (event.isCancelled() || this.vehicle != originalVehicle) { - return; - } - } - // CraftBukkit end - - this.setPositionRotation(this.vehicle.locX, this.vehicle.boundingBox.b + (double) this.vehicle.length, this.vehicle.locZ, this.yaw, this.pitch); - this.vehicle.passenger = null; - } - - this.vehicle = null; - } else { - // CraftBukkit start - if ((this.bukkitEntity instanceof LivingEntity) && (entity.getBukkitEntity() instanceof Vehicle) && entity.world.isChunkLoaded((int) entity.locX >> 4, (int) entity.locZ >> 4)) { - // It's possible to move from one vehicle to another. We need to check if they're already in a vehicle, and fire an exit event if they are. - VehicleExitEvent exitEvent = null; - if (this.vehicle != null && this.vehicle.getBukkitEntity() instanceof Vehicle) { - exitEvent = new VehicleExitEvent((Vehicle) this.vehicle.getBukkitEntity(), (LivingEntity) this.bukkitEntity); - pluginManager.callEvent(exitEvent); - - if (exitEvent.isCancelled() || this.vehicle != originalVehicle || (this.vehicle != null && this.vehicle.passenger != originalPassenger)) { - return; - } - } - - VehicleEnterEvent event = new VehicleEnterEvent((Vehicle) entity.getBukkitEntity(), this.bukkitEntity); - pluginManager.callEvent(event); - - // If a plugin messes with the vehicle or the vehicle's passenger - if (event.isCancelled() || this.vehicle != originalVehicle || (this.vehicle != null && this.vehicle.passenger != originalPassenger)) { - // If we only cancelled the enterevent then we need to put the player in a decent position. - if (exitEvent != null && this.vehicle == originalVehicle && this.vehicle != null && this.vehicle.passenger == originalPassenger) { - this.setPositionRotation(this.vehicle.locX, this.vehicle.boundingBox.b + (double) this.vehicle.length, this.vehicle.locZ, this.yaw, this.pitch); - this.vehicle.passenger = null; - this.vehicle = null; - } - return; - } - } - // CraftBukkit end - - if (this.vehicle != null) { - this.vehicle.passenger = null; - } - - if (entity != null) { - for (Entity entity1 = entity.vehicle; entity1 != null; entity1 = entity1.vehicle) { - if (entity1 == this) { - return; - } - } - } - - this.vehicle = entity; - entity.passenger = this; - } - } - - public float af() { - return 0.1F; - } - - public Vec3D ag() { - return null; - } - - public void ah() { - if (this.portalCooldown > 0) { - this.portalCooldown = this.ai(); - } else { - double d0 = this.lastX - this.locX; - double d1 = this.lastZ - this.locZ; - - if (!this.world.isStatic && !this.an) { - this.aq = Direction.a(d0, d1); - } - - this.an = true; - } - } - - public int ai() { - return 300; - } - - public ItemStack[] getEquipment() { - return null; - } - - public void setEquipment(int i, ItemStack itemstack) {} - - public boolean isBurning() { - boolean flag = this.world != null && this.world.isStatic; - - return !this.fireProof && (this.fireTicks > 0 || flag && this.g(0)); - } - - public boolean am() { - return this.vehicle != null; - } - - public boolean isSneaking() { - return this.g(1); - } - - public void setSneaking(boolean flag) { - this.a(1, flag); - } - - public boolean isSprinting() { - return this.g(3); - } - - public void setSprinting(boolean flag) { - this.a(3, flag); - } - - public boolean isInvisible() { - return this.g(5); - } - - public void setInvisible(boolean flag) { - this.a(5, flag); - } - - public void e(boolean flag) { - this.a(4, flag); - } - - protected boolean g(int i) { - return (this.datawatcher.getByte(0) & 1 << i) != 0; - } - - protected void a(int i, boolean flag) { - byte b0 = this.datawatcher.getByte(0); - - if (flag) { - this.datawatcher.watch(0, Byte.valueOf((byte) (b0 | 1 << i))); - } else { - this.datawatcher.watch(0, Byte.valueOf((byte) (b0 & ~(1 << i)))); - } - } - - public int getAirTicks() { - return this.datawatcher.getShort(1); - } - - public void setAirTicks(int i) { - this.datawatcher.watch(1, Short.valueOf((short) i)); - } - - public void a(EntityLightning entitylightning) { - // CraftBukkit start - final org.bukkit.entity.Entity thisBukkitEntity = this.getBukkitEntity(); - final org.bukkit.entity.Entity stormBukkitEntity = entitylightning.getBukkitEntity(); - final PluginManager pluginManager = Bukkit.getPluginManager(); - - if (thisBukkitEntity instanceof Hanging) { - HangingBreakByEntityEvent hangingEvent = new HangingBreakByEntityEvent((Hanging) thisBukkitEntity, stormBukkitEntity); - PaintingBreakByEntityEvent paintingEvent = null; - - if (thisBukkitEntity instanceof Painting) { - paintingEvent = new PaintingBreakByEntityEvent((Painting) thisBukkitEntity, stormBukkitEntity); - } - - pluginManager.callEvent(hangingEvent); - - if (paintingEvent != null) { - paintingEvent.setCancelled(hangingEvent.isCancelled()); - pluginManager.callEvent(paintingEvent); - } - - if (hangingEvent.isCancelled() || (paintingEvent != null && paintingEvent.isCancelled())) { - return; - } - } - - if (this.fireProof) { - return; - } - CraftEventFactory.entityDamage = entitylightning; - if (!this.damageEntity(DamageSource.FIRE, 5.0F)) { - CraftEventFactory.entityDamage = null; - return; - } - // CraftBukkit end - - ++this.fireTicks; - if (this.fireTicks == 0) { - // CraftBukkit start - Call a combust event when lightning strikes - EntityCombustByEntityEvent entityCombustEvent = new EntityCombustByEntityEvent(stormBukkitEntity, thisBukkitEntity, 8); - pluginManager.callEvent(entityCombustEvent); - if (!entityCombustEvent.isCancelled()) { - this.setOnFire(entityCombustEvent.getDuration()); - } - // CraftBukkit end - } - } - - public void a(EntityLiving entityliving) {} - - protected boolean j(double d0, double d1, double d2) { - int i = MathHelper.floor(d0); - int j = MathHelper.floor(d1); - int k = MathHelper.floor(d2); - double d3 = d0 - (double) i; - double d4 = d1 - (double) j; - double d5 = d2 - (double) k; - List list = this.world.a(this.boundingBox); - - if (list.isEmpty() && !this.world.q(i, j, k)) { - return false; - } else { - boolean flag = !this.world.q(i - 1, j, k); - boolean flag1 = !this.world.q(i + 1, j, k); - boolean flag2 = !this.world.q(i, j - 1, k); - boolean flag3 = !this.world.q(i, j + 1, k); - boolean flag4 = !this.world.q(i, j, k - 1); - boolean flag5 = !this.world.q(i, j, k + 1); - byte b0 = 3; - double d6 = 9999.0D; - - if (flag && d3 < d6) { - d6 = d3; - b0 = 0; - } - - if (flag1 && 1.0D - d3 < d6) { - d6 = 1.0D - d3; - b0 = 1; - } - - if (flag3 && 1.0D - d4 < d6) { - d6 = 1.0D - d4; - b0 = 3; - } - - if (flag4 && d5 < d6) { - d6 = d5; - b0 = 4; - } - - if (flag5 && 1.0D - d5 < d6) { - d6 = 1.0D - d5; - b0 = 5; - } - - float f = this.random.nextFloat() * 0.2F + 0.1F; - - if (b0 == 0) { - this.motX = (double) (-f); - } - - if (b0 == 1) { - this.motX = (double) f; - } - - if (b0 == 2) { - this.motY = (double) (-f); - } - - if (b0 == 3) { - this.motY = (double) f; - } - - if (b0 == 4) { - this.motZ = (double) (-f); - } - - if (b0 == 5) { - this.motZ = (double) f; - } - - return true; - } - } - - public void as() { - this.I = true; - this.fallDistance = 0.0F; - } - - public String getName() { - String s = EntityTypes.b(this); - - if (s == null) { - s = "generic"; - } - - return LocaleI18n.get("entity." + s + ".name"); - } - - public Entity[] at() { - return null; - } - - public boolean i(Entity entity) { - return this == entity; - } - - public float getHeadRotation() { - return 0.0F; - } - - public boolean av() { - return true; - } - - public boolean j(Entity entity) { - return false; - } - - public String toString() { - return String.format("%s[\'%s\'/%d, l=\'%s\', x=%.2f, y=%.2f, z=%.2f]", new Object[] { this.getClass().getSimpleName(), this.getName(), Integer.valueOf(this.id), this.world == null ? "~NULL~" : this.world.getWorldData().getName(), Double.valueOf(this.locX), Double.valueOf(this.locY), Double.valueOf(this.locZ)}); - } - - public boolean isInvulnerable() { - return this.invulnerable; - } - - public void k(Entity entity) { - this.setPositionRotation(entity.locX, entity.locY, entity.locZ, entity.yaw, entity.pitch); - } - - public void a(Entity entity, boolean flag) { - NBTTagCompound nbttagcompound = new NBTTagCompound(); - - entity.e(nbttagcompound); - this.f(nbttagcompound); - this.portalCooldown = entity.portalCooldown; - this.aq = entity.aq; - } - - public void b(int i) { - if (!this.world.isStatic && !this.dead) { - this.world.methodProfiler.a("changeDimension"); - MinecraftServer minecraftserver = MinecraftServer.getServer(); - // CraftBukkit start - Move logic into new function "teleportToLocation" - // int j = this.dimension; - WorldServer exitWorld = null; - if (this.dimension < CraftWorld.CUSTOM_DIMENSION_OFFSET) { // Plugins must specify exit from custom Bukkit worlds - // Only target existing worlds (compensate for allow-nether/allow-end as false) - for (WorldServer world : minecraftserver.worlds) { - if (world.dimension == i) { - exitWorld = world; - } - } - } - - Location enter = this.getBukkitEntity().getLocation(); - Location exit = exitWorld != null ? minecraftserver.getPlayerList().calculateTarget(enter, minecraftserver.getWorldServer(i)) : null; - boolean useTravelAgent = exitWorld != null && !(this.dimension == 1 && exitWorld.dimension == 1); // don't use agent for custom worlds or return from THE_END - - TravelAgent agent = exit != null ? (TravelAgent) ((CraftWorld) exit.getWorld()).getHandle().getTravelAgent() : org.bukkit.craftbukkit.CraftTravelAgent.DEFAULT; // return arbitrary TA to compensate for implementation dependent plugins - EntityPortalEvent event = new EntityPortalEvent(this.getBukkitEntity(), enter, exit, agent); - event.useTravelAgent(useTravelAgent); - event.getEntity().getServer().getPluginManager().callEvent(event); - if (event.isCancelled() || event.getTo() == null || event.getTo().getWorld() == null || !this.isAlive()) { - return; - } - exit = event.useTravelAgent() ? event.getPortalTravelAgent().findOrCreate(event.getTo()) : event.getTo(); - this.teleportTo(exit, true); - } - } - - public void teleportTo(Location exit, boolean portal) { - if (true) { - WorldServer worldserver = ((CraftWorld) this.getBukkitEntity().getLocation().getWorld()).getHandle(); - WorldServer worldserver1 = ((CraftWorld) exit.getWorld()).getHandle(); - int i = worldserver1.dimension; - // CraftBukkit end - - this.dimension = i; - /* CraftBukkit start - TODO: Check if we need this - if (j == 1 && i == 1) { - worldserver1 = minecraftserver.getWorldServer(0); - this.dimension = 0; - } - // CraftBukkit end */ - - this.world.kill(this); - this.dead = false; - this.world.methodProfiler.a("reposition"); - // CraftBukkit start - Ensure chunks are loaded in case TravelAgent is not used which would initially cause chunks to load during find/create - // minecraftserver.getPlayerList().a(this, j, worldserver, worldserver1); - boolean before = worldserver1.chunkProviderServer.forceChunkLoad; - worldserver1.chunkProviderServer.forceChunkLoad = true; - worldserver1.getMinecraftServer().getPlayerList().repositionEntity(this, exit, portal); - worldserver1.chunkProviderServer.forceChunkLoad = before; - // CraftBukkit end - this.world.methodProfiler.c("reloading"); - Entity entity = EntityTypes.createEntityByName(EntityTypes.b(this), worldserver1); - - if (entity != null) { - entity.a(this, true); - /* CraftBukkit start - We need to do this... - if (j == 1 && i == 1) { - ChunkCoordinates chunkcoordinates = worldserver1.getSpawn(); - - chunkcoordinates.y = this.world.i(chunkcoordinates.x, chunkcoordinates.z); - entity.setPositionRotation((double) chunkcoordinates.x, (double) chunkcoordinates.y, (double) chunkcoordinates.z, entity.yaw, entity.pitch); - } - // CraftBukkit end */ - worldserver1.addEntity(entity); - // CraftBukkit start - Forward the CraftEntity to the new entity - this.getBukkitEntity().setHandle(entity); - entity.bukkitEntity = this.getBukkitEntity(); - // CraftBukkit end - } - - this.dead = true; - this.world.methodProfiler.b(); - worldserver.i(); - worldserver1.i(); - this.world.methodProfiler.b(); - } - } - - public float a(Explosion explosion, World world, int i, int j, int k, Block block) { - return block.a(this); - } - - public boolean a(Explosion explosion, World world, int i, int j, int k, Block block, float f) { - return true; - } - - public int ax() { - return 3; - } - - public int ay() { - return this.aq; - } - - public boolean az() { - return false; - } - - public void a(CrashReportSystemDetails crashreportsystemdetails) { - crashreportsystemdetails.a("Entity Type", (Callable) (new CrashReportEntityType(this))); - crashreportsystemdetails.a("Entity ID", Integer.valueOf(this.id)); - crashreportsystemdetails.a("Entity Name", (Callable) (new CrashReportEntityName(this))); - crashreportsystemdetails.a("Entity\'s Exact location", String.format("%.2f, %.2f, %.2f", new Object[] { Double.valueOf(this.locX), Double.valueOf(this.locY), Double.valueOf(this.locZ)})); - crashreportsystemdetails.a("Entity\'s Block location", CrashReportSystemDetails.a(MathHelper.floor(this.locX), MathHelper.floor(this.locY), MathHelper.floor(this.locZ))); - crashreportsystemdetails.a("Entity\'s Momentum", String.format("%.2f, %.2f, %.2f", new Object[] { Double.valueOf(this.motX), Double.valueOf(this.motY), Double.valueOf(this.motZ)})); - } - - public UUID getUniqueID() { - return this.uniqueID; - } - - public boolean aC() { - return true; - } - - public IChatBaseComponent getScoreboardDisplayName() { - return new ChatComponentText(this.getName()); - } - - public void i(int i) {} -} diff --git a/src/main/java/net/minecraft/server/EntityAgeable.java b/src/main/java/net/minecraft/server/EntityAgeable.java deleted file mode 100644 index 36ed831685..0000000000 --- a/src/main/java/net/minecraft/server/EntityAgeable.java +++ /dev/null @@ -1,124 +0,0 @@ -package net.minecraft.server; - -public abstract class EntityAgeable extends EntityCreature { - - private float bp = -1.0F; - private float bq; - public boolean ageLocked = false; // CraftBukkit - - public EntityAgeable(World world) { - super(world); - } - - public abstract EntityAgeable createChild(EntityAgeable entityageable); - - public boolean a(EntityHuman entityhuman) { - ItemStack itemstack = entityhuman.inventory.getItemInHand(); - - if (itemstack != null && itemstack.getItem() == Items.MONSTER_EGG) { - if (!this.world.isStatic) { - Class oclass = EntityTypes.a(itemstack.getData()); - - if (oclass != null && oclass.isAssignableFrom(this.getClass())) { - EntityAgeable entityageable = this.createChild(this); - - if (entityageable != null) { - 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 - if (itemstack.hasName()) { - entityageable.setCustomName(itemstack.getName()); - } - - if (!entityhuman.abilities.canInstantlyBuild) { - --itemstack.count; - if (itemstack.count == 0) { // CraftBukkit - allow less than 0 stacks as "infinite" - entityhuman.inventory.setItem(entityhuman.inventory.itemInHandIndex, (ItemStack) null); - } - } - } - } - } - - return true; - } else { - return false; - } - } - - protected void c() { - super.c(); - this.datawatcher.a(12, new Integer(0)); - } - - public int getAge() { - return this.datawatcher.getInt(12); - } - - public void a(int i) { - int j = this.getAge(); - - j += i * 20; - if (j > 0) { - j = 0; - } - - this.setAge(j); - } - - public void setAge(int i) { - this.datawatcher.watch(12, Integer.valueOf(i)); - this.a(this.isBaby()); - } - - public void b(NBTTagCompound nbttagcompound) { - super.b(nbttagcompound); - nbttagcompound.setInt("Age", this.getAge()); - nbttagcompound.setBoolean("AgeLocked", this.ageLocked); // CraftBukkit - } - - public void a(NBTTagCompound nbttagcompound) { - super.a(nbttagcompound); - this.setAge(nbttagcompound.getInt("Age")); - this.ageLocked = nbttagcompound.getBoolean("AgeLocked"); // CraftBukkit - } - - public void e() { - super.e(); - if (this.world.isStatic || this.ageLocked) { // CraftBukkit - this.a(this.isBaby()); - } else { - int i = this.getAge(); - - if (i < 0) { - ++i; - this.setAge(i); - } else if (i > 0) { - --i; - this.setAge(i); - } - } - } - - public boolean isBaby() { - return this.getAge() < 0; - } - - public void a(boolean flag) { - this.a(flag ? 0.5F : 1.0F); - } - - protected final void a(float f, float f1) { - boolean flag = this.bp > 0.0F; - - this.bp = f; - this.bq = f1; - if (!flag) { - this.a(1.0F); - } - } - - protected final void a(float f) { - super.a(this.bp * f, this.bq * f); - } -} diff --git a/src/main/java/net/minecraft/server/EntityArrow.java b/src/main/java/net/minecraft/server/EntityArrow.java deleted file mode 100644 index 88b07510c7..0000000000 --- a/src/main/java/net/minecraft/server/EntityArrow.java +++ /dev/null @@ -1,462 +0,0 @@ -package net.minecraft.server; - -import java.util.List; - -// CraftBukkit start -import org.bukkit.entity.LivingEntity; -import org.bukkit.event.entity.EntityCombustByEntityEvent; -import org.bukkit.event.player.PlayerPickupItemEvent; -// CraftBukkit end - -public class EntityArrow extends Entity implements IProjectile { - - private int d = -1; - private int e = -1; - private int f = -1; - private Block g; - private int h; - private boolean inGround; - public int fromPlayer; - public int shake; - public Entity shooter; - private int at; - private int au; - private double damage = 2.0D; - public int knockbackStrength; // CraftBukkit - private -> public - - public EntityArrow(World world) { - super(world); - this.j = 10.0D; - this.a(0.5F, 0.5F); - } - - public EntityArrow(World world, double d0, double d1, double d2) { - super(world); - this.j = 10.0D; - this.a(0.5F, 0.5F); - this.setPosition(d0, d1, d2); - this.height = 0.0F; - } - - public EntityArrow(World world, EntityLiving entityliving, EntityLiving entityliving1, float f, float f1) { - super(world); - this.j = 10.0D; - this.shooter = entityliving; - this.projectileSource = (LivingEntity) entityliving.getBukkitEntity(); // CraftBukkit - if (entityliving instanceof EntityHuman) { - this.fromPlayer = 1; - } - - this.locY = entityliving.locY + (double) entityliving.getHeadHeight() - 0.10000000149011612D; - double d0 = entityliving1.locX - entityliving.locX; - double d1 = entityliving1.boundingBox.b + (double) (entityliving1.length / 3.0F) - this.locY; - double d2 = entityliving1.locZ - entityliving.locZ; - double d3 = (double) MathHelper.sqrt(d0 * d0 + d2 * d2); - - if (d3 >= 1.0E-7D) { - float f2 = (float) (Math.atan2(d2, d0) * 180.0D / 3.1415927410125732D) - 90.0F; - float f3 = (float) (-(Math.atan2(d1, d3) * 180.0D / 3.1415927410125732D)); - double d4 = d0 / d3; - double d5 = d2 / d3; - - this.setPositionRotation(entityliving.locX + d4, this.locY, entityliving.locZ + d5, f2, f3); - this.height = 0.0F; - float f4 = (float) d3 * 0.2F; - - this.shoot(d0, d1 + (double) f4, d2, f, f1); - } - } - - public EntityArrow(World world, EntityLiving entityliving, float f) { - super(world); - this.j = 10.0D; - this.shooter = entityliving; - this.projectileSource = (LivingEntity) entityliving.getBukkitEntity(); // CraftBukkit - if (entityliving instanceof EntityHuman) { - this.fromPlayer = 1; - } - - this.a(0.5F, 0.5F); - this.setPositionRotation(entityliving.locX, entityliving.locY + (double) entityliving.getHeadHeight(), entityliving.locZ, entityliving.yaw, entityliving.pitch); - this.locX -= (double) (MathHelper.cos(this.yaw / 180.0F * 3.1415927F) * 0.16F); - this.locY -= 0.10000000149011612D; - this.locZ -= (double) (MathHelper.sin(this.yaw / 180.0F * 3.1415927F) * 0.16F); - this.setPosition(this.locX, this.locY, this.locZ); - this.height = 0.0F; - this.motX = (double) (-MathHelper.sin(this.yaw / 180.0F * 3.1415927F) * MathHelper.cos(this.pitch / 180.0F * 3.1415927F)); - this.motZ = (double) (MathHelper.cos(this.yaw / 180.0F * 3.1415927F) * MathHelper.cos(this.pitch / 180.0F * 3.1415927F)); - this.motY = (double) (-MathHelper.sin(this.pitch / 180.0F * 3.1415927F)); - this.shoot(this.motX, this.motY, this.motZ, f * 1.5F, 1.0F); - } - - protected void c() { - this.datawatcher.a(16, Byte.valueOf((byte) 0)); - } - - public void shoot(double d0, double d1, double d2, float f, float f1) { - float f2 = MathHelper.sqrt(d0 * d0 + d1 * d1 + d2 * d2); - - d0 /= (double) f2; - d1 /= (double) f2; - d2 /= (double) f2; - d0 += this.random.nextGaussian() * (double) (this.random.nextBoolean() ? -1 : 1) * 0.007499999832361937D * (double) f1; - d1 += this.random.nextGaussian() * (double) (this.random.nextBoolean() ? -1 : 1) * 0.007499999832361937D * (double) f1; - d2 += this.random.nextGaussian() * (double) (this.random.nextBoolean() ? -1 : 1) * 0.007499999832361937D * (double) f1; - d0 *= (double) f; - d1 *= (double) f; - d2 *= (double) f; - this.motX = d0; - this.motY = d1; - this.motZ = d2; - float f3 = MathHelper.sqrt(d0 * d0 + d2 * d2); - - this.lastYaw = this.yaw = (float) (Math.atan2(d0, d2) * 180.0D / 3.1415927410125732D); - this.lastPitch = this.pitch = (float) (Math.atan2(d1, (double) f3) * 180.0D / 3.1415927410125732D); - this.at = 0; - } - - public void h() { - super.h(); - if (this.lastPitch == 0.0F && this.lastYaw == 0.0F) { - float f = MathHelper.sqrt(this.motX * this.motX + this.motZ * this.motZ); - - this.lastYaw = this.yaw = (float) (Math.atan2(this.motX, this.motZ) * 180.0D / 3.1415927410125732D); - this.lastPitch = this.pitch = (float) (Math.atan2(this.motY, (double) f) * 180.0D / 3.1415927410125732D); - } - - Block block = this.world.getType(this.d, this.e, this.f); - - if (block.getMaterial() != Material.AIR) { - block.updateShape(this.world, this.d, this.e, this.f); - AxisAlignedBB axisalignedbb = block.a(this.world, this.d, this.e, this.f); - - if (axisalignedbb != null && axisalignedbb.a(Vec3D.a(this.locX, this.locY, this.locZ))) { - this.inGround = true; - } - } - - if (this.shake > 0) { - --this.shake; - } - - if (this.inGround) { - int i = this.world.getData(this.d, this.e, this.f); - - if (block == this.g && i == this.h) { - ++this.at; - if (this.at == 1200) { - this.die(); - } - } else { - this.inGround = false; - this.motX *= (double) (this.random.nextFloat() * 0.2F); - this.motY *= (double) (this.random.nextFloat() * 0.2F); - this.motZ *= (double) (this.random.nextFloat() * 0.2F); - this.at = 0; - this.au = 0; - } - } else { - ++this.au; - Vec3D vec3d = Vec3D.a(this.locX, this.locY, this.locZ); - Vec3D vec3d1 = Vec3D.a(this.locX + this.motX, this.locY + this.motY, this.locZ + this.motZ); - MovingObjectPosition movingobjectposition = this.world.rayTrace(vec3d, vec3d1, false, true, false); - - vec3d = Vec3D.a(this.locX, this.locY, this.locZ); - vec3d1 = Vec3D.a(this.locX + this.motX, this.locY + this.motY, this.locZ + this.motZ); - if (movingobjectposition != null) { - vec3d1 = Vec3D.a(movingobjectposition.pos.a, movingobjectposition.pos.b, movingobjectposition.pos.c); - } - - Entity entity = null; - List list = this.world.getEntities(this, this.boundingBox.a(this.motX, this.motY, this.motZ).grow(1.0D, 1.0D, 1.0D)); - double d0 = 0.0D; - - int j; - float f1; - - for (j = 0; j < list.size(); ++j) { - Entity entity1 = (Entity) list.get(j); - - if (entity1.R() && (entity1 != this.shooter || this.au >= 5)) { - f1 = 0.3F; - AxisAlignedBB axisalignedbb1 = entity1.boundingBox.grow((double) f1, (double) f1, (double) f1); - MovingObjectPosition movingobjectposition1 = axisalignedbb1.a(vec3d, vec3d1); - - if (movingobjectposition1 != null) { - double d1 = vec3d.distanceSquared(movingobjectposition1.pos); // CraftBukkit - distance efficiency - - if (d1 < d0 || d0 == 0.0D) { - entity = entity1; - d0 = d1; - } - } - } - } - - if (entity != null) { - movingobjectposition = new MovingObjectPosition(entity); - } - - if (movingobjectposition != null && movingobjectposition.entity != null && movingobjectposition.entity instanceof EntityHuman) { - EntityHuman entityhuman = (EntityHuman) movingobjectposition.entity; - - if (entityhuman.abilities.isInvulnerable || this.shooter instanceof EntityHuman && !((EntityHuman) this.shooter).a(entityhuman)) { - movingobjectposition = null; - } - } - - float f2; - float f3; - - if (movingobjectposition != null) { - org.bukkit.craftbukkit.event.CraftEventFactory.callProjectileHitEvent(this); // CraftBukkit - Call event - - if (movingobjectposition.entity != null) { - f2 = MathHelper.sqrt(this.motX * this.motX + this.motY * this.motY + this.motZ * this.motZ); - int k = MathHelper.f((double) f2 * this.damage); - - if (this.isCritical()) { - k += this.random.nextInt(k / 2 + 2); - } - - DamageSource damagesource = null; - - if (this.shooter == null) { - damagesource = DamageSource.arrow(this, this); - } else { - damagesource = DamageSource.arrow(this, this.shooter); - } - - // CraftBukkit start - Moved damage call - if (movingobjectposition.entity.damageEntity(damagesource, k)) { - 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); - - if (!combustEvent.isCancelled()) { - movingobjectposition.entity.setOnFire(combustEvent.getDuration()); - } - // CraftBukkit end - } - - // if (movingobjectposition.entity.damageEntity(damagesource, (float) k)) { // CraftBukkit - moved up - if (movingobjectposition.entity instanceof EntityLiving) { - EntityLiving entityliving = (EntityLiving) movingobjectposition.entity; - - if (!this.world.isStatic) { - entityliving.p(entityliving.aZ() + 1); - } - - if (this.knockbackStrength > 0) { - f3 = MathHelper.sqrt(this.motX * this.motX + this.motZ * this.motZ); - if (f3 > 0.0F) { - movingobjectposition.entity.g(this.motX * (double) this.knockbackStrength * 0.6000000238418579D / (double) f3, 0.1D, this.motZ * (double) this.knockbackStrength * 0.6000000238418579D / (double) f3); - } - } - - if (this.shooter != null && this.shooter instanceof EntityLiving) { - EnchantmentManager.a(entityliving, this.shooter); - EnchantmentManager.b((EntityLiving) this.shooter, entityliving); - } - - if (this.shooter != null && movingobjectposition.entity != this.shooter && movingobjectposition.entity instanceof EntityHuman && this.shooter instanceof EntityPlayer) { - ((EntityPlayer) this.shooter).playerConnection.sendPacket(new PacketPlayOutGameStateChange(6, 0.0F)); - } - } - - this.makeSound("random.bowhit", 1.0F, 1.2F / (this.random.nextFloat() * 0.2F + 0.9F)); - 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.au = 0; - } - } else { - this.d = movingobjectposition.b; - this.e = movingobjectposition.c; - this.f = movingobjectposition.d; - this.g = this.world.getType(this.d, this.e, this.f); - this.h = this.world.getData(this.d, this.e, this.f); - this.motX = (double) ((float) (movingobjectposition.pos.a - this.locX)); - this.motY = (double) ((float) (movingobjectposition.pos.b - this.locY)); - this.motZ = (double) ((float) (movingobjectposition.pos.c - this.locZ)); - f2 = MathHelper.sqrt(this.motX * this.motX + this.motY * this.motY + this.motZ * this.motZ); - this.locX -= this.motX / (double) f2 * 0.05000000074505806D; - this.locY -= this.motY / (double) f2 * 0.05000000074505806D; - this.locZ -= this.motZ / (double) f2 * 0.05000000074505806D; - this.makeSound("random.bowhit", 1.0F, 1.2F / (this.random.nextFloat() * 0.2F + 0.9F)); - this.inGround = true; - this.shake = 7; - this.setCritical(false); - if (this.g.getMaterial() != Material.AIR) { - this.g.a(this.world, this.d, this.e, this.f, (Entity) this); - } - } - } - - if (this.isCritical()) { - for (j = 0; j < 4; ++j) { - this.world.addParticle("crit", this.locX + this.motX * (double) j / 4.0D, this.locY + this.motY * (double) j / 4.0D, this.locZ + this.motZ * (double) j / 4.0D, -this.motX, -this.motY + 0.2D, -this.motZ); - } - } - - this.locX += this.motX; - this.locY += this.motY; - this.locZ += this.motZ; - f2 = MathHelper.sqrt(this.motX * this.motX + this.motZ * this.motZ); - this.yaw = (float) (Math.atan2(this.motX, this.motZ) * 180.0D / 3.1415927410125732D); - - for (this.pitch = (float) (Math.atan2(this.motY, (double) f2) * 180.0D / 3.1415927410125732D); this.pitch - this.lastPitch < -180.0F; this.lastPitch -= 360.0F) { - ; - } - - while (this.pitch - this.lastPitch >= 180.0F) { - this.lastPitch += 360.0F; - } - - while (this.yaw - this.lastYaw < -180.0F) { - this.lastYaw -= 360.0F; - } - - while (this.yaw - this.lastYaw >= 180.0F) { - this.lastYaw += 360.0F; - } - - this.pitch = this.lastPitch + (this.pitch - this.lastPitch) * 0.2F; - this.yaw = this.lastYaw + (this.yaw - this.lastYaw) * 0.2F; - float f4 = 0.99F; - - f1 = 0.05F; - if (this.M()) { - for (int l = 0; l < 4; ++l) { - 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; - } - - if (this.L()) { - this.extinguish(); - } - - this.motX *= (double) f4; - this.motY *= (double) f4; - this.motZ *= (double) f4; - this.motY -= (double) f1; - this.setPosition(this.locX, this.locY, this.locZ); - this.I(); - } - } - - public void b(NBTTagCompound nbttagcompound) { - nbttagcompound.setShort("xTile", (short) this.d); - nbttagcompound.setShort("yTile", (short) this.e); - nbttagcompound.setShort("zTile", (short) this.f); - nbttagcompound.setShort("life", (short) this.at); - nbttagcompound.setByte("inTile", (byte) Block.getId(this.g)); - nbttagcompound.setByte("inData", (byte) this.h); - nbttagcompound.setByte("shake", (byte) this.shake); - nbttagcompound.setByte("inGround", (byte) (this.inGround ? 1 : 0)); - nbttagcompound.setByte("pickup", (byte) this.fromPlayer); - nbttagcompound.setDouble("damage", this.damage); - } - - public void a(NBTTagCompound nbttagcompound) { - this.d = nbttagcompound.getShort("xTile"); - this.e = nbttagcompound.getShort("yTile"); - this.f = nbttagcompound.getShort("zTile"); - this.at = nbttagcompound.getShort("life"); - this.g = Block.getById(nbttagcompound.getByte("inTile") & 255); - this.h = nbttagcompound.getByte("inData") & 255; - this.shake = nbttagcompound.getByte("shake") & 255; - this.inGround = nbttagcompound.getByte("inGround") == 1; - if (nbttagcompound.hasKeyOfType("damage", 99)) { - this.damage = nbttagcompound.getDouble("damage"); - } - - if (nbttagcompound.hasKeyOfType("pickup", 99)) { - this.fromPlayer = nbttagcompound.getByte("pickup"); - } else if (nbttagcompound.hasKeyOfType("player", 99)) { - this.fromPlayer = nbttagcompound.getBoolean("player") ? 1 : 0; - } - } - - public void b_(EntityHuman entityhuman) { - if (!this.world.isStatic && this.inGround && this.shake <= 0) { - // CraftBukkit start - ItemStack itemstack = new ItemStack(Items.ARROW); - if (this.fromPlayer == 1 && entityhuman.inventory.canHold(itemstack) > 0) { - EntityItem item = new EntityItem(this.world, this.locX, this.locY, this.locZ, itemstack); - - PlayerPickupItemEvent event = new PlayerPickupItemEvent((org.bukkit.entity.Player) entityhuman.getBukkitEntity(), new org.bukkit.craftbukkit.entity.CraftItem(this.world.getServer(), this, item), 0); - // event.setCancelled(!entityhuman.canPickUpLoot); TODO - this.world.getServer().getPluginManager().callEvent(event); - - if (event.isCancelled()) { - return; - } - } - // CraftBukkit end - - boolean flag = this.fromPlayer == 1 || this.fromPlayer == 2 && entityhuman.abilities.canInstantlyBuild; - - if (this.fromPlayer == 1 && !entityhuman.inventory.pickup(new ItemStack(Items.ARROW, 1))) { - flag = false; - } - - if (flag) { - this.makeSound("random.pop", 0.2F, ((this.random.nextFloat() - this.random.nextFloat()) * 0.7F + 1.0F) * 2.0F); - entityhuman.receive(this, 1); - this.die(); - } - } - } - - protected boolean g_() { - return false; - } - - public void b(double d0) { - this.damage = d0; - } - - public double e() { - return this.damage; - } - - public void setKnockbackStrength(int i) { - this.knockbackStrength = i; - } - - public boolean av() { - return false; - } - - public void setCritical(boolean flag) { - byte b0 = this.datawatcher.getByte(16); - - if (flag) { - this.datawatcher.watch(16, Byte.valueOf((byte) (b0 | 1))); - } else { - this.datawatcher.watch(16, Byte.valueOf((byte) (b0 & -2))); - } - } - - public boolean isCritical() { - byte b0 = this.datawatcher.getByte(16); - - return (b0 & 1) != 0; - } - - // CraftBukkit start - public boolean isInGround() { - return inGround; - } - // CraftBukkit end -} diff --git a/src/main/java/net/minecraft/server/EntityBoat.java b/src/main/java/net/minecraft/server/EntityBoat.java deleted file mode 100644 index 8a3ea63543..0000000000 --- a/src/main/java/net/minecraft/server/EntityBoat.java +++ /dev/null @@ -1,498 +0,0 @@ -package net.minecraft.server; - -import java.util.List; - -// CraftBukkit start -import org.bukkit.Location; -import org.bukkit.craftbukkit.event.CraftEventFactory; -import org.bukkit.entity.Vehicle; -import org.bukkit.event.vehicle.VehicleDamageEvent; -import org.bukkit.event.vehicle.VehicleDestroyEvent; -import org.bukkit.event.vehicle.VehicleEntityCollisionEvent; -import org.bukkit.event.vehicle.VehicleMoveEvent; -// CraftBukkit end - -public class EntityBoat extends Entity { - - private boolean a; - private double b; - private int c; - private double d; - private double e; - private double f; - private double g; - private double h; - - // CraftBukkit start - public double maxSpeed = 0.4D; - public double occupiedDeceleration = 0.2D; - public double unoccupiedDeceleration = -1; - public boolean landBoats = false; - - @Override - public void collide(Entity entity) { - org.bukkit.entity.Entity hitEntity = (entity == null) ? null : entity.getBukkitEntity(); - - VehicleEntityCollisionEvent event = new VehicleEntityCollisionEvent((Vehicle) this.getBukkitEntity(), hitEntity); - this.world.getServer().getPluginManager().callEvent(event); - - if (event.isCancelled()) { - return; - } - - super.collide(entity); - } - // CraftBukkit end - - public EntityBoat(World world) { - super(world); - this.a = true; - this.b = 0.07D; - this.k = true; - this.a(1.5F, 0.6F); - this.height = this.length / 2.0F; - } - - protected boolean g_() { - return false; - } - - protected void c() { - this.datawatcher.a(17, new Integer(0)); - this.datawatcher.a(18, new Integer(1)); - this.datawatcher.a(19, new Float(0.0F)); - } - - public AxisAlignedBB h(Entity entity) { - return entity.boundingBox; - } - - public AxisAlignedBB J() { - return this.boundingBox; - } - - public boolean S() { - return true; - } - - public EntityBoat(World world, double d0, double d1, double d2) { - this(world); - this.setPosition(d0, d1 + (double) this.height, d2); - this.motX = 0.0D; - this.motY = 0.0D; - this.motZ = 0.0D; - this.lastX = d0; - this.lastY = d1; - this.lastZ = d2; - - this.world.getServer().getPluginManager().callEvent(new org.bukkit.event.vehicle.VehicleCreateEvent((Vehicle) this.getBukkitEntity())); // CraftBukkit - } - - public double ae() { - return (double) this.length * 0.0D - 0.30000001192092896D; - } - - public boolean damageEntity(DamageSource damagesource, float f) { - if (this.isInvulnerable()) { - return false; - } else if (!this.world.isStatic && !this.dead) { - // CraftBukkit start - Vehicle vehicle = (Vehicle) this.getBukkitEntity(); - org.bukkit.entity.Entity attacker = (damagesource.getEntity() == null) ? null : damagesource.getEntity().getBukkitEntity(); - - VehicleDamageEvent event = new VehicleDamageEvent(vehicle, attacker, (double) f); - this.world.getServer().getPluginManager().callEvent(event); - - if (event.isCancelled()) { - return true; - } - // f = event.getDamage(); // TODO Why don't we do this? - // CraftBukkit end - - this.c(-this.i()); - this.a(10); - this.setDamage(this.getDamage() + f * 10.0F); - this.Q(); - boolean flag = damagesource.getEntity() instanceof EntityHuman && ((EntityHuman) damagesource.getEntity()).abilities.canInstantlyBuild; - - if (flag || this.getDamage() > 40.0F) { - // CraftBukkit start - VehicleDestroyEvent destroyEvent = new VehicleDestroyEvent(vehicle, attacker); - this.world.getServer().getPluginManager().callEvent(destroyEvent); - - if (destroyEvent.isCancelled()) { - this.setDamage(40F); // Maximize damage so this doesn't get triggered again right away - return true; - } - // CraftBukkit end - - if (this.passenger != null) { - this.passenger.mount(this); - } - - if (!flag) { - this.a(Items.BOAT, 1, 0.0F); - } - - this.die(); - } - - return true; - } else { - return true; - } - } - - public boolean R() { - return !this.dead; - } - - public void h() { - // CraftBukkit start - double prevX = this.locX; - double prevY = this.locY; - double prevZ = this.locZ; - float prevYaw = this.yaw; - float prevPitch = this.pitch; - // CraftBukkit end - - super.h(); - if (this.f() > 0) { - this.a(this.f() - 1); - } - - if (this.getDamage() > 0.0F) { - this.setDamage(this.getDamage() - 1.0F); - } - - this.lastX = this.locX; - this.lastY = this.locY; - this.lastZ = this.locZ; - byte b0 = 5; - double d0 = 0.0D; - - for (int i = 0; i < b0; ++i) { - double d1 = this.boundingBox.b + (this.boundingBox.e - this.boundingBox.b) * (double) (i + 0) / (double) b0 - 0.125D; - double d2 = this.boundingBox.b + (this.boundingBox.e - this.boundingBox.b) * (double) (i + 1) / (double) b0 - 0.125D; - AxisAlignedBB axisalignedbb = AxisAlignedBB.a(this.boundingBox.a, d1, this.boundingBox.c, this.boundingBox.d, d2, this.boundingBox.f); - - if (this.world.b(axisalignedbb, Material.WATER)) { - d0 += 1.0D / (double) b0; - } - } - - double d3 = Math.sqrt(this.motX * this.motX + this.motZ * this.motZ); - double d4; - double d5; - int j; - - if (d3 > 0.26249999999999996D) { - d4 = Math.cos((double) this.yaw * 3.141592653589793D / 180.0D); - d5 = Math.sin((double) this.yaw * 3.141592653589793D / 180.0D); - - for (j = 0; (double) j < 1.0D + d3 * 60.0D; ++j) { - double d6 = (double) (this.random.nextFloat() * 2.0F - 1.0F); - double d7 = (double) (this.random.nextInt(2) * 2 - 1) * 0.7D; - double d8; - double d9; - - if (this.random.nextBoolean()) { - d8 = this.locX - d4 * d6 * 0.8D + d5 * d7; - d9 = this.locZ - d5 * d6 * 0.8D - d4 * d7; - this.world.addParticle("splash", d8, this.locY - 0.125D, d9, this.motX, this.motY, this.motZ); - } else { - d8 = this.locX + d4 + d5 * d6 * 0.7D; - d9 = this.locZ + d5 - d4 * d6 * 0.7D; - this.world.addParticle("splash", d8, this.locY - 0.125D, d9, this.motX, this.motY, this.motZ); - } - } - } - - double d10; - double d11; - - if (this.world.isStatic && this.a) { - if (this.c > 0) { - d4 = this.locX + (this.d - this.locX) / (double) this.c; - d5 = this.locY + (this.e - this.locY) / (double) this.c; - d10 = this.locZ + (this.f - this.locZ) / (double) this.c; - d11 = MathHelper.g(this.g - (double) this.yaw); - this.yaw = (float) ((double) this.yaw + d11 / (double) this.c); - this.pitch = (float) ((double) this.pitch + (this.h - (double) this.pitch) / (double) this.c); - --this.c; - this.setPosition(d4, d5, d10); - this.b(this.yaw, this.pitch); - } else { - d4 = this.locX + this.motX; - d5 = this.locY + this.motY; - d10 = this.locZ + this.motZ; - this.setPosition(d4, d5, d10); - if (this.onGround) { - this.motX *= 0.5D; - this.motY *= 0.5D; - this.motZ *= 0.5D; - } - - this.motX *= 0.9900000095367432D; - this.motY *= 0.949999988079071D; - this.motZ *= 0.9900000095367432D; - } - } else { - if (d0 < 1.0D) { - d4 = d0 * 2.0D - 1.0D; - this.motY += 0.03999999910593033D * d4; - } else { - if (this.motY < 0.0D) { - this.motY /= 2.0D; - } - - this.motY += 0.007000000216066837D; - } - - if (this.passenger != null && this.passenger instanceof EntityLiving) { - EntityLiving entityliving = (EntityLiving) this.passenger; - float f = this.passenger.yaw + -entityliving.bd * 90.0F; - - this.motX += -Math.sin((double) (f * 3.1415927F / 180.0F)) * this.b * (double) entityliving.be * 0.05000000074505806D; - this.motZ += Math.cos((double) (f * 3.1415927F / 180.0F)) * this.b * (double) entityliving.be * 0.05000000074505806D; - } - // CraftBukkit start - Support unoccupied deceleration - else if (unoccupiedDeceleration >= 0) { - this.motX *= unoccupiedDeceleration; - this.motZ *= unoccupiedDeceleration; - // Kill lingering speed - if (motX <= 0.00001) { - motX = 0; - } - if (motZ <= 0.00001) { - motZ = 0; - } - } - // CraftBukkit end - - d4 = Math.sqrt(this.motX * this.motX + this.motZ * this.motZ); - if (d4 > 0.35D) { - d5 = 0.35D / d4; - this.motX *= d5; - this.motZ *= d5; - d4 = 0.35D; - } - - if (d4 > d3 && this.b < 0.35D) { - this.b += (0.35D - this.b) / 35.0D; - if (this.b > 0.35D) { - this.b = 0.35D; - } - } else { - this.b -= (this.b - 0.07D) / 35.0D; - if (this.b < 0.07D) { - this.b = 0.07D; - } - } - - int k; - - for (k = 0; k < 4; ++k) { - int l = MathHelper.floor(this.locX + ((double) (k % 2) - 0.5D) * 0.8D); - - j = MathHelper.floor(this.locZ + ((double) (k / 2) - 0.5D) * 0.8D); - - for (int i1 = 0; i1 < 2; ++i1) { - int j1 = MathHelper.floor(this.locY) + i1; - Block block = this.world.getType(l, j1, j); - - if (block == Blocks.SNOW) { - // CraftBukkit start - if (CraftEventFactory.callEntityChangeBlockEvent(this, l, j1, j, Blocks.AIR, 0).isCancelled()) { - continue; - } - // CraftBukkit end - this.world.setAir(l, j1, j); - this.positionChanged = false; - } else if (block == Blocks.WATER_LILY) { - // CraftBukkit start - if (CraftEventFactory.callEntityChangeBlockEvent(this, l, j1, j, Blocks.AIR, 0).isCancelled()) { - continue; - } - // CraftBukkit end - this.world.setAir(l, j1, j, true); - this.positionChanged = false; - } - } - } - - if (this.onGround && !this.landBoats) { // CraftBukkit - this.motX *= 0.5D; - this.motY *= 0.5D; - this.motZ *= 0.5D; - } - - this.move(this.motX, this.motY, this.motZ); - if (this.positionChanged && d3 > 0.2D) { - if (!this.world.isStatic && !this.dead) { - // CraftBukkit start - Vehicle vehicle = (Vehicle) this.getBukkitEntity(); - VehicleDestroyEvent destroyEvent = new VehicleDestroyEvent(vehicle, null); - this.world.getServer().getPluginManager().callEvent(destroyEvent); - if (!destroyEvent.isCancelled()) { - this.die(); - - for (k = 0; k < 3; ++k) { - this.a(Item.getItemOf(Blocks.WOOD), 1, 0.0F); - } - - for (k = 0; k < 2; ++k) { - this.a(Items.STICK, 1, 0.0F); - } - } - // CraftBukkit end - } - } else { - this.motX *= 0.9900000095367432D; - this.motY *= 0.949999988079071D; - this.motZ *= 0.9900000095367432D; - } - - this.pitch = 0.0F; - d5 = (double) this.yaw; - d10 = this.lastX - this.locX; - d11 = this.lastZ - this.locZ; - if (d10 * d10 + d11 * d11 > 0.001D) { - d5 = (double) ((float) (Math.atan2(d11, d10) * 180.0D / 3.141592653589793D)); - } - - double d12 = MathHelper.g(d5 - (double) this.yaw); - - if (d12 > 20.0D) { - d12 = 20.0D; - } - - if (d12 < -20.0D) { - d12 = -20.0D; - } - - this.yaw = (float) ((double) this.yaw + d12); - this.b(this.yaw, this.pitch); - - // CraftBukkit start - org.bukkit.Server server = this.world.getServer(); - org.bukkit.World bworld = this.world.getWorld(); - - Location from = new Location(bworld, prevX, prevY, prevZ, prevYaw, prevPitch); - Location to = new Location(bworld, this.locX, this.locY, this.locZ, this.yaw, this.pitch); - Vehicle vehicle = (Vehicle) this.getBukkitEntity(); - - server.getPluginManager().callEvent(new org.bukkit.event.vehicle.VehicleUpdateEvent(vehicle)); - - if (!from.equals(to)) { - VehicleMoveEvent event = new VehicleMoveEvent(vehicle, from, to); - server.getPluginManager().callEvent(event); - } - // CraftBukkit end - - if (!this.world.isStatic) { - List list = this.world.getEntities(this, this.boundingBox.grow(0.20000000298023224D, 0.0D, 0.20000000298023224D)); - - if (list != null && !list.isEmpty()) { - for (int k1 = 0; k1 < list.size(); ++k1) { - Entity entity = (Entity) list.get(k1); - - if (entity != this.passenger && entity.S() && entity instanceof EntityBoat) { - entity.collide(this); - } - } - } - - if (this.passenger != null && this.passenger.dead) { - this.passenger.vehicle = null; // CraftBukkit - this.passenger = null; - } - } - } - } - - public void ac() { - if (this.passenger != null) { - double d0 = Math.cos((double) this.yaw * 3.141592653589793D / 180.0D) * 0.4D; - double d1 = Math.sin((double) this.yaw * 3.141592653589793D / 180.0D) * 0.4D; - - this.passenger.setPosition(this.locX + d0, this.locY + this.ae() + this.passenger.ad(), this.locZ + d1); - } - } - - protected void b(NBTTagCompound nbttagcompound) {} - - protected void a(NBTTagCompound nbttagcompound) {} - - public boolean c(EntityHuman entityhuman) { - if (this.passenger != null && this.passenger instanceof EntityHuman && this.passenger != entityhuman) { - return true; - } else { - if (!this.world.isStatic) { - entityhuman.mount(this); - } - - return true; - } - } - - protected void a(double d0, boolean flag) { - int i = MathHelper.floor(this.locX); - int j = MathHelper.floor(this.locY); - int k = MathHelper.floor(this.locZ); - - if (flag) { - if (this.fallDistance > 3.0F) { - this.b(this.fallDistance); - if (!this.world.isStatic && !this.dead) { - // CraftBukkit start - Vehicle vehicle = (Vehicle) this.getBukkitEntity(); - VehicleDestroyEvent destroyEvent = new VehicleDestroyEvent(vehicle, null); - this.world.getServer().getPluginManager().callEvent(destroyEvent); - if (!destroyEvent.isCancelled()) { - this.die(); - - int l; - - for (l = 0; l < 3; ++l) { - this.a(Item.getItemOf(Blocks.WOOD), 1, 0.0F); - } - - for (l = 0; l < 2; ++l) { - this.a(Items.STICK, 1, 0.0F); - } - } - // CraftBukkit end - } - - this.fallDistance = 0.0F; - } - } else if (this.world.getType(i, j - 1, k).getMaterial() != Material.WATER && d0 < 0.0D) { - this.fallDistance = (float) ((double) this.fallDistance - d0); - } - } - - public void setDamage(float f) { - this.datawatcher.watch(19, Float.valueOf(f)); - } - - public float getDamage() { - return this.datawatcher.getFloat(19); - } - - public void a(int i) { - this.datawatcher.watch(17, Integer.valueOf(i)); - } - - public int f() { - return this.datawatcher.getInt(17); - } - - public void c(int i) { - this.datawatcher.watch(18, Integer.valueOf(i)); - } - - public int i() { - return this.datawatcher.getInt(18); - } -} diff --git a/src/main/java/net/minecraft/server/EntityChicken.java b/src/main/java/net/minecraft/server/EntityChicken.java deleted file mode 100644 index a5a5ab5e9b..0000000000 --- a/src/main/java/net/minecraft/server/EntityChicken.java +++ /dev/null @@ -1,158 +0,0 @@ -package net.minecraft.server; - -public class EntityChicken extends EntityAnimal { - - public float bp; - public float bq; - public float br; - public float bs; - public float bt = 1.0F; - public int bu; - public boolean bv; - - public EntityChicken(World world) { - super(world); - this.a(0.3F, 0.7F); - this.bu = this.random.nextInt(6000) + 6000; - this.goalSelector.a(0, new PathfinderGoalFloat(this)); - this.goalSelector.a(1, new PathfinderGoalPanic(this, 1.4D)); - this.goalSelector.a(2, new PathfinderGoalBreed(this, 1.0D)); - this.goalSelector.a(3, new PathfinderGoalTempt(this, 1.0D, Items.SEEDS, false)); - this.goalSelector.a(4, new PathfinderGoalFollowParent(this, 1.1D)); - this.goalSelector.a(5, new PathfinderGoalRandomStroll(this, 1.0D)); - this.goalSelector.a(6, new PathfinderGoalLookAtPlayer(this, EntityHuman.class, 6.0F)); - this.goalSelector.a(7, new PathfinderGoalRandomLookaround(this)); - } - - public boolean bk() { - return true; - } - - protected void aD() { - super.aD(); - this.getAttributeInstance(GenericAttributes.maxHealth).setValue(4.0D); - this.getAttributeInstance(GenericAttributes.d).setValue(0.25D); - } - - public void e() { - // CraftBukkit start - if (this.isChickenJockey()) { - this.persistent = !this.isTypeNotPersistent(); - } - // CraftBukkit end - super.e(); - this.bs = this.bp; - this.br = this.bq; - this.bq = (float) ((double) this.bq + (double) (this.onGround ? -1 : 4) * 0.3D); - if (this.bq < 0.0F) { - this.bq = 0.0F; - } - - if (this.bq > 1.0F) { - this.bq = 1.0F; - } - - if (!this.onGround && this.bt < 1.0F) { - this.bt = 1.0F; - } - - this.bt = (float) ((double) this.bt * 0.9D); - if (!this.onGround && this.motY < 0.0D) { - this.motY *= 0.6D; - } - - this.bp += this.bt * 2.0F; - if (!this.world.isStatic && !this.isBaby() && !this.isChickenJockey() && --this.bu <= 0) { - this.makeSound("mob.chicken.plop", 1.0F, (this.random.nextFloat() - this.random.nextFloat()) * 0.2F + 1.0F); - this.a(Items.EGG, 1); - this.bu = this.random.nextInt(6000) + 6000; - } - } - - protected void b(float f) {} - - protected String t() { - return "mob.chicken.say"; - } - - protected String aT() { - return "mob.chicken.hurt"; - } - - protected String aU() { - return "mob.chicken.hurt"; - } - - protected void a(int i, int j, int k, Block block) { - this.makeSound("mob.chicken.step", 0.15F, 1.0F); - } - - protected Item getLoot() { - return Items.FEATHER; - } - - protected void dropDeathLoot(boolean flag, int i) { - int j = this.random.nextInt(3) + this.random.nextInt(1 + i); - - for (int k = 0; k < j; ++k) { - this.a(Items.FEATHER, 1); - } - - if (this.isBurning()) { - this.a(Items.COOKED_CHICKEN, 1); - } else { - this.a(Items.RAW_CHICKEN, 1); - } - } - - public EntityChicken b(EntityAgeable entityageable) { - return new EntityChicken(this.world); - } - - public boolean c(ItemStack itemstack) { - return itemstack != null && itemstack.getItem() instanceof ItemSeeds; - } - - public void a(NBTTagCompound nbttagcompound) { - super.a(nbttagcompound); - this.bv = nbttagcompound.getBoolean("IsChickenJockey"); - } - - protected int getExpValue(EntityHuman entityhuman) { - return this.isChickenJockey() ? 10 : super.getExpValue(entityhuman); - } - - public void b(NBTTagCompound nbttagcompound) { - super.b(nbttagcompound); - nbttagcompound.setBoolean("IsChickenJockey", this.bv); - } - - protected boolean isTypeNotPersistent() { - return this.isChickenJockey() && this.passenger == null; - } - - public void ac() { - super.ac(); - float f = MathHelper.sin(this.aM * 3.1415927F / 180.0F); - float f1 = MathHelper.cos(this.aM * 3.1415927F / 180.0F); - float f2 = 0.1F; - float f3 = 0.0F; - - this.passenger.setPosition(this.locX + (double) (f2 * f), this.locY + (double) (this.length * 0.5F) + this.passenger.ad() + (double) f3, this.locZ - (double) (f2 * f1)); - if (this.passenger instanceof EntityLiving) { - ((EntityLiving) this.passenger).aM = this.aM; - } - } - - public boolean isChickenJockey() { - return this.bv; - } - - public void i(boolean flag) { - this.bv = flag; - } - - public EntityAgeable createChild(EntityAgeable entityageable) { - return this.b(entityageable); - } -} diff --git a/src/main/java/net/minecraft/server/EntityCow.java b/src/main/java/net/minecraft/server/EntityCow.java deleted file mode 100644 index df21fde2a3..0000000000 --- a/src/main/java/net/minecraft/server/EntityCow.java +++ /dev/null @@ -1,110 +0,0 @@ -package net.minecraft.server; - -// CraftBukkit start -import org.bukkit.craftbukkit.event.CraftEventFactory; -import org.bukkit.craftbukkit.inventory.CraftItemStack; -// CraftBukkit end - -public class EntityCow extends EntityAnimal { - - public EntityCow(World world) { - super(world); - this.a(0.9F, 1.3F); - this.getNavigation().a(true); - this.goalSelector.a(0, new PathfinderGoalFloat(this)); - this.goalSelector.a(1, new PathfinderGoalPanic(this, 2.0D)); - this.goalSelector.a(2, new PathfinderGoalBreed(this, 1.0D)); - this.goalSelector.a(3, new PathfinderGoalTempt(this, 1.25D, Items.WHEAT, false)); - this.goalSelector.a(4, new PathfinderGoalFollowParent(this, 1.25D)); - this.goalSelector.a(5, new PathfinderGoalRandomStroll(this, 1.0D)); - this.goalSelector.a(6, new PathfinderGoalLookAtPlayer(this, EntityHuman.class, 6.0F)); - this.goalSelector.a(7, new PathfinderGoalRandomLookaround(this)); - } - - public boolean bk() { - return true; - } - - protected void aD() { - super.aD(); - this.getAttributeInstance(GenericAttributes.maxHealth).setValue(10.0D); - this.getAttributeInstance(GenericAttributes.d).setValue(0.20000000298023224D); - } - - protected String t() { - return "mob.cow.say"; - } - - protected String aT() { - return "mob.cow.hurt"; - } - - protected String aU() { - return "mob.cow.hurt"; - } - - protected void a(int i, int j, int k, Block block) { - this.makeSound("mob.cow.step", 0.15F, 1.0F); - } - - protected float bf() { - return 0.4F; - } - - protected Item getLoot() { - return Items.LEATHER; - } - - protected void dropDeathLoot(boolean flag, int i) { - int j = this.random.nextInt(3) + this.random.nextInt(1 + i); - - int k; - - for (k = 0; k < j; ++k) { - this.a(Items.LEATHER, 1); - } - - j = this.random.nextInt(3) + 1 + this.random.nextInt(1 + i); - - for (k = 0; k < j; ++k) { - if (this.isBurning()) { - this.a(Items.COOKED_BEEF, 1); - } else { - this.a(Items.RAW_BEEF, 1); - } - } - } - - public boolean a(EntityHuman entityhuman) { - ItemStack itemstack = entityhuman.inventory.getItemInHand(); - - if (itemstack != null && itemstack.getItem() == Items.BUCKET && !entityhuman.abilities.canInstantlyBuild) { - // CraftBukkit start - Got milk? - org.bukkit.Location loc = this.getBukkitEntity().getLocation(); - org.bukkit.event.player.PlayerBucketFillEvent event = CraftEventFactory.callPlayerBucketFillEvent(entityhuman, loc.getBlockX(), loc.getBlockY(), loc.getBlockZ(), -1, itemstack, Items.MILK_BUCKET); - - if (event.isCancelled()) { - return false; - } - - if (--itemstack.count <= 0) { - entityhuman.inventory.setItem(entityhuman.inventory.itemInHandIndex, CraftItemStack.asNMSCopy(event.getItemStack())); - } else if (!entityhuman.inventory.pickup(new ItemStack(Items.MILK_BUCKET))) { - entityhuman.drop(CraftItemStack.asNMSCopy(event.getItemStack()), false); - } - // CraftBukkit end - - return true; - } else { - return super.a(entityhuman); - } - } - - public EntityCow b(EntityAgeable entityageable) { - return new EntityCow(this.world); - } - - public EntityAgeable createChild(EntityAgeable entityageable) { - return this.b(entityageable); - } -} diff --git a/src/main/java/net/minecraft/server/EntityCreature.java b/src/main/java/net/minecraft/server/EntityCreature.java deleted file mode 100644 index 6960b0580f..0000000000 --- a/src/main/java/net/minecraft/server/EntityCreature.java +++ /dev/null @@ -1,313 +0,0 @@ -package net.minecraft.server; - -import java.util.UUID; - -// CraftBukkit start -import org.bukkit.craftbukkit.entity.CraftEntity; -import org.bukkit.event.entity.EntityTargetEvent; -import org.bukkit.event.entity.EntityUnleashEvent; -// CraftBukkit end - -public abstract class EntityCreature extends EntityInsentient { - - public static final UUID h = UUID.fromString("E199AD21-BA8A-4C53-8D13-6182D5C69D3A"); - public static final AttributeModifier i = (new AttributeModifier(h, "Fleeing speed bonus", 2.0D, 2)).a(false); - public PathEntity pathEntity; // CraftBukkit - private -> public - public Entity target; // CraftBukkit - protected -> public - protected boolean bn; - protected int bo; - private ChunkCoordinates bq = new ChunkCoordinates(0, 0, 0); - private float br = -1.0F; - private PathfinderGoal bs = new PathfinderGoalMoveTowardsRestriction(this, 1.0D); - private boolean bt; - - public EntityCreature(World world) { - super(world); - } - - protected boolean bP() { - return false; - } - - protected void bq() { - this.world.methodProfiler.a("ai"); - if (this.bo > 0 && --this.bo == 0) { - AttributeInstance attributeinstance = this.getAttributeInstance(GenericAttributes.d); - - attributeinstance.b(i); - } - - this.bn = this.bP(); - float f11 = 16.0F; - - if (this.target == null) { - // CraftBukkit start - Entity target = this.findTarget(); - if (target != null) { - EntityTargetEvent event = new EntityTargetEvent(this.getBukkitEntity(), target.getBukkitEntity(), EntityTargetEvent.TargetReason.CLOSEST_PLAYER); - this.world.getServer().getPluginManager().callEvent(event); - - if (!event.isCancelled()) { - if (event.getTarget() == null) { - this.target = null; - } else { - this.target = ((CraftEntity) event.getTarget()).getHandle(); - } - } - } - // CraftBukkit end - - if (this.target != null) { - this.pathEntity = this.world.findPath(this, this.target, f11, true, false, false, true); - } - } else if (this.target.isAlive()) { - float f1 = this.target.e((Entity) this); - - if (this.hasLineOfSight(this.target)) { - this.a(this.target, f1); - } - } else { - // CraftBukkit start - EntityTargetEvent event = new EntityTargetEvent(this.getBukkitEntity(), null, EntityTargetEvent.TargetReason.TARGET_DIED); - this.world.getServer().getPluginManager().callEvent(event); - - if (!event.isCancelled()) { - if (event.getTarget() == null) { - this.target = null; - } else { - this.target = ((CraftEntity) event.getTarget()).getHandle(); - } - } - // CraftBukkit end - } - - if (this.target instanceof EntityPlayer && ((EntityPlayer) this.target).playerInteractManager.isCreative()) { - this.target = null; - } - - this.world.methodProfiler.b(); - if (!this.bn && this.target != null && (this.pathEntity == null || this.random.nextInt(20) == 0)) { - this.pathEntity = this.world.findPath(this, this.target, f11, true, false, false, true); - } else if (!this.bn && (this.pathEntity == null && this.random.nextInt(180) == 0 || this.random.nextInt(120) == 0 || this.bo > 0) && this.aU < 100) { - this.bQ(); - } - - int i = MathHelper.floor(this.boundingBox.b + 0.5D); - boolean flag = this.M(); - boolean flag1 = this.P(); - - this.pitch = 0.0F; - if (this.pathEntity != null && this.random.nextInt(100) != 0) { - this.world.methodProfiler.a("followpath"); - Vec3D vec3d = this.pathEntity.a((Entity) this); - double d0 = (double) (this.width * 2.0F); - - while (vec3d != null && vec3d.d(this.locX, vec3d.b, this.locZ) < d0 * d0) { - this.pathEntity.a(); - if (this.pathEntity.b()) { - vec3d = null; - this.pathEntity = null; - } else { - vec3d = this.pathEntity.a((Entity) this); - } - } - - this.bc = false; - if (vec3d != null) { - double d1 = vec3d.a - this.locX; - double d2 = vec3d.c - this.locZ; - double d3 = vec3d.b - (double) i; - // CraftBukkit - Math -> TrigMath - float f2 = (float) (org.bukkit.craftbukkit.TrigMath.atan2(d2, d1) * 180.0D / 3.1415927410125732D) - 90.0F; - float f3 = MathHelper.g(f2 - this.yaw); - - this.be = (float) this.getAttributeInstance(GenericAttributes.d).getValue(); - if (f3 > 30.0F) { - f3 = 30.0F; - } - - if (f3 < -30.0F) { - f3 = -30.0F; - } - - this.yaw += f3; - if (this.bn && this.target != null) { - double d4 = this.target.locX - this.locX; - double d5 = this.target.locZ - this.locZ; - float f4 = this.yaw; - - this.yaw = (float) (Math.atan2(d5, d4) * 180.0D / 3.1415927410125732D) - 90.0F; - f3 = (f4 - this.yaw + 90.0F) * 3.1415927F / 180.0F; - this.bd = -MathHelper.sin(f3) * this.be * 1.0F; - this.be = MathHelper.cos(f3) * this.be * 1.0F; - } - - if (d3 > 0.0D) { - this.bc = true; - } - } - - if (this.target != null) { - this.a(this.target, 30.0F, 30.0F); - } - - if (this.positionChanged && !this.bS()) { - this.bc = true; - } - - if (this.random.nextFloat() < 0.8F && (flag || flag1)) { - this.bc = true; - } - - this.world.methodProfiler.b(); - } else { - super.bq(); - this.pathEntity = null; - } - } - - protected void bQ() { - this.world.methodProfiler.a("stroll"); - boolean flag = false; - int i = -1; - int j = -1; - int k = -1; - float f = -99999.0F; - - for (int l = 0; l < 10; ++l) { - int i1 = MathHelper.floor(this.locX + (double) this.random.nextInt(13) - 6.0D); - int j1 = MathHelper.floor(this.locY + (double) this.random.nextInt(7) - 3.0D); - int k1 = MathHelper.floor(this.locZ + (double) this.random.nextInt(13) - 6.0D); - float f1 = this.a(i1, j1, k1); - - if (f1 > f) { - f = f1; - i = i1; - j = j1; - k = k1; - flag = true; - } - } - - if (flag) { - this.pathEntity = this.world.a(this, i, j, k, 10.0F, true, false, false, true); - } - - this.world.methodProfiler.b(); - } - - protected void a(Entity entity, float f) {} - - public float a(int i, int j, int k) { - return 0.0F; - } - - protected Entity findTarget() { - return null; - } - - public boolean canSpawn() { - int i = MathHelper.floor(this.locX); - int j = MathHelper.floor(this.boundingBox.b); - int k = MathHelper.floor(this.locZ); - - return super.canSpawn() && this.a(i, j, k) >= 0.0F; - } - - public boolean bS() { - return this.pathEntity != null; - } - - public void setPathEntity(PathEntity pathentity) { - this.pathEntity = pathentity; - } - - public Entity bT() { - return this.target; - } - - public void setTarget(Entity entity) { - this.target = entity; - } - - public boolean bU() { - return this.b(MathHelper.floor(this.locX), MathHelper.floor(this.locY), MathHelper.floor(this.locZ)); - } - - public boolean b(int i, int j, int k) { - return this.br == -1.0F ? true : this.bq.e(i, j, k) < this.br * this.br; - } - - public void a(int i, int j, int k, int l) { - this.bq.b(i, j, k); - this.br = (float) l; - } - - public ChunkCoordinates bV() { - return this.bq; - } - - public float bW() { - return this.br; - } - - public void bX() { - this.br = -1.0F; - } - - public boolean bY() { - return this.br != -1.0F; - } - - protected void bL() { - super.bL(); - if (this.bN() && this.getLeashHolder() != null && this.getLeashHolder().world == this.world) { - Entity entity = this.getLeashHolder(); - - this.a((int) entity.locX, (int) entity.locY, (int) entity.locZ, 5); - float f = this.e(entity); - - if (this instanceof EntityTameableAnimal && ((EntityTameableAnimal) this).isSitting()) { - if (f > 10.0F) { - this.world.getServer().getPluginManager().callEvent(new EntityUnleashEvent(this.getBukkitEntity(), EntityUnleashEvent.UnleashReason.DISTANCE)); // CraftBukkit - this.unleash(true, true); - } - - return; - } - - if (!this.bt) { - this.goalSelector.a(2, this.bs); - this.getNavigation().a(false); - this.bt = true; - } - - this.o(f); - if (f > 4.0F) { - this.getNavigation().a(entity, 1.0D); - } - - if (f > 6.0F) { - double d0 = (entity.locX - this.locX) / (double) f; - double d1 = (entity.locY - this.locY) / (double) f; - double d2 = (entity.locZ - this.locZ) / (double) f; - - this.motX += d0 * Math.abs(d0) * 0.4D; - this.motY += d1 * Math.abs(d1) * 0.4D; - this.motZ += d2 * Math.abs(d2) * 0.4D; - } - - if (f > 10.0F) { - this.world.getServer().getPluginManager().callEvent(new EntityUnleashEvent(this.getBukkitEntity(), EntityUnleashEvent.UnleashReason.DISTANCE)); // CraftBukkit - this.unleash(true, true); - } - } else if (!this.bN() && this.bt) { - this.bt = false; - this.goalSelector.a(this.bs); - this.getNavigation().a(true); - this.bX(); - } - } - - protected void o(float f) {} -} diff --git a/src/main/java/net/minecraft/server/EntityCreeper.java b/src/main/java/net/minecraft/server/EntityCreeper.java deleted file mode 100644 index a8162c75ff..0000000000 --- a/src/main/java/net/minecraft/server/EntityCreeper.java +++ /dev/null @@ -1,228 +0,0 @@ -package net.minecraft.server; - -// CraftBukkit start -import org.bukkit.craftbukkit.event.CraftEventFactory; -import org.bukkit.event.entity.ExplosionPrimeEvent; -// CraftBukkit end - -public class EntityCreeper extends EntityMonster { - - private int bp; - private int fuseTicks; - private int maxFuseTicks = 30; - private int explosionRadius = 3; - private int record = -1; // CraftBukkit - - public EntityCreeper(World world) { - super(world); - this.goalSelector.a(1, new PathfinderGoalFloat(this)); - this.goalSelector.a(2, new PathfinderGoalSwell(this)); - this.goalSelector.a(3, new PathfinderGoalAvoidPlayer(this, EntityOcelot.class, 6.0F, 1.0D, 1.2D)); - this.goalSelector.a(4, new PathfinderGoalMeleeAttack(this, 1.0D, false)); - this.goalSelector.a(5, new PathfinderGoalRandomStroll(this, 0.8D)); - this.goalSelector.a(6, new PathfinderGoalLookAtPlayer(this, EntityHuman.class, 8.0F)); - this.goalSelector.a(6, new PathfinderGoalRandomLookaround(this)); - this.targetSelector.a(1, new PathfinderGoalNearestAttackableTarget(this, EntityHuman.class, 0, true)); - this.targetSelector.a(2, new PathfinderGoalHurtByTarget(this, false)); - } - - protected void aD() { - super.aD(); - this.getAttributeInstance(GenericAttributes.d).setValue(0.25D); - } - - public boolean bk() { - return true; - } - - public int ax() { - return this.getGoalTarget() == null ? 3 : 3 + (int) (this.getHealth() - 1.0F); - } - - protected void b(float f) { - super.b(f); - this.fuseTicks = (int) ((float) this.fuseTicks + f * 1.5F); - if (this.fuseTicks > this.maxFuseTicks - 5) { - this.fuseTicks = this.maxFuseTicks - 5; - } - } - - protected void c() { - super.c(); - this.datawatcher.a(16, Byte.valueOf((byte) -1)); - this.datawatcher.a(17, Byte.valueOf((byte) 0)); - this.datawatcher.a(18, Byte.valueOf((byte) 0)); - } - - public void b(NBTTagCompound nbttagcompound) { - super.b(nbttagcompound); - if (this.datawatcher.getByte(17) == 1) { - nbttagcompound.setBoolean("powered", true); - } - - nbttagcompound.setShort("Fuse", (short) this.maxFuseTicks); - nbttagcompound.setByte("ExplosionRadius", (byte) this.explosionRadius); - nbttagcompound.setBoolean("ignited", this.cc()); - } - - public void a(NBTTagCompound nbttagcompound) { - super.a(nbttagcompound); - this.datawatcher.watch(17, Byte.valueOf((byte) (nbttagcompound.getBoolean("powered") ? 1 : 0))); - if (nbttagcompound.hasKeyOfType("Fuse", 99)) { - this.maxFuseTicks = nbttagcompound.getShort("Fuse"); - } - - if (nbttagcompound.hasKeyOfType("ExplosionRadius", 99)) { - this.explosionRadius = nbttagcompound.getByte("ExplosionRadius"); - } - - if (nbttagcompound.getBoolean("ignited")) { - this.cd(); - } - } - - public void h() { - if (this.isAlive()) { - this.bp = this.fuseTicks; - if (this.cc()) { - this.a(1); - } - - int i = this.cb(); - - if (i > 0 && this.fuseTicks == 0) { - this.makeSound("creeper.primed", 1.0F, 0.5F); - } - - this.fuseTicks += i; - if (this.fuseTicks < 0) { - this.fuseTicks = 0; - } - - if (this.fuseTicks >= this.maxFuseTicks) { - this.fuseTicks = this.maxFuseTicks; - this.ce(); - } - } - - super.h(); - } - - protected String aT() { - return "mob.creeper.say"; - } - - protected String aU() { - return "mob.creeper.death"; - } - - public void die(DamageSource damagesource) { - // super.die(damagesource); // CraftBukkit - Moved to end - if (damagesource.getEntity() instanceof EntitySkeleton) { - int i = Item.getId(Items.RECORD_1); - int j = Item.getId(Items.RECORD_12); - int k = i + this.random.nextInt(j - i + 1); - - // CraftBukkit start - Store record for now, drop in dropDeathLoot - // this.a(Item.getById(k), 1); - this.record = k; - // CraftBukkit end - } - - super.die(damagesource); // CraftBukkit - Moved from above - } - - // CraftBukkit start - Whole method - protected void dropDeathLoot(boolean flag, int i) { - super.dropDeathLoot(flag, i); - - // Drop a music disc? - if (this.record != -1) { - this.a(Item.getById(this.record), 1); - this.record = -1; - } - } - // CraftBukkit end - - public boolean n(Entity entity) { - return true; - } - - public boolean isPowered() { - return this.datawatcher.getByte(17) == 1; - } - - protected Item getLoot() { - return Items.SULPHUR; - } - - public int cb() { - return this.datawatcher.getByte(16); - } - - public void a(int i) { - this.datawatcher.watch(16, Byte.valueOf((byte) i)); - } - - public void a(EntityLightning entitylightning) { - super.a(entitylightning); - // CraftBukkit start - if (CraftEventFactory.callCreeperPowerEvent(this, entitylightning, org.bukkit.event.entity.CreeperPowerEvent.PowerCause.LIGHTNING).isCancelled()) { - return; - } - - this.setPowered(true); - } - - public void setPowered(boolean powered) { - if (!powered) { - this.datawatcher.watch(17, Byte.valueOf((byte) 0)); - } else { - this.datawatcher.watch(17, Byte.valueOf((byte) 1)); - } - // CraftBukkit end - } - - protected boolean a(EntityHuman entityhuman) { - ItemStack itemstack = entityhuman.inventory.getItemInHand(); - - if (itemstack != null && itemstack.getItem() == Items.FLINT_AND_STEEL) { - this.world.makeSound(this.locX + 0.5D, this.locY + 0.5D, this.locZ + 0.5D, "fire.ignite", 1.0F, this.random.nextFloat() * 0.4F + 0.8F); - entityhuman.ba(); - if (!this.world.isStatic) { - this.cd(); - itemstack.damage(1, entityhuman); - return true; - } - } - - return super.a(entityhuman); - } - - private void ce() { - if (!this.world.isStatic) { - boolean flag = this.world.getGameRules().getBoolean("mobGriefing"); - - // CraftBukkit start - float radius = this.isPowered() ? 6.0F : 3.0F; - - ExplosionPrimeEvent event = new ExplosionPrimeEvent(this.getBukkitEntity(), radius, false); - this.world.getServer().getPluginManager().callEvent(event); - if (!event.isCancelled()) { - this.world.createExplosion(this, this.locX, this.locY, this.locZ, event.getRadius(), event.getFire(), flag); - this.die(); - } else { - this.fuseTicks = 0; - } - // CraftBukkit end - } - } - - public boolean cc() { - return this.datawatcher.getByte(18) != 0; - } - - public void cd() { - this.datawatcher.watch(18, Byte.valueOf((byte) 1)); - } -} diff --git a/src/main/java/net/minecraft/server/EntityDamageSourceIndirect.java b/src/main/java/net/minecraft/server/EntityDamageSourceIndirect.java deleted file mode 100644 index 8c4670bab5..0000000000 --- a/src/main/java/net/minecraft/server/EntityDamageSourceIndirect.java +++ /dev/null @@ -1,34 +0,0 @@ -package net.minecraft.server; - -public class EntityDamageSourceIndirect extends EntityDamageSource { - - private Entity owner; - - public EntityDamageSourceIndirect(String s, Entity entity, Entity entity1) { - super(s, entity); - this.owner = entity1; - } - - public Entity i() { - return this.p; - } - - public Entity getEntity() { - return this.owner; - } - - public IChatBaseComponent getLocalizedDeathMessage(EntityLiving entityliving) { - IChatBaseComponent ichatbasecomponent = this.owner == null ? this.p.getScoreboardDisplayName() : this.owner.getScoreboardDisplayName(); - ItemStack itemstack = this.owner instanceof EntityLiving ? ((EntityLiving) this.owner).be() : null; - String s = "death.attack." + this.translationIndex; - String s1 = s + ".item"; - - return itemstack != null && itemstack.hasName() && LocaleI18n.c(s1) ? new ChatMessage(s1, new Object[] { entityliving.getScoreboardDisplayName(), ichatbasecomponent, itemstack.E()}) : new ChatMessage(s, new Object[] { entityliving.getScoreboardDisplayName(), ichatbasecomponent}); - } - - // CraftBukkit start - public Entity getProximateDamageSource() { - return super.getEntity(); - } - // CraftBukkit end -} diff --git a/src/main/java/net/minecraft/server/EntityEgg.java b/src/main/java/net/minecraft/server/EntityEgg.java deleted file mode 100644 index f999ddd65e..0000000000 --- a/src/main/java/net/minecraft/server/EntityEgg.java +++ /dev/null @@ -1,68 +0,0 @@ -package net.minecraft.server; - -// CraftBukkit start -import org.bukkit.entity.Ageable; -import org.bukkit.entity.EntityType; -import org.bukkit.entity.Player; -import org.bukkit.event.player.PlayerEggThrowEvent; -// CraftBukkit end - -public class EntityEgg extends EntityProjectile { - - public EntityEgg(World world) { - super(world); - } - - public EntityEgg(World world, EntityLiving entityliving) { - super(world, entityliving); - } - - public EntityEgg(World world, double d0, double d1, double d2) { - super(world, d0, d1, d2); - } - - protected void a(MovingObjectPosition movingobjectposition) { - if (movingobjectposition.entity != null) { - movingobjectposition.entity.damageEntity(DamageSource.projectile(this, this.getShooter()), 0.0F); - } - - // CraftBukkit start - Fire PlayerEggThrowEvent - boolean hatching = !this.world.isStatic && this.random.nextInt(8) == 0; - int numHatching = (this.random.nextInt(32) == 0) ? 4 : 1; - if (!hatching) { - numHatching = 0; - } - - EntityType hatchingType = EntityType.CHICKEN; - - Entity shooter = this.getShooter(); - if (shooter instanceof EntityPlayer) { - Player player = (shooter == null) ? null : (Player) shooter.getBukkitEntity(); - - PlayerEggThrowEvent event = new PlayerEggThrowEvent(player, (org.bukkit.entity.Egg) this.getBukkitEntity(), hatching, (byte) numHatching, hatchingType); - this.world.getServer().getPluginManager().callEvent(event); - - hatching = event.isHatching(); - numHatching = event.getNumHatches(); - hatchingType = event.getHatchingType(); - } - - if (hatching) { - for (int k = 0; k < numHatching; k++) { - org.bukkit.entity.Entity entity = world.getWorld().spawn(new org.bukkit.Location(world.getWorld(), this.locX, this.locY, this.locZ, this.yaw, 0.0F), hatchingType.getEntityClass(), org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.EGG); - if (entity instanceof Ageable) { - ((Ageable) entity).setBaby(); - } - } - } - // CraftBukkit end - - for (int j = 0; j < 8; ++j) { - this.world.addParticle("snowballpoof", this.locX, this.locY, this.locZ, 0.0D, 0.0D, 0.0D); - } - - if (!this.world.isStatic) { - this.die(); - } - } -} diff --git a/src/main/java/net/minecraft/server/EntityEnderCrystal.java b/src/main/java/net/minecraft/server/EntityEnderCrystal.java deleted file mode 100644 index cb023e2eca..0000000000 --- a/src/main/java/net/minecraft/server/EntityEnderCrystal.java +++ /dev/null @@ -1,88 +0,0 @@ -package net.minecraft.server; - -// CraftBukkit start -import org.bukkit.craftbukkit.event.CraftEventFactory; -import org.bukkit.event.entity.ExplosionPrimeEvent; -// CraftBukkit end - -public class EntityEnderCrystal extends Entity { - - public int a; - public int b; - - public EntityEnderCrystal(World world) { - super(world); - this.k = true; - this.a(2.0F, 2.0F); - this.height = this.length / 2.0F; - this.b = 5; - this.a = this.random.nextInt(100000); - } - - protected boolean g_() { - return false; - } - - protected void c() { - this.datawatcher.a(8, Integer.valueOf(this.b)); - } - - public void h() { - this.lastX = this.locX; - this.lastY = this.locY; - this.lastZ = this.locZ; - ++this.a; - this.datawatcher.watch(8, Integer.valueOf(this.b)); - int i = MathHelper.floor(this.locX); - int j = MathHelper.floor(this.locY); - int k = MathHelper.floor(this.locZ); - - if (this.world.worldProvider instanceof WorldProviderTheEnd && this.world.getType(i, j, k) != Blocks.FIRE) { - // CraftBukkit start - if (!CraftEventFactory.callBlockIgniteEvent(this.world, i, j, k, this).isCancelled()) { - this.world.setTypeUpdate(i, j, k, Blocks.FIRE); - } - // CraftBukkit end - } - } - - protected void b(NBTTagCompound nbttagcompound) {} - - protected void a(NBTTagCompound nbttagcompound) {} - - public boolean R() { - return true; - } - - public boolean damageEntity(DamageSource damagesource, float f) { - if (this.isInvulnerable()) { - return false; - } else { - if (!this.dead && !this.world.isStatic) { - // CraftBukkit start - All non-living entities need this - if (CraftEventFactory.handleNonLivingEntityDamageEvent(this, damagesource, f)) { - return false; - } - // CraftBukkit end - - this.b = 0; - if (this.b <= 0) { - this.die(); - if (!this.world.isStatic) { - // CraftBukkit start - ExplosionPrimeEvent event = new ExplosionPrimeEvent(this.getBukkitEntity(), 6.0F, false); - this.world.getServer().getPluginManager().callEvent(event); - if (event.isCancelled()) { - this.dead = false; - return false; - } - this.world.createExplosion(this, this.locX, this.locY, this.locZ, event.getRadius(), event.getFire(), true); - // CraftBukkit end - } - } - } - - return true; - } - } -} diff --git a/src/main/java/net/minecraft/server/EntityEnderDragon.java b/src/main/java/net/minecraft/server/EntityEnderDragon.java deleted file mode 100644 index 78023c4bc0..0000000000 --- a/src/main/java/net/minecraft/server/EntityEnderDragon.java +++ /dev/null @@ -1,682 +0,0 @@ -package net.minecraft.server; - -import java.util.Iterator; -import java.util.List; - -// CraftBukkit start -import org.bukkit.block.BlockState; -import org.bukkit.craftbukkit.event.CraftEventFactory; -import org.bukkit.craftbukkit.util.BlockStateListPopulator; -import org.bukkit.event.entity.EntityCreatePortalEvent; -import org.bukkit.event.entity.EntityExplodeEvent; -import org.bukkit.event.entity.EntityRegainHealthEvent; -import org.bukkit.event.entity.EntityTargetEvent; -import org.bukkit.Bukkit; -// CraftBukkit end - -public class EntityEnderDragon extends EntityInsentient implements IComplex, IMonster { - - public double h; - public double i; - public double bm; - public double[][] bn = new double[64][3]; - public int bo = -1; - public EntityComplexPart[] children; - public EntityComplexPart bq; - public EntityComplexPart br; - public EntityComplexPart bs; - public EntityComplexPart bt; - public EntityComplexPart bu; - public EntityComplexPart bv; - public EntityComplexPart bw; - public float bx; - public float by; - public boolean bz; - public boolean bA; - private Entity bD; - public int bB; - public EntityEnderCrystal bC; - private Explosion explosionSource = new Explosion(null, this, Double.NaN, Double.NaN, Double.NaN, Float.NaN); // CraftBukkit - reusable source for CraftTNTPrimed.getSource() - - public EntityEnderDragon(World world) { - super(world); - this.children = new EntityComplexPart[] { this.bq = new EntityComplexPart(this, "head", 6.0F, 6.0F), this.br = new EntityComplexPart(this, "body", 8.0F, 8.0F), this.bs = new EntityComplexPart(this, "tail", 4.0F, 4.0F), this.bt = new EntityComplexPart(this, "tail", 4.0F, 4.0F), this.bu = new EntityComplexPart(this, "tail", 4.0F, 4.0F), this.bv = new EntityComplexPart(this, "wing", 4.0F, 4.0F), this.bw = new EntityComplexPart(this, "wing", 4.0F, 4.0F)}; - this.setHealth(this.getMaxHealth()); - this.a(16.0F, 8.0F); - this.X = true; - this.fireProof = true; - this.i = 100.0D; - this.ak = true; - } - - protected void aD() { - super.aD(); - this.getAttributeInstance(GenericAttributes.maxHealth).setValue(200.0D); - } - - protected void c() { - super.c(); - } - - public double[] b(int i, float f) { - if (this.getHealth() <= 0.0F) { - f = 0.0F; - } - - f = 1.0F - f; - int j = this.bo - i * 1 & 63; - int k = this.bo - i * 1 - 1 & 63; - double[] adouble = new double[3]; - double d0 = this.bn[j][0]; - double d1 = MathHelper.g(this.bn[k][0] - d0); - - adouble[0] = d0 + d1 * (double) f; - d0 = this.bn[j][1]; - d1 = this.bn[k][1] - d0; - adouble[1] = d0 + d1 * (double) f; - adouble[2] = this.bn[j][2] + (this.bn[k][2] - this.bn[j][2]) * (double) f; - return adouble; - } - - public void e() { - float f; - float f1; - - if (this.world.isStatic) { - f = MathHelper.cos(this.by * 3.1415927F * 2.0F); - f1 = MathHelper.cos(this.bx * 3.1415927F * 2.0F); - if (f1 <= -0.3F && f >= -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.bx = this.by; - float f2; - - if (this.getHealth() <= 0.0F) { - f = (this.random.nextFloat() - 0.5F) * 8.0F; - f1 = (this.random.nextFloat() - 0.5F) * 4.0F; - f2 = (this.random.nextFloat() - 0.5F) * 8.0F; - this.world.addParticle("largeexplode", this.locX + (double) f, this.locY + 2.0D + (double) f1, this.locZ + (double) f2, 0.0D, 0.0D, 0.0D); - } else { - this.bP(); - 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.bA) { - this.by += f * 0.5F; - } else { - this.by += f; - } - - this.yaw = MathHelper.g(this.yaw); - if (this.bo < 0) { - for (int d05 = 0; d05 < this.bn.length; ++d05) { - this.bn[d05][0] = (double) this.yaw; - this.bn[d05][1] = this.locY; - } - } - - if (++this.bo == this.bn.length) { - this.bo = 0; - } - - this.bn[this.bo][0] = (double) this.yaw; - this.bn[this.bo][1] = this.locY; - double d0; - double d1; - double d2; - double d3; - float f3; - - if (this.world.isStatic) { - if (this.bg > 0) { - d0 = this.locX + (this.bh - this.locX) / (double) this.bg; - d1 = this.locY + (this.bi - this.locY) / (double) this.bg; - d2 = this.locZ + (this.bj - this.locZ) / (double) this.bg; - d3 = MathHelper.g(this.bk - (double) this.yaw); - this.yaw = (float) ((double) this.yaw + d3 / (double) this.bg); - this.pitch = (float) ((double) this.pitch + (this.bl - (double) this.pitch) / (double) this.bg); - --this.bg; - this.setPosition(d0, d1, d2); - this.b(this.yaw, this.pitch); - } - } else { - d0 = this.h - this.locX; - d1 = this.i - this.locY; - d2 = this.bm - this.locZ; - d3 = d0 * d0 + d1 * d1 + d2 * d2; - if (this.bD != null) { - this.h = this.bD.locX; - this.bm = this.bD.locZ; - double d4 = this.h - this.locX; - double d5 = this.bm - this.locZ; - double d6 = Math.sqrt(d4 * d4 + d5 * d5); - double d7 = 0.4000000059604645D + d6 / 80.0D - 1.0D; - - if (d7 > 10.0D) { - d7 = 10.0D; - } - - this.i = this.bD.boundingBox.b + d7; - } else { - this.h += this.random.nextGaussian() * 2.0D; - this.bm += this.random.nextGaussian() * 2.0D; - } - - if (this.bz || d3 < 100.0D || d3 > 22500.0D || this.positionChanged || this.F) { - this.bQ(); - } - - d1 /= (double) MathHelper.sqrt(d0 * d0 + d2 * d2); - f3 = 0.6F; - if (d1 < (double) (-f3)) { - d1 = (double) (-f3); - } - - if (d1 > (double) f3) { - d1 = (double) f3; - } - - this.motY += d1 * 0.10000000149011612D; - this.yaw = MathHelper.g(this.yaw); - double d8 = 180.0D - Math.atan2(d0, d2) * 180.0D / 3.1415927410125732D; - double d9 = MathHelper.g(d8 - (double) this.yaw); - - if (d9 > 50.0D) { - d9 = 50.0D; - } - - if (d9 < -50.0D) { - d9 = -50.0D; - } - - Vec3D vec3d = Vec3D.a(this.h - this.locX, this.i - this.locY, this.bm - this.locZ).a(); - Vec3D vec3d1 = Vec3D.a((double) MathHelper.sin(this.yaw * 3.1415927F / 180.0F), this.motY, (double) (-MathHelper.cos(this.yaw * 3.1415927F / 180.0F))).a(); - float f4 = (float) (vec3d1.b(vec3d) + 0.5D) / 1.5F; - - if (f4 < 0.0F) { - f4 = 0.0F; - } - - this.bf *= 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; - - if (d10 > 40.0D) { - d10 = 40.0D; - } - - this.bf = (float) ((double) this.bf + d9 * (0.699999988079071D / d10 / (double) f5)); - this.yaw += this.bf * 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.bA) { - this.move(this.motX * 0.800000011920929D, this.motY * 0.800000011920929D, this.motZ * 0.800000011920929D); - } else { - this.move(this.motX, this.motY, this.motZ); - } - - Vec3D vec3d2 = Vec3D.a(this.motX, this.motY, this.motZ).a(); - float f8 = (float) (vec3d2.b(vec3d1) + 1.0D) / 2.0F; - - f8 = 0.8F + 0.15F * f8; - this.motX *= (double) f8; - this.motZ *= (double) f8; - this.motY *= 0.9100000262260437D; - } - - this.aM = this.yaw; - this.bq.width = this.bq.length = 3.0F; - this.bs.width = this.bs.length = 2.0F; - this.bt.width = this.bt.length = 2.0F; - this.bu.width = this.bu.length = 2.0F; - this.br.length = 3.0F; - this.br.width = 5.0F; - this.bv.length = 2.0F; - this.bv.width = 4.0F; - this.bw.length = 3.0F; - this.bw.width = 4.0F; - f1 = (float) (this.b(5, 1.0F)[1] - this.b(10, 1.0F)[1]) * 10.0F / 180.0F * 3.1415927F; - f2 = MathHelper.cos(f1); - float f9 = -MathHelper.sin(f1); - float f10 = this.yaw * 3.1415927F / 180.0F; - float f11 = MathHelper.sin(f10); - float f12 = MathHelper.cos(f10); - - this.br.h(); - this.br.setPositionRotation(this.locX + (double) (f11 * 0.5F), this.locY, this.locZ - (double) (f12 * 0.5F), 0.0F, 0.0F); - this.bv.h(); - this.bv.setPositionRotation(this.locX + (double) (f12 * 4.5F), this.locY + 2.0D, this.locZ + (double) (f11 * 4.5F), 0.0F, 0.0F); - this.bw.h(); - this.bw.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.bv.boundingBox.grow(4.0D, 2.0D, 4.0D).d(0.0D, -2.0D, 0.0D))); - this.a(this.world.getEntities(this, this.bw.boundingBox.grow(4.0D, 2.0D, 4.0D).d(0.0D, -2.0D, 0.0D))); - this.b(this.world.getEntities(this, this.bq.boundingBox.grow(1.0D, 1.0D, 1.0D))); - } - - double[] adouble = this.b(5, 1.0F); - double[] adouble1 = this.b(0, 1.0F); - - f3 = MathHelper.sin(this.yaw * 3.1415927F / 180.0F - this.bf * 0.01F); - float f13 = MathHelper.cos(this.yaw * 3.1415927F / 180.0F - this.bf * 0.01F); - - this.bq.h(); - this.bq.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); - - for (int j = 0; j < 3; ++j) { - EntityComplexPart entitycomplexpart = null; - - if (j == 0) { - entitycomplexpart = this.bs; - } - - if (j == 1) { - entitycomplexpart = this.bt; - } - - if (j == 2) { - entitycomplexpart = this.bu; - } - - double[] adouble2 = this.b(12 + j * 2, 1.0F); - float f14 = this.yaw * 3.1415927F / 180.0F + this.b(adouble2[0] - adouble[0]) * 3.1415927F / 180.0F * 1.0F; - float f15 = MathHelper.sin(f14); - float f16 = MathHelper.cos(f14); - float f17 = 1.5F; - float f18 = (float) (j + 1) * 2.0F; - - entitycomplexpart.h(); - entitycomplexpart.setPositionRotation(this.locX - (double) ((f11 * f17 + f15 * f18) * f2), this.locY + (adouble2[1] - adouble[1]) * 1.0D - (double) ((f18 + f17) * f9) + 1.5D, this.locZ + (double) ((f12 * f17 + f16 * f18) * f2), 0.0F, 0.0F); - } - - if (!this.world.isStatic) { - this.bA = this.a(this.bq.boundingBox) | this.a(this.br.boundingBox); - } - } - } - - private void bP() { - if (this.bC != null) { - if (this.bC.dead) { - if (!this.world.isStatic) { - CraftEventFactory.entityDamage = this.bC; // CraftBukkit - this.a(this.bq, DamageSource.explosion((Explosion) null), 10.0F); - CraftEventFactory.entityDamage = null; // CraftBukkit - } - - this.bC = null; - } else if (this.ticksLived % 10 == 0 && this.getHealth() < this.getMaxHealth()) { - // CraftBukkit start - EntityRegainHealthEvent event = new EntityRegainHealthEvent(this.getBukkitEntity(), 1.0D, EntityRegainHealthEvent.RegainReason.ENDER_CRYSTAL); - this.world.getServer().getPluginManager().callEvent(event); - - if (!event.isCancelled()) { - this.setHealth((float) (this.getHealth() + event.getAmount())); - } - // CraftBukkit end - } - } - - if (this.random.nextInt(10) == 0) { - float f = 32.0F; - List list = this.world.a(EntityEnderCrystal.class, this.boundingBox.grow((double) f, (double) f, (double) f)); - EntityEnderCrystal entityendercrystal = null; - double d0 = Double.MAX_VALUE; - Iterator iterator = list.iterator(); - - while (iterator.hasNext()) { - EntityEnderCrystal entityendercrystal1 = (EntityEnderCrystal) iterator.next(); - double d1 = entityendercrystal1.f(this); - - if (d1 < d0) { - d0 = d1; - entityendercrystal = entityendercrystal1; - } - } - - this.bC = entityendercrystal; - } - } - - private void a(List list) { - double d0 = (this.br.boundingBox.a + this.br.boundingBox.d) / 2.0D; - double d1 = (this.br.boundingBox.c + this.br.boundingBox.f) / 2.0D; - Iterator iterator = list.iterator(); - - while (iterator.hasNext()) { - Entity entity = (Entity) iterator.next(); - - if (entity instanceof EntityLiving) { - double d2 = entity.locX - d0; - double d3 = entity.locZ - d1; - double d4 = d2 * d2 + d3 * d3; - - entity.g(d2 / d4 * 4.0D, 0.20000000298023224D, d3 / d4 * 4.0D); - } - } - } - - private void b(List list) { - for (int i = 0; i < list.size(); ++i) { - Entity entity = (Entity) list.get(i); - - if (entity instanceof EntityLiving) { - entity.damageEntity(DamageSource.mobAttack(this), 10.0F); - } - } - } - - private void bQ() { - this.bz = false; - if (this.random.nextInt(2) == 0 && !this.world.players.isEmpty()) { - // CraftBukkit start - Entity target = (Entity) this.world.players.get(this.random.nextInt(this.world.players.size())); - EntityTargetEvent event = new EntityTargetEvent(this.getBukkitEntity(), target.getBukkitEntity(), EntityTargetEvent.TargetReason.RANDOM_TARGET); - this.world.getServer().getPluginManager().callEvent(event); - - if (!event.isCancelled()) { - if (event.getTarget() == null) { - this.bD = null; - } else { - this.bD = ((org.bukkit.craftbukkit.entity.CraftEntity) event.getTarget()).getHandle(); - } - } - // CraftBukkit end - } else { - boolean flag = false; - - do { - this.h = 0.0D; - this.i = (double) (70.0F + this.random.nextFloat() * 50.0F); - this.bm = 0.0D; - this.h += (double) (this.random.nextFloat() * 120.0F - 60.0F); - this.bm += (double) (this.random.nextFloat() * 120.0F - 60.0F); - double d0 = this.locX - this.h; - double d1 = this.locY - this.i; - double d2 = this.locZ - this.bm; - - flag = d0 * d0 + d1 * d1 + d2 * d2 > 100.0D; - } while (!flag); - - this.bD = null; - } - } - - private float b(double d0) { - return (float) MathHelper.g(d0); - } - - private boolean a(AxisAlignedBB axisalignedbb) { - int i = MathHelper.floor(axisalignedbb.a); - int j = MathHelper.floor(axisalignedbb.b); - int k = MathHelper.floor(axisalignedbb.c); - int l = MathHelper.floor(axisalignedbb.d); - int i1 = MathHelper.floor(axisalignedbb.e); - int j1 = MathHelper.floor(axisalignedbb.f); - boolean flag = false; - boolean flag1 = false; - - // CraftBukkit start - Create a list to hold all the destroyed blocks - List destroyedBlocks = new java.util.ArrayList(); - org.bukkit.craftbukkit.CraftWorld craftWorld = this.world.getWorld(); - // CraftBukkit end - - for (int k1 = i; k1 <= l; ++k1) { - for (int l1 = j; l1 <= i1; ++l1) { - for (int i2 = k; i2 <= j1; ++i2) { - Block block = this.world.getType(k1, l1, i2); - - if (block.getMaterial() != Material.AIR) { - if (block != Blocks.OBSIDIAN && block != Blocks.WHITESTONE && block != Blocks.BEDROCK && this.world.getGameRules().getBoolean("mobGriefing")) { - // CraftBukkit start - Add blocks to list rather than destroying them - // flag1 = this.world.setAir(k1, l1, i2) || flag1; - flag1 = true; - destroyedBlocks.add(craftWorld.getBlockAt(k1, l1, i2)); - // CraftBukkit end - } else { - flag = true; - } - } - } - } - } - - if (flag1) { - // CraftBukkit start - Set off an EntityExplodeEvent for the dragon exploding all these blocks - org.bukkit.entity.Entity bukkitEntity = this.getBukkitEntity(); - EntityExplodeEvent event = new EntityExplodeEvent(bukkitEntity, bukkitEntity.getLocation(), destroyedBlocks, 0F); - Bukkit.getPluginManager().callEvent(event); - if (event.isCancelled()) { - // This flag literally means 'Dragon hit something hard' (Obsidian, White Stone or Bedrock) and will cause the dragon to slow down. - // We should consider adding an event extension for it, or perhaps returning true if the event is cancelled. - return flag; - } else if (event.getYield() == 0F) { - // Yield zero ==> no drops - for (org.bukkit.block.Block block : event.blockList()) { - this.world.setAir(block.getX(), block.getY(), block.getZ()); - } - } else { - for (org.bukkit.block.Block block : event.blockList()) { - org.bukkit.Material blockId = block.getType(); - if (blockId == org.bukkit.Material.AIR) { - continue; - } - - int blockX = block.getX(); - int blockY = block.getY(); - int blockZ = block.getZ(); - - Block nmsBlock = org.bukkit.craftbukkit.util.CraftMagicNumbers.getBlock(blockId); - if (nmsBlock.a(explosionSource)) { - nmsBlock.dropNaturally(this.world, blockX, blockY, blockZ, block.getData(), event.getYield(), 0); - } - nmsBlock.wasExploded(world, blockX, blockY, blockZ, explosionSource); - - this.world.setAir(blockX, blockY, blockZ); - } - } - // CraftBukkit end - - double d0 = axisalignedbb.a + (axisalignedbb.d - axisalignedbb.a) * (double) this.random.nextFloat(); - double d1 = axisalignedbb.b + (axisalignedbb.e - axisalignedbb.b) * (double) this.random.nextFloat(); - double d2 = axisalignedbb.c + (axisalignedbb.f - axisalignedbb.c) * (double) this.random.nextFloat(); - - this.world.addParticle("largeexplode", d0, d1, d2, 0.0D, 0.0D, 0.0D); - } - - return flag; - } - - public boolean a(EntityComplexPart entitycomplexpart, DamageSource damagesource, float f) { - if (entitycomplexpart != this.bq) { - f = f / 4.0F + 1.0F; - } - - float f1 = this.yaw * 3.1415927F / 180.0F; - float f2 = MathHelper.sin(f1); - float f3 = MathHelper.cos(f1); - - this.h = this.locX + (double) (f2 * 5.0F) + (double) ((this.random.nextFloat() - 0.5F) * 2.0F); - this.i = this.locY + (double) (this.random.nextFloat() * 3.0F) + 1.0D; - this.bm = this.locZ - (double) (f3 * 5.0F) + (double) ((this.random.nextFloat() - 0.5F) * 2.0F); - this.bD = null; - if (damagesource.getEntity() instanceof EntityHuman || damagesource.isExplosion()) { - this.dealDamage(damagesource, f); - } - - return true; - } - - public boolean damageEntity(DamageSource damagesource, float f) { - return false; - } - - public boolean dealDamage(DamageSource damagesource, float f) { // CraftBukkit - protected -> public - return super.damageEntity(damagesource, f); - } - - protected void aF() { - if (this.dead) return; // CraftBukkit - can't kill what's already dead - ++this.bB; - if (this.bB >= 180 && this.bB <= 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; - - this.world.addParticle("hugeexplosion", this.locX + (double) f, this.locY + 2.0D + (double) f1, this.locZ + (double) f2, 0.0D, 0.0D, 0.0D); - } - - int i; - int j; - - if (!this.world.isStatic) { - if (this.bB > 150 && this.bB % 5 == 0) { - i = this.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) { - j = EntityExperienceOrb.getOrbValue(i); - i -= j; - this.world.addEntity(new EntityExperienceOrb(this.world, this.locX, this.locY, this.locZ, j)); - } - } - - if (this.bB == 1) { - // CraftBukkit start - Use relative location for far away sounds - //this.world.b(1018, (int) this.locX, (int) this.locY, (int) this.locZ, 0); - int viewDistance = ((WorldServer) this.world).getServer().getViewDistance() * 16; - for (EntityPlayer player : (List) this.world.players) { - double deltaX = this.locX - player.locX; - double deltaZ = this.locZ - player.locZ; - double distanceSquared = deltaX * deltaX + deltaZ * deltaZ; - if (distanceSquared > viewDistance * viewDistance) { - double deltaLength = Math.sqrt(distanceSquared); - double relativeX = player.locX + (deltaX / deltaLength) * viewDistance; - double relativeZ = player.locZ + (deltaZ / deltaLength) * viewDistance; - player.playerConnection.sendPacket(new PacketPlayOutWorldEvent(1018, (int) relativeX, (int) this.locY, (int) relativeZ, 0, true)); - } else { - player.playerConnection.sendPacket(new PacketPlayOutWorldEvent(1018, (int) this.locX, (int) this.locY, (int) this.locZ, 0, true)); - } - } - // CraftBukkit end - } - } - - this.move(0.0D, 0.10000000149011612D, 0.0D); - this.aM = this.yaw += 20.0F; - if (this.bB == 200 && !this.world.isStatic) { - i = this.expToDrop - (10 * this.expToDrop / 12); // CraftBukkit - drop the remaining experience - - while (i > 0) { - j = EntityExperienceOrb.getOrbValue(i); - i -= j; - this.world.addEntity(new EntityExperienceOrb(this.world, this.locX, this.locY, this.locZ, j)); - } - - this.b(MathHelper.floor(this.locX), MathHelper.floor(this.locZ)); - this.die(); - } - } - - private void b(int i, int j) { - byte b0 = 64; - - BlockEnderPortal.a = true; - byte b1 = 4; - - // CraftBukkit start - Replace any "this.world" in the following with just "world"! - BlockStateListPopulator world = new BlockStateListPopulator(this.world.getWorld()); - - for (int k = b0 - 1; k <= b0 + 32; ++k) { - for (int l = i - b1; l <= i + b1; ++l) { - for (int i1 = j - b1; i1 <= j + b1; ++i1) { - double d0 = (double) (l - i); - double d1 = (double) (i1 - j); - double d2 = d0 * d0 + d1 * d1; - - if (d2 <= ((double) b1 - 0.5D) * ((double) b1 - 0.5D)) { - if (k < b0) { - if (d2 <= ((double) (b1 - 1) - 0.5D) * ((double) (b1 - 1) - 0.5D)) { - world.setTypeUpdate(l, k, i1, Blocks.BEDROCK); - } - } else if (k > b0) { - world.setTypeUpdate(l, k, i1, Blocks.AIR); - } else if (d2 > ((double) (b1 - 1) - 0.5D) * ((double) (b1 - 1) - 0.5D)) { - world.setTypeUpdate(l, k, i1, Blocks.BEDROCK); - } else { - world.setTypeUpdate(l, k, i1, Blocks.ENDER_PORTAL); - } - } - } - } - } - - world.setType(i, b0 + 0, j, Blocks.BEDROCK); - world.setType(i, b0 + 1, j, Blocks.BEDROCK); - world.setType(i, b0 + 2, j, Blocks.BEDROCK); - world.setTypeAndData(i - 1, b0 + 2, j, Blocks.TORCH, 2, 0); - world.setTypeAndData(i + 1, b0 + 2, j, Blocks.TORCH, 1, 0); - world.setTypeAndData(i, b0 + 2, j - 1, Blocks.TORCH, 4, 0); - world.setTypeAndData(i, b0 + 2, j + 1, Blocks.TORCH, 3, 0); - world.setType(i, b0 + 3, j, Blocks.BEDROCK); - world.setType(i, b0 + 4, j, Blocks.DRAGON_EGG); - - EntityCreatePortalEvent event = new EntityCreatePortalEvent((org.bukkit.entity.LivingEntity) this.getBukkitEntity(), java.util.Collections.unmodifiableList(world.getList()), org.bukkit.PortalType.ENDER); - this.world.getServer().getPluginManager().callEvent(event); - - if (!event.isCancelled()) { - for (BlockState state : event.getBlocks()) { - state.update(true); - } - } else { - for (BlockState state : event.getBlocks()) { - PacketPlayOutBlockChange packet = new PacketPlayOutBlockChange(state.getX(), state.getY(), state.getZ(), this.world); - for (Iterator it = this.world.players.iterator(); it.hasNext();) { - EntityHuman entity = (EntityHuman) it.next(); - if (entity instanceof EntityPlayer) { - ((EntityPlayer) entity).playerConnection.sendPacket(packet); - } - } - } - } - // CraftBukkit end - - BlockEnderPortal.a = false; - } - - protected void w() {} - - public Entity[] at() { - return this.children; - } - - public boolean R() { - return false; - } - - public World a() { - return this.world; - } - - protected String t() { - return "mob.enderdragon.growl"; - } - - protected String aT() { - return "mob.enderdragon.hit"; - } - - protected float bf() { - return 5.0F; - } - - // CraftBukkit start - public int getExpReward() { - // This value is equal to the amount of experience dropped while falling from the sky (10 * 1000) - // plus what is dropped when the dragon hits the ground (2000) - return 12000; - } - // CraftBukkit end -} diff --git a/src/main/java/net/minecraft/server/EntityEnderPearl.java b/src/main/java/net/minecraft/server/EntityEnderPearl.java deleted file mode 100644 index 336b6b07c2..0000000000 --- a/src/main/java/net/minecraft/server/EntityEnderPearl.java +++ /dev/null @@ -1,60 +0,0 @@ -package net.minecraft.server; - -// CraftBukkit start -import org.bukkit.Bukkit; -import org.bukkit.craftbukkit.event.CraftEventFactory; -import org.bukkit.event.player.PlayerTeleportEvent; -// CraftBukkit end - -public class EntityEnderPearl extends EntityProjectile { - - public EntityEnderPearl(World world) { - super(world); - } - - public EntityEnderPearl(World world, EntityLiving entityliving) { - super(world, entityliving); - } - - protected void a(MovingObjectPosition movingobjectposition) { - if (movingobjectposition.entity != null) { - movingobjectposition.entity.damageEntity(DamageSource.projectile(this, this.getShooter()), 0.0F); - } - - for (int i = 0; i < 32; ++i) { - this.world.addParticle("portal", this.locX, this.locY + this.random.nextDouble() * 2.0D, this.locZ, this.random.nextGaussian(), 0.0D, this.random.nextGaussian()); - } - - if (!this.world.isStatic) { - if (this.getShooter() != null && this.getShooter() instanceof EntityPlayer) { - EntityPlayer entityplayer = (EntityPlayer) this.getShooter(); - - if (entityplayer.playerConnection.b().isConnected() && entityplayer.world == this.world) { - // CraftBukkit start - Fire PlayerTeleportEvent - org.bukkit.craftbukkit.entity.CraftPlayer player = entityplayer.getBukkitEntity(); - org.bukkit.Location location = getBukkitEntity().getLocation(); - location.setPitch(player.getLocation().getPitch()); - location.setYaw(player.getLocation().getYaw()); - - PlayerTeleportEvent teleEvent = new PlayerTeleportEvent(player, player.getLocation(), location, PlayerTeleportEvent.TeleportCause.ENDER_PEARL); - Bukkit.getPluginManager().callEvent(teleEvent); - - if (!teleEvent.isCancelled() && !entityplayer.playerConnection.isDisconnected()) { - if (this.getShooter().am()) { - this.getShooter().mount((Entity) null); - } - - entityplayer.playerConnection.teleport(teleEvent.getTo()); - this.getShooter().fallDistance = 0.0F; - CraftEventFactory.entityDamage = this; - this.getShooter().damageEntity(DamageSource.FALL, 5.0F); - CraftEventFactory.entityDamage = null; - } - // CraftBukkit end - } - } - - this.die(); - } - } -} diff --git a/src/main/java/net/minecraft/server/EntityEnderman.java b/src/main/java/net/minecraft/server/EntityEnderman.java deleted file mode 100644 index fa6670bc21..0000000000 --- a/src/main/java/net/minecraft/server/EntityEnderman.java +++ /dev/null @@ -1,382 +0,0 @@ -package net.minecraft.server; - -import java.util.UUID; - -// CraftBukkit start -import org.bukkit.Location; -import org.bukkit.craftbukkit.event.CraftEventFactory; -import org.bukkit.event.entity.EntityTeleportEvent; -// CraftBukkit end - -public class EntityEnderman extends EntityMonster { - - private static final UUID bp = UUID.fromString("020E0DFB-87AE-4653-9556-831010E291A0"); - private static final AttributeModifier bq = (new AttributeModifier(bp, "Attacking speed boost", 6.199999809265137D, 0)).a(false); - private static boolean[] br = new boolean[256]; - private int bs; - private int bt; - private Entity bu; - private boolean bv; - - public EntityEnderman(World world) { - super(world); - this.a(0.6F, 2.9F); - this.W = 1.0F; - } - - protected void aD() { - super.aD(); - this.getAttributeInstance(GenericAttributes.maxHealth).setValue(40.0D); - this.getAttributeInstance(GenericAttributes.d).setValue(0.30000001192092896D); - this.getAttributeInstance(GenericAttributes.e).setValue(7.0D); - } - - protected void c() { - super.c(); - this.datawatcher.a(16, new Byte((byte) 0)); - this.datawatcher.a(17, new Byte((byte) 0)); - this.datawatcher.a(18, new Byte((byte) 0)); - } - - public void b(NBTTagCompound nbttagcompound) { - super.b(nbttagcompound); - nbttagcompound.setShort("carried", (short) Block.getId(this.getCarried())); - nbttagcompound.setShort("carriedData", (short) this.getCarriedData()); - } - - public void a(NBTTagCompound nbttagcompound) { - super.a(nbttagcompound); - this.setCarried(Block.getById(nbttagcompound.getShort("carried"))); - this.setCarriedData(nbttagcompound.getShort("carriedData")); - } - - protected Entity findTarget() { - EntityHuman entityhuman = this.world.findNearbyVulnerablePlayer(this, 64.0D); - - if (entityhuman != null) { - if (this.f(entityhuman)) { - this.bv = true; - if (this.bt == 0) { - this.world.makeSound(entityhuman.locX, entityhuman.locY, entityhuman.locZ, "mob.endermen.stare", 1.0F, 1.0F); - } - - if (this.bt++ == 5) { - this.bt = 0; - this.a(true); - return entityhuman; - } - } else { - this.bt = 0; - } - } - - return null; - } - - private boolean f(EntityHuman entityhuman) { - ItemStack itemstack = entityhuman.inventory.armor[3]; - - if (itemstack != null && itemstack.getItem() == Item.getItemOf(Blocks.PUMPKIN)) { - return false; - } else { - Vec3D vec3d = entityhuman.j(1.0F).a(); - Vec3D vec3d1 = Vec3D.a(this.locX - entityhuman.locX, this.boundingBox.b + (double) (this.length / 2.0F) - (entityhuman.locY + (double) entityhuman.getHeadHeight()), this.locZ - entityhuman.locZ); - double d0 = vec3d1.b(); - - vec3d1 = vec3d1.a(); - double d1 = vec3d.b(vec3d1); - - return d1 > 1.0D - 0.025D / d0 && entityhuman.hasLineOfSight(this); - } - } - - public void e() { - if (this.L()) { - this.damageEntity(DamageSource.DROWN, 1.0F); - } - - if (this.bu != this.target) { - AttributeInstance attributeinstance = this.getAttributeInstance(GenericAttributes.d); - - attributeinstance.b(bq); - if (this.target != null) { - attributeinstance.a(bq); - } - } - - this.bu = this.target; - int i; - - if (!this.world.isStatic && this.world.getGameRules().getBoolean("mobGriefing")) { - int j; - int k; - Block block; - - if (this.getCarried().getMaterial() == Material.AIR) { - if (this.random.nextInt(20) == 0) { - i = MathHelper.floor(this.locX - 2.0D + this.random.nextDouble() * 4.0D); - j = MathHelper.floor(this.locY + this.random.nextDouble() * 3.0D); - k = MathHelper.floor(this.locZ - 2.0D + this.random.nextDouble() * 4.0D); - block = this.world.getType(i, j, k); - if (br[Block.getId(block)]) { - // CraftBukkit start - Pickup event - if (!CraftEventFactory.callEntityChangeBlockEvent(this, this.world.getWorld().getBlockAt(i, j, k), org.bukkit.Material.AIR).isCancelled()) { - this.setCarried(block); - this.setCarriedData(this.world.getData(i, j, k)); - this.world.setTypeUpdate(i, j, k, Blocks.AIR); - } - // CraftBukkit end - } - } - } else if (this.random.nextInt(2000) == 0) { - i = MathHelper.floor(this.locX - 1.0D + this.random.nextDouble() * 2.0D); - j = MathHelper.floor(this.locY + this.random.nextDouble() * 2.0D); - k = MathHelper.floor(this.locZ - 1.0D + this.random.nextDouble() * 2.0D); - block = this.world.getType(i, j, k); - Block block1 = this.world.getType(i, j - 1, k); - - if (block.getMaterial() == Material.AIR && block1.getMaterial() != Material.AIR && block1.d()) { - // CraftBukkit start - Place event - if (!CraftEventFactory.callEntityChangeBlockEvent(this, i, j, k, this.getCarried(), this.getCarriedData()).isCancelled()) { - this.world.setTypeAndData(i, j, k, this.getCarried(), this.getCarriedData(), 3); - this.setCarried(Blocks.AIR); - } - // CraftBukkit end - } - } - } - - for (i = 0; i < 2; ++i) { - this.world.addParticle("portal", this.locX + (this.random.nextDouble() - 0.5D) * (double) this.width, this.locY + this.random.nextDouble() * (double) this.length - 0.25D, this.locZ + (this.random.nextDouble() - 0.5D) * (double) this.width, (this.random.nextDouble() - 0.5D) * 2.0D, -this.random.nextDouble(), (this.random.nextDouble() - 0.5D) * 2.0D); - } - - if (this.world.w() && !this.world.isStatic) { - float f = this.d(1.0F); - - if (f > 0.5F && this.world.i(MathHelper.floor(this.locX), MathHelper.floor(this.locY), MathHelper.floor(this.locZ)) && this.random.nextFloat() * 30.0F < (f - 0.4F) * 2.0F) { - this.target = null; - this.a(false); - this.bv = false; - this.bZ(); - } - } - - if (this.L() || this.isBurning()) { - this.target = null; - this.a(false); - this.bv = false; - this.bZ(); - } - - if (this.cd() && !this.bv && this.random.nextInt(100) == 0) { - this.a(false); - } - - this.bc = false; - if (this.target != null) { - this.a(this.target, 100.0F, 100.0F); - } - - if (!this.world.isStatic && this.isAlive()) { - if (this.target != null) { - if (this.target instanceof EntityHuman && this.f((EntityHuman) this.target)) { - if (this.target.f((Entity) this) < 16.0D) { - this.bZ(); - } - - this.bs = 0; - } else if (this.target.f((Entity) this) > 256.0D && this.bs++ >= 30 && this.c(this.target)) { - this.bs = 0; - } - } else { - this.a(false); - this.bs = 0; - } - } - - super.e(); - } - - protected boolean bZ() { - double d0 = this.locX + (this.random.nextDouble() - 0.5D) * 64.0D; - double d1 = this.locY + (double) (this.random.nextInt(64) - 32); - double d2 = this.locZ + (this.random.nextDouble() - 0.5D) * 64.0D; - - return this.k(d0, d1, d2); - } - - protected boolean c(Entity entity) { - Vec3D vec3d = Vec3D.a(this.locX - entity.locX, this.boundingBox.b + (double) (this.length / 2.0F) - entity.locY + (double) entity.getHeadHeight(), this.locZ - entity.locZ); - - vec3d = vec3d.a(); - double d0 = 16.0D; - double d1 = this.locX + (this.random.nextDouble() - 0.5D) * 8.0D - vec3d.a * d0; - double d2 = this.locY + (double) (this.random.nextInt(16) - 8) - vec3d.b * d0; - double d3 = this.locZ + (this.random.nextDouble() - 0.5D) * 8.0D - vec3d.c * d0; - - return this.k(d1, d2, d3); - } - - protected boolean k(double d0, double d1, double d2) { - double d3 = this.locX; - double d4 = this.locY; - double d5 = this.locZ; - - this.locX = d0; - this.locY = d1; - this.locZ = d2; - boolean flag = false; - int i = MathHelper.floor(this.locX); - int j = MathHelper.floor(this.locY); - int k = MathHelper.floor(this.locZ); - - if (this.world.isLoaded(i, j, k)) { - boolean flag1 = false; - - while (!flag1 && j > 0) { - Block block = this.world.getType(i, j - 1, k); - - if (block.getMaterial().isSolid()) { - flag1 = true; - } else { - --this.locY; - --j; - } - } - - if (flag1) { - // CraftBukkit start - Teleport event - EntityTeleportEvent teleport = new EntityTeleportEvent(this.getBukkitEntity(), new Location(this.world.getWorld(), d3, d4, d5), new Location(this.world.getWorld(), this.locX, this.locY, this.locZ)); - this.world.getServer().getPluginManager().callEvent(teleport); - if (teleport.isCancelled()) { - return false; - } - - Location to = teleport.getTo(); - this.setPosition(to.getX(), to.getY(), to.getZ()); - // CraftBukkit end - - if (this.world.getCubes(this, this.boundingBox).isEmpty() && !this.world.containsLiquid(this.boundingBox)) { - flag = true; - } - } - } - - if (!flag) { - this.setPosition(d3, d4, d5); - return false; - } else { - short short1 = 128; - - for (int l = 0; l < short1; ++l) { - double d6 = (double) l / ((double) short1 - 1.0D); - float f = (this.random.nextFloat() - 0.5F) * 0.2F; - float f1 = (this.random.nextFloat() - 0.5F) * 0.2F; - float f2 = (this.random.nextFloat() - 0.5F) * 0.2F; - double d7 = d3 + (this.locX - d3) * d6 + (this.random.nextDouble() - 0.5D) * (double) this.width * 2.0D; - double d8 = d4 + (this.locY - d4) * d6 + this.random.nextDouble() * (double) this.length; - double d9 = d5 + (this.locZ - d5) * d6 + (this.random.nextDouble() - 0.5D) * (double) this.width * 2.0D; - - this.world.addParticle("portal", d7, d8, d9, (double) f, (double) f1, (double) f2); - } - - this.world.makeSound(d3, d4, d5, "mob.endermen.portal", 1.0F, 1.0F); - this.makeSound("mob.endermen.portal", 1.0F, 1.0F); - return true; - } - } - - protected String t() { - return this.cd() ? "mob.endermen.scream" : "mob.endermen.idle"; - } - - protected String aT() { - return "mob.endermen.hit"; - } - - protected String aU() { - return "mob.endermen.death"; - } - - protected Item getLoot() { - return Items.ENDER_PEARL; - } - - protected void dropDeathLoot(boolean flag, int i) { - Item item = this.getLoot(); - - if (item != null) { - int j = this.random.nextInt(2 + i); - - for (int k = 0; k < j; ++k) { - this.a(item, 1); - } - } - } - - public void setCarried(Block block) { - this.datawatcher.watch(16, Byte.valueOf((byte) (Block.getId(block) & 255))); - } - - public Block getCarried() { - return Block.getById(this.datawatcher.getByte(16)); - } - - public void setCarriedData(int i) { - this.datawatcher.watch(17, Byte.valueOf((byte) (i & 255))); - } - - public int getCarriedData() { - return this.datawatcher.getByte(17); - } - - public boolean damageEntity(DamageSource damagesource, float f) { - if (this.isInvulnerable()) { - return false; - } else { - this.a(true); - if (damagesource instanceof EntityDamageSource && damagesource.getEntity() instanceof EntityHuman) { - this.bv = true; - } - - if (damagesource instanceof EntityDamageSourceIndirect) { - this.bv = false; - - for (int i = 0; i < 64; ++i) { - if (this.bZ()) { - return true; - } - } - - return false; - } else { - return super.damageEntity(damagesource, f); - } - } - } - - public boolean cd() { - return this.datawatcher.getByte(18) > 0; - } - - public void a(boolean flag) { - this.datawatcher.watch(18, Byte.valueOf((byte) (flag ? 1 : 0))); - } - - static { - br[Block.getId(Blocks.GRASS)] = true; - br[Block.getId(Blocks.DIRT)] = true; - br[Block.getId(Blocks.SAND)] = true; - br[Block.getId(Blocks.GRAVEL)] = true; - br[Block.getId(Blocks.YELLOW_FLOWER)] = true; - br[Block.getId(Blocks.RED_ROSE)] = true; - br[Block.getId(Blocks.BROWN_MUSHROOM)] = true; - br[Block.getId(Blocks.RED_MUSHROOM)] = true; - br[Block.getId(Blocks.TNT)] = true; - br[Block.getId(Blocks.CACTUS)] = true; - br[Block.getId(Blocks.CLAY)] = true; - br[Block.getId(Blocks.PUMPKIN)] = true; - br[Block.getId(Blocks.MELON)] = true; - br[Block.getId(Blocks.MYCEL)] = true; - } -} diff --git a/src/main/java/net/minecraft/server/EntityExperienceOrb.java b/src/main/java/net/minecraft/server/EntityExperienceOrb.java deleted file mode 100644 index 5750760369..0000000000 --- a/src/main/java/net/minecraft/server/EntityExperienceOrb.java +++ /dev/null @@ -1,188 +0,0 @@ -package net.minecraft.server; - -// CraftBukkit start -import org.bukkit.craftbukkit.event.CraftEventFactory; -import org.bukkit.event.entity.EntityTargetEvent; -// CraftBukkit end - -public class EntityExperienceOrb extends Entity { - - public int a; - public int b; - public int c; - private int d = 5; - public int value; // CraftBukkit - private -> public - private EntityHuman targetPlayer; - private int targetTime; - - public EntityExperienceOrb(World world, double d0, double d1, double d2, int i) { - super(world); - this.a(0.5F, 0.5F); - this.height = this.length / 2.0F; - this.setPosition(d0, d1, d2); - this.yaw = (float) (Math.random() * 360.0D); - this.motX = (double) ((float) (Math.random() * 0.20000000298023224D - 0.10000000149011612D) * 2.0F); - this.motY = (double) ((float) (Math.random() * 0.2D) * 2.0F); - this.motZ = (double) ((float) (Math.random() * 0.20000000298023224D - 0.10000000149011612D) * 2.0F); - this.value = i; - } - - protected boolean g_() { - return false; - } - - public EntityExperienceOrb(World world) { - super(world); - this.a(0.25F, 0.25F); - this.height = this.length / 2.0F; - } - - protected void c() {} - - public void h() { - super.h(); - if (this.c > 0) { - --this.c; - } - - this.lastX = this.locX; - this.lastY = this.locY; - this.lastZ = this.locZ; - this.motY -= 0.029999999329447746D; - if (this.world.getType(MathHelper.floor(this.locX), MathHelper.floor(this.locY), MathHelper.floor(this.locZ)).getMaterial() == Material.LAVA) { - this.motY = 0.20000000298023224D; - this.motX = (double) ((this.random.nextFloat() - this.random.nextFloat()) * 0.2F); - this.motZ = (double) ((this.random.nextFloat() - this.random.nextFloat()) * 0.2F); - this.makeSound("random.fizz", 0.4F, 2.0F + this.random.nextFloat() * 0.4F); - } - - this.j(this.locX, (this.boundingBox.b + this.boundingBox.e) / 2.0D, this.locZ); - double d0 = 8.0D; - - if (this.targetTime < this.a - 20 + this.getId() % 100) { - if (this.targetPlayer == null || this.targetPlayer.f(this) > d0 * d0) { - this.targetPlayer = this.world.findNearbyPlayer(this, d0); - } - - this.targetTime = this.a; - } - - if (this.targetPlayer != null) { - // CraftBukkit start - EntityTargetEvent event = CraftEventFactory.callEntityTargetEvent(this, targetPlayer, EntityTargetEvent.TargetReason.CLOSEST_PLAYER); - Entity target = event.getTarget() == null ? null : ((org.bukkit.craftbukkit.entity.CraftEntity) event.getTarget()).getHandle(); - - if (!event.isCancelled() && target != null) { - double d1 = (target.locX - this.locX) / d0; - double d2 = (target.locY + (double) target.getHeadHeight() - this.locY) / d0; - double d3 = (target.locZ - this.locZ) / d0; - double d4 = Math.sqrt(d1 * d1 + d2 * d2 + d3 * d3); - double d5 = 1.0D - d4; - if (d5 > 0.0D) { - d5 *= d5; - this.motX += d1 / d4 * d5 * 0.1D; - this.motY += d2 / d4 * d5 * 0.1D; - this.motZ += d3 / d4 * d5 * 0.1D; - } - // CraftBukkit end - } - } - - this.move(this.motX, this.motY, this.motZ); - float f = 0.98F; - - if (this.onGround) { - f = this.world.getType(MathHelper.floor(this.locX), MathHelper.floor(this.boundingBox.b) - 1, MathHelper.floor(this.locZ)).frictionFactor * 0.98F; - } - - this.motX *= (double) f; - this.motY *= 0.9800000190734863D; - this.motZ *= (double) f; - if (this.onGround) { - this.motY *= -0.8999999761581421D; - } - - ++this.a; - ++this.b; - if (this.b >= 6000) { - this.die(); - } - } - - public boolean N() { - return this.world.a(this.boundingBox, Material.WATER, (Entity) this); - } - - protected void burn(int i) { - this.damageEntity(DamageSource.FIRE, (float) i); - } - - public boolean damageEntity(DamageSource damagesource, float f) { - if (this.isInvulnerable()) { - return false; - } else { - this.Q(); - this.d = (int) ((float) this.d - f); - if (this.d <= 0) { - this.die(); - } - - return false; - } - } - - public void b(NBTTagCompound nbttagcompound) { - nbttagcompound.setShort("Health", (short) ((byte) this.d)); - nbttagcompound.setShort("Age", (short) this.b); - nbttagcompound.setShort("Value", (short) this.value); - } - - public void a(NBTTagCompound nbttagcompound) { - this.d = nbttagcompound.getShort("Health") & 255; - this.b = nbttagcompound.getShort("Age"); - this.value = nbttagcompound.getShort("Value"); - } - - public void b_(EntityHuman entityhuman) { - if (!this.world.isStatic) { - if (this.c == 0 && entityhuman.bt == 0) { - entityhuman.bt = 2; - this.world.makeSound(entityhuman, "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 -> event.getAmount() - this.die(); - } - } - } - - public int e() { - return this.value; - } - - public static int getOrbValue(int i) { - // CraftBukkit start - if (i > 162670129) return i - 100000; - if (i > 81335063) return 81335063; - if (i > 40667527) return 40667527; - if (i > 20333759) return 20333759; - if (i > 10166857) return 10166857; - if (i > 5083423) return 5083423; - if (i > 2541701) return 2541701; - if (i > 1270849) return 1270849; - if (i > 635413) return 635413; - if (i > 317701) return 317701; - if (i > 158849) return 158849; - if (i > 79423) return 79423; - if (i > 39709) return 39709; - if (i > 19853) return 19853; - if (i > 9923) return 9923; - if (i > 4957) return 4957; - // CraftBukkit end - - return i >= 2477 ? 2477 : (i >= 1237 ? 1237 : (i >= 617 ? 617 : (i >= 307 ? 307 : (i >= 149 ? 149 : (i >= 73 ? 73 : (i >= 37 ? 37 : (i >= 17 ? 17 : (i >= 7 ? 7 : (i >= 3 ? 3 : 1))))))))); - } - - public boolean av() { - return false; - } -} diff --git a/src/main/java/net/minecraft/server/EntityFallingBlock.java b/src/main/java/net/minecraft/server/EntityFallingBlock.java deleted file mode 100644 index 5576f1513f..0000000000 --- a/src/main/java/net/minecraft/server/EntityFallingBlock.java +++ /dev/null @@ -1,233 +0,0 @@ -package net.minecraft.server; - -import java.util.ArrayList; -import java.util.Iterator; - -import org.bukkit.craftbukkit.event.CraftEventFactory; // CraftBukkit - -public class EntityFallingBlock extends Entity { - - public Block id; // CraftBukkit - private -> public - public int data; - public int ticksLived; - public boolean dropItem; - private boolean f; - private boolean hurtEntities; - private int fallHurtMax; - private float fallHurtAmount; - public NBTTagCompound tileEntityData; - - public EntityFallingBlock(World world) { - super(world); - this.dropItem = true; - this.fallHurtMax = 40; - this.fallHurtAmount = 2.0F; - } - - public EntityFallingBlock(World world, double d0, double d1, double d2, Block block) { - this(world, d0, d1, d2, block, 0); - } - - public EntityFallingBlock(World world, double d0, double d1, double d2, Block block, int i) { - super(world); - this.dropItem = true; - this.fallHurtMax = 40; - this.fallHurtAmount = 2.0F; - this.id = block; - this.data = i; - this.k = true; - this.a(0.98F, 0.98F); - this.height = this.length / 2.0F; - this.setPosition(d0, d1, d2); - this.motX = 0.0D; - this.motY = 0.0D; - this.motZ = 0.0D; - this.lastX = d0; - this.lastY = d1; - this.lastZ = d2; - } - - protected boolean g_() { - return false; - } - - protected void c() {} - - public boolean R() { - return !this.dead; - } - - public void h() { - if (this.id.getMaterial() == Material.AIR) { - this.die(); - } else { - this.lastX = this.locX; - this.lastY = this.locY; - this.lastZ = this.locZ; - ++this.ticksLived; - this.motY -= 0.03999999910593033D; - this.move(this.motX, this.motY, this.motZ); - this.motX *= 0.9800000190734863D; - this.motY *= 0.9800000190734863D; - this.motZ *= 0.9800000190734863D; - if (!this.world.isStatic) { - int i = MathHelper.floor(this.locX); - int j = MathHelper.floor(this.locY); - int k = MathHelper.floor(this.locZ); - - if (this.ticksLived == 1) { - // CraftBukkit - compare data and call event - if (this.ticksLived != 1 || this.world.getType(i, j, k) != this.id || this.world.getData(i, j, k) != this.data || CraftEventFactory.callEntityChangeBlockEvent(this, i, j, k, Blocks.AIR, 0).isCancelled()) { - this.die(); - return; - } - - this.world.setAir(i, j, k); - } - - if (this.onGround) { - this.motX *= 0.699999988079071D; - this.motZ *= 0.699999988079071D; - this.motY *= -0.5D; - if (this.world.getType(i, j, k) != Blocks.PISTON_MOVING) { - this.die(); - // CraftBukkit start - fire EntityChangeBlockEvent - if (!this.f && this.world.mayPlace(this.id, i, j, k, true, 1, (Entity) null, (ItemStack) null) && !BlockFalling.canFall(this.world, i, j - 1, k) /* mimic the false conditions of setTypeIdAndData */ && i >= -30000000 && k >= -30000000 && i < 30000000 && k < 30000000 && j > 0 && j < 256 && !(this.world.getType(i, j, k) == this.id && this.world.getData(i, j, k) == this.data)) { - if (CraftEventFactory.callEntityChangeBlockEvent(this, i, j, k, this.id, this.data).isCancelled()) { - return; - } - this.world.setTypeAndData(i, j, k, this.id, this.data, 3); - // CraftBukkit end - - if (this.id instanceof BlockFalling) { - ((BlockFalling) this.id).a(this.world, i, j, k, this.data); - } - - if (this.tileEntityData != null && this.id instanceof IContainer) { - TileEntity tileentity = this.world.getTileEntity(i, j, k); - - if (tileentity != null) { - NBTTagCompound nbttagcompound = new NBTTagCompound(); - - tileentity.b(nbttagcompound); - Iterator iterator = this.tileEntityData.c().iterator(); - - while (iterator.hasNext()) { - String s = (String) iterator.next(); - NBTBase nbtbase = this.tileEntityData.get(s); - - if (!s.equals("x") && !s.equals("y") && !s.equals("z")) { - nbttagcompound.set(s, nbtbase.clone()); - } - } - - tileentity.a(nbttagcompound); - tileentity.update(); - } - } - } else if (this.dropItem && !this.f) { - this.a(new ItemStack(this.id, 1, this.id.getDropData(this.data)), 0.0F); - } - } - } else if (this.ticksLived > 100 && !this.world.isStatic && (j < 1 || j > 256) || this.ticksLived > 600) { - if (this.dropItem) { - this.a(new ItemStack(this.id, 1, this.id.getDropData(this.data)), 0.0F); - } - - this.die(); - } - } - } - } - - protected void b(float f) { - if (this.hurtEntities) { - int i = MathHelper.f(f - 1.0F); - - if (i > 0) { - ArrayList arraylist = new ArrayList(this.world.getEntities(this, this.boundingBox)); - boolean flag = this.id == Blocks.ANVIL; - DamageSource damagesource = flag ? DamageSource.ANVIL : DamageSource.FALLING_BLOCK; - Iterator iterator = arraylist.iterator(); - - while (iterator.hasNext()) { - Entity entity = (Entity) iterator.next(); - - CraftEventFactory.entityDamage = this; // CraftBukkit - entity.damageEntity(damagesource, (float) Math.min(MathHelper.d((float) i * this.fallHurtAmount), this.fallHurtMax)); - CraftEventFactory.entityDamage = null; // CraftBukkit - } - - if (flag && (double) this.random.nextFloat() < 0.05000000074505806D + (double) i * 0.05D) { - int j = this.data >> 2; - int k = this.data & 3; - - ++j; - if (j > 2) { - this.f = true; - } else { - this.data = k | j << 2; - } - } - } - } - } - - protected void b(NBTTagCompound nbttagcompound) { - nbttagcompound.setByte("Tile", (byte) Block.getId(this.id)); - nbttagcompound.setInt("TileID", Block.getId(this.id)); - nbttagcompound.setByte("Data", (byte) this.data); - nbttagcompound.setByte("Time", (byte) this.ticksLived); - nbttagcompound.setBoolean("DropItem", this.dropItem); - nbttagcompound.setBoolean("HurtEntities", this.hurtEntities); - nbttagcompound.setFloat("FallHurtAmount", this.fallHurtAmount); - nbttagcompound.setInt("FallHurtMax", this.fallHurtMax); - if (this.tileEntityData != null) { - nbttagcompound.set("TileEntityData", this.tileEntityData); - } - } - - protected void a(NBTTagCompound nbttagcompound) { - if (nbttagcompound.hasKeyOfType("TileID", 99)) { - this.id = Block.getById(nbttagcompound.getInt("TileID")); - } else { - this.id = Block.getById(nbttagcompound.getByte("Tile") & 255); - } - - this.data = nbttagcompound.getByte("Data") & 255; - this.ticksLived = nbttagcompound.getByte("Time") & 255; - if (nbttagcompound.hasKeyOfType("HurtEntities", 99)) { - this.hurtEntities = nbttagcompound.getBoolean("HurtEntities"); - this.fallHurtAmount = nbttagcompound.getFloat("FallHurtAmount"); - this.fallHurtMax = nbttagcompound.getInt("FallHurtMax"); - } else if (this.id == Blocks.ANVIL) { - this.hurtEntities = true; - } - - if (nbttagcompound.hasKeyOfType("DropItem", 99)) { - this.dropItem = nbttagcompound.getBoolean("DropItem"); - } - - if (nbttagcompound.hasKeyOfType("TileEntityData", 10)) { - this.tileEntityData = nbttagcompound.getCompound("TileEntityData"); - } - - if (this.id.getMaterial() == Material.AIR) { - this.id = Blocks.SAND; - } - } - - public void a(boolean flag) { - this.hurtEntities = flag; - } - - public void a(CrashReportSystemDetails crashreportsystemdetails) { - super.a(crashreportsystemdetails); - crashreportsystemdetails.a("Immitating block ID", Integer.valueOf(Block.getId(this.id))); - crashreportsystemdetails.a("Immitating block data", Integer.valueOf(this.data)); - } - - public Block f() { - return this.id; - } -} diff --git a/src/main/java/net/minecraft/server/EntityFireball.java b/src/main/java/net/minecraft/server/EntityFireball.java deleted file mode 100644 index 02d90aa265..0000000000 --- a/src/main/java/net/minecraft/server/EntityFireball.java +++ /dev/null @@ -1,269 +0,0 @@ -package net.minecraft.server; - -import java.util.List; - -import org.bukkit.craftbukkit.event.CraftEventFactory; // CraftBukkit - -public abstract class EntityFireball extends Entity { - - private int e = -1; - private int f = -1; - private int g = -1; - private Block h; - private boolean i; - public EntityLiving shooter; - private int at; - private int au; - public double dirX; - public double dirY; - public double dirZ; - public float bukkitYield = 1; // CraftBukkit - public boolean isIncendiary = true; // CraftBukkit - - public EntityFireball(World world) { - super(world); - this.a(1.0F, 1.0F); - } - - protected void c() {} - - public EntityFireball(World world, double d0, double d1, double d2, double d3, double d4, double d5) { - super(world); - this.a(1.0F, 1.0F); - this.setPositionRotation(d0, d1, d2, this.yaw, this.pitch); - this.setPosition(d0, d1, d2); - double d6 = (double) MathHelper.sqrt(d3 * d3 + d4 * d4 + d5 * d5); - - this.dirX = d3 / d6 * 0.1D; - this.dirY = d4 / d6 * 0.1D; - this.dirZ = d5 / d6 * 0.1D; - } - - public EntityFireball(World world, EntityLiving entityliving, double d0, double d1, double d2) { - super(world); - this.shooter = entityliving; - this.projectileSource = (org.bukkit.entity.LivingEntity) entityliving.getBukkitEntity(); // CraftBukkit - this.a(1.0F, 1.0F); - this.setPositionRotation(entityliving.locX, entityliving.locY, entityliving.locZ, entityliving.yaw, entityliving.pitch); - this.setPosition(this.locX, this.locY, this.locZ); - this.height = 0.0F; - this.motX = this.motY = this.motZ = 0.0D; - // CraftBukkit start - Added setDirection method - this.setDirection(d0, d1, d2); - } - - public void setDirection(double d0, double d1, double d2) { - // CraftBukkit end - d0 += this.random.nextGaussian() * 0.4D; - d1 += this.random.nextGaussian() * 0.4D; - d2 += this.random.nextGaussian() * 0.4D; - double d3 = (double) MathHelper.sqrt(d0 * d0 + d1 * d1 + d2 * d2); - - this.dirX = d0 / d3 * 0.1D; - this.dirY = d1 / d3 * 0.1D; - this.dirZ = d2 / d3 * 0.1D; - } - - public void h() { - if (!this.world.isStatic && (this.shooter != null && this.shooter.dead || !this.world.isLoaded((int) this.locX, (int) this.locY, (int) this.locZ))) { - this.die(); - } else { - super.h(); - this.setOnFire(1); - if (this.i) { - if (this.world.getType(this.e, this.f, this.g) == this.h) { - ++this.at; - if (this.at == 600) { - this.die(); - } - - return; - } - - this.i = false; - this.motX *= (double) (this.random.nextFloat() * 0.2F); - this.motY *= (double) (this.random.nextFloat() * 0.2F); - this.motZ *= (double) (this.random.nextFloat() * 0.2F); - this.at = 0; - this.au = 0; - } else { - ++this.au; - } - - Vec3D vec3d = Vec3D.a(this.locX, this.locY, this.locZ); - Vec3D vec3d1 = Vec3D.a(this.locX + this.motX, this.locY + this.motY, this.locZ + this.motZ); - MovingObjectPosition movingobjectposition = this.world.a(vec3d, vec3d1); - - vec3d = Vec3D.a(this.locX, this.locY, this.locZ); - vec3d1 = Vec3D.a(this.locX + this.motX, this.locY + this.motY, this.locZ + this.motZ); - if (movingobjectposition != null) { - vec3d1 = Vec3D.a(movingobjectposition.pos.a, movingobjectposition.pos.b, movingobjectposition.pos.c); - } - - Entity entity = null; - List list = this.world.getEntities(this, this.boundingBox.a(this.motX, this.motY, this.motZ).grow(1.0D, 1.0D, 1.0D)); - double d0 = 0.0D; - - for (int i = 0; i < list.size(); ++i) { - Entity entity1 = (Entity) list.get(i); - - if (entity1.R() && (!entity1.i(this.shooter) || this.au >= 25)) { - float f = 0.3F; - AxisAlignedBB axisalignedbb = entity1.boundingBox.grow((double) f, (double) f, (double) f); - MovingObjectPosition movingobjectposition1 = axisalignedbb.a(vec3d, vec3d1); - - if (movingobjectposition1 != null) { - double d1 = vec3d.distanceSquared(movingobjectposition1.pos); // CraftBukkit - distance efficiency - - if (d1 < d0 || d0 == 0.0D) { - entity = entity1; - d0 = d1; - } - } - } - } - - if (entity != null) { - movingobjectposition = new MovingObjectPosition(entity); - } - - if (movingobjectposition != null) { - this.a(movingobjectposition); - - // CraftBukkit start - Fire ProjectileHitEvent - if (this.dead) { - CraftEventFactory.callProjectileHitEvent(this); - } - // CraftBukkit end - } - - this.locX += this.motX; - this.locY += this.motY; - this.locZ += this.motZ; - float f1 = MathHelper.sqrt(this.motX * this.motX + this.motZ * this.motZ); - - this.yaw = (float) (Math.atan2(this.motZ, this.motX) * 180.0D / 3.1415927410125732D) + 90.0F; - - for (this.pitch = (float) (Math.atan2((double) f1, this.motY) * 180.0D / 3.1415927410125732D) - 90.0F; this.pitch - this.lastPitch < -180.0F; this.lastPitch -= 360.0F) { - ; - } - - while (this.pitch - this.lastPitch >= 180.0F) { - this.lastPitch += 360.0F; - } - - while (this.yaw - this.lastYaw < -180.0F) { - this.lastYaw -= 360.0F; - } - - while (this.yaw - this.lastYaw >= 180.0F) { - this.lastYaw += 360.0F; - } - - this.pitch = this.lastPitch + (this.pitch - this.lastPitch) * 0.2F; - this.yaw = this.lastYaw + (this.yaw - this.lastYaw) * 0.2F; - float f2 = this.e(); - - if (this.M()) { - for (int j = 0; j < 4; ++j) { - float 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); - } - - f2 = 0.8F; - } - - this.motX += this.dirX; - this.motY += this.dirY; - this.motZ += this.dirZ; - this.motX *= (double) f2; - this.motY *= (double) f2; - this.motZ *= (double) f2; - this.world.addParticle("smoke", this.locX, this.locY + 0.5D, this.locZ, 0.0D, 0.0D, 0.0D); - this.setPosition(this.locX, this.locY, this.locZ); - } - } - - protected float e() { - return 0.95F; - } - - protected abstract void a(MovingObjectPosition movingobjectposition); - - public void b(NBTTagCompound nbttagcompound) { - nbttagcompound.setShort("xTile", (short) this.e); - nbttagcompound.setShort("yTile", (short) this.f); - nbttagcompound.setShort("zTile", (short) this.g); - nbttagcompound.setByte("inTile", (byte) Block.getId(this.h)); - nbttagcompound.setByte("inGround", (byte) (this.i ? 1 : 0)); - // CraftBukkit - Fix direction being mismapped to invalid variables - nbttagcompound.set("power", this.a(new double[] { this.dirX, this.dirY, this.dirZ})); - } - - public void a(NBTTagCompound nbttagcompound) { - this.e = nbttagcompound.getShort("xTile"); - this.f = nbttagcompound.getShort("yTile"); - this.g = nbttagcompound.getShort("zTile"); - this.h = Block.getById(nbttagcompound.getByte("inTile") & 255); - this.i = nbttagcompound.getByte("inGround") == 1; - // CraftBukkit start - direction -> power - if (nbttagcompound.hasKeyOfType("power", 9)) { - NBTTagList nbttaglist = nbttagcompound.getList("power", 6); - - this.dirX = nbttaglist.d(0); - this.dirY = nbttaglist.d(1); - this.dirZ = nbttaglist.d(2); - // CraftBukkit end - } else { - this.die(); - } - } - - public boolean R() { - return true; - } - - public float af() { - return 1.0F; - } - - public boolean damageEntity(DamageSource damagesource, float f) { - if (this.isInvulnerable()) { - return false; - } else { - this.Q(); - if (damagesource.getEntity() != null) { - // CraftBukkit start - if (CraftEventFactory.handleNonLivingEntityDamageEvent(this, damagesource, f)) { - return false; - } - // CraftBukkit end - - Vec3D vec3d = damagesource.getEntity().ag(); - - if (vec3d != null) { - this.motX = vec3d.a; - this.motY = vec3d.b; - this.motZ = vec3d.c; - this.dirX = this.motX * 0.1D; - this.dirY = this.motY * 0.1D; - this.dirZ = this.motZ * 0.1D; - } - - if (damagesource.getEntity() instanceof EntityLiving) { - this.shooter = (EntityLiving) damagesource.getEntity(); - this.projectileSource = (org.bukkit.projectiles.ProjectileSource) this.shooter.getBukkitEntity(); - } - - return true; - } else { - return false; - } - } - } - - public float d(float f) { - return 1.0F; - } -} diff --git a/src/main/java/net/minecraft/server/EntityFireworks.java b/src/main/java/net/minecraft/server/EntityFireworks.java deleted file mode 100644 index 759d46c41c..0000000000 --- a/src/main/java/net/minecraft/server/EntityFireworks.java +++ /dev/null @@ -1,121 +0,0 @@ -package net.minecraft.server; - -public class EntityFireworks extends Entity { - - private int ticksFlown; - public int expectedLifespan; // CraftBukkit - private -> public - - public EntityFireworks(World world) { - super(world); - this.a(0.25F, 0.25F); - } - - protected void c() { - this.datawatcher.add(8, 5); - } - - public EntityFireworks(World world, double d0, double d1, double d2, ItemStack itemstack) { - super(world); - this.ticksFlown = 0; - this.a(0.25F, 0.25F); - this.setPosition(d0, d1, d2); - this.height = 0.0F; - int i = 1; - - if (itemstack != null && itemstack.hasTag()) { - this.datawatcher.watch(8, itemstack); - NBTTagCompound nbttagcompound = itemstack.getTag(); - NBTTagCompound nbttagcompound1 = nbttagcompound.getCompound("Fireworks"); - - if (nbttagcompound1 != null) { - i += nbttagcompound1.getByte("Flight"); - } - } - - this.motX = this.random.nextGaussian() * 0.001D; - this.motZ = this.random.nextGaussian() * 0.001D; - this.motY = 0.05D; - this.expectedLifespan = 10 * i + this.random.nextInt(6) + this.random.nextInt(7); - } - - public void h() { - this.S = this.locX; - this.T = this.locY; - this.U = this.locZ; - super.h(); - this.motX *= 1.15D; - this.motZ *= 1.15D; - this.motY += 0.04D; - this.move(this.motX, this.motY, this.motZ); - float f = MathHelper.sqrt(this.motX * this.motX + this.motZ * this.motZ); - - this.yaw = (float) (Math.atan2(this.motX, this.motZ) * 180.0D / 3.1415927410125732D); - - for (this.pitch = (float) (Math.atan2(this.motY, (double) f) * 180.0D / 3.1415927410125732D); this.pitch - this.lastPitch < -180.0F; this.lastPitch -= 360.0F) { - ; - } - - while (this.pitch - this.lastPitch >= 180.0F) { - this.lastPitch += 360.0F; - } - - while (this.yaw - this.lastYaw < -180.0F) { - this.lastYaw -= 360.0F; - } - - while (this.yaw - this.lastYaw >= 180.0F) { - this.lastYaw += 360.0F; - } - - this.pitch = this.lastPitch + (this.pitch - this.lastPitch) * 0.2F; - this.yaw = this.lastYaw + (this.yaw - this.lastYaw) * 0.2F; - if (this.ticksFlown == 0) { - this.world.makeSound(this, "fireworks.launch", 3.0F, 1.0F); - } - - ++this.ticksFlown; - if (this.world.isStatic && this.ticksFlown % 2 < 2) { - this.world.addParticle("fireworksSpark", this.locX, this.locY - 0.3D, this.locZ, this.random.nextGaussian() * 0.05D, -this.motY * 0.5D, this.random.nextGaussian() * 0.05D); - } - - if (!this.world.isStatic && this.ticksFlown > this.expectedLifespan) { - this.world.broadcastEntityEffect(this, (byte) 17); - this.die(); - } - } - - public void b(NBTTagCompound nbttagcompound) { - nbttagcompound.setInt("Life", this.ticksFlown); - nbttagcompound.setInt("LifeTime", this.expectedLifespan); - ItemStack itemstack = this.datawatcher.getItemStack(8); - - if (itemstack != null) { - NBTTagCompound nbttagcompound1 = new NBTTagCompound(); - - itemstack.save(nbttagcompound1); - nbttagcompound.set("FireworksItem", nbttagcompound1); - } - } - - public void a(NBTTagCompound nbttagcompound) { - this.ticksFlown = nbttagcompound.getInt("Life"); - this.expectedLifespan = nbttagcompound.getInt("LifeTime"); - NBTTagCompound nbttagcompound1 = nbttagcompound.getCompound("FireworksItem"); - - if (nbttagcompound1 != null) { - ItemStack itemstack = ItemStack.createStack(nbttagcompound1); - - if (itemstack != null) { - this.datawatcher.watch(8, itemstack); - } - } - } - - public float d(float f) { - return super.d(f); - } - - public boolean au() { - return false; - } -} diff --git a/src/main/java/net/minecraft/server/EntityFishingHook.java b/src/main/java/net/minecraft/server/EntityFishingHook.java deleted file mode 100644 index 9d4ea60f1d..0000000000 --- a/src/main/java/net/minecraft/server/EntityFishingHook.java +++ /dev/null @@ -1,475 +0,0 @@ -package net.minecraft.server; - -import java.util.Arrays; -import java.util.Collection; -import java.util.List; - -// CraftBukkit start -import org.bukkit.entity.Player; -import org.bukkit.entity.Fish; -import org.bukkit.event.player.PlayerFishEvent; -// CraftBukkit end - -public class EntityFishingHook extends Entity { - - private static final List d = Arrays.asList(new PossibleFishingResult[] { (new PossibleFishingResult(new ItemStack(Items.LEATHER_BOOTS), 10)).a(0.9F), new PossibleFishingResult(new ItemStack(Items.LEATHER), 10), new PossibleFishingResult(new ItemStack(Items.BONE), 10), new PossibleFishingResult(new ItemStack(Items.POTION), 10), new PossibleFishingResult(new ItemStack(Items.STRING), 5), (new PossibleFishingResult(new ItemStack(Items.FISHING_ROD), 2)).a(0.9F), new PossibleFishingResult(new ItemStack(Items.BOWL), 10), new PossibleFishingResult(new ItemStack(Items.STICK), 5), new PossibleFishingResult(new ItemStack(Items.INK_SACK, 10, 0), 1), new PossibleFishingResult(new ItemStack(Blocks.TRIPWIRE_SOURCE), 10), new PossibleFishingResult(new ItemStack(Items.ROTTEN_FLESH), 10)}); - private static final List e = Arrays.asList(new PossibleFishingResult[] { new PossibleFishingResult(new ItemStack(Blocks.WATER_LILY), 1), new PossibleFishingResult(new ItemStack(Items.NAME_TAG), 1), new PossibleFishingResult(new ItemStack(Items.SADDLE), 1), (new PossibleFishingResult(new ItemStack(Items.BOW), 1)).a(0.25F).a(), (new PossibleFishingResult(new ItemStack(Items.FISHING_ROD), 1)).a(0.25F).a(), (new PossibleFishingResult(new ItemStack(Items.BOOK), 1)).a()}); - private static final List f = Arrays.asList(new PossibleFishingResult[] { new PossibleFishingResult(new ItemStack(Items.RAW_FISH, 1, EnumFish.COD.a()), 60), new PossibleFishingResult(new ItemStack(Items.RAW_FISH, 1, EnumFish.SALMON.a()), 25), new PossibleFishingResult(new ItemStack(Items.RAW_FISH, 1, EnumFish.CLOWNFISH.a()), 2), new PossibleFishingResult(new ItemStack(Items.RAW_FISH, 1, EnumFish.PUFFERFISH.a()), 13)}); - private int g = -1; - private int h = -1; - private int i = -1; - private Block at; - private boolean au; - public int a; - public EntityHuman owner; - private int av; - private int aw; - private int ax; - private int ay; - private int az; - private float aA; - public Entity hooked; - private int aB; - private double aC; - private double aD; - private double aE; - private double aF; - private double aG; - - public EntityFishingHook(World world) { - super(world); - this.a(0.25F, 0.25F); - this.ak = true; - } - - public EntityFishingHook(World world, EntityHuman entityhuman) { - super(world); - this.ak = true; - this.owner = entityhuman; - this.owner.hookedFish = this; - this.a(0.25F, 0.25F); - this.setPositionRotation(entityhuman.locX, entityhuman.locY + 1.62D - (double) entityhuman.height, entityhuman.locZ, entityhuman.yaw, entityhuman.pitch); - this.locX -= (double) (MathHelper.cos(this.yaw / 180.0F * 3.1415927F) * 0.16F); - this.locY -= 0.10000000149011612D; - this.locZ -= (double) (MathHelper.sin(this.yaw / 180.0F * 3.1415927F) * 0.16F); - this.setPosition(this.locX, this.locY, this.locZ); - this.height = 0.0F; - float f = 0.4F; - - this.motX = (double) (-MathHelper.sin(this.yaw / 180.0F * 3.1415927F) * MathHelper.cos(this.pitch / 180.0F * 3.1415927F) * f); - this.motZ = (double) (MathHelper.cos(this.yaw / 180.0F * 3.1415927F) * MathHelper.cos(this.pitch / 180.0F * 3.1415927F) * f); - this.motY = (double) (-MathHelper.sin(this.pitch / 180.0F * 3.1415927F) * f); - this.c(this.motX, this.motY, this.motZ, 1.5F, 1.0F); - } - - protected void c() {} - - public void c(double d0, double d1, double d2, float f, float f1) { - float f2 = MathHelper.sqrt(d0 * d0 + d1 * d1 + d2 * d2); - - d0 /= (double) f2; - d1 /= (double) f2; - d2 /= (double) f2; - d0 += this.random.nextGaussian() * 0.007499999832361937D * (double) f1; - d1 += this.random.nextGaussian() * 0.007499999832361937D * (double) f1; - d2 += this.random.nextGaussian() * 0.007499999832361937D * (double) f1; - d0 *= (double) f; - d1 *= (double) f; - d2 *= (double) f; - this.motX = d0; - this.motY = d1; - this.motZ = d2; - float f3 = MathHelper.sqrt(d0 * d0 + d2 * d2); - - this.lastYaw = this.yaw = (float) (Math.atan2(d0, d2) * 180.0D / 3.1415927410125732D); - this.lastPitch = this.pitch = (float) (Math.atan2(d1, (double) f3) * 180.0D / 3.1415927410125732D); - this.av = 0; - } - - public void h() { - super.h(); - if (this.aB > 0) { - double d0 = this.locX + (this.aC - this.locX) / (double) this.aB; - double d1 = this.locY + (this.aD - this.locY) / (double) this.aB; - double d2 = this.locZ + (this.aE - this.locZ) / (double) this.aB; - double d3 = MathHelper.g(this.aF - (double) this.yaw); - - this.yaw = (float) ((double) this.yaw + d3 / (double) this.aB); - this.pitch = (float) ((double) this.pitch + (this.aG - (double) this.pitch) / (double) this.aB); - --this.aB; - this.setPosition(d0, d1, d2); - this.b(this.yaw, this.pitch); - } else { - if (!this.world.isStatic) { - ItemStack itemstack = this.owner.bF(); - - if (this.owner.dead || !this.owner.isAlive() || itemstack == null || itemstack.getItem() != Items.FISHING_ROD || this.f(this.owner) > 1024.0D) { - this.die(); - this.owner.hookedFish = null; - return; - } - - if (this.hooked != null) { - if (!this.hooked.dead) { - this.locX = this.hooked.locX; - this.locY = this.hooked.boundingBox.b + (double) this.hooked.length * 0.8D; - this.locZ = this.hooked.locZ; - return; - } - - this.hooked = null; - } - } - - if (this.a > 0) { - --this.a; - } - - if (this.au) { - if (this.world.getType(this.g, this.h, this.i) == this.at) { - ++this.av; - if (this.av == 1200) { - this.die(); - } - - return; - } - - this.au = false; - this.motX *= (double) (this.random.nextFloat() * 0.2F); - this.motY *= (double) (this.random.nextFloat() * 0.2F); - this.motZ *= (double) (this.random.nextFloat() * 0.2F); - this.av = 0; - this.aw = 0; - } else { - ++this.aw; - } - - Vec3D vec3d = Vec3D.a(this.locX, this.locY, this.locZ); - Vec3D vec3d1 = Vec3D.a(this.locX + this.motX, this.locY + this.motY, this.locZ + this.motZ); - MovingObjectPosition movingobjectposition = this.world.a(vec3d, vec3d1); - - vec3d = Vec3D.a(this.locX, this.locY, this.locZ); - vec3d1 = Vec3D.a(this.locX + this.motX, this.locY + this.motY, this.locZ + this.motZ); - if (movingobjectposition != null) { - vec3d1 = Vec3D.a(movingobjectposition.pos.a, movingobjectposition.pos.b, movingobjectposition.pos.c); - } - - Entity entity = null; - List list = this.world.getEntities(this, this.boundingBox.a(this.motX, this.motY, this.motZ).grow(1.0D, 1.0D, 1.0D)); - double d4 = 0.0D; - - double d5; - - for (int i = 0; i < list.size(); ++i) { - Entity entity1 = (Entity) list.get(i); - - if (entity1.R() && (entity1 != this.owner || this.aw >= 5)) { - float f = 0.3F; - AxisAlignedBB axisalignedbb = entity1.boundingBox.grow((double) f, (double) f, (double) f); - MovingObjectPosition movingobjectposition1 = axisalignedbb.a(vec3d, vec3d1); - - if (movingobjectposition1 != null) { - d5 = vec3d.distanceSquared(movingobjectposition1.pos); // CraftBukkit - distance efficiency - if (d5 < d4 || d4 == 0.0D) { - entity = entity1; - d4 = d5; - } - } - } - } - - if (entity != null) { - movingobjectposition = new MovingObjectPosition(entity); - } - - if (movingobjectposition != null) { - org.bukkit.craftbukkit.event.CraftEventFactory.callProjectileHitEvent(this); // Craftbukkit - Call event - if (movingobjectposition.entity != null) { - if (movingobjectposition.entity.damageEntity(DamageSource.projectile(this, this.owner), 0.0F)) { - this.hooked = movingobjectposition.entity; - } - } else { - this.au = true; - } - } - - if (!this.au) { - this.move(this.motX, this.motY, this.motZ); - float f1 = MathHelper.sqrt(this.motX * this.motX + this.motZ * this.motZ); - - this.yaw = (float) (Math.atan2(this.motX, this.motZ) * 180.0D / 3.1415927410125732D); - - for (this.pitch = (float) (Math.atan2(this.motY, (double) f1) * 180.0D / 3.1415927410125732D); this.pitch - this.lastPitch < -180.0F; this.lastPitch -= 360.0F) { - ; - } - - while (this.pitch - this.lastPitch >= 180.0F) { - this.lastPitch += 360.0F; - } - - while (this.yaw - this.lastYaw < -180.0F) { - this.lastYaw -= 360.0F; - } - - while (this.yaw - this.lastYaw >= 180.0F) { - this.lastYaw += 360.0F; - } - - this.pitch = this.lastPitch + (this.pitch - this.lastPitch) * 0.2F; - this.yaw = this.lastYaw + (this.yaw - this.lastYaw) * 0.2F; - float f2 = 0.92F; - - if (this.onGround || this.positionChanged) { - f2 = 0.5F; - } - - byte b0 = 5; - double d6 = 0.0D; - - for (int j = 0; j < b0; ++j) { - double d7 = this.boundingBox.b + (this.boundingBox.e - this.boundingBox.b) * (double) (j + 0) / (double) b0 - 0.125D + 0.125D; - double d8 = this.boundingBox.b + (this.boundingBox.e - this.boundingBox.b) * (double) (j + 1) / (double) b0 - 0.125D + 0.125D; - AxisAlignedBB axisalignedbb1 = AxisAlignedBB.a(this.boundingBox.a, d7, this.boundingBox.c, this.boundingBox.d, d8, this.boundingBox.f); - - if (this.world.b(axisalignedbb1, Material.WATER)) { - d6 += 1.0D / (double) b0; - } - } - - if (!this.world.isStatic && d6 > 0.0D) { - WorldServer worldserver = (WorldServer) this.world; - int k = 1; - - if (this.random.nextFloat() < 0.25F && this.world.isRainingAt(MathHelper.floor(this.locX), MathHelper.floor(this.locY) + 1, MathHelper.floor(this.locZ))) { - k = 2; - } - - if (this.random.nextFloat() < 0.5F && !this.world.i(MathHelper.floor(this.locX), MathHelper.floor(this.locY) + 1, MathHelper.floor(this.locZ))) { - --k; - } - - if (this.ax > 0) { - --this.ax; - if (this.ax <= 0) { - this.ay = 0; - this.az = 0; - } - } else { - float f3; - double d9; - float f4; - float f5; - double d10; - double d11; - - if (this.az > 0) { - this.az -= k; - if (this.az <= 0) { - this.motY -= 0.20000000298023224D; - this.makeSound("random.splash", 0.25F, 1.0F + (this.random.nextFloat() - this.random.nextFloat()) * 0.4F); - f4 = (float) MathHelper.floor(this.boundingBox.b); - worldserver.a("bubble", this.locX, (double) (f4 + 1.0F), this.locZ, (int) (1.0F + this.width * 20.0F), (double) this.width, 0.0D, (double) this.width, 0.20000000298023224D); - worldserver.a("wake", this.locX, (double) (f4 + 1.0F), this.locZ, (int) (1.0F + this.width * 20.0F), (double) this.width, 0.0D, (double) this.width, 0.20000000298023224D); - this.ax = MathHelper.nextInt(this.random, 10, 30); - } else { - this.aA = (float) ((double) this.aA + this.random.nextGaussian() * 4.0D); - f4 = this.aA * 0.017453292F; - f5 = MathHelper.sin(f4); - f3 = MathHelper.cos(f4); - d9 = this.locX + (double) (f5 * (float) this.az * 0.1F); - d11 = (double) ((float) MathHelper.floor(this.boundingBox.b) + 1.0F); - d10 = this.locZ + (double) (f3 * (float) this.az * 0.1F); - if (this.random.nextFloat() < 0.15F) { - worldserver.a("bubble", d9, d11 - 0.10000000149011612D, d10, 1, (double) f5, 0.1D, (double) f3, 0.0D); - } - - float f6 = f5 * 0.04F; - float f7 = f3 * 0.04F; - - worldserver.a("wake", d9, d11, d10, 0, (double) f7, 0.01D, (double) (-f6), 1.0D); - worldserver.a("wake", d9, d11, d10, 0, (double) (-f7), 0.01D, (double) f6, 1.0D); - } - } else if (this.ay > 0) { - this.ay -= k; - f4 = 0.15F; - if (this.ay < 20) { - f4 = (float) ((double) f4 + (double) (20 - this.ay) * 0.05D); - } else if (this.ay < 40) { - f4 = (float) ((double) f4 + (double) (40 - this.ay) * 0.02D); - } else if (this.ay < 60) { - f4 = (float) ((double) f4 + (double) (60 - this.ay) * 0.01D); - } - - if (this.random.nextFloat() < f4) { - f5 = MathHelper.a(this.random, 0.0F, 360.0F) * 0.017453292F; - f3 = MathHelper.a(this.random, 25.0F, 60.0F); - d9 = this.locX + (double) (MathHelper.sin(f5) * f3 * 0.1F); - d11 = (double) ((float) MathHelper.floor(this.boundingBox.b) + 1.0F); - d10 = this.locZ + (double) (MathHelper.cos(f5) * f3 * 0.1F); - worldserver.a("splash", d9, d11, d10, 2 + this.random.nextInt(2), 0.10000000149011612D, 0.0D, 0.10000000149011612D, 0.0D); - } - - if (this.ay <= 0) { - this.aA = MathHelper.a(this.random, 0.0F, 360.0F); - this.az = MathHelper.nextInt(this.random, 20, 80); - } - } else { - this.ay = MathHelper.nextInt(this.random, 100, 900); - this.ay -= EnchantmentManager.getLureEnchantmentLevel(this.owner) * 20 * 5; - } - } - - if (this.ax > 0) { - this.motY -= (double) (this.random.nextFloat() * this.random.nextFloat() * this.random.nextFloat()) * 0.2D; - } - } - - d5 = d6 * 2.0D - 1.0D; - this.motY += 0.03999999910593033D * d5; - if (d6 > 0.0D) { - f2 = (float) ((double) f2 * 0.9D); - this.motY *= 0.8D; - } - - this.motX *= (double) f2; - this.motY *= (double) f2; - this.motZ *= (double) f2; - this.setPosition(this.locX, this.locY, this.locZ); - } - } - } - - public void b(NBTTagCompound nbttagcompound) { - nbttagcompound.setShort("xTile", (short) this.g); - nbttagcompound.setShort("yTile", (short) this.h); - nbttagcompound.setShort("zTile", (short) this.i); - nbttagcompound.setByte("inTile", (byte) Block.getId(this.at)); - nbttagcompound.setByte("shake", (byte) this.a); - nbttagcompound.setByte("inGround", (byte) (this.au ? 1 : 0)); - } - - public void a(NBTTagCompound nbttagcompound) { - this.g = nbttagcompound.getShort("xTile"); - this.h = nbttagcompound.getShort("yTile"); - this.i = nbttagcompound.getShort("zTile"); - this.at = Block.getById(nbttagcompound.getByte("inTile") & 255); - this.a = nbttagcompound.getByte("shake") & 255; - this.au = nbttagcompound.getByte("inGround") == 1; - } - - public int e() { - if (this.world.isStatic) { - return 0; - } else { - byte b0 = 0; - - if (this.hooked != null) { - // CraftBukkit start - PlayerFishEvent playerFishEvent = new PlayerFishEvent((Player) this.owner.getBukkitEntity(), this.hooked.getBukkitEntity(), (Fish) this.getBukkitEntity(), PlayerFishEvent.State.CAUGHT_ENTITY); - this.world.getServer().getPluginManager().callEvent(playerFishEvent); - - if (playerFishEvent.isCancelled()) { - return 0; - } - // CraftBukkit end - - double d0 = this.owner.locX - this.locX; - double d1 = this.owner.locY - this.locY; - double d2 = this.owner.locZ - this.locZ; - double d3 = (double) MathHelper.sqrt(d0 * d0 + d1 * d1 + d2 * d2); - double d4 = 0.1D; - - this.hooked.motX += d0 * d4; - this.hooked.motY += d1 * d4 + (double) MathHelper.sqrt(d3) * 0.08D; - this.hooked.motZ += d2 * d4; - b0 = 3; - } else if (this.ax > 0) { - EntityItem entityitem = new EntityItem(this.world, this.locX, this.locY, this.locZ, this.f()); - // CraftBukkit start - PlayerFishEvent playerFishEvent = new PlayerFishEvent((Player) this.owner.getBukkitEntity(), entityitem.getBukkitEntity(), (Fish) this.getBukkitEntity(), PlayerFishEvent.State.CAUGHT_FISH); - playerFishEvent.setExpToDrop(this.random.nextInt(6) + 1); - this.world.getServer().getPluginManager().callEvent(playerFishEvent); - - if (playerFishEvent.isCancelled()) { - return 0; - } - // CraftBukkit end - - double d5 = this.owner.locX - this.locX; - double d6 = this.owner.locY - this.locY; - double d7 = this.owner.locZ - this.locZ; - double d8 = (double) MathHelper.sqrt(d5 * d5 + d6 * d6 + d7 * d7); - double d9 = 0.1D; - - entityitem.motX = d5 * d9; - entityitem.motY = d6 * d9 + (double) MathHelper.sqrt(d8) * 0.08D; - entityitem.motZ = d7 * d9; - this.world.addEntity(entityitem); - // CraftBukkit - this.random.nextInt(6) + 1 -> playerFishEvent.getExpToDrop() - this.owner.world.addEntity(new EntityExperienceOrb(this.owner.world, this.owner.locX, this.owner.locY + 0.5D, this.owner.locZ + 0.5D, playerFishEvent.getExpToDrop())); - b0 = 1; - } - - if (this.au) { - // CraftBukkit start - PlayerFishEvent playerFishEvent = new PlayerFishEvent((Player) this.owner.getBukkitEntity(), null, (Fish) this.getBukkitEntity(), PlayerFishEvent.State.IN_GROUND); - this.world.getServer().getPluginManager().callEvent(playerFishEvent); - - if (playerFishEvent.isCancelled()) { - return 0; - } - // CraftBukkit end - - b0 = 2; - } - - // CraftBukkit start - if (b0 == 0) { - PlayerFishEvent playerFishEvent = new PlayerFishEvent((Player) this.owner.getBukkitEntity(), null, (Fish) this.getBukkitEntity(), PlayerFishEvent.State.FAILED_ATTEMPT); - this.world.getServer().getPluginManager().callEvent(playerFishEvent); - if (playerFishEvent.isCancelled()) { - return 0; - } - } - // CraftBukkit end - - this.die(); - this.owner.hookedFish = null; - return b0; - } - } - - private ItemStack f() { - float f = this.world.random.nextFloat(); - int i = EnchantmentManager.getLuckEnchantmentLevel(this.owner); - int j = EnchantmentManager.getLureEnchantmentLevel(this.owner); - float f1 = 0.1F - (float) i * 0.025F - (float) j * 0.01F; - float f2 = 0.05F + (float) i * 0.01F - (float) j * 0.01F; - - f1 = MathHelper.a(f1, 0.0F, 1.0F); - f2 = MathHelper.a(f2, 0.0F, 1.0F); - if (f < f1) { - this.owner.a(StatisticList.A, 1); - return ((PossibleFishingResult) WeightedRandom.a(this.random, (Collection) d)).a(this.random); - } else { - f -= f1; - if (f < f2) { - this.owner.a(StatisticList.B, 1); - return ((PossibleFishingResult) WeightedRandom.a(this.random, (Collection) e)).a(this.random); - } else { - float f3 = f - f2; - - this.owner.a(StatisticList.z, 1); - return ((PossibleFishingResult) WeightedRandom.a(this.random, (Collection) EntityFishingHook.f)).a(this.random); // CraftBukkit - fix static reference to fish list - } - } - } - - public void die() { - super.die(); - if (this.owner != null) { - this.owner.hookedFish = null; - } - } -} diff --git a/src/main/java/net/minecraft/server/EntityGhast.java b/src/main/java/net/minecraft/server/EntityGhast.java deleted file mode 100644 index d543fcaec2..0000000000 --- a/src/main/java/net/minecraft/server/EntityGhast.java +++ /dev/null @@ -1,238 +0,0 @@ -package net.minecraft.server; - -// CraftBukkit start -import org.bukkit.craftbukkit.entity.CraftEntity; -import org.bukkit.event.entity.EntityTargetEvent; -// CraftBukkit end - -public class EntityGhast extends EntityFlying implements IMonster { - - public int h; - public double i; - public double bm; - public double bn; - private Entity target; - private int br; - public int bo; - public int bp; - private int explosionPower = 1; - - public EntityGhast(World world) { - super(world); - this.a(4.0F, 4.0F); - this.fireProof = true; - this.b = 5; - } - - public boolean damageEntity(DamageSource damagesource, float f) { - if (this.isInvulnerable()) { - return false; - } else if ("fireball".equals(damagesource.p()) && damagesource.getEntity() instanceof EntityHuman) { - super.damageEntity(damagesource, 1000.0F); - ((EntityHuman) damagesource.getEntity()).a((Statistic) AchievementList.z); - return true; - } else { - return super.damageEntity(damagesource, f); - } - } - - protected void c() { - super.c(); - this.datawatcher.a(16, Byte.valueOf((byte) 0)); - } - - protected void aD() { - super.aD(); - this.getAttributeInstance(GenericAttributes.maxHealth).setValue(10.0D); - } - - protected void bq() { - if (!this.world.isStatic && this.world.difficulty == EnumDifficulty.PEACEFUL) { - this.die(); - } - - this.w(); - this.bo = this.bp; - double d0 = this.i - this.locX; - double d1 = this.bm - this.locY; - double d2 = this.bn - this.locZ; - double d3 = d0 * d0 + d1 * d1 + d2 * d2; - - if (d3 < 1.0D || d3 > 3600.0D) { - this.i = this.locX + (double) ((this.random.nextFloat() * 2.0F - 1.0F) * 16.0F); - this.bm = this.locY + (double) ((this.random.nextFloat() * 2.0F - 1.0F) * 16.0F); - this.bn = this.locZ + (double) ((this.random.nextFloat() * 2.0F - 1.0F) * 16.0F); - } - - if (this.h-- <= 0) { - this.h += this.random.nextInt(5) + 2; - d3 = (double) MathHelper.sqrt(d3); - if (this.a(this.i, this.bm, this.bn, d3)) { - this.motX += d0 / d3 * 0.1D; - this.motY += d1 / d3 * 0.1D; - this.motZ += d2 / d3 * 0.1D; - } else { - this.i = this.locX; - this.bm = this.locY; - this.bn = this.locZ; - } - } - - if (this.target != null && this.target.dead) { - // CraftBukkit start - fire EntityTargetEvent - EntityTargetEvent event = new EntityTargetEvent(this.getBukkitEntity(), null, EntityTargetEvent.TargetReason.TARGET_DIED); - this.world.getServer().getPluginManager().callEvent(event); - - if (!event.isCancelled()) { - if (event.getTarget() == null) { - this.target = null; - } else { - this.target = ((CraftEntity) event.getTarget()).getHandle(); - } - } - // CraftBukkit end - } - - if (this.target == null || this.br-- <= 0) { - // CraftBukkit start - fire EntityTargetEvent - Entity target = this.world.findNearbyVulnerablePlayer(this, 100.0D); - if (target != null) { - EntityTargetEvent event = new EntityTargetEvent(this.getBukkitEntity(), target.getBukkitEntity(), EntityTargetEvent.TargetReason.CLOSEST_PLAYER); - this.world.getServer().getPluginManager().callEvent(event); - - if (!event.isCancelled()) { - if (event.getTarget() == null) { - this.target = null; - } else { - this.target = ((CraftEntity) event.getTarget()).getHandle(); - } - } - } - // CraftBukkit end - - if (this.target != null) { - this.br = 20; - } - } - - double d4 = 64.0D; - - if (this.target != null && this.target.f((Entity) this) < d4 * d4) { - double d5 = this.target.locX - this.locX; - 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.aM = this.yaw = -((float) Math.atan2(d5, d7)) * 180.0F / 3.1415927F; - if (this.hasLineOfSight(this.target)) { - if (this.bp == 10) { - this.world.a((EntityHuman) null, 1007, (int) this.locX, (int) this.locY, (int) this.locZ, 0); - } - - ++this.bp; - if (this.bp == 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); - - // CraftBukkit - set bukkitYield when setting explosionpower - entitylargefireball.bukkitYield = entitylargefireball.yield = this.explosionPower; - double d8 = 4.0D; - Vec3D vec3d = this.j(1.0F); - - entitylargefireball.locX = this.locX + vec3d.a * d8; - entitylargefireball.locY = this.locY + (double) (this.length / 2.0F) + 0.5D; - entitylargefireball.locZ = this.locZ + vec3d.c * d8; - this.world.addEntity(entitylargefireball); - this.bp = -40; - } - } else if (this.bp > 0) { - --this.bp; - } - } else { - this.aM = this.yaw = -((float) Math.atan2(this.motX, this.motZ)) * 180.0F / 3.1415927F; - if (this.bp > 0) { - --this.bp; - } - } - - if (!this.world.isStatic) { - byte b0 = this.datawatcher.getByte(16); - byte b1 = (byte) (this.bp > 10 ? 1 : 0); - - if (b0 != b1) { - this.datawatcher.watch(16, Byte.valueOf(b1)); - } - } - } - - private boolean a(double d0, double d1, double d2, double d3) { - double d4 = (this.i - this.locX) / d3; - double d5 = (this.bm - this.locY) / d3; - double d6 = (this.bn - this.locZ) / d3; - AxisAlignedBB axisalignedbb = this.boundingBox.clone(); - - for (int i = 1; (double) i < d3; ++i) { - axisalignedbb.d(d4, d5, d6); - if (!this.world.getCubes(this, axisalignedbb).isEmpty()) { - return false; - } - } - - return true; - } - - protected String t() { - return "mob.ghast.moan"; - } - - protected String aT() { - return "mob.ghast.scream"; - } - - protected String aU() { - return "mob.ghast.death"; - } - - protected Item getLoot() { - return Items.SULPHUR; - } - - protected void dropDeathLoot(boolean flag, int i) { - int j = this.random.nextInt(2) + this.random.nextInt(1 + i); - - int k; - - for (k = 0; k < j; ++k) { - this.a(Items.GHAST_TEAR, 1); - } - - j = this.random.nextInt(3) + this.random.nextInt(1 + i); - - for (k = 0; k < j; ++k) { - this.a(Items.SULPHUR, 1); - } - } - - protected float bf() { - return 10.0F; - } - - public boolean canSpawn() { - return this.random.nextInt(20) == 0 && super.canSpawn() && this.world.difficulty != EnumDifficulty.PEACEFUL; - } - - public int bB() { - 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.hasKeyOfType("ExplosionPower", 99)) { - this.explosionPower = nbttagcompound.getInt("ExplosionPower"); - } - } -} diff --git a/src/main/java/net/minecraft/server/EntityHanging.java b/src/main/java/net/minecraft/server/EntityHanging.java deleted file mode 100644 index eec465b44c..0000000000 --- a/src/main/java/net/minecraft/server/EntityHanging.java +++ /dev/null @@ -1,340 +0,0 @@ -package net.minecraft.server; - -import java.util.Iterator; -import java.util.List; - -// CraftBukkit start -import org.bukkit.entity.Hanging; -import org.bukkit.entity.Painting; -import org.bukkit.event.hanging.HangingBreakEvent; -import org.bukkit.event.painting.PaintingBreakEvent; -// CraftBukkit end - -public abstract class EntityHanging extends Entity { - - private int e; - public int direction; - public int x; - public int y; - public int z; - - public EntityHanging(World world) { - super(world); - this.height = 0.0F; - this.a(0.5F, 0.5F); - } - - public EntityHanging(World world, int i, int j, int k, int l) { - this(world); - this.x = i; - this.y = j; - this.z = k; - } - - protected void c() {} - - public void setDirection(int i) { - this.direction = i; - this.lastYaw = this.yaw = (float) (i * 90); - float f = (float) this.f(); - float f1 = (float) this.i(); - float f2 = (float) this.f(); - - if (i != 2 && i != 0) { - f = 0.5F; - } else { - f2 = 0.5F; - this.yaw = this.lastYaw = (float) (Direction.f[i] * 90); - } - - f /= 32.0F; - f1 /= 32.0F; - f2 /= 32.0F; - float f3 = (float) this.x + 0.5F; - float f4 = (float) this.y + 0.5F; - float f5 = (float) this.z + 0.5F; - float f6 = 0.5625F; - - if (i == 2) { - f5 -= f6; - } - - if (i == 1) { - f3 -= f6; - } - - if (i == 0) { - f5 += f6; - } - - if (i == 3) { - f3 += f6; - } - - if (i == 2) { - f3 -= this.c(this.f()); - } - - if (i == 1) { - f5 += this.c(this.f()); - } - - if (i == 0) { - f3 += this.c(this.f()); - } - - if (i == 3) { - f5 -= this.c(this.f()); - } - - f4 += this.c(this.i()); - this.setPosition((double) f3, (double) f4, (double) f5); - float f7 = -0.03125F; - - this.boundingBox.b((double) (f3 - f - f7), (double) (f4 - f1 - f7), (double) (f5 - f2 - f7), (double) (f3 + f + f7), (double) (f4 + f1 + f7), (double) (f5 + f2 + f7)); - } - - private float c(int i) { - return i == 32 ? 0.5F : (i == 64 ? 0.5F : 0.0F); - } - - public void h() { - this.lastX = this.locX; - this.lastY = this.locY; - this.lastZ = this.locZ; - if (this.e++ == 100 && !this.world.isStatic) { - this.e = 0; - if (!this.dead && !this.survives()) { - // CraftBukkit start - fire break events - Material material = this.world.getType((int) this.locX, (int) this.locY, (int) this.locZ).getMaterial(); - HangingBreakEvent.RemoveCause cause; - - if (!material.equals(Material.AIR)) { - // TODO: This feels insufficient to catch 100% of suffocation cases - cause = HangingBreakEvent.RemoveCause.OBSTRUCTION; - } else { - cause = HangingBreakEvent.RemoveCause.PHYSICS; - } - - HangingBreakEvent event = new HangingBreakEvent((Hanging) this.getBukkitEntity(), cause); - this.world.getServer().getPluginManager().callEvent(event); - - PaintingBreakEvent paintingEvent = null; - if (this instanceof EntityPainting) { - // Fire old painting event until it can be removed - paintingEvent = new PaintingBreakEvent((Painting) this.getBukkitEntity(), PaintingBreakEvent.RemoveCause.valueOf(cause.name())); - paintingEvent.setCancelled(event.isCancelled()); - this.world.getServer().getPluginManager().callEvent(paintingEvent); - } - - if (dead || event.isCancelled() || (paintingEvent != null && paintingEvent.isCancelled())) { - return; - } - // CraftBukkit end - - this.die(); - this.b((Entity) null); - } - } - } - - public boolean survives() { - if (!this.world.getCubes(this, this.boundingBox).isEmpty()) { - return false; - } else { - int i = Math.max(1, this.f() / 16); - int j = Math.max(1, this.i() / 16); - int k = this.x; - int l = this.y; - int i1 = this.z; - - if (this.direction == 2) { - k = MathHelper.floor(this.locX - (double) ((float) this.f() / 32.0F)); - } - - if (this.direction == 1) { - i1 = MathHelper.floor(this.locZ - (double) ((float) this.f() / 32.0F)); - } - - if (this.direction == 0) { - k = MathHelper.floor(this.locX - (double) ((float) this.f() / 32.0F)); - } - - if (this.direction == 3) { - i1 = MathHelper.floor(this.locZ - (double) ((float) this.f() / 32.0F)); - } - - l = MathHelper.floor(this.locY - (double) ((float) this.i() / 32.0F)); - - for (int j1 = 0; j1 < i; ++j1) { - for (int k1 = 0; k1 < j; ++k1) { - Material material; - - if (this.direction != 2 && this.direction != 0) { - material = this.world.getType(this.x, l + k1, i1 + j1).getMaterial(); - } else { - material = this.world.getType(k + j1, l + k1, this.z).getMaterial(); - } - - if (!material.isBuildable()) { - return false; - } - } - } - - List list = this.world.getEntities(this, this.boundingBox); - Iterator iterator = list.iterator(); - - Entity entity; - - do { - if (!iterator.hasNext()) { - return true; - } - - entity = (Entity) iterator.next(); - } while (!(entity instanceof EntityHanging)); - - return false; - } - } - - public boolean R() { - return true; - } - - public boolean j(Entity entity) { - return entity instanceof EntityHuman ? this.damageEntity(DamageSource.playerAttack((EntityHuman) entity), 0.0F) : false; - } - - public void i(int i) { - this.world.X(); - } - - public boolean damageEntity(DamageSource damagesource, float f) { - if (this.isInvulnerable()) { - return false; - } else { - if (!this.dead && !this.world.isStatic) { - // CraftBukkit start - fire break events - HangingBreakEvent event = new HangingBreakEvent((Hanging) this.getBukkitEntity(), HangingBreakEvent.RemoveCause.DEFAULT); - PaintingBreakEvent paintingEvent = null; - if (damagesource.getEntity() != null) { - event = new org.bukkit.event.hanging.HangingBreakByEntityEvent((Hanging) this.getBukkitEntity(), damagesource.getEntity() == null ? null : damagesource.getEntity().getBukkitEntity()); - - if (this instanceof EntityPainting) { - // Fire old painting event until it can be removed - paintingEvent = new org.bukkit.event.painting.PaintingBreakByEntityEvent((Painting) this.getBukkitEntity(), damagesource.getEntity() == null ? null : damagesource.getEntity().getBukkitEntity()); - } - } else if (damagesource.isExplosion()) { - event = new HangingBreakEvent((Hanging) this.getBukkitEntity(), HangingBreakEvent.RemoveCause.EXPLOSION); - } - - this.world.getServer().getPluginManager().callEvent(event); - - if (paintingEvent != null) { - paintingEvent.setCancelled(event.isCancelled()); - this.world.getServer().getPluginManager().callEvent(paintingEvent); - } - - if (this.dead || event.isCancelled() || (paintingEvent != null && paintingEvent.isCancelled())) { - return true; - } - // CraftBukkit end - - this.die(); - this.Q(); - this.b(damagesource.getEntity()); - } - - return true; - } - } - - public void move(double d0, double d1, double d2) { - if (!this.world.isStatic && !this.dead && d0 * d0 + d1 * d1 + d2 * d2 > 0.0D) { - if (this.dead) return; // CraftBukkit - - // CraftBukkit start - fire break events - // TODO - Does this need its own cause? Seems to only be triggered by pistons - HangingBreakEvent event = new HangingBreakEvent((Hanging) this.getBukkitEntity(), HangingBreakEvent.RemoveCause.PHYSICS); - this.world.getServer().getPluginManager().callEvent(event); - - if (this.dead || event.isCancelled()) { - return; - } - // CraftBukkit end - - this.die(); - this.b((Entity) null); - } - } - - public void g(double d0, double d1, double d2) { - if (false && !this.world.isStatic && !this.dead && d0 * d0 + d1 * d1 + d2 * d2 > 0.0D) { // CraftBukkit - not needed - this.die(); - this.b((Entity) null); - } - } - - public void b(NBTTagCompound nbttagcompound) { - nbttagcompound.setByte("Direction", (byte) this.direction); - nbttagcompound.setInt("TileX", this.x); - nbttagcompound.setInt("TileY", this.y); - nbttagcompound.setInt("TileZ", this.z); - switch (this.direction) { - case 0: - nbttagcompound.setByte("Dir", (byte) 2); - break; - - case 1: - nbttagcompound.setByte("Dir", (byte) 1); - break; - - case 2: - nbttagcompound.setByte("Dir", (byte) 0); - break; - - case 3: - nbttagcompound.setByte("Dir", (byte) 3); - } - } - - public void a(NBTTagCompound nbttagcompound) { - if (nbttagcompound.hasKeyOfType("Direction", 99)) { - this.direction = nbttagcompound.getByte("Direction"); - } else { - switch (nbttagcompound.getByte("Dir")) { - case 0: - this.direction = 2; - break; - - case 1: - this.direction = 1; - break; - - case 2: - this.direction = 0; - break; - - case 3: - this.direction = 3; - } - } - - this.x = nbttagcompound.getInt("TileX"); - this.y = nbttagcompound.getInt("TileY"); - this.z = nbttagcompound.getInt("TileZ"); - this.setDirection(this.direction); - } - - public abstract int f(); - - public abstract int i(); - - public abstract void b(Entity entity); - - protected boolean V() { - return false; - } -} diff --git a/src/main/java/net/minecraft/server/EntityHorse.java b/src/main/java/net/minecraft/server/EntityHorse.java deleted file mode 100644 index d167c001b0..0000000000 --- a/src/main/java/net/minecraft/server/EntityHorse.java +++ /dev/null @@ -1,1226 +0,0 @@ -package net.minecraft.server; - -import java.util.Iterator; -import java.util.List; - -import org.bukkit.event.entity.EntityRegainHealthEvent.RegainReason; // CraftBukkit - -public class EntityHorse extends EntityAnimal implements IInventoryListener { - - private static final IEntitySelector bu = new EntitySelectorHorse(); - public static final IAttribute attributeJumpStrength = (new AttributeRanged("horse.jumpStrength", 0.7D, 0.0D, 2.0D)).a("Jump Strength").a(true); // CraftBukkit - private -> public - private static final String[] bw = new String[] { null, "textures/entity/horse/armor/horse_armor_iron.png", "textures/entity/horse/armor/horse_armor_gold.png", "textures/entity/horse/armor/horse_armor_diamond.png"}; - private static final String[] bx = new String[] { "", "meo", "goo", "dio"}; - private static final int[] by = new int[] { 0, 5, 7, 11}; - private static final String[] bz = new String[] { "textures/entity/horse/horse_white.png", "textures/entity/horse/horse_creamy.png", "textures/entity/horse/horse_chestnut.png", "textures/entity/horse/horse_brown.png", "textures/entity/horse/horse_black.png", "textures/entity/horse/horse_gray.png", "textures/entity/horse/horse_darkbrown.png"}; - private static final String[] bA = new String[] { "hwh", "hcr", "hch", "hbr", "hbl", "hgr", "hdb"}; - private static final String[] bB = new String[] { null, "textures/entity/horse/horse_markings_white.png", "textures/entity/horse/horse_markings_whitefield.png", "textures/entity/horse/horse_markings_whitedots.png", "textures/entity/horse/horse_markings_blackdots.png"}; - private static final String[] bC = new String[] { "", "wo_", "wmo", "wdo", "bdo"}; - private int bD; - private int bE; - private int bF; - public int bp; - public int bq; - protected boolean br; - public InventoryHorseChest inventoryChest; // CraftBukkit - private -> public - private boolean bH; - protected int bs; - protected float bt; - private boolean bI; - private float bJ; - private float bK; - private float bL; - private float bM; - private float bN; - private float bO; - private int bP; - private String bQ; - private String[] bR = new String[3]; - public int maxDomestication = 100; // CraftBukkit - store max domestication value - - public EntityHorse(World world) { - super(world); - this.a(1.4F, 1.6F); - this.fireProof = false; - this.setHasChest(false); - this.getNavigation().a(true); - this.goalSelector.a(0, new PathfinderGoalFloat(this)); - this.goalSelector.a(1, new PathfinderGoalPanic(this, 1.2D)); - this.goalSelector.a(1, new PathfinderGoalTame(this, 1.2D)); - this.goalSelector.a(2, new PathfinderGoalBreed(this, 1.0D)); - this.goalSelector.a(4, new PathfinderGoalFollowParent(this, 1.0D)); - this.goalSelector.a(6, new PathfinderGoalRandomStroll(this, 0.7D)); - this.goalSelector.a(7, new PathfinderGoalLookAtPlayer(this, EntityHuman.class, 6.0F)); - this.goalSelector.a(8, new PathfinderGoalRandomLookaround(this)); - this.loadChest(); - } - - protected void c() { - super.c(); - this.datawatcher.a(16, Integer.valueOf(0)); - this.datawatcher.a(19, Byte.valueOf((byte) 0)); - this.datawatcher.a(20, Integer.valueOf(0)); - this.datawatcher.a(21, String.valueOf("")); - this.datawatcher.a(22, Integer.valueOf(0)); - } - - public void setType(int i) { - this.datawatcher.watch(19, Byte.valueOf((byte) i)); - this.cP(); - } - - public int getType() { - return this.datawatcher.getByte(19); - } - - public void setVariant(int i) { - this.datawatcher.watch(20, Integer.valueOf(i)); - this.cP(); - } - - public int getVariant() { - return this.datawatcher.getInt(20); - } - - public String getName() { - if (this.hasCustomName()) { - return this.getCustomName(); - } else { - int i = this.getType(); - - switch (i) { - case 0: - default: - return LocaleI18n.get("entity.horse.name"); - - case 1: - return LocaleI18n.get("entity.donkey.name"); - - case 2: - return LocaleI18n.get("entity.mule.name"); - - case 3: - return LocaleI18n.get("entity.zombiehorse.name"); - - case 4: - return LocaleI18n.get("entity.skeletonhorse.name"); - } - } - } - - private boolean x(int i) { - return (this.datawatcher.getInt(16) & i) != 0; - } - - private void b(int i, boolean flag) { - int j = this.datawatcher.getInt(16); - - if (flag) { - this.datawatcher.watch(16, Integer.valueOf(j | i)); - } else { - this.datawatcher.watch(16, Integer.valueOf(j & ~i)); - } - } - - public boolean cb() { - return !this.isBaby(); - } - - public boolean isTame() { - return this.x(2); - } - - public boolean cg() { - return this.cb(); - } - - public String getOwnerUUID() { - return this.datawatcher.getString(21); - } - - public void setOwnerUUID(String s) { - this.datawatcher.watch(21, s); - } - - public float ci() { - int i = this.getAge(); - - return i >= 0 ? 1.0F : 0.5F + (float) (-24000 - i) / -24000.0F * 0.5F; - } - - public void a(boolean flag) { - if (flag) { - this.a(this.ci()); - } else { - this.a(1.0F); - } - } - - public boolean cj() { - return this.br; - } - - public void setTame(boolean flag) { - this.b(2, flag); - } - - public void j(boolean flag) { - this.br = flag; - } - - public boolean bM() { - return !this.cE() && super.bM(); - } - - protected void o(float f) { - if (f > 6.0F && this.cm()) { - this.o(false); - } - } - - public boolean hasChest() { - return this.x(8); - } - - public int cl() { - return this.datawatcher.getInt(22); - } - - private int e(ItemStack itemstack) { - if (itemstack == null) { - return 0; - } else { - Item item = itemstack.getItem(); - - return item == Items.HORSE_ARMOR_IRON ? 1 : (item == Items.HORSE_ARMOR_GOLD ? 2 : (item == Items.HORSE_ARMOR_DIAMOND ? 3 : 0)); - } - } - - public boolean cm() { - return this.x(32); - } - - public boolean cn() { - return this.x(64); - } - - public boolean co() { - return this.x(16); - } - - public boolean cp() { - return this.bH; - } - - public void d(ItemStack itemstack) { - this.datawatcher.watch(22, Integer.valueOf(this.e(itemstack))); - this.cP(); - } - - public void k(boolean flag) { - this.b(16, flag); - } - - public void setHasChest(boolean flag) { - this.b(8, flag); - } - - public void m(boolean flag) { - this.bH = flag; - } - - public void n(boolean flag) { - this.b(4, flag); - } - - public int getTemper() { - return this.bs; - } - - public void setTemper(int i) { - this.bs = i; - } - - public int v(int i) { - int j = MathHelper.a(this.getTemper() + i, 0, this.getMaxDomestication()); - - this.setTemper(j); - return j; - } - - public boolean damageEntity(DamageSource damagesource, float f) { - Entity entity = damagesource.getEntity(); - - return this.passenger != null && this.passenger.equals(entity) ? false : super.damageEntity(damagesource, f); - } - - public int aV() { - return by[this.cl()]; - } - - public boolean S() { - return this.passenger == null; - } - - public boolean cr() { - int i = MathHelper.floor(this.locX); - int j = MathHelper.floor(this.locZ); - - this.world.getBiome(i, j); - return true; - } - - public void cs() { - if (!this.world.isStatic && this.hasChest()) { - this.a(Item.getItemOf(Blocks.CHEST), 1); - this.setHasChest(false); - } - } - - private void cL() { - this.cS(); - this.world.makeSound(this, "eating", 1.0F, 1.0F + (this.random.nextFloat() - this.random.nextFloat()) * 0.2F); - } - - protected void b(float f) { - if (f > 1.0F) { - this.makeSound("mob.horse.land", 0.4F, 1.0F); - } - - int i = MathHelper.f(f * 0.5F - 3.0F); - - if (i > 0) { - this.damageEntity(DamageSource.FALL, (float) i); - if (this.passenger != null) { - this.passenger.damageEntity(DamageSource.FALL, (float) i); - } - - Block block = this.world.getType(MathHelper.floor(this.locX), MathHelper.floor(this.locY - 0.2D - (double) this.lastYaw), MathHelper.floor(this.locZ)); - - if (block.getMaterial() != Material.AIR) { - StepSound stepsound = block.stepSound; - - this.world.makeSound(this, stepsound.getStepSound(), stepsound.getVolume1() * 0.5F, stepsound.getVolume2() * 0.75F); - } - } - } - - private int cM() { - int i = this.getType(); - - return this.hasChest() /* && (i == 1 || i == 2) */ ? 17 : 2; // CraftBukkit - Remove type check - } - - public void loadChest() { // CraftBukkit - private -> public - InventoryHorseChest inventoryhorsechest = this.inventoryChest; - - this.inventoryChest = new InventoryHorseChest("HorseChest", this.cM(), this); // CraftBukkit - add this horse - this.inventoryChest.a(this.getName()); - if (inventoryhorsechest != null) { - inventoryhorsechest.b(this); - int i = Math.min(inventoryhorsechest.getSize(), this.inventoryChest.getSize()); - - for (int j = 0; j < i; ++j) { - ItemStack itemstack = inventoryhorsechest.getItem(j); - - if (itemstack != null) { - this.inventoryChest.setItem(j, itemstack.cloneItemStack()); - } - } - - inventoryhorsechest = null; - } - - this.inventoryChest.a(this); - this.cO(); - } - - private void cO() { - if (!this.world.isStatic) { - this.n(this.inventoryChest.getItem(0) != null); - if (this.cB()) { - this.d(this.inventoryChest.getItem(1)); - } - } - } - - public void a(InventorySubcontainer inventorysubcontainer) { - int i = this.cl(); - boolean flag = this.cu(); - - this.cO(); - if (this.ticksLived > 20) { - if (i == 0 && i != this.cl()) { - this.makeSound("mob.horse.armor", 0.5F, 1.0F); - } else if (i != this.cl()) { - this.makeSound("mob.horse.armor", 0.5F, 1.0F); - } - - if (!flag && this.cu()) { - this.makeSound("mob.horse.leather", 0.5F, 1.0F); - } - } - } - - public boolean canSpawn() { - this.cr(); - return super.canSpawn(); - } - - protected EntityHorse a(Entity entity, double d0) { - double d1 = Double.MAX_VALUE; - Entity entity1 = null; - List list = this.world.getEntities(entity, entity.boundingBox.a(d0, d0, d0), bu); - Iterator iterator = list.iterator(); - - while (iterator.hasNext()) { - Entity entity2 = (Entity) iterator.next(); - double d2 = entity2.e(entity.locX, entity.locY, entity.locZ); - - if (d2 < d1) { - entity1 = entity2; - d1 = d2; - } - } - - return (EntityHorse) entity1; - } - - public double getJumpStrength() { - return this.getAttributeInstance(attributeJumpStrength).getValue(); - } - - protected String aU() { - this.cS(); - int i = this.getType(); - - return i == 3 ? "mob.horse.zombie.death" : (i == 4 ? "mob.horse.skeleton.death" : (i != 1 && i != 2 ? "mob.horse.death" : "mob.horse.donkey.death")); - } - - protected Item getLoot() { - boolean flag = this.random.nextInt(4) == 0; - int i = this.getType(); - - return i == 4 ? Items.BONE : (i == 3 ? (flag ? Item.getById(0) : Items.ROTTEN_FLESH) : Items.LEATHER); - } - - protected String aT() { - this.cS(); - if (this.random.nextInt(3) == 0) { - this.cU(); - } - - int i = this.getType(); - - return i == 3 ? "mob.horse.zombie.hit" : (i == 4 ? "mob.horse.skeleton.hit" : (i != 1 && i != 2 ? "mob.horse.hit" : "mob.horse.donkey.hit")); - } - - public boolean cu() { - return this.x(4); - } - - protected String t() { - this.cS(); - if (this.random.nextInt(10) == 0 && !this.bh()) { - this.cU(); - } - - int i = this.getType(); - - return i == 3 ? "mob.horse.zombie.idle" : (i == 4 ? "mob.horse.skeleton.idle" : (i != 1 && i != 2 ? "mob.horse.idle" : "mob.horse.donkey.idle")); - } - - protected String cv() { - this.cS(); - this.cU(); - int i = this.getType(); - - return i != 3 && i != 4 ? (i != 1 && i != 2 ? "mob.horse.angry" : "mob.horse.donkey.angry") : null; - } - - protected void a(int i, int j, int k, Block block) { - StepSound stepsound = block.stepSound; - - if (this.world.getType(i, j + 1, k) == Blocks.SNOW) { - stepsound = Blocks.SNOW.stepSound; - } - - if (!block.getMaterial().isLiquid()) { - int l = this.getType(); - - if (this.passenger != null && l != 1 && l != 2) { - ++this.bP; - if (this.bP > 5 && this.bP % 3 == 0) { - this.makeSound("mob.horse.gallop", stepsound.getVolume1() * 0.15F, stepsound.getVolume2()); - if (l == 0 && this.random.nextInt(10) == 0) { - this.makeSound("mob.horse.breathe", stepsound.getVolume1() * 0.6F, stepsound.getVolume2()); - } - } else if (this.bP <= 5) { - this.makeSound("mob.horse.wood", stepsound.getVolume1() * 0.15F, stepsound.getVolume2()); - } - } else if (stepsound == Block.f) { - this.makeSound("mob.horse.wood", stepsound.getVolume1() * 0.15F, stepsound.getVolume2()); - } else { - this.makeSound("mob.horse.soft", stepsound.getVolume1() * 0.15F, stepsound.getVolume2()); - } - } - } - - protected void aD() { - super.aD(); - this.getAttributeMap().b(attributeJumpStrength); - this.getAttributeInstance(GenericAttributes.maxHealth).setValue(53.0D); - this.getAttributeInstance(GenericAttributes.d).setValue(0.22499999403953552D); - } - - public int bB() { - return 6; - } - - public int getMaxDomestication() { - return this.maxDomestication; // CraftBukkit - return stored max domestication instead of 100 - } - - protected float bf() { - return 0.8F; - } - - public int q() { - return 400; - } - - private void cP() { - this.bQ = null; - } - - public void g(EntityHuman entityhuman) { - if (!this.world.isStatic && (this.passenger == null || this.passenger == entityhuman) && this.isTame()) { - this.inventoryChest.a(this.getName()); - entityhuman.openHorseInventory(this, this.inventoryChest); - } - } - - public boolean a(EntityHuman entityhuman) { - ItemStack itemstack = entityhuman.inventory.getItemInHand(); - - if (itemstack != null && itemstack.getItem() == Items.MONSTER_EGG) { - return super.a(entityhuman); - } else if (!this.isTame() && this.cE()) { - return false; - } else if (this.isTame() && this.cb() && entityhuman.isSneaking()) { - this.g(entityhuman); - return true; - } else if (this.cg() && this.passenger != null) { - return super.a(entityhuman); - } else { - if (itemstack != null) { - boolean flag = false; - - if (this.cB()) { - byte b0 = -1; - - if (itemstack.getItem() == Items.HORSE_ARMOR_IRON) { - b0 = 1; - } else if (itemstack.getItem() == Items.HORSE_ARMOR_GOLD) { - b0 = 2; - } else if (itemstack.getItem() == Items.HORSE_ARMOR_DIAMOND) { - b0 = 3; - } - - if (b0 >= 0) { - if (!this.isTame()) { - this.cJ(); - return true; - } - - this.g(entityhuman); - return true; - } - } - - if (!flag && !this.cE()) { - float f = 0.0F; - short short1 = 0; - byte b1 = 0; - - if (itemstack.getItem() == Items.WHEAT) { - f = 2.0F; - short1 = 60; - b1 = 3; - } else if (itemstack.getItem() == Items.SUGAR) { - f = 1.0F; - short1 = 30; - b1 = 3; - } else if (itemstack.getItem() == Items.BREAD) { - f = 7.0F; - short1 = 180; - b1 = 3; - } else if (Block.a(itemstack.getItem()) == Blocks.HAY_BLOCK) { - f = 20.0F; - short1 = 180; - } else if (itemstack.getItem() == Items.APPLE) { - f = 3.0F; - short1 = 60; - b1 = 3; - } else if (itemstack.getItem() == Items.CARROT_GOLDEN) { - f = 4.0F; - short1 = 60; - b1 = 5; - if (this.isTame() && this.getAge() == 0) { - flag = true; - this.f(entityhuman); - } - } else if (itemstack.getItem() == Items.GOLDEN_APPLE) { - f = 10.0F; - short1 = 240; - b1 = 10; - if (this.isTame() && this.getAge() == 0) { - flag = true; - this.f(entityhuman); - } - } - - if (this.getHealth() < this.getMaxHealth() && f > 0.0F) { - this.heal(f, RegainReason.EATING); // CraftBukkit - flag = true; - } - - if (!this.cb() && short1 > 0) { - this.a(short1); - flag = true; - } - - if (b1 > 0 && (flag || !this.isTame()) && b1 < this.getMaxDomestication()) { - flag = true; - this.v(b1); - } - - if (flag) { - this.cL(); - } - } - - if (!this.isTame() && !flag) { - if (itemstack != null && itemstack.a(entityhuman, (EntityLiving) this)) { - return true; - } - - this.cJ(); - return true; - } - - if (!flag && this.cC() && !this.hasChest() && itemstack.getItem() == Item.getItemOf(Blocks.CHEST)) { - this.setHasChest(true); - this.makeSound("mob.chickenplop", 1.0F, (this.random.nextFloat() - this.random.nextFloat()) * 0.2F + 1.0F); - flag = true; - this.loadChest(); - } - - if (!flag && this.cg() && !this.cu() && itemstack.getItem() == Items.SADDLE) { - this.g(entityhuman); - return true; - } - - if (flag) { - if (!entityhuman.abilities.canInstantlyBuild && --itemstack.count == 0) { - entityhuman.inventory.setItem(entityhuman.inventory.itemInHandIndex, (ItemStack) null); - } - - return true; - } - } - - if (this.cg() && this.passenger == null) { - if (itemstack != null && itemstack.a(entityhuman, (EntityLiving) this)) { - return true; - } else { - this.i(entityhuman); - return true; - } - } else { - return super.a(entityhuman); - } - } - } - - private void i(EntityHuman entityhuman) { - entityhuman.yaw = this.yaw; - entityhuman.pitch = this.pitch; - this.o(false); - this.p(false); - if (!this.world.isStatic) { - entityhuman.mount(this); - } - } - - public boolean cB() { - return this.getType() == 0; - } - - public boolean cC() { - int i = this.getType(); - - return i == 2 || i == 1; - } - - protected boolean bh() { - return this.passenger != null && this.cu() ? true : this.cm() || this.cn(); - } - - public boolean cE() { - int i = this.getType(); - - return i == 3 || i == 4; - } - - public boolean cF() { - return this.cE() || this.getType() == 2; - } - - public boolean c(ItemStack itemstack) { - return false; - } - - private void cR() { - this.bp = 1; - } - - public void die(DamageSource damagesource) { - super.die(damagesource); - /* CraftBukkit start - Handle chest dropping in dropDeathLoot below - if (!this.world.isStatic) { - this.dropChest(); - } - // CraftBukkit end */ - } - - // CraftBukkit start - Add method - protected void dropDeathLoot(boolean flag, int i) { - super.dropDeathLoot(flag, i); - - // Moved from die method above - if (!this.world.isStatic) { - this.dropChest(); - } - } - // CraftBukkit end - - public void e() { - if (this.random.nextInt(200) == 0) { - this.cR(); - } - - super.e(); - if (!this.world.isStatic) { - if (this.random.nextInt(900) == 0 && this.deathTicks == 0) { - this.heal(1.0F, RegainReason.REGEN); // CraftBukkit - } - - if (!this.cm() && this.passenger == null && this.random.nextInt(300) == 0 && this.world.getType(MathHelper.floor(this.locX), MathHelper.floor(this.locY) - 1, MathHelper.floor(this.locZ)) == Blocks.GRASS) { - this.o(true); - } - - if (this.cm() && ++this.bD > 50) { - this.bD = 0; - this.o(false); - } - - if (this.co() && !this.cb() && !this.cm()) { - EntityHorse entityhorse = this.a(this, 16.0D); - - if (entityhorse != null && this.f(entityhorse) > 4.0D) { - PathEntity pathentity = this.world.findPath(this, entityhorse, 16.0F, true, false, false, true); - - this.setPathEntity(pathentity); - } - } - } - } - - public void h() { - super.h(); - if (this.world.isStatic && this.datawatcher.a()) { - this.datawatcher.e(); - this.cP(); - } - - if (this.bE > 0 && ++this.bE > 30) { - this.bE = 0; - this.b(128, false); - } - - if (!this.world.isStatic && this.bF > 0 && ++this.bF > 20) { - this.bF = 0; - this.p(false); - } - - if (this.bp > 0 && ++this.bp > 8) { - this.bp = 0; - } - - if (this.bq > 0) { - ++this.bq; - if (this.bq > 300) { - this.bq = 0; - } - } - - this.bK = this.bJ; - if (this.cm()) { - this.bJ += (1.0F - this.bJ) * 0.4F + 0.05F; - if (this.bJ > 1.0F) { - this.bJ = 1.0F; - } - } else { - this.bJ += (0.0F - this.bJ) * 0.4F - 0.05F; - if (this.bJ < 0.0F) { - this.bJ = 0.0F; - } - } - - this.bM = this.bL; - if (this.cn()) { - this.bK = this.bJ = 0.0F; - this.bL += (1.0F - this.bL) * 0.4F + 0.05F; - if (this.bL > 1.0F) { - this.bL = 1.0F; - } - } else { - this.bI = false; - this.bL += (0.8F * this.bL * this.bL * this.bL - this.bL) * 0.6F - 0.05F; - if (this.bL < 0.0F) { - this.bL = 0.0F; - } - } - - this.bO = this.bN; - if (this.x(128)) { - this.bN += (1.0F - this.bN) * 0.7F + 0.05F; - if (this.bN > 1.0F) { - this.bN = 1.0F; - } - } else { - this.bN += (0.0F - this.bN) * 0.7F - 0.05F; - if (this.bN < 0.0F) { - this.bN = 0.0F; - } - } - } - - private void cS() { - if (!this.world.isStatic) { - this.bE = 1; - this.b(128, true); - } - } - - private boolean cT() { - return this.passenger == null && this.vehicle == null && this.isTame() && this.cb() && !this.cF() && this.getHealth() >= this.getMaxHealth(); - } - - public void e(boolean flag) { - this.b(32, flag); - } - - public void o(boolean flag) { - this.e(flag); - } - - public void p(boolean flag) { - if (flag) { - this.o(false); - } - - this.b(64, flag); - } - - private void cU() { - if (!this.world.isStatic) { - this.bF = 1; - this.p(true); - } - } - - public void cJ() { - this.cU(); - String s = this.cv(); - - if (s != null) { - this.makeSound(s, this.bf(), this.bg()); - } - } - - public void dropChest() { - this.a(this, this.inventoryChest); - this.cs(); - } - - private void a(Entity entity, InventoryHorseChest inventoryhorsechest) { - if (inventoryhorsechest != null && !this.world.isStatic) { - for (int i = 0; i < inventoryhorsechest.getSize(); ++i) { - ItemStack itemstack = inventoryhorsechest.getItem(i); - - if (itemstack != null) { - this.a(itemstack, 0.0F); - } - } - } - } - - public boolean h(EntityHuman entityhuman) { - this.setOwnerUUID(entityhuman.getUniqueID().toString()); - this.setTame(true); - return true; - } - - public void e(float f, float f1) { - if (this.passenger != null && this.passenger instanceof EntityLiving && this.cu()) { - this.lastYaw = this.yaw = this.passenger.yaw; - this.pitch = this.passenger.pitch * 0.5F; - this.b(this.yaw, this.pitch); - this.aO = this.aM = this.yaw; - f = ((EntityLiving) this.passenger).bd * 0.5F; - f1 = ((EntityLiving) this.passenger).be; - if (f1 <= 0.0F) { - f1 *= 0.25F; - this.bP = 0; - } - - if (this.onGround && this.bt == 0.0F && this.cn() && !this.bI) { - f = 0.0F; - f1 = 0.0F; - } - - if (this.bt > 0.0F && !this.cj() && this.onGround) { - this.motY = this.getJumpStrength() * (double) this.bt; - if (this.hasEffect(MobEffectList.JUMP)) { - this.motY += (double) ((float) (this.getEffect(MobEffectList.JUMP).getAmplifier() + 1) * 0.1F); - } - - this.j(true); - this.al = true; - if (f1 > 0.0F) { - float f2 = MathHelper.sin(this.yaw * 3.1415927F / 180.0F); - float f3 = MathHelper.cos(this.yaw * 3.1415927F / 180.0F); - - this.motX += (double) (-0.4F * f2 * this.bt); - this.motZ += (double) (0.4F * f3 * this.bt); - this.makeSound("mob.horse.jump", 0.4F, 1.0F); - } - - this.bt = 0.0F; - } - - this.W = 1.0F; - this.aQ = this.bl() * 0.1F; - if (!this.world.isStatic) { - this.i((float) this.getAttributeInstance(GenericAttributes.d).getValue()); - super.e(f, f1); - } - - if (this.onGround) { - this.bt = 0.0F; - this.j(false); - } - - this.aE = this.aF; - double d0 = this.locX - this.lastX; - double d1 = this.locZ - this.lastZ; - float f4 = MathHelper.sqrt(d0 * d0 + d1 * d1) * 4.0F; - - if (f4 > 1.0F) { - f4 = 1.0F; - } - - this.aF += (f4 - this.aF) * 0.4F; - this.aG += this.aF; - } else { - this.W = 0.5F; - this.aQ = 0.02F; - super.e(f, f1); - } - } - - public void b(NBTTagCompound nbttagcompound) { - super.b(nbttagcompound); - nbttagcompound.setBoolean("EatingHaystack", this.cm()); - nbttagcompound.setBoolean("ChestedHorse", this.hasChest()); - nbttagcompound.setBoolean("HasReproduced", this.cp()); - nbttagcompound.setBoolean("Bred", this.co()); - nbttagcompound.setInt("Type", this.getType()); - nbttagcompound.setInt("Variant", this.getVariant()); - nbttagcompound.setInt("Temper", this.getTemper()); - nbttagcompound.setBoolean("Tame", this.isTame()); - nbttagcompound.setString("OwnerUUID", this.getOwnerUUID()); - nbttagcompound.setInt("Bukkit.MaxDomestication", this.maxDomestication); // CraftBukkit - if (this.hasChest()) { - NBTTagList nbttaglist = new NBTTagList(); - - for (int i = 2; i < this.inventoryChest.getSize(); ++i) { - ItemStack itemstack = this.inventoryChest.getItem(i); - - if (itemstack != null) { - NBTTagCompound nbttagcompound1 = new NBTTagCompound(); - - nbttagcompound1.setByte("Slot", (byte) i); - itemstack.save(nbttagcompound1); - nbttaglist.add(nbttagcompound1); - } - } - - nbttagcompound.set("Items", nbttaglist); - } - - if (this.inventoryChest.getItem(1) != null) { - nbttagcompound.set("ArmorItem", this.inventoryChest.getItem(1).save(new NBTTagCompound())); - } - - if (this.inventoryChest.getItem(0) != null) { - nbttagcompound.set("SaddleItem", this.inventoryChest.getItem(0).save(new NBTTagCompound())); - } - } - - public void a(NBTTagCompound nbttagcompound) { - super.a(nbttagcompound); - this.o(nbttagcompound.getBoolean("EatingHaystack")); - this.k(nbttagcompound.getBoolean("Bred")); - this.setHasChest(nbttagcompound.getBoolean("ChestedHorse")); - this.m(nbttagcompound.getBoolean("HasReproduced")); - this.setType(nbttagcompound.getInt("Type")); - this.setVariant(nbttagcompound.getInt("Variant")); - this.setTemper(nbttagcompound.getInt("Temper")); - this.setTame(nbttagcompound.getBoolean("Tame")); - if (nbttagcompound.hasKeyOfType("OwnerUUID", 8)) { - this.setOwnerUUID(nbttagcompound.getString("OwnerUUID")); - } - // CraftBukkit start - if (nbttagcompound.hasKey("Bukkit.MaxDomestication")) { - this.maxDomestication = nbttagcompound.getInt("Bukkit.MaxDomestication"); - } - // CraftBukkit end - AttributeInstance attributeinstance = this.getAttributeMap().a("Speed"); - - if (attributeinstance != null) { - this.getAttributeInstance(GenericAttributes.d).setValue(attributeinstance.b() * 0.25D); - } - - if (this.hasChest()) { - NBTTagList nbttaglist = nbttagcompound.getList("Items", 10); - - this.loadChest(); - - for (int i = 0; i < nbttaglist.size(); ++i) { - NBTTagCompound nbttagcompound1 = nbttaglist.get(i); - int j = nbttagcompound1.getByte("Slot") & 255; - - if (j >= 2 && j < this.inventoryChest.getSize()) { - this.inventoryChest.setItem(j, ItemStack.createStack(nbttagcompound1)); - } - } - } - - ItemStack itemstack; - - if (nbttagcompound.hasKeyOfType("ArmorItem", 10)) { - itemstack = ItemStack.createStack(nbttagcompound.getCompound("ArmorItem")); - if (itemstack != null && a(itemstack.getItem())) { - this.inventoryChest.setItem(1, itemstack); - } - } - - if (nbttagcompound.hasKeyOfType("SaddleItem", 10)) { - itemstack = ItemStack.createStack(nbttagcompound.getCompound("SaddleItem")); - if (itemstack != null && itemstack.getItem() == Items.SADDLE) { - this.inventoryChest.setItem(0, itemstack); - } - } else if (nbttagcompound.getBoolean("Saddle")) { - this.inventoryChest.setItem(0, new ItemStack(Items.SADDLE)); - } - - this.cO(); - } - - public boolean mate(EntityAnimal entityanimal) { - if (entityanimal == this) { - return false; - } else if (entityanimal.getClass() != this.getClass()) { - return false; - } else { - EntityHorse entityhorse = (EntityHorse) entityanimal; - - if (this.cT() && entityhorse.cT()) { - int i = this.getType(); - int j = entityhorse.getType(); - - return i == j || i == 0 && j == 1 || i == 1 && j == 0; - } else { - return false; - } - } - } - - public EntityAgeable createChild(EntityAgeable entityageable) { - EntityHorse entityhorse = (EntityHorse) entityageable; - EntityHorse entityhorse1 = new EntityHorse(this.world); - int i = this.getType(); - int j = entityhorse.getType(); - int k = 0; - - if (i == j) { - k = i; - } else if (i == 0 && j == 1 || i == 1 && j == 0) { - k = 2; - } - - if (k == 0) { - int l = this.random.nextInt(9); - int i1; - - if (l < 4) { - i1 = this.getVariant() & 255; - } else if (l < 8) { - i1 = entityhorse.getVariant() & 255; - } else { - i1 = this.random.nextInt(7); - } - - int j1 = this.random.nextInt(5); - - if (j1 < 2) { - i1 |= this.getVariant() & '\uff00'; - } else if (j1 < 4) { - i1 |= entityhorse.getVariant() & '\uff00'; - } else { - i1 |= this.random.nextInt(5) << 8 & '\uff00'; - } - - entityhorse1.setVariant(i1); - } - - entityhorse1.setType(k); - double d0 = this.getAttributeInstance(GenericAttributes.maxHealth).b() + entityageable.getAttributeInstance(GenericAttributes.maxHealth).b() + (double) this.cV(); - - entityhorse1.getAttributeInstance(GenericAttributes.maxHealth).setValue(d0 / 3.0D); - double d1 = this.getAttributeInstance(attributeJumpStrength).b() + entityageable.getAttributeInstance(attributeJumpStrength).b() + this.cW(); - - entityhorse1.getAttributeInstance(attributeJumpStrength).setValue(d1 / 3.0D); - double d2 = this.getAttributeInstance(GenericAttributes.d).b() + entityageable.getAttributeInstance(GenericAttributes.d).b() + this.cX(); - - entityhorse1.getAttributeInstance(GenericAttributes.d).setValue(d2 / 3.0D); - return entityhorse1; - } - - public GroupDataEntity prepare(GroupDataEntity groupdataentity) { - Object object = super.prepare(groupdataentity); - boolean flag = false; - int i = 0; - int j; - - if (object instanceof GroupDataHorse) { - j = ((GroupDataHorse) object).a; - i = ((GroupDataHorse) object).b & 255 | this.random.nextInt(5) << 8; - } else { - if (this.random.nextInt(10) == 0) { - j = 1; - } else { - int k = this.random.nextInt(7); - int l = this.random.nextInt(5); - - j = 0; - i = k | l << 8; - } - - object = new GroupDataHorse(j, i); - } - - this.setType(j); - this.setVariant(i); - if (this.random.nextInt(5) == 0) { - this.setAge(-24000); - } - - if (j != 4 && j != 3) { - this.getAttributeInstance(GenericAttributes.maxHealth).setValue((double) this.cV()); - if (j == 0) { - this.getAttributeInstance(GenericAttributes.d).setValue(this.cX()); - } else { - this.getAttributeInstance(GenericAttributes.d).setValue(0.17499999701976776D); - } - } else { - this.getAttributeInstance(GenericAttributes.maxHealth).setValue(15.0D); - this.getAttributeInstance(GenericAttributes.d).setValue(0.20000000298023224D); - } - - if (j != 2 && j != 1) { - this.getAttributeInstance(attributeJumpStrength).setValue(this.cW()); - } else { - this.getAttributeInstance(attributeJumpStrength).setValue(0.5D); - } - - this.setHealth(this.getMaxHealth()); - return (GroupDataEntity) object; - } - - protected boolean bk() { - return true; - } - - public void w(int i) { - if (this.cu()) { - // CraftBukkit start - fire HorseJumpEvent, use event power - if (i < 0) { - i = 0; - } - - float power; - if (i >= 90) { - power = 1.0F; - } else { - power = 0.4F + 0.4F * (float) i / 90.0F; - } - - org.bukkit.event.entity.HorseJumpEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callHorseJumpEvent(this, power); - if (!event.isCancelled()) { - this.bI = true; - this.cU(); - this.bt = event.getPower(); - } - // CraftBukkit end - } - } - - public void ac() { - super.ac(); - if (this.bM > 0.0F) { - float f = MathHelper.sin(this.aM * 3.1415927F / 180.0F); - float f1 = MathHelper.cos(this.aM * 3.1415927F / 180.0F); - float f2 = 0.7F * this.bM; - float f3 = 0.15F * this.bM; - - this.passenger.setPosition(this.locX + (double) (f2 * f), this.locY + this.ad() + this.passenger.ad() + (double) f3, this.locZ - (double) (f2 * f1)); - if (this.passenger instanceof EntityLiving) { - ((EntityLiving) this.passenger).aM = this.aM; - } - } - } - - private float cV() { - return 15.0F + (float) this.random.nextInt(8) + (float) this.random.nextInt(9); - } - - private double cW() { - return 0.4000000059604645D + this.random.nextDouble() * 0.2D + this.random.nextDouble() * 0.2D + this.random.nextDouble() * 0.2D; - } - - private double cX() { - return (0.44999998807907104D + this.random.nextDouble() * 0.3D + this.random.nextDouble() * 0.3D + this.random.nextDouble() * 0.3D) * 0.25D; - } - - public static boolean a(Item item) { - return item == Items.HORSE_ARMOR_IRON || item == Items.HORSE_ARMOR_GOLD || item == Items.HORSE_ARMOR_DIAMOND; - } - - public boolean h_() { - return false; - } -} diff --git a/src/main/java/net/minecraft/server/EntityHuman.java b/src/main/java/net/minecraft/server/EntityHuman.java deleted file mode 100644 index 331dbac199..0000000000 --- a/src/main/java/net/minecraft/server/EntityHuman.java +++ /dev/null @@ -1,1599 +0,0 @@ -package net.minecraft.server; - -import java.util.Collection; -import java.util.Iterator; -import java.util.List; -import java.util.UUID; - -import net.minecraft.util.com.google.common.base.Charsets; -import net.minecraft.util.com.mojang.authlib.GameProfile; - -// CraftBukkit start -import org.bukkit.craftbukkit.entity.CraftHumanEntity; -import org.bukkit.craftbukkit.entity.CraftItem; -import org.bukkit.craftbukkit.inventory.CraftItemStack; -import org.bukkit.entity.Player; -import org.bukkit.event.entity.EntityCombustByEntityEvent; -import org.bukkit.event.player.PlayerBedEnterEvent; -import org.bukkit.event.player.PlayerBedLeaveEvent; -import org.bukkit.event.player.PlayerDropItemEvent; -import org.bukkit.event.player.PlayerItemConsumeEvent; -// CraftBukkit end - -public abstract class EntityHuman extends EntityLiving implements ICommandListener { - - public PlayerInventory inventory = new PlayerInventory(this); - private InventoryEnderChest enderChest = new InventoryEnderChest(); - public Container defaultContainer; - public Container activeContainer; - protected FoodMetaData foodData = new FoodMetaData(this); // CraftBukkit - add "this" to constructor - protected int bq; - public float br; - public float bs; - public int bt; - public double bu; - public double bv; - public double bw; - public double bx; - public double by; - public double bz; - // CraftBukkit start - public boolean sleeping; // protected -> public - public boolean fauxSleeping; - public String spawnWorld = ""; - - @Override - public CraftHumanEntity getBukkitEntity() { - return (CraftHumanEntity) super.getBukkitEntity(); - } - // CraftBukkit end - - public ChunkCoordinates bB; - public int sleepTicks; // CraftBukkit - private -> public - public float bC; - public float bD; - private ChunkCoordinates c; - private boolean d; - private ChunkCoordinates e; - public PlayerAbilities abilities = new PlayerAbilities(); - public int oldLevel = -1; // CraftBukkit - add field - public int expLevel; - public int expTotal; - public float exp; - private ItemStack f; - private int g; - protected float bI = 0.1F; - protected float bJ = 0.02F; - private int h; - private final GameProfile i; - public EntityFishingHook hookedFish; - - public EntityHuman(World world, GameProfile gameprofile) { - super(world); - this.uniqueID = a(gameprofile); - this.i = gameprofile; - this.defaultContainer = new ContainerPlayer(this.inventory, !world.isStatic, this); - this.activeContainer = this.defaultContainer; - this.height = 1.62F; - 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.aZ = 180.0F; - this.maxFireTicks = 20; - } - - protected void aD() { - super.aD(); - this.getAttributeMap().b(GenericAttributes.e).setValue(1.0D); - } - - protected void c() { - super.c(); - this.datawatcher.a(16, Byte.valueOf((byte) 0)); - this.datawatcher.a(17, Float.valueOf(0.0F)); - this.datawatcher.a(18, Integer.valueOf(0)); - } - - public boolean by() { - return this.f != null; - } - - public void bA() { - if (this.f != null) { - this.f.b(this.world, this, this.g); - } - - this.bB(); - } - - public void bB() { - this.f = null; - this.g = 0; - if (!this.world.isStatic) { - this.e(false); - } - } - - public boolean isBlocking() { - return this.by() && this.f.getItem().d(this.f) == EnumAnimation.BLOCK; - } - - public void h() { - if (this.f != null) { - ItemStack itemstack = this.inventory.getItemInHand(); - - if (itemstack == this.f) { - if (this.g <= 25 && this.g % 4 == 0) { - this.c(itemstack, 5); - } - - if (--this.g == 0 && !this.world.isStatic) { - this.p(); - } - } else { - this.bB(); - } - } - - if (this.bt > 0) { - --this.bt; - } - - if (this.isSleeping()) { - ++this.sleepTicks; - if (this.sleepTicks > 100) { - this.sleepTicks = 100; - } - - if (!this.world.isStatic) { - if (!this.j()) { - this.a(true, true, false); - } else if (this.world.w()) { - this.a(false, true, true); - } - } - } else if (this.sleepTicks > 0) { - ++this.sleepTicks; - if (this.sleepTicks >= 110) { - this.sleepTicks = 0; - } - } - - super.h(); - if (!this.world.isStatic && this.activeContainer != null && !this.activeContainer.a(this)) { - this.closeInventory(); - this.activeContainer = this.defaultContainer; - } - - if (this.isBurning() && this.abilities.isInvulnerable) { - this.extinguish(); - } - - this.bu = this.bx; - this.bv = this.by; - this.bw = this.bz; - double d0 = this.locX - this.bx; - double d1 = this.locY - this.by; - double d2 = this.locZ - this.bz; - double d3 = 10.0D; - - if (d0 > d3) { - this.bu = this.bx = this.locX; - } - - if (d2 > d3) { - this.bw = this.bz = this.locZ; - } - - if (d1 > d3) { - this.bv = this.by = this.locY; - } - - if (d0 < -d3) { - this.bu = this.bx = this.locX; - } - - if (d2 < -d3) { - this.bw = this.bz = this.locZ; - } - - if (d1 < -d3) { - this.bv = this.by = this.locY; - } - - this.bx += d0 * 0.25D; - this.bz += d2 * 0.25D; - this.by += d1 * 0.25D; - if (this.vehicle == null) { - this.e = null; - } - - if (!this.world.isStatic) { - this.foodData.a(this); - this.a(StatisticList.g, 1); - } - } - - public int D() { - return this.abilities.isInvulnerable ? 0 : 80; - } - - protected String H() { - return "game.player.swim"; - } - - protected String O() { - return "game.player.swim.splash"; - } - - public int ai() { - return 10; - } - - public void makeSound(String s, float f, float f1) { - this.world.a(this, s, f, f1); - } - - protected void c(ItemStack itemstack, int i) { - if (itemstack.o() == EnumAnimation.DRINK) { - this.makeSound("random.drink", 0.5F, this.world.random.nextFloat() * 0.1F + 0.9F); - } - - if (itemstack.o() == EnumAnimation.EAT) { - for (int j = 0; j < i; ++j) { - Vec3D vec3d = Vec3D.a(((double) this.random.nextFloat() - 0.5D) * 0.1D, Math.random() * 0.1D + 0.1D, 0.0D); - - vec3d.a(-this.pitch * 3.1415927F / 180.0F); - vec3d.b(-this.yaw * 3.1415927F / 180.0F); - Vec3D vec3d1 = Vec3D.a(((double) this.random.nextFloat() - 0.5D) * 0.3D, (double) (-this.random.nextFloat()) * 0.6D - 0.3D, 0.6D); - - vec3d1.a(-this.pitch * 3.1415927F / 180.0F); - vec3d1.b(-this.yaw * 3.1415927F / 180.0F); - vec3d1 = vec3d1.add(this.locX, this.locY + (double) this.getHeadHeight(), this.locZ); - String s = "iconcrack_" + Item.getId(itemstack.getItem()); - - if (itemstack.usesData()) { - s = s + "_" + itemstack.getData(); - } - - this.world.addParticle(s, vec3d1.a, vec3d1.b, vec3d1.c, vec3d.a, vec3d.b + 0.05D, vec3d.c); - } - - this.makeSound("random.eat", 0.5F + 0.5F * (float) this.random.nextInt(2), (this.random.nextFloat() - this.random.nextFloat()) * 0.2F + 1.0F); - } - } - - protected void p() { - if (this.f != null) { - this.c(this.f, 16); - int i = this.f.count; - - // CraftBukkit start - fire PlayerItemConsumeEvent - org.bukkit.inventory.ItemStack craftItem = CraftItemStack.asBukkitCopy(this.f); - PlayerItemConsumeEvent event = new PlayerItemConsumeEvent((Player) this.getBukkitEntity(), craftItem); - world.getServer().getPluginManager().callEvent(event); - - if (event.isCancelled()) { - // Update client - if (this instanceof EntityPlayer) { - ((EntityPlayer) this).playerConnection.sendPacket(new PacketPlayOutSetSlot((byte) 0, activeContainer.getSlot((IInventory) this.inventory, this.inventory.itemInHandIndex).index, this.f)); - } - return; - } - - // Plugin modified the item, process it but don't remove it - if (!craftItem.equals(event.getItem())) { - CraftItemStack.asNMSCopy(event.getItem()).b(this.world, this); - - // Update client - if (this instanceof EntityPlayer) { - ((EntityPlayer) this).playerConnection.sendPacket(new PacketPlayOutSetSlot((byte) 0, activeContainer.getSlot((IInventory) this.inventory, this.inventory.itemInHandIndex).index, this.f)); - } - return; - } - // CraftBukkit end - - ItemStack itemstack = this.f.b(this.world, this); - - if (itemstack != this.f || itemstack != null && itemstack.count != i) { - this.inventory.items[this.inventory.itemInHandIndex] = itemstack; - if (itemstack.count == 0) { - this.inventory.items[this.inventory.itemInHandIndex] = null; - } - } - - this.bB(); - } - } - - protected boolean bh() { - return this.getHealth() <= 0.0F || this.isSleeping(); - } - - // CraftBukkit - protected -> public - public void closeInventory() { - this.activeContainer = this.defaultContainer; - } - - public void mount(Entity entity) { - // CraftBukkit start - mirror Entity mount changes - this.setPassengerOf(entity); - } - - public void setPassengerOf(Entity entity) { - // CraftBukkit end - if (this.vehicle != null && entity == null) { - // CraftBukkit start - use parent method instead to correctly fire VehicleExitEvent - Entity originalVehicle = this.vehicle; - // First statement moved down, second statement handled in parent method. - /* - if (!this.world.isStatic) { - this.m(this.vehicle); - } - - if (this.vehicle != null) { - this.vehicle.passenger = null; - } - - this.vehicle = null; - */ - super.setPassengerOf(entity); - if (!this.world.isStatic && this.vehicle == null) { - this.m(originalVehicle); - } - // CraftBukkit end - } else { - super.setPassengerOf(entity); // CraftBukkit - call new parent - } - } - - public void ab() { - if (!this.world.isStatic && this.isSneaking()) { - this.mount((Entity) null); - this.setSneaking(false); - } else { - double d0 = this.locX; - double d1 = this.locY; - double d2 = this.locZ; - float f = this.yaw; - float f1 = this.pitch; - - super.ab(); - this.br = this.bs; - this.bs = 0.0F; - this.l(this.locX - d0, this.locY - d1, this.locZ - d2); - if (this.vehicle instanceof EntityPig) { - this.pitch = f1; - this.yaw = f; - this.aM = ((EntityPig) this.vehicle).aM; - } - } - } - - protected void bq() { - super.bq(); - this.bb(); - } - - public void e() { - if (this.bq > 0) { - --this.bq; - } - - if (this.world.difficulty == EnumDifficulty.PEACEFUL && this.getHealth() < this.getMaxHealth() && this.world.getGameRules().getBoolean("naturalRegeneration") && this.ticksLived % 20 * 12 == 0) { - // CraftBukkit - added regain reason of "REGEN" for filtering purposes. - this.heal(1.0F, org.bukkit.event.entity.EntityRegainHealthEvent.RegainReason.REGEN); - } - - this.inventory.k(); - this.br = this.bs; - super.e(); - AttributeInstance attributeinstance = this.getAttributeInstance(GenericAttributes.d); - - if (!this.world.isStatic) { - attributeinstance.setValue((double) this.abilities.b()); - } - - this.aQ = this.bJ; - if (this.isSprinting()) { - this.aQ = (float) ((double) this.aQ + (double) this.bJ * 0.3D); - } - - this.i((float) attributeinstance.getValue()); - float f = MathHelper.sqrt(this.motX * this.motX + this.motZ * this.motZ); - // CraftBukkit - Math -> TrigMath - float f1 = (float) org.bukkit.craftbukkit.TrigMath.atan(-this.motY * 0.20000000298023224D) * 15.0F; - - if (f > 0.1F) { - f = 0.1F; - } - - if (!this.onGround || this.getHealth() <= 0.0F) { - f = 0.0F; - } - - if (this.onGround || this.getHealth() <= 0.0F) { - f1 = 0.0F; - } - - this.bs += (f - this.bs) * 0.4F; - this.aJ += (f1 - this.aJ) * 0.8F; - if (this.getHealth() > 0.0F) { - AxisAlignedBB axisalignedbb = null; - - if (this.vehicle != null && !this.vehicle.dead) { - axisalignedbb = this.boundingBox.a(this.vehicle.boundingBox).grow(1.0D, 0.0D, 1.0D); - } else { - axisalignedbb = this.boundingBox.grow(1.0D, 0.5D, 1.0D); - } - - List list = this.world.getEntities(this, axisalignedbb); - - if (list != null) { - for (int i = 0; i < list.size(); ++i) { - Entity entity = (Entity) list.get(i); - - if (!entity.dead) { - this.d(entity); - } - } - } - } - } - - private void d(Entity entity) { - entity.b_(this); - } - - public int getScore() { - return this.datawatcher.getInt(18); - } - - public void setScore(int i) { - this.datawatcher.watch(18, Integer.valueOf(i)); - } - - public void addScore(int i) { - int j = this.getScore(); - - this.datawatcher.watch(18, Integer.valueOf(j + i)); - } - - public void die(DamageSource damagesource) { - super.die(damagesource); - this.a(0.2F, 0.2F); - this.setPosition(this.locX, this.locY, this.locZ); - this.motY = 0.10000000149011612D; - if (this.getName().equals("Notch")) { - this.a(new ItemStack(Items.APPLE, 1), true, false); - } - - if (!this.world.getGameRules().getBoolean("keepInventory")) { - this.inventory.m(); - } - - if (damagesource != null) { - this.motX = (double) (-MathHelper.cos((this.az + this.yaw) * 3.1415927F / 180.0F) * 0.1F); - this.motZ = (double) (-MathHelper.sin((this.az + this.yaw) * 3.1415927F / 180.0F) * 0.1F); - } else { - this.motX = this.motZ = 0.0D; - } - - this.height = 0.1F; - this.a(StatisticList.v, 1); - } - - protected String aT() { - return "game.player.hurt"; - } - - protected String aU() { - return "game.player.die"; - } - - public void b(Entity entity, int i) { - this.addScore(i); - // CraftBukkit - Get our scores instead - Collection collection = this.world.getServer().getScoreboardManager().getScoreboardScores(IScoreboardCriteria.e, this.getName(), new java.util.ArrayList()); - - if (entity instanceof EntityHuman) { - this.a(StatisticList.y, 1); - // CraftBukkit - Get our scores instead - this.world.getServer().getScoreboardManager().getScoreboardScores(IScoreboardCriteria.d, this.getName(), collection); - } else { - this.a(StatisticList.w, 1); - } - - Iterator iterator = collection.iterator(); - - while (iterator.hasNext()) { - ScoreboardScore scoreboardscore = (ScoreboardScore) iterator.next(); // CraftBukkit - Use our scores instead - - scoreboardscore.incrementScore(); - } - } - - public EntityItem a(boolean flag) { - // Called only when dropped by Q or CTRL-Q - return this.a(this.inventory.splitStack(this.inventory.itemInHandIndex, flag && this.inventory.getItemInHand() != null ? this.inventory.getItemInHand().count : 1), false, true); - } - - public EntityItem drop(ItemStack itemstack, boolean flag) { - return this.a(itemstack, false, false); - } - - public EntityItem a(ItemStack itemstack, boolean flag, boolean flag1) { - if (itemstack == null) { - return null; - } else if (itemstack.count == 0) { - return null; - } else { - EntityItem entityitem = new EntityItem(this.world, this.locX, this.locY - 0.30000001192092896D + (double) this.getHeadHeight(), this.locZ, itemstack); - - entityitem.pickupDelay = 40; - if (flag1) { - entityitem.b(this.getName()); - } - - float f = 0.1F; - float f1; - - if (flag) { - f1 = this.random.nextFloat() * 0.5F; - float f2 = this.random.nextFloat() * 3.1415927F * 2.0F; - - entityitem.motX = (double) (-MathHelper.sin(f2) * f1); - entityitem.motZ = (double) (MathHelper.cos(f2) * f1); - entityitem.motY = 0.20000000298023224D; - } else { - f = 0.3F; - entityitem.motX = (double) (-MathHelper.sin(this.yaw / 180.0F * 3.1415927F) * MathHelper.cos(this.pitch / 180.0F * 3.1415927F) * f); - entityitem.motZ = (double) (MathHelper.cos(this.yaw / 180.0F * 3.1415927F) * MathHelper.cos(this.pitch / 180.0F * 3.1415927F) * f); - entityitem.motY = (double) (-MathHelper.sin(this.pitch / 180.0F * 3.1415927F) * f + 0.1F); - f = 0.02F; - f1 = this.random.nextFloat() * 3.1415927F * 2.0F; - f *= this.random.nextFloat(); - entityitem.motX += Math.cos((double) f1) * (double) f; - entityitem.motY += (double) ((this.random.nextFloat() - this.random.nextFloat()) * 0.1F); - entityitem.motZ += Math.sin((double) f1) * (double) f; - } - - // CraftBukkit start - fire PlayerDropItemEvent - Player player = (Player) this.getBukkitEntity(); - CraftItem drop = new CraftItem(this.world.getServer(), entityitem); - - PlayerDropItemEvent event = new PlayerDropItemEvent(player, drop); - this.world.getServer().getPluginManager().callEvent(event); - - if (event.isCancelled()) { - org.bukkit.inventory.ItemStack cur = player.getInventory().getItemInHand(); - if (flag1 && (cur == null || cur.getAmount() == 0)) { - // The complete stack was dropped - player.getInventory().setItemInHand(drop.getItemStack()); - } else if (flag1 && cur.isSimilar(drop.getItemStack()) && drop.getItemStack().getAmount() == 1) { - // Only one item is dropped - cur.setAmount(cur.getAmount() + 1); - player.getInventory().setItemInHand(cur); - } else { - // Fallback - player.getInventory().addItem(drop.getItemStack()); - } - return null; - } - // CraftBukkit end - - this.a(entityitem); - this.a(StatisticList.s, 1); - return entityitem; - } - } - - protected void a(EntityItem entityitem) { - this.world.addEntity(entityitem); - } - - public float a(Block block, boolean flag) { - float f = this.inventory.a(block); - - if (f > 1.0F) { - int i = EnchantmentManager.getDigSpeedEnchantmentLevel(this); - ItemStack itemstack = this.inventory.getItemInHand(); - - 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)) { - f *= 1.0F + (float) (this.getEffect(MobEffectList.FASTER_DIG).getAmplifier() + 1) * 0.2F; - } - - if (this.hasEffect(MobEffectList.SLOWER_DIG)) { - f *= 1.0F - (float) (this.getEffect(MobEffectList.SLOWER_DIG).getAmplifier() + 1) * 0.2F; - } - - if (this.a(Material.WATER) && !EnchantmentManager.hasWaterWorkerEnchantment(this)) { - f /= 5.0F; - } - - if (!this.onGround) { - f /= 5.0F; - } - - return f; - } - - public boolean a(Block block) { - return this.inventory.b(block); - } - - public void a(NBTTagCompound nbttagcompound) { - super.a(nbttagcompound); - this.uniqueID = a(this.i); - NBTTagList nbttaglist = nbttagcompound.getList("Inventory", 10); - - 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"); - this.expLevel = nbttagcompound.getInt("XpLevel"); - this.expTotal = nbttagcompound.getInt("XpTotal"); - this.setScore(nbttagcompound.getInt("Score")); - if (this.sleeping) { - this.bB = new ChunkCoordinates(MathHelper.floor(this.locX), MathHelper.floor(this.locY), MathHelper.floor(this.locZ)); - this.a(true, true, false); - } - - // CraftBukkit start - this.spawnWorld = nbttagcompound.getString("SpawnWorld"); - if ("".equals(spawnWorld)) { - this.spawnWorld = this.world.getServer().getWorlds().get(0).getName(); - } - // CraftBukkit end - - if (nbttagcompound.hasKeyOfType("SpawnX", 99) && nbttagcompound.hasKeyOfType("SpawnY", 99) && nbttagcompound.hasKeyOfType("SpawnZ", 99)) { - this.c = new ChunkCoordinates(nbttagcompound.getInt("SpawnX"), nbttagcompound.getInt("SpawnY"), nbttagcompound.getInt("SpawnZ")); - this.d = nbttagcompound.getBoolean("SpawnForced"); - } - - this.foodData.a(nbttagcompound); - this.abilities.b(nbttagcompound); - if (nbttagcompound.hasKeyOfType("EnderItems", 9)) { - NBTTagList nbttaglist1 = nbttagcompound.getList("EnderItems", 10); - - this.enderChest.a(nbttaglist1); - } - } - - 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); - nbttagcompound.setInt("XpLevel", this.expLevel); - nbttagcompound.setInt("XpTotal", this.expTotal); - nbttagcompound.setInt("Score", this.getScore()); - if (this.c != null) { - nbttagcompound.setInt("SpawnX", this.c.x); - nbttagcompound.setInt("SpawnY", this.c.y); - nbttagcompound.setInt("SpawnZ", this.c.z); - nbttagcompound.setBoolean("SpawnForced", this.d); - nbttagcompound.setString("SpawnWorld", spawnWorld); // CraftBukkit - fixes bed spawns for multiworld worlds - } - - this.foodData.b(nbttagcompound); - this.abilities.a(nbttagcompound); - nbttagcompound.set("EnderItems", this.enderChest.h()); - } - - public void openContainer(IInventory iinventory) {} - - public void openHopper(TileEntityHopper tileentityhopper) {} - - public void openMinecartHopper(EntityMinecartHopper entityminecarthopper) {} - - public void openHorseInventory(EntityHorse entityhorse, IInventory iinventory) {} - - public void startEnchanting(int i, int j, int k, String s) {} - - public void openAnvil(int i, int j, int k) {} - - public void startCrafting(int i, int j, int k) {} - - public float getHeadHeight() { - return 0.12F; - } - - protected void e_() { - this.height = 1.62F; - } - - public boolean damageEntity(DamageSource damagesource, float f) { - if (this.isInvulnerable()) { - return false; - } else if (this.abilities.isInvulnerable && !damagesource.ignoresInvulnerability()) { - return false; - } else { - this.aU = 0; - if (this.getHealth() <= 0.0F) { - return false; - } else { - if (this.isSleeping() && !this.world.isStatic) { - this.a(true, true, false); - } - - if (damagesource.r()) { - if (this.world.difficulty == EnumDifficulty.PEACEFUL) { - return false; // CraftBukkit - f = 0.0f -> return false - } - - if (this.world.difficulty == EnumDifficulty.EASY) { - f = f / 2.0F + 1.0F; - } - - if (this.world.difficulty == EnumDifficulty.HARD) { - f = f * 3.0F / 2.0F; - } - } - - if (false && f == 0.0F) { // CraftBukkit - Don't filter out 0 damage - return false; - } else { - Entity entity = damagesource.getEntity(); - - if (entity instanceof EntityArrow && ((EntityArrow) entity).shooter != null) { - entity = ((EntityArrow) entity).shooter; - } - - this.a(StatisticList.u, Math.round(f * 10.0F)); - return super.damageEntity(damagesource, f); - } - } - } - } - - public boolean a(EntityHuman entityhuman) { - // CraftBukkit start - Change to check OTHER player's scoreboard team according to API - // To summarize this method's logic, it's "Can parameter hurt this" - org.bukkit.scoreboard.Team team; - if (entityhuman instanceof EntityPlayer) { - EntityPlayer thatPlayer = (EntityPlayer) entityhuman; - team = thatPlayer.getBukkitEntity().getScoreboard().getPlayerTeam(thatPlayer.getBukkitEntity()); - if (team == null || team.allowFriendlyFire()) { - return true; - } - } else { - // This should never be called, but is implemented anyway - org.bukkit.OfflinePlayer thisPlayer = entityhuman.world.getServer().getOfflinePlayer(entityhuman.getName()); - team = entityhuman.world.getServer().getScoreboardManager().getMainScoreboard().getPlayerTeam(thisPlayer); - if (team == null || team.allowFriendlyFire()) { - return true; - } - } - - if (this instanceof EntityPlayer) { - return !team.hasPlayer(((EntityPlayer) this).getBukkitEntity()); - } - return !team.hasPlayer(this.world.getServer().getOfflinePlayer(this.getName())); - // CraftBukkit end - } - - protected void damageArmor(float f) { - this.inventory.a(f); - } - - public int aV() { - return this.inventory.l(); - } - - public float bE() { - int i = 0; - ItemStack[] aitemstack = this.inventory.armor; - int j = aitemstack.length; - - for (int k = 0; k < j; ++k) { - ItemStack itemstack = aitemstack[k]; - - if (itemstack != null) { - ++i; - } - } - - return (float) i / (float) this.inventory.armor.length; - } - - // CraftBukkit start - protected boolean d(DamageSource damagesource, float f) { // void -> boolean - if (true) { - return super.d(damagesource, f); - } - // CraftBukkit end - if (!this.isInvulnerable()) { - if (!damagesource.ignoresArmor() && this.isBlocking() && f > 0.0F) { - f = (1.0F + f) * 0.5F; - } - - f = this.applyArmorModifier(damagesource, f); - f = this.applyMagicModifier(damagesource, f); - float f1 = f; - - f = Math.max(f - this.getAbsorptionHearts(), 0.0F); - this.setAbsorptionHearts(this.getAbsorptionHearts() - (f1 - f)); - if (f != 0.0F) { - this.applyExhaustion(damagesource.getExhaustionCost()); - float f2 = this.getHealth(); - - this.setHealth(this.getHealth() - f); - this.aW().a(damagesource, f2, f); - } - } - return false; // CraftBukkit - } - - public void openFurnace(TileEntityFurnace tileentityfurnace) {} - - public void openDispenser(TileEntityDispenser tileentitydispenser) {} - - public void a(TileEntity tileentity) {} - - public void a(CommandBlockListenerAbstract commandblocklistenerabstract) {} - - public void openBrewingStand(TileEntityBrewingStand tileentitybrewingstand) {} - - public void openBeacon(TileEntityBeacon tileentitybeacon) {} - - public void openTrade(IMerchant imerchant, String s) {} - - public void b(ItemStack itemstack) {} - - public boolean q(Entity entity) { - ItemStack itemstack = this.bF(); - ItemStack itemstack1 = itemstack != null ? itemstack.cloneItemStack() : null; - - if (!entity.c(this)) { - if (itemstack != null && entity instanceof EntityLiving) { - if (this.abilities.canInstantlyBuild) { - itemstack = itemstack1; - } - - if (itemstack.a(this, (EntityLiving) entity)) { - // CraftBukkit - bypass infinite items; <= 0 -> == 0 - if (itemstack.count == 0 && !this.abilities.canInstantlyBuild) { - this.bG(); - } - - return true; - } - } - - return false; - } else { - if (itemstack != null && itemstack == this.bF()) { - if (itemstack.count <= 0 && !this.abilities.canInstantlyBuild) { - this.bG(); - } else if (itemstack.count < itemstack1.count && this.abilities.canInstantlyBuild) { - itemstack.count = itemstack1.count; - } - } - - return true; - } - } - - public ItemStack bF() { - return this.inventory.getItemInHand(); - } - - public void bG() { - this.inventory.setItem(this.inventory.itemInHandIndex, (ItemStack) null); - } - - public double ad() { - return (double) (this.height - 0.5F); - } - - public void attack(Entity entity) { - if (entity.av()) { - if (!entity.j(this)) { - float f = (float) this.getAttributeInstance(GenericAttributes.e).getValue(); - int i = 0; - float f1 = 0.0F; - - if (entity instanceof EntityLiving) { - f1 = EnchantmentManager.a((EntityLiving) this, (EntityLiving) entity); - i += EnchantmentManager.getKnockbackEnchantmentLevel(this, (EntityLiving) entity); - } - - if (this.isSprinting()) { - ++i; - } - - if (f > 0.0F || f1 > 0.0F) { - boolean flag = this.fallDistance > 0.0F && !this.onGround && !this.h_() && !this.M() && !this.hasEffect(MobEffectList.BLINDNESS) && this.vehicle == null && entity instanceof EntityLiving; - - if (flag && f > 0.0F) { - f *= 1.5F; - } - - f += f1; - boolean flag1 = false; - int j = EnchantmentManager.getFireAspectEnchantmentLevel(this); - - if (entity instanceof EntityLiving && j > 0 && !entity.isBurning()) { - // CraftBukkit start - Call a combust event when somebody hits with a fire enchanted item - EntityCombustByEntityEvent combustEvent = new EntityCombustByEntityEvent(this.getBukkitEntity(), entity.getBukkitEntity(), 1); - org.bukkit.Bukkit.getPluginManager().callEvent(combustEvent); - - if (!combustEvent.isCancelled()) { - flag1 = true; - entity.setOnFire(combustEvent.getDuration()); - } - // CraftBukkit end - } - - boolean flag2 = entity.damageEntity(DamageSource.playerAttack(this), f); - - if (flag2) { - if (i > 0) { - entity.g((double) (-MathHelper.sin(this.yaw * 3.1415927F / 180.0F) * (float) i * 0.5F), 0.1D, (double) (MathHelper.cos(this.yaw * 3.1415927F / 180.0F) * (float) i * 0.5F)); - this.motX *= 0.6D; - this.motZ *= 0.6D; - this.setSprinting(false); - } - - if (flag) { - this.b(entity); - } - - if (f1 > 0.0F) { - this.c(entity); - } - - if (f >= 18.0F) { - this.a((Statistic) AchievementList.F); - } - - this.l(entity); - if (entity instanceof EntityLiving) { - EnchantmentManager.a((EntityLiving) entity, (Entity) this); - } - - EnchantmentManager.b(this, entity); - ItemStack itemstack = this.bF(); - Object object = entity; - - if (entity instanceof EntityComplexPart) { - IComplex icomplex = ((EntityComplexPart) entity).owner; - - if (icomplex != null && icomplex instanceof EntityLiving) { - object = (EntityLiving) icomplex; - } - } - - if (itemstack != null && object instanceof EntityLiving) { - itemstack.a((EntityLiving) object, this); - // CraftBukkit - bypass infinite items; <= 0 -> == 0 - if (itemstack.count == 0) { - this.bG(); - } - } - - if (entity instanceof EntityLiving) { - this.a(StatisticList.t, Math.round(f * 10.0F)); - if (j > 0) { - // CraftBukkit start - Call a combust event when somebody hits with a fire enchanted item - EntityCombustByEntityEvent combustEvent = new EntityCombustByEntityEvent(this.getBukkitEntity(), entity.getBukkitEntity(), j * 4); - org.bukkit.Bukkit.getPluginManager().callEvent(combustEvent); - - if (!combustEvent.isCancelled()) { - entity.setOnFire(combustEvent.getDuration()); - } - // CraftBukkit end - } - } - - this.applyExhaustion(0.3F); - } else if (flag1) { - entity.extinguish(); - } - } - } - } - } - - public void b(Entity entity) {} - - public void c(Entity entity) {} - - public void die() { - super.die(); - this.defaultContainer.b(this); - if (this.activeContainer != null) { - this.activeContainer.b(this); - } - } - - public boolean inBlock() { - return !this.sleeping && super.inBlock(); - } - - public GameProfile getProfile() { - return this.i; - } - - public EnumBedResult a(int i, int j, int k) { - if (!this.world.isStatic) { - if (this.isSleeping() || !this.isAlive()) { - return EnumBedResult.OTHER_PROBLEM; - } - - if (!this.world.worldProvider.d()) { - return EnumBedResult.NOT_POSSIBLE_HERE; - } - - if (this.world.w()) { - return EnumBedResult.NOT_POSSIBLE_NOW; - } - - if (Math.abs(this.locX - (double) i) > 3.0D || Math.abs(this.locY - (double) j) > 2.0D || Math.abs(this.locZ - (double) k) > 3.0D) { - return EnumBedResult.TOO_FAR_AWAY; - } - - double d0 = 8.0D; - double d1 = 5.0D; - List list = this.world.a(EntityMonster.class, AxisAlignedBB.a((double) i - d0, (double) j - d1, (double) k - d0, (double) i + d0, (double) j + d1, (double) k + d0)); - - if (!list.isEmpty()) { - return EnumBedResult.NOT_SAFE; - } - } - - if (this.am()) { - this.mount((Entity) null); - } - - // CraftBukkit start - fire PlayerBedEnterEvent - if (this.getBukkitEntity() instanceof Player) { - Player player = (Player) this.getBukkitEntity(); - org.bukkit.block.Block bed = this.world.getWorld().getBlockAt(i, j, k); - - PlayerBedEnterEvent event = new PlayerBedEnterEvent(player, bed); - this.world.getServer().getPluginManager().callEvent(event); - - if (event.isCancelled()) { - return EnumBedResult.OTHER_PROBLEM; - } - } - // CraftBukkit end - - this.a(0.2F, 0.2F); - this.height = 0.2F; - if (this.world.isLoaded(i, j, k)) { - int l = this.world.getData(i, j, k); - int i1 = BlockBed.l(l); - float f = 0.5F; - float f1 = 0.5F; - - switch (i1) { - case 0: - f1 = 0.9F; - break; - - case 1: - f = 0.1F; - break; - - case 2: - f1 = 0.1F; - break; - - case 3: - f = 0.9F; - } - - this.w(i1); - this.setPosition((double) ((float) i + f), (double) ((float) j + 0.9375F), (double) ((float) k + f1)); - } else { - this.setPosition((double) ((float) i + 0.5F), (double) ((float) j + 0.9375F), (double) ((float) k + 0.5F)); - } - - this.sleeping = true; - this.sleepTicks = 0; - this.bB = new ChunkCoordinates(i, j, k); - this.motX = this.motZ = this.motY = 0.0D; - if (!this.world.isStatic) { - this.world.everyoneSleeping(); - } - - return EnumBedResult.OK; - } - - private void w(int i) { - this.bC = 0.0F; - this.bD = 0.0F; - switch (i) { - case 0: - this.bD = -1.8F; - break; - - case 1: - this.bC = 1.8F; - break; - - case 2: - this.bD = 1.8F; - break; - - case 3: - this.bC = -1.8F; - } - } - - public void a(boolean flag, boolean flag1, boolean flag2) { - this.a(0.6F, 1.8F); - this.e_(); - ChunkCoordinates chunkcoordinates = this.bB; - ChunkCoordinates chunkcoordinates1 = this.bB; - - if (chunkcoordinates != null && this.world.getType(chunkcoordinates.x, chunkcoordinates.y, chunkcoordinates.z) == Blocks.BED) { - BlockBed.a(this.world, chunkcoordinates.x, chunkcoordinates.y, chunkcoordinates.z, false); - chunkcoordinates1 = BlockBed.a(this.world, chunkcoordinates.x, chunkcoordinates.y, chunkcoordinates.z, 0); - if (chunkcoordinates1 == null) { - chunkcoordinates1 = new ChunkCoordinates(chunkcoordinates.x, chunkcoordinates.y + 1, chunkcoordinates.z); - } - - this.setPosition((double) ((float) chunkcoordinates1.x + 0.5F), (double) ((float) chunkcoordinates1.y + this.height + 0.1F), (double) ((float) chunkcoordinates1.z + 0.5F)); - } - - this.sleeping = false; - if (!this.world.isStatic && flag1) { - this.world.everyoneSleeping(); - } - - // CraftBukkit start - fire PlayerBedLeaveEvent - if (this.getBukkitEntity() instanceof Player) { - Player player = (Player) this.getBukkitEntity(); - - org.bukkit.block.Block bed; - if (chunkcoordinates != null) { - bed = this.world.getWorld().getBlockAt(chunkcoordinates.x, chunkcoordinates.y, chunkcoordinates.z); - } else { - bed = this.world.getWorld().getBlockAt(player.getLocation()); - } - - PlayerBedLeaveEvent event = new PlayerBedLeaveEvent(player, bed); - this.world.getServer().getPluginManager().callEvent(event); - } - // CraftBukkit end - - if (flag) { - this.sleepTicks = 0; - } else { - this.sleepTicks = 100; - } - - if (flag2) { - this.setRespawnPosition(this.bB, false); - } - } - - private boolean j() { - return this.world.getType(this.bB.x, this.bB.y, this.bB.z) == Blocks.BED; - } - - public static ChunkCoordinates getBed(World world, ChunkCoordinates chunkcoordinates, boolean flag) { - IChunkProvider ichunkprovider = world.L(); - - ichunkprovider.getChunkAt(chunkcoordinates.x - 3 >> 4, chunkcoordinates.z - 3 >> 4); - ichunkprovider.getChunkAt(chunkcoordinates.x + 3 >> 4, chunkcoordinates.z - 3 >> 4); - ichunkprovider.getChunkAt(chunkcoordinates.x - 3 >> 4, chunkcoordinates.z + 3 >> 4); - ichunkprovider.getChunkAt(chunkcoordinates.x + 3 >> 4, chunkcoordinates.z + 3 >> 4); - if (world.getType(chunkcoordinates.x, chunkcoordinates.y, chunkcoordinates.z) == Blocks.BED) { - ChunkCoordinates chunkcoordinates1 = BlockBed.a(world, chunkcoordinates.x, chunkcoordinates.y, chunkcoordinates.z, 0); - - return chunkcoordinates1; - } else { - Material material = world.getType(chunkcoordinates.x, chunkcoordinates.y, chunkcoordinates.z).getMaterial(); - Material material1 = world.getType(chunkcoordinates.x, chunkcoordinates.y + 1, chunkcoordinates.z).getMaterial(); - boolean flag1 = !material.isBuildable() && !material.isLiquid(); - boolean flag2 = !material1.isBuildable() && !material1.isLiquid(); - - return flag && flag1 && flag2 ? chunkcoordinates : null; - } - } - - public boolean isSleeping() { - return this.sleeping; - } - - public boolean isDeeplySleeping() { - return this.sleeping && this.sleepTicks >= 100; - } - - protected void b(int i, boolean flag) { - byte b0 = this.datawatcher.getByte(16); - - if (flag) { - this.datawatcher.watch(16, Byte.valueOf((byte) (b0 | 1 << i))); - } else { - this.datawatcher.watch(16, Byte.valueOf((byte) (b0 & ~(1 << i)))); - } - } - - public void b(IChatBaseComponent ichatbasecomponent) {} - - public ChunkCoordinates getBed() { - return this.c; - } - - public boolean isRespawnForced() { - return this.d; - } - - public void setRespawnPosition(ChunkCoordinates chunkcoordinates, boolean flag) { - if (chunkcoordinates != null) { - this.c = new ChunkCoordinates(chunkcoordinates); - this.d = flag; - this.spawnWorld = this.world.worldData.getName(); // CraftBukkit - } else { - this.c = null; - this.d = false; - this.spawnWorld = ""; // CraftBukkit - } - } - - public void a(Statistic statistic) { - this.a(statistic, 1); - } - - public void a(Statistic statistic, int i) {} - - public void bj() { - super.bj(); - this.a(StatisticList.r, 1); - if (this.isSprinting()) { - this.applyExhaustion(0.8F); - } else { - this.applyExhaustion(0.2F); - } - } - - public void e(float f, float f1) { - double d0 = this.locX; - double d1 = this.locY; - double d2 = this.locZ; - - if (this.abilities.isFlying && this.vehicle == null) { - double d3 = this.motY; - float f2 = this.aQ; - - this.aQ = this.abilities.a(); - super.e(f, f1); - this.motY = d3 * 0.6D; - this.aQ = f2; - } else { - super.e(f, f1); - } - - this.checkMovement(this.locX - d0, this.locY - d1, this.locZ - d2); - } - - public float bl() { - return (float) this.getAttributeInstance(GenericAttributes.d).getValue(); - } - - public void checkMovement(double d0, double d1, double d2) { - if (this.vehicle == null) { - int i; - - if (this.a(Material.WATER)) { - i = Math.round(MathHelper.sqrt(d0 * d0 + d1 * d1 + d2 * d2) * 100.0F); - if (i > 0) { - this.a(StatisticList.m, i); - this.applyExhaustion(0.015F * (float) i * 0.01F); - } - } else if (this.M()) { - i = Math.round(MathHelper.sqrt(d0 * d0 + d2 * d2) * 100.0F); - if (i > 0) { - this.a(StatisticList.i, i); - this.applyExhaustion(0.015F * (float) i * 0.01F); - } - } else if (this.h_()) { - if (d1 > 0.0D) { - this.a(StatisticList.k, (int) Math.round(d1 * 100.0D)); - } - } else if (this.onGround) { - i = Math.round(MathHelper.sqrt(d0 * d0 + d2 * d2) * 100.0F); - if (i > 0) { - this.a(StatisticList.h, i); - if (this.isSprinting()) { - this.applyExhaustion(0.099999994F * (float) i * 0.01F); - } else { - this.applyExhaustion(0.01F * (float) i * 0.01F); - } - } - } else { - i = Math.round(MathHelper.sqrt(d0 * d0 + d2 * d2) * 100.0F); - if (i > 25) { - this.a(StatisticList.l, i); - } - } - } - } - - private void l(double d0, double d1, double d2) { - if (this.vehicle != null) { - int i = Math.round(MathHelper.sqrt(d0 * d0 + d1 * d1 + d2 * d2) * 100.0F); - - if (i > 0) { - if (this.vehicle instanceof EntityMinecartAbstract) { - this.a(StatisticList.n, i); - if (this.e == null) { - this.e = new ChunkCoordinates(MathHelper.floor(this.locX), MathHelper.floor(this.locY), MathHelper.floor(this.locZ)); - } else if ((double) this.e.e(MathHelper.floor(this.locX), MathHelper.floor(this.locY), MathHelper.floor(this.locZ)) >= 1000000.0D) { - this.a((Statistic) AchievementList.q, 1); - } - } else if (this.vehicle instanceof EntityBoat) { - this.a(StatisticList.o, i); - } else if (this.vehicle instanceof EntityPig) { - this.a(StatisticList.p, i); - } else if (this.vehicle instanceof EntityHorse) { - this.a(StatisticList.q, i); - } - } - } - } - - protected void b(float f) { - if (!this.abilities.canFly) { - if (f >= 2.0F) { - this.a(StatisticList.j, (int) Math.round((double) f * 100.0D)); - } - - super.b(f); - } - } - - protected String o(int i) { - return i > 4 ? "game.player.hurt.fall.big" : "game.player.hurt.fall.small"; - } - - public void a(EntityLiving entityliving) { - if (entityliving instanceof IMonster) { - this.a((Statistic) AchievementList.s); - } - - int i = EntityTypes.a(entityliving); - MonsterEggInfo monsteregginfo = (MonsterEggInfo) EntityTypes.eggInfo.get(Integer.valueOf(i)); - - if (monsteregginfo != null) { - this.a(monsteregginfo.killEntityStatistic, 1); - } - } - - public void as() { - if (!this.abilities.isFlying) { - super.as(); - } - } - - public ItemStack r(int i) { - return this.inventory.d(i); - } - - public void giveExp(int i) { - this.addScore(i); - int j = Integer.MAX_VALUE - this.expTotal; - - if (i > j) { - i = j; - } - - this.exp += (float) i / (float) this.getExpToLevel(); - - for (this.expTotal += i; this.exp >= 1.0F; this.exp /= (float) this.getExpToLevel()) { - this.exp = (this.exp - 1.0F) * (float) this.getExpToLevel(); - this.levelDown(1); - } - } - - public void levelDown(int i) { - 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.world.makeSound(this, "random.levelup", f * 0.75F, 1.0F); - this.h = this.ticksLived; - } - } - - public int getExpToLevel() { - return this.expLevel >= 30 ? 62 + (this.expLevel - 30) * 7 : (this.expLevel >= 15 ? 17 + (this.expLevel - 15) * 3 : 17); - } - - public void applyExhaustion(float f) { - if (!this.abilities.isInvulnerable) { - if (!this.world.isStatic) { - this.foodData.a(f); - } - } - } - - public FoodMetaData getFoodData() { - return this.foodData; - } - - public boolean g(boolean flag) { - return (flag || this.foodData.c()) && !this.abilities.isInvulnerable; - } - - public boolean bR() { - return this.getHealth() > 0.0F && this.getHealth() < this.getMaxHealth(); - } - - public void a(ItemStack itemstack, int i) { - if (itemstack != this.f) { - this.f = itemstack; - this.g = i; - if (!this.world.isStatic) { - this.e(true); - } - } - } - - public boolean d(int i, int j, int k) { - if (this.abilities.mayBuild) { - return true; - } else { - Block block = this.world.getType(i, j, k); - - if (block.getMaterial() != Material.AIR) { - if (block.getMaterial().q()) { - return true; - } - - if (this.bF() != null) { - ItemStack itemstack = this.bF(); - - if (itemstack.b(block) || itemstack.a(block) > 1.0F) { - return true; - } - } - } - - return false; - } - } - - public boolean a(int i, int j, int k, int l, ItemStack itemstack) { - return this.abilities.mayBuild ? true : (itemstack != null ? itemstack.z() : false); - } - - protected int getExpValue(EntityHuman entityhuman) { - if (this.world.getGameRules().getBoolean("keepInventory")) { - return 0; - } else { - int i = this.expLevel * 7; - - return i > 100 ? 100 : i; - } - } - - protected boolean alwaysGivesExp() { - return true; - } - - public void copyTo(EntityHuman entityhuman, boolean flag) { - if (flag) { - this.inventory.b(entityhuman.inventory); - this.setHealth(entityhuman.getHealth()); - this.foodData = entityhuman.foodData; - this.expLevel = entityhuman.expLevel; - this.expTotal = entityhuman.expTotal; - this.exp = entityhuman.exp; - this.setScore(entityhuman.getScore()); - this.aq = entityhuman.aq; - } else if (this.world.getGameRules().getBoolean("keepInventory")) { - this.inventory.b(entityhuman.inventory); - this.expLevel = entityhuman.expLevel; - this.expTotal = entityhuman.expTotal; - this.exp = entityhuman.exp; - this.setScore(entityhuman.getScore()); - } - - this.enderChest = entityhuman.enderChest; - } - - protected boolean g_() { - return !this.abilities.isFlying; - } - - public void updateAbilities() {} - - public void a(EnumGamemode enumgamemode) {} - - public String getName() { - return this.i.getName(); - } - - public World getWorld() { - return this.world; - } - - public InventoryEnderChest getEnderChest() { - return this.enderChest; - } - - public ItemStack getEquipment(int i) { - return i == 0 ? this.inventory.getItemInHand() : this.inventory.armor[i - 1]; - } - - public ItemStack be() { - return this.inventory.getItemInHand(); - } - - public void setEquipment(int i, ItemStack itemstack) { - this.inventory.armor[i] = itemstack; - } - - public ItemStack[] getEquipment() { - return this.inventory.armor; - } - - public boolean aC() { - return !this.abilities.isFlying; - } - - public Scoreboard getScoreboard() { - return this.world.getScoreboard(); - } - - public ScoreboardTeamBase getScoreboardTeam() { - return this.getScoreboard().getPlayerTeam(this.getName()); - } - - public IChatBaseComponent getScoreboardDisplayName() { - // CraftBukkit - todo: fun - ChatComponentText chatcomponenttext = new ChatComponentText(ScoreboardTeam.getPlayerDisplayName(this.getScoreboardTeam(), this.getName())); - - chatcomponenttext.getChatModifier().setChatClickable(new ChatClickable(EnumClickAction.SUGGEST_COMMAND, "/msg " + this.getName() + " ")); - return chatcomponenttext; - } - - public void setAbsorptionHearts(float f) { - if (f < 0.0F) { - f = 0.0F; - } - - this.getDataWatcher().watch(17, Float.valueOf(f)); - } - - public float getAbsorptionHearts() { - return this.getDataWatcher().getFloat(17); - } - - public static UUID a(GameProfile gameprofile) { - UUID uuid = gameprofile.getId(); - - if (uuid == null) { - uuid = UUID.nameUUIDFromBytes(("OfflinePlayer:" + gameprofile.getName()).getBytes(Charsets.UTF_8)); - } - - return uuid; - } -} diff --git a/src/main/java/net/minecraft/server/EntityInsentient.java b/src/main/java/net/minecraft/server/EntityInsentient.java deleted file mode 100644 index a812656f92..0000000000 --- a/src/main/java/net/minecraft/server/EntityInsentient.java +++ /dev/null @@ -1,892 +0,0 @@ -package net.minecraft.server; - -import java.util.Iterator; -import java.util.List; -import java.util.UUID; - -// CraftBukkit start -import org.bukkit.craftbukkit.event.CraftEventFactory; -import org.bukkit.event.entity.EntityUnleashEvent; -import org.bukkit.event.entity.EntityUnleashEvent.UnleashReason; -// CraftBukkit end - -public abstract class EntityInsentient extends EntityLiving { - - public int a_; - protected int b; - private ControllerLook lookController; - private ControllerMove moveController; - private ControllerJump bm; - private EntityAIBodyControl bn; - private Navigation navigation; - protected final PathfinderGoalSelector goalSelector; - protected final PathfinderGoalSelector targetSelector; - private EntityLiving goalTarget; - private EntitySenses bq; - private ItemStack[] equipment = new ItemStack[5]; - public float[] dropChances = new float[5]; // CraftBukkit - protected -> public - public boolean canPickUpLoot; // CraftBukkit - private -> public - public boolean persistent = !isTypeNotPersistent(); // CraftBukkit - private -> public - protected float f; - private Entity bu; - protected int g; - private boolean bv; - private Entity bw; - private NBTTagCompound bx; - - public EntityInsentient(World world) { - super(world); - this.goalSelector = new PathfinderGoalSelector(world != null && world.methodProfiler != null ? world.methodProfiler : null); - this.targetSelector = new PathfinderGoalSelector(world != null && world.methodProfiler != null ? world.methodProfiler : null); - this.lookController = new ControllerLook(this); - this.moveController = new ControllerMove(this); - this.bm = new ControllerJump(this); - this.bn = new EntityAIBodyControl(this); - this.navigation = new Navigation(this, world); - this.bq = new EntitySenses(this); - - for (int i = 0; i < this.dropChances.length; ++i) { - this.dropChances[i] = 0.085F; - } - } - - protected void aD() { - super.aD(); - this.getAttributeMap().b(GenericAttributes.b).setValue(16.0D); - } - - public ControllerLook getControllerLook() { - return this.lookController; - } - - public ControllerMove getControllerMove() { - return this.moveController; - } - - public ControllerJump getControllerJump() { - return this.bm; - } - - public Navigation getNavigation() { - return this.navigation; - } - - public EntitySenses getEntitySenses() { - return this.bq; - } - - public EntityLiving getGoalTarget() { - return this.goalTarget; - } - - public void setGoalTarget(EntityLiving entityliving) { - this.goalTarget = entityliving; - } - - public boolean a(Class oclass) { - return EntityCreeper.class != oclass && EntityGhast.class != oclass; - } - - public void p() {} - - protected void c() { - super.c(); - this.datawatcher.a(11, Byte.valueOf((byte) 0)); - this.datawatcher.a(10, ""); - } - - public int q() { - return 80; - } - - public void r() { - String s = this.t(); - - if (s != null) { - this.makeSound(s, this.bf(), this.bg()); - } - } - - public void C() { - super.C(); - this.world.methodProfiler.a("mobBaseTick"); - if (this.isAlive() && this.random.nextInt(1000) < this.a_++) { - this.a_ = -this.q(); - this.r(); - } - - this.world.methodProfiler.b(); - } - - protected int getExpValue(EntityHuman entityhuman) { - if (this.b > 0) { - int i = this.b; - 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.b; - } - } - - public void s() { - for (int i = 0; i < 20; ++i) { - double d0 = this.random.nextGaussian() * 0.02D; - double d1 = this.random.nextGaussian() * 0.02D; - double d2 = this.random.nextGaussian() * 0.02D; - double d3 = 10.0D; - - this.world.addParticle("explode", this.locX + (double) (this.random.nextFloat() * this.width * 2.0F) - (double) this.width - d0 * d3, this.locY + (double) (this.random.nextFloat() * this.length) - d1 * d3, this.locZ + (double) (this.random.nextFloat() * this.width * 2.0F) - (double) this.width - d2 * d3, d0, d1, d2); - } - } - - public void h() { - super.h(); - if (!this.world.isStatic) { - this.bL(); - } - } - - protected float f(float f, float f1) { - if (this.bk()) { - this.bn.a(); - return f1; - } else { - return super.f(f, f1); - } - } - - protected String t() { - return null; - } - - protected Item getLoot() { - return Item.getById(0); - } - - protected void dropDeathLoot(boolean flag, int i) { - Item item = this.getLoot(); - - if (item != null) { - int j = this.random.nextInt(3); - - if (i > 0) { - j += this.random.nextInt(i + 1); - } - - for (int k = 0; k < j; ++k) { - this.a(item, 1); - } - } - } - - public void b(NBTTagCompound nbttagcompound) { - super.b(nbttagcompound); - nbttagcompound.setBoolean("CanPickUpLoot", this.bJ()); - nbttagcompound.setBoolean("PersistenceRequired", this.persistent); - NBTTagList nbttaglist = new NBTTagList(); - - NBTTagCompound nbttagcompound1; - - for (int i = 0; i < this.equipment.length; ++i) { - nbttagcompound1 = new NBTTagCompound(); - if (this.equipment[i] != null) { - this.equipment[i].save(nbttagcompound1); - } - - nbttaglist.add(nbttagcompound1); - } - - nbttagcompound.set("Equipment", nbttaglist); - NBTTagList nbttaglist1 = new NBTTagList(); - - for (int j = 0; j < this.dropChances.length; ++j) { - nbttaglist1.add(new NBTTagFloat(this.dropChances[j])); - } - - nbttagcompound.set("DropChances", nbttaglist1); - nbttagcompound.setString("CustomName", this.getCustomName()); - nbttagcompound.setBoolean("CustomNameVisible", this.getCustomNameVisible()); - nbttagcompound.setBoolean("Leashed", this.bv); - if (this.bw != null) { - nbttagcompound1 = new NBTTagCompound(); - if (this.bw instanceof EntityLiving) { - nbttagcompound1.setLong("UUIDMost", this.bw.getUniqueID().getMostSignificantBits()); - nbttagcompound1.setLong("UUIDLeast", this.bw.getUniqueID().getLeastSignificantBits()); - } else if (this.bw instanceof EntityHanging) { - EntityHanging entityhanging = (EntityHanging) this.bw; - - nbttagcompound1.setInt("X", entityhanging.x); - nbttagcompound1.setInt("Y", entityhanging.y); - nbttagcompound1.setInt("Z", entityhanging.z); - } - - nbttagcompound.set("Leash", nbttagcompound1); - } - } - - public void a(NBTTagCompound nbttagcompound) { - super.a(nbttagcompound); - - // CraftBukkit start - If looting or persistence is false only use it if it was set after we started using it - boolean data = nbttagcompound.getBoolean("CanPickUpLoot"); - if (isLevelAtLeast(nbttagcompound, 1) || data) { - this.canPickUpLoot = data; - } - - data = nbttagcompound.getBoolean("PersistenceRequired"); - if (isLevelAtLeast(nbttagcompound, 1) || data) { - this.persistent = data; - } - // CraftBukkit end - - if (nbttagcompound.hasKeyOfType("CustomName", 8) && nbttagcompound.getString("CustomName").length() > 0) { - this.setCustomName(nbttagcompound.getString("CustomName")); - } - - this.setCustomNameVisible(nbttagcompound.getBoolean("CustomNameVisible")); - NBTTagList nbttaglist; - int i; - - if (nbttagcompound.hasKeyOfType("Equipment", 9)) { - nbttaglist = nbttagcompound.getList("Equipment", 10); - - for (i = 0; i < this.equipment.length; ++i) { - this.equipment[i] = ItemStack.createStack(nbttaglist.get(i)); - } - } - - if (nbttagcompound.hasKeyOfType("DropChances", 9)) { - nbttaglist = nbttagcompound.getList("DropChances", 5); - - for (i = 0; i < nbttaglist.size(); ++i) { - this.dropChances[i] = nbttaglist.e(i); - } - } - - this.bv = nbttagcompound.getBoolean("Leashed"); - if (this.bv && nbttagcompound.hasKeyOfType("Leash", 10)) { - this.bx = nbttagcompound.getCompound("Leash"); - } - } - - public void n(float f) { - this.be = f; - } - - public void i(float f) { - super.i(f); - this.n(f); - } - - public void e() { - super.e(); - this.world.methodProfiler.a("looting"); - if (!this.world.isStatic && this.bJ() && !this.aT && 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.getItemStack() != null) { - ItemStack itemstack = entityitem.getItemStack(); - int i = b(itemstack); - - if (i > -1) { - boolean flag = true; - ItemStack itemstack1 = this.getEquipment(i); - - if (itemstack1 != null) { - if (i == 0) { - if (itemstack.getItem() instanceof ItemSword && !(itemstack1.getItem() instanceof ItemSword)) { - flag = true; - } else if (itemstack.getItem() instanceof ItemSword && itemstack1.getItem() instanceof ItemSword) { - ItemSword itemsword = (ItemSword) itemstack.getItem(); - ItemSword itemsword1 = (ItemSword) itemstack1.getItem(); - - if (itemsword.i() == itemsword1.i()) { - flag = itemstack.getData() > itemstack1.getData() || itemstack.hasTag() && !itemstack1.hasTag(); - } else { - flag = itemsword.i() > itemsword1.i(); - } - } else { - flag = false; - } - } else if (itemstack.getItem() instanceof ItemArmor && !(itemstack1.getItem() instanceof ItemArmor)) { - flag = true; - } else if (itemstack.getItem() instanceof ItemArmor && itemstack1.getItem() instanceof ItemArmor) { - ItemArmor itemarmor = (ItemArmor) itemstack.getItem(); - ItemArmor itemarmor1 = (ItemArmor) itemstack1.getItem(); - - if (itemarmor.c == itemarmor1.c) { - flag = itemstack.getData() > itemstack1.getData() || itemstack.hasTag() && !itemstack1.hasTag(); - } else { - flag = itemarmor.c > itemarmor1.c; - } - } else { - flag = false; - } - } - - if (flag) { - if (itemstack1 != null && this.random.nextFloat() - 0.1F < this.dropChances[i]) { - this.a(itemstack1, 0.0F); - } - - if (itemstack.getItem() == Items.DIAMOND && entityitem.j() != null) { - EntityHuman entityhuman = this.world.a(entityitem.j()); - - if (entityhuman != null) { - entityhuman.a((Statistic) AchievementList.x); - } - } - - this.setEquipment(i, itemstack); - this.dropChances[i] = 2.0F; - this.persistent = true; - this.receive(entityitem, 1); - entityitem.die(); - } - } - } - } - } - - this.world.methodProfiler.b(); - } - - protected boolean bk() { - return false; - } - - protected boolean isTypeNotPersistent() { - return true; - } - - protected void w() { - if (this.persistent) { - this.aU = 0; - } else { - EntityHuman entityhuman = this.world.findNearbyPlayer(this, -1.0D); - - if (entityhuman != null) { - double d0 = entityhuman.locX - this.locX; - double d1 = entityhuman.locY - this.locY; - double d2 = entityhuman.locZ - this.locZ; - double d3 = d0 * d0 + d1 * d1 + d2 * d2; - - if (d3 > 16384.0D) { // CraftBukkit - remove isTypeNotPersistent() check - this.die(); - } - - if (this.aU > 600 && this.random.nextInt(800) == 0 && d3 > 1024.0D) { // CraftBukkit - remove isTypeNotPersistent() check - this.die(); - } else if (d3 < 1024.0D) { - this.aU = 0; - } - } - } - } - - protected void bn() { - ++this.aU; - this.world.methodProfiler.a("checkDespawn"); - this.w(); - this.world.methodProfiler.b(); - this.world.methodProfiler.a("sensing"); - this.bq.a(); - this.world.methodProfiler.b(); - this.world.methodProfiler.a("targetSelector"); - this.targetSelector.a(); - this.world.methodProfiler.b(); - this.world.methodProfiler.a("goalSelector"); - this.goalSelector.a(); - this.world.methodProfiler.b(); - this.world.methodProfiler.a("navigation"); - this.navigation.f(); - this.world.methodProfiler.b(); - this.world.methodProfiler.a("mob tick"); - this.bp(); - this.world.methodProfiler.b(); - this.world.methodProfiler.a("controls"); - this.world.methodProfiler.a("move"); - this.moveController.c(); - this.world.methodProfiler.c("look"); - this.lookController.a(); - this.world.methodProfiler.c("jump"); - this.bm.b(); - this.world.methodProfiler.b(); - this.world.methodProfiler.b(); - } - - protected void bq() { - super.bq(); - this.bd = 0.0F; - this.be = 0.0F; - this.w(); - float f = 8.0F; - - if (this.random.nextFloat() < 0.02F) { - EntityHuman entityhuman = this.world.findNearbyPlayer(this, (double) f); - - if (entityhuman != null) { - this.bu = entityhuman; - this.g = 10 + this.random.nextInt(20); - } else { - this.bf = (this.random.nextFloat() - 0.5F) * 20.0F; - } - } - - if (this.bu != null) { - this.a(this.bu, 10.0F, (float) this.x()); - if (this.g-- <= 0 || this.bu.dead || this.bu.f((Entity) this) > (double) (f * f)) { - this.bu = null; - } - } else { - if (this.random.nextFloat() < 0.05F) { - this.bf = (this.random.nextFloat() - 0.5F) * 20.0F; - } - - this.yaw += this.bf; - this.pitch = this.f; - } - - boolean flag = this.M(); - boolean flag1 = this.P(); - - if (flag || flag1) { - this.bc = this.random.nextFloat() < 0.8F; - } - } - - public int x() { - return 40; - } - - public void a(Entity entity, float f, float f1) { - double d0 = entity.locX - this.locX; - double d1 = entity.locZ - this.locZ; - double d2; - - if (entity instanceof EntityLiving) { - EntityLiving entityliving = (EntityLiving) entity; - - d2 = entityliving.locY + (double) entityliving.getHeadHeight() - (this.locY + (double) this.getHeadHeight()); - } else { - d2 = (entity.boundingBox.b + entity.boundingBox.e) / 2.0D - (this.locY + (double) this.getHeadHeight()); - } - - double d3 = (double) MathHelper.sqrt(d0 * d0 + d1 * d1); - float f2 = (float) (Math.atan2(d1, d0) * 180.0D / 3.1415927410125732D) - 90.0F; - float f3 = (float) (-(Math.atan2(d2, d3) * 180.0D / 3.1415927410125732D)); - - this.pitch = this.b(this.pitch, f3, f1); - this.yaw = this.b(this.yaw, f2, f); - } - - private float b(float f, float f1, float f2) { - float f3 = MathHelper.g(f1 - f); - - if (f3 > f2) { - f3 = f2; - } - - if (f3 < -f2) { - f3 = -f2; - } - - return f + f3; - } - - public boolean canSpawn() { - return this.world.b(this.boundingBox) && this.world.getCubes(this, this.boundingBox).isEmpty() && !this.world.containsLiquid(this.boundingBox); - } - - public int bB() { - return 4; - } - - public int ax() { - if (this.getGoalTarget() == null) { - return 3; - } else { - int i = (int) (this.getHealth() - this.getMaxHealth() * 0.33F); - - i -= (3 - this.world.difficulty.a()) * 4; - if (i < 0) { - i = 0; - } - - return i + 3; - } - } - - public ItemStack be() { - return this.equipment[0]; - } - - public ItemStack getEquipment(int i) { - return this.equipment[i]; - } - - public ItemStack r(int i) { - return this.equipment[i + 1]; - } - - public void setEquipment(int i, ItemStack itemstack) { - this.equipment[i] = itemstack; - } - - public ItemStack[] getEquipment() { - return this.equipment; - } - - protected void dropEquipment(boolean flag, int i) { - for (int j = 0; j < this.getEquipment().length; ++j) { - ItemStack itemstack = this.getEquipment(j); - boolean flag1 = this.dropChances[j] > 1.0F; - - if (itemstack != null && (flag || flag1) && this.random.nextFloat() - (float) i * 0.01F < this.dropChances[j]) { - if (!flag1 && itemstack.g()) { - int k = Math.max(itemstack.l() - 25, 1); - int l = itemstack.l() - this.random.nextInt(this.random.nextInt(k) + 1); - - if (l > k) { - l = k; - } - - if (l < 1) { - l = 1; - } - - itemstack.setData(l); - } - - this.a(itemstack, 0.0F); - } - } - } - - protected void bC() { - if (this.random.nextFloat() < 0.15F * this.world.b(this.locX, this.locY, this.locZ)) { - int i = this.random.nextInt(2); - float f = this.world.difficulty == EnumDifficulty.HARD ? 0.1F : 0.25F; - - if (this.random.nextFloat() < 0.095F) { - ++i; - } - - if (this.random.nextFloat() < 0.095F) { - ++i; - } - - if (this.random.nextFloat() < 0.095F) { - ++i; - } - - for (int j = 3; j >= 0; --j) { - ItemStack itemstack = this.r(j); - - if (j < 3 && this.random.nextFloat() < f) { - break; - } - - if (itemstack == null) { - Item item = a(j + 1, i); - - if (item != null) { - this.setEquipment(j + 1, new ItemStack(item)); - } - } - } - } - } - - public static int b(ItemStack itemstack) { - if (itemstack.getItem() != Item.getItemOf(Blocks.PUMPKIN) && itemstack.getItem() != Items.SKULL) { - if (itemstack.getItem() instanceof ItemArmor) { - switch (((ItemArmor) itemstack.getItem()).b) { - case 0: - return 4; - - case 1: - return 3; - - case 2: - return 2; - - case 3: - return 1; - } - } - - return 0; - } else { - return 4; - } - } - - public static Item a(int i, int j) { - switch (i) { - case 4: - if (j == 0) { - return Items.LEATHER_HELMET; - } else if (j == 1) { - return Items.GOLD_HELMET; - } else if (j == 2) { - return Items.CHAINMAIL_HELMET; - } else if (j == 3) { - return Items.IRON_HELMET; - } else if (j == 4) { - return Items.DIAMOND_HELMET; - } - - case 3: - if (j == 0) { - return Items.LEATHER_CHESTPLATE; - } else if (j == 1) { - return Items.GOLD_CHESTPLATE; - } else if (j == 2) { - return Items.CHAINMAIL_CHESTPLATE; - } else if (j == 3) { - return Items.IRON_CHESTPLATE; - } else if (j == 4) { - return Items.DIAMOND_CHESTPLATE; - } - - case 2: - if (j == 0) { - return Items.LEATHER_LEGGINGS; - } else if (j == 1) { - return Items.GOLD_LEGGINGS; - } else if (j == 2) { - return Items.CHAINMAIL_LEGGINGS; - } else if (j == 3) { - return Items.IRON_LEGGINGS; - } else if (j == 4) { - return Items.DIAMOND_LEGGINGS; - } - - case 1: - if (j == 0) { - return Items.LEATHER_BOOTS; - } else if (j == 1) { - return Items.GOLD_BOOTS; - } else if (j == 2) { - return Items.CHAINMAIL_BOOTS; - } else if (j == 3) { - return Items.IRON_BOOTS; - } else if (j == 4) { - return Items.DIAMOND_BOOTS; - } - - default: - return null; - } - } - - protected void bD() { - float f = this.world.b(this.locX, this.locY, this.locZ); - - if (this.be() != null && this.random.nextFloat() < 0.25F * f) { - EnchantmentManager.a(this.random, this.be(), (int) (5.0F + f * (float) this.random.nextInt(18))); - } - - for (int i = 0; i < 4; ++i) { - ItemStack itemstack = this.r(i); - - if (itemstack != null && this.random.nextFloat() < 0.5F * f) { - EnchantmentManager.a(this.random, itemstack, (int) (5.0F + f * (float) this.random.nextInt(18))); - } - } - } - - public GroupDataEntity prepare(GroupDataEntity groupdataentity) { - this.getAttributeInstance(GenericAttributes.b).a(new AttributeModifier("Random spawn bonus", this.random.nextGaussian() * 0.05D, 1)); - return groupdataentity; - } - - public boolean bE() { - return false; - } - - public String getName() { - return this.hasCustomName() ? this.getCustomName() : super.getName(); - } - - public void bF() { - this.persistent = true; - } - - public void setCustomName(String s) { - this.datawatcher.watch(10, s); - } - - public String getCustomName() { - return this.datawatcher.getString(10); - } - - public boolean hasCustomName() { - return this.datawatcher.getString(10).length() > 0; - } - - public void setCustomNameVisible(boolean flag) { - this.datawatcher.watch(11, Byte.valueOf((byte) (flag ? 1 : 0))); - } - - public boolean getCustomNameVisible() { - return this.datawatcher.getByte(11) == 1; - } - - public void a(int i, float f) { - this.dropChances[i] = f; - } - - public boolean bJ() { - return this.canPickUpLoot; - } - - public void h(boolean flag) { - this.canPickUpLoot = flag; - } - - public boolean isPersistent() { - return this.persistent; - } - - public final boolean c(EntityHuman entityhuman) { - if (this.bN() && this.getLeashHolder() == entityhuman) { - // CraftBukkit start - fire PlayerUnleashEntityEvent - if (CraftEventFactory.callPlayerUnleashEntityEvent(this, entityhuman).isCancelled()) { - ((EntityPlayer) entityhuman).playerConnection.sendPacket(new PacketPlayOutAttachEntity(1, this, this.getLeashHolder())); - return false; - } - // CraftBukkit end - this.unleash(true, !entityhuman.abilities.canInstantlyBuild); - return true; - } else { - ItemStack itemstack = entityhuman.inventory.getItemInHand(); - - if (itemstack != null && itemstack.getItem() == Items.LEASH && this.bM()) { - if (!(this instanceof EntityTameableAnimal) || !((EntityTameableAnimal) this).isTamed()) { - // CraftBukkit start - fire PlayerLeashEntityEvent - if (CraftEventFactory.callPlayerLeashEntityEvent(this, entityhuman, entityhuman).isCancelled()) { - ((EntityPlayer) entityhuman).playerConnection.sendPacket(new PacketPlayOutAttachEntity(1, this, this.getLeashHolder())); - return false; - } - // CraftBukkit end - this.setLeashHolder(entityhuman, true); - --itemstack.count; - return true; - } - - if (((EntityTameableAnimal) this).e(entityhuman)) { - // CraftBukkit start - fire PlayerLeashEntityEvent - if (CraftEventFactory.callPlayerLeashEntityEvent(this, entityhuman, entityhuman).isCancelled()) { - ((EntityPlayer) entityhuman).playerConnection.sendPacket(new PacketPlayOutAttachEntity(1, this, this.getLeashHolder())); - return false; - } - // CraftBukkit end - this.setLeashHolder(entityhuman, true); - --itemstack.count; - return true; - } - } - - return this.a(entityhuman) ? true : super.c(entityhuman); - } - } - - protected boolean a(EntityHuman entityhuman) { - return false; - } - - protected void bL() { - if (this.bx != null) { - this.bP(); - } - - if (this.bv) { - if (this.bw == null || this.bw.dead) { - this.world.getServer().getPluginManager().callEvent(new EntityUnleashEvent(this.getBukkitEntity(), UnleashReason.HOLDER_GONE)); // CraftBukkit - this.unleash(true, true); - } - } - } - - public void unleash(boolean flag, boolean flag1) { - if (this.bv) { - this.bv = false; - this.bw = null; - if (!this.world.isStatic && flag1) { - this.a(Items.LEASH, 1); - } - - if (!this.world.isStatic && flag && this.world instanceof WorldServer) { - ((WorldServer) this.world).getTracker().a((Entity) this, (Packet) (new PacketPlayOutAttachEntity(1, this, (Entity) null))); - } - } - } - - public boolean bM() { - return !this.bN() && !(this instanceof IMonster); - } - - public boolean bN() { - return this.bv; - } - - public Entity getLeashHolder() { - return this.bw; - } - - public void setLeashHolder(Entity entity, boolean flag) { - this.bv = true; - this.bw = entity; - if (!this.world.isStatic && flag && this.world instanceof WorldServer) { - ((WorldServer) this.world).getTracker().a((Entity) this, (Packet) (new PacketPlayOutAttachEntity(1, this, this.bw))); - } - } - - private void bP() { - if (this.bv && this.bx != null) { - if (this.bx.hasKeyOfType("UUIDMost", 4) && this.bx.hasKeyOfType("UUIDLeast", 4)) { - UUID uuid = new UUID(this.bx.getLong("UUIDMost"), this.bx.getLong("UUIDLeast")); - List list = this.world.a(EntityLiving.class, this.boundingBox.grow(10.0D, 10.0D, 10.0D)); - Iterator iterator = list.iterator(); - - while (iterator.hasNext()) { - EntityLiving entityliving = (EntityLiving) iterator.next(); - - if (entityliving.getUniqueID().equals(uuid)) { - this.bw = entityliving; - break; - } - } - } else if (this.bx.hasKeyOfType("X", 99) && this.bx.hasKeyOfType("Y", 99) && this.bx.hasKeyOfType("Z", 99)) { - int i = this.bx.getInt("X"); - int j = this.bx.getInt("Y"); - int k = this.bx.getInt("Z"); - EntityLeash entityleash = EntityLeash.b(this.world, i, j, k); - - if (entityleash == null) { - entityleash = EntityLeash.a(this.world, i, j, k); - } - - this.bw = entityleash; - } else { - this.world.getServer().getPluginManager().callEvent(new EntityUnleashEvent(this.getBukkitEntity(), UnleashReason.UNKNOWN)); // CraftBukkit - this.unleash(false, true); - } - } - - this.bx = null; - } -} diff --git a/src/main/java/net/minecraft/server/EntityIronGolem.java b/src/main/java/net/minecraft/server/EntityIronGolem.java deleted file mode 100644 index a274d03c8e..0000000000 --- a/src/main/java/net/minecraft/server/EntityIronGolem.java +++ /dev/null @@ -1,190 +0,0 @@ -package net.minecraft.server; - -public class EntityIronGolem extends EntityGolem { - - private int bq; - Village bp; - private int br; - private int bs; - - public EntityIronGolem(World world) { - super(world); - this.a(1.4F, 2.9F); - this.getNavigation().a(true); - this.goalSelector.a(1, new PathfinderGoalMeleeAttack(this, 1.0D, true)); - this.goalSelector.a(2, new PathfinderGoalMoveTowardsTarget(this, 0.9D, 32.0F)); - this.goalSelector.a(3, new PathfinderGoalMoveThroughVillage(this, 0.6D, true)); - this.goalSelector.a(4, new PathfinderGoalMoveTowardsRestriction(this, 1.0D)); - this.goalSelector.a(5, new PathfinderGoalOfferFlower(this)); - this.goalSelector.a(6, new PathfinderGoalRandomStroll(this, 0.6D)); - this.goalSelector.a(7, new PathfinderGoalLookAtPlayer(this, EntityHuman.class, 6.0F)); - this.goalSelector.a(8, new PathfinderGoalRandomLookaround(this)); - this.targetSelector.a(1, new PathfinderGoalDefendVillage(this)); - this.targetSelector.a(2, new PathfinderGoalHurtByTarget(this, false)); - this.targetSelector.a(3, new PathfinderGoalNearestAttackableTarget(this, EntityInsentient.class, 0, false, true, IMonster.a)); - } - - protected void c() { - super.c(); - this.datawatcher.a(16, Byte.valueOf((byte) 0)); - } - - public boolean bk() { - return true; - } - - protected void bp() { - if (--this.bq <= 0) { - this.bq = 70 + this.random.nextInt(50); - this.bp = this.world.villages.getClosestVillage(MathHelper.floor(this.locX), MathHelper.floor(this.locY), MathHelper.floor(this.locZ), 32); - if (this.bp == null) { - this.bX(); - } else { - ChunkCoordinates chunkcoordinates = this.bp.getCenter(); - - this.a(chunkcoordinates.x, chunkcoordinates.y, chunkcoordinates.z, (int) ((float) this.bp.getSize() * 0.6F)); - } - } - - super.bp(); - } - - protected void aD() { - super.aD(); - this.getAttributeInstance(GenericAttributes.maxHealth).setValue(100.0D); - this.getAttributeInstance(GenericAttributes.d).setValue(0.25D); - } - - protected int j(int i) { - return i; - } - - protected void o(Entity entity) { - if (entity instanceof IMonster && this.aI().nextInt(20) == 0) { - // CraftBukkit start - org.bukkit.event.entity.EntityTargetLivingEntityEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callEntityTargetLivingEvent(this, (EntityLiving) entity, org.bukkit.event.entity.EntityTargetEvent.TargetReason.COLLISION); - if (!event.isCancelled()) { - if (event.getTarget() == null) { - this.setGoalTarget(null); - } else { - this.setGoalTarget(((org.bukkit.craftbukkit.entity.CraftLivingEntity) event.getTarget()).getHandle()); - } - } - // CraftBukkit end - } - - super.o(entity); - } - - public void e() { - super.e(); - if (this.br > 0) { - --this.br; - } - - if (this.bs > 0) { - --this.bs; - } - - if (this.motX * this.motX + this.motZ * this.motZ > 2.500000277905201E-7D && this.random.nextInt(5) == 0) { - int i = MathHelper.floor(this.locX); - int j = MathHelper.floor(this.locY - 0.20000000298023224D - (double) this.height); - int k = MathHelper.floor(this.locZ); - Block block = this.world.getType(i, j, k); - - if (block.getMaterial() != Material.AIR) { - this.world.addParticle("blockcrack_" + Block.getId(block) + "_" + this.world.getData(i, j, k), this.locX + ((double) this.random.nextFloat() - 0.5D) * (double) this.width, this.boundingBox.b + 0.1D, this.locZ + ((double) this.random.nextFloat() - 0.5D) * (double) this.width, 4.0D * ((double) this.random.nextFloat() - 0.5D), 0.5D, ((double) this.random.nextFloat() - 0.5D) * 4.0D); - } - } - } - - public boolean a(Class oclass) { - return this.isPlayerCreated() && EntityHuman.class.isAssignableFrom(oclass) ? false : super.a(oclass); - } - - public void b(NBTTagCompound nbttagcompound) { - super.b(nbttagcompound); - nbttagcompound.setBoolean("PlayerCreated", this.isPlayerCreated()); - } - - public void a(NBTTagCompound nbttagcompound) { - super.a(nbttagcompound); - this.setPlayerCreated(nbttagcompound.getBoolean("PlayerCreated")); - } - - public boolean n(Entity entity) { - this.br = 10; - this.world.broadcastEntityEffect(this, (byte) 4); - boolean flag = entity.damageEntity(DamageSource.mobAttack(this), (float) (7 + this.random.nextInt(15))); - - if (flag) { - entity.motY += 0.4000000059604645D; - } - - this.makeSound("mob.irongolem.throw", 1.0F, 1.0F); - return flag; - } - - public Village bZ() { - return this.bp; - } - - public void a(boolean flag) { - this.bs = flag ? 400 : 0; - this.world.broadcastEntityEffect(this, (byte) 11); - } - - protected String aT() { - return "mob.irongolem.hit"; - } - - protected String aU() { - return "mob.irongolem.death"; - } - - protected void a(int i, int j, int k, Block block) { - this.makeSound("mob.irongolem.walk", 1.0F, 1.0F); - } - - protected void dropDeathLoot(boolean flag, int i) { - int j = this.random.nextInt(3); - - int k; - - for (k = 0; k < j; ++k) { - this.a(Item.getItemOf(Blocks.RED_ROSE), 1, 0.0F); - } - - k = 3 + this.random.nextInt(3); - - for (int l = 0; l < k; ++l) { - this.a(Items.IRON_INGOT, 1); - } - } - - public int cb() { - return this.bs; - } - - public boolean isPlayerCreated() { - return (this.datawatcher.getByte(16) & 1) != 0; - } - - public void setPlayerCreated(boolean flag) { - byte b0 = this.datawatcher.getByte(16); - - if (flag) { - this.datawatcher.watch(16, Byte.valueOf((byte) (b0 | 1))); - } else { - this.datawatcher.watch(16, Byte.valueOf((byte) (b0 & -2))); - } - } - - public void die(DamageSource damagesource) { - if (!this.isPlayerCreated() && this.killer != null && this.bp != null) { - this.bp.a(this.killer.getName(), -5); - } - - super.die(damagesource); - } -} diff --git a/src/main/java/net/minecraft/server/EntityItem.java b/src/main/java/net/minecraft/server/EntityItem.java deleted file mode 100644 index 394bfbf606..0000000000 --- a/src/main/java/net/minecraft/server/EntityItem.java +++ /dev/null @@ -1,341 +0,0 @@ -package net.minecraft.server; - -import java.util.Iterator; - -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; - -import org.bukkit.event.player.PlayerPickupItemEvent; // CraftBukkit - -public class EntityItem extends Entity { - - private static final Logger d = LogManager.getLogger(); - public int age; - public int pickupDelay; - private int e; - private String f; - private String g; - public float c; - private int lastTick = MinecraftServer.currentTick; // CraftBukkit - - public EntityItem(World world, double d0, double d1, double d2) { - super(world); - this.e = 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.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); - // CraftBukkit start - Can't set null items in the datawatcher - if (itemstack == null || itemstack.getItem() == null) { - return; - } - // CraftBukkit end - this.setItemStack(itemstack); - } - - protected boolean g_() { - return false; - } - - public EntityItem(World world) { - super(world); - this.e = 5; - this.c = (float) (Math.random() * 3.141592653589793D * 2.0D); - this.a(0.25F, 0.25F); - this.height = this.length / 2.0F; - } - - protected void c() { - this.getDataWatcher().add(10, 5); - } - - public void h() { - if (this.getItemStack() == null) { - this.die(); - } else { - super.h(); - // CraftBukkit start - Use wall time for pickup and despawn timers - int elapsedTicks = MinecraftServer.currentTick - this.lastTick; - this.pickupDelay -= elapsedTicks; - this.age += elapsedTicks; - this.lastTick = MinecraftServer.currentTick; - // CraftBukkit end - - this.lastX = this.locX; - this.lastY = this.locY; - this.lastZ = this.locZ; - this.motY -= 0.03999999910593033D; - this.X = this.j(this.locX, (this.boundingBox.b + this.boundingBox.e) / 2.0D, this.locZ); - 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 || this.ticksLived % 25 == 0) { - if (this.world.getType(MathHelper.floor(this.locX), MathHelper.floor(this.locY), MathHelper.floor(this.locZ)).getMaterial() == Material.LAVA) { - this.motY = 0.20000000298023224D; - this.motX = (double) ((this.random.nextFloat() - this.random.nextFloat()) * 0.2F); - this.motZ = (double) ((this.random.nextFloat() - this.random.nextFloat()) * 0.2F); - this.makeSound("random.fizz", 0.4F, 2.0F + this.random.nextFloat() * 0.4F); - } - - if (!this.world.isStatic) { - this.k(); - } - } - - float f = 0.98F; - - if (this.onGround) { - f = this.world.getType(MathHelper.floor(this.locX), MathHelper.floor(this.boundingBox.b) - 1, MathHelper.floor(this.locZ)).frictionFactor * 0.98F; - } - - this.motX *= (double) f; - this.motY *= 0.9800000190734863D; - this.motZ *= (double) f; - if (this.onGround) { - this.motY *= -0.5D; - } - - // ++this.age; // CraftBukkit - Moved up - if (!this.world.isStatic && this.age >= 6000) { - // CraftBukkit start - fire ItemDespawnEvent - if (org.bukkit.craftbukkit.event.CraftEventFactory.callItemDespawnEvent(this).isCancelled()) { - this.age = 0; - return; - } - // CraftBukkit end - this.die(); - } - } - } - - private void k() { - Iterator iterator = this.world.a(EntityItem.class, this.boundingBox.grow(0.5D, 0.0D, 0.5D)).iterator(); - - while (iterator.hasNext()) { - EntityItem entityitem = (EntityItem) iterator.next(); - - this.a(entityitem); - } - } - - public boolean a(EntityItem entityitem) { - if (entityitem == this) { - return false; - } else if (entityitem.isAlive() && this.isAlive()) { - ItemStack itemstack = this.getItemStack(); - ItemStack itemstack1 = entityitem.getItemStack(); - - if (itemstack1.getItem() != itemstack.getItem()) { - return false; - } else if (itemstack1.hasTag() ^ itemstack.hasTag()) { - return false; - } else if (itemstack1.hasTag() && !itemstack1.getTag().equals(itemstack.getTag())) { - return false; - } else if (itemstack1.getItem() == null) { - return false; - } else if (itemstack1.getItem().n() && itemstack1.getData() != itemstack.getData()) { - return false; - } else if (itemstack1.count < itemstack.count) { - return entityitem.a(this); - } else if (itemstack1.count + itemstack.count > itemstack1.getMaxStackSize()) { - return false; - } else { - 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; - } - } else { - return false; - } - } - - public void e() { - this.age = 4800; - } - - public boolean N() { - return this.world.a(this.boundingBox, Material.WATER, (Entity) this); - } - - protected void burn(int i) { - this.damageEntity(DamageSource.FIRE, (float) i); - } - - public boolean damageEntity(DamageSource damagesource, float f) { - if (this.isInvulnerable()) { - return false; - } else if (this.getItemStack() != null && this.getItemStack().getItem() == Items.NETHER_STAR && damagesource.isExplosion()) { - return false; - } else { - this.Q(); - this.e = (int) ((float) this.e - f); - if (this.e <= 0) { - this.die(); - } - - return false; - } - } - - public void b(NBTTagCompound nbttagcompound) { - nbttagcompound.setShort("Health", (short) ((byte) this.e)); - nbttagcompound.setShort("Age", (short) this.age); - if (this.j() != null) { - nbttagcompound.setString("Thrower", this.f); - } - - if (this.i() != null) { - nbttagcompound.setString("Owner", this.g); - } - - if (this.getItemStack() != null) { - nbttagcompound.set("Item", this.getItemStack().save(new NBTTagCompound())); - } - } - - public void a(NBTTagCompound nbttagcompound) { - this.e = nbttagcompound.getShort("Health") & 255; - this.age = nbttagcompound.getShort("Age"); - if (nbttagcompound.hasKey("Owner")) { - this.g = nbttagcompound.getString("Owner"); - } - - if (nbttagcompound.hasKey("Thrower")) { - this.f = nbttagcompound.getString("Thrower"); - } - - NBTTagCompound nbttagcompound1 = nbttagcompound.getCompound("Item"); - - // CraftBukkit start - Handle missing "Item" compounds - if (nbttagcompound1 != null) { - ItemStack itemstack = ItemStack.createStack(nbttagcompound1); - if (itemstack != null) { - this.setItemStack(itemstack); - } else { - this.die(); - } - } else { - this.die(); - } - // CraftBukkit end - if (this.getItemStack() == null) { - this.die(); - } - } - - public void b_(EntityHuman entityhuman) { - if (!this.world.isStatic) { - ItemStack itemstack = this.getItemStack(); - int i = itemstack.count; - - // CraftBukkit start - fire PlayerPickupItemEvent - int canHold = entityhuman.inventory.canHold(itemstack); - int remaining = itemstack.count - canHold; - - if (this.pickupDelay <= 0 && canHold > 0) { - itemstack.count = canHold; - PlayerPickupItemEvent event = new PlayerPickupItemEvent((org.bukkit.entity.Player) entityhuman.getBukkitEntity(), (org.bukkit.entity.Item) this.getBukkitEntity(), remaining); - // event.setCancelled(!entityhuman.canPickUpLoot); TODO - this.world.getServer().getPluginManager().callEvent(event); - itemstack.count = canHold + remaining; - - if (event.isCancelled()) { - return; - } - - // Possibly < 0; fix here so we do not have to modify code below - this.pickupDelay = 0; - } - // CraftBukkit end - - if (this.pickupDelay == 0 && (this.g == null || 6000 - this.age <= 200 || this.g.equals(entityhuman.getName())) && entityhuman.inventory.pickup(itemstack)) { - if (itemstack.getItem() == Item.getItemOf(Blocks.LOG)) { - entityhuman.a((Statistic) AchievementList.g); - } - - if (itemstack.getItem() == Item.getItemOf(Blocks.LOG2)) { - entityhuman.a((Statistic) AchievementList.g); - } - - if (itemstack.getItem() == Items.LEATHER) { - entityhuman.a((Statistic) AchievementList.t); - } - - if (itemstack.getItem() == Items.DIAMOND) { - entityhuman.a((Statistic) AchievementList.w); - } - - if (itemstack.getItem() == Items.BLAZE_ROD) { - entityhuman.a((Statistic) AchievementList.A); - } - - if (itemstack.getItem() == Items.DIAMOND && this.j() != null) { - EntityHuman entityhuman1 = this.world.a(this.j()); - - if (entityhuman1 != null && entityhuman1 != entityhuman) { - entityhuman1.a((Statistic) AchievementList.x); - } - } - - this.world.makeSound(entityhuman, "random.pop", 0.2F, ((this.random.nextFloat() - this.random.nextFloat()) * 0.7F + 1.0F) * 2.0F); - entityhuman.receive(this, i); - if (itemstack.count <= 0) { - this.die(); - } - } - } - } - - public String getName() { - return LocaleI18n.get("item." + this.getItemStack().a()); - } - - public boolean av() { - return false; - } - - public void b(int i) { - super.b(i); - if (!this.world.isStatic) { - this.k(); - } - } - - public ItemStack getItemStack() { - ItemStack itemstack = this.getDataWatcher().getItemStack(10); - - return itemstack == null ? new ItemStack(Blocks.STONE) : itemstack; - } - - public void setItemStack(ItemStack itemstack) { - this.getDataWatcher().watch(10, itemstack); - this.getDataWatcher().update(10); - } - - public String i() { - return this.g; - } - - public void a(String s) { - this.g = s; - } - - public String j() { - return this.f; - } - - public void b(String s) { - this.f = s; - } -} diff --git a/src/main/java/net/minecraft/server/EntityItemFrame.java b/src/main/java/net/minecraft/server/EntityItemFrame.java deleted file mode 100644 index d1d73f91f3..0000000000 --- a/src/main/java/net/minecraft/server/EntityItemFrame.java +++ /dev/null @@ -1,152 +0,0 @@ -package net.minecraft.server; - -public class EntityItemFrame extends EntityHanging { - - private float e = 1.0F; - - public EntityItemFrame(World world) { - super(world); - } - - public EntityItemFrame(World world, int i, int j, int k, int l) { - super(world, i, j, k, l); - this.setDirection(l); - } - - protected void c() { - this.getDataWatcher().add(2, 5); - this.getDataWatcher().a(3, Byte.valueOf((byte) 0)); - } - - public boolean damageEntity(DamageSource damagesource, float f) { - if (this.isInvulnerable()) { - return false; - } else if (this.getItem() != null) { - if (!this.world.isStatic) { - // CraftBukkit start - fire EntityDamageEvent - if (org.bukkit.craftbukkit.event.CraftEventFactory.handleNonLivingEntityDamageEvent(this, damagesource, f, false) || this.dead) { - return true; - } - // CraftBukkit end - - this.b(damagesource.getEntity(), false); - this.setItem((ItemStack) null); - } - - return true; - } else { - return super.damageEntity(damagesource, f); - } - } - - public int f() { - return 9; - } - - public int i() { - return 9; - } - - public void b(Entity entity) { - this.b(entity, true); - } - - public void b(Entity entity, boolean flag) { - ItemStack itemstack = this.getItem(); - - if (entity instanceof EntityHuman) { - EntityHuman entityhuman = (EntityHuman) entity; - - if (entityhuman.abilities.canInstantlyBuild) { - this.b(itemstack); - return; - } - } - - if (flag) { - this.a(new ItemStack(Items.ITEM_FRAME), 0.0F); - } - - if (itemstack != null && this.random.nextFloat() < this.e) { - itemstack = itemstack.cloneItemStack(); - this.b(itemstack); - this.a(itemstack, 0.0F); - } - } - - private void b(ItemStack itemstack) { - if (itemstack != null) { - if (itemstack.getItem() == Items.MAP) { - WorldMap worldmap = ((ItemWorldMap) itemstack.getItem()).getSavedMap(itemstack, this.world); - - worldmap.decorations.remove("frame-" + this.getId()); - } - - itemstack.a((EntityItemFrame) null); - } - } - - public ItemStack getItem() { - return this.getDataWatcher().getItemStack(2); - } - - public void setItem(ItemStack itemstack) { - if (itemstack != null) { - itemstack = itemstack.cloneItemStack(); - itemstack.count = 1; - itemstack.a(this); - } - - this.getDataWatcher().watch(2, itemstack); - this.getDataWatcher().update(2); - } - - public int getRotation() { - return this.getDataWatcher().getByte(3); - } - - public void setRotation(int i) { - this.getDataWatcher().watch(3, Byte.valueOf((byte) (i % 4))); - } - - public void b(NBTTagCompound nbttagcompound) { - if (this.getItem() != null) { - nbttagcompound.set("Item", this.getItem().save(new NBTTagCompound())); - nbttagcompound.setByte("ItemRotation", (byte) this.getRotation()); - nbttagcompound.setFloat("ItemDropChance", this.e); - } - - super.b(nbttagcompound); - } - - public void a(NBTTagCompound nbttagcompound) { - NBTTagCompound nbttagcompound1 = nbttagcompound.getCompound("Item"); - - if (nbttagcompound1 != null && !nbttagcompound1.isEmpty()) { - this.setItem(ItemStack.createStack(nbttagcompound1)); - this.setRotation(nbttagcompound.getByte("ItemRotation")); - if (nbttagcompound.hasKeyOfType("ItemDropChance", 99)) { - this.e = nbttagcompound.getFloat("ItemDropChance"); - } - } - - super.a(nbttagcompound); - } - - public boolean c(EntityHuman entityhuman) { - if (this.getItem() == null) { - ItemStack itemstack = entityhuman.be(); - - if (itemstack != null && !this.world.isStatic) { - this.setItem(itemstack); - if (!entityhuman.abilities.canInstantlyBuild && --itemstack.count <= 0) { - entityhuman.inventory.setItem(entityhuman.inventory.itemInHandIndex, (ItemStack) null); - } - } - } else if (!this.world.isStatic) { - this.setRotation(this.getRotation() + 1); - } - - return true; - } -} diff --git a/src/main/java/net/minecraft/server/EntityLargeFireball.java b/src/main/java/net/minecraft/server/EntityLargeFireball.java deleted file mode 100644 index 326f7ea6b4..0000000000 --- a/src/main/java/net/minecraft/server/EntityLargeFireball.java +++ /dev/null @@ -1,49 +0,0 @@ -package net.minecraft.server; - -import org.bukkit.event.entity.ExplosionPrimeEvent; // CraftBukkit - -public class EntityLargeFireball extends EntityFireball { - - public int yield = 1; - - public EntityLargeFireball(World world) { - super(world); - } - - public EntityLargeFireball(World world, EntityLiving entityliving, double d0, double d1, double d2) { - super(world, entityliving, d0, d1, d2); - } - - protected void a(MovingObjectPosition movingobjectposition) { - if (!this.world.isStatic) { - if (movingobjectposition.entity != null) { - movingobjectposition.entity.damageEntity(DamageSource.fireball(this, this.shooter), 6.0F); - } - - // CraftBukkit start - fire ExplosionPrimeEvent - ExplosionPrimeEvent event = new ExplosionPrimeEvent((org.bukkit.entity.Explosive) org.bukkit.craftbukkit.entity.CraftEntity.getEntity(this.world.getServer(), this)); - this.world.getServer().getPluginManager().callEvent(event); - - if (!event.isCancelled()) { - // give 'this' instead of (Entity) null so we know what causes the damage - this.world.createExplosion(this, this.locX, this.locY, this.locZ, event.getRadius(), event.getFire(), this.world.getGameRules().getBoolean("mobGriefing")); - } - // CraftBukkit end - - this.die(); - } - } - - public void b(NBTTagCompound nbttagcompound) { - super.b(nbttagcompound); - nbttagcompound.setInt("ExplosionPower", this.yield); - } - - public void a(NBTTagCompound nbttagcompound) { - super.a(nbttagcompound); - if (nbttagcompound.hasKeyOfType("ExplosionPower", 99)) { - // CraftBukkit - set bukkitYield when setting explosionpower - this.bukkitYield = this.yield = nbttagcompound.getInt("ExplosionPower"); - } - } -} diff --git a/src/main/java/net/minecraft/server/EntityLeash.java b/src/main/java/net/minecraft/server/EntityLeash.java deleted file mode 100644 index 9b2ac82314..0000000000 --- a/src/main/java/net/minecraft/server/EntityLeash.java +++ /dev/null @@ -1,137 +0,0 @@ -package net.minecraft.server; - -import java.util.Iterator; -import java.util.List; - -import org.bukkit.craftbukkit.event.CraftEventFactory; // CraftBukkit - -public class EntityLeash extends EntityHanging { - - public EntityLeash(World world) { - super(world); - } - - public EntityLeash(World world, int i, int j, int k) { - super(world, i, j, k, 0); - this.setPosition((double) i + 0.5D, (double) j + 0.5D, (double) k + 0.5D); - } - - protected void c() { - super.c(); - } - - public void setDirection(int i) {} - - public int f() { - return 9; - } - - public int i() { - return 9; - } - - public void b(Entity entity) {} - - public boolean d(NBTTagCompound nbttagcompound) { - return false; - } - - public void b(NBTTagCompound nbttagcompound) {} - - public void a(NBTTagCompound nbttagcompound) {} - - public boolean c(EntityHuman entityhuman) { - ItemStack itemstack = entityhuman.be(); - boolean flag = false; - double d0; - List list; - Iterator iterator; - EntityInsentient entityinsentient; - - if (itemstack != null && itemstack.getItem() == Items.LEASH && !this.world.isStatic) { - d0 = 7.0D; - list = this.world.a(EntityInsentient.class, AxisAlignedBB.a(this.locX - d0, this.locY - d0, this.locZ - d0, this.locX + d0, this.locY + d0, this.locZ + d0)); - if (list != null) { - iterator = list.iterator(); - - while (iterator.hasNext()) { - entityinsentient = (EntityInsentient) iterator.next(); - if (entityinsentient.bN() && entityinsentient.getLeashHolder() == entityhuman) { - // CraftBukkit start - if (CraftEventFactory.callPlayerLeashEntityEvent(entityinsentient, this, entityhuman).isCancelled()) { - ((EntityPlayer) entityhuman).playerConnection.sendPacket(new PacketPlayOutAttachEntity(1, entityinsentient, entityinsentient.getLeashHolder())); - continue; - } - // CraftBukkit end - entityinsentient.setLeashHolder(this, true); - flag = true; - } - } - } - } - - if (!this.world.isStatic && !flag) { - // CraftBukkit start - Move below - // this.die(); - boolean die = true; - // CraftBukkit end - if (true || entityhuman.abilities.canInstantlyBuild) { // CraftBukkit - Process for non-creative as well - d0 = 7.0D; - list = this.world.a(EntityInsentient.class, AxisAlignedBB.a(this.locX - d0, this.locY - d0, this.locZ - d0, this.locX + d0, this.locY + d0, this.locZ + d0)); - if (list != null) { - iterator = list.iterator(); - - while (iterator.hasNext()) { - entityinsentient = (EntityInsentient) iterator.next(); - if (entityinsentient.bN() && entityinsentient.getLeashHolder() == this) { - // CraftBukkit start - if (CraftEventFactory.callPlayerUnleashEntityEvent(entityinsentient, entityhuman).isCancelled()) { - die = false; - continue; - } - entityinsentient.unleash(true, !entityhuman.abilities.canInstantlyBuild); // false -> survival mode boolean - // CraftBukkit end - } - } - } - } - // CraftBukkit start - if (die) { - this.die(); - } - // CraftBukkit end - } - - return true; - } - - public boolean survives() { - return this.world.getType(this.x, this.y, this.z).b() == 11; - } - - public static EntityLeash a(World world, int i, int j, int k) { - EntityLeash entityleash = new EntityLeash(world, i, j, k); - - entityleash.attachedToPlayer = true; - world.addEntity(entityleash); - return entityleash; - } - - public static EntityLeash b(World world, int i, int j, int k) { - List list = world.a(EntityLeash.class, AxisAlignedBB.a((double) i - 1.0D, (double) j - 1.0D, (double) k - 1.0D, (double) i + 1.0D, (double) j + 1.0D, (double) k + 1.0D)); - - if (list != null) { - Iterator iterator = list.iterator(); - - while (iterator.hasNext()) { - EntityLeash entityleash = (EntityLeash) iterator.next(); - - if (entityleash.x == i && entityleash.y == j && entityleash.z == k) { - return entityleash; - } - } - } - - return null; - } -} diff --git a/src/main/java/net/minecraft/server/EntityLightning.java b/src/main/java/net/minecraft/server/EntityLightning.java deleted file mode 100644 index 66402a053b..0000000000 --- a/src/main/java/net/minecraft/server/EntityLightning.java +++ /dev/null @@ -1,133 +0,0 @@ -package net.minecraft.server; - -import java.util.List; - -import org.bukkit.craftbukkit.event.CraftEventFactory; // CraftBukkit - -public class EntityLightning extends EntityWeather { - - private int lifeTicks; - public long a; - private int c; - - // CraftBukkit start - public boolean isEffect = false; - - public EntityLightning(World world, double d0, double d1, double d2) { - this(world, d0, d1, d2, false); - } - - public EntityLightning(World world, double d0, double d1, double d2, boolean isEffect) { - // CraftBukkit end - - super(world); - - // CraftBukkit - Set isEffect - this.isEffect = isEffect; - - this.setPositionRotation(d0, d1, d2, 0.0F, 0.0F); - this.lifeTicks = 2; - this.a = this.random.nextLong(); - this.c = this.random.nextInt(3) + 1; - - // CraftBukkit - add "!isEffect" - if (!isEffect && !world.isStatic && world.getGameRules().getBoolean("doFireTick") && (world.difficulty == EnumDifficulty.NORMAL || world.difficulty == EnumDifficulty.HARD) && world.areChunksLoaded(MathHelper.floor(d0), MathHelper.floor(d1), MathHelper.floor(d2), 10)) { - int i = MathHelper.floor(d0); - int j = MathHelper.floor(d1); - int k = MathHelper.floor(d2); - - if (world.getType(i, j, k).getMaterial() == Material.AIR && Blocks.FIRE.canPlace(world, i, j, k)) { - // CraftBukkit start - if (!CraftEventFactory.callBlockIgniteEvent(world, i, j, k, this).isCancelled()) { - world.setTypeUpdate(i, j, k, Blocks.FIRE); - } - // CraftBukkit end - } - - for (i = 0; i < 4; ++i) { - j = MathHelper.floor(d0) + this.random.nextInt(3) - 1; - k = MathHelper.floor(d1) + this.random.nextInt(3) - 1; - int l = MathHelper.floor(d2) + this.random.nextInt(3) - 1; - - if (world.getType(j, k, l).getMaterial() == Material.AIR && Blocks.FIRE.canPlace(world, j, k, l)) { - // CraftBukkit start - if (!CraftEventFactory.callBlockIgniteEvent(world, j, k, l, this).isCancelled()) { - world.setTypeUpdate(j, k, l, Blocks.FIRE); - } - // CraftBukkit end - } - } - } - } - - public void h() { - super.h(); - if (this.lifeTicks == 2) { - // CraftBukkit start - Use relative location for far away sounds - //this.world.makeSound(this.locX, this.locY, this.locZ, "ambient.weather.thunder", 10000.0F, 0.8F + this.random.nextFloat() * 0.2F); - float pitch = 0.8F + this.random.nextFloat() * 0.2F; - int viewDistance = ((WorldServer) this.world).getServer().getViewDistance() * 16; - for (EntityPlayer player : (List) this.world.players) { - double deltaX = this.locX - player.locX; - double deltaZ = this.locZ - player.locZ; - double distanceSquared = deltaX * deltaX + deltaZ * deltaZ; - if (distanceSquared > viewDistance * viewDistance) { - double deltaLength = Math.sqrt(distanceSquared); - double relativeX = player.locX + (deltaX / deltaLength) * viewDistance; - double relativeZ = player.locZ + (deltaZ / deltaLength) * viewDistance; - player.playerConnection.sendPacket(new PacketPlayOutNamedSoundEffect("ambient.weather.thunder", relativeX, this.locY, relativeZ, 10000.0F, pitch)); - } else { - player.playerConnection.sendPacket(new PacketPlayOutNamedSoundEffect("ambient.weather.thunder", this.locX, this.locY, this.locZ, 10000.0F, pitch)); - } - } - // CraftBukkit end - this.world.makeSound(this.locX, this.locY, this.locZ, "random.explode", 2.0F, 0.5F + this.random.nextFloat() * 0.2F); - } - - --this.lifeTicks; - if (this.lifeTicks < 0) { - if (this.c == 0) { - this.die(); - } else if (this.lifeTicks < -this.random.nextInt(10)) { - --this.c; - this.lifeTicks = 1; - this.a = this.random.nextLong(); - // CraftBukkit - add "!isEffect" - if (!isEffect && !this.world.isStatic && this.world.getGameRules().getBoolean("doFireTick") && this.world.areChunksLoaded(MathHelper.floor(this.locX), MathHelper.floor(this.locY), MathHelper.floor(this.locZ), 10)) { - int i = MathHelper.floor(this.locX); - int j = MathHelper.floor(this.locY); - int k = MathHelper.floor(this.locZ); - - if (this.world.getType(i, j, k).getMaterial() == Material.AIR && Blocks.FIRE.canPlace(this.world, i, j, k)) { - // CraftBukkit start - if (!CraftEventFactory.callBlockIgniteEvent(world, i, j, k, this).isCancelled()) { - this.world.setTypeUpdate(i, j, k, Blocks.FIRE); - } - // CraftBukkit end - } - } - } - } - - 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(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); - - entity.a(this); - } - } - } - } - - protected void c() {} - - protected void a(NBTTagCompound nbttagcompound) {} - - protected void b(NBTTagCompound nbttagcompound) {} -} diff --git a/src/main/java/net/minecraft/server/EntityLiving.java b/src/main/java/net/minecraft/server/EntityLiving.java deleted file mode 100644 index 0c63b2c6ca..0000000000 --- a/src/main/java/net/minecraft/server/EntityLiving.java +++ /dev/null @@ -1,1720 +0,0 @@ -package net.minecraft.server; - -import java.util.Collection; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Random; -import java.util.UUID; - -// CraftBukkit start -import java.util.ArrayList; -import com.google.common.base.Function; -import org.bukkit.craftbukkit.event.CraftEventFactory; -import org.bukkit.event.entity.EntityDamageEvent; -import org.bukkit.event.entity.EntityDamageEvent.DamageModifier; -import org.bukkit.event.entity.EntityRegainHealthEvent; -// CraftBukkit end - -public abstract class EntityLiving extends Entity { - - private static final UUID b = UUID.fromString("662A6B8D-DA3E-4C1C-8813-96EA6097278D"); - private static final AttributeModifier c = (new AttributeModifier(b, "Sprinting speed boost", 0.30000001192092896D, 2)).a(false); - private AttributeMapBase d; - public CombatTracker combatTracker = new CombatTracker(this); // CraftBukkit - private -> public, remove final - public final HashMap effects = new HashMap(); // CraftBukkit - protected -> public - private final ItemStack[] g = new ItemStack[5]; - public boolean at; - public int au; - public int av; - public float aw; - public int hurtTicks; - public int ay; - public float az; - public int deathTicks; - public int attackTicks; - public float aC; - public float aD; - public float aE; - public float aF; - public float aG; - public int maxNoDamageTicks = 20; - public float aI; - public float aJ; - public float aK; - public float aL; - public float aM; - public float aN; - public float aO; - public float aP; - public float aQ = 0.02F; - public EntityHuman killer; // CraftBukkit - protected -> public - protected int lastDamageByPlayerTime; - protected boolean aT; - protected int aU; - protected float aV; - protected float aW; - protected float aX; - protected float aY; - protected float aZ; - protected int ba; - public float lastDamage; // CraftBukkit - protected -> public - protected boolean bc; - public float bd; - public float be; - protected float bf; - protected int bg; - protected double bh; - protected double bi; - protected double bj; - protected double bk; - protected double bl; - public boolean updateEffects = true; // CraftBukkit - private -> public - public EntityLiving lastDamager; // CraftBukkit - private -> public - private int bm; - private EntityLiving bn; - private int bo; - private float bp; - private int bq; - private float br; - // CraftBukkit start - public int expToDrop; - public int maxAirTicks = 300; - ArrayList drops = null; - // CraftBukkit end - - public EntityLiving(World world) { - super(world); - this.aD(); - // CraftBukkit - setHealth(getMaxHealth()) inlined and simplified to skip the instanceof check for EntityPlayer, as getBukkitEntity() is not initialized in constructor - this.datawatcher.watch(6, (float) this.getAttributeInstance(GenericAttributes.maxHealth).getValue()); - this.k = true; - this.aL = (float) (Math.random() + 1.0D) * 0.01F; - this.setPosition(this.locX, this.locY, this.locZ); - this.aK = (float) Math.random() * 12398.0F; - this.yaw = (float) (Math.random() * 3.1415927410125732D * 2.0D); - this.aO = this.yaw; - this.W = 0.5F; - } - - protected void c() { - this.datawatcher.a(7, Integer.valueOf(0)); - this.datawatcher.a(8, Byte.valueOf((byte) 0)); - this.datawatcher.a(9, Byte.valueOf((byte) 0)); - this.datawatcher.a(6, Float.valueOf(1.0F)); - } - - protected void aD() { - this.getAttributeMap().b(GenericAttributes.maxHealth); - this.getAttributeMap().b(GenericAttributes.c); - this.getAttributeMap().b(GenericAttributes.d); - if (!this.bk()) { - this.getAttributeInstance(GenericAttributes.d).setValue(0.10000000149011612D); - } - } - - protected void a(double d0, boolean flag) { - if (!this.M()) { - this.N(); - } - - if (flag && this.fallDistance > 0.0F) { - int i = MathHelper.floor(this.locX); - int j = MathHelper.floor(this.locY - 0.20000000298023224D - (double) this.height); - int k = MathHelper.floor(this.locZ); - Block block = this.world.getType(i, j, k); - - if (block.getMaterial() == Material.AIR) { - int l = this.world.getType(i, j - 1, k).b(); - - if (l == 11 || l == 32 || l == 21) { - block = this.world.getType(i, j - 1, k); - } - } else if (!this.world.isStatic && this.fallDistance > 3.0F) { - // CraftBukkit start - supply player as argument in particles for visibility API to work - if (this instanceof EntityPlayer) { - this.world.a((EntityHuman) this, 2006, i, j, k, MathHelper.f(this.fallDistance - 3.0F)); - ((EntityPlayer) this).playerConnection.sendPacket(new PacketPlayOutWorldEvent(2006, i, j, k, MathHelper.f(this.fallDistance - 3.0F), false)); - } else { - this.world.triggerEffect(2006, i, j, k, MathHelper.f(this.fallDistance - 3.0F)); - } - // CraftBukkit end - } - - block.a(this.world, i, j, k, this, this.fallDistance); - } - - super.a(d0, flag); - } - - public boolean aE() { - return false; - } - - public void C() { - this.aC = this.aD; - super.C(); - this.world.methodProfiler.a("livingEntityBaseTick"); - if (this.isAlive() && this.inBlock()) { - this.damageEntity(DamageSource.STUCK, 1.0F); - } - - if (this.isFireproof() || this.world.isStatic) { - this.extinguish(); - } - - boolean flag = this instanceof EntityHuman && ((EntityHuman) this).abilities.isInvulnerable; - - if (this.isAlive() && this.a(Material.WATER)) { - if (!this.aE() && !this.hasEffect(MobEffectList.WATER_BREATHING.id) && !flag) { - this.setAirTicks(this.j(this.getAirTicks())); - if (this.getAirTicks() == -20) { - this.setAirTicks(0); - - for (int i = 0; i < 8; ++i) { - float f = this.random.nextFloat() - this.random.nextFloat(); - float f1 = this.random.nextFloat() - this.random.nextFloat(); - float f2 = this.random.nextFloat() - this.random.nextFloat(); - - this.world.addParticle("bubble", this.locX + (double) f, this.locY + (double) f1, this.locZ + (double) f2, this.motX, this.motY, this.motZ); - } - - this.damageEntity(DamageSource.DROWN, 2.0F); - } - } - - if (!this.world.isStatic && this.am() && this.vehicle instanceof EntityLiving) { - this.mount((Entity) null); - } - } else { - // CraftBukkit start - Only set if needed to work around a DataWatcher inefficiency - if (this.getAirTicks() != 300) { - this.setAirTicks(maxAirTicks); - } - // CraftBukkit end - } - - if (this.isAlive() && this.L()) { - this.extinguish(); - } - - this.aI = this.aJ; - if (this.attackTicks > 0) { - --this.attackTicks; - } - - if (this.hurtTicks > 0) { - --this.hurtTicks; - } - - if (this.noDamageTicks > 0 && !(this instanceof EntityPlayer)) { - --this.noDamageTicks; - } - - if (this.getHealth() <= 0.0F) { - this.aF(); - } - - if (this.lastDamageByPlayerTime > 0) { - --this.lastDamageByPlayerTime; - } else { - this.killer = null; - } - - if (this.bn != null && !this.bn.isAlive()) { - this.bn = null; - } - - if (this.lastDamager != null) { - if (!this.lastDamager.isAlive()) { - this.b((EntityLiving) null); - } else if (this.ticksLived - this.bm > 100) { - this.b((EntityLiving) null); - } - } - - this.aO(); - this.aY = this.aX; - this.aN = this.aM; - this.aP = this.aO; - this.lastYaw = this.yaw; - this.lastPitch = this.pitch; - this.world.methodProfiler.b(); - } - - // CraftBukkit start - public int getExpReward() { - int exp = this.getExpValue(this.killer); - - if (!this.world.isStatic && (this.lastDamageByPlayerTime > 0 || this.alwaysGivesExp()) && this.aG() && this.world.getGameRules().getBoolean("doMobLoot")) { - return exp; - } else { - return 0; - } - } - // CraftBukkit end - - public boolean isBaby() { - return false; - } - - protected void aF() { - ++this.deathTicks; - if (this.deathTicks >= 20 && !this.dead) { // CraftBukkit - (this.deathTicks == 20) -> (this.deathTicks >= 20 && !this.dead) - int i; - - // CraftBukkit start - Update getExpReward() above if the removed if() changes! - i = this.expToDrop; - while (i > 0) { - int j = EntityExperienceOrb.getOrbValue(i); - - i -= j; - this.world.addEntity(new EntityExperienceOrb(this.world, this.locX, this.locY, this.locZ, j)); - } - this.expToDrop = 0; - // CraftBukkit end - - this.die(); - - for (i = 0; i < 20; ++i) { - double d0 = this.random.nextGaussian() * 0.02D; - double d1 = this.random.nextGaussian() * 0.02D; - double d2 = this.random.nextGaussian() * 0.02D; - - this.world.addParticle("explode", this.locX + (double) (this.random.nextFloat() * this.width * 2.0F) - (double) this.width, this.locY + (double) (this.random.nextFloat() * this.length), this.locZ + (double) (this.random.nextFloat() * this.width * 2.0F) - (double) this.width, d0, d1, d2); - } - } - } - - protected boolean aG() { - return !this.isBaby(); - } - - protected int j(int i) { - int j = EnchantmentManager.getOxygenEnchantmentLevel(this); - - return j > 0 && this.random.nextInt(j + 1) > 0 ? i : i - 1; - } - - protected int getExpValue(EntityHuman entityhuman) { - return 0; - } - - protected boolean alwaysGivesExp() { - return false; - } - - public Random aI() { - return this.random; - } - - public EntityLiving getLastDamager() { - return this.lastDamager; - } - - public int aK() { - return this.bm; - } - - public void b(EntityLiving entityliving) { - this.lastDamager = entityliving; - this.bm = this.ticksLived; - } - - public EntityLiving aL() { - return this.bn; - } - - public int aM() { - return this.bo; - } - - public void l(Entity entity) { - if (entity instanceof EntityLiving) { - this.bn = (EntityLiving) entity; - } else { - this.bn = null; - } - - this.bo = this.ticksLived; - } - - public int aN() { - return this.aU; - } - - public void b(NBTTagCompound nbttagcompound) { - nbttagcompound.setFloat("HealF", this.getHealth()); - nbttagcompound.setShort("Health", (short) ((int) Math.ceil((double) this.getHealth()))); - nbttagcompound.setShort("HurtTime", (short) this.hurtTicks); - nbttagcompound.setShort("DeathTime", (short) this.deathTicks); - nbttagcompound.setShort("AttackTime", (short) this.attackTicks); - nbttagcompound.setFloat("AbsorptionAmount", this.getAbsorptionHearts()); - ItemStack[] aitemstack = this.getEquipment(); - int i = aitemstack.length; - - int j; - ItemStack itemstack; - - for (j = 0; j < i; ++j) { - itemstack = aitemstack[j]; - if (itemstack != null) { - this.d.a(itemstack.D()); - } - } - - nbttagcompound.set("Attributes", GenericAttributes.a(this.getAttributeMap())); - aitemstack = this.getEquipment(); - i = aitemstack.length; - - for (j = 0; j < i; ++j) { - itemstack = aitemstack[j]; - if (itemstack != null) { - this.d.b(itemstack.D()); - } - } - - if (!this.effects.isEmpty()) { - NBTTagList nbttaglist = new NBTTagList(); - Iterator iterator = this.effects.values().iterator(); - - while (iterator.hasNext()) { - MobEffect mobeffect = (MobEffect) iterator.next(); - - nbttaglist.add(mobeffect.a(new NBTTagCompound())); - } - - nbttagcompound.set("ActiveEffects", nbttaglist); - } - } - - public void a(NBTTagCompound nbttagcompound) { - this.setAbsorptionHearts(nbttagcompound.getFloat("AbsorptionAmount")); - if (nbttagcompound.hasKeyOfType("Attributes", 9) && this.world != null && !this.world.isStatic) { - GenericAttributes.a(this.getAttributeMap(), nbttagcompound.getList("Attributes", 10)); - } - - if (nbttagcompound.hasKeyOfType("ActiveEffects", 9)) { - NBTTagList nbttaglist = nbttagcompound.getList("ActiveEffects", 10); - - for (int i = 0; i < nbttaglist.size(); ++i) { - NBTTagCompound nbttagcompound1 = nbttaglist.get(i); - MobEffect mobeffect = MobEffect.b(nbttagcompound1); - - if (mobeffect != null) { - this.effects.put(Integer.valueOf(mobeffect.getEffectId()), mobeffect); - } - } - } - - // CraftBukkit start - if (nbttagcompound.hasKey("Bukkit.MaxHealth")) { - NBTBase nbtbase = nbttagcompound.get("Bukkit.MaxHealth"); - if (nbtbase.getTypeId() == 5) { - this.getAttributeInstance(GenericAttributes.maxHealth).setValue((double) ((NBTTagFloat) nbtbase).c()); - } else if (nbtbase.getTypeId() == 3) { - this.getAttributeInstance(GenericAttributes.maxHealth).setValue((double) ((NBTTagInt) nbtbase).d()); - } - } - // CraftBukkit end - - if (nbttagcompound.hasKeyOfType("HealF", 99)) { - this.setHealth(nbttagcompound.getFloat("HealF")); - } else { - NBTBase nbtbase = nbttagcompound.get("Health"); - - if (nbtbase == null) { - this.setHealth(this.getMaxHealth()); - } else if (nbtbase.getTypeId() == 5) { - this.setHealth(((NBTTagFloat) nbtbase).h()); - } else if (nbtbase.getTypeId() == 2) { - this.setHealth((float) ((NBTTagShort) nbtbase).e()); - } - } - - this.hurtTicks = nbttagcompound.getShort("HurtTime"); - this.deathTicks = nbttagcompound.getShort("DeathTime"); - this.attackTicks = nbttagcompound.getShort("AttackTime"); - } - - protected void aO() { - Iterator iterator = this.effects.keySet().iterator(); - - while (iterator.hasNext()) { - Integer integer = (Integer) iterator.next(); - MobEffect mobeffect = (MobEffect) this.effects.get(integer); - - if (!mobeffect.tick(this)) { - if (!this.world.isStatic) { - iterator.remove(); - this.b(mobeffect); - } - } else if (mobeffect.getDuration() % 600 == 0) { - this.a(mobeffect, false); - } - } - - int i; - - if (this.updateEffects) { - if (!this.world.isStatic) { - if (this.effects.isEmpty()) { - this.datawatcher.watch(8, Byte.valueOf((byte) 0)); - this.datawatcher.watch(7, Integer.valueOf(0)); - this.setInvisible(false); - } else { - i = PotionBrewer.a(this.effects.values()); - this.datawatcher.watch(8, Byte.valueOf((byte) (PotionBrewer.b(this.effects.values()) ? 1 : 0))); - this.datawatcher.watch(7, Integer.valueOf(i)); - this.setInvisible(this.hasEffect(MobEffectList.INVISIBILITY.id)); - } - } - - this.updateEffects = false; - } - - i = this.datawatcher.getInt(7); - boolean flag = this.datawatcher.getByte(8) > 0; - - if (i > 0) { - boolean flag1 = false; - - if (!this.isInvisible()) { - flag1 = this.random.nextBoolean(); - } else { - flag1 = this.random.nextInt(15) == 0; - } - - if (flag) { - flag1 &= this.random.nextInt(5) == 0; - } - - if (flag1 && i > 0) { - double d0 = (double) (i >> 16 & 255) / 255.0D; - double d1 = (double) (i >> 8 & 255) / 255.0D; - double d2 = (double) (i >> 0 & 255) / 255.0D; - - this.world.addParticle(flag ? "mobSpellAmbient" : "mobSpell", this.locX + (this.random.nextDouble() - 0.5D) * (double) this.width, this.locY + this.random.nextDouble() * (double) this.length - (double) this.height, this.locZ + (this.random.nextDouble() - 0.5D) * (double) this.width, d0, d1, d2); - } - } - } - - public void removeAllEffects() { - Iterator iterator = this.effects.keySet().iterator(); - - while (iterator.hasNext()) { - Integer integer = (Integer) iterator.next(); - MobEffect mobeffect = (MobEffect) this.effects.get(integer); - - if (!this.world.isStatic) { - iterator.remove(); - this.b(mobeffect); - } - } - } - - public Collection getEffects() { - return this.effects.values(); - } - - public boolean hasEffect(int i) { - // CraftBukkit - Add size check for efficiency - return this.effects.size() != 0 && this.effects.containsKey(Integer.valueOf(i)); - } - - public boolean hasEffect(MobEffectList mobeffectlist) { - // CraftBukkit - Add size check for efficiency - return this.effects.size() != 0 && this.effects.containsKey(Integer.valueOf(mobeffectlist.id)); - } - - public MobEffect getEffect(MobEffectList mobeffectlist) { - return (MobEffect) this.effects.get(Integer.valueOf(mobeffectlist.id)); - } - - public void addEffect(MobEffect mobeffect) { - if (this.d(mobeffect)) { - if (this.effects.containsKey(Integer.valueOf(mobeffect.getEffectId()))) { - ((MobEffect) this.effects.get(Integer.valueOf(mobeffect.getEffectId()))).a(mobeffect); - this.a((MobEffect) this.effects.get(Integer.valueOf(mobeffect.getEffectId())), true); - } else { - this.effects.put(Integer.valueOf(mobeffect.getEffectId()), mobeffect); - this.a(mobeffect); - } - } - } - - public boolean d(MobEffect mobeffect) { - if (this.getMonsterType() == EnumMonsterType.UNDEAD) { - int i = mobeffect.getEffectId(); - - if (i == MobEffectList.REGENERATION.id || i == MobEffectList.POISON.id) { - return false; - } - } - - return true; - } - - public boolean aR() { - return this.getMonsterType() == EnumMonsterType.UNDEAD; - } - - public void removeEffect(int i) { - MobEffect mobeffect = (MobEffect) this.effects.remove(Integer.valueOf(i)); - - if (mobeffect != null) { - this.b(mobeffect); - } - } - - protected void a(MobEffect mobeffect) { - this.updateEffects = true; - if (!this.world.isStatic) { - MobEffectList.byId[mobeffect.getEffectId()].b(this, this.getAttributeMap(), mobeffect.getAmplifier()); - } - } - - protected void a(MobEffect mobeffect, boolean flag) { - this.updateEffects = true; - if (flag && !this.world.isStatic) { - MobEffectList.byId[mobeffect.getEffectId()].a(this, this.getAttributeMap(), mobeffect.getAmplifier()); - MobEffectList.byId[mobeffect.getEffectId()].b(this, this.getAttributeMap(), mobeffect.getAmplifier()); - } - } - - protected void b(MobEffect mobeffect) { - this.updateEffects = true; - if (!this.world.isStatic) { - MobEffectList.byId[mobeffect.getEffectId()].a(this, this.getAttributeMap(), mobeffect.getAmplifier()); - } - } - - // CraftBukkit start - Delegate so we can handle providing a reason for health being regained - public void heal(float f) { - heal(f, EntityRegainHealthEvent.RegainReason.CUSTOM); - } - - public void heal(float f, EntityRegainHealthEvent.RegainReason regainReason) { - float f1 = this.getHealth(); - - if (f1 > 0.0F) { - EntityRegainHealthEvent event = new EntityRegainHealthEvent(this.getBukkitEntity(), f, regainReason); - this.world.getServer().getPluginManager().callEvent(event); - - if (!event.isCancelled()) { - this.setHealth((float) (this.getHealth() + event.getAmount())); - } - } - } - - public final float getHealth() { - // CraftBukkit start - Use unscaled health - if (this instanceof EntityPlayer) { - return (float) ((EntityPlayer) this).getBukkitEntity().getHealth(); - } - // CraftBukkit end - return this.datawatcher.getFloat(6); - } - - public void setHealth(float f) { - // CraftBukkit start - Handle scaled health - if (this instanceof EntityPlayer) { - org.bukkit.craftbukkit.entity.CraftPlayer player = ((EntityPlayer) this).getBukkitEntity(); - // Squeeze - if (f < 0.0F) { - player.setRealHealth(0.0D); - } else if (f > player.getMaxHealth()) { - player.setRealHealth(player.getMaxHealth()); - } else { - player.setRealHealth(f); - } - - this.datawatcher.watch(6, Float.valueOf(player.getScaledHealth())); - return; - } - // CraftBukkit end - this.datawatcher.watch(6, Float.valueOf(MathHelper.a(f, 0.0F, this.getMaxHealth()))); - } - - public boolean damageEntity(DamageSource damagesource, float f) { - if (this.isInvulnerable()) { - return false; - } else if (this.world.isStatic) { - return false; - } else { - this.aU = 0; - if (this.getHealth() <= 0.0F) { - return false; - } else if (damagesource.o() && this.hasEffect(MobEffectList.FIRE_RESISTANCE)) { - return false; - } else { - // CraftBukkit - Moved into d(DamageSource, float) - if (false && (damagesource == DamageSource.ANVIL || damagesource == DamageSource.FALLING_BLOCK) && this.getEquipment(4) != null) { - this.getEquipment(4).damage((int) (f * 4.0F + this.random.nextFloat() * f * 2.0F), this); - f *= 0.75F; - } - - this.aF = 1.5F; - boolean flag = true; - - if ((float) this.noDamageTicks > (float) this.maxNoDamageTicks / 2.0F) { - if (f <= this.lastDamage) { - return false; - } - - // CraftBukkit start - if (!this.d(damagesource, f - this.lastDamage)) { - return false; - } - // CraftBukkit end - this.lastDamage = f; - flag = false; - } else { - // CraftBukkit start - float previousHealth = this.getHealth(); - if (!this.d(damagesource, f)) { - return false; - } - this.lastDamage = f; - this.aw = previousHealth; - this.noDamageTicks = this.maxNoDamageTicks; - // CraftBukkit end - this.hurtTicks = this.ay = 10; - } - - this.az = 0.0F; - Entity entity = damagesource.getEntity(); - - if (entity != null) { - if (entity instanceof EntityLiving) { - this.b((EntityLiving) entity); - } - - if (entity instanceof EntityHuman) { - this.lastDamageByPlayerTime = 100; - this.killer = (EntityHuman) entity; - } else if (entity instanceof EntityWolf) { - EntityWolf entitywolf = (EntityWolf) entity; - - if (entitywolf.isTamed()) { - this.lastDamageByPlayerTime = 100; - this.killer = null; - } - } - } - - if (flag) { - this.world.broadcastEntityEffect(this, (byte) 2); - if (damagesource != DamageSource.DROWN) { - this.Q(); - } - - if (entity != null) { - double d0 = entity.locX - this.locX; - - double d1; - - for (d1 = entity.locZ - this.locZ; d0 * d0 + d1 * d1 < 1.0E-4D; d1 = (Math.random() - Math.random()) * 0.01D) { - d0 = (Math.random() - Math.random()) * 0.01D; - } - - this.az = (float) (Math.atan2(d1, d0) * 180.0D / 3.1415927410125732D) - this.yaw; - this.a(entity, f, d0, d1); - } else { - this.az = (float) ((int) (Math.random() * 2.0D) * 180); - } - } - - String s; - - if (this.getHealth() <= 0.0F) { - s = this.aU(); - if (flag && s != null) { - this.makeSound(s, this.bf(), this.bg()); - } - - this.die(damagesource); - } else { - s = this.aT(); - if (flag && s != null) { - this.makeSound(s, this.bf(), this.bg()); - } - } - - return true; - } - } - } - - public void a(ItemStack itemstack) { - this.makeSound("random.break", 0.8F, 0.8F + this.world.random.nextFloat() * 0.4F); - - for (int i = 0; i < 5; ++i) { - Vec3D vec3d = Vec3D.a(((double) this.random.nextFloat() - 0.5D) * 0.1D, Math.random() * 0.1D + 0.1D, 0.0D); - - vec3d.a(-this.pitch * 3.1415927F / 180.0F); - vec3d.b(-this.yaw * 3.1415927F / 180.0F); - Vec3D vec3d1 = Vec3D.a(((double) this.random.nextFloat() - 0.5D) * 0.3D, (double) (-this.random.nextFloat()) * 0.6D - 0.3D, 0.6D); - - vec3d1.a(-this.pitch * 3.1415927F / 180.0F); - vec3d1.b(-this.yaw * 3.1415927F / 180.0F); - vec3d1 = vec3d1.add(this.locX, this.locY + (double) this.getHeadHeight(), this.locZ); - this.world.addParticle("iconcrack_" + Item.getId(itemstack.getItem()), vec3d1.a, vec3d1.b, vec3d1.c, vec3d.a, vec3d.b + 0.05D, vec3d.c); - } - } - - public void die(DamageSource damagesource) { - Entity entity = damagesource.getEntity(); - EntityLiving entityliving = this.aX(); - - if (this.ba >= 0 && entityliving != null) { - entityliving.b(this, this.ba); - } - - if (entity != null) { - entity.a(this); - } - - this.aT = true; - this.aW().g(); - if (!this.world.isStatic) { - int i = 0; - - if (entity instanceof EntityHuman) { - i = EnchantmentManager.getBonusMonsterLootEnchantmentLevel((EntityLiving) entity); - } - - if (this.aG() && this.world.getGameRules().getBoolean("doMobLoot")) { - this.drops = new ArrayList(); // CraftBukkit - Setup drop capture - - this.dropDeathLoot(this.lastDamageByPlayerTime > 0, i); - this.dropEquipment(this.lastDamageByPlayerTime > 0, i); - if (this.lastDamageByPlayerTime > 0) { - int j = this.random.nextInt(200) - i; - - if (j < 5) { - this.getRareDrop(j <= 0 ? 1 : 0); - } - } - - // CraftBukkit start - Call death event - CraftEventFactory.callEntityDeathEvent(this, this.drops); - this.drops = null; - } else { - CraftEventFactory.callEntityDeathEvent(this); - // CraftBukkit end - } - } - - this.world.broadcastEntityEffect(this, (byte) 3); - } - - protected void dropEquipment(boolean flag, int i) {} - - public void a(Entity entity, float f, double d0, double d1) { - if (this.random.nextDouble() >= this.getAttributeInstance(GenericAttributes.c).getValue()) { - this.al = true; - float f1 = MathHelper.sqrt(d0 * d0 + d1 * d1); - float f2 = 0.4F; - - this.motX /= 2.0D; - this.motY /= 2.0D; - this.motZ /= 2.0D; - this.motX -= d0 / (double) f1 * (double) f2; - this.motY += (double) f2; - this.motZ -= d1 / (double) f1 * (double) f2; - if (this.motY > 0.4000000059604645D) { - this.motY = 0.4000000059604645D; - } - } - } - - protected String aT() { - return "game.neutral.hurt"; - } - - protected String aU() { - return "game.neutral.die"; - } - - protected void getRareDrop(int i) {} - - protected void dropDeathLoot(boolean flag, int i) {} - - public boolean h_() { - int i = MathHelper.floor(this.locX); - int j = MathHelper.floor(this.boundingBox.b); - int k = MathHelper.floor(this.locZ); - Block block = this.world.getType(i, j, k); - - return block == Blocks.LADDER || block == Blocks.VINE; - } - - public boolean isAlive() { - return !this.dead && this.getHealth() > 0.0F; - } - - protected void b(float f) { - super.b(f); - MobEffect mobeffect = this.getEffect(MobEffectList.JUMP); - float f1 = mobeffect != null ? (float) (mobeffect.getAmplifier() + 1) : 0.0F; - int i = MathHelper.f(f - 3.0F - f1); - - if (i > 0) { - // CraftBukkit start - if (!this.damageEntity(DamageSource.FALL, (float) i)) { - return; - } - // CraftBukkit end - this.makeSound(this.o(i), 1.0F, 1.0F); - // this.damageEntity(DamageSource.FALL, (float) i); // CraftBukkit - moved up - int j = MathHelper.floor(this.locX); - int k = MathHelper.floor(this.locY - 0.20000000298023224D - (double) this.height); - int l = MathHelper.floor(this.locZ); - Block block = this.world.getType(j, k, l); - - if (block.getMaterial() != Material.AIR) { - StepSound stepsound = block.stepSound; - - this.makeSound(stepsound.getStepSound(), stepsound.getVolume1() * 0.5F, stepsound.getVolume2() * 0.75F); - } - } - } - - protected String o(int i) { - return i > 4 ? "game.neutral.hurt.fall.big" : "game.neutral.hurt.fall.small"; - } - - public int aV() { - int i = 0; - ItemStack[] aitemstack = this.getEquipment(); - int j = aitemstack.length; - - for (int k = 0; k < j; ++k) { - ItemStack itemstack = aitemstack[k]; - - if (itemstack != null && itemstack.getItem() instanceof ItemArmor) { - int l = ((ItemArmor) itemstack.getItem()).c; - - i += l; - } - } - - return i; - } - - protected void damageArmor(float f) {} - - protected float applyArmorModifier(DamageSource damagesource, float f) { - if (!damagesource.ignoresArmor()) { - int i = 25 - this.aV(); - float f1 = f * (float) i; - - // this.damageArmor(f); // CraftBukkit - Moved into d(DamageSource, float) - f = f1 / 25.0F; - } - - return f; - } - - protected float applyMagicModifier(DamageSource damagesource, float f) { - if (damagesource.isStarvation()) { - return f; - } else { - if (this instanceof EntityZombie) { - f = f; - } - - int i; - int j; - float f1; - - // CraftBukkit - Moved to d(DamageSource, float) - if (false && this.hasEffect(MobEffectList.RESISTANCE) && damagesource != DamageSource.OUT_OF_WORLD) { - i = (this.getEffect(MobEffectList.RESISTANCE).getAmplifier() + 1) * 5; - j = 25 - i; - f1 = f * (float) j; - f = f1 / 25.0F; - } - - if (f <= 0.0F) { - return 0.0F; - } else { - i = EnchantmentManager.a(this.getEquipment(), damagesource); - if (i > 20) { - i = 20; - } - - if (i > 0 && i <= 20) { - j = 25 - i; - f1 = f * (float) j; - f = f1 / 25.0F; - } - - return f; - } - } - } - - // CraftBukkit start - protected boolean d(final DamageSource damagesource, float f) { // void -> boolean, add final - if (!this.isInvulnerable()) { - final boolean human = this instanceof EntityHuman; - float originalDamage = f; - Function hardHat = new Function() { - @Override - public Double apply(Double f) { - if ((damagesource == DamageSource.ANVIL || damagesource == DamageSource.FALLING_BLOCK) && EntityLiving.this.getEquipment(4) != null) { - return -(f - (f * 0.75F)); - } - return -0.0; - } - }; - float hardHatModifier = hardHat.apply((double) f).floatValue(); - f += hardHatModifier; - - Function blocking = new Function() { - @Override - public Double apply(Double f) { - if (human) { - if (!damagesource.ignoresArmor() && ((EntityHuman) EntityLiving.this).isBlocking() && f > 0.0F) { - return -(f - ((1.0F + f) * 0.5F)); - } - } - return -0.0; - } - }; - float blockingModifier = blocking.apply((double) f).floatValue(); - f += blockingModifier; - - Function armor = new Function() { - @Override - public Double apply(Double f) { - return -(f - EntityLiving.this.applyArmorModifier(damagesource, f.floatValue())); - } - }; - float armorModifier = armor.apply((double) f).floatValue(); - f += armorModifier; - - Function resistance = new Function() { - @Override - public Double apply(Double f) { - if (!damagesource.isStarvation() && EntityLiving.this.hasEffect(MobEffectList.RESISTANCE) && damagesource != DamageSource.OUT_OF_WORLD) { - int i = (EntityLiving.this.getEffect(MobEffectList.RESISTANCE).getAmplifier() + 1) * 5; - int j = 25 - i; - float f1 = f.floatValue() * (float) j; - return -(f - (f1 / 25.0F)); - } - return -0.0; - } - }; - float resistanceModifier = resistance.apply((double) f).floatValue(); - f += resistanceModifier; - - Function magic = new Function() { - @Override - public Double apply(Double f) { - return -(f - EntityLiving.this.applyMagicModifier(damagesource, f.floatValue())); - } - }; - float magicModifier = magic.apply((double) f).floatValue(); - f += magicModifier; - - Function absorption = new Function() { - @Override - public Double apply(Double f) { - return -(Math.max(f - Math.max(f - EntityLiving.this.getAbsorptionHearts(), 0.0F), 0.0F)); - } - }; - float absorptionModifier = absorption.apply((double) f).floatValue(); - - EntityDamageEvent event = CraftEventFactory.handleLivingEntityDamageEvent(this, damagesource, originalDamage, hardHatModifier, blockingModifier, armorModifier, resistanceModifier, magicModifier, absorptionModifier, hardHat, blocking, armor, resistance, magic, absorption); - if (event.isCancelled()) { - return false; - } - - f = (float) event.getFinalDamage(); - - // Apply damage to helmet - if ((damagesource == DamageSource.ANVIL || damagesource == DamageSource.FALLING_BLOCK) && this.getEquipment(4) != null) { - this.getEquipment(4).damage((int) (event.getDamage() * 4.0F + this.random.nextFloat() * event.getDamage() * 2.0F), this); - } - - // Apply damage to armor - if (!damagesource.ignoresArmor()) { - float armorDamage = (float) (event.getDamage() + event.getDamage(DamageModifier.BLOCKING) + event.getDamage(DamageModifier.HARD_HAT)); - this.damageArmor(armorDamage); - } - - absorptionModifier = (float) -event.getDamage(DamageModifier.ABSORPTION); - this.setAbsorptionHearts(Math.max(this.getAbsorptionHearts() - absorptionModifier, 0.0F)); - if (f != 0.0F) { - if (human) { - ((EntityHuman) this).applyExhaustion(damagesource.getExhaustionCost()); - } - // CraftBukkit end - float f2 = this.getHealth(); - - this.setHealth(f2 - f); - this.aW().a(damagesource, f2, f); - // CraftBukkit start - if (human) { - return true; - } - // CraftBukkit end - this.setAbsorptionHearts(this.getAbsorptionHearts() - f); - } - return true; // CraftBukkit - } - return false; // CraftBukkit - } - - public CombatTracker aW() { - return this.combatTracker; - } - - public EntityLiving aX() { - return (EntityLiving) (this.combatTracker.c() != null ? this.combatTracker.c() : (this.killer != null ? this.killer : (this.lastDamager != null ? this.lastDamager : null))); - } - - public final float getMaxHealth() { - return (float) this.getAttributeInstance(GenericAttributes.maxHealth).getValue(); - } - - public final int aZ() { - return this.datawatcher.getByte(9); - } - - public final void p(int i) { - this.datawatcher.watch(9, Byte.valueOf((byte) i)); - } - - private int j() { - return this.hasEffect(MobEffectList.FASTER_DIG) ? 6 - (1 + this.getEffect(MobEffectList.FASTER_DIG).getAmplifier()) * 1 : (this.hasEffect(MobEffectList.SLOWER_DIG) ? 6 + (1 + this.getEffect(MobEffectList.SLOWER_DIG).getAmplifier()) * 2 : 6); - } - - public void ba() { - if (!this.at || this.au >= this.j() / 2 || this.au < 0) { - this.au = -1; - this.at = true; - if (this.world instanceof WorldServer) { - ((WorldServer) this.world).getTracker().a((Entity) this, (Packet) (new PacketPlayOutAnimation(this, 0))); - } - } - } - - protected void G() { - this.damageEntity(DamageSource.OUT_OF_WORLD, 4.0F); - } - - protected void bb() { - int i = this.j(); - - if (this.at) { - ++this.au; - if (this.au >= i) { - this.au = 0; - this.at = false; - } - } else { - this.au = 0; - } - - this.aD = (float) this.au / (float) i; - } - - public AttributeInstance getAttributeInstance(IAttribute iattribute) { - return this.getAttributeMap().a(iattribute); - } - - public AttributeMapBase getAttributeMap() { - if (this.d == null) { - this.d = new AttributeMapServer(); - } - - return this.d; - } - - public EnumMonsterType getMonsterType() { - return EnumMonsterType.UNDEFINED; - } - - public abstract ItemStack be(); - - public abstract ItemStack getEquipment(int i); - - public abstract void setEquipment(int i, ItemStack itemstack); - - public void setSprinting(boolean flag) { - super.setSprinting(flag); - AttributeInstance attributeinstance = this.getAttributeInstance(GenericAttributes.d); - - if (attributeinstance.a(b) != null) { - attributeinstance.b(c); - } - - if (flag) { - attributeinstance.a(c); - } - } - - public abstract ItemStack[] getEquipment(); - - protected float bf() { - return 1.0F; - } - - protected float bg() { - return this.isBaby() ? (this.random.nextFloat() - this.random.nextFloat()) * 0.2F + 1.5F : (this.random.nextFloat() - this.random.nextFloat()) * 0.2F + 1.0F; - } - - protected boolean bh() { - return this.getHealth() <= 0.0F; - } - - public void enderTeleportTo(double d0, double d1, double d2) { - this.setPositionRotation(d0, d1, d2, this.yaw, this.pitch); - } - - public void m(Entity entity) { - double d0 = entity.locX; - double d1 = entity.boundingBox.b + (double) entity.length; - double d2 = entity.locZ; - byte b0 = 1; - - for (int i = -b0; i <= b0; ++i) { - for (int j = -b0; j < b0; ++j) { - if (i != 0 || j != 0) { - int k = (int) (this.locX + (double) i); - int l = (int) (this.locZ + (double) j); - AxisAlignedBB axisalignedbb = this.boundingBox.c((double) i, 1.0D, (double) j); - - if (this.world.a(axisalignedbb).isEmpty()) { - if (World.a((IBlockAccess) this.world, k, (int) this.locY, l)) { - this.enderTeleportTo(this.locX + (double) i, this.locY + 1.0D, this.locZ + (double) j); - return; - } - - if (World.a((IBlockAccess) this.world, k, (int) this.locY - 1, l) || this.world.getType(k, (int) this.locY - 1, l).getMaterial() == Material.WATER) { - d0 = this.locX + (double) i; - d1 = this.locY + 1.0D; - d2 = this.locZ + (double) j; - } - } - } - } - } - - this.enderTeleportTo(d0, d1, d2); - } - - protected void bj() { - this.motY = 0.41999998688697815D; - if (this.hasEffect(MobEffectList.JUMP)) { - this.motY += (double) ((float) (this.getEffect(MobEffectList.JUMP).getAmplifier() + 1) * 0.1F); - } - - if (this.isSprinting()) { - float f = this.yaw * 0.017453292F; - - this.motX -= (double) (MathHelper.sin(f) * 0.2F); - this.motZ += (double) (MathHelper.cos(f) * 0.2F); - } - - this.al = true; - } - - public void e(float f, float f1) { - double d0; - - if (this.M() && (!(this instanceof EntityHuman) || !((EntityHuman) this).abilities.isFlying)) { - d0 = this.locY; - this.a(f, f1, this.bk() ? 0.04F : 0.02F); - this.move(this.motX, this.motY, this.motZ); - this.motX *= 0.800000011920929D; - this.motY *= 0.800000011920929D; - this.motZ *= 0.800000011920929D; - this.motY -= 0.02D; - if (this.positionChanged && this.c(this.motX, this.motY + 0.6000000238418579D - this.locY + d0, this.motZ)) { - this.motY = 0.30000001192092896D; - } - } else if (this.P() && (!(this instanceof EntityHuman) || !((EntityHuman) this).abilities.isFlying)) { - d0 = this.locY; - this.a(f, f1, 0.02F); - this.move(this.motX, this.motY, this.motZ); - this.motX *= 0.5D; - this.motY *= 0.5D; - this.motZ *= 0.5D; - this.motY -= 0.02D; - if (this.positionChanged && this.c(this.motX, this.motY + 0.6000000238418579D - this.locY + d0, this.motZ)) { - this.motY = 0.30000001192092896D; - } - } else { - float f2 = 0.91F; - - if (this.onGround) { - f2 = this.world.getType(MathHelper.floor(this.locX), MathHelper.floor(this.boundingBox.b) - 1, MathHelper.floor(this.locZ)).frictionFactor * 0.91F; - } - - float f3 = 0.16277136F / (f2 * f2 * f2); - float f4; - - if (this.onGround) { - f4 = this.bl() * f3; - } else { - f4 = this.aQ; - } - - this.a(f, f1, f4); - f2 = 0.91F; - if (this.onGround) { - f2 = this.world.getType(MathHelper.floor(this.locX), MathHelper.floor(this.boundingBox.b) - 1, MathHelper.floor(this.locZ)).frictionFactor * 0.91F; - } - - if (this.h_()) { - float f5 = 0.15F; - - if (this.motX < (double) (-f5)) { - this.motX = (double) (-f5); - } - - if (this.motX > (double) f5) { - this.motX = (double) f5; - } - - if (this.motZ < (double) (-f5)) { - this.motZ = (double) (-f5); - } - - if (this.motZ > (double) f5) { - this.motZ = (double) f5; - } - - this.fallDistance = 0.0F; - if (this.motY < -0.15D) { - this.motY = -0.15D; - } - - boolean flag = this.isSneaking() && this instanceof EntityHuman; - - if (flag && this.motY < 0.0D) { - this.motY = 0.0D; - } - } - - this.move(this.motX, this.motY, this.motZ); - if (this.positionChanged && this.h_()) { - this.motY = 0.2D; - } - - if (this.world.isStatic && (!this.world.isLoaded((int) this.locX, 0, (int) this.locZ) || !this.world.getChunkAtWorldCoords((int) this.locX, (int) this.locZ).d)) { - if (this.locY > 0.0D) { - this.motY = -0.1D; - } else { - this.motY = 0.0D; - } - } else { - this.motY -= 0.08D; - } - - this.motY *= 0.9800000190734863D; - this.motX *= (double) f2; - this.motZ *= (double) f2; - } - - this.aE = this.aF; - d0 = this.locX - this.lastX; - double d1 = this.locZ - this.lastZ; - float f6 = MathHelper.sqrt(d0 * d0 + d1 * d1) * 4.0F; - - if (f6 > 1.0F) { - f6 = 1.0F; - } - - this.aF += (f6 - this.aF) * 0.4F; - this.aG += this.aF; - } - - protected boolean bk() { - return false; - } - - public float bl() { - return this.bk() ? this.bp : 0.1F; - } - - public void i(float f) { - this.bp = f; - } - - public boolean n(Entity entity) { - this.l(entity); - return false; - } - - public boolean isSleeping() { - return false; - } - - public void h() { - super.h(); - if (!this.world.isStatic) { - int i = this.aZ(); - - if (i > 0) { - if (this.av <= 0) { - this.av = 20 * (30 - i); - } - - --this.av; - if (this.av <= 0) { - this.p(i - 1); - } - } - - for (int j = 0; j < 5; ++j) { - ItemStack itemstack = this.g[j]; - ItemStack itemstack1 = this.getEquipment(j); - - if (!ItemStack.matches(itemstack1, itemstack)) { - ((WorldServer) this.world).getTracker().a((Entity) this, (Packet) (new PacketPlayOutEntityEquipment(this.getId(), j, itemstack1))); - if (itemstack != null) { - this.d.a(itemstack.D()); - } - - if (itemstack1 != null) { - this.d.b(itemstack1.D()); - } - - this.g[j] = itemstack1 == null ? null : itemstack1.cloneItemStack(); - } - } - - if (this.ticksLived % 20 == 0) { - this.aW().g(); - } - } - - this.e(); - double d0 = this.locX - this.lastX; - double d1 = this.locZ - this.lastZ; - float f = (float) (d0 * d0 + d1 * d1); - float f1 = this.aM; - float f2 = 0.0F; - - this.aV = this.aW; - float f3 = 0.0F; - - if (f > 0.0025000002F) { - f3 = 1.0F; - f2 = (float) Math.sqrt((double) f) * 3.0F; - // CraftBukkit - Math -> TrigMath - f1 = (float) org.bukkit.craftbukkit.TrigMath.atan2(d1, d0) * 180.0F / 3.1415927F - 90.0F; - } - - if (this.aD > 0.0F) { - f1 = this.yaw; - } - - if (!this.onGround) { - f3 = 0.0F; - } - - this.aW += (f3 - this.aW) * 0.3F; - this.world.methodProfiler.a("headTurn"); - f2 = this.f(f1, f2); - this.world.methodProfiler.b(); - this.world.methodProfiler.a("rangeChecks"); - - while (this.yaw - this.lastYaw < -180.0F) { - this.lastYaw -= 360.0F; - } - - while (this.yaw - this.lastYaw >= 180.0F) { - this.lastYaw += 360.0F; - } - - while (this.aM - this.aN < -180.0F) { - this.aN -= 360.0F; - } - - while (this.aM - this.aN >= 180.0F) { - this.aN += 360.0F; - } - - while (this.pitch - this.lastPitch < -180.0F) { - this.lastPitch -= 360.0F; - } - - while (this.pitch - this.lastPitch >= 180.0F) { - this.lastPitch += 360.0F; - } - - while (this.aO - this.aP < -180.0F) { - this.aP -= 360.0F; - } - - while (this.aO - this.aP >= 180.0F) { - this.aP += 360.0F; - } - - this.world.methodProfiler.b(); - this.aX += f2; - } - - protected float f(float f, float f1) { - float f2 = MathHelper.g(f - this.aM); - - this.aM += f2 * 0.3F; - float f3 = MathHelper.g(this.yaw - this.aM); - boolean flag = f3 < -90.0F || f3 >= 90.0F; - - if (f3 < -75.0F) { - f3 = -75.0F; - } - - if (f3 >= 75.0F) { - f3 = 75.0F; - } - - this.aM = this.yaw - f3; - if (f3 * f3 > 2500.0F) { - this.aM += f3 * 0.2F; - } - - if (flag) { - f1 *= -1.0F; - } - - return f1; - } - - public void e() { - if (this.bq > 0) { - --this.bq; - } - - if (this.bg > 0) { - double d0 = this.locX + (this.bh - this.locX) / (double) this.bg; - double d1 = this.locY + (this.bi - this.locY) / (double) this.bg; - double d2 = this.locZ + (this.bj - this.locZ) / (double) this.bg; - double d3 = MathHelper.g(this.bk - (double) this.yaw); - - this.yaw = (float) ((double) this.yaw + d3 / (double) this.bg); - this.pitch = (float) ((double) this.pitch + (this.bl - (double) this.pitch) / (double) this.bg); - --this.bg; - this.setPosition(d0, d1, d2); - this.b(this.yaw, this.pitch); - } else if (!this.br()) { - this.motX *= 0.98D; - this.motY *= 0.98D; - this.motZ *= 0.98D; - } - - if (Math.abs(this.motX) < 0.005D) { - this.motX = 0.0D; - } - - if (Math.abs(this.motY) < 0.005D) { - this.motY = 0.0D; - } - - if (Math.abs(this.motZ) < 0.005D) { - this.motZ = 0.0D; - } - - this.world.methodProfiler.a("ai"); - if (this.bh()) { - this.bc = false; - this.bd = 0.0F; - this.be = 0.0F; - this.bf = 0.0F; - } else if (this.br()) { - if (this.bk()) { - this.world.methodProfiler.a("newAi"); - this.bn(); - this.world.methodProfiler.b(); - } else { - this.world.methodProfiler.a("oldAi"); - this.bq(); - this.world.methodProfiler.b(); - this.aO = this.yaw; - } - } - - this.world.methodProfiler.b(); - this.world.methodProfiler.a("jump"); - if (this.bc) { - if (!this.M() && !this.P()) { - if (this.onGround && this.bq == 0) { - this.bj(); - this.bq = 10; - } - } else { - this.motY += 0.03999999910593033D; - } - } else { - this.bq = 0; - } - - this.world.methodProfiler.b(); - this.world.methodProfiler.a("travel"); - this.bd *= 0.98F; - this.be *= 0.98F; - this.bf *= 0.9F; - this.e(this.bd, this.be); - this.world.methodProfiler.b(); - this.world.methodProfiler.a("push"); - if (!this.world.isStatic) { - this.bo(); - } - - this.world.methodProfiler.b(); - } - - protected void bn() {} - - protected void bo() { - List list = this.world.getEntities(this, this.boundingBox.grow(0.20000000298023224D, 0.0D, 0.20000000298023224D)); - - if (list != null && !list.isEmpty()) { - for (int i = 0; i < list.size(); ++i) { - Entity entity = (Entity) list.get(i); - - // TODO better check now? - // CraftBukkit start - Only handle mob (non-player) collisions every other tick - if (entity instanceof EntityLiving && !(this instanceof EntityPlayer) && this.ticksLived % 2 == 0) { - continue; - } - // CraftBukkit end - - if (entity.S()) { - this.o(entity); - } - } - } - } - - protected void o(Entity entity) { - entity.collide(this); - } - - public void ab() { - super.ab(); - this.aV = this.aW; - this.aW = 0.0F; - this.fallDistance = 0.0F; - } - - protected void bp() {} - - protected void bq() { - ++this.aU; - } - - public void f(boolean flag) { - this.bc = flag; - } - - public void receive(Entity entity, int i) { - if (!entity.dead && !this.world.isStatic) { - EntityTracker entitytracker = ((WorldServer) this.world).getTracker(); - - if (entity instanceof EntityItem) { - entitytracker.a(entity, (Packet) (new PacketPlayOutCollect(entity.getId(), this.getId()))); - } - - if (entity instanceof EntityArrow) { - entitytracker.a(entity, (Packet) (new PacketPlayOutCollect(entity.getId(), this.getId()))); - } - - if (entity instanceof EntityExperienceOrb) { - entitytracker.a(entity, (Packet) (new PacketPlayOutCollect(entity.getId(), this.getId()))); - } - } - } - - public boolean hasLineOfSight(Entity entity) { - return this.world.a(Vec3D.a(this.locX, this.locY + (double) this.getHeadHeight(), this.locZ), Vec3D.a(entity.locX, entity.locY + (double) entity.getHeadHeight(), entity.locZ)) == null; - } - - public Vec3D ag() { - return this.j(1.0F); - } - - public Vec3D j(float f) { - float f1; - float f2; - float f3; - float f4; - - if (f == 1.0F) { - f1 = MathHelper.cos(-this.yaw * 0.017453292F - 3.1415927F); - f2 = MathHelper.sin(-this.yaw * 0.017453292F - 3.1415927F); - f3 = -MathHelper.cos(-this.pitch * 0.017453292F); - f4 = MathHelper.sin(-this.pitch * 0.017453292F); - return Vec3D.a((double) (f2 * f3), (double) f4, (double) (f1 * f3)); - } else { - f1 = this.lastPitch + (this.pitch - this.lastPitch) * f; - f2 = this.lastYaw + (this.yaw - this.lastYaw) * f; - f3 = MathHelper.cos(-f2 * 0.017453292F - 3.1415927F); - f4 = MathHelper.sin(-f2 * 0.017453292F - 3.1415927F); - float f5 = -MathHelper.cos(-f1 * 0.017453292F); - float f6 = MathHelper.sin(-f1 * 0.017453292F); - - return Vec3D.a((double) (f4 * f5), (double) f6, (double) (f3 * f5)); - } - } - - public boolean br() { - return !this.world.isStatic; - } - - public boolean R() { - return !this.dead; - } - - public boolean S() { - return !this.dead; - } - - public float getHeadHeight() { - return this.length * 0.85F; - } - - protected void Q() { - this.velocityChanged = this.random.nextDouble() >= this.getAttributeInstance(GenericAttributes.c).getValue(); - } - - public float getHeadRotation() { - return this.aO; - } - - public float getAbsorptionHearts() { - return this.br; - } - - public void setAbsorptionHearts(float f) { - if (f < 0.0F) { - f = 0.0F; - } - - this.br = f; - } - - public ScoreboardTeamBase getScoreboardTeam() { - return null; - } - - public boolean c(EntityLiving entityliving) { - return this.a(entityliving.getScoreboardTeam()); - } - - public boolean a(ScoreboardTeamBase scoreboardteambase) { - return this.getScoreboardTeam() != null ? this.getScoreboardTeam().isAlly(scoreboardteambase) : false; - } - - public void bu() {} - - public void bv() {} -} diff --git a/src/main/java/net/minecraft/server/EntityMinecartAbstract.java b/src/main/java/net/minecraft/server/EntityMinecartAbstract.java deleted file mode 100644 index f1ccd3a9dd..0000000000 --- a/src/main/java/net/minecraft/server/EntityMinecartAbstract.java +++ /dev/null @@ -1,882 +0,0 @@ -package net.minecraft.server; - -import java.util.List; - -// CraftBukkit start -import org.bukkit.Location; -import org.bukkit.entity.Vehicle; -import org.bukkit.event.vehicle.VehicleDamageEvent; -import org.bukkit.event.vehicle.VehicleDestroyEvent; -import org.bukkit.event.vehicle.VehicleEntityCollisionEvent; -import org.bukkit.util.Vector; -// CraftBukkit end - -public abstract class EntityMinecartAbstract extends Entity { - - private boolean a; - private String b; - 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 d; - private double e; - private double f; - private double g; - private double h; - private double i; - - // CraftBukkit start - public boolean slowWhenEmpty = true; - private double derailedX = 0.5; - private double derailedY = 0.5; - private double derailedZ = 0.5; - private double flyingX = 0.95; - private double flyingY = 0.95; - private double flyingZ = 0.95; - public double maxSpeed = 0.4D; - // CraftBukkit end - - public EntityMinecartAbstract(World world) { - super(world); - this.k = true; - this.a(0.98F, 0.7F); - this.height = this.length / 2.0F; - } - - public static EntityMinecartAbstract a(World world, double d0, double d1, double d2, int i) { - switch (i) { - case 1: - return new EntityMinecartChest(world, d0, d1, d2); - - case 2: - return new EntityMinecartFurnace(world, d0, d1, d2); - - case 3: - return new EntityMinecartTNT(world, d0, d1, d2); - - case 4: - return new EntityMinecartMobSpawner(world, d0, d1, d2); - - case 5: - return new EntityMinecartHopper(world, d0, d1, d2); - - case 6: - return new EntityMinecartCommandBlock(world, d0, d1, d2); - - default: - return new EntityMinecartRideable(world, d0, d1, d2); - } - } - - protected boolean g_() { - return false; - } - - protected void c() { - this.datawatcher.a(17, new Integer(0)); - this.datawatcher.a(18, new Integer(1)); - this.datawatcher.a(19, new Float(0.0F)); - this.datawatcher.a(20, new Integer(0)); - this.datawatcher.a(21, new Integer(6)); - this.datawatcher.a(22, Byte.valueOf((byte) 0)); - } - - public AxisAlignedBB h(Entity entity) { - return entity.S() ? entity.boundingBox : null; - } - - public AxisAlignedBB J() { - return null; - } - - public boolean S() { - return true; - } - - public EntityMinecartAbstract(World world, double d0, double d1, double d2) { - this(world); - this.setPosition(d0, d1, d2); - this.motX = 0.0D; - this.motY = 0.0D; - this.motZ = 0.0D; - this.lastX = d0; - this.lastY = d1; - this.lastZ = d2; - - this.world.getServer().getPluginManager().callEvent(new org.bukkit.event.vehicle.VehicleCreateEvent((Vehicle) this.getBukkitEntity())); // CraftBukkit - } - - public double ae() { - return (double) this.length * 0.0D - 0.30000001192092896D; - } - - public boolean damageEntity(DamageSource damagesource, float f) { - if (!this.world.isStatic && !this.dead) { - if (this.isInvulnerable()) { - return false; - } else { - // CraftBukkit start - fire VehicleDamageEvent - Vehicle vehicle = (Vehicle) this.getBukkitEntity(); - org.bukkit.entity.Entity passenger = (damagesource.getEntity() == null) ? null : damagesource.getEntity().getBukkitEntity(); - - VehicleDamageEvent event = new VehicleDamageEvent(vehicle, passenger, f); - this.world.getServer().getPluginManager().callEvent(event); - - if (event.isCancelled()) { - return true; - } - - f = (float) event.getDamage(); - // CraftBukkit end - - this.j(-this.l()); - this.c(10); - this.Q(); - this.setDamage(this.getDamage() + f * 10.0F); - boolean flag = damagesource.getEntity() instanceof EntityHuman && ((EntityHuman) damagesource.getEntity()).abilities.canInstantlyBuild; - - if (flag || this.getDamage() > 40.0F) { - if (this.passenger != null) { - this.passenger.mount(this); - } - - // CraftBukkit start - VehicleDestroyEvent destroyEvent = new VehicleDestroyEvent(vehicle, passenger); - this.world.getServer().getPluginManager().callEvent(destroyEvent); - - if (destroyEvent.isCancelled()) { - this.setDamage(40); // Maximize damage so this doesn't get triggered again right away - return true; - } - // CraftBukkit end - - if (flag && !this.k_()) { - this.die(); - } else { - this.a(damagesource); - } - } - - return true; - } - } else { - return true; - } - } - - public void a(DamageSource damagesource) { - this.die(); - ItemStack itemstack = new ItemStack(Items.MINECART, 1); - - if (this.b != null) { - itemstack.c(this.b); - } - - this.a(itemstack, 0.0F); - } - - public boolean R() { - return !this.dead; - } - - public void die() { - super.die(); - } - - public void h() { - // CraftBukkit start - double prevX = this.locX; - double prevY = this.locY; - double prevZ = this.locZ; - float prevYaw = this.yaw; - float prevPitch = this.pitch; - // CraftBukkit end - - if (this.getType() > 0) { - this.c(this.getType() - 1); - } - - if (this.getDamage() > 0.0F) { - this.setDamage(this.getDamage() - 1.0F); - } - - if (this.locY < -64.0D) { - this.G(); - } - - int i; - - if (!this.world.isStatic && this.world instanceof WorldServer) { - this.world.methodProfiler.a("portal"); - MinecraftServer minecraftserver = ((WorldServer) this.world).getMinecraftServer(); - - i = this.D(); - if (this.an) { - if (true || minecraftserver.getAllowNether()) { // CraftBukkit - multi-world should still allow teleport even if default vanilla nether disabled - if (this.vehicle == null && this.ao++ >= i) { - this.ao = i; - this.portalCooldown = this.ai(); - byte b0; - - if (this.world.worldProvider.dimension == -1) { - b0 = 0; - } else { - b0 = -1; - } - - this.b(b0); - } - - this.an = false; - } - } else { - if (this.ao > 0) { - this.ao -= 4; - } - - if (this.ao < 0) { - this.ao = 0; - } - } - - if (this.portalCooldown > 0) { - --this.portalCooldown; - } - - this.world.methodProfiler.b(); - } - - if (this.world.isStatic) { - if (this.d > 0) { - double d0 = this.locX + (this.e - this.locX) / (double) this.d; - double d1 = this.locY + (this.f - this.locY) / (double) this.d; - double d2 = this.locZ + (this.g - this.locZ) / (double) this.d; - double d3 = MathHelper.g(this.h - (double) this.yaw); - - this.yaw = (float) ((double) this.yaw + d3 / (double) this.d); - this.pitch = (float) ((double) this.pitch + (this.i - (double) this.pitch) / (double) this.d); - --this.d; - this.setPosition(d0, d1, d2); - this.b(this.yaw, this.pitch); - } else { - this.setPosition(this.locX, this.locY, this.locZ); - this.b(this.yaw, this.pitch); - } - } else { - this.lastX = this.locX; - this.lastY = this.locY; - this.lastZ = this.locZ; - this.motY -= 0.03999999910593033D; - int j = MathHelper.floor(this.locX); - - i = MathHelper.floor(this.locY); - int k = MathHelper.floor(this.locZ); - - if (BlockMinecartTrackAbstract.b_(this.world, j, i - 1, k)) { - --i; - } - - double d4 = this.maxSpeed; // CraftBukkit - double d5 = 0.0078125D; - Block block = this.world.getType(j, i, k); - - if (BlockMinecartTrackAbstract.a(block)) { - int l = this.world.getData(j, i, k); - - this.a(j, i, k, d4, d5, block, l); - if (block == Blocks.ACTIVATOR_RAIL) { - this.a(j, i, k, (l & 8) != 0); - } - } else { - this.b(d4); - } - - this.I(); - this.pitch = 0.0F; - double d6 = this.lastX - this.locX; - double d7 = this.lastZ - this.locZ; - - if (d6 * d6 + d7 * d7 > 0.001D) { - this.yaw = (float) (Math.atan2(d7, d6) * 180.0D / 3.141592653589793D); - if (this.a) { - this.yaw += 180.0F; - } - } - - double d8 = (double) MathHelper.g(this.yaw - this.lastYaw); - - if (d8 < -170.0D || d8 >= 170.0D) { - this.yaw += 180.0F; - this.a = !this.a; - } - - this.b(this.yaw, this.pitch); - - // CraftBukkit start - org.bukkit.World bworld = this.world.getWorld(); - Location from = new Location(bworld, prevX, prevY, prevZ, prevYaw, prevPitch); - Location to = new Location(bworld, this.locX, this.locY, this.locZ, this.yaw, this.pitch); - Vehicle vehicle = (Vehicle) this.getBukkitEntity(); - - this.world.getServer().getPluginManager().callEvent(new org.bukkit.event.vehicle.VehicleUpdateEvent(vehicle)); - - if (!from.equals(to)) { - this.world.getServer().getPluginManager().callEvent(new org.bukkit.event.vehicle.VehicleMoveEvent(vehicle, from, to)); - } - // CraftBukkit end - - List list = this.world.getEntities(this, this.boundingBox.grow(0.20000000298023224D, 0.0D, 0.20000000298023224D)); - - if (list != null && !list.isEmpty()) { - for (int i1 = 0; i1 < list.size(); ++i1) { - Entity entity = (Entity) list.get(i1); - - if (entity != this.passenger && entity.S() && entity instanceof EntityMinecartAbstract) { - entity.collide(this); - } - } - } - - if (this.passenger != null && this.passenger.dead) { - if (this.passenger.vehicle == this) { - this.passenger.vehicle = null; - } - - this.passenger = null; - } - } - } - - public void a(int i, int j, int k, boolean flag) {} - - protected void b(double d0) { - if (this.motX < -d0) { - this.motX = -d0; - } - - if (this.motX > d0) { - this.motX = d0; - } - - if (this.motZ < -d0) { - this.motZ = -d0; - } - - if (this.motZ > d0) { - this.motZ = d0; - } - - if (this.onGround) { - // CraftBukkit start - replace magic numbers with our variables - this.motX *= this.derailedX; - this.motY *= this.derailedY; - this.motZ *= this.derailedZ; - // CraftBukkit end - } - - this.move(this.motX, this.motY, this.motZ); - if (!this.onGround) { - // CraftBukkit start - replace magic numbers with our variables - this.motX *= this.flyingX; - this.motY *= this.flyingY; - this.motZ *= this.flyingZ; - // CraftBukkit end - } - } - - protected void a(int i, int j, int k, double d0, double d1, Block block, int l) { - this.fallDistance = 0.0F; - Vec3D vec3d = this.a(this.locX, this.locY, this.locZ); - - this.locY = (double) j; - boolean flag = false; - boolean flag1 = false; - - if (block == Blocks.GOLDEN_RAIL) { - flag = (l & 8) != 0; - flag1 = !flag; - } - - if (((BlockMinecartTrackAbstract) block).e()) { - l &= 7; - } - - if (l >= 2 && l <= 5) { - this.locY = (double) (j + 1); - } - - if (l == 2) { - this.motX -= d1; - } - - if (l == 3) { - this.motX += d1; - } - - if (l == 4) { - this.motZ += d1; - } - - if (l == 5) { - this.motZ -= d1; - } - - int[][] aint = matrix[l]; - double d2 = (double) (aint[1][0] - aint[0][0]); - double d3 = (double) (aint[1][2] - aint[0][2]); - double d4 = Math.sqrt(d2 * d2 + d3 * d3); - double d5 = this.motX * d2 + this.motZ * d3; - - if (d5 < 0.0D) { - d2 = -d2; - d3 = -d3; - } - - double d6 = Math.sqrt(this.motX * this.motX + this.motZ * this.motZ); - - if (d6 > 2.0D) { - d6 = 2.0D; - } - - this.motX = d6 * d2 / d4; - this.motZ = d6 * d3 / d4; - double d7; - double d8; - double d9; - double d10; - - if (this.passenger != null && this.passenger instanceof EntityLiving) { - d7 = (double) ((EntityLiving) this.passenger).be; - if (d7 > 0.0D) { - d8 = -Math.sin((double) (this.passenger.yaw * 3.1415927F / 180.0F)); - d9 = Math.cos((double) (this.passenger.yaw * 3.1415927F / 180.0F)); - d10 = this.motX * this.motX + this.motZ * this.motZ; - if (d10 < 0.01D) { - this.motX += d8 * 0.1D; - this.motZ += d9 * 0.1D; - flag1 = false; - } - } - } - - if (flag1) { - d7 = Math.sqrt(this.motX * this.motX + this.motZ * this.motZ); - if (d7 < 0.03D) { - this.motX *= 0.0D; - this.motY *= 0.0D; - this.motZ *= 0.0D; - } else { - this.motX *= 0.5D; - this.motY *= 0.0D; - this.motZ *= 0.5D; - } - } - - d7 = 0.0D; - d8 = (double) i + 0.5D + (double) aint[0][0] * 0.5D; - d9 = (double) k + 0.5D + (double) aint[0][2] * 0.5D; - d10 = (double) i + 0.5D + (double) aint[1][0] * 0.5D; - double d11 = (double) k + 0.5D + (double) aint[1][2] * 0.5D; - - d2 = d10 - d8; - d3 = d11 - d9; - double d12; - double d13; - - if (d2 == 0.0D) { - this.locX = (double) i + 0.5D; - d7 = this.locZ - (double) k; - } else if (d3 == 0.0D) { - this.locZ = (double) k + 0.5D; - d7 = this.locX - (double) i; - } else { - d12 = this.locX - d8; - d13 = this.locZ - d9; - d7 = (d12 * d2 + d13 * d3) * 2.0D; - } - - this.locX = d8 + d2 * d7; - this.locZ = d9 + d3 * d7; - this.setPosition(this.locX, this.locY + (double) this.height, this.locZ); - d12 = this.motX; - d13 = this.motZ; - if (this.passenger != null) { - d12 *= 0.75D; - d13 *= 0.75D; - } - - if (d12 < -d0) { - d12 = -d0; - } - - if (d12 > d0) { - d12 = d0; - } - - if (d13 < -d0) { - d13 = -d0; - } - - if (d13 > d0) { - d13 = d0; - } - - this.move(d12, 0.0D, d13); - if (aint[0][1] != 0 && MathHelper.floor(this.locX) - i == 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]) { - this.setPosition(this.locX, this.locY + (double) aint[1][1], this.locZ); - } - - this.i(); - Vec3D vec3d1 = this.a(this.locX, this.locY, this.locZ); - - if (vec3d1 != null && vec3d != null) { - double d14 = (vec3d.b - vec3d1.b) * 0.05D; - - d6 = Math.sqrt(this.motX * this.motX + this.motZ * this.motZ); - if (d6 > 0.0D) { - this.motX = this.motX / d6 * (d6 + d14); - this.motZ = this.motZ / d6 * (d6 + d14); - } - - this.setPosition(this.locX, vec3d1.b, this.locZ); - } - - int i1 = MathHelper.floor(this.locX); - int j1 = MathHelper.floor(this.locZ); - - if (i1 != i || j1 != k) { - d6 = Math.sqrt(this.motX * this.motX + this.motZ * this.motZ); - this.motX = d6 * (double) (i1 - i); - this.motZ = d6 * (double) (j1 - k); - } - - if (flag) { - double d15 = Math.sqrt(this.motX * this.motX + this.motZ * this.motZ); - - if (d15 > 0.01D) { - double d16 = 0.06D; - - this.motX += this.motX / d15 * d16; - this.motZ += this.motZ / d15 * d16; - } else if (l == 1) { - if (this.world.getType(i - 1, j, k).r()) { - this.motX = 0.02D; - } else if (this.world.getType(i + 1, j, k).r()) { - this.motX = -0.02D; - } - } else if (l == 0) { - if (this.world.getType(i, j, k - 1).r()) { - this.motZ = 0.02D; - } else if (this.world.getType(i, j, k + 1).r()) { - this.motZ = -0.02D; - } - } - } - } - - protected void i() { - if (this.passenger != null || !this.slowWhenEmpty) { // CraftBukkit - add !this.slowWhenEmpty - this.motX *= 0.996999979019165D; - this.motY *= 0.0D; - this.motZ *= 0.996999979019165D; - } else { - this.motX *= 0.9599999785423279D; - this.motY *= 0.0D; - this.motZ *= 0.9599999785423279D; - } - } - - public Vec3D a(double d0, double d1, double d2) { - int i = MathHelper.floor(d0); - int j = MathHelper.floor(d1); - int k = MathHelper.floor(d2); - - if (BlockMinecartTrackAbstract.b_(this.world, i, j - 1, k)) { - --j; - } - - Block block = this.world.getType(i, j, k); - - if (BlockMinecartTrackAbstract.a(block)) { - int l = this.world.getData(i, j, k); - - d1 = (double) j; - if (((BlockMinecartTrackAbstract) block).e()) { - l &= 7; - } - - if (l >= 2 && l <= 5) { - d1 = (double) (j + 1); - } - - int[][] aint = matrix[l]; - double d3 = 0.0D; - double d4 = (double) i + 0.5D + (double) aint[0][0] * 0.5D; - double d5 = (double) j + 0.5D + (double) aint[0][1] * 0.5D; - double d6 = (double) k + 0.5D + (double) aint[0][2] * 0.5D; - double d7 = (double) i + 0.5D + (double) aint[1][0] * 0.5D; - double d8 = (double) j + 0.5D + (double) aint[1][1] * 0.5D; - double d9 = (double) k + 0.5D + (double) aint[1][2] * 0.5D; - double d10 = d7 - d4; - double d11 = (d8 - d5) * 2.0D; - double d12 = d9 - d6; - - if (d10 == 0.0D) { - d0 = (double) i + 0.5D; - d3 = d2 - (double) k; - } else if (d12 == 0.0D) { - d2 = (double) k + 0.5D; - d3 = d0 - (double) i; - } else { - double d13 = d0 - d4; - double d14 = d2 - d6; - - d3 = (d13 * d10 + d14 * d12) * 2.0D; - } - - d0 = d4 + d10 * d3; - d1 = d5 + d11 * d3; - d2 = d6 + d12 * d3; - if (d11 < 0.0D) { - ++d1; - } - - if (d11 > 0.0D) { - d1 += 0.5D; - } - - return Vec3D.a(d0, d1, d2); - } else { - return null; - } - } - - protected void a(NBTTagCompound nbttagcompound) { - if (nbttagcompound.getBoolean("CustomDisplayTile")) { - this.k(nbttagcompound.getInt("DisplayTile")); - this.l(nbttagcompound.getInt("DisplayData")); - this.m(nbttagcompound.getInt("DisplayOffset")); - } - - if (nbttagcompound.hasKeyOfType("CustomName", 8) && nbttagcompound.getString("CustomName").length() > 0) { - this.b = nbttagcompound.getString("CustomName"); - } - } - - protected void b(NBTTagCompound nbttagcompound) { - if (this.t()) { - nbttagcompound.setBoolean("CustomDisplayTile", true); - nbttagcompound.setInt("DisplayTile", this.n().getMaterial() == Material.AIR ? 0 : Block.getId(this.n())); - nbttagcompound.setInt("DisplayData", this.p()); - nbttagcompound.setInt("DisplayOffset", this.r()); - } - - if (this.b != null && this.b.length() > 0) { - nbttagcompound.setString("CustomName", this.b); - } - } - - public void collide(Entity entity) { - if (!this.world.isStatic) { - if (entity != this.passenger) { - // CraftBukkit start - Vehicle vehicle = (Vehicle) this.getBukkitEntity(); - org.bukkit.entity.Entity hitEntity = (entity == null) ? null : entity.getBukkitEntity(); - - VehicleEntityCollisionEvent collisionEvent = new VehicleEntityCollisionEvent(vehicle, hitEntity); - this.world.getServer().getPluginManager().callEvent(collisionEvent); - - if (collisionEvent.isCancelled()) { - return; - } - // CraftBukkit end - - if (entity instanceof EntityLiving && !(entity instanceof EntityHuman) && !(entity instanceof EntityIronGolem) && this.m() == 0 && this.motX * this.motX + this.motZ * this.motZ > 0.01D && this.passenger == null && entity.vehicle == null) { - entity.mount(this); - } - - double d0 = entity.locX - this.locX; - double d1 = entity.locZ - this.locZ; - double d2 = d0 * d0 + d1 * d1; - - // CraftBukkit - collision - if (d2 >= 9.999999747378752E-5D && !collisionEvent.isCollisionCancelled()) { - d2 = (double) MathHelper.sqrt(d2); - d0 /= d2; - d1 /= d2; - double d3 = 1.0D / d2; - - if (d3 > 1.0D) { - d3 = 1.0D; - } - - d0 *= d3; - d1 *= d3; - d0 *= 0.10000000149011612D; - d1 *= 0.10000000149011612D; - d0 *= (double) (1.0F - this.Y); - d1 *= (double) (1.0F - this.Y); - d0 *= 0.5D; - d1 *= 0.5D; - if (entity instanceof EntityMinecartAbstract) { - double d4 = entity.locX - this.locX; - double d5 = entity.locZ - this.locZ; - Vec3D vec3d = Vec3D.a(d4, 0.0D, d5).a(); - Vec3D vec3d1 = Vec3D.a((double) MathHelper.cos(this.yaw * 3.1415927F / 180.0F), 0.0D, (double) MathHelper.sin(this.yaw * 3.1415927F / 180.0F)).a(); - double d6 = Math.abs(vec3d.b(vec3d1)); - - if (d6 < 0.800000011920929D) { - return; - } - - double d7 = entity.motX + this.motX; - double d8 = entity.motZ + this.motZ; - - if (((EntityMinecartAbstract) entity).m() == 2 && this.m() != 2) { - this.motX *= 0.20000000298023224D; - this.motZ *= 0.20000000298023224D; - this.g(entity.motX - d0, 0.0D, entity.motZ - d1); - entity.motX *= 0.949999988079071D; - entity.motZ *= 0.949999988079071D; - } else if (((EntityMinecartAbstract) entity).m() != 2 && this.m() == 2) { - entity.motX *= 0.20000000298023224D; - entity.motZ *= 0.20000000298023224D; - entity.g(this.motX + d0, 0.0D, this.motZ + d1); - this.motX *= 0.949999988079071D; - this.motZ *= 0.949999988079071D; - } else { - d7 /= 2.0D; - d8 /= 2.0D; - this.motX *= 0.20000000298023224D; - this.motZ *= 0.20000000298023224D; - this.g(d7 - d0, 0.0D, d8 - d1); - entity.motX *= 0.20000000298023224D; - entity.motZ *= 0.20000000298023224D; - entity.g(d7 + d0, 0.0D, d8 + d1); - } - } else { - this.g(-d0, 0.0D, -d1); - entity.g(d0 / 4.0D, 0.0D, d1 / 4.0D); - } - } - } - } - } - - public void setDamage(float f) { - this.datawatcher.watch(19, Float.valueOf(f)); - } - - public float getDamage() { - return this.datawatcher.getFloat(19); - } - - public void c(int i) { - this.datawatcher.watch(17, Integer.valueOf(i)); - } - - public int getType() { - return this.datawatcher.getInt(17); - } - - public void j(int i) { - this.datawatcher.watch(18, Integer.valueOf(i)); - } - - public int l() { - return this.datawatcher.getInt(18); - } - - public abstract int m(); - - public Block n() { - if (!this.t()) { - return this.o(); - } else { - int i = this.getDataWatcher().getInt(20) & '\uffff'; - - return Block.getById(i); - } - } - - public Block o() { - return Blocks.AIR; - } - - public int p() { - return !this.t() ? this.q() : this.getDataWatcher().getInt(20) >> 16; - } - - public int q() { - return 0; - } - - public int r() { - return !this.t() ? this.s() : this.getDataWatcher().getInt(21); - } - - public int s() { - return 6; - } - - public void k(int i) { - this.getDataWatcher().watch(20, Integer.valueOf(i & '\uffff' | this.p() << 16)); - this.a(true); - } - - public void l(int i) { - this.getDataWatcher().watch(20, Integer.valueOf(Block.getId(this.n()) & '\uffff' | i << 16)); - this.a(true); - } - - public void m(int i) { - this.getDataWatcher().watch(21, Integer.valueOf(i)); - this.a(true); - } - - public boolean t() { - return this.getDataWatcher().getByte(22) == 1; - } - - public void a(boolean flag) { - this.getDataWatcher().watch(22, Byte.valueOf((byte) (flag ? 1 : 0))); - } - - public void a(String s) { - this.b = s; - } - - public String getName() { - return this.b != null ? this.b : super.getName(); - } - - public boolean k_() { - return this.b != null; - } - - public String u() { - return this.b; - } - - // CraftBukkit start - Methods for getting and setting flying and derailed velocity modifiers - public Vector getFlyingVelocityMod() { - return new Vector(flyingX, flyingY, flyingZ); - } - - public void setFlyingVelocityMod(Vector flying) { - flyingX = flying.getX(); - flyingY = flying.getY(); - flyingZ = flying.getZ(); - } - - public Vector getDerailedVelocityMod() { - return new Vector(derailedX, derailedY, derailedZ); - } - - public void setDerailedVelocityMod(Vector derailed) { - derailedX = derailed.getX(); - derailedY = derailed.getY(); - derailedZ = derailed.getZ(); - } - // CraftBukkit end -} diff --git a/src/main/java/net/minecraft/server/EntityMinecartCommandBlockListener.java b/src/main/java/net/minecraft/server/EntityMinecartCommandBlockListener.java deleted file mode 100644 index 5b452856e1..0000000000 --- a/src/main/java/net/minecraft/server/EntityMinecartCommandBlockListener.java +++ /dev/null @@ -1,25 +0,0 @@ -package net.minecraft.server; - -// CraftBukkit - package-private -> public -public class EntityMinecartCommandBlockListener extends CommandBlockListenerAbstract { - - final EntityMinecartCommandBlock a; - - EntityMinecartCommandBlockListener(EntityMinecartCommandBlock entityminecartcommandblock) { - this.a = entityminecartcommandblock; - this.sender = (org.bukkit.craftbukkit.entity.CraftMinecartCommand) entityminecartcommandblock.getBukkitEntity(); // CraftBukkit - Set the sender - } - - public void e() { - this.a.getDataWatcher().watch(23, this.getCommand()); - this.a.getDataWatcher().watch(24, ChatSerializer.a(this.h())); - } - - public ChunkCoordinates getChunkCoordinates() { - return new ChunkCoordinates(MathHelper.floor(this.a.locX), MathHelper.floor(this.a.locY + 0.5D), MathHelper.floor(this.a.locZ)); - } - - public World getWorld() { - return this.a.world; - } -} diff --git a/src/main/java/net/minecraft/server/EntityMinecartContainer.java b/src/main/java/net/minecraft/server/EntityMinecartContainer.java deleted file mode 100644 index 13b75ff80b..0000000000 --- a/src/main/java/net/minecraft/server/EntityMinecartContainer.java +++ /dev/null @@ -1,243 +0,0 @@ -package net.minecraft.server; - -// CraftBukkit start -import java.util.List; - -import org.bukkit.craftbukkit.entity.CraftHumanEntity; -import org.bukkit.entity.HumanEntity; -import org.bukkit.inventory.InventoryHolder; -// CraftBukkit end - -public abstract class EntityMinecartContainer extends EntityMinecartAbstract implements IInventory { - - private ItemStack[] items = new ItemStack[27]; // CraftBukkit - 36 -> 27 - private boolean b = true; - - // CraftBukkit start - public List transaction = new java.util.ArrayList(); - private int maxStack = MAX_STACK; - - public ItemStack[] getContents() { - return this.items; - } - - public void onOpen(CraftHumanEntity who) { - transaction.add(who); - } - - public void onClose(CraftHumanEntity who) { - transaction.remove(who); - } - - public List getViewers() { - return transaction; - } - - public InventoryHolder getOwner() { - org.bukkit.entity.Entity cart = getBukkitEntity(); - if(cart instanceof InventoryHolder) return (InventoryHolder) cart; - return null; - } - - public void setMaxStackSize(int size) { - maxStack = size; - } - // CraftBukkit end - - public EntityMinecartContainer(World world) { - super(world); - } - - public EntityMinecartContainer(World world, double d0, double d1, double d2) { - super(world, d0, d1, d2); - } - - public void a(DamageSource damagesource) { - super.a(damagesource); - - for (int i = 0; i < this.getSize(); ++i) { - ItemStack itemstack = this.getItem(i); - - if (itemstack != null) { - float f = this.random.nextFloat() * 0.8F + 0.1F; - float f1 = this.random.nextFloat() * 0.8F + 0.1F; - float f2 = this.random.nextFloat() * 0.8F + 0.1F; - - while (itemstack.count > 0) { - int j = this.random.nextInt(21) + 10; - - if (j > itemstack.count) { - j = itemstack.count; - } - - itemstack.count -= j; - EntityItem entityitem = new EntityItem(this.world, this.locX + (double) f, this.locY + (double) f1, this.locZ + (double) f2, new ItemStack(itemstack.getItem(), j, itemstack.getData())); - float f3 = 0.05F; - - entityitem.motX = (double) ((float) this.random.nextGaussian() * f3); - entityitem.motY = (double) ((float) this.random.nextGaussian() * f3 + 0.2F); - entityitem.motZ = (double) ((float) this.random.nextGaussian() * f3); - this.world.addEntity(entityitem); - } - } - } - } - - public ItemStack getItem(int i) { - return this.items[i]; - } - - public ItemStack splitStack(int i, int j) { - if (this.items[i] != null) { - ItemStack itemstack; - - if (this.items[i].count <= j) { - itemstack = this.items[i]; - this.items[i] = null; - return itemstack; - } else { - itemstack = this.items[i].a(j); - if (this.items[i].count == 0) { - this.items[i] = null; - } - - return itemstack; - } - } else { - return null; - } - } - - public ItemStack splitWithoutUpdate(int i) { - if (this.items[i] != null) { - ItemStack itemstack = this.items[i]; - - this.items[i] = null; - return itemstack; - } else { - return null; - } - } - - public void setItem(int i, ItemStack itemstack) { - this.items[i] = itemstack; - if (itemstack != null && itemstack.count > this.getMaxStackSize()) { - itemstack.count = this.getMaxStackSize(); - } - } - - public void update() {} - - public boolean a(EntityHuman entityhuman) { - return this.dead ? false : entityhuman.f(this) <= 64.0D; - } - - public void startOpen() {} - - public void closeContainer() {} - - public boolean b(int i, ItemStack itemstack) { - return true; - } - - public String getInventoryName() { - return this.k_() ? this.u() : "container.minecart"; - } - - public int getMaxStackSize() { - return maxStack; // CraftBukkit - } - - public void b(int i) { - this.b = false; - super.b(i); - } - - public void die() { - if (this.b) { - for (int i = 0; i < this.getSize(); ++i) { - ItemStack itemstack = this.getItem(i); - - if (itemstack != null) { - float f = this.random.nextFloat() * 0.8F + 0.1F; - float f1 = this.random.nextFloat() * 0.8F + 0.1F; - float f2 = this.random.nextFloat() * 0.8F + 0.1F; - - while (itemstack.count > 0) { - int j = this.random.nextInt(21) + 10; - - if (j > itemstack.count) { - j = itemstack.count; - } - - itemstack.count -= j; - EntityItem entityitem = new EntityItem(this.world, this.locX + (double) f, this.locY + (double) f1, this.locZ + (double) f2, new ItemStack(itemstack.getItem(), j, itemstack.getData())); - - if (itemstack.hasTag()) { - entityitem.getItemStack().setTag((NBTTagCompound) itemstack.getTag().clone()); - } - - float f3 = 0.05F; - - entityitem.motX = (double) ((float) this.random.nextGaussian() * f3); - entityitem.motY = (double) ((float) this.random.nextGaussian() * f3 + 0.2F); - entityitem.motZ = (double) ((float) this.random.nextGaussian() * f3); - this.world.addEntity(entityitem); - } - } - } - } - - super.die(); - } - - protected void b(NBTTagCompound nbttagcompound) { - super.b(nbttagcompound); - NBTTagList nbttaglist = new NBTTagList(); - - for (int i = 0; i < this.items.length; ++i) { - if (this.items[i] != null) { - NBTTagCompound nbttagcompound1 = new NBTTagCompound(); - - nbttagcompound1.setByte("Slot", (byte) i); - this.items[i].save(nbttagcompound1); - nbttaglist.add(nbttagcompound1); - } - } - - nbttagcompound.set("Items", nbttaglist); - } - - protected void a(NBTTagCompound nbttagcompound) { - super.a(nbttagcompound); - NBTTagList nbttaglist = nbttagcompound.getList("Items", 10); - - this.items = new ItemStack[this.getSize()]; - - for (int i = 0; i < nbttaglist.size(); ++i) { - NBTTagCompound nbttagcompound1 = nbttaglist.get(i); - int j = nbttagcompound1.getByte("Slot") & 255; - - if (j >= 0 && j < this.items.length) { - this.items[j] = ItemStack.createStack(nbttagcompound1); - } - } - } - - public boolean c(EntityHuman entityhuman) { - if (!this.world.isStatic) { - entityhuman.openContainer(this); - } - - return true; - } - - protected void i() { - int i = 15 - Container.b((IInventory) this); - float f = 0.98F + (float) i * 0.001F; - - this.motX *= (double) f; - this.motY *= 0.0D; - this.motZ *= (double) f; - } -} diff --git a/src/main/java/net/minecraft/server/EntityMonster.java b/src/main/java/net/minecraft/server/EntityMonster.java deleted file mode 100644 index 49aef649c5..0000000000 --- a/src/main/java/net/minecraft/server/EntityMonster.java +++ /dev/null @@ -1,177 +0,0 @@ -package net.minecraft.server; - -import org.bukkit.event.entity.EntityCombustByEntityEvent; -import org.bukkit.event.entity.EntityTargetEvent; // CraftBukkit - -public abstract class EntityMonster extends EntityCreature implements IMonster { - - public EntityMonster(World world) { - super(world); - this.b = 5; - } - - public void e() { - this.bb(); - float f = this.d(1.0F); - - if (f > 0.5F) { - this.aU += 2; - } - - super.e(); - } - - public void h() { - super.h(); - if (!this.world.isStatic && this.world.difficulty == EnumDifficulty.PEACEFUL) { - this.die(); - } - } - - protected String H() { - return "game.hostile.swim"; - } - - protected String O() { - return "game.hostile.swim.splash"; - } - - protected Entity findTarget() { - EntityHuman entityhuman = this.world.findNearbyVulnerablePlayer(this, 16.0D); - - return entityhuman != null && this.hasLineOfSight(entityhuman) ? entityhuman : null; - } - - public boolean damageEntity(DamageSource damagesource, float f) { - if (this.isInvulnerable()) { - return false; - } else if (super.damageEntity(damagesource, f)) { - Entity entity = damagesource.getEntity(); - - if (this.passenger != entity && this.vehicle != entity) { - if (entity != this) { - // CraftBukkit start - We still need to call events for entities without goals - if (entity != this.target && (this instanceof EntityBlaze || this instanceof EntityEnderman || this instanceof EntitySpider || this instanceof EntityGiantZombie || this instanceof EntitySilverfish)) { - EntityTargetEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callEntityTargetEvent(this, entity, EntityTargetEvent.TargetReason.TARGET_ATTACKED_ENTITY); - - if (!event.isCancelled()) { - if (event.getTarget() == null) { - this.target = null; - } else { - this.target = ((org.bukkit.craftbukkit.entity.CraftEntity) event.getTarget()).getHandle(); - } - } - } else { - this.target = entity; - } - // CraftBukkit end - } - - return true; - } else { - return true; - } - } else { - return false; - } - } - - protected String aT() { - return "game.hostile.hurt"; - } - - protected String aU() { - return "game.hostile.die"; - } - - protected String o(int i) { - return i > 4 ? "game.hostile.hurt.fall.big" : "game.hostile.hurt.fall.small"; - } - - public boolean n(Entity entity) { - float f = (float) this.getAttributeInstance(GenericAttributes.e).getValue(); - int i = 0; - - if (entity instanceof EntityLiving) { - f += EnchantmentManager.a((EntityLiving) this, (EntityLiving) entity); - i += EnchantmentManager.getKnockbackEnchantmentLevel(this, (EntityLiving) entity); - } - - boolean flag = entity.damageEntity(DamageSource.mobAttack(this), f); - - if (flag) { - if (i > 0) { - entity.g((double) (-MathHelper.sin(this.yaw * 3.1415927F / 180.0F) * (float) i * 0.5F), 0.1D, (double) (MathHelper.cos(this.yaw * 3.1415927F / 180.0F) * (float) i * 0.5F)); - this.motX *= 0.6D; - this.motZ *= 0.6D; - } - - int j = EnchantmentManager.getFireAspectEnchantmentLevel(this); - - if (j > 0) { - // CraftBukkit start - Call a combust event when somebody hits with a fire enchanted item - EntityCombustByEntityEvent combustEvent = new EntityCombustByEntityEvent(this.getBukkitEntity(), entity.getBukkitEntity(), j * 4); - org.bukkit.Bukkit.getPluginManager().callEvent(combustEvent); - - if (!combustEvent.isCancelled()) { - entity.setOnFire(combustEvent.getDuration()); - } - // CraftBukkit end - } - - if (entity instanceof EntityLiving) { - EnchantmentManager.a((EntityLiving) entity, (Entity) this); - } - - EnchantmentManager.b(this, entity); - } - - return flag; - } - - protected void a(Entity entity, float f) { - if (this.attackTicks <= 0 && f < 2.0F && entity.boundingBox.e > this.boundingBox.b && entity.boundingBox.b < this.boundingBox.e) { - this.attackTicks = 20; - this.n(entity); - } - } - - public float a(int i, int j, int k) { - return 0.5F - this.world.n(i, j, k); - } - - protected boolean j_() { - int i = MathHelper.floor(this.locX); - int j = MathHelper.floor(this.boundingBox.b); - int k = MathHelper.floor(this.locZ); - - if (this.world.b(EnumSkyBlock.SKY, i, j, k) > this.random.nextInt(32)) { - return false; - } else { - int l = this.world.getLightLevel(i, j, k); - - if (this.world.P()) { - int i1 = this.world.j; - - this.world.j = 10; - l = this.world.getLightLevel(i, j, k); - this.world.j = i1; - } - - return l <= this.random.nextInt(8); - } - } - - public boolean canSpawn() { - return this.world.difficulty != EnumDifficulty.PEACEFUL && this.j_() && super.canSpawn(); - } - - protected void aD() { - super.aD(); - this.getAttributeMap().b(GenericAttributes.e); - } - - protected boolean aG() { - return true; - } -} diff --git a/src/main/java/net/minecraft/server/EntityMushroomCow.java b/src/main/java/net/minecraft/server/EntityMushroomCow.java deleted file mode 100644 index b4e430611a..0000000000 --- a/src/main/java/net/minecraft/server/EntityMushroomCow.java +++ /dev/null @@ -1,72 +0,0 @@ -package net.minecraft.server; - -import org.bukkit.event.player.PlayerShearEntityEvent; // CraftBukkit - -public class EntityMushroomCow extends EntityCow { - - public EntityMushroomCow(World world) { - super(world); - this.a(0.9F, 1.3F); - } - - public boolean a(EntityHuman entityhuman) { - ItemStack itemstack = entityhuman.inventory.getItemInHand(); - - if (itemstack != null && itemstack.getItem() == Items.BOWL && this.getAge() >= 0) { - if (itemstack.count == 1) { - entityhuman.inventory.setItem(entityhuman.inventory.itemInHandIndex, new ItemStack(Items.MUSHROOM_SOUP)); - return true; - } - - if (entityhuman.inventory.pickup(new ItemStack(Items.MUSHROOM_SOUP)) && !entityhuman.abilities.canInstantlyBuild) { - entityhuman.inventory.splitStack(entityhuman.inventory.itemInHandIndex, 1); - return true; - } - } - - if (itemstack != null && itemstack.getItem() == Items.SHEARS && this.getAge() >= 0) { - // CraftBukkit start - PlayerShearEntityEvent event = new PlayerShearEntityEvent((org.bukkit.entity.Player) entityhuman.getBukkitEntity(), this.getBukkitEntity()); - this.world.getServer().getPluginManager().callEvent(event); - - if (event.isCancelled()) { - return false; - } - // CraftBukkit end - - this.die(); - this.world.addParticle("largeexplode", this.locX, this.locY + (double) (this.length / 2.0F), this.locZ, 0.0D, 0.0D, 0.0D); - if (!this.world.isStatic) { - EntityCow entitycow = new EntityCow(this.world); - - entitycow.setPositionRotation(this.locX, this.locY, this.locZ, this.yaw, this.pitch); - entitycow.setHealth(this.getHealth()); - entitycow.aM = this.aM; - this.world.addEntity(entitycow); - - for (int i = 0; i < 5; ++i) { - this.world.addEntity(new EntityItem(this.world, this.locX, this.locY + (double) this.length, this.locZ, new ItemStack(Blocks.RED_MUSHROOM))); - } - - itemstack.damage(1, entityhuman); - this.makeSound("mob.sheep.shear", 1.0F, 1.0F); - } - - return true; - } else { - return super.a(entityhuman); - } - } - - public EntityMushroomCow c(EntityAgeable entityageable) { - return new EntityMushroomCow(this.world); - } - - public EntityCow b(EntityAgeable entityageable) { - return this.c(entityageable); - } - - public EntityAgeable createChild(EntityAgeable entityageable) { - return this.c(entityageable); - } -} diff --git a/src/main/java/net/minecraft/server/EntityOcelot.java b/src/main/java/net/minecraft/server/EntityOcelot.java deleted file mode 100644 index aba3748985..0000000000 --- a/src/main/java/net/minecraft/server/EntityOcelot.java +++ /dev/null @@ -1,232 +0,0 @@ -package net.minecraft.server; - -public class EntityOcelot extends EntityTameableAnimal { - - private PathfinderGoalTempt bq; - - public EntityOcelot(World world) { - super(world); - this.a(0.6F, 0.8F); - this.getNavigation().a(true); - this.goalSelector.a(1, new PathfinderGoalFloat(this)); - this.goalSelector.a(2, this.bp); - this.goalSelector.a(3, this.bq = new PathfinderGoalTempt(this, 0.6D, Items.RAW_FISH, true)); - this.goalSelector.a(4, new PathfinderGoalAvoidPlayer(this, EntityHuman.class, 16.0F, 0.8D, 1.33D)); - this.goalSelector.a(5, new PathfinderGoalFollowOwner(this, 1.0D, 10.0F, 5.0F)); - this.goalSelector.a(6, new PathfinderGoalJumpOnBlock(this, 1.33D)); - this.goalSelector.a(7, new PathfinderGoalLeapAtTarget(this, 0.3F)); - this.goalSelector.a(8, new PathfinderGoalOcelotAttack(this)); - this.goalSelector.a(9, new PathfinderGoalBreed(this, 0.8D)); - this.goalSelector.a(10, new PathfinderGoalRandomStroll(this, 0.8D)); - this.goalSelector.a(11, new PathfinderGoalLookAtPlayer(this, EntityHuman.class, 10.0F)); - this.targetSelector.a(1, new PathfinderGoalRandomTargetNonTamed(this, EntityChicken.class, 750, false)); - } - - protected void c() { - super.c(); - this.datawatcher.a(18, Byte.valueOf((byte) 0)); - } - - public void bp() { - if (this.getControllerMove().a()) { - double d0 = this.getControllerMove().b(); - - if (d0 == 0.6D) { - this.setSneaking(true); - this.setSprinting(false); - } else if (d0 == 1.33D) { - this.setSneaking(false); - this.setSprinting(true); - } else { - this.setSneaking(false); - this.setSprinting(false); - } - } else { - this.setSneaking(false); - this.setSprinting(false); - } - } - - protected boolean isTypeNotPersistent() { - return !this.isTamed() /*&& this.ticksLived > 2400*/; // CraftBukkit - } - - public boolean bk() { - return true; - } - - protected void aD() { - super.aD(); - this.getAttributeInstance(GenericAttributes.maxHealth).setValue(10.0D); - this.getAttributeInstance(GenericAttributes.d).setValue(0.30000001192092896D); - } - - protected void b(float f) {} - - public void b(NBTTagCompound nbttagcompound) { - super.b(nbttagcompound); - nbttagcompound.setInt("CatType", this.getCatType()); - } - - public void a(NBTTagCompound nbttagcompound) { - super.a(nbttagcompound); - this.setCatType(nbttagcompound.getInt("CatType")); - } - - protected String t() { - return this.isTamed() ? (this.ce() ? "mob.cat.purr" : (this.random.nextInt(4) == 0 ? "mob.cat.purreow" : "mob.cat.meow")) : ""; - } - - protected String aT() { - return "mob.cat.hitt"; - } - - protected String aU() { - return "mob.cat.hitt"; - } - - protected float bf() { - return 0.4F; - } - - protected Item getLoot() { - return Items.LEATHER; - } - - public boolean n(Entity entity) { - return entity.damageEntity(DamageSource.mobAttack(this), 3.0F); - } - - public boolean damageEntity(DamageSource damagesource, float f) { - if (this.isInvulnerable()) { - return false; - } else { - this.bp.setSitting(false); - return super.damageEntity(damagesource, f); - } - } - - protected void dropDeathLoot(boolean flag, int i) {} - - public boolean a(EntityHuman entityhuman) { - ItemStack itemstack = entityhuman.inventory.getItemInHand(); - - if (this.isTamed()) { - if (this.e(entityhuman) && !this.world.isStatic && !this.c(itemstack)) { - this.bp.setSitting(!this.isSitting()); - } - } else if (this.bq.f() && itemstack != null && itemstack.getItem() == Items.RAW_FISH && entityhuman.f(this) < 9.0D) { - if (!entityhuman.abilities.canInstantlyBuild) { - --itemstack.count; - } - - if (itemstack.count <= 0) { - entityhuman.inventory.setItem(entityhuman.inventory.itemInHandIndex, (ItemStack) null); - } - - if (!this.world.isStatic) { - // CraftBukkit - added event call and isCancelled check - if (this.random.nextInt(3) == 0 && !org.bukkit.craftbukkit.event.CraftEventFactory.callEntityTameEvent(this, entityhuman).isCancelled()) { - this.setTamed(true); - this.setCatType(1 + this.world.random.nextInt(3)); - this.setOwnerUUID(entityhuman.getUniqueID().toString()); - this.i(true); - this.bp.setSitting(true); - this.world.broadcastEntityEffect(this, (byte) 7); - } else { - this.i(false); - this.world.broadcastEntityEffect(this, (byte) 6); - } - } - - return true; - } - - return super.a(entityhuman); - } - - public EntityOcelot b(EntityAgeable entityageable) { - EntityOcelot entityocelot = new EntityOcelot(this.world); - - if (this.isTamed()) { - entityocelot.setOwnerUUID(this.getOwnerUUID()); - entityocelot.setTamed(true); - entityocelot.setCatType(this.getCatType()); - } - - return entityocelot; - } - - public boolean c(ItemStack itemstack) { - return itemstack != null && itemstack.getItem() == Items.RAW_FISH; - } - - public boolean mate(EntityAnimal entityanimal) { - if (entityanimal == this) { - return false; - } else if (!this.isTamed()) { - return false; - } else if (!(entityanimal instanceof EntityOcelot)) { - return false; - } else { - EntityOcelot entityocelot = (EntityOcelot) entityanimal; - - return !entityocelot.isTamed() ? false : this.ce() && entityocelot.ce(); - } - } - - public int getCatType() { - return this.datawatcher.getByte(18); - } - - public void setCatType(int i) { - this.datawatcher.watch(18, Byte.valueOf((byte) i)); - } - - public boolean canSpawn() { - if (this.world.random.nextInt(3) == 0) { - return false; - } else { - if (this.world.b(this.boundingBox) && this.world.getCubes(this, this.boundingBox).isEmpty() && !this.world.containsLiquid(this.boundingBox)) { - int i = MathHelper.floor(this.locX); - int j = MathHelper.floor(this.boundingBox.b); - int k = MathHelper.floor(this.locZ); - - if (j < 63) { - return false; - } - - Block block = this.world.getType(i, j - 1, k); - - if (block == Blocks.GRASS || block.getMaterial() == Material.LEAVES) { - return true; - } - } - - return false; - } - } - - public String getName() { - return this.hasCustomName() ? this.getCustomName() : (this.isTamed() ? LocaleI18n.get("entity.Cat.name") : super.getName()); - } - - public GroupDataEntity prepare(GroupDataEntity groupdataentity) { - groupdataentity = super.prepare(groupdataentity); - if (this.world.random.nextInt(7) == 0) { - for (int i = 0; i < 2; ++i) { - EntityOcelot entityocelot = new EntityOcelot(this.world); - - entityocelot.setPositionRotation(this.locX, this.locY, this.locZ, this.yaw, 0.0F); - entityocelot.setAge(-24000); - this.world.addEntity(entityocelot, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.OCELOT_BABY); // CraftBukkit - add SpawnReason - } - } - - return groupdataentity; - } - - public EntityAgeable createChild(EntityAgeable entityageable) { - return this.b(entityageable); - } -} diff --git a/src/main/java/net/minecraft/server/EntityPainting.java b/src/main/java/net/minecraft/server/EntityPainting.java deleted file mode 100644 index 2c3a233dbd..0000000000 --- a/src/main/java/net/minecraft/server/EntityPainting.java +++ /dev/null @@ -1,81 +0,0 @@ -package net.minecraft.server; - -import java.util.ArrayList; - -public class EntityPainting extends EntityHanging { - - public EnumArt art; - - public EntityPainting(World world) { - super(world); - this.art = EnumArt.values()[this.random.nextInt(EnumArt.values().length)]; // CraftBukkit - generate a non-null painting - } - - public EntityPainting(World world, int i, int j, int k, int l) { - super(world, i, j, k, l); - ArrayList arraylist = new ArrayList(); - EnumArt[] aenumart = EnumArt.values(); - int i1 = aenumart.length; - - for (int j1 = 0; j1 < i1; ++j1) { - EnumArt enumart = aenumart[j1]; - - this.art = enumart; - this.setDirection(l); - if (this.survives()) { - arraylist.add(enumart); - } - } - - if (!arraylist.isEmpty()) { - this.art = (EnumArt) arraylist.get(this.random.nextInt(arraylist.size())); - } - - this.setDirection(l); - } - - public void b(NBTTagCompound nbttagcompound) { - nbttagcompound.setString("Motive", this.art.B); - super.b(nbttagcompound); - } - - public void a(NBTTagCompound nbttagcompound) { - String s = nbttagcompound.getString("Motive"); - EnumArt[] aenumart = EnumArt.values(); - int i = aenumart.length; - - for (int j = 0; j < i; ++j) { - EnumArt enumart = aenumart[j]; - - if (enumart.B.equals(s)) { - this.art = enumart; - } - } - - if (this.art == null) { - this.art = EnumArt.KEBAB; - } - - super.a(nbttagcompound); - } - - public int f() { - return this.art.C; - } - - public int i() { - return this.art.D; - } - - public void b(Entity entity) { - if (entity instanceof EntityHuman) { - EntityHuman entityhuman = (EntityHuman) entity; - - if (entityhuman.abilities.canInstantlyBuild) { - return; - } - } - - this.a(new ItemStack(Items.PAINTING), 0.0F); - } -} diff --git a/src/main/java/net/minecraft/server/EntityPig.java b/src/main/java/net/minecraft/server/EntityPig.java deleted file mode 100644 index 98bfd08fb7..0000000000 --- a/src/main/java/net/minecraft/server/EntityPig.java +++ /dev/null @@ -1,159 +0,0 @@ -package net.minecraft.server; - -import org.bukkit.craftbukkit.event.CraftEventFactory; // CraftBukkit - -public class EntityPig extends EntityAnimal { - - private final PathfinderGoalPassengerCarrotStick bp; - - public EntityPig(World world) { - super(world); - this.a(0.9F, 0.9F); - this.getNavigation().a(true); - this.goalSelector.a(0, new PathfinderGoalFloat(this)); - this.goalSelector.a(1, new PathfinderGoalPanic(this, 1.25D)); - this.goalSelector.a(2, this.bp = new PathfinderGoalPassengerCarrotStick(this, 0.3F)); - this.goalSelector.a(3, new PathfinderGoalBreed(this, 1.0D)); - this.goalSelector.a(4, new PathfinderGoalTempt(this, 1.2D, Items.CARROT_STICK, false)); - this.goalSelector.a(4, new PathfinderGoalTempt(this, 1.2D, Items.CARROT, false)); - this.goalSelector.a(5, new PathfinderGoalFollowParent(this, 1.1D)); - this.goalSelector.a(6, new PathfinderGoalRandomStroll(this, 1.0D)); - this.goalSelector.a(7, new PathfinderGoalLookAtPlayer(this, EntityHuman.class, 6.0F)); - this.goalSelector.a(8, new PathfinderGoalRandomLookaround(this)); - } - - public boolean bk() { - return true; - } - - protected void aD() { - super.aD(); - this.getAttributeInstance(GenericAttributes.maxHealth).setValue(10.0D); - this.getAttributeInstance(GenericAttributes.d).setValue(0.25D); - } - - protected void bn() { - super.bn(); - } - - public boolean bE() { - ItemStack itemstack = ((EntityHuman) this.passenger).be(); - - return itemstack != null && itemstack.getItem() == Items.CARROT_STICK; - } - - protected void c() { - super.c(); - this.datawatcher.a(16, Byte.valueOf((byte) 0)); - } - - public void b(NBTTagCompound nbttagcompound) { - super.b(nbttagcompound); - nbttagcompound.setBoolean("Saddle", this.hasSaddle()); - } - - public void a(NBTTagCompound nbttagcompound) { - super.a(nbttagcompound); - this.setSaddle(nbttagcompound.getBoolean("Saddle")); - } - - protected String t() { - return "mob.pig.say"; - } - - protected String aT() { - return "mob.pig.say"; - } - - protected String aU() { - return "mob.pig.death"; - } - - protected void a(int i, int j, int k, Block block) { - this.makeSound("mob.pig.step", 0.15F, 1.0F); - } - - public boolean a(EntityHuman entityhuman) { - if (super.a(entityhuman)) { - return true; - } else if (this.hasSaddle() && !this.world.isStatic && (this.passenger == null || this.passenger == entityhuman)) { - entityhuman.mount(this); - return true; - } else { - return false; - } - } - - protected Item getLoot() { - return this.isBurning() ? Items.GRILLED_PORK : Items.PORK; - } - - protected void dropDeathLoot(boolean flag, int i) { - int j = this.random.nextInt(3) + 1 + this.random.nextInt(1 + i); - - for (int k = 0; k < j; ++k) { - if (this.isBurning()) { - this.a(Items.GRILLED_PORK, 1); - } else { - this.a(Items.PORK, 1); - } - } - - if (this.hasSaddle()) { - this.a(Items.SADDLE, 1); - } - } - - public boolean hasSaddle() { - return (this.datawatcher.getByte(16) & 1) != 0; - } - - public void setSaddle(boolean flag) { - if (flag) { - this.datawatcher.watch(16, Byte.valueOf((byte) 1)); - } else { - this.datawatcher.watch(16, Byte.valueOf((byte) 0)); - } - } - - public void a(EntityLightning entitylightning) { - if (!this.world.isStatic) { - EntityPigZombie entitypigzombie = new EntityPigZombie(this.world); - - // CraftBukkit start - if (CraftEventFactory.callPigZapEvent(this, entitylightning, entitypigzombie).isCancelled()) { - return; - } - // CraftBukkit end - - entitypigzombie.setEquipment(0, new ItemStack(Items.GOLD_SWORD)); - entitypigzombie.setPositionRotation(this.locX, this.locY, this.locZ, this.yaw, this.pitch); - // CraftBukkit - added a reason for spawning this creature - this.world.addEntity(entitypigzombie, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.LIGHTNING); - this.die(); - } - } - - protected void b(float f) { - super.b(f); - if (f > 5.0F && this.passenger instanceof EntityHuman) { - ((EntityHuman) this.passenger).a((Statistic) AchievementList.u); - } - } - - public EntityPig b(EntityAgeable entityageable) { - return new EntityPig(this.world); - } - - public boolean c(ItemStack itemstack) { - return itemstack != null && itemstack.getItem() == Items.CARROT; - } - - public PathfinderGoalPassengerCarrotStick ca() { - return this.bp; - } - - public EntityAgeable createChild(EntityAgeable entityageable) { - return this.b(entityageable); - } -} diff --git a/src/main/java/net/minecraft/server/EntityPigZombie.java b/src/main/java/net/minecraft/server/EntityPigZombie.java deleted file mode 100644 index f2e895e84a..0000000000 --- a/src/main/java/net/minecraft/server/EntityPigZombie.java +++ /dev/null @@ -1,160 +0,0 @@ -package net.minecraft.server; - -import java.util.List; -import java.util.UUID; - -import org.bukkit.event.entity.EntityTargetEvent; // CraftBukkit - -public class EntityPigZombie extends EntityZombie { - - private static final UUID bq = UUID.fromString("49455A49-7EC5-45BA-B886-3B90B23A1718"); - private static final AttributeModifier br = (new AttributeModifier(bq, "Attacking speed boost", 0.45D, 0)).a(false); - public int angerLevel; // CraftBukkit - private -> public - private int soundDelay; - private Entity bu; - - public EntityPigZombie(World world) { - super(world); - this.fireProof = true; - } - - protected void aD() { - super.aD(); - this.getAttributeInstance(bp).setValue(0.0D); - this.getAttributeInstance(GenericAttributes.d).setValue(0.5D); - this.getAttributeInstance(GenericAttributes.e).setValue(5.0D); - } - - protected boolean bk() { - return false; - } - - public void h() { - if (this.bu != this.target && !this.world.isStatic) { - AttributeInstance attributeinstance = this.getAttributeInstance(GenericAttributes.d); - - attributeinstance.b(br); - if (this.target != null) { - attributeinstance.a(br); - } - } - - this.bu = this.target; - if (this.soundDelay > 0 && --this.soundDelay == 0) { - this.makeSound("mob.zombiepig.zpigangry", this.bf() * 2.0F, ((this.random.nextFloat() - this.random.nextFloat()) * 0.2F + 1.0F) * 1.8F); - } - - super.h(); - } - - public boolean canSpawn() { - return this.world.difficulty != EnumDifficulty.PEACEFUL && this.world.b(this.boundingBox) && this.world.getCubes(this, this.boundingBox).isEmpty() && !this.world.containsLiquid(this.boundingBox); - } - - public void b(NBTTagCompound nbttagcompound) { - super.b(nbttagcompound); - nbttagcompound.setShort("Anger", (short) this.angerLevel); - } - - public void a(NBTTagCompound nbttagcompound) { - super.a(nbttagcompound); - this.angerLevel = nbttagcompound.getShort("Anger"); - } - - protected Entity findTarget() { - return this.angerLevel == 0 ? null : super.findTarget(); - } - - public boolean damageEntity(DamageSource damagesource, float f) { - if (this.isInvulnerable()) { - return false; - } else { - Entity entity = damagesource.getEntity(); - - if (entity instanceof EntityHuman) { - List list = this.world.getEntities(this, this.boundingBox.grow(32.0D, 32.0D, 32.0D)); - - for (int i = 0; i < list.size(); ++i) { - Entity entity1 = (Entity) list.get(i); - - if (entity1 instanceof EntityPigZombie) { - EntityPigZombie entitypigzombie = (EntityPigZombie) entity1; - - entitypigzombie.c(entity, EntityTargetEvent.TargetReason.PIG_ZOMBIE_TARGET); - } - } - - this.c(entity, EntityTargetEvent.TargetReason.TARGET_ATTACKED_ENTITY); - } - - return super.damageEntity(damagesource, f); - } - } - - // CraftBukkit start - private void c(Entity entity, EntityTargetEvent.TargetReason reason) { // add TargetReason - EntityTargetEvent event = new EntityTargetEvent(this.getBukkitEntity(), entity.getBukkitEntity(), reason); - this.world.getServer().getPluginManager().callEvent(event); - - if (event.isCancelled()) { - return; - } - - if (event.getTarget() == null) { - this.target = null; - return; - } - entity = ((org.bukkit.craftbukkit.entity.CraftEntity) event.getTarget()).getHandle(); - // CraftBukkit end - - this.target = entity; - this.angerLevel = 400 + this.random.nextInt(400); - this.soundDelay = this.random.nextInt(40); - } - - protected String t() { - return "mob.zombiepig.zpig"; - } - - protected String aT() { - return "mob.zombiepig.zpighurt"; - } - - protected String aU() { - return "mob.zombiepig.zpigdeath"; - } - - protected void dropDeathLoot(boolean flag, int i) { - int j = this.random.nextInt(2 + i); - - int k; - - for (k = 0; k < j; ++k) { - this.a(Items.ROTTEN_FLESH, 1); - } - - j = this.random.nextInt(2 + i); - - for (k = 0; k < j; ++k) { - this.a(Items.GOLD_NUGGET, 1); - } - } - - public boolean a(EntityHuman entityhuman) { - return false; - } - - protected void getRareDrop(int i) { - this.a(Items.GOLD_INGOT, 1); - } - - protected void bC() { - this.setEquipment(0, new ItemStack(Items.GOLD_SWORD)); - } - - public GroupDataEntity prepare(GroupDataEntity groupdataentity) { - super.prepare(groupdataentity); - this.setVillager(false); - return groupdataentity; - } -} diff --git a/src/main/java/net/minecraft/server/EntityPlayer.java b/src/main/java/net/minecraft/server/EntityPlayer.java deleted file mode 100644 index 84673b4691..0000000000 --- a/src/main/java/net/minecraft/server/EntityPlayer.java +++ /dev/null @@ -1,1112 +0,0 @@ -package net.minecraft.server; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.HashSet; -import java.util.Iterator; -import java.util.LinkedList; -import java.util.List; - -import net.minecraft.util.com.google.common.collect.Sets; -import net.minecraft.util.com.mojang.authlib.GameProfile; -import net.minecraft.util.io.netty.buffer.Unpooled; -import net.minecraft.util.org.apache.commons.io.Charsets; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; - -// CraftBukkit start -import org.bukkit.Bukkit; -import org.bukkit.WeatherType; -import org.bukkit.craftbukkit.CraftWorld; -import org.bukkit.craftbukkit.entity.CraftPlayer; -import org.bukkit.craftbukkit.event.CraftEventFactory; -import org.bukkit.craftbukkit.inventory.CraftItemStack; -import org.bukkit.event.inventory.InventoryType; -import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause; -// CraftBukkit end - -public class EntityPlayer extends EntityHuman implements ICrafting { - - private static final Logger bL = LogManager.getLogger(); - private String locale = "en_US"; - public PlayerConnection playerConnection; - public final MinecraftServer server; - public final PlayerInteractManager playerInteractManager; - public double d; - public double e; - public final List chunkCoordIntPairQueue = new LinkedList(); - public final List removeQueue = new LinkedList(); // CraftBukkit - private -> public - private final ServerStatisticManager bO; - private float bP = Float.MIN_VALUE; - private float bQ = -1.0E8F; - private int bR = -99999999; - private boolean bS = true; - public int lastSentExp = -99999999; // CraftBukkit - private -> public - public int invulnerableTicks = 60; // CraftBukkit - private -> public - private EnumChatVisibility bV; - private boolean bW = true; - private long bX = System.currentTimeMillis(); - private int containerCounter; - public boolean g; - public int ping; - public boolean viewingCredits; - // CraftBukkit start - public String displayName; - public String listName; - public org.bukkit.Location compassTarget; - public int newExp = 0; - public int newLevel = 0; - public int newTotalExp = 0; - public boolean keepLevel = false; - public double maxHealthCache; - public boolean joining = true; - // CraftBukkit end - - public EntityPlayer(MinecraftServer minecraftserver, WorldServer worldserver, GameProfile gameprofile, PlayerInteractManager playerinteractmanager) { - super(worldserver, gameprofile); - playerinteractmanager.player = this; - this.playerInteractManager = playerinteractmanager; - ChunkCoordinates chunkcoordinates = worldserver.getSpawn(); - int i = chunkcoordinates.x; - int j = chunkcoordinates.z; - int k = chunkcoordinates.y; - - if (!worldserver.worldProvider.g && worldserver.getWorldData().getGameType() != EnumGamemode.ADVENTURE) { - int l = Math.max(5, minecraftserver.getSpawnProtection() - 6); - - i += this.random.nextInt(l * 2) - l; - j += this.random.nextInt(l * 2) - l; - k = worldserver.i(i, j); - } - - this.server = minecraftserver; - this.bO = minecraftserver.getPlayerList().a((EntityHuman) this); - this.W = 0.0F; - this.height = 0.0F; - this.setPositionRotation((double) i + 0.5D, (double) k, (double) j + 0.5D, 0.0F, 0.0F); - - while (!worldserver.getCubes(this, this.boundingBox).isEmpty()) { - this.setPosition(this.locX, this.locY + 1.0D, this.locZ); - } - - // CraftBukkit start - this.displayName = this.getName(); - this.listName = this.getName(); - // this.canPickUpLoot = true; TODO - this.maxHealthCache = this.getMaxHealth(); - // CraftBukkit end - } - - public void a(NBTTagCompound nbttagcompound) { - super.a(nbttagcompound); - if (nbttagcompound.hasKeyOfType("playerGameType", 99)) { - if (MinecraftServer.getServer().getForceGamemode()) { - this.playerInteractManager.setGameMode(MinecraftServer.getServer().getGamemode()); - } else { - this.playerInteractManager.setGameMode(EnumGamemode.getById(nbttagcompound.getInt("playerGameType"))); - } - } - this.getBukkitEntity().readExtraData(nbttagcompound); // CraftBukkit - } - - public void b(NBTTagCompound nbttagcompound) { - super.b(nbttagcompound); - nbttagcompound.setInt("playerGameType", this.playerInteractManager.getGameMode().getId()); - this.getBukkitEntity().setExtraData(nbttagcompound); // CraftBukkit - } - - // CraftBukkit start - World fallback code, either respawn location or global spawn - public void spawnIn(World world) { - super.spawnIn(world); - if (world == null) { - this.dead = false; - ChunkCoordinates position = null; - if (this.spawnWorld != null && !this.spawnWorld.equals("")) { - CraftWorld cworld = (CraftWorld) Bukkit.getServer().getWorld(this.spawnWorld); - if (cworld != null && this.getBed() != null) { - world = cworld.getHandle(); - position = EntityHuman.getBed(cworld.getHandle(), this.getBed(), false); - } - } - if (world == null || position == null) { - world = ((CraftWorld) Bukkit.getServer().getWorlds().get(0)).getHandle(); - position = world.getSpawn(); - } - this.world = world; - this.setPosition(position.x + 0.5, position.y, position.z + 0.5); - } - this.dimension = ((WorldServer) this.world).dimension; - this.playerInteractManager.a((WorldServer) world); - } - // CraftBukkit end - - public void levelDown(int i) { - super.levelDown(i); - this.lastSentExp = -1; - } - - public void syncInventory() { - this.activeContainer.addSlotListener(this); - } - - protected void e_() { - this.height = 0.0F; - } - - public float getHeadHeight() { - return 1.62F; - } - - public void h() { - // CraftBukkit start - if (this.joining) { - this.joining = false; - } - // CraftBukkit end - - this.playerInteractManager.a(); - --this.invulnerableTicks; - if (this.noDamageTicks > 0) { - --this.noDamageTicks; - } - - this.activeContainer.b(); - if (!this.world.isStatic && !this.activeContainer.a((EntityHuman) this)) { - this.closeInventory(); - this.activeContainer = this.defaultContainer; - } - - while (!this.removeQueue.isEmpty()) { - int i = Math.min(this.removeQueue.size(), 127); - int[] aint = new int[i]; - Iterator iterator = this.removeQueue.iterator(); - int j = 0; - - while (iterator.hasNext() && j < i) { - aint[j++] = ((Integer) iterator.next()).intValue(); - iterator.remove(); - } - - this.playerConnection.sendPacket(new PacketPlayOutEntityDestroy(aint)); - } - - if (!this.chunkCoordIntPairQueue.isEmpty()) { - ArrayList arraylist = new ArrayList(); - Iterator iterator1 = this.chunkCoordIntPairQueue.iterator(); - ArrayList arraylist1 = new ArrayList(); - - Chunk chunk; - - while (iterator1.hasNext() && arraylist.size() < PacketPlayOutMapChunkBulk.c()) { - ChunkCoordIntPair chunkcoordintpair = (ChunkCoordIntPair) iterator1.next(); - - if (chunkcoordintpair != null) { - if (this.world.isLoaded(chunkcoordintpair.x << 4, 0, chunkcoordintpair.z << 4)) { - chunk = this.world.getChunkAt(chunkcoordintpair.x, chunkcoordintpair.z); - if (chunk.isReady()) { - arraylist.add(chunk); - arraylist1.addAll(chunk.tileEntities.values()); // CraftBukkit - Get tile entities directly from the chunk instead of the world - iterator1.remove(); - } - } - } else { - iterator1.remove(); - } - } - - if (!arraylist.isEmpty()) { - this.playerConnection.sendPacket(new PacketPlayOutMapChunkBulk(arraylist)); - Iterator iterator2 = arraylist1.iterator(); - - while (iterator2.hasNext()) { - TileEntity tileentity = (TileEntity) iterator2.next(); - - this.b(tileentity); - } - - iterator2 = arraylist.iterator(); - - while (iterator2.hasNext()) { - chunk = (Chunk) iterator2.next(); - this.r().getTracker().a(this, chunk); - } - } - } - } - - public void i() { - try { - super.h(); - - for (int i = 0; i < this.inventory.getSize(); ++i) { - ItemStack itemstack = this.inventory.getItem(i); - - if (itemstack != null && itemstack.getItem().h()) { - Packet packet = ((ItemWorldMapBase) itemstack.getItem()).c(itemstack, this.world, this); - - if (packet != null) { - this.playerConnection.sendPacket(packet); - } - } - } - - // CraftBukkit - Optionally scale health - if (this.getHealth() != this.bQ || this.bR != this.foodData.getFoodLevel() || this.foodData.getSaturationLevel() == 0.0F != this.bS) { - this.playerConnection.sendPacket(new PacketPlayOutUpdateHealth(this.getBukkitEntity().getScaledHealth(), this.foodData.getFoodLevel(), this.foodData.getSaturationLevel())); - this.bQ = this.getHealth(); - this.bR = this.foodData.getFoodLevel(); - this.bS = this.foodData.getSaturationLevel() == 0.0F; - } - - if (this.getHealth() + this.getAbsorptionHearts() != this.bP) { - this.bP = this.getHealth() + this.getAbsorptionHearts(); - // CraftBukkit - Update ALL the scores! - this.world.getServer().getScoreboardManager().updateAllScoresForList(IScoreboardCriteria.f, this.getName(), com.google.common.collect.ImmutableList.of(this)); - } - - // CraftBukkit start - Force max health updates - if (this.maxHealthCache != this.getMaxHealth()) { - this.getBukkitEntity().updateScaledHealth(); - } - // CraftBukkit end - - if (this.expTotal != this.lastSentExp) { - this.lastSentExp = this.expTotal; - this.playerConnection.sendPacket(new PacketPlayOutExperience(this.exp, this.expTotal, this.expLevel)); - } - - if (this.ticksLived % 20 * 5 == 0 && !this.getStatisticManager().hasAchievement(AchievementList.L)) { - this.j(); - } - - // CraftBukkit start - initialize oldLevel and fire PlayerLevelChangeEvent - if (this.oldLevel == -1) { - this.oldLevel = this.expLevel; - } - - if (this.oldLevel != this.expLevel) { - CraftEventFactory.callPlayerLevelChangeEvent(this.world.getServer().getPlayer((EntityPlayer) this), this.oldLevel, this.expLevel); - this.oldLevel = this.expLevel; - } - // CraftBukkit end - } catch (Throwable throwable) { - CrashReport crashreport = CrashReport.a(throwable, "Ticking player"); - CrashReportSystemDetails crashreportsystemdetails = crashreport.a("Player being ticked"); - - this.a(crashreportsystemdetails); - throw new ReportedException(crashreport); - } - } - - protected void j() { - BiomeBase biomebase = this.world.getBiome(MathHelper.floor(this.locX), MathHelper.floor(this.locZ)); - - if (biomebase != null) { - String s = biomebase.af; - AchievementSet achievementset = (AchievementSet) this.getStatisticManager().b((Statistic) AchievementList.L); // CraftBukkit - fix decompile error - - if (achievementset == null) { - achievementset = (AchievementSet) this.getStatisticManager().a(AchievementList.L, new AchievementSet()); - } - - achievementset.add(s); - if (this.getStatisticManager().b(AchievementList.L) && achievementset.size() == BiomeBase.n.size()) { - HashSet hashset = Sets.newHashSet(BiomeBase.n); - Iterator iterator = achievementset.iterator(); - - while (iterator.hasNext()) { - String s1 = (String) iterator.next(); - Iterator iterator1 = hashset.iterator(); - - while (iterator1.hasNext()) { - BiomeBase biomebase1 = (BiomeBase) iterator1.next(); - - if (biomebase1.af.equals(s1)) { - iterator1.remove(); - } - } - - if (hashset.isEmpty()) { - break; - } - } - - if (hashset.isEmpty()) { - this.a((Statistic) AchievementList.L); - } - } - } - } - - public void die(DamageSource damagesource) { - // CraftBukkit start - fire PlayerDeathEvent - if (this.dead) { - return; - } - - java.util.List loot = new java.util.ArrayList(); - boolean keepInventory = this.world.getGameRules().getBoolean("keepInventory"); - - if (!keepInventory) { - for (int i = 0; i < this.inventory.items.length; ++i) { - if (this.inventory.items[i] != null) { - loot.add(CraftItemStack.asCraftMirror(this.inventory.items[i])); - } - } - - for (int i = 0; i < this.inventory.armor.length; ++i) { - if (this.inventory.armor[i] != null) { - loot.add(CraftItemStack.asCraftMirror(this.inventory.armor[i])); - } - } - } - - IChatBaseComponent chatmessage = this.aW().b(); - - String deathmessage = chatmessage.c(); - org.bukkit.event.entity.PlayerDeathEvent event = CraftEventFactory.callPlayerDeathEvent(this, loot, deathmessage, keepInventory); - - String deathMessage = event.getDeathMessage(); - - if (deathMessage != null && deathMessage.length() > 0) { - if (deathMessage.equals(deathmessage)) { - this.server.getPlayerList().sendMessage(chatmessage); - } else { - this.server.getPlayerList().sendMessage(org.bukkit.craftbukkit.util.CraftChatMessage.fromString(deathMessage)); - } - } - - // we clean the player's inventory after the EntityDeathEvent is called so plugins can get the exact state of the inventory. - if (!event.getKeepInventory()) { - for (int i = 0; i < this.inventory.items.length; ++i) { - this.inventory.items[i] = null; - } - - for (int i = 0; i < this.inventory.armor.length; ++i) { - this.inventory.armor[i] = null; - } - } - - this.closeInventory(); - // CraftBukkit end - - // CraftBukkit - Get our scores instead - Collection collection = this.world.getServer().getScoreboardManager().getScoreboardScores(IScoreboardCriteria.c, this.getName(), new java.util.ArrayList()); - Iterator iterator = collection.iterator(); - - while (iterator.hasNext()) { - ScoreboardScore scoreboardscore = (ScoreboardScore) iterator.next(); // CraftBukkit - Use our scores instead - - scoreboardscore.incrementScore(); - } - - EntityLiving entityliving = this.aX(); - - if (entityliving != null) { - int i = EntityTypes.a(entityliving); - MonsterEggInfo monsteregginfo = (MonsterEggInfo) EntityTypes.eggInfo.get(Integer.valueOf(i)); - - if (monsteregginfo != null) { - this.a(monsteregginfo.e, 1); - } - - entityliving.b(this, this.ba); - } - - this.a(StatisticList.v, 1); - this.aW().g(); - } - - public boolean damageEntity(DamageSource damagesource, float f) { - if (this.isInvulnerable()) { - return false; - } else { - // CraftBukkit - this.server.getPvP() -> this.world.pvpMode - boolean flag = this.server.X() && this.world.pvpMode && "fall".equals(damagesource.translationIndex); - - if (!flag && this.invulnerableTicks > 0 && damagesource != DamageSource.OUT_OF_WORLD) { - return false; - } else { - if (damagesource instanceof EntityDamageSource) { - Entity entity = damagesource.getEntity(); - - if (entity instanceof EntityHuman && !this.a((EntityHuman) entity)) { - return false; - } - - if (entity instanceof EntityArrow) { - EntityArrow entityarrow = (EntityArrow) entity; - - if (entityarrow.shooter instanceof EntityHuman && !this.a((EntityHuman) entityarrow.shooter)) { - return false; - } - } - } - - return super.damageEntity(damagesource, f); - } - } - } - - public boolean a(EntityHuman entityhuman) { - // CraftBukkit - this.server.getPvP() -> this.world.pvpMode - return !this.world.pvpMode ? false : super.a(entityhuman); - } - - public void b(int i) { - if (this.dimension == 1 && i == 1) { - this.a((Statistic) AchievementList.D); - this.world.kill(this); - this.viewingCredits = true; - this.playerConnection.sendPacket(new PacketPlayOutGameStateChange(4, 0.0F)); - } else { - if (this.dimension == 0 && i == 1) { - this.a((Statistic) AchievementList.C); - // CraftBukkit start - Rely on custom portal management - /* - ChunkCoordinates chunkcoordinates = this.server.getWorldServer(i).getDimensionSpawn(); - - if (chunkcoordinates != null) { - this.playerConnection.a((double) chunkcoordinates.x, (double) chunkcoordinates.y, (double) chunkcoordinates.z, 0.0F, 0.0F); - } - - i = 1; - */ - // CraftBukkit end - } else { - this.a((Statistic) AchievementList.y); - } - - // CraftBukkit start - TeleportCause cause = (this.dimension == 1 || i == 1) ? TeleportCause.END_PORTAL : TeleportCause.NETHER_PORTAL; - this.server.getPlayerList().changeDimension(this, i, cause); - // CraftBukkit end - this.lastSentExp = -1; - this.bQ = -1.0F; - this.bR = -1; - } - } - - private void b(TileEntity tileentity) { - if (tileentity != null) { - Packet packet = tileentity.getUpdatePacket(); - - if (packet != null) { - this.playerConnection.sendPacket(packet); - } - } - } - - public void receive(Entity entity, int i) { - super.receive(entity, i); - this.activeContainer.b(); - } - - public EnumBedResult a(int i, int j, int k) { - EnumBedResult enumbedresult = super.a(i, j, k); - - if (enumbedresult == EnumBedResult.OK) { - PacketPlayOutBed packetplayoutbed = new PacketPlayOutBed(this, i, j, k); - - this.r().getTracker().a((Entity) this, (Packet) packetplayoutbed); - this.playerConnection.a(this.locX, this.locY, this.locZ, this.yaw, this.pitch); - this.playerConnection.sendPacket(packetplayoutbed); - } - - return enumbedresult; - } - - public void a(boolean flag, boolean flag1, boolean flag2) { - if (!this.sleeping) return; // CraftBukkit - Can't leave bed if not in one! - - if (this.isSleeping()) { - this.r().getTracker().sendPacketToEntity(this, new PacketPlayOutAnimation(this, 2)); - } - - super.a(flag, flag1, flag2); - if (this.playerConnection != null) { - this.playerConnection.a(this.locX, this.locY, this.locZ, this.yaw, this.pitch); - } - } - - public void mount(Entity entity) { - // CraftBukkit start - this.setPassengerOf(entity); - } - - public void setPassengerOf(Entity entity) { - // mount(null) doesn't really fly for overloaded methods, - // so this method is needed - Entity currentVehicle = this.vehicle; - - super.setPassengerOf(entity); - - // Check if the vehicle actually changed. - if (currentVehicle != this.vehicle) { - this.playerConnection.sendPacket(new PacketPlayOutAttachEntity(0, this, this.vehicle)); - this.playerConnection.a(this.locX, this.locY, this.locZ, this.yaw, this.pitch); - } - // CraftBukkit end - } - - protected void a(double d0, boolean flag) {} - - public void b(double d0, boolean flag) { - super.a(d0, flag); - } - - public void a(TileEntity tileentity) { - if (tileentity instanceof TileEntitySign) { - ((TileEntitySign) tileentity).a((EntityHuman) this); - this.playerConnection.sendPacket(new PacketPlayOutOpenSignEditor(tileentity.x, tileentity.y, tileentity.z)); - } - } - - public int nextContainerCounter() { // CraftBukkit - private void -> public int - this.containerCounter = this.containerCounter % 100 + 1; - return this.containerCounter; // CraftBukkit - } - - public void startCrafting(int i, int j, int k) { - // CraftBukkit start - Inventory open hook - Container container = CraftEventFactory.callInventoryOpenEvent(this, new ContainerWorkbench(this.inventory, this.world, i, j, k)); - if (container == null) { - return; - } - // CraftBukkit end - - this.nextContainerCounter(); - this.playerConnection.sendPacket(new PacketPlayOutOpenWindow(this.containerCounter, 1, "Crafting", 9, true)); - this.activeContainer = container; // CraftBukkit - Use container we passed to event - this.activeContainer.windowId = this.containerCounter; - this.activeContainer.addSlotListener(this); - } - - public void startEnchanting(int i, int j, int k, String s) { - // CraftBukkit start - Inventory open hook - Container container = CraftEventFactory.callInventoryOpenEvent(this, new ContainerEnchantTable(this.inventory, this.world, i, j, k)); - if (container == null) { - return; - } - // CraftBukkit end - - this.nextContainerCounter(); - this.playerConnection.sendPacket(new PacketPlayOutOpenWindow(this.containerCounter, 4, s == null ? "" : s, 9, s != null)); - this.activeContainer = container; // CraftBukkit - Use container we passed to event - this.activeContainer.windowId = this.containerCounter; - this.activeContainer.addSlotListener(this); - } - - public void openAnvil(int i, int j, int k) { - // CraftBukkit start - Inventory open hook - Container container = CraftEventFactory.callInventoryOpenEvent(this, new ContainerAnvil(this.inventory, this.world, i, j, k, this)); - if (container == null) { - return; - } - // CraftBukkit end - - this.nextContainerCounter(); - this.playerConnection.sendPacket(new PacketPlayOutOpenWindow(this.containerCounter, 8, "Repairing", 9, true)); - this.activeContainer = container; // CraftBukkit - Use container we passed to event - this.activeContainer.windowId = this.containerCounter; - this.activeContainer.addSlotListener(this); - } - - public void openContainer(IInventory iinventory) { - if (this.activeContainer != this.defaultContainer) { - this.closeInventory(); - } - - // CraftBukkit start - Inventory open hook - Container container = CraftEventFactory.callInventoryOpenEvent(this, new ContainerChest(this.inventory, iinventory)); - if (container == null) { - iinventory.closeContainer(); - return; - } - // CraftBukkit end - - this.nextContainerCounter(); - this.playerConnection.sendPacket(new PacketPlayOutOpenWindow(this.containerCounter, 0, iinventory.getInventoryName(), iinventory.getSize(), iinventory.k_())); - this.activeContainer = container; // CraftBukkit - Use container we passed to event - this.activeContainer.windowId = this.containerCounter; - this.activeContainer.addSlotListener(this); - } - - public void openHopper(TileEntityHopper tileentityhopper) { - // CraftBukkit start - Inventory open hook - Container container = CraftEventFactory.callInventoryOpenEvent(this, new ContainerHopper(this.inventory, tileentityhopper)); - if (container == null) { - tileentityhopper.closeContainer(); - return; - } - // CraftBukkit end - - this.nextContainerCounter(); - this.playerConnection.sendPacket(new PacketPlayOutOpenWindow(this.containerCounter, 9, tileentityhopper.getInventoryName(), tileentityhopper.getSize(), tileentityhopper.k_())); - this.activeContainer = container; // CraftBukkit - Use container we passed to event - this.activeContainer.windowId = this.containerCounter; - this.activeContainer.addSlotListener(this); - } - - public void openMinecartHopper(EntityMinecartHopper entityminecarthopper) { - // CraftBukkit start - Inventory open hook - Container container = CraftEventFactory.callInventoryOpenEvent(this, new ContainerHopper(this.inventory, entityminecarthopper)); - if (container == null) { - entityminecarthopper.closeContainer(); - return; - } - // CraftBukkit end - - this.nextContainerCounter(); - this.playerConnection.sendPacket(new PacketPlayOutOpenWindow(this.containerCounter, 9, entityminecarthopper.getInventoryName(), entityminecarthopper.getSize(), entityminecarthopper.k_())); - this.activeContainer = container; // CraftBukkit - Use container we passed to event - this.activeContainer.windowId = this.containerCounter; - this.activeContainer.addSlotListener(this); - } - - public void openFurnace(TileEntityFurnace tileentityfurnace) { - // CraftBukkit start - Inventory open hook - Container container = CraftEventFactory.callInventoryOpenEvent(this, new ContainerFurnace(this.inventory, tileentityfurnace)); - if (container == null) { - tileentityfurnace.closeContainer(); - return; - } - // CraftBukkit end - - this.nextContainerCounter(); - this.playerConnection.sendPacket(new PacketPlayOutOpenWindow(this.containerCounter, 2, tileentityfurnace.getInventoryName(), tileentityfurnace.getSize(), tileentityfurnace.k_())); - this.activeContainer = container; // CraftBukkit - Use container we passed to event - this.activeContainer.windowId = this.containerCounter; - this.activeContainer.addSlotListener(this); - } - - public void openDispenser(TileEntityDispenser tileentitydispenser) { - // CraftBukkit start - Inventory open hook - Container container = CraftEventFactory.callInventoryOpenEvent(this, new ContainerDispenser(this.inventory, tileentitydispenser)); - if (container == null) { - tileentitydispenser.closeContainer(); - return; - } - // CraftBukkit end - - this.nextContainerCounter(); - this.playerConnection.sendPacket(new PacketPlayOutOpenWindow(this.containerCounter, tileentitydispenser instanceof TileEntityDropper ? 10 : 3, tileentitydispenser.getInventoryName(), tileentitydispenser.getSize(), tileentitydispenser.k_())); - this.activeContainer = container; // CraftBukkit - Use container we passed to event - this.activeContainer.windowId = this.containerCounter; - this.activeContainer.addSlotListener(this); - } - - public void openBrewingStand(TileEntityBrewingStand tileentitybrewingstand) { - // CraftBukkit start - Inventory open hook - Container container = CraftEventFactory.callInventoryOpenEvent(this, new ContainerBrewingStand(this.inventory, tileentitybrewingstand)); - if (container == null) { - tileentitybrewingstand.closeContainer(); - return; - } - // CraftBukkit end - - this.nextContainerCounter(); - this.playerConnection.sendPacket(new PacketPlayOutOpenWindow(this.containerCounter, 5, tileentitybrewingstand.getInventoryName(), tileentitybrewingstand.getSize(), tileentitybrewingstand.k_())); - this.activeContainer = container; // CraftBukkit - Use container we passed to event - this.activeContainer.windowId = this.containerCounter; - this.activeContainer.addSlotListener(this); - } - - public void openBeacon(TileEntityBeacon tileentitybeacon) { - // CraftBukkit start - Inventory open hook - Container container = CraftEventFactory.callInventoryOpenEvent(this, new ContainerBeacon(this.inventory, tileentitybeacon)); - if (container == null) { - tileentitybeacon.closeContainer(); - return; - } - // CraftBukkit end - - this.nextContainerCounter(); - this.playerConnection.sendPacket(new PacketPlayOutOpenWindow(this.containerCounter, 7, tileentitybeacon.getInventoryName(), tileentitybeacon.getSize(), tileentitybeacon.k_())); - this.activeContainer = container; // CraftBukkit - Use container we passed to event - this.activeContainer.windowId = this.containerCounter; - this.activeContainer.addSlotListener(this); - } - - public void openTrade(IMerchant imerchant, String s) { - // CraftBukkit start - Inventory open hook - Container container = CraftEventFactory.callInventoryOpenEvent(this, new ContainerMerchant(this.inventory, imerchant, this.world)); - if (container == null) { - return; - } - // CraftBukkit end - - this.nextContainerCounter(); - this.activeContainer = container; // CraftBukkit - Use container we passed to event - this.activeContainer.windowId = this.containerCounter; - this.activeContainer.addSlotListener(this); - InventoryMerchant inventorymerchant = ((ContainerMerchant) this.activeContainer).getMerchantInventory(); - - this.playerConnection.sendPacket(new PacketPlayOutOpenWindow(this.containerCounter, 6, s == null ? "" : s, inventorymerchant.getSize(), s != null)); - MerchantRecipeList merchantrecipelist = imerchant.getOffers(this); - - if (merchantrecipelist != null) { - PacketDataSerializer packetdataserializer = new PacketDataSerializer(Unpooled.buffer()); - - try { - packetdataserializer.writeInt(this.containerCounter); - merchantrecipelist.a(packetdataserializer); - this.playerConnection.sendPacket(new PacketPlayOutCustomPayload("MC|TrList", packetdataserializer)); - } catch (Exception ioexception) { // CraftBukkit - IOException -> Exception - bL.error("Couldn\'t send trade list", ioexception); - } finally { - packetdataserializer.release(); - } - } - } - - public void openHorseInventory(EntityHorse entityhorse, IInventory iinventory) { - // CraftBukkit start - Inventory open hook - Container container = CraftEventFactory.callInventoryOpenEvent(this, new ContainerHorse(this.inventory, iinventory, entityhorse)); - if (container == null) { - iinventory.closeContainer(); - return; - } - // CraftBukkit end - - if (this.activeContainer != this.defaultContainer) { - this.closeInventory(); - } - - this.nextContainerCounter(); - this.playerConnection.sendPacket(new PacketPlayOutOpenWindow(this.containerCounter, 11, iinventory.getInventoryName(), iinventory.getSize(), iinventory.k_(), entityhorse.getId())); - this.activeContainer = container; // CraftBukkit - Use container we passed to event - this.activeContainer.windowId = this.containerCounter; - this.activeContainer.addSlotListener(this); - } - - public void a(Container container, int i, ItemStack itemstack) { - if (!(container.getSlot(i) instanceof SlotResult)) { - if (!this.g) { - this.playerConnection.sendPacket(new PacketPlayOutSetSlot(container.windowId, i, itemstack)); - } - } - } - - public void updateInventory(Container container) { - this.a(container, container.a()); - } - - public void a(Container container, List list) { - this.playerConnection.sendPacket(new PacketPlayOutWindowItems(container.windowId, list)); - this.playerConnection.sendPacket(new PacketPlayOutSetSlot(-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.playerConnection.sendPacket(new PacketPlayOutSetSlot(container.windowId, 0, container.getSlot(0).getItem())); - } - // CraftBukkit end - } - - public void setContainerData(Container container, int i, int j) { - this.playerConnection.sendPacket(new PacketPlayOutWindowData(container.windowId, i, j)); - } - - public void closeInventory() { - CraftEventFactory.handleInventoryCloseEvent(this); // CraftBukkit - this.playerConnection.sendPacket(new PacketPlayOutCloseWindow(this.activeContainer.windowId)); - this.m(); - } - - public void broadcastCarriedItem() { - if (!this.g) { - this.playerConnection.sendPacket(new PacketPlayOutSetSlot(-1, -1, this.inventory.getCarried())); - } - } - - public void m() { - this.activeContainer.b((EntityHuman) this); - this.activeContainer = this.defaultContainer; - } - - public void a(float f, float f1, boolean flag, boolean flag1) { - if (this.vehicle != null) { - if (f >= -1.0F && f <= 1.0F) { - this.bd = f; - } - - if (f1 >= -1.0F && f1 <= 1.0F) { - this.be = f1; - } - - this.bc = flag; - this.setSneaking(flag1); - } - } - - public void a(Statistic statistic, int i) { - if (statistic != null) { - this.bO.b(this, statistic, i); - Iterator iterator = this.getScoreboard().getObjectivesForCriteria(statistic.k()).iterator(); - - while (iterator.hasNext()) { - ScoreboardObjective scoreboardobjective = (ScoreboardObjective) iterator.next(); - - this.getScoreboard().getPlayerScoreForObjective(this.getName(), scoreboardobjective).incrementScore(); - } - - if (this.bO.e()) { - this.bO.a(this); - } - } - } - - public void n() { - if (this.passenger != null) { - this.passenger.mount(this); - } - - if (this.sleeping) { - this.a(true, false, false); - } - } - - public void triggerHealthUpdate() { - this.bQ = -1.0E8F; - this.lastSentExp = -1; // CraftBukkit - Added to reset - } - - public void b(IChatBaseComponent ichatbasecomponent) { - this.playerConnection.sendPacket(new PacketPlayOutChat(ichatbasecomponent)); - } - - protected void p() { - this.playerConnection.sendPacket(new PacketPlayOutEntityStatus(this, (byte) 9)); - super.p(); - } - - public void a(ItemStack itemstack, int i) { - super.a(itemstack, i); - if (itemstack != null && itemstack.getItem() != null && itemstack.getItem().d(itemstack) == EnumAnimation.EAT) { - this.r().getTracker().sendPacketToEntity(this, new PacketPlayOutAnimation(this, 3)); - } - } - - public void copyTo(EntityHuman entityhuman, boolean flag) { - super.copyTo(entityhuman, flag); - this.lastSentExp = -1; - this.bQ = -1.0F; - this.bR = -1; - this.removeQueue.addAll(((EntityPlayer) entityhuman).removeQueue); - } - - protected void a(MobEffect mobeffect) { - super.a(mobeffect); - this.playerConnection.sendPacket(new PacketPlayOutEntityEffect(this.getId(), mobeffect)); - } - - protected void a(MobEffect mobeffect, boolean flag) { - super.a(mobeffect, flag); - this.playerConnection.sendPacket(new PacketPlayOutEntityEffect(this.getId(), mobeffect)); - } - - protected void b(MobEffect mobeffect) { - super.b(mobeffect); - this.playerConnection.sendPacket(new PacketPlayOutRemoveEntityEffect(this.getId(), mobeffect)); - } - - public void enderTeleportTo(double d0, double d1, double d2) { - this.playerConnection.a(d0, d1, d2, this.yaw, this.pitch); - } - - public void b(Entity entity) { - this.r().getTracker().sendPacketToEntity(this, new PacketPlayOutAnimation(entity, 4)); - } - - public void c(Entity entity) { - this.r().getTracker().sendPacketToEntity(this, new PacketPlayOutAnimation(entity, 5)); - } - - public void updateAbilities() { - if (this.playerConnection != null) { - this.playerConnection.sendPacket(new PacketPlayOutAbilities(this.abilities)); - } - } - - public WorldServer r() { - return (WorldServer) this.world; - } - - public void a(EnumGamemode enumgamemode) { - this.playerInteractManager.setGameMode(enumgamemode); - this.playerConnection.sendPacket(new PacketPlayOutGameStateChange(3, (float) enumgamemode.getId())); - } - - // CraftBukkit start - Support multi-line messages - public void sendMessage(IChatBaseComponent[] ichatbasecomponent) { - for (IChatBaseComponent component : ichatbasecomponent) { - this.sendMessage(component); - } - } - // CraftBukkit end - - public void sendMessage(IChatBaseComponent ichatbasecomponent) { - this.playerConnection.sendPacket(new PacketPlayOutChat(ichatbasecomponent)); - } - - public boolean a(int i, String s) { - if ("seed".equals(s) && !this.server.X()) { - return true; - } else if (!"tell".equals(s) && !"help".equals(s) && !"me".equals(s)) { - if (this.server.getPlayerList().isOp(this.getProfile())) { - OpListEntry oplistentry = (OpListEntry) this.server.getPlayerList().getOPs().get(this.getProfile()); - - return oplistentry != null ? oplistentry.a() >= i : this.server.l() >= i; - } else { - return false; - } - } else { - return true; - } - } - - public String s() { - String s = this.playerConnection.networkManager.getSocketAddress().toString(); - - s = s.substring(s.indexOf("/") + 1); - s = s.substring(0, s.indexOf(":")); - return s; - } - - public void a(PacketPlayInSettings packetplayinsettings) { - this.locale = packetplayinsettings.c(); - int i = 256 >> packetplayinsettings.d(); - - if (i > 3 && i < 20) { - ; - } - - this.bV = packetplayinsettings.e(); - this.bW = packetplayinsettings.f(); - if (this.server.N() && this.server.M().equals(this.getName())) { - this.server.a(packetplayinsettings.g()); - } - - this.b(1, !packetplayinsettings.h()); - } - - public EnumChatVisibility getChatFlags() { - return this.bV; - } - - public void setResourcePack(String s) { - this.playerConnection.sendPacket(new PacketPlayOutCustomPayload("MC|RPack", s.getBytes(Charsets.UTF_8))); - } - - public ChunkCoordinates getChunkCoordinates() { - return new ChunkCoordinates(MathHelper.floor(this.locX), MathHelper.floor(this.locY + 0.5D), MathHelper.floor(this.locZ)); - } - - public void v() { - this.bX = MinecraftServer.ar(); - } - - public ServerStatisticManager getStatisticManager() { - return this.bO; - } - - public void d(Entity entity) { - if (entity instanceof EntityHuman) { - this.playerConnection.sendPacket(new PacketPlayOutEntityDestroy(new int[] { entity.getId()})); - } else { - this.removeQueue.add(Integer.valueOf(entity.getId())); - } - } - - public long x() { - return this.bX; - } - - // CraftBukkit start - Add per-player time and weather. - public long timeOffset = 0; - public boolean relativeTime = true; - - public long getPlayerTime() { - if (this.relativeTime) { - // Adds timeOffset to the current server time. - return this.world.getDayTime() + this.timeOffset; - } else { - // Adds timeOffset to the beginning of this day. - return this.world.getDayTime() - (this.world.getDayTime() % 24000) + this.timeOffset; - } - } - - public WeatherType weather = null; - - public WeatherType getPlayerWeather() { - return this.weather; - } - - public void setPlayerWeather(WeatherType type, boolean plugin) { - if (!plugin && this.weather != null) { - return; - } - - if (plugin) { - this.weather = type; - } - - if (type == WeatherType.DOWNFALL) { - this.playerConnection.sendPacket(new PacketPlayOutGameStateChange(2, 0)); - // this.playerConnection.sendPacket(new PacketPlayOutGameStateChange(7, this.world.j(1.0F))); - // this.playerConnection.sendPacket(new PacketPlayOutGameStateChange(8, this.world.h(1.0F))); - } else { - this.playerConnection.sendPacket(new PacketPlayOutGameStateChange(1, 0)); - } - } - - public void resetPlayerWeather() { - this.weather = null; - this.setPlayerWeather(this.world.getWorldData().hasStorm() ? WeatherType.DOWNFALL : WeatherType.CLEAR, false); - } - - @Override - public String toString() { - return super.toString() + "(" + this.getName() + " at " + this.locX + "," + this.locY + "," + this.locZ + ")"; - } - - public void reset() { - float exp = 0; - boolean keepInventory = this.world.getGameRules().getBoolean("keepInventory"); - - if (this.keepLevel || keepInventory) { - exp = this.exp; - this.newTotalExp = this.expTotal; - this.newLevel = this.expLevel; - } - - this.setHealth(this.getMaxHealth()); - this.fireTicks = 0; - this.fallDistance = 0; - this.foodData = new FoodMetaData(this); - this.expLevel = this.newLevel; - this.expTotal = this.newTotalExp; - this.exp = 0; - this.deathTicks = 0; - this.removeAllEffects(); - this.updateEffects = true; - this.activeContainer = this.defaultContainer; - this.killer = null; - this.lastDamager = null; - this.combatTracker = new CombatTracker(this); - this.lastSentExp = -1; - if (this.keepLevel || keepInventory) { - this.exp = exp; - } else { - this.giveExp(this.newExp); - } - this.keepLevel = false; - } - - @Override - public CraftPlayer getBukkitEntity() { - return (CraftPlayer) super.getBukkitEntity(); - } - // CraftBukkit end -} diff --git a/src/main/java/net/minecraft/server/EntityPotion.java b/src/main/java/net/minecraft/server/EntityPotion.java deleted file mode 100644 index 69db29f649..0000000000 --- a/src/main/java/net/minecraft/server/EntityPotion.java +++ /dev/null @@ -1,157 +0,0 @@ -package net.minecraft.server; - -import java.util.Iterator; -import java.util.List; - -// CraftBukkit start -import java.util.HashMap; - -import org.bukkit.craftbukkit.entity.CraftLivingEntity; -import org.bukkit.entity.LivingEntity; -// CraftBukkit end - -public class EntityPotion extends EntityProjectile { - - public ItemStack item; // CraftBukkit private -> public - - public EntityPotion(World world) { - super(world); - } - - public EntityPotion(World world, EntityLiving entityliving, int i) { - this(world, entityliving, new ItemStack(Items.POTION, 1, i)); - } - - public EntityPotion(World world, EntityLiving entityliving, ItemStack itemstack) { - super(world, entityliving); - this.item = itemstack; - } - - public EntityPotion(World world, double d0, double d1, double d2, ItemStack itemstack) { - super(world, d0, d1, d2); - this.item = itemstack; - } - - protected float i() { - return 0.05F; - } - - protected float e() { - return 0.5F; - } - - protected float f() { - return -20.0F; - } - - public void setPotionValue(int i) { - if (this.item == null) { - this.item = new ItemStack(Items.POTION, 1, 0); - } - - this.item.setData(i); - } - - public int getPotionValue() { - if (this.item == null) { - this.item = new ItemStack(Items.POTION, 1, 0); - } - - return this.item.getData(); - } - - protected void a(MovingObjectPosition movingobjectposition) { - if (!this.world.isStatic) { - List list = Items.POTION.g(this.item); - - if (true || list != null && !list.isEmpty()) { // CraftBukkit - Call event even if no effects to apply - AxisAlignedBB axisalignedbb = this.boundingBox.grow(4.0D, 2.0D, 4.0D); - List list1 = this.world.a(EntityLiving.class, axisalignedbb); - - if (list1 != null) { // CraftBukkit - Run code even if there are no entities around - Iterator iterator = list1.iterator(); - - // CraftBukkit - HashMap affected = new HashMap(); - - while (iterator.hasNext()) { - EntityLiving entityliving = (EntityLiving) iterator.next(); - double d0 = this.f(entityliving); - - if (d0 < 16.0D) { - double d1 = 1.0D - Math.sqrt(d0) / 4.0D; - - if (entityliving == movingobjectposition.entity) { - d1 = 1.0D; - } - - // CraftBukkit start - affected.put((LivingEntity) entityliving.getBukkitEntity(), d1); - } - } - - org.bukkit.event.entity.PotionSplashEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callPotionSplashEvent(this, affected); - if (!event.isCancelled() && list != null && !list.isEmpty()) { // do not process effects if there are no effects to process - for (LivingEntity victim : event.getAffectedEntities()) { - if (!(victim instanceof CraftLivingEntity)) { - continue; - } - - EntityLiving entityliving = ((CraftLivingEntity) victim).getHandle(); - double d1 = event.getIntensity(victim); - // CraftBukkit end - - Iterator iterator1 = list.iterator(); - - while (iterator1.hasNext()) { - MobEffect mobeffect = (MobEffect) iterator1.next(); - int i = mobeffect.getEffectId(); - - // CraftBukkit start - Abide by PVP settings - for players only! - if (!this.world.pvpMode && this.getShooter() instanceof EntityPlayer && entityliving instanceof EntityPlayer && entityliving != this.getShooter()) { - // Block SLOWER_MOVEMENT, SLOWER_DIG, HARM, BLINDNESS, HUNGER, WEAKNESS and POISON potions - if (i == 2 || i == 4 || i == 7 || i == 15 || i == 17 || i == 18 || i == 19) continue; - } - // CraftBukkit end - - if (MobEffectList.byId[i].isInstant()) { - // CraftBukkit - Added 'this' - MobEffectList.byId[i].applyInstantEffect(this.getShooter(), entityliving, mobeffect.getAmplifier(), d1, this); - } else { - int j = (int) (d1 * (double) mobeffect.getDuration() + 0.5D); - - if (j > 20) { - entityliving.addEffect(new MobEffect(i, j, mobeffect.getAmplifier())); - } - } - } - } - } - } - } - - this.world.triggerEffect(2002, (int) Math.round(this.locX), (int) Math.round(this.locY), (int) Math.round(this.locZ), this.getPotionValue()); - this.die(); - } - } - - public void a(NBTTagCompound nbttagcompound) { - super.a(nbttagcompound); - if (nbttagcompound.hasKeyOfType("Potion", 10)) { - this.item = ItemStack.createStack(nbttagcompound.getCompound("Potion")); - } else { - this.setPotionValue(nbttagcompound.getInt("potionValue")); - } - - if (this.item == null) { - this.die(); - } - } - - public void b(NBTTagCompound nbttagcompound) { - super.b(nbttagcompound); - if (this.item != null) { - nbttagcompound.set("Potion", this.item.save(new NBTTagCompound())); - } - } -} diff --git a/src/main/java/net/minecraft/server/EntityProjectile.java b/src/main/java/net/minecraft/server/EntityProjectile.java deleted file mode 100644 index 7f8a33bca5..0000000000 --- a/src/main/java/net/minecraft/server/EntityProjectile.java +++ /dev/null @@ -1,249 +0,0 @@ -package net.minecraft.server; - -import java.util.List; - -public abstract class EntityProjectile extends Entity implements IProjectile { - - private int blockX = -1; - private int blockY = -1; - private int blockZ = -1; - private Block inBlockId; - protected boolean inGround; - public int shake; - public EntityLiving shooter; // CraftBukkit - private -> public - public String shooterName; // CraftBukkit - private -> public - private int i; - private int at; - - public EntityProjectile(World world) { - super(world); - this.a(0.25F, 0.25F); - } - - protected void c() {} - - public EntityProjectile(World world, EntityLiving entityliving) { - super(world); - this.shooter = entityliving; - this.projectileSource = (org.bukkit.entity.LivingEntity) entityliving.getBukkitEntity(); // CraftBukkit - this.a(0.25F, 0.25F); - this.setPositionRotation(entityliving.locX, entityliving.locY + (double) entityliving.getHeadHeight(), entityliving.locZ, entityliving.yaw, entityliving.pitch); - this.locX -= (double) (MathHelper.cos(this.yaw / 180.0F * 3.1415927F) * 0.16F); - this.locY -= 0.10000000149011612D; - this.locZ -= (double) (MathHelper.sin(this.yaw / 180.0F * 3.1415927F) * 0.16F); - this.setPosition(this.locX, this.locY, this.locZ); - this.height = 0.0F; - float f = 0.4F; - - this.motX = (double) (-MathHelper.sin(this.yaw / 180.0F * 3.1415927F) * MathHelper.cos(this.pitch / 180.0F * 3.1415927F) * f); - this.motZ = (double) (MathHelper.cos(this.yaw / 180.0F * 3.1415927F) * MathHelper.cos(this.pitch / 180.0F * 3.1415927F) * f); - this.motY = (double) (-MathHelper.sin((this.pitch + this.f()) / 180.0F * 3.1415927F) * f); - this.shoot(this.motX, this.motY, this.motZ, this.e(), 1.0F); - } - - public EntityProjectile(World world, double d0, double d1, double d2) { - super(world); - this.i = 0; - this.a(0.25F, 0.25F); - this.setPosition(d0, d1, d2); - this.height = 0.0F; - } - - protected float e() { - return 1.5F; - } - - protected float f() { - return 0.0F; - } - - public void shoot(double d0, double d1, double d2, float f, float f1) { - float f2 = MathHelper.sqrt(d0 * d0 + d1 * d1 + d2 * d2); - - d0 /= (double) f2; - d1 /= (double) f2; - d2 /= (double) f2; - d0 += this.random.nextGaussian() * 0.007499999832361937D * (double) f1; - d1 += this.random.nextGaussian() * 0.007499999832361937D * (double) f1; - d2 += this.random.nextGaussian() * 0.007499999832361937D * (double) f1; - d0 *= (double) f; - d1 *= (double) f; - d2 *= (double) f; - this.motX = d0; - this.motY = d1; - this.motZ = d2; - float f3 = MathHelper.sqrt(d0 * d0 + d2 * d2); - - this.lastYaw = this.yaw = (float) (Math.atan2(d0, d2) * 180.0D / 3.1415927410125732D); - this.lastPitch = this.pitch = (float) (Math.atan2(d1, (double) f3) * 180.0D / 3.1415927410125732D); - this.i = 0; - } - - public void h() { - this.S = this.locX; - this.T = this.locY; - this.U = this.locZ; - super.h(); - if (this.shake > 0) { - --this.shake; - } - - if (this.inGround) { - if (this.world.getType(this.blockX, this.blockY, this.blockZ) == this.inBlockId) { - ++this.i; - if (this.i == 1200) { - this.die(); - } - - return; - } - - this.inGround = false; - this.motX *= (double) (this.random.nextFloat() * 0.2F); - this.motY *= (double) (this.random.nextFloat() * 0.2F); - this.motZ *= (double) (this.random.nextFloat() * 0.2F); - this.i = 0; - this.at = 0; - } else { - ++this.at; - } - - Vec3D vec3d = Vec3D.a(this.locX, this.locY, this.locZ); - Vec3D vec3d1 = Vec3D.a(this.locX + this.motX, this.locY + this.motY, this.locZ + this.motZ); - MovingObjectPosition movingobjectposition = this.world.a(vec3d, vec3d1); - - vec3d = Vec3D.a(this.locX, this.locY, this.locZ); - vec3d1 = Vec3D.a(this.locX + this.motX, this.locY + this.motY, this.locZ + this.motZ); - if (movingobjectposition != null) { - vec3d1 = Vec3D.a(movingobjectposition.pos.a, movingobjectposition.pos.b, movingobjectposition.pos.c); - } - - if (!this.world.isStatic) { - Entity entity = null; - List list = this.world.getEntities(this, this.boundingBox.a(this.motX, this.motY, this.motZ).grow(1.0D, 1.0D, 1.0D)); - double d0 = 0.0D; - EntityLiving entityliving = this.getShooter(); - - for (int i = 0; i < list.size(); ++i) { - Entity entity1 = (Entity) list.get(i); - - if (entity1.R() && (entity1 != entityliving || this.at >= 5)) { - float f = 0.3F; - AxisAlignedBB axisalignedbb = entity1.boundingBox.grow((double) f, (double) f, (double) f); - MovingObjectPosition movingobjectposition1 = axisalignedbb.a(vec3d, vec3d1); - - if (movingobjectposition1 != null) { - double d1 = vec3d.distanceSquared(movingobjectposition1.pos); // CraftBukkit - distance efficiency - - if (d1 < d0 || d0 == 0.0D) { - entity = entity1; - d0 = d1; - } - } - } - } - - if (entity != null) { - movingobjectposition = new MovingObjectPosition(entity); - } - } - - if (movingobjectposition != null) { - if (movingobjectposition.type == EnumMovingObjectType.BLOCK && this.world.getType(movingobjectposition.b, movingobjectposition.c, movingobjectposition.d) == Blocks.PORTAL) { - this.ah(); - } else { - this.a(movingobjectposition); - // CraftBukkit start - if (this.dead) { - org.bukkit.craftbukkit.event.CraftEventFactory.callProjectileHitEvent(this); - } - // CraftBukkit end - } - } - - this.locX += this.motX; - this.locY += this.motY; - this.locZ += this.motZ; - float f1 = MathHelper.sqrt(this.motX * this.motX + this.motZ * this.motZ); - - this.yaw = (float) (Math.atan2(this.motX, this.motZ) * 180.0D / 3.1415927410125732D); - - for (this.pitch = (float) (Math.atan2(this.motY, (double) f1) * 180.0D / 3.1415927410125732D); this.pitch - this.lastPitch < -180.0F; this.lastPitch -= 360.0F) { - ; - } - - while (this.pitch - this.lastPitch >= 180.0F) { - this.lastPitch += 360.0F; - } - - while (this.yaw - this.lastYaw < -180.0F) { - this.lastYaw -= 360.0F; - } - - while (this.yaw - this.lastYaw >= 180.0F) { - this.lastYaw += 360.0F; - } - - this.pitch = this.lastPitch + (this.pitch - this.lastPitch) * 0.2F; - this.yaw = this.lastYaw + (this.yaw - this.lastYaw) * 0.2F; - float f2 = 0.99F; - float f3 = this.i(); - - if (this.M()) { - for (int j = 0; j < 4; ++j) { - float f4 = 0.25F; - - this.world.addParticle("bubble", this.locX - this.motX * (double) f4, this.locY - this.motY * (double) f4, this.locZ - this.motZ * (double) f4, this.motX, this.motY, this.motZ); - } - - f2 = 0.8F; - } - - this.motX *= (double) f2; - this.motY *= (double) f2; - this.motZ *= (double) f2; - this.motY -= (double) f3; - this.setPosition(this.locX, this.locY, this.locZ); - } - - protected float i() { - return 0.03F; - } - - protected abstract void a(MovingObjectPosition movingobjectposition); - - public void b(NBTTagCompound nbttagcompound) { - nbttagcompound.setShort("xTile", (short) this.blockX); - nbttagcompound.setShort("yTile", (short) this.blockY); - nbttagcompound.setShort("zTile", (short) this.blockZ); - nbttagcompound.setByte("inTile", (byte) Block.getId(this.inBlockId)); - nbttagcompound.setByte("shake", (byte) this.shake); - nbttagcompound.setByte("inGround", (byte) (this.inGround ? 1 : 0)); - if ((this.shooterName == null || this.shooterName.length() == 0) && this.shooter != null && this.shooter instanceof EntityHuman) { - this.shooterName = this.shooter.getName(); - } - - nbttagcompound.setString("ownerName", this.shooterName == null ? "" : this.shooterName); - } - - public void a(NBTTagCompound nbttagcompound) { - this.blockX = nbttagcompound.getShort("xTile"); - this.blockY = nbttagcompound.getShort("yTile"); - this.blockZ = nbttagcompound.getShort("zTile"); - this.inBlockId = Block.getById(nbttagcompound.getByte("inTile") & 255); - this.shake = nbttagcompound.getByte("shake") & 255; - this.inGround = nbttagcompound.getByte("inGround") == 1; - this.shooterName = nbttagcompound.getString("ownerName"); - if (this.shooterName != null && this.shooterName.length() == 0) { - this.shooterName = null; - } - } - - public EntityLiving getShooter() { - if (this.shooter == null && this.shooterName != null && this.shooterName.length() > 0) { - this.shooter = this.world.a(this.shooterName); - } - - return this.shooter; - } -} diff --git a/src/main/java/net/minecraft/server/EntitySheep.java b/src/main/java/net/minecraft/server/EntitySheep.java deleted file mode 100644 index 381ae7875b..0000000000 --- a/src/main/java/net/minecraft/server/EntitySheep.java +++ /dev/null @@ -1,219 +0,0 @@ -package net.minecraft.server; - -import java.util.Random; - -// CraftBukkit start -import org.bukkit.event.entity.SheepRegrowWoolEvent; -import org.bukkit.event.player.PlayerShearEntityEvent; -// CraftBukkit end - -public class EntitySheep extends EntityAnimal { - - private final InventoryCrafting bq = new InventoryCrafting(new ContainerSheepBreed(this), 2, 1); - public static final float[][] bp = new float[][] { { 1.0F, 1.0F, 1.0F}, { 0.85F, 0.5F, 0.2F}, { 0.7F, 0.3F, 0.85F}, { 0.4F, 0.6F, 0.85F}, { 0.9F, 0.9F, 0.2F}, { 0.5F, 0.8F, 0.1F}, { 0.95F, 0.5F, 0.65F}, { 0.3F, 0.3F, 0.3F}, { 0.6F, 0.6F, 0.6F}, { 0.3F, 0.5F, 0.6F}, { 0.5F, 0.25F, 0.7F}, { 0.2F, 0.3F, 0.7F}, { 0.4F, 0.3F, 0.2F}, { 0.4F, 0.5F, 0.2F}, { 0.6F, 0.2F, 0.2F}, { 0.1F, 0.1F, 0.1F}}; - private int br; - private PathfinderGoalEatTile bs = new PathfinderGoalEatTile(this); - - public EntitySheep(World world) { - super(world); - this.a(0.9F, 1.3F); - this.getNavigation().a(true); - this.goalSelector.a(0, new PathfinderGoalFloat(this)); - this.goalSelector.a(1, new PathfinderGoalPanic(this, 1.25D)); - this.goalSelector.a(2, new PathfinderGoalBreed(this, 1.0D)); - this.goalSelector.a(3, new PathfinderGoalTempt(this, 1.1D, Items.WHEAT, false)); - this.goalSelector.a(4, new PathfinderGoalFollowParent(this, 1.1D)); - this.goalSelector.a(5, this.bs); - this.goalSelector.a(6, new PathfinderGoalRandomStroll(this, 1.0D)); - this.goalSelector.a(7, new PathfinderGoalLookAtPlayer(this, EntityHuman.class, 6.0F)); - this.goalSelector.a(8, new PathfinderGoalRandomLookaround(this)); - this.bq.setItem(0, new ItemStack(Items.INK_SACK, 1, 0)); - this.bq.setItem(1, new ItemStack(Items.INK_SACK, 1, 0)); - this.bq.resultInventory = new InventoryCraftResult(); // CraftBukkit - add result slot for event - } - - protected boolean bk() { - return true; - } - - protected void bn() { - this.br = this.bs.f(); - super.bn(); - } - - public void e() { - if (this.world.isStatic) { - this.br = Math.max(0, this.br - 1); - } - - super.e(); - } - - protected void aD() { - super.aD(); - this.getAttributeInstance(GenericAttributes.maxHealth).setValue(8.0D); - this.getAttributeInstance(GenericAttributes.d).setValue(0.23000000417232513D); - } - - protected void c() { - super.c(); - this.datawatcher.a(16, new Byte((byte) 0)); - } - - protected void dropDeathLoot(boolean flag, int i) { - if (!this.isSheared()) { - this.a(new ItemStack(Item.getItemOf(Blocks.WOOL), 1, this.getColor()), 0.0F); - } - } - - protected Item getLoot() { - return Item.getItemOf(Blocks.WOOL); - } - - public boolean a(EntityHuman entityhuman) { - ItemStack itemstack = entityhuman.inventory.getItemInHand(); - - if (itemstack != null && itemstack.getItem() == Items.SHEARS && !this.isSheared() && !this.isBaby()) { - if (!this.world.isStatic) { - // CraftBukkit start - PlayerShearEntityEvent event = new PlayerShearEntityEvent((org.bukkit.entity.Player) entityhuman.getBukkitEntity(), this.getBukkitEntity()); - this.world.getServer().getPluginManager().callEvent(event); - - if (event.isCancelled()) { - return false; - } - // CraftBukkit end - - this.setSheared(true); - int i = 1 + this.random.nextInt(3); - - for (int j = 0; j < i; ++j) { - EntityItem entityitem = this.a(new ItemStack(Item.getItemOf(Blocks.WOOL), 1, this.getColor()), 1.0F); - - entityitem.motY += (double) (this.random.nextFloat() * 0.05F); - entityitem.motX += (double) ((this.random.nextFloat() - this.random.nextFloat()) * 0.1F); - entityitem.motZ += (double) ((this.random.nextFloat() - this.random.nextFloat()) * 0.1F); - } - } - - itemstack.damage(1, entityhuman); - this.makeSound("mob.sheep.shear", 1.0F, 1.0F); - } - - return super.a(entityhuman); - } - - public void b(NBTTagCompound nbttagcompound) { - super.b(nbttagcompound); - nbttagcompound.setBoolean("Sheared", this.isSheared()); - nbttagcompound.setByte("Color", (byte) this.getColor()); - } - - public void a(NBTTagCompound nbttagcompound) { - super.a(nbttagcompound); - this.setSheared(nbttagcompound.getBoolean("Sheared")); - this.setColor(nbttagcompound.getByte("Color")); - } - - protected String t() { - return "mob.sheep.say"; - } - - protected String aT() { - return "mob.sheep.say"; - } - - protected String aU() { - return "mob.sheep.say"; - } - - protected void a(int i, int j, int k, Block block) { - this.makeSound("mob.sheep.step", 0.15F, 1.0F); - } - - public int getColor() { - return this.datawatcher.getByte(16) & 15; - } - - public void setColor(int i) { - byte b0 = this.datawatcher.getByte(16); - - this.datawatcher.watch(16, Byte.valueOf((byte) (b0 & 240 | i & 15))); - } - - public boolean isSheared() { - return (this.datawatcher.getByte(16) & 16) != 0; - } - - public void setSheared(boolean flag) { - byte b0 = this.datawatcher.getByte(16); - - if (flag) { - this.datawatcher.watch(16, Byte.valueOf((byte) (b0 | 16))); - } else { - this.datawatcher.watch(16, Byte.valueOf((byte) (b0 & -17))); - } - } - - public static int a(Random random) { - int i = random.nextInt(100); - - return i < 5 ? 15 : (i < 10 ? 7 : (i < 15 ? 8 : (i < 18 ? 12 : (random.nextInt(500) == 0 ? 6 : 0)))); - } - - public EntitySheep b(EntityAgeable entityageable) { - EntitySheep entitysheep = (EntitySheep) entityageable; - EntitySheep entitysheep1 = new EntitySheep(this.world); - int i = this.a(this, entitysheep); - - entitysheep1.setColor(15 - i); - return entitysheep1; - } - - public void p() { - // CraftBukkit start - SheepRegrowWoolEvent event = new SheepRegrowWoolEvent((org.bukkit.entity.Sheep) this.getBukkitEntity()); - this.world.getServer().getPluginManager().callEvent(event); - - if (!event.isCancelled()) { - this.setSheared(false); - } - // CraftBukkit end - - if (this.isBaby()) { - this.a(60); - } - } - - public GroupDataEntity prepare(GroupDataEntity groupdataentity) { - groupdataentity = super.prepare(groupdataentity); - this.setColor(a(this.world.random)); - return groupdataentity; - } - - private int a(EntityAnimal entityanimal, EntityAnimal entityanimal1) { - int i = this.b(entityanimal); - int j = this.b(entityanimal1); - - this.bq.getItem(0).setData(i); - this.bq.getItem(1).setData(j); - ItemStack itemstack = CraftingManager.getInstance().craft(this.bq, ((EntitySheep) entityanimal).world); - int k; - - if (itemstack != null && itemstack.getItem() == Items.INK_SACK) { - k = itemstack.getData(); - } else { - k = this.world.random.nextBoolean() ? i : j; - } - - return k; - } - - private int b(EntityAnimal entityanimal) { - return 15 - ((EntitySheep) entityanimal).getColor(); - } - - public EntityAgeable createChild(EntityAgeable entityageable) { - return this.b(entityageable); - } -} diff --git a/src/main/java/net/minecraft/server/EntitySilverfish.java b/src/main/java/net/minecraft/server/EntitySilverfish.java deleted file mode 100644 index ac5714f022..0000000000 --- a/src/main/java/net/minecraft/server/EntitySilverfish.java +++ /dev/null @@ -1,171 +0,0 @@ -package net.minecraft.server; - -import net.minecraft.util.org.apache.commons.lang3.tuple.ImmutablePair; - -import org.bukkit.craftbukkit.event.CraftEventFactory; // CraftBukkit - -public class EntitySilverfish extends EntityMonster { - - private int bp; - - public EntitySilverfish(World world) { - super(world); - this.a(0.3F, 0.7F); - } - - protected void aD() { - super.aD(); - this.getAttributeInstance(GenericAttributes.maxHealth).setValue(8.0D); - this.getAttributeInstance(GenericAttributes.d).setValue(0.6000000238418579D); - this.getAttributeInstance(GenericAttributes.e).setValue(1.0D); - } - - protected boolean g_() { - return false; - } - - protected Entity findTarget() { - double d0 = 8.0D; - - return this.world.findNearbyVulnerablePlayer(this, d0); - } - - protected String t() { - return "mob.silverfish.say"; - } - - protected String aT() { - return "mob.silverfish.hit"; - } - - protected String aU() { - return "mob.silverfish.kill"; - } - - public boolean damageEntity(DamageSource damagesource, float f) { - if (this.isInvulnerable()) { - return false; - } else { - if (this.bp <= 0 && (damagesource instanceof EntityDamageSource || damagesource == DamageSource.MAGIC)) { - this.bp = 20; - } - - return super.damageEntity(damagesource, f); - } - } - - 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; - this.n(entity); - } - } - - protected void a(int i, int j, int k, Block block) { - this.makeSound("mob.silverfish.step", 0.15F, 1.0F); - } - - protected Item getLoot() { - return Item.getById(0); - } - - public void h() { - this.aM = this.yaw; - super.h(); - } - - protected void bq() { - super.bq(); - if (!this.world.isStatic) { - int i; - int j; - int k; - int l; - - if (this.bp > 0) { - --this.bp; - if (this.bp == 0) { - i = MathHelper.floor(this.locX); - j = MathHelper.floor(this.locY); - k = MathHelper.floor(this.locZ); - boolean flag = false; - - for (int i1 = 0; !flag && i1 <= 5 && i1 >= -5; i1 = i1 <= 0 ? 1 - i1 : 0 - i1) { - for (l = 0; !flag && l <= 10 && l >= -10; l = l <= 0 ? 1 - l : 0 - l) { - for (int j1 = 0; !flag && j1 <= 10 && j1 >= -10; j1 = j1 <= 0 ? 1 - j1 : 0 - j1) { - if (this.world.getType(i + l, j + i1, k + j1) == Blocks.MONSTER_EGGS) { - // CraftBukkit start - if (CraftEventFactory.callEntityChangeBlockEvent(this, i + l, j + i1, k + j1, Blocks.AIR, 0).isCancelled()) { - continue; - } - // CraftBukkit end - if (!this.world.getGameRules().getBoolean("mobGriefing")) { - int k1 = this.world.getData(i + l, j + i1, k + j1); - ImmutablePair immutablepair = BlockMonsterEggs.b(k1); - - this.world.setTypeAndData(i + l, j + i1, k + j1, (Block) immutablepair.getLeft(), ((Integer) immutablepair.getRight()).intValue(), 3); - } else { - this.world.setAir(i + l, j + i1, k + j1, false); - } - - Blocks.MONSTER_EGGS.postBreak(this.world, i + l, j + i1, k + j1, 0); - if (this.random.nextBoolean()) { - flag = true; - break; - } - } - } - } - } - } - } - - if (this.target == null && !this.bS()) { - i = MathHelper.floor(this.locX); - j = MathHelper.floor(this.locY + 0.5D); - k = MathHelper.floor(this.locZ); - int l1 = this.random.nextInt(6); - Block block = this.world.getType(i + Facing.b[l1], j + Facing.c[l1], k + Facing.d[l1]); - - l = this.world.getData(i + Facing.b[l1], j + Facing.c[l1], k + Facing.d[l1]); - if (BlockMonsterEggs.a(block)) { - // CraftBukkit start - if (CraftEventFactory.callEntityChangeBlockEvent(this, i + Facing.b[l1], j + Facing.c[l1], k + Facing.d[l1], Blocks.MONSTER_EGGS, Block.getId(BlockMonsterEggs.getById(l))).isCancelled()) { - return; - } - // CraftBukkit end - - this.world.setTypeAndData(i + Facing.b[l1], j + Facing.c[l1], k + Facing.d[l1], Blocks.MONSTER_EGGS, BlockMonsterEggs.a(block, l), 3); - this.s(); - this.die(); - } else { - this.bQ(); - } - } else if (this.target != null && !this.bS()) { - this.target = null; - } - } - } - - public float a(int i, int j, int k) { - return this.world.getType(i, j - 1, k) == Blocks.STONE ? 10.0F : super.a(i, j, k); - } - - protected boolean j_() { - return true; - } - - public boolean canSpawn() { - if (super.canSpawn()) { - EntityHuman entityhuman = this.world.findNearbyPlayer(this, 5.0D); - - return entityhuman == null; - } else { - return false; - } - } - - public EnumMonsterType getMonsterType() { - return EnumMonsterType.ARTHROPOD; - } -} diff --git a/src/main/java/net/minecraft/server/EntitySkeleton.java b/src/main/java/net/minecraft/server/EntitySkeleton.java deleted file mode 100644 index 479936f3eb..0000000000 --- a/src/main/java/net/minecraft/server/EntitySkeleton.java +++ /dev/null @@ -1,294 +0,0 @@ -package net.minecraft.server; - -import java.util.Calendar; - -import org.bukkit.event.entity.EntityCombustEvent; // CraftBukkit - -public class EntitySkeleton extends EntityMonster implements IRangedEntity { - - private PathfinderGoalArrowAttack bp = new PathfinderGoalArrowAttack(this, 1.0D, 20, 60, 15.0F); - private PathfinderGoalMeleeAttack bq = new PathfinderGoalMeleeAttack(this, EntityHuman.class, 1.2D, false); - - public EntitySkeleton(World world) { - super(world); - this.goalSelector.a(1, new PathfinderGoalFloat(this)); - this.goalSelector.a(2, new PathfinderGoalRestrictSun(this)); - this.goalSelector.a(3, new PathfinderGoalFleeSun(this, 1.0D)); - this.goalSelector.a(5, new PathfinderGoalRandomStroll(this, 1.0D)); - 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)); - this.targetSelector.a(2, new PathfinderGoalNearestAttackableTarget(this, EntityHuman.class, 0, true)); - if (world != null && !world.isStatic) { - this.bZ(); - } - } - - protected void aD() { - super.aD(); - this.getAttributeInstance(GenericAttributes.d).setValue(0.25D); - } - - protected void c() { - super.c(); - this.datawatcher.a(13, new Byte((byte) 0)); - } - - public boolean bk() { - return true; - } - - protected String t() { - return "mob.skeleton.say"; - } - - protected String aT() { - return "mob.skeleton.hurt"; - } - - protected String aU() { - return "mob.skeleton.death"; - } - - protected void a(int i, int j, int k, Block block) { - this.makeSound("mob.skeleton.step", 0.15F, 1.0F); - } - - public boolean n(Entity entity) { - if (super.n(entity)) { - if (this.getSkeletonType() == 1 && entity instanceof EntityLiving) { - ((EntityLiving) entity).addEffect(new MobEffect(MobEffectList.WITHER.id, 200)); - } - - return true; - } else { - return false; - } - } - - public EnumMonsterType getMonsterType() { - return EnumMonsterType.UNDEAD; - } - - public void e() { - if (this.world.w() && !this.world.isStatic) { - float f = this.d(1.0F); - - if (f > 0.5F && this.random.nextFloat() * 30.0F < (f - 0.4F) * 2.0F && this.world.i(MathHelper.floor(this.locX), MathHelper.floor(this.locY), MathHelper.floor(this.locZ))) { - boolean flag = true; - ItemStack itemstack = this.getEquipment(4); - - if (itemstack != null) { - if (itemstack.g()) { - itemstack.setData(itemstack.j() + this.random.nextInt(2)); - if (itemstack.j() >= itemstack.l()) { - this.a(itemstack); - this.setEquipment(4, (ItemStack) null); - } - } - - flag = false; - } - - if (flag) { - // CraftBukkit start - EntityCombustEvent event = new EntityCombustEvent(this.getBukkitEntity(), 8); - this.world.getServer().getPluginManager().callEvent(event); - - if (!event.isCancelled()) { - this.setOnFire(event.getDuration()); - } - // CraftBukkit end - } - } - } - - if (this.world.isStatic && this.getSkeletonType() == 1) { - this.a(0.72F, 2.34F); - } - - super.e(); - } - - public void ab() { - super.ab(); - if (this.vehicle instanceof EntityCreature) { - EntityCreature entitycreature = (EntityCreature) this.vehicle; - - this.aM = entitycreature.aM; - } - } - - public void die(DamageSource damagesource) { - super.die(damagesource); - if (damagesource.i() instanceof EntityArrow && damagesource.getEntity() instanceof EntityHuman) { - EntityHuman entityhuman = (EntityHuman) damagesource.getEntity(); - double d0 = entityhuman.locX - this.locX; - double d1 = entityhuman.locZ - this.locZ; - - if (d0 * d0 + d1 * d1 >= 2500.0D) { - entityhuman.a((Statistic) AchievementList.v); - } - } - } - - protected Item getLoot() { - return Items.ARROW; - } - - protected void dropDeathLoot(boolean flag, int i) { - int j; - int k; - - if (this.getSkeletonType() == 1) { - j = this.random.nextInt(3 + i) - 1; - - for (k = 0; k < j; ++k) { - this.a(Items.COAL, 1); - } - } else { - j = this.random.nextInt(3 + i); - - for (k = 0; k < j; ++k) { - this.a(Items.ARROW, 1); - } - } - - j = this.random.nextInt(3 + i); - - for (k = 0; k < j; ++k) { - this.a(Items.BONE, 1); - } - } - - protected void getRareDrop(int i) { - if (this.getSkeletonType() == 1) { - this.a(new ItemStack(Items.SKULL, 1, 1), 0.0F); - } - } - - protected void bC() { - super.bC(); - this.setEquipment(0, new ItemStack(Items.BOW)); - } - - public GroupDataEntity prepare(GroupDataEntity groupdataentity) { - groupdataentity = super.prepare(groupdataentity); - if (this.world.worldProvider instanceof WorldProviderHell && this.aI().nextInt(5) > 0) { - this.goalSelector.a(4, this.bq); - this.setSkeletonType(1); - this.setEquipment(0, new ItemStack(Items.STONE_SWORD)); - this.getAttributeInstance(GenericAttributes.e).setValue(4.0D); - } else { - this.goalSelector.a(4, this.bp); - this.bC(); - this.bD(); - } - - this.h(this.random.nextFloat() < 0.55F * this.world.b(this.locX, this.locY, this.locZ)); - if (this.getEquipment(4) == null) { - Calendar calendar = this.world.V(); - - if (calendar.get(2) + 1 == 10 && calendar.get(5) == 31 && this.random.nextFloat() < 0.25F) { - this.setEquipment(4, new ItemStack(this.random.nextFloat() < 0.1F ? Blocks.JACK_O_LANTERN : Blocks.PUMPKIN)); - this.dropChances[4] = 0.0F; - } - } - - return groupdataentity; - } - - public void bZ() { - this.goalSelector.a((PathfinderGoal) this.bq); - this.goalSelector.a((PathfinderGoal) this.bp); - ItemStack itemstack = this.be(); - - if (itemstack != null && itemstack.getItem() == Items.BOW) { - this.goalSelector.a(4, this.bp); - } else { - this.goalSelector.a(4, this.bq); - } - } - - public void a(EntityLiving entityliving, float f) { - EntityArrow entityarrow = new EntityArrow(this.world, this, entityliving, 1.6F, (float) (14 - this.world.difficulty.a() * 4)); - int i = EnchantmentManager.getEnchantmentLevel(Enchantment.ARROW_DAMAGE.id, this.be()); - int j = EnchantmentManager.getEnchantmentLevel(Enchantment.ARROW_KNOCKBACK.id, this.be()); - - entityarrow.b((double) (f * 2.0F) + this.random.nextGaussian() * 0.25D + (double) ((float) this.world.difficulty.a() * 0.11F)); - if (i > 0) { - entityarrow.b(entityarrow.e() + (double) i * 0.5D + 0.5D); - } - - if (j > 0) { - entityarrow.setKnockbackStrength(j); - } - - if (EnchantmentManager.getEnchantmentLevel(Enchantment.ARROW_FIRE.id, this.be()) > 0 || this.getSkeletonType() == 1) { - // CraftBukkit start - call EntityCombustEvent - EntityCombustEvent event = new EntityCombustEvent(entityarrow.getBukkitEntity(), 100); - this.world.getServer().getPluginManager().callEvent(event); - - if (!event.isCancelled()) { - entityarrow.setOnFire(event.getDuration()); - } - // CraftBukkit end - } - - // CraftBukkit start - org.bukkit.event.entity.EntityShootBowEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callEntityShootBowEvent(this, this.be(), entityarrow, 0.8F); - if (event.isCancelled()) { - event.getProjectile().remove(); - return; - } - - if (event.getProjectile() == entityarrow.getBukkitEntity()) { - world.addEntity(entityarrow); - } - // CraftBukkit end - - this.makeSound("random.bow", 1.0F, 1.0F / (this.aI().nextFloat() * 0.4F + 0.8F)); - // this.world.addEntity(entityarrow); // CraftBukkit - moved up - } - - public int getSkeletonType() { - return this.datawatcher.getByte(13); - } - - public void setSkeletonType(int i) { - this.datawatcher.watch(13, Byte.valueOf((byte) i)); - this.fireProof = i == 1; - if (i == 1) { - this.a(0.72F, 2.34F); - } else { - this.a(0.6F, 1.8F); - } - } - - public void a(NBTTagCompound nbttagcompound) { - super.a(nbttagcompound); - if (nbttagcompound.hasKeyOfType("SkeletonType", 99)) { - byte b0 = nbttagcompound.getByte("SkeletonType"); - - this.setSkeletonType(b0); - } - - this.bZ(); - } - - public void b(NBTTagCompound nbttagcompound) { - super.b(nbttagcompound); - nbttagcompound.setByte("SkeletonType", (byte) this.getSkeletonType()); - } - - public void setEquipment(int i, ItemStack itemstack) { - super.setEquipment(i, itemstack); - if (!this.world.isStatic && i == 0) { - this.bZ(); - } - } - - public double ad() { - return super.ad() - 0.5D; - } -} diff --git a/src/main/java/net/minecraft/server/EntitySlime.java b/src/main/java/net/minecraft/server/EntitySlime.java deleted file mode 100644 index 65cd24dd18..0000000000 --- a/src/main/java/net/minecraft/server/EntitySlime.java +++ /dev/null @@ -1,265 +0,0 @@ -package net.minecraft.server; - -// CraftBukkit start -import org.bukkit.craftbukkit.entity.CraftEntity; -import org.bukkit.craftbukkit.event.CraftEventFactory; -import org.bukkit.event.entity.EntityTargetEvent; -import org.bukkit.event.entity.SlimeSplitEvent; -// CraftBukkit end - -public class EntitySlime extends EntityInsentient implements IMonster { - - public float h; - public float i; - public float bm; - private int jumpDelay; - private Entity lastTarget; // CraftBukkit - - public EntitySlime(World world) { - super(world); - int i = 1 << this.random.nextInt(3); - - this.height = 0.0F; - this.jumpDelay = this.random.nextInt(20) + 10; - this.setSize(i); - } - - protected void c() { - super.c(); - this.datawatcher.a(16, new Byte((byte) 1)); - } - - // CraftBukkit - protected -> public - public void setSize(int i) { - this.datawatcher.watch(16, new Byte((byte) i)); - this.a(0.6F * (float) i, 0.6F * (float) i); - this.setPosition(this.locX, this.locY, this.locZ); - this.getAttributeInstance(GenericAttributes.maxHealth).setValue((double) (i * i)); - this.setHealth(this.getMaxHealth()); - this.b = i; - } - - public int getSize() { - return this.datawatcher.getByte(16); - } - - public void b(NBTTagCompound nbttagcompound) { - super.b(nbttagcompound); - nbttagcompound.setInt("Size", this.getSize() - 1); - } - - public void a(NBTTagCompound nbttagcompound) { - super.a(nbttagcompound); - int i = nbttagcompound.getInt("Size"); - - if (i < 0) { - i = 0; - } - - this.setSize(i + 1); - } - - protected String bP() { - return "slime"; - } - - protected String bV() { - return "mob.slime." + (this.getSize() > 1 ? "big" : "small"); - } - - public void h() { - if (!this.world.isStatic && this.world.difficulty == EnumDifficulty.PEACEFUL && this.getSize() > 0) { - this.dead = true; - } - - this.i += (this.h - this.i) * 0.5F; - this.bm = this.i; - boolean flag = this.onGround; - - super.h(); - int i; - - if (this.onGround && !flag) { - i = this.getSize(); - - for (int j = 0; j < i * 8; ++j) { - float f = this.random.nextFloat() * 3.1415927F * 2.0F; - float f1 = this.random.nextFloat() * 0.5F + 0.5F; - float f2 = MathHelper.sin(f) * (float) i * 0.5F * f1; - float f3 = MathHelper.cos(f) * (float) i * 0.5F * f1; - - this.world.addParticle(this.bP(), this.locX + (double) f2, this.boundingBox.b, this.locZ + (double) f3, 0.0D, 0.0D, 0.0D); - } - - if (this.bW()) { - this.makeSound(this.bV(), this.bf(), ((this.random.nextFloat() - this.random.nextFloat()) * 0.2F + 1.0F) / 0.8F); - } - - this.h = -0.5F; - } else if (!this.onGround && flag) { - this.h = 1.0F; - } - - this.bS(); - if (this.world.isStatic) { - i = this.getSize(); - this.a(0.6F * (float) i, 0.6F * (float) i); - } - } - - protected void bq() { - this.w(); - // CraftBukkit start - Entity entityhuman = this.world.findNearbyVulnerablePlayer(this, 16.0D); // EntityHuman -> Entity - EntityTargetEvent event = null; - - if (entityhuman != null && !entityhuman.equals(lastTarget)) { - event = CraftEventFactory.callEntityTargetEvent(this, entityhuman, EntityTargetEvent.TargetReason.CLOSEST_PLAYER); - } else if (lastTarget != null && entityhuman == null) { - event = CraftEventFactory.callEntityTargetEvent(this, entityhuman, EntityTargetEvent.TargetReason.FORGOT_TARGET); - } - - if (event != null && !event.isCancelled()) { - entityhuman = event.getTarget() == null ? null : ((CraftEntity) event.getTarget()).getHandle(); - } - - this.lastTarget = entityhuman; - // CraftBukkit end - - if (entityhuman != null) { - this.a(entityhuman, 10.0F, 20.0F); - } - - if (this.onGround && this.jumpDelay-- <= 0) { - this.jumpDelay = this.bR(); - if (entityhuman != null) { - this.jumpDelay /= 3; - } - - this.bc = true; - if (this.bY()) { - this.makeSound(this.bV(), this.bf(), ((this.random.nextFloat() - this.random.nextFloat()) * 0.2F + 1.0F) * 0.8F); - } - - this.bd = 1.0F - this.random.nextFloat() * 2.0F; - this.be = (float) (1 * this.getSize()); - } else { - this.bc = false; - if (this.onGround) { - this.bd = this.be = 0.0F; - } - } - } - - protected void bS() { - this.h *= 0.6F; - } - - protected int bR() { - return this.random.nextInt(20) + 10; - } - - protected EntitySlime bQ() { - return new EntitySlime(this.world); - } - - public void die() { - int i = this.getSize(); - - if (!this.world.isStatic && i > 1 && this.getHealth() <= 0.0F) { - int j = 2 + this.random.nextInt(3); - - // CraftBukkit start - SlimeSplitEvent event = new SlimeSplitEvent((org.bukkit.entity.Slime) this.getBukkitEntity(), j); - this.world.getServer().getPluginManager().callEvent(event); - - if (!event.isCancelled() && event.getCount() > 0) { - j = event.getCount(); - } else { - super.die(); - return; - } - // CraftBukkit end - - for (int k = 0; k < j; ++k) { - float f = ((float) (k % 2) - 0.5F) * (float) i / 4.0F; - float f1 = ((float) (k / 2) - 0.5F) * (float) i / 4.0F; - EntitySlime entityslime = this.bQ(); - - entityslime.setSize(i / 2); - entityslime.setPositionRotation(this.locX + (double) f, this.locY + 0.5D, this.locZ + (double) f1, this.random.nextFloat() * 360.0F, 0.0F); - this.world.addEntity(entityslime, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.SLIME_SPLIT); // CraftBukkit - SpawnReason - } - } - - super.die(); - } - - public void b_(EntityHuman entityhuman) { - if (this.bT()) { - int i = this.getSize(); - - if (this.hasLineOfSight(entityhuman) && this.f(entityhuman) < 0.6D * (double) i * 0.6D * (double) i && entityhuman.damageEntity(DamageSource.mobAttack(this), (float) this.bU())) { - this.makeSound("mob.attack", 1.0F, (this.random.nextFloat() - this.random.nextFloat()) * 0.2F + 1.0F); - } - } - } - - protected boolean bT() { - return this.getSize() > 1; - } - - protected int bU() { - return this.getSize(); - } - - protected String aT() { - return "mob.slime." + (this.getSize() > 1 ? "big" : "small"); - } - - protected String aU() { - return "mob.slime." + (this.getSize() > 1 ? "big" : "small"); - } - - protected Item getLoot() { - return this.getSize() == 1 ? Items.SLIME_BALL : Item.getById(0); - } - - public boolean canSpawn() { - Chunk chunk = this.world.getChunkAtWorldCoords(MathHelper.floor(this.locX), MathHelper.floor(this.locZ)); - - if (this.world.getWorldData().getType() == WorldType.FLAT && this.random.nextInt(4) != 1) { - return false; - } else { - if (this.getSize() == 1 || this.world.difficulty != EnumDifficulty.PEACEFUL) { - BiomeBase biomebase = this.world.getBiome(MathHelper.floor(this.locX), MathHelper.floor(this.locZ)); - - if (biomebase == BiomeBase.SWAMPLAND && this.locY > 50.0D && this.locY < 70.0D && this.random.nextFloat() < 0.5F && this.random.nextFloat() < this.world.y() && this.world.getLightLevel(MathHelper.floor(this.locX), MathHelper.floor(this.locY), MathHelper.floor(this.locZ)) <= this.random.nextInt(8)) { - return super.canSpawn(); - } - - if (this.random.nextInt(10) == 0 && chunk.a(987234911L).nextInt(10) == 0 && this.locY < 40.0D) { - return super.canSpawn(); - } - } - - return false; - } - } - - protected float bf() { - return 0.4F * (float) this.getSize(); - } - - public int x() { - return 0; - } - - protected boolean bY() { - return this.getSize() > 0; - } - - protected boolean bW() { - return this.getSize() > 2; - } -} diff --git a/src/main/java/net/minecraft/server/EntitySmallFireball.java b/src/main/java/net/minecraft/server/EntitySmallFireball.java deleted file mode 100644 index 4d61eec2c1..0000000000 --- a/src/main/java/net/minecraft/server/EntitySmallFireball.java +++ /dev/null @@ -1,85 +0,0 @@ -package net.minecraft.server; - -import org.bukkit.event.entity.EntityCombustByEntityEvent; // CraftBukkit - -public class EntitySmallFireball extends EntityFireball { - - public EntitySmallFireball(World world) { - super(world); - this.a(0.3125F, 0.3125F); - } - - public EntitySmallFireball(World world, EntityLiving entityliving, double d0, double d1, double d2) { - super(world, entityliving, d0, d1, d2); - this.a(0.3125F, 0.3125F); - } - - public EntitySmallFireball(World world, double d0, double d1, double d2, double d3, double d4, double d5) { - super(world, d0, d1, d2, d3, d4, d5); - this.a(0.3125F, 0.3125F); - } - - protected void a(MovingObjectPosition movingobjectposition) { - if (!this.world.isStatic) { - if (movingobjectposition.entity != null) { - if (!movingobjectposition.entity.isFireproof() && movingobjectposition.entity.damageEntity(DamageSource.fireball(this, this.shooter), 5.0F)) { - // CraftBukkit start - Entity damage by entity event + combust event - EntityCombustByEntityEvent event = new EntityCombustByEntityEvent((org.bukkit.entity.Projectile) this.getBukkitEntity(), movingobjectposition.entity.getBukkitEntity(), 5); - movingobjectposition.entity.world.getServer().getPluginManager().callEvent(event); - - if (!event.isCancelled()) { - movingobjectposition.entity.setOnFire(event.getDuration()); - } - // CraftBukkit end - } - } else { - int i = movingobjectposition.b; - int j = movingobjectposition.c; - int k = movingobjectposition.d; - - switch (movingobjectposition.face) { - case 0: - --j; - break; - - case 1: - ++j; - break; - - case 2: - --k; - break; - - case 3: - ++k; - break; - - case 4: - --i; - break; - - case 5: - ++i; - } - - if (this.world.isEmpty(i, j, k)) { - // CraftBukkit start - if (!org.bukkit.craftbukkit.event.CraftEventFactory.callBlockIgniteEvent(world, i, j, k, this).isCancelled()) { - this.world.setTypeUpdate(i, j, k, Blocks.FIRE); - } - // CraftBukkit end - } - } - - this.die(); - } - } - - public boolean R() { - return false; - } - - public boolean damageEntity(DamageSource damagesource, float f) { - return false; - } -} diff --git a/src/main/java/net/minecraft/server/EntitySnowman.java b/src/main/java/net/minecraft/server/EntitySnowman.java deleted file mode 100644 index 2811fb46cc..0000000000 --- a/src/main/java/net/minecraft/server/EntitySnowman.java +++ /dev/null @@ -1,89 +0,0 @@ -package net.minecraft.server; - -// CraftBukkit start -import org.bukkit.craftbukkit.event.CraftEventFactory; -import org.bukkit.craftbukkit.util.CraftMagicNumbers; -import org.bukkit.event.block.EntityBlockFormEvent; -// CraftBukkit end - -public class EntitySnowman extends EntityGolem implements IRangedEntity { - - public EntitySnowman(World world) { - super(world); - this.a(0.4F, 1.8F); - this.getNavigation().a(true); - this.goalSelector.a(1, new PathfinderGoalArrowAttack(this, 1.25D, 20, 10.0F)); - this.goalSelector.a(2, new PathfinderGoalRandomStroll(this, 1.0D)); - this.goalSelector.a(3, new PathfinderGoalLookAtPlayer(this, EntityHuman.class, 6.0F)); - this.goalSelector.a(4, new PathfinderGoalRandomLookaround(this)); - this.targetSelector.a(1, new PathfinderGoalNearestAttackableTarget(this, EntityInsentient.class, 0, true, false, IMonster.a)); - } - - public boolean bk() { - return true; - } - - protected void aD() { - super.aD(); - this.getAttributeInstance(GenericAttributes.maxHealth).setValue(4.0D); - this.getAttributeInstance(GenericAttributes.d).setValue(0.20000000298023224D); - } - - public void e() { - super.e(); - int i = MathHelper.floor(this.locX); - int j = MathHelper.floor(this.locY); - int k = MathHelper.floor(this.locZ); - - if (this.L()) { - this.damageEntity(DamageSource.DROWN, 1.0F); - } - - if (this.world.getBiome(i, k).a(i, j, k) > 1.0F) { - this.damageEntity(CraftEventFactory.MELTING, 1.0F); // CraftBukkit - DamageSource.BURN -> CraftEventFactory.MELTING - } - - for (int l = 0; l < 4; ++l) { - i = MathHelper.floor(this.locX + (double) ((float) (l % 2 * 2 - 1) * 0.25F)); - j = MathHelper.floor(this.locY); - k = MathHelper.floor(this.locZ + (double) ((float) (l / 2 % 2 * 2 - 1) * 0.25F)); - if (this.world.getType(i, j, k).getMaterial() == Material.AIR && this.world.getBiome(i, k).a(i, j, k) < 0.8F && Blocks.SNOW.canPlace(this.world, i, j, k)) { - // CraftBukkit start - org.bukkit.block.BlockState blockState = this.world.getWorld().getBlockAt(i, j, k).getState(); - blockState.setType(CraftMagicNumbers.getMaterial(Blocks.SNOW)); - - EntityBlockFormEvent event = new EntityBlockFormEvent(this.getBukkitEntity(), blockState.getBlock(), blockState); - this.world.getServer().getPluginManager().callEvent(event); - - if(!event.isCancelled()) { - blockState.update(true); - } - // CraftBukkit end - } - } - } - - protected Item getLoot() { - return Items.SNOW_BALL; - } - - protected void dropDeathLoot(boolean flag, int i) { - int j = this.random.nextInt(16); - - for (int k = 0; k < j; ++k) { - this.a(Items.SNOW_BALL, 1); - } - } - - public void a(EntityLiving entityliving, float f) { - EntitySnowball entitysnowball = new EntitySnowball(this.world, this); - double d0 = entityliving.locX - this.locX; - double d1 = entityliving.locY + (double) entityliving.getHeadHeight() - 1.100000023841858D - entitysnowball.locY; - double d2 = entityliving.locZ - this.locZ; - float f1 = MathHelper.sqrt(d0 * d0 + d2 * d2) * 0.2F; - - entitysnowball.shoot(d0, d1 + (double) f1, d2, 1.6F, 12.0F); - this.makeSound("random.bow", 1.0F, 1.0F / (this.aI().nextFloat() * 0.4F + 0.8F)); - this.world.addEntity(entitysnowball); - } -} diff --git a/src/main/java/net/minecraft/server/EntitySpider.java b/src/main/java/net/minecraft/server/EntitySpider.java deleted file mode 100644 index 997044786c..0000000000 --- a/src/main/java/net/minecraft/server/EntitySpider.java +++ /dev/null @@ -1,162 +0,0 @@ -package net.minecraft.server; - -import org.bukkit.event.entity.EntityTargetEvent; // CraftBukkit - -public class EntitySpider extends EntityMonster { - - public EntitySpider(World world) { - super(world); - this.a(1.4F, 0.9F); - } - - protected void c() { - super.c(); - this.datawatcher.a(16, new Byte((byte) 0)); - } - - public void h() { - super.h(); - if (!this.world.isStatic) { - this.a(this.positionChanged); - } - } - - protected void aD() { - super.aD(); - this.getAttributeInstance(GenericAttributes.maxHealth).setValue(16.0D); - this.getAttributeInstance(GenericAttributes.d).setValue(0.800000011920929D); - } - - protected Entity findTarget() { - float f = this.d(1.0F); - - if (f < 0.5F) { - double d0 = 16.0D; - - return this.world.findNearbyVulnerablePlayer(this, d0); - } else { - return null; - } - } - - protected String t() { - return "mob.spider.say"; - } - - protected String aT() { - return "mob.spider.say"; - } - - protected String aU() { - return "mob.spider.death"; - } - - protected void a(int i, int j, int k, Block block) { - this.makeSound("mob.spider.step", 0.15F, 1.0F); - } - - protected void a(Entity entity, float f) { - float f1 = this.d(1.0F); - - if (f1 > 0.5F && this.random.nextInt(100) == 0) { - // CraftBukkit start - EntityTargetEvent event = new EntityTargetEvent(this.getBukkitEntity(), null, EntityTargetEvent.TargetReason.FORGOT_TARGET); - this.world.getServer().getPluginManager().callEvent(event); - - if (!event.isCancelled()) { - if (event.getTarget() == null) { - this.target = null; - } else { - this.target = ((org.bukkit.craftbukkit.entity.CraftEntity) event.getTarget()).getHandle(); - } - return; - } - // CraftBukkit end - } else { - if (f > 2.0F && f < 6.0F && this.random.nextInt(10) == 0) { - if (this.onGround) { - double d0 = entity.locX - this.locX; - double d1 = entity.locZ - this.locZ; - float f2 = MathHelper.sqrt(d0 * d0 + d1 * d1); - - this.motX = d0 / (double) f2 * 0.5D * 0.800000011920929D + this.motX * 0.20000000298023224D; - this.motZ = d1 / (double) f2 * 0.5D * 0.800000011920929D + this.motZ * 0.20000000298023224D; - this.motY = 0.4000000059604645D; - } - } else { - super.a(entity, f); - } - } - } - - protected Item getLoot() { - return Items.STRING; - } - - protected void dropDeathLoot(boolean flag, int i) { - super.dropDeathLoot(flag, i); - if (flag && (this.random.nextInt(3) == 0 || this.random.nextInt(1 + i) > 0)) { - this.a(Items.SPIDER_EYE, 1); - } - } - - public boolean h_() { - return this.bZ(); - } - - public void as() {} - - public EnumMonsterType getMonsterType() { - return EnumMonsterType.ARTHROPOD; - } - - public boolean d(MobEffect mobeffect) { - return mobeffect.getEffectId() == MobEffectList.POISON.id ? false : super.d(mobeffect); - } - - public boolean bZ() { - return (this.datawatcher.getByte(16) & 1) != 0; - } - - public void a(boolean flag) { - byte b0 = this.datawatcher.getByte(16); - - if (flag) { - b0 = (byte) (b0 | 1); - } else { - b0 &= -2; - } - - this.datawatcher.watch(16, Byte.valueOf(b0)); - } - - public GroupDataEntity prepare(GroupDataEntity groupdataentity) { - Object object = super.prepare(groupdataentity); - - if (this.world.random.nextInt(100) == 0) { - EntitySkeleton entityskeleton = new EntitySkeleton(this.world); - - entityskeleton.setPositionRotation(this.locX, this.locY, this.locZ, this.yaw, 0.0F); - entityskeleton.prepare((GroupDataEntity) null); - this.world.addEntity(entityskeleton, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.JOCKEY); // CraftBukkit - add SpawnReason - entityskeleton.mount(this); - } - - if (object == null) { - object = new GroupDataSpider(); - if (this.world.difficulty == EnumDifficulty.HARD && this.world.random.nextFloat() < 0.1F * this.world.b(this.locX, this.locY, this.locZ)) { - ((GroupDataSpider) object).a(this.world.random); - } - } - - if (object instanceof GroupDataSpider) { - int i = ((GroupDataSpider) object).a; - - if (i > 0 && MobEffectList.byId[i] != null) { - this.addEffect(new MobEffect(i, Integer.MAX_VALUE)); - } - } - - return (GroupDataEntity) object; - } -} diff --git a/src/main/java/net/minecraft/server/EntitySquid.java b/src/main/java/net/minecraft/server/EntitySquid.java deleted file mode 100644 index 6e6d612b54..0000000000 --- a/src/main/java/net/minecraft/server/EntitySquid.java +++ /dev/null @@ -1,151 +0,0 @@ -package net.minecraft.server; - -import org.bukkit.craftbukkit.TrigMath; // CraftBukkit - -public class EntitySquid extends EntityWaterAnimal { - - public float bp; - public float bq; - public float br; - public float bs; - public float bt; - public float bu; - public float bv; - public float bw; - private float bx; - private float by; - private float bz; - private float bA; - private float bB; - private float bC; - - public EntitySquid(World world) { - super(world); - this.a(0.95F, 0.95F); - this.by = 1.0F / (this.random.nextFloat() + 1.0F) * 0.2F; - } - - protected void aD() { - super.aD(); - this.getAttributeInstance(GenericAttributes.maxHealth).setValue(10.0D); - } - - protected String t() { - return null; - } - - protected String aT() { - return null; - } - - protected String aU() { - return null; - } - - protected float bf() { - return 0.4F; - } - - protected Item getLoot() { - return Item.getById(0); - } - - protected boolean g_() { - return false; - } - - protected void dropDeathLoot(boolean flag, int i) { - int j = this.random.nextInt(3 + i) + 1; - - for (int k = 0; k < j; ++k) { - this.a(new ItemStack(Items.INK_SACK, 1, 0), 0.0F); - } - } - - /* CraftBukkit start - Delegate to Entity to use existing inWater value - public boolean M() { - return this.world.a(this.boundingBox.grow(0.0D, -0.6000000238418579D, 0.0D), Material.WATER, (Entity) this); - } - // CraftBukkit end */ - - public void e() { - super.e(); - this.bq = this.bp; - this.bs = this.br; - this.bu = this.bt; - this.bw = this.bv; - this.bt += this.by; - if (this.bt > 6.2831855F) { - this.bt -= 6.2831855F; - if (this.random.nextInt(10) == 0) { - this.by = 1.0F / (this.random.nextFloat() + 1.0F) * 0.2F; - } - } - - if (this.M()) { - float f; - - if (this.bt < 3.1415927F) { - f = this.bt / 3.1415927F; - this.bv = MathHelper.sin(f * f * 3.1415927F) * 3.1415927F * 0.25F; - if ((double) f > 0.75D) { - this.bx = 1.0F; - this.bz = 1.0F; - } else { - this.bz *= 0.8F; - } - } else { - this.bv = 0.0F; - this.bx *= 0.9F; - this.bz *= 0.99F; - } - - if (!this.world.isStatic) { - this.motX = (double) (this.bA * this.bx); - this.motY = (double) (this.bB * this.bx); - this.motZ = (double) (this.bC * this.bx); - } - - f = MathHelper.sqrt(this.motX * this.motX + this.motZ * this.motZ); - // CraftBukkit - Math -> TrigMath - this.aM += (-((float) TrigMath.atan2(this.motX, this.motZ)) * 180.0F / 3.1415927F - this.aM) * 0.1F; - this.yaw = this.aM; - this.br += 3.1415927F * this.bz * 1.5F; - // CraftBukkit - Math -> TrigMath - this.bp += (-((float) TrigMath.atan2((double) f, this.motY)) * 180.0F / 3.1415927F - this.bp) * 0.1F; - } else { - this.bv = MathHelper.abs(MathHelper.sin(this.bt)) * 3.1415927F * 0.25F; - if (!this.world.isStatic) { - this.motX = 0.0D; - this.motY -= 0.08D; - this.motY *= 0.9800000190734863D; - this.motZ = 0.0D; - } - - this.bp = (float) ((double) this.bp + (double) (-90.0F - this.bp) * 0.02D); - } - } - - public void e(float f, float f1) { - this.move(this.motX, this.motY, this.motZ); - } - - protected void bq() { - ++this.aU; - if (this.aU > 100) { - this.bA = this.bB = this.bC = 0.0F; - } else if (this.random.nextInt(50) == 0 || !this.inWater || this.bA == 0.0F && this.bB == 0.0F && this.bC == 0.0F) { - float f = this.random.nextFloat() * 3.1415927F * 2.0F; - - this.bA = MathHelper.cos(f) * 0.2F; - this.bB = -0.1F + this.random.nextFloat() * 0.2F; - this.bC = MathHelper.sin(f) * 0.2F; - } - - this.w(); - } - - public boolean canSpawn() { - return this.locY > 45.0D && this.locY < 63.0D && super.canSpawn(); - } -} diff --git a/src/main/java/net/minecraft/server/EntityTNTPrimed.java b/src/main/java/net/minecraft/server/EntityTNTPrimed.java deleted file mode 100644 index 13cbc79b59..0000000000 --- a/src/main/java/net/minecraft/server/EntityTNTPrimed.java +++ /dev/null @@ -1,98 +0,0 @@ -package net.minecraft.server; - -import org.bukkit.event.entity.ExplosionPrimeEvent; // CraftBukkit - -public class EntityTNTPrimed extends Entity { - - public int fuseTicks; - private EntityLiving source; - public float yield = 4; // CraftBukkit - add field - public boolean isIncendiary = false; // CraftBukkit - add field - - public EntityTNTPrimed(World world) { - super(world); - this.k = true; - this.a(0.98F, 0.98F); - this.height = this.length / 2.0F; - } - - public EntityTNTPrimed(World world, double d0, double d1, double d2, EntityLiving entityliving) { - this(world); - this.setPosition(d0, d1, d2); - float f = (float) (Math.random() * 3.1415927410125732D * 2.0D); - - this.motX = (double) (-((float) Math.sin((double) f)) * 0.02F); - this.motY = 0.20000000298023224D; - this.motZ = (double) (-((float) Math.cos((double) f)) * 0.02F); - this.fuseTicks = 80; - this.lastX = d0; - this.lastY = d1; - this.lastZ = d2; - this.source = entityliving; - } - - protected void c() {} - - protected boolean g_() { - return false; - } - - public boolean R() { - return !this.dead; - } - - public void h() { - this.lastX = this.locX; - this.lastY = this.locY; - this.lastZ = this.locZ; - this.motY -= 0.03999999910593033D; - this.move(this.motX, this.motY, this.motZ); - this.motX *= 0.9800000190734863D; - this.motY *= 0.9800000190734863D; - this.motZ *= 0.9800000190734863D; - if (this.onGround) { - this.motX *= 0.699999988079071D; - this.motZ *= 0.699999988079071D; - this.motY *= -0.5D; - } - - if (this.fuseTicks-- <= 0) { - // CraftBukkit start - Need to reverse the order of the explosion and the entity death so we have a location for the event - if (!this.world.isStatic) { - this.explode(); - } - this.die(); - // CraftBukkit end - } else { - this.world.addParticle("smoke", this.locX, this.locY + 0.5D, this.locZ, 0.0D, 0.0D, 0.0D); - } - } - - private void explode() { - // CraftBukkit start - // float f = 4.0F; - - org.bukkit.craftbukkit.CraftServer server = this.world.getServer(); - - ExplosionPrimeEvent event = new ExplosionPrimeEvent((org.bukkit.entity.Explosive) org.bukkit.craftbukkit.entity.CraftEntity.getEntity(server, this)); - server.getPluginManager().callEvent(event); - - if (!event.isCancelled()) { - // give 'this' instead of (Entity) null so we know what causes the damage - this.world.createExplosion(this, this.locX, this.locY, this.locZ, event.getRadius(), event.getFire(), true); - } - // CraftBukkit end - } - - protected void b(NBTTagCompound nbttagcompound) { - nbttagcompound.setByte("Fuse", (byte) this.fuseTicks); - } - - protected void a(NBTTagCompound nbttagcompound) { - this.fuseTicks = nbttagcompound.getByte("Fuse"); - } - - public EntityLiving getSource() { - return this.source; - } -} diff --git a/src/main/java/net/minecraft/server/EntityThrownExpBottle.java b/src/main/java/net/minecraft/server/EntityThrownExpBottle.java deleted file mode 100644 index 68625a4858..0000000000 --- a/src/main/java/net/minecraft/server/EntityThrownExpBottle.java +++ /dev/null @@ -1,53 +0,0 @@ -package net.minecraft.server; - -public class EntityThrownExpBottle extends EntityProjectile { - - public EntityThrownExpBottle(World world) { - super(world); - } - - public EntityThrownExpBottle(World world, EntityLiving entityliving) { - super(world, entityliving); - } - - public EntityThrownExpBottle(World world, double d0, double d1, double d2) { - super(world, d0, d1, d2); - } - - protected float i() { - return 0.07F; - } - - protected float e() { - return 0.7F; - } - - protected float f() { - return -20.0F; - } - - protected void a(MovingObjectPosition movingobjectposition) { - if (!this.world.isStatic) { - // CraftBukkit - moved to after event - // this.world.triggerEffect(2002, (int) Math.round(this.locX), (int) Math.round(this.locY), (int) Math.round(this.locZ), 0); - int i = 3 + this.world.random.nextInt(5) + this.world.random.nextInt(5); - - // CraftBukkit start - org.bukkit.event.entity.ExpBottleEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callExpBottleEvent(this, i); - i = event.getExperience(); - if (event.getShowEffect()) { - this.world.triggerEffect(2002, (int) Math.round(this.locX), (int) Math.round(this.locY), (int) Math.round(this.locZ), 0); - } - // CraftBukkit end - - while (i > 0) { - int j = EntityExperienceOrb.getOrbValue(i); - - i -= j; - this.world.addEntity(new EntityExperienceOrb(this.world, this.locX, this.locY, this.locZ, j)); - } - - this.die(); - } - } -} diff --git a/src/main/java/net/minecraft/server/EntityTracker.java b/src/main/java/net/minecraft/server/EntityTracker.java deleted file mode 100644 index 1af0e67e17..0000000000 --- a/src/main/java/net/minecraft/server/EntityTracker.java +++ /dev/null @@ -1,211 +0,0 @@ -package net.minecraft.server; - -import java.util.ArrayList; -import java.util.HashSet; -import java.util.Iterator; -import java.util.Set; -import java.util.concurrent.Callable; - -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; - -public class EntityTracker { - - private static final Logger a = LogManager.getLogger(); - private final WorldServer world; - private Set c = new HashSet(); - public IntHashMap trackedEntities = new IntHashMap(); // CraftBukkit - private -> public - private int e; - - public EntityTracker(WorldServer worldserver) { - this.world = worldserver; - this.e = worldserver.getMinecraftServer().getPlayerList().d(); - } - - public void track(Entity entity) { - if (entity instanceof EntityPlayer) { - this.addEntity(entity, 512, 2); - EntityPlayer entityplayer = (EntityPlayer) entity; - Iterator iterator = this.c.iterator(); - - while (iterator.hasNext()) { - EntityTrackerEntry entitytrackerentry = (EntityTrackerEntry) iterator.next(); - - if (entitytrackerentry.tracker != entityplayer) { - entitytrackerentry.updatePlayer(entityplayer); - } - } - } else if (entity instanceof EntityFishingHook) { - this.addEntity(entity, 64, 5, true); - } else if (entity instanceof EntityArrow) { - this.addEntity(entity, 64, 20, false); - } else if (entity instanceof EntitySmallFireball) { - this.addEntity(entity, 64, 10, false); - } else if (entity instanceof EntityFireball) { - this.addEntity(entity, 64, 10, false); - } else if (entity instanceof EntitySnowball) { - this.addEntity(entity, 64, 10, true); - } else if (entity instanceof EntityEnderPearl) { - this.addEntity(entity, 64, 10, true); - } else if (entity instanceof EntityEnderSignal) { - this.addEntity(entity, 64, 4, true); - } else if (entity instanceof EntityEgg) { - this.addEntity(entity, 64, 10, true); - } else if (entity instanceof EntityPotion) { - 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 EntityMinecartAbstract) { - this.addEntity(entity, 80, 3, true); - } else if (entity instanceof EntityBoat) { - this.addEntity(entity, 80, 3, true); - } else if (entity instanceof EntitySquid) { - this.addEntity(entity, 64, 3, true); - } else if (entity instanceof EntityWither) { - this.addEntity(entity, 80, 3, false); - } else if (entity instanceof EntityBat) { - this.addEntity(entity, 80, 3, false); - } else if (entity instanceof IAnimal) { - this.addEntity(entity, 80, 3, true); - } else if (entity instanceof EntityEnderDragon) { - this.addEntity(entity, 160, 3, true); - } else if (entity instanceof EntityTNTPrimed) { - this.addEntity(entity, 160, 10, true); - } else if (entity instanceof EntityFallingBlock) { - this.addEntity(entity, 160, 20, true); - } else if (entity instanceof EntityHanging) { - this.addEntity(entity, 160, Integer.MAX_VALUE, false); - } else if (entity instanceof EntityExperienceOrb) { - this.addEntity(entity, 160, 20, true); - } else if (entity instanceof EntityEnderCrystal) { - this.addEntity(entity, 256, Integer.MAX_VALUE, false); - } - } - - public void addEntity(Entity entity, int i, int j) { - this.addEntity(entity, i, j, false); - } - - public void addEntity(Entity entity, int i, int j, boolean flag) { - if (i > this.e) { - i = this.e; - } - - try { - if (this.trackedEntities.b(entity.getId())) { - throw new IllegalStateException("Entity is already tracked!"); - } - - EntityTrackerEntry entitytrackerentry = new EntityTrackerEntry(entity, i, j, flag); - - this.c.add(entitytrackerentry); - this.trackedEntities.a(entity.getId(), entitytrackerentry); - entitytrackerentry.scanPlayers(this.world.players); - } catch (Throwable throwable) { - CrashReport crashreport = CrashReport.a(throwable, "Adding entity to track"); - CrashReportSystemDetails crashreportsystemdetails = crashreport.a("Entity To Track"); - - crashreportsystemdetails.a("Tracking range", (i + " blocks")); - crashreportsystemdetails.a("Update interval", (Callable) (new CrashReportEntityTrackerUpdateInterval(this, j))); - entity.a(crashreportsystemdetails); - CrashReportSystemDetails crashreportsystemdetails1 = crashreport.a("Entity That Is Already Tracked"); - - ((EntityTrackerEntry) this.trackedEntities.get(entity.getId())).tracker.a(crashreportsystemdetails1); - - try { - throw new ReportedException(crashreport); - } catch (ReportedException reportedexception) { - a.error("\"Silently\" catching entity tracking error.", reportedexception); - } - } - } - - public void untrackEntity(Entity entity) { - if (entity instanceof EntityPlayer) { - EntityPlayer entityplayer = (EntityPlayer) entity; - Iterator iterator = this.c.iterator(); - - while (iterator.hasNext()) { - EntityTrackerEntry entitytrackerentry = (EntityTrackerEntry) iterator.next(); - - entitytrackerentry.a(entityplayer); - } - } - - EntityTrackerEntry entitytrackerentry1 = (EntityTrackerEntry) this.trackedEntities.d(entity.getId()); - - if (entitytrackerentry1 != null) { - this.c.remove(entitytrackerentry1); - entitytrackerentry1.a(); - } - } - - public void updatePlayers() { - ArrayList arraylist = new ArrayList(); - Iterator iterator = this.c.iterator(); - - while (iterator.hasNext()) { - EntityTrackerEntry entitytrackerentry = (EntityTrackerEntry) iterator.next(); - - entitytrackerentry.track(this.world.players); - if (entitytrackerentry.n && entitytrackerentry.tracker instanceof EntityPlayer) { - arraylist.add((EntityPlayer) entitytrackerentry.tracker); - } - } - - for (int i = 0; i < arraylist.size(); ++i) { - EntityPlayer entityplayer = (EntityPlayer) arraylist.get(i); - Iterator iterator1 = this.c.iterator(); - - while (iterator1.hasNext()) { - EntityTrackerEntry entitytrackerentry1 = (EntityTrackerEntry) iterator1.next(); - - if (entitytrackerentry1.tracker != entityplayer) { - entitytrackerentry1.updatePlayer(entityplayer); - } - } - } - } - - public void a(Entity entity, Packet packet) { - EntityTrackerEntry entitytrackerentry = (EntityTrackerEntry) this.trackedEntities.get(entity.getId()); - - if (entitytrackerentry != null) { - entitytrackerentry.broadcast(packet); - } - } - - public void sendPacketToEntity(Entity entity, Packet packet) { - EntityTrackerEntry entitytrackerentry = (EntityTrackerEntry) this.trackedEntities.get(entity.getId()); - - if (entitytrackerentry != null) { - entitytrackerentry.broadcastIncludingSelf(packet); - } - } - - public void untrackPlayer(EntityPlayer entityplayer) { - Iterator iterator = this.c.iterator(); - - while (iterator.hasNext()) { - EntityTrackerEntry entitytrackerentry = (EntityTrackerEntry) iterator.next(); - - entitytrackerentry.clear(entityplayer); - } - } - - public void a(EntityPlayer entityplayer, Chunk chunk) { - Iterator iterator = this.c.iterator(); - - while (iterator.hasNext()) { - EntityTrackerEntry entitytrackerentry = (EntityTrackerEntry) iterator.next(); - - if (entitytrackerentry.tracker != entityplayer && entitytrackerentry.tracker.ah == chunk.locX && entitytrackerentry.tracker.aj == chunk.locZ) { - entitytrackerentry.updatePlayer(entityplayer); - } - } - } -} diff --git a/src/main/java/net/minecraft/server/EntityTrackerEntry.java b/src/main/java/net/minecraft/server/EntityTrackerEntry.java deleted file mode 100644 index 0cf9ad5ba9..0000000000 --- a/src/main/java/net/minecraft/server/EntityTrackerEntry.java +++ /dev/null @@ -1,523 +0,0 @@ -package net.minecraft.server; - -import java.util.Collection; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Set; - -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; - -// CraftBukkit start -import org.bukkit.entity.Player; -import org.bukkit.event.player.PlayerVelocityEvent; -// CraftBukkit end - -public class EntityTrackerEntry { - - private static final Logger p = LogManager.getLogger(); - public Entity tracker; - public int b; - public int c; - public int xLoc; - public int yLoc; - public int zLoc; - public int yRot; - public int xRot; - public int i; - public double j; - public double k; - public double l; - public int m; - private double q; - private double r; - private double s; - private boolean isMoving; - private boolean u; - private int v; - private Entity w; - private boolean x; - public boolean n; - public Set trackedPlayers = new HashSet(); - - public EntityTrackerEntry(Entity entity, int i, int j, boolean flag) { - this.tracker = entity; - this.b = i; - this.c = j; - this.u = flag; - this.xLoc = MathHelper.floor(entity.locX * 32.0D); - this.yLoc = MathHelper.floor(entity.locY * 32.0D); - this.zLoc = MathHelper.floor(entity.locZ * 32.0D); - this.yRot = MathHelper.d(entity.yaw * 256.0F / 360.0F); - this.xRot = MathHelper.d(entity.pitch * 256.0F / 360.0F); - this.i = MathHelper.d(entity.getHeadRotation() * 256.0F / 360.0F); - } - - public boolean equals(Object object) { - return object instanceof EntityTrackerEntry ? ((EntityTrackerEntry) object).tracker.getId() == this.tracker.getId() : false; - } - - public int hashCode() { - return this.tracker.getId(); - } - - public void track(List list) { - this.n = false; - if (!this.isMoving || this.tracker.e(this.q, this.r, this.s) > 16.0D) { - this.q = this.tracker.locX; - this.r = this.tracker.locY; - this.s = this.tracker.locZ; - this.isMoving = true; - this.n = true; - this.scanPlayers(list); - } - - if (this.w != this.tracker.vehicle || this.tracker.vehicle != null && this.m % 60 == 0) { - this.w = this.tracker.vehicle; - this.broadcast(new PacketPlayOutAttachEntity(0, this.tracker, this.tracker.vehicle)); - } - - if (this.tracker instanceof EntityItemFrame /*&& this.m % 10 == 0*/) { // CraftBukkit - Moved below, should always enter this block - EntityItemFrame i3 = (EntityItemFrame) this.tracker; - ItemStack i4 = i3.getItem(); - - if (this.m % 10 == 0 && i4 != null && i4.getItem() instanceof ItemWorldMap) { // CraftBukkit - Moved this.m % 10 logic here so item frames do not enter the other blocks - WorldMap i6 = Items.MAP.getSavedMap(i4, this.tracker.world); - Iterator i7 = this.trackedPlayers.iterator(); // CraftBukkit - - while (i7.hasNext()) { - EntityHuman i8 = (EntityHuman) i7.next(); - EntityPlayer i9 = (EntityPlayer) i8; - - i6.a(i9, i4); - Packet j0 = Items.MAP.c(i4, this.tracker.world, i9); - - if (j0 != null) { - i9.playerConnection.sendPacket(j0); - } - } - } - - this.b(); - } else if (this.m % this.c == 0 || this.tracker.al || this.tracker.getDataWatcher().a()) { - int i; - int j; - - if (this.tracker.vehicle == null) { - ++this.v; - i = this.tracker.as.a(this.tracker.locX); - j = MathHelper.floor(this.tracker.locY * 32.0D); - 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; - int k1 = j - this.yLoc; - int l1 = k - this.zLoc; - Object object = null; - boolean flag = Math.abs(j1) >= 4 || Math.abs(k1) >= 4 || Math.abs(l1) >= 4 || this.m % 60 == 0; - boolean flag1 = Math.abs(l - this.yRot) >= 4 || Math.abs(i1 - this.xRot) >= 4; - - // CraftBukkit start - Code moved from below - if (flag) { - this.xLoc = i; - this.yLoc = j; - this.zLoc = k; - } - - if (flag1) { - this.yRot = l; - this.xRot = i1; - } - // CraftBukkit end - - if (this.m > 0 || this.tracker instanceof EntityArrow) { - if (j1 >= -128 && j1 < 128 && k1 >= -128 && k1 < 128 && l1 >= -128 && l1 < 128 && this.v <= 400 && !this.x) { - if (flag && flag1) { - object = new PacketPlayOutRelEntityMoveLook(this.tracker.getId(), (byte) j1, (byte) k1, (byte) l1, (byte) l, (byte) i1); - } else if (flag) { - object = new PacketPlayOutRelEntityMove(this.tracker.getId(), (byte) j1, (byte) k1, (byte) l1); - } else if (flag1) { - object = new PacketPlayOutEntityLook(this.tracker.getId(), (byte) l, (byte) i1); - } - } else { - this.v = 0; - // CraftBukkit start - Refresh list of who can see a player before sending teleport packet - if (this.tracker instanceof EntityPlayer) { - this.scanPlayers(new java.util.ArrayList(this.trackedPlayers)); - } - // CraftBukkit end - object = new PacketPlayOutEntityTeleport(this.tracker.getId(), i, j, k, (byte) l, (byte) i1); - } - } - - if (this.u) { - double d0 = this.tracker.motX - this.j; - double d1 = this.tracker.motY - this.k; - double d2 = this.tracker.motZ - this.l; - double d3 = 0.02D; - double d4 = d0 * d0 + d1 * d1 + d2 * d2; - - if (d4 > d3 * d3 || d4 > 0.0D && this.tracker.motX == 0.0D && this.tracker.motY == 0.0D && this.tracker.motZ == 0.0D) { - this.j = this.tracker.motX; - this.k = this.tracker.motY; - this.l = this.tracker.motZ; - this.broadcast(new PacketPlayOutEntityVelocity(this.tracker.getId(), this.j, this.k, this.l)); - } - } - - if (object != null) { - this.broadcast((Packet) object); - } - - this.b(); - /* CraftBukkit start - Code moved up - if (flag) { - this.xLoc = i; - this.yLoc = j; - this.zLoc = k; - } - - if (flag1) { - this.yRot = l; - this.xRot = i1; - } - // CraftBukkit end */ - - this.x = false; - } else { - i = MathHelper.d(this.tracker.yaw * 256.0F / 360.0F); - j = MathHelper.d(this.tracker.pitch * 256.0F / 360.0F); - boolean flag2 = Math.abs(i - this.yRot) >= 4 || Math.abs(j - this.xRot) >= 4; - - if (flag2) { - this.broadcast(new PacketPlayOutEntityLook(this.tracker.getId(), (byte) i, (byte) j)); - this.yRot = i; - this.xRot = j; - } - - this.xLoc = this.tracker.as.a(this.tracker.locX); - this.yLoc = MathHelper.floor(this.tracker.locY * 32.0D); - this.zLoc = this.tracker.as.a(this.tracker.locZ); - this.b(); - this.x = true; - } - - i = MathHelper.d(this.tracker.getHeadRotation() * 256.0F / 360.0F); - if (Math.abs(i - this.i) >= 4) { - this.broadcast(new PacketPlayOutEntityHeadRotation(this.tracker, (byte) i)); - this.i = i; - } - - this.tracker.al = false; - } - - ++this.m; - if (this.tracker.velocityChanged) { - // CraftBukkit start - Create PlayerVelocity event - boolean cancelled = false; - - if (this.tracker instanceof EntityPlayer) { - Player player = (Player) this.tracker.getBukkitEntity(); - org.bukkit.util.Vector velocity = player.getVelocity(); - - PlayerVelocityEvent event = new PlayerVelocityEvent(player, velocity); - this.tracker.world.getServer().getPluginManager().callEvent(event); - - if (event.isCancelled()) { - cancelled = true; - } else if (!velocity.equals(event.getVelocity())) { - player.setVelocity(velocity); - } - } - - if (!cancelled) { - this.broadcastIncludingSelf((Packet) (new PacketPlayOutEntityVelocity(this.tracker))); - } - // CraftBukkit end - - this.tracker.velocityChanged = false; - } - } - - private void b() { - DataWatcher datawatcher = this.tracker.getDataWatcher(); - - if (datawatcher.a()) { - this.broadcastIncludingSelf(new PacketPlayOutEntityMetadata(this.tracker.getId(), datawatcher, false)); - } - - if (this.tracker instanceof EntityLiving) { - AttributeMapServer attributemapserver = (AttributeMapServer) ((EntityLiving) this.tracker).getAttributeMap(); - Set set = attributemapserver.getAttributes(); - - if (!set.isEmpty()) { - // CraftBukkit start - Send scaled max health - if (this.tracker instanceof EntityPlayer) { - ((EntityPlayer) this.tracker).getBukkitEntity().injectScaledMaxHealth(set, false); - } - // CraftBukkit end - this.broadcastIncludingSelf(new PacketPlayOutUpdateAttributes(this.tracker.getId(), set)); - } - - set.clear(); - } - } - - public void broadcast(Packet packet) { - Iterator iterator = this.trackedPlayers.iterator(); - - while (iterator.hasNext()) { - EntityPlayer entityplayer = (EntityPlayer) iterator.next(); - - entityplayer.playerConnection.sendPacket(packet); - } - } - - public void broadcastIncludingSelf(Packet packet) { - this.broadcast(packet); - if (this.tracker instanceof EntityPlayer) { - ((EntityPlayer) this.tracker).playerConnection.sendPacket(packet); - } - } - - public void a() { - Iterator iterator = this.trackedPlayers.iterator(); - - while (iterator.hasNext()) { - EntityPlayer entityplayer = (EntityPlayer) iterator.next(); - - entityplayer.d(this.tracker); - } - } - - public void a(EntityPlayer entityplayer) { - if (this.trackedPlayers.contains(entityplayer)) { - entityplayer.d(this.tracker); - this.trackedPlayers.remove(entityplayer); - } - } - - public void updatePlayer(EntityPlayer entityplayer) { - if (entityplayer != this.tracker) { - double d0 = entityplayer.locX - (double) (this.xLoc / 32); - double d1 = entityplayer.locZ - (double) (this.zLoc / 32); - - if (d0 >= (double) (-this.b) && d0 <= (double) this.b && d1 >= (double) (-this.b) && d1 <= (double) this.b) { - if (!this.trackedPlayers.contains(entityplayer) && (this.d(entityplayer) || this.tracker.attachedToPlayer)) { - // CraftBukkit start - respect vanish API - if (this.tracker instanceof EntityPlayer) { - Player player = ((EntityPlayer) this.tracker).getBukkitEntity(); - if (!entityplayer.getBukkitEntity().canSee(player)) { - return; - } - } - - entityplayer.removeQueue.remove(Integer.valueOf(this.tracker.getId())); - // CraftBukkit end - - this.trackedPlayers.add(entityplayer); - Packet packet = this.c(); - - entityplayer.playerConnection.sendPacket(packet); - if (!this.tracker.getDataWatcher().d()) { - entityplayer.playerConnection.sendPacket(new PacketPlayOutEntityMetadata(this.tracker.getId(), this.tracker.getDataWatcher(), true)); - } - - if (this.tracker instanceof EntityLiving) { - AttributeMapServer attributemapserver = (AttributeMapServer) ((EntityLiving) this.tracker).getAttributeMap(); - Collection collection = attributemapserver.c(); - - // CraftBukkit start - If sending own attributes send scaled health instead of current maximum health - if (this.tracker.getId() == entityplayer.getId()) { - ((EntityPlayer) this.tracker).getBukkitEntity().injectScaledMaxHealth(collection, false); - } - // CraftBukkit end - if (!collection.isEmpty()) { - entityplayer.playerConnection.sendPacket(new PacketPlayOutUpdateAttributes(this.tracker.getId(), collection)); - } - } - - this.j = this.tracker.motX; - this.k = this.tracker.motY; - this.l = this.tracker.motZ; - if (this.u && !(packet instanceof PacketPlayOutSpawnEntityLiving)) { - entityplayer.playerConnection.sendPacket(new PacketPlayOutEntityVelocity(this.tracker.getId(), this.tracker.motX, this.tracker.motY, this.tracker.motZ)); - } - - if (this.tracker.vehicle != null) { - entityplayer.playerConnection.sendPacket(new PacketPlayOutAttachEntity(0, this.tracker, this.tracker.vehicle)); - } - - // CraftBukkit start - if (this.tracker.passenger != null) { - entityplayer.playerConnection.sendPacket(new PacketPlayOutAttachEntity(0, this.tracker.passenger, this.tracker)); - } - // CraftBukkit end - - if (this.tracker instanceof EntityInsentient && ((EntityInsentient) this.tracker).getLeashHolder() != null) { - entityplayer.playerConnection.sendPacket(new PacketPlayOutAttachEntity(1, this.tracker, ((EntityInsentient) this.tracker).getLeashHolder())); - } - - if (this.tracker instanceof EntityLiving) { - for (int i = 0; i < 5; ++i) { - ItemStack itemstack = ((EntityLiving) this.tracker).getEquipment(i); - - if (itemstack != null) { - entityplayer.playerConnection.sendPacket(new PacketPlayOutEntityEquipment(this.tracker.getId(), i, itemstack)); - } - } - } - - if (this.tracker instanceof EntityHuman) { - EntityHuman entityhuman = (EntityHuman) this.tracker; - - if (entityhuman.isSleeping()) { - entityplayer.playerConnection.sendPacket(new PacketPlayOutBed(entityhuman, MathHelper.floor(this.tracker.locX), MathHelper.floor(this.tracker.locY), MathHelper.floor(this.tracker.locZ))); - } - } - - // CraftBukkit start - Fix for nonsensical head yaw - this.i = MathHelper.d(this.tracker.getHeadRotation() * 256.0F / 360.0F); - this.broadcast(new PacketPlayOutEntityHeadRotation(this.tracker, (byte) i)); - // CraftBukkit end - - if (this.tracker instanceof EntityLiving) { - EntityLiving entityliving = (EntityLiving) this.tracker; - Iterator iterator = entityliving.getEffects().iterator(); - - while (iterator.hasNext()) { - MobEffect mobeffect = (MobEffect) iterator.next(); - - entityplayer.playerConnection.sendPacket(new PacketPlayOutEntityEffect(this.tracker.getId(), mobeffect)); - } - } - } - } else if (this.trackedPlayers.contains(entityplayer)) { - this.trackedPlayers.remove(entityplayer); - entityplayer.d(this.tracker); - } - } - } - - private boolean d(EntityPlayer entityplayer) { - return entityplayer.r().getPlayerChunkMap().a(entityplayer, this.tracker.ah, this.tracker.aj); - } - - public void scanPlayers(List list) { - for (int i = 0; i < list.size(); ++i) { - this.updatePlayer((EntityPlayer) list.get(i)); - } - } - - private Packet c() { - if (this.tracker.dead) { - // CraftBukkit start - Remove useless error spam, just return - // p.warn("Fetching addPacket for removed entity"); - return null; - // CraftBukkit end - } - - if (this.tracker instanceof EntityItem) { - return new PacketPlayOutSpawnEntity(this.tracker, 2, 1); - } else if (this.tracker instanceof EntityPlayer) { - return new PacketPlayOutNamedEntitySpawn((EntityHuman) this.tracker); - } else if (this.tracker instanceof EntityMinecartAbstract) { - EntityMinecartAbstract entityminecartabstract = (EntityMinecartAbstract) this.tracker; - - return new PacketPlayOutSpawnEntity(this.tracker, 10, entityminecartabstract.m()); - } else if (this.tracker instanceof EntityBoat) { - return new PacketPlayOutSpawnEntity(this.tracker, 1); - } else if (!(this.tracker instanceof IAnimal) && !(this.tracker instanceof EntityEnderDragon)) { - if (this.tracker instanceof EntityFishingHook) { - EntityHuman entityhuman = ((EntityFishingHook) this.tracker).owner; - - return new PacketPlayOutSpawnEntity(this.tracker, 90, entityhuman != null ? entityhuman.getId() : this.tracker.getId()); - } else if (this.tracker instanceof EntityArrow) { - Entity entity = ((EntityArrow) this.tracker).shooter; - - return new PacketPlayOutSpawnEntity(this.tracker, 60, entity != null ? entity.getId() : this.tracker.getId()); - } else if (this.tracker instanceof EntitySnowball) { - return new PacketPlayOutSpawnEntity(this.tracker, 61); - } else if (this.tracker instanceof EntityPotion) { - return new PacketPlayOutSpawnEntity(this.tracker, 73, ((EntityPotion) this.tracker).getPotionValue()); - } else if (this.tracker instanceof EntityThrownExpBottle) { - return new PacketPlayOutSpawnEntity(this.tracker, 75); - } else if (this.tracker instanceof EntityEnderPearl) { - return new PacketPlayOutSpawnEntity(this.tracker, 65); - } else if (this.tracker instanceof EntityEnderSignal) { - return new PacketPlayOutSpawnEntity(this.tracker, 72); - } else if (this.tracker instanceof EntityFireworks) { - return new PacketPlayOutSpawnEntity(this.tracker, 76); - } else { - PacketPlayOutSpawnEntity packetplayoutspawnentity; - - if (this.tracker instanceof EntityFireball) { - EntityFireball entityfireball = (EntityFireball) this.tracker; - - packetplayoutspawnentity = null; - byte b0 = 63; - - if (this.tracker instanceof EntitySmallFireball) { - b0 = 64; - } else if (this.tracker instanceof EntityWitherSkull) { - b0 = 66; - } - - if (entityfireball.shooter != null) { - packetplayoutspawnentity = new PacketPlayOutSpawnEntity(this.tracker, b0, ((EntityFireball) this.tracker).shooter.getId()); - } else { - packetplayoutspawnentity = new PacketPlayOutSpawnEntity(this.tracker, b0, 0); - } - - packetplayoutspawnentity.d((int) (entityfireball.dirX * 8000.0D)); - packetplayoutspawnentity.e((int) (entityfireball.dirY * 8000.0D)); - packetplayoutspawnentity.f((int) (entityfireball.dirZ * 8000.0D)); - return packetplayoutspawnentity; - } else if (this.tracker instanceof EntityEgg) { - return new PacketPlayOutSpawnEntity(this.tracker, 62); - } else if (this.tracker instanceof EntityTNTPrimed) { - return new PacketPlayOutSpawnEntity(this.tracker, 50); - } else if (this.tracker instanceof EntityEnderCrystal) { - return new PacketPlayOutSpawnEntity(this.tracker, 51); - } else if (this.tracker instanceof EntityFallingBlock) { - EntityFallingBlock entityfallingblock = (EntityFallingBlock) this.tracker; - - return new PacketPlayOutSpawnEntity(this.tracker, 70, Block.getId(entityfallingblock.f()) | entityfallingblock.data << 16); - } else if (this.tracker instanceof EntityPainting) { - return new PacketPlayOutSpawnEntityPainting((EntityPainting) this.tracker); - } else if (this.tracker instanceof EntityItemFrame) { - EntityItemFrame entityitemframe = (EntityItemFrame) this.tracker; - - packetplayoutspawnentity = new PacketPlayOutSpawnEntity(this.tracker, 71, entityitemframe.direction); - packetplayoutspawnentity.a(MathHelper.d((float) (entityitemframe.x * 32))); - packetplayoutspawnentity.b(MathHelper.d((float) (entityitemframe.y * 32))); - packetplayoutspawnentity.c(MathHelper.d((float) (entityitemframe.z * 32))); - return packetplayoutspawnentity; - } else if (this.tracker instanceof EntityLeash) { - EntityLeash entityleash = (EntityLeash) this.tracker; - - packetplayoutspawnentity = new PacketPlayOutSpawnEntity(this.tracker, 77); - packetplayoutspawnentity.a(MathHelper.d((float) (entityleash.x * 32))); - packetplayoutspawnentity.b(MathHelper.d((float) (entityleash.y * 32))); - packetplayoutspawnentity.c(MathHelper.d((float) (entityleash.z * 32))); - return packetplayoutspawnentity; - } else if (this.tracker instanceof EntityExperienceOrb) { - return new PacketPlayOutSpawnEntityExperienceOrb((EntityExperienceOrb) this.tracker); - } else { - throw new IllegalArgumentException("Don\'t know how to add " + this.tracker.getClass() + "!"); - } - } - } else { - this.i = MathHelper.d(this.tracker.getHeadRotation() * 256.0F / 360.0F); - return new PacketPlayOutSpawnEntityLiving((EntityLiving) this.tracker); - } - } - - public void clear(EntityPlayer entityplayer) { - if (this.trackedPlayers.contains(entityplayer)) { - this.trackedPlayers.remove(entityplayer); - entityplayer.d(this.tracker); - } - } -} diff --git a/src/main/java/net/minecraft/server/EntityWither.java b/src/main/java/net/minecraft/server/EntityWither.java deleted file mode 100644 index 75b3ca3a9a..0000000000 --- a/src/main/java/net/minecraft/server/EntityWither.java +++ /dev/null @@ -1,477 +0,0 @@ -package net.minecraft.server; - -import java.util.Iterator; -import java.util.List; - -// CraftBukkit start -import org.bukkit.craftbukkit.event.CraftEventFactory; -import org.bukkit.event.entity.EntityRegainHealthEvent; -import org.bukkit.event.entity.ExplosionPrimeEvent; -// CraftBukkit end - -public class EntityWither extends EntityMonster implements IRangedEntity { - - private float[] bp = new float[2]; - private float[] bq = new float[2]; - private float[] br = new float[2]; - private float[] bs = new float[2]; - private int[] bt = new int[2]; - private int[] bu = new int[2]; - private int bv; - private static final IEntitySelector bw = new EntitySelectorNotUndead(); - - public EntityWither(World world) { - super(world); - this.setHealth(this.getMaxHealth()); - this.a(0.9F, 4.0F); - this.fireProof = true; - this.getNavigation().e(true); - this.goalSelector.a(0, new PathfinderGoalFloat(this)); - this.goalSelector.a(2, new PathfinderGoalArrowAttack(this, 1.0D, 40, 20.0F)); - this.goalSelector.a(5, new PathfinderGoalRandomStroll(this, 1.0D)); - 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, EntityInsentient.class, 0, false, false, bw)); - this.b = 50; - } - - protected void c() { - super.c(); - this.datawatcher.a(17, new Integer(0)); - this.datawatcher.a(18, new Integer(0)); - this.datawatcher.a(19, new Integer(0)); - this.datawatcher.a(20, new Integer(0)); - } - - public void b(NBTTagCompound nbttagcompound) { - super.b(nbttagcompound); - nbttagcompound.setInt("Invul", this.ca()); - } - - public void a(NBTTagCompound nbttagcompound) { - super.a(nbttagcompound); - this.s(nbttagcompound.getInt("Invul")); - } - - protected String t() { - return "mob.wither.idle"; - } - - protected String aT() { - return "mob.wither.hurt"; - } - - protected String aU() { - return "mob.wither.death"; - } - - public void e() { - this.motY *= 0.6000000238418579D; - double d0; - double d1; - double d2; - - if (!this.world.isStatic && this.t(0) > 0) { - Entity entity = this.world.getEntity(this.t(0)); - - if (entity != null) { - if (this.locY < entity.locY || !this.cb() && this.locY < entity.locY + 5.0D) { - if (this.motY < 0.0D) { - this.motY = 0.0D; - } - - this.motY += (0.5D - this.motY) * 0.6000000238418579D; - } - - double d3 = entity.locX - this.locX; - - d0 = entity.locZ - this.locZ; - d1 = d3 * d3 + d0 * d0; - if (d1 > 9.0D) { - d2 = (double) MathHelper.sqrt(d1); - this.motX += (d3 / d2 * 0.5D - this.motX) * 0.6000000238418579D; - this.motZ += (d0 / d2 * 0.5D - this.motZ) * 0.6000000238418579D; - } - } - } - - if (this.motX * this.motX + this.motZ * this.motZ > 0.05000000074505806D) { - this.yaw = (float) Math.atan2(this.motZ, this.motX) * 57.295776F - 90.0F; - } - - super.e(); - - int i; - - for (i = 0; i < 2; ++i) { - this.bs[i] = this.bq[i]; - this.br[i] = this.bp[i]; - } - - int j; - - for (i = 0; i < 2; ++i) { - j = this.t(i + 1); - Entity entity1 = null; - - if (j > 0) { - entity1 = this.world.getEntity(j); - } - - if (entity1 != null) { - d0 = this.u(i + 1); - d1 = this.v(i + 1); - d2 = this.w(i + 1); - double d4 = entity1.locX - d0; - double d5 = entity1.locY + (double) entity1.getHeadHeight() - d1; - double d6 = entity1.locZ - d2; - double d7 = (double) MathHelper.sqrt(d4 * d4 + d6 * d6); - float f = (float) (Math.atan2(d6, d4) * 180.0D / 3.1415927410125732D) - 90.0F; - float f1 = (float) (-(Math.atan2(d5, d7) * 180.0D / 3.1415927410125732D)); - - this.bp[i] = this.b(this.bp[i], f1, 40.0F); - this.bq[i] = this.b(this.bq[i], f, 10.0F); - } else { - this.bq[i] = this.b(this.bq[i], this.aM, 10.0F); - } - } - - boolean flag = this.cb(); - - for (j = 0; j < 3; ++j) { - double d8 = this.u(j); - double d9 = this.v(j); - double d10 = this.w(j); - - this.world.addParticle("smoke", d8 + this.random.nextGaussian() * 0.30000001192092896D, d9 + this.random.nextGaussian() * 0.30000001192092896D, d10 + this.random.nextGaussian() * 0.30000001192092896D, 0.0D, 0.0D, 0.0D); - if (flag && this.world.random.nextInt(4) == 0) { - this.world.addParticle("mobSpell", d8 + this.random.nextGaussian() * 0.30000001192092896D, d9 + this.random.nextGaussian() * 0.30000001192092896D, d10 + this.random.nextGaussian() * 0.30000001192092896D, 0.699999988079071D, 0.699999988079071D, 0.5D); - } - } - - if (this.ca() > 0) { - for (j = 0; j < 3; ++j) { - this.world.addParticle("mobSpell", this.locX + this.random.nextGaussian() * 1.0D, this.locY + (double) (this.random.nextFloat() * 3.3F), this.locZ + this.random.nextGaussian() * 1.0D, 0.699999988079071D, 0.699999988079071D, 0.8999999761581421D); - } - } - } - - protected void bn() { - int i; - - if (this.ca() > 0) { - i = this.ca() - 1; - if (i <= 0) { - // CraftBukkit start - ExplosionPrimeEvent event = new ExplosionPrimeEvent(this.getBukkitEntity(), 7.0F, false); - this.world.getServer().getPluginManager().callEvent(event); - - if (!event.isCancelled()) { - this.world.createExplosion(this, this.locX, this.locY + (double) this.getHeadHeight(), this.locZ, event.getRadius(), event.getFire(), this.world.getGameRules().getBoolean("mobGriefing")); - } - // CraftBukkit end - - this.world.createExplosion(this, this.locX, this.locY + (double) this.getHeadHeight(), this.locZ, 7.0F, false, this.world.getGameRules().getBoolean("mobGriefing")); - // CraftBukkit start - Use relative location for far away sounds - //this.world.b(1013, (int) this.locX, (int) this.locY, (int) this.locZ, 0); - int viewDistance = ((WorldServer) this.world).getServer().getViewDistance() * 16; - for (EntityPlayer player : (List) this.world.players) { - double deltaX = this.locX - player.locX; - double deltaZ = this.locZ - player.locZ; - double distanceSquared = deltaX * deltaX + deltaZ * deltaZ; - if (distanceSquared > viewDistance * viewDistance) { - double deltaLength = Math.sqrt(distanceSquared); - double relativeX = player.locX + (deltaX / deltaLength) * viewDistance; - double relativeZ = player.locZ + (deltaZ / deltaLength) * viewDistance; - player.playerConnection.sendPacket(new PacketPlayOutWorldEvent(1013, (int) relativeX, (int) this.locY, (int) relativeZ, 0, true)); - } else { - player.playerConnection.sendPacket(new PacketPlayOutWorldEvent(1013, (int) this.locX, (int) this.locY, (int) this.locZ, 0, true)); - } - } - // CraftBukkit end - } - - this.s(i); - if (this.ticksLived % 10 == 0) { - this.heal(10.0F, EntityRegainHealthEvent.RegainReason.WITHER_SPAWN); // CraftBukkit - } - } else { - super.bn(); - - int j; - - for (i = 1; i < 3; ++i) { - if (this.ticksLived >= this.bt[i - 1]) { - this.bt[i - 1] = this.ticksLived + 10 + this.random.nextInt(10); - if (this.world.difficulty == EnumDifficulty.NORMAL || this.world.difficulty == EnumDifficulty.HARD) { - int i1001 = i - 1; - int i1003 = this.bu[i - 1]; - - this.bu[i1001] = this.bu[i - 1] + 1; - if (i1003 > 15) { - float f = 10.0F; - float f1 = 5.0F; - double d0 = MathHelper.a(this.random, this.locX - (double) f, this.locX + (double) f); - double d1 = MathHelper.a(this.random, this.locY - (double) f1, this.locY + (double) f1); - double d2 = MathHelper.a(this.random, this.locZ - (double) f, this.locZ + (double) f); - - this.a(i + 1, d0, d1, d2, true); - this.bu[i - 1] = 0; - } - } - - j = this.t(i); - if (j > 0) { - Entity entity = this.world.getEntity(j); - - if (entity != null && entity.isAlive() && this.f(entity) <= 900.0D && this.hasLineOfSight(entity)) { - this.a(i + 1, (EntityLiving) entity); - this.bt[i - 1] = this.ticksLived + 40 + this.random.nextInt(20); - this.bu[i - 1] = 0; - } else { - this.b(i, 0); - } - } else { - List list = this.world.a(EntityLiving.class, this.boundingBox.grow(20.0D, 8.0D, 20.0D), bw); - - for (int i1 = 0; i1 < 10 && !list.isEmpty(); ++i1) { - EntityLiving entityliving = (EntityLiving) list.get(this.random.nextInt(list.size())); - - if (entityliving != this && entityliving.isAlive() && this.hasLineOfSight(entityliving)) { - if (entityliving instanceof EntityHuman) { - if (!((EntityHuman) entityliving).abilities.isInvulnerable) { - this.b(i, entityliving.getId()); - } - } else { - this.b(i, entityliving.getId()); - } - break; - } - - list.remove(entityliving); - } - } - } - } - - if (this.getGoalTarget() != null) { - this.b(0, this.getGoalTarget().getId()); - } else { - this.b(0, 0); - } - - if (this.bv > 0) { - --this.bv; - if (this.bv == 0 && this.world.getGameRules().getBoolean("mobGriefing")) { - i = MathHelper.floor(this.locY); - j = MathHelper.floor(this.locX); - int j1 = MathHelper.floor(this.locZ); - boolean flag = false; - - for (int k1 = -1; k1 <= 1; ++k1) { - for (int l1 = -1; l1 <= 1; ++l1) { - for (int i2 = 0; i2 <= 3; ++i2) { - int j2 = j + k1; - int k2 = i + i2; - int l2 = j1 + l1; - Block block = this.world.getType(j2, k2, l2); - - if (block.getMaterial() != Material.AIR && block != Blocks.BEDROCK && block != Blocks.ENDER_PORTAL && block != Blocks.ENDER_PORTAL_FRAME && block != Blocks.COMMAND) { - // CraftBukkit start - if (CraftEventFactory.callEntityChangeBlockEvent(this, j2, k2, l2, Blocks.AIR, 0).isCancelled()) { - continue; - } - // CraftBukkit end - - flag = this.world.setAir(j2, k2, l2, true) || flag; - } - } - } - } - - if (flag) { - this.world.a((EntityHuman) null, 1012, (int) this.locX, (int) this.locY, (int) this.locZ, 0); - } - } - } - - if (this.ticksLived % 20 == 0) { - this.heal(1.0F, EntityRegainHealthEvent.RegainReason.REGEN); // CraftBukkit - } - } - } - - public void bZ() { - this.s(220); - this.setHealth(this.getMaxHealth() / 3.0F); - } - - public void as() {} - - public int aV() { - return 4; - } - - private double u(int i) { - if (i <= 0) { - return this.locX; - } else { - float f = (this.aM + (float) (180 * (i - 1))) / 180.0F * 3.1415927F; - float f1 = MathHelper.cos(f); - - return this.locX + (double) f1 * 1.3D; - } - } - - private double v(int i) { - return i <= 0 ? this.locY + 3.0D : this.locY + 2.2D; - } - - private double w(int i) { - if (i <= 0) { - return this.locZ; - } else { - float f = (this.aM + (float) (180 * (i - 1))) / 180.0F * 3.1415927F; - float f1 = MathHelper.sin(f); - - return this.locZ + (double) f1 * 1.3D; - } - } - - private float b(float f, float f1, float f2) { - float f3 = MathHelper.g(f1 - f); - - if (f3 > f2) { - f3 = f2; - } - - if (f3 < -f2) { - f3 = -f2; - } - - return f + f3; - } - - private void a(int i, EntityLiving entityliving) { - this.a(i, entityliving.locX, entityliving.locY + (double) entityliving.getHeadHeight() * 0.5D, entityliving.locZ, i == 0 && this.random.nextFloat() < 0.001F); - } - - private void a(int i, double d0, double d1, double d2, boolean flag) { - this.world.a((EntityHuman) null, 1014, (int) this.locX, (int) this.locY, (int) this.locZ, 0); - double d3 = this.u(i); - double d4 = this.v(i); - double d5 = this.w(i); - double d6 = d0 - d3; - double d7 = d1 - d4; - double d8 = d2 - d5; - EntityWitherSkull entitywitherskull = new EntityWitherSkull(this.world, this, d6, d7, d8); - - if (flag) { - entitywitherskull.setCharged(true); - } - - entitywitherskull.locY = d4; - entitywitherskull.locX = d3; - entitywitherskull.locZ = d5; - this.world.addEntity(entitywitherskull); - } - - public void a(EntityLiving entityliving, float f) { - this.a(0, entityliving); - } - - public boolean damageEntity(DamageSource damagesource, float f) { - if (this.isInvulnerable()) { - return false; - } else if (damagesource == DamageSource.DROWN) { - return false; - } else if (this.ca() > 0) { - return false; - } else { - Entity entity; - - if (this.cb()) { - entity = damagesource.i(); - if (entity instanceof EntityArrow) { - return false; - } - } - - entity = damagesource.getEntity(); - if (entity != null && !(entity instanceof EntityHuman) && entity instanceof EntityLiving && ((EntityLiving) entity).getMonsterType() == this.getMonsterType()) { - return false; - } else { - if (this.bv <= 0) { - this.bv = 20; - } - - for (int i = 0; i < this.bu.length; ++i) { - this.bu[i] += 3; - } - - return super.damageEntity(damagesource, f); - } - } - } - - protected void dropDeathLoot(boolean flag, int i) { - this.a(Items.NETHER_STAR, 1); - if (!this.world.isStatic) { - Iterator iterator = this.world.a(EntityHuman.class, this.boundingBox.grow(50.0D, 100.0D, 50.0D)).iterator(); - - while (iterator.hasNext()) { - EntityHuman entityhuman = (EntityHuman) iterator.next(); - - entityhuman.a((Statistic) AchievementList.J); - } - } - } - - protected void w() { - this.aU = 0; - } - - protected void b(float f) {} - - public void addEffect(MobEffect mobeffect) {} - - protected boolean bk() { - return true; - } - - protected void aD() { - super.aD(); - this.getAttributeInstance(GenericAttributes.maxHealth).setValue(300.0D); - this.getAttributeInstance(GenericAttributes.d).setValue(0.6000000238418579D); - this.getAttributeInstance(GenericAttributes.b).setValue(40.0D); - } - - public int ca() { - return this.datawatcher.getInt(20); - } - - public void s(int i) { - this.datawatcher.watch(20, Integer.valueOf(i)); - } - - public int t(int i) { - return this.datawatcher.getInt(17 + i); - } - - public void b(int i, int j) { - this.datawatcher.watch(17 + i, Integer.valueOf(j)); - } - - public boolean cb() { - return this.getHealth() <= this.getMaxHealth() / 2.0F; - } - - public EnumMonsterType getMonsterType() { - return EnumMonsterType.UNDEAD; - } - - public void mount(Entity entity) { - this.vehicle = null; - } -} diff --git a/src/main/java/net/minecraft/server/EntityWitherSkull.java b/src/main/java/net/minecraft/server/EntityWitherSkull.java deleted file mode 100644 index b797f8a4fb..0000000000 --- a/src/main/java/net/minecraft/server/EntityWitherSkull.java +++ /dev/null @@ -1,93 +0,0 @@ -package net.minecraft.server; - -import org.bukkit.event.entity.ExplosionPrimeEvent; // CraftBukkit - -public class EntityWitherSkull extends EntityFireball { - - public EntityWitherSkull(World world) { - super(world); - this.a(0.3125F, 0.3125F); - } - - public EntityWitherSkull(World world, EntityLiving entityliving, double d0, double d1, double d2) { - super(world, entityliving, d0, d1, d2); - this.a(0.3125F, 0.3125F); - } - - protected float e() { - return this.isCharged() ? 0.73F : super.e(); - } - - public boolean isBurning() { - return false; - } - - public float a(Explosion explosion, World world, int i, int j, int k, Block block) { - float f = super.a(explosion, world, i, j, k, block); - - if (this.isCharged() && block != Blocks.BEDROCK && block != Blocks.ENDER_PORTAL && block != Blocks.ENDER_PORTAL_FRAME && block != Blocks.COMMAND) { - f = Math.min(0.8F, f); - } - - return f; - } - - protected void a(MovingObjectPosition movingobjectposition) { - if (!this.world.isStatic) { - if (movingobjectposition.entity != null) { - if (this.shooter != null) { - if (movingobjectposition.entity.damageEntity(DamageSource.mobAttack(this.shooter), 8.0F) && !movingobjectposition.entity.isAlive()) { - this.shooter.heal(5.0F, org.bukkit.event.entity.EntityRegainHealthEvent.RegainReason.WITHER); // CraftBukkit - } - } else { - movingobjectposition.entity.damageEntity(DamageSource.MAGIC, 5.0F); - } - - if (movingobjectposition.entity instanceof EntityLiving) { - byte b0 = 0; - - if (this.world.difficulty == EnumDifficulty.NORMAL) { - b0 = 10; - } else if (this.world.difficulty == EnumDifficulty.HARD) { - b0 = 40; - } - - if (b0 > 0) { - ((EntityLiving) movingobjectposition.entity).addEffect(new MobEffect(MobEffectList.WITHER.id, 20 * b0, 1)); - } - } - } - - // CraftBukkit start - ExplosionPrimeEvent event = new ExplosionPrimeEvent(this.getBukkitEntity(), 1.0F, false); - this.world.getServer().getPluginManager().callEvent(event); - - if (!event.isCancelled()) { - this.world.createExplosion(this, this.locX, this.locY, this.locZ, event.getRadius(), event.getFire(), this.world.getGameRules().getBoolean("mobGriefing")); - } - // CraftBukkit end - - this.die(); - } - } - - public boolean R() { - return false; - } - - public boolean damageEntity(DamageSource damagesource, float f) { - return false; - } - - protected void c() { - this.datawatcher.a(10, Byte.valueOf((byte) 0)); - } - - public boolean isCharged() { - return this.datawatcher.getByte(10) == 1; - } - - public void setCharged(boolean flag) { - this.datawatcher.watch(10, Byte.valueOf((byte) (flag ? 1 : 0))); - } -} diff --git a/src/main/java/net/minecraft/server/EntityWolf.java b/src/main/java/net/minecraft/server/EntityWolf.java deleted file mode 100644 index 8f1ebf2eb2..0000000000 --- a/src/main/java/net/minecraft/server/EntityWolf.java +++ /dev/null @@ -1,379 +0,0 @@ -package net.minecraft.server; - -// CraftBukkit start -import org.bukkit.craftbukkit.event.CraftEventFactory; -import org.bukkit.event.entity.EntityTargetEvent.TargetReason; -// CraftBukkit end - -public class EntityWolf extends EntityTameableAnimal { - - private float bq; - private float br; - private boolean bs; - private boolean bt; - private float bu; - private float bv; - - public EntityWolf(World world) { - super(world); - this.a(0.6F, 0.8F); - this.getNavigation().a(true); - this.goalSelector.a(1, new PathfinderGoalFloat(this)); - this.goalSelector.a(2, this.bp); - this.goalSelector.a(3, new PathfinderGoalLeapAtTarget(this, 0.4F)); - this.goalSelector.a(4, new PathfinderGoalMeleeAttack(this, 1.0D, true)); - this.goalSelector.a(5, new PathfinderGoalFollowOwner(this, 1.0D, 10.0F, 2.0F)); - this.goalSelector.a(6, new PathfinderGoalBreed(this, 1.0D)); - this.goalSelector.a(7, new PathfinderGoalRandomStroll(this, 1.0D)); - 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)); - this.targetSelector.a(1, new PathfinderGoalOwnerHurtByTarget(this)); - this.targetSelector.a(2, new PathfinderGoalOwnerHurtTarget(this)); - this.targetSelector.a(3, new PathfinderGoalHurtByTarget(this, true)); - this.targetSelector.a(4, new PathfinderGoalRandomTargetNonTamed(this, EntitySheep.class, 200, false)); - this.setTamed(false); - } - - protected void aD() { - super.aD(); - this.getAttributeInstance(GenericAttributes.d).setValue(0.30000001192092896D); - if (this.isTamed()) { - this.getAttributeInstance(GenericAttributes.maxHealth).setValue(20.0D); - } else { - this.getAttributeInstance(GenericAttributes.maxHealth).setValue(8.0D); - } - } - - public boolean bk() { - return true; - } - - public void setGoalTarget(EntityLiving entityliving) { - super.setGoalTarget(entityliving); - if (entityliving == null) { - this.setAngry(false); - } else if (!this.isTamed()) { - this.setAngry(true); - } - } - - protected void bp() { - this.datawatcher.watch(18, Float.valueOf(this.getHealth())); - } - - protected void c() { - super.c(); - this.datawatcher.a(18, new Float(this.getHealth())); - this.datawatcher.a(19, new Byte((byte) 0)); - this.datawatcher.a(20, new Byte((byte) BlockCloth.b(1))); - } - - protected void a(int i, int j, int k, Block block) { - this.makeSound("mob.wolf.step", 0.15F, 1.0F); - } - - public void b(NBTTagCompound nbttagcompound) { - super.b(nbttagcompound); - nbttagcompound.setBoolean("Angry", this.isAngry()); - nbttagcompound.setByte("CollarColor", (byte) this.getCollarColor()); - } - - public void a(NBTTagCompound nbttagcompound) { - super.a(nbttagcompound); - this.setAngry(nbttagcompound.getBoolean("Angry")); - if (nbttagcompound.hasKeyOfType("CollarColor", 99)) { - this.setCollarColor(nbttagcompound.getByte("CollarColor")); - } - } - - protected String t() { - // CraftBukkit - (getFloat(18) < 10) -> (getFloat(18) < this.getMaxHealth() / 2) - return this.isAngry() ? "mob.wolf.growl" : (this.random.nextInt(3) == 0 ? (this.isTamed() && this.datawatcher.getFloat(18) < (this.getMaxHealth() / 2) ? "mob.wolf.whine" : "mob.wolf.panting") : "mob.wolf.bark"); - } - - protected String aT() { - return "mob.wolf.hurt"; - } - - protected String aU() { - return "mob.wolf.death"; - } - - protected float bf() { - return 0.4F; - } - - protected Item getLoot() { - return Item.getById(-1); - } - - public void e() { - super.e(); - if (!this.world.isStatic && this.bs && !this.bt && !this.bS() && this.onGround) { - this.bt = true; - this.bu = 0.0F; - this.bv = 0.0F; - this.world.broadcastEntityEffect(this, (byte) 8); - } - } - - public void h() { - super.h(); - this.br = this.bq; - if (this.ck()) { - this.bq += (1.0F - this.bq) * 0.4F; - } else { - this.bq += (0.0F - this.bq) * 0.4F; - } - - if (this.ck()) { - this.g = 10; - } - - if (this.L()) { - this.bs = true; - this.bt = false; - this.bu = 0.0F; - this.bv = 0.0F; - } else if ((this.bs || this.bt) && this.bt) { - if (this.bu == 0.0F) { - this.makeSound("mob.wolf.shake", this.bf(), (this.random.nextFloat() - this.random.nextFloat()) * 0.2F + 1.0F); - } - - this.bv = this.bu; - this.bu += 0.05F; - if (this.bv >= 2.0F) { - this.bs = false; - this.bt = false; - this.bv = 0.0F; - this.bu = 0.0F; - } - - if (this.bu > 0.4F) { - float f = (float) this.boundingBox.b; - int i = (int) (MathHelper.sin((this.bu - 0.4F) * 3.1415927F) * 7.0F); - - for (int j = 0; j < i; ++j) { - float f1 = (this.random.nextFloat() * 2.0F - 1.0F) * this.width * 0.5F; - float f2 = (this.random.nextFloat() * 2.0F - 1.0F) * this.width * 0.5F; - - this.world.addParticle("splash", this.locX + (double) f1, (double) (f + 0.8F), this.locZ + (double) f2, this.motX, this.motY, this.motZ); - } - } - } - } - - public float getHeadHeight() { - return this.length * 0.8F; - } - - public int x() { - return this.isSitting() ? 20 : super.x(); - } - - public boolean damageEntity(DamageSource damagesource, float f) { - if (this.isInvulnerable()) { - return false; - } else { - Entity entity = damagesource.getEntity(); - - this.bp.setSitting(false); - if (entity != null && !(entity instanceof EntityHuman) && !(entity instanceof EntityArrow)) { - f = (f + 1.0F) / 2.0F; - } - - return super.damageEntity(damagesource, f); - } - } - - public boolean n(Entity entity) { - int i = this.isTamed() ? 4 : 2; - - return entity.damageEntity(DamageSource.mobAttack(this), (float) i); - } - - public void setTamed(boolean flag) { - super.setTamed(flag); - if (flag) { - this.getAttributeInstance(GenericAttributes.maxHealth).setValue(20.0D); - } else { - this.getAttributeInstance(GenericAttributes.maxHealth).setValue(8.0D); - } - } - - public boolean a(EntityHuman entityhuman) { - ItemStack itemstack = entityhuman.inventory.getItemInHand(); - - if (this.isTamed()) { - if (itemstack != null) { - if (itemstack.getItem() instanceof ItemFood) { - ItemFood itemfood = (ItemFood) itemstack.getItem(); - - if (itemfood.i() && this.datawatcher.getFloat(18) < 20.0F) { - if (!entityhuman.abilities.canInstantlyBuild) { - --itemstack.count; - } - - this.heal((float) itemfood.getNutrition(itemstack), org.bukkit.event.entity.EntityRegainHealthEvent.RegainReason.EATING); // CraftBukkit - if (itemstack.count <= 0) { - entityhuman.inventory.setItem(entityhuman.inventory.itemInHandIndex, (ItemStack) null); - } - - return true; - } - } else if (itemstack.getItem() == Items.INK_SACK) { - int i = BlockCloth.b(itemstack.getData()); - - if (i != this.getCollarColor()) { - this.setCollarColor(i); - if (!entityhuman.abilities.canInstantlyBuild && --itemstack.count <= 0) { - entityhuman.inventory.setItem(entityhuman.inventory.itemInHandIndex, (ItemStack) null); - } - - return true; - } - } - } - - if (this.e(entityhuman) && !this.world.isStatic && !this.c(itemstack)) { - this.bp.setSitting(!this.isSitting()); - this.bc = false; - this.setPathEntity((PathEntity) null); - this.setTarget((Entity) null); - // CraftBukkit start - if (this.getGoalTarget() != null) { - CraftEventFactory.callEntityTargetEvent(this, null, TargetReason.FORGOT_TARGET); - } - // CraftBukkit end - this.setGoalTarget((EntityLiving) null); - } - } else if (itemstack != null && itemstack.getItem() == Items.BONE && !this.isAngry()) { - if (!entityhuman.abilities.canInstantlyBuild) { - --itemstack.count; - } - - if (itemstack.count <= 0) { - entityhuman.inventory.setItem(entityhuman.inventory.itemInHandIndex, (ItemStack) null); - } - - if (!this.world.isStatic) { - // CraftBukkit - added event call and isCancelled check. - if (this.random.nextInt(3) == 0 && !CraftEventFactory.callEntityTameEvent(this, entityhuman).isCancelled()) { - this.setTamed(true); - this.setPathEntity((PathEntity) null); - // CraftBukkit start - if (this.getGoalTarget() != null) { - CraftEventFactory.callEntityTargetEvent(this, null, TargetReason.FORGOT_TARGET); - } - // CraftBukkit end - this.setGoalTarget((EntityLiving) null); - this.bp.setSitting(true); - this.setHealth(this.getMaxHealth()); // CraftBukkit - 20.0 -> getMaxHealth() - this.setOwnerUUID(entityhuman.getUniqueID().toString()); - this.i(true); - this.world.broadcastEntityEffect(this, (byte) 7); - } else { - this.i(false); - this.world.broadcastEntityEffect(this, (byte) 6); - } - } - - return true; - } - - return super.a(entityhuman); - } - - public boolean c(ItemStack itemstack) { - return itemstack == null ? false : (!(itemstack.getItem() instanceof ItemFood) ? false : ((ItemFood) itemstack.getItem()).i()); - } - - public int bB() { - return 8; - } - - public boolean isAngry() { - return (this.datawatcher.getByte(16) & 2) != 0; - } - - public void setAngry(boolean flag) { - byte b0 = this.datawatcher.getByte(16); - - if (flag) { - this.datawatcher.watch(16, Byte.valueOf((byte) (b0 | 2))); - } else { - this.datawatcher.watch(16, Byte.valueOf((byte) (b0 & -3))); - } - } - - public int getCollarColor() { - return this.datawatcher.getByte(20) & 15; - } - - public void setCollarColor(int i) { - this.datawatcher.watch(20, Byte.valueOf((byte) (i & 15))); - } - - public EntityWolf b(EntityAgeable entityageable) { - EntityWolf entitywolf = new EntityWolf(this.world); - String s = this.getOwnerUUID(); - - if (s != null && s.trim().length() > 0) { - entitywolf.setOwnerUUID(s); - entitywolf.setTamed(true); - } - - return entitywolf; - } - - public void m(boolean flag) { - if (flag) { - this.datawatcher.watch(19, Byte.valueOf((byte) 1)); - } else { - this.datawatcher.watch(19, Byte.valueOf((byte) 0)); - } - } - - public boolean mate(EntityAnimal entityanimal) { - if (entityanimal == this) { - return false; - } else if (!this.isTamed()) { - return false; - } else if (!(entityanimal instanceof EntityWolf)) { - return false; - } else { - EntityWolf entitywolf = (EntityWolf) entityanimal; - - return !entitywolf.isTamed() ? false : (entitywolf.isSitting() ? false : this.ce() && entitywolf.ce()); - } - } - - public boolean ck() { - return this.datawatcher.getByte(19) == 1; - } - - protected boolean isTypeNotPersistent() { - return !this.isTamed() /*&& this.ticksLived > 2400*/; // CraftBukkit - } - - public boolean a(EntityLiving entityliving, EntityLiving entityliving1) { - if (!(entityliving instanceof EntityCreeper) && !(entityliving instanceof EntityGhast)) { - if (entityliving instanceof EntityWolf) { - EntityWolf entitywolf = (EntityWolf) entityliving; - - if (entitywolf.isTamed() && entitywolf.getOwner() == entityliving1) { - return false; - } - } - - return entityliving instanceof EntityHuman && entityliving1 instanceof EntityHuman && !((EntityHuman) entityliving1).a((EntityHuman) entityliving) ? false : !(entityliving instanceof EntityHorse) || !((EntityHorse) entityliving).isTame(); - } else { - return false; - } - } - - public EntityAgeable createChild(EntityAgeable entityageable) { - return this.b(entityageable); - } -} diff --git a/src/main/java/net/minecraft/server/EntityZombie.java b/src/main/java/net/minecraft/server/EntityZombie.java deleted file mode 100644 index 7d8cb93797..0000000000 --- a/src/main/java/net/minecraft/server/EntityZombie.java +++ /dev/null @@ -1,524 +0,0 @@ -package net.minecraft.server; - -import java.util.Calendar; -import java.util.List; -import java.util.UUID; - - -//CraftBukkit start -import org.bukkit.craftbukkit.entity.CraftLivingEntity; -import org.bukkit.event.entity.CreatureSpawnEvent; -import org.bukkit.event.entity.EntityCombustByEntityEvent; -import org.bukkit.event.entity.EntityCombustEvent; -import org.bukkit.event.entity.EntityTargetEvent; -//CraftBukkit end - -public class EntityZombie extends EntityMonster { - - protected static final IAttribute bp = (new AttributeRanged("zombie.spawnReinforcements", 0.0D, 0.0D, 1.0D)).a("Spawn Reinforcements Chance"); - private static final UUID bq = UUID.fromString("B9766B59-9566-4402-BC1F-2EE2A276D836"); - private static final AttributeModifier br = new AttributeModifier(bq, "Baby speed boost", 0.5D, 1); - private final PathfinderGoalBreakDoor bs = new PathfinderGoalBreakDoor(this); - private int bt; - private boolean bu = false; - private float bv = -1.0F; - private float bw; - private int lastTick = MinecraftServer.currentTick; // CraftBukkit - add field - - public EntityZombie(World world) { - super(world); - this.getNavigation().b(true); - this.goalSelector.a(0, new PathfinderGoalFloat(this)); - this.goalSelector.a(2, new PathfinderGoalMeleeAttack(this, EntityHuman.class, 1.0D, false)); - this.goalSelector.a(4, new PathfinderGoalMeleeAttack(this, EntityVillager.class, 1.0D, true)); - this.goalSelector.a(5, new PathfinderGoalMoveTowardsRestriction(this, 1.0D)); - this.goalSelector.a(6, new PathfinderGoalMoveThroughVillage(this, 1.0D, false)); - this.goalSelector.a(7, new PathfinderGoalRandomStroll(this, 1.0D)); - this.goalSelector.a(8, new PathfinderGoalLookAtPlayer(this, EntityHuman.class, 8.0F)); - this.goalSelector.a(8, new PathfinderGoalRandomLookaround(this)); - this.targetSelector.a(1, new PathfinderGoalHurtByTarget(this, true)); - this.targetSelector.a(2, new PathfinderGoalNearestAttackableTarget(this, EntityHuman.class, 0, true)); - this.targetSelector.a(2, new PathfinderGoalNearestAttackableTarget(this, EntityVillager.class, 0, false)); - this.a(0.6F, 1.8F); - } - - protected void aD() { - super.aD(); - this.getAttributeInstance(GenericAttributes.b).setValue(40.0D); - this.getAttributeInstance(GenericAttributes.d).setValue(0.23000000417232513D); - this.getAttributeInstance(GenericAttributes.e).setValue(3.0D); - this.getAttributeMap().b(bp).setValue(this.random.nextDouble() * 0.10000000149011612D); - } - - protected void c() { - super.c(); - this.getDataWatcher().a(12, Byte.valueOf((byte) 0)); - this.getDataWatcher().a(13, Byte.valueOf((byte) 0)); - this.getDataWatcher().a(14, Byte.valueOf((byte) 0)); - } - - public int aV() { - int i = super.aV() + 2; - - if (i > 20) { - i = 20; - } - - return i; - } - - protected boolean bk() { - return true; - } - - public boolean bZ() { - return this.bu; - } - - public void a(boolean flag) { - if (this.bu != flag) { - this.bu = flag; - if (flag) { - this.goalSelector.a(1, this.bs); - } else { - this.goalSelector.a((PathfinderGoal) this.bs); - } - } - } - - public boolean isBaby() { - return this.getDataWatcher().getByte(12) == 1; - } - - protected int getExpValue(EntityHuman entityhuman) { - if (this.isBaby()) { - this.b = (int) ((float) this.b * 2.5F); - } - - return super.getExpValue(entityhuman); - } - - public void setBaby(boolean flag) { - this.getDataWatcher().watch(12, Byte.valueOf((byte) (flag ? 1 : 0))); - if (this.world != null && !this.world.isStatic) { - AttributeInstance attributeinstance = this.getAttributeInstance(GenericAttributes.d); - - attributeinstance.b(br); - if (flag) { - attributeinstance.a(br); - } - } - - this.k(flag); - } - - public boolean isVillager() { - return this.getDataWatcher().getByte(13) == 1; - } - - public void setVillager(boolean flag) { - this.getDataWatcher().watch(13, Byte.valueOf((byte) (flag ? 1 : 0))); - } - - public void e() { - if (this.world.w() && !this.world.isStatic && !this.isBaby()) { - float f = this.d(1.0F); - - if (f > 0.5F && this.random.nextFloat() * 30.0F < (f - 0.4F) * 2.0F && this.world.i(MathHelper.floor(this.locX), MathHelper.floor(this.locY), MathHelper.floor(this.locZ))) { - boolean flag = true; - ItemStack itemstack = this.getEquipment(4); - - if (itemstack != null) { - if (itemstack.g()) { - itemstack.setData(itemstack.j() + this.random.nextInt(2)); - if (itemstack.j() >= itemstack.l()) { - this.a(itemstack); - this.setEquipment(4, (ItemStack) null); - } - } - - flag = false; - } - - if (flag) { - // CraftBukkit start - EntityCombustEvent event = new EntityCombustEvent(this.getBukkitEntity(), 8); - this.world.getServer().getPluginManager().callEvent(event); - - if (!event.isCancelled()) { - this.setOnFire(event.getDuration()); - } - // CraftBukkit end - } - } - } - - if (this.am() && this.getGoalTarget() != null && this.vehicle instanceof EntityChicken) { - ((EntityInsentient) this.vehicle).getNavigation().a(this.getNavigation().e(), 1.5D); - } - - super.e(); - } - - public boolean damageEntity(DamageSource damagesource, float f) { - if (!super.damageEntity(damagesource, f)) { - return false; - } else { - EntityLiving entityliving = this.getGoalTarget(); - - if (entityliving == null && this.bT() instanceof EntityLiving) { - entityliving = (EntityLiving) this.bT(); - } - - if (entityliving == null && damagesource.getEntity() instanceof EntityLiving) { - entityliving = (EntityLiving) damagesource.getEntity(); - } - - if (entityliving != null && this.world.difficulty == EnumDifficulty.HARD && (double) this.random.nextFloat() < this.getAttributeInstance(bp).getValue()) { - int i = MathHelper.floor(this.locX); - int j = MathHelper.floor(this.locY); - int k = MathHelper.floor(this.locZ); - EntityZombie entityzombie = new EntityZombie(this.world); - - for (int l = 0; l < 50; ++l) { - int i1 = i + MathHelper.nextInt(this.random, 7, 40) * MathHelper.nextInt(this.random, -1, 1); - int j1 = j + MathHelper.nextInt(this.random, 7, 40) * MathHelper.nextInt(this.random, -1, 1); - int k1 = k + MathHelper.nextInt(this.random, 7, 40) * MathHelper.nextInt(this.random, -1, 1); - - if (World.a((IBlockAccess) this.world, i1, j1 - 1, k1) && this.world.getLightLevel(i1, j1, k1) < 10) { - entityzombie.setPosition((double) i1, (double) j1, (double) k1); - if (this.world.b(entityzombie.boundingBox) && this.world.getCubes(entityzombie, entityzombie.boundingBox).isEmpty() && !this.world.containsLiquid(entityzombie.boundingBox)) { - this.world.addEntity(entityzombie, CreatureSpawnEvent.SpawnReason.REINFORCEMENTS); // CraftBukkit - // CraftBukkit start - call EntityTargetEvent - org.bukkit.event.entity.EntityTargetLivingEntityEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callEntityTargetLivingEvent(entityzombie, entityliving, EntityTargetEvent.TargetReason.REINFORCEMENT_TARGET); - if (!event.isCancelled()) { - if (event.getTarget() == null) { - entityzombie.setGoalTarget(null); - } else { - entityzombie.setGoalTarget(((org.bukkit.craftbukkit.entity.CraftLivingEntity) event.getTarget()).getHandle()); - } - } - // CraftBukkit end - entityzombie.prepare((GroupDataEntity) null); - this.getAttributeInstance(bp).a(new AttributeModifier("Zombie reinforcement caller charge", -0.05000000074505806D, 0)); - entityzombie.getAttributeInstance(bp).a(new AttributeModifier("Zombie reinforcement callee charge", -0.05000000074505806D, 0)); - break; - } - } - } - } - - return true; - } - } - - public void h() { - if (!this.world.isStatic && this.cc()) { - int i = this.ce(); - - // CraftBukkit start - Use wall time instead of ticks for villager conversion - int elapsedTicks = MinecraftServer.currentTick - this.lastTick; - this.lastTick = MinecraftServer.currentTick; - i *= elapsedTicks; - // CraftBukkit end - - this.bt -= i; - if (this.bt <= 0) { - this.cd(); - } - } - - super.h(); - } - - public boolean n(Entity entity) { - boolean flag = super.n(entity); - - if (flag) { - int i = this.world.difficulty.a(); - - if (this.be() == null && this.isBurning() && this.random.nextFloat() < (float) i * 0.3F) { - // CraftBukkit start - EntityCombustByEntityEvent event = new EntityCombustByEntityEvent(this.getBukkitEntity(), entity.getBukkitEntity(), 2 * i); - this.world.getServer().getPluginManager().callEvent(event); - - if (!event.isCancelled()) { - entity.setOnFire(event.getDuration()); - } - // CraftBukkit end - } - } - - return flag; - } - - protected String t() { - return "mob.zombie.say"; - } - - protected String aT() { - return "mob.zombie.hurt"; - } - - protected String aU() { - return "mob.zombie.death"; - } - - protected void a(int i, int j, int k, Block block) { - this.makeSound("mob.zombie.step", 0.15F, 1.0F); - } - - protected Item getLoot() { - return Items.ROTTEN_FLESH; - } - - public EnumMonsterType getMonsterType() { - return EnumMonsterType.UNDEAD; - } - - protected void getRareDrop(int i) { - switch (this.random.nextInt(3)) { - case 0: - this.a(Items.IRON_INGOT, 1); - break; - - case 1: - this.a(Items.CARROT, 1); - break; - - case 2: - this.a(Items.POTATO, 1); - } - } - - protected void bC() { - super.bC(); - if (this.random.nextFloat() < (this.world.difficulty == EnumDifficulty.HARD ? 0.05F : 0.01F)) { - int i = this.random.nextInt(3); - - if (i == 0) { - this.setEquipment(0, new ItemStack(Items.IRON_SWORD)); - } else { - this.setEquipment(0, new ItemStack(Items.IRON_SPADE)); - } - } - } - - public void b(NBTTagCompound nbttagcompound) { - super.b(nbttagcompound); - if (this.isBaby()) { - nbttagcompound.setBoolean("IsBaby", true); - } - - if (this.isVillager()) { - nbttagcompound.setBoolean("IsVillager", true); - } - - nbttagcompound.setInt("ConversionTime", this.cc() ? this.bt : -1); - nbttagcompound.setBoolean("CanBreakDoors", this.bZ()); - } - - public void a(NBTTagCompound nbttagcompound) { - super.a(nbttagcompound); - if (nbttagcompound.getBoolean("IsBaby")) { - this.setBaby(true); - } - - if (nbttagcompound.getBoolean("IsVillager")) { - this.setVillager(true); - } - - if (nbttagcompound.hasKeyOfType("ConversionTime", 99) && nbttagcompound.getInt("ConversionTime") > -1) { - this.a(nbttagcompound.getInt("ConversionTime")); - } - - this.a(nbttagcompound.getBoolean("CanBreakDoors")); - } - - public void a(EntityLiving entityliving) { - super.a(entityliving); - if ((this.world.difficulty == EnumDifficulty.NORMAL || this.world.difficulty == EnumDifficulty.HARD) && entityliving instanceof EntityVillager) { - if (this.world.difficulty != EnumDifficulty.HARD && this.random.nextBoolean()) { - return; - } - - EntityZombie entityzombie = new EntityZombie(this.world); - - entityzombie.k(entityliving); - this.world.kill(entityliving); - entityzombie.prepare((GroupDataEntity) null); - entityzombie.setVillager(true); - if (entityliving.isBaby()) { - entityzombie.setBaby(true); - } - - this.world.addEntity(entityzombie, CreatureSpawnEvent.SpawnReason.INFECTION); // CraftBukkit - add SpawnReason - this.world.a((EntityHuman) null, 1016, (int) this.locX, (int) this.locY, (int) this.locZ, 0); - } - } - - public GroupDataEntity prepare(GroupDataEntity groupdataentity) { - Object object = super.prepare(groupdataentity); - float f = this.world.b(this.locX, this.locY, this.locZ); - - this.h(this.random.nextFloat() < 0.55F * f); - if (object == null) { - object = new GroupDataZombie(this, this.world.random.nextFloat() < 0.05F, this.world.random.nextFloat() < 0.05F, (EmptyClassZombie) null); - } - - if (object instanceof GroupDataZombie) { - GroupDataZombie groupdatazombie = (GroupDataZombie) object; - - if (groupdatazombie.b) { - this.setVillager(true); - } - - if (groupdatazombie.a) { - this.setBaby(true); - if ((double) this.world.random.nextFloat() < 0.05D) { - List list = this.world.a(EntityChicken.class, this.boundingBox.grow(5.0D, 3.0D, 5.0D), IEntitySelector.b); - - if (!list.isEmpty()) { - EntityChicken entitychicken = (EntityChicken) list.get(0); - - entitychicken.i(true); - this.mount(entitychicken); - } - } else if ((double) this.world.random.nextFloat() < 0.05D) { - EntityChicken entitychicken1 = new EntityChicken(this.world); - - entitychicken1.setPositionRotation(this.locX, this.locY, this.locZ, this.yaw, 0.0F); - entitychicken1.prepare((GroupDataEntity) null); - entitychicken1.i(true); - this.world.addEntity(entitychicken1, CreatureSpawnEvent.SpawnReason.MOUNT); - this.mount(entitychicken1); - } - } - } - - this.a(this.random.nextFloat() < f * 0.1F); - this.bC(); - this.bD(); - if (this.getEquipment(4) == null) { - Calendar calendar = this.world.V(); - - if (calendar.get(2) + 1 == 10 && calendar.get(5) == 31 && this.random.nextFloat() < 0.25F) { - this.setEquipment(4, new ItemStack(this.random.nextFloat() < 0.1F ? Blocks.JACK_O_LANTERN : Blocks.PUMPKIN)); - this.dropChances[4] = 0.0F; - } - } - - this.getAttributeInstance(GenericAttributes.c).a(new AttributeModifier("Random spawn bonus", this.random.nextDouble() * 0.05000000074505806D, 0)); - double d0 = this.random.nextDouble() * 1.5D * (double) this.world.b(this.locX, this.locY, this.locZ); - - if (d0 > 1.0D) { - this.getAttributeInstance(GenericAttributes.b).a(new AttributeModifier("Random zombie-spawn bonus", d0, 2)); - } - - if (this.random.nextFloat() < f * 0.05F) { - this.getAttributeInstance(bp).a(new AttributeModifier("Leader zombie bonus", this.random.nextDouble() * 0.25D + 0.5D, 0)); - this.getAttributeInstance(GenericAttributes.maxHealth).a(new AttributeModifier("Leader zombie bonus", this.random.nextDouble() * 3.0D + 1.0D, 2)); - this.a(true); - } - - return (GroupDataEntity) object; - } - - public boolean a(EntityHuman entityhuman) { - ItemStack itemstack = entityhuman.bF(); - - if (itemstack != null && itemstack.getItem() == Items.GOLDEN_APPLE && itemstack.getData() == 0 && this.isVillager() && this.hasEffect(MobEffectList.WEAKNESS)) { - if (!entityhuman.abilities.canInstantlyBuild) { - --itemstack.count; - } - - if (itemstack.count <= 0) { - entityhuman.inventory.setItem(entityhuman.inventory.itemInHandIndex, (ItemStack) null); - } - - if (!this.world.isStatic) { - this.a(this.random.nextInt(2401) + 3600); - } - - return true; - } else { - return false; - } - } - - protected void a(int i) { - this.bt = i; - this.getDataWatcher().watch(14, Byte.valueOf((byte) 1)); - this.removeEffect(MobEffectList.WEAKNESS.id); - this.addEffect(new MobEffect(MobEffectList.INCREASE_DAMAGE.id, i, Math.min(this.world.difficulty.a() - 1, 0))); - this.world.broadcastEntityEffect(this, (byte) 16); - } - - protected boolean isTypeNotPersistent() { - return !this.cc(); - } - - public boolean cc() { - return this.getDataWatcher().getByte(14) == 1; - } - - protected void cd() { - EntityVillager entityvillager = new EntityVillager(this.world); - - entityvillager.k(this); - entityvillager.prepare((GroupDataEntity) null); - entityvillager.cd(); - if (this.isBaby()) { - entityvillager.setAge(-24000); - } - - this.world.kill(this); - this.world.addEntity(entityvillager, CreatureSpawnEvent.SpawnReason.CURED); // CraftBukkit - add SpawnReason - entityvillager.addEffect(new MobEffect(MobEffectList.CONFUSION.id, 200, 0)); - this.world.a((EntityHuman) null, 1017, (int) this.locX, (int) this.locY, (int) this.locZ, 0); - } - - protected int ce() { - int i = 1; - - if (this.random.nextFloat() < 0.01F) { - int j = 0; - - for (int k = (int) this.locX - 4; k < (int) this.locX + 4 && j < 14; ++k) { - for (int l = (int) this.locY - 4; l < (int) this.locY + 4 && j < 14; ++l) { - for (int i1 = (int) this.locZ - 4; i1 < (int) this.locZ + 4 && j < 14; ++i1) { - Block block = this.world.getType(k, l, i1); - - if (block == Blocks.IRON_FENCE || block == Blocks.BED) { - if (this.random.nextFloat() < 0.3F) { - ++i; - } - - ++j; - } - } - } - } - } - - return i; - } - - public void k(boolean flag) { - this.a(flag ? 0.5F : 1.0F); - } - - protected final void a(float f, float f1) { - boolean flag = this.bv > 0.0F && this.bw > 0.0F; - - this.bv = f; - this.bw = f1; - if (!flag) { - this.a(1.0F); - } - } - - protected final void a(float f) { - super.a(this.bv * f, this.bw * f); - } -} diff --git a/src/main/java/net/minecraft/server/ExpirableListEntry.java b/src/main/java/net/minecraft/server/ExpirableListEntry.java deleted file mode 100644 index 2cf6e23262..0000000000 --- a/src/main/java/net/minecraft/server/ExpirableListEntry.java +++ /dev/null @@ -1,95 +0,0 @@ -package net.minecraft.server; - -import java.text.ParseException; -import java.text.SimpleDateFormat; -import java.util.Date; - -import net.minecraft.util.com.google.gson.JsonObject; - -public abstract class ExpirableListEntry extends JsonListEntry { - - public static final SimpleDateFormat a = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss Z"); - protected final Date b; - protected final String c; - protected final Date d; - protected final String e; - - public ExpirableListEntry(Object object, Date date, String s, Date date1, String s1) { - super(object); - this.b = date == null ? new Date() : date; - this.c = s == null ? "(Unknown)" : s; - this.d = date1; - this.e = s1 == null ? "Banned by an operator." : s1; - } - - protected ExpirableListEntry(Object object, JsonObject jsonobject) { - super(checkExpiry(object, jsonobject), jsonobject); // CraftBukkit - check expiry - - Date date; - - try { - date = jsonobject.has("created") ? a.parse(jsonobject.get("created").getAsString()) : new Date(); - } catch (ParseException parseexception) { - date = new Date(); - } - - this.b = date; - this.c = jsonobject.has("source") ? jsonobject.get("source").getAsString() : "(Unknown)"; - - Date date1; - - try { - date1 = jsonobject.has("expires") ? a.parse(jsonobject.get("expires").getAsString()) : null; - } catch (ParseException parseexception1) { - date1 = null; - } - - this.d = date1; - this.e = jsonobject.has("reason") ? jsonobject.get("reason").getAsString() : "Banned by an operator."; - } - - public Date getExpires() { - return this.d; - } - - public String getReason() { - return this.e; - } - - boolean hasExpired() { - return this.d == null ? false : this.d.before(new Date()); - } - - protected void a(JsonObject jsonobject) { - jsonobject.addProperty("created", a.format(this.b)); - jsonobject.addProperty("source", this.c); - jsonobject.addProperty("expires", this.d == null ? "forever" : a.format(this.d)); - jsonobject.addProperty("reason", this.e); - } - - // CraftBukkit start - public String getSource() { - return this.c; - } - - public Date getCreated() { - return this.b; - } - - private static Object checkExpiry(Object object, JsonObject jsonobject) { - Date expires = null; - - try { - expires = jsonobject.has("expires") ? a.parse(jsonobject.get("expires").getAsString()) : null; - } catch (ParseException ex) { - // Guess we don't have a date - } - - if (expires == null || expires.after(new Date())) { - return object; - } else { - return null; - } - } - // CraftBukkit end -} diff --git a/src/main/java/net/minecraft/server/Explosion.java b/src/main/java/net/minecraft/server/Explosion.java deleted file mode 100644 index 56fa9998ca..0000000000 --- a/src/main/java/net/minecraft/server/Explosion.java +++ /dev/null @@ -1,269 +0,0 @@ -package net.minecraft.server; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Random; - -// CraftBukkit start -import org.bukkit.craftbukkit.event.CraftEventFactory; -import org.bukkit.event.entity.EntityExplodeEvent; -import org.bukkit.Location; -// CraftBukkit end - -public class Explosion { - - public boolean a; - public boolean b = true; - private int i = 16; - private Random j = new Random(); - private World world; - public double posX; - public double posY; - public double posZ; - public Entity source; - public float size; - public List blocks = new ArrayList(); - private Map l = new HashMap(); - public boolean wasCanceled = false; // CraftBukkit - add field - - public Explosion(World world, Entity entity, double d0, double d1, double d2, float f) { - this.world = world; - this.source = entity; - this.size = (float) Math.max(f, 0.0); // CraftBukkit - clamp bad values - this.posX = d0; - this.posY = d1; - this.posZ = d2; - } - - public void a() { - // CraftBukkit start - if (this.size < 0.1F) { - return; - } - // CraftBukkit end - - float f = this.size; - HashSet hashset = new HashSet(); - - int i; - int j; - int k; - double d0; - double d1; - double d2; - - for (i = 0; i < this.i; ++i) { - for (j = 0; j < this.i; ++j) { - for (k = 0; k < this.i; ++k) { - if (i == 0 || i == this.i - 1 || j == 0 || j == this.i - 1 || k == 0 || k == this.i - 1) { - double d3 = (double) ((float) i / ((float) this.i - 1.0F) * 2.0F - 1.0F); - double d4 = (double) ((float) j / ((float) this.i - 1.0F) * 2.0F - 1.0F); - double d5 = (double) ((float) k / ((float) this.i - 1.0F) * 2.0F - 1.0F); - double d6 = Math.sqrt(d3 * d3 + d4 * d4 + d5 * d5); - - d3 /= d6; - d4 /= d6; - d5 /= d6; - float f1 = this.size * (0.7F + this.world.random.nextFloat() * 0.6F); - - d0 = this.posX; - d1 = this.posY; - d2 = this.posZ; - - for (float f2 = 0.3F; f1 > 0.0F; f1 -= f2 * 0.75F) { - int l = MathHelper.floor(d0); - int i1 = MathHelper.floor(d1); - int j1 = MathHelper.floor(d2); - Block block = this.world.getType(l, i1, j1); - - if (block.getMaterial() != Material.AIR) { - float f3 = this.source != null ? this.source.a(this, this.world, l, i1, j1, block) : block.a(this.source); - - f1 -= (f3 + 0.3F) * f2; - } - - if (f1 > 0.0F && (this.source == null || this.source.a(this, this.world, l, i1, j1, block, f1)) && i1 < 256 && i1 >= 0) { // CraftBukkit - don't wrap explosions - hashset.add(new ChunkPosition(l, i1, j1)); - } - - d0 += d3 * (double) f2; - d1 += d4 * (double) f2; - d2 += d5 * (double) f2; - } - } - } - } - } - - this.blocks.addAll(hashset); - this.size *= 2.0F; - i = MathHelper.floor(this.posX - (double) this.size - 1.0D); - j = MathHelper.floor(this.posX + (double) this.size + 1.0D); - k = MathHelper.floor(this.posY - (double) this.size - 1.0D); - int k1 = MathHelper.floor(this.posY + (double) this.size + 1.0D); - int l1 = MathHelper.floor(this.posZ - (double) this.size - 1.0D); - int i2 = MathHelper.floor(this.posZ + (double) this.size + 1.0D); - List list = this.world.getEntities(this.source, AxisAlignedBB.a((double) i, (double) k, (double) l1, (double) j, (double) k1, (double) i2)); - Vec3D vec3d = Vec3D.a(this.posX, this.posY, this.posZ); - - for (int j2 = 0; j2 < list.size(); ++j2) { - Entity entity = (Entity) list.get(j2); - double d7 = entity.f(this.posX, this.posY, this.posZ) / (double) this.size; - - if (d7 <= 1.0D) { - d0 = entity.locX - this.posX; - d1 = entity.locY + (double) entity.getHeadHeight() - this.posY; - d2 = entity.locZ - this.posZ; - double d8 = (double) MathHelper.sqrt(d0 * d0 + d1 * d1 + d2 * d2); - - if (d8 != 0.0D) { - d0 /= d8; - d1 /= d8; - d2 /= d8; - double d9 = (double) this.world.a(vec3d, entity.boundingBox); - double d10 = (1.0D - d7) * d9; - - // CraftBukkit start - CraftEventFactory.entityDamage = source; - if (!entity.damageEntity(DamageSource.explosion(this), (float) ((int) ((d10 * d10 + d10) / 2.0D * 8.0D * (double) this.size + 1.0D)))) { - CraftEventFactory.entityDamage = null; - continue; - } - // CraftBukkit end - double d11 = EnchantmentProtection.a(entity, d10); - - entity.motX += d0 * d11; - entity.motY += d1 * d11; - entity.motZ += d2 * d11; - if (entity instanceof EntityHuman) { - this.l.put((EntityHuman) entity, Vec3D.a(d0 * d10, d1 * d10, d2 * d10)); - } - } - } - } - - this.size = f; - } - - public void a(boolean flag) { - this.world.makeSound(this.posX, this.posY, this.posZ, "random.explode", 4.0F, (1.0F + (this.world.random.nextFloat() - this.world.random.nextFloat()) * 0.2F) * 0.7F); - if (this.size >= 2.0F && this.b) { - this.world.addParticle("hugeexplosion", this.posX, this.posY, this.posZ, 1.0D, 0.0D, 0.0D); - } else { - this.world.addParticle("largeexplode", this.posX, this.posY, this.posZ, 1.0D, 0.0D, 0.0D); - } - - Iterator iterator; - ChunkPosition chunkposition; - int i; - int j; - int k; - Block block; - - if (this.b) { - // CraftBukkit start - org.bukkit.World bworld = this.world.getWorld(); - org.bukkit.entity.Entity explode = this.source == null ? null : this.source.getBukkitEntity(); - Location location = new Location(bworld, this.posX, this.posY, this.posZ); - - List blockList = new ArrayList(); - for (int i1 = this.blocks.size() - 1; i1 >= 0; i1--) { - ChunkPosition cpos = (ChunkPosition) this.blocks.get(i1); - org.bukkit.block.Block bblock = bworld.getBlockAt(cpos.x, cpos.y, cpos.z); - if (bblock.getType() != org.bukkit.Material.AIR) { - blockList.add(bblock); - } - } - - EntityExplodeEvent event = new EntityExplodeEvent(explode, location, blockList, 0.3F); - this.world.getServer().getPluginManager().callEvent(event); - - this.blocks.clear(); - - for (org.bukkit.block.Block bblock : event.blockList()) { - ChunkPosition coords = new ChunkPosition(bblock.getX(), bblock.getY(), bblock.getZ()); - blocks.add(coords); - } - - if (event.isCancelled()) { - this.wasCanceled = true; - return; - } - // CraftBukkit end - - iterator = this.blocks.iterator(); - - while (iterator.hasNext()) { - chunkposition = (ChunkPosition) iterator.next(); - i = chunkposition.x; - j = chunkposition.y; - k = chunkposition.z; - block = this.world.getType(i, j, k); - if (flag) { - double d0 = (double) ((float) i + this.world.random.nextFloat()); - double d1 = (double) ((float) j + this.world.random.nextFloat()); - double d2 = (double) ((float) k + this.world.random.nextFloat()); - double d3 = d0 - this.posX; - double d4 = d1 - this.posY; - double d5 = d2 - this.posZ; - double d6 = (double) MathHelper.sqrt(d3 * d3 + d4 * d4 + d5 * d5); - - d3 /= d6; - d4 /= d6; - d5 /= d6; - double d7 = 0.5D / (d6 / (double) this.size + 0.1D); - - d7 *= (double) (this.world.random.nextFloat() * this.world.random.nextFloat() + 0.3F); - d3 *= d7; - d4 *= d7; - d5 *= d7; - this.world.addParticle("explode", (d0 + this.posX * 1.0D) / 2.0D, (d1 + this.posY * 1.0D) / 2.0D, (d2 + this.posZ * 1.0D) / 2.0D, d3, d4, d5); - this.world.addParticle("smoke", d0, d1, d2, d3, d4, d5); - } - - if (block.getMaterial() != Material.AIR) { - if (block.a(this)) { - // CraftBukkit - add yield - block.dropNaturally(this.world, i, j, k, this.world.getData(i, j, k), event.getYield(), 0); - } - - this.world.setTypeAndData(i, j, k, Blocks.AIR, 0, 3); - block.wasExploded(this.world, i, j, k, this); - } - } - } - - if (this.a) { - iterator = this.blocks.iterator(); - - while (iterator.hasNext()) { - chunkposition = (ChunkPosition) iterator.next(); - i = chunkposition.x; - j = chunkposition.y; - k = chunkposition.z; - block = this.world.getType(i, j, k); - Block block1 = this.world.getType(i, j - 1, k); - - if (block.getMaterial() == Material.AIR && block1.j() && this.j.nextInt(3) == 0) { - // CraftBukkit start - Ignition by explosion - if (!org.bukkit.craftbukkit.event.CraftEventFactory.callBlockIgniteEvent(this.world, i, j, k, this).isCancelled()) { - this.world.setTypeUpdate(i, j, k, Blocks.FIRE); - } - // CraftBukkit end - } - } - } - } - - public Map b() { - return this.l; - } - - public EntityLiving c() { - return this.source == null ? null : (this.source instanceof EntityTNTPrimed ? ((EntityTNTPrimed) this.source).getSource() : (this.source instanceof EntityLiving ? (EntityLiving) this.source : null)); - } -} diff --git a/src/main/java/net/minecraft/server/FileConversionException.java b/src/main/java/net/minecraft/server/FileConversionException.java deleted file mode 100644 index 4b189bfb7c..0000000000 --- a/src/main/java/net/minecraft/server/FileConversionException.java +++ /dev/null @@ -1,22 +0,0 @@ -package net.minecraft.server; - -// CraftBukkit - Imported because it's package private - -class FileConversionException extends RuntimeException { - - private FileConversionException(String s, Throwable throwable) { - super(s, throwable); - } - - private FileConversionException(String s) { - super(s); - } - - FileConversionException(String s, PredicateEmptyList predicateemptylist) { - this(s); - } - - FileConversionException(String s, Throwable throwable, PredicateEmptyList predicateemptylist) { - this(s, throwable); - } -} diff --git a/src/main/java/net/minecraft/server/FoodMetaData.java b/src/main/java/net/minecraft/server/FoodMetaData.java deleted file mode 100644 index 41692318eb..0000000000 --- a/src/main/java/net/minecraft/server/FoodMetaData.java +++ /dev/null @@ -1,116 +0,0 @@ -package net.minecraft.server; - -public class FoodMetaData { - - // CraftBukkit start - All made public - public int foodLevel = 20; - public float saturationLevel = 5.0F; - public float exhaustionLevel; - public int foodTickTimer; - private EntityHuman entityhuman; - // CraftBukkit end - private int e = 20; - - public FoodMetaData() { throw new AssertionError("Whoopsie, we missed the bukkit."); } // CraftBukkit start - throw an error - - // CraftBukkit start - added EntityHuman constructor - public FoodMetaData(EntityHuman entityhuman) { - org.apache.commons.lang.Validate.notNull(entityhuman); - this.entityhuman = entityhuman; - } - // CraftBukkit end - - public void eat(int i, float f) { - this.foodLevel = Math.min(i + this.foodLevel, 20); - this.saturationLevel = Math.min(this.saturationLevel + (float) i * f * 2.0F, (float) this.foodLevel); - } - - public void a(ItemFood itemfood, ItemStack itemstack) { - // CraftBukkit start - int oldFoodLevel = foodLevel; - - org.bukkit.event.entity.FoodLevelChangeEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callFoodLevelChangeEvent(entityhuman, itemfood.getNutrition(itemstack) + oldFoodLevel); - - if (!event.isCancelled()) { - this.eat(event.getFoodLevel() - oldFoodLevel, itemfood.getSaturationModifier(itemstack)); - } - - ((EntityPlayer) entityhuman).playerConnection.sendPacket(new PacketPlayOutUpdateHealth(((EntityPlayer) entityhuman).getBukkitEntity().getScaledHealth(), entityhuman.getFoodData().foodLevel, entityhuman.getFoodData().saturationLevel)); - // CraftBukkit end - } - - public void a(EntityHuman entityhuman) { - EnumDifficulty enumdifficulty = entityhuman.world.difficulty; - - this.e = this.foodLevel; - if (this.exhaustionLevel > 4.0F) { - this.exhaustionLevel -= 4.0F; - if (this.saturationLevel > 0.0F) { - this.saturationLevel = Math.max(this.saturationLevel - 1.0F, 0.0F); - } else if (enumdifficulty != EnumDifficulty.PEACEFUL) { - // CraftBukkit start - org.bukkit.event.entity.FoodLevelChangeEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callFoodLevelChangeEvent(entityhuman, Math.max(this.foodLevel - 1, 0)); - - if (!event.isCancelled()) { - this.foodLevel = event.getFoodLevel(); - } - - ((EntityPlayer) entityhuman).playerConnection.sendPacket(new PacketPlayOutUpdateHealth(((EntityPlayer) entityhuman).getBukkitEntity().getScaledHealth(), this.foodLevel, this.saturationLevel)); - // CraftBukkit end - } - } - - if (entityhuman.world.getGameRules().getBoolean("naturalRegeneration") && this.foodLevel >= 18 && entityhuman.bR()) { - ++this.foodTickTimer; - if (this.foodTickTimer >= 80) { - // CraftBukkit - added RegainReason - entityhuman.heal(1.0F, org.bukkit.event.entity.EntityRegainHealthEvent.RegainReason.SATIATED); - this.a(3.0F); - this.foodTickTimer = 0; - } - } else if (this.foodLevel <= 0) { - ++this.foodTickTimer; - if (this.foodTickTimer >= 80) { - if (entityhuman.getHealth() > 10.0F || enumdifficulty == EnumDifficulty.HARD || entityhuman.getHealth() > 1.0F && enumdifficulty == EnumDifficulty.NORMAL) { - entityhuman.damageEntity(DamageSource.STARVE, 1.0F); - } - - this.foodTickTimer = 0; - } - } else { - this.foodTickTimer = 0; - } - } - - public void a(NBTTagCompound nbttagcompound) { - if (nbttagcompound.hasKeyOfType("foodLevel", 99)) { - this.foodLevel = nbttagcompound.getInt("foodLevel"); - this.foodTickTimer = nbttagcompound.getInt("foodTickTimer"); - this.saturationLevel = nbttagcompound.getFloat("foodSaturationLevel"); - this.exhaustionLevel = nbttagcompound.getFloat("foodExhaustionLevel"); - } - } - - public void b(NBTTagCompound nbttagcompound) { - nbttagcompound.setInt("foodLevel", this.foodLevel); - nbttagcompound.setInt("foodTickTimer", this.foodTickTimer); - nbttagcompound.setFloat("foodSaturationLevel", this.saturationLevel); - nbttagcompound.setFloat("foodExhaustionLevel", this.exhaustionLevel); - } - - public int getFoodLevel() { - return this.foodLevel; - } - - public boolean c() { - return this.foodLevel < 20; - } - - public void a(float f) { - this.exhaustionLevel = Math.min(this.exhaustionLevel + f, 40.0F); - } - - public float getSaturationLevel() { - return this.saturationLevel; - } -} diff --git a/src/main/java/net/minecraft/server/GroupDataZombie.java b/src/main/java/net/minecraft/server/GroupDataZombie.java deleted file mode 100644 index 340af90fce..0000000000 --- a/src/main/java/net/minecraft/server/GroupDataZombie.java +++ /dev/null @@ -1,21 +0,0 @@ -package net.minecraft.server; - -// CraftBukkit - package-private import -class GroupDataZombie implements GroupDataEntity { - - public boolean a; - public boolean b; - final EntityZombie c; - - private GroupDataZombie(EntityZombie entityzombie, boolean flag, boolean flag1) { - this.c = entityzombie; - this.a = false; - this.b = false; - this.a = flag; - this.b = flag1; - } - - GroupDataZombie(EntityZombie entityzombie, boolean flag, boolean flag1, EmptyClassZombie emptyclasszombie) { - this(entityzombie, flag, flag1); - } -} diff --git a/src/main/java/net/minecraft/server/HandshakeListener.java b/src/main/java/net/minecraft/server/HandshakeListener.java deleted file mode 100644 index 52bc69b67c..0000000000 --- a/src/main/java/net/minecraft/server/HandshakeListener.java +++ /dev/null @@ -1,99 +0,0 @@ -package net.minecraft.server; - -import net.minecraft.util.io.netty.util.concurrent.GenericFutureListener; - -// CraftBukkit start -import java.net.InetAddress; -import java.util.HashMap; -// CraftBukkit end - -public class HandshakeListener implements PacketHandshakingInListener { - - // CraftBukkit start - add fields - private static final HashMap throttleTracker = new HashMap(); - private static int throttleCounter = 0; - // CraftBukkit end - - private final MinecraftServer a; - private final NetworkManager b; - - public HandshakeListener(MinecraftServer minecraftserver, NetworkManager networkmanager) { - this.a = minecraftserver; - this.b = networkmanager; - } - - public void a(PacketHandshakingInSetProtocol packethandshakinginsetprotocol) { - switch (ProtocolOrdinalWrapper.a[packethandshakinginsetprotocol.c().ordinal()]) { - case 1: - this.b.a(EnumProtocol.LOGIN); - ChatComponentText chatcomponenttext; - - // CraftBukkit start - Connection throttle - try { - long currentTime = System.currentTimeMillis(); - long connectionThrottle = MinecraftServer.getServer().server.getConnectionThrottle(); - InetAddress address = ((java.net.InetSocketAddress) this.b.getSocketAddress()).getAddress(); - - synchronized (throttleTracker) { - if (throttleTracker.containsKey(address) && !"127.0.0.1".equals(address.getHostAddress()) && currentTime - throttleTracker.get(address) < connectionThrottle) { - throttleTracker.put(address, currentTime); - chatcomponenttext = new ChatComponentText("Connection throttled! Please wait before reconnecting."); - this.b.handle(new PacketLoginOutDisconnect(chatcomponenttext), new GenericFutureListener[0]); - this.b.close(chatcomponenttext); - return; - } - - throttleTracker.put(address, currentTime); - throttleCounter++; - if (throttleCounter > 200) { - throttleCounter = 0; - - // Cleanup stale entries - java.util.Iterator iter = throttleTracker.entrySet().iterator(); - while (iter.hasNext()) { - java.util.Map.Entry entry = (java.util.Map.Entry) iter.next(); - if (entry.getValue() > connectionThrottle) { - iter.remove(); - } - } - } - } - } catch (Throwable t) { - org.apache.logging.log4j.LogManager.getLogger().debug("Failed to check connection throttle", t); - } - // CraftBukkit end - - if (packethandshakinginsetprotocol.d() > 5) { - chatcomponenttext = new ChatComponentText("Outdated server! I\'m still on 1.7.10"); - this.b.handle(new PacketLoginOutDisconnect(chatcomponenttext), new GenericFutureListener[0]); - this.b.close(chatcomponenttext); - } else if (packethandshakinginsetprotocol.d() < 5) { - chatcomponenttext = new ChatComponentText("Outdated client! Please use 1.7.10"); - this.b.handle(new PacketLoginOutDisconnect(chatcomponenttext), new GenericFutureListener[0]); - this.b.close(chatcomponenttext); - } else { - this.b.a((PacketListener) (new LoginListener(this.a, this.b))); - ((LoginListener) this.b.getPacketListener()).hostname = packethandshakinginsetprotocol.b + ":" + packethandshakinginsetprotocol.c; // CraftBukkit - set hostname - } - break; - - case 2: - this.b.a(EnumProtocol.STATUS); - this.b.a((PacketListener) (new PacketStatusListener(this.a, this.b))); - break; - - default: - throw new UnsupportedOperationException("Invalid intention " + packethandshakinginsetprotocol.c()); - } - } - - public void a(IChatBaseComponent ichatbasecomponent) {} - - public void a(EnumProtocol enumprotocol, EnumProtocol enumprotocol1) { - if (enumprotocol1 != EnumProtocol.LOGIN && enumprotocol1 != EnumProtocol.STATUS) { - throw new UnsupportedOperationException("Invalid state " + enumprotocol1); - } - } - - public void a() {} -} diff --git a/src/main/java/net/minecraft/server/IDataManager.java b/src/main/java/net/minecraft/server/IDataManager.java deleted file mode 100644 index e5d578dfd6..0000000000 --- a/src/main/java/net/minecraft/server/IDataManager.java +++ /dev/null @@ -1,28 +0,0 @@ -package net.minecraft.server; - -import java.io.File; - -public interface IDataManager { - - WorldData getWorldData(); - - void checkSession() throws ExceptionWorldConflict; // CraftBukkit - throws ExceptionWorldConflict - - IChunkLoader createChunkLoader(WorldProvider worldprovider); - - void saveWorldData(WorldData worlddata, NBTTagCompound nbttagcompound); - - void saveWorldData(WorldData worlddata); - - IPlayerFileData getPlayerFileData(); - - void a(); - - File getDirectory(); - - File getDataFile(String s); - - String g(); - - java.util.UUID getUUID(); // CraftBukkit -} diff --git a/src/main/java/net/minecraft/server/IInventory.java b/src/main/java/net/minecraft/server/IInventory.java deleted file mode 100644 index bfc5c86975..0000000000 --- a/src/main/java/net/minecraft/server/IInventory.java +++ /dev/null @@ -1,48 +0,0 @@ -package net.minecraft.server; - -import org.bukkit.craftbukkit.entity.CraftHumanEntity; // CraftBukkit - -public interface IInventory { - - int getSize(); - - ItemStack getItem(int i); - - ItemStack splitStack(int i, int j); - - ItemStack splitWithoutUpdate(int i); - - void setItem(int i, ItemStack itemstack); - - String getInventoryName(); - - boolean k_(); - - int getMaxStackSize(); - - void update(); - - boolean a(EntityHuman entityhuman); - - void startOpen(); - - void closeContainer(); - - boolean b(int i, ItemStack itemstack); - - // CraftBukkit start - ItemStack[] getContents(); - - void onOpen(CraftHumanEntity who); - - void onClose(CraftHumanEntity who); - - java.util.List getViewers(); - - org.bukkit.inventory.InventoryHolder getOwner(); - - void setMaxStackSize(int size); - - int MAX_STACK = 64; - // CraftBukkit end -} diff --git a/src/main/java/net/minecraft/server/IRecipe.java b/src/main/java/net/minecraft/server/IRecipe.java deleted file mode 100644 index bb28c12fdd..0000000000 --- a/src/main/java/net/minecraft/server/IRecipe.java +++ /dev/null @@ -1,14 +0,0 @@ -package net.minecraft.server; - -public interface IRecipe { - - boolean a(InventoryCrafting inventorycrafting, World world); - - ItemStack a(InventoryCrafting inventorycrafting); - - int a(); - - ItemStack b(); - - org.bukkit.inventory.Recipe toBukkitRecipe(); // CraftBukkit -} diff --git a/src/main/java/net/minecraft/server/IntHashMap.java b/src/main/java/net/minecraft/server/IntHashMap.java deleted file mode 100644 index fff9d7acd6..0000000000 --- a/src/main/java/net/minecraft/server/IntHashMap.java +++ /dev/null @@ -1,167 +0,0 @@ -package net.minecraft.server; - -import java.util.HashSet; -import java.util.Set; - -public class IntHashMap { - - private transient IntHashMapEntry[] a = new IntHashMapEntry[16]; - private transient int b; - private int c = 12; - private final float d = 0.75F; - private transient volatile int e; - // private Set f = new HashSet(); // CraftBukkit - expensive and unused - - public IntHashMap() {} - - private static int g(int i) { - i ^= i >>> 20 ^ i >>> 12; - return i ^ i >>> 7 ^ i >>> 4; - } - - private static int a(int i, int j) { - return i & j - 1; - } - - public Object get(int i) { - int j = g(i); - - for (IntHashMapEntry inthashmapentry = this.a[a(j, this.a.length)]; inthashmapentry != null; inthashmapentry = inthashmapentry.c) { - if (inthashmapentry.a == i) { - return inthashmapentry.b; - } - } - - return null; - } - - public boolean b(int i) { - return this.c(i) != null; - } - - final IntHashMapEntry c(int i) { - int j = g(i); - - for (IntHashMapEntry inthashmapentry = this.a[a(j, this.a.length)]; inthashmapentry != null; inthashmapentry = inthashmapentry.c) { - if (inthashmapentry.a == i) { - return inthashmapentry; - } - } - - return null; - } - - public void a(int i, Object object) { - // this.f.add(Integer.valueOf(i)); // CraftBukkit - int j = g(i); - int k = a(j, this.a.length); - - for (IntHashMapEntry inthashmapentry = this.a[k]; inthashmapentry != null; inthashmapentry = inthashmapentry.c) { - if (inthashmapentry.a == i) { - inthashmapentry.b = object; - return; - } - } - - ++this.e; - this.a(j, i, object, k); - } - - private void h(int i) { - IntHashMapEntry[] ainthashmapentry = this.a; - int j = ainthashmapentry.length; - - if (j == 1073741824) { - this.c = Integer.MAX_VALUE; - } else { - IntHashMapEntry[] ainthashmapentry1 = new IntHashMapEntry[i]; - - this.a(ainthashmapentry1); - this.a = ainthashmapentry1; - this.c = (int) ((float) i * this.d); - } - } - - private void a(IntHashMapEntry[] ainthashmapentry) { - IntHashMapEntry[] ainthashmapentry1 = this.a; - int i = ainthashmapentry.length; - - for (int j = 0; j < ainthashmapentry1.length; ++j) { - IntHashMapEntry inthashmapentry = ainthashmapentry1[j]; - - if (inthashmapentry != null) { - ainthashmapentry1[j] = null; - - IntHashMapEntry inthashmapentry1; - - do { - inthashmapentry1 = inthashmapentry.c; - int k = a(inthashmapentry.d, i); - - inthashmapentry.c = ainthashmapentry[k]; - ainthashmapentry[k] = inthashmapentry; - inthashmapentry = inthashmapentry1; - } while (inthashmapentry1 != null); - } - } - } - - public Object d(int i) { - // this.f.remove(Integer.valueOf(i)); // CraftBukkit - IntHashMapEntry inthashmapentry = this.e(i); - - return inthashmapentry == null ? null : inthashmapentry.b; - } - - final IntHashMapEntry e(int i) { - int j = g(i); - int k = a(j, this.a.length); - IntHashMapEntry inthashmapentry = this.a[k]; - - IntHashMapEntry inthashmapentry1; - IntHashMapEntry inthashmapentry2; - - for (inthashmapentry1 = inthashmapentry; inthashmapentry1 != null; inthashmapentry1 = inthashmapentry2) { - inthashmapentry2 = inthashmapentry1.c; - if (inthashmapentry1.a == i) { - ++this.e; - --this.b; - if (inthashmapentry == inthashmapentry1) { - this.a[k] = inthashmapentry2; - } else { - inthashmapentry.c = inthashmapentry2; - } - - return inthashmapentry1; - } - - inthashmapentry = inthashmapentry1; - } - - return inthashmapentry1; - } - - public void c() { - ++this.e; - IntHashMapEntry[] ainthashmapentry = this.a; - - for (int i = 0; i < ainthashmapentry.length; ++i) { - ainthashmapentry[i] = null; - } - - this.b = 0; - } - - private void a(int i, int j, Object object, int k) { - IntHashMapEntry inthashmapentry = this.a[k]; - - this.a[k] = new IntHashMapEntry(i, j, object, inthashmapentry); - if (this.b++ >= this.c) { - this.h(2 * this.a.length); - } - } - - static int f(int i) { - return g(i); - } -} diff --git a/src/main/java/net/minecraft/server/InventoryCraftResult.java b/src/main/java/net/minecraft/server/InventoryCraftResult.java deleted file mode 100644 index 7db8290046..0000000000 --- a/src/main/java/net/minecraft/server/InventoryCraftResult.java +++ /dev/null @@ -1,96 +0,0 @@ -package net.minecraft.server; - -// CraftBukkit start -import org.bukkit.craftbukkit.entity.CraftHumanEntity; -import org.bukkit.entity.HumanEntity; -// CraftBukkit end - -public class InventoryCraftResult implements IInventory { - - private ItemStack[] items = new ItemStack[1]; - - // CraftBukkit start - private int maxStack = MAX_STACK; - - public ItemStack[] getContents() { - return this.items; - } - - public org.bukkit.inventory.InventoryHolder getOwner() { - return null; // Result slots don't get an owner - } - - // Don't need a transaction; the InventoryCrafting keeps track of it for us - public void onOpen(CraftHumanEntity who) {} - public void onClose(CraftHumanEntity who) {} - public java.util.List getViewers() { - return new java.util.ArrayList(); - } - - public void setMaxStackSize(int size) { - maxStack = size; - } - // CraftBukkit end - - public InventoryCraftResult() {} - - public int getSize() { - return 1; - } - - public ItemStack getItem(int i) { - return this.items[0]; - } - - public String getInventoryName() { - return "Result"; - } - - public boolean k_() { - return false; - } - - public ItemStack splitStack(int i, int j) { - if (this.items[0] != null) { - ItemStack itemstack = this.items[0]; - - this.items[0] = null; - return itemstack; - } else { - return null; - } - } - - public ItemStack splitWithoutUpdate(int i) { - if (this.items[0] != null) { - ItemStack itemstack = this.items[0]; - - this.items[0] = null; - return itemstack; - } else { - return null; - } - } - - public void setItem(int i, ItemStack itemstack) { - this.items[0] = itemstack; - } - - public int getMaxStackSize() { - return maxStack; // CraftBukkit - } - - public void update() {} - - public boolean a(EntityHuman entityhuman) { - return true; - } - - public void startOpen() {} - - public void closeContainer() {} - - public boolean b(int i, ItemStack itemstack) { - return true; - } -} diff --git a/src/main/java/net/minecraft/server/InventoryCrafting.java b/src/main/java/net/minecraft/server/InventoryCrafting.java deleted file mode 100644 index 5b46597d85..0000000000 --- a/src/main/java/net/minecraft/server/InventoryCrafting.java +++ /dev/null @@ -1,149 +0,0 @@ -package net.minecraft.server; - -// CraftBukkit start -import java.util.List; - -import org.bukkit.craftbukkit.entity.CraftHumanEntity; -import org.bukkit.entity.HumanEntity; -import org.bukkit.event.inventory.InventoryType; -// CraftBukkit end - -public class InventoryCrafting implements IInventory { - - private ItemStack[] items; - private int b; - private Container c; - - // CraftBukkit start - add fields - public List transaction = new java.util.ArrayList(); - public IRecipe currentRecipe; - public IInventory resultInventory; - private EntityHuman owner; - private int maxStack = MAX_STACK; - - public ItemStack[] getContents() { - return this.items; - } - - public void onOpen(CraftHumanEntity who) { - transaction.add(who); - } - - public InventoryType getInvType() { - return items.length == 4 ? InventoryType.CRAFTING : InventoryType.WORKBENCH; - } - - public void onClose(CraftHumanEntity who) { - transaction.remove(who); - } - - public List getViewers() { - return transaction; - } - - public org.bukkit.inventory.InventoryHolder getOwner() { - return owner.getBukkitEntity(); - } - - public void setMaxStackSize(int size) { - maxStack = size; - resultInventory.setMaxStackSize(size); - } - - public InventoryCrafting(Container container, int i, int j, EntityHuman player) { - this(container, i, j); - this.owner = player; - } - // CraftBukkit end - - public InventoryCrafting(Container container, int i, int j) { - int k = i * j; - - this.items = new ItemStack[k]; - this.c = container; - this.b = i; - } - - public int getSize() { - return this.items.length; - } - - public ItemStack getItem(int i) { - return i >= this.getSize() ? null : this.items[i]; - } - - public ItemStack b(int i, int j) { - if (i >= 0 && i < this.b) { - int k = i + j * this.b; - - return this.getItem(k); - } else { - return null; - } - } - - public String getInventoryName() { - return "container.crafting"; - } - - public boolean k_() { - return false; - } - - public ItemStack splitWithoutUpdate(int i) { - if (this.items[i] != null) { - ItemStack itemstack = this.items[i]; - - this.items[i] = null; - return itemstack; - } else { - return null; - } - } - - public ItemStack splitStack(int i, int j) { - if (this.items[i] != null) { - ItemStack itemstack; - - if (this.items[i].count <= j) { - itemstack = this.items[i]; - this.items[i] = null; - this.c.a((IInventory) this); - return itemstack; - } else { - itemstack = this.items[i].a(j); - if (this.items[i].count == 0) { - this.items[i] = null; - } - - this.c.a((IInventory) this); - return itemstack; - } - } else { - return null; - } - } - - public void setItem(int i, ItemStack itemstack) { - this.items[i] = itemstack; - this.c.a((IInventory) this); - } - - public int getMaxStackSize() { - return maxStack; // CraftBukkit - } - - public void update() {} - - public boolean a(EntityHuman entityhuman) { - return true; - } - - public void startOpen() {} - - public void closeContainer() {} - - public boolean b(int i, ItemStack itemstack) { - return true; - } -} diff --git a/src/main/java/net/minecraft/server/InventoryEnderChest.java b/src/main/java/net/minecraft/server/InventoryEnderChest.java deleted file mode 100644 index ed23f78767..0000000000 --- a/src/main/java/net/minecraft/server/InventoryEnderChest.java +++ /dev/null @@ -1,110 +0,0 @@ -package net.minecraft.server; - -// CraftBukkit start -import java.util.List; -import org.bukkit.craftbukkit.entity.CraftHumanEntity; -import org.bukkit.entity.HumanEntity; -// CraftBukkit end - -public class InventoryEnderChest extends InventorySubcontainer { - - private TileEntityEnderChest a; - - // CraftBukkit start - add fields and methods - public List transaction = new java.util.ArrayList(); - public org.bukkit.entity.Player player; - private int maxStack = MAX_STACK; - - public ItemStack[] getContents() { - return this.items; - } - - public void onOpen(CraftHumanEntity who) { - transaction.add(who); - } - - public void onClose(CraftHumanEntity who) { - transaction.remove(who); - } - - public List getViewers() { - return transaction; - } - - public org.bukkit.inventory.InventoryHolder getOwner() { - return this.player; - } - - public void setMaxStackSize(int size) { - maxStack = size; - } - - public int getMaxStackSize() { - return maxStack; - } - // CraftBukkit end - - public InventoryEnderChest() { - super("container.enderchest", false, 27); - } - - public void a(TileEntityEnderChest tileentityenderchest) { - this.a = tileentityenderchest; - } - - public void a(NBTTagList nbttaglist) { - int i; - - for (i = 0; i < this.getSize(); ++i) { - this.setItem(i, (ItemStack) null); - } - - for (i = 0; i < nbttaglist.size(); ++i) { - NBTTagCompound nbttagcompound = nbttaglist.get(i); - int j = nbttagcompound.getByte("Slot") & 255; - - if (j >= 0 && j < this.getSize()) { - this.setItem(j, ItemStack.createStack(nbttagcompound)); - } - } - } - - public NBTTagList h() { - NBTTagList nbttaglist = new NBTTagList(); - - for (int i = 0; i < this.getSize(); ++i) { - ItemStack itemstack = this.getItem(i); - - if (itemstack != null) { - NBTTagCompound nbttagcompound = new NBTTagCompound(); - - nbttagcompound.setByte("Slot", (byte) i); - itemstack.save(nbttagcompound); - nbttaglist.add(nbttagcompound); - } - } - - return nbttaglist; - } - - public boolean a(EntityHuman entityhuman) { - return this.a != null && !this.a.a(entityhuman) ? false : super.a(entityhuman); - } - - public void startOpen() { - if (this.a != null) { - this.a.a(); - } - - super.startOpen(); - } - - public void closeContainer() { - if (this.a != null) { - this.a.b(); - } - - super.closeContainer(); - this.a = null; - } -} diff --git a/src/main/java/net/minecraft/server/InventoryHorseChest.java b/src/main/java/net/minecraft/server/InventoryHorseChest.java deleted file mode 100644 index 01289950d3..0000000000 --- a/src/main/java/net/minecraft/server/InventoryHorseChest.java +++ /dev/null @@ -1,60 +0,0 @@ -package net.minecraft.server; - -// CraftBukkit start -import java.util.List; -import org.bukkit.craftbukkit.entity.CraftHumanEntity; -import org.bukkit.entity.HumanEntity; -// CraftBukkit end - -public class InventoryHorseChest extends InventorySubcontainer { - - public InventoryHorseChest(String s, int i) { - super(s, false, i); - } - - // CraftBukkit start - add fields and methods - public List transaction = new java.util.ArrayList(); - private EntityHorse horse; - private int maxStack = MAX_STACK; - - public InventoryHorseChest(String s, int i, EntityHorse horse) { - this(s, i); - this.horse = horse; - } - - @Override - public ItemStack[] getContents() { - return this.items; - } - - @Override - public void onOpen(CraftHumanEntity who) { - transaction.add(who); - } - - @Override - public void onClose(CraftHumanEntity who) { - transaction.remove(who); - } - - @Override - public List getViewers() { - return transaction; - } - - @Override - public org.bukkit.inventory.InventoryHolder getOwner() { - return (org.bukkit.entity.Horse) this.horse.getBukkitEntity(); - } - - @Override - public void setMaxStackSize(int size) { - maxStack = size; - } - - @Override - public int getMaxStackSize() { - return maxStack; - } - // CraftBukkit end -} diff --git a/src/main/java/net/minecraft/server/InventoryLargeChest.java b/src/main/java/net/minecraft/server/InventoryLargeChest.java deleted file mode 100644 index 263de7c5d0..0000000000 --- a/src/main/java/net/minecraft/server/InventoryLargeChest.java +++ /dev/null @@ -1,129 +0,0 @@ -package net.minecraft.server; - -// CraftBukkit start -import java.util.List; - -import org.bukkit.craftbukkit.entity.CraftHumanEntity; -import org.bukkit.entity.HumanEntity; -// CraftBukkit end - -public class InventoryLargeChest implements IInventory { - - private String a; - public IInventory left; // CraftBukkit - private -> public - public IInventory right; // CraftBukkit - private -> public - - // CraftBukkit start - add fields and methods - public List transaction = new java.util.ArrayList(); - - public ItemStack[] getContents() { - ItemStack[] result = new ItemStack[this.getSize()]; - for (int i = 0; i < result.length; i++) { - result[i] = this.getItem(i); - } - return result; - } - - public void onOpen(CraftHumanEntity who) { - this.left.onOpen(who); - this.right.onOpen(who); - transaction.add(who); - } - - public void onClose(CraftHumanEntity who) { - this.left.onClose(who); - this.right.onClose(who); - transaction.remove(who); - } - - public List getViewers() { - return transaction; - } - - public org.bukkit.inventory.InventoryHolder getOwner() { - return null; // This method won't be called since CraftInventoryDoubleChest doesn't defer to here - } - - public void setMaxStackSize(int size) { - this.left.setMaxStackSize(size); - this.right.setMaxStackSize(size); - } - // CraftBukkit end - - public InventoryLargeChest(String s, IInventory iinventory, IInventory iinventory1) { - this.a = s; - if (iinventory == null) { - iinventory = iinventory1; - } - - if (iinventory1 == null) { - iinventory1 = iinventory; - } - - this.left = iinventory; - this.right = iinventory1; - } - - public int getSize() { - return this.left.getSize() + this.right.getSize(); - } - - public boolean a(IInventory iinventory) { - return this.left == iinventory || this.right == iinventory; - } - - public String getInventoryName() { - return this.left.k_() ? this.left.getInventoryName() : (this.right.k_() ? this.right.getInventoryName() : this.a); - } - - public boolean k_() { - return this.left.k_() || this.right.k_(); - } - - public ItemStack getItem(int i) { - return i >= this.left.getSize() ? this.right.getItem(i - this.left.getSize()) : this.left.getItem(i); - } - - public ItemStack splitStack(int i, int j) { - return i >= this.left.getSize() ? this.right.splitStack(i - this.left.getSize(), j) : this.left.splitStack(i, j); - } - - public ItemStack splitWithoutUpdate(int i) { - return i >= this.left.getSize() ? this.right.splitWithoutUpdate(i - this.left.getSize()) : this.left.splitWithoutUpdate(i); - } - - public void setItem(int i, ItemStack itemstack) { - if (i >= this.left.getSize()) { - this.right.setItem(i - this.left.getSize(), itemstack); - } else { - this.left.setItem(i, itemstack); - } - } - - public int getMaxStackSize() { - return Math.min(this.left.getMaxStackSize(), this.right.getMaxStackSize()); // CraftBukkit - check both sides - } - - public void update() { - this.left.update(); - this.right.update(); - } - - public boolean a(EntityHuman entityhuman) { - return this.left.a(entityhuman) && this.right.a(entityhuman); - } - - public void startOpen() { - this.left.startOpen(); - this.right.startOpen(); - } - - public void closeContainer() { - this.left.closeContainer(); - this.right.closeContainer(); - } - - public boolean b(int i, ItemStack itemstack) { - return true; - } -} diff --git a/src/main/java/net/minecraft/server/InventoryMerchant.java b/src/main/java/net/minecraft/server/InventoryMerchant.java deleted file mode 100644 index b5617b32ca..0000000000 --- a/src/main/java/net/minecraft/server/InventoryMerchant.java +++ /dev/null @@ -1,192 +0,0 @@ -package net.minecraft.server; - -// CraftBukkit start -import java.util.List; -import org.bukkit.craftbukkit.entity.CraftHumanEntity; -import org.bukkit.entity.HumanEntity; -// CraftBukkit end - -public class InventoryMerchant implements IInventory { - - private final IMerchant merchant; - private ItemStack[] itemsInSlots = new ItemStack[3]; - private final EntityHuman player; - private MerchantRecipe recipe; - private int e; - - // CraftBukkit start - add fields and methods - public List transaction = new java.util.ArrayList(); - private int maxStack = MAX_STACK; - - public ItemStack[] getContents() { - return this.itemsInSlots; - } - - public void onOpen(CraftHumanEntity who) { - transaction.add(who); - } - - public void onClose(CraftHumanEntity who) { - transaction.remove(who); - } - - public List getViewers() { - return transaction; - } - - public void setMaxStackSize(int i) { - maxStack = i; - } - - public org.bukkit.inventory.InventoryHolder getOwner() { - return player.getBukkitEntity(); - } - // CraftBukkit end - - public InventoryMerchant(EntityHuman entityhuman, IMerchant imerchant) { - this.player = entityhuman; - this.merchant = imerchant; - } - - public int getSize() { - return this.itemsInSlots.length; - } - - public ItemStack getItem(int i) { - return this.itemsInSlots[i]; - } - - public ItemStack splitStack(int i, int j) { - if (this.itemsInSlots[i] != null) { - ItemStack itemstack; - - if (i == 2) { - itemstack = this.itemsInSlots[i]; - this.itemsInSlots[i] = null; - return itemstack; - } else if (this.itemsInSlots[i].count <= j) { - itemstack = this.itemsInSlots[i]; - this.itemsInSlots[i] = null; - if (this.d(i)) { - this.h(); - } - - return itemstack; - } else { - itemstack = this.itemsInSlots[i].a(j); - if (this.itemsInSlots[i].count == 0) { - this.itemsInSlots[i] = null; - } - - if (this.d(i)) { - this.h(); - } - - return itemstack; - } - } else { - return null; - } - } - - private boolean d(int i) { - return i == 0 || i == 1; - } - - public ItemStack splitWithoutUpdate(int i) { - if (this.itemsInSlots[i] != null) { - ItemStack itemstack = this.itemsInSlots[i]; - - this.itemsInSlots[i] = null; - return itemstack; - } else { - return null; - } - } - - public void setItem(int i, ItemStack itemstack) { - this.itemsInSlots[i] = itemstack; - if (itemstack != null && itemstack.count > this.getMaxStackSize()) { - itemstack.count = this.getMaxStackSize(); - } - - if (this.d(i)) { - this.h(); - } - } - - public String getInventoryName() { - return "mob.villager"; - } - - public boolean k_() { - return false; - } - - public int getMaxStackSize() { - return maxStack; // CraftBukkit - } - - public boolean a(EntityHuman entityhuman) { - return this.merchant.b() == entityhuman; - } - - public void startOpen() {} - - public void closeContainer() {} - - public boolean b(int i, ItemStack itemstack) { - return true; - } - - public void update() { - this.h(); - } - - public void h() { - this.recipe = null; - ItemStack itemstack = this.itemsInSlots[0]; - ItemStack itemstack1 = this.itemsInSlots[1]; - - if (itemstack == null) { - itemstack = itemstack1; - itemstack1 = null; - } - - if (itemstack == null) { - this.setItem(2, (ItemStack) null); - } else { - MerchantRecipeList merchantrecipelist = this.merchant.getOffers(this.player); - - if (merchantrecipelist != null) { - MerchantRecipe merchantrecipe = merchantrecipelist.a(itemstack, itemstack1, this.e); - - if (merchantrecipe != null && !merchantrecipe.g()) { - this.recipe = merchantrecipe; - this.setItem(2, merchantrecipe.getBuyItem3().cloneItemStack()); - } else if (itemstack1 != null) { - merchantrecipe = merchantrecipelist.a(itemstack1, itemstack, this.e); - if (merchantrecipe != null && !merchantrecipe.g()) { - this.recipe = merchantrecipe; - this.setItem(2, merchantrecipe.getBuyItem3().cloneItemStack()); - } else { - this.setItem(2, (ItemStack) null); - } - } else { - this.setItem(2, (ItemStack) null); - } - } - } - - this.merchant.a_(this.getItem(2)); - } - - public MerchantRecipe getRecipe() { - return this.recipe; - } - - public void c(int i) { - this.e = i; - this.h(); - } -} diff --git a/src/main/java/net/minecraft/server/InventorySubcontainer.java b/src/main/java/net/minecraft/server/InventorySubcontainer.java deleted file mode 100644 index 9a775e4c34..0000000000 --- a/src/main/java/net/minecraft/server/InventorySubcontainer.java +++ /dev/null @@ -1,120 +0,0 @@ -package net.minecraft.server; - -import java.util.ArrayList; -import java.util.List; - -public abstract class InventorySubcontainer implements IInventory { // CraftBukkit - abstract - - private String a; - private int b; - protected ItemStack[] items; // CraftBukkit - protected - private List d; - private boolean e; - - public InventorySubcontainer(String s, boolean flag, int i) { - this.a = s; - this.e = flag; - this.b = i; - this.items = new ItemStack[i]; - } - - public void a(IInventoryListener iinventorylistener) { - if (this.d == null) { - this.d = new ArrayList(); - } - - this.d.add(iinventorylistener); - } - - public void b(IInventoryListener iinventorylistener) { - this.d.remove(iinventorylistener); - } - - public ItemStack getItem(int i) { - return i >= 0 && i < this.items.length ? this.items[i] : null; - } - - public ItemStack splitStack(int i, int j) { - if (this.items[i] != null) { - ItemStack itemstack; - - if (this.items[i].count <= j) { - itemstack = this.items[i]; - this.items[i] = null; - this.update(); - return itemstack; - } else { - itemstack = this.items[i].a(j); - if (this.items[i].count == 0) { - this.items[i] = null; - } - - this.update(); - return itemstack; - } - } else { - return null; - } - } - - public ItemStack splitWithoutUpdate(int i) { - if (this.items[i] != null) { - ItemStack itemstack = this.items[i]; - - this.items[i] = null; - return itemstack; - } else { - return null; - } - } - - public void setItem(int i, ItemStack itemstack) { - this.items[i] = itemstack; - if (itemstack != null && itemstack.count > this.getMaxStackSize()) { - itemstack.count = this.getMaxStackSize(); - } - - this.update(); - } - - public int getSize() { - return this.b; - } - - public String getInventoryName() { - return this.a; - } - - public boolean k_() { - return this.e; - } - - public void a(String s) { - this.e = true; - this.a = s; - } - - public int getMaxStackSize() { - return 64; - } - - public void update() { - if (this.d != null) { - for (int i = 0; i < this.d.size(); ++i) { - ((IInventoryListener) this.d.get(i)).a(this); - } - } - } - - public boolean a(EntityHuman entityhuman) { - return true; - } - - public void startOpen() {} - - public void closeContainer() {} - - public boolean b(int i, ItemStack itemstack) { - return true; - } -} diff --git a/src/main/java/net/minecraft/server/Item.java b/src/main/java/net/minecraft/server/Item.java deleted file mode 100644 index 4382f1abe6..0000000000 --- a/src/main/java/net/minecraft/server/Item.java +++ /dev/null @@ -1,503 +0,0 @@ -package net.minecraft.server; - -import java.util.HashSet; -import java.util.Iterator; -import java.util.Random; -import java.util.UUID; - -import net.minecraft.util.com.google.common.collect.HashMultimap; -import net.minecraft.util.com.google.common.collect.Multimap; -import net.minecraft.util.com.google.common.collect.Sets; - -public class Item { - - public static final RegistryMaterials REGISTRY = new RegistryMaterials(); - protected static final UUID f = UUID.fromString("CB3F55D3-645C-4F38-A497-9C13A33DB5CF"); - private CreativeModeTab a; - protected static Random g = new Random(); - protected int maxStackSize = 64; - private int durability; - protected boolean i; - protected boolean j; - private Item craftingResult; - private String d; - private String name; - protected String l; - - public Item() {} - - public static int getId(Item item) { - return item == null ? 0 : REGISTRY.b(item); - } - - public static Item getById(int i) { - return (Item) REGISTRY.a(i); - } - - public static Item getItemOf(Block block) { - return getById(Block.getId(block)); - } - - public static void l() { - REGISTRY.a(256, "iron_shovel", (new ItemSpade(EnumToolMaterial.IRON)).c("shovelIron").f("iron_shovel")); - REGISTRY.a(257, "iron_pickaxe", (new ItemPickaxe(EnumToolMaterial.IRON)).c("pickaxeIron").f("iron_pickaxe")); - REGISTRY.a(258, "iron_axe", (new ItemAxe(EnumToolMaterial.IRON)).c("hatchetIron").f("iron_axe")); - REGISTRY.a(259, "flint_and_steel", (new ItemFlintAndSteel()).c("flintAndSteel").f("flint_and_steel")); - REGISTRY.a(260, "apple", (new ItemFood(4, 0.3F, false)).c("apple").f("apple")); - REGISTRY.a(261, "bow", (new ItemBow()).c("bow").f("bow")); - REGISTRY.a(262, "arrow", (new Item()).c("arrow").a(CreativeModeTab.j).f("arrow")); - REGISTRY.a(263, "coal", (new ItemCoal()).c("coal").f("coal")); - REGISTRY.a(264, "diamond", (new Item()).c("diamond").a(CreativeModeTab.l).f("diamond")); - REGISTRY.a(265, "iron_ingot", (new Item()).c("ingotIron").a(CreativeModeTab.l).f("iron_ingot")); - REGISTRY.a(266, "gold_ingot", (new Item()).c("ingotGold").a(CreativeModeTab.l).f("gold_ingot")); - REGISTRY.a(267, "iron_sword", (new ItemSword(EnumToolMaterial.IRON)).c("swordIron").f("iron_sword")); - REGISTRY.a(268, "wooden_sword", (new ItemSword(EnumToolMaterial.WOOD)).c("swordWood").f("wood_sword")); - REGISTRY.a(269, "wooden_shovel", (new ItemSpade(EnumToolMaterial.WOOD)).c("shovelWood").f("wood_shovel")); - REGISTRY.a(270, "wooden_pickaxe", (new ItemPickaxe(EnumToolMaterial.WOOD)).c("pickaxeWood").f("wood_pickaxe")); - REGISTRY.a(271, "wooden_axe", (new ItemAxe(EnumToolMaterial.WOOD)).c("hatchetWood").f("wood_axe")); - REGISTRY.a(272, "stone_sword", (new ItemSword(EnumToolMaterial.STONE)).c("swordStone").f("stone_sword")); - REGISTRY.a(273, "stone_shovel", (new ItemSpade(EnumToolMaterial.STONE)).c("shovelStone").f("stone_shovel")); - REGISTRY.a(274, "stone_pickaxe", (new ItemPickaxe(EnumToolMaterial.STONE)).c("pickaxeStone").f("stone_pickaxe")); - REGISTRY.a(275, "stone_axe", (new ItemAxe(EnumToolMaterial.STONE)).c("hatchetStone").f("stone_axe")); - REGISTRY.a(276, "diamond_sword", (new ItemSword(EnumToolMaterial.DIAMOND)).c("swordDiamond").f("diamond_sword")); - REGISTRY.a(277, "diamond_shovel", (new ItemSpade(EnumToolMaterial.DIAMOND)).c("shovelDiamond").f("diamond_shovel")); - REGISTRY.a(278, "diamond_pickaxe", (new ItemPickaxe(EnumToolMaterial.DIAMOND)).c("pickaxeDiamond").f("diamond_pickaxe")); - REGISTRY.a(279, "diamond_axe", (new ItemAxe(EnumToolMaterial.DIAMOND)).c("hatchetDiamond").f("diamond_axe")); - REGISTRY.a(280, "stick", (new Item()).q().c("stick").a(CreativeModeTab.l).f("stick")); - REGISTRY.a(281, "bowl", (new Item()).c("bowl").a(CreativeModeTab.l).f("bowl")); - REGISTRY.a(282, "mushroom_stew", (new ItemSoup(6)).c("mushroomStew").f("mushroom_stew")); - REGISTRY.a(283, "golden_sword", (new ItemSword(EnumToolMaterial.GOLD)).c("swordGold").f("gold_sword")); - REGISTRY.a(284, "golden_shovel", (new ItemSpade(EnumToolMaterial.GOLD)).c("shovelGold").f("gold_shovel")); - REGISTRY.a(285, "golden_pickaxe", (new ItemPickaxe(EnumToolMaterial.GOLD)).c("pickaxeGold").f("gold_pickaxe")); - REGISTRY.a(286, "golden_axe", (new ItemAxe(EnumToolMaterial.GOLD)).c("hatchetGold").f("gold_axe")); - REGISTRY.a(287, "string", (new ItemReed(Blocks.TRIPWIRE)).c("string").a(CreativeModeTab.l).f("string")); - REGISTRY.a(288, "feather", (new Item()).c("feather").a(CreativeModeTab.l).f("feather")); - REGISTRY.a(289, "gunpowder", (new Item()).c("sulphur").e(PotionBrewer.k).a(CreativeModeTab.l).f("gunpowder")); - REGISTRY.a(290, "wooden_hoe", (new ItemHoe(EnumToolMaterial.WOOD)).c("hoeWood").f("wood_hoe")); - REGISTRY.a(291, "stone_hoe", (new ItemHoe(EnumToolMaterial.STONE)).c("hoeStone").f("stone_hoe")); - REGISTRY.a(292, "iron_hoe", (new ItemHoe(EnumToolMaterial.IRON)).c("hoeIron").f("iron_hoe")); - REGISTRY.a(293, "diamond_hoe", (new ItemHoe(EnumToolMaterial.DIAMOND)).c("hoeDiamond").f("diamond_hoe")); - REGISTRY.a(294, "golden_hoe", (new ItemHoe(EnumToolMaterial.GOLD)).c("hoeGold").f("gold_hoe")); - REGISTRY.a(295, "wheat_seeds", (new ItemSeeds(Blocks.CROPS, Blocks.SOIL)).c("seeds").f("seeds_wheat")); - REGISTRY.a(296, "wheat", (new Item()).c("wheat").a(CreativeModeTab.l).f("wheat")); - REGISTRY.a(297, "bread", (new ItemFood(5, 0.6F, false)).c("bread").f("bread")); - REGISTRY.a(298, "leather_helmet", (new ItemArmor(EnumArmorMaterial.CLOTH, 0, 0)).c("helmetCloth").f("leather_helmet")); - REGISTRY.a(299, "leather_chestplate", (new ItemArmor(EnumArmorMaterial.CLOTH, 0, 1)).c("chestplateCloth").f("leather_chestplate")); - REGISTRY.a(300, "leather_leggings", (new ItemArmor(EnumArmorMaterial.CLOTH, 0, 2)).c("leggingsCloth").f("leather_leggings")); - REGISTRY.a(301, "leather_boots", (new ItemArmor(EnumArmorMaterial.CLOTH, 0, 3)).c("bootsCloth").f("leather_boots")); - REGISTRY.a(302, "chainmail_helmet", (new ItemArmor(EnumArmorMaterial.CHAIN, 1, 0)).c("helmetChain").f("chainmail_helmet")); - REGISTRY.a(303, "chainmail_chestplate", (new ItemArmor(EnumArmorMaterial.CHAIN, 1, 1)).c("chestplateChain").f("chainmail_chestplate")); - REGISTRY.a(304, "chainmail_leggings", (new ItemArmor(EnumArmorMaterial.CHAIN, 1, 2)).c("leggingsChain").f("chainmail_leggings")); - REGISTRY.a(305, "chainmail_boots", (new ItemArmor(EnumArmorMaterial.CHAIN, 1, 3)).c("bootsChain").f("chainmail_boots")); - REGISTRY.a(306, "iron_helmet", (new ItemArmor(EnumArmorMaterial.IRON, 2, 0)).c("helmetIron").f("iron_helmet")); - REGISTRY.a(307, "iron_chestplate", (new ItemArmor(EnumArmorMaterial.IRON, 2, 1)).c("chestplateIron").f("iron_chestplate")); - REGISTRY.a(308, "iron_leggings", (new ItemArmor(EnumArmorMaterial.IRON, 2, 2)).c("leggingsIron").f("iron_leggings")); - REGISTRY.a(309, "iron_boots", (new ItemArmor(EnumArmorMaterial.IRON, 2, 3)).c("bootsIron").f("iron_boots")); - REGISTRY.a(310, "diamond_helmet", (new ItemArmor(EnumArmorMaterial.DIAMOND, 3, 0)).c("helmetDiamond").f("diamond_helmet")); - REGISTRY.a(311, "diamond_chestplate", (new ItemArmor(EnumArmorMaterial.DIAMOND, 3, 1)).c("chestplateDiamond").f("diamond_chestplate")); - REGISTRY.a(312, "diamond_leggings", (new ItemArmor(EnumArmorMaterial.DIAMOND, 3, 2)).c("leggingsDiamond").f("diamond_leggings")); - REGISTRY.a(313, "diamond_boots", (new ItemArmor(EnumArmorMaterial.DIAMOND, 3, 3)).c("bootsDiamond").f("diamond_boots")); - REGISTRY.a(314, "golden_helmet", (new ItemArmor(EnumArmorMaterial.GOLD, 4, 0)).c("helmetGold").f("gold_helmet")); - REGISTRY.a(315, "golden_chestplate", (new ItemArmor(EnumArmorMaterial.GOLD, 4, 1)).c("chestplateGold").f("gold_chestplate")); - REGISTRY.a(316, "golden_leggings", (new ItemArmor(EnumArmorMaterial.GOLD, 4, 2)).c("leggingsGold").f("gold_leggings")); - REGISTRY.a(317, "golden_boots", (new ItemArmor(EnumArmorMaterial.GOLD, 4, 3)).c("bootsGold").f("gold_boots")); - REGISTRY.a(318, "flint", (new Item()).c("flint").a(CreativeModeTab.l).f("flint")); - REGISTRY.a(319, "porkchop", (new ItemFood(3, 0.3F, true)).c("porkchopRaw").f("porkchop_raw")); - REGISTRY.a(320, "cooked_porkchop", (new ItemFood(8, 0.8F, true)).c("porkchopCooked").f("porkchop_cooked")); - REGISTRY.a(321, "painting", (new ItemHanging(EntityPainting.class)).c("painting").f("painting")); - REGISTRY.a(322, "golden_apple", (new ItemGoldenApple(4, 1.2F, false)).j().a(MobEffectList.REGENERATION.id, 5, 1, 1.0F).c("appleGold").f("apple_golden")); - REGISTRY.a(323, "sign", (new ItemSign()).c("sign").f("sign")); - REGISTRY.a(324, "wooden_door", (new ItemDoor(Material.WOOD)).c("doorWood").f("door_wood")); - Item item = (new ItemBucket(Blocks.AIR)).c("bucket").e(16).f("bucket_empty"); - - REGISTRY.a(325, "bucket", item); - REGISTRY.a(326, "water_bucket", (new ItemBucket(Blocks.WATER)).c("bucketWater").c(item).f("bucket_water")); - REGISTRY.a(327, "lava_bucket", (new ItemBucket(Blocks.LAVA)).c("bucketLava").c(item).f("bucket_lava")); - REGISTRY.a(328, "minecart", (new ItemMinecart(0)).c("minecart").f("minecart_normal")); - REGISTRY.a(329, "saddle", (new ItemSaddle()).c("saddle").f("saddle")); - REGISTRY.a(330, "iron_door", (new ItemDoor(Material.ORE)).c("doorIron").f("door_iron")); - REGISTRY.a(331, "redstone", (new ItemRedstone()).c("redstone").e(PotionBrewer.i).f("redstone_dust")); - REGISTRY.a(332, "snowball", (new ItemSnowball()).c("snowball").f("snowball")); - REGISTRY.a(333, "boat", (new ItemBoat()).c("boat").f("boat")); - REGISTRY.a(334, "leather", (new Item()).c("leather").a(CreativeModeTab.l).f("leather")); - REGISTRY.a(335, "milk_bucket", (new ItemMilkBucket()).c("milk").c(item).f("bucket_milk")); - REGISTRY.a(336, "brick", (new Item()).c("brick").a(CreativeModeTab.l).f("brick")); - REGISTRY.a(337, "clay_ball", (new Item()).c("clay").a(CreativeModeTab.l).f("clay_ball")); - REGISTRY.a(338, "reeds", (new ItemReed(Blocks.SUGAR_CANE_BLOCK)).c("reeds").a(CreativeModeTab.l).f("reeds")); - REGISTRY.a(339, "paper", (new Item()).c("paper").a(CreativeModeTab.f).f("paper")); - REGISTRY.a(340, "book", (new ItemBook()).c("book").a(CreativeModeTab.f).f("book_normal")); - REGISTRY.a(341, "slime_ball", (new Item()).c("slimeball").a(CreativeModeTab.f).f("slimeball")); - REGISTRY.a(342, "chest_minecart", (new ItemMinecart(1)).c("minecartChest").f("minecart_chest")); - REGISTRY.a(343, "furnace_minecart", (new ItemMinecart(2)).c("minecartFurnace").f("minecart_furnace")); - REGISTRY.a(344, "egg", (new ItemEgg()).c("egg").f("egg")); - REGISTRY.a(345, "compass", (new Item()).c("compass").a(CreativeModeTab.i).f("compass")); - REGISTRY.a(346, "fishing_rod", (new ItemFishingRod()).c("fishingRod").f("fishing_rod")); - REGISTRY.a(347, "clock", (new Item()).c("clock").a(CreativeModeTab.i).f("clock")); - REGISTRY.a(348, "glowstone_dust", (new Item()).c("yellowDust").e(PotionBrewer.j).a(CreativeModeTab.l).f("glowstone_dust")); - REGISTRY.a(349, "fish", (new ItemFish(false)).c("fish").f("fish_raw").a(true)); - REGISTRY.a(350, "cooked_fished", (new ItemFish(true)).c("fish").f("fish_cooked").a(true)); - REGISTRY.a(351, "dye", (new ItemDye()).c("dyePowder").f("dye_powder")); - REGISTRY.a(352, "bone", (new Item()).c("bone").q().a(CreativeModeTab.f).f("bone")); - REGISTRY.a(353, "sugar", (new Item()).c("sugar").e(PotionBrewer.b).a(CreativeModeTab.l).f("sugar")); - REGISTRY.a(354, "cake", (new ItemReed(Blocks.CAKE_BLOCK)).e(1).c("cake").a(CreativeModeTab.h).f("cake")); - REGISTRY.a(355, "bed", (new ItemBed()).e(1).c("bed").f("bed")); - REGISTRY.a(356, "repeater", (new ItemReed(Blocks.DIODE_OFF)).c("diode").a(CreativeModeTab.d).f("repeater")); - REGISTRY.a(357, "cookie", (new ItemFood(2, 0.1F, false)).c("cookie").f("cookie")); - REGISTRY.a(358, "filled_map", (new ItemWorldMap()).c("map").f("map_filled")); - REGISTRY.a(359, "shears", (new ItemShears()).c("shears").f("shears")); - REGISTRY.a(360, "melon", (new ItemFood(2, 0.3F, false)).c("melon").f("melon")); - REGISTRY.a(361, "pumpkin_seeds", (new ItemSeeds(Blocks.PUMPKIN_STEM, Blocks.SOIL)).c("seeds_pumpkin").f("seeds_pumpkin")); - REGISTRY.a(362, "melon_seeds", (new ItemSeeds(Blocks.MELON_STEM, Blocks.SOIL)).c("seeds_melon").f("seeds_melon")); - REGISTRY.a(363, "beef", (new ItemFood(3, 0.3F, true)).c("beefRaw").f("beef_raw")); - REGISTRY.a(364, "cooked_beef", (new ItemFood(8, 0.8F, true)).c("beefCooked").f("beef_cooked")); - REGISTRY.a(365, "chicken", (new ItemFood(2, 0.3F, true)).a(MobEffectList.HUNGER.id, 30, 0, 0.3F).c("chickenRaw").f("chicken_raw")); - REGISTRY.a(366, "cooked_chicken", (new ItemFood(6, 0.6F, true)).c("chickenCooked").f("chicken_cooked")); - REGISTRY.a(367, "rotten_flesh", (new ItemFood(4, 0.1F, true)).a(MobEffectList.HUNGER.id, 30, 0, 0.8F).c("rottenFlesh").f("rotten_flesh")); - REGISTRY.a(368, "ender_pearl", (new ItemEnderPearl()).c("enderPearl").f("ender_pearl")); - REGISTRY.a(369, "blaze_rod", (new Item()).c("blazeRod").a(CreativeModeTab.l).f("blaze_rod")); - REGISTRY.a(370, "ghast_tear", (new Item()).c("ghastTear").e(PotionBrewer.c).a(CreativeModeTab.k).f("ghast_tear")); - REGISTRY.a(371, "gold_nugget", (new Item()).c("goldNugget").a(CreativeModeTab.l).f("gold_nugget")); - REGISTRY.a(372, "nether_wart", (new ItemSeeds(Blocks.NETHER_WART, Blocks.SOUL_SAND)).c("netherStalkSeeds").e("+4").f("nether_wart")); - REGISTRY.a(373, "potion", (new ItemPotion()).c("potion").f("potion")); - REGISTRY.a(374, "glass_bottle", (new ItemGlassBottle()).c("glassBottle").f("potion_bottle_empty")); - REGISTRY.a(375, "spider_eye", (new ItemFood(2, 0.8F, false)).a(MobEffectList.POISON.id, 5, 0, 1.0F).c("spiderEye").e(PotionBrewer.d).f("spider_eye")); - REGISTRY.a(376, "fermented_spider_eye", (new Item()).c("fermentedSpiderEye").e(PotionBrewer.e).a(CreativeModeTab.k).f("spider_eye_fermented")); - REGISTRY.a(377, "blaze_powder", (new Item()).c("blazePowder").e(PotionBrewer.g).a(CreativeModeTab.k).f("blaze_powder")); - REGISTRY.a(378, "magma_cream", (new Item()).c("magmaCream").e(PotionBrewer.h).a(CreativeModeTab.k).f("magma_cream")); - REGISTRY.a(379, "brewing_stand", (new ItemReed(Blocks.BREWING_STAND)).c("brewingStand").a(CreativeModeTab.k).f("brewing_stand")); - REGISTRY.a(380, "cauldron", (new ItemReed(Blocks.CAULDRON)).c("cauldron").a(CreativeModeTab.k).f("cauldron")); - REGISTRY.a(381, "ender_eye", (new ItemEnderEye()).c("eyeOfEnder").f("ender_eye")); - REGISTRY.a(382, "speckled_melon", (new Item()).c("speckledMelon").e(PotionBrewer.f).a(CreativeModeTab.k).f("melon_speckled")); - REGISTRY.a(383, "spawn_egg", (new ItemMonsterEgg()).c("monsterPlacer").f("spawn_egg")); - REGISTRY.a(384, "experience_bottle", (new ItemExpBottle()).c("expBottle").f("experience_bottle")); - REGISTRY.a(385, "fire_charge", (new ItemFireball()).c("fireball").f("fireball")); - REGISTRY.a(386, "writable_book", (new ItemBookAndQuill()).c("writingBook").a(CreativeModeTab.f).f("book_writable")); - REGISTRY.a(387, "written_book", (new ItemWrittenBook()).c("writtenBook").f("book_written").e(16)); - REGISTRY.a(388, "emerald", (new Item()).c("emerald").a(CreativeModeTab.l).f("emerald")); - REGISTRY.a(389, "item_frame", (new ItemHanging(EntityItemFrame.class)).c("frame").f("item_frame")); - REGISTRY.a(390, "flower_pot", (new ItemReed(Blocks.FLOWER_POT)).c("flowerPot").a(CreativeModeTab.c).f("flower_pot")); - REGISTRY.a(391, "carrot", (new ItemSeedFood(4, 0.6F, Blocks.CARROTS, Blocks.SOIL)).c("carrots").f("carrot")); - REGISTRY.a(392, "potato", (new ItemSeedFood(1, 0.3F, Blocks.POTATOES, Blocks.SOIL)).c("potato").f("potato")); - REGISTRY.a(393, "baked_potato", (new ItemFood(6, 0.6F, false)).c("potatoBaked").f("potato_baked")); - REGISTRY.a(394, "poisonous_potato", (new ItemFood(2, 0.3F, false)).a(MobEffectList.POISON.id, 5, 0, 0.6F).c("potatoPoisonous").f("potato_poisonous")); - REGISTRY.a(395, "map", (new ItemMapEmpty()).c("emptyMap").f("map_empty")); - REGISTRY.a(396, "golden_carrot", (new ItemFood(6, 1.2F, false)).c("carrotGolden").e(PotionBrewer.l).f("carrot_golden")); - REGISTRY.a(397, "skull", (new ItemSkull()).c("skull").f("skull")); - REGISTRY.a(398, "carrot_on_a_stick", (new ItemCarrotStick()).c("carrotOnAStick").f("carrot_on_a_stick")); - REGISTRY.a(399, "nether_star", (new ItemNetherStar()).c("netherStar").a(CreativeModeTab.l).f("nether_star")); - REGISTRY.a(400, "pumpkin_pie", (new ItemFood(8, 0.3F, false)).c("pumpkinPie").a(CreativeModeTab.h).f("pumpkin_pie")); - REGISTRY.a(401, "fireworks", (new ItemFireworks()).c("fireworks").f("fireworks")); - REGISTRY.a(402, "firework_charge", (new ItemFireworksCharge()).c("fireworksCharge").a(CreativeModeTab.f).f("fireworks_charge")); - REGISTRY.a(403, "enchanted_book", (new ItemEnchantedBook()).e(1).c("enchantedBook").f("book_enchanted")); - REGISTRY.a(404, "comparator", (new ItemReed(Blocks.REDSTONE_COMPARATOR_OFF)).c("comparator").a(CreativeModeTab.d).f("comparator")); - REGISTRY.a(405, "netherbrick", (new Item()).c("netherbrick").a(CreativeModeTab.l).f("netherbrick")); - REGISTRY.a(406, "quartz", (new Item()).c("netherquartz").a(CreativeModeTab.l).f("quartz")); - REGISTRY.a(407, "tnt_minecart", (new ItemMinecart(3)).c("minecartTnt").f("minecart_tnt")); - REGISTRY.a(408, "hopper_minecart", (new ItemMinecart(5)).c("minecartHopper").f("minecart_hopper")); - REGISTRY.a(417, "iron_horse_armor", (new Item()).c("horsearmormetal").e(1).a(CreativeModeTab.f).f("iron_horse_armor")); - REGISTRY.a(418, "golden_horse_armor", (new Item()).c("horsearmorgold").e(1).a(CreativeModeTab.f).f("gold_horse_armor")); - REGISTRY.a(419, "diamond_horse_armor", (new Item()).c("horsearmordiamond").e(1).a(CreativeModeTab.f).f("diamond_horse_armor")); - REGISTRY.a(420, "lead", (new ItemLeash()).c("leash").f("lead")); - REGISTRY.a(421, "name_tag", (new ItemNameTag()).c("nameTag").f("name_tag")); - REGISTRY.a(422, "command_block_minecart", (new ItemMinecart(6)).c("minecartCommandBlock").f("minecart_command_block").a((CreativeModeTab) null)); - REGISTRY.a(2256, "record_13", (new ItemRecord("13")).c("record").f("record_13")); - REGISTRY.a(2257, "record_cat", (new ItemRecord("cat")).c("record").f("record_cat")); - REGISTRY.a(2258, "record_blocks", (new ItemRecord("blocks")).c("record").f("record_blocks")); - REGISTRY.a(2259, "record_chirp", (new ItemRecord("chirp")).c("record").f("record_chirp")); - REGISTRY.a(2260, "record_far", (new ItemRecord("far")).c("record").f("record_far")); - REGISTRY.a(2261, "record_mall", (new ItemRecord("mall")).c("record").f("record_mall")); - REGISTRY.a(2262, "record_mellohi", (new ItemRecord("mellohi")).c("record").f("record_mellohi")); - REGISTRY.a(2263, "record_stal", (new ItemRecord("stal")).c("record").f("record_stal")); - REGISTRY.a(2264, "record_strad", (new ItemRecord("strad")).c("record").f("record_strad")); - REGISTRY.a(2265, "record_ward", (new ItemRecord("ward")).c("record").f("record_ward")); - REGISTRY.a(2266, "record_11", (new ItemRecord("11")).c("record").f("record_11")); - REGISTRY.a(2267, "record_wait", (new ItemRecord("wait")).c("record").f("record_wait")); - HashSet hashset = Sets.newHashSet(new Block[] { Blocks.AIR, Blocks.BREWING_STAND, Blocks.BED, Blocks.NETHER_WART, Blocks.CAULDRON, Blocks.FLOWER_POT, Blocks.CROPS, Blocks.SUGAR_CANE_BLOCK, Blocks.CAKE_BLOCK, Blocks.SKULL, Blocks.PISTON_EXTENSION, Blocks.PISTON_MOVING, Blocks.GLOWING_REDSTONE_ORE, Blocks.DIODE_ON, Blocks.PUMPKIN_STEM, Blocks.SIGN_POST, Blocks.REDSTONE_COMPARATOR_ON, Blocks.TRIPWIRE, Blocks.REDSTONE_LAMP_ON, Blocks.MELON_STEM, Blocks.REDSTONE_TORCH_OFF, Blocks.REDSTONE_COMPARATOR_OFF, Blocks.REDSTONE_WIRE, Blocks.WALL_SIGN, Blocks.DIODE_OFF, Blocks.IRON_DOOR_BLOCK, Blocks.WOODEN_DOOR}); - Iterator iterator = Block.REGISTRY.keySet().iterator(); - - while (iterator.hasNext()) { - String s = (String) iterator.next(); - Block block = (Block) Block.REGISTRY.get(s); - Object object; - - if (block == Blocks.WOOL) { - object = (new ItemCloth(Blocks.WOOL)).b("cloth"); - } else if (block == Blocks.STAINED_HARDENED_CLAY) { - object = (new ItemCloth(Blocks.STAINED_HARDENED_CLAY)).b("clayHardenedStained"); - } else if (block == Blocks.STAINED_GLASS) { - object = (new ItemCloth(Blocks.STAINED_GLASS)).b("stainedGlass"); - } else if (block == Blocks.STAINED_GLASS_PANE) { - object = (new ItemCloth(Blocks.STAINED_GLASS_PANE)).b("stainedGlassPane"); - } else if (block == Blocks.WOOL_CARPET) { - object = (new ItemCloth(Blocks.WOOL_CARPET)).b("woolCarpet"); - } else if (block == Blocks.DIRT) { - object = (new ItemMultiTexture(Blocks.DIRT, Blocks.DIRT, BlockDirt.a)).b("dirt"); - } else if (block == Blocks.SAND) { - object = (new ItemMultiTexture(Blocks.SAND, Blocks.SAND, BlockSand.a)).b("sand"); - } else if (block == Blocks.LOG) { - object = (new ItemMultiTexture(Blocks.LOG, Blocks.LOG, BlockLog1.M)).b("log"); - } else if (block == Blocks.LOG2) { - object = (new ItemMultiTexture(Blocks.LOG2, Blocks.LOG2, BlockLog2.M)).b("log"); - } else if (block == Blocks.WOOD) { - object = (new ItemMultiTexture(Blocks.WOOD, Blocks.WOOD, BlockWood.a)).b("wood"); - } else if (block == Blocks.MONSTER_EGGS) { - object = (new ItemMultiTexture(Blocks.MONSTER_EGGS, Blocks.MONSTER_EGGS, BlockMonsterEggs.a)).b("monsterStoneEgg"); - } else if (block == Blocks.SMOOTH_BRICK) { - object = (new ItemMultiTexture(Blocks.SMOOTH_BRICK, Blocks.SMOOTH_BRICK, BlockSmoothBrick.a)).b("stonebricksmooth"); - } else if (block == Blocks.SANDSTONE) { - object = (new ItemMultiTexture(Blocks.SANDSTONE, Blocks.SANDSTONE, BlockSandStone.a)).b("sandStone"); - } else if (block == Blocks.QUARTZ_BLOCK) { - object = (new ItemMultiTexture(Blocks.QUARTZ_BLOCK, Blocks.QUARTZ_BLOCK, BlockQuartz.a)).b("quartzBlock"); - } else if (block == Blocks.STEP) { - object = (new ItemStep(Blocks.STEP, Blocks.STEP, Blocks.DOUBLE_STEP, false)).b("stoneSlab"); - } else if (block == Blocks.DOUBLE_STEP) { - object = (new ItemStep(Blocks.DOUBLE_STEP, Blocks.STEP, Blocks.DOUBLE_STEP, true)).b("stoneSlab"); - } else if (block == Blocks.WOOD_STEP) { - object = (new ItemStep(Blocks.WOOD_STEP, Blocks.WOOD_STEP, Blocks.WOOD_DOUBLE_STEP, false)).b("woodSlab"); - } else if (block == Blocks.WOOD_DOUBLE_STEP) { - object = (new ItemStep(Blocks.WOOD_DOUBLE_STEP, Blocks.WOOD_STEP, Blocks.WOOD_DOUBLE_STEP, true)).b("woodSlab"); - } else if (block == Blocks.SAPLING) { - object = (new ItemMultiTexture(Blocks.SAPLING, Blocks.SAPLING, BlockSapling.a)).b("sapling"); - } else if (block == Blocks.LEAVES) { - object = (new ItemLeaves(Blocks.LEAVES)).b("leaves"); - } else if (block == Blocks.LEAVES2) { - object = (new ItemLeaves(Blocks.LEAVES2)).b("leaves"); - } else if (block == Blocks.VINE) { - object = new ItemWithAuxData(Blocks.VINE, false); - } else if (block == Blocks.LONG_GRASS) { - object = (new ItemWithAuxData(Blocks.LONG_GRASS, true)).a(new String[] { "shrub", "grass", "fern"}); - } else if (block == Blocks.YELLOW_FLOWER) { - object = (new ItemMultiTexture(Blocks.YELLOW_FLOWER, Blocks.YELLOW_FLOWER, BlockFlowers.b)).b("flower"); - } else if (block == Blocks.RED_ROSE) { - object = (new ItemMultiTexture(Blocks.RED_ROSE, Blocks.RED_ROSE, BlockFlowers.a)).b("rose"); - } else if (block == Blocks.SNOW) { - object = new ItemSnow(Blocks.SNOW, Blocks.SNOW); - } else if (block == Blocks.WATER_LILY) { - object = new ItemWaterLily(Blocks.WATER_LILY); - } else if (block == Blocks.PISTON) { - object = new ItemPiston(Blocks.PISTON); - } else if (block == Blocks.PISTON_STICKY) { - object = new ItemPiston(Blocks.PISTON_STICKY); - } else if (block == Blocks.COBBLE_WALL) { - object = (new ItemMultiTexture(Blocks.COBBLE_WALL, Blocks.COBBLE_WALL, BlockCobbleWall.a)).b("cobbleWall"); - } else if (block == Blocks.ANVIL) { - object = (new ItemAnvil(Blocks.ANVIL)).b("anvil"); - } else if (block == Blocks.DOUBLE_PLANT) { - object = (new ItemTallPlant(Blocks.DOUBLE_PLANT, Blocks.DOUBLE_PLANT, BlockTallPlant.a)).b("doublePlant"); - // CraftBukkit start - allow certain blocks to retain data - } else if (block == Blocks.MOB_SPAWNER || block == Blocks.BIG_MUSHROOM_1 || block == Blocks.BIG_MUSHROOM_2) { - object = new ItemWithAuxData(block, true); - // CraftBukkit end - } else { - if (hashset.contains(block)) { - continue; - } - - object = new ItemBlock(block); - } - - REGISTRY.a(Block.getId(block), s, object); - } - } - - public Item e(int i) { - this.maxStackSize = i; - return this; - } - - public boolean interactWith(ItemStack itemstack, EntityHuman entityhuman, World world, int i, int j, int k, int l, float f, float f1, float f2) { - return false; - } - - public float getDestroySpeed(ItemStack itemstack, Block block) { - return 1.0F; - } - - public ItemStack a(ItemStack itemstack, World world, EntityHuman entityhuman) { - return itemstack; - } - - public ItemStack b(ItemStack itemstack, World world, EntityHuman entityhuman) { - return itemstack; - } - - public int getMaxStackSize() { - return this.maxStackSize; - } - - public int filterData(int i) { - return 0; - } - - public boolean n() { - return this.j; - } - - protected Item a(boolean flag) { - this.j = flag; - return this; - } - - public int getMaxDurability() { - return this.durability; - } - - protected Item setMaxDurability(int i) { - this.durability = i; - return this; - } - - public boolean usesDurability() { - return this.durability > 0 && !this.j; - } - - public boolean a(ItemStack itemstack, EntityLiving entityliving, EntityLiving entityliving1) { - return false; - } - - public boolean a(ItemStack itemstack, World world, Block block, int i, int j, int k, EntityLiving entityliving) { - return false; - } - - public boolean canDestroySpecialBlock(Block block) { - return false; - } - - public boolean a(ItemStack itemstack, EntityHuman entityhuman, EntityLiving entityliving) { - return false; - } - - public Item q() { - this.i = true; - return this; - } - - public Item c(String s) { - this.name = s; - return this; - } - - public String k(ItemStack itemstack) { - String s = this.a(itemstack); - - return s == null ? "" : LocaleI18n.get(s); - } - - public String getName() { - return "item." + this.name; - } - - public String a(ItemStack itemstack) { - return "item." + this.name; - } - - public Item c(Item item) { - this.craftingResult = item; - return this; - } - - public boolean l(ItemStack itemstack) { - return true; - } - - public boolean s() { - return true; - } - - public Item t() { - return this.craftingResult; - } - - public boolean u() { - return this.craftingResult != null; - } - - public void a(ItemStack itemstack, World world, Entity entity, int i, boolean flag) {} - - public void d(ItemStack itemstack, World world, EntityHuman entityhuman) {} - - public boolean h() { - return false; - } - - public EnumAnimation d(ItemStack itemstack) { - return EnumAnimation.NONE; - } - - public int d_(ItemStack itemstack) { - return 0; - } - - public void a(ItemStack itemstack, World world, EntityHuman entityhuman, int i) {} - - protected Item e(String s) { - this.d = s; - return this; - } - - public String i(ItemStack itemstack) { - return this.d; - } - - public boolean m(ItemStack itemstack) { - return this.i(itemstack) != null; - } - - public String n(ItemStack itemstack) { - return ("" + LocaleI18n.get(this.k(itemstack) + ".name")).trim(); - } - - public EnumItemRarity f(ItemStack itemstack) { - return itemstack.hasEnchantments() ? EnumItemRarity.RARE : EnumItemRarity.COMMON; - } - - public boolean e_(ItemStack itemstack) { - return this.getMaxStackSize() == 1 && this.usesDurability(); - } - - protected MovingObjectPosition a(World world, EntityHuman entityhuman, boolean flag) { - float f = 1.0F; - float f1 = entityhuman.lastPitch + (entityhuman.pitch - entityhuman.lastPitch) * f; - float f2 = entityhuman.lastYaw + (entityhuman.yaw - entityhuman.lastYaw) * f; - double d0 = entityhuman.lastX + (entityhuman.locX - entityhuman.lastX) * (double) f; - double d1 = entityhuman.lastY + (entityhuman.locY - entityhuman.lastY) * (double) f + 1.62D - (double) entityhuman.height; - double d2 = entityhuman.lastZ + (entityhuman.locZ - entityhuman.lastZ) * (double) f; - Vec3D vec3d = Vec3D.a(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); - - return world.rayTrace(vec3d, vec3d1, flag, !flag, false); - } - - public int c() { - return 0; - } - - public Item a(CreativeModeTab creativemodetab) { - this.a = creativemodetab; - return this; - } - - public boolean v() { - return true; - } - - public boolean a(ItemStack itemstack, ItemStack itemstack1) { - return false; - } - - public Multimap k() { - return HashMultimap.create(); - } - - protected Item f(String s) { - this.l = s; - return this; - } -} diff --git a/src/main/java/net/minecraft/server/ItemBoat.java b/src/main/java/net/minecraft/server/ItemBoat.java deleted file mode 100644 index e044b03dca..0000000000 --- a/src/main/java/net/minecraft/server/ItemBoat.java +++ /dev/null @@ -1,93 +0,0 @@ -package net.minecraft.server; - -import java.util.List; - -public class ItemBoat extends Item { - - public ItemBoat() { - this.maxStackSize = 1; - this.a(CreativeModeTab.e); - } - - public ItemStack a(ItemStack itemstack, World world, EntityHuman entityhuman) { - float f = 1.0F; - float f1 = entityhuman.lastPitch + (entityhuman.pitch - entityhuman.lastPitch) * f; - float f2 = entityhuman.lastYaw + (entityhuman.yaw - entityhuman.lastYaw) * f; - double d0 = entityhuman.lastX + (entityhuman.locX - entityhuman.lastX) * (double) f; - double d1 = entityhuman.lastY + (entityhuman.locY - entityhuman.lastY) * (double) f + 1.62D - (double) entityhuman.height; - double d2 = entityhuman.lastZ + (entityhuman.locZ - entityhuman.lastZ) * (double) f; - Vec3D vec3d = Vec3D.a(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 = world.rayTrace(vec3d, vec3d1, true); - - if (movingobjectposition == null) { - return itemstack; - } else { - Vec3D vec3d2 = entityhuman.j(f); - boolean flag = false; - float f9 = 1.0F; - List list = world.getEntities(entityhuman, entityhuman.boundingBox.a(vec3d2.a * d3, vec3d2.b * d3, vec3d2.c * d3).grow((double) f9, (double) f9, (double) f9)); - - int i; - - for (i = 0; i < list.size(); ++i) { - Entity entity = (Entity) list.get(i); - - if (entity.R()) { - float f10 = entity.af(); - AxisAlignedBB axisalignedbb = entity.boundingBox.grow((double) f10, (double) f10, (double) f10); - - if (axisalignedbb.a(vec3d)) { - flag = true; - } - } - } - - if (flag) { - return itemstack; - } else { - if (movingobjectposition.type == EnumMovingObjectType.BLOCK) { - i = movingobjectposition.b; - int j = movingobjectposition.c; - int k = movingobjectposition.d; - - // CraftBukkit start - Boat placement - org.bukkit.event.player.PlayerInteractEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callPlayerInteractEvent(entityhuman, org.bukkit.event.block.Action.RIGHT_CLICK_BLOCK, i, j, k, movingobjectposition.face, itemstack); - - if (event.isCancelled()) { - return itemstack; - } - // CraftBukkit end - - if (world.getType(i, j, k) == Blocks.SNOW) { - --j; - } - - 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; - } - - if (!world.isStatic) { - world.addEntity(entityboat); - } - - if (!entityhuman.abilities.canInstantlyBuild) { - --itemstack.count; - } - } - - return itemstack; - } - } - } -} diff --git a/src/main/java/net/minecraft/server/ItemBow.java b/src/main/java/net/minecraft/server/ItemBow.java deleted file mode 100644 index a1bf31af48..0000000000 --- a/src/main/java/net/minecraft/server/ItemBow.java +++ /dev/null @@ -1,109 +0,0 @@ -package net.minecraft.server; - -import org.bukkit.event.entity.EntityCombustEvent; // CraftBukkit - -public class ItemBow extends Item { - - public static final String[] a = new String[] { "pulling_0", "pulling_1", "pulling_2"}; - - public ItemBow() { - this.maxStackSize = 1; - this.setMaxDurability(384); - this.a(CreativeModeTab.j); - } - - public void a(ItemStack itemstack, World world, EntityHuman entityhuman, int i) { - boolean flag = entityhuman.abilities.canInstantlyBuild || EnchantmentManager.getEnchantmentLevel(Enchantment.ARROW_INFINITE.id, itemstack) > 0; - - if (flag || entityhuman.inventory.b(Items.ARROW)) { - int j = this.d_(itemstack) - i; - float f = (float) j / 20.0F; - - f = (f * f + f * 2.0F) / 3.0F; - if ((double) f < 0.1D) { - return; - } - - if (f > 1.0F) { - f = 1.0F; - } - - EntityArrow entityarrow = new EntityArrow(world, entityhuman, f * 2.0F); - - if (f == 1.0F) { - entityarrow.setCritical(true); - } - - int k = EnchantmentManager.getEnchantmentLevel(Enchantment.ARROW_DAMAGE.id, itemstack); - - if (k > 0) { - entityarrow.b(entityarrow.e() + (double) k * 0.5D + 0.5D); - } - - int l = EnchantmentManager.getEnchantmentLevel(Enchantment.ARROW_KNOCKBACK.id, itemstack); - - if (l > 0) { - entityarrow.setKnockbackStrength(l); - } - - if (EnchantmentManager.getEnchantmentLevel(Enchantment.ARROW_FIRE.id, itemstack) > 0) { - // CraftBukkit start - call EntityCombustEvent - EntityCombustEvent event = new EntityCombustEvent(entityarrow.getBukkitEntity(), 100); - entityarrow.world.getServer().getPluginManager().callEvent(event); - - if (!event.isCancelled()) { - entityarrow.setOnFire(event.getDuration()); - } - // CraftBukkit end - } - - // CraftBukkit start - org.bukkit.event.entity.EntityShootBowEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callEntityShootBowEvent(entityhuman, itemstack, entityarrow, f); - if (event.isCancelled()) { - event.getProjectile().remove(); - return; - } - - if (event.getProjectile() == entityarrow.getBukkitEntity()) { - world.addEntity(entityarrow); - } - // CraftBukkit end - - itemstack.damage(1, entityhuman); - world.makeSound(entityhuman, "random.bow", 1.0F, 1.0F / (g.nextFloat() * 0.4F + 1.2F) + f * 0.5F); - if (flag) { - entityarrow.fromPlayer = 2; - } else { - entityhuman.inventory.a(Items.ARROW); - } - - if (!world.isStatic) { - // world.addEntity(entityarrow); // CraftBukkit - moved up - } - } - } - - public ItemStack b(ItemStack itemstack, World world, EntityHuman entityhuman) { - return itemstack; - } - - public int d_(ItemStack itemstack) { - return 72000; - } - - public EnumAnimation d(ItemStack itemstack) { - return EnumAnimation.BOW; - } - - public ItemStack a(ItemStack itemstack, World world, EntityHuman entityhuman) { - if (entityhuman.abilities.canInstantlyBuild || entityhuman.inventory.b(Items.ARROW)) { - entityhuman.a(itemstack, this.d_(itemstack)); - } - - return itemstack; - } - - public int c() { - return 1; - } -} diff --git a/src/main/java/net/minecraft/server/ItemBucket.java b/src/main/java/net/minecraft/server/ItemBucket.java deleted file mode 100644 index a58d4e73c1..0000000000 --- a/src/main/java/net/minecraft/server/ItemBucket.java +++ /dev/null @@ -1,171 +0,0 @@ -package net.minecraft.server; - -// CraftBukkit start -import org.bukkit.craftbukkit.event.CraftEventFactory; -import org.bukkit.craftbukkit.inventory.CraftItemStack; -import org.bukkit.event.player.PlayerBucketEmptyEvent; -import org.bukkit.event.player.PlayerBucketFillEvent; -// CraftBukkit end - -public class ItemBucket extends Item { - - private Block a; - - public ItemBucket(Block block) { - this.maxStackSize = 1; - this.a = block; - this.a(CreativeModeTab.f); - } - - public ItemStack a(ItemStack itemstack, World world, EntityHuman entityhuman) { - boolean flag = this.a == Blocks.AIR; - MovingObjectPosition movingobjectposition = this.a(world, entityhuman, flag); - - if (movingobjectposition == null) { - return itemstack; - } else { - if (movingobjectposition.type == EnumMovingObjectType.BLOCK) { - int i = movingobjectposition.b; - int j = movingobjectposition.c; - int k = movingobjectposition.d; - - if (!world.a(entityhuman, i, j, k)) { - return itemstack; - } - - if (flag) { - if (!entityhuman.a(i, j, k, movingobjectposition.face, itemstack)) { - return itemstack; - } - - Material material = world.getType(i, j, k).getMaterial(); - int l = world.getData(i, j, k); - - if (material == Material.WATER && l == 0) { - // CraftBukkit start - PlayerBucketFillEvent event = CraftEventFactory.callPlayerBucketFillEvent(entityhuman, i, j, k, -1, itemstack, Items.WATER_BUCKET); - - if (event.isCancelled()) { - return itemstack; - } - // CraftBukkit end - world.setAir(i, j, k); - return this.a(itemstack, entityhuman, Items.WATER_BUCKET, event.getItemStack()); // CraftBukkit - added Event stack - } - - if (material == Material.LAVA && l == 0) { - // CraftBukkit start - PlayerBucketFillEvent event = CraftEventFactory.callPlayerBucketFillEvent(entityhuman, i, j, k, -1, itemstack, Items.LAVA_BUCKET); - - if (event.isCancelled()) { - return itemstack; - } - // CraftBukkit end - world.setAir(i, j, k); - return this.a(itemstack, entityhuman, Items.LAVA_BUCKET, event.getItemStack()); // CraftBukkit - added Event stack - } - } else { - if (this.a == Blocks.AIR) { - // CraftBukkit start - PlayerBucketEmptyEvent event = CraftEventFactory.callPlayerBucketEmptyEvent(entityhuman, i, j, k, movingobjectposition.face, itemstack); - - if (event.isCancelled()) { - return itemstack; - } - - return CraftItemStack.asNMSCopy(event.getItemStack()); - } - - int clickedX = i, clickedY = j, clickedZ = k; - // CraftBukkit end - - if (movingobjectposition.face == 0) { - --j; - } - - if (movingobjectposition.face == 1) { - ++j; - } - - if (movingobjectposition.face == 2) { - --k; - } - - if (movingobjectposition.face == 3) { - ++k; - } - - if (movingobjectposition.face == 4) { - --i; - } - - if (movingobjectposition.face == 5) { - ++i; - } - - if (!entityhuman.a(i, j, k, movingobjectposition.face, itemstack)) { - return itemstack; - } - - // CraftBukkit start - PlayerBucketEmptyEvent event = CraftEventFactory.callPlayerBucketEmptyEvent(entityhuman, clickedX, clickedY, clickedZ, movingobjectposition.face, itemstack); - - if (event.isCancelled()) { - return itemstack; - } - // CraftBukkit end - - if (this.a(world, i, j, k) && !entityhuman.abilities.canInstantlyBuild) { - return CraftItemStack.asNMSCopy(event.getItemStack()); // CraftBukkit - } - } - } - - return itemstack; - } - } - - // CraftBukkit - added ob.ItemStack result - TODO: Is this... the right way to handle this? - private ItemStack a(ItemStack itemstack, EntityHuman entityhuman, Item item, org.bukkit.inventory.ItemStack result) { - if (entityhuman.abilities.canInstantlyBuild) { - return itemstack; - } else if (--itemstack.count <= 0) { - return CraftItemStack.asNMSCopy(result); // CraftBukkit - } else { - if (!entityhuman.inventory.pickup(CraftItemStack.asNMSCopy(result))) { // CraftBukkit - entityhuman.drop(CraftItemStack.asNMSCopy(result), false); // CraftBukkit - } - - return itemstack; - } - } - - public boolean a(World world, int i, int j, int k) { - if (this.a == Blocks.AIR) { - return false; - } else { - Material material = world.getType(i, j, k).getMaterial(); - boolean flag = !material.isBuildable(); - - if (!world.isEmpty(i, j, k) && !flag) { - return false; - } else { - if (world.worldProvider.f && this.a == Blocks.WATER) { - world.makeSound((double) ((float) i + 0.5F), (double) ((float) j + 0.5F), (double) ((float) k + 0.5F), "random.fizz", 0.5F, 2.6F + (world.random.nextFloat() - world.random.nextFloat()) * 0.8F); - - for (int l = 0; l < 8; ++l) { - world.addParticle("largesmoke", (double) i + Math.random(), (double) j + Math.random(), (double) k + Math.random(), 0.0D, 0.0D, 0.0D); - } - } else { - if (!world.isStatic && flag && !material.isLiquid()) { - world.setAir(i, j, k, true); - } - - world.setTypeAndData(i, j, k, this.a, 0, 3); - } - - return true; - } - } - } -} diff --git a/src/main/java/net/minecraft/server/ItemDye.java b/src/main/java/net/minecraft/server/ItemDye.java deleted file mode 100644 index 156af8e370..0000000000 --- a/src/main/java/net/minecraft/server/ItemDye.java +++ /dev/null @@ -1,129 +0,0 @@ -package net.minecraft.server; - -import org.bukkit.event.entity.SheepDyeWoolEvent; // CraftBukkit - -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 String[] b = new String[] { "black", "red", "green", "brown", "blue", "purple", "cyan", "silver", "gray", "pink", "lime", "yellow", "light_blue", "magenta", "orange", "white"}; - public static final int[] c = new int[] { 1973019, 11743532, 3887386, 5320730, 2437522, 8073150, 2651799, 11250603, 4408131, 14188952, 4312372, 14602026, 6719955, 12801229, 15435844, 15790320}; - - public ItemDye() { - this.a(true); - this.setMaxDurability(0); - this.a(CreativeModeTab.l); - } - - public String a(ItemStack itemstack) { - int i = MathHelper.a(itemstack.getData(), 0, 15); - - return super.getName() + "." + a[i]; - } - - public boolean interactWith(ItemStack itemstack, EntityHuman entityhuman, World world, int i, int j, int k, int l, float f, float f1, float f2) { - if (!entityhuman.a(i, j, k, l, itemstack)) { - return false; - } else { - if (itemstack.getData() == 15) { - if (a(itemstack, world, i, j, k)) { - if (!world.isStatic) { - world.triggerEffect(2005, i, j, k, 0); - } - - return true; - } - } else if (itemstack.getData() == 3) { - Block block = world.getType(i, j, k); - int i1 = world.getData(i, j, k); - - if (block == Blocks.LOG && BlockLogAbstract.c(i1) == 3) { - if (l == 0) { - return false; - } - - if (l == 1) { - return false; - } - - if (l == 2) { - --k; - } - - if (l == 3) { - ++k; - } - - if (l == 4) { - --i; - } - - if (l == 5) { - ++i; - } - - if (world.isEmpty(i, j, k)) { - int j1 = Blocks.COCOA.getPlacedData(world, i, j, k, l, f, f1, f2, 0); - - world.setTypeAndData(i, j, k, Blocks.COCOA, j1, 2); - if (!entityhuman.abilities.canInstantlyBuild) { - --itemstack.count; - } - } - - return true; - } - } - - return false; - } - } - - public static boolean a(ItemStack itemstack, World world, int i, int j, int k) { - Block block = world.getType(i, j, k); - - if (block instanceof IBlockFragilePlantElement) { - IBlockFragilePlantElement iblockfragileplantelement = (IBlockFragilePlantElement) block; - - if (iblockfragileplantelement.a(world, i, j, k, world.isStatic)) { - if (!world.isStatic) { - if (iblockfragileplantelement.a(world, world.random, i, j, k)) { - iblockfragileplantelement.b(world, world.random, i, j, k); - } - - --itemstack.count; - } - - return true; - } - } - - return false; - } - - public boolean a(ItemStack itemstack, EntityHuman entityhuman, EntityLiving entityliving) { - if (entityliving instanceof EntitySheep) { - EntitySheep entitysheep = (EntitySheep) entityliving; - int i = BlockCloth.b(itemstack.getData()); - - if (!entitysheep.isSheared() && entitysheep.getColor() != i) { - // CraftBukkit start - byte bColor = (byte) i; - SheepDyeWoolEvent event = new SheepDyeWoolEvent((org.bukkit.entity.Sheep) entitysheep.getBukkitEntity(), org.bukkit.DyeColor.getByData(bColor)); - entitysheep.world.getServer().getPluginManager().callEvent(event); - - if (event.isCancelled()) { - return false; - } - - i = (byte) event.getColor().getWoolData(); - // CraftBukkit end - entitysheep.setColor(i); - --itemstack.count; - } - - return true; - } else { - return false; - } - } -} diff --git a/src/main/java/net/minecraft/server/ItemFireball.java b/src/main/java/net/minecraft/server/ItemFireball.java deleted file mode 100644 index 0a3bf13145..0000000000 --- a/src/main/java/net/minecraft/server/ItemFireball.java +++ /dev/null @@ -1,67 +0,0 @@ -package net.minecraft.server; - -// CraftBukkit start -import org.bukkit.craftbukkit.block.CraftBlockState; -import org.bukkit.craftbukkit.event.CraftEventFactory; -// CraftBukkit end - -public class ItemFireball extends Item { - - public ItemFireball() { - this.a(CreativeModeTab.f); - } - - public boolean interactWith(ItemStack itemstack, EntityHuman entityhuman, World world, int i, int j, int k, int l, float f, float f1, float f2) { - if (world.isStatic) { - return true; - } else { - if (l == 0) { - --j; - } - - if (l == 1) { - ++j; - } - - if (l == 2) { - --k; - } - - if (l == 3) { - ++k; - } - - if (l == 4) { - --i; - } - - if (l == 5) { - ++i; - } - - if (!entityhuman.a(i, j, k, l, itemstack)) { - return false; - } else { - if (world.getType(i, j, k).getMaterial() == Material.AIR) { - // CraftBukkit start - fire BlockIgniteEvent - if (org.bukkit.craftbukkit.event.CraftEventFactory.callBlockIgniteEvent(world, i, j, k, org.bukkit.event.block.BlockIgniteEvent.IgniteCause.FIREBALL, entityhuman).isCancelled()) { - if (!entityhuman.abilities.canInstantlyBuild) { - --itemstack.count; - } - return false; - } - // CraftBukkit end - - world.makeSound((double) i + 0.5D, (double) j + 0.5D, (double) k + 0.5D, "fire.ignite", 1.0F, g.nextFloat() * 0.4F + 0.8F); - world.setTypeUpdate(i, j, k, Blocks.FIRE); - } - - if (!entityhuman.abilities.canInstantlyBuild) { - --itemstack.count; - } - - return true; - } - } - } -} diff --git a/src/main/java/net/minecraft/server/ItemFishingRod.java b/src/main/java/net/minecraft/server/ItemFishingRod.java deleted file mode 100644 index 2f34151b2b..0000000000 --- a/src/main/java/net/minecraft/server/ItemFishingRod.java +++ /dev/null @@ -1,47 +0,0 @@ -package net.minecraft.server; - -import org.bukkit.event.player.PlayerFishEvent; // CraftBukkit - -public class ItemFishingRod extends Item { - - public ItemFishingRod() { - this.setMaxDurability(64); - this.e(1); - this.a(CreativeModeTab.i); - } - - public ItemStack a(ItemStack itemstack, World world, EntityHuman entityhuman) { - if (entityhuman.hookedFish != null) { - int i = entityhuman.hookedFish.e(); - - itemstack.damage(i, entityhuman); - entityhuman.ba(); - } else { - // CraftBukkit start - EntityFishingHook hook = new EntityFishingHook(world, entityhuman); - PlayerFishEvent playerFishEvent = new PlayerFishEvent((org.bukkit.entity.Player) entityhuman.getBukkitEntity(), null, (org.bukkit.entity.Fish) hook.getBukkitEntity(), PlayerFishEvent.State.FISHING); - world.getServer().getPluginManager().callEvent(playerFishEvent); - - if (playerFishEvent.isCancelled()) { - return itemstack; - } - // CraftBukkit end - world.makeSound(entityhuman, "random.bow", 0.5F, 0.4F / (g.nextFloat() * 0.4F + 0.8F)); - if (!world.isStatic) { - world.addEntity(hook); // CraftBukkit - moved creation up - } - - entityhuman.ba(); - } - - return itemstack; - } - - public boolean e_(ItemStack itemstack) { - return super.e_(itemstack); - } - - public int c() { - return 1; - } -} diff --git a/src/main/java/net/minecraft/server/ItemFlintAndSteel.java b/src/main/java/net/minecraft/server/ItemFlintAndSteel.java deleted file mode 100644 index ec2edea587..0000000000 --- a/src/main/java/net/minecraft/server/ItemFlintAndSteel.java +++ /dev/null @@ -1,72 +0,0 @@ -package net.minecraft.server; - -// CraftBukkit start -import org.bukkit.craftbukkit.block.CraftBlockState; -import org.bukkit.craftbukkit.event.CraftEventFactory; -// CraftBukkit end - -public class ItemFlintAndSteel extends Item { - - public ItemFlintAndSteel() { - this.maxStackSize = 1; - this.setMaxDurability(64); - this.a(CreativeModeTab.i); - } - - public boolean interactWith(ItemStack itemstack, EntityHuman entityhuman, World world, int i, int j, int k, int l, float f, float f1, float f2) { - int clickedX = i, clickedY = j, clickedZ = k; // CraftBukkit - if (l == 0) { - --j; - } - - if (l == 1) { - ++j; - } - - if (l == 2) { - --k; - } - - if (l == 3) { - ++k; - } - - if (l == 4) { - --i; - } - - if (l == 5) { - ++i; - } - - if (!entityhuman.a(i, j, k, l, itemstack)) { - return false; - } else { - if (world.getType(i, j, k).getMaterial() == Material.AIR) { - // CraftBukkit start - Store the clicked block - if (CraftEventFactory.callBlockIgniteEvent(world, i, j, k, org.bukkit.event.block.BlockIgniteEvent.IgniteCause.FLINT_AND_STEEL, entityhuman).isCancelled()) { - itemstack.damage(1, entityhuman); - return false; - } - - CraftBlockState blockState = CraftBlockState.getBlockState(world, i, j, k); - // CraftBukkit end - - world.makeSound((double) i + 0.5D, (double) j + 0.5D, (double) k + 0.5D, "fire.ignite", 1.0F, g.nextFloat() * 0.4F + 0.8F); - world.setTypeUpdate(i, j, k, Blocks.FIRE); - - // CraftBukkit start - org.bukkit.event.block.BlockPlaceEvent placeEvent = CraftEventFactory.callBlockPlaceEvent(world, entityhuman, blockState, clickedX, clickedY, clickedZ); - - if (placeEvent.isCancelled() || !placeEvent.canBuild()) { - placeEvent.getBlockPlaced().setTypeIdAndData(0, (byte) 0, false); - return false; - } - // CraftBukkit end - } - - itemstack.damage(1, entityhuman); - return true; - } - } -} diff --git a/src/main/java/net/minecraft/server/ItemHanging.java b/src/main/java/net/minecraft/server/ItemHanging.java deleted file mode 100644 index d88d36ac0e..0000000000 --- a/src/main/java/net/minecraft/server/ItemHanging.java +++ /dev/null @@ -1,67 +0,0 @@ -package net.minecraft.server; - -// CraftBukkit start -import org.bukkit.entity.Player; -import org.bukkit.event.hanging.HangingPlaceEvent; -import org.bukkit.event.painting.PaintingPlaceEvent; -// CraftBukkit end - -public class ItemHanging extends Item { - - private final Class a; - - public ItemHanging(Class oclass) { - this.a = oclass; - this.a(CreativeModeTab.c); - } - - public boolean interactWith(ItemStack itemstack, EntityHuman entityhuman, World world, int i, int j, int k, int l, float f, float f1, float f2) { - if (l == 0) { - return false; - } else if (l == 1) { - return false; - } else { - int i1 = Direction.e[l]; - EntityHanging entityhanging = this.a(world, i, j, k, i1); - - if (!entityhuman.a(i, j, k, l, itemstack)) { - return false; - } else { - if (entityhanging != null && entityhanging.survives()) { - if (!world.isStatic) { - // CraftBukkit start - fire HangingPlaceEvent - Player who = (entityhuman == null) ? null : (Player) entityhuman.getBukkitEntity(); - org.bukkit.block.Block blockClicked = world.getWorld().getBlockAt(i, j, k); - org.bukkit.block.BlockFace blockFace = org.bukkit.craftbukkit.block.CraftBlock.notchToBlockFace(l); - - HangingPlaceEvent event = new HangingPlaceEvent((org.bukkit.entity.Hanging) entityhanging.getBukkitEntity(), who, blockClicked, blockFace); - world.getServer().getPluginManager().callEvent(event); - - PaintingPlaceEvent paintingEvent = null; - if (entityhanging instanceof EntityPainting) { - // Fire old painting event until it can be removed - paintingEvent = new PaintingPlaceEvent((org.bukkit.entity.Painting) entityhanging.getBukkitEntity(), who, blockClicked, blockFace); - paintingEvent.setCancelled(event.isCancelled()); - world.getServer().getPluginManager().callEvent(paintingEvent); - } - - if (event.isCancelled() || (paintingEvent != null && paintingEvent.isCancelled())) { - return false; - } - // CraftBukkit end - - world.addEntity(entityhanging); - } - - --itemstack.count; - } - - return true; - } - } - } - - private EntityHanging a(World world, int i, int j, int k, int l) { - return (EntityHanging) (this.a == EntityPainting.class ? new EntityPainting(world, i, j, k, l) : (this.a == EntityItemFrame.class ? new EntityItemFrame(world, i, j, k, l) : null)); - } -} diff --git a/src/main/java/net/minecraft/server/ItemLeash.java b/src/main/java/net/minecraft/server/ItemLeash.java deleted file mode 100644 index 8655b9f1f6..0000000000 --- a/src/main/java/net/minecraft/server/ItemLeash.java +++ /dev/null @@ -1,70 +0,0 @@ -package net.minecraft.server; - -import java.util.Iterator; -import java.util.List; - -import org.bukkit.event.hanging.HangingPlaceEvent; // CraftBukkit - -public class ItemLeash extends Item { - - public ItemLeash() { - this.a(CreativeModeTab.i); - } - - public boolean interactWith(ItemStack itemstack, EntityHuman entityhuman, World world, int i, int j, int k, int l, float f, float f1, float f2) { - Block block = world.getType(i, j, k); - - if (block.b() == 11) { - if (world.isStatic) { - return true; - } else { - a(entityhuman, world, i, j, k); - return true; - } - } else { - return false; - } - } - - public static boolean a(EntityHuman entityhuman, World world, int i, int j, int k) { - EntityLeash entityleash = EntityLeash.b(world, i, j, k); - boolean flag = false; - double d0 = 7.0D; - List list = world.a(EntityInsentient.class, AxisAlignedBB.a((double) i - d0, (double) j - d0, (double) k - d0, (double) i + d0, (double) j + d0, (double) k + d0)); - - if (list != null) { - Iterator iterator = list.iterator(); - - while (iterator.hasNext()) { - EntityInsentient entityinsentient = (EntityInsentient) iterator.next(); - - if (entityinsentient.bN() && entityinsentient.getLeashHolder() == entityhuman) { - if (entityleash == null) { - entityleash = EntityLeash.a(world, i, j, k); - - // CraftBukkit start - fire HangingPlaceEvent - HangingPlaceEvent event = new HangingPlaceEvent((org.bukkit.entity.Hanging) entityleash.getBukkitEntity(), entityhuman != null ? (org.bukkit.entity.Player) entityhuman.getBukkitEntity() : null, world.getWorld().getBlockAt(i, j, k), org.bukkit.block.BlockFace.SELF); - world.getServer().getPluginManager().callEvent(event); - - if (event.isCancelled()) { - entityleash.die(); - return false; - } - // CraftBukkit end - } - - // CraftBukkit start - if (org.bukkit.craftbukkit.event.CraftEventFactory.callPlayerLeashEntityEvent(entityinsentient, entityleash, entityhuman).isCancelled()) { - continue; - } - // CraftBukkit end - - entityinsentient.setLeashHolder(entityleash, true); - flag = true; - } - } - } - - return flag; - } -} diff --git a/src/main/java/net/minecraft/server/ItemMapEmpty.java b/src/main/java/net/minecraft/server/ItemMapEmpty.java deleted file mode 100644 index 8998a3fe72..0000000000 --- a/src/main/java/net/minecraft/server/ItemMapEmpty.java +++ /dev/null @@ -1,37 +0,0 @@ -package net.minecraft.server; - -public class ItemMapEmpty extends ItemWorldMapBase { - - protected ItemMapEmpty() { - this.a(CreativeModeTab.f); - } - - public ItemStack a(ItemStack itemstack, World world, EntityHuman entityhuman) { - World worldMain = world.getServer().getServer().worlds.get(0); // CraftBukkit - store reference to primary world - ItemStack itemstack1 = new ItemStack(Items.MAP, 1, worldMain.b("map")); // CraftBukkit - use primary world for maps - String s = "map_" + itemstack1.getData(); - WorldMap worldmap = new WorldMap(s); - - worldMain.a(s, (PersistentBase) worldmap); // CraftBukkit - use primary world for maps - worldmap.scale = 0; - int i = 128 * (1 << worldmap.scale); - - worldmap.centerX = (int) (Math.round(entityhuman.locX / (double) i) * (long) i); - worldmap.centerZ = (int) (Math.round(entityhuman.locZ / (double) i) * (long) i); - worldmap.map = (byte) ((WorldServer) world).dimension; // CraftBukkit - use bukkit dimension - worldmap.c(); - - org.bukkit.craftbukkit.event.CraftEventFactory.callEvent(new org.bukkit.event.server.MapInitializeEvent(worldmap.mapView)); // CraftBukkit - - --itemstack.count; - if (itemstack.count <= 0) { - return itemstack1; - } else { - if (!entityhuman.inventory.pickup(itemstack1.cloneItemStack())) { - entityhuman.drop(itemstack1, false); - } - - return itemstack; - } - } -} diff --git a/src/main/java/net/minecraft/server/ItemMinecart.java b/src/main/java/net/minecraft/server/ItemMinecart.java deleted file mode 100644 index 02a1fd8e2b..0000000000 --- a/src/main/java/net/minecraft/server/ItemMinecart.java +++ /dev/null @@ -1,40 +0,0 @@ -package net.minecraft.server; - -public class ItemMinecart extends Item { - - private static final IDispenseBehavior b = new DispenseBehaviorMinecart(); - public int a; - - public ItemMinecart(int i) { - this.maxStackSize = 1; - this.a = i; - this.a(CreativeModeTab.e); - BlockDispenser.a.a(this, b); - } - - public boolean interactWith(ItemStack itemstack, EntityHuman entityhuman, World world, int i, int j, int k, int l, float f, float f1, float f2) { - if (BlockMinecartTrackAbstract.a(world.getType(i, j, k))) { - 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); - - if (event.isCancelled()) { - return false; - } - // CraftBukkit end - EntityMinecartAbstract entityminecartabstract = EntityMinecartAbstract.a(world, (double) ((float) i + 0.5F), (double) ((float) j + 0.5F), (double) ((float) k + 0.5F), this.a); - - if (itemstack.hasName()) { - entityminecartabstract.a(itemstack.getName()); - } - - world.addEntity(entityminecartabstract); - } - - --itemstack.count; - return true; - } else { - return false; - } - } -} diff --git a/src/main/java/net/minecraft/server/ItemMonsterEgg.java b/src/main/java/net/minecraft/server/ItemMonsterEgg.java deleted file mode 100644 index 639ddf56f0..0000000000 --- a/src/main/java/net/minecraft/server/ItemMonsterEgg.java +++ /dev/null @@ -1,124 +0,0 @@ -package net.minecraft.server; - -public class ItemMonsterEgg extends Item { - - public ItemMonsterEgg() { - this.a(true); - this.a(CreativeModeTab.f); - } - - public String n(ItemStack itemstack) { - String s = ("" + LocaleI18n.get(this.getName() + ".name")).trim(); - String s1 = EntityTypes.b(itemstack.getData()); - - if (s1 != null) { - s = s + " " + LocaleI18n.get("entity." + s1 + ".name"); - } - - return s; - } - - public boolean interactWith(ItemStack itemstack, EntityHuman entityhuman, World world, int i, int j, int k, int l, float f, float f1, float f2) { - // CraftBukkit - check ItemStack data - if (world.isStatic || itemstack.getData() == 48 || itemstack.getData() == 49 || itemstack.getData() == 63 || itemstack.getData() == 64) { - return true; - } else { - Block block = world.getType(i, j, k); - - i += Facing.b[l]; - j += Facing.c[l]; - k += Facing.d[l]; - double d0 = 0.0D; - - if (l == 1 && block.b() == 11) { - d0 = 0.5D; - } - - Entity entity = a(world, itemstack.getData(), (double) i + 0.5D, (double) j + d0, (double) k + 0.5D); - - if (entity != null) { - if (entity instanceof EntityLiving && itemstack.hasName()) { - ((EntityInsentient) entity).setCustomName(itemstack.getName()); - } - - if (!entityhuman.abilities.canInstantlyBuild) { - --itemstack.count; - } - } - - return true; - } - } - - public ItemStack a(ItemStack itemstack, World world, EntityHuman entityhuman) { - if (world.isStatic) { - return itemstack; - } else { - MovingObjectPosition movingobjectposition = this.a(world, entityhuman, true); - - if (movingobjectposition == null) { - return itemstack; - } else { - if (movingobjectposition.type == EnumMovingObjectType.BLOCK) { - int i = movingobjectposition.b; - int j = movingobjectposition.c; - int k = movingobjectposition.d; - - if (!world.a(entityhuman, i, j, k)) { - return itemstack; - } - - if (!entityhuman.a(i, j, k, movingobjectposition.face, itemstack)) { - return itemstack; - } - - if (world.getType(i, j, k) instanceof BlockFluids) { - Entity entity = a(world, itemstack.getData(), (double) i, (double) j, (double) k); - - if (entity != null) { - if (entity instanceof EntityLiving && itemstack.hasName()) { - ((EntityInsentient) entity).setCustomName(itemstack.getName()); - } - - if (!entityhuman.abilities.canInstantlyBuild) { - --itemstack.count; - } - } - } - } - - return itemstack; - } - } - } - - public static Entity a(World world, int i, double d0, double d1, double d2) { - // CraftBukkit start - delegate to spawnCreature - return spawnCreature(world, i, d0, d1, d2, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.SPAWNER_EGG); - } - - public static Entity spawnCreature(World world, int i, double d0, double d1, double d2, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason spawnReason) { - // CraftBukkit end - if (!EntityTypes.eggInfo.containsKey(Integer.valueOf(i))) { - return null; - } else { - Entity entity = null; - - for (int j = 0; j < 1; ++j) { - entity = EntityTypes.a(i, world); - if (entity != null && entity instanceof EntityLiving) { - EntityInsentient entityinsentient = (EntityInsentient) entity; - - entity.setPositionRotation(d0, d1, d2, MathHelper.g(world.random.nextFloat() * 360.0F), 0.0F); - entityinsentient.aO = entityinsentient.yaw; - entityinsentient.aM = entityinsentient.yaw; - entityinsentient.prepare((GroupDataEntity) null); - world.addEntity(entity, spawnReason); // CraftBukkit - entityinsentient.r(); - } - } - - return entity; - } - } -} diff --git a/src/main/java/net/minecraft/server/ItemStack.java b/src/main/java/net/minecraft/server/ItemStack.java deleted file mode 100644 index c9d74d3701..0000000000 --- a/src/main/java/net/minecraft/server/ItemStack.java +++ /dev/null @@ -1,593 +0,0 @@ -package net.minecraft.server; - -import java.text.DecimalFormat; -import java.util.Random; - -import net.minecraft.util.com.google.common.collect.HashMultimap; -import net.minecraft.util.com.google.common.collect.Multimap; - -// CraftBukkit start -import java.util.List; - -import org.bukkit.Location; -import org.bukkit.TreeType; -import org.bukkit.block.BlockState; -import org.bukkit.craftbukkit.block.CraftBlockState; -import org.bukkit.craftbukkit.util.CraftMagicNumbers; -import org.bukkit.entity.Player; -import org.bukkit.event.world.StructureGrowEvent; -// CraftBukkit end - -public final class ItemStack { - - public static final DecimalFormat a = new DecimalFormat("#.###"); - public int count; - public int c; - private Item item; - public NBTTagCompound tag; - private int damage; - private EntityItemFrame g; - - public ItemStack(Block block) { - this(block, 1); - } - - public ItemStack(Block block, int i) { - this(block, i, 0); - } - - public ItemStack(Block block, int i, int j) { - this(Item.getItemOf(block), i, j); - } - - public ItemStack(Item item) { - this(item, 1); - } - - public ItemStack(Item item, int i) { - this(item, i, 0); - } - - public ItemStack(Item item, int i, int j) { - this.item = item; - this.count = i; - // CraftBukkit start - Pass to setData to do filtering - this.setData(j); - //this.damage = j; - //if (this.damage < 0) { - // this.damage = 0; - //} - // CraftBukkit end - } - - public static ItemStack createStack(NBTTagCompound nbttagcompound) { - ItemStack itemstack = new ItemStack(); - - itemstack.c(nbttagcompound); - return itemstack.getItem() != null ? itemstack : null; - } - - private ItemStack() {} - - public ItemStack a(int i) { - ItemStack itemstack = new ItemStack(this.item, i, this.damage); - - if (this.tag != null) { - itemstack.tag = (NBTTagCompound) this.tag.clone(); - } - - this.count -= i; - return itemstack; - } - - public Item getItem() { - return this.item; - } - - public boolean placeItem(EntityHuman entityhuman, World world, int i, int j, int k, int l, float f, float f1, float f2) { - // CraftBukkit start - handle all block place event logic here - int data = this.getData(); - int count = this.count; - - if (!(this.getItem() instanceof ItemBucket)) { // if not bucket - world.captureBlockStates = true; - // special case bonemeal - if (this.getItem() instanceof ItemDye && this.getData() == 15) { - Block block = world.getType(i, j, k); - if (block == Blocks.SAPLING || block instanceof BlockMushroom) { - world.captureTreeGeneration = true; - } - } - } - boolean flag = this.getItem().interactWith(this, entityhuman, world, i, j, k, l, f, f1, f2); - int newData = this.getData(); - int newCount = this.count; - this.count = count; - this.setData(data); - world.captureBlockStates = false; - if (flag && world.captureTreeGeneration && world.capturedBlockStates.size() > 0) { - world.captureTreeGeneration = false; - Location location = new Location(world.getWorld(), i, j, k); - TreeType treeType = BlockSapling.treeType; - BlockSapling.treeType = null; - List blocks = (List) world.capturedBlockStates.clone(); - world.capturedBlockStates.clear(); - StructureGrowEvent event = null; - if (treeType != null) { - event = new StructureGrowEvent(location, treeType, false, (Player) entityhuman.getBukkitEntity(), blocks); - org.bukkit.Bukkit.getPluginManager().callEvent(event); - } - if (event == null || !event.isCancelled()) { - // Change the stack to its new contents if it hasn't been tampered with. - if (this.count == count && this.getData() == data) { - this.setData(newData); - this.count = newCount; - } - for (BlockState blockstate : blocks) { - blockstate.update(true); - } - } - - return flag; - } - world.captureTreeGeneration = false; - - if (flag) { - org.bukkit.event.block.BlockPlaceEvent placeEvent = null; - List blocks = (List) world.capturedBlockStates.clone(); - world.capturedBlockStates.clear(); - if (blocks.size() > 1) { - placeEvent = org.bukkit.craftbukkit.event.CraftEventFactory.callBlockMultiPlaceEvent(world, entityhuman, blocks, i, j, k); - } else if (blocks.size() == 1) { - placeEvent = org.bukkit.craftbukkit.event.CraftEventFactory.callBlockPlaceEvent(world, entityhuman, blocks.get(0), i, j, k); - } - - if (placeEvent != null && (placeEvent.isCancelled() || !placeEvent.canBuild())) { - flag = false; // cancel placement - // revert back all captured blocks - for (BlockState blockstate : blocks) { - blockstate.update(true, false); - } - } else { - // Change the stack to its new contents if it hasn't been tampered with. - if (this.count == count && this.getData() == data) { - this.setData(newData); - this.count = newCount; - } - for (BlockState blockstate : blocks) { - int x = blockstate.getX(); - int y = blockstate.getY(); - int z = blockstate.getZ(); - int updateFlag = ((CraftBlockState) blockstate).getFlag(); - org.bukkit.Material mat = blockstate.getType(); - Block oldBlock = CraftMagicNumbers.getBlock(mat); - Block block = world.getType(x, y, z); - - if (block != null && !(block instanceof BlockContainer)) { // Containers get placed automatically - block.onPlace(world, x, y, z); - } - - world.notifyAndUpdatePhysics(x, y, z, null, oldBlock, block, updateFlag); // send null chunk as chunk.k() returns false by this point - } - entityhuman.a(StatisticList.USE_ITEM_COUNT[Item.getId(this.item)], 1); - } - } - world.capturedBlockStates.clear(); - // CraftBukkit end - - return flag; - } - - public float a(Block block) { - return this.getItem().getDestroySpeed(this, block); - } - - public ItemStack a(World world, EntityHuman entityhuman) { - return this.getItem().a(this, world, entityhuman); - } - - public ItemStack b(World world, EntityHuman entityhuman) { - return this.getItem().b(this, world, entityhuman); - } - - public NBTTagCompound save(NBTTagCompound nbttagcompound) { - nbttagcompound.setShort("id", (short) Item.getId(this.item)); - nbttagcompound.setByte("Count", (byte) this.count); - nbttagcompound.setShort("Damage", (short) this.damage); - if (this.tag != null) { - nbttagcompound.set("tag", this.tag.clone()); // CraftBukkit - make defensive copy, data is going to another thread - } - - return nbttagcompound; - } - - public void c(NBTTagCompound nbttagcompound) { - this.item = Item.getById(nbttagcompound.getShort("id")); - this.count = nbttagcompound.getByte("Count"); - /* CraftBukkit start - Route through setData for filtering - this.damage = nbttagcompound.getShort("Damage"); - if (this.damage < 0) { - this.damage = 0; - } - */ - this.setData(nbttagcompound.getShort("Damage")); - // CraftBukkit end - - if (nbttagcompound.hasKeyOfType("tag", 10)) { - // CraftBukkit - make defensive copy as this data may be coming from the save thread - this.tag = (NBTTagCompound) nbttagcompound.getCompound("tag").clone(); - } - } - - public int getMaxStackSize() { - return this.getItem().getMaxStackSize(); - } - - public boolean isStackable() { - return this.getMaxStackSize() > 1 && (!this.g() || !this.i()); - } - - public boolean g() { - return this.item.getMaxDurability() <= 0 ? false : !this.hasTag() || !this.getTag().getBoolean("Unbreakable"); - } - - public boolean usesData() { - return this.item.n(); - } - - public boolean i() { - return this.g() && this.damage > 0; - } - - public int j() { - return this.damage; - } - - public int getData() { - return this.damage; - } - - public void setData(int i) { - // CraftBukkit start - Filter out data for items that shouldn't have it - // The crafting system uses this value for a special purpose so we have to allow it - if (i == 32767) { - this.damage = i; - return; - } - - // Is this a block? - if (CraftMagicNumbers.getBlock(CraftMagicNumbers.getId(this.getItem())) != Blocks.AIR) { - // If vanilla doesn't use data on it don't allow any - if (!(this.usesData() || this.getItem().usesDurability())) { - i = 0; - } - } - - // Filter invalid plant data - if (CraftMagicNumbers.getBlock(CraftMagicNumbers.getId(this.getItem())) == Blocks.DOUBLE_PLANT && (i > 5 || i < 0)) { - i = 0; - } - // CraftBukkit end - - this.damage = i; - if (this.damage < -1) { // CraftBukkit - don't filter -1, we use it - this.damage = 0; - } - } - - public int l() { - return this.item.getMaxDurability(); - } - - public boolean isDamaged(int i, Random random) { - if (!this.g()) { - return false; - } else { - if (i > 0) { - int j = EnchantmentManager.getEnchantmentLevel(Enchantment.DURABILITY.id, this); - int k = 0; - - for (int l = 0; j > 0 && l < i; ++l) { - if (EnchantmentDurability.a(this, j, random)) { - ++k; - } - } - - i -= k; - if (i <= 0) { - return false; - } - } - - this.damage += i; - return this.damage > this.l(); - } - } - - public void damage(int i, EntityLiving entityliving) { - if (!(entityliving instanceof EntityHuman) || !((EntityHuman) entityliving).abilities.canInstantlyBuild) { - if (this.g()) { - if (this.isDamaged(i, entityliving.aI())) { - entityliving.a(this); - --this.count; - if (entityliving instanceof EntityHuman) { - EntityHuman entityhuman = (EntityHuman) entityliving; - - entityhuman.a(StatisticList.BREAK_ITEM_COUNT[Item.getId(this.item)], 1); - if (this.count == 0 && this.getItem() instanceof ItemBow) { - entityhuman.bG(); - } - } - - if (this.count < 0) { - this.count = 0; - } - - // CraftBukkit start - Check for item breaking - if (this.count == 0 && entityliving instanceof EntityHuman) { - org.bukkit.craftbukkit.event.CraftEventFactory.callPlayerItemBreakEvent((EntityHuman) entityliving, this); - } - // CraftBukkit end - - this.damage = 0; - } - } - } - } - - public void a(EntityLiving entityliving, EntityHuman entityhuman) { - boolean flag = this.item.a(this, entityliving, (EntityLiving) entityhuman); - - if (flag) { - entityhuman.a(StatisticList.USE_ITEM_COUNT[Item.getId(this.item)], 1); - } - } - - public void a(World world, Block block, int i, int j, int k, EntityHuman entityhuman) { - boolean flag = this.item.a(this, world, block, i, j, k, entityhuman); - - if (flag) { - entityhuman.a(StatisticList.USE_ITEM_COUNT[Item.getId(this.item)], 1); - } - } - - public boolean b(Block block) { - return this.item.canDestroySpecialBlock(block); - } - - public boolean a(EntityHuman entityhuman, EntityLiving entityliving) { - return this.item.a(this, entityhuman, entityliving); - } - - public ItemStack cloneItemStack() { - ItemStack itemstack = new ItemStack(this.item, this.count, this.damage); - - if (this.tag != null) { - itemstack.tag = (NBTTagCompound) this.tag.clone(); - } - - return itemstack; - } - - public static boolean equals(ItemStack itemstack, ItemStack itemstack1) { - return itemstack == null && itemstack1 == null ? true : (itemstack != null && itemstack1 != null ? (itemstack.tag == null && itemstack1.tag != null ? false : itemstack.tag == null || itemstack.tag.equals(itemstack1.tag)) : false); - } - - public static boolean matches(ItemStack itemstack, ItemStack itemstack1) { - return itemstack == null && itemstack1 == null ? true : (itemstack != null && itemstack1 != null ? itemstack.d(itemstack1) : false); - } - - private boolean d(ItemStack itemstack) { - return this.count != itemstack.count ? false : (this.item != itemstack.item ? false : (this.damage != itemstack.damage ? false : (this.tag == null && itemstack.tag != null ? false : this.tag == null || this.tag.equals(itemstack.tag)))); - } - - public boolean doMaterialsMatch(ItemStack itemstack) { - return this.item == itemstack.item && this.damage == itemstack.damage; - } - - public String a() { - return this.item.a(this); - } - - public static ItemStack b(ItemStack itemstack) { - return itemstack == null ? null : itemstack.cloneItemStack(); - } - - public String toString() { - return this.count + "x" + this.item.getName() + "@" + this.damage; - } - - public void a(World world, Entity entity, int i, boolean flag) { - if (this.c > 0) { - --this.c; - } - - this.item.a(this, world, entity, i, flag); - } - - public void a(World world, EntityHuman entityhuman, int i) { - entityhuman.a(StatisticList.CRAFT_BLOCK_COUNT[Item.getId(this.item)], i); - this.item.d(this, world, entityhuman); - } - - public int n() { - return this.getItem().d_(this); - } - - public EnumAnimation o() { - return this.getItem().d(this); - } - - public void b(World world, EntityHuman entityhuman, int i) { - this.getItem().a(this, world, entityhuman, i); - } - - public boolean hasTag() { - return this.tag != null; - } - - public NBTTagCompound getTag() { - return this.tag; - } - - public NBTTagList getEnchantments() { - return this.tag == null ? null : this.tag.getList("ench", 10); - } - - public void setTag(NBTTagCompound nbttagcompound) { - this.tag = nbttagcompound; - } - - public String getName() { - String s = this.getItem().n(this); - - if (this.tag != null && this.tag.hasKeyOfType("display", 10)) { - NBTTagCompound nbttagcompound = this.tag.getCompound("display"); - - if (nbttagcompound.hasKeyOfType("Name", 8)) { - s = nbttagcompound.getString("Name"); - } - } - - return s; - } - - public ItemStack c(String s) { - if (this.tag == null) { - this.tag = new NBTTagCompound(); - } - - if (!this.tag.hasKeyOfType("display", 10)) { - this.tag.set("display", new NBTTagCompound()); - } - - this.tag.getCompound("display").setString("Name", s); - return this; - } - - public void t() { - if (this.tag != null) { - if (this.tag.hasKeyOfType("display", 10)) { - NBTTagCompound nbttagcompound = this.tag.getCompound("display"); - - nbttagcompound.remove("Name"); - if (nbttagcompound.isEmpty()) { - this.tag.remove("display"); - if (this.tag.isEmpty()) { - this.setTag((NBTTagCompound) null); - } - } - } - } - } - - public boolean hasName() { - return this.tag == null ? false : (!this.tag.hasKeyOfType("display", 10) ? false : this.tag.getCompound("display").hasKeyOfType("Name", 8)); - } - - public EnumItemRarity w() { - return this.getItem().f(this); - } - - public boolean x() { - return !this.getItem().e_(this) ? false : !this.hasEnchantments(); - } - - public void addEnchantment(Enchantment enchantment, int i) { - if (this.tag == null) { - this.setTag(new NBTTagCompound()); - } - - if (!this.tag.hasKeyOfType("ench", 9)) { - this.tag.set("ench", new NBTTagList()); - } - - NBTTagList nbttaglist = this.tag.getList("ench", 10); - NBTTagCompound nbttagcompound = new NBTTagCompound(); - - nbttagcompound.setShort("id", (short) enchantment.id); - nbttagcompound.setShort("lvl", (short) ((byte) i)); - nbttaglist.add(nbttagcompound); - } - - public boolean hasEnchantments() { - return this.tag != null && this.tag.hasKeyOfType("ench", 9); - } - - public void a(String s, NBTBase nbtbase) { - if (this.tag == null) { - this.setTag(new NBTTagCompound()); - } - - this.tag.set(s, nbtbase); - } - - public boolean z() { - return this.getItem().v(); - } - - public boolean A() { - return this.g != null; - } - - public void a(EntityItemFrame entityitemframe) { - this.g = entityitemframe; - } - - public EntityItemFrame B() { - return this.g; - } - - public int getRepairCost() { - return this.hasTag() && this.tag.hasKeyOfType("RepairCost", 3) ? this.tag.getInt("RepairCost") : 0; - } - - public void setRepairCost(int i) { - if (!this.hasTag()) { - this.tag = new NBTTagCompound(); - } - - this.tag.setInt("RepairCost", i); - } - - public Multimap D() { - Object object; - - if (this.hasTag() && this.tag.hasKeyOfType("AttributeModifiers", 9)) { - object = HashMultimap.create(); - NBTTagList nbttaglist = this.tag.getList("AttributeModifiers", 10); - - for (int i = 0; i < nbttaglist.size(); ++i) { - NBTTagCompound nbttagcompound = nbttaglist.get(i); - AttributeModifier attributemodifier = GenericAttributes.a(nbttagcompound); - - if (attributemodifier.a().getLeastSignificantBits() != 0L && attributemodifier.a().getMostSignificantBits() != 0L) { - ((Multimap) object).put(nbttagcompound.getString("AttributeName"), attributemodifier); - } - } - } else { - object = this.getItem().k(); - } - - return (Multimap) object; - } - - public void setItem(Item item) { - this.item = item; - this.setData(this.getData()); // CraftBukkit - Set data again to ensure it is filtered properly - } - - public IChatBaseComponent E() { - IChatBaseComponent ichatbasecomponent = (new ChatComponentText("[")).a(this.getName()).a("]"); - - if (this.item != null) { - NBTTagCompound nbttagcompound = new NBTTagCompound(); - - this.save(nbttagcompound); - ichatbasecomponent.getChatModifier().a(new ChatHoverable(EnumHoverAction.SHOW_ITEM, new ChatComponentText(nbttagcompound.toString()))); - ichatbasecomponent.getChatModifier().setColor(this.w().e); - } - - return ichatbasecomponent; - } -} diff --git a/src/main/java/net/minecraft/server/ItemWaterLily.java b/src/main/java/net/minecraft/server/ItemWaterLily.java deleted file mode 100644 index 246090d609..0000000000 --- a/src/main/java/net/minecraft/server/ItemWaterLily.java +++ /dev/null @@ -1,48 +0,0 @@ -package net.minecraft.server; - -public class ItemWaterLily extends ItemWithAuxData { - - public ItemWaterLily(Block block) { - super(block, false); - } - - public ItemStack a(ItemStack itemstack, World world, EntityHuman entityhuman) { - MovingObjectPosition movingobjectposition = this.a(world, entityhuman, true); - - if (movingobjectposition == null) { - return itemstack; - } else { - if (movingobjectposition.type == EnumMovingObjectType.BLOCK) { - int i = movingobjectposition.b; - int j = movingobjectposition.c; - int k = movingobjectposition.d; - - if (!world.a(entityhuman, i, j, k)) { - return itemstack; - } - - if (!entityhuman.a(i, j, k, movingobjectposition.face, itemstack)) { - return itemstack; - } - - if (world.getType(i, j, k).getMaterial() == Material.WATER && world.getData(i, j, k) == 0 && world.isEmpty(i, j + 1, k)) { - // CraftBukkit start - special case for handling block placement with water lilies - org.bukkit.block.BlockState blockstate = org.bukkit.craftbukkit.block.CraftBlockState.getBlockState(world, i, j + 1, k); - world.setTypeUpdate(i, j + 1, k, Blocks.WATER_LILY); - org.bukkit.event.block.BlockPlaceEvent placeEvent = org.bukkit.craftbukkit.event.CraftEventFactory.callBlockPlaceEvent(world, entityhuman, blockstate, i, j, k); - if (placeEvent != null && (placeEvent.isCancelled() || !placeEvent.canBuild())) { - blockstate.update(true, false); - return itemstack; - } - // CraftBukkit end - - if (!entityhuman.abilities.canInstantlyBuild) { - --itemstack.count; - } - } - } - - return itemstack; - } - } -} diff --git a/src/main/java/net/minecraft/server/ItemWorldMap.java b/src/main/java/net/minecraft/server/ItemWorldMap.java deleted file mode 100644 index c08cccaffb..0000000000 --- a/src/main/java/net/minecraft/server/ItemWorldMap.java +++ /dev/null @@ -1,231 +0,0 @@ -package net.minecraft.server; - -import net.minecraft.util.com.google.common.collect.HashMultiset; -import net.minecraft.util.com.google.common.collect.Iterables; -import net.minecraft.util.com.google.common.collect.Multisets; - -// CraftBukkit start -import org.bukkit.Bukkit; -import org.bukkit.event.server.MapInitializeEvent; -// CraftBukkit end - -public class ItemWorldMap extends ItemWorldMapBase { - - protected ItemWorldMap() { - this.a(true); - } - - public WorldMap getSavedMap(ItemStack itemstack, World world) { - World worldMain = world.getServer().getServer().worlds.get(0); // CraftBukkit - store reference to primary world - String s = "map_" + itemstack.getData(); - WorldMap worldmap = (WorldMap) worldMain.a(WorldMap.class, s); // CraftBukkit - use primary world for maps - - if (worldmap == null && !world.isStatic) { - itemstack.setData(worldMain.b("map")); // CraftBukkit - use primary world for maps - s = "map_" + itemstack.getData(); - worldmap = new WorldMap(s); - worldmap.scale = 3; - int i = 128 * (1 << worldmap.scale); - - worldmap.centerX = Math.round((float) world.getWorldData().c() / (float) i) * i; - worldmap.centerZ = Math.round((float) (world.getWorldData().e() / i)) * i; - worldmap.map = (byte) ((WorldServer) world).dimension; // CraftBukkit - fixes Bukkit multiworld maps - worldmap.c(); - worldMain.a(s, (PersistentBase) worldmap); // CraftBukkit - use primary world for maps - - // CraftBukkit start - MapInitializeEvent event = new MapInitializeEvent(worldmap.mapView); - Bukkit.getServer().getPluginManager().callEvent(event); - // CraftBukkit end - } - - return worldmap; - } - - public void a(World world, Entity entity, WorldMap worldmap) { - // CraftBukkit - world.worldProvider -> ((WorldServer) world) - if (((WorldServer) world).dimension == worldmap.map && entity instanceof EntityHuman) { - int i = 1 << worldmap.scale; - int j = worldmap.centerX; - int k = worldmap.centerZ; - int l = MathHelper.floor(entity.locX - (double) j) / i + 64; - int i1 = MathHelper.floor(entity.locZ - (double) k) / i + 64; - int j1 = 128 / i; - - if (world.worldProvider.g) { - j1 /= 2; - } - - WorldMapHumanTracker worldmaphumantracker = worldmap.a((EntityHuman) entity); - - ++worldmaphumantracker.d; - - for (int k1 = l - j1 + 1; k1 < l + j1; ++k1) { - if ((k1 & 15) == (worldmaphumantracker.d & 15)) { - int l1 = 255; - int i2 = 0; - double d0 = 0.0D; - - for (int j2 = i1 - j1 - 1; j2 < i1 + j1; ++j2) { - if (k1 >= 0 && j2 >= -1 && k1 < 128 && j2 < 128) { - int k2 = k1 - l; - int l2 = j2 - i1; - boolean flag = k2 * k2 + l2 * l2 > (j1 - 2) * (j1 - 2); - int i3 = (j / i + k1 - 64) * i; - int j3 = (k / i + j2 - 64) * i; - HashMultiset hashmultiset = HashMultiset.create(); - Chunk chunk = world.getChunkAtWorldCoords(i3, j3); - - if (!chunk.isEmpty()) { - int k3 = i3 & 15; - int l3 = j3 & 15; - int i4 = 0; - double d1 = 0.0D; - int j4; - - if (world.worldProvider.g) { - j4 = i3 + j3 * 231871; - j4 = j4 * j4 * 31287121 + j4 * 11; - if ((j4 >> 20 & 1) == 0) { - hashmultiset.add(Blocks.DIRT.f(0), 10); - } else { - hashmultiset.add(Blocks.STONE.f(0), 100); - } - - d1 = 100.0D; - } else { - for (j4 = 0; j4 < i; ++j4) { - for (int k4 = 0; k4 < i; ++k4) { - int l4 = chunk.b(j4 + k3, k4 + l3) + 1; - Block block = Blocks.AIR; - int i5 = 0; - - if (l4 > 1) { - do { - --l4; - block = chunk.getType(j4 + k3, l4, k4 + l3); - i5 = chunk.getData(j4 + k3, l4, k4 + l3); - } while (block.f(i5) == MaterialMapColor.b && l4 > 0); - - if (l4 > 0 && block.getMaterial().isLiquid()) { - int j5 = l4 - 1; - - Block block1; - - do { - block1 = chunk.getType(j4 + k3, j5--, k4 + l3); - ++i4; - } while (j5 > 0 && block1.getMaterial().isLiquid()); - } - } - - d1 += (double) l4 / (double) (i * i); - hashmultiset.add(block.f(i5)); - } - } - } - - i4 /= i * i; - double d2 = (d1 - d0) * 4.0D / (double) (i + 4) + ((double) (k1 + j2 & 1) - 0.5D) * 0.4D; - byte b0 = 1; - - if (d2 > 0.6D) { - b0 = 2; - } - - if (d2 < -0.6D) { - b0 = 0; - } - - MaterialMapColor materialmapcolor = (MaterialMapColor) Iterables.getFirst(Multisets.copyHighestCountFirst(hashmultiset), MaterialMapColor.b); - - if (materialmapcolor == MaterialMapColor.n) { - d2 = (double) i4 * 0.1D + (double) (k1 + j2 & 1) * 0.2D; - b0 = 1; - if (d2 < 0.5D) { - b0 = 2; - } - - if (d2 > 0.9D) { - b0 = 0; - } - } - - d0 = d1; - if (j2 >= 0 && k2 * k2 + l2 * l2 < j1 * j1 && (!flag || (k1 + j2 & 1) != 0)) { - byte b1 = worldmap.colors[k1 + j2 * 128]; - byte b2 = (byte) (materialmapcolor.M * 4 + b0); - - if (b1 != b2) { - if (l1 > j2) { - l1 = j2; - } - - if (i2 < j2) { - i2 = j2; - } - - worldmap.colors[k1 + j2 * 128] = b2; - } - } - } - } - } - - if (l1 <= i2) { - worldmap.flagDirty(k1, l1, i2); - } - } - } - } - } - - public void a(ItemStack itemstack, World world, Entity entity, int i, boolean flag) { - if (!world.isStatic) { - WorldMap worldmap = this.getSavedMap(itemstack, world); - - if (entity instanceof EntityHuman) { - EntityHuman entityhuman = (EntityHuman) entity; - - worldmap.a(entityhuman, itemstack); - } - - if (flag) { - this.a(world, entity, worldmap); - } - } - } - - public Packet c(ItemStack itemstack, World world, EntityHuman entityhuman) { - byte[] abyte = this.getSavedMap(itemstack, world).getUpdatePacket(itemstack, world, entityhuman); - - return abyte == null ? null : new PacketPlayOutMap(itemstack.getData(), abyte); - } - - public void d(ItemStack itemstack, World world, EntityHuman entityhuman) { - if (itemstack.hasTag() && itemstack.getTag().getBoolean("map_is_scaling")) { - WorldMap worldmap = Items.MAP.getSavedMap(itemstack, world); - - world = world.getServer().getServer().worlds.get(0); // CraftBukkit - use primary world for maps - - itemstack.setData(world.b("map")); - WorldMap worldmap1 = new WorldMap("map_" + itemstack.getData()); - - worldmap1.scale = (byte) (worldmap.scale + 1); - if (worldmap1.scale > 4) { - worldmap1.scale = 4; - } - - worldmap1.centerX = worldmap.centerX; - worldmap1.centerZ = worldmap.centerZ; - worldmap1.map = worldmap.map; - worldmap1.c(); - world.a("map_" + itemstack.getData(), (PersistentBase) worldmap1); - - // CraftBukkit start - MapInitializeEvent event = new MapInitializeEvent(worldmap1.mapView); - Bukkit.getServer().getPluginManager().callEvent(event); - // CraftBukkit end - } - } -} diff --git a/src/main/java/net/minecraft/server/JsonList.java b/src/main/java/net/minecraft/server/JsonList.java deleted file mode 100644 index 9d1cb336c1..0000000000 --- a/src/main/java/net/minecraft/server/JsonList.java +++ /dev/null @@ -1,166 +0,0 @@ -package net.minecraft.server; - -import java.io.BufferedReader; -import java.io.BufferedWriter; -import java.io.File; -import java.io.IOException; -import java.lang.reflect.ParameterizedType; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Iterator; -import java.util.Map; - -import net.minecraft.util.com.google.common.base.Charsets; -import net.minecraft.util.com.google.common.collect.Lists; -import net.minecraft.util.com.google.common.collect.Maps; -import net.minecraft.util.com.google.common.io.Files; -import net.minecraft.util.com.google.gson.Gson; -import net.minecraft.util.com.google.gson.GsonBuilder; -import net.minecraft.util.com.google.gson.JsonObject; -import net.minecraft.util.org.apache.commons.io.IOUtils; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; - -public class JsonList { - - protected static final Logger a = LogManager.getLogger(); - protected final Gson b; - private final File c; - private final Map d = Maps.newHashMap(); - private boolean e = true; - private static final ParameterizedType f = new JsonListType(); - - public JsonList(File file1) { - this.c = file1; - GsonBuilder gsonbuilder = (new GsonBuilder()).setPrettyPrinting(); - - gsonbuilder.registerTypeHierarchyAdapter(JsonListEntry.class, new JsonListEntrySerializer(this, (JsonListType) null)); - this.b = gsonbuilder.create(); - } - - public boolean isEnabled() { - return this.e; - } - - public void a(boolean flag) { - this.e = flag; - } - - public File c() { - return this.c; - } - - public void add(JsonListEntry jsonlistentry) { - this.d.put(this.a(jsonlistentry.getKey()), jsonlistentry); - - try { - this.save(); - } catch (IOException ioexception) { - a.warn("Could not save the list after adding a user.", ioexception); - } - } - - public JsonListEntry get(Object object) { - this.h(); - return (JsonListEntry) this.d.get(this.a(object)); - } - - public void remove(Object object) { - this.d.remove(this.a(object)); - - try { - this.save(); - } catch (IOException ioexception) { - a.warn("Could not save the list after removing a user.", ioexception); - } - } - - public String[] getEntries() { - return (String[]) this.d.keySet().toArray(new String[this.d.size()]); - } - - // CraftBukkit start - public Collection getValues() { - return this.d.values(); - } - // CraftBukkit end - - public boolean isEmpty() { - return this.d.size() < 1; - } - - protected String a(Object object) { - return object.toString(); - } - - protected boolean d(Object object) { - return this.d.containsKey(this.a(object)); - } - - private void h() { - ArrayList arraylist = Lists.newArrayList(); - Iterator iterator = this.d.values().iterator(); - - while (iterator.hasNext()) { - JsonListEntry jsonlistentry = (JsonListEntry) iterator.next(); - - if (jsonlistentry.hasExpired()) { - arraylist.add(jsonlistentry.getKey()); - } - } - - iterator = arraylist.iterator(); - - while (iterator.hasNext()) { - Object object = iterator.next(); - - this.d.remove(object); - } - } - - protected JsonListEntry a(JsonObject jsonobject) { - return new JsonListEntry(null, jsonobject); - } - - protected Map e() { - return this.d; - } - - public void save() throws IOException { // CraftBukkit - Added throws - Collection collection = this.d.values(); - String s = this.b.toJson(collection); - BufferedWriter bufferedwriter = null; - - try { - bufferedwriter = Files.newWriter(this.c, Charsets.UTF_8); - bufferedwriter.write(s); - } finally { - IOUtils.closeQuietly(bufferedwriter); - } - } - - public void load() throws IOException { // CraftBukkit - Added throws - Collection collection = null; - BufferedReader bufferedreader = null; - - try { - bufferedreader = Files.newReader(this.c, Charsets.UTF_8); - collection = (Collection) this.b.fromJson(bufferedreader, f); - } finally { - IOUtils.closeQuietly(bufferedreader); - } - - if (collection != null) { - this.d.clear(); - Iterator iterator = collection.iterator(); - - while (iterator.hasNext()) { - JsonListEntry jsonlistentry = (JsonListEntry) iterator.next(); - - if (jsonlistentry.getKey() != null) { - this.d.put(this.a(jsonlistentry.getKey()), jsonlistentry); - } - } - } - } -} diff --git a/src/main/java/net/minecraft/server/JsonListEntry.java b/src/main/java/net/minecraft/server/JsonListEntry.java deleted file mode 100644 index 1cd5104be2..0000000000 --- a/src/main/java/net/minecraft/server/JsonListEntry.java +++ /dev/null @@ -1,26 +0,0 @@ -package net.minecraft.server; - -import net.minecraft.util.com.google.gson.JsonObject; - -public class JsonListEntry { - - private final Object a; - - public JsonListEntry(Object object) { - this.a = object; - } - - protected JsonListEntry(Object object, JsonObject jsonobject) { - this.a = object; - } - - public Object getKey() { // CraftBukkit -> package private -> public - return this.a; - } - - boolean hasExpired() { - return false; - } - - protected void a(JsonObject jsonobject) {} -} diff --git a/src/main/java/net/minecraft/server/JsonListEntrySerializer.java b/src/main/java/net/minecraft/server/JsonListEntrySerializer.java deleted file mode 100644 index f4eee6689a..0000000000 --- a/src/main/java/net/minecraft/server/JsonListEntrySerializer.java +++ /dev/null @@ -1,51 +0,0 @@ -package net.minecraft.server; - -// CraftBukkit - Imported for package private use in JsonList - -import java.lang.reflect.Type; - -import net.minecraft.util.com.google.gson.JsonDeserializationContext; -import net.minecraft.util.com.google.gson.JsonDeserializer; -import net.minecraft.util.com.google.gson.JsonElement; -import net.minecraft.util.com.google.gson.JsonObject; -import net.minecraft.util.com.google.gson.JsonSerializationContext; -import net.minecraft.util.com.google.gson.JsonSerializer; - -class JsonListEntrySerializer implements JsonDeserializer, JsonSerializer { - - final JsonList a; - - private JsonListEntrySerializer(JsonList jsonlist) { - this.a = jsonlist; - } - - public JsonElement a(JsonListEntry jsonlistentry, Type type, JsonSerializationContext jsonserializationcontext) { - JsonObject jsonobject = new JsonObject(); - - jsonlistentry.a(jsonobject); - return jsonobject; - } - - public JsonListEntry a(JsonElement jsonelement, Type type, JsonDeserializationContext jsondeserializationcontext) { - if (jsonelement.isJsonObject()) { - JsonObject jsonobject = jsonelement.getAsJsonObject(); - JsonListEntry jsonlistentry = this.a.a(jsonobject); - - return jsonlistentry; - } else { - return null; - } - } - - public JsonElement serialize(Object object, Type type, JsonSerializationContext jsonserializationcontext) { - return this.a((JsonListEntry) object, type, jsonserializationcontext); - } - - public Object deserialize(JsonElement jsonelement, Type type, JsonDeserializationContext jsondeserializationcontext) { - return this.a(jsonelement, type, jsondeserializationcontext); - } - - JsonListEntrySerializer(JsonList jsonlist, JsonListType jsonlisttype) { - this(jsonlist); - } -} diff --git a/src/main/java/net/minecraft/server/LoginListener.java b/src/main/java/net/minecraft/server/LoginListener.java deleted file mode 100644 index 8f982f170e..0000000000 --- a/src/main/java/net/minecraft/server/LoginListener.java +++ /dev/null @@ -1,151 +0,0 @@ -package net.minecraft.server; - -import java.security.PrivateKey; -import java.util.Arrays; -import java.util.Random; -import java.util.UUID; -import java.util.concurrent.atomic.AtomicInteger; -import javax.crypto.SecretKey; - -import net.minecraft.util.com.google.common.base.Charsets; -import net.minecraft.util.com.mojang.authlib.GameProfile; -import net.minecraft.util.io.netty.util.concurrent.GenericFutureListener; -import net.minecraft.util.org.apache.commons.lang3.Validate; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; - -public class LoginListener implements PacketLoginInListener { - - private static final AtomicInteger b = new AtomicInteger(0); - private static final Logger c = LogManager.getLogger(); - private static final Random random = new Random(); - private final byte[] e = new byte[4]; - private final MinecraftServer server; - public final NetworkManager networkManager; - private EnumProtocolState g; - private int h; - private GameProfile i; - private String j; - private SecretKey loginKey; - public String hostname = ""; // CraftBukkit - add field - - public LoginListener(MinecraftServer minecraftserver, NetworkManager networkmanager) { - this.g = EnumProtocolState.HELLO; - this.j = ""; - this.server = minecraftserver; - this.networkManager = networkmanager; - random.nextBytes(this.e); - } - - public void a() { - if (this.g == EnumProtocolState.READY_TO_ACCEPT) { - this.c(); - } - - if (this.h++ == 600) { - this.disconnect("Took too long to log in"); - } - } - - public void disconnect(String s) { - try { - c.info("Disconnecting " + this.getName() + ": " + s); - ChatComponentText chatcomponenttext = new ChatComponentText(s); - - this.networkManager.handle(new PacketLoginOutDisconnect(chatcomponenttext), new GenericFutureListener[0]); - this.networkManager.close(chatcomponenttext); - } catch (Exception exception) { - c.error("Error whilst disconnecting player", exception); - } - } - - public void c() { - if (!this.i.isComplete()) { - this.i = this.a(this.i); - } - - // CraftBukkit start - fire PlayerLoginEvent - EntityPlayer s = this.server.getPlayerList().attemptLogin(this, this.i, this.hostname); - - if (s == null) { - // this.disconnect(s); - // CraftBukkit end - } else { - this.g = EnumProtocolState.e; - this.networkManager.handle(new PacketLoginOutSuccess(this.i), new GenericFutureListener[0]); - this.server.getPlayerList().a(this.networkManager, this.server.getPlayerList().processLogin(this.i, s)); // CraftBukkit - add player reference - } - } - - public void a(IChatBaseComponent ichatbasecomponent) { - c.info(this.getName() + " lost connection: " + ichatbasecomponent.c()); - } - - public String getName() { - return this.i != null ? this.i.toString() + " (" + this.networkManager.getSocketAddress().toString() + ")" : String.valueOf(this.networkManager.getSocketAddress()); - } - - public void a(EnumProtocol enumprotocol, EnumProtocol enumprotocol1) { - Validate.validState(this.g == EnumProtocolState.e || this.g == EnumProtocolState.HELLO, "Unexpected change in protocol", new Object[0]); - Validate.validState(enumprotocol1 == EnumProtocol.PLAY || enumprotocol1 == EnumProtocol.LOGIN, "Unexpected protocol " + enumprotocol1, new Object[0]); - } - - public void a(PacketLoginInStart packetlogininstart) { - Validate.validState(this.g == EnumProtocolState.HELLO, "Unexpected hello packet", new Object[0]); - this.i = packetlogininstart.c(); - if (this.server.getOnlineMode() && !this.networkManager.c()) { - this.g = EnumProtocolState.KEY; - this.networkManager.handle(new PacketLoginOutEncryptionBegin(this.j, this.server.K().getPublic(), this.e), new GenericFutureListener[0]); - } else { - this.g = EnumProtocolState.READY_TO_ACCEPT; - } - } - - public void a(PacketLoginInEncryptionBegin packetlogininencryptionbegin) { - Validate.validState(this.g == EnumProtocolState.KEY, "Unexpected key packet", new Object[0]); - PrivateKey privatekey = this.server.K().getPrivate(); - - if (!Arrays.equals(this.e, packetlogininencryptionbegin.b(privatekey))) { - throw new IllegalStateException("Invalid nonce!"); - } else { - this.loginKey = packetlogininencryptionbegin.a(privatekey); - this.g = EnumProtocolState.AUTHENTICATING; - this.networkManager.a(this.loginKey); - (new ThreadPlayerLookupUUID(this, "User Authenticator #" + b.incrementAndGet())).start(); - } - } - - protected GameProfile a(GameProfile gameprofile) { - UUID uuid = UUID.nameUUIDFromBytes(("OfflinePlayer:" + gameprofile.getName()).getBytes(Charsets.UTF_8)); - - return new GameProfile(uuid, gameprofile.getName()); - } - - static GameProfile a(LoginListener loginlistener) { - return loginlistener.i; - } - - static String b(LoginListener loginlistener) { - return loginlistener.j; - } - - static MinecraftServer c(LoginListener loginlistener) { - return loginlistener.server; - } - - static SecretKey d(LoginListener loginlistener) { - return loginlistener.loginKey; - } - - static GameProfile a(LoginListener loginlistener, GameProfile gameprofile) { - return loginlistener.i = gameprofile; - } - - static Logger e() { - return c; - } - - static EnumProtocolState a(LoginListener loginlistener, EnumProtocolState enumprotocolstate) { - return loginlistener.g = enumprotocolstate; - } -} diff --git a/src/main/java/net/minecraft/server/MethodProfiler.java b/src/main/java/net/minecraft/server/MethodProfiler.java deleted file mode 100644 index 7285e09e16..0000000000 --- a/src/main/java/net/minecraft/server/MethodProfiler.java +++ /dev/null @@ -1,24 +0,0 @@ -package net.minecraft.server; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; - -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; - -// CraftBukkit start - Strip down to empty methods, performance cost -public class MethodProfiler { - public boolean a = false; - - public final void a() { } - public final void a(String s) { } - public final void b() { } - public final List b(String s) { return null; } - public final void c(String s) { } - public final String c() { return null; } -} -// CraftBukkit end diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java deleted file mode 100644 index e65cbfae1d..0000000000 --- a/src/main/java/net/minecraft/server/MinecraftServer.java +++ /dev/null @@ -1,1321 +0,0 @@ -package net.minecraft.server; - -import java.awt.GraphicsEnvironment; -import java.awt.image.BufferedImage; -import java.io.File; -import java.net.Proxy; -import java.security.KeyPair; -import java.text.SimpleDateFormat; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.Date; -import java.util.Iterator; -import java.util.List; -import java.util.Random; -import java.util.UUID; -import java.util.concurrent.Callable; -import javax.imageio.ImageIO; - -import net.minecraft.util.com.google.common.base.Charsets; -import net.minecraft.util.com.mojang.authlib.GameProfile; -import net.minecraft.util.com.mojang.authlib.GameProfileRepository; -import net.minecraft.util.com.mojang.authlib.minecraft.MinecraftSessionService; -import net.minecraft.util.com.mojang.authlib.yggdrasil.YggdrasilAuthenticationService; -import net.minecraft.util.io.netty.buffer.ByteBuf; -import net.minecraft.util.io.netty.buffer.ByteBufOutputStream; -import net.minecraft.util.io.netty.buffer.Unpooled; -import net.minecraft.util.io.netty.handler.codec.base64.Base64; -import net.minecraft.util.org.apache.commons.lang3.Validate; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; - -// CraftBukkit start -import java.io.IOException; - -import jline.console.ConsoleReader; -import joptsimple.OptionSet; - -import org.bukkit.World.Environment; -import org.bukkit.craftbukkit.util.Waitable; -import org.bukkit.event.server.RemoteServerCommandEvent; -import org.bukkit.event.world.WorldSaveEvent; -// CraftBukkit end - -public abstract class MinecraftServer implements ICommandListener, Runnable, IMojangStatistics { - - private static final Logger i = LogManager.getLogger(); - private static final File a = new File("usercache.json"); - private static MinecraftServer j; - public Convertable convertable; // CraftBukkit - private final -> public - private final MojangStatisticsGenerator l = new MojangStatisticsGenerator("server", this, ar()); - public File universe; // CraftBukkit - private final -> public - private final List n = new ArrayList(); - private final ICommandHandler o; - public final MethodProfiler methodProfiler = new MethodProfiler(); - private final ServerConnection p; - private final ServerPing q = new ServerPing(); - private final Random r = new Random(); - private String serverIp; - private int t = -1; - public WorldServer[] worldServer; - private PlayerList u; - private boolean isRunning = true; - private boolean isStopped; - private int ticks; - protected final Proxy d; - public String e; - public int f; - private boolean onlineMode; - private boolean spawnAnimals; - private boolean spawnNPCs; - private boolean pvpMode; - private boolean allowFlight; - private String motd; - private int E; - private int F = 0; - public final long[] g = new long[100]; - public long[][] h; - private KeyPair G; - private String H; - private String I; - private boolean demoMode; - private boolean L; - private boolean M; - private String N = ""; - private boolean O; - private long P; - private String Q; - private boolean R; - private boolean S; - private final YggdrasilAuthenticationService T; - private final MinecraftSessionService U; - private long V = 0L; - private final GameProfileRepository W; - private final UserCache X; - - // CraftBukkit start - add fields - public List worlds = new ArrayList(); - public org.bukkit.craftbukkit.CraftServer server; - public OptionSet options; - public org.bukkit.command.ConsoleCommandSender console; - public org.bukkit.command.RemoteConsoleCommandSender remoteConsole; - public ConsoleReader reader; - public static int currentTick = (int) (System.currentTimeMillis() / 50); - public final Thread primaryThread; - public java.util.Queue processQueue = new java.util.concurrent.ConcurrentLinkedQueue(); - public int autosavePeriod; - // CraftBukkit end - - public MinecraftServer(OptionSet options, Proxy proxy) { // CraftBukkit - signature file -> OptionSet - this.X = new UserCache(this, a); - j = this; - this.d = proxy; - // this.universe = file1; // CraftBukkit - this.p = new ServerConnection(this); - this.o = new CommandDispatcher(); - // this.convertable = new WorldLoaderServer(file1); // CraftBukkit - moved to DedicatedServer.init - this.T = new YggdrasilAuthenticationService(proxy, UUID.randomUUID().toString()); - this.U = this.T.createMinecraftSessionService(); - this.W = this.T.createProfileRepository(); - // CraftBukkit start - this.options = options; - // Try to see if we're actually running in a terminal, disable jline if not - if (System.console() == null) { - System.setProperty("jline.terminal", "jline.UnsupportedTerminal"); - org.bukkit.craftbukkit.Main.useJline = false; - } - - try { - this.reader = new ConsoleReader(System.in, System.out); - this.reader.setExpandEvents(false); // Avoid parsing exceptions for uncommonly used event designators - } catch (Throwable e) { - try { - // Try again with jline disabled for Windows users without C++ 2008 Redistributable - System.setProperty("jline.terminal", "jline.UnsupportedTerminal"); - System.setProperty("user.language", "en"); - org.bukkit.craftbukkit.Main.useJline = false; - this.reader = new ConsoleReader(System.in, System.out); - this.reader.setExpandEvents(false); - } catch (IOException ex) { - i.warn((String) null, ex); - } - } - Runtime.getRuntime().addShutdownHook(new org.bukkit.craftbukkit.util.ServerShutdownThread(this)); - - primaryThread = new ThreadServerApplication(this, "Server thread"); // Moved from main - } - - public abstract PropertyManager getPropertyManager(); - // CraftBukkit end - - protected abstract boolean init() throws java.net.UnknownHostException; // CraftBukkit - throws UnknownHostException - - protected void a(String s) { - if (this.getConvertable().isConvertable(s)) { - i.info("Converting map!"); - this.b("menu.convertingLevel"); - this.getConvertable().convert(s, new ConvertProgressUpdater(this)); - } - } - - protected synchronized void b(String s) { - this.Q = s; - } - - protected void a(String s, String s1, long i, WorldType worldtype, String s2) { - this.a(s); - this.b("menu.loadingLevel"); - this.worldServer = new WorldServer[3]; - // this.h = new long[this.worldServer.length][100]; // CraftBukkit - Removed ticktime arrays - // IDataManager idatamanager = this.convertable.a(s, true); - // WorldData worlddata = idatamanager.getWorldData(); - /* CraftBukkit start - Removed worldsettings - WorldSettings worldsettings; - - if (worlddata == null) { - worldsettings = new WorldSettings(i, this.getGamemode(), this.getGenerateStructures(), this.isHardcore(), worldtype); - worldsettings.a(s2); - } else { - worldsettings = new WorldSettings(worlddata); - } - - if (this.L) { - worldsettings.a(); - } - // */ - int worldCount = 3; - - for (int j = 0; j < worldCount; ++j) { - WorldServer world; - int dimension = 0; - - if (j == 1) { - if (this.getAllowNether()) { - dimension = -1; - } else { - continue; - } - } - - if (j == 2) { - if (this.server.getAllowEnd()) { - dimension = 1; - } else { - continue; - } - } - - String worldType = Environment.getEnvironment(dimension).toString().toLowerCase(); - String name = (dimension == 0) ? s : s + "_" + worldType; - - org.bukkit.generator.ChunkGenerator gen = this.server.getGenerator(name); - WorldSettings worldsettings = new WorldSettings(i, this.getGamemode(), this.getGenerateStructures(), this.isHardcore(), worldtype); - worldsettings.a(s2); - - if (j == 0) { - IDataManager idatamanager = new ServerNBTManager(server.getWorldContainer(), s1, true); - if (this.R()) { - world = new DemoWorldServer(this, idatamanager, s1, dimension, this.methodProfiler); - } else { - // world =, b0 to dimension, added Environment and gen - world = new WorldServer(this, idatamanager, s1, dimension, worldsettings, this.methodProfiler, Environment.getEnvironment(dimension), gen); - } - this.server.scoreboardManager = new org.bukkit.craftbukkit.scoreboard.CraftScoreboardManager(this, world.getScoreboard()); - } else { - String dim = "DIM" + dimension; - - File newWorld = new File(new File(name), dim); - File oldWorld = new File(new File(s), dim); - - if ((!newWorld.isDirectory()) && (oldWorld.isDirectory())) { - MinecraftServer.i.info("---- Migration of old " + worldType + " folder required ----"); - MinecraftServer.i.info("Unfortunately due to the way that Minecraft implemented multiworld support in 1.6, Bukkit requires that you move your " + worldType + " folder to a new location in order to operate correctly."); - MinecraftServer.i.info("We will move this folder for you, but it will mean that you need to move it back should you wish to stop using Bukkit in the future."); - MinecraftServer.i.info("Attempting to move " + oldWorld + " to " + newWorld + "..."); - - if (newWorld.exists()) { - MinecraftServer.i.warn("A file or folder already exists at " + newWorld + "!"); - MinecraftServer.i.info("---- Migration of old " + worldType + " folder failed ----"); - } else if (newWorld.getParentFile().mkdirs()) { - if (oldWorld.renameTo(newWorld)) { - MinecraftServer.i.info("Success! To restore " + worldType + " in the future, simply move " + newWorld + " to " + oldWorld); - // Migrate world data too. - try { - com.google.common.io.Files.copy(new File(new File(s), "level.dat"), new File(new File(name), "level.dat")); - } catch (IOException exception) { - MinecraftServer.i.warn("Unable to migrate world data."); - } - MinecraftServer.i.info("---- Migration of old " + worldType + " folder complete ----"); - } else { - MinecraftServer.i.warn("Could not move folder " + oldWorld + " to " + newWorld + "!"); - MinecraftServer.i.info("---- Migration of old " + worldType + " folder failed ----"); - } - } else { - MinecraftServer.i.warn("Could not create path for " + newWorld + "!"); - MinecraftServer.i.info("---- Migration of old " + worldType + " folder failed ----"); - } - } - - IDataManager idatamanager = new ServerNBTManager(server.getWorldContainer(), name, true); - // world =, b0 to dimension, s1 to name, added Environment and gen - world = new SecondaryWorldServer(this, idatamanager, name, dimension, worldsettings, this.worlds.get(0), this.methodProfiler, Environment.getEnvironment(dimension), gen); - } - - if (gen != null) { - world.getWorld().getPopulators().addAll(gen.getDefaultPopulators(world.getWorld())); - } - - this.server.getPluginManager().callEvent(new org.bukkit.event.world.WorldInitEvent(world.getWorld())); - - world.addIWorldAccess(new WorldManager(this, world)); - if (!this.N()) { - world.getWorldData().setGameType(this.getGamemode()); - } - - this.worlds.add(world); - this.u.setPlayerFileData(this.worlds.toArray(new WorldServer[this.worlds.size()])); - // CraftBukkit end - } - - this.a(this.getDifficulty()); - this.g(); - } - - protected void g() { - boolean flag = true; - boolean flag1 = true; - boolean flag2 = true; - boolean flag3 = true; - int i = 0; - - this.b("menu.generatingTerrain"); - byte b0 = 0; - - // CraftBukkit start - fire WorldLoadEvent and handle whether or not to keep the spawn in memory - for (int m = 0; m < this.worlds.size(); ++m) { - WorldServer worldserver = this.worlds.get(m); - MinecraftServer.i.info("Preparing start region for level " + m + " (Seed: " + worldserver.getSeed() + ")"); - if (!worldserver.getWorld().getKeepSpawnInMemory()) { - continue; - } - - ChunkCoordinates chunkcoordinates = worldserver.getSpawn(); - long j = ar(); - i = 0; - - for (int k = -192; k <= 192 && this.isRunning(); k += 16) { - for (int l = -192; l <= 192 && this.isRunning(); l += 16) { - long i1 = ar(); - - if (i1 - j > 1000L) { - this.a_("Preparing spawn area", i * 100 / 625); - j = i1; - } - - ++i; - worldserver.chunkProviderServer.getChunkAt(chunkcoordinates.x + k >> 4, chunkcoordinates.z + l >> 4); - } - } - } - - for (WorldServer world : this.worlds) { - this.server.getPluginManager().callEvent(new org.bukkit.event.world.WorldLoadEvent(world.getWorld())); - } - // CraftBukkit end - this.n(); - } - - public abstract boolean getGenerateStructures(); - - public abstract EnumGamemode getGamemode(); - - public abstract EnumDifficulty getDifficulty(); - - public abstract boolean isHardcore(); - - public abstract int l(); - - public abstract boolean m(); - - protected void a_(String s, int i) { - this.e = s; - this.f = i; - // CraftBukkit - Use FQN to work around decompiler issue - MinecraftServer.i.info(s + ": " + i + "%"); - } - - protected void n() { - this.e = null; - this.f = 0; - - this.server.enablePlugins(org.bukkit.plugin.PluginLoadOrder.POSTWORLD); // CraftBukkit - } - - protected void saveChunks(boolean flag) throws ExceptionWorldConflict { // CraftBukkit - added throws - if (!this.M) { - // CraftBukkit start - fire WorldSaveEvent - // WorldServer[] aworldserver = this.worldServer; - int i = this.worlds.size(); - - for (int j = 0; j < i; ++j) { - WorldServer worldserver = this.worlds.get(j); - - if (worldserver != null) { - if (!flag) { - MinecraftServer.i.info("Saving chunks for level \'" + worldserver.getWorldData().getName() + "\'/" + worldserver.worldProvider.getName()); - } - - worldserver.save(true, (IProgressUpdate) null); - worldserver.saveLevel(); - - WorldSaveEvent event = new WorldSaveEvent(worldserver.getWorld()); - this.server.getPluginManager().callEvent(event); - // CraftBukkit end - } - } - } - } - - public void stop() throws ExceptionWorldConflict { // CraftBukkit - added throws - if (!this.M) { - i.info("Stopping server"); - // CraftBukkit start - if (this.server != null) { - this.server.disablePlugins(); - } - // CraftBukkit end - - if (this.ai() != null) { - this.ai().b(); - } - - if (this.u != null) { - i.info("Saving players"); - this.u.savePlayers(); - this.u.u(); - } - - if (this.worldServer != null) { - i.info("Saving worlds"); - this.saveChunks(false); - - /* CraftBukkit start - Handled in saveChunks - for (int i = 0; i < this.worldServer.length; ++i) { - WorldServer worldserver = this.worldServer[i]; - - worldserver.saveLevel(); - } - // CraftBukkit end */ - } - - if (this.l.d()) { - this.l.e(); - } - } - } - - public String getServerIp() { - return this.serverIp; - } - - public void c(String s) { - this.serverIp = s; - } - - public boolean isRunning() { - return this.isRunning; - } - - public void safeShutdown() { - this.isRunning = false; - } - - public void run() { - try { - if (this.init()) { - long i = ar(); - long j = 0L; - - this.q.setMOTD(new ChatComponentText(this.motd)); - this.q.setServerInfo(new ServerPingServerData("1.7.10", 5)); - this.a(this.q); - - while (this.isRunning) { - long k = ar(); - long l = k - i; - - if (l > 2000L && i - this.P >= 15000L) { - if (this.server.getWarnOnOverload()) // CraftBukkit - Added option to suppress warning messages - MinecraftServer.i.warn("Can\'t keep up! Did the system time change, or is the server overloaded? Running {}ms behind, skipping {} tick(s)", new Object[] { Long.valueOf(l), Long.valueOf(l / 50L)}); - l = 2000L; - this.P = i; - } - - if (l < 0L) { - MinecraftServer.i.warn("Time ran backwards! Did the system time change?"); - l = 0L; - } - - j += l; - i = k; - if (this.worlds.get(0).everyoneDeeplySleeping()) { // CraftBukkit - this.u(); - j = 0L; - } else { - while (j > 50L) { - MinecraftServer.currentTick = (int) (System.currentTimeMillis() / 50); // CraftBukkit - j -= 50L; - this.u(); - } - } - - Thread.sleep(Math.max(1L, 50L - j)); - this.O = true; - } - } else { - this.a((CrashReport) null); - } - } catch (Throwable throwable) { - i.error("Encountered an unexpected exception", throwable); - CrashReport crashreport = null; - - if (throwable instanceof ReportedException) { - crashreport = this.b(((ReportedException) throwable).a()); - } else { - crashreport = this.b(new CrashReport("Exception in server tick loop", throwable)); - } - - File file1 = new File(new File(this.s(), "crash-reports"), "crash-" + (new SimpleDateFormat("yyyy-MM-dd_HH.mm.ss")).format(new Date()) + "-server.txt"); - - if (crashreport.a(file1)) { - i.error("This crash report has been saved to: " + file1.getAbsolutePath()); - } else { - i.error("We were unable to save this crash report to disk."); - } - - this.a(crashreport); - } finally { - try { - this.stop(); - this.isStopped = true; - } catch (Throwable throwable1) { - i.error("Exception stopping the server", throwable1); - } finally { - // CraftBukkit start - Restore terminal to original settings - try { - this.reader.getTerminal().restore(); - } catch (Exception e) { - } - // CraftBukkit end - this.t(); - } - } - } - - private void a(ServerPing serverping) { - File file1 = this.d("server-icon.png"); - - if (file1.isFile()) { - ByteBuf bytebuf = Unpooled.buffer(); - - try { - BufferedImage bufferedimage = ImageIO.read(file1); - - Validate.validState(bufferedimage.getWidth() == 64, "Must be 64 pixels wide", new Object[0]); - Validate.validState(bufferedimage.getHeight() == 64, "Must be 64 pixels high", new Object[0]); - ImageIO.write(bufferedimage, "PNG", new ByteBufOutputStream(bytebuf)); - ByteBuf bytebuf1 = Base64.encode(bytebuf); - - serverping.setFavicon("data:image/png;base64," + bytebuf1.toString(Charsets.UTF_8)); - } catch (Exception exception) { - i.error("Couldn\'t load server icon", exception); - } finally { - bytebuf.release(); - } - } - } - - protected File s() { - return new File("."); - } - - protected void a(CrashReport crashreport) {} - - protected void t() {} - - protected void u() throws ExceptionWorldConflict { // CraftBukkit - added throws - long i = System.nanoTime(); - - ++this.ticks; - if (this.R) { - this.R = false; - this.methodProfiler.a = true; - this.methodProfiler.a(); - } - - this.methodProfiler.a("root"); - this.v(); - if (i - this.V >= 5000000000L) { - this.V = i; - this.q.setPlayerSample(new ServerPingPlayerSample(this.D(), this.C())); - GameProfile[] agameprofile = new GameProfile[Math.min(this.C(), 12)]; - int j = MathHelper.nextInt(this.r, 0, this.C() - agameprofile.length); - - for (int k = 0; k < agameprofile.length; ++k) { - agameprofile[k] = ((EntityPlayer) this.u.players.get(j + k)).getProfile(); - } - - Collections.shuffle(Arrays.asList(agameprofile)); - this.q.b().a(agameprofile); - } - - if ((this.autosavePeriod > 0) && ((this.ticks % this.autosavePeriod) == 0)) { // CraftBukkit - this.methodProfiler.a("save"); - this.u.savePlayers(); - this.saveChunks(true); - this.methodProfiler.b(); - } - - this.methodProfiler.a("tallying"); - this.g[this.ticks % 100] = System.nanoTime() - i; - this.methodProfiler.b(); - this.methodProfiler.a("snooper"); - if (!this.l.d() && this.ticks > 100) { - this.l.a(); - } - - if (this.ticks % 6000 == 0) { - this.l.b(); - } - - this.methodProfiler.b(); - this.methodProfiler.b(); - } - - public void v() { - this.methodProfiler.a("levels"); - - // CraftBukkit start - this.server.getScheduler().mainThreadHeartbeat(this.ticks); - - // Run tasks that are waiting on processing - while (!processQueue.isEmpty()) { - processQueue.remove().run(); - } - - org.bukkit.craftbukkit.chunkio.ChunkIOExecutor.tick(); - - // Send time updates 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.getPlayerList().players.size(); ++i) { - EntityPlayer entityplayer = (EntityPlayer) this.getPlayerList().players.get(i); - entityplayer.playerConnection.sendPacket(new PacketPlayOutUpdateTime(entityplayer.world.getTime(), entityplayer.getPlayerTime(), entityplayer.world.getGameRules().getBoolean("doDaylightCycle"))); // Add support for per player time - } - } - - int i; - - for (i = 0; i < this.worlds.size(); ++i) { - long j = System.nanoTime(); - - // if (i == 0 || this.getAllowNether()) { - WorldServer worldserver = this.worlds.get(i); - - this.methodProfiler.a(worldserver.getWorldData().getName()); - this.methodProfiler.a("pools"); - this.methodProfiler.b(); - /* Drop global time updates - if (this.ticks % 20 == 0) { - this.methodProfiler.a("timeSync"); - this.t.a(new PacketPlayOutUpdateTime(worldserver.getTime(), worldserver.getDayTime(), worldserver.getGameRules().getBoolean("doDaylightCycle")), worldserver.worldProvider.dimension); - this.methodProfiler.b(); - } - // CraftBukkit end */ - - this.methodProfiler.a("tick"); - - CrashReport crashreport; - - try { - worldserver.doTick(); - } catch (Throwable throwable) { - crashreport = CrashReport.a(throwable, "Exception ticking world"); - worldserver.a(crashreport); - throw new ReportedException(crashreport); - } - - try { - worldserver.tickEntities(); - } catch (Throwable throwable1) { - crashreport = CrashReport.a(throwable1, "Exception ticking world entities"); - worldserver.a(crashreport); - throw new ReportedException(crashreport); - } - - this.methodProfiler.b(); - this.methodProfiler.a("tracker"); - worldserver.getTracker().updatePlayers(); - this.methodProfiler.b(); - this.methodProfiler.b(); - // } // CraftBukkit - - // this.h[i][this.ticks % 100] = System.nanoTime() - j; // CraftBukkit - } - - this.methodProfiler.c("connection"); - this.ai().c(); - this.methodProfiler.c("players"); - this.u.tick(); - this.methodProfiler.c("tickables"); - - for (i = 0; i < this.n.size(); ++i) { - ((IUpdatePlayerListBox) this.n.get(i)).a(); - } - - this.methodProfiler.b(); - } - - public boolean getAllowNether() { - return true; - } - - public void a(IUpdatePlayerListBox iupdateplayerlistbox) { - this.n.add(iupdateplayerlistbox); - } - - public static void main(final OptionSet options) { // CraftBukkit - replaces main(String[] astring) - DispenserRegistry.b(); - - try { - /* CraftBukkit start - Replace everything - boolean flag = true; - String s = null; - String s1 = "."; - String s2 = null; - boolean flag1 = false; - boolean flag2 = false; - int i = -1; - - for (int j = 0; j < astring.length; ++j) { - String s3 = astring[j]; - String s4 = j == astring.length - 1 ? null : astring[j + 1]; - boolean flag3 = false; - - if (!s3.equals("nogui") && !s3.equals("--nogui")) { - if (s3.equals("--port") && s4 != null) { - flag3 = true; - - try { - i = Integer.parseInt(s4); - } catch (NumberFormatException numberformatexception) { - ; - } - } else if (s3.equals("--singleplayer") && s4 != null) { - flag3 = true; - s = s4; - } else if (s3.equals("--universe") && s4 != null) { - flag3 = true; - s1 = s4; - } else if (s3.equals("--world") && s4 != null) { - flag3 = true; - s2 = s4; - } else if (s3.equals("--demo")) { - flag1 = true; - } else if (s3.equals("--bonusChest")) { - flag2 = true; - } - } else { - flag = false; - } - - if (flag3) { - ++j; - } - } - - DedicatedServer dedicatedserver = new DedicatedServer(new File(s1)); - - if (s != null) { - dedicatedserver.j(s); - } - - if (s2 != null) { - dedicatedserver.k(s2); - } - - if (i >= 0) { - dedicatedserver.setPort(i); - } - - if (flag1) { - dedicatedserver.b(true); - } - - if (flag2) { - dedicatedserver.c(true); - } - - if (flag) { - dedicatedserver.aD(); - } - // */ - - DedicatedServer dedicatedserver = new DedicatedServer(options); - - if (options.has("port")) { - int port = (Integer) options.valueOf("port"); - if (port > 0) { - dedicatedserver.setPort(port); - } - } - - if (options.has("universe")) { - dedicatedserver.universe = (File) options.valueOf("universe"); - } - - if (options.has("world")) { - dedicatedserver.k((String) options.valueOf("world")); - } - - dedicatedserver.primaryThread.start(); - // Runtime.getRuntime().addShutdownHook(new ThreadShutdown("Server Shutdown Thread", dedicatedserver)); - // CraftBukkit end - } catch (Exception exception) { - i.fatal("Failed to start the minecraft server", exception); - } - } - - public void x() { - // (new ThreadServerApplication(this, "Server thread")).start(); // CraftBukkit - prevent abuse - } - - public File d(String s) { - return new File(this.s(), s); - } - - public void info(String s) { - i.info(s); - } - - public void warning(String s) { - i.warn(s); - } - - public WorldServer getWorldServer(int i) { - // CraftBukkit start - for (WorldServer world : this.worlds) { - if (world.dimension == i) { - return world; - } - } - - return this.worlds.get(0); - // CraftBukkit end - } - - public String y() { - return this.serverIp; - } - - public int z() { - return this.t; - } - - public String A() { - return this.motd; - } - - public String getVersion() { - return "1.7.10"; - } - - public int C() { - return this.u.getPlayerCount(); - } - - public int D() { - return this.u.getMaxPlayers(); - } - - public String[] getPlayers() { - return this.u.f(); - } - - public GameProfile[] F() { - return this.u.g(); - } - - public String getPlugins() { - // CraftBukkit start - Whole method - StringBuilder result = new StringBuilder(); - org.bukkit.plugin.Plugin[] plugins = server.getPluginManager().getPlugins(); - - result.append(server.getName()); - result.append(" on Bukkit "); - result.append(server.getBukkitVersion()); - - if (plugins.length > 0 && this.server.getQueryPlugins()) { - result.append(": "); - - for (int i = 0; i < plugins.length; i++) { - if (i > 0) { - result.append("; "); - } - - result.append(plugins[i].getDescription().getName()); - result.append(" "); - result.append(plugins[i].getDescription().getVersion().replaceAll(";", ",")); - } - } - - return result.toString(); - // CraftBukkit end - } - - // CraftBukkit start - fire RemoteServerCommandEvent - public String g(final String s) { // final parameter - Waitable waitable = new Waitable() { - @Override - protected String evaluate() { - RemoteControlCommandListener.instance.e(); - // Event changes start - RemoteServerCommandEvent event = new RemoteServerCommandEvent(MinecraftServer.this.remoteConsole, s); - MinecraftServer.this.server.getPluginManager().callEvent(event); - // Event changes end - ServerCommand servercommand = new ServerCommand(event.getCommand(), RemoteControlCommandListener.instance); - MinecraftServer.this.server.dispatchServerCommand(MinecraftServer.this.remoteConsole, servercommand); // CraftBukkit - // this.o.a(RemoteControlCommandListener.instance, s); - return RemoteControlCommandListener.instance.f(); - }}; - processQueue.add(waitable); - try { - return waitable.get(); - } catch (java.util.concurrent.ExecutionException e) { - throw new RuntimeException("Exception processing rcon command " + s, e.getCause()); - } catch (InterruptedException e) { - Thread.currentThread().interrupt(); // Maintain interrupted state - throw new RuntimeException("Interrupted processing rcon command " + s, e); - } - // CraftBukkit end - } - - public boolean isDebugging() { - return this.getPropertyManager().getBoolean("debug", false); // CraftBukkit - don't hardcode - } - - public void h(String s) { - i.error(s); - } - - public void i(String s) { - if (this.isDebugging()) { - i.info(s); - } - } - - public String getServerModName() { - return server.getName(); // CraftBukkit - cb > vanilla! - } - - public CrashReport b(CrashReport crashreport) { - crashreport.g().a("Profiler Position", (Callable) (new CrashReportProfilerPosition(this))); - if (this.worlds != null && this.worlds.size() > 0 && this.worlds.get(0) != null) { // CraftBukkit - crashreport.g().a("Vec3 Pool Size", (Callable) (new CrashReportVec3DPoolSize(this))); - } - - if (this.u != null) { - crashreport.g().a("Player Count", (Callable) (new CrashReportPlayerCount(this))); - } - - return crashreport; - } - - public List a(ICommandListener icommandlistener, String s) { - // CraftBukkit start - Allow tab-completion of Bukkit commands - /* - ArrayList arraylist = new ArrayList(); - - if (s.startsWith("/")) { - s = s.substring(1); - boolean flag = !s.contains(" "); - List list = this.o.b(icommandlistener, s); - - if (list != null) { - Iterator iterator = list.iterator(); - - while (iterator.hasNext()) { - String s1 = (String) iterator.next(); - - if (flag) { - arraylist.add("/" + s1); - } else { - arraylist.add(s1); - } - } - } - - return arraylist; - } else { - String[] astring = s.split(" ", -1); - String s2 = astring[astring.length - 1]; - String[] astring1 = this.u.f(); - int i = astring1.length; - - for (int j = 0; j < i; ++j) { - String s3 = astring1[j]; - - if (CommandAbstract.a(s2, s3)) { - arraylist.add(s3); - } - } - - return arraylist; - } - */ - return this.server.tabComplete(icommandlistener, s); - // CraftBukkit end - } - - public static MinecraftServer getServer() { - return j; - } - - public String getName() { - return "Server"; - } - - public void sendMessage(IChatBaseComponent ichatbasecomponent) { - i.info(ichatbasecomponent.c()); - } - - public boolean a(int i, String s) { - return true; - } - - public ICommandHandler getCommandHandler() { - return this.o; - } - - public KeyPair K() { - return this.G; - } - - public int L() { - return this.t; - } - - public void setPort(int i) { - this.t = i; - } - - public String M() { - return this.H; - } - - public void j(String s) { - this.H = s; - } - - public boolean N() { - return this.H != null; - } - - public String O() { - return this.I; - } - - public void k(String s) { - this.I = s; - } - - public void a(KeyPair keypair) { - this.G = keypair; - } - - public void a(EnumDifficulty enumdifficulty) { - // CraftBukkit start - Use worlds list for iteration - for (int j = 0; j < this.worlds.size(); ++j) { - WorldServer worldserver = this.worlds.get(j); - // CraftBukkit end - - if (worldserver != null) { - if (worldserver.getWorldData().isHardcore()) { - worldserver.difficulty = EnumDifficulty.HARD; - worldserver.setSpawnFlags(true, true); - } else if (this.N()) { - worldserver.difficulty = enumdifficulty; - worldserver.setSpawnFlags(worldserver.difficulty != EnumDifficulty.PEACEFUL, true); - } else { - worldserver.difficulty = enumdifficulty; - worldserver.setSpawnFlags(this.getSpawnMonsters(), this.spawnAnimals); - } - } - } - } - - protected boolean getSpawnMonsters() { - return true; - } - - public boolean R() { - return this.demoMode; - } - - public void b(boolean flag) { - this.demoMode = flag; - } - - public void c(boolean flag) { - this.L = flag; - } - - public Convertable getConvertable() { - return this.convertable; - } - - public void U() { - this.M = true; - this.getConvertable().d(); - - // CraftBukkit start - for (int i = 0; i < this.worlds.size(); ++i) { - WorldServer worldserver = this.worlds.get(i); - // CraftBukkit end - - if (worldserver != null) { - worldserver.saveLevel(); - } - } - - this.getConvertable().e(this.worlds.get(0).getDataManager().g()); // CraftBukkit - this.safeShutdown(); - } - - public String getResourcePack() { - return this.N; - } - - public void setTexturePack(String s) { - this.N = s; - } - - public void a(MojangStatisticsGenerator mojangstatisticsgenerator) { - mojangstatisticsgenerator.a("whitelist_enabled", Boolean.valueOf(false)); - mojangstatisticsgenerator.a("whitelist_count", Integer.valueOf(0)); - mojangstatisticsgenerator.a("players_current", Integer.valueOf(this.C())); - mojangstatisticsgenerator.a("players_max", Integer.valueOf(this.D())); - mojangstatisticsgenerator.a("players_seen", Integer.valueOf(this.u.getSeenPlayers().length)); - mojangstatisticsgenerator.a("uses_auth", Boolean.valueOf(this.onlineMode)); - mojangstatisticsgenerator.a("gui_state", this.ak() ? "enabled" : "disabled"); - mojangstatisticsgenerator.a("run_time", Long.valueOf((ar() - mojangstatisticsgenerator.g()) / 60L * 1000L)); - mojangstatisticsgenerator.a("avg_tick_ms", Integer.valueOf((int) (MathHelper.a(this.g) * 1.0E-6D))); - int i = 0; - - // CraftBukkit start - use worlds list for iteration - for (int j = 0; j < this.worlds.size(); ++j) { - WorldServer worldserver = this.worlds.get(j); - if (worldServer != null) { - // CraftBukkit end - WorldData worlddata = worldserver.getWorldData(); - - mojangstatisticsgenerator.a("world[" + i + "][dimension]", Integer.valueOf(worldserver.worldProvider.dimension)); - mojangstatisticsgenerator.a("world[" + i + "][mode]", worlddata.getGameType()); - mojangstatisticsgenerator.a("world[" + i + "][difficulty]", worldserver.difficulty); - mojangstatisticsgenerator.a("world[" + i + "][hardcore]", Boolean.valueOf(worlddata.isHardcore())); - mojangstatisticsgenerator.a("world[" + i + "][generator_name]", worlddata.getType().name()); - mojangstatisticsgenerator.a("world[" + i + "][generator_version]", Integer.valueOf(worlddata.getType().getVersion())); - mojangstatisticsgenerator.a("world[" + i + "][height]", Integer.valueOf(this.E)); - mojangstatisticsgenerator.a("world[" + i + "][chunks_loaded]", Integer.valueOf(worldserver.L().getLoadedChunks())); - ++i; - } - } - - mojangstatisticsgenerator.a("worlds", Integer.valueOf(i)); - } - - public void b(MojangStatisticsGenerator mojangstatisticsgenerator) { - mojangstatisticsgenerator.b("singleplayer", Boolean.valueOf(this.N())); - mojangstatisticsgenerator.b("server_brand", this.getServerModName()); - mojangstatisticsgenerator.b("gui_supported", GraphicsEnvironment.isHeadless() ? "headless" : "supported"); - mojangstatisticsgenerator.b("dedicated", Boolean.valueOf(this.X())); - } - - public boolean getSnooperEnabled() { - return true; - } - - public abstract boolean X(); - - public boolean getOnlineMode() { - return this.server.getOnlineMode(); // CraftBukkit - } - - public void setOnlineMode(boolean flag) { - this.onlineMode = flag; - } - - public boolean getSpawnAnimals() { - return this.spawnAnimals; - } - - public void setSpawnAnimals(boolean flag) { - this.spawnAnimals = flag; - } - - public boolean getSpawnNPCs() { - return this.spawnNPCs; - } - - public void setSpawnNPCs(boolean flag) { - this.spawnNPCs = flag; - } - - public boolean getPvP() { - return this.pvpMode; - } - - public void setPvP(boolean flag) { - this.pvpMode = flag; - } - - public boolean getAllowFlight() { - return this.allowFlight; - } - - public void setAllowFlight(boolean flag) { - this.allowFlight = flag; - } - - public abstract boolean getEnableCommandBlock(); - - public String getMotd() { - return this.motd; - } - - public void setMotd(String s) { - this.motd = s; - } - - public int getMaxBuildHeight() { - return this.E; - } - - public void c(int i) { - this.E = i; - } - - public boolean isStopped() { - return this.isStopped; - } - - public PlayerList getPlayerList() { - return this.u; - } - - public void a(PlayerList playerlist) { - this.u = playerlist; - } - - public void a(EnumGamemode enumgamemode) { - // CraftBukkit start - use worlds list for iteration - for (int i = 0; i < this.worlds.size(); ++i) { - getServer().worlds.get(i).getWorldData().setGameType(enumgamemode); - // CraftBukkit end - } - } - - public ServerConnection ai() { - return this.p; - } - - public boolean ak() { - return false; - } - - public abstract String a(EnumGamemode enumgamemode, boolean flag); - - public int al() { - return this.ticks; - } - - public void am() { - this.R = true; - } - - public ChunkCoordinates getChunkCoordinates() { - return new ChunkCoordinates(0, 0, 0); - } - - public World getWorld() { - return this.worlds.get(0); // CraftBukkit - } - - public int getSpawnProtection() { - return 16; - } - - public boolean a(World world, int i, int j, int k, EntityHuman entityhuman) { - return false; - } - - public void setForceGamemode(boolean flag) { - this.S = flag; - } - - public boolean getForceGamemode() { - return this.S; - } - - public Proxy aq() { - return this.d; - } - - public static long ar() { - return System.currentTimeMillis(); - } - - public int getIdleTimeout() { - return this.F; - } - - public void setIdleTimeout(int i) { - this.F = i; - } - - public IChatBaseComponent getScoreboardDisplayName() { - return new ChatComponentText(this.getName()); - } - - public boolean at() { - return true; - } - - public MinecraftSessionService av() { - return this.U; - } - - public GameProfileRepository getGameProfileRepository() { - return this.W; - } - - public UserCache getUserCache() { - return this.X; - } - - public ServerPing ay() { - return this.q; - } - - public void az() { - this.V = 0L; - } - - public static Logger getLogger() { - return i; - } - - public static PlayerList a(MinecraftServer minecraftserver) { - return minecraftserver.u; - } -} diff --git a/src/main/java/net/minecraft/server/MobEffectList.java b/src/main/java/net/minecraft/server/MobEffectList.java deleted file mode 100644 index 6ec03bbe2e..0000000000 --- a/src/main/java/net/minecraft/server/MobEffectList.java +++ /dev/null @@ -1,231 +0,0 @@ -package net.minecraft.server; - -import java.util.Iterator; -import java.util.Map; -import java.util.UUID; -import java.util.Map.Entry; - -import net.minecraft.util.com.google.common.collect.Maps; - -// CraftBukkit start -import org.bukkit.craftbukkit.event.CraftEventFactory; -import org.bukkit.event.entity.EntityRegainHealthEvent.RegainReason; -// CraftBukkit end - -public class MobEffectList { - - public static final MobEffectList[] byId = new MobEffectList[32]; - public static final MobEffectList b = null; - public static final MobEffectList FASTER_MOVEMENT = (new MobEffectList(1, false, 8171462)).b("potion.moveSpeed").b(0, 0).a(GenericAttributes.d, "91AEAA56-376B-4498-935B-2F7F68070635", 0.20000000298023224D, 2); - public static final MobEffectList SLOWER_MOVEMENT = (new MobEffectList(2, true, 5926017)).b("potion.moveSlowdown").b(1, 0).a(GenericAttributes.d, "7107DE5E-7CE8-4030-940E-514C1F160890", -0.15000000596046448D, 2); - public static final MobEffectList FASTER_DIG = (new MobEffectList(3, false, 14270531)).b("potion.digSpeed").b(2, 0).a(1.5D); - public static final MobEffectList SLOWER_DIG = (new MobEffectList(4, true, 4866583)).b("potion.digSlowDown").b(3, 0); - public static final MobEffectList INCREASE_DAMAGE = (new MobEffectAttackDamage(5, false, 9643043)).b("potion.damageBoost").b(4, 0).a(GenericAttributes.e, "648D7064-6A60-4F59-8ABE-C2C23A6DD7A9", 3.0D, 2); - public static final MobEffectList HEAL = (new InstantMobEffect(6, false, 16262179)).b("potion.heal"); - public static final MobEffectList HARM = (new InstantMobEffect(7, true, 4393481)).b("potion.harm"); - public static final MobEffectList JUMP = (new MobEffectList(8, false, 7889559)).b("potion.jump").b(2, 1); - public static final MobEffectList CONFUSION = (new MobEffectList(9, true, 5578058)).b("potion.confusion").b(3, 1).a(0.25D); - public static final MobEffectList REGENERATION = (new MobEffectList(10, false, 13458603)).b("potion.regeneration").b(7, 0).a(0.25D); - public static final MobEffectList RESISTANCE = (new MobEffectList(11, false, 10044730)).b("potion.resistance").b(6, 1); - public static final MobEffectList FIRE_RESISTANCE = (new MobEffectList(12, false, 14981690)).b("potion.fireResistance").b(7, 1); - public static final MobEffectList WATER_BREATHING = (new MobEffectList(13, false, 3035801)).b("potion.waterBreathing").b(0, 2); - public static final MobEffectList INVISIBILITY = (new MobEffectList(14, false, 8356754)).b("potion.invisibility").b(0, 1); - public static final MobEffectList BLINDNESS = (new MobEffectList(15, true, 2039587)).b("potion.blindness").b(5, 1).a(0.25D); - public static final MobEffectList NIGHT_VISION = (new MobEffectList(16, false, 2039713)).b("potion.nightVision").b(4, 1); - public static final MobEffectList HUNGER = (new MobEffectList(17, true, 5797459)).b("potion.hunger").b(1, 1); - public static final MobEffectList WEAKNESS = (new MobEffectAttackDamage(18, true, 4738376)).b("potion.weakness").b(5, 0).a(GenericAttributes.e, "22653B89-116E-49DC-9B6B-9971489B5BE5", 2.0D, 0); - public static final MobEffectList POISON = (new MobEffectList(19, true, 5149489)).b("potion.poison").b(6, 0).a(0.25D); - public static final MobEffectList WITHER = (new MobEffectList(20, true, 3484199)).b("potion.wither").b(1, 2).a(0.25D); - public static final MobEffectList HEALTH_BOOST = (new MobEffectHealthBoost(21, false, 16284963)).b("potion.healthBoost").b(2, 2).a(GenericAttributes.maxHealth, "5D6F0BA2-1186-46AC-B896-C61C5CEE99CC", 4.0D, 0); - public static final MobEffectList ABSORPTION = (new MobEffectAbsorption(22, false, 2445989)).b("potion.absorption").b(2, 2); - public static final MobEffectList SATURATION = (new InstantMobEffect(23, false, 16262179)).b("potion.saturation"); - public static final MobEffectList z = null; - public static final MobEffectList A = null; - public static final MobEffectList B = null; - public static final MobEffectList C = null; - public static final MobEffectList D = null; - public static final MobEffectList E = null; - public static final MobEffectList F = null; - public static final MobEffectList G = null; - public final int id; - private final Map I = Maps.newHashMap(); - private final boolean J; - private final int K; - private String L = ""; - private int M = -1; - private double N; - private boolean O; - - protected MobEffectList(int i, boolean flag, int j) { - this.id = i; - byId[i] = this; - this.J = flag; - if (flag) { - this.N = 0.5D; - } else { - this.N = 1.0D; - } - - this.K = j; - - org.bukkit.potion.PotionEffectType.registerPotionEffectType(new org.bukkit.craftbukkit.potion.CraftPotionEffectType(this)); // CraftBukkit - } - - protected MobEffectList b(int i, int j) { - this.M = i + j * 8; - return this; - } - - public int getId() { - return this.id; - } - - public void tick(EntityLiving entityliving, int i) { - if (this.id == REGENERATION.id) { - if (entityliving.getHealth() < entityliving.getMaxHealth()) { - entityliving.heal(1.0F, RegainReason.MAGIC_REGEN); // CraftBukkit - } - } else if (this.id == POISON.id) { - if (entityliving.getHealth() > 1.0F) { - entityliving.damageEntity(CraftEventFactory.POISON, 1.0F); // CraftBukkit - DamageSource.MAGIC -> CraftEventFactory.POISON - } - } else if (this.id == WITHER.id) { - entityliving.damageEntity(DamageSource.WITHER, 1.0F); - } else if (this.id == HUNGER.id && entityliving instanceof EntityHuman) { - ((EntityHuman) entityliving).applyExhaustion(0.025F * (float) (i + 1)); - } else if (this.id == SATURATION.id && entityliving instanceof EntityHuman) { - if (!entityliving.world.isStatic) { - // CraftBukkit start - EntityHuman entityhuman = (EntityHuman) entityliving; - int oldFoodLevel = entityhuman.getFoodData().foodLevel; - - org.bukkit.event.entity.FoodLevelChangeEvent event = CraftEventFactory.callFoodLevelChangeEvent(entityhuman, i + 1 + oldFoodLevel); - - if (!event.isCancelled()) { - entityhuman.getFoodData().eat(event.getFoodLevel() - oldFoodLevel, 1.0F); - } - - ((EntityPlayer) entityhuman).playerConnection.sendPacket(new PacketPlayOutUpdateHealth(((EntityPlayer) entityhuman).getBukkitEntity().getScaledHealth(), entityhuman.getFoodData().foodLevel, entityhuman.getFoodData().saturationLevel)); - // CraftBukkit end - } - } else if ((this.id != HEAL.id || entityliving.aR()) && (this.id != HARM.id || !entityliving.aR())) { - if (this.id == HARM.id && !entityliving.aR() || this.id == HEAL.id && entityliving.aR()) { - entityliving.damageEntity(DamageSource.MAGIC, (float) (6 << i)); - } - } else { - entityliving.heal((float) Math.max(4 << i, 0), RegainReason.MAGIC); // CraftBukkit - } - } - - public void applyInstantEffect(EntityLiving entityliving, EntityLiving entityliving1, int i, double d0) { - // CraftBukkit start - Delegate; we need EntityPotion - applyInstantEffect(entityliving, entityliving1, i, d0, null); - } - - public void applyInstantEffect(EntityLiving entityliving, EntityLiving entityliving1, int i, double d0, EntityPotion potion) { - // CraftBukkit end - int j; - - if ((this.id != HEAL.id || entityliving1.aR()) && (this.id != HARM.id || !entityliving1.aR())) { - if (this.id == HARM.id && !entityliving1.aR() || this.id == HEAL.id && entityliving1.aR()) { - j = (int) (d0 * (double) (6 << i) + 0.5D); - if (entityliving == null) { - entityliving1.damageEntity(DamageSource.MAGIC, (float) j); - } else { - // CraftBukkit - The "damager" needs to be the potion - entityliving1.damageEntity(DamageSource.b(potion != null ? potion : entityliving1, entityliving), (float) j); - } - } - } else { - j = (int) (d0 * (double) (4 << i) + 0.5D); - entityliving1.heal((float) j, RegainReason.MAGIC); // CraftBukkit - } - } - - public boolean isInstant() { - return false; - } - - public boolean a(int i, int j) { - int k; - - if (this.id == REGENERATION.id) { - k = 50 >> j; - return k > 0 ? i % k == 0 : true; - } else if (this.id == POISON.id) { - k = 25 >> j; - return k > 0 ? i % k == 0 : true; - } else if (this.id == WITHER.id) { - k = 40 >> j; - return k > 0 ? i % k == 0 : true; - } else { - return this.id == HUNGER.id; - } - } - - public MobEffectList b(String s) { - this.L = s; - return this; - } - - public String a() { - return this.L; - } - - protected MobEffectList a(double d0) { - this.N = d0; - return this; - } - - public double getDurationModifier() { - return this.N; - } - - public boolean i() { - return this.O; - } - - public int j() { - return this.K; - } - - public MobEffectList a(IAttribute iattribute, String s, double d0, int i) { - AttributeModifier attributemodifier = new AttributeModifier(UUID.fromString(s), this.a(), d0, i); - - this.I.put(iattribute, attributemodifier); - return this; - } - - public void a(EntityLiving entityliving, AttributeMapBase attributemapbase, int i) { - Iterator iterator = this.I.entrySet().iterator(); - - while (iterator.hasNext()) { - Entry entry = (Entry) iterator.next(); - AttributeInstance attributeinstance = attributemapbase.a((IAttribute) entry.getKey()); - - if (attributeinstance != null) { - attributeinstance.b((AttributeModifier) entry.getValue()); - } - } - } - - public void b(EntityLiving entityliving, AttributeMapBase attributemapbase, int i) { - Iterator iterator = this.I.entrySet().iterator(); - - while (iterator.hasNext()) { - Entry entry = (Entry) iterator.next(); - AttributeInstance attributeinstance = attributemapbase.a((IAttribute) entry.getKey()); - - if (attributeinstance != null) { - AttributeModifier attributemodifier = (AttributeModifier) entry.getValue(); - - attributeinstance.b(attributemodifier); - attributeinstance.a(new AttributeModifier(attributemodifier.a(), this.a() + " " + i, this.a(i, attributemodifier), attributemodifier.c())); - } - } - } - - public double a(int i, AttributeModifier attributemodifier) { - return attributemodifier.d() * (double) (i + 1); - } -} diff --git a/src/main/java/net/minecraft/server/MobSpawnerAbstract.java b/src/main/java/net/minecraft/server/MobSpawnerAbstract.java deleted file mode 100644 index 93bb1adc29..0000000000 --- a/src/main/java/net/minecraft/server/MobSpawnerAbstract.java +++ /dev/null @@ -1,286 +0,0 @@ -package net.minecraft.server; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.Iterator; -import java.util.List; - -import org.bukkit.event.entity.CreatureSpawnEvent; // CraftBukkit - -public abstract class MobSpawnerAbstract { - - public int spawnDelay = 20; - private String mobName = "Pig"; - private List mobs; - private TileEntityMobSpawnerData spawnData; - public double c; - public double d; - 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; - - public MobSpawnerAbstract() {} - - public String getMobName() { - if (this.i() == null) { - if (this.mobName.equals("Minecart")) { - this.mobName = "MinecartRideable"; - } - - return this.mobName; - } else { - return this.i().c; - } - } - - public void setMobName(String s) { - this.mobName = s; - } - - public boolean f() { - return this.a().findNearbyPlayer((double) this.b() + 0.5D, (double) this.c() + 0.5D, (double) this.d() + 0.5D, (double) this.requiredPlayerRange) != null; - } - - public void g() { - if (this.f()) { - double d0; - - if (this.a().isStatic) { - double d1 = (double) ((float) this.b() + this.a().random.nextFloat()); - double d2 = (double) ((float) this.c() + this.a().random.nextFloat()); - - d0 = (double) ((float) this.d() + this.a().random.nextFloat()); - this.a().addParticle("smoke", d1, d2, d0, 0.0D, 0.0D, 0.0D); - this.a().addParticle("flame", d1, d2, d0, 0.0D, 0.0D, 0.0D); - if (this.spawnDelay > 0) { - --this.spawnDelay; - } - - this.d = this.c; - this.c = (this.c + (double) (1000.0F / ((float) this.spawnDelay + 200.0F))) % 360.0D; - } else { - if (this.spawnDelay == -1) { - this.j(); - } - - if (this.spawnDelay > 0) { - --this.spawnDelay; - return; - } - - boolean flag = false; - - for (int i = 0; i < this.spawnCount; ++i) { - Entity entity = EntityTypes.createEntityByName(this.getMobName(), this.a()); - - if (entity == null) { - return; - } - - int j = this.a().a(entity.getClass(), AxisAlignedBB.a((double) this.b(), (double) this.c(), (double) this.d(), (double) (this.b() + 1), (double) (this.c() + 1), (double) (this.d() + 1)).grow((double) (this.spawnRange * 2), 4.0D, (double) (this.spawnRange * 2))).size(); - - if (j >= this.maxNearbyEntities) { - this.j(); - return; - } - - d0 = (double) this.b() + (this.a().random.nextDouble() - this.a().random.nextDouble()) * (double) this.spawnRange; - double d3 = (double) (this.c() + this.a().random.nextInt(3) - 1); - double d4 = (double) this.d() + (this.a().random.nextDouble() - this.a().random.nextDouble()) * (double) this.spawnRange; - EntityInsentient entityinsentient = entity instanceof EntityInsentient ? (EntityInsentient) entity : null; - - entity.setPositionRotation(d0, d3, d4, this.a().random.nextFloat() * 360.0F, 0.0F); - if (entityinsentient == null || entityinsentient.canSpawn()) { - this.a(entity); - this.a().triggerEffect(2004, this.b(), this.c(), this.d(), 0); - if (entityinsentient != null) { - entityinsentient.s(); - } - - flag = true; - } - } - - if (flag) { - this.j(); - } - } - } - } - - public Entity a(Entity entity) { - if (this.i() != null) { - NBTTagCompound nbttagcompound = new NBTTagCompound(); - - entity.d(nbttagcompound); - Iterator iterator = this.i().b.c().iterator(); - - while (iterator.hasNext()) { - String s = (String) iterator.next(); - NBTBase nbtbase = this.i().b.get(s); - - nbttagcompound.set(s, nbtbase.clone()); - } - - entity.f(nbttagcompound); - if (entity.world != null) { - entity.world.addEntity(entity, CreatureSpawnEvent.SpawnReason.SPAWNER); // CraftBukkit - } - - NBTTagCompound nbttagcompound1; - - for (Entity entity1 = entity; nbttagcompound.hasKeyOfType("Riding", 10); nbttagcompound = nbttagcompound1) { - nbttagcompound1 = nbttagcompound.getCompound("Riding"); - Entity entity2 = EntityTypes.createEntityByName(nbttagcompound1.getString("id"), entity.world); - - if (entity2 != null) { - NBTTagCompound nbttagcompound2 = new NBTTagCompound(); - - entity2.d(nbttagcompound2); - Iterator iterator1 = nbttagcompound1.c().iterator(); - - while (iterator1.hasNext()) { - String s1 = (String) iterator1.next(); - NBTBase nbtbase1 = nbttagcompound1.get(s1); - - nbttagcompound2.set(s1, nbtbase1.clone()); - } - - entity2.f(nbttagcompound2); - entity2.setPositionRotation(entity1.locX, entity1.locY, entity1.locZ, entity1.yaw, entity1.pitch); - if (entity.world != null) { - entity.world.addEntity(entity2, CreatureSpawnEvent.SpawnReason.SPAWNER); // CraftBukkit - } - - entity1.mount(entity2); - } - - entity1 = entity2; - } - } else if (entity instanceof EntityLiving && entity.world != null) { - ((EntityInsentient) entity).prepare((GroupDataEntity) null); - this.a().addEntity(entity, CreatureSpawnEvent.SpawnReason.SPAWNER); // CraftBukkit - } - - return entity; - } - - private void j() { - if (this.maxSpawnDelay <= this.minSpawnDelay) { - this.spawnDelay = this.minSpawnDelay; - } else { - int i = this.maxSpawnDelay - this.minSpawnDelay; - - this.spawnDelay = this.minSpawnDelay + this.a().random.nextInt(i); - } - - if (this.mobs != null && this.mobs.size() > 0) { - this.a((TileEntityMobSpawnerData) WeightedRandom.a(this.a().random, (Collection) this.mobs)); - } - - this.a(1); - } - - public void a(NBTTagCompound nbttagcompound) { - this.mobName = nbttagcompound.getString("EntityId"); - this.spawnDelay = nbttagcompound.getShort("Delay"); - if (nbttagcompound.hasKeyOfType("SpawnPotentials", 9)) { - this.mobs = new ArrayList(); - NBTTagList nbttaglist = nbttagcompound.getList("SpawnPotentials", 10); - - for (int i = 0; i < nbttaglist.size(); ++i) { - this.mobs.add(new TileEntityMobSpawnerData(this, nbttaglist.get(i))); - } - } else { - this.mobs = null; - } - - if (nbttagcompound.hasKeyOfType("SpawnData", 10)) { - this.a(new TileEntityMobSpawnerData(this, nbttagcompound.getCompound("SpawnData"), this.mobName)); - } else { - this.a((TileEntityMobSpawnerData) null); - } - - if (nbttagcompound.hasKeyOfType("MinSpawnDelay", 99)) { - this.minSpawnDelay = nbttagcompound.getShort("MinSpawnDelay"); - this.maxSpawnDelay = nbttagcompound.getShort("MaxSpawnDelay"); - this.spawnCount = nbttagcompound.getShort("SpawnCount"); - } - - if (nbttagcompound.hasKeyOfType("MaxNearbyEntities", 99)) { - this.maxNearbyEntities = nbttagcompound.getShort("MaxNearbyEntities"); - this.requiredPlayerRange = nbttagcompound.getShort("RequiredPlayerRange"); - } - - if (nbttagcompound.hasKeyOfType("SpawnRange", 99)) { - this.spawnRange = nbttagcompound.getShort("SpawnRange"); - } - - if (this.a() != null && this.a().isStatic) { - this.j = null; - } - } - - public void b(NBTTagCompound nbttagcompound) { - nbttagcompound.setString("EntityId", this.getMobName()); - nbttagcompound.setShort("Delay", (short) this.spawnDelay); - nbttagcompound.setShort("MinSpawnDelay", (short) this.minSpawnDelay); - nbttagcompound.setShort("MaxSpawnDelay", (short) this.maxSpawnDelay); - nbttagcompound.setShort("SpawnCount", (short) this.spawnCount); - nbttagcompound.setShort("MaxNearbyEntities", (short) this.maxNearbyEntities); - nbttagcompound.setShort("RequiredPlayerRange", (short) this.requiredPlayerRange); - nbttagcompound.setShort("SpawnRange", (short) this.spawnRange); - if (this.i() != null) { - nbttagcompound.set("SpawnData", this.i().b.clone()); - } - - if (this.i() != 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.i().a()); - } - - nbttagcompound.set("SpawnPotentials", nbttaglist); - } - } - - public boolean b(int i) { - if (i == 1 && this.a().isStatic) { - this.spawnDelay = this.minSpawnDelay; - return true; - } else { - return false; - } - } - - public TileEntityMobSpawnerData i() { - return this.spawnData; - } - - public void a(TileEntityMobSpawnerData tileentitymobspawnerdata) { - this.spawnData = tileentitymobspawnerdata; - } - - public abstract void a(int i); - - public abstract World a(); - - public abstract int b(); - - public abstract int c(); - - public abstract int d(); -} diff --git a/src/main/java/net/minecraft/server/NameReferencingFileConverter.java b/src/main/java/net/minecraft/server/NameReferencingFileConverter.java deleted file mode 100644 index ce66cca16d..0000000000 --- a/src/main/java/net/minecraft/server/NameReferencingFileConverter.java +++ /dev/null @@ -1,402 +0,0 @@ -package net.minecraft.server; - -import java.io.File; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.text.ParseException; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Date; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Locale; -import java.util.Map; -import java.util.UUID; - -import net.minecraft.util.com.google.common.base.Charsets; -import net.minecraft.util.com.google.common.collect.Iterators; -import net.minecraft.util.com.google.common.collect.Lists; -import net.minecraft.util.com.google.common.collect.Maps; -import net.minecraft.util.com.google.common.io.Files; -import net.minecraft.util.com.mojang.authlib.Agent; -import net.minecraft.util.com.mojang.authlib.GameProfile; -import net.minecraft.util.com.mojang.authlib.ProfileLookupCallback; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; - -// CraftBukkit - Imported for package private static methods - -public class NameReferencingFileConverter { - - private static final Logger e = LogManager.getLogger(); - public static final File a = new File("banned-ips.txt"); - public static final File b = new File("banned-players.txt"); - public static final File c = new File("ops.txt"); - public static final File d = new File("white-list.txt"); - - static List a(File file1, Map map) throws IOException { // CraftBukkit - Added throws - List list = Files.readLines(file1, Charsets.UTF_8); - Iterator iterator = list.iterator(); - - while (iterator.hasNext()) { - String s = (String) iterator.next(); - - s = s.trim(); - if (!s.startsWith("#") && s.length() >= 1) { - String[] astring = s.split("\\|"); - - map.put(astring[0].toLowerCase(Locale.ROOT), astring); - } - } - - return list; - } - - private static void a(MinecraftServer minecraftserver, Collection collection, ProfileLookupCallback profilelookupcallback) { - String[] astring = (String[]) Iterators.toArray(Iterators.filter(collection.iterator(), new PredicateEmptyList()), String.class); - - if (minecraftserver.getOnlineMode()) { - minecraftserver.getGameProfileRepository().findProfilesByNames(astring, Agent.MINECRAFT, profilelookupcallback); - } else { - String[] astring1 = astring; - int i = astring.length; - - for (int j = 0; j < i; ++j) { - String s = astring1[j]; - UUID uuid = EntityHuman.a(new GameProfile((UUID) null, s)); - GameProfile gameprofile = new GameProfile(uuid, s); - - profilelookupcallback.onProfileLookupSucceeded(gameprofile); - } - } - } - - public static boolean a(MinecraftServer minecraftserver) { - GameProfileBanList gameprofilebanlist = new GameProfileBanList(PlayerList.a); - - if (b.exists() && b.isFile()) { - if (gameprofilebanlist.c().exists()) { - try { - gameprofilebanlist.load(); - // CraftBukkit start - FileNotFoundException -> IOException, don't print stacetrace - } catch (IOException filenotfoundexception) { - e.warn("Could not load existing file " + gameprofilebanlist.c().getName() + ", " + filenotfoundexception.getMessage()); - } - // CraftBukkit end - } - - try { - HashMap hashmap = Maps.newHashMap(); - - a(b, (Map) hashmap); - GameProfileBanListEntryConverter gameprofilebanlistentryconverter = new GameProfileBanListEntryConverter(minecraftserver, hashmap, gameprofilebanlist); - - a(minecraftserver, hashmap.keySet(), gameprofilebanlistentryconverter); - gameprofilebanlist.save(); - c(b); - return true; - } catch (IOException ioexception) { - e.warn("Could not read old user banlist to convert it!", ioexception); - return false; - } catch (FileConversionException fileconversionexception) { - e.error("Conversion failed, please try again later", fileconversionexception); - return false; - } - } else { - return true; - } - } - - public static boolean b(MinecraftServer minecraftserver) { - IpBanList ipbanlist = new IpBanList(PlayerList.b); - - if (a.exists() && a.isFile()) { - if (ipbanlist.c().exists()) { - try { - ipbanlist.load(); - // CraftBukkit start - FileNotFoundException -> IOException, don't print stacetrace - } catch (IOException filenotfoundexception) { - e.warn("Could not load existing file " + ipbanlist.c().getName() + ", " + filenotfoundexception.getMessage()); - } - // CraftBukkit end - } - - try { - HashMap hashmap = Maps.newHashMap(); - - a(a, (Map) hashmap); - Iterator iterator = hashmap.keySet().iterator(); - - while (iterator.hasNext()) { - String s = (String) iterator.next(); - String[] astring = (String[]) hashmap.get(s); - Date date = astring.length > 1 ? b(astring[1], (Date) null) : null; - String s1 = astring.length > 2 ? astring[2] : null; - Date date1 = astring.length > 3 ? b(astring[3], (Date) null) : null; - String s2 = astring.length > 4 ? astring[4] : null; - - ipbanlist.add(new IpBanEntry(s, date, s1, date1, s2)); - } - - ipbanlist.save(); - c(a); - return true; - } catch (IOException ioexception) { - e.warn("Could not parse old ip banlist to convert it!", ioexception); - return false; - } - } else { - return true; - } - } - - public static boolean c(MinecraftServer minecraftserver) { - OpList oplist = new OpList(PlayerList.c); - - if (c.exists() && c.isFile()) { - if (oplist.c().exists()) { - try { - oplist.load(); - // CraftBukkit start - FileNotFoundException -> IOException, don't print stacetrace - } catch (IOException filenotfoundexception) { - e.warn("Could not load existing file " + oplist.c().getName() + ", " + filenotfoundexception.getMessage()); - } - // CraftBukkit end - } - - try { - List list = Files.readLines(c, Charsets.UTF_8); - OpListProfileCallback oplistprofilecallback = new OpListProfileCallback(minecraftserver, oplist); - - a(minecraftserver, list, oplistprofilecallback); - oplist.save(); - c(c); - return true; - } catch (IOException ioexception) { - e.warn("Could not read old oplist to convert it!", ioexception); - return false; - } catch (FileConversionException fileconversionexception) { - e.error("Conversion failed, please try again later", fileconversionexception); - return false; - } - } else { - return true; - } - } - - public static boolean d(MinecraftServer minecraftserver) { - WhiteList whitelist = new WhiteList(PlayerList.d); - - if (d.exists() && d.isFile()) { - if (whitelist.c().exists()) { - try { - whitelist.load(); - // CraftBukkit start - FileNotFoundException -> IOException, don't print stacetrace - } catch (IOException filenotfoundexception) { - e.warn("Could not load existing file " + whitelist.c().getName() + ", " + filenotfoundexception.getMessage()); - } - // CraftBukkit end - } - - try { - List list = Files.readLines(d, Charsets.UTF_8); - WhiteListProfileCallback whitelistprofilecallback = new WhiteListProfileCallback(minecraftserver, whitelist); - - a(minecraftserver, list, whitelistprofilecallback); - whitelist.save(); - c(d); - return true; - } catch (IOException ioexception) { - e.warn("Could not read old whitelist to convert it!", ioexception); - return false; - } catch (FileConversionException fileconversionexception) { - e.error("Conversion failed, please try again later", fileconversionexception); - return false; - } - } else { - return true; - } - } - - public static String a(String s) { - if (!UtilColor.b(s) && s.length() <= 16) { - MinecraftServer minecraftserver = MinecraftServer.getServer(); - GameProfile gameprofile = minecraftserver.getUserCache().getProfile(s); - - if (gameprofile != null && gameprofile.getId() != null) { - return gameprofile.getId().toString(); - } else if (!minecraftserver.N() && minecraftserver.getOnlineMode()) { - ArrayList arraylist = Lists.newArrayList(); - GameProfileLookupCallback gameprofilelookupcallback = new GameProfileLookupCallback(minecraftserver, arraylist); - - a(minecraftserver, Lists.newArrayList(new String[] { s}), gameprofilelookupcallback); - return arraylist.size() > 0 && ((GameProfile) arraylist.get(0)).getId() != null ? ((GameProfile) arraylist.get(0)).getId().toString() : ""; - } else { - return EntityHuman.a(new GameProfile((UUID) null, s)).toString(); - } - } else { - return s; - } - } - - public static boolean a(DedicatedServer dedicatedserver, PropertyManager propertymanager) { - File file1 = d(propertymanager); - File file2 = new File(file1.getParentFile(), "playerdata"); - File file3 = new File(file1.getParentFile(), "unknownplayers"); - - if (file1.exists() && file1.isDirectory()) { - File[] afile = file1.listFiles(); - ArrayList arraylist = Lists.newArrayList(); - File[] afile1 = afile; - int i = afile.length; - - for (int j = 0; j < i; ++j) { - File file4 = afile1[j]; - String s = file4.getName(); - - if (s.toLowerCase(Locale.ROOT).endsWith(".dat")) { - String s1 = s.substring(0, s.length() - ".dat".length()); - - if (s1.length() > 0) { - arraylist.add(s1); - } - } - } - - try { - String[] astring = (String[]) arraylist.toArray(new String[arraylist.size()]); - PlayerDatFileConverter playerdatfileconverter = new PlayerDatFileConverter(dedicatedserver, file2, file3, file1, astring); - - a(dedicatedserver, Lists.newArrayList(astring), playerdatfileconverter); - return true; - } catch (FileConversionException fileconversionexception) { - e.error("Conversion failed, please try again later", fileconversionexception); - return false; - } - } else { - return true; - } - } - - private static void b(File file1) { - if (file1.exists()) { - if (!file1.isDirectory()) { - throw new FileConversionException("Can\'t create directory " + file1.getName() + " in world save directory.", (PredicateEmptyList) null); - } - } else if (!file1.mkdirs()) { - throw new FileConversionException("Can\'t create directory " + file1.getName() + " in world save directory.", (PredicateEmptyList) null); - } - } - - public static boolean a(PropertyManager propertymanager) { - boolean flag = b(propertymanager); - - flag = flag && c(propertymanager); - return flag; - } - - private static boolean b(PropertyManager propertymanager) { - boolean flag = false; - - if (b.exists() && b.isFile()) { - flag = true; - } - - boolean flag1 = false; - - if (a.exists() && a.isFile()) { - flag1 = true; - } - - boolean flag2 = false; - - if (c.exists() && c.isFile()) { - flag2 = true; - } - - boolean flag3 = false; - - if (d.exists() && d.isFile()) { - flag3 = true; - } - - if (!flag && !flag1 && !flag2 && !flag3) { - return true; - } else { - e.warn("**** FAILED TO START THE SERVER AFTER ACCOUNT CONVERSION!"); - e.warn("** please remove the following files and restart the server:"); - if (flag) { - e.warn("* " + b.getName()); - } - - if (flag1) { - e.warn("* " + a.getName()); - } - - if (flag2) { - e.warn("* " + c.getName()); - } - - if (flag3) { - e.warn("* " + d.getName()); - } - - return false; - } - } - - private static boolean c(PropertyManager propertymanager) { - File file1 = d(propertymanager); - - if (file1.exists() && file1.isDirectory()) { - String[] astring = file1.list(new DatFilenameFilter()); - - if (astring.length > 0) { - e.warn("**** DETECTED OLD PLAYER FILES IN THE WORLD SAVE"); - e.warn("**** THIS USUALLY HAPPENS WHEN THE AUTOMATIC CONVERSION FAILED IN SOME WAY"); - e.warn("** please restart the server and if the problem persists, remove the directory \'{}\'", new Object[] { file1.getPath()}); - return false; - } - } - - return true; - } - - private static File d(PropertyManager propertymanager) { - String s = propertymanager.getString("level-name", "world"); - File file1 = new File(MinecraftServer.getServer().server.getWorldContainer(), s); // CraftBukkit - Respect container setting - - return new File(file1, "players"); - } - - private static void c(File file1) { - File file2 = new File(file1.getName() + ".converted"); - - file1.renameTo(file2); - } - - private static Date b(String s, Date date) { - Date date1; - - try { - date1 = ExpirableListEntry.a.parse(s); - } catch (ParseException parseexception) { - date1 = date; - } - - return date1; - } - - static Logger a() { - return e; - } - - static Date a(String s, Date date) { - return b(s, date); - } - - static void a(File file1) { - b(file1); - } -} diff --git a/src/main/java/net/minecraft/server/NetworkManager.java b/src/main/java/net/minecraft/server/NetworkManager.java deleted file mode 100644 index 1b080c7787..0000000000 --- a/src/main/java/net/minecraft/server/NetworkManager.java +++ /dev/null @@ -1,210 +0,0 @@ -package net.minecraft.server; - -import java.net.SocketAddress; -import java.util.Queue; -import javax.crypto.SecretKey; - -import net.minecraft.util.com.google.common.collect.Queues; -import net.minecraft.util.com.google.common.util.concurrent.ThreadFactoryBuilder; -import net.minecraft.util.io.netty.channel.Channel; -import net.minecraft.util.io.netty.channel.ChannelFutureListener; -import net.minecraft.util.io.netty.channel.ChannelHandlerContext; -import net.minecraft.util.io.netty.channel.SimpleChannelInboundHandler; -import net.minecraft.util.io.netty.channel.local.LocalChannel; -import net.minecraft.util.io.netty.channel.local.LocalServerChannel; -import net.minecraft.util.io.netty.channel.nio.NioEventLoopGroup; -import net.minecraft.util.io.netty.handler.timeout.TimeoutException; -import net.minecraft.util.io.netty.util.AttributeKey; -import net.minecraft.util.io.netty.util.concurrent.GenericFutureListener; -import net.minecraft.util.org.apache.commons.lang3.Validate; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; -import org.apache.logging.log4j.Marker; -import org.apache.logging.log4j.MarkerManager; - -public class NetworkManager extends SimpleChannelInboundHandler { - - private static final Logger i = LogManager.getLogger(); - public static final Marker a = MarkerManager.getMarker("NETWORK"); - public static final Marker b = MarkerManager.getMarker("NETWORK_PACKETS", a); - public static final Marker c = MarkerManager.getMarker("NETWORK_STAT", a); - public static final AttributeKey d = new AttributeKey("protocol"); - public static final AttributeKey e = new AttributeKey("receivable_packets"); - public static final AttributeKey f = new AttributeKey("sendable_packets"); - public static final NioEventLoopGroup g = new NioEventLoopGroup(0, (new ThreadFactoryBuilder()).setNameFormat("Netty Client IO #%d").setDaemon(true).build()); - public static final NetworkStatistics h = new NetworkStatistics(); - private final boolean j; - private final Queue k = Queues.newConcurrentLinkedQueue(); - private final Queue l = Queues.newConcurrentLinkedQueue(); - private Channel m; - private SocketAddress n; - private PacketListener o; - private EnumProtocol p; - private IChatBaseComponent q; - private boolean r; - - public NetworkManager(boolean flag) { - this.j = flag; - } - - public void channelActive(ChannelHandlerContext channelhandlercontext) throws Exception { // CraftBukkit - throws Exception - super.channelActive(channelhandlercontext); - this.m = channelhandlercontext.channel(); - this.n = this.m.remoteAddress(); - this.a(EnumProtocol.HANDSHAKING); - } - - public void a(EnumProtocol enumprotocol) { - this.p = (EnumProtocol) this.m.attr(d).getAndSet(enumprotocol); - this.m.attr(e).set(enumprotocol.a(this.j)); - this.m.attr(f).set(enumprotocol.b(this.j)); - this.m.config().setAutoRead(true); - i.debug("Enabled auto read"); - } - - public void channelInactive(ChannelHandlerContext channelhandlercontext) { - this.close(new ChatMessage("disconnect.endOfStream", new Object[0])); - } - - public void exceptionCaught(ChannelHandlerContext channelhandlercontext, Throwable throwable) { - ChatMessage chatmessage; - - if (throwable instanceof TimeoutException) { - chatmessage = new ChatMessage("disconnect.timeout", new Object[0]); - } else { - chatmessage = new ChatMessage("disconnect.genericReason", new Object[] { "Internal Exception: " + throwable}); - } - - this.close(chatmessage); - } - - protected void a(ChannelHandlerContext channelhandlercontext, Packet packet) { - if (this.m.isOpen()) { - if (packet.a()) { - packet.handle(this.o); - } else { - this.k.add(packet); - } - } - } - - public void a(PacketListener packetlistener) { - Validate.notNull(packetlistener, "packetListener", new Object[0]); - i.debug("Set listener of {} to {}", new Object[] { this, packetlistener}); - this.o = packetlistener; - } - - public void handle(Packet packet, GenericFutureListener... agenericfuturelistener) { - if (this.m != null && this.m.isOpen()) { - this.i(); - this.b(packet, agenericfuturelistener); - } else { - this.l.add(new QueuedPacket(packet, agenericfuturelistener)); - } - } - - private void b(Packet packet, GenericFutureListener[] agenericfuturelistener) { - EnumProtocol enumprotocol = EnumProtocol.a(packet); - EnumProtocol enumprotocol1 = (EnumProtocol) this.m.attr(d).get(); - - if (enumprotocol1 != enumprotocol) { - i.debug("Disabled auto read"); - this.m.config().setAutoRead(false); - } - - if (this.m.eventLoop().inEventLoop()) { - if (enumprotocol != enumprotocol1) { - this.a(enumprotocol); - } - - this.m.writeAndFlush(packet).addListeners(agenericfuturelistener).addListener(ChannelFutureListener.FIRE_EXCEPTION_ON_FAILURE); - } else { - this.m.eventLoop().execute(new QueuedProtocolSwitch(this, enumprotocol, enumprotocol1, packet, agenericfuturelistener)); - } - } - - private void i() { - if (this.m != null && this.m.isOpen()) { - while (!this.l.isEmpty()) { - QueuedPacket queuedpacket = (QueuedPacket) this.l.poll(); - - this.b(QueuedPacket.a(queuedpacket), QueuedPacket.b(queuedpacket)); - } - } - } - - public void a() { - this.i(); - EnumProtocol enumprotocol = (EnumProtocol) this.m.attr(d).get(); - - if (this.p != enumprotocol) { - if (this.p != null) { - this.o.a(this.p, enumprotocol); - } - - this.p = enumprotocol; - } - - if (this.o != null) { - for (int i = 1000; !this.k.isEmpty() && i >= 0; --i) { - Packet packet = (Packet) this.k.poll(); - - // CraftBukkit start - if (!this.isConnected() || !this.m.config().isAutoRead()) { - continue; - } - // CraftBukkit end - packet.handle(this.o); - } - - this.o.a(); - } - - this.m.flush(); - } - - public SocketAddress getSocketAddress() { - return this.n; - } - - public void close(IChatBaseComponent ichatbasecomponent) { - if (this.m.isOpen()) { - this.m.close(); - this.q = ichatbasecomponent; - } - } - - public boolean c() { - return this.m instanceof LocalChannel || this.m instanceof LocalServerChannel; - } - - public void a(SecretKey secretkey) { - this.m.pipeline().addBefore("splitter", "decrypt", new PacketDecrypter(MinecraftEncryption.a(2, secretkey))); - this.m.pipeline().addBefore("prepender", "encrypt", new PacketEncrypter(MinecraftEncryption.a(1, secretkey))); - this.r = true; - } - - public boolean isConnected() { - return this.m != null && this.m.isOpen(); - } - - public PacketListener getPacketListener() { - return this.o; - } - - public IChatBaseComponent f() { - return this.q; - } - - public void g() { - this.m.config().setAutoRead(false); - } - - protected void channelRead0(ChannelHandlerContext channelhandlercontext, Object object) { - this.a(channelhandlercontext, (Packet) object); - } - - static Channel a(NetworkManager networkmanager) { - return networkmanager.m; - } -} diff --git a/src/main/java/net/minecraft/server/Packet.java b/src/main/java/net/minecraft/server/Packet.java deleted file mode 100644 index 592ffc585c..0000000000 --- a/src/main/java/net/minecraft/server/Packet.java +++ /dev/null @@ -1,63 +0,0 @@ -package net.minecraft.server; - -import java.io.IOException; - -import net.minecraft.util.com.google.common.collect.BiMap; -import net.minecraft.util.io.netty.buffer.ByteBuf; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; - -public abstract class Packet { - - private static final Logger a = LogManager.getLogger(); - public final long timestamp = System.currentTimeMillis(); // CraftBukkit - - public Packet() {} - - public static Packet a(BiMap bimap, int i) { - try { - Class oclass = (Class) bimap.get(Integer.valueOf(i)); - - return oclass == null ? null : (Packet) oclass.newInstance(); - } catch (Exception exception) { - a.error("Couldn\'t create packet " + i, exception); - return null; - } - } - - public static void a(ByteBuf bytebuf, byte[] abyte) { - bytebuf.writeShort(abyte.length); - bytebuf.writeBytes(abyte); - } - - public static byte[] a(ByteBuf bytebuf) throws IOException { // CraftBukkit - added throws - short short1 = bytebuf.readShort(); - - if (short1 < 0) { - throw new IOException("Key was smaller than nothing! Weird key!"); - } else { - byte[] abyte = new byte[short1]; - - bytebuf.readBytes(abyte); - return abyte; - } - } - - public abstract void a(PacketDataSerializer packetdataserializer) throws IOException; // CraftBukkit - added throws - - public abstract void b(PacketDataSerializer packetdataserializer) throws IOException; // CraftBukkit - added throws - - public abstract void handle(PacketListener packetlistener); - - public boolean a() { - return false; - } - - public String toString() { - return this.getClass().getSimpleName(); - } - - public String b() { - return ""; - } -} diff --git a/src/main/java/net/minecraft/server/PacketDataSerializer.java b/src/main/java/net/minecraft/server/PacketDataSerializer.java deleted file mode 100644 index 8d3cf1f9b4..0000000000 --- a/src/main/java/net/minecraft/server/PacketDataSerializer.java +++ /dev/null @@ -1,726 +0,0 @@ -package net.minecraft.server; - -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.nio.ByteBuffer; -import java.nio.ByteOrder; -import java.nio.channels.GatheringByteChannel; -import java.nio.channels.ScatteringByteChannel; -import java.nio.charset.Charset; - -import net.minecraft.util.com.google.common.base.Charsets; -import net.minecraft.util.io.netty.buffer.ByteBuf; -import net.minecraft.util.io.netty.buffer.ByteBufAllocator; -import net.minecraft.util.io.netty.buffer.ByteBufProcessor; - -import org.bukkit.craftbukkit.inventory.CraftItemStack; // CraftBukkit - -public class PacketDataSerializer extends ByteBuf { - - private final ByteBuf a; - - public PacketDataSerializer(ByteBuf bytebuf) { - this.a = bytebuf; - } - - public static int a(int i) { - return (i & -128) == 0 ? 1 : ((i & -16384) == 0 ? 2 : ((i & -2097152) == 0 ? 3 : ((i & -268435456) == 0 ? 4 : 5))); - } - - public int a() { - int i = 0; - int j = 0; - - byte b0; - - do { - b0 = this.readByte(); - i |= (b0 & 127) << j++ * 7; - if (j > 5) { - throw new RuntimeException("VarInt too big"); - } - } while ((b0 & 128) == 128); - - return i; - } - - public void b(int i) { - while ((i & -128) != 0) { - this.writeByte(i & 127 | 128); - i >>>= 7; - } - - this.writeByte(i); - } - - public void a(NBTTagCompound nbttagcompound) { - if (nbttagcompound == null) { - this.writeShort(-1); - } else { - byte[] abyte = NBTCompressedStreamTools.a(nbttagcompound); - - this.writeShort((short) abyte.length); - this.writeBytes(abyte); - } - } - - public NBTTagCompound b() { - short short1 = this.readShort(); - - if (short1 < 0) { - return null; - } else { - byte[] abyte = new byte[short1]; - - this.readBytes(abyte); - return NBTCompressedStreamTools.a(abyte, new NBTReadLimiter(2097152L)); - } - } - - public void a(ItemStack itemstack) { - if (itemstack == null || itemstack.getItem() == null) { // CraftBukkit - NPE fix itemstack.getItem() - this.writeShort(-1); - } else { - this.writeShort(Item.getId(itemstack.getItem())); - this.writeByte(itemstack.count); - this.writeShort(itemstack.getData()); - NBTTagCompound nbttagcompound = null; - - if (itemstack.getItem().usesDurability() || itemstack.getItem().s()) { - nbttagcompound = itemstack.tag; - } - - this.a(nbttagcompound); - } - } - - public ItemStack c() { - ItemStack itemstack = null; - short short1 = this.readShort(); - - if (short1 >= 0) { - byte b0 = this.readByte(); - short short2 = this.readShort(); - - itemstack = new ItemStack(Item.getById(short1), b0, short2); - itemstack.tag = this.b(); - // CraftBukkit start - if (itemstack.tag != null) { - CraftItemStack.setItemMeta(itemstack, CraftItemStack.getItemMeta(itemstack)); - } - // CraftBukkit end - } - - return itemstack; - } - - public String c(int i) throws IOException { // CraftBukkit - throws IOException - int j = this.a(); - - if (j > i * 4) { - throw new IOException("The received encoded string buffer length is longer than maximum allowed (" + j + " > " + i * 4 + ")"); - } else if (j < 0) { - throw new IOException("The received encoded string buffer length is less than zero! Weird string!"); - } else { - String s = new String(this.readBytes(j).array(), Charsets.UTF_8); - - if (s.length() > i) { - throw new IOException("The received string length is longer than maximum allowed (" + j + " > " + i + ")"); - } else { - return s; - } - } - } - - public void a(String s) throws IOException { // CraftBukkit - throws IOException - byte[] abyte = s.getBytes(Charsets.UTF_8); - - if (abyte.length > 32767) { - throw new IOException("String too big (was " + s.length() + " bytes encoded, max " + 32767 + ")"); - } else { - this.b(abyte.length); - this.writeBytes(abyte); - } - } - - public int capacity() { - return this.a.capacity(); - } - - public ByteBuf capacity(int i) { - return this.a.capacity(i); - } - - public int maxCapacity() { - return this.a.maxCapacity(); - } - - public ByteBufAllocator alloc() { - return this.a.alloc(); - } - - public ByteOrder order() { - return this.a.order(); - } - - public ByteBuf order(ByteOrder byteorder) { - return this.a.order(byteorder); - } - - public ByteBuf unwrap() { - return this.a.unwrap(); - } - - public boolean isDirect() { - return this.a.isDirect(); - } - - public int readerIndex() { - return this.a.readerIndex(); - } - - public ByteBuf readerIndex(int i) { - return this.a.readerIndex(i); - } - - public int writerIndex() { - return this.a.writerIndex(); - } - - public ByteBuf writerIndex(int i) { - return this.a.writerIndex(i); - } - - public ByteBuf setIndex(int i, int j) { - return this.a.setIndex(i, j); - } - - public int readableBytes() { - return this.a.readableBytes(); - } - - public int writableBytes() { - return this.a.writableBytes(); - } - - public int maxWritableBytes() { - return this.a.maxWritableBytes(); - } - - public boolean isReadable() { - return this.a.isReadable(); - } - - public boolean isReadable(int i) { - return this.a.isReadable(i); - } - - public boolean isWritable() { - return this.a.isWritable(); - } - - public boolean isWritable(int i) { - return this.a.isWritable(i); - } - - public ByteBuf clear() { - return this.a.clear(); - } - - public ByteBuf markReaderIndex() { - return this.a.markReaderIndex(); - } - - public ByteBuf resetReaderIndex() { - return this.a.resetReaderIndex(); - } - - public ByteBuf markWriterIndex() { - return this.a.markWriterIndex(); - } - - public ByteBuf resetWriterIndex() { - return this.a.resetWriterIndex(); - } - - public ByteBuf discardReadBytes() { - return this.a.discardReadBytes(); - } - - public ByteBuf discardSomeReadBytes() { - return this.a.discardSomeReadBytes(); - } - - public ByteBuf ensureWritable(int i) { - return this.a.ensureWritable(i); - } - - public int ensureWritable(int i, boolean flag) { - return this.a.ensureWritable(i, flag); - } - - public boolean getBoolean(int i) { - return this.a.getBoolean(i); - } - - public byte getByte(int i) { - return this.a.getByte(i); - } - - public short getUnsignedByte(int i) { - return this.a.getUnsignedByte(i); - } - - public short getShort(int i) { - return this.a.getShort(i); - } - - public int getUnsignedShort(int i) { - return this.a.getUnsignedShort(i); - } - - public int getMedium(int i) { - return this.a.getMedium(i); - } - - public int getUnsignedMedium(int i) { - return this.a.getUnsignedMedium(i); - } - - public int getInt(int i) { - return this.a.getInt(i); - } - - public long getUnsignedInt(int i) { - return this.a.getUnsignedInt(i); - } - - public long getLong(int i) { - return this.a.getLong(i); - } - - public char getChar(int i) { - return this.a.getChar(i); - } - - public float getFloat(int i) { - return this.a.getFloat(i); - } - - public double getDouble(int i) { - return this.a.getDouble(i); - } - - public ByteBuf getBytes(int i, ByteBuf bytebuf) { - return this.a.getBytes(i, bytebuf); - } - - public ByteBuf getBytes(int i, ByteBuf bytebuf, int j) { - return this.a.getBytes(i, bytebuf, j); - } - - public ByteBuf getBytes(int i, ByteBuf bytebuf, int j, int k) { - return this.a.getBytes(i, bytebuf, j, k); - } - - public ByteBuf getBytes(int i, byte[] abyte) { - return this.a.getBytes(i, abyte); - } - - public ByteBuf getBytes(int i, byte[] abyte, int j, int k) { - return this.a.getBytes(i, abyte, j, k); - } - - public ByteBuf getBytes(int i, ByteBuffer bytebuffer) { - return this.a.getBytes(i, bytebuffer); - } - - public ByteBuf getBytes(int i, OutputStream outputstream, int j) throws IOException { // CraftBukkit - throws IOException - return this.a.getBytes(i, outputstream, j); - } - - public int getBytes(int i, GatheringByteChannel gatheringbytechannel, int j) throws IOException { // CraftBukkit - throws IOException - return this.a.getBytes(i, gatheringbytechannel, j); - } - - public ByteBuf setBoolean(int i, boolean flag) { - return this.a.setBoolean(i, flag); - } - - public ByteBuf setByte(int i, int j) { - return this.a.setByte(i, j); - } - - public ByteBuf setShort(int i, int j) { - return this.a.setShort(i, j); - } - - public ByteBuf setMedium(int i, int j) { - return this.a.setMedium(i, j); - } - - public ByteBuf setInt(int i, int j) { - return this.a.setInt(i, j); - } - - public ByteBuf setLong(int i, long j) { - return this.a.setLong(i, j); - } - - public ByteBuf setChar(int i, int j) { - return this.a.setChar(i, j); - } - - public ByteBuf setFloat(int i, float f) { - return this.a.setFloat(i, f); - } - - public ByteBuf setDouble(int i, double d0) { - return this.a.setDouble(i, d0); - } - - public ByteBuf setBytes(int i, ByteBuf bytebuf) { - return this.a.setBytes(i, bytebuf); - } - - public ByteBuf setBytes(int i, ByteBuf bytebuf, int j) { - return this.a.setBytes(i, bytebuf, j); - } - - public ByteBuf setBytes(int i, ByteBuf bytebuf, int j, int k) { - return this.a.setBytes(i, bytebuf, j, k); - } - - public ByteBuf setBytes(int i, byte[] abyte) { - return this.a.setBytes(i, abyte); - } - - public ByteBuf setBytes(int i, byte[] abyte, int j, int k) { - return this.a.setBytes(i, abyte, j, k); - } - - public ByteBuf setBytes(int i, ByteBuffer bytebuffer) { - return this.a.setBytes(i, bytebuffer); - } - - public int setBytes(int i, InputStream inputstream, int j) throws IOException { // CraftBukkit - throws IOException - return this.a.setBytes(i, inputstream, j); - } - - public int setBytes(int i, ScatteringByteChannel scatteringbytechannel, int j) throws IOException { // CraftBukkit - throws IOException - return this.a.setBytes(i, scatteringbytechannel, j); - } - - public ByteBuf setZero(int i, int j) { - return this.a.setZero(i, j); - } - - public boolean readBoolean() { - return this.a.readBoolean(); - } - - public byte readByte() { - return this.a.readByte(); - } - - public short readUnsignedByte() { - return this.a.readUnsignedByte(); - } - - public short readShort() { - return this.a.readShort(); - } - - public int readUnsignedShort() { - return this.a.readUnsignedShort(); - } - - public int readMedium() { - return this.a.readMedium(); - } - - public int readUnsignedMedium() { - return this.a.readUnsignedMedium(); - } - - public int readInt() { - return this.a.readInt(); - } - - public long readUnsignedInt() { - return this.a.readUnsignedInt(); - } - - public long readLong() { - return this.a.readLong(); - } - - public char readChar() { - return this.a.readChar(); - } - - public float readFloat() { - return this.a.readFloat(); - } - - public double readDouble() { - return this.a.readDouble(); - } - - public ByteBuf readBytes(int i) { - return this.a.readBytes(i); - } - - public ByteBuf readSlice(int i) { - return this.a.readSlice(i); - } - - public ByteBuf readBytes(ByteBuf bytebuf) { - return this.a.readBytes(bytebuf); - } - - public ByteBuf readBytes(ByteBuf bytebuf, int i) { - return this.a.readBytes(bytebuf, i); - } - - public ByteBuf readBytes(ByteBuf bytebuf, int i, int j) { - return this.a.readBytes(bytebuf, i, j); - } - - public ByteBuf readBytes(byte[] abyte) { - return this.a.readBytes(abyte); - } - - public ByteBuf readBytes(byte[] abyte, int i, int j) { - return this.a.readBytes(abyte, i, j); - } - - public ByteBuf readBytes(ByteBuffer bytebuffer) { - return this.a.readBytes(bytebuffer); - } - - public ByteBuf readBytes(OutputStream outputstream, int i) throws IOException { // CraftBukkit - throws IOException - return this.a.readBytes(outputstream, i); - } - - public int readBytes(GatheringByteChannel gatheringbytechannel, int i) throws IOException { // CraftBukkit - throws IOException - return this.a.readBytes(gatheringbytechannel, i); - } - - public ByteBuf skipBytes(int i) { - return this.a.skipBytes(i); - } - - public ByteBuf writeBoolean(boolean flag) { - return this.a.writeBoolean(flag); - } - - public ByteBuf writeByte(int i) { - return this.a.writeByte(i); - } - - public ByteBuf writeShort(int i) { - return this.a.writeShort(i); - } - - public ByteBuf writeMedium(int i) { - return this.a.writeMedium(i); - } - - public ByteBuf writeInt(int i) { - return this.a.writeInt(i); - } - - public ByteBuf writeLong(long i) { - return this.a.writeLong(i); - } - - public ByteBuf writeChar(int i) { - return this.a.writeChar(i); - } - - public ByteBuf writeFloat(float f) { - return this.a.writeFloat(f); - } - - public ByteBuf writeDouble(double d0) { - return this.a.writeDouble(d0); - } - - public ByteBuf writeBytes(ByteBuf bytebuf) { - return this.a.writeBytes(bytebuf); - } - - public ByteBuf writeBytes(ByteBuf bytebuf, int i) { - return this.a.writeBytes(bytebuf, i); - } - - public ByteBuf writeBytes(ByteBuf bytebuf, int i, int j) { - return this.a.writeBytes(bytebuf, i, j); - } - - public ByteBuf writeBytes(byte[] abyte) { - return this.a.writeBytes(abyte); - } - - public ByteBuf writeBytes(byte[] abyte, int i, int j) { - return this.a.writeBytes(abyte, i, j); - } - - public ByteBuf writeBytes(ByteBuffer bytebuffer) { - return this.a.writeBytes(bytebuffer); - } - - public int writeBytes(InputStream inputstream, int i) throws IOException { // CraftBukkit - throws IOException - return this.a.writeBytes(inputstream, i); - } - - public int writeBytes(ScatteringByteChannel scatteringbytechannel, int i) throws IOException { // CraftBukkit - throws IOException - return this.a.writeBytes(scatteringbytechannel, i); - } - - public ByteBuf writeZero(int i) { - return this.a.writeZero(i); - } - - public int indexOf(int i, int j, byte b0) { - return this.a.indexOf(i, j, b0); - } - - public int bytesBefore(byte b0) { - return this.a.bytesBefore(b0); - } - - public int bytesBefore(int i, byte b0) { - return this.a.bytesBefore(i, b0); - } - - public int bytesBefore(int i, int j, byte b0) { - return this.a.bytesBefore(i, j, b0); - } - - public int forEachByte(ByteBufProcessor bytebufprocessor) { - return this.a.forEachByte(bytebufprocessor); - } - - public int forEachByte(int i, int j, ByteBufProcessor bytebufprocessor) { - return this.a.forEachByte(i, j, bytebufprocessor); - } - - public int forEachByteDesc(ByteBufProcessor bytebufprocessor) { - return this.a.forEachByteDesc(bytebufprocessor); - } - - public int forEachByteDesc(int i, int j, ByteBufProcessor bytebufprocessor) { - return this.a.forEachByteDesc(i, j, bytebufprocessor); - } - - public ByteBuf copy() { - return this.a.copy(); - } - - public ByteBuf copy(int i, int j) { - return this.a.copy(i, j); - } - - public ByteBuf slice() { - return this.a.slice(); - } - - public ByteBuf slice(int i, int j) { - return this.a.slice(i, j); - } - - public ByteBuf duplicate() { - return this.a.duplicate(); - } - - public int nioBufferCount() { - return this.a.nioBufferCount(); - } - - public ByteBuffer nioBuffer() { - return this.a.nioBuffer(); - } - - public ByteBuffer nioBuffer(int i, int j) { - return this.a.nioBuffer(i, j); - } - - public ByteBuffer internalNioBuffer(int i, int j) { - return this.a.internalNioBuffer(i, j); - } - - public ByteBuffer[] nioBuffers() { - return this.a.nioBuffers(); - } - - public ByteBuffer[] nioBuffers(int i, int j) { - return this.a.nioBuffers(i, j); - } - - public boolean hasArray() { - return this.a.hasArray(); - } - - public byte[] array() { - return this.a.array(); - } - - public int arrayOffset() { - return this.a.arrayOffset(); - } - - public boolean hasMemoryAddress() { - return this.a.hasMemoryAddress(); - } - - public long memoryAddress() { - return this.a.memoryAddress(); - } - - public String toString(Charset charset) { - return this.a.toString(charset); - } - - public String toString(int i, int j, Charset charset) { - return this.a.toString(i, j, charset); - } - - public int hashCode() { - return this.a.hashCode(); - } - - public boolean equals(Object object) { - return this.a.equals(object); - } - - public int compareTo(ByteBuf bytebuf) { - return this.a.compareTo(bytebuf); - } - - public String toString() { - return this.a.toString(); - } - - public ByteBuf retain(int i) { - return this.a.retain(i); - } - - public ByteBuf retain() { - return this.a.retain(); - } - - public int refCnt() { - return this.a.refCnt(); - } - - public boolean release() { - return this.a.release(); - } - - public boolean release(int i) { - return this.a.release(i); - } -} diff --git a/src/main/java/net/minecraft/server/PacketHandshakingInSetProtocol.java b/src/main/java/net/minecraft/server/PacketHandshakingInSetProtocol.java deleted file mode 100644 index 16d47650e2..0000000000 --- a/src/main/java/net/minecraft/server/PacketHandshakingInSetProtocol.java +++ /dev/null @@ -1,47 +0,0 @@ -package net.minecraft.server; - -import java.io.IOException; // CraftBukkit - -public class PacketHandshakingInSetProtocol extends Packet { - - private int a; - public String b; // CraftBukkit private -> public - public int c; // CraftBukkit private -> public - private EnumProtocol d; - - public PacketHandshakingInSetProtocol() {} - - public void a(PacketDataSerializer packetdataserializer) throws IOException { // CraftBukkit - added throws - this.a = packetdataserializer.a(); - this.b = packetdataserializer.c(255); - this.c = packetdataserializer.readUnsignedShort(); - this.d = EnumProtocol.a(packetdataserializer.a()); - } - - public void b(PacketDataSerializer packetdataserializer) throws IOException { // CraftBukkit - added throws - packetdataserializer.b(this.a); - packetdataserializer.a(this.b); - packetdataserializer.writeShort(this.c); - packetdataserializer.b(this.d.c()); - } - - public void a(PacketHandshakingInListener packethandshakinginlistener) { - packethandshakinginlistener.a(this); - } - - public boolean a() { - return true; - } - - public EnumProtocol c() { - return this.d; - } - - public int d() { - return this.a; - } - - public void handle(PacketListener packetlistener) { - this.a((PacketHandshakingInListener) packetlistener); - } -} diff --git a/src/main/java/net/minecraft/server/PacketPlayInChat.java b/src/main/java/net/minecraft/server/PacketPlayInChat.java deleted file mode 100644 index 604a7af572..0000000000 --- a/src/main/java/net/minecraft/server/PacketPlayInChat.java +++ /dev/null @@ -1,49 +0,0 @@ -package net.minecraft.server; - -import java.io.IOException; // CraftBukkit - -public class PacketPlayInChat extends Packet { - - private String message; - - public PacketPlayInChat() {} - - public PacketPlayInChat(String s) { - if (s.length() > 100) { - s = s.substring(0, 100); - } - - this.message = s; - } - - public void a(PacketDataSerializer packetdataserializer) throws IOException { // CraftBukkit - added throws - this.message = packetdataserializer.c(100); - } - - public void b(PacketDataSerializer packetdataserializer) throws IOException { // CraftBukkit - added throws - packetdataserializer.a(this.message); - } - - public void a(PacketPlayInListener packetplayinlistener) { - packetplayinlistener.a(this); - } - - public String b() { - return String.format("message=\'%s\'", new Object[] { this.message}); - } - - public String c() { - return this.message; - } - - // CraftBukkit start - make chat async - @Override - public boolean a() { - return !this.message.startsWith("/"); - } - // CraftBukkit end - - public void handle(PacketListener packetlistener) { - this.a((PacketPlayInListener) packetlistener); - } -} diff --git a/src/main/java/net/minecraft/server/PacketPlayInCloseWindow.java b/src/main/java/net/minecraft/server/PacketPlayInCloseWindow.java deleted file mode 100644 index 43df03a9ff..0000000000 --- a/src/main/java/net/minecraft/server/PacketPlayInCloseWindow.java +++ /dev/null @@ -1,29 +0,0 @@ -package net.minecraft.server; - -public class PacketPlayInCloseWindow extends Packet { - - private int a; - - public PacketPlayInCloseWindow() {} - - // CraftBukkit start - Add constructor - public PacketPlayInCloseWindow(int id) { - this.a = id; - } - // CraftBukkit end - public void a(PacketPlayInListener packetplayinlistener) { - packetplayinlistener.a(this); - } - - public void a(PacketDataSerializer packetdataserializer) { - this.a = packetdataserializer.readByte(); - } - - public void b(PacketDataSerializer packetdataserializer) { - packetdataserializer.writeByte(this.a); - } - - public void handle(PacketListener packetlistener) { - this.a((PacketPlayInListener) packetlistener); - } -} diff --git a/src/main/java/net/minecraft/server/PacketPlayInCustomPayload.java b/src/main/java/net/minecraft/server/PacketPlayInCustomPayload.java deleted file mode 100644 index 5df99a4426..0000000000 --- a/src/main/java/net/minecraft/server/PacketPlayInCustomPayload.java +++ /dev/null @@ -1,45 +0,0 @@ -package net.minecraft.server; - -import java.io.IOException; // CraftBukkit - -public class PacketPlayInCustomPayload extends Packet { - - private String tag; - public int length; // CraftBukkit - private -> public - private byte[] data; - - public PacketPlayInCustomPayload() {} - - public void a(PacketDataSerializer packetdataserializer) throws IOException { // CraftBukkit - added throws - this.tag = packetdataserializer.c(20); - this.length = packetdataserializer.readShort(); - if (this.length > 0 && this.length < 32767) { - this.data = new byte[this.length]; - packetdataserializer.readBytes(this.data); - } - } - - public void b(PacketDataSerializer packetdataserializer) throws IOException { // CraftBukkit - added throws - packetdataserializer.a(this.tag); - packetdataserializer.writeShort((short) this.length); - if (this.data != null) { - packetdataserializer.writeBytes(this.data); - } - } - - public void a(PacketPlayInListener packetplayinlistener) { - packetplayinlistener.a(this); - } - - public String c() { - return this.tag; - } - - public byte[] e() { - return this.data; - } - - public void handle(PacketListener packetlistener) { - this.a((PacketPlayInListener) packetlistener); - } -} diff --git a/src/main/java/net/minecraft/server/PacketPlayOutBlockChange.java b/src/main/java/net/minecraft/server/PacketPlayOutBlockChange.java deleted file mode 100644 index 4c622e264a..0000000000 --- a/src/main/java/net/minecraft/server/PacketPlayOutBlockChange.java +++ /dev/null @@ -1,48 +0,0 @@ -package net.minecraft.server; - -public class PacketPlayOutBlockChange extends Packet { - - private int a; - private int b; - private int c; - public Block block; // CraftBukkit - public - public int data; // CraftBukkit - public - - public PacketPlayOutBlockChange() {} - - public PacketPlayOutBlockChange(int i, int j, int k, World world) { - this.a = i; - this.b = j; - this.c = k; - this.block = world.getType(i, j, k); - this.data = world.getData(i, j, k); - } - - public void a(PacketDataSerializer packetdataserializer) { - this.a = packetdataserializer.readInt(); - this.b = packetdataserializer.readUnsignedByte(); - this.c = packetdataserializer.readInt(); - this.block = Block.getById(packetdataserializer.a()); - this.data = packetdataserializer.readUnsignedByte(); - } - - public void b(PacketDataSerializer packetdataserializer) { - packetdataserializer.writeInt(this.a); - packetdataserializer.writeByte(this.b); - packetdataserializer.writeInt(this.c); - packetdataserializer.b(Block.getId(this.block)); - packetdataserializer.writeByte(this.data); - } - - public void a(PacketPlayOutListener packetplayoutlistener) { - packetplayoutlistener.a(this); - } - - public String b() { - return String.format("type=%d, data=%d, x=%d, y=%d, z=%d", new Object[] { Integer.valueOf(Block.getId(this.block)), Integer.valueOf(this.data), Integer.valueOf(this.a), Integer.valueOf(this.b), Integer.valueOf(this.c)}); - } - - public void handle(PacketListener packetlistener) { - this.a((PacketPlayOutListener) packetlistener); - } -} diff --git a/src/main/java/net/minecraft/server/PacketPlayOutMapChunkBulk.java b/src/main/java/net/minecraft/server/PacketPlayOutMapChunkBulk.java deleted file mode 100644 index 3eac231d47..0000000000 --- a/src/main/java/net/minecraft/server/PacketPlayOutMapChunkBulk.java +++ /dev/null @@ -1,190 +0,0 @@ -package net.minecraft.server; - -import java.io.IOException; -import java.util.List; -import java.util.zip.DataFormatException; -import java.util.zip.Deflater; -import java.util.zip.Inflater; - -public class PacketPlayOutMapChunkBulk extends Packet { - - private int[] a; - private int[] b; - private int[] c; - private int[] d; - 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() { - @Override - protected Deflater initialValue() { - // Don't use higher compression level, slows things down too much - return new Deflater(6); - } - }; - // CraftBukkit end - - public PacketPlayOutMapChunkBulk() {} - - public PacketPlayOutMapChunkBulk(List list) { - int i = list.size(); - - this.a = new int[i]; - this.b = new int[i]; - this.c = new int[i]; - this.d = new int[i]; - this.inflatedBuffers = new byte[i][]; - this.h = !list.isEmpty() && !((Chunk) list.get(0)).world.worldProvider.g; - int j = 0; - - for (int k = 0; k < i; ++k) { - Chunk chunk = (Chunk) list.get(k); - ChunkMap chunkmap = PacketPlayOutMapChunk.a(chunk, true, '\uffff'); - - if (buildBuffer.length < j + chunkmap.a.length) { - byte[] abyte = new byte[j + chunkmap.a.length]; - - System.arraycopy(buildBuffer, 0, abyte, 0, buildBuffer.length); - buildBuffer = abyte; - } - - System.arraycopy(chunkmap.a, 0, buildBuffer, j, chunkmap.a.length); - j += chunkmap.a.length; - this.a[k] = chunk.locX; - this.b[k] = chunk.locZ; - this.c[k] = chunkmap.b; - this.d[k] = chunkmap.c; - this.inflatedBuffers[k] = chunkmap.a; - } - - /* CraftBukkit start - Moved to compress() - Deflater deflater = new Deflater(-1); - - try { - deflater.setInput(buildBuffer, 0, j); - deflater.finish(); - this.buffer = new byte[j]; - this.size = deflater.deflate(this.buffer); - } finally { - deflater.end(); - } - */ - } - - // Add compression method - public void compress() { - if (this.buffer != null) { - return; - } - - Deflater deflater = localDeflater.get(); - deflater.reset(); - deflater.setInput(this.buildBuffer); - deflater.finish(); - - this.buffer = new byte[this.buildBuffer.length + 100]; - this.size = deflater.deflate(this.buffer); - } - // CraftBukkit end - - public static int c() { - return 5; - } - - public void a(PacketDataSerializer packetdataserializer) throws IOException { // CraftBukkit - throws IOException - short short1 = packetdataserializer.readShort(); - - this.size = packetdataserializer.readInt(); - this.h = packetdataserializer.readBoolean(); - this.a = new int[short1]; - this.b = new int[short1]; - this.c = new int[short1]; - this.d = new int[short1]; - this.inflatedBuffers = new byte[short1][]; - if (buildBuffer.length < this.size) { - buildBuffer = new byte[this.size]; - } - - packetdataserializer.readBytes(buildBuffer, 0, this.size); - byte[] abyte = new byte[PacketPlayOutMapChunk.c() * short1]; - Inflater inflater = new Inflater(); - - inflater.setInput(buildBuffer, 0, this.size); - - try { - inflater.inflate(abyte); - } catch (DataFormatException dataformatexception) { - throw new IOException("Bad compressed data format"); - } finally { - inflater.end(); - } - - int i = 0; - - for (int j = 0; j < short1; ++j) { - this.a[j] = packetdataserializer.readInt(); - this.b[j] = packetdataserializer.readInt(); - this.c[j] = packetdataserializer.readShort(); - this.d[j] = packetdataserializer.readShort(); - int k = 0; - int l = 0; - - int i1; - - for (i1 = 0; i1 < 16; ++i1) { - k += this.c[j] >> i1 & 1; - l += this.d[j] >> i1 & 1; - } - - 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; - } - } - - public void b(PacketDataSerializer packetdataserializer) throws IOException { // CraftBukkit - throws IOException - compress(); // CraftBukkit - packetdataserializer.writeShort(this.a.length); - packetdataserializer.writeInt(this.size); - packetdataserializer.writeBoolean(this.h); - packetdataserializer.writeBytes(this.buffer, 0, this.size); - - for (int i = 0; i < this.a.length; ++i) { - packetdataserializer.writeInt(this.a[i]); - packetdataserializer.writeInt(this.b[i]); - packetdataserializer.writeShort((short) (this.c[i] & '\uffff')); - packetdataserializer.writeShort((short) (this.d[i] & '\uffff')); - } - } - - public void a(PacketPlayOutListener packetplayoutlistener) { - packetplayoutlistener.a(this); - } - - public String b() { - StringBuilder stringbuilder = new StringBuilder(); - - for (int i = 0; i < this.a.length; ++i) { - if (i > 0) { - stringbuilder.append(", "); - } - - stringbuilder.append(String.format("{x=%d, z=%d, sections=%d, adds=%d, data=%d}", new Object[] { Integer.valueOf(this.a[i]), Integer.valueOf(this.b[i]), Integer.valueOf(this.c[i]), Integer.valueOf(this.d[i]), Integer.valueOf(this.inflatedBuffers[i].length)})); - } - - return String.format("size=%d, chunks=%d[%s]", new Object[] { Integer.valueOf(this.size), Integer.valueOf(this.a.length), stringbuilder}); - } - - public void handle(PacketListener packetlistener) { - this.a((PacketPlayOutListener) packetlistener); - } -} diff --git a/src/main/java/net/minecraft/server/PacketPlayOutNamedEntitySpawn.java b/src/main/java/net/minecraft/server/PacketPlayOutNamedEntitySpawn.java deleted file mode 100644 index 0023f18db4..0000000000 --- a/src/main/java/net/minecraft/server/PacketPlayOutNamedEntitySpawn.java +++ /dev/null @@ -1,102 +0,0 @@ -package net.minecraft.server; - -import java.util.Iterator; -import java.util.List; -import java.util.UUID; - -import net.minecraft.util.com.mojang.authlib.GameProfile; -import net.minecraft.util.com.mojang.authlib.properties.Property; - -import java.io.IOException; // CraftBukkit - -public class PacketPlayOutNamedEntitySpawn extends Packet { - - private int a; - private GameProfile b; - private int c; - private int d; - private int e; - private byte f; - private byte g; - private int h; - private DataWatcher i; - private List j; - - public PacketPlayOutNamedEntitySpawn() {} - - public PacketPlayOutNamedEntitySpawn(EntityHuman entityhuman) { - this.a = entityhuman.getId(); - this.b = entityhuman.getProfile(); - this.c = MathHelper.floor(entityhuman.locX * 32.0D); - this.d = MathHelper.floor(entityhuman.locY * 32.0D); - this.e = MathHelper.floor(entityhuman.locZ * 32.0D); - this.f = (byte) ((int) (entityhuman.yaw * 256.0F / 360.0F)); - this.g = (byte) ((int) (entityhuman.pitch * 256.0F / 360.0F)); - ItemStack itemstack = entityhuman.inventory.getItemInHand(); - - this.h = itemstack == null ? 0 : Item.getId(itemstack.getItem()); - this.i = entityhuman.getDataWatcher(); - } - - public void a(PacketDataSerializer packetdataserializer) throws IOException { // CraftBukkit - added throws - this.a = packetdataserializer.a(); - UUID uuid = UUID.fromString(packetdataserializer.c(36)); - - this.b = new GameProfile(uuid, packetdataserializer.c(16)); - int i = packetdataserializer.a(); - - for (int j = 0; j < i; ++j) { - String s = packetdataserializer.c(32767); - String s1 = packetdataserializer.c(32767); - String s2 = packetdataserializer.c(32767); - - this.b.getProperties().put(s, new Property(s, s1, s2)); - } - - this.c = packetdataserializer.readInt(); - this.d = packetdataserializer.readInt(); - this.e = packetdataserializer.readInt(); - this.f = packetdataserializer.readByte(); - this.g = packetdataserializer.readByte(); - this.h = packetdataserializer.readShort(); - this.j = DataWatcher.b(packetdataserializer); - } - - public void b(PacketDataSerializer packetdataserializer) throws IOException { // CraftBukkit - added throws - packetdataserializer.b(this.a); - UUID uuid = this.b.getId(); - - packetdataserializer.a(uuid == null ? "" : uuid.toString()); - packetdataserializer.a(this.b.getName().length() > 16 ? this.b.getName().substring(0, 16) : this.b.getName()); // CraftBukkit - Limit name length to 16 characters - packetdataserializer.b(this.b.getProperties().size()); - Iterator iterator = this.b.getProperties().values().iterator(); - - while (iterator.hasNext()) { - Property property = (Property) iterator.next(); - - packetdataserializer.a(property.getName()); - packetdataserializer.a(property.getValue()); - packetdataserializer.a(property.getSignature()); - } - - packetdataserializer.writeInt(this.c); - packetdataserializer.writeInt(this.d); - packetdataserializer.writeInt(this.e); - packetdataserializer.writeByte(this.f); - packetdataserializer.writeByte(this.g); - packetdataserializer.writeShort(this.h); - this.i.a(packetdataserializer); - } - - public void a(PacketPlayOutListener packetplayoutlistener) { - packetplayoutlistener.a(this); - } - - public String b() { - return String.format("id=%d, gameProfile=\'%s\', x=%.2f, y=%.2f, z=%.2f, carried=%d", new Object[] { Integer.valueOf(this.a), this.b, Float.valueOf((float) this.c / 32.0F), Float.valueOf((float) this.d / 32.0F), Float.valueOf((float) this.e / 32.0F), Integer.valueOf(this.h)}); - } - - public void handle(PacketListener packetlistener) { - this.a((PacketPlayOutListener) packetlistener); - } -} diff --git a/src/main/java/net/minecraft/server/PacketPlayOutSpawnPosition.java b/src/main/java/net/minecraft/server/PacketPlayOutSpawnPosition.java deleted file mode 100644 index 92e40367e0..0000000000 --- a/src/main/java/net/minecraft/server/PacketPlayOutSpawnPosition.java +++ /dev/null @@ -1,44 +0,0 @@ -package net.minecraft.server; - -public class PacketPlayOutSpawnPosition extends Packet { - - public int x; // CraftBukkit - private -> public - public int y; // CraftBukkit - private -> public - public int z; // CraftBukkit - private -> public - - public PacketPlayOutSpawnPosition() {} - - public PacketPlayOutSpawnPosition(int i, int j, int k) { - this.x = i; - this.y = j; - this.z = k; - } - - public void a(PacketDataSerializer packetdataserializer) { - this.x = packetdataserializer.readInt(); - this.y = packetdataserializer.readInt(); - this.z = packetdataserializer.readInt(); - } - - public void b(PacketDataSerializer packetdataserializer) { - packetdataserializer.writeInt(this.x); - packetdataserializer.writeInt(this.y); - packetdataserializer.writeInt(this.z); - } - - public void a(PacketPlayOutListener packetplayoutlistener) { - packetplayoutlistener.a(this); - } - - public boolean a() { - return false; - } - - public String b() { - return String.format("x=%d, y=%d, z=%d", new Object[] { Integer.valueOf(this.x), Integer.valueOf(this.y), Integer.valueOf(this.z)}); - } - - public void handle(PacketListener packetlistener) { - this.a((PacketPlayOutListener) packetlistener); - } -} diff --git a/src/main/java/net/minecraft/server/PacketStatusListener.java b/src/main/java/net/minecraft/server/PacketStatusListener.java deleted file mode 100644 index cd0630537c..0000000000 --- a/src/main/java/net/minecraft/server/PacketStatusListener.java +++ /dev/null @@ -1,128 +0,0 @@ -package net.minecraft.server; - -import java.net.InetSocketAddress; - -// CraftBukkit start -import java.util.Iterator; - -import org.bukkit.craftbukkit.util.CraftIconCache; -import org.bukkit.entity.Player; - -import net.minecraft.util.com.mojang.authlib.GameProfile; -// CraftBukkit end - -import net.minecraft.util.io.netty.util.concurrent.GenericFutureListener; - -public class PacketStatusListener implements PacketStatusInListener { - - private final MinecraftServer minecraftServer; - private final NetworkManager networkManager; - - public PacketStatusListener(MinecraftServer minecraftserver, NetworkManager networkmanager) { - this.minecraftServer = minecraftserver; - this.networkManager = networkmanager; - } - - public void a(IChatBaseComponent ichatbasecomponent) {} - - public void a(EnumProtocol enumprotocol, EnumProtocol enumprotocol1) { - if (enumprotocol1 != EnumProtocol.STATUS) { - throw new UnsupportedOperationException("Unexpected change in protocol to " + enumprotocol1); - } - } - - public void a() {} - - public void a(PacketStatusInStart packetstatusinstart) { - // CraftBukkit start - fire ping event - final Object[] players = minecraftServer.getPlayerList().players.toArray(); - class ServerListPingEvent extends org.bukkit.event.server.ServerListPingEvent { - CraftIconCache icon = minecraftServer.server.getServerIcon(); - - ServerListPingEvent() { - super(((InetSocketAddress) networkManager.getSocketAddress()).getAddress(), minecraftServer.getMotd(), minecraftServer.getPlayerList().getMaxPlayers()); - } - - @Override - public void setServerIcon(org.bukkit.util.CachedServerIcon icon) { - if (!(icon instanceof CraftIconCache)) { - throw new IllegalArgumentException(icon + " was not created by " + org.bukkit.craftbukkit.CraftServer.class); - } - this.icon = (CraftIconCache) icon; - } - - @Override - public Iterator iterator() throws UnsupportedOperationException { - return new Iterator() { - int i; - int ret = Integer.MIN_VALUE; - EntityPlayer player; - - @Override - public boolean hasNext() { - if (player != null) { - return true; - } - final Object[] currentPlayers = players; - for (int length = currentPlayers.length, i = this.i; i < length; i++) { - final EntityPlayer player = (EntityPlayer) currentPlayers[i]; - if (player != null) { - this.i = i + 1; - this.player = player; - return true; - } - } - return false; - } - - @Override - public Player next() { - if (!hasNext()) { - throw new java.util.NoSuchElementException(); - } - final EntityPlayer player = this.player; - this.player = null; - this.ret = this.i - 1; - return player.getBukkitEntity(); - } - - @Override - public void remove() { - final Object[] currentPlayers = players; - final int i = this.ret; - if (i < 0 || currentPlayers[i] == null) { - throw new IllegalStateException(); - } - currentPlayers[i] = null; - } - }; - } - } - - ServerListPingEvent event = new ServerListPingEvent(); - this.minecraftServer.server.getPluginManager().callEvent(event); - - java.util.List profiles = new java.util.ArrayList(players.length); - for (Object player : players) { - if (player != null) { - profiles.add(((EntityPlayer) player).getProfile()); - } - } - - ServerPingPlayerSample playerSample = new ServerPingPlayerSample(event.getMaxPlayers(), profiles.size()); - playerSample.a(profiles.toArray(new GameProfile[profiles.size()])); - - ServerPing ping = new ServerPing(); - ping.setFavicon(event.icon.value); - ping.setMOTD(new ChatComponentText(event.getMotd())); - ping.setPlayerSample(playerSample); - ping.setServerInfo(new ServerPingServerData(minecraftServer.getServerModName() + " " + minecraftServer.getVersion(), 5)); // TODO: Update when protocol changes - - this.networkManager.handle(new PacketStatusOutServerInfo(ping), new GenericFutureListener[0]); - // CraftBukkit end - } - - public void a(PacketStatusInPing packetstatusinping) { - this.networkManager.handle(new PacketStatusOutPong(packetstatusinping.c()), new GenericFutureListener[0]); - } -} diff --git a/src/main/java/net/minecraft/server/Path.java b/src/main/java/net/minecraft/server/Path.java deleted file mode 100644 index 90c3ef97f8..0000000000 --- a/src/main/java/net/minecraft/server/Path.java +++ /dev/null @@ -1,128 +0,0 @@ -package net.minecraft.server; - -public class Path { - - private PathPoint[] a = new PathPoint[128]; // CraftBukkit - reduce default size - private int b; - - public Path() {} - - public PathPoint a(PathPoint pathpoint) { - if (pathpoint.d >= 0) { - throw new IllegalStateException("OW KNOWS!"); - } else { - if (this.b == this.a.length) { - PathPoint[] apathpoint = new PathPoint[this.b << 1]; - - System.arraycopy(this.a, 0, apathpoint, 0, this.b); - this.a = apathpoint; - } - - this.a[this.b] = pathpoint; - pathpoint.d = this.b; - this.a(this.b++); - return pathpoint; - } - } - - public void a() { - this.b = 0; - } - - public PathPoint c() { - PathPoint pathpoint = this.a[0]; - - this.a[0] = this.a[--this.b]; - this.a[this.b] = null; - if (this.b > 0) { - this.b(0); - } - - pathpoint.d = -1; - return pathpoint; - } - - public void a(PathPoint pathpoint, float f) { - float f1 = pathpoint.g; - - pathpoint.g = f; - if (f < f1) { - this.a(pathpoint.d); - } else { - this.b(pathpoint.d); - } - } - - private void a(int i) { - PathPoint pathpoint = this.a[i]; - - int j; - - for (float f = pathpoint.g; i > 0; i = j) { - j = i - 1 >> 1; - PathPoint pathpoint1 = this.a[j]; - - if (f >= pathpoint1.g) { - break; - } - - this.a[i] = pathpoint1; - pathpoint1.d = i; - } - - this.a[i] = pathpoint; - pathpoint.d = i; - } - - private void b(int i) { - PathPoint pathpoint = this.a[i]; - float f = pathpoint.g; - - while (true) { - int j = 1 + (i << 1); - int k = j + 1; - - if (j >= this.b) { - break; - } - - PathPoint pathpoint1 = this.a[j]; - float f1 = pathpoint1.g; - PathPoint pathpoint2; - float f2; - - if (k >= this.b) { - pathpoint2 = null; - f2 = Float.POSITIVE_INFINITY; - } else { - pathpoint2 = this.a[k]; - f2 = pathpoint2.g; - } - - if (f1 < f2) { - if (f1 >= f) { - break; - } - - this.a[i] = pathpoint1; - pathpoint1.d = i; - i = j; - } else { - if (f2 >= f) { - break; - } - - this.a[i] = pathpoint2; - pathpoint2.d = i; - i = k; - } - } - - this.a[i] = pathpoint; - pathpoint.d = i; - } - - public boolean e() { - return this.b == 0; - } -} diff --git a/src/main/java/net/minecraft/server/PathfinderGoalArrowAttack.java b/src/main/java/net/minecraft/server/PathfinderGoalArrowAttack.java deleted file mode 100644 index cb2af02fc6..0000000000 --- a/src/main/java/net/minecraft/server/PathfinderGoalArrowAttack.java +++ /dev/null @@ -1,105 +0,0 @@ -package net.minecraft.server; - -import org.bukkit.event.entity.EntityTargetEvent; // CraftBukkit - -public class PathfinderGoalArrowAttack extends PathfinderGoal { - - private final EntityInsentient a; - private final IRangedEntity b; - private EntityLiving c; - private int d; - private double e; - private int f; - private int g; - private int h; - private float i; - private float j; - - public PathfinderGoalArrowAttack(IRangedEntity irangedentity, double d0, int i, float f) { - this(irangedentity, d0, i, i, f); - } - - public PathfinderGoalArrowAttack(IRangedEntity irangedentity, double d0, int i, int j, float f) { - this.d = -1; - if (!(irangedentity instanceof EntityLiving)) { - throw new IllegalArgumentException("ArrowAttackGoal requires Mob implements RangedAttackMob"); - } else { - this.b = irangedentity; - this.a = (EntityInsentient) irangedentity; - this.e = d0; - this.g = i; - this.h = j; - this.i = f; - this.j = f * f; - this.a(3); - } - } - - public boolean a() { - EntityLiving entityliving = this.a.getGoalTarget(); - - if (entityliving == null) { - return false; - } else { - this.c = entityliving; - return true; - } - } - - public boolean b() { - return this.a() || !this.a.getNavigation().g(); - } - - public void d() { - // CraftBukkit start - EntityTargetEvent.TargetReason reason = this.c.isAlive() ? EntityTargetEvent.TargetReason.FORGOT_TARGET : EntityTargetEvent.TargetReason.TARGET_DIED; - org.bukkit.craftbukkit.event.CraftEventFactory.callEntityTargetEvent((Entity) b, null, reason); - // CraftBukkit end - this.c = null; - this.f = 0; - this.d = -1; - } - - public void e() { - double d0 = this.a.e(this.c.locX, this.c.boundingBox.b, this.c.locZ); - boolean flag = this.a.getEntitySenses().canSee(this.c); - - if (flag) { - ++this.f; - } else { - this.f = 0; - } - - if (d0 <= (double) this.j && this.f >= 20) { - this.a.getNavigation().h(); - } else { - this.a.getNavigation().a((Entity) this.c, this.e); - } - - this.a.getControllerLook().a(this.c, 30.0F, 30.0F); - float f; - - if (--this.d == 0) { - if (d0 > (double) this.j || !flag) { - return; - } - - f = MathHelper.sqrt(d0) / this.i; - float f1 = f; - - if (f < 0.1F) { - f1 = 0.1F; - } - - if (f1 > 1.0F) { - f1 = 1.0F; - } - - this.b.a(this.c, f1); - this.d = MathHelper.d(f * (float) (this.h - this.g) + (float) this.g); - } else if (this.d < 0) { - f = MathHelper.sqrt(d0) / this.i; - this.d = MathHelper.d(f * (float) (this.h - this.g) + (float) this.g); - } - } -} diff --git a/src/main/java/net/minecraft/server/PathfinderGoalBreakDoor.java b/src/main/java/net/minecraft/server/PathfinderGoalBreakDoor.java deleted file mode 100644 index 727f5f0cea..0000000000 --- a/src/main/java/net/minecraft/server/PathfinderGoalBreakDoor.java +++ /dev/null @@ -1,59 +0,0 @@ -package net.minecraft.server; - -public class PathfinderGoalBreakDoor extends PathfinderGoalDoorInteract { - - private int i; - private int j = -1; - - public PathfinderGoalBreakDoor(EntityInsentient entityinsentient) { - super(entityinsentient); - } - - public boolean a() { - return !super.a() ? false : (!this.a.world.getGameRules().getBoolean("mobGriefing") ? false : !this.e.f((IBlockAccess) this.a.world, this.b, this.c, this.d)); // CraftBukkit - Fix decompilation issue by casting world to IBlockAccess - } - - public void c() { - super.c(); - this.i = 0; - } - - public boolean b() { - double d0 = this.a.e((double) this.b, (double) this.c, (double) this.d); - - return this.i <= 240 && !this.e.f((IBlockAccess) this.a.world, this.b, this.c, this.d) && d0 < 4.0D; // CraftBukkit - Fix decompilation issue by casting world to IBlockAccess - } - - public void d() { - super.d(); - this.a.world.d(this.a.getId(), this.b, this.c, this.d, -1); - } - - public void e() { - super.e(); - if (this.a.aI().nextInt(20) == 0) { - this.a.world.triggerEffect(1010, this.b, this.c, this.d, 0); - } - - ++this.i; - int i = (int) ((float) this.i / 240.0F * 10.0F); - - if (i != this.j) { - this.a.world.d(this.a.getId(), this.b, this.c, this.d, i); - this.j = i; - } - - if (this.i == 240 && this.a.world.difficulty == EnumDifficulty.HARD) { - // CraftBukkit start - if (org.bukkit.craftbukkit.event.CraftEventFactory.callEntityBreakDoorEvent(this.a, this.b, this.c, this.d).isCancelled()) { - this.c(); - return; - } - // CraftBukkit end - - this.a.world.setAir(this.b, this.c, this.d); - this.a.world.triggerEffect(1012, this.b, this.c, this.d, 0); - this.a.world.triggerEffect(2001, this.b, this.c, this.d, Block.getId(this.e)); - } - } -} diff --git a/src/main/java/net/minecraft/server/PathfinderGoalBreed.java b/src/main/java/net/minecraft/server/PathfinderGoalBreed.java deleted file mode 100644 index 65f8690854..0000000000 --- a/src/main/java/net/minecraft/server/PathfinderGoalBreed.java +++ /dev/null @@ -1,112 +0,0 @@ -package net.minecraft.server; - -import java.util.Iterator; -import java.util.List; -import java.util.Random; - -public class PathfinderGoalBreed extends PathfinderGoal { - - private EntityAnimal d; - World a; - private EntityAnimal e; - int b; - double c; - - public PathfinderGoalBreed(EntityAnimal entityanimal, double d0) { - this.d = entityanimal; - this.a = entityanimal.world; - this.c = d0; - this.a(3); - } - - public boolean a() { - if (!this.d.ce()) { - return false; - } else { - this.e = this.f(); - return this.e != null; - } - } - - public boolean b() { - return this.e.isAlive() && this.e.ce() && this.b < 60; - } - - public void d() { - this.e = null; - this.b = 0; - } - - public void e() { - this.d.getControllerLook().a(this.e, 10.0F, (float) this.d.x()); - this.d.getNavigation().a((Entity) this.e, this.c); - ++this.b; - if (this.b >= 60 && this.d.f(this.e) < 9.0D) { - this.g(); - } - } - - private EntityAnimal f() { - float f = 8.0F; - List list = this.a.a(this.d.getClass(), this.d.boundingBox.grow((double) f, (double) f, (double) f)); - double d0 = Double.MAX_VALUE; - EntityAnimal entityanimal = null; - Iterator iterator = list.iterator(); - - while (iterator.hasNext()) { - EntityAnimal entityanimal1 = (EntityAnimal) iterator.next(); - - if (this.d.mate(entityanimal1) && this.d.f(entityanimal1) < d0) { - entityanimal = entityanimal1; - d0 = this.d.f(entityanimal1); - } - } - - return entityanimal; - } - - private void g() { - EntityAgeable entityageable = this.d.createChild(this.e); - - if (entityageable != null) { - // CraftBukkit start - set persistence for tame animals - if (entityageable instanceof EntityTameableAnimal && ((EntityTameableAnimal) entityageable).isTamed()) { - entityageable.persistent = true; - } - // CraftBukkit end - EntityHuman entityhuman = this.d.cd(); - - if (entityhuman == null && this.e.cd() != null) { - entityhuman = this.e.cd(); - } - - if (entityhuman != null) { - entityhuman.a(StatisticList.x); - if (this.d instanceof EntityCow) { - entityhuman.a((Statistic) AchievementList.H); - } - } - - this.d.setAge(6000); - this.e.setAge(6000); - this.d.cf(); - this.e.cf(); - entityageable.setAge(-24000); - entityageable.setPositionRotation(this.d.locX, this.d.locY, this.d.locZ, 0.0F, 0.0F); - this.a.addEntity(entityageable, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.BREEDING); // CraftBukkit - added SpawnReason - Random random = this.d.aI(); - - for (int i = 0; i < 7; ++i) { - double d0 = random.nextGaussian() * 0.02D; - double d1 = random.nextGaussian() * 0.02D; - double d2 = random.nextGaussian() * 0.02D; - - 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); - } - - if (this.a.getGameRules().getBoolean("doMobLoot")) { - 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/PathfinderGoalEatTile.java b/src/main/java/net/minecraft/server/PathfinderGoalEatTile.java deleted file mode 100644 index a38f2a26aa..0000000000 --- a/src/main/java/net/minecraft/server/PathfinderGoalEatTile.java +++ /dev/null @@ -1,75 +0,0 @@ -package net.minecraft.server; - -// CraftBukkit start -import org.bukkit.craftbukkit.event.CraftEventFactory; -import org.bukkit.Material; -// CraftBukkit end - -public class PathfinderGoalEatTile extends PathfinderGoal { - - private EntityInsentient b; - private World c; - int a; - - public PathfinderGoalEatTile(EntityInsentient entityinsentient) { - this.b = entityinsentient; - this.c = entityinsentient.world; - this.a(7); - } - - public boolean a() { - if (this.b.aI().nextInt(this.b.isBaby() ? 50 : 1000) != 0) { - return false; - } else { - int i = MathHelper.floor(this.b.locX); - int j = MathHelper.floor(this.b.locY); - int k = MathHelper.floor(this.b.locZ); - - return this.c.getType(i, j, k) == Blocks.LONG_GRASS && this.c.getData(i, j, k) == 1 ? true : this.c.getType(i, j - 1, k) == Blocks.GRASS; - } - } - - public void c() { - this.a = 40; - this.c.broadcastEntityEffect(this.b, (byte) 10); - this.b.getNavigation().h(); - } - - public void d() { - this.a = 0; - } - - public boolean b() { - return this.a > 0; - } - - public int f() { - return this.a; - } - - public void e() { - this.a = Math.max(0, this.a - 1); - if (this.a == 4) { - int i = MathHelper.floor(this.b.locX); - int j = MathHelper.floor(this.b.locY); - int k = MathHelper.floor(this.b.locZ); - - if (this.c.getType(i, j, k) == Blocks.LONG_GRASS) { - // CraftBukkit - if (!CraftEventFactory.callEntityChangeBlockEvent(this.b, this.b.world.getWorld().getBlockAt(i, j, k), Material.AIR, !this.c.getGameRules().getBoolean("mobGriefing")).isCancelled()) { - this.c.setAir(i, j, k, false); - } - - this.b.p(); - } else if (this.c.getType(i, j - 1, k) == Blocks.GRASS) { - // CraftBukkit - if (!CraftEventFactory.callEntityChangeBlockEvent(this.b, this.b.world.getWorld().getBlockAt(i, j - 1, k), Material.DIRT, !this.c.getGameRules().getBoolean("mobGriefing")).isCancelled()) { - this.c.triggerEffect(2001, i, j - 1, k, Block.getId(Blocks.GRASS)); - this.c.setTypeAndData(i, j - 1, k, Blocks.DIRT, 0, 2); - } - - this.b.p(); - } - } - } -} diff --git a/src/main/java/net/minecraft/server/PathfinderGoalHurtByTarget.java b/src/main/java/net/minecraft/server/PathfinderGoalHurtByTarget.java deleted file mode 100644 index 4f476e6f43..0000000000 --- a/src/main/java/net/minecraft/server/PathfinderGoalHurtByTarget.java +++ /dev/null @@ -1,48 +0,0 @@ -package net.minecraft.server; - -import java.util.Iterator; -import java.util.List; - -public class PathfinderGoalHurtByTarget extends PathfinderGoalTarget { - - boolean a; - private int b; - - public PathfinderGoalHurtByTarget(EntityCreature entitycreature, boolean flag) { - super(entitycreature, false); - this.a = flag; - this.a(1); - } - - public boolean a() { - int i = this.c.aK(); - - return i != this.b && this.a(this.c.getLastDamager(), false); - } - - public void c() { - this.c.setGoalTarget(this.c.getLastDamager()); - this.b = this.c.aK(); - if (this.a) { - double d0 = this.f(); - List list = this.c.world.a(this.c.getClass(), AxisAlignedBB.a(this.c.locX, this.c.locY, this.c.locZ, this.c.locX + 1.0D, this.c.locY + 1.0D, this.c.locZ + 1.0D).grow(d0, 10.0D, d0)); - Iterator iterator = list.iterator(); - - while (iterator.hasNext()) { - EntityCreature entitycreature = (EntityCreature) iterator.next(); - - if (this.c != entitycreature && entitycreature.getGoalTarget() == null && !entitycreature.c(this.c.getLastDamager())) { - // CraftBukkit start - call EntityTargetEvent - org.bukkit.event.entity.EntityTargetLivingEntityEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callEntityTargetLivingEvent(entitycreature, this.c.getLastDamager(), org.bukkit.event.entity.EntityTargetEvent.TargetReason.TARGET_ATTACKED_NEARBY_ENTITY); - if (event.isCancelled()) { - continue; - } - entitycreature.setGoalTarget(event.getTarget() == null ? null : ((org.bukkit.craftbukkit.entity.CraftLivingEntity) event.getTarget()).getHandle()); - // CraftBukkit end - } - } - } - - super.c(); - } -} diff --git a/src/main/java/net/minecraft/server/PathfinderGoalMakeLove.java b/src/main/java/net/minecraft/server/PathfinderGoalMakeLove.java deleted file mode 100644 index f7bd8e82f0..0000000000 --- a/src/main/java/net/minecraft/server/PathfinderGoalMakeLove.java +++ /dev/null @@ -1,90 +0,0 @@ -package net.minecraft.server; - -public class PathfinderGoalMakeLove extends PathfinderGoal { - - private EntityVillager b; - private EntityVillager c; - private World d; - private int e; - Village a; - - public PathfinderGoalMakeLove(EntityVillager entityvillager) { - this.b = entityvillager; - this.d = entityvillager.world; - this.a(3); - } - - public boolean a() { - if (this.b.getAge() != 0) { - return false; - } else if (this.b.aI().nextInt(500) != 0) { - return false; - } else { - this.a = this.d.villages.getClosestVillage(MathHelper.floor(this.b.locX), MathHelper.floor(this.b.locY), MathHelper.floor(this.b.locZ), 0); - if (this.a == null) { - return false; - } else if (!this.f()) { - return false; - } else { - Entity entity = this.d.a(EntityVillager.class, this.b.boundingBox.grow(8.0D, 3.0D, 8.0D), (Entity) this.b); - - if (entity == null) { - return false; - } else { - this.c = (EntityVillager) entity; - return this.c.getAge() == 0; - } - } - } - } - - public void c() { - this.e = 300; - this.b.i(true); - } - - public void d() { - this.a = null; - this.c = null; - this.b.i(false); - } - - public boolean b() { - return this.e >= 0 && this.f() && this.b.getAge() == 0; - } - - public void e() { - --this.e; - this.b.getControllerLook().a(this.c, 10.0F, 30.0F); - if (this.b.f(this.c) > 2.25D) { - this.b.getNavigation().a((Entity) this.c, 0.25D); - } else if (this.e == 0 && this.c.ca()) { - this.g(); - } - - if (this.b.aI().nextInt(35) == 0) { - this.d.broadcastEntityEffect(this.b, (byte) 12); - } - } - - private boolean f() { - if (!this.a.i()) { - return false; - } else { - int i = (int) ((double) ((float) this.a.getDoorCount()) * 0.35D); - - return this.a.getPopulationCount() < i; - } - } - - private void g() { - EntityVillager entityvillager = this.b.b((EntityAgeable) this.c); - - this.c.setAge(6000); - this.b.setAge(6000); - entityvillager.setAge(-24000); - entityvillager.setPositionRotation(this.b.locX, this.b.locY, this.b.locZ, 0.0F, 0.0F); - this.d.addEntity(entityvillager, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.BREEDING); // CraftBukkit - added SpawnReason - this.d.broadcastEntityEffect(entityvillager, (byte) 12); - } -} diff --git a/src/main/java/net/minecraft/server/PathfinderGoalMeleeAttack.java b/src/main/java/net/minecraft/server/PathfinderGoalMeleeAttack.java deleted file mode 100644 index be541f816e..0000000000 --- a/src/main/java/net/minecraft/server/PathfinderGoalMeleeAttack.java +++ /dev/null @@ -1,103 +0,0 @@ -package net.minecraft.server; - -import org.bukkit.event.entity.EntityTargetEvent; // CraftBukkit - -public class PathfinderGoalMeleeAttack extends PathfinderGoal { - - World a; - EntityCreature b; - int c; - double d; - boolean e; - PathEntity f; - Class g; - private int h; - private double i; - private double j; - private double k; - - public PathfinderGoalMeleeAttack(EntityCreature entitycreature, Class oclass, double d0, boolean flag) { - this(entitycreature, d0, flag); - this.g = oclass; - } - - public PathfinderGoalMeleeAttack(EntityCreature entitycreature, double d0, boolean flag) { - this.b = entitycreature; - this.a = entitycreature.world; - this.d = d0; - this.e = flag; - this.a(3); - } - - public boolean a() { - EntityLiving entityliving = this.b.getGoalTarget(); - - if (entityliving == null) { - return false; - } else if (!entityliving.isAlive()) { - return false; - } else if (this.g != null && !this.g.isAssignableFrom(entityliving.getClass())) { - return false; - } else { - this.f = this.b.getNavigation().a(entityliving); - return this.f != null; - } - } - - public boolean b() { - EntityLiving entityliving = this.b.getGoalTarget(); - - // CraftBukkit start - EntityTargetEvent.TargetReason reason = this.b.getGoalTarget() == null ? EntityTargetEvent.TargetReason.FORGOT_TARGET : EntityTargetEvent.TargetReason.TARGET_DIED; - if (this.b.getGoalTarget() == null || (this.b.getGoalTarget() != null && !this.b.getGoalTarget().isAlive())) { - org.bukkit.craftbukkit.event.CraftEventFactory.callEntityTargetEvent(b, null, reason); - } - // CraftBukkit end - - return entityliving == null ? false : (!entityliving.isAlive() ? false : (!this.e ? !this.b.getNavigation().g() : this.b.b(MathHelper.floor(entityliving.locX), MathHelper.floor(entityliving.locY), MathHelper.floor(entityliving.locZ)))); - } - - public void c() { - this.b.getNavigation().a(this.f, this.d); - this.h = 0; - } - - public void d() { - this.b.getNavigation().h(); - } - - public void e() { - EntityLiving entityliving = this.b.getGoalTarget(); - - this.b.getControllerLook().a(entityliving, 30.0F, 30.0F); - double d0 = this.b.e(entityliving.locX, entityliving.boundingBox.b, entityliving.locZ); - double d1 = (double) (this.b.width * 2.0F * this.b.width * 2.0F + entityliving.width); - - --this.h; - if ((this.e || this.b.getEntitySenses().canSee(entityliving)) && this.h <= 0 && (this.i == 0.0D && this.j == 0.0D && this.k == 0.0D || entityliving.e(this.i, this.j, this.k) >= 1.0D || this.b.aI().nextFloat() < 0.05F)) { - this.i = entityliving.locX; - this.j = entityliving.boundingBox.b; - this.k = entityliving.locZ; - this.h = 4 + this.b.aI().nextInt(7); - if (d0 > 1024.0D) { - this.h += 10; - } else if (d0 > 256.0D) { - this.h += 5; - } - - if (!this.b.getNavigation().a((Entity) entityliving, this.d)) { - this.h += 15; - } - } - - this.c = Math.max(this.c - 1, 0); - if (d0 <= d1 && this.c <= 20) { - this.c = 20; - if (this.b.be() != null) { - this.b.ba(); - } - - this.b.n(entityliving); - } - } -} diff --git a/src/main/java/net/minecraft/server/PathfinderGoalOcelotAttack.java b/src/main/java/net/minecraft/server/PathfinderGoalOcelotAttack.java deleted file mode 100644 index 0c08df387e..0000000000 --- a/src/main/java/net/minecraft/server/PathfinderGoalOcelotAttack.java +++ /dev/null @@ -1,63 +0,0 @@ -package net.minecraft.server; - -import org.bukkit.event.entity.EntityTargetEvent; // CraftBukkit - -public class PathfinderGoalOcelotAttack extends PathfinderGoal { - - World a; - EntityInsentient b; - EntityLiving c; - int d; - - public PathfinderGoalOcelotAttack(EntityInsentient entityinsentient) { - this.b = entityinsentient; - this.a = entityinsentient.world; - this.a(3); - } - - public boolean a() { - EntityLiving entityliving = this.b.getGoalTarget(); - - if (entityliving == null) { - return false; - } else { - this.c = entityliving; - return true; - } - } - - public boolean b() { - return !this.c.isAlive() ? false : (this.b.f(this.c) > 225.0D ? false : !this.b.getNavigation().g() || this.a()); - } - - public void d() { - // CraftBukkit start - EntityTargetEvent.TargetReason reason = this.c.isAlive() ? EntityTargetEvent.TargetReason.FORGOT_TARGET : EntityTargetEvent.TargetReason.TARGET_DIED; - org.bukkit.craftbukkit.event.CraftEventFactory.callEntityTargetEvent(this.c, null, reason); - // CraftBukkit end - this.c = null; - this.b.getNavigation().h(); - } - - public void e() { - this.b.getControllerLook().a(this.c, 30.0F, 30.0F); - double d0 = (double) (this.b.width * 2.0F * this.b.width * 2.0F); - double d1 = this.b.e(this.c.locX, this.c.boundingBox.b, this.c.locZ); - double d2 = 0.8D; - - if (d1 > d0 && d1 < 16.0D) { - d2 = 1.33D; - } else if (d1 < 225.0D) { - d2 = 0.6D; - } - - this.b.getNavigation().a((Entity) this.c, d2); - this.d = Math.max(this.d - 1, 0); - if (d1 <= d0) { - if (this.d <= 0) { - this.d = 20; - this.b.n(this.c); - } - } - } -} diff --git a/src/main/java/net/minecraft/server/PathfinderGoalPanic.java b/src/main/java/net/minecraft/server/PathfinderGoalPanic.java deleted file mode 100644 index 1b8608d0bf..0000000000 --- a/src/main/java/net/minecraft/server/PathfinderGoalPanic.java +++ /dev/null @@ -1,47 +0,0 @@ -package net.minecraft.server; - -public class PathfinderGoalPanic extends PathfinderGoal { - - private EntityCreature a; - private double b; - private double c; - private double d; - private double e; - - public PathfinderGoalPanic(EntityCreature entitycreature, double d0) { - this.a = entitycreature; - this.b = d0; - this.a(1); - } - - public boolean a() { - if (this.a.getLastDamager() == null && !this.a.isBurning()) { - return false; - } else { - Vec3D vec3d = RandomPositionGenerator.a(this.a, 5, 4); - - if (vec3d == null) { - return false; - } else { - this.c = vec3d.a; - this.d = vec3d.b; - this.e = vec3d.c; - return true; - } - } - } - - public void c() { - this.a.getNavigation().a(this.c, this.d, this.e, this.b); - } - - public boolean b() { - // CraftBukkit start - introduce a temporary timeout hack until this is fixed properly - if ((this.a.ticksLived - this.a.aK()) > 100) { - this.a.b((EntityLiving) null); - return false; - } - // CraftBukkit end - return !this.a.getNavigation().g(); - } -} diff --git a/src/main/java/net/minecraft/server/PathfinderGoalSelector.java b/src/main/java/net/minecraft/server/PathfinderGoalSelector.java deleted file mode 100644 index 33aded0855..0000000000 --- a/src/main/java/net/minecraft/server/PathfinderGoalSelector.java +++ /dev/null @@ -1,153 +0,0 @@ -package net.minecraft.server; - -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; - -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; - -import org.bukkit.craftbukkit.util.UnsafeList; // CraftBukkit - -public class PathfinderGoalSelector { - - private static final Logger a = LogManager.getLogger(); - // CraftBukkit start - ArrayList -> UnsafeList - private List b = new UnsafeList(); - private List c = new UnsafeList(); - // CraftBukkit end - private final MethodProfiler d; - private int e; - private int f = 3; - - public PathfinderGoalSelector(MethodProfiler methodprofiler) { - this.d = methodprofiler; - } - - public void a(int i, PathfinderGoal pathfindergoal) { - this.b.add(new PathfinderGoalSelectorItem(this, i, pathfindergoal)); - } - - public void a(PathfinderGoal pathfindergoal) { - Iterator iterator = this.b.iterator(); - - while (iterator.hasNext()) { - PathfinderGoalSelectorItem pathfindergoalselectoritem = (PathfinderGoalSelectorItem) iterator.next(); - PathfinderGoal pathfindergoal1 = pathfindergoalselectoritem.a; - - if (pathfindergoal1 == pathfindergoal) { - if (this.c.contains(pathfindergoalselectoritem)) { - pathfindergoal1.d(); - this.c.remove(pathfindergoalselectoritem); - } - - iterator.remove(); - } - } - } - - public void a() { - // ArrayList arraylist = new ArrayList(); // CraftBukkit - remove usage - Iterator iterator; - PathfinderGoalSelectorItem pathfindergoalselectoritem; - - if (this.e++ % this.f == 0) { - iterator = this.b.iterator(); - - while (iterator.hasNext()) { - pathfindergoalselectoritem = (PathfinderGoalSelectorItem) iterator.next(); - boolean flag = this.c.contains(pathfindergoalselectoritem); - - if (flag) { - if (this.b(pathfindergoalselectoritem) && this.a(pathfindergoalselectoritem)) { - continue; - } - - pathfindergoalselectoritem.a.d(); - this.c.remove(pathfindergoalselectoritem); - } - - if (this.b(pathfindergoalselectoritem) && pathfindergoalselectoritem.a.a()) { - // CraftBukkit start - call method now instead of queueing - // arraylist.add(pathfindergoalselectoritem); - pathfindergoalselectoritem.a.c(); - // CraftBukkit end - this.c.add(pathfindergoalselectoritem); - } - } - } else { - iterator = this.c.iterator(); - - while (iterator.hasNext()) { - pathfindergoalselectoritem = (PathfinderGoalSelectorItem) iterator.next(); - if (!pathfindergoalselectoritem.a.b()) { - pathfindergoalselectoritem.a.d(); - iterator.remove(); - } - } - } - - this.d.a("goalStart"); - // CraftBukkit start - removed usage of arraylist - /*iterator = arraylist.iterator(); - - while (iterator.hasNext()) { - pathfindergoalselectoritem = (PathfinderGoalSelectorItem) iterator.next(); - this.d.a(pathfindergoalselectoritem.a.getClass().getSimpleName()); - pathfindergoalselectoritem.a.c(); - this.d.b(); - }*/ - // CraftBukkit end - - this.d.b(); - this.d.a("goalTick"); - iterator = this.c.iterator(); - - while (iterator.hasNext()) { - pathfindergoalselectoritem = (PathfinderGoalSelectorItem) iterator.next(); - pathfindergoalselectoritem.a.e(); - } - - this.d.b(); - } - - private boolean a(PathfinderGoalSelectorItem pathfindergoalselectoritem) { - this.d.a("canContinue"); - boolean flag = pathfindergoalselectoritem.a.b(); - - this.d.b(); - return flag; - } - - private boolean b(PathfinderGoalSelectorItem pathfindergoalselectoritem) { - this.d.a("canUse"); - Iterator iterator = this.b.iterator(); - - while (iterator.hasNext()) { - PathfinderGoalSelectorItem pathfindergoalselectoritem1 = (PathfinderGoalSelectorItem) iterator.next(); - - if (pathfindergoalselectoritem1 != pathfindergoalselectoritem) { - if (pathfindergoalselectoritem.b >= pathfindergoalselectoritem1.b) { - // CraftBukkit - switch order - if (!this.a(pathfindergoalselectoritem, pathfindergoalselectoritem1) && this.c.contains(pathfindergoalselectoritem1)) { - this.d.b(); - ((UnsafeList.Itr) iterator).valid = false; // CraftBukkit - mark iterator for reuse - return false; - } - // CraftBukkit - switch order - } else if (!pathfindergoalselectoritem1.a.i() && this.c.contains(pathfindergoalselectoritem1)) { - this.d.b(); - ((UnsafeList.Itr) iterator).valid = false; // CraftBukkit - mark iterator for reuse - return false; - } - } - } - - this.d.b(); - return true; - } - - private boolean a(PathfinderGoalSelectorItem pathfindergoalselectoritem, PathfinderGoalSelectorItem pathfindergoalselectoritem1) { - return (pathfindergoalselectoritem.a.j() & pathfindergoalselectoritem1.a.j()) == 0; - } -} diff --git a/src/main/java/net/minecraft/server/PathfinderGoalSit.java b/src/main/java/net/minecraft/server/PathfinderGoalSit.java deleted file mode 100644 index 60371bed68..0000000000 --- a/src/main/java/net/minecraft/server/PathfinderGoalSit.java +++ /dev/null @@ -1,39 +0,0 @@ -package net.minecraft.server; - -public class PathfinderGoalSit extends PathfinderGoal { - - private EntityTameableAnimal entity; - private boolean willSit; - - public PathfinderGoalSit(EntityTameableAnimal entitytameableanimal) { - this.entity = entitytameableanimal; - this.a(5); - } - - public boolean a() { - if (!this.entity.isTamed()) { - return this.willSit && this.entity.getGoalTarget() == null; // CraftBukkit - Allow sitting for wild animals - } else if (this.entity.M()) { - return false; - } else if (!this.entity.onGround) { - return false; - } else { - EntityLiving entityliving = this.entity.getOwner(); - - return entityliving == null ? true : (this.entity.f(entityliving) < 144.0D && entityliving.getLastDamager() != null ? false : this.willSit); - } - } - - public void c() { - this.entity.getNavigation().h(); - this.entity.setSitting(true); - } - - public void d() { - this.entity.setSitting(false); - } - - public void setSitting(boolean flag) { - this.willSit = flag; - } -} diff --git a/src/main/java/net/minecraft/server/PathfinderGoalTame.java b/src/main/java/net/minecraft/server/PathfinderGoalTame.java deleted file mode 100644 index a13c638251..0000000000 --- a/src/main/java/net/minecraft/server/PathfinderGoalTame.java +++ /dev/null @@ -1,72 +0,0 @@ -package net.minecraft.server; - -public class PathfinderGoalTame extends PathfinderGoal { - - private EntityHorse entity; - private double b; - private double c; - private double d; - private double e; - - public PathfinderGoalTame(EntityHorse entityhorse, double d0) { - this.entity = entityhorse; - this.b = d0; - this.a(1); - } - - public boolean a() { - if (!this.entity.isTame() && this.entity.passenger != null) { - Vec3D vec3d = RandomPositionGenerator.a(this.entity, 5, 4); - - if (vec3d == null) { - return false; - } else { - this.c = vec3d.a; - this.d = vec3d.b; - this.e = vec3d.c; - return true; - } - } else { - return false; - } - } - - public void c() { - this.entity.getNavigation().a(this.c, this.d, this.e, this.b); - } - - public boolean b() { - return !this.entity.getNavigation().g() && this.entity.passenger != null; - } - - public void e() { - if (this.entity.aI().nextInt(50) == 0) { - if (this.entity.passenger instanceof EntityHuman) { - int i = this.entity.getTemper(); - int j = this.entity.getMaxDomestication(); - - // CraftBukkit - fire EntityTameEvent - if (j > 0 && this.entity.aI().nextInt(j) < i && !org.bukkit.craftbukkit.event.CraftEventFactory.callEntityTameEvent(this.entity, (EntityHuman) this.entity.passenger).isCancelled() && this.entity.passenger instanceof EntityHuman) { - this.entity.h((EntityHuman) this.entity.passenger); - this.entity.world.broadcastEntityEffect(this.entity, (byte) 7); - return; - } - - this.entity.v(5); - } - - // CraftBukkit start - Handle dismounting to account for VehicleExitEvent being fired. - if (this.entity.passenger != null) { - this.entity.passenger.mount((Entity) null); - // If the entity still has a passenger, then a plugin cancelled the event. - if (this.entity.passenger != null) { - return; - } - } - // this.entity.passenger = null; - // CraftBukkit end - this.entity.cJ(); - this.entity.world.broadcastEntityEffect(this.entity, (byte) 6); - } - } -} diff --git a/src/main/java/net/minecraft/server/PathfinderGoalTarget.java b/src/main/java/net/minecraft/server/PathfinderGoalTarget.java deleted file mode 100644 index 761fe6da8a..0000000000 --- a/src/main/java/net/minecraft/server/PathfinderGoalTarget.java +++ /dev/null @@ -1,165 +0,0 @@ -package net.minecraft.server; - -import net.minecraft.util.org.apache.commons.lang3.StringUtils; - -// CraftBukkit start -import org.bukkit.craftbukkit.entity.CraftEntity; -import org.bukkit.event.entity.EntityTargetEvent; -// CraftBukkit end - -public abstract class PathfinderGoalTarget extends PathfinderGoal { - - protected EntityCreature c; - protected boolean d; - private boolean a; - private int b; - private int e; - private int f; - - public PathfinderGoalTarget(EntityCreature entitycreature, boolean flag) { - this(entitycreature, flag, false); - } - - public PathfinderGoalTarget(EntityCreature entitycreature, boolean flag, boolean flag1) { - this.c = entitycreature; - this.d = flag; - this.a = flag1; - } - - public boolean b() { - EntityLiving entityliving = this.c.getGoalTarget(); - - if (entityliving == null) { - return false; - } else if (!entityliving.isAlive()) { - return false; - } else { - double d0 = this.f(); - - if (this.c.f(entityliving) > d0 * d0) { - return false; - } else { - if (this.d) { - if (this.c.getEntitySenses().canSee(entityliving)) { - this.f = 0; - } else if (++this.f > 60) { - return false; - } - } - - return !(entityliving instanceof EntityPlayer) || !((EntityPlayer) entityliving).playerInteractManager.isCreative(); - } - } - } - - protected double f() { - AttributeInstance attributeinstance = this.c.getAttributeInstance(GenericAttributes.b); - - return attributeinstance == null ? 16.0D : attributeinstance.getValue(); - } - - public void c() { - this.b = 0; - this.e = 0; - this.f = 0; - } - - public void d() { - this.c.setGoalTarget((EntityLiving) null); - } - - protected boolean a(EntityLiving entityliving, boolean flag) { - if (entityliving == null) { - return false; - } else if (entityliving == this.c) { - return false; - } else if (!entityliving.isAlive()) { - return false; - } else if (!this.c.a(entityliving.getClass())) { - return false; - } else { - if (this.c instanceof EntityOwnable && StringUtils.isNotEmpty(((EntityOwnable) this.c).getOwnerUUID())) { - if (entityliving instanceof EntityOwnable && ((EntityOwnable) this.c).getOwnerUUID().equals(((EntityOwnable) entityliving).getOwnerUUID())) { - return false; - } - - if (entityliving == ((EntityOwnable) this.c).getOwner()) { - return false; - } - } else if (entityliving instanceof EntityHuman && !flag && ((EntityHuman) entityliving).abilities.isInvulnerable) { - return false; - } - - if (!this.c.b(MathHelper.floor(entityliving.locX), MathHelper.floor(entityliving.locY), MathHelper.floor(entityliving.locZ))) { - return false; - } else if (this.d && !this.c.getEntitySenses().canSee(entityliving)) { - return false; - } else { - if (this.a) { - if (--this.e <= 0) { - this.b = 0; - } - - if (this.b == 0) { - this.b = this.a(entityliving) ? 1 : 2; - } - - if (this.b == 2) { - return false; - } - } - - // CraftBukkit start - Check all the different target goals for the reason, default to RANDOM_TARGET - EntityTargetEvent.TargetReason reason = EntityTargetEvent.TargetReason.RANDOM_TARGET; - - if (this instanceof PathfinderGoalDefendVillage) { - reason = EntityTargetEvent.TargetReason.DEFEND_VILLAGE; - } else if (this instanceof PathfinderGoalHurtByTarget) { - reason = EntityTargetEvent.TargetReason.TARGET_ATTACKED_ENTITY; - } else if (this instanceof PathfinderGoalNearestAttackableTarget) { - if (entityliving instanceof EntityHuman) { - reason = EntityTargetEvent.TargetReason.CLOSEST_PLAYER; - } - } else if (this instanceof PathfinderGoalOwnerHurtByTarget) { - reason = EntityTargetEvent.TargetReason.TARGET_ATTACKED_OWNER; - } else if (this instanceof PathfinderGoalOwnerHurtTarget) { - reason = EntityTargetEvent.TargetReason.OWNER_ATTACKED_TARGET; - } - - org.bukkit.event.entity.EntityTargetLivingEntityEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callEntityTargetLivingEvent(this.c, entityliving, reason); - if (event.isCancelled() || event.getTarget() == null) { - this.c.setGoalTarget(null); - return false; - } else if (entityliving.getBukkitEntity() != event.getTarget()) { - this.c.setGoalTarget((EntityLiving) ((CraftEntity) event.getTarget()).getHandle()); - } - if (this.c instanceof EntityCreature) { - ((EntityCreature) this.c).target = ((CraftEntity) event.getTarget()).getHandle(); - } - // CraftBukkit end - - return true; - } - } - } - - private boolean a(EntityLiving entityliving) { - this.e = 10 + this.c.aI().nextInt(5); - PathEntity pathentity = this.c.getNavigation().a(entityliving); - - if (pathentity == null) { - return false; - } else { - PathPoint pathpoint = pathentity.c(); - - if (pathpoint == null) { - return false; - } else { - int i = pathpoint.a - MathHelper.floor(entityliving.locX); - int j = pathpoint.c - MathHelper.floor(entityliving.locZ); - - return (double) (i * i + j * j) <= 2.25D; - } - } - } -} diff --git a/src/main/java/net/minecraft/server/PlayerAbilities.java b/src/main/java/net/minecraft/server/PlayerAbilities.java deleted file mode 100644 index 88718ce01c..0000000000 --- a/src/main/java/net/minecraft/server/PlayerAbilities.java +++ /dev/null @@ -1,54 +0,0 @@ -package net.minecraft.server; - -public class PlayerAbilities { - - public boolean isInvulnerable; - public boolean isFlying; - public boolean canFly; - public boolean canInstantlyBuild; - public boolean mayBuild = true; - public float flySpeed = 0.05F; // CraftBukkit private -> public - public float walkSpeed = 0.1F; // CraftBukkit private -> public - - public PlayerAbilities() {} - - public void a(NBTTagCompound nbttagcompound) { - NBTTagCompound nbttagcompound1 = new NBTTagCompound(); - - nbttagcompound1.setBoolean("invulnerable", this.isInvulnerable); - nbttagcompound1.setBoolean("flying", this.isFlying); - nbttagcompound1.setBoolean("mayfly", this.canFly); - nbttagcompound1.setBoolean("instabuild", this.canInstantlyBuild); - nbttagcompound1.setBoolean("mayBuild", this.mayBuild); - nbttagcompound1.setFloat("flySpeed", this.flySpeed); - nbttagcompound1.setFloat("walkSpeed", this.walkSpeed); - nbttagcompound.set("abilities", nbttagcompound1); - } - - public void b(NBTTagCompound nbttagcompound) { - if (nbttagcompound.hasKeyOfType("abilities", 10)) { - NBTTagCompound nbttagcompound1 = nbttagcompound.getCompound("abilities"); - - this.isInvulnerable = nbttagcompound1.getBoolean("invulnerable"); - this.isFlying = nbttagcompound1.getBoolean("flying"); - this.canFly = nbttagcompound1.getBoolean("mayfly"); - this.canInstantlyBuild = nbttagcompound1.getBoolean("instabuild"); - if (nbttagcompound1.hasKeyOfType("flySpeed", 99)) { - this.flySpeed = nbttagcompound1.getFloat("flySpeed"); - this.walkSpeed = nbttagcompound1.getFloat("walkSpeed"); - } - - if (nbttagcompound1.hasKeyOfType("mayBuild", 1)) { - this.mayBuild = nbttagcompound1.getBoolean("mayBuild"); - } - } - } - - public float a() { - return this.flySpeed; - } - - public float b() { - return this.walkSpeed; - } -} diff --git a/src/main/java/net/minecraft/server/PlayerChunk.java b/src/main/java/net/minecraft/server/PlayerChunk.java deleted file mode 100644 index f5afcb7efc..0000000000 --- a/src/main/java/net/minecraft/server/PlayerChunk.java +++ /dev/null @@ -1,215 +0,0 @@ -package net.minecraft.server; - -import java.util.ArrayList; -import java.util.List; - -// CraftBukkit start -import org.bukkit.craftbukkit.chunkio.ChunkIOExecutor; -import java.util.HashMap; -// CraftBukkit end - -class PlayerChunk { - - private final List b; - private final ChunkCoordIntPair location; - private short[] dirtyBlocks; - private int dirtyCount; - private int f; - private long g; - final PlayerChunkMap playerChunkMap; - // CraftBukkit start - add fields - private final HashMap players = new HashMap(); - private boolean loaded = false; - private Runnable loadedRunnable = new Runnable() { - public void run() { - PlayerChunk.this.loaded = true; - } - }; - // CraftBukkit end - - public PlayerChunk(PlayerChunkMap playerchunkmap, int i, int j) { - this.playerChunkMap = playerchunkmap; - this.b = new ArrayList(); - this.dirtyBlocks = new short[64]; - this.location = new ChunkCoordIntPair(i, j); - playerchunkmap.a().chunkProviderServer.getChunkAt(i, j, this.loadedRunnable); // CraftBukkit - } - - public void a(final EntityPlayer entityplayer) { // CraftBukkit - added final to argument - if (this.b.contains(entityplayer)) { - PlayerChunkMap.c().debug("Failed to add player. {} already is in chunk {}, {}", new Object[] { entityplayer, Integer.valueOf(this.location.x), Integer.valueOf(this.location.z)}); - } else { - if (this.b.isEmpty()) { - this.g = PlayerChunkMap.a(this.playerChunkMap).getTime(); - } - - this.b.add(entityplayer); - // CraftBukkit start - use async chunk io - Runnable playerRunnable; - if (this.loaded) { - playerRunnable = null; - entityplayer.chunkCoordIntPairQueue.add(this.location); - } else { - playerRunnable = new Runnable() { - public void run() { - entityplayer.chunkCoordIntPairQueue.add(PlayerChunk.this.location); - } - }; - this.playerChunkMap.a().chunkProviderServer.getChunkAt(this.location.x, this.location.z, playerRunnable); - } - - this.players.put(entityplayer, playerRunnable); - // CraftBukkit end - } - } - - public void b(EntityPlayer entityplayer) { - if (this.b.contains(entityplayer)) { - // CraftBukkit start - If we haven't loaded yet don't load the chunk just so we can clean it up - if (!this.loaded) { - ChunkIOExecutor.dropQueuedChunkLoad(this.playerChunkMap.a(), this.location.x, this.location.z, this.players.get(entityplayer)); - this.b.remove(entityplayer); - this.players.remove(entityplayer); - - if (this.b.isEmpty()) { - ChunkIOExecutor.dropQueuedChunkLoad(this.playerChunkMap.a(), this.location.x, this.location.z, this.loadedRunnable); - long i = (long) this.location.x + 2147483647L | (long) this.location.z + 2147483647L << 32; - PlayerChunkMap.b(this.playerChunkMap).remove(i); - PlayerChunkMap.c(this.playerChunkMap).remove(this); - } - - return; - } - // CraftBukkit end - - Chunk chunk = PlayerChunkMap.a(this.playerChunkMap).getChunkAt(this.location.x, this.location.z); - - if (chunk.isReady()) { - entityplayer.playerConnection.sendPacket(new PacketPlayOutMapChunk(chunk, true, 0)); - } - - this.players.remove(entityplayer); // CraftBukkit - 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; - - this.a(chunk); - PlayerChunkMap.b(this.playerChunkMap).remove(i); - PlayerChunkMap.c(this.playerChunkMap).remove(this); - if (this.dirtyCount > 0) { - PlayerChunkMap.d(this.playerChunkMap).remove(this); - } - - this.playerChunkMap.a().chunkProviderServer.queueUnload(this.location.x, this.location.z); - } - } - } - - public void a() { - this.a(PlayerChunkMap.a(this.playerChunkMap).getChunkAt(this.location.x, this.location.z)); - } - - private void a(Chunk chunk) { - chunk.s += PlayerChunkMap.a(this.playerChunkMap).getTime() - this.g; - this.g = PlayerChunkMap.a(this.playerChunkMap).getTime(); - } - - public void a(int i, int j, int k) { - if (this.dirtyCount == 0) { - PlayerChunkMap.d(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 b() { - 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 PacketPlayOutBlockChange(i, j, k, PlayerChunkMap.a(this.playerChunkMap))); - if (PlayerChunkMap.a(this.playerChunkMap).getType(i, j, k).isTileEntity()) { - 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 PacketPlayOutMapChunk(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 PacketPlayOutMultiBlockChange(this.dirtyCount, this.dirtyBlocks, PlayerChunkMap.a(this.playerChunkMap).getChunkAt(this.location.x, this.location.z))); - - 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).getType(j, k, l).isTileEntity()) { - 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 deleted file mode 100644 index ae53635dde..0000000000 --- a/src/main/java/net/minecraft/server/PlayerChunkMap.java +++ /dev/null @@ -1,371 +0,0 @@ -package net.minecraft.server; - -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; - -// CraftBukkit start -import java.util.Collections; -import java.util.Queue; -import java.util.LinkedList; -// CraftBukkit end - -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; - -public class PlayerChunkMap { - - private static final Logger a = LogManager.getLogger(); - private final WorldServer world; - private final List managedPlayers = new ArrayList(); - private final LongHashMap d = new LongHashMap(); - private final Queue e = new java.util.concurrent.ConcurrentLinkedQueue(); // CraftBukkit ArrayList -> ConcurrentLinkedQueue - private final Queue f = new java.util.concurrent.ConcurrentLinkedQueue(); // CraftBukkit ArrayList -> ConcurrentLinkedQueue - private int g; - private long h; - private final int[][] i = new int[][] { { 1, 0}, { 0, 1}, { -1, 0}, { 0, -1}}; - private boolean wasNotEmpty; // CraftBukkit - add field - - public PlayerChunkMap(WorldServer worldserver) { - this.world = worldserver; - this.a(worldserver.getMinecraftServer().getPlayerList().s()); - } - - public WorldServer a() { - return this.world; - } - - public void flush() { - long i = this.world.getTime(); - int j; - PlayerChunk playerchunk; - - if (i - this.h > 8000L) { - this.h = i; - - // CraftBukkit start - Use iterator - java.util.Iterator iterator = this.f.iterator(); - while (iterator.hasNext()) { - playerchunk = (PlayerChunk) iterator.next(); - playerchunk.b(); - playerchunk.a(); - } - } else { - java.util.Iterator iterator = this.e.iterator(); - - while (iterator.hasNext()) { - playerchunk = (PlayerChunk) iterator.next(); - playerchunk.b(); - iterator.remove(); - // CraftBukkit end - } - } - - // this.e.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.b(); - } - // CraftBukkit start - wasNotEmpty = false; - } else { - wasNotEmpty = true; - } - // CraftBukkit end - } - - public boolean a(int i, int j) { - long k = (long) i + 2147483647L | (long) j + 2147483647L << 32; - - return this.d.getEntry(k) != null; - } - - private PlayerChunk a(int i, int j, boolean flag) { - long k = (long) i + 2147483647L | (long) j + 2147483647L << 32; - PlayerChunk playerchunk = (PlayerChunk) this.d.getEntry(k); - - if (playerchunk == null && flag) { - playerchunk = new PlayerChunk(this, i, j); - this.d.put(k, playerchunk); - this.f.add(playerchunk); - } - - return playerchunk; - } - // CraftBukkit start - add method - 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.g; k <= i + this.g; ++k) { - for (int l = j - this.g; l <= j + this.g; ++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.g; - 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.i[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.i[i][0]; - j1 += this.i[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.g; k <= i + this.g; ++k) { - for (int l = j - this.g; l <= j + this.g; ++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.g; - 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 && PlayerChunk.b(playerchunk).contains(entityplayer) && !entityplayer.chunkCoordIntPairQueue.contains(PlayerChunk.a(playerchunk)); - } - - public void a(int i) { - i = MathHelper.a(i, 3, 20); - if (i != this.g) { - int j = i - this.g; - Iterator iterator = this.managedPlayers.iterator(); - - while (iterator.hasNext()) { - EntityPlayer entityplayer = (EntityPlayer) iterator.next(); - int k = (int) entityplayer.locX >> 4; - int l = (int) entityplayer.locZ >> 4; - int i1; - int j1; - - if (j > 0) { - for (i1 = k - i; i1 <= k + i; ++i1) { - for (j1 = l - i; j1 <= l + i; ++j1) { - PlayerChunk playerchunk = this.a(i1, j1, true); - - if (!PlayerChunk.b(playerchunk).contains(entityplayer)) { - playerchunk.a(entityplayer); - } - } - } - } else { - for (i1 = k - this.g; i1 <= k + this.g; ++i1) { - for (j1 = l - this.g; j1 <= l + this.g; ++j1) { - if (!this.a(i1, j1, k, l, i)) { - this.a(i1, j1, true).b(entityplayer); - } - } - } - } - } - - this.g = i; - } - } - - public static int getFurthestViewableBlock(int i) { - return i * 16 - 16; - } - - static Logger c() { - return a; - } - - static WorldServer a(PlayerChunkMap playerchunkmap) { - return playerchunkmap.world; - } - - static LongHashMap b(PlayerChunkMap playerchunkmap) { - return playerchunkmap.d; - } - - static Queue c(PlayerChunkMap playermanager) { // CraftBukkit List -> Queue - return playermanager.f; - } - - static Queue d(PlayerChunkMap playermanager) { // CraftBukkit List -> Queue - return playermanager.e; - } - - // 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 deleted file mode 100644 index 3a984394bb..0000000000 --- a/src/main/java/net/minecraft/server/PlayerConnection.java +++ /dev/null @@ -1,1855 +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.Date; -import java.util.Iterator; -import java.util.Random; -import java.util.concurrent.Callable; - -import net.minecraft.util.com.google.common.base.Charsets; -import net.minecraft.util.com.google.common.collect.Lists; -import net.minecraft.util.io.netty.buffer.Unpooled; -import net.minecraft.util.io.netty.util.concurrent.GenericFutureListener; -import net.minecraft.util.org.apache.commons.lang3.StringUtils; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; - -// CraftBukkit start -import java.io.UnsupportedEncodingException; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.atomic.AtomicIntegerFieldUpdater; -import java.util.HashSet; - -import org.bukkit.craftbukkit.entity.CraftPlayer; -import org.bukkit.craftbukkit.event.CraftEventFactory; -import org.bukkit.craftbukkit.inventory.CraftInventoryView; -import org.bukkit.craftbukkit.inventory.CraftItemStack; -import org.bukkit.craftbukkit.util.CraftChatMessage; -import org.bukkit.craftbukkit.util.LazyPlayerSet; -import org.bukkit.craftbukkit.util.Waitable; - -import org.bukkit.Location; -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.inventory.ClickType; -import org.bukkit.event.inventory.CraftItemEvent; -import org.bukkit.event.inventory.InventoryAction; -import org.bukkit.event.inventory.InventoryClickEvent; -import org.bukkit.event.inventory.InventoryCreativeEvent; -import org.bukkit.event.inventory.InventoryType.SlotType; -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.PlayerToggleFlightEvent; -import org.bukkit.event.player.PlayerToggleSneakEvent; -import org.bukkit.event.player.PlayerToggleSprintEvent; -import org.bukkit.inventory.CraftingInventory; -import org.bukkit.inventory.InventoryView; -import org.bukkit.util.NumberConversions; -// CraftBukkit end - -public class PlayerConnection implements PacketPlayInListener { - - private static final Logger c = LogManager.getLogger(); - public final NetworkManager networkManager; - private final MinecraftServer minecraftServer; - public EntityPlayer player; - private int e; - private int f; - private boolean g; - private int h; - private long i; - private static Random j = new Random(); - private long k; - private volatile int chatThrottle; private static final AtomicIntegerFieldUpdater chatSpamField = AtomicIntegerFieldUpdater.newUpdater(PlayerConnection.class, "chatThrottle"); // CraftBukkit - multithreaded field - private int x; - private IntHashMap n = new IntHashMap(); - private double y; - private double z; - private double q; - public boolean checkMovement = true; // CraftBukkit - private -> public - private boolean processedDisconnect; // CraftBukkit - added - - public PlayerConnection(MinecraftServer minecraftserver, NetworkManager networkmanager, EntityPlayer entityplayer) { - this.minecraftServer = minecraftserver; - this.networkManager = networkmanager; - networkmanager.a((PacketListener) this); - this.player = entityplayer; - entityplayer.playerConnection = this; - - // CraftBukkit start - add fields and methods - 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 SURVIVAL_PLACE_DISTANCE_SQUARED = 6 * 6; - private static final int CREATIVE_PLACE_DISTANCE_SQUARED = 7 * 7; - - // 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 PacketPlayOutBlockPlace hack :( - Long lastPacket; - - // Store the last block right clicked and what type it was - private Item 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, 104, 105, 115, 117, 118, 119, 125, 127, 132, 140, 141, 142, 144)); // TODO: Check after every update. - // CraftBukkit end - - public void a() { - this.g = false; - ++this.e; - this.minecraftServer.methodProfiler.a("keepAlive"); - if ((long) this.e - this.k > 40L) { - this.k = (long) this.e; - this.i = this.d(); - this.h = (int) this.i; - this.sendPacket(new PacketPlayOutKeepAlive(this.h)); - } - - // CraftBukkit start - for (int spam; (spam = this.chatThrottle) > 0 && !chatSpamField.compareAndSet(this, spam, spam - 1); ) ; - /* Use thread-safe field access instead - if (this.chatThrottle > 0) { - --this.chatThrottle; - } - */ - // CraftBukkit end - - if (this.x > 0) { - --this.x; - } - - if (this.player.x() > 0L && this.minecraftServer.getIdleTimeout() > 0 && MinecraftServer.ar() - this.player.x() > (long) (this.minecraftServer.getIdleTimeout() * 1000 * 60)) { - this.disconnect("You have been idle for too long!"); - } - } - - public NetworkManager b() { - return this.networkManager; - } - - public void disconnect(String s) { - // CraftBukkit start - fire PlayerKickEvent - String leaveMessage = EnumChatFormat.YELLOW + this.player.getName() + " 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 - ChatComponentText chatcomponenttext = new ChatComponentText(s); - - this.networkManager.handle(new PacketPlayOutKickDisconnect(chatcomponenttext), new GenericFutureListener[] { new PlayerConnectionFuture(this, chatcomponenttext)}); - this.a(chatcomponenttext); // CraftBukkit - Process quit immediately - this.networkManager.g(); - } - - public void a(PacketPlayInSteerVehicle packetplayinsteervehicle) { - this.player.a(packetplayinsteervehicle.c(), packetplayinsteervehicle.d(), packetplayinsteervehicle.e(), packetplayinsteervehicle.f()); - } - - public void a(PacketPlayInFlying packetplayinflying) { - // CraftBukkit start - Check for NaN - if (Double.isNaN(packetplayinflying.x) || Double.isNaN(packetplayinflying.y) || Double.isNaN(packetplayinflying.z) || Double.isNaN(packetplayinflying.stance)) { - c.warn(player.getName() + " was caught trying to crash the server with an invalid position."); - getPlayer().kickPlayer("Nope!"); - return; - } - // CraftBukkit end - WorldServer worldserver = this.minecraftServer.getWorldServer(this.player.dimension); - - this.g = true; - if (!this.player.viewingCredits) { - double d0; - - if (!this.checkMovement) { - d0 = packetplayinflying.d() - this.z; - if (packetplayinflying.c() == this.y && d0 * d0 < 0.01D && packetplayinflying.e() == this.q) { - this.checkMovement = true; - } - } - - // CraftBukkit start - fire PlayerMoveEvent - 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 (packetplayinflying.hasPos && !(packetplayinflying.hasPos && packetplayinflying.y == -999.0D && packetplayinflying.stance == -999.0D)) { - to.setX(packetplayinflying.x); - to.setY(packetplayinflying.y); - to.setZ(packetplayinflying.z); - } - - // If the packet contains look information then we update the To location with the correct Yaw & Pitch. - if (packetplayinflying.hasLook) { - to.setYaw(packetplayinflying.yaw); - to.setPitch(packetplayinflying.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 PacketPlayOutPosition(from.getX(), from.getY() + 1.6200000047683716D, 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 (this.checkMovement && !this.player.dead) { - // CraftBukkit end - double d1; - double d2; - double d3; - - if (this.player.vehicle != null) { - float f = this.player.yaw; - float f1 = this.player.pitch; - - this.player.vehicle.ac(); - d1 = this.player.locX; - d2 = this.player.locY; - d3 = this.player.locZ; - if (packetplayinflying.k()) { - f = packetplayinflying.g(); - f1 = packetplayinflying.h(); - } - - this.player.onGround = packetplayinflying.i(); - this.player.i(); - this.player.V = 0.0F; - this.player.setLocation(d1, d2, d3, f, f1); - if (this.player.vehicle != null) { - this.player.vehicle.ac(); - } - - this.minecraftServer.getPlayerList().d(this.player); - if (this.checkMovement) { - 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.i(); - 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 (packetplayinflying.j() && packetplayinflying.d() == -999.0D && packetplayinflying.f() == -999.0D) { - packetplayinflying.a(false); - } - - double d4; - - if (packetplayinflying.j()) { - d1 = packetplayinflying.c(); - d2 = packetplayinflying.d(); - d3 = packetplayinflying.e(); - d4 = packetplayinflying.f() - packetplayinflying.d(); - if (!this.player.isSleeping() && (d4 > 1.65D || d4 < 0.1D)) { - this.disconnect("Illegal stance"); - c.warn(this.player.getName() + " had an illegal stance: " + d4); - return; - } - - if (Math.abs(packetplayinflying.c()) > 3.2E7D || Math.abs(packetplayinflying.e()) > 3.2E7D) { - this.disconnect("Illegal position"); - return; - } - } - - if (packetplayinflying.k()) { - f2 = packetplayinflying.g(); - f3 = packetplayinflying.h(); - } - - this.player.i(); - this.player.V = 0.0F; - this.player.setLocation(this.y, this.z, this.q, f2, f3); - if (!this.checkMovement) { - return; - } - - d4 = d1 - this.player.locX; - double d5 = d2 - this.player.locY; - double d6 = d3 - this.player.locZ; - // CraftBukkit start - min to max - double d7 = Math.max(Math.abs(d4), Math.abs(this.player.motX)); - double d8 = Math.max(Math.abs(d5), Math.abs(this.player.motY)); - double d9 = Math.max(Math.abs(d6), Math.abs(this.player.motZ)); - // CraftBukkit end - double d10 = d7 * d7 + d8 * d8 + d9 * d9; - - if (d10 > 100.0D && this.checkMovement && (!this.minecraftServer.N() || !this.minecraftServer.M().equals(this.player.getName()))) { // CraftBukkit - Added this.checkMovement condition to solve this check being triggered by teleports - c.warn(this.player.getName() + " moved too quickly! " + d4 + "," + d5 + "," + d6 + " (" + d7 + ", " + d8 + ", " + d9 + ")"); - 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 && !packetplayinflying.i() && d5 > 0.0D) { - this.player.bj(); - } - - this.player.move(d4, d5, d6); - this.player.onGround = packetplayinflying.i(); - this.player.checkMovement(d4, d5, d6); - double d11 = d5; - - d4 = d1 - this.player.locX; - d5 = d2 - this.player.locY; - if (d5 > -0.5D || d5 < 0.5D) { - d5 = 0.0D; - } - - d6 = d3 - this.player.locZ; - d10 = d4 * d4 + d5 * d5 + d6 * d6; - boolean flag1 = false; - - if (d10 > 0.0625D && !this.player.isSleeping() && !this.player.playerInteractManager.isCreative()) { - flag1 = true; - c.warn(this.player.getName() + " 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 (d11 >= -0.03125D) { - ++this.f; - if (this.f > 80) { - c.warn(this.player.getName() + " was kicked for floating too long!"); - this.disconnect("Flying is not enabled on this server"); - return; - } - } - } else { - this.f = 0; - } - - this.player.onGround = packetplayinflying.i(); - this.minecraftServer.getPlayerList().d(this.player); - this.player.b(this.player.locY - d0, packetplayinflying.i()); - } else if (this.e % 20 == 0) { - this.a(this.y, this.z, this.q, this.player.yaw, this.player.pitch); - } - } - } - - 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 PacketPlayOutPosition(d0, d1 + 1.6200000047683716D, d2, f, f1, false)); - } - - public void a(PacketPlayInBlockDig packetplayinblockdig) { - if (this.player.dead) return; // CraftBukkit - WorldServer worldserver = this.minecraftServer.getWorldServer(this.player.dimension); - - this.player.v(); - if (packetplayinblockdig.g() == 4) { - // CraftBukkit start - limit how quickly items can be dropped - // 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) { - this.c.warn(this.player.getName() + " dropped their items too quickly!"); - this.disconnect("You dropped your items too quickly (Hacking?)"); - return; - } - } - // CraftBukkit end - this.player.a(false); - } else if (packetplayinblockdig.g() == 3) { - this.player.a(true); - } else if (packetplayinblockdig.g() == 5) { - this.player.bA(); - } else { - boolean flag = false; - - if (packetplayinblockdig.g() == 0) { - flag = true; - } - - if (packetplayinblockdig.g() == 1) { - flag = true; - } - - if (packetplayinblockdig.g() == 2) { - flag = true; - } - - int i = packetplayinblockdig.c(); - int j = packetplayinblockdig.d(); - int k = packetplayinblockdig.e(); - - if (flag) { - 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; - } - } - - if (packetplayinblockdig.g() == 0) { - if (!this.minecraftServer.a(worldserver, i, j, k, this.player)) { - this.player.playerInteractManager.dig(i, j, k, packetplayinblockdig.f()); - } else { - // CraftBukkit start - fire PlayerInteractEvent - CraftEventFactory.callPlayerInteractEvent(this.player, Action.LEFT_CLICK_BLOCK, i, j, k, packetplayinblockdig.f(), this.player.inventory.getItemInHand()); - this.player.playerConnection.sendPacket(new PacketPlayOutBlockChange(i, j, k, worldserver)); - // Update any tile entity data for this block - TileEntity tileentity = worldserver.getTileEntity(i, j, k); - if (tileentity != null) { - this.player.playerConnection.sendPacket(tileentity.getUpdatePacket()); - } - // CraftBukkit end - } - } else if (packetplayinblockdig.g() == 2) { - this.player.playerInteractManager.a(i, j, k); - if (worldserver.getType(i, j, k).getMaterial() != Material.AIR) { - this.player.playerConnection.sendPacket(new PacketPlayOutBlockChange(i, j, k, worldserver)); - } - } else if (packetplayinblockdig.g() == 1) { - this.player.playerInteractManager.c(i, j, k); - if (worldserver.getType(i, j, k).getMaterial() != Material.AIR) { - this.player.playerConnection.sendPacket(new PacketPlayOutBlockChange(i, j, k, worldserver)); - } - } - } - } - - public void a(PacketPlayInBlockPlace packetplayinblockplace) { - 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 (packetplayinblockplace.getFace() == 255) { - if (packetplayinblockplace.getItemStack() != null && packetplayinblockplace.getItemStack().getItem() == this.lastMaterial && this.lastPacket != null && packetplayinblockplace.timestamp - this.lastPacket < 100) { - this.lastPacket = null; - return; - } - } else { - this.lastMaterial = packetplayinblockplace.getItemStack() == null ? null : packetplayinblockplace.getItemStack().getItem(); - this.lastPacket = packetplayinblockplace.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 = packetplayinblockplace.c(); - int j = packetplayinblockplace.d(); - int k = packetplayinblockplace.e(); - int l = packetplayinblockplace.getFace(); - - this.player.v(); - if (packetplayinblockplace.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) || itemstack.getItem() == Item.getItemOf(Blocks.WATER_LILY); - // CraftBukkit end - } else if (packetplayinblockplace.d() >= this.minecraftServer.getMaxBuildHeight() - 1 && (packetplayinblockplace.getFace() == 1 || packetplayinblockplace.d() >= this.minecraftServer.getMaxBuildHeight())) { - ChatMessage chatmessage = new ChatMessage("build.tooHigh", new Object[] { Integer.valueOf(this.minecraftServer.getMaxBuildHeight())}); - - chatmessage.getChatModifier().setColor(EnumChatFormat.RED); - this.player.playerConnection.sendPacket(new PacketPlayOutChat(chatmessage)); - flag = true; - } else { - // CraftBukkit start - Check if we can actually do something over this large a distance - Location eyeLoc = this.getPlayer().getEyeLocation(); - double reachDistance = NumberConversions.square(eyeLoc.getX() - i) + NumberConversions.square(eyeLoc.getY() - j) + NumberConversions.square(eyeLoc.getZ() - k); - if (reachDistance > (this.getPlayer().getGameMode() == org.bukkit.GameMode.CREATIVE ? CREATIVE_PLACE_DISTANCE_SQUARED : SURVIVAL_PLACE_DISTANCE_SQUARED)) { - return; - } - - if (!this.player.playerInteractManager.interact(this.player, worldserver, itemstack, i, j, k, l, packetplayinblockplace.h(), packetplayinblockplace.i(), packetplayinblockplace.j())) { - always = true; // force PacketPlayOutSetSlot to be sent to client to update ItemStack count - } - // CraftBukkit end - - flag = true; - } - - if (flag) { - this.player.playerConnection.sendPacket(new PacketPlayOutBlockChange(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 PacketPlayOutBlockChange(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.n() == 0) { - this.player.g = true; - this.player.inventory.items[this.player.inventory.itemInHandIndex] = ItemStack.b(this.player.inventory.items[this.player.inventory.itemInHandIndex]); - Slot slot = this.player.activeContainer.getSlot((IInventory) this.player.inventory, this.player.inventory.itemInHandIndex); - - this.player.activeContainer.b(); - this.player.g = 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(), packetplayinblockplace.getItemStack()) || always) { - this.sendPacket(new PacketPlayOutSetSlot(this.player.activeContainer.windowId, slot.rawSlotIndex, this.player.inventory.getItemInHand())); - } - } - } - - public void a(IChatBaseComponent ichatbasecomponent) { - // CraftBukkit start - Rarely it would send a disconnect line twice - if (this.processedDisconnect) { - return; - } else { - this.processedDisconnect = true; - } - // CraftBukkit end - c.info(this.player.getName() + " lost connection: " + ichatbasecomponent.c()); // CraftBukkit - Don't toString the component - this.minecraftServer.az(); - // CraftBukkit start - Replace vanilla quit message handling with our own. - /* - ChatMessage chatmessage = new ChatMessage("multiplayer.player.left", new Object[] { this.player.getScoreboardDisplayName()}); - - chatmessage.getChatModifier().setColor(EnumChatFormat.YELLOW); - this.minecraftServer.getPlayerList().sendMessage(chatmessage); - */ - - this.player.n(); - String quitMessage = this.minecraftServer.getPlayerList().disconnect(this.player); - if ((quitMessage != null) && (quitMessage.length() > 0)) { - this.minecraftServer.getPlayerList().sendMessage(CraftChatMessage.fromString(quitMessage)); - } - // CraftBukkit end - if (this.minecraftServer.N() && this.player.getName().equals(this.minecraftServer.M())) { - c.info("Stopping singleplayer server as player logged out"); - this.minecraftServer.safeShutdown(); - } - } - - public void sendPacket(Packet packet) { - if (packet instanceof PacketPlayOutChat) { - PacketPlayOutChat packetplayoutchat = (PacketPlayOutChat) packet; - EnumChatVisibility enumchatvisibility = this.player.getChatFlags(); - - if (enumchatvisibility == EnumChatVisibility.HIDDEN) { - return; - } - - if (enumchatvisibility == EnumChatVisibility.SYSTEM && !packetplayoutchat.d()) { - return; - } - } - - // CraftBukkit start - if (packet == null) { - return; - } else if (packet instanceof PacketPlayOutSpawnPosition) { - PacketPlayOutSpawnPosition packet6 = (PacketPlayOutSpawnPosition) packet; - this.player.compassTarget = new Location(this.getPlayer().getWorld(), packet6.x, packet6.y, packet6.z); - } - // CraftBukkit end - - try { - this.networkManager.handle(packet, new GenericFutureListener[0]); - } catch (Throwable throwable) { - CrashReport crashreport = CrashReport.a(throwable, "Sending packet"); - CrashReportSystemDetails crashreportsystemdetails = crashreport.a("Packet being sent"); - - crashreportsystemdetails.a("Packet class", (Callable) (new CrashReportConnectionPacketClass(this, packet))); - throw new ReportedException(crashreport); - } - } - - public void a(PacketPlayInHeldItemSlot packetplayinhelditemslot) { - // CraftBukkit start - if (this.player.dead) return; - - if (packetplayinhelditemslot.c() >= 0 && packetplayinhelditemslot.c() < PlayerInventory.getHotbarSize()) { - PlayerItemHeldEvent event = new PlayerItemHeldEvent(this.getPlayer(), this.player.inventory.itemInHandIndex, packetplayinhelditemslot.c()); - this.server.getPluginManager().callEvent(event); - if (event.isCancelled()) { - this.sendPacket(new PacketPlayOutHeldItemSlot(this.player.inventory.itemInHandIndex)); - this.player.v(); - return; - } - // CraftBukkit end - - this.player.inventory.itemInHandIndex = packetplayinhelditemslot.c(); - this.player.v(); - } else { - c.warn(this.player.getName() + " tried to set an invalid carried item"); - this.disconnect("Nope!"); // CraftBukkit - } - } - - public void a(PacketPlayInChat packetplayinchat) { - if (this.player.dead || this.player.getChatFlags() == EnumChatVisibility.HIDDEN) { // CraftBukkit - dead men tell no tales - ChatMessage chatmessage = new ChatMessage("chat.cannotSend", new Object[0]); - - chatmessage.getChatModifier().setColor(EnumChatFormat.RED); - this.sendPacket(new PacketPlayOutChat(chatmessage)); - } else { - this.player.v(); - String s = packetplayinchat.c(); - - s = StringUtils.normalizeSpace(s); - - for (int i = 0; i < s.length(); ++i) { - if (!SharedConstants.isAllowedChatCharacter(s.charAt(i))) { - // CraftBukkit start - threadsafety - if (packetplayinchat.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 (!packetplayinchat.a()) { - try { - this.minecraftServer.server.playerCommandState = true; - this.handleCommand(s); - } finally { - this.minecraftServer.server.playerCommandState = false; - } - } else if (s.isEmpty()) { - c.warn(this.player.getName() + " tried to send an empty message"); - } else if (getPlayer().isConversing()) { - getPlayer().acceptConversationInput(s); - } else if (this.player.getChatFlags() == EnumChatVisibility.SYSTEM) { // Re-add "Command Only" flag check - ChatMessage chatmessage = new ChatMessage("chat.cannotSend", new Object[0]); - - chatmessage.getChatModifier().setColor(EnumChatFormat.RED); - this.sendPacket(new PacketPlayOutChat(chatmessage)); - } else if (true) { - this.chat(s, true); - // CraftBukkit end - the below is for reference. :) - } else { - ChatMessage chatmessage1 = new ChatMessage("chat.type.text", new Object[] { this.player.getScoreboardDisplayName(), s}); - - this.minecraftServer.getPlayerList().sendMessage(chatmessage1, false); - } - - // CraftBukkit start - replaced with thread safe throttle - // this.chatThrottle += 20; - if (chatSpamField.addAndGet(this, 20) > 200 && !this.minecraftServer.getPlayerList().isOp(this.player.getProfile())) { - if (packetplayinchat.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 - } - } - } - - // CraftBukkit start - add method - public void chat(String s, boolean async) { - if (s.isEmpty() || this.player.getChatFlags() == EnumChatVisibility.HIDDEN) { - return; - } - - if (!async && s.startsWith("/")) { - this.handleCommand(s); - } else if (this.player.getChatFlags() == EnumChatVisibility.SYSTEM) { - // Do nothing, this is coming from a plugin - } 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() { - org.bukkit.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(CraftChatMessage.fromString(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(CraftChatMessage.fromString(s)); - } - } else { - for (Player recipient : event.getRecipients()) { - recipient.sendMessage(s); - } - } - } - } - } - // CraftBukkit end - - private void handleCommand(String s) { - // CraftBukkit start - whole method - this.c.info(this.player.getName() + " issued server command: " + s); - - CraftPlayer player = this.getPlayer(); - - PlayerCommandPreprocessEvent event = new PlayerCommandPreprocessEvent(player, s, new LazyPlayerSet()); - this.server.getPluginManager().callEvent(event); - - if (event.isCancelled()) { - return; - } - - try { - 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"); - java.util.logging.Logger.getLogger(PlayerConnection.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); - return; - } - //this.minecraftServer.getCommandHandler().a(this.player, s); - // CraftBukkit end - } - - public void a(PacketPlayInArmAnimation packetplayinarmanimation) { - if (this.player.dead) return; // CraftBukkit - this.player.v(); - if (packetplayinarmanimation.d() == 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 = Vec3D.a(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, false); - - if (movingobjectposition == null || movingobjectposition.type != EnumMovingObjectType.BLOCK) { - 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.ba(); - } - } - - public void a(PacketPlayInEntityAction packetplayinentityaction) { - // CraftBukkit start - if (this.player.dead) return; - - this.player.v(); - if (packetplayinentityaction.d() == 1 || packetplayinentityaction.d() == 2) { - PlayerToggleSneakEvent event = new PlayerToggleSneakEvent(this.getPlayer(), packetplayinentityaction.d() == 1); - this.server.getPluginManager().callEvent(event); - - if (event.isCancelled()) { - return; - } - } - - if (packetplayinentityaction.d() == 4 || packetplayinentityaction.d() == 5) { - PlayerToggleSprintEvent event = new PlayerToggleSprintEvent(this.getPlayer(), packetplayinentityaction.d() == 4); - this.server.getPluginManager().callEvent(event); - - if (event.isCancelled()) { - return; - } - } - // CraftBukkit end - - if (packetplayinentityaction.d() == 1) { - this.player.setSneaking(true); - } else if (packetplayinentityaction.d() == 2) { - this.player.setSneaking(false); - } else if (packetplayinentityaction.d() == 4) { - this.player.setSprinting(true); - } else if (packetplayinentityaction.d() == 5) { - this.player.setSprinting(false); - } else if (packetplayinentityaction.d() == 3) { - this.player.a(false, true, true); - //this.checkMovement = false; // CraftBukkit - this is handled in teleport - } else if (packetplayinentityaction.d() == 6) { - if (this.player.vehicle != null && this.player.vehicle instanceof EntityHorse) { - ((EntityHorse) this.player.vehicle).w(packetplayinentityaction.e()); - } - } else if (packetplayinentityaction.d() == 7 && this.player.vehicle != null && this.player.vehicle instanceof EntityHorse) { - ((EntityHorse) this.player.vehicle).g(this.player); - } - } - - public void a(PacketPlayInUseEntity packetplayinuseentity) { - if (this.player.dead) return; // CraftBukkit - WorldServer worldserver = this.minecraftServer.getWorldServer(this.player.dimension); - Entity entity = packetplayinuseentity.a((World) worldserver); - - this.player.v(); - if (entity != null) { - boolean flag = this.player.hasLineOfSight(entity); - double d0 = 36.0D; - - if (!flag) { - d0 = 9.0D; - } - - if (this.player.f(entity) < d0) { - ItemStack itemInHand = this.player.inventory.getItemInHand(); // CraftBukkit - if (packetplayinuseentity.c() == EnumEntityUseAction.INTERACT) { - // CraftBukkit start - boolean triggerTagUpdate = itemInHand != null && itemInHand.getItem() == Items.NAME_TAG && entity instanceof EntityInsentient; - boolean triggerChestUpdate = itemInHand != null && itemInHand.getItem() == Item.getItemOf(Blocks.CHEST) && entity instanceof EntityHorse; - boolean triggerLeashUpdate = itemInHand != null && itemInHand.getItem() == Items.LEASH && entity instanceof EntityInsentient; - PlayerInteractEntityEvent event = new PlayerInteractEntityEvent((Player) this.getPlayer(), entity.getBukkitEntity()); - this.server.getPluginManager().callEvent(event); - - if (triggerLeashUpdate && (event.isCancelled() || this.player.inventory.getItemInHand() == null || this.player.inventory.getItemInHand().getItem() != Items.LEASH)) { - // Refresh the current leash state - this.sendPacket(new PacketPlayOutAttachEntity(1, entity, ((EntityInsentient) entity).getLeashHolder())); - } - - if (triggerTagUpdate && (event.isCancelled() || this.player.inventory.getItemInHand() == null || this.player.inventory.getItemInHand().getItem() != Items.NAME_TAG)) { - // Refresh the current entity metadata - this.sendPacket(new PacketPlayOutEntityMetadata(entity.getId(), entity.datawatcher, true)); - } - if (triggerChestUpdate && (event.isCancelled() || this.player.inventory.getItemInHand() == null || this.player.inventory.getItemInHand().getItem() != Item.getItemOf(Blocks.CHEST))) { - this.sendPacket(new PacketPlayOutEntityMetadata(entity.getId(), entity.datawatcher, true)); - } - - if (event.isCancelled()) { - return; - } - // CraftBukkit end - - this.player.q(entity); - - // CraftBukkit start - if (itemInHand != null && itemInHand.count <= -1) { - this.player.updateInventory(this.player.activeContainer); - } - // CraftBukkit end - } else if (packetplayinuseentity.c() == EnumEntityUseAction.ATTACK) { - if (entity instanceof EntityItem || entity instanceof EntityExperienceOrb || entity instanceof EntityArrow || entity == this.player) { - this.disconnect("Attempting to attack an invalid entity"); - this.minecraftServer.warning("Player " + this.player.getName() + " tried to attack an invalid entity"); - return; - } - - this.player.attack(entity); - - // CraftBukkit start - if (itemInHand != null && itemInHand.count <= -1) { - this.player.updateInventory(this.player.activeContainer); - } - // CraftBukkit end - } - } - } - } - - public void a(PacketPlayInClientCommand packetplayinclientcommand) { - this.player.v(); - EnumClientCommand enumclientcommand = packetplayinclientcommand.c(); - - switch (ClientCommandOrdinalWrapper.a[enumclientcommand.ordinal()]) { - case 1: - if (this.player.viewingCredits) { - this.minecraftServer.getPlayerList().changeDimension(this.player, 0, PlayerTeleportEvent.TeleportCause.END_PORTAL); // CraftBukkit - reroute logic through custom portal management - } else if (this.player.r().getWorldData().isHardcore()) { - if (this.minecraftServer.N() && this.player.getName().equals(this.minecraftServer.M())) { - this.player.playerConnection.disconnect("You have died. Game over, man, it\'s game over!"); - this.minecraftServer.U(); - } else { - GameProfileBanEntry gameprofilebanentry = new GameProfileBanEntry(this.player.getProfile(), (Date) null, "(You just lost the game)", (Date) null, "Death in Hardcore"); - - this.minecraftServer.getPlayerList().getProfileBans().add(gameprofilebanentry); - this.player.playerConnection.disconnect("You have died. Game over, man, it\'s game over!"); - } - } else { - if (this.player.getHealth() > 0.0F) { - return; - } - - this.player = this.minecraftServer.getPlayerList().moveToWorld(this.player, 0, false); - } - break; - - case 2: - this.player.getStatisticManager().a(this.player); - break; - - case 3: - this.player.a((Statistic) AchievementList.f); - } - } - - public void a(PacketPlayInCloseWindow packetplayinclosewindow) { - if (this.player.dead) return; // CraftBukkit - - CraftEventFactory.handleInventoryCloseEvent(this.player); // CraftBukkit - - this.player.m(); - } - - public void a(PacketPlayInWindowClick packetplayinwindowclick) { - if (this.player.dead) return; // CraftBukkit - - this.player.v(); - if (this.player.activeContainer.windowId == packetplayinwindowclick.c() && this.player.activeContainer.c(this.player)) { - // CraftBukkit start - Call InventoryClickEvent - if (packetplayinwindowclick.d() < -1 && packetplayinwindowclick.d() != -999) { - return; - } - - InventoryView inventory = this.player.activeContainer.getBukkitView(); - SlotType type = CraftInventoryView.getSlotType(inventory, packetplayinwindowclick.d()); - - InventoryClickEvent event = null; - ClickType click = ClickType.UNKNOWN; - InventoryAction action = InventoryAction.UNKNOWN; - - ItemStack itemstack = null; - - if (packetplayinwindowclick.d() == -1) { - type = SlotType.OUTSIDE; // override - click = packetplayinwindowclick.e() == 0 ? ClickType.WINDOW_BORDER_LEFT : ClickType.WINDOW_BORDER_RIGHT; - action = InventoryAction.NOTHING; - } else if (packetplayinwindowclick.h() == 0) { - if (packetplayinwindowclick.e() == 0) { - click = ClickType.LEFT; - } else if (packetplayinwindowclick.e() == 1) { - click = ClickType.RIGHT; - } - if (packetplayinwindowclick.e() == 0 || packetplayinwindowclick.e() == 1) { - action = InventoryAction.NOTHING; // Don't want to repeat ourselves - if (packetplayinwindowclick.d() == -999) { - if (player.inventory.getCarried() != null) { - action = packetplayinwindowclick.e() == 0 ? InventoryAction.DROP_ALL_CURSOR : InventoryAction.DROP_ONE_CURSOR; - } - } else { - Slot slot = this.player.activeContainer.getSlot(packetplayinwindowclick.d()); - if (slot != null) { - ItemStack clickedItem = slot.getItem(); - ItemStack cursor = player.inventory.getCarried(); - if (clickedItem == null) { - if (cursor != null) { - action = packetplayinwindowclick.e() == 0 ? InventoryAction.PLACE_ALL : InventoryAction.PLACE_ONE; - } - } else if (slot.isAllowed(player)) { - if (cursor == null) { - action = packetplayinwindowclick.e() == 0 ? InventoryAction.PICKUP_ALL : InventoryAction.PICKUP_HALF; - } else if (slot.isAllowed(cursor)) { - if (clickedItem.doMaterialsMatch(cursor) && ItemStack.equals(clickedItem, cursor)) { - int toPlace = packetplayinwindowclick.e() == 0 ? cursor.count : 1; - toPlace = Math.min(toPlace, clickedItem.getMaxStackSize() - clickedItem.count); - toPlace = Math.min(toPlace, slot.inventory.getMaxStackSize() - clickedItem.count); - if (toPlace == 1) { - action = InventoryAction.PLACE_ONE; - } else if (toPlace == cursor.count) { - action = InventoryAction.PLACE_ALL; - } else if (toPlace < 0) { - action = toPlace != -1 ? InventoryAction.PICKUP_SOME : InventoryAction.PICKUP_ONE; // this happens with oversized stacks - } else if (toPlace != 0) { - action = InventoryAction.PLACE_SOME; - } - } else if (cursor.count <= slot.getMaxStackSize()) { - action = InventoryAction.SWAP_WITH_CURSOR; - } - } else if (cursor.getItem() == clickedItem.getItem() && (!cursor.usesData() || cursor.getData() == clickedItem.getData()) && ItemStack.equals(cursor, clickedItem)) { - if (clickedItem.count >= 0) { - if (clickedItem.count + cursor.count <= cursor.getMaxStackSize()) { - // As of 1.5, this is result slots only - action = InventoryAction.PICKUP_ALL; - } - } - } - } - } - } - } - } else if (packetplayinwindowclick.h() == 1) { - if (packetplayinwindowclick.e() == 0) { - click = ClickType.SHIFT_LEFT; - } else if (packetplayinwindowclick.e() == 1) { - click = ClickType.SHIFT_RIGHT; - } - if (packetplayinwindowclick.e() == 0 || packetplayinwindowclick.e() == 1) { - if (packetplayinwindowclick.d() < 0) { - action = InventoryAction.NOTHING; - } else { - Slot slot = this.player.activeContainer.getSlot(packetplayinwindowclick.d()); - if (slot != null && slot.isAllowed(this.player) && slot.hasItem()) { - action = InventoryAction.MOVE_TO_OTHER_INVENTORY; - } else { - action = InventoryAction.NOTHING; - } - } - } - } else if (packetplayinwindowclick.h() == 2) { - if (packetplayinwindowclick.e() >= 0 && packetplayinwindowclick.e() < 9) { - click = ClickType.NUMBER_KEY; - Slot clickedSlot = this.player.activeContainer.getSlot(packetplayinwindowclick.d()); - if (clickedSlot.isAllowed(player)) { - ItemStack hotbar = this.player.inventory.getItem(packetplayinwindowclick.e()); - boolean canCleanSwap = hotbar == null || (clickedSlot.inventory == player.inventory && clickedSlot.isAllowed(hotbar)); // the slot will accept the hotbar item - if (clickedSlot.hasItem()) { - if (canCleanSwap) { - action = InventoryAction.HOTBAR_SWAP; - } else { - int firstEmptySlot = player.inventory.getFirstEmptySlotIndex(); - if (firstEmptySlot > -1) { - action = InventoryAction.HOTBAR_MOVE_AND_READD; - } else { - action = InventoryAction.NOTHING; // This is not sane! Mojang: You should test for other slots of same type - } - } - } else if (!clickedSlot.hasItem() && hotbar != null && clickedSlot.isAllowed(hotbar)) { - action = InventoryAction.HOTBAR_SWAP; - } else { - action = InventoryAction.NOTHING; - } - } else { - action = InventoryAction.NOTHING; - } - // Special constructor for number key - event = new InventoryClickEvent(inventory, type, packetplayinwindowclick.d(), click, action, packetplayinwindowclick.e()); - } - } else if (packetplayinwindowclick.h() == 3) { - if (packetplayinwindowclick.e() == 2) { - click = ClickType.MIDDLE; - if (packetplayinwindowclick.d() == -999) { - action = InventoryAction.NOTHING; - } else { - Slot slot = this.player.activeContainer.getSlot(packetplayinwindowclick.d()); - if (slot != null && slot.hasItem() && player.abilities.canInstantlyBuild && player.inventory.getCarried() == null) { - action = InventoryAction.CLONE_STACK; - } else { - action = InventoryAction.NOTHING; - } - } - } else { - click = ClickType.UNKNOWN; - action = InventoryAction.UNKNOWN; - } - } else if (packetplayinwindowclick.h() == 4) { - if (packetplayinwindowclick.d() >= 0) { - if (packetplayinwindowclick.e() == 0) { - click = ClickType.DROP; - Slot slot = this.player.activeContainer.getSlot(packetplayinwindowclick.d()); - if (slot != null && slot.hasItem() && slot.isAllowed(player) && slot.getItem() != null && slot.getItem().getItem() != Item.getItemOf(Blocks.AIR)) { - action = InventoryAction.DROP_ONE_SLOT; - } else { - action = InventoryAction.NOTHING; - } - } else if (packetplayinwindowclick.e() == 1) { - click = ClickType.CONTROL_DROP; - Slot slot = this.player.activeContainer.getSlot(packetplayinwindowclick.d()); - if (slot != null && slot.hasItem() && slot.isAllowed(player) && slot.getItem() != null && slot.getItem().getItem() != Item.getItemOf(Blocks.AIR)) { - action = InventoryAction.DROP_ALL_SLOT; - } else { - action = InventoryAction.NOTHING; - } - } - } else { - // Sane default (because this happens when they are holding nothing. Don't ask why.) - click = ClickType.LEFT; - if (packetplayinwindowclick.e() == 1) { - click = ClickType.RIGHT; - } - action = InventoryAction.NOTHING; - } - } else if (packetplayinwindowclick.h() == 5) { - itemstack = this.player.activeContainer.clickItem(packetplayinwindowclick.d(), packetplayinwindowclick.e(), 5, this.player); - } else if (packetplayinwindowclick.h() == 6) { - click = ClickType.DOUBLE_CLICK; - action = InventoryAction.NOTHING; - if (packetplayinwindowclick.d() >= 0 && this.player.inventory.getCarried() != null) { - ItemStack cursor = this.player.inventory.getCarried(); - action = InventoryAction.NOTHING; - // Quick check for if we have any of the item - if (inventory.getTopInventory().contains(org.bukkit.Material.getMaterial(Item.getId(cursor.getItem()))) || inventory.getBottomInventory().contains(org.bukkit.Material.getMaterial(Item.getId(cursor.getItem())))) { - action = InventoryAction.COLLECT_TO_CURSOR; - } - } - } - // TODO check on updates - - if (packetplayinwindowclick.h() != 5) { - if (click == ClickType.NUMBER_KEY) { - event = new InventoryClickEvent(inventory, type, packetplayinwindowclick.d(), click, action, packetplayinwindowclick.e()); - } else { - event = new InventoryClickEvent(inventory, type, packetplayinwindowclick.d(), click, action); - } - - org.bukkit.inventory.Inventory top = inventory.getTopInventory(); - if (packetplayinwindowclick.d() == 0 && top instanceof CraftingInventory) { - org.bukkit.inventory.Recipe recipe = ((CraftingInventory) top).getRecipe(); - if (recipe != null) { - if (click == ClickType.NUMBER_KEY) { - event = new CraftItemEvent(recipe, inventory, type, packetplayinwindowclick.d(), click, action, packetplayinwindowclick.e()); - } else { - event = new CraftItemEvent(recipe, inventory, type, packetplayinwindowclick.d(), click, action); - } - } - } - - server.getPluginManager().callEvent(event); - - switch (event.getResult()) { - case ALLOW: - case DEFAULT: - itemstack = this.player.activeContainer.clickItem(packetplayinwindowclick.d(), packetplayinwindowclick.e(), packetplayinwindowclick.h(), this.player); - break; - case DENY: - /* Needs enum constructor in InventoryAction - if (action.modifiesOtherSlots()) { - - } else { - if (action.modifiesCursor()) { - this.player.playerConnection.sendPacket(new Packet103SetSlot(-1, -1, this.player.inventory.getCarried())); - } - if (action.modifiesClicked()) { - this.player.playerConnection.sendPacket(new Packet103SetSlot(this.player.activeContainer.windowId, packet102windowclick.slot, this.player.activeContainer.getSlot(packet102windowclick.slot).getItem())); - } - }*/ - switch (action) { - // Modified other slots - case PICKUP_ALL: - case MOVE_TO_OTHER_INVENTORY: - case HOTBAR_MOVE_AND_READD: - case HOTBAR_SWAP: - case COLLECT_TO_CURSOR: - case UNKNOWN: - this.player.updateInventory(this.player.activeContainer); - break; - // Modified cursor and clicked - case PICKUP_SOME: - case PICKUP_HALF: - case PICKUP_ONE: - case PLACE_ALL: - case PLACE_SOME: - case PLACE_ONE: - case SWAP_WITH_CURSOR: - this.player.playerConnection.sendPacket(new PacketPlayOutSetSlot(-1, -1, this.player.inventory.getCarried())); - this.player.playerConnection.sendPacket(new PacketPlayOutSetSlot(this.player.activeContainer.windowId, packetplayinwindowclick.d(), this.player.activeContainer.getSlot(packetplayinwindowclick.d()).getItem())); - break; - // Modified clicked only - case DROP_ALL_SLOT: - case DROP_ONE_SLOT: - this.player.playerConnection.sendPacket(new PacketPlayOutSetSlot(this.player.activeContainer.windowId, packetplayinwindowclick.d(), this.player.activeContainer.getSlot(packetplayinwindowclick.d()).getItem())); - break; - // Modified cursor only - case DROP_ALL_CURSOR: - case DROP_ONE_CURSOR: - case CLONE_STACK: - this.player.playerConnection.sendPacket(new PacketPlayOutSetSlot(-1, -1, this.player.inventory.getCarried())); - break; - // Nothing - case NOTHING: - break; - } - return; - } - } - // CraftBukkit end - - if (ItemStack.matches(packetplayinwindowclick.g(), itemstack)) { - this.player.playerConnection.sendPacket(new PacketPlayOutTransaction(packetplayinwindowclick.c(), packetplayinwindowclick.f(), true)); - this.player.g = true; - this.player.activeContainer.b(); - this.player.broadcastCarriedItem(); - this.player.g = false; - } else { - this.n.a(this.player.activeContainer.windowId, Short.valueOf(packetplayinwindowclick.f())); - this.player.playerConnection.sendPacket(new PacketPlayOutTransaction(packetplayinwindowclick.c(), packetplayinwindowclick.f(), 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(new PacketPlayOutSetSlot(this.player.activeContainer.windowId, 0, itemstack)); - } - // CraftBukkit end - } - } - } - - public void a(PacketPlayInEnchantItem packetplayinenchantitem) { - this.player.v(); - if (this.player.activeContainer.windowId == packetplayinenchantitem.c() && this.player.activeContainer.c(this.player)) { - this.player.activeContainer.a(this.player, packetplayinenchantitem.d()); - this.player.activeContainer.b(); - } - } - - public void a(PacketPlayInSetCreativeSlot packetplayinsetcreativeslot) { - if (this.player.playerInteractManager.isCreative()) { - boolean flag = packetplayinsetcreativeslot.c() < 0; - ItemStack itemstack = packetplayinsetcreativeslot.getItemStack(); - boolean flag1 = packetplayinsetcreativeslot.c() >= 1 && packetplayinsetcreativeslot.c() < 36 + PlayerInventory.getHotbarSize(); - // CraftBukkit - Add invalidItems check - boolean flag2 = itemstack == null || itemstack.getItem() != null && !invalidItems.contains(Item.getId(itemstack.getItem())); - boolean flag3 = itemstack == null || itemstack.getData() >= 0 && itemstack.count <= 64 && itemstack.count > 0; - - // CraftBukkit start - Call click event - if (flag || (flag1 && !ItemStack.matches(this.player.defaultContainer.getSlot(packetplayinsetcreativeslot.c()).getItem(), packetplayinsetcreativeslot.getItemStack()))) { // Insist on valid slot - - org.bukkit.entity.HumanEntity player = this.player.getBukkitEntity(); - InventoryView inventory = new CraftInventoryView(player, player.getInventory(), this.player.defaultContainer); - org.bukkit.inventory.ItemStack item = CraftItemStack.asBukkitCopy(packetplayinsetcreativeslot.getItemStack()); - - SlotType type = SlotType.QUICKBAR; - if (flag) { - type = SlotType.OUTSIDE; - } else if (packetplayinsetcreativeslot.c() < 36) { - if (packetplayinsetcreativeslot.c() >= 5 && packetplayinsetcreativeslot.c() < 9) { - type = SlotType.ARMOR; - } else { - type = SlotType.CONTAINER; - } - } - InventoryCreativeEvent event = new InventoryCreativeEvent(inventory, type, flag ? -999 : packetplayinsetcreativeslot.c(), item); - server.getPluginManager().callEvent(event); - - itemstack = CraftItemStack.asNMSCopy(event.getCursor()); - - switch (event.getResult()) { - case ALLOW: - // Plugin cleared the id / stacksize checks - flag2 = flag3 = true; - break; - case DEFAULT: - break; - case DENY: - // Reset the slot - if (packetplayinsetcreativeslot.c() >= 0) { - this.player.playerConnection.sendPacket(new PacketPlayOutSetSlot(this.player.defaultContainer.windowId, packetplayinsetcreativeslot.c(), this.player.defaultContainer.getSlot(packetplayinsetcreativeslot.c()).getItem())); - this.player.playerConnection.sendPacket(new PacketPlayOutSetSlot(-1, -1, null)); - } - return; - } - } - // CraftBukkit end - - if (flag1 && flag2 && flag3) { - if (itemstack == null) { - this.player.defaultContainer.setItem(packetplayinsetcreativeslot.c(), (ItemStack) null); - } else { - this.player.defaultContainer.setItem(packetplayinsetcreativeslot.c(), 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, true); - - if (entityitem != null) { - entityitem.e(); - } - } - } - } - - public void a(PacketPlayInTransaction packetplayintransaction) { - if (this.player.dead) return; // CraftBukkit - Short oshort = (Short) this.n.get(this.player.activeContainer.windowId); - - if (oshort != null && packetplayintransaction.d() == oshort.shortValue() && this.player.activeContainer.windowId == packetplayintransaction.c() && !this.player.activeContainer.c(this.player)) { - this.player.activeContainer.a(this.player, true); - } - } - - public void a(PacketPlayInUpdateSign packetplayinupdatesign) { - if (this.player.dead) return; // CraftBukkit - - this.player.v(); - WorldServer worldserver = this.minecraftServer.getWorldServer(this.player.dimension); - - if (worldserver.isLoaded(packetplayinupdatesign.c(), packetplayinupdatesign.d(), packetplayinupdatesign.e())) { - TileEntity tileentity = worldserver.getTileEntity(packetplayinupdatesign.c(), packetplayinupdatesign.d(), packetplayinupdatesign.e()); - - if (tileentity instanceof TileEntitySign) { - TileEntitySign tileentitysign = (TileEntitySign) tileentity; - - if (!tileentitysign.a() || tileentitysign.b() != this.player) { - this.minecraftServer.warning("Player " + this.player.getName() + " just tried to change non-editable sign"); - this.sendPacket(new PacketPlayOutUpdateSign(packetplayinupdatesign.c(), packetplayinupdatesign.d(), packetplayinupdatesign.e(), tileentitysign.lines)); // CraftBukkit - return; - } - } - - int i; - int j; - - for (j = 0; j < 4; ++j) { - boolean flag = true; - - if (packetplayinupdatesign.f()[j].length() > 15) { - flag = false; - } else { - for (i = 0; i < packetplayinupdatesign.f()[j].length(); ++i) { - if (!SharedConstants.isAllowedChatCharacter(packetplayinupdatesign.f()[j].charAt(i))) { - flag = false; - } - } - } - - if (!flag) { - packetplayinupdatesign.f()[j] = "!?"; - } - } - - if (tileentity instanceof TileEntitySign) { - j = packetplayinupdatesign.c(); - int k = packetplayinupdatesign.d(); - - i = packetplayinupdatesign.e(); - 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), packetplayinupdatesign.f()); - this.server.getPluginManager().callEvent(event); - - if (!event.isCancelled()) { - tileentitysign1.lines = org.bukkit.craftbukkit.block.CraftSign.sanitizeLines(event.getLines()); - tileentitysign1.isEditable = false; - } - // System.arraycopy(packetplayinupdatesign.f(), 0, tileentitysign1.lines, 0, 4); - // CraftBukkit end - - tileentitysign1.update(); - worldserver.notify(j, k, i); - } - } - } - - public void a(PacketPlayInKeepAlive packetplayinkeepalive) { - if (packetplayinkeepalive.c() == this.h) { - int i = (int) (this.d() - this.i); - - this.player.ping = (this.player.ping * 3 + i) / 4; - } - } - - private long d() { - return System.nanoTime() / 1000000L; - } - - public void a(PacketPlayInAbilities packetplayinabilities) { - // CraftBukkit start - if (this.player.abilities.canFly && this.player.abilities.isFlying != packetplayinabilities.isFlying()) { - PlayerToggleFlightEvent event = new PlayerToggleFlightEvent(this.server.getPlayer(this.player), packetplayinabilities.isFlying()); - this.server.getPluginManager().callEvent(event); - if (!event.isCancelled()) { - this.player.abilities.isFlying = packetplayinabilities.isFlying(); // Actually set the player's flying status - } else { - this.player.updateAbilities(); // Tell the player their ability was reverted - } - } - // CraftBukkit end - } - - public void a(PacketPlayInTabComplete packetplayintabcomplete) { - ArrayList arraylist = Lists.newArrayList(); - Iterator iterator = this.minecraftServer.a(this.player, packetplayintabcomplete.c()).iterator(); - - while (iterator.hasNext()) { - String s = (String) iterator.next(); - - arraylist.add(s); - } - - this.player.playerConnection.sendPacket(new PacketPlayOutTabComplete((String[]) arraylist.toArray(new String[arraylist.size()]))); - } - - public void a(PacketPlayInSettings packetplayinsettings) { - this.player.a(packetplayinsettings); - } - - public void a(PacketPlayInCustomPayload packetplayincustompayload) { - PacketDataSerializer packetdataserializer; - ItemStack itemstack; - ItemStack itemstack1; - - // CraftBukkit start - Ignore empty payloads - if (packetplayincustompayload.length <= 0) { - return; - } - // CraftBukkit end - - if ("MC|BEdit".equals(packetplayincustompayload.c())) { - packetdataserializer = new PacketDataSerializer(Unpooled.wrappedBuffer(packetplayincustompayload.e())); - - try { - itemstack = packetdataserializer.c(); - if (itemstack != null) { - if (!ItemBookAndQuill.a(itemstack.getTag())) { - throw new IOException("Invalid book tag!"); - } - - itemstack1 = this.player.inventory.getItemInHand(); - if (itemstack1 == null) { - return; - } - - if (itemstack.getItem() == Items.BOOK_AND_QUILL && itemstack.getItem() == itemstack1.getItem()) { - CraftEventFactory.handleEditBookEvent(player, itemstack); // CraftBukkit - } - - return; - } - // CraftBukkit start - } catch (Exception exception) { - c.error("Couldn\'t handle book info", exception); - this.disconnect("Invalid book data!"); - return; - // CraftBukkit end - } finally { - packetdataserializer.release(); - } - - return; - } else if ("MC|BSign".equals(packetplayincustompayload.c())) { - packetdataserializer = new PacketDataSerializer(Unpooled.wrappedBuffer(packetplayincustompayload.e())); - - try { - itemstack = packetdataserializer.c(); - if (itemstack != null) { - if (!ItemWrittenBook.a(itemstack.getTag())) { - throw new IOException("Invalid book tag!"); - } - - itemstack1 = this.player.inventory.getItemInHand(); - if (itemstack1 == null) { - return; - } - - if (itemstack.getItem() == Items.WRITTEN_BOOK && itemstack1.getItem() == Items.BOOK_AND_QUILL) { - CraftEventFactory.handleEditBookEvent(player, itemstack); // CraftBukkit - } - - return; - } - // CraftBukkit start - } catch (Throwable exception1) { - c.error("Couldn\'t sign book", exception1); - this.disconnect("Invalid book data!"); - // CraftBukkit end - return; - } finally { - packetdataserializer.release(); - } - - return; - } else { - int i; - DataInputStream datainputstream; - - if ("MC|TrSel".equals(packetplayincustompayload.c())) { - try { - datainputstream = new DataInputStream(new ByteArrayInputStream(packetplayincustompayload.e())); - i = datainputstream.readInt(); - Container container = this.player.activeContainer; - - if (container instanceof ContainerMerchant) { - ((ContainerMerchant) container).e(i); - } - // CraftBukkit start - } catch (Throwable exception2) { - c.error("Couldn\'t select trade", exception2); - this.disconnect("Invalid trade data!"); - // CraftBukkit end - } - } else if ("MC|AdvCdm".equals(packetplayincustompayload.c())) { - if (!this.minecraftServer.getEnableCommandBlock()) { - this.player.sendMessage(new ChatMessage("advMode.notEnabled", new Object[0])); - } else if (this.player.a(2, "") && this.player.abilities.canInstantlyBuild) { - packetdataserializer = new PacketDataSerializer(Unpooled.wrappedBuffer(packetplayincustompayload.e())); - - try { - byte b0 = packetdataserializer.readByte(); - CommandBlockListenerAbstract commandblocklistenerabstract = null; - - if (b0 == 0) { - TileEntity tileentity = this.player.world.getTileEntity(packetdataserializer.readInt(), packetdataserializer.readInt(), packetdataserializer.readInt()); - - if (tileentity instanceof TileEntityCommand) { - commandblocklistenerabstract = ((TileEntityCommand) tileentity).getCommandBlock(); - } - } else if (b0 == 1) { - Entity entity = this.player.world.getEntity(packetdataserializer.readInt()); - - if (entity instanceof EntityMinecartCommandBlock) { - commandblocklistenerabstract = ((EntityMinecartCommandBlock) entity).getCommandBlock(); - } - } - - String s = packetdataserializer.c(packetdataserializer.readableBytes()); - - if (commandblocklistenerabstract != null) { - commandblocklistenerabstract.setCommand(s); - commandblocklistenerabstract.e(); - this.player.sendMessage(new ChatMessage("advMode.setCommand.success", new Object[] { s})); - } - // CraftBukkit start - } catch (Throwable exception3) { - c.error("Couldn\'t set command block", exception3); - this.disconnect("Invalid CommandBlock data!"); - // CraftBukkit end - } finally { - packetdataserializer.release(); - } - } else { - this.player.sendMessage(new ChatMessage("advMode.notAllowed", new Object[0])); - } - } else if ("MC|Beacon".equals(packetplayincustompayload.c())) { - if (this.player.activeContainer instanceof ContainerBeacon) { - try { - datainputstream = new DataInputStream(new ByteArrayInputStream(packetplayincustompayload.e())); - i = datainputstream.readInt(); - int j = datainputstream.readInt(); - ContainerBeacon containerbeacon = (ContainerBeacon) this.player.activeContainer; - Slot slot = containerbeacon.getSlot(0); - - if (slot.hasItem()) { - slot.a(1); - TileEntityBeacon tileentitybeacon = containerbeacon.e(); - - tileentitybeacon.d(i); - tileentitybeacon.e(j); - tileentitybeacon.update(); - } - // CraftBukkit start - } catch (Throwable exception4) { - c.error("Couldn\'t set beacon", exception4); - this.disconnect("Invalid beacon data!"); - // CraftBukkit end - } - } - } else if ("MC|ItemName".equals(packetplayincustompayload.c()) && this.player.activeContainer instanceof ContainerAnvil) { - ContainerAnvil containeranvil = (ContainerAnvil) this.player.activeContainer; - - if (packetplayincustompayload.e() != null && packetplayincustompayload.e().length >= 1) { - String s1 = SharedConstants.a(new String(packetplayincustompayload.e(), Charsets.UTF_8)); - - if (s1.length() <= 30) { - containeranvil.a(s1); - } - } else { - containeranvil.a(""); - } - } - // CraftBukkit start - else if (packetplayincustompayload.c().equals("REGISTER")) { - try { - String channels = new String(packetplayincustompayload.e(), "UTF8"); - for (String channel : channels.split("\0")) { - getPlayer().addChannel(channel); - } - } catch (UnsupportedEncodingException ex) { - throw new AssertionError(ex); - } - } else if (packetplayincustompayload.c().equals("UNREGISTER")) { - try { - String channels = new String(packetplayincustompayload.e(), "UTF8"); - for (String channel : channels.split("\0")) { - getPlayer().removeChannel(channel); - } - } catch (UnsupportedEncodingException ex) { - throw new AssertionError(ex); - } - } else { - server.getMessenger().dispatchIncomingMessage(player.getBukkitEntity(), packetplayincustompayload.c(), packetplayincustompayload.e()); - } - // CraftBukkit end - } - } - - public void a(EnumProtocol enumprotocol, EnumProtocol enumprotocol1) { - if (enumprotocol1 != EnumProtocol.PLAY) { - throw new IllegalStateException("Unexpected change in protocol!"); - } - } - - // CraftBukkit start - Add "isDisconnected" method - public final boolean isDisconnected() { - return !this.player.joining && !NetworkManager.a(this.networkManager).config().isAutoRead(); - } - // CraftBukkit end -} diff --git a/src/main/java/net/minecraft/server/PlayerDatFileConverter.java b/src/main/java/net/minecraft/server/PlayerDatFileConverter.java deleted file mode 100644 index 27651b5a03..0000000000 --- a/src/main/java/net/minecraft/server/PlayerDatFileConverter.java +++ /dev/null @@ -1,98 +0,0 @@ -package net.minecraft.server; - -import java.io.File; -import java.util.UUID; - -import net.minecraft.util.com.mojang.authlib.GameProfile; -import net.minecraft.util.com.mojang.authlib.ProfileLookupCallback; -import net.minecraft.util.com.mojang.authlib.yggdrasil.ProfileNotFoundException; - -final class PlayerDatFileConverter implements ProfileLookupCallback { - - final DedicatedServer a; - final File b; - final File c; - final File d; - final String[] e; - - PlayerDatFileConverter(DedicatedServer dedicatedserver, File file1, File file2, File file3, String[] astring) { - this.a = dedicatedserver; - this.b = file1; - this.c = file2; - this.d = file3; - this.e = astring; - } - - public void onProfileLookupSucceeded(GameProfile gameprofile) { - this.a.getUserCache().a(gameprofile); - UUID uuid = gameprofile.getId(); - - if (uuid == null) { - throw new FileConversionException("Missing UUID for user profile " + gameprofile.getName(), (PredicateEmptyList) null); - } else { - this.a(this.b, this.a(gameprofile), uuid.toString()); - } - } - - public void onProfileLookupFailed(GameProfile gameprofile, Exception exception) { - NameReferencingFileConverter.a().warn("Could not lookup user uuid for " + gameprofile.getName(), exception); - if (exception instanceof ProfileNotFoundException) { - String s = this.a(gameprofile); - - this.a(this.c, s, s); - } else { - throw new FileConversionException("Could not request user " + gameprofile.getName() + " from backend systems", exception, (PredicateEmptyList) null); - } - } - - private void a(File file1, String s, String s1) { - File file2 = new File(this.d, s + ".dat"); - File file3 = new File(file1, s1 + ".dat"); - - // CraftBukkit start - Use old file name to seed lastKnownName - NBTTagCompound root = null; - - try { - root = NBTCompressedStreamTools.a(new java.io.FileInputStream(file2)); - } catch (Exception exception) { - exception.printStackTrace(); - } - - if (root != null) { - if (!root.hasKey("bukkit")) { - root.set("bukkit", new NBTTagCompound()); - } - NBTTagCompound data = root.getCompound("bukkit"); - data.setString("lastKnownName", s); - - try { - NBTCompressedStreamTools.a(root, new java.io.FileOutputStream(file2)); - } catch (Exception exception) { - exception.printStackTrace(); - } - } - // CraftBukkit end - - NameReferencingFileConverter.a(file1); - if (!file2.renameTo(file3)) { - throw new FileConversionException("Could not convert file for " + s, (PredicateEmptyList) null); - } - } - - private String a(GameProfile gameprofile) { - String s = null; - - for (int i = 0; i < this.e.length; ++i) { - if (this.e[i] != null && this.e[i].equalsIgnoreCase(gameprofile.getName())) { - s = this.e[i]; - break; - } - } - - if (s == null) { - throw new FileConversionException("Could not find the filename for " + gameprofile.getName() + " anymore", (PredicateEmptyList) null); - } else { - return s; - } - } -} diff --git a/src/main/java/net/minecraft/server/PlayerInteractManager.java b/src/main/java/net/minecraft/server/PlayerInteractManager.java deleted file mode 100644 index 7607155f22..0000000000 --- a/src/main/java/net/minecraft/server/PlayerInteractManager.java +++ /dev/null @@ -1,411 +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 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; - } - - 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 = MinecraftServer.currentTick; // CraftBukkit - float f; - int i; - - if (this.j) { - int j = this.currentTick - this.n; - Block block = this.world.getType(this.k, this.l, this.m); - - if (block.getMaterial() == Material.AIR) { - this.j = false; - } else { - f = block.getDamage(this.player, this.player.world, this.k, this.l, this.m) * (float) (j + 1); - i = (int) (f * 10.0F); - if (i != this.o) { - this.world.d(this.player.getId(), this.k, this.l, this.m, i); - this.o = i; - } - - if (f >= 1.0F) { - this.j = false; - this.breakBlock(this.k, this.l, this.m); - } - } - } else if (this.d) { - Block block1 = this.world.getType(this.f, this.g, this.h); - - if (block1.getMaterial() == Material.AIR) { - this.world.d(this.player.getId(), this.f, this.g, this.h, -1); - this.o = -1; - this.d = false; - } else { - int k = this.currentTick - this.lastDigTick; - - f = block1.getDamage(this.player, this.player.world, this.f, this.g, this.h) * (float) (k + 1); - i = (int) (f * 10.0F); - if (i != this.o) { - this.world.d(this.player.getId(), this.f, this.g, this.h, i); - this.o = i; - } - } - } - } - - public void dig(int i, int j, int k, int l) { - // CraftBukkit start - PlayerInteractEvent event = CraftEventFactory.callPlayerInteractEvent(this.player, Action.LEFT_CLICK_BLOCK, i, j, k, l, this.player.inventory.getItemInHand()); - if (!this.gamemode.isAdventure() || this.player.d(i, j, k)) { - if (event.isCancelled()) { - // Let the client know the block still exists - ((EntityPlayer) this.player).playerConnection.sendPacket(new PacketPlayOutBlockChange(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((EntityHuman) null, i, j, k, l); // CraftBukkit - Moved down - this.lastDigTick = this.currentTick; - float f = 1.0F; - Block block = this.world.getType(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 (block == Blocks.WOODEN_DOOR) { - // 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 PacketPlayOutBlockChange(i, j, k, this.world)); - ((EntityPlayer) this.player).playerConnection.sendPacket(new PacketPlayOutBlockChange(i, j + (bottom ? 1 : -1), k, this.world)); - } else if (block == Blocks.TRAP_DOOR) { - ((EntityPlayer) this.player).playerConnection.sendPacket(new PacketPlayOutBlockChange(i, j, k, this.world)); - } - } else if (block.getMaterial() != Material.AIR) { - block.attack(this.world, i, j, k, this.player); - f = block.getDamage(this.player, this.player.world, i, j, k); - // Allow fire punching to be blocked - this.world.douseFire((EntityHuman) null, i, j, k, l); - } - - 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 PacketPlayOutBlockChange(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 PacketPlayOutBlockChange(i, j, k, this.world)); - return; - } - - if (blockEvent.getInstaBreak()) { - f = 2.0f; - } - // CraftBukkit end - - if (block.getMaterial() != Material.AIR && f >= 1.0F) { - this.breakBlock(i, j, k); - } else { - this.d = true; - this.f = i; - this.g = j; - this.h = k; - int i1 = (int) (f * 10.0F); - - this.world.d(this.player.getId(), i, j, k, i1); - this.o = i1; - } - } - } - } - - public void a(int i, int j, int k) { - if (i == this.f && j == this.g && k == this.h) { - this.currentTick = MinecraftServer.currentTick; // CraftBukkit - int l = this.currentTick - this.lastDigTick; - Block block = this.world.getType(i, j, k); - - if (block.getMaterial() != Material.AIR) { - float f = block.getDamage(this.player, this.player.world, i, j, k) * (float) (l + 1); - - if (f >= 0.7F) { - this.d = false; - this.world.d(this.player.getId(), 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 block reset to client - } else { - this.player.playerConnection.sendPacket(new PacketPlayOutBlockChange(i, j, k, this.world)); - // CraftBukkit end - } - } - - public void c(int i, int j, int k) { - this.d = false; - this.world.d(this.player.getId(), this.f, this.g, this.h, -1); - } - - private boolean d(int i, int j, int k) { - Block block = this.world.getType(i, j, k); - int l = this.world.getData(i, j, k); - - block.a(this.world, i, j, k, l, this.player); - boolean flag = this.world.setAir(i, j, k); - - if (flag) { - block.postBreak(this.world, i, j, k, l); - } - - return flag; - } - - public boolean breakBlock(int i, int j, int k) { - // CraftBukkit start - fire BlockBreakEvent - 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) { - PacketPlayOutBlockChange packet = new PacketPlayOutBlockChange(i, j, k, this.world); - packet.block = Blocks.AIR; - 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.d(i, j, k)); - - // Sword + Creative mode pre-cancel - event.setCancelled(event.isCancelled() || (this.gamemode.d() && this.player.be() != null && this.player.be().getItem() instanceof ItemSword)); - - // Calculate default block experience - Block nmsBlock = this.world.getType(i, j, k); - - if (nmsBlock != null && !event.isCancelled() && !this.isCreative() && this.player.a(nmsBlock)) { - // Copied from block.a(world, entityhuman, int, int, int, int) - if (!(nmsBlock.E() && 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 PacketPlayOutBlockChange(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 && this.gamemode.isAdventure() && !this.player.d(i, j, k)) { // Never trigger - // CraftBukkit end - return false; - } else if (false && this.gamemode.d() && this.player.be() != null && this.player.be().getItem() instanceof ItemSword) { // CraftBukkit - never trigger - return false; - } else { - Block block = this.world.getType(i, j, k); - if (block == Blocks.AIR) return false; // CraftBukkit - A plugin set block to air without cancelling - int l = this.world.getData(i, j, k); - - // CraftBukkit start - Special case skulls, their item data comes from a tile entity - if (block == Blocks.SKULL && !this.isCreative()) { - block.dropNaturally(world, i, j, k, l, 1.0F, 0); - return this.d(i, j, k); - } - // CraftBukkit end - - this.world.a(this.player, 2001, i, j, k, Block.getId(block) + (this.world.getData(i, j, k) << 12)); - boolean flag = this.d(i, j, k); - - if (this.isCreative()) { - this.player.playerConnection.sendPacket(new PacketPlayOutBlockChange(i, j, k, this.world)); - } else { - ItemStack itemstack = this.player.bF(); - boolean flag1 = this.player.a(block); - - if (itemstack != null) { - itemstack.a(this.world, block, i, j, k, this.player); - if (itemstack.count == 0) { - this.player.bG(); - } - } - - if (flag && flag1) { - block.a(this.world, this.player, i, j, k, l); - } - } - - // CraftBukkit start - Drop event experience - if (flag && event != null) { - block.dropExperience(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.n() <= 0 && itemstack1.getData() == j)) { - return false; - } else { - entityhuman.inventory.items[entityhuman.inventory.itemInHandIndex] = itemstack1; - if (this.isCreative()) { - itemstack1.count = i; - if (itemstack1.g()) { - itemstack1.setData(j); - } - } - - if (itemstack1.count == 0) { - entityhuman.inventory.items[entityhuman.inventory.itemInHandIndex] = null; - } - - if (!entityhuman.by()) { - ((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) { - /* CraftBukkit start - whole method - if ((!entityhuman.isSneaking() || entityhuman.be() == null) && world.getType(i, j, k).interact(world, i, j, k, entityhuman, l, f, f1, f2)) { - return true; - } else if (itemstack == null) { - return false; - } else if (this.isCreative()) { - int i1 = itemstack.getData(); - int j1 = itemstack.count; - boolean flag = itemstack.placeItem(entityhuman, world, i, j, k, l, f, f1, f2); - - itemstack.setData(i1); - itemstack.count = j1; - return flag; - } else { - return itemstack.placeItem(entityhuman, world, i, j, k, l, f, f1, f2); - } - // Interract event */ - Block block = world.getType(i, j, k); - boolean result = false; - if (block != Blocks.AIR) { - 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 (block == Blocks.WOODEN_DOOR) { - boolean bottom = (world.getData(i, j, k) & 8) == 0; - ((EntityPlayer) entityhuman).playerConnection.sendPacket(new PacketPlayOutBlockChange(i, j + (bottom ? 1 : -1), k, world)); - } - result = (event.useItemInHand() != Event.Result.ALLOW); - } else if (!entityhuman.isSneaking() || itemstack == null) { - result = block.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 deleted file mode 100644 index 5cd6e14f82..0000000000 --- a/src/main/java/net/minecraft/server/PlayerInventory.java +++ /dev/null @@ -1,539 +0,0 @@ -package net.minecraft.server; - -import java.util.concurrent.Callable; - -// CraftBukkit start -import java.util.List; - -import org.bukkit.craftbukkit.entity.CraftHumanEntity; -import org.bukkit.entity.HumanEntity; -// CraftBukkit end - -public class PlayerInventory implements IInventory { - - public ItemStack[] items = new ItemStack[36]; - public ItemStack[] armor = new ItemStack[4]; - public int itemInHandIndex; - public EntityHuman player; - private ItemStack g; - public boolean e; - - // CraftBukkit start - add fields and methods - public List transaction = new java.util.ArrayList(); - private int maxStack = MAX_STACK; - - public ItemStack[] getContents() { - return this.items; - } - - public ItemStack[] getArmorContents() { - return this.armor; - } - - public void onOpen(CraftHumanEntity who) { - transaction.add(who); - } - - public void onClose(CraftHumanEntity who) { - transaction.remove(who); - } - - public List getViewers() { - return transaction; - } - - public org.bukkit.inventory.InventoryHolder getOwner() { - return this.player.getBukkitEntity(); - } - - public void setMaxStackSize(int size) { - maxStack = size; - } - // CraftBukkit end - - public PlayerInventory(EntityHuman entityhuman) { - this.player = entityhuman; - } - - public ItemStack getItemInHand() { - return this.itemInHandIndex < 9 && this.itemInHandIndex >= 0 ? this.items[this.itemInHandIndex] : null; - } - - public static int getHotbarSize() { - return 9; - } - - private int c(Item item) { - for (int i = 0; i < this.items.length; ++i) { - if (this.items[i] != null && this.items[i].getItem() == item) { - return i; - } - } - - return -1; - } - - private int firstPartial(ItemStack itemstack) { - for (int i = 0; i < this.items.length; ++i) { - if (this.items[i] != null && this.items[i].getItem() == itemstack.getItem() && this.items[i].isStackable() && this.items[i].count < this.items[i].getMaxStackSize() && this.items[i].count < this.getMaxStackSize() && (!this.items[i].usesData() || this.items[i].getData() == itemstack.getData()) && ItemStack.equals(this.items[i], itemstack)) { - return i; - } - } - - return -1; - } - - // CraftBukkit start - Watch method above! :D - public int canHold(ItemStack itemstack) { - int remains = itemstack.count; - for (int i = 0; i < this.items.length; ++i) { - if (this.items[i] == null) return itemstack.count; - - // Taken from firstPartial(ItemStack) - if (this.items[i] != null && this.items[i].getItem() == itemstack.getItem() && this.items[i].isStackable() && this.items[i].count < this.items[i].getMaxStackSize() && this.items[i].count < this.getMaxStackSize() && (!this.items[i].usesData() || this.items[i].getData() == itemstack.getData()) && ItemStack.equals(this.items[i], itemstack)) { - remains -= (this.items[i].getMaxStackSize() < this.getMaxStackSize() ? this.items[i].getMaxStackSize() : this.getMaxStackSize()) - this.items[i].count; - } - if (remains <= 0) return itemstack.count; - } - return itemstack.count - remains; - } - // CraftBukkit end - - public int getFirstEmptySlotIndex() { - for (int i = 0; i < this.items.length; ++i) { - if (this.items[i] == null) { - return i; - } - } - - return -1; - } - - public int a(Item item, int i) { - int j = 0; - - int k; - ItemStack itemstack; - - for (k = 0; k < this.items.length; ++k) { - itemstack = this.items[k]; - if (itemstack != null && (item == null || itemstack.getItem() == item) && (i <= -1 || itemstack.getData() == i)) { - j += itemstack.count; - this.items[k] = null; - } - } - - for (k = 0; k < this.armor.length; ++k) { - itemstack = this.armor[k]; - if (itemstack != null && (item == null || itemstack.getItem() == item) && (i <= -1 || itemstack.getData() == i)) { - j += itemstack.count; - this.armor[k] = null; - } - } - - if (this.g != null) { - if (item != null && this.g.getItem() != item) { - return j; - } - - if (i > -1 && this.g.getData() != i) { - return j; - } - - j += this.g.count; - this.setCarried((ItemStack) null); - } - - return j; - } - - private int e(ItemStack itemstack) { - Item item = itemstack.getItem(); - int i = itemstack.count; - int j; - - if (itemstack.getMaxStackSize() == 1) { - j = this.getFirstEmptySlotIndex(); - if (j < 0) { - return i; - } else { - if (this.items[j] == null) { - this.items[j] = ItemStack.b(itemstack); - } - - return 0; - } - } else { - j = this.firstPartial(itemstack); - if (j < 0) { - j = this.getFirstEmptySlotIndex(); - } - - if (j < 0) { - return i; - } else { - if (this.items[j] == null) { - this.items[j] = new ItemStack(item, 0, itemstack.getData()); - if (itemstack.hasTag()) { - this.items[j].setTag((NBTTagCompound) itemstack.getTag().clone()); - } - } - - int k = i; - - if (i > this.items[j].getMaxStackSize() - this.items[j].count) { - k = this.items[j].getMaxStackSize() - this.items[j].count; - } - - if (k > this.getMaxStackSize() - this.items[j].count) { - k = this.getMaxStackSize() - this.items[j].count; - } - - if (k == 0) { - return i; - } else { - i -= k; - this.items[j].count += k; - this.items[j].c = 5; - return i; - } - } - } - } - - public void k() { - for (int i = 0; i < this.items.length; ++i) { - if (this.items[i] != null) { - this.items[i].a(this.player.world, this.player, i, this.itemInHandIndex == i); - } - } - } - - public boolean a(Item item) { - int i = this.c(item); - - if (i < 0) { - return false; - } else { - if (--this.items[i].count <= 0) { - this.items[i] = null; - } - - return true; - } - } - - public boolean b(Item item) { - int i = this.c(item); - - return i >= 0; - } - - public boolean pickup(ItemStack itemstack) { - if (itemstack != null && itemstack.count != 0 && itemstack.getItem() != null) { - try { - int i; - - if (itemstack.i()) { - i = this.getFirstEmptySlotIndex(); - if (i >= 0) { - this.items[i] = ItemStack.b(itemstack); - this.items[i].c = 5; - itemstack.count = 0; - return true; - } else if (this.player.abilities.canInstantlyBuild) { - itemstack.count = 0; - return true; - } else { - return false; - } - } else { - do { - i = itemstack.count; - itemstack.count = this.e(itemstack); - } while (itemstack.count > 0 && itemstack.count < i); - - if (itemstack.count == i && this.player.abilities.canInstantlyBuild) { - itemstack.count = 0; - return true; - } else { - return itemstack.count < i; - } - } - } catch (Throwable throwable) { - CrashReport crashreport = CrashReport.a(throwable, "Adding item to inventory"); - CrashReportSystemDetails crashreportsystemdetails = crashreport.a("Item being added"); - - crashreportsystemdetails.a("Item ID", Integer.valueOf(Item.getId(itemstack.getItem()))); - crashreportsystemdetails.a("Item data", Integer.valueOf(itemstack.getData())); - crashreportsystemdetails.a("Item name", (Callable) (new CrashReportItemName(this, itemstack))); - throw new ReportedException(crashreport); - } - } else { - return false; - } - } - - public ItemStack splitStack(int i, int j) { - ItemStack[] aitemstack = this.items; - - if (i >= this.items.length) { - aitemstack = this.armor; - i -= this.items.length; - } - - if (aitemstack[i] != null) { - ItemStack itemstack; - - if (aitemstack[i].count <= j) { - itemstack = aitemstack[i]; - aitemstack[i] = null; - return itemstack; - } else { - itemstack = aitemstack[i].a(j); - if (aitemstack[i].count == 0) { - aitemstack[i] = null; - } - - return itemstack; - } - } else { - return null; - } - } - - public ItemStack splitWithoutUpdate(int i) { - ItemStack[] aitemstack = this.items; - - if (i >= this.items.length) { - aitemstack = this.armor; - i -= this.items.length; - } - - if (aitemstack[i] != null) { - ItemStack itemstack = aitemstack[i]; - - aitemstack[i] = null; - return itemstack; - } else { - return null; - } - } - - public void setItem(int i, ItemStack itemstack) { - ItemStack[] aitemstack = this.items; - - if (i >= aitemstack.length) { - i -= aitemstack.length; - aitemstack = this.armor; - } - - aitemstack[i] = itemstack; - } - - public float a(Block block) { - float f = 1.0F; - - if (this.items[this.itemInHandIndex] != null) { - f *= this.items[this.itemInHandIndex].a(block); - } - - return f; - } - - public NBTTagList a(NBTTagList nbttaglist) { - int i; - NBTTagCompound nbttagcompound; - - for (i = 0; i < this.items.length; ++i) { - if (this.items[i] != null) { - nbttagcompound = new NBTTagCompound(); - nbttagcompound.setByte("Slot", (byte) i); - this.items[i].save(nbttagcompound); - nbttaglist.add(nbttagcompound); - } - } - - for (i = 0; i < this.armor.length; ++i) { - if (this.armor[i] != null) { - nbttagcompound = new NBTTagCompound(); - nbttagcompound.setByte("Slot", (byte) (i + 100)); - this.armor[i].save(nbttagcompound); - nbttaglist.add(nbttagcompound); - } - } - - return nbttaglist; - } - - public void b(NBTTagList nbttaglist) { - this.items = new ItemStack[36]; - this.armor = new ItemStack[4]; - - for (int i = 0; i < nbttaglist.size(); ++i) { - NBTTagCompound nbttagcompound = nbttaglist.get(i); - int j = nbttagcompound.getByte("Slot") & 255; - ItemStack itemstack = ItemStack.createStack(nbttagcompound); - - if (itemstack != null) { - if (j >= 0 && j < this.items.length) { - this.items[j] = itemstack; - } - - if (j >= 100 && j < this.armor.length + 100) { - this.armor[j - 100] = itemstack; - } - } - } - } - - public int getSize() { - return this.items.length + 4; - } - - public ItemStack getItem(int i) { - ItemStack[] aitemstack = this.items; - - if (i >= aitemstack.length) { - i -= aitemstack.length; - aitemstack = this.armor; - } - - return aitemstack[i]; - } - - public String getInventoryName() { - return "container.inventory"; - } - - public boolean k_() { - return false; - } - - public int getMaxStackSize() { - return maxStack; // CraftBukkit - } - - public boolean b(Block block) { - if (block.getMaterial().isAlwaysDestroyable()) { - return true; - } else { - ItemStack itemstack = this.getItem(this.itemInHandIndex); - - return itemstack != null ? itemstack.b(block) : false; - } - } - - public ItemStack d(int i) { - return this.armor[i]; - } - - public int l() { - int i = 0; - - for (int j = 0; j < this.armor.length; ++j) { - if (this.armor[j] != null && this.armor[j].getItem() instanceof ItemArmor) { - int k = ((ItemArmor) this.armor[j].getItem()).c; - - i += k; - } - } - - return i; - } - - public void a(float f) { - f /= 4.0F; - if (f < 1.0F) { - f = 1.0F; - } - - for (int i = 0; i < this.armor.length; ++i) { - if (this.armor[i] != null && this.armor[i].getItem() instanceof ItemArmor) { - this.armor[i].damage((int) f, this.player); - if (this.armor[i].count == 0) { - this.armor[i] = null; - } - } - } - } - - public void m() { - int i; - - for (i = 0; i < this.items.length; ++i) { - if (this.items[i] != null) { - this.player.a(this.items[i], true, false); - this.items[i] = null; - } - } - - for (i = 0; i < this.armor.length; ++i) { - if (this.armor[i] != null) { - this.player.a(this.armor[i], true, false); - this.armor[i] = null; - } - } - } - - public void update() { - this.e = true; - } - - public void setCarried(ItemStack itemstack) { - this.g = itemstack; - } - - public ItemStack getCarried() { - // CraftBukkit start - if (this.g != null && this.g.count == 0) { - this.setCarried(null); - } - // CraftBukkit end - return this.g; - } - - public boolean a(EntityHuman entityhuman) { - return this.player.dead ? false : entityhuman.f(this.player) <= 64.0D; - } - - public boolean c(ItemStack itemstack) { - int i; - - for (i = 0; i < this.armor.length; ++i) { - if (this.armor[i] != null && this.armor[i].doMaterialsMatch(itemstack)) { - return true; - } - } - - for (i = 0; i < this.items.length; ++i) { - if (this.items[i] != null && this.items[i].doMaterialsMatch(itemstack)) { - return true; - } - } - - return false; - } - - public void startOpen() {} - - public void closeContainer() {} - - public boolean b(int i, ItemStack itemstack) { - return true; - } - - public void b(PlayerInventory playerinventory) { - int i; - - for (i = 0; i < this.items.length; ++i) { - this.items[i] = ItemStack.b(playerinventory.items[i]); - } - - 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 deleted file mode 100644 index e6012fbaa8..0000000000 --- a/src/main/java/net/minecraft/server/PlayerList.java +++ /dev/null @@ -1,1216 +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.Map; -import java.util.UUID; -import java.util.Map.Entry; - -import net.minecraft.util.com.google.common.base.Charsets; -import net.minecraft.util.com.google.common.collect.Lists; -import net.minecraft.util.com.google.common.collect.Maps; -import net.minecraft.util.com.mojang.authlib.GameProfile; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; - -// CraftBukkit start -import org.bukkit.craftbukkit.CraftServer; -import org.bukkit.craftbukkit.CraftWorld; -import org.bukkit.craftbukkit.chunkio.ChunkIOExecutor; - -import org.bukkit.Bukkit; -import org.bukkit.Location; -import org.bukkit.TravelAgent; -import org.bukkit.entity.Player; -import org.bukkit.event.player.PlayerChangedWorldEvent; -import org.bukkit.event.player.PlayerPortalEvent; -import org.bukkit.event.player.PlayerJoinEvent; -import org.bukkit.event.player.PlayerLoginEvent; -import org.bukkit.event.player.PlayerQuitEvent; -import org.bukkit.event.player.PlayerRespawnEvent; -import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause; -import org.bukkit.util.Vector; -// CraftBukkit end - -public abstract class PlayerList { - - public static final File a = new File("banned-players.json"); - public static final File b = new File("banned-ips.json"); - public static final File c = new File("ops.json"); - public static final File d = new File("whitelist.json"); - private static final Logger g = LogManager.getLogger(); - private static final SimpleDateFormat h = new SimpleDateFormat("yyyy-MM-dd \'at\' HH:mm:ss z"); - private final MinecraftServer server; - public final List players = new java.util.concurrent.CopyOnWriteArrayList(); // CraftBukkit - ArrayList -> CopyOnWriteArrayList: Iterator safety - private final GameProfileBanList j; - private final IpBanList k; - private final OpList operators; - private final WhiteList whitelist; - private final Map n; - public IPlayerFileData playerFileData; // CraftBukkit - private -> public - public boolean hasWhitelist; // CraftBukkit - private -> public - protected int maxPlayers; - private int q; - private EnumGamemode r; - private boolean s; - private int t; - - // CraftBukkit start - private CraftServer cserver; - - public PlayerList(MinecraftServer minecraftserver) { - minecraftserver.server = new CraftServer(minecraftserver, this); - minecraftserver.console = org.bukkit.craftbukkit.command.ColouredConsoleSender.getInstance(); - minecraftserver.reader.addCompleter(new org.bukkit.craftbukkit.command.ConsoleCommandCompleter(minecraftserver.server)); - this.cserver = minecraftserver.server; - // CraftBukkit end - - this.j = new GameProfileBanList(a); - this.k = new IpBanList(b); - this.operators = new OpList(c); - this.whitelist = new WhiteList(d); - this.n = Maps.newHashMap(); - this.server = minecraftserver; - this.j.a(false); - this.k.a(false); - this.maxPlayers = 8; - } - - public void a(NetworkManager networkmanager, EntityPlayer entityplayer) { - GameProfile gameprofile = entityplayer.getProfile(); - UserCache usercache = this.server.getUserCache(); - GameProfile gameprofile1 = usercache.a(gameprofile.getId()); - String s = gameprofile1 == null ? gameprofile.getName() : gameprofile1.getName(); - - usercache.a(gameprofile); - NBTTagCompound nbttagcompound = this.a(entityplayer); - - entityplayer.spawnIn(this.server.getWorldServer(entityplayer.dimension)); - entityplayer.playerInteractManager.a((WorldServer) entityplayer.world); - String s1 = "local"; - - if (networkmanager.getSocketAddress() != null) { - s1 = networkmanager.getSocketAddress().toString(); - } - - // CraftBukkit - Moved message to after join - // g.info(entityplayer.getName() + "[" + s1 + "] logged in with entity id " + entityplayer.getId() + " at (" + 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, networkmanager, 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 PacketPlayOutLogin(entityplayer.getId(), entityplayer.playerInteractManager.getGameMode(), worldserver.getWorldData().isHardcore(), worldserver.worldProvider.dimension, worldserver.difficulty, maxPlayers, worldserver.getWorldData().getType())); - entityplayer.getBukkitEntity().sendSupportedChannels(); - // CraftBukkit end - playerconnection.sendPacket(new PacketPlayOutCustomPayload("MC|Brand", this.getServer().getServerModName().getBytes(Charsets.UTF_8))); - playerconnection.sendPacket(new PacketPlayOutSpawnPosition(chunkcoordinates.x, chunkcoordinates.y, chunkcoordinates.z)); - playerconnection.sendPacket(new PacketPlayOutAbilities(entityplayer.abilities)); - playerconnection.sendPacket(new PacketPlayOutHeldItemSlot(entityplayer.inventory.itemInHandIndex)); - entityplayer.getStatisticManager().d(); - entityplayer.getStatisticManager().updateStatistics(entityplayer); - this.sendScoreboard((ScoreboardServer) worldserver.getScoreboard(), entityplayer); - this.server.az(); - /* CraftBukkit start - login message is handled in the event - ChatMessage chatmessage; - - if (!entityplayer.getName().equalsIgnoreCase(s)) { - chatmessage = new ChatMessage("multiplayer.player.joined.renamed", new Object[] { entityplayer.getScoreboardDisplayName(), s}); - } else { - chatmessage = new ChatMessage("multiplayer.player.joined", new Object[] { entityplayer.getScoreboardDisplayName()}); - } - - chatmessage.getChatModifier().setColor(EnumChatFormat.YELLOW); - this.sendMessage(chatmessage); - // CraftBukkit end */ - this.c(entityplayer); - worldserver = this.server.getWorldServer(entityplayer.dimension); // CraftBukkit - Update in case join event changed it - playerconnection.a(entityplayer.locX, entityplayer.locY, entityplayer.locZ, entityplayer.yaw, entityplayer.pitch); - this.b(entityplayer, worldserver); - if (this.server.getResourcePack().length() > 0) { - entityplayer.setResourcePack(this.server.getResourcePack()); - } - - Iterator iterator = entityplayer.getEffects().iterator(); - - while (iterator.hasNext()) { - MobEffect mobeffect = (MobEffect) iterator.next(); - - playerconnection.sendPacket(new PacketPlayOutEntityEffect(entityplayer.getId(), mobeffect)); - } - - entityplayer.syncInventory(); - if (nbttagcompound != null && nbttagcompound.hasKeyOfType("Riding", 10)) { - Entity entity = EntityTypes.a(nbttagcompound.getCompound("Riding"), worldserver); - - if (entity != null) { - entity.attachedToPlayer = true; - worldserver.addEntity(entity); - entityplayer.mount(entity); - entity.attachedToPlayer = false; - } - } - - // CraftBukkit - Moved from above, added world - g.info(entityplayer.getName() + "[" + s1 + "] logged in with entity id " + entityplayer.getId() + " at ([" + entityplayer.world.worldData.getName() + "] " + entityplayer.locX + ", " + entityplayer.locY + ", " + entityplayer.locZ + ")"); - } - - public void sendScoreboard(ScoreboardServer scoreboardserver, EntityPlayer entityplayer) { // CraftBukkit - protected -> public - HashSet hashset = new HashSet(); - Iterator iterator = scoreboardserver.getTeams().iterator(); - - while (iterator.hasNext()) { - ScoreboardTeam scoreboardteam = (ScoreboardTeam) iterator.next(); - - entityplayer.playerConnection.sendPacket(new PacketPlayOutScoreboardTeam(scoreboardteam, 0)); - } - - for (int i = 0; i < 3; ++i) { - ScoreboardObjective scoreboardobjective = scoreboardserver.getObjectiveForSlot(i); - - if (scoreboardobjective != null && !hashset.contains(scoreboardobjective)) { - List list = scoreboardserver.getScoreboardScorePacketsForObjective(scoreboardobjective); - Iterator iterator1 = list.iterator(); - - while (iterator1.hasNext()) { - Packet packet = (Packet) iterator1.next(); - - entityplayer.playerConnection.sendPacket(packet); - } - - hashset.add(scoreboardobjective); - } - } - } - - 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.r(); - - if (worldserver != null) { - worldserver.getPlayerChunkMap().removePlayer(entityplayer); - } - - worldserver1.getPlayerChunkMap().addPlayer(entityplayer); - worldserver1.chunkProviderServer.getChunkAt((int) entityplayer.locX >> 4, (int) entityplayer.locZ >> 4); - } - - public int d() { - return PlayerChunkMap.getFurthestViewableBlock(this.s()); - } - - public NBTTagCompound a(EntityPlayer entityplayer) { - // CraftBukkit - fix reference to worldserver array - NBTTagCompound nbttagcompound = this.server.worlds.get(0).getWorldData().i(); - NBTTagCompound nbttagcompound1; - - if (entityplayer.getName().equals(this.server.M()) && nbttagcompound != null) { - entityplayer.f(nbttagcompound); - nbttagcompound1 = nbttagcompound; - g.debug("loading single player"); - } else { - nbttagcompound1 = this.playerFileData.load(entityplayer); - } - - return nbttagcompound1; - } - - protected void b(EntityPlayer entityplayer) { - this.playerFileData.save(entityplayer); - ServerStatisticManager serverstatisticmanager = (ServerStatisticManager) this.n.get(entityplayer.getUniqueID()); - - if (serverstatisticmanager != null) { - serverstatisticmanager.b(); - } - } - - public void c(EntityPlayer entityplayer) { - cserver.detectListNameConflict(entityplayer); // CraftBukkit - // this.sendAll(new PacketPlayOutPlayerInfo(entityplayer.getName(), 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.getName() + " joined the game."); - this.cserver.getPluginManager().callEvent(playerJoinEvent); - - String joinMessage = playerJoinEvent.getJoinMessage(); - - if ((joinMessage != null) && (joinMessage.length() > 0)) { - for (IChatBaseComponent line : org.bukkit.craftbukkit.util.CraftChatMessage.fromString(joinMessage)) { - this.server.getPlayerList().sendAll(new PacketPlayOutChat(line)); - } - } - 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 - PacketPlayOutPlayerInfo packet = new PacketPlayOutPlayerInfo(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 - if (!entityplayer.getBukkitEntity().canSee(entityplayer1.getBukkitEntity())) { - continue; - } - // .name -> .listName - entityplayer.playerConnection.sendPacket(new PacketPlayOutPlayerInfo(entityplayer1.listName, true, entityplayer1.ping)); - // CraftBukkit end - } - } - - public void d(EntityPlayer entityplayer) { - entityplayer.r().getPlayerChunkMap().movePlayer(entityplayer); - } - - public String disconnect(EntityPlayer entityplayer) { // CraftBukkit - return string - entityplayer.a(StatisticList.f); - - // CraftBukkit start - Quitting must be before we do final save of data, in case plugins need to modify it - org.bukkit.craftbukkit.event.CraftEventFactory.handleInventoryCloseEvent(entityplayer); - - PlayerQuitEvent playerQuitEvent = new PlayerQuitEvent(this.cserver.getPlayer(entityplayer), "\u00A7e" + entityplayer.getName() + " left the game."); - this.cserver.getPluginManager().callEvent(playerQuitEvent); - entityplayer.getBukkitEntity().disconnect(playerQuitEvent.getQuitMessage()); - // CraftBukkit end - - this.b(entityplayer); - WorldServer worldserver = entityplayer.r(); - - if (entityplayer.vehicle != null && !(entityplayer.vehicle instanceof EntityPlayer)) { // CraftBukkit - Don't remove players - worldserver.removeEntity(entityplayer.vehicle); - g.debug("removing player mount"); - } - - worldserver.kill(entityplayer); - worldserver.getPlayerChunkMap().removePlayer(entityplayer); - this.players.remove(entityplayer); - this.n.remove(entityplayer.getUniqueID()); - ChunkIOExecutor.adjustPoolSize(this.getPlayerCount()); // CraftBukkit - - // CraftBukkit start - .name -> .listName, replace sendAll with loop - // this.sendAll(new PacketPlayOutPlayerInfo(entityplayer.getName(), false, 9999)); - PacketPlayOutPlayerInfo packet = new PacketPlayOutPlayerInfo(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); - } else { - entityplayer1.getBukkitEntity().removeDisconnectingPlayer(entityplayer.getBukkitEntity()); - } - } - // This removes the scoreboard (and player reference) for the specific player in the manager - this.cserver.getScoreboardManager().removePlayer(entityplayer.getBukkitEntity()); - - return playerQuitEvent.getQuitMessage(); - // CraftBukkit end - } - - // CraftBukkit start - Whole method, SocketAddress to LoginListener, added hostname to signature, return EntityPlayer - public EntityPlayer attemptLogin(LoginListener loginlistener, GameProfile gameprofile, 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. - SocketAddress socketaddress = loginlistener.networkManager.getSocketAddress(); - - EntityPlayer entity = new EntityPlayer(this.server, this.server.getWorldServer(0), gameprofile, new PlayerInteractManager(this.server.getWorldServer(0))); - Player player = entity.getBukkitEntity(); - PlayerLoginEvent event = new PlayerLoginEvent(player, hostname, ((java.net.InetSocketAddress) socketaddress).getAddress()); - String s; - - if (this.j.isBanned(gameprofile) && !this.j.get(gameprofile).hasExpired()) { - GameProfileBanEntry gameprofilebanentry = (GameProfileBanEntry) this.j.get(gameprofile); - - s = "You are banned from this server!\nReason: " + gameprofilebanentry.getReason(); - if (gameprofilebanentry.getExpires() != null) { - s = s + "\nYour ban will be removed on " + h.format(gameprofilebanentry.getExpires()); - } - - // return s; - event.disallow(PlayerLoginEvent.Result.KICK_BANNED, s); - } else if (!this.isWhitelisted(gameprofile)) { - // return "You are not white-listed on this server!"; - event.disallow(PlayerLoginEvent.Result.KICK_WHITELIST, "You are not white-listed on this server!"); - } else if (this.k.isBanned(socketaddress) && !this.k.get(gameprofile).hasExpired()) { - IpBanEntry ipbanentry = this.k.get(socketaddress); - - s = "Your IP address is banned from this server!\nReason: " + ipbanentry.getReason(); - if (ipbanentry.getExpires() != null) { - s = s + "\nYour ban will be removed on " + h.format(ipbanentry.getExpires()); - } - - // return s; - event.disallow(PlayerLoginEvent.Result.KICK_BANNED, s); - } else { - // return this.players.size() >= this.maxPlayers ? "The server is full!" : null; - if (this.players.size() >= this.maxPlayers) { - event.disallow(PlayerLoginEvent.Result.KICK_FULL, "The server is full!"); - } - } - - this.cserver.getPluginManager().callEvent(event); - if (event.getResult() != PlayerLoginEvent.Result.ALLOWED) { - loginlistener.disconnect(event.getKickMessage()); - return null; - } - - return entity; - // CraftBukkit end - } - - public EntityPlayer processLogin(GameProfile gameprofile, EntityPlayer player) { // CraftBukkit - added EntityPlayer - UUID uuid = EntityHuman.a(gameprofile); - ArrayList arraylist = Lists.newArrayList(); - - EntityPlayer entityplayer; - - for (int i = 0; i < this.players.size(); ++i) { - entityplayer = (EntityPlayer) this.players.get(i); - if (entityplayer.getUniqueID().equals(uuid)) { - 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.R()) { - object = new DemoPlayerInteractManager(this.server.getWorldServer(0)); - } else { - object = new PlayerInteractManager(this.server.getWorldServer(0)); - } - - return new EntityPlayer(this.server, this.server.getWorldServer(0), gameprofile, (PlayerInteractManager) object); - // */ - return player; - // CraftBukkit end - } - - // CraftBukkit start - public EntityPlayer moveToWorld(EntityPlayer entityplayer, int i, boolean flag) { - return this.moveToWorld(entityplayer, i, flag, null, true); - } - - public EntityPlayer moveToWorld(EntityPlayer entityplayer, int i, boolean flag, Location location, boolean avoidSuffocation) { - // CraftBukkit end - entityplayer.r().getTracker().untrackPlayer(entityplayer); - // entityplayer.r().getTracker().untrackEntity(entityplayer); // CraftBukkit - entityplayer.r().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.dimension = i; - Object object; - - if (this.server.R()) { - object = new DemoPlayerInteractManager(this.server.getWorldServer(entityplayer.dimension)); - } else { - object = new PlayerInteractManager(this.server.getWorldServer(entityplayer.dimension)); - } - - EntityPlayer entityplayer1 = new EntityPlayer(this.server, this.server.getWorldServer(entityplayer.dimension), entityplayer.getProfile(), (PlayerInteractManager) object); - // */ - EntityPlayer entityplayer1 = entityplayer; - org.bukkit.World fromWorld = entityplayer1.getBukkitEntity().getWorld(); - entityplayer1.viewingCredits = false; - // CraftBukkit end - - entityplayer1.playerConnection = entityplayer.playerConnection; - entityplayer1.copyTo(entityplayer, flag); - entityplayer1.d(entityplayer.getId()); - // WorldServer worldserver = this.server.getWorldServer(entityplayer.dimension); // CraftBukkit - handled later - - // this.a(entityplayer1, entityplayer, worldserver); // CraftBukkit - removed - ChunkCoordinates chunkcoordinates1; - - // CraftBukkit start - fire PlayerRespawnEvent - 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 PacketPlayOutGameStateChange(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 (avoidSuffocation && !worldserver.getCubes(entityplayer1, entityplayer1.boundingBox).isEmpty()) { // CraftBukkit - 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 PacketPlayOutRespawn((byte) (actualDimension >= 0 ? -1 : 0), worldserver.difficulty, worldserver.getWorldData().getType(), entityplayer.playerInteractManager.getGameMode())); - entityplayer1.playerConnection.sendPacket(new PacketPlayOutRespawn(actualDimension, worldserver.difficulty, worldserver.getWorldData().getType(), entityplayer1.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(); - // entityplayer1.playerConnection.a(entityplayer1.locX, entityplayer1.locY, entityplayer1.locZ, entityplayer1.yaw, entityplayer1.pitch); - // CraftBukkit end - entityplayer1.playerConnection.sendPacket(new PacketPlayOutSpawnPosition(chunkcoordinates1.x, chunkcoordinates1.y, chunkcoordinates1.z)); - entityplayer1.playerConnection.sendPacket(new PacketPlayOutExperience(entityplayer1.exp, entityplayer1.expTotal, entityplayer1.expLevel)); - this.b(entityplayer1, worldserver); - // CraftBukkit start - // Don't re-add player to player list if disconnected - if (!entityplayer.playerConnection.isDisconnected()) { - worldserver.getPlayerChunkMap().addPlayer(entityplayer1); - worldserver.addEntity(entityplayer1); - this.players.add(entityplayer1); - } - // Added from changeDimension - this.updateClient(entityplayer1); // Update health, etc... - entityplayer1.updateAbilities(); - Iterator iterator = entityplayer1.getEffects().iterator(); - - while (iterator.hasNext()) { - MobEffect mobeffect = (MobEffect) iterator.next(); - - entityplayer1.playerConnection.sendPacket(new PacketPlayOutEntityEffect(entityplayer1.getId(), mobeffect)); - } - // entityplayer1.syncInventory(); - // CraftBukkit end - entityplayer1.setHealth(entityplayer1.getHealth()); - - // CraftBukkit start - // Don't fire on respawn - if (fromWorld != location.getWorld()) { - PlayerChangedWorldEvent event = new PlayerChangedWorldEvent((Player) entityplayer1.getBukkitEntity(), fromWorld); - Bukkit.getServer().getPluginManager().callEvent(event); - } - - // Save player file again if they were disconnected - if (entityplayer.playerConnection.isDisconnected()) { - this.b(entityplayer1); - } - // CraftBukkit end - - return entityplayer1; - } - - // CraftBukkit start - Replaced the standard handling of portals with a more customised method. - public void changeDimension(EntityPlayer entityplayer, int i, TeleportCause cause) { - WorldServer exitWorld = null; - if (entityplayer.dimension < CraftWorld.CUSTOM_DIMENSION_OFFSET) { // plugins must specify exit from custom Bukkit worlds - // only target existing worlds (compensate for allow-nether/allow-end as false) - for (WorldServer world : this.server.worlds) { - if (world.dimension == i) { - exitWorld = world; - } - } - } - - Location enter = entityplayer.getBukkitEntity().getLocation(); - Location exit = null; - boolean useTravelAgent = false; // don't use agent for custom worlds or return from THE_END - if (exitWorld != null) { - if ((cause == TeleportCause.END_PORTAL) && (i == 0)) { - // THE_END -> NORMAL; use bed if available, otherwise default spawn - exit = ((org.bukkit.craftbukkit.entity.CraftPlayer) entityplayer.getBukkitEntity()).getBedSpawnLocation(); - if (exit == null || ((CraftWorld) exit.getWorld()).getHandle().dimension != 0) { - exit = exitWorld.getWorld().getSpawnLocation(); - } - } else { - // NORMAL <-> NETHER or NORMAL -> THE_END - exit = this.calculateTarget(enter, exitWorld); - useTravelAgent = true; - } - } - - TravelAgent agent = exit != null ? (TravelAgent) ((CraftWorld) exit.getWorld()).getHandle().getTravelAgent() : org.bukkit.craftbukkit.CraftTravelAgent.DEFAULT; // return arbitrary TA to compensate for implementation dependent plugins - PlayerPortalEvent event = new PlayerPortalEvent(entityplayer.getBukkitEntity(), enter, exit, agent, cause); - event.useTravelAgent(useTravelAgent); - Bukkit.getServer().getPluginManager().callEvent(event); - if (event.isCancelled() || event.getTo() == null) { - return; - } - - exit = event.useTravelAgent() ? event.getPortalTravelAgent().findOrCreate(event.getTo()) : event.getTo(); - if (exit == null) { - return; - } - exitWorld = ((CraftWorld) exit.getWorld()).getHandle(); - - Vector velocity = entityplayer.getBukkitEntity().getVelocity(); - boolean before = exitWorld.chunkProviderServer.forceChunkLoad; - exitWorld.chunkProviderServer.forceChunkLoad = true; - exitWorld.getTravelAgent().adjustExit(entityplayer, exit, velocity); - exitWorld.chunkProviderServer.forceChunkLoad = before; - - this.moveToWorld(entityplayer, exitWorld.dimension, true, exit, false); // Vanilla doesn't check for suffocation when handling portals, so neither should we - if (entityplayer.motX != velocity.getX() || entityplayer.motY != velocity.getY() || entityplayer.motZ != velocity.getZ()) { - entityplayer.getBukkitEntity().setVelocity(velocity); - } - // CraftBukkit end - } - - public void a(Entity entity, int i, WorldServer worldserver, WorldServer worldserver1) { - // CraftBukkit start - Split into modular functions - Location exit = this.calculateTarget(entity.getBukkitEntity().getLocation(), worldserver1); - this.repositionEntity(entity, exit, true); - } - - // Copy of original a(Entity, int, WorldServer, WorldServer) method with only location calculation logic - public Location calculateTarget(Location enter, World target) { - WorldServer worldserver = ((CraftWorld) enter.getWorld()).getHandle(); - WorldServer worldserver1 = ((CraftWorld) target.getWorld()).getHandle(); - int i = worldserver.dimension; - - double y = enter.getY(); - float yaw = enter.getYaw(); - float pitch = enter.getPitch(); - double d0 = enter.getX(); - double d1 = enter.getZ(); - 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 (worldserver1.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 (worldserver1.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) { - // use default NORMAL world spawn instead of target - worldserver1 = this.server.worlds.get(0); - chunkcoordinates = worldserver1.getSpawn(); - } else { - chunkcoordinates = worldserver1.getDimensionSpawn(); - } - - d0 = (double) chunkcoordinates.x; - y = (double) chunkcoordinates.y; - d1 = (double) chunkcoordinates.z; - yaw = 90.0F; - pitch = 0.0F; - /* - 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.getTravelAgent().a(entity, d3, d4, d5, f); - } - - worldserver.methodProfiler.b(); - */ - } - - // entity.spawnIn(worldserver1); - return new Location(worldserver1.getWorld(), d0, y, d1, yaw, pitch); - } - - // copy of original a(Entity, int, WorldServer, WorldServer) method with only entity repositioning logic - public void repositionEntity(Entity entity, Location exit, boolean portal) { - int i = entity.dimension; - WorldServer worldserver = (WorldServer) entity.world; - WorldServer worldserver1 = ((CraftWorld) exit.getWorld()).getHandle(); - /* - 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"); - entity.setPositionRotation(exit.getX(), exit.getY(), exit.getZ(), exit.getYaw(), exit.getPitch()); - if (entity.isAlive()) { - worldserver.entityJoinedWorld(entity, false); - } - /* - 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()) { - // entity.setPositionRotation(d0, entity.locY, d1, entity.yaw, entity.pitch) - // worldserver1.getTravelAgent().a(entity, d3, d4, d5, f); - if (portal) { - Vector velocity = entity.getBukkitEntity().getVelocity(); - worldserver1.getTravelAgent().adjustExit(entity, exit, velocity); - entity.setPositionRotation(exit.getX(), exit.getY(), exit.getZ(), exit.getYaw(), exit.getPitch()); - if (entity.motX != velocity.getX() || entity.motY != velocity.getY() || entity.motZ != velocity.getZ()) { - entity.getBukkitEntity().setVelocity(velocity); - } - } - worldserver1.addEntity(entity); - worldserver1.entityJoinedWorld(entity, false); - } - - worldserver.methodProfiler.b(); - } - - entity.spawnIn(worldserver1); - // CraftBukkit end - } - - public void tick() { - if (++this.t > 600) { - this.t = 0; - } - - /* CraftBukkit start - Remove updating of lag to players -- it spams way to much on big servers. - if (this.t < this.players.size()) { - EntityPlayer entityplayer = (EntityPlayer) this.players.get(this.p); - - this.sendAll(new PacketPlayOutPlayerInfo(entityplayer.getName(), 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 b(boolean flag) { - String s = ""; - ArrayList arraylist = Lists.newArrayList(this.players); - - for (int i = 0; i < arraylist.size(); ++i) { - if (i > 0) { - s = s + ", "; - } - - s = s + ((EntityPlayer) arraylist.get(i)).getName(); - if (flag) { - s = s + " (" + ((EntityPlayer) arraylist.get(i)).getUniqueID().toString() + ")"; - } - } - - return s; - } - - public String[] f() { - String[] astring = new String[this.players.size()]; - - for (int i = 0; i < this.players.size(); ++i) { - astring[i] = ((EntityPlayer) this.players.get(i)).getName(); - } - - return astring; - } - - public GameProfile[] g() { - GameProfile[] agameprofile = new GameProfile[this.players.size()]; - - for (int i = 0; i < this.players.size(); ++i) { - agameprofile[i] = ((EntityPlayer) this.players.get(i)).getProfile(); - } - - return agameprofile; - } - - public GameProfileBanList getProfileBans() { - return this.j; - } - - public IpBanList getIPBans() { - return this.k; - } - - public void addOp(GameProfile gameprofile) { - this.operators.add(new OpListEntry(gameprofile, this.server.l())); - - // CraftBukkit start - Player player = server.server.getPlayer(gameprofile.getId()); - if (player != null) { - player.recalculatePermissions(); - } - // CraftBukkit end - } - - public void removeOp(GameProfile gameprofile) { - this.operators.remove(gameprofile); - - // CraftBukkit start - Player player = server.server.getPlayer(gameprofile.getId()); - if (player != null) { - player.recalculatePermissions(); - } - // CraftBukkit end - } - - public boolean isWhitelisted(GameProfile gameprofile) { - return !this.hasWhitelist || this.operators.d(gameprofile) || this.whitelist.d(gameprofile); - } - - public boolean isOp(GameProfile gameprofile) { - // CraftBukkit - fix reference to worldserver array - return this.operators.d(gameprofile) || this.server.N() && this.server.worlds.get(0).getWorldData().allowCommands() && this.server.M().equalsIgnoreCase(gameprofile.getName()) || this.s; - } - - public EntityPlayer getPlayer(String s) { - Iterator iterator = this.players.iterator(); - - EntityPlayer entityplayer; - - do { - if (!iterator.hasNext()) { - return null; - } - - entityplayer = (EntityPlayer) iterator.next(); - } while (!entityplayer.getName().equalsIgnoreCase(s)); - - return entityplayer; - } - - public List a(ChunkCoordinates chunkcoordinates, int i, int j, int k, int l, int i1, int j1, Map map, String s, String s1, World world) { - if (this.players.isEmpty()) { - return Collections.emptyList(); - } else { - Object object = new ArrayList(); - boolean flag = k < 0; - boolean flag1 = s != null && s.startsWith("!"); - boolean flag2 = s1 != null && s1.startsWith("!"); - int k1 = i * i; - int l1 = j * j; - - k = MathHelper.a(k); - if (flag1) { - s = s.substring(1); - } - - if (flag2) { - s1 = s1.substring(1); - } - - for (int i2 = 0; i2 < this.players.size(); ++i2) { - EntityPlayer entityplayer = (EntityPlayer) this.players.get(i2); - - if ((world == null || entityplayer.world == world) && (s == null || flag1 != s.equalsIgnoreCase(entityplayer.getName()))) { - if (s1 != null) { - ScoreboardTeamBase scoreboardteambase = entityplayer.getScoreboardTeam(); - String s2 = scoreboardteambase == null ? "" : scoreboardteambase.getName(); - - if (flag2 == s1.equalsIgnoreCase(s2)) { - continue; - } - } - - if (chunkcoordinates != null && (i > 0 || j > 0)) { - float f = chunkcoordinates.e(entityplayer.getChunkCoordinates()); - - if (i > 0 && f < (float) k1 || j > 0 && f > (float) l1) { - continue; - } - } - - if (this.a((EntityHuman) entityplayer, map) && (l == EnumGamemode.NONE.getId() || l == entityplayer.playerInteractManager.getGameMode().getId()) && (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; - } - } - - private boolean a(EntityHuman entityhuman, Map map) { - if (map != null && map.size() != 0) { - Iterator iterator = map.entrySet().iterator(); - - Entry entry; - boolean flag; - int i; - - do { - if (!iterator.hasNext()) { - return true; - } - - entry = (Entry) iterator.next(); - String s = (String) entry.getKey(); - - flag = false; - if (s.endsWith("_min") && s.length() > 4) { - flag = true; - s = s.substring(0, s.length() - 4); - } - - Scoreboard scoreboard = entityhuman.getScoreboard(); - ScoreboardObjective scoreboardobjective = scoreboard.getObjective(s); - - if (scoreboardobjective == null) { - return false; - } - - ScoreboardScore scoreboardscore = entityhuman.getScoreboard().getPlayerScoreForObjective(entityhuman.getName(), scoreboardobjective); - - i = scoreboardscore.getScore(); - if (i < ((Integer) entry.getValue()).intValue() && flag) { - return false; - } - } while (i <= ((Integer) entry.getValue()).intValue() || flag); - - return false; - } else { - return true; - } - } - - 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(GameProfile gameprofile) { - this.whitelist.add(new WhiteListEntry(gameprofile)); - } - - public void removeWhitelist(GameProfile gameprofile) { - this.whitelist.remove(gameprofile); - } - - public WhiteList getWhitelist() { - return this.whitelist; - } - - public String[] getWhitelisted() { - return this.whitelist.getEntries(); - } - - public OpList getOPs() { - return this.operators; - } - - public String[] n() { - return this.operators.getEntries(); - } - - public void reloadWhitelist() {} - - public void b(EntityPlayer entityplayer, WorldServer worldserver) { - entityplayer.playerConnection.sendPacket(new PacketPlayOutUpdateTime(worldserver.getTime(), worldserver.getDayTime(), worldserver.getGameRules().getBoolean("doDaylightCycle"))); - if (worldserver.Q()) { - // CraftBukkit start - handle player weather - // entityplayer.playerConnection.sendPacket(new PacketPlayOutGameStateChange(1, 0.0F)); - // entityplayer.playerConnection.sendPacket(new PacketPlayOutGameStateChange(7, worldserver.j(1.0F))); - // entityplayer.playerConnection.sendPacket(new PacketPlayOutGameStateChange(8, worldserver.h(1.0F))); - entityplayer.setPlayerWeather(org.bukkit.WeatherType.DOWNFALL, false); - // CraftBukkit end - } - } - - public void updateClient(EntityPlayer entityplayer) { - entityplayer.updateInventory(entityplayer.defaultContainer); - entityplayer.getBukkitEntity().updateScaledHealth(); // CraftBukkit - Update scaled health on respawn and worldchange - entityplayer.playerConnection.sendPacket(new PacketPlayOutHeldItemSlot(entityplayer.inventory.itemInHandIndex)); - } - - public int getPlayerCount() { - return this.players.size(); - } - - public int getMaxPlayers() { - return this.maxPlayers; - } - - public String[] getSeenPlayers() { - // CraftBukkit - fix reference to worldserver array - return this.server.worlds.get(0).getDataManager().getPlayerFileData().getSeenPlayers(); - } - - public boolean getHasWhitelist() { - return this.hasWhitelist; - } - - public void setHasWhitelist(boolean flag) { - this.hasWhitelist = flag; - } - - public List b(String s) { - ArrayList arraylist = new ArrayList(); - Iterator iterator = this.players.iterator(); - - while (iterator.hasNext()) { - EntityPlayer entityplayer = (EntityPlayer) iterator.next(); - - if (entityplayer.s().equals(s)) { - arraylist.add(entityplayer); - } - } - - return arraylist; - } - - public int s() { - return this.q; - } - - public MinecraftServer getServer() { - return this.server; - } - - public NBTTagCompound t() { - return null; - } - - private void a(EntityPlayer entityplayer, EntityPlayer entityplayer1, World world) { - if (entityplayer1 != null) { - entityplayer.playerInteractManager.setGameMode(entityplayer1.playerInteractManager.getGameMode()); - } else if (this.r != null) { - entityplayer.playerInteractManager.setGameMode(this.r); - } - - entityplayer.playerInteractManager.b(world.getWorldData().getGameType()); - } - - public void u() { - for (int i = 0; i < this.players.size(); ++i) { - ((EntityPlayer) this.players.get(i)).playerConnection.disconnect(this.server.server.getShutdownMessage()); // CraftBukkit - add custom shutdown message - } - } - - // CraftBukkit start - Support multi-line messages - public void sendMessage(IChatBaseComponent[] ichatbasecomponent) { - for (IChatBaseComponent component : ichatbasecomponent) { - sendMessage(component, true); - } - } - // CraftBukkit end - - public void sendMessage(IChatBaseComponent ichatbasecomponent, boolean flag) { - this.server.sendMessage(ichatbasecomponent); - this.sendAll(new PacketPlayOutChat(ichatbasecomponent, flag)); - } - - public void sendMessage(IChatBaseComponent ichatbasecomponent) { - this.sendMessage(ichatbasecomponent, true); - } - - public ServerStatisticManager a(EntityHuman entityhuman) { - UUID uuid = entityhuman.getUniqueID(); - ServerStatisticManager serverstatisticmanager = uuid == null ? null : (ServerStatisticManager) this.n.get(uuid); - - if (serverstatisticmanager == null) { - File file1 = new File(this.server.getWorldServer(0).getDataManager().getDirectory(), "stats"); - File file2 = new File(file1, uuid.toString() + ".json"); - - if (!file2.exists()) { - File file3 = new File(file1, entityhuman.getName() + ".json"); - - if (file3.exists() && file3.isFile()) { - file3.renameTo(file2); - } - } - - serverstatisticmanager = new ServerStatisticManager(this.server, file2); - serverstatisticmanager.a(); - this.n.put(uuid, serverstatisticmanager); - } - - return serverstatisticmanager; - } - - public void a(int i) { - this.q = i; - if (this.server.worldServer != null) { - WorldServer[] aworldserver = this.server.worldServer; - int j = aworldserver.length; - - for (int k = 0; k < j; ++k) { - WorldServer worldserver = aworldserver[k]; - - if (worldserver != null) { - worldserver.getPlayerChunkMap().a(i); - } - } - } - } -} diff --git a/src/main/java/net/minecraft/server/PlayerSelector.java b/src/main/java/net/minecraft/server/PlayerSelector.java deleted file mode 100644 index 819a13339e..0000000000 --- a/src/main/java/net/minecraft/server/PlayerSelector.java +++ /dev/null @@ -1,247 +0,0 @@ -package net.minecraft.server; - -import java.util.*; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -public class PlayerSelector { - - private static final Pattern a = Pattern.compile("^@([parf])(?:\\[([\\w=,!-]*)\\])?$"); - private static final Pattern b = Pattern.compile("\\G([-!]?[\\w-]*)(?:$|,)"); - private static final Pattern c = Pattern.compile("\\G(\\w+)=([-!]?[\\w-]*)(?:$|,)"); - - public static EntityPlayer getPlayer(ICommandListener icommandlistener, String s) { - EntityPlayer[] aentityplayer = getPlayers(icommandlistener, s); - - return aentityplayer != null && aentityplayer.length == 1 ? aentityplayer[0] : null; - } - - public static IChatBaseComponent getPlayerNames(ICommandListener icommandlistener, String s) { - EntityPlayer[] aentityplayer = getPlayers(icommandlistener, s); - - if (aentityplayer != null && aentityplayer.length != 0) { - IChatBaseComponent[] aichatbasecomponent = new IChatBaseComponent[aentityplayer.length]; - - for (int i = 0; i < aichatbasecomponent.length; ++i) { - aichatbasecomponent[i] = aentityplayer[i].getScoreboardDisplayName(); - } - - return CommandAbstract.a(aichatbasecomponent); - } else { - return null; - } - } - - public static EntityPlayer[] getPlayers(ICommandListener icommandlistener, String s) { - // CraftBukkit start - disable playerselections for ICommandListeners other than command blocks - if (!(icommandlistener instanceof CommandBlockListenerAbstract)) { - return null; - } - // CraftBukkit end - - Matcher matcher = a.matcher(s); - - if (matcher.matches()) { - Map map = h(matcher.group(2)); - String s1 = matcher.group(1); - int i = c(s1); - int j = d(s1); - int k = f(s1); - int l = e(s1); - int i1 = g(s1); - int j1 = EnumGamemode.NONE.getId(); - ChunkCoordinates chunkcoordinates = icommandlistener.getChunkCoordinates(); - Map map1 = a(map); - String s2 = null; - String s3 = null; - boolean flag = false; - - if (map.containsKey("rm")) { - i = MathHelper.a((String) map.get("rm"), i); - flag = true; - } - - if (map.containsKey("r")) { - j = MathHelper.a((String) map.get("r"), j); - flag = true; - } - - if (map.containsKey("lm")) { - k = MathHelper.a((String) map.get("lm"), k); - } - - if (map.containsKey("l")) { - l = MathHelper.a((String) map.get("l"), l); - } - - if (map.containsKey("x")) { - chunkcoordinates.x = MathHelper.a((String) map.get("x"), chunkcoordinates.x); - flag = true; - } - - if (map.containsKey("y")) { - chunkcoordinates.y = MathHelper.a((String) map.get("y"), chunkcoordinates.y); - flag = true; - } - - if (map.containsKey("z")) { - chunkcoordinates.z = MathHelper.a((String) map.get("z"), chunkcoordinates.z); - flag = true; - } - - if (map.containsKey("m")) { - j1 = MathHelper.a((String) map.get("m"), j1); - } - - if (map.containsKey("c")) { - i1 = MathHelper.a((String) map.get("c"), i1); - } - - if (map.containsKey("team")) { - s3 = (String) map.get("team"); - } - - if (map.containsKey("name")) { - s2 = (String) map.get("name"); - } - - World world = flag ? icommandlistener.getWorld() : null; - List list; - - if (!s1.equals("p") && !s1.equals("a")) { - if (s1.equals("r")) { - list = MinecraftServer.getServer().getPlayerList().a(chunkcoordinates, i, j, 0, j1, k, l, map1, s2, s3, world); - Collections.shuffle(list); - list = list.subList(0, Math.min(i1, list.size())); - return list.isEmpty() ? new EntityPlayer[0] : (EntityPlayer[]) list.toArray(new EntityPlayer[list.size()]); - } else { - return null; - } - } else { - list = MinecraftServer.getServer().getPlayerList().a(chunkcoordinates, i, j, i1, j1, k, l, map1, s2, s3, world); - return list.isEmpty() ? new EntityPlayer[0] : (EntityPlayer[]) list.toArray(new EntityPlayer[list.size()]); - } - } else { - return null; - } - } - - public static Map a(Map map) { - HashMap hashmap = new HashMap(); - Iterator iterator = map.keySet().iterator(); - - while (iterator.hasNext()) { - String s = (String) iterator.next(); - - if (s.startsWith("score_") && s.length() > "score_".length()) { - String s1 = s.substring("score_".length()); - - hashmap.put(s1, Integer.valueOf(MathHelper.a((String) map.get(s), 1))); - } - } - - return hashmap; - } - - public static boolean isList(String s) { - Matcher matcher = a.matcher(s); - - if (matcher.matches()) { - Map map = h(matcher.group(2)); - String s1 = matcher.group(1); - int i = g(s1); - - if (map.containsKey("c")) { - i = MathHelper.a((String) map.get("c"), i); - } - - return i != 1; - } else { - return false; - } - } - - public static boolean isPattern(String s, String s1) { - Matcher matcher = a.matcher(s); - - if (matcher.matches()) { - String s2 = matcher.group(1); - - return s1 == null || s1.equals(s2); - } else { - return false; - } - } - - public static boolean isPattern(String s) { - return isPattern(s, (String) null); - } - - private static final int c(String s) { - return 0; - } - - private static final int d(String s) { - return 0; - } - - private static final int e(String s) { - return Integer.MAX_VALUE; - } - - private static final int f(String s) { - return 0; - } - - private static final int g(String s) { - return s.equals("a") ? 0 : 1; - } - - private static Map h(String s) { - HashMap hashmap = new HashMap(); - - if (s == null) { - return hashmap; - } else { - Matcher matcher = b.matcher(s); - int i = 0; - - int j; - - for (j = -1; matcher.find(); j = matcher.end()) { - String s1 = null; - - switch (i++) { - case 0: - s1 = "x"; - break; - - case 1: - s1 = "y"; - break; - - case 2: - s1 = "z"; - break; - - case 3: - s1 = "r"; - } - - if (s1 != null && matcher.group(1).length() > 0) { - hashmap.put(s1, matcher.group(1)); - } - } - - if (j < s.length()) { - matcher = c.matcher(j == -1 ? s : s.substring(j)); - - while (matcher.find()) { - hashmap.put(matcher.group(1), matcher.group(2)); - } - } - - return hashmap; - } - } -} diff --git a/src/main/java/net/minecraft/server/PortalCreator.java b/src/main/java/net/minecraft/server/PortalCreator.java deleted file mode 100644 index 309239de00..0000000000 --- a/src/main/java/net/minecraft/server/PortalCreator.java +++ /dev/null @@ -1,197 +0,0 @@ -package net.minecraft.server; - -import org.bukkit.event.world.PortalCreateEvent; // CraftBukkit - -public class PortalCreator { - - private final World a; - private final int b; - private final int c; - private final int d; - private int e = 0; - private ChunkCoordinates f; - private int g; - private int h; - java.util.Collection blocks = new java.util.HashSet(); // CraftBukkit - add field - - public PortalCreator(World world, int i, int j, int k, int l) { - this.a = world; - this.b = l; - this.d = BlockPortal.a[l][0]; - this.c = BlockPortal.a[l][1]; - - for (int i1 = j; j > i1 - 21 && j > 0 && this.a(world.getType(i, j - 1, k)); --j) { - ; - } - - int j1 = this.a(i, j, k, this.d) - 1; - - if (j1 >= 0) { - this.f = new ChunkCoordinates(i + j1 * Direction.a[this.d], j, k + j1 * Direction.b[this.d]); - this.h = this.a(this.f.x, this.f.y, this.f.z, this.c); - if (this.h < 2 || this.h > 21) { - this.f = null; - this.h = 0; - } - } - - if (this.f != null) { - this.g = this.a(); - } - } - - protected int a(int i, int j, int k, int l) { - int i1 = Direction.a[l]; - int j1 = Direction.b[l]; - - int k1; - Block block; - - for (k1 = 0; k1 < 22; ++k1) { - block = this.a.getType(i + i1 * k1, j, k + j1 * k1); - if (!this.a(block)) { - break; - } - - Block block1 = this.a.getType(i + i1 * k1, j - 1, k + j1 * k1); - - if (block1 != Blocks.OBSIDIAN) { - break; - } - } - - block = this.a.getType(i + i1 * k1, j, k + j1 * k1); - return block == Blocks.OBSIDIAN ? k1 : 0; - } - - protected int a() { - // CraftBukkit start - this.blocks.clear(); - org.bukkit.World bworld = this.a.getWorld(); - // CraftBukkit end - int i; - int j; - int k; - int l; - - label56: - for (this.g = 0; this.g < 21; ++this.g) { - i = this.f.y + this.g; - - for (j = 0; j < this.h; ++j) { - k = this.f.x + j * Direction.a[BlockPortal.a[this.b][1]]; - l = this.f.z + j * Direction.b[BlockPortal.a[this.b][1]]; - Block block = this.a.getType(k, i, l); - - if (!this.a(block)) { - break label56; - } - - if (block == Blocks.PORTAL) { - ++this.e; - } - - if (j == 0) { - block = this.a.getType(k + Direction.a[BlockPortal.a[this.b][0]], i, l + Direction.b[BlockPortal.a[this.b][0]]); - if (block != Blocks.OBSIDIAN) { - break label56; - // CraftBukkit start - add the block to our list - } else { - blocks.add(bworld.getBlockAt(k + Direction.a[BlockPortal.a[this.b][0]], i, l + Direction.b[BlockPortal.a[this.b][0]])); - // CraftBukkit end - } - } else if (j == this.h - 1) { - block = this.a.getType(k + Direction.a[BlockPortal.a[this.b][1]], i, l + Direction.b[BlockPortal.a[this.b][1]]); - if (block != Blocks.OBSIDIAN) { - break label56; - // CraftBukkit start - add the block to our list - } else { - blocks.add(bworld.getBlockAt(k + Direction.a[BlockPortal.a[this.b][1]], i, l + Direction.b[BlockPortal.a[this.b][1]])); - // CraftBukkit end - } - } - } - } - - for (i = 0; i < this.h; ++i) { - j = this.f.x + i * Direction.a[BlockPortal.a[this.b][1]]; - k = this.f.y + this.g; - l = this.f.z + i * Direction.b[BlockPortal.a[this.b][1]]; - if (this.a.getType(j, k, l) != Blocks.OBSIDIAN) { - this.g = 0; - break; - // CraftBukkit start - add the block to our list - } else { - blocks.add(bworld.getBlockAt(j, k, l)); - // CraftBukkit end - } - } - - if (this.g <= 21 && this.g >= 3) { - return this.g; - } else { - this.f = null; - this.h = 0; - this.g = 0; - return 0; - } - } - - protected boolean a(Block block) { - return block.material == Material.AIR || block == Blocks.FIRE || block == Blocks.PORTAL; - } - - public boolean b() { - return this.f != null && this.h >= 2 && this.h <= 21 && this.g >= 3 && this.g <= 21; - } - - // CraftBukkit start - return boolean - public boolean c() { - org.bukkit.World bworld = this.a.getWorld(); - - // Copy below for loop - for (int i = 0; i < this.h; ++i) { - int j = this.f.x + Direction.a[this.c] * i; - int k = this.f.z + Direction.b[this.c] * i; - - for (int l = 0; l < this.g; ++l) { - int i1 = this.f.y + l; - - blocks.add(bworld.getBlockAt(j, i1, k)); - } - } - - PortalCreateEvent event = new PortalCreateEvent(blocks, bworld, PortalCreateEvent.CreateReason.FIRE); - this.a.getServer().getPluginManager().callEvent(event); - - if (event.isCancelled()) { - return false; - } - // CraftBukkit end - - for (int i = 0; i < this.h; ++i) { - int j = this.f.x + Direction.a[this.c] * i; - int k = this.f.z + Direction.b[this.c] * i; - - for (int l = 0; l < this.g; ++l) { - int i1 = this.f.y + l; - - this.a.setTypeAndData(j, i1, k, Blocks.PORTAL, this.b, 2); - } - } - - return true; // CraftBukkit - } - - static int a(PortalCreator portalcreator) { - return portalcreator.e; - } - - static int b(PortalCreator portalcreator) { - return portalcreator.h; - } - - static int c(PortalCreator portalcreator) { - return portalcreator.g; - } -} diff --git a/src/main/java/net/minecraft/server/PortalTravelAgent.java b/src/main/java/net/minecraft/server/PortalTravelAgent.java deleted file mode 100644 index 70e6e81d63..0000000000 --- a/src/main/java/net/minecraft/server/PortalTravelAgent.java +++ /dev/null @@ -1,533 +0,0 @@ -package net.minecraft.server; - -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; -import java.util.Random; - -// CraftBukkit start -import org.bukkit.Location; -import org.bukkit.event.entity.EntityPortalExitEvent; -import org.bukkit.util.Vector; -// CraftBukkit end - -public class PortalTravelAgent { - - private final WorldServer a; - private final Random b; - private final LongHashMap c = new LongHashMap(); - private final List d = new ArrayList(); - - public PortalTravelAgent(WorldServer worldserver) { - this.a = worldserver; - this.b = new Random(worldserver.getSeed()); - } - - public void a(Entity entity, double d0, double d1, double d2, float f) { - if (this.a.worldProvider.dimension != 1) { - if (!this.b(entity, d0, d1, d2, f)) { - this.a(entity); - this.b(entity, d0, d1, d2, f); - } - } else { - // CraftBukkit start - Modularize end portal creation - ChunkCoordinates created = this.createEndPortal(d0, d1, d2); - entity.setPositionRotation((double) created.x, (double) created.y, (double) created.z, entity.yaw, 0.0F); - entity.motX = entity.motY = entity.motZ = 0.0D; - } - } - - // Split out from original a(Entity, double, double, double, float) method in order to enable being called from createPortal - private ChunkCoordinates createEndPortal(double x, double y, double z) { - int i = MathHelper.floor(x); - int j = MathHelper.floor(y) - 1; - int k = MathHelper.floor(z); - // CraftBukkit end - byte b0 = 1; - byte b1 = 0; - - for (int l = -2; l <= 2; ++l) { - for (int i1 = -2; i1 <= 2; ++i1) { - for (int j1 = -1; j1 < 3; ++j1) { - int k1 = i + i1 * b0 + l * b1; - int l1 = j + j1; - int i2 = k + i1 * b1 - l * b0; - boolean flag = j1 < 0; - - this.a.setTypeUpdate(k1, l1, i2, flag ? Blocks.OBSIDIAN : Blocks.AIR); - } - } - } - - // CraftBukkit start - return new ChunkCoordinates(i, j, k); - } - - // use logic based on creation to verify end portal - private ChunkCoordinates findEndPortal(ChunkCoordinates portal) { - int i = portal.x; - int j = portal.y - 1; - int k = portal.z; - byte b0 = 1; - byte b1 = 0; - - for (int l = -2; l <= 2; ++l) { - for (int i1 = -2; i1 <= 2; ++i1) { - for (int j1 = -1; j1 < 3; ++j1) { - int k1 = i + i1 * b0 + l * b1; - int l1 = j + j1; - int i2 = k + i1 * b1 - l * b0; - boolean flag = j1 < 0; - - if (this.a.getType(k1, l1, i2) != (flag ? Blocks.OBSIDIAN : Blocks.AIR)) { - return null; - } - } - } - } - return new ChunkCoordinates(i, j, k); - } - // CraftBukkit end - - public boolean b(Entity entity, double d0, double d1, double d2, float f) { - // CraftBukkit start - Modularize portal search process and entity teleportation - ChunkCoordinates found = this.findPortal(entity.locX, entity.locY, entity.locZ, 128); - if (found == null) { - return false; - } - - Location exit = new Location(this.a.getWorld(), found.x, found.y, found.z, f, entity.pitch); - Vector velocity = entity.getBukkitEntity().getVelocity(); - this.adjustExit(entity, exit, velocity); - entity.setPositionRotation(exit.getX(), exit.getY(), exit.getZ(), exit.getYaw(), exit.getPitch()); - if (entity.motX != velocity.getX() || entity.motY != velocity.getY() || entity.motZ != velocity.getZ()) { - entity.getBukkitEntity().setVelocity(velocity); - } - return true; - } - - public ChunkCoordinates findPortal(double x, double y, double z, int short1) { - if (this.a.getWorld().getEnvironment() == org.bukkit.World.Environment.THE_END) { - return this.findEndPortal(this.a.worldProvider.h()); - } - // CraftBukkit end - double d3 = -1.0D; - int i = 0; - int j = 0; - int k = 0; - // CraftBukkit start - int l = MathHelper.floor(x); - int i1 = MathHelper.floor(z); - // CraftBukkit end - long j1 = ChunkCoordIntPair.a(l, i1); - boolean flag = true; - double d4; - int k1; - - if (this.c.contains(j1)) { - ChunkCoordinatesPortal chunkcoordinatesportal = (ChunkCoordinatesPortal) this.c.getEntry(j1); - - d3 = 0.0D; - i = chunkcoordinatesportal.x; - j = chunkcoordinatesportal.y; - k = chunkcoordinatesportal.z; - chunkcoordinatesportal.d = this.a.getTime(); - flag = false; - } else { - for (k1 = l - short1; k1 <= l + short1; ++k1) { - double d5 = (double) k1 + 0.5D - x; // CraftBukkit - - for (int l1 = i1 - short1; l1 <= i1 + short1; ++l1) { - double d6 = (double) l1 + 0.5D - z; // CraftBukkit - - for (int i2 = this.a.S() - 1; i2 >= 0; --i2) { - if (this.a.getType(k1, i2, l1) == Blocks.PORTAL) { - while (this.a.getType(k1, i2 - 1, l1) == Blocks.PORTAL) { - --i2; - } - - d4 = (double) i2 + 0.5D - y; // CraftBukkit - double d7 = d5 * d5 + d4 * d4 + d6 * d6; - - if (d3 < 0.0D || d7 < d3) { - d3 = d7; - i = k1; - j = i2; - k = l1; - } - } - } - } - } - } - - if (d3 >= 0.0D) { - if (flag) { - this.c.put(j1, new ChunkCoordinatesPortal(this, i, j, k, this.a.getTime())); - this.d.add(Long.valueOf(j1)); - } - // CraftBukkit start - Moved entity teleportation logic into exit - return new ChunkCoordinates(i, j, k); - } else { - return null; - } - } - // Entity repositioning logic split out from original b method and combined with repositioning logic for The End from original a method - public void adjustExit(Entity entity, Location position, Vector velocity) { - Location from = position.clone(); - Vector before = velocity.clone(); - int i = position.getBlockX(); - int j = position.getBlockY(); - int k = position.getBlockZ(); - float f = position.getYaw(); - - if (this.a.getWorld().getEnvironment() == org.bukkit.World.Environment.THE_END) { - // entity.setPositionRotation((double) i, (double) j, (double) k, entity.yaw, 0.0F); - // entity.motX = entity.motY = entity.motZ = 0.0D; - position.setPitch(0.0F); - velocity.setX(0); - velocity.setY(0); - velocity.setZ(0); - } else { - double d4; - int k1; - // CraftBukkit end - - double d8 = (double) i + 0.5D; - double d9 = (double) j + 0.5D; - - d4 = (double) k + 0.5D; - int j2 = -1; - - if (this.a.getType(i - 1, j, k) == Blocks.PORTAL) { - j2 = 2; - } - - if (this.a.getType(i + 1, j, k) == Blocks.PORTAL) { - j2 = 0; - } - - if (this.a.getType(i, j, k - 1) == Blocks.PORTAL) { - j2 = 3; - } - - if (this.a.getType(i, j, k + 1) == Blocks.PORTAL) { - j2 = 1; - } - - int k2 = entity.ay(); - - if (j2 > -1) { - int l2 = Direction.h[j2]; - int i3 = Direction.a[j2]; - int j3 = Direction.b[j2]; - int k3 = Direction.a[l2]; - int l3 = Direction.b[l2]; - boolean flag1 = !this.a.isEmpty(i + i3 + k3, j, k + j3 + l3) || !this.a.isEmpty(i + i3 + k3, j + 1, k + j3 + l3); - boolean flag2 = !this.a.isEmpty(i + i3, j, k + j3) || !this.a.isEmpty(i + i3, j + 1, k + j3); - - if (flag1 && flag2) { - j2 = Direction.f[j2]; - l2 = Direction.f[l2]; - i3 = Direction.a[j2]; - j3 = Direction.b[j2]; - k3 = Direction.a[l2]; - l3 = Direction.b[l2]; - k1 = i - k3; - d8 -= (double) k3; - int i4 = k - l3; - - d4 -= (double) l3; - flag1 = !this.a.isEmpty(k1 + i3 + k3, j, i4 + j3 + l3) || !this.a.isEmpty(k1 + i3 + k3, j + 1, i4 + j3 + l3); - flag2 = !this.a.isEmpty(k1 + i3, j, i4 + j3) || !this.a.isEmpty(k1 + i3, j + 1, i4 + j3); - } - - float f1 = 0.5F; - float f2 = 0.5F; - - if (!flag1 && flag2) { - f1 = 1.0F; - } else if (flag1 && !flag2) { - f1 = 0.0F; - } else if (flag1 && flag2) { - f2 = 0.0F; - } - - d8 += (double) ((float) k3 * f1 + f2 * (float) i3); - d4 += (double) ((float) l3 * f1 + f2 * (float) j3); - float f3 = 0.0F; - float f4 = 0.0F; - float f5 = 0.0F; - float f6 = 0.0F; - - if (j2 == k2) { - f3 = 1.0F; - f4 = 1.0F; - } else if (j2 == Direction.f[k2]) { - f3 = -1.0F; - f4 = -1.0F; - } else if (j2 == Direction.g[k2]) { - f5 = 1.0F; - f6 = -1.0F; - } else { - f5 = -1.0F; - f6 = 1.0F; - } - - // CraftBukkit start - double d10 = velocity.getX(); - double d11 = velocity.getZ(); - // CraftBukkit end - - // CraftBukkit start - Adjust position and velocity instances instead of entity - velocity.setX(d10 * (double) f3 + d11 * (double) f6); - velocity.setZ(d10 * (double) f5 + d11 * (double) f4); - f = f - (float) (k2 * 90) + (float) (j2 * 90); - } else { - // entity.motX = entity.motY = entity.motZ = 0.0D; - velocity.setX(0); - velocity.setY(0); - velocity.setZ(0); - } - - // entity.setPositionRotation(d8, d9, d4, entity.yaw, entity.pitch); - position.setX(d8); - position.setY(d9); - position.setZ(d4); - position.setYaw(f); - } - - EntityPortalExitEvent event = new EntityPortalExitEvent(entity.getBukkitEntity(), from, position, before, velocity); - this.a.getServer().getPluginManager().callEvent(event); - Location to = event.getTo(); - if (event.isCancelled() || to == null || !entity.isAlive()) { - position.setX(from.getX()); - position.setY(from.getY()); - position.setZ(from.getZ()); - position.setYaw(from.getYaw()); - position.setPitch(from.getPitch()); - velocity.copy(before); - } else { - position.setX(to.getX()); - position.setY(to.getY()); - position.setZ(to.getZ()); - position.setYaw(to.getYaw()); - position.setPitch(to.getPitch()); - velocity.copy(event.getAfter()); // event.getAfter() will never be null, as setAfter() will cause an NPE if null is passed in - } - // CraftBukkit end - } - - public boolean a(Entity entity) { - // CraftBukkit start - Allow for portal creation to be based on coordinates instead of entity - return this.createPortal(entity.locX, entity.locY, entity.locZ, 16); - } - - public boolean createPortal(double x, double y, double z, int b0) { - if (this.a.getWorld().getEnvironment() == org.bukkit.World.Environment.THE_END) { - this.createEndPortal(x, y, z); - return true; - } - // CraftBukkit end - double d0 = -1.0D; - // CraftBukkit start - int i = MathHelper.floor(x); - int j = MathHelper.floor(y); - int k = MathHelper.floor(z); - // CraftBukkit end - int l = i; - int i1 = j; - int j1 = k; - int k1 = 0; - int l1 = this.b.nextInt(4); - - int i2; - double d1; - double d2; - int j2; - int k2; - int l2; - int i3; - int j3; - int k3; - int l3; - int i4; - int j4; - int k4; - double d3; - double d4; - - for (i2 = i - b0; i2 <= i + b0; ++i2) { - d1 = (double) i2 + 0.5D - x; // CraftBukkit - - for (j2 = k - b0; j2 <= k + b0; ++j2) { - d2 = (double) j2 + 0.5D - z; // CraftBukkit - - label274: - for (k2 = this.a.S() - 1; k2 >= 0; --k2) { - if (this.a.isEmpty(i2, k2, j2)) { - while (k2 > 0 && this.a.isEmpty(i2, k2 - 1, j2)) { - --k2; - } - - for (i3 = l1; i3 < l1 + 4; ++i3) { - l2 = i3 % 2; - k3 = 1 - l2; - if (i3 % 4 >= 2) { - l2 = -l2; - k3 = -k3; - } - - for (j3 = 0; j3 < 3; ++j3) { - for (i4 = 0; i4 < 4; ++i4) { - for (l3 = -1; l3 < 4; ++l3) { - k4 = i2 + (i4 - 1) * l2 + j3 * k3; - j4 = k2 + l3; - int l4 = j2 + (i4 - 1) * k3 - j3 * l2; - - if (l3 < 0 && !this.a.getType(k4, j4, l4).getMaterial().isBuildable() || l3 >= 0 && !this.a.isEmpty(k4, j4, l4)) { - continue label274; - } - } - } - } - - d3 = (double) k2 + 0.5D - y; // CraftBukkit - d4 = d1 * d1 + d3 * d3 + d2 * d2; - if (d0 < 0.0D || d4 < d0) { - d0 = d4; - l = i2; - i1 = k2; - j1 = j2; - k1 = i3 % 4; - } - } - } - } - } - } - - if (d0 < 0.0D) { - for (i2 = i - b0; i2 <= i + b0; ++i2) { - d1 = (double) i2 + 0.5D - x; // CraftBukkit - - for (j2 = k - b0; j2 <= k + b0; ++j2) { - d2 = (double) j2 + 0.5D - z; // CraftBukkit - - label222: - for (k2 = this.a.S() - 1; k2 >= 0; --k2) { - if (this.a.isEmpty(i2, k2, j2)) { - while (k2 > 0 && this.a.isEmpty(i2, k2 - 1, j2)) { - --k2; - } - - for (i3 = l1; i3 < l1 + 2; ++i3) { - l2 = i3 % 2; - k3 = 1 - l2; - - for (j3 = 0; j3 < 4; ++j3) { - for (i4 = -1; i4 < 4; ++i4) { - l3 = i2 + (j3 - 1) * l2; - k4 = k2 + i4; - j4 = j2 + (j3 - 1) * k3; - if (i4 < 0 && !this.a.getType(l3, k4, j4).getMaterial().isBuildable() || i4 >= 0 && !this.a.isEmpty(l3, k4, j4)) { - continue label222; - } - } - } - - d3 = (double) k2 + 0.5D - y; // CraftBukkit - d4 = d1 * d1 + d3 * d3 + d2 * d2; - if (d0 < 0.0D || d4 < d0) { - d0 = d4; - l = i2; - i1 = k2; - j1 = j2; - k1 = i3 % 2; - } - } - } - } - } - } - } - - int i5 = l; - int j5 = i1; - - j2 = j1; - int k5 = k1 % 2; - int l5 = 1 - k5; - - if (k1 % 4 >= 2) { - k5 = -k5; - l5 = -l5; - } - - boolean flag; - - if (d0 < 0.0D) { - if (i1 < 70) { - i1 = 70; - } - - if (i1 > this.a.S() - 10) { - i1 = this.a.S() - 10; - } - - j5 = i1; - - for (k2 = -1; k2 <= 1; ++k2) { - for (i3 = 1; i3 < 3; ++i3) { - for (l2 = -1; l2 < 3; ++l2) { - k3 = i5 + (i3 - 1) * k5 + k2 * l5; - j3 = j5 + l2; - i4 = j2 + (i3 - 1) * l5 - k2 * k5; - flag = l2 < 0; - this.a.setTypeUpdate(k3, j3, i4, flag ? Blocks.OBSIDIAN : Blocks.AIR); - } - } - } - } - - for (k2 = 0; k2 < 4; ++k2) { - for (i3 = 0; i3 < 4; ++i3) { - for (l2 = -1; l2 < 4; ++l2) { - k3 = i5 + (i3 - 1) * k5; - j3 = j5 + l2; - i4 = j2 + (i3 - 1) * l5; - flag = i3 == 0 || i3 == 3 || l2 == -1 || l2 == 3; - this.a.setTypeAndData(k3, j3, i4, flag ? Blocks.OBSIDIAN : Blocks.PORTAL, 0, 2); - } - } - - for (i3 = 0; i3 < 4; ++i3) { - for (l2 = -1; l2 < 4; ++l2) { - k3 = i5 + (i3 - 1) * k5; - j3 = j5 + l2; - i4 = j2 + (i3 - 1) * l5; - this.a.applyPhysics(k3, j3, i4, this.a.getType(k3, j3, i4)); - } - } - } - - return true; - } - - public void a(long i) { - if (i % 100L == 0L) { - Iterator iterator = this.d.iterator(); - long j = i - 600L; - - while (iterator.hasNext()) { - Long olong = (Long) iterator.next(); - ChunkCoordinatesPortal chunkcoordinatesportal = (ChunkCoordinatesPortal) this.c.getEntry(olong.longValue()); - - if (chunkcoordinatesportal == null || chunkcoordinatesportal.d < j) { - iterator.remove(); - this.c.remove(olong.longValue()); - } - } - } - } -} diff --git a/src/main/java/net/minecraft/server/PropertyManager.java b/src/main/java/net/minecraft/server/PropertyManager.java deleted file mode 100644 index c6cd6fb6f6..0000000000 --- a/src/main/java/net/minecraft/server/PropertyManager.java +++ /dev/null @@ -1,130 +0,0 @@ -package net.minecraft.server; - -import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.IOException; -import java.util.Properties; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; - -import joptsimple.OptionSet; // CraftBukkit - -public class PropertyManager { - - private static final Logger loggingAgent = LogManager.getLogger(); - public final Properties properties = new Properties(); // CraftBukkit - private -> public - private final File c; - - public PropertyManager(File file1) { - this.c = file1; - if (file1.exists()) { - FileInputStream fileinputstream = null; - - try { - fileinputstream = new FileInputStream(file1); - this.properties.load(fileinputstream); - } catch (Exception exception) { - loggingAgent.warn("Failed to load " + file1, exception); - this.a(); - } finally { - if (fileinputstream != null) { - try { - fileinputstream.close(); - } catch (IOException ioexception) { - ; - } - } - } - } else { - loggingAgent.warn(file1 + " does not exist"); - this.a(); - } - } - - // CraftBukkit start - private OptionSet options = null; - - public PropertyManager(final OptionSet options) { - this((File) options.valueOf("config")); - - this.options = options; - } - - private T getOverride(String name, T value) { - if ((this.options != null) && (this.options.has(name))) { - return (T) this.options.valueOf(name); - } - - return value; - } - // CraftBukkit end - - public void a() { - loggingAgent.info("Generating new properties file"); - this.savePropertiesFile(); - } - - public void savePropertiesFile() { - FileOutputStream fileoutputstream = null; - - try { - // CraftBukkit start - Don't attempt writing to file if it's read only - if (this.c.exists() && !this.c.canWrite()) { - return; - } - // CraftBukkit end - fileoutputstream = new FileOutputStream(this.c); - this.properties.store(fileoutputstream, "Minecraft server properties"); - } catch (Exception exception) { - loggingAgent.warn("Failed to save " + this.c, exception); - this.a(); - } finally { - if (fileoutputstream != null) { - try { - fileoutputstream.close(); - } catch (IOException ioexception) { - ; - } - } - } - } - - public File c() { - return this.c; - } - - public String getString(String s, String s1) { - if (!this.properties.containsKey(s)) { - this.properties.setProperty(s, s1); - this.savePropertiesFile(); - this.savePropertiesFile(); - } - - return this.getOverride(s, this.properties.getProperty(s, s1)); // CraftBukkit - } - - public int getInt(String s, int i) { - try { - return this.getOverride(s, Integer.parseInt(this.getString(s, "" + i))); // CraftBukkit - } catch (Exception exception) { - this.properties.setProperty(s, "" + i); - this.savePropertiesFile(); - return this.getOverride(s, i); // CraftBukkit - } - } - - public boolean getBoolean(String s, boolean flag) { - try { - return this.getOverride(s, Boolean.parseBoolean(this.getString(s, "" + flag))); // CraftBukkit - } catch (Exception exception) { - this.properties.setProperty(s, "" + flag); - this.savePropertiesFile(); - return this.getOverride(s, flag); // CraftBukkit - } - } - - public void setProperty(String s, Object object) { - this.properties.setProperty(s, "" + object); - } -} diff --git a/src/main/java/net/minecraft/server/ProtocolOrdinalWrapper.java b/src/main/java/net/minecraft/server/ProtocolOrdinalWrapper.java deleted file mode 100644 index d6e7f3620d..0000000000 --- a/src/main/java/net/minecraft/server/ProtocolOrdinalWrapper.java +++ /dev/null @@ -1,21 +0,0 @@ -package net.minecraft.server; - -// CraftBukkit - import package private class -class ProtocolOrdinalWrapper { - - static final int[] a = new int[EnumProtocol.values().length]; - - static { - try { - a[EnumProtocol.LOGIN.ordinal()] = 1; - } catch (NoSuchFieldError nosuchfielderror) { - ; - } - - try { - a[EnumProtocol.STATUS.ordinal()] = 2; - } catch (NoSuchFieldError nosuchfielderror1) { - ; - } - } -} diff --git a/src/main/java/net/minecraft/server/QueuedPacket.java b/src/main/java/net/minecraft/server/QueuedPacket.java deleted file mode 100644 index fdebf9dd32..0000000000 --- a/src/main/java/net/minecraft/server/QueuedPacket.java +++ /dev/null @@ -1,23 +0,0 @@ -package net.minecraft.server; - -import net.minecraft.util.io.netty.util.concurrent.GenericFutureListener; - -// CraftBukkit - imported class because the methods are package private -class QueuedPacket { - - private final Packet a; - private final GenericFutureListener[] b; - - public QueuedPacket(Packet packet, GenericFutureListener... agenericfuturelistener) { - this.a = packet; - this.b = agenericfuturelistener; - } - - static Packet a(QueuedPacket queuedpacket) { - return queuedpacket.a; - } - - static GenericFutureListener[] b(QueuedPacket queuedpacket) { - return queuedpacket.b; - } -} diff --git a/src/main/java/net/minecraft/server/RecipeArmorDye.java b/src/main/java/net/minecraft/server/RecipeArmorDye.java deleted file mode 100644 index 13bb70828a..0000000000 --- a/src/main/java/net/minecraft/server/RecipeArmorDye.java +++ /dev/null @@ -1,124 +0,0 @@ -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(Items.LEATHER_HELMET, 0, 0), java.util.Arrays.asList(new ItemStack(Items.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.m_() != EnumArmorMaterial.CLOTH || itemstack != null) { - return false; - } - - itemstack = itemstack1; - } else { - if (itemstack1.getItem() != Items.INK_SACK) { - 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.m_() != EnumArmorMaterial.CLOTH || itemstack != null) { - return null; - } - - itemstack = itemstack1.cloneItemStack(); - itemstack.count = 1; - if (itemarmor.c_(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.getItem() != Items.INK_SACK) { - return null; - } - - float[] afloat = EntitySheep.bp[BlockCloth.b(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/RecipeBookClone.java b/src/main/java/net/minecraft/server/RecipeBookClone.java deleted file mode 100644 index 8182a5fd8f..0000000000 --- a/src/main/java/net/minecraft/server/RecipeBookClone.java +++ /dev/null @@ -1,68 +0,0 @@ -package net.minecraft.server; - -public class RecipeBookClone extends ShapelessRecipes implements IRecipe { // CraftBukkit - added extends - - // CraftBukkit start - Delegate to new parent class - public RecipeBookClone() { - super(new ItemStack(Items.WRITTEN_BOOK, 0, -1), java.util.Arrays.asList(new ItemStack(Items.BOOK_AND_QUILL, 0, 0))); - } - // CraftBukkit end - - public boolean a(InventoryCrafting inventoryCrafting, World paramWorld) { - int i = 0; - ItemStack itemStack = null; - for (int j = 0; j < inventoryCrafting.getSize(); j++) { - ItemStack itemStack1 = inventoryCrafting.getItem(j); - if (itemStack1 != null) { - if (itemStack1.getItem() == Items.WRITTEN_BOOK) { - if (itemStack != null) { - return false; - } - itemStack = itemStack1; - } else if (itemStack1.getItem() == Items.BOOK_AND_QUILL) { - i++; - } else { - return false; - } - } - } - 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 itemStack2 = inventoryCrafting.getItem(j); - if (itemStack2 != null) { - if (itemStack2.getItem() == Items.WRITTEN_BOOK) { - if (itemStack != null) { - return null; - } - itemStack = itemStack2; - } else if (itemStack2.getItem() == Items.BOOK_AND_QUILL) { - i++; - } else { - return null; - } - } - } - if ((itemStack == null) || (i < 1)) { - return null; - } - ItemStack itemStack1 = new ItemStack(Items.WRITTEN_BOOK, i + 1); - itemStack1.setTag((NBTTagCompound) itemStack.getTag().clone()); - if (itemStack.hasName()) { - itemStack1.c(itemStack.getName()); - } - return itemStack1; - } - - public int a() { - return 9; - } - - 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 deleted file mode 100644 index 816df8c1c1..0000000000 --- a/src/main/java/net/minecraft/server/RecipeFireworks.java +++ /dev/null @@ -1,176 +0,0 @@ -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(Items.FIREWORKS, 0, 0), java.util.Arrays.asList(new ItemStack(Items.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.getItem() == Items.SULPHUR) { - ++j; - } else if (itemstack.getItem() == Items.FIREWORKS_CHARGE) { - ++l; - } else if (itemstack.getItem() == Items.INK_SACK) { - ++k; - } else if (itemstack.getItem() == Items.PAPER) { - ++i; - } else if (itemstack.getItem() == Items.GLOWSTONE_DUST) { - ++i1; - } else if (itemstack.getItem() == Items.DIAMOND) { - ++i1; - } else if (itemstack.getItem() == Items.FIREBALL) { - ++j1; - } else if (itemstack.getItem() == Items.FEATHER) { - ++j1; - } else if (itemstack.getItem() == Items.GOLD_NUGGET) { - ++j1; - } else { - if (itemstack.getItem() != Items.SKULL) { - 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(Items.FIREWORKS); - if (l > 0) { - nbttagcompound = new NBTTagCompound(); - nbttagcompound1 = new NBTTagCompound(); - NBTTagList nbttaglist = new NBTTagList(); - - for (int l1 = 0; l1 < inventorycrafting.getSize(); ++l1) { - ItemStack itemstack1 = inventorycrafting.getItem(l1); - - if (itemstack1 != null && itemstack1.getItem() == Items.FIREWORKS_CHARGE && itemstack1.hasTag() && itemstack1.getTag().hasKeyOfType("Explosion", 10)) { - 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(Items.FIREWORKS_CHARGE); - nbttagcompound = new NBTTagCompound(); - nbttagcompound1 = new NBTTagCompound(); - 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.getItem() == Items.INK_SACK) { - arraylist.add(Integer.valueOf(ItemDye.c[itemstack2.getData()])); - } else if (itemstack2.getItem() == Items.GLOWSTONE_DUST) { - nbttagcompound1.setBoolean("Flicker", true); - } else if (itemstack2.getItem() == Items.DIAMOND) { - nbttagcompound1.setBoolean("Trail", true); - } else if (itemstack2.getItem() == Items.FIREBALL) { - b0 = 1; - } else if (itemstack2.getItem() == Items.FEATHER) { - b0 = 4; - } else if (itemstack2.getItem() == Items.GOLD_NUGGET) { - b0 = 2; - } else if (itemstack2.getItem() == Items.SKULL) { - 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.getItem() == Items.INK_SACK) { - arraylist1.add(Integer.valueOf(ItemDye.c[itemstack3.getData()])); - } else if (itemstack3.getItem() == Items.FIREWORKS_CHARGE) { - 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 deleted file mode 100644 index 793883feaf..0000000000 --- a/src/main/java/net/minecraft/server/RecipeMapClone.java +++ /dev/null @@ -1,82 +0,0 @@ -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(Items.MAP, 0, -1), java.util.Arrays.asList(new ItemStack(Items.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.getItem() == Items.MAP) { - if (itemstack != null) { - return false; - } - - itemstack = itemstack1; - } else { - if (itemstack1.getItem() != Items.MAP_EMPTY) { - 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.getItem() == Items.MAP) { - if (itemstack != null) { - return null; - } - - itemstack = itemstack1; - } else { - if (itemstack1.getItem() != Items.MAP_EMPTY) { - return null; - } - - ++i; - } - } - } - - if (itemstack != null && i >= 1) { - ItemStack itemstack2 = new ItemStack(Items.MAP, i + 1, itemstack.getData()); - - if (itemstack.hasName()) { - itemstack2.c(itemstack.getName()); - } - - return itemstack2; - } else { - return null; - } - } - - public int a() { - return 9; - } - - public ItemStack b() { - return null; - } -} diff --git a/src/main/java/net/minecraft/server/RecipesFurnace.java b/src/main/java/net/minecraft/server/RecipesFurnace.java deleted file mode 100644 index c474d54870..0000000000 --- a/src/main/java/net/minecraft/server/RecipesFurnace.java +++ /dev/null @@ -1,121 +0,0 @@ -package net.minecraft.server; - -import java.util.HashMap; -import java.util.Iterator; -import java.util.Map; -import java.util.Map.Entry; - -public class RecipesFurnace { - - private static final RecipesFurnace a = new RecipesFurnace(); - public Map recipes = new HashMap(); // CraftBukkit - private -> public - private Map c = new HashMap(); - public Map customRecipes = new HashMap(); // CraftBukkit - add field - - public static RecipesFurnace getInstance() { - return a; - } - - public RecipesFurnace() { // CraftBukkit - private -> public - this.registerRecipe(Blocks.IRON_ORE, new ItemStack(Items.IRON_INGOT), 0.7F); - this.registerRecipe(Blocks.GOLD_ORE, new ItemStack(Items.GOLD_INGOT), 1.0F); - this.registerRecipe(Blocks.DIAMOND_ORE, new ItemStack(Items.DIAMOND), 1.0F); - this.registerRecipe(Blocks.SAND, new ItemStack(Blocks.GLASS), 0.1F); - this.a(Items.PORK, new ItemStack(Items.GRILLED_PORK), 0.35F); - this.a(Items.RAW_BEEF, new ItemStack(Items.COOKED_BEEF), 0.35F); - this.a(Items.RAW_CHICKEN, new ItemStack(Items.COOKED_CHICKEN), 0.35F); - this.registerRecipe(Blocks.COBBLESTONE, new ItemStack(Blocks.STONE), 0.1F); - this.a(Items.CLAY_BALL, new ItemStack(Items.CLAY_BRICK), 0.3F); - this.registerRecipe(Blocks.CLAY, new ItemStack(Blocks.HARDENED_CLAY), 0.35F); - this.registerRecipe(Blocks.CACTUS, new ItemStack(Items.INK_SACK, 1, 2), 0.2F); - this.registerRecipe(Blocks.LOG, new ItemStack(Items.COAL, 1, 1), 0.15F); - this.registerRecipe(Blocks.LOG2, new ItemStack(Items.COAL, 1, 1), 0.15F); - this.registerRecipe(Blocks.EMERALD_ORE, new ItemStack(Items.EMERALD), 1.0F); - this.a(Items.POTATO, new ItemStack(Items.POTATO_BAKED), 0.35F); - this.registerRecipe(Blocks.NETHERRACK, new ItemStack(Items.NETHER_BRICK), 0.1F); - EnumFish[] aenumfish = EnumFish.values(); - int i = aenumfish.length; - - for (int j = 0; j < i; ++j) { - EnumFish enumfish = aenumfish[j]; - - if (enumfish.i()) { - this.a(new ItemStack(Items.RAW_FISH, 1, enumfish.a()), new ItemStack(Items.COOKED_FISH, 1, enumfish.a()), 0.35F); - } - } - - this.registerRecipe(Blocks.COAL_ORE, new ItemStack(Items.COAL), 0.1F); - this.registerRecipe(Blocks.REDSTONE_ORE, new ItemStack(Items.REDSTONE), 0.7F); - this.registerRecipe(Blocks.LAPIS_ORE, new ItemStack(Items.INK_SACK, 1, 4), 0.2F); - this.registerRecipe(Blocks.QUARTZ_ORE, new ItemStack(Items.QUARTZ), 0.2F); - } - - public void registerRecipe(Block block, ItemStack itemstack, float f) { - this.a(Item.getItemOf(block), itemstack, f); - } - - public void a(Item item, ItemStack itemstack, float f) { - this.a(new ItemStack(item, 1, 32767), itemstack, f); - } - - public void a(ItemStack itemstack, ItemStack itemstack1, float f) { - this.recipes.put(itemstack, itemstack1); - this.c.put(itemstack1, Float.valueOf(f)); - } - - // CraftBukkit start - add method - public void registerRecipe(ItemStack itemstack, ItemStack itemstack1) { - this.customRecipes.put(itemstack, itemstack1); - } - // CraftBukkit end - - public ItemStack getResult(ItemStack itemstack) { - // CraftBukkit start - initialize to customRecipes - boolean vanilla = false; - Iterator iterator = this.customRecipes.entrySet().iterator(); - // CraftBukkit end - - Entry entry; - - do { - if (!iterator.hasNext()) { - // CraftBukkit start - fall back to vanilla recipes - if (!vanilla && recipes.size() != 0) { - iterator = this.recipes.entrySet().iterator(); - vanilla = true; - } else { - return null; - } - // CraftBukkit end - } - - entry = (Entry) iterator.next(); - } while (!this.a(itemstack, (ItemStack) entry.getKey())); - - return (ItemStack) entry.getValue(); - } - - private boolean a(ItemStack itemstack, ItemStack itemstack1) { - return itemstack1.getItem() == itemstack.getItem() && (itemstack1.getData() == 32767 || itemstack1.getData() == itemstack.getData()); - } - - public Map getRecipes() { - return this.recipes; - } - - public float b(ItemStack itemstack) { - Iterator iterator = this.c.entrySet().iterator(); - - Entry entry; - - do { - if (!iterator.hasNext()) { - return 0.0F; - } - - entry = (Entry) iterator.next(); - } while (!this.a(itemstack, (ItemStack) entry.getKey())); - - return ((Float) entry.getValue()).floatValue(); - } -} diff --git a/src/main/java/net/minecraft/server/RegionFile.java b/src/main/java/net/minecraft/server/RegionFile.java deleted file mode 100644 index 9cd34a445f..0000000000 --- a/src/main/java/net/minecraft/server/RegionFile.java +++ /dev/null @@ -1,289 +0,0 @@ -package net.minecraft.server; - -import java.io.BufferedInputStream; -import java.io.ByteArrayInputStream; -import java.io.DataInputStream; -import java.io.DataOutputStream; -import java.io.File; -import java.io.IOException; -import java.io.RandomAccessFile; -import java.util.ArrayList; -import java.util.zip.DeflaterOutputStream; -import java.util.zip.GZIPInputStream; -import java.util.zip.InflaterInputStream; - -public class RegionFile { - - private static final byte[] a = new byte[4096]; - private final File b; - private RandomAccessFile c; - private final int[] d = new int[1024]; - private final int[] e = new int[1024]; - private ArrayList f; - private int g; - private long h; - - public RegionFile(File file1) { - this.b = file1; - this.g = 0; - - try { - if (file1.exists()) { - this.h = file1.lastModified(); - } - - this.c = new RandomAccessFile(file1, "rw"); - int i; - - if (this.c.length() < 4096L) { - for (i = 0; i < 1024; ++i) { - this.c.writeInt(0); - } - - for (i = 0; i < 1024; ++i) { - this.c.writeInt(0); - } - - this.g += 8192; - } - - if ((this.c.length() & 4095L) != 0L) { - for (i = 0; (long) i < (this.c.length() & 4095L); ++i) { - this.c.write(0); - } - } - - i = (int) this.c.length() / 4096; - this.f = new ArrayList(i); - - int j; - - for (j = 0; j < i; ++j) { - this.f.add(Boolean.valueOf(true)); - } - - this.f.set(0, Boolean.valueOf(false)); - this.f.set(1, Boolean.valueOf(false)); - this.c.seek(0L); - - int k; - - for (j = 0; j < 1024; ++j) { - k = this.c.readInt(); - this.d[j] = k; - if (k != 0 && (k >> 8) + (k & 255) <= this.f.size()) { - for (int l = 0; l < (k & 255); ++l) { - this.f.set((k >> 8) + l, Boolean.valueOf(false)); - } - } - } - - for (j = 0; j < 1024; ++j) { - k = this.c.readInt(); - this.e[j] = k; - } - } catch (IOException ioexception) { - ioexception.printStackTrace(); - } - } - - // CraftBukkit start - This is a copy (sort of) of the method below it, make sure they stay in sync - public synchronized boolean chunkExists(int i, int j) { - if (this.d(i, j)) { - return false; - } else { - try { - int k = this.e(i, j); - - if (k == 0) { - return false; - } else { - int l = k >> 8; - int i1 = k & 255; - - if (l + i1 > this.f.size()) { - return false; - } - - this.c.seek((long) (l * 4096)); - int j1 = this.c.readInt(); - - if (j1 > 4096 * i1 || j1 <= 0) { - return false; - } - - byte b0 = this.c.readByte(); - if (b0 == 1 || b0 == 2) { - return true; - } - } - } catch (IOException ioexception) { - return false; - } - } - - return false; - } - // CraftBukkit end - - public synchronized DataInputStream a(int i, int j) { - if (this.d(i, j)) { - return null; - } else { - try { - int k = this.e(i, j); - - if (k == 0) { - return null; - } else { - int l = k >> 8; - int i1 = k & 255; - - if (l + i1 > this.f.size()) { - return null; - } else { - this.c.seek((long) (l * 4096)); - int j1 = this.c.readInt(); - - if (j1 > 4096 * i1) { - return null; - } else if (j1 <= 0) { - return null; - } else { - byte b0 = this.c.readByte(); - byte[] abyte; - - if (b0 == 1) { - abyte = new byte[j1 - 1]; - this.c.read(abyte); - return new DataInputStream(new BufferedInputStream(new GZIPInputStream(new ByteArrayInputStream(abyte)))); - } else if (b0 == 2) { - abyte = new byte[j1 - 1]; - this.c.read(abyte); - return new DataInputStream(new BufferedInputStream(new InflaterInputStream(new ByteArrayInputStream(abyte)))); - } else { - return null; - } - } - } - } - } catch (IOException ioexception) { - return null; - } - } - } - - public DataOutputStream b(int i, int j) { - return this.d(i, j) ? null : new DataOutputStream(new DeflaterOutputStream(new ChunkBuffer(this, i, j))); - } - - protected synchronized void a(int i, int j, byte[] abyte, int k) { - try { - int l = this.e(i, j); - int i1 = l >> 8; - int j1 = l & 255; - int k1 = (k + 5) / 4096 + 1; - - if (k1 >= 256) { - return; - } - - if (i1 != 0 && j1 == k1) { - this.a(i1, abyte, k); - } else { - int l1; - - for (l1 = 0; l1 < j1; ++l1) { - this.f.set(i1 + l1, Boolean.valueOf(true)); - } - - l1 = this.f.indexOf(Boolean.valueOf(true)); - int i2 = 0; - int j2; - - if (l1 != -1) { - for (j2 = l1; j2 < this.f.size(); ++j2) { - if (i2 != 0) { - if (((Boolean) this.f.get(j2)).booleanValue()) { - ++i2; - } else { - i2 = 0; - } - } else if (((Boolean) this.f.get(j2)).booleanValue()) { - l1 = j2; - i2 = 1; - } - - if (i2 >= k1) { - break; - } - } - } - - if (i2 >= k1) { - i1 = l1; - this.a(i, j, l1 << 8 | k1); - - for (j2 = 0; j2 < k1; ++j2) { - this.f.set(i1 + j2, Boolean.valueOf(false)); - } - - this.a(i1, abyte, k); - } else { - this.c.seek(this.c.length()); - i1 = this.f.size(); - - for (j2 = 0; j2 < k1; ++j2) { - this.c.write(a); - this.f.add(Boolean.valueOf(false)); - } - - this.g += 4096 * k1; - this.a(i1, abyte, k); - this.a(i, j, i1 << 8 | k1); - } - } - - this.b(i, j, (int) (MinecraftServer.ar() / 1000L)); - } catch (IOException ioexception) { - ioexception.printStackTrace(); - } - } - - private void a(int i, byte[] abyte, int j) throws IOException { // CraftBukkit - added throws - this.c.seek((long) (i * 4096)); - this.c.writeInt(j + 1); - this.c.writeByte(2); - this.c.write(abyte, 0, j); - } - - private boolean d(int i, int j) { - return i < 0 || i >= 32 || j < 0 || j >= 32; - } - - private int e(int i, int j) { - return this.d[i + j * 32]; - } - - public boolean c(int i, int j) { - return this.e(i, j) != 0; - } - - private void a(int i, int j, int k) throws IOException { // CraftBukkit - added throws - this.d[i + j * 32] = k; - this.c.seek((long) ((i + j * 32) * 4)); - this.c.writeInt(k); - } - - private void b(int i, int j, int k) throws IOException { // CraftBukkit - added throws - this.e[i + j * 32] = k; - this.c.seek((long) (4096 + (i + j * 32) * 4)); - this.c.writeInt(k); - } - - public void c() throws IOException { // CraftBukkit - added throws - if (this.c != null) { - this.c.close(); - } - } -} diff --git a/src/main/java/net/minecraft/server/RemoteControlCommandListener.java b/src/main/java/net/minecraft/server/RemoteControlCommandListener.java deleted file mode 100644 index fd967c12ab..0000000000 --- a/src/main/java/net/minecraft/server/RemoteControlCommandListener.java +++ /dev/null @@ -1,47 +0,0 @@ -package net.minecraft.server; - -public class RemoteControlCommandListener implements ICommandListener { - - public static final RemoteControlCommandListener instance = new RemoteControlCommandListener(); - private StringBuffer b = new StringBuffer(); - - public RemoteControlCommandListener() {} - - public void e() { - this.b.setLength(0); - } - - public String f() { - return this.b.toString(); - } - - public String getName() { - return "Rcon"; - } - - public IChatBaseComponent getScoreboardDisplayName() { - return new ChatComponentText(this.getName()); - } - - // CraftBukkit start - Send a String - public void sendMessage(String message) { - this.b.append(message); - } - // CraftBukkit end - - public void sendMessage(IChatBaseComponent ichatbasecomponent) { - this.b.append(ichatbasecomponent.c()); - } - - public boolean a(int i, String s) { - return true; - } - - public ChunkCoordinates getChunkCoordinates() { - return new ChunkCoordinates(0, 0, 0); - } - - public World getWorld() { - return MinecraftServer.getServer().getWorld(); - } -} diff --git a/src/main/java/net/minecraft/server/ScoreboardServer.java b/src/main/java/net/minecraft/server/ScoreboardServer.java deleted file mode 100644 index 15910585ef..0000000000 --- a/src/main/java/net/minecraft/server/ScoreboardServer.java +++ /dev/null @@ -1,222 +0,0 @@ -package net.minecraft.server; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Set; - -public class ScoreboardServer extends Scoreboard { - - private final MinecraftServer a; - private final Set b = new HashSet(); - private PersistentScoreboard c; - - public ScoreboardServer(MinecraftServer minecraftserver) { - this.a = minecraftserver; - } - - public void handleScoreChanged(ScoreboardScore scoreboardscore) { - super.handleScoreChanged(scoreboardscore); - if (this.b.contains(scoreboardscore.getObjective())) { - this.sendAll(new PacketPlayOutScoreboardScore(scoreboardscore, 0)); // CraftBukkit - Internal packet method - } - - this.b(); - } - - public void handlePlayerRemoved(String s) { - super.handlePlayerRemoved(s); - this.sendAll(new PacketPlayOutScoreboardScore(s)); // CraftBukkit - Internal packet method - this.b(); - } - - public void setDisplaySlot(int i, ScoreboardObjective scoreboardobjective) { - ScoreboardObjective scoreboardobjective1 = this.getObjectiveForSlot(i); - - super.setDisplaySlot(i, scoreboardobjective); - if (scoreboardobjective1 != scoreboardobjective && scoreboardobjective1 != null) { - if (this.h(scoreboardobjective1) > 0) { - this.sendAll(new PacketPlayOutScoreboardDisplayObjective(i, scoreboardobjective)); // CraftBukkit - Internal packet method - } else { - this.g(scoreboardobjective1); - } - } - - if (scoreboardobjective != null) { - if (this.b.contains(scoreboardobjective)) { - this.sendAll(new PacketPlayOutScoreboardDisplayObjective(i, scoreboardobjective)); // CraftBukkit - Internal packet method - } else { - this.e(scoreboardobjective); - } - } - - this.b(); - } - - public boolean addPlayerToTeam(String s, String s1) { - if (super.addPlayerToTeam(s, s1)) { - ScoreboardTeam scoreboardteam = this.getTeam(s1); - - this.sendAll(new PacketPlayOutScoreboardTeam(scoreboardteam, Arrays.asList(new String[] { s}), 3)); // CraftBukkit - Internal packet method - this.b(); - return true; - } else { - return false; - } - } - - public void removePlayerFromTeam(String s, ScoreboardTeam scoreboardteam) { - super.removePlayerFromTeam(s, scoreboardteam); - this.sendAll(new PacketPlayOutScoreboardTeam(scoreboardteam, Arrays.asList(new String[] { s}), 4)); // CraftBukkit - Internal packet method - this.b(); - } - - public void handleObjectiveAdded(ScoreboardObjective scoreboardobjective) { - super.handleObjectiveAdded(scoreboardobjective); - this.b(); - } - - public void handleObjectiveChanged(ScoreboardObjective scoreboardobjective) { - super.handleObjectiveChanged(scoreboardobjective); - if (this.b.contains(scoreboardobjective)) { - this.sendAll(new PacketPlayOutScoreboardObjective(scoreboardobjective, 2)); // CraftBukkit - Internal packet method - } - - this.b(); - } - - public void handleObjectiveRemoved(ScoreboardObjective scoreboardobjective) { - super.handleObjectiveRemoved(scoreboardobjective); - if (this.b.contains(scoreboardobjective)) { - this.g(scoreboardobjective); - } - - this.b(); - } - - public void handleTeamAdded(ScoreboardTeam scoreboardteam) { - super.handleTeamAdded(scoreboardteam); - this.sendAll(new PacketPlayOutScoreboardTeam(scoreboardteam, 0)); // CraftBukkit - Internal packet method - this.b(); - } - - public void handleTeamChanged(ScoreboardTeam scoreboardteam) { - super.handleTeamChanged(scoreboardteam); - this.sendAll(new PacketPlayOutScoreboardTeam(scoreboardteam, 2)); // CraftBukkit - Internal packet method - this.b(); - } - - public void handleTeamRemoved(ScoreboardTeam scoreboardteam) { - super.handleTeamRemoved(scoreboardteam); - this.sendAll(new PacketPlayOutScoreboardTeam(scoreboardteam, 1)); // CraftBukkit - Internal packet method - this.b(); - } - - public void a(PersistentScoreboard persistentscoreboard) { - this.c = persistentscoreboard; - } - - protected void b() { - if (this.c != null) { - this.c.c(); - } - } - - public List getScoreboardScorePacketsForObjective(ScoreboardObjective scoreboardobjective) { - ArrayList arraylist = new ArrayList(); - - arraylist.add(new PacketPlayOutScoreboardObjective(scoreboardobjective, 0)); - - for (int i = 0; i < 3; ++i) { - if (this.getObjectiveForSlot(i) == scoreboardobjective) { - arraylist.add(new PacketPlayOutScoreboardDisplayObjective(i, scoreboardobjective)); - } - } - - Iterator iterator = this.getScoresForObjective(scoreboardobjective).iterator(); - - while (iterator.hasNext()) { - ScoreboardScore scoreboardscore = (ScoreboardScore) iterator.next(); - - arraylist.add(new PacketPlayOutScoreboardScore(scoreboardscore, 0)); - } - - return arraylist; - } - - public void e(ScoreboardObjective scoreboardobjective) { - List list = this.getScoreboardScorePacketsForObjective(scoreboardobjective); - Iterator iterator = this.a.getPlayerList().players.iterator(); - - while (iterator.hasNext()) { - EntityPlayer entityplayer = (EntityPlayer) iterator.next(); - if (entityplayer.getBukkitEntity().getScoreboard().getHandle() != this) continue; // CraftBukkit - Only players on this board - Iterator iterator1 = list.iterator(); - - while (iterator1.hasNext()) { - Packet packet = (Packet) iterator1.next(); - - entityplayer.playerConnection.sendPacket(packet); - } - } - - this.b.add(scoreboardobjective); - } - - public List f(ScoreboardObjective scoreboardobjective) { - ArrayList arraylist = new ArrayList(); - - arraylist.add(new PacketPlayOutScoreboardObjective(scoreboardobjective, 1)); - - for (int i = 0; i < 3; ++i) { - if (this.getObjectiveForSlot(i) == scoreboardobjective) { - arraylist.add(new PacketPlayOutScoreboardDisplayObjective(i, scoreboardobjective)); - } - } - - return arraylist; - } - - public void g(ScoreboardObjective scoreboardobjective) { - List list = this.f(scoreboardobjective); - Iterator iterator = this.a.getPlayerList().players.iterator(); - - while (iterator.hasNext()) { - EntityPlayer entityplayer = (EntityPlayer) iterator.next(); - if (entityplayer.getBukkitEntity().getScoreboard().getHandle() != this) continue; // CraftBukkit - Only players on this board - Iterator iterator1 = list.iterator(); - - while (iterator1.hasNext()) { - Packet packet = (Packet) iterator1.next(); - - entityplayer.playerConnection.sendPacket(packet); - } - } - - this.b.remove(scoreboardobjective); - } - - public int h(ScoreboardObjective scoreboardobjective) { - int i = 0; - - for (int j = 0; j < 3; ++j) { - if (this.getObjectiveForSlot(j) == scoreboardobjective) { - ++i; - } - } - - return i; - } - - // CraftBukkit start - Send to players - private void sendAll(Packet packet) { - for (EntityPlayer entityplayer : (List) this.a.getPlayerList().players) { - if (entityplayer.getBukkitEntity().getScoreboard().getHandle() == this) { - entityplayer.playerConnection.sendPacket(packet); - } - } - } - // CraftBukkit end -} diff --git a/src/main/java/net/minecraft/server/SecondaryWorldServer.java b/src/main/java/net/minecraft/server/SecondaryWorldServer.java deleted file mode 100644 index 5236f81e98..0000000000 --- a/src/main/java/net/minecraft/server/SecondaryWorldServer.java +++ /dev/null @@ -1,14 +0,0 @@ -package net.minecraft.server; - -public class SecondaryWorldServer extends WorldServer { - // CraftBukkit start - Add Environment and ChunkGenerator arguments - public SecondaryWorldServer(MinecraftServer minecraftserver, IDataManager idatamanager, String s, int i, WorldSettings worldsettings, WorldServer worldserver, MethodProfiler methodprofiler, org.bukkit.World.Environment env, org.bukkit.generator.ChunkGenerator gen) { - super(minecraftserver, idatamanager, s, i, worldsettings, methodprofiler, env, gen); - // CraftBukkit end - this.worldMaps = worldserver.worldMaps; - this.scoreboard = worldserver.getScoreboard(); - // this.worldData = new SecondaryWorldData(worldserver.getWorldData()); // CraftBukkit - use unique worlddata - } - - // protected void a() {} // CraftBukkit - save world data! -} diff --git a/src/main/java/net/minecraft/server/ShapedRecipes.java b/src/main/java/net/minecraft/server/ShapedRecipes.java deleted file mode 100644 index cc444db888..0000000000 --- a/src/main/java/net/minecraft/server/ShapedRecipes.java +++ /dev/null @@ -1,159 +0,0 @@ -package net.minecraft.server; - -// CraftBukkit start -import org.bukkit.craftbukkit.inventory.CraftItemStack; -import org.bukkit.craftbukkit.inventory.CraftShapedRecipe; -// CraftBukkit end - -public class ShapedRecipes implements IRecipe { - - private int width; - private int height; - private ItemStack[] items; - private ItemStack result; - private boolean e; - - public ShapedRecipes(int i, int j, ItemStack[] aitemstack, ItemStack itemstack) { - this.width = i; - this.height = j; - this.items = aitemstack; - this.result = itemstack; - } - - // CraftBukkit start - public org.bukkit.inventory.ShapedRecipe toBukkitRecipe() { - CraftItemStack result = CraftItemStack.asCraftMirror(this.result); - CraftShapedRecipe recipe = new CraftShapedRecipe(result, this); - switch (this.height) { - case 1: - switch (this.width) { - case 1: - recipe.shape("a"); - break; - case 2: - recipe.shape("ab"); - break; - case 3: - recipe.shape("abc"); - break; - } - break; - case 2: - switch (this.width) { - case 1: - recipe.shape("a","b"); - break; - case 2: - recipe.shape("ab","cd"); - break; - case 3: - recipe.shape("abc","def"); - break; - } - break; - case 3: - switch (this.width) { - case 1: - recipe.shape("a","b","c"); - break; - case 2: - recipe.shape("ab","cd","ef"); - break; - case 3: - recipe.shape("abc","def","ghi"); - break; - } - break; - } - char c = 'a'; - for (ItemStack stack : this.items) { - if (stack != null) { - recipe.setIngredient(c, org.bukkit.craftbukkit.util.CraftMagicNumbers.getMaterial(stack.getItem()), stack.getData()); - } - c++; - } - return recipe; - } - // CraftBukkit end - - public ItemStack b() { - return this.result; - } - - public boolean a(InventoryCrafting inventorycrafting, World world) { - for (int i = 0; i <= 3 - this.width; ++i) { - for (int j = 0; j <= 3 - this.height; ++j) { - if (this.a(inventorycrafting, i, j, true)) { - return true; - } - - if (this.a(inventorycrafting, i, j, false)) { - return true; - } - } - } - - return false; - } - - private boolean a(InventoryCrafting inventorycrafting, int i, int j, boolean flag) { - for (int k = 0; k < 3; ++k) { - for (int l = 0; l < 3; ++l) { - int i1 = k - i; - int j1 = l - j; - ItemStack itemstack = null; - - if (i1 >= 0 && j1 >= 0 && i1 < this.width && j1 < this.height) { - if (flag) { - itemstack = this.items[this.width - i1 - 1 + j1 * this.width]; - } else { - itemstack = this.items[i1 + j1 * this.width]; - } - } - - ItemStack itemstack1 = inventorycrafting.b(k, l); - - if (itemstack1 != null || itemstack != null) { - if (itemstack1 == null && itemstack != null || itemstack1 != null && itemstack == null) { - return false; - } - - if (itemstack.getItem() != itemstack1.getItem()) { - return false; - } - - if (itemstack.getData() != 32767 && itemstack.getData() != itemstack1.getData()) { - return false; - } - } - } - } - - return true; - } - - public ItemStack a(InventoryCrafting inventorycrafting) { - ItemStack itemstack = this.b().cloneItemStack(); - - if (this.e) { - 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.e = true; - return this; - } -} diff --git a/src/main/java/net/minecraft/server/ShapelessRecipes.java b/src/main/java/net/minecraft/server/ShapelessRecipes.java deleted file mode 100644 index 0fab83c6c2..0000000000 --- a/src/main/java/net/minecraft/server/ShapelessRecipes.java +++ /dev/null @@ -1,78 +0,0 @@ -package net.minecraft.server; - -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; - -// CraftBukkit start -import org.bukkit.craftbukkit.inventory.CraftItemStack; -import org.bukkit.craftbukkit.inventory.CraftShapelessRecipe; -// CraftBukkit end - -public class ShapelessRecipes implements IRecipe { - - private final ItemStack result; - private final List ingredients; - - public ShapelessRecipes(ItemStack itemstack, List list) { - this.result = itemstack; - this.ingredients = list; - } - - // CraftBukkit start - @SuppressWarnings("unchecked") - public org.bukkit.inventory.ShapelessRecipe toBukkitRecipe() { - CraftItemStack result = CraftItemStack.asCraftMirror(this.result); - CraftShapelessRecipe recipe = new CraftShapelessRecipe(result, this); - for (ItemStack stack : (List) this.ingredients) { - if (stack != null) { - recipe.addIngredient(org.bukkit.craftbukkit.util.CraftMagicNumbers.getMaterial(stack.getItem()), stack.getData()); - } - } - return recipe; - } - // CraftBukkit end - - public ItemStack b() { - return this.result; - } - - public boolean a(InventoryCrafting inventorycrafting, World world) { - ArrayList arraylist = new ArrayList(this.ingredients); - - for (int i = 0; i < 3; ++i) { - for (int j = 0; j < 3; ++j) { - ItemStack itemstack = inventorycrafting.b(j, i); - - if (itemstack != null) { - boolean flag = false; - Iterator iterator = arraylist.iterator(); - - while (iterator.hasNext()) { - ItemStack itemstack1 = (ItemStack) iterator.next(); - - if (itemstack.getItem() == itemstack1.getItem() && (itemstack1.getData() == 32767 || itemstack.getData() == itemstack1.getData())) { - flag = true; - arraylist.remove(itemstack1); - break; - } - } - - if (!flag) { - return false; - } - } - } - } - - return arraylist.isEmpty(); - } - - public ItemStack a(InventoryCrafting inventorycrafting) { - return this.result.cloneItemStack(); - } - - public int a() { - return this.ingredients.size(); - } -} diff --git a/src/main/java/net/minecraft/server/Slot.java b/src/main/java/net/minecraft/server/Slot.java deleted file mode 100644 index ac9e04cf94..0000000000 --- a/src/main/java/net/minecraft/server/Slot.java +++ /dev/null @@ -1,74 +0,0 @@ -package net.minecraft.server; - -public class Slot { - - public final int index; // CraftBukkit - private -> public - public final IInventory inventory; - public int rawSlotIndex; - public int h; - public int i; - - public Slot(IInventory iinventory, int i, int j, int k) { - this.inventory = iinventory; - this.index = i; - this.h = j; - this.i = k; - } - - public void a(ItemStack itemstack, ItemStack itemstack1) { - if (itemstack != null && itemstack1 != null) { - if (itemstack.getItem() == itemstack1.getItem()) { - int i = itemstack1.count - itemstack.count; - - if (i > 0) { - this.a(itemstack, i); - } - } - } - } - - protected void a(ItemStack itemstack, int i) {} - - protected void b(ItemStack itemstack) {} - - public void a(EntityHuman entityhuman, ItemStack itemstack) { - this.f(); - } - - public boolean isAllowed(ItemStack itemstack) { - return true; - } - - public ItemStack getItem() { - return this.inventory.getItem(this.index); - } - - public boolean hasItem() { - return this.getItem() != null; - } - - public void set(ItemStack itemstack) { - this.inventory.setItem(this.index, itemstack); - this.f(); - } - - public void f() { - this.inventory.update(); - } - - public int getMaxStackSize() { - return this.inventory.getMaxStackSize(); - } - - public ItemStack a(int i) { - return this.inventory.splitStack(this.index, i); - } - - public boolean a(IInventory iinventory, int i) { - return iinventory == this.inventory && i == this.index; - } - - public boolean isAllowed(EntityHuman entityhuman) { - return true; - } -} diff --git a/src/main/java/net/minecraft/server/SlotFurnaceResult.java b/src/main/java/net/minecraft/server/SlotFurnaceResult.java deleted file mode 100644 index 9b8e39bc4b..0000000000 --- a/src/main/java/net/minecraft/server/SlotFurnaceResult.java +++ /dev/null @@ -1,85 +0,0 @@ -package net.minecraft.server; - -// CraftBukkit start -import org.bukkit.entity.Player; -import org.bukkit.event.inventory.FurnaceExtractEvent; -// CraftBukkit end - -public class SlotFurnaceResult extends Slot { - - private EntityHuman a; - private int b; - - public SlotFurnaceResult(EntityHuman entityhuman, IInventory iinventory, int i, int j, int k) { - super(iinventory, i, j, k); - this.a = entityhuman; - } - - public boolean isAllowed(ItemStack itemstack) { - return false; - } - - public ItemStack a(int i) { - if (this.hasItem()) { - this.b += Math.min(i, this.getItem().count); - } - - return super.a(i); - } - - public void a(EntityHuman entityhuman, ItemStack itemstack) { - this.b(itemstack); - super.a(entityhuman, itemstack); - } - - protected void a(ItemStack itemstack, int i) { - this.b += i; - this.b(itemstack); - } - - protected void b(ItemStack itemstack) { - itemstack.a(this.a.world, this.a, this.b); - if (!this.a.world.isStatic) { - int i = this.b; - float f = RecipesFurnace.getInstance().b(itemstack); - int j; - - if (f == 0.0F) { - i = 0; - } else if (f < 1.0F) { - j = MathHelper.d((float) i * f); - if (j < MathHelper.f((float) i * f) && (float) Math.random() < (float) i * f - (float) j) { - ++j; - } - - i = j; - } - - // CraftBukkit start - fire FurnaceExtractEvent - Player player = (Player) a.getBukkitEntity(); - TileEntityFurnace furnace = ((TileEntityFurnace) this.inventory); - org.bukkit.block.Block block = a.world.getWorld().getBlockAt(furnace.x, furnace.y, furnace.z); - - FurnaceExtractEvent event = new FurnaceExtractEvent(player, block, org.bukkit.craftbukkit.util.CraftMagicNumbers.getMaterial(itemstack.getItem()), itemstack.count, i); - a.world.getServer().getPluginManager().callEvent(event); - - i = event.getExpToDrop(); - // CraftBukkit end - - while (i > 0) { - j = EntityExperienceOrb.getOrbValue(i); - i -= j; - this.a.world.addEntity(new EntityExperienceOrb(this.a.world, this.a.locX, this.a.locY + 0.5D, this.a.locZ + 0.5D, j)); - } - } - - this.b = 0; - if (itemstack.getItem() == Items.IRON_INGOT) { - this.a.a((Statistic) AchievementList.k, 1); - } - - if (itemstack.getItem() == Items.COOKED_FISH) { - this.a.a((Statistic) AchievementList.p, 1); - } - } -} diff --git a/src/main/java/net/minecraft/server/SpawnerCreature.java b/src/main/java/net/minecraft/server/SpawnerCreature.java deleted file mode 100644 index 1dfc346066..0000000000 --- a/src/main/java/net/minecraft/server/SpawnerCreature.java +++ /dev/null @@ -1,255 +0,0 @@ -package net.minecraft.server; - -import java.util.Collection; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Random; - -// CraftBukkit start -import org.bukkit.craftbukkit.util.LongHash; -import org.bukkit.craftbukkit.util.LongObjectHashMap; -import org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason; -// CraftBukkit end - -public final class SpawnerCreature { - - private LongObjectHashMap a = new LongObjectHashMap(); // CraftBukkit - HashMap -> LongObjectHashMap - - public SpawnerCreature() {} - - protected static ChunkPosition getRandomPosition(World world, int i, int j) { - Chunk chunk = world.getChunkAt(i, j); - int k = i * 16 + world.random.nextInt(16); - int l = j * 16 + world.random.nextInt(16); - int i1 = world.random.nextInt(chunk == null ? world.S() : chunk.h() + 16 - 1); - - return new ChunkPosition(k, i1, l); - } - - public int spawnEntities(WorldServer worldserver, boolean flag, boolean flag1, boolean flag2) { - if (!flag && !flag1) { - return 0; - } else { - this.a.clear(); - - int i; - int j; - - for (i = 0; i < worldserver.players.size(); ++i) { - EntityHuman entityhuman = (EntityHuman) worldserver.players.get(i); - int k = MathHelper.floor(entityhuman.locX / 16.0D); - - j = MathHelper.floor(entityhuman.locZ / 16.0D); - byte b0 = 8; - - for (int l = -b0; l <= b0; ++l) { - for (int i1 = -b0; i1 <= b0; ++i1) { - boolean flag3 = l == -b0 || l == b0 || i1 == -b0 || i1 == b0; - - // CraftBukkit start - use LongHash and LongObjectHashMap - long chunkCoords = LongHash.toLong(l + k, i1 + j); - - if (!flag3) { - this.a.put(chunkCoords, false); - } else if (!this.a.containsKey(chunkCoords)) { - this.a.put(chunkCoords, true); - } - // CraftBukkit end - } - } - } - - i = 0; - ChunkCoordinates chunkcoordinates = worldserver.getSpawn(); - EnumCreatureType[] aenumcreaturetype = EnumCreatureType.values(); - - j = aenumcreaturetype.length; - - for (int j1 = 0; j1 < j; ++j1) { - EnumCreatureType enumcreaturetype = aenumcreaturetype[j1]; - - // CraftBukkit start - Use per-world spawn limits - int limit = enumcreaturetype.b(); - switch (enumcreaturetype) { - case MONSTER: - limit = worldserver.getWorld().getMonsterSpawnLimit(); - break; - case CREATURE: - limit = worldserver.getWorld().getAnimalSpawnLimit(); - break; - case WATER_CREATURE: - limit = worldserver.getWorld().getWaterAnimalSpawnLimit(); - break; - case AMBIENT: - limit = worldserver.getWorld().getAmbientSpawnLimit(); - break; - } - - if (limit == 0) { - continue; - } - // CraftBukkit end - - if ((!enumcreaturetype.d() || flag1) && (enumcreaturetype.d() || flag) && (!enumcreaturetype.e() || flag2) && worldserver.a(enumcreaturetype.a()) <= limit * this.a.size() / 256) { // CraftBukkit - use per-world limits - Iterator iterator = this.a.keySet().iterator(); - - label110: - while (iterator.hasNext()) { - // CraftBukkit start = use LongHash and LongObjectHashMap - long key = ((Long) iterator.next()).longValue(); - - if (!this.a.get(key)) { - ChunkPosition chunkposition = getRandomPosition(worldserver, LongHash.msw(key), LongHash.lsw(key)); - // CraftBukkit end - int k1 = chunkposition.x; - int l1 = chunkposition.y; - int i2 = chunkposition.z; - - if (!worldserver.getType(k1, l1, i2).r() && worldserver.getType(k1, l1, i2).getMaterial() == enumcreaturetype.c()) { - int j2 = 0; - int k2 = 0; - - while (k2 < 3) { - int l2 = k1; - int i3 = l1; - int j3 = i2; - byte b1 = 6; - BiomeMeta biomemeta = null; - GroupDataEntity groupdataentity = null; - int k3 = 0; - - while (true) { - if (k3 < 4) { - label103: { - l2 += worldserver.random.nextInt(b1) - worldserver.random.nextInt(b1); - i3 += worldserver.random.nextInt(1) - worldserver.random.nextInt(1); - j3 += worldserver.random.nextInt(b1) - worldserver.random.nextInt(b1); - if (a(enumcreaturetype, worldserver, l2, i3, j3)) { - float f = (float) l2 + 0.5F; - float f1 = (float) i3; - float f2 = (float) j3 + 0.5F; - - if (worldserver.findNearbyPlayer((double) f, (double) f1, (double) f2, 24.0D) == null) { - float f3 = f - (float) chunkcoordinates.x; - float f4 = f1 - (float) chunkcoordinates.y; - float f5 = f2 - (float) chunkcoordinates.z; - float f6 = f3 * f3 + f4 * f4 + f5 * f5; - - if (f6 >= 576.0F) { - if (biomemeta == null) { - biomemeta = worldserver.a(enumcreaturetype, l2, i3, j3); - if (biomemeta == null) { - break label103; - } - } - - EntityInsentient entityinsentient; - - try { - entityinsentient = (EntityInsentient) biomemeta.b.getConstructor(new Class[] { World.class}).newInstance(new Object[] { worldserver}); - } catch (Exception exception) { - exception.printStackTrace(); - return i; - } - - entityinsentient.setPositionRotation((double) f, (double) f1, (double) f2, worldserver.random.nextFloat() * 360.0F, 0.0F); - if (entityinsentient.canSpawn()) { - ++j2; - // CraftBukkit start - Added a reason for spawning this creature, moved entityinsentient.a(groupdataentity) up - groupdataentity = entityinsentient.prepare(groupdataentity); - worldserver.addEntity(entityinsentient, SpawnReason.NATURAL); - // CraftBukkit end - if (j2 >= entityinsentient.bB()) { - continue label110; - } - } - - i += j2; - } - } - } - - ++k3; - continue; - } - } - - ++k2; - break; - } - } - } - } - } - } - } - - return i; - } - } - - public static boolean a(EnumCreatureType enumcreaturetype, World world, int i, int j, int k) { - if (enumcreaturetype.c() == Material.WATER) { - return world.getType(i, j, k).getMaterial().isLiquid() && world.getType(i, j - 1, k).getMaterial().isLiquid() && !world.getType(i, j + 1, k).r(); - } else if (!World.a((IBlockAccess) world, i, j - 1, k)) { - return false; - } else { - Block block = world.getType(i, j - 1, k); - - return block != Blocks.BEDROCK && !world.getType(i, j, k).r() && !world.getType(i, j, k).getMaterial().isLiquid() && !world.getType(i, j + 1, k).r(); - } - } - - public static void a(World world, BiomeBase biomebase, int i, int j, int k, int l, Random random) { - List list = biomebase.getMobs(EnumCreatureType.CREATURE); - - if (!list.isEmpty()) { - while (random.nextFloat() < biomebase.g()) { - BiomeMeta biomemeta = (BiomeMeta) WeightedRandom.a(world.random, (Collection) list); - GroupDataEntity groupdataentity = null; - int i1 = biomemeta.c + random.nextInt(1 + biomemeta.d - biomemeta.c); - int j1 = i + random.nextInt(k); - int k1 = j + random.nextInt(l); - int l1 = j1; - int i2 = k1; - - for (int j2 = 0; j2 < i1; ++j2) { - boolean flag = false; - - for (int k2 = 0; !flag && k2 < 4; ++k2) { - int l2 = world.i(j1, k1); - - if (a(EnumCreatureType.CREATURE, world, j1, l2, k1)) { - float f = (float) j1 + 0.5F; - float f1 = (float) l2; - float f2 = (float) k1 + 0.5F; - - EntityInsentient entityinsentient; - - try { - entityinsentient = (EntityInsentient) biomemeta.b.getConstructor(new Class[] { World.class}).newInstance(new Object[] { world}); - } catch (Exception exception) { - exception.printStackTrace(); - continue; - } - - entityinsentient.setPositionRotation((double) f, (double) f1, (double) f2, random.nextFloat() * 360.0F, 0.0F); - // CraftBukkit start - Added a reason for spawning this creature, moved entityinsentient.a(groupdataentity) up - groupdataentity = entityinsentient.prepare(groupdataentity); - world.addEntity(entityinsentient, SpawnReason.CHUNK_GEN); - // CraftBukkit end - flag = true; - } - - j1 += random.nextInt(5) - random.nextInt(5); - - for (k1 += random.nextInt(5) - random.nextInt(5); j1 < i || j1 >= i + k || k1 < j || k1 >= j + k; k1 = i2 + random.nextInt(5) - random.nextInt(5)) { - j1 = l1 + random.nextInt(5) - random.nextInt(5); - } - } - } - } - } - } -} diff --git a/src/main/java/net/minecraft/server/StatisticManager.java b/src/main/java/net/minecraft/server/StatisticManager.java deleted file mode 100644 index d41dc4dd5a..0000000000 --- a/src/main/java/net/minecraft/server/StatisticManager.java +++ /dev/null @@ -1,68 +0,0 @@ -package net.minecraft.server; - -import java.util.Map; - -import net.minecraft.util.com.google.common.collect.Maps; - -public class StatisticManager { - - protected final Map a = Maps.newConcurrentMap(); - - public StatisticManager() { - } - - public boolean hasAchievement(Achievement achievement) { - return this.getStatisticValue((Statistic) achievement) > 0; - } - - public boolean b(Achievement achievement) { - return achievement.c == null || this.hasAchievement(achievement.c); - } - - public void b(EntityHuman entityhuman, Statistic statistic, int i) { - if (!statistic.d() || this.b((Achievement) statistic)) { - // CraftBukkit start - fire Statistic events - org.bukkit.event.Cancellable cancellable = org.bukkit.craftbukkit.event.CraftEventFactory.handleStatisticsIncrease(entityhuman, statistic, this.getStatisticValue(statistic), i); - if (cancellable != null && cancellable.isCancelled()) { - return; - } - // CraftBukkit end - this.setStatistic(entityhuman, statistic, this.getStatisticValue(statistic) + i); - } - } - - public void setStatistic(EntityHuman entityhuman, Statistic statistic, int i) { - StatisticWrapper statisticwrapper = (StatisticWrapper) this.a.get(statistic); - - if (statisticwrapper == null) { - statisticwrapper = new StatisticWrapper(); - this.a.put(statistic, statisticwrapper); - } - - statisticwrapper.a(i); - } - - public int getStatisticValue(Statistic statistic) { - StatisticWrapper statisticwrapper = (StatisticWrapper) this.a.get(statistic); - - return statisticwrapper == null ? 0 : statisticwrapper.a(); - } - - public IJsonStatistic b(Statistic statistic) { - StatisticWrapper statisticwrapper = (StatisticWrapper) this.a.get(statistic); - - return statisticwrapper != null ? statisticwrapper.b() : null; - } - - public IJsonStatistic a(Statistic statistic, IJsonStatistic ijsonstatistic) { - StatisticWrapper statisticwrapper = (StatisticWrapper) this.a.get(statistic); - - if (statisticwrapper == null) { - statisticwrapper = new StatisticWrapper(); - this.a.put(statistic, statisticwrapper); - } - - statisticwrapper.a(ijsonstatistic); - return ijsonstatistic; - } -} diff --git a/src/main/java/net/minecraft/server/ThreadCommandReader.java b/src/main/java/net/minecraft/server/ThreadCommandReader.java deleted file mode 100644 index a5e8a45e0b..0000000000 --- a/src/main/java/net/minecraft/server/ThreadCommandReader.java +++ /dev/null @@ -1,45 +0,0 @@ -package net.minecraft.server; - -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStreamReader; - -import static org.bukkit.craftbukkit.Main.*; // CraftBukkit - -class ThreadCommandReader extends Thread { - - final DedicatedServer server; - - ThreadCommandReader(DedicatedServer dedicatedserver, String s) { - super(s); - this.server = dedicatedserver; - } - - public void run() { - // CraftBukkit start - if (!useConsole) { - return; - } - // CraftBukkit end - - jline.console.ConsoleReader bufferedreader = this.server.reader; // CraftBukkit - String s; - - try { - // CraftBukkit start - JLine disabling compatibility - while (!this.server.isStopped() && this.server.isRunning()) { - if (useJline) { - s = bufferedreader.readLine(">", null); - } else { - s = bufferedreader.readLine(); - } - if (s != null) { - this.server.issueCommand(s, this.server); - } - // CraftBukkit end - } - } catch (IOException ioexception) { - DedicatedServer.aF().error("Exception handling console input", ioexception); - } - } -} diff --git a/src/main/java/net/minecraft/server/ThreadPlayerLookupUUID.java b/src/main/java/net/minecraft/server/ThreadPlayerLookupUUID.java deleted file mode 100644 index 6b91be708e..0000000000 --- a/src/main/java/net/minecraft/server/ThreadPlayerLookupUUID.java +++ /dev/null @@ -1,96 +0,0 @@ -package net.minecraft.server; - -import java.math.BigInteger; -import java.util.UUID; - -import net.minecraft.util.com.mojang.authlib.GameProfile; -import net.minecraft.util.com.mojang.authlib.exceptions.AuthenticationUnavailableException; - -// CraftBukkit start -import org.bukkit.craftbukkit.util.Waitable; -import org.bukkit.event.player.AsyncPlayerPreLoginEvent; -import org.bukkit.event.player.PlayerPreLoginEvent; -// CraftBukkit end - -class ThreadPlayerLookupUUID extends Thread { - - final LoginListener a; - - ThreadPlayerLookupUUID(LoginListener loginlistener, String s) { - super(s); - this.a = loginlistener; - } - - public void run() { - GameProfile gameprofile = LoginListener.a(this.a); - - try { - String s = (new BigInteger(MinecraftEncryption.a(LoginListener.b(this.a), LoginListener.c(this.a).K().getPublic(), LoginListener.d(this.a)))).toString(16); - - LoginListener.a(this.a, LoginListener.c(this.a).av().hasJoinedServer(new GameProfile((UUID) null, gameprofile.getName()), s)); - if (LoginListener.a(this.a) != null) { - // CraftBukkit start - fire PlayerPreLoginEvent - if (!this.a.networkManager.isConnected()) { - return; - } - - String playerName = LoginListener.a(this.a).getName(); - java.net.InetAddress address = ((java.net.InetSocketAddress) a.networkManager.getSocketAddress()).getAddress(); - java.util.UUID uniqueId = LoginListener.a(this.a).getId(); - final org.bukkit.craftbukkit.CraftServer server = LoginListener.c(this.a).server; - - AsyncPlayerPreLoginEvent asyncEvent = new AsyncPlayerPreLoginEvent(playerName, address, uniqueId); - server.getPluginManager().callEvent(asyncEvent); - - if (PlayerPreLoginEvent.getHandlerList().getRegisteredListeners().length != 0) { - final PlayerPreLoginEvent event = new PlayerPreLoginEvent(playerName, address, uniqueId); - if (asyncEvent.getResult() != PlayerPreLoginEvent.Result.ALLOWED) { - event.disallow(asyncEvent.getResult(), asyncEvent.getKickMessage()); - } - Waitable waitable = new Waitable() { - @Override - protected PlayerPreLoginEvent.Result evaluate() { - server.getPluginManager().callEvent(event); - return event.getResult(); - }}; - - LoginListener.c(this.a).processQueue.add(waitable); - if (waitable.get() != PlayerPreLoginEvent.Result.ALLOWED) { - this.a.disconnect(event.getKickMessage()); - return; - } - } else { - if (asyncEvent.getLoginResult() != AsyncPlayerPreLoginEvent.Result.ALLOWED) { - this.a.disconnect(asyncEvent.getKickMessage()); - return; - } - } - // CraftBukkit end - - LoginListener.e().info("UUID of player " + LoginListener.a(this.a).getName() + " is " + LoginListener.a(this.a).getId()); - LoginListener.a(this.a, EnumProtocolState.READY_TO_ACCEPT); - } else if (LoginListener.c(this.a).N()) { - LoginListener.e().warn("Failed to verify username but will let them in anyway!"); - LoginListener.a(this.a, this.a.a(gameprofile)); - LoginListener.a(this.a, EnumProtocolState.READY_TO_ACCEPT); - } else { - this.a.disconnect("Failed to verify username!"); - LoginListener.e().error("Username \'" + LoginListener.a(this.a).getName() + "\' tried to join with an invalid session"); - } - } catch (AuthenticationUnavailableException authenticationunavailableexception) { - if (LoginListener.c(this.a).N()) { - LoginListener.e().warn("Authentication servers are down but will let them in anyway!"); - LoginListener.a(this.a, this.a.a(gameprofile)); - LoginListener.a(this.a, EnumProtocolState.READY_TO_ACCEPT); - } else { - this.a.disconnect("Authentication servers are down. Please try again later, sorry!"); - LoginListener.e().error("Couldn\'t verify username because servers are unavailable"); - } - // CraftBukkit start - catch all exceptions - } catch (Exception exception) { - this.a.disconnect("Failed to verify username!"); - LoginListener.c(this.a).server.getLogger().log(java.util.logging.Level.WARNING, "Exception verifying " + LoginListener.a(this.a).getName(), exception); - // CraftBukkit end - } - } -} diff --git a/src/main/java/net/minecraft/server/TileEntity.java b/src/main/java/net/minecraft/server/TileEntity.java deleted file mode 100644 index b2de58b536..0000000000 --- a/src/main/java/net/minecraft/server/TileEntity.java +++ /dev/null @@ -1,183 +0,0 @@ -package net.minecraft.server; - -import java.util.HashMap; -import java.util.Map; -import java.util.concurrent.Callable; - -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; - -import org.bukkit.inventory.InventoryHolder; // CraftBukkit - -public class TileEntity { - - private static final Logger a = LogManager.getLogger(); - private static Map i = new HashMap(); - private static Map j = new HashMap(); - protected World world; - public int x; - public int y; - public int z; - protected boolean f; - public int g = -1; - public Block h; - - public TileEntity() {} - - private static void a(Class oclass, String s) { - if (i.containsKey(s)) { - throw new IllegalArgumentException("Duplicate id: " + s); - } else { - i.put(s, oclass); - j.put(oclass, s); - } - } - - public World getWorld() { - return this.world; - } - - public void a(World world) { - this.world = world; - } - - public boolean o() { - return this.world != null; - } - - public void a(NBTTagCompound nbttagcompound) { - this.x = nbttagcompound.getInt("x"); - this.y = nbttagcompound.getInt("y"); - this.z = nbttagcompound.getInt("z"); - } - - public void b(NBTTagCompound nbttagcompound) { - String s = (String) j.get(this.getClass()); - - if (s == null) { - throw new RuntimeException(this.getClass() + " is missing a mapping! This is a bug!"); - } else { - nbttagcompound.setString("id", s); - nbttagcompound.setInt("x", this.x); - nbttagcompound.setInt("y", this.y); - nbttagcompound.setInt("z", this.z); - } - } - - public void h() {} - - public static TileEntity c(NBTTagCompound nbttagcompound) { - TileEntity tileentity = null; - - try { - Class oclass = (Class) i.get(nbttagcompound.getString("id")); - - if (oclass != null) { - tileentity = (TileEntity) oclass.newInstance(); - } - } catch (Exception exception) { - exception.printStackTrace(); - } - - if (tileentity != null) { - tileentity.a(nbttagcompound); - } else { - a.warn("Skipping BlockEntity with id " + nbttagcompound.getString("id")); - } - - return tileentity; - } - - public int p() { - if (this.g == -1) { - this.g = this.world.getData(this.x, this.y, this.z); - } - - return this.g; - } - - public void update() { - if (this.world != null) { - this.g = this.world.getData(this.x, this.y, this.z); - this.world.b(this.x, this.y, this.z, this); - if (this.q() != Blocks.AIR) { - this.world.updateAdjacentComparators(this.x, this.y, this.z, this.q()); - } - } - } - - public Block q() { - if (this.h == null) { - this.h = this.world.getType(this.x, this.y, this.z); - } - - return this.h; - } - - public Packet getUpdatePacket() { - return null; - } - - public boolean r() { - return this.f; - } - - public void s() { - this.f = true; - } - - public void t() { - this.f = false; - } - - public boolean c(int i, int j) { - return false; - } - - public void u() { - this.h = null; - this.g = -1; - } - - public void a(CrashReportSystemDetails crashreportsystemdetails) { - crashreportsystemdetails.a("Name", (Callable) (new CrashReportTileEntityName(this))); - CrashReportSystemDetails.a(crashreportsystemdetails, this.x, this.y, this.z, this.q(), this.p()); - crashreportsystemdetails.a("Actual block type", (Callable) (new CrashReportTileEntityType(this))); - crashreportsystemdetails.a("Actual block data value", (Callable) (new CrashReportTileEntityData(this))); - } - - static Map v() { - return j; - } - - static { - a(TileEntityFurnace.class, "Furnace"); - a(TileEntityChest.class, "Chest"); - a(TileEntityEnderChest.class, "EnderChest"); - a(TileEntityRecordPlayer.class, "RecordPlayer"); - a(TileEntityDispenser.class, "Trap"); - a(TileEntityDropper.class, "Dropper"); - a(TileEntitySign.class, "Sign"); - a(TileEntityMobSpawner.class, "MobSpawner"); - a(TileEntityNote.class, "Music"); - a(TileEntityPiston.class, "Piston"); - a(TileEntityBrewingStand.class, "Cauldron"); - a(TileEntityEnchantTable.class, "EnchantTable"); - a(TileEntityEnderPortal.class, "Airportal"); - a(TileEntityCommand.class, "Control"); - a(TileEntityBeacon.class, "Beacon"); - a(TileEntitySkull.class, "Skull"); - a(TileEntityLightDetector.class, "DLDetector"); - a(TileEntityHopper.class, "Hopper"); - a(TileEntityComparator.class, "Comparator"); - a(TileEntityFlowerPot.class, "FlowerPot"); - } - - // CraftBukkit start - add method - public InventoryHolder getOwner() { - org.bukkit.block.BlockState state = world.getWorld().getBlockAt(x, y, z).getState(); - if (state instanceof InventoryHolder) return (InventoryHolder) state; - return null; - } - // CraftBukkit end -} diff --git a/src/main/java/net/minecraft/server/TileEntityBeacon.java b/src/main/java/net/minecraft/server/TileEntityBeacon.java deleted file mode 100644 index 09313eaeb7..0000000000 --- a/src/main/java/net/minecraft/server/TileEntityBeacon.java +++ /dev/null @@ -1,276 +0,0 @@ -package net.minecraft.server; - -import java.util.Iterator; -import java.util.List; - -// CraftBukkit start -import org.bukkit.craftbukkit.entity.CraftHumanEntity; -import org.bukkit.entity.HumanEntity; -// CraftBukkit end - -public class TileEntityBeacon extends TileEntity implements IInventory { - - public static final MobEffectList[][] a = new MobEffectList[][] { { MobEffectList.FASTER_MOVEMENT, MobEffectList.FASTER_DIG}, { MobEffectList.RESISTANCE, MobEffectList.JUMP}, { MobEffectList.INCREASE_DAMAGE}, { MobEffectList.REGENERATION}}; - private boolean k; - private int l = -1; - private int m; - private int n; - private ItemStack inventorySlot; - private String p; - // CraftBukkit start - add fields and methods - public List transaction = new java.util.ArrayList(); - private int maxStack = MAX_STACK; - - public ItemStack[] getContents() { - return new ItemStack[] { this.inventorySlot }; - } - - public void onOpen(CraftHumanEntity who) { - transaction.add(who); - } - - public void onClose(CraftHumanEntity who) { - transaction.remove(who); - } - - public List getViewers() { - return transaction; - } - - public void setMaxStackSize(int size) { - maxStack = size; - } - // CraftBukkit end - - public TileEntityBeacon() {} - - public void h() { - if (this.world.getTime() % 80L == 0L) { - this.y(); - this.x(); - } - } - - private void x() { - if (this.k && this.l > 0 && !this.world.isStatic && this.m > 0) { - double d0 = (double) (this.l * 10 + 10); - byte b0 = 0; - - if (this.l >= 4 && this.m == this.n) { - b0 = 1; - } - - AxisAlignedBB axisalignedbb = AxisAlignedBB.a((double) this.x, (double) this.y, (double) this.z, (double) (this.x + 1), (double) (this.y + 1), (double) (this.z + 1)).grow(d0, d0, d0); - - axisalignedbb.e = (double) this.world.getHeight(); - List list = this.world.a(EntityHuman.class, axisalignedbb); - Iterator iterator = list.iterator(); - - EntityHuman entityhuman; - - while (iterator.hasNext()) { - entityhuman = (EntityHuman) iterator.next(); - entityhuman.addEffect(new MobEffect(this.m, 180, b0, true)); - } - - if (this.l >= 4 && this.m != this.n && this.n > 0) { - iterator = list.iterator(); - - while (iterator.hasNext()) { - entityhuman = (EntityHuman) iterator.next(); - entityhuman.addEffect(new MobEffect(this.n, 180, 0, true)); - } - } - } - } - - private void y() { - int i = this.l; - - if (!this.world.i(this.x, this.y + 1, this.z)) { - this.k = false; - this.l = 0; - } else { - this.k = true; - this.l = 0; - - for (int j = 1; j <= 4; this.l = j++) { - int k = this.y - j; - - if (k < 0) { - break; - } - - boolean flag = true; - - for (int l = this.x - j; l <= this.x + j && flag; ++l) { - for (int i1 = this.z - j; i1 <= this.z + j; ++i1) { - Block block = this.world.getType(l, k, i1); - - if (block != Blocks.EMERALD_BLOCK && block != Blocks.GOLD_BLOCK && block != Blocks.DIAMOND_BLOCK && block != Blocks.IRON_BLOCK) { - flag = false; - break; - } - } - } - - if (!flag) { - break; - } - } - - if (this.l == 0) { - this.k = false; - } - } - - if (!this.world.isStatic && this.l == 4 && i < this.l) { - Iterator iterator = this.world.a(EntityHuman.class, AxisAlignedBB.a((double) this.x, (double) this.y, (double) this.z, (double) this.x, (double) (this.y - 4), (double) this.z).grow(10.0D, 5.0D, 10.0D)).iterator(); - - while (iterator.hasNext()) { - EntityHuman entityhuman = (EntityHuman) iterator.next(); - - entityhuman.a((Statistic) AchievementList.K); - } - } - } - - public int j() { - return this.m; - } - - public int k() { - return this.n; - } - - public int l() { - return this.l; - } - - public void d(int i) { - this.m = 0; - - for (int j = 0; j < this.l && j < 3; ++j) { - MobEffectList[] amobeffectlist = a[j]; - int k = amobeffectlist.length; - - for (int l = 0; l < k; ++l) { - MobEffectList mobeffectlist = amobeffectlist[l]; - - if (mobeffectlist.id == i) { - this.m = i; - return; - } - } - } - } - - public void e(int i) { - this.n = 0; - if (this.l >= 4) { - for (int j = 0; j < 4; ++j) { - MobEffectList[] amobeffectlist = a[j]; - int k = amobeffectlist.length; - - for (int l = 0; l < k; ++l) { - MobEffectList mobeffectlist = amobeffectlist[l]; - - if (mobeffectlist.id == i) { - this.n = i; - return; - } - } - } - } - } - - public Packet getUpdatePacket() { - NBTTagCompound nbttagcompound = new NBTTagCompound(); - - this.b(nbttagcompound); - return new PacketPlayOutTileEntityData(this.x, this.y, this.z, 3, nbttagcompound); - } - - public void a(NBTTagCompound nbttagcompound) { - super.a(nbttagcompound); - this.m = nbttagcompound.getInt("Primary"); - this.n = nbttagcompound.getInt("Secondary"); - this.l = nbttagcompound.getInt("Levels"); - } - - public void b(NBTTagCompound nbttagcompound) { - super.b(nbttagcompound); - nbttagcompound.setInt("Primary", this.m); - nbttagcompound.setInt("Secondary", this.n); - nbttagcompound.setInt("Levels", this.l); - } - - public int getSize() { - return 1; - } - - public ItemStack getItem(int i) { - return i == 0 ? this.inventorySlot : null; - } - - public ItemStack splitStack(int i, int j) { - if (i == 0 && this.inventorySlot != null) { - if (j >= this.inventorySlot.count) { - ItemStack itemstack = this.inventorySlot; - - this.inventorySlot = null; - return itemstack; - } else { - this.inventorySlot.count -= j; - return new ItemStack(this.inventorySlot.getItem(), j, this.inventorySlot.getData()); - } - } else { - return null; - } - } - - public ItemStack splitWithoutUpdate(int i) { - if (i == 0 && this.inventorySlot != null) { - ItemStack itemstack = this.inventorySlot; - - this.inventorySlot = null; - return itemstack; - } else { - return null; - } - } - - public void setItem(int i, ItemStack itemstack) { - if (i == 0) { - this.inventorySlot = itemstack; - } - } - - public String getInventoryName() { - return this.k_() ? this.p : "container.beacon"; - } - - public boolean k_() { - return this.p != null && this.p.length() > 0; - } - - public void a(String s) { - this.p = s; - } - - public int getMaxStackSize() { - return maxStack; // CraftBukkit - } - - public boolean a(EntityHuman entityhuman) { - return this.world.getTileEntity(this.x, this.y, this.z) != this ? false : entityhuman.e((double) this.x + 0.5D, (double) this.y + 0.5D, (double) this.z + 0.5D) <= 64.0D; - } - - public void startOpen() {} - - public void closeContainer() {} - - public boolean b(int i, ItemStack itemstack) { - return itemstack.getItem() == Items.EMERALD || itemstack.getItem() == Items.DIAMOND || itemstack.getItem() == Items.GOLD_INGOT || itemstack.getItem() == Items.IRON_INGOT; - } -} diff --git a/src/main/java/net/minecraft/server/TileEntityBrewingStand.java b/src/main/java/net/minecraft/server/TileEntityBrewingStand.java deleted file mode 100644 index c0ca4a49df..0000000000 --- a/src/main/java/net/minecraft/server/TileEntityBrewingStand.java +++ /dev/null @@ -1,297 +0,0 @@ -package net.minecraft.server; - -import java.util.List; - -// CraftBukkit start -import org.bukkit.craftbukkit.entity.CraftHumanEntity; -import org.bukkit.entity.HumanEntity; -import org.bukkit.event.inventory.BrewEvent; -// CraftBukkit end - -public class TileEntityBrewingStand extends TileEntity implements IWorldInventory { - - private static final int[] a = new int[] { 3}; - private static final int[] i = new int[] { 0, 1, 2}; - public ItemStack[] items = new ItemStack[4]; // CraftBukkit - private -> public - public int brewTime; // CraftBukkit - private -> public - private int l; - private Item m; - private String n; - private int lastTick = MinecraftServer.currentTick; // CraftBukkit - add field - - public TileEntityBrewingStand() {} - - // CraftBukkit start - add fields and methods - public List transaction = new java.util.ArrayList(); - private int maxStack = 64; - - public void onOpen(CraftHumanEntity who) { - transaction.add(who); - } - - public void onClose(CraftHumanEntity who) { - transaction.remove(who); - } - - public List getViewers() { - return transaction; - } - - public ItemStack[] getContents() { - return this.items; - } - - public void setMaxStackSize(int size) { - maxStack = size; - } - // CraftBukkit end - - public String getInventoryName() { - return this.k_() ? this.n : "container.brewing"; - } - - public boolean k_() { - return this.n != null && this.n.length() > 0; - } - - public void a(String s) { - this.n = s; - } - - public int getSize() { - return this.items.length; - } - - public void h() { - // CraftBukkit start - Use wall time instead of ticks for brewing - int elapsedTicks = MinecraftServer.currentTick - this.lastTick; - this.lastTick = MinecraftServer.currentTick; - - if (this.brewTime > 0) { - this.brewTime -= elapsedTicks; - if (this.brewTime <= 0) { // == -> <= - // CraftBukkit end - this.l(); - this.update(); - } else if (!this.k()) { - this.brewTime = 0; - this.update(); - } else if (this.m != this.items[3].getItem()) { - this.brewTime = 0; - this.update(); - } - } else if (this.k()) { - this.brewTime = 400; - this.m = this.items[3].getItem(); - } - - int i = this.j(); - - if (i != this.l) { - this.l = i; - this.world.setData(this.x, this.y, this.z, i, 2); - } - - super.h(); - } - - public int i() { - return this.brewTime; - } - - private boolean k() { - if (this.items[3] != null && this.items[3].count > 0) { - ItemStack itemstack = this.items[3]; - - if (!itemstack.getItem().m(itemstack)) { - return false; - } else { - boolean flag = false; - - for (int i = 0; i < 3; ++i) { - if (this.items[i] != null && this.items[i].getItem() == Items.POTION) { - int j = this.items[i].getData(); - int k = this.c(j, itemstack); - - if (!ItemPotion.g(j) && ItemPotion.g(k)) { - flag = true; - break; - } - - List list = Items.POTION.c(j); - List list1 = Items.POTION.c(k); - - if ((j <= 0 || list != list1) && (list == null || !list.equals(list1) && list1 != null) && j != k) { - flag = true; - break; - } - } - } - - return flag; - } - } else { - return false; - } - } - - private void l() { - if (this.k()) { - ItemStack itemstack = this.items[3]; - - // CraftBukkit start - if (getOwner() != null) { - BrewEvent event = new BrewEvent(world.getWorld().getBlockAt(x, y, z), (org.bukkit.inventory.BrewerInventory) this.getOwner().getInventory()); - org.bukkit.Bukkit.getPluginManager().callEvent(event); - if (event.isCancelled()) { - return; - } - } - // CraftBukkit end - - for (int i = 0; i < 3; ++i) { - if (this.items[i] != null && this.items[i].getItem() == Items.POTION) { - int j = this.items[i].getData(); - int k = this.c(j, itemstack); - List list = Items.POTION.c(j); - List list1 = Items.POTION.c(k); - - if ((j <= 0 || list != list1) && (list == null || !list.equals(list1) && list1 != null)) { - if (j != k) { - this.items[i].setData(k); - } - } else if (!ItemPotion.g(j) && ItemPotion.g(k)) { - this.items[i].setData(k); - } - } - } - - if (itemstack.getItem().u()) { - this.items[3] = new ItemStack(itemstack.getItem().t()); - } else { - --this.items[3].count; - if (this.items[3].count <= 0) { - this.items[3] = null; - } - } - } - } - - private int c(int i, ItemStack itemstack) { - return itemstack == null ? i : (itemstack.getItem().m(itemstack) ? PotionBrewer.a(i, itemstack.getItem().i(itemstack)) : i); - } - - public void a(NBTTagCompound nbttagcompound) { - super.a(nbttagcompound); - NBTTagList nbttaglist = nbttagcompound.getList("Items", 10); - - this.items = new ItemStack[this.getSize()]; - - for (int i = 0; i < nbttaglist.size(); ++i) { - NBTTagCompound nbttagcompound1 = nbttaglist.get(i); - byte b0 = nbttagcompound1.getByte("Slot"); - - if (b0 >= 0 && b0 < this.items.length) { - this.items[b0] = ItemStack.createStack(nbttagcompound1); - } - } - - this.brewTime = nbttagcompound.getShort("BrewTime"); - if (nbttagcompound.hasKeyOfType("CustomName", 8)) { - this.n = nbttagcompound.getString("CustomName"); - } - } - - public void b(NBTTagCompound nbttagcompound) { - super.b(nbttagcompound); - nbttagcompound.setShort("BrewTime", (short) this.brewTime); - NBTTagList nbttaglist = new NBTTagList(); - - for (int i = 0; i < this.items.length; ++i) { - if (this.items[i] != null) { - NBTTagCompound nbttagcompound1 = new NBTTagCompound(); - - nbttagcompound1.setByte("Slot", (byte) i); - this.items[i].save(nbttagcompound1); - nbttaglist.add(nbttagcompound1); - } - } - - nbttagcompound.set("Items", nbttaglist); - if (this.k_()) { - nbttagcompound.setString("CustomName", this.n); - } - } - - public ItemStack getItem(int i) { - return i >= 0 && i < this.items.length ? this.items[i] : null; - } - - public ItemStack splitStack(int i, int j) { - if (i >= 0 && i < this.items.length) { - ItemStack itemstack = this.items[i]; - - this.items[i] = null; - return itemstack; - } else { - return null; - } - } - - public ItemStack splitWithoutUpdate(int i) { - if (i >= 0 && i < this.items.length) { - ItemStack itemstack = this.items[i]; - - this.items[i] = null; - return itemstack; - } else { - return null; - } - } - - public void setItem(int i, ItemStack itemstack) { - if (i >= 0 && i < this.items.length) { - this.items[i] = itemstack; - } - } - - public int getMaxStackSize() { - return this.maxStack; // CraftBukkit - } - - public boolean a(EntityHuman entityhuman) { - return this.world.getTileEntity(this.x, this.y, this.z) != this ? false : entityhuman.e((double) this.x + 0.5D, (double) this.y + 0.5D, (double) this.z + 0.5D) <= 64.0D; - } - - public void startOpen() {} - - public void closeContainer() {} - - public boolean b(int i, ItemStack itemstack) { - return i == 3 ? itemstack.getItem().m(itemstack) : itemstack.getItem() == Items.POTION || itemstack.getItem() == Items.GLASS_BOTTLE; - } - - public int j() { - int i = 0; - - for (int j = 0; j < 3; ++j) { - if (this.items[j] != null) { - i |= 1 << j; - } - } - - return i; - } - - public int[] getSlotsForFace(int i) { - return i == 1 ? a : TileEntityBrewingStand.i; // CraftBukkit - decompilation error - } - - public boolean canPlaceItemThroughFace(int i, ItemStack itemstack, int j) { - return this.b(i, itemstack); - } - - public boolean canTakeItemThroughFace(int i, ItemStack itemstack, int j) { - return true; - } -} diff --git a/src/main/java/net/minecraft/server/TileEntityChest.java b/src/main/java/net/minecraft/server/TileEntityChest.java deleted file mode 100644 index c900cafb6d..0000000000 --- a/src/main/java/net/minecraft/server/TileEntityChest.java +++ /dev/null @@ -1,410 +0,0 @@ -package net.minecraft.server; - -import java.util.Iterator; -import java.util.List; - -// CraftBukkit start -import org.bukkit.craftbukkit.entity.CraftHumanEntity; -import org.bukkit.entity.HumanEntity; -// CraftBukkit end - -public class TileEntityChest extends TileEntity implements IInventory { - - private ItemStack[] items = new ItemStack[27]; // CraftBukkit - 36 -> 27 - public boolean a; - public TileEntityChest i; - public TileEntityChest j; - public TileEntityChest k; - public TileEntityChest l; - public float m; - public float n; - public int o; - private int ticks; - private int r = -1; - private String s; - - public TileEntityChest() {} - - // CraftBukkit start - add fields and methods - public List transaction = new java.util.ArrayList(); - private int maxStack = MAX_STACK; - - public ItemStack[] getContents() { - return this.items; - } - - public void onOpen(CraftHumanEntity who) { - transaction.add(who); - } - - public void onClose(CraftHumanEntity who) { - transaction.remove(who); - } - - public List getViewers() { - return transaction; - } - - public void setMaxStackSize(int size) { - maxStack = size; - } - // CraftBukkit end - - public int getSize() { - return 27; - } - - public ItemStack getItem(int i) { - return this.items[i]; - } - - public ItemStack splitStack(int i, int j) { - if (this.items[i] != null) { - ItemStack itemstack; - - if (this.items[i].count <= j) { - itemstack = this.items[i]; - this.items[i] = null; - this.update(); - return itemstack; - } else { - itemstack = this.items[i].a(j); - if (this.items[i].count == 0) { - this.items[i] = null; - } - - this.update(); - return itemstack; - } - } else { - return null; - } - } - - public ItemStack splitWithoutUpdate(int i) { - if (this.items[i] != null) { - ItemStack itemstack = this.items[i]; - - this.items[i] = null; - return itemstack; - } else { - return null; - } - } - - public void setItem(int i, ItemStack itemstack) { - this.items[i] = itemstack; - if (itemstack != null && itemstack.count > this.getMaxStackSize()) { - itemstack.count = this.getMaxStackSize(); - } - - this.update(); - } - - public String getInventoryName() { - return this.k_() ? this.s : "container.chest"; - } - - public boolean k_() { - return this.s != null && this.s.length() > 0; - } - - public void a(String s) { - this.s = s; - } - - public void a(NBTTagCompound nbttagcompound) { - super.a(nbttagcompound); - NBTTagList nbttaglist = nbttagcompound.getList("Items", 10); - - this.items = new ItemStack[this.getSize()]; - if (nbttagcompound.hasKeyOfType("CustomName", 8)) { - this.s = nbttagcompound.getString("CustomName"); - } - - for (int i = 0; i < nbttaglist.size(); ++i) { - NBTTagCompound nbttagcompound1 = nbttaglist.get(i); - int j = nbttagcompound1.getByte("Slot") & 255; - - if (j >= 0 && j < this.items.length) { - this.items[j] = ItemStack.createStack(nbttagcompound1); - } - } - } - - public void b(NBTTagCompound nbttagcompound) { - super.b(nbttagcompound); - NBTTagList nbttaglist = new NBTTagList(); - - for (int i = 0; i < this.items.length; ++i) { - if (this.items[i] != null) { - NBTTagCompound nbttagcompound1 = new NBTTagCompound(); - - nbttagcompound1.setByte("Slot", (byte) i); - this.items[i].save(nbttagcompound1); - nbttaglist.add(nbttagcompound1); - } - } - - nbttagcompound.set("Items", nbttaglist); - if (this.k_()) { - nbttagcompound.setString("CustomName", this.s); - } - } - - public int getMaxStackSize() { - return maxStack; // CraftBukkit - } - - public boolean a(EntityHuman entityhuman) { - if (this.world == null) return true; // CraftBukkit - return this.world.getTileEntity(this.x, this.y, this.z) != this ? false : entityhuman.e((double) this.x + 0.5D, (double) this.y + 0.5D, (double) this.z + 0.5D) <= 64.0D; - } - - public void u() { - super.u(); - this.a = false; - } - - private void a(TileEntityChest tileentitychest, int i) { - if (tileentitychest.r()) { - this.a = false; - } else if (this.a) { - switch (i) { - case 0: - if (this.l != tileentitychest) { - this.a = false; - } - break; - - case 1: - if (this.k != tileentitychest) { - this.a = false; - } - break; - - case 2: - if (this.i != tileentitychest) { - this.a = false; - } - break; - - case 3: - if (this.j != tileentitychest) { - this.a = false; - } - } - } - } - - public void i() { - if (!this.a) { - this.a = true; - this.i = null; - this.j = null; - this.k = null; - this.l = null; - if (this.a(this.x - 1, this.y, this.z)) { - this.k = (TileEntityChest) this.world.getTileEntity(this.x - 1, this.y, this.z); - } - - if (this.a(this.x + 1, this.y, this.z)) { - this.j = (TileEntityChest) this.world.getTileEntity(this.x + 1, this.y, this.z); - } - - if (this.a(this.x, this.y, this.z - 1)) { - this.i = (TileEntityChest) this.world.getTileEntity(this.x, this.y, this.z - 1); - } - - if (this.a(this.x, this.y, this.z + 1)) { - this.l = (TileEntityChest) this.world.getTileEntity(this.x, this.y, this.z + 1); - } - - if (this.i != null) { - this.i.a(this, 0); - } - - if (this.l != null) { - this.l.a(this, 2); - } - - if (this.j != null) { - this.j.a(this, 1); - } - - if (this.k != null) { - this.k.a(this, 3); - } - } - } - - private boolean a(int i, int j, int k) { - if (this.world == null) { - return false; - } else { - Block block = this.world.getType(i, j, k); - - return block instanceof BlockChest && ((BlockChest) block).a == this.j(); - } - } - - public void h() { - super.h(); - if (this.world == null) return; // CraftBukkit - this.i(); - ++this.ticks; - float f; - - if (!this.world.isStatic && this.o != 0 && (this.ticks + this.x + this.y + this.z) % 200 == 0) { - this.o = 0; - f = 5.0F; - List list = this.world.a(EntityHuman.class, AxisAlignedBB.a((double) ((float) this.x - f), (double) ((float) this.y - f), (double) ((float) this.z - f), (double) ((float) (this.x + 1) + f), (double) ((float) (this.y + 1) + f), (double) ((float) (this.z + 1) + f))); - Iterator iterator = list.iterator(); - - while (iterator.hasNext()) { - EntityHuman entityhuman = (EntityHuman) iterator.next(); - - if (entityhuman.activeContainer instanceof ContainerChest) { - IInventory iinventory = ((ContainerChest) entityhuman.activeContainer).e(); - - if (iinventory == this || iinventory instanceof InventoryLargeChest && ((InventoryLargeChest) iinventory).a((IInventory) this)) { - ++this.o; - } - } - } - } - - this.n = this.m; - f = 0.1F; - double d0; - - if (this.o > 0 && this.m == 0.0F && this.i == null && this.k == null) { - double d1 = (double) this.x + 0.5D; - - d0 = (double) this.z + 0.5D; - if (this.l != null) { - d0 += 0.5D; - } - - if (this.j != null) { - d1 += 0.5D; - } - - this.world.makeSound(d1, (double) this.y + 0.5D, d0, "random.chestopen", 0.5F, this.world.random.nextFloat() * 0.1F + 0.9F); - } - - if (this.o == 0 && this.m > 0.0F || this.o > 0 && this.m < 1.0F) { - float f1 = this.m; - - if (this.o > 0) { - this.m += f; - } else { - this.m -= f; - } - - if (this.m > 1.0F) { - this.m = 1.0F; - } - - float f2 = 0.5F; - - if (this.m < f2 && f1 >= f2 && this.i == null && this.k == null) { - d0 = (double) this.x + 0.5D; - double d2 = (double) this.z + 0.5D; - - if (this.l != null) { - d2 += 0.5D; - } - - if (this.j != null) { - d0 += 0.5D; - } - - this.world.makeSound(d0, (double) this.y + 0.5D, d2, "random.chestclosed", 0.5F, this.world.random.nextFloat() * 0.1F + 0.9F); - } - - if (this.m < 0.0F) { - this.m = 0.0F; - } - } - } - - public boolean c(int i, int j) { - if (i == 1) { - this.o = j; - return true; - } else { - return super.c(i, j); - } - } - - public void startOpen() { - if (this.o < 0) { - this.o = 0; - } - - int oldPower = Math.max(0, Math.min(15, this.o)); // CraftBukkit - Get power before new viewer is added - - ++this.o; - if (this.world == null) return; // CraftBukkit - this.world.playBlockAction(this.x, this.y, this.z, this.q(), 1, this.o); - - // CraftBukkit start - Call redstone event - if (this.q() == Blocks.TRAPPED_CHEST) { - int newPower = Math.max(0, Math.min(15, this.o)); - - if (oldPower != newPower) { - org.bukkit.craftbukkit.event.CraftEventFactory.callRedstoneChange(world, this.x, this.y, this.z, oldPower, newPower); - } - } - // CraftBukkit end - - this.world.applyPhysics(this.x, this.y, this.z, this.q()); - this.world.applyPhysics(this.x, this.y - 1, this.z, this.q()); - } - - public void closeContainer() { - if (this.q() instanceof BlockChest) { - int oldPower = Math.max(0, Math.min(15, this.o)); // CraftBukkit - Get power before new viewer is added - - --this.o; - if (this.world == null) return; // CraftBukkit - this.world.playBlockAction(this.x, this.y, this.z, this.q(), 1, this.o); - - // CraftBukkit start - Call redstone event - if (this.q() == Blocks.TRAPPED_CHEST) { - int newPower = Math.max(0, Math.min(15, this.o)); - - if (oldPower != newPower) { - org.bukkit.craftbukkit.event.CraftEventFactory.callRedstoneChange(world, this.x, this.y, this.z, oldPower, newPower); - } - } - // CraftBukkit end - - this.world.applyPhysics(this.x, this.y, this.z, this.q()); - this.world.applyPhysics(this.x, this.y - 1, this.z, this.q()); - } - } - - public boolean b(int i, ItemStack itemstack) { - return true; - } - - public void s() { - super.s(); - this.u(); - this.i(); - } - - public int j() { - if (this.r == -1) { - if (this.world == null || !(this.q() instanceof BlockChest)) { - return 0; - } - - this.r = ((BlockChest) this.q()).a; - } - - return this.r; - } -} diff --git a/src/main/java/net/minecraft/server/TileEntityCommandListener.java b/src/main/java/net/minecraft/server/TileEntityCommandListener.java deleted file mode 100644 index 45cefdacb8..0000000000 --- a/src/main/java/net/minecraft/server/TileEntityCommandListener.java +++ /dev/null @@ -1,29 +0,0 @@ -package net.minecraft.server; - -// CraftBukkit - package-private -> public -public class TileEntityCommandListener extends CommandBlockListenerAbstract { - - final TileEntityCommand a; - - TileEntityCommandListener(TileEntityCommand tileentitycommand) { - this.a = tileentitycommand; - sender = new org.bukkit.craftbukkit.command.CraftBlockCommandSender(this); // CraftBukkit - add sender - } - - public ChunkCoordinates getChunkCoordinates() { - return new ChunkCoordinates(this.a.x, this.a.y, this.a.z); - } - - public World getWorld() { - return this.a.getWorld(); - } - - public void setCommand(String s) { - super.setCommand(s); - this.a.update(); - } - - public void e() { - this.a.getWorld().notify(this.a.x, this.a.y, this.a.z); - } -} diff --git a/src/main/java/net/minecraft/server/TileEntityDispenser.java b/src/main/java/net/minecraft/server/TileEntityDispenser.java deleted file mode 100644 index 7900b37ebe..0000000000 --- a/src/main/java/net/minecraft/server/TileEntityDispenser.java +++ /dev/null @@ -1,188 +0,0 @@ -package net.minecraft.server; - -import java.util.Random; - -// CraftBukkit start -import java.util.List; - -import org.bukkit.craftbukkit.entity.CraftHumanEntity; -import org.bukkit.entity.HumanEntity; -// CraftBukkit end - -public class TileEntityDispenser extends TileEntity implements IInventory { - - private ItemStack[] items = new ItemStack[9]; - private Random j = new Random(); - protected String a; - - // CraftBukkit start - add fields and methods - public List transaction = new java.util.ArrayList(); - private int maxStack = MAX_STACK; - - public ItemStack[] getContents() { - return this.items; - } - - public void onOpen(CraftHumanEntity who) { - transaction.add(who); - } - - public void onClose(CraftHumanEntity who) { - transaction.remove(who); - } - - public List getViewers() { - return transaction; - } - - public void setMaxStackSize(int size) { - maxStack = size; - } - // CraftBukkit end - - public TileEntityDispenser() {} - - public int getSize() { - return 9; - } - - public ItemStack getItem(int i) { - return this.items[i]; - } - - public ItemStack splitStack(int i, int j) { - if (this.items[i] != null) { - ItemStack itemstack; - - if (this.items[i].count <= j) { - itemstack = this.items[i]; - this.items[i] = null; - this.update(); - return itemstack; - } else { - itemstack = this.items[i].a(j); - if (this.items[i].count == 0) { - this.items[i] = null; - } - - this.update(); - return itemstack; - } - } else { - return null; - } - } - - public ItemStack splitWithoutUpdate(int i) { - if (this.items[i] != null) { - ItemStack itemstack = this.items[i]; - - this.items[i] = null; - return itemstack; - } else { - return null; - } - } - - public int i() { - int i = -1; - int j = 1; - - for (int k = 0; k < this.items.length; ++k) { - if (this.items[k] != null && this.j.nextInt(j++) == 0) { - if (this.items[k].count == 0) continue; // CraftBukkit - i = k; - } - } - - return i; - } - - public void setItem(int i, ItemStack itemstack) { - this.items[i] = itemstack; - if (itemstack != null && itemstack.count > this.getMaxStackSize()) { - itemstack.count = this.getMaxStackSize(); - } - - this.update(); - } - - public int addItem(ItemStack itemstack) { - for (int i = 0; i < this.items.length; ++i) { - if (this.items[i] == null || this.items[i].getItem() == null) { - this.setItem(i, itemstack); - return i; - } - } - - return -1; - } - - public String getInventoryName() { - return this.k_() ? this.a : "container.dispenser"; - } - - public void a(String s) { - this.a = s; - } - - public boolean k_() { - return this.a != null; - } - - public void a(NBTTagCompound nbttagcompound) { - super.a(nbttagcompound); - NBTTagList nbttaglist = nbttagcompound.getList("Items", 10); - - this.items = new ItemStack[this.getSize()]; - - for (int i = 0; i < nbttaglist.size(); ++i) { - NBTTagCompound nbttagcompound1 = nbttaglist.get(i); - int j = nbttagcompound1.getByte("Slot") & 255; - - if (j >= 0 && j < this.items.length) { - this.items[j] = ItemStack.createStack(nbttagcompound1); - } - } - - if (nbttagcompound.hasKeyOfType("CustomName", 8)) { - this.a = nbttagcompound.getString("CustomName"); - } - } - - public void b(NBTTagCompound nbttagcompound) { - super.b(nbttagcompound); - NBTTagList nbttaglist = new NBTTagList(); - - for (int i = 0; i < this.items.length; ++i) { - if (this.items[i] != null) { - NBTTagCompound nbttagcompound1 = new NBTTagCompound(); - - nbttagcompound1.setByte("Slot", (byte) i); - this.items[i].save(nbttagcompound1); - nbttaglist.add(nbttagcompound1); - } - } - - nbttagcompound.set("Items", nbttaglist); - if (this.k_()) { - nbttagcompound.setString("CustomName", this.a); - } - } - - public int getMaxStackSize() { - return maxStack; // CraftBukkit - } - - public boolean a(EntityHuman entityhuman) { - return this.world.getTileEntity(this.x, this.y, this.z) != this ? false : entityhuman.e((double) this.x + 0.5D, (double) this.y + 0.5D, (double) this.z + 0.5D) <= 64.0D; - } - - public void startOpen() {} - - public void closeContainer() {} - - public boolean b(int i, ItemStack itemstack) { - return true; - } -} diff --git a/src/main/java/net/minecraft/server/TileEntityFurnace.java b/src/main/java/net/minecraft/server/TileEntityFurnace.java deleted file mode 100644 index 430fc69c97..0000000000 --- a/src/main/java/net/minecraft/server/TileEntityFurnace.java +++ /dev/null @@ -1,343 +0,0 @@ -package net.minecraft.server; - -// CraftBukkit start -import java.util.List; - -import org.bukkit.craftbukkit.inventory.CraftItemStack; -import org.bukkit.entity.HumanEntity; -import org.bukkit.event.inventory.FurnaceBurnEvent; -import org.bukkit.event.inventory.FurnaceSmeltEvent; -import org.bukkit.craftbukkit.entity.CraftHumanEntity; -// CraftBukkit end - -public class TileEntityFurnace extends TileEntity implements IWorldInventory { - - private static final int[] k = new int[] { 0}; - private static final int[] l = new int[] { 2, 1}; - private static final int[] m = new int[] { 1}; - private ItemStack[] items = new ItemStack[3]; - public int burnTime; - public int ticksForCurrentFuel; - public int cookTime; - private String o; - - // CraftBukkit start - add fields and methods - private int lastTick = MinecraftServer.currentTick; - private int maxStack = MAX_STACK; - public List transaction = new java.util.ArrayList(); - - public ItemStack[] getContents() { - return this.items; - } - - public void onOpen(CraftHumanEntity who) { - transaction.add(who); - } - - public void onClose(CraftHumanEntity who) { - transaction.remove(who); - } - - public List getViewers() { - return transaction; - } - - public void setMaxStackSize(int size) { - maxStack = size; - } - // CraftBukkit end - - public TileEntityFurnace() {} - - public int getSize() { - return this.items.length; - } - - public ItemStack getItem(int i) { - return this.items[i]; - } - - public ItemStack splitStack(int i, int j) { - if (this.items[i] != null) { - ItemStack itemstack; - - if (this.items[i].count <= j) { - itemstack = this.items[i]; - this.items[i] = null; - return itemstack; - } else { - itemstack = this.items[i].a(j); - if (this.items[i].count == 0) { - this.items[i] = null; - } - - return itemstack; - } - } else { - return null; - } - } - - public ItemStack splitWithoutUpdate(int i) { - if (this.items[i] != null) { - ItemStack itemstack = this.items[i]; - - this.items[i] = null; - return itemstack; - } else { - return null; - } - } - - public void setItem(int i, ItemStack itemstack) { - this.items[i] = itemstack; - if (itemstack != null && itemstack.count > this.getMaxStackSize()) { - itemstack.count = this.getMaxStackSize(); - } - } - - public String getInventoryName() { - return this.k_() ? this.o : "container.furnace"; - } - - public boolean k_() { - return this.o != null && this.o.length() > 0; - } - - public void a(String s) { - this.o = s; - } - - public void a(NBTTagCompound nbttagcompound) { - super.a(nbttagcompound); - NBTTagList nbttaglist = nbttagcompound.getList("Items", 10); - - this.items = new ItemStack[this.getSize()]; - - for (int i = 0; i < nbttaglist.size(); ++i) { - NBTTagCompound nbttagcompound1 = nbttaglist.get(i); - byte b0 = nbttagcompound1.getByte("Slot"); - - if (b0 >= 0 && b0 < this.items.length) { - this.items[b0] = ItemStack.createStack(nbttagcompound1); - } - } - - this.burnTime = nbttagcompound.getShort("BurnTime"); - this.cookTime = nbttagcompound.getShort("CookTime"); - this.ticksForCurrentFuel = fuelTime(this.items[1]); - if (nbttagcompound.hasKeyOfType("CustomName", 8)) { - this.o = nbttagcompound.getString("CustomName"); - } - } - - public void b(NBTTagCompound nbttagcompound) { - super.b(nbttagcompound); - nbttagcompound.setShort("BurnTime", (short) this.burnTime); - nbttagcompound.setShort("CookTime", (short) this.cookTime); - NBTTagList nbttaglist = new NBTTagList(); - - for (int i = 0; i < this.items.length; ++i) { - if (this.items[i] != null) { - NBTTagCompound nbttagcompound1 = new NBTTagCompound(); - - nbttagcompound1.setByte("Slot", (byte) i); - this.items[i].save(nbttagcompound1); - nbttaglist.add(nbttagcompound1); - } - } - - nbttagcompound.set("Items", nbttaglist); - if (this.k_()) { - nbttagcompound.setString("CustomName", this.o); - } - } - - public int getMaxStackSize() { - return maxStack; // CraftBukkit - } - - public boolean isBurning() { - return this.burnTime > 0; - } - - public void h() { - boolean flag = this.burnTime > 0; - boolean flag1 = false; - - // CraftBukkit start - Use wall time instead of ticks for cooking - int elapsedTicks = MinecraftServer.currentTick - this.lastTick; - this.lastTick = MinecraftServer.currentTick; - - // CraftBukkit - moved from below - if (this.isBurning() && this.canBurn()) { - this.cookTime += elapsedTicks; - if (this.cookTime >= 200) { - this.cookTime %= 200; - this.burn(); - flag1 = true; - } - } else { - this.cookTime = 0; - } - // CraftBukkit end - - if (this.burnTime > 0) { - this.burnTime -= elapsedTicks; // CraftBukkit - use elapsedTicks in place of constant - } - - if (!this.world.isStatic) { - if (this.burnTime != 0 || this.items[1] != null && this.items[0] != null) { - // CraftBukkit start - Handle multiple elapsed ticks - if (this.burnTime <= 0 && this.canBurn()) { // CraftBukkit - == to <= - CraftItemStack fuel = CraftItemStack.asCraftMirror(this.items[1]); - - FurnaceBurnEvent furnaceBurnEvent = new FurnaceBurnEvent(this.world.getWorld().getBlockAt(this.x, this.y, this.z), fuel, fuelTime(this.items[1])); - this.world.getServer().getPluginManager().callEvent(furnaceBurnEvent); - - if (furnaceBurnEvent.isCancelled()) { - return; - } - - this.ticksForCurrentFuel = furnaceBurnEvent.getBurnTime(); - this.burnTime += this.ticksForCurrentFuel; - if (this.burnTime > 0 && furnaceBurnEvent.isBurning()) { - // CraftBukkit end - flag1 = true; - if (this.items[1] != null) { - --this.items[1].count; - if (this.items[1].count == 0) { - Item item = this.items[1].getItem().t(); - - this.items[1] = item != null ? new ItemStack(item) : null; - } - } - } - } - - /* CraftBukkit start - Moved up - if (this.isBurning() && this.canBurn()) { - ++this.cookTime; - if (this.cookTime == 200) { - this.cookTime = 0; - this.burn(); - flag1 = true; - } - } else { - this.cookTime = 0; - } - */ - } - - if (flag != this.burnTime > 0) { - flag1 = true; - BlockFurnace.a(this.burnTime > 0, this.world, this.x, this.y, this.z); - } - } - - if (flag1) { - this.update(); - } - } - - private boolean canBurn() { - if (this.items[0] == null) { - return false; - } else { - ItemStack itemstack = RecipesFurnace.getInstance().getResult(this.items[0]); - - // CraftBukkit - consider resultant count instead of current count - return itemstack == null ? false : (this.items[2] == null ? true : (!this.items[2].doMaterialsMatch(itemstack) ? false : (this.items[2].count + itemstack.count <= this.getMaxStackSize() && this.items[2].count < this.items[2].getMaxStackSize() ? true : this.items[2].count + itemstack.count <= itemstack.getMaxStackSize()))); - } - } - - public void burn() { - if (this.canBurn()) { - ItemStack itemstack = RecipesFurnace.getInstance().getResult(this.items[0]); - - // CraftBukkit start - fire FurnaceSmeltEvent - CraftItemStack source = CraftItemStack.asCraftMirror(this.items[0]); - org.bukkit.inventory.ItemStack result = CraftItemStack.asBukkitCopy(itemstack); - - FurnaceSmeltEvent furnaceSmeltEvent = new FurnaceSmeltEvent(this.world.getWorld().getBlockAt(this.x, this.y, this.z), source, result); - this.world.getServer().getPluginManager().callEvent(furnaceSmeltEvent); - - if (furnaceSmeltEvent.isCancelled()) { - return; - } - - result = furnaceSmeltEvent.getResult(); - itemstack = CraftItemStack.asNMSCopy(result); - - if (itemstack != null) { - if (this.items[2] == null) { - this.items[2] = itemstack; - } else if (CraftItemStack.asCraftMirror(this.items[2]).isSimilar(result)) { - this.items[2].count += itemstack.count; - } else { - return; - } - } - // CraftBukkit end - - --this.items[0].count; - if (this.items[0].count <= 0) { - this.items[0] = null; - } - } - } - - public static int fuelTime(ItemStack itemstack) { - if (itemstack == null) { - return 0; - } else { - Item item = itemstack.getItem(); - - if (item instanceof ItemBlock && Block.a(item) != Blocks.AIR) { - Block block = Block.a(item); - - if (block == Blocks.WOOD_STEP) { - return 150; - } - - if (block.getMaterial() == Material.WOOD) { - return 300; - } - - if (block == Blocks.COAL_BLOCK) { - return 16000; - } - } - - return item instanceof ItemTool && ((ItemTool) item).j().equals("WOOD") ? 200 : (item instanceof ItemSword && ((ItemSword) item).j().equals("WOOD") ? 200 : (item instanceof ItemHoe && ((ItemHoe) item).i().equals("WOOD") ? 200 : (item == Items.STICK ? 100 : (item == Items.COAL ? 1600 : (item == Items.LAVA_BUCKET ? 20000 : (item == Item.getItemOf(Blocks.SAPLING) ? 100 : (item == Items.BLAZE_ROD ? 2400 : 0))))))); - } - } - - public static boolean isFuel(ItemStack itemstack) { - return fuelTime(itemstack) > 0; - } - - public boolean a(EntityHuman entityhuman) { - return this.world.getTileEntity(this.x, this.y, this.z) != this ? false : entityhuman.e((double) this.x + 0.5D, (double) this.y + 0.5D, (double) this.z + 0.5D) <= 64.0D; - } - - public void startOpen() {} - - public void closeContainer() {} - - public boolean b(int i, ItemStack itemstack) { - return i == 2 ? false : (i == 1 ? isFuel(itemstack) : true); - } - - public int[] getSlotsForFace(int i) { - return i == 0 ? l : (i == 1 ? k : m); - } - - public boolean canPlaceItemThroughFace(int i, ItemStack itemstack, int j) { - return this.b(i, itemstack); - } - - public boolean canTakeItemThroughFace(int i, ItemStack itemstack, int j) { - return j != 0 || i != 1 || itemstack.getItem() == Items.BUCKET; - } -} diff --git a/src/main/java/net/minecraft/server/TileEntityHopper.java b/src/main/java/net/minecraft/server/TileEntityHopper.java deleted file mode 100644 index ebdf08e715..0000000000 --- a/src/main/java/net/minecraft/server/TileEntityHopper.java +++ /dev/null @@ -1,584 +0,0 @@ -package net.minecraft.server; - -import java.util.List; - -// CraftBukkit start -import org.bukkit.craftbukkit.entity.CraftHumanEntity; -import org.bukkit.craftbukkit.inventory.CraftItemStack; -import org.bukkit.entity.HumanEntity; -import org.bukkit.event.inventory.InventoryMoveItemEvent; -import org.bukkit.event.inventory.InventoryPickupItemEvent; -import org.bukkit.inventory.Inventory; -// CraftBukkit end - -public class TileEntityHopper extends TileEntity implements IHopper { - - private ItemStack[] a = new ItemStack[5]; - private String i; - private int j = -1; - - // CraftBukkit start - add fields and methods - public List transaction = new java.util.ArrayList(); - private int maxStack = MAX_STACK; - - public ItemStack[] getContents() { - return this.a; - } - - public void onOpen(CraftHumanEntity who) { - transaction.add(who); - } - - public void onClose(CraftHumanEntity who) { - transaction.remove(who); - } - - public List getViewers() { - return transaction; - } - - public void setMaxStackSize(int size) { - maxStack = size; - } - // CraftBukkit end - - public TileEntityHopper() {} - - public void a(NBTTagCompound nbttagcompound) { - super.a(nbttagcompound); - NBTTagList nbttaglist = nbttagcompound.getList("Items", 10); - - this.a = new ItemStack[this.getSize()]; - if (nbttagcompound.hasKeyOfType("CustomName", 8)) { - this.i = nbttagcompound.getString("CustomName"); - } - - this.j = nbttagcompound.getInt("TransferCooldown"); - - for (int i = 0; i < nbttaglist.size(); ++i) { - NBTTagCompound nbttagcompound1 = nbttaglist.get(i); - byte b0 = nbttagcompound1.getByte("Slot"); - - if (b0 >= 0 && b0 < this.a.length) { - this.a[b0] = ItemStack.createStack(nbttagcompound1); - } - } - } - - public void b(NBTTagCompound nbttagcompound) { - super.b(nbttagcompound); - NBTTagList nbttaglist = new NBTTagList(); - - for (int i = 0; i < this.a.length; ++i) { - if (this.a[i] != null) { - NBTTagCompound nbttagcompound1 = new NBTTagCompound(); - - nbttagcompound1.setByte("Slot", (byte) i); - this.a[i].save(nbttagcompound1); - nbttaglist.add(nbttagcompound1); - } - } - - nbttagcompound.set("Items", nbttaglist); - nbttagcompound.setInt("TransferCooldown", this.j); - if (this.k_()) { - nbttagcompound.setString("CustomName", this.i); - } - } - - public void update() { - super.update(); - } - - public int getSize() { - return this.a.length; - } - - public ItemStack getItem(int i) { - return this.a[i]; - } - - public ItemStack splitStack(int i, int j) { - if (this.a[i] != null) { - ItemStack itemstack; - - if (this.a[i].count <= j) { - itemstack = this.a[i]; - this.a[i] = null; - return itemstack; - } else { - itemstack = this.a[i].a(j); - if (this.a[i].count == 0) { - this.a[i] = null; - } - - return itemstack; - } - } else { - return null; - } - } - - public ItemStack splitWithoutUpdate(int i) { - if (this.a[i] != null) { - ItemStack itemstack = this.a[i]; - - this.a[i] = null; - return itemstack; - } else { - return null; - } - } - - public void setItem(int i, ItemStack itemstack) { - this.a[i] = itemstack; - if (itemstack != null && itemstack.count > this.getMaxStackSize()) { - itemstack.count = this.getMaxStackSize(); - } - } - - public String getInventoryName() { - return this.k_() ? this.i : "container.hopper"; - } - - public boolean k_() { - return this.i != null && this.i.length() > 0; - } - - public void a(String s) { - this.i = s; - } - - public int getMaxStackSize() { - return maxStack; // CraftBukkit - } - - public boolean a(EntityHuman entityhuman) { - return this.world.getTileEntity(this.x, this.y, this.z) != this ? false : entityhuman.e((double) this.x + 0.5D, (double) this.y + 0.5D, (double) this.z + 0.5D) <= 64.0D; - } - - public void startOpen() {} - - public void closeContainer() {} - - public boolean b(int i, ItemStack itemstack) { - return true; - } - - public void h() { - if (this.world != null && !this.world.isStatic) { - --this.j; - if (!this.j()) { - this.c(0); - this.i(); - } - } - } - - public boolean i() { - if (this.world != null && !this.world.isStatic) { - if (!this.j() && BlockHopper.c(this.p())) { - boolean flag = false; - - if (!this.k()) { - flag = this.y(); - } - - if (!this.l()) { - flag = suckInItems(this) || flag; - } - - if (flag) { - this.c(8); - this.update(); - return true; - } - } - - return false; - } else { - return false; - } - } - - private boolean k() { - ItemStack[] aitemstack = this.a; - int i = aitemstack.length; - - for (int j = 0; j < i; ++j) { - ItemStack itemstack = aitemstack[j]; - - if (itemstack != null) { - return false; - } - } - - return true; - } - - private boolean l() { - ItemStack[] aitemstack = this.a; - int i = aitemstack.length; - - for (int j = 0; j < i; ++j) { - ItemStack itemstack = aitemstack[j]; - - if (itemstack == null || itemstack.count != itemstack.getMaxStackSize()) { - return false; - } - } - - return true; - } - - private boolean y() { - IInventory iinventory = this.z(); - - if (iinventory == null) { - return false; - } else { - int i = Facing.OPPOSITE_FACING[BlockHopper.b(this.p())]; - - if (this.a(iinventory, i)) { - return false; - } else { - for (int j = 0; j < this.getSize(); ++j) { - if (this.getItem(j) != null) { - ItemStack itemstack = this.getItem(j).cloneItemStack(); - // CraftBukkit start - Call event when pushing items into other inventories - CraftItemStack oitemstack = CraftItemStack.asCraftMirror(this.splitStack(j, 1)); - - Inventory destinationInventory; - // Have to special case large chests as they work oddly - if (iinventory instanceof InventoryLargeChest) { - destinationInventory = new org.bukkit.craftbukkit.inventory.CraftInventoryDoubleChest((InventoryLargeChest) iinventory); - } else { - destinationInventory = iinventory.getOwner().getInventory(); - } - - InventoryMoveItemEvent event = new InventoryMoveItemEvent(this.getOwner().getInventory(), oitemstack.clone(), destinationInventory, true); - this.getWorld().getServer().getPluginManager().callEvent(event); - if (event.isCancelled()) { - this.setItem(j, itemstack); - this.c(8); // Delay hopper checks - return false; - } - ItemStack itemstack1 = addItem(iinventory, CraftItemStack.asNMSCopy(event.getItem()), i); - - if (itemstack1 == null || itemstack1.count == 0) { - if (event.getItem().equals(oitemstack)) { - iinventory.update(); - } else { - this.setItem(j, itemstack); - } - // CraftBukkit end - return true; - } - - this.setItem(j, itemstack); - } - } - - return false; - } - } - } - - private boolean a(IInventory iinventory, int i) { - if (iinventory instanceof IWorldInventory && i > -1) { - IWorldInventory iworldinventory = (IWorldInventory) iinventory; - int[] aint = iworldinventory.getSlotsForFace(i); - - for (int j = 0; j < aint.length; ++j) { - ItemStack itemstack = iworldinventory.getItem(aint[j]); - - if (itemstack == null || itemstack.count != itemstack.getMaxStackSize()) { - return false; - } - } - } else { - int k = iinventory.getSize(); - - for (int l = 0; l < k; ++l) { - ItemStack itemstack1 = iinventory.getItem(l); - - if (itemstack1 == null || itemstack1.count != itemstack1.getMaxStackSize()) { - return false; - } - } - } - - return true; - } - - private static boolean b(IInventory iinventory, int i) { - if (iinventory instanceof IWorldInventory && i > -1) { - IWorldInventory iworldinventory = (IWorldInventory) iinventory; - int[] aint = iworldinventory.getSlotsForFace(i); - - for (int j = 0; j < aint.length; ++j) { - if (iworldinventory.getItem(aint[j]) != null) { - return false; - } - } - } else { - int k = iinventory.getSize(); - - for (int l = 0; l < k; ++l) { - if (iinventory.getItem(l) != null) { - return false; - } - } - } - - return true; - } - - public static boolean suckInItems(IHopper ihopper) { - IInventory iinventory = getSourceInventory(ihopper); - - if (iinventory != null) { - byte b0 = 0; - - if (b(iinventory, b0)) { - return false; - } - - if (iinventory instanceof IWorldInventory && b0 > -1) { - IWorldInventory iworldinventory = (IWorldInventory) iinventory; - int[] aint = iworldinventory.getSlotsForFace(b0); - - for (int i = 0; i < aint.length; ++i) { - if (tryTakeInItemFromSlot(ihopper, iinventory, aint[i], b0)) { - return true; - } - } - } else { - int j = iinventory.getSize(); - - for (int k = 0; k < j; ++k) { - if (tryTakeInItemFromSlot(ihopper, iinventory, k, b0)) { - return true; - } - } - } - } else { - EntityItem entityitem = getEntityItemAt(ihopper.getWorld(), ihopper.x(), ihopper.aD() + 1.0D, ihopper.aE()); - - if (entityitem != null) { - return addEntityItem(ihopper, entityitem); - } - } - - return false; - } - - private static boolean tryTakeInItemFromSlot(IHopper ihopper, IInventory iinventory, int i, int j) { - ItemStack itemstack = iinventory.getItem(i); - - if (itemstack != null && canTakeItemFromInventory(iinventory, itemstack, i, j)) { - ItemStack itemstack1 = itemstack.cloneItemStack(); - // CraftBukkit start - Call event on collection of items from inventories into the hopper - CraftItemStack oitemstack = CraftItemStack.asCraftMirror(iinventory.splitStack(i, 1)); - - Inventory sourceInventory; - // Have to special case large chests as they work oddly - if (iinventory instanceof InventoryLargeChest) { - sourceInventory = new org.bukkit.craftbukkit.inventory.CraftInventoryDoubleChest((InventoryLargeChest) iinventory); - } else { - sourceInventory = iinventory.getOwner().getInventory(); - } - - InventoryMoveItemEvent event = new InventoryMoveItemEvent(sourceInventory, oitemstack.clone(), ihopper.getOwner().getInventory(), false); - - ihopper.getWorld().getServer().getPluginManager().callEvent(event); - if (event.isCancelled()) { - iinventory.setItem(i, itemstack1); - - if (ihopper instanceof TileEntityHopper) { - ((TileEntityHopper) ihopper).c(8); // Delay hopper checks - } else if (ihopper instanceof EntityMinecartHopper) { - ((EntityMinecartHopper) ihopper).l(4); // Delay hopper minecart checks - } - - return false; - } - ItemStack itemstack2 = addItem(ihopper, CraftItemStack.asNMSCopy(event.getItem()), -1); - - if (itemstack2 == null || itemstack2.count == 0) { - if (event.getItem().equals(oitemstack)) { - iinventory.update(); - } else { - iinventory.setItem(i, itemstack1); - } - // CraftBukkit end - - return true; - } - - iinventory.setItem(i, itemstack1); - } - - return false; - } - - public static boolean addEntityItem(IInventory iinventory, EntityItem entityitem) { - boolean flag = false; - - if (entityitem == null) { - return false; - } else { - // CraftBukkit start - InventoryPickupItemEvent event = new InventoryPickupItemEvent(iinventory.getOwner().getInventory(), (org.bukkit.entity.Item) entityitem.getBukkitEntity()); - entityitem.world.getServer().getPluginManager().callEvent(event); - if (event.isCancelled()) { - return false; - } - // CraftBukkit end - - ItemStack itemstack = entityitem.getItemStack().cloneItemStack(); - ItemStack itemstack1 = addItem(iinventory, itemstack, -1); - - if (itemstack1 != null && itemstack1.count != 0) { - entityitem.setItemStack(itemstack1); - } else { - flag = true; - entityitem.die(); - } - - return flag; - } - } - - public static ItemStack addItem(IInventory iinventory, ItemStack itemstack, int i) { - if (iinventory instanceof IWorldInventory && i > -1) { - IWorldInventory iworldinventory = (IWorldInventory) iinventory; - int[] aint = iworldinventory.getSlotsForFace(i); - - for (int j = 0; j < aint.length && itemstack != null && itemstack.count > 0; ++j) { - itemstack = tryMoveInItem(iinventory, itemstack, aint[j], i); - } - } else { - int k = iinventory.getSize(); - - for (int l = 0; l < k && itemstack != null && itemstack.count > 0; ++l) { - itemstack = tryMoveInItem(iinventory, itemstack, l, i); - } - } - - if (itemstack != null && itemstack.count == 0) { - itemstack = null; - } - - return itemstack; - } - - private static boolean canPlaceItemInInventory(IInventory iinventory, ItemStack itemstack, int i, int j) { - return !iinventory.b(i, itemstack) ? false : !(iinventory instanceof IWorldInventory) || ((IWorldInventory) iinventory).canPlaceItemThroughFace(i, itemstack, j); - } - - private static boolean canTakeItemFromInventory(IInventory iinventory, ItemStack itemstack, int i, int j) { - return !(iinventory instanceof IWorldInventory) || ((IWorldInventory) iinventory).canTakeItemThroughFace(i, itemstack, j); - } - - private static ItemStack tryMoveInItem(IInventory iinventory, ItemStack itemstack, int i, int j) { - ItemStack itemstack1 = iinventory.getItem(i); - - if (canPlaceItemInInventory(iinventory, itemstack, i, j)) { - boolean flag = false; - - if (itemstack1 == null) { - iinventory.setItem(i, itemstack); - itemstack = null; - flag = true; - } else if (canMergeItems(itemstack1, itemstack)) { - int k = itemstack.getMaxStackSize() - itemstack1.count; - int l = Math.min(itemstack.count, k); - - itemstack.count -= l; - itemstack1.count += l; - flag = l > 0; - } - - if (flag) { - if (iinventory instanceof TileEntityHopper) { - ((TileEntityHopper) iinventory).c(8); - iinventory.update(); - } - - iinventory.update(); - } - } - - return itemstack; - } - - private IInventory z() { - int i = BlockHopper.b(this.p()); - - return getInventoryAt(this.getWorld(), (double) (this.x + Facing.b[i]), (double) (this.y + Facing.c[i]), (double) (this.z + Facing.d[i])); - } - - public static IInventory getSourceInventory(IHopper ihopper) { - return getInventoryAt(ihopper.getWorld(), ihopper.x(), ihopper.aD() + 1.0D, ihopper.aE()); - } - - public static EntityItem getEntityItemAt(World world, double d0, double d1, double d2) { - List list = world.a(EntityItem.class, AxisAlignedBB.a(d0, d1, d2, d0 + 1.0D, d1 + 1.0D, d2 + 1.0D), IEntitySelector.a); - - return list.size() > 0 ? (EntityItem) list.get(0) : null; - } - - public static IInventory getInventoryAt(World world, double d0, double d1, double d2) { - IInventory iinventory = null; - int i = MathHelper.floor(d0); - int j = MathHelper.floor(d1); - int k = MathHelper.floor(d2); - TileEntity tileentity = world.getTileEntity(i, j, k); - - if (tileentity != null && tileentity instanceof IInventory) { - iinventory = (IInventory) tileentity; - if (iinventory instanceof TileEntityChest) { - Block block = world.getType(i, j, k); - - if (block instanceof BlockChest) { - iinventory = ((BlockChest) block).m(world, i, j, k); - } - } - } - - if (iinventory == null) { - List list = world.getEntities((Entity) null, AxisAlignedBB.a(d0, d1, d2, d0 + 1.0D, d1 + 1.0D, d2 + 1.0D), IEntitySelector.c); - - if (list != null && list.size() > 0) { - iinventory = (IInventory) list.get(world.random.nextInt(list.size())); - } - } - - return iinventory; - } - - private static boolean canMergeItems(ItemStack itemstack, ItemStack itemstack1) { - return itemstack.getItem() != itemstack1.getItem() ? false : (itemstack.getData() != itemstack1.getData() ? false : (itemstack.count > itemstack.getMaxStackSize() ? false : ItemStack.equals(itemstack, itemstack1))); - } - - public double x() { - return (double) this.x; - } - - public double aD() { - return (double) this.y; - } - - public double aE() { - return (double) this.z; - } - - public void c(int i) { - this.j = i; - } - - public boolean j() { - return this.j > 0; - } -} diff --git a/src/main/java/net/minecraft/server/TileEntityNote.java b/src/main/java/net/minecraft/server/TileEntityNote.java deleted file mode 100644 index aa02038935..0000000000 --- a/src/main/java/net/minecraft/server/TileEntityNote.java +++ /dev/null @@ -1,61 +0,0 @@ -package net.minecraft.server; - -public class TileEntityNote extends TileEntity { - - public byte note; - public boolean i; - - public TileEntityNote() {} - - public void b(NBTTagCompound nbttagcompound) { - super.b(nbttagcompound); - nbttagcompound.setByte("note", this.note); - } - - public void a(NBTTagCompound nbttagcompound) { - super.a(nbttagcompound); - this.note = nbttagcompound.getByte("note"); - if (this.note < 0) { - this.note = 0; - } - - if (this.note > 24) { - this.note = 24; - } - } - - public void a() { - this.note = (byte) ((this.note + 1) % 25); - this.update(); - } - - public void play(World world, int i, int j, int k) { - if (world.getType(i, j + 1, k).getMaterial() == Material.AIR) { - Material material = world.getType(i, j - 1, k).getMaterial(); - byte b0 = 0; - - if (material == Material.STONE) { - b0 = 1; - } - - if (material == Material.SAND) { - b0 = 2; - } - - if (material == Material.SHATTERABLE) { - b0 = 3; - } - - if (material == Material.WOOD) { - b0 = 4; - } - - // CraftBukkit start - org.bukkit.event.block.NotePlayEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callNotePlayEvent(this.world, i, j, k, b0, this.note); - if (!event.isCancelled()) { - this.world.playBlockAction(i, j, k, Blocks.NOTE_BLOCK, event.getInstrument().getType(), event.getNote().getId()); - } - // CraftBukkit end - } - } -} diff --git a/src/main/java/net/minecraft/server/TileEntityPiston.java b/src/main/java/net/minecraft/server/TileEntityPiston.java deleted file mode 100644 index 69fe247bc6..0000000000 --- a/src/main/java/net/minecraft/server/TileEntityPiston.java +++ /dev/null @@ -1,132 +0,0 @@ -package net.minecraft.server; - -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; - -public class TileEntityPiston extends TileEntity { - - private Block a; - private int i; - private int j; - private boolean k; - private boolean l; - private float m; - private float n; - private List o = new ArrayList(); - - public TileEntityPiston() {} - - public TileEntityPiston(Block block, int i, int j, boolean flag, boolean flag1) { - this.a = block; - this.i = i; - this.j = j; - this.k = flag; - this.l = flag1; - } - - public Block a() { - return this.a; - } - - public int p() { - return this.i; - } - - public boolean b() { - return this.k; - } - - public int c() { - return this.j; - } - - public float a(float f) { - if (f > 1.0F) { - f = 1.0F; - } - - return this.n + (this.m - this.n) * f; - } - - private void a(float f, float f1) { - if (this.k) { - f = 1.0F - f; - } else { - --f; - } - - AxisAlignedBB axisalignedbb = Blocks.PISTON_MOVING.a(this.world, this.x, this.y, this.z, this.a, f, this.j); - - if (axisalignedbb != null) { - List list = this.world.getEntities((Entity) null, axisalignedbb); - - if (!list.isEmpty()) { - this.o.addAll(list); - Iterator iterator = this.o.iterator(); - - while (iterator.hasNext()) { - Entity entity = (Entity) iterator.next(); - - entity.move((double) (f1 * (float) Facing.b[this.j]), (double) (f1 * (float) Facing.c[this.j]), (double) (f1 * (float) Facing.d[this.j])); - } - - this.o.clear(); - } - } - } - - public void f() { - if (this.n < 1.0F && this.world != null) { - this.n = this.m = 1.0F; - this.world.p(this.x, this.y, this.z); - this.s(); - if (this.world.getType(this.x, this.y, this.z) == Blocks.PISTON_MOVING) { - this.world.setTypeAndData(this.x, this.y, this.z, this.a, this.i, 3); - this.world.e(this.x, this.y, this.z, this.a); - } - } - } - - public void h() { - if (this.world == null) return; // CraftBukkit - - this.n = this.m; - if (this.n >= 1.0F) { - this.a(1.0F, 0.25F); - this.world.p(this.x, this.y, this.z); - this.s(); - if (this.world.getType(this.x, this.y, this.z) == Blocks.PISTON_MOVING) { - this.world.setTypeAndData(this.x, this.y, this.z, this.a, this.i, 3); - this.world.e(this.x, this.y, this.z, this.a); - } - } else { - this.m += 0.5F; - if (this.m >= 1.0F) { - this.m = 1.0F; - } - - if (this.k) { - this.a(this.m, this.m - this.n + 0.0625F); - } - } - } - - public void a(NBTTagCompound nbttagcompound) { - super.a(nbttagcompound); - this.a = Block.getById(nbttagcompound.getInt("blockId")); - this.i = nbttagcompound.getInt("blockData"); - this.j = nbttagcompound.getInt("facing"); - this.n = this.m = nbttagcompound.getFloat("progress"); - this.k = nbttagcompound.getBoolean("extending"); - } - - public void b(NBTTagCompound nbttagcompound) { - super.b(nbttagcompound); - nbttagcompound.setInt("blockId", Block.getId(this.a)); - nbttagcompound.setInt("blockData", this.i); - nbttagcompound.setInt("facing", this.j); - nbttagcompound.setFloat("progress", this.n); - nbttagcompound.setBoolean("extending", this.k); - } -} diff --git a/src/main/java/net/minecraft/server/TileEntityRecordPlayer.java b/src/main/java/net/minecraft/server/TileEntityRecordPlayer.java deleted file mode 100644 index 8abeac4988..0000000000 --- a/src/main/java/net/minecraft/server/TileEntityRecordPlayer.java +++ /dev/null @@ -1,40 +0,0 @@ -package net.minecraft.server; - -public class TileEntityRecordPlayer extends TileEntity { - - private ItemStack record; - - public TileEntityRecordPlayer() {} - - public void a(NBTTagCompound nbttagcompound) { - super.a(nbttagcompound); - if (nbttagcompound.hasKeyOfType("RecordItem", 10)) { - this.setRecord(ItemStack.createStack(nbttagcompound.getCompound("RecordItem"))); - } else if (nbttagcompound.getInt("Record") > 0) { - this.setRecord(new ItemStack(Item.getById(nbttagcompound.getInt("Record")), 1, 0)); - } - } - - public void b(NBTTagCompound nbttagcompound) { - super.b(nbttagcompound); - if (this.getRecord() != null) { - nbttagcompound.set("RecordItem", this.getRecord().save(new NBTTagCompound())); - nbttagcompound.setInt("Record", Item.getId(this.getRecord().getItem())); - } - } - - public ItemStack getRecord() { - return this.record; - } - - public void setRecord(ItemStack itemstack) { - // CraftBukkit start - There can only be one - if (itemstack != null) { - itemstack.count = 1; - } - // CraftBukkit end - - this.record = itemstack; - this.update(); - } -} diff --git a/src/main/java/net/minecraft/server/TileEntitySign.java b/src/main/java/net/minecraft/server/TileEntitySign.java deleted file mode 100644 index 552919c4c5..0000000000 --- a/src/main/java/net/minecraft/server/TileEntitySign.java +++ /dev/null @@ -1,63 +0,0 @@ -package net.minecraft.server; - -public class TileEntitySign extends TileEntity { - - public String[] lines = new String[] { "", "", "", ""}; - public int i = -1; - public boolean isEditable = true; // CraftBukkit - private -> public - private EntityHuman k; - - public TileEntitySign() {} - - public void b(NBTTagCompound nbttagcompound) { - super.b(nbttagcompound); - nbttagcompound.setString("Text1", this.lines[0]); - nbttagcompound.setString("Text2", this.lines[1]); - nbttagcompound.setString("Text3", this.lines[2]); - nbttagcompound.setString("Text4", this.lines[3]); - } - - public void a(NBTTagCompound nbttagcompound) { - this.isEditable = false; - super.a(nbttagcompound); - - for (int i = 0; i < 4; ++i) { - this.lines[i] = nbttagcompound.getString("Text" + (i + 1)); - if (this.lines[i].length() > 15) { - this.lines[i] = this.lines[i].substring(0, 15); - } - } - } - - public Packet getUpdatePacket() { - String[] astring = sanitizeLines(this.lines); // CraftBukkit - call sign line sanitizer to limit line length - - return new PacketPlayOutUpdateSign(this.x, this.y, this.z, astring); - } - - public boolean a() { - return this.isEditable; - } - - public void a(EntityHuman entityhuman) { - this.k = entityhuman; - } - - public EntityHuman b() { - return this.k; - } - - // CraftBukkit start - central method to limit sign text to 15 chars per line - public static String[] sanitizeLines(String[] lines) { - String[] astring = new String[4]; - for (int i = 0; i < 4; ++i) { - astring[i] = lines[i]; - - if (lines[i].length() > 15) { - astring[i] = lines[i].substring(0, 15); - } - } - return astring; - } - // CraftBukkit end -} diff --git a/src/main/java/net/minecraft/server/TileEntitySkull.java b/src/main/java/net/minecraft/server/TileEntitySkull.java deleted file mode 100644 index 7c3757fb60..0000000000 --- a/src/main/java/net/minecraft/server/TileEntitySkull.java +++ /dev/null @@ -1,97 +0,0 @@ -package net.minecraft.server; - -import java.util.UUID; - -import net.minecraft.util.com.google.common.collect.Iterables; -import net.minecraft.util.com.mojang.authlib.GameProfile; -import net.minecraft.util.com.mojang.authlib.properties.Property; - -public class TileEntitySkull extends TileEntity { - - private int a; - private int i; - private GameProfile j = null; - - public TileEntitySkull() {} - - public void b(NBTTagCompound nbttagcompound) { - super.b(nbttagcompound); - nbttagcompound.setByte("SkullType", (byte) (this.a & 255)); - nbttagcompound.setByte("Rot", (byte) (this.i & 255)); - if (this.j != null) { - NBTTagCompound nbttagcompound1 = new NBTTagCompound(); - - GameProfileSerializer.serialize(nbttagcompound1, this.j); - nbttagcompound.set("Owner", nbttagcompound1); - } - } - - public void a(NBTTagCompound nbttagcompound) { - super.a(nbttagcompound); - this.a = nbttagcompound.getByte("SkullType"); - this.i = nbttagcompound.getByte("Rot"); - if (this.a == 3) { - if (nbttagcompound.hasKeyOfType("Owner", 10)) { - this.j = GameProfileSerializer.deserialize(nbttagcompound.getCompound("Owner")); - } else if (nbttagcompound.hasKeyOfType("ExtraType", 8) && !UtilColor.b(nbttagcompound.getString("ExtraType"))) { - this.j = new GameProfile((UUID) null, nbttagcompound.getString("ExtraType")); - this.d(); - } - } - } - - public GameProfile getGameProfile() { - return this.j; - } - - public Packet getUpdatePacket() { - NBTTagCompound nbttagcompound = new NBTTagCompound(); - - this.b(nbttagcompound); - return new PacketPlayOutTileEntityData(this.x, this.y, this.z, 4, nbttagcompound); - } - - public void setSkullType(int i) { - this.a = i; - this.j = null; - } - - public void setGameProfile(GameProfile gameprofile) { - this.a = 3; - this.j = gameprofile; - this.d(); - } - - private void d() { - if (this.j != null && !UtilColor.b(this.j.getName())) { - if (!this.j.isComplete() || !this.j.getProperties().containsKey("textures")) { - GameProfile gameprofile = MinecraftServer.getServer().getUserCache().getProfile(this.j.getName()); - - if (gameprofile != null) { - Property property = (Property) Iterables.getFirst(gameprofile.getProperties().get("textures"), null); - - if (property == null) { - gameprofile = MinecraftServer.getServer().av().fillProfileProperties(gameprofile, true); - } - - this.j = gameprofile; - this.update(); - } - } - } - } - - public int getSkullType() { - return this.a; - } - - public void setRotation(int i) { - this.i = i; - } - - // CraftBukkit start - add method - public int getRotation() { - return this.i; - } - // CraftBukkit end -} diff --git a/src/main/java/net/minecraft/server/Village.java b/src/main/java/net/minecraft/server/Village.java deleted file mode 100644 index 89f1b74e7f..0000000000 --- a/src/main/java/net/minecraft/server/Village.java +++ /dev/null @@ -1,446 +0,0 @@ -package net.minecraft.server; - -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; -import java.util.TreeMap; - -public class Village { - - private World world; - private final List doors = new ArrayList(); - private final ChunkCoordinates c = new ChunkCoordinates(0, 0, 0); - private final ChunkCoordinates center = new ChunkCoordinates(0, 0, 0); - private int size; - private int f; - private int time; - private int population; - private int noBreedTicks; - private TreeMap playerStandings = new TreeMap(); - private List aggressors = new ArrayList(); - private int ironGolemCount; - - public Village() {} - - public Village(World world) { - this.world = world; - } - - public void a(World world) { - this.world = world; - } - - public void tick(int i) { - this.time = i; - this.m(); - this.l(); - if (i % 20 == 0) { - this.k(); - } - - if (i % 30 == 0) { - this.countPopulation(); - } - - int j = this.population / 10; - - if (this.ironGolemCount < j && this.doors.size() > 20 && this.world.random.nextInt(7000) == 0) { - Vec3D vec3d = this.a(MathHelper.d((float) this.center.x), MathHelper.d((float) this.center.y), MathHelper.d((float) this.center.z), 2, 4, 2); - - if (vec3d != null) { - EntityIronGolem entityirongolem = new EntityIronGolem(this.world); - - entityirongolem.setPosition(vec3d.a, vec3d.b, vec3d.c); - this.world.addEntity(entityirongolem, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.VILLAGE_DEFENSE); // CraftBukkit - ++this.ironGolemCount; - } - } - } - - private Vec3D a(int i, int j, int k, int l, int i1, int j1) { - for (int k1 = 0; k1 < 10; ++k1) { - int l1 = i + this.world.random.nextInt(16) - 8; - int i2 = j + this.world.random.nextInt(6) - 3; - int j2 = k + this.world.random.nextInt(16) - 8; - - if (this.a(l1, i2, j2) && this.b(l1, i2, j2, l, i1, j1)) { - return Vec3D.a((double) l1, (double) i2, (double) j2); - } - } - - return null; - } - - private boolean b(int i, int j, int k, int l, int i1, int j1) { - if (!World.a((IBlockAccess) this.world, i, j - 1, k)) { - return false; - } else { - int k1 = i - l / 2; - int l1 = k - j1 / 2; - - for (int i2 = k1; i2 < k1 + l; ++i2) { - for (int j2 = j; j2 < j + i1; ++j2) { - for (int k2 = l1; k2 < l1 + j1; ++k2) { - if (this.world.getType(i2, j2, k2).r()) { - return false; - } - } - } - } - - return true; - } - } - - private void countPopulation() { - List list = this.world.a(EntityIronGolem.class, AxisAlignedBB.a((double) (this.center.x - this.size), (double) (this.center.y - 4), (double) (this.center.z - this.size), (double) (this.center.x + this.size), (double) (this.center.y + 4), (double) (this.center.z + this.size))); - - this.ironGolemCount = list.size(); - } - - private void k() { - List list = this.world.a(EntityVillager.class, AxisAlignedBB.a((double) (this.center.x - this.size), (double) (this.center.y - 4), (double) (this.center.z - this.size), (double) (this.center.x + this.size), (double) (this.center.y + 4), (double) (this.center.z + this.size))); - - this.population = list.size(); - if (this.population == 0) { - this.playerStandings.clear(); - } - } - - public ChunkCoordinates getCenter() { - return this.center; - } - - public int getSize() { - return this.size; - } - - public int getDoorCount() { - return this.doors.size(); - } - - public int d() { - return this.time - this.f; - } - - public int getPopulationCount() { - return this.population; - } - - public boolean a(int i, int j, int k) { - return this.center.e(i, j, k) < (float) (this.size * this.size); - } - - public List getDoors() { - return this.doors; - } - - public VillageDoor b(int i, int j, int k) { - VillageDoor villagedoor = null; - int l = Integer.MAX_VALUE; - Iterator iterator = this.doors.iterator(); - - while (iterator.hasNext()) { - VillageDoor villagedoor1 = (VillageDoor) iterator.next(); - int i1 = villagedoor1.b(i, j, k); - - if (i1 < l) { - villagedoor = villagedoor1; - l = i1; - } - } - - return villagedoor; - } - - public VillageDoor c(int i, int j, int k) { - VillageDoor villagedoor = null; - int l = Integer.MAX_VALUE; - Iterator iterator = this.doors.iterator(); - - while (iterator.hasNext()) { - VillageDoor villagedoor1 = (VillageDoor) iterator.next(); - int i1 = villagedoor1.b(i, j, k); - - if (i1 > 256) { - i1 *= 1000; - } else { - i1 = villagedoor1.f(); - } - - if (i1 < l) { - villagedoor = villagedoor1; - l = i1; - } - } - - return villagedoor; - } - - public VillageDoor e(int i, int j, int k) { - if (this.center.e(i, j, k) > (float) (this.size * this.size)) { - return null; - } else { - Iterator iterator = this.doors.iterator(); - - VillageDoor villagedoor; - - do { - if (!iterator.hasNext()) { - return null; - } - - villagedoor = (VillageDoor) iterator.next(); - } while (villagedoor.locX != i || villagedoor.locZ != k || Math.abs(villagedoor.locY - j) > 1); - - return villagedoor; - } - } - - public void addDoor(VillageDoor villagedoor) { - this.doors.add(villagedoor); - this.c.x += villagedoor.locX; - this.c.y += villagedoor.locY; - this.c.z += villagedoor.locZ; - this.n(); - this.f = villagedoor.addedTime; - } - - public boolean isAbandoned() { - return this.doors.isEmpty(); - } - - public void a(EntityLiving entityliving) { - Iterator iterator = this.aggressors.iterator(); - - VillageAggressor villageaggressor; - - do { - if (!iterator.hasNext()) { - this.aggressors.add(new VillageAggressor(this, entityliving, this.time)); - return; - } - - villageaggressor = (VillageAggressor) iterator.next(); - } while (villageaggressor.a != entityliving); - - villageaggressor.b = this.time; - } - - public EntityLiving b(EntityLiving entityliving) { - double d0 = Double.MAX_VALUE; - VillageAggressor villageaggressor = null; - - for (int i = 0; i < this.aggressors.size(); ++i) { - VillageAggressor villageaggressor1 = (VillageAggressor) this.aggressors.get(i); - double d1 = villageaggressor1.a.f(entityliving); - - if (d1 <= d0) { - villageaggressor = villageaggressor1; - d0 = d1; - } - } - - return villageaggressor != null ? villageaggressor.a : null; - } - - public EntityHuman c(EntityLiving entityliving) { - double d0 = Double.MAX_VALUE; - EntityHuman entityhuman = null; - Iterator iterator = this.playerStandings.keySet().iterator(); - - while (iterator.hasNext()) { - String s = (String) iterator.next(); - - if (this.d(s)) { - EntityHuman entityhuman1 = this.world.a(s); - - if (entityhuman1 != null) { - double d1 = entityhuman1.f(entityliving); - - if (d1 <= d0) { - entityhuman = entityhuman1; - d0 = d1; - } - } - } - } - - return entityhuman; - } - - private void l() { - Iterator iterator = this.aggressors.iterator(); - - while (iterator.hasNext()) { - VillageAggressor villageaggressor = (VillageAggressor) iterator.next(); - - if (!villageaggressor.a.isAlive() || Math.abs(this.time - villageaggressor.b) > 300) { - iterator.remove(); - } - } - } - - private void m() { - boolean flag = false; - boolean flag1 = this.world.random.nextInt(50) == 0; - Iterator iterator = this.doors.iterator(); - - while (iterator.hasNext()) { - VillageDoor villagedoor = (VillageDoor) iterator.next(); - - if (flag1) { - villagedoor.d(); - } - - if (!this.isDoor(villagedoor.locX, villagedoor.locY, villagedoor.locZ) || Math.abs(this.time - villagedoor.addedTime) > 1200) { - this.c.x -= villagedoor.locX; - this.c.y -= villagedoor.locY; - this.c.z -= villagedoor.locZ; - flag = true; - villagedoor.removed = true; - iterator.remove(); - } - } - - if (flag) { - this.n(); - } - } - - private boolean isDoor(int i, int j, int k) { - return this.world.getType(i, j, k) == Blocks.WOODEN_DOOR; - } - - private void n() { - int i = this.doors.size(); - - if (i == 0) { - this.center.b(0, 0, 0); - this.size = 0; - } else { - this.center.b(this.c.x / i, this.c.y / i, this.c.z / i); - int j = 0; - - VillageDoor villagedoor; - - for (Iterator iterator = this.doors.iterator(); iterator.hasNext(); j = Math.max(villagedoor.b(this.center.x, this.center.y, this.center.z), j)) { - villagedoor = (VillageDoor) iterator.next(); - } - - this.size = Math.max(32, (int) Math.sqrt((double) j) + 1); - } - } - - public int a(String s) { - Integer integer = (Integer) this.playerStandings.get(s); - - return integer != null ? integer.intValue() : 0; - } - - public int a(String s, int i) { - int j = this.a(s); - int k = MathHelper.a(j + i, -30, 10); - - this.playerStandings.put(s, Integer.valueOf(k)); - return k; - } - - public boolean d(String s) { - return this.a(s) <= -15; - } - - public void a(NBTTagCompound nbttagcompound) { - this.population = nbttagcompound.getInt("PopSize"); - this.size = nbttagcompound.getInt("Radius"); - this.ironGolemCount = nbttagcompound.getInt("Golems"); - this.f = nbttagcompound.getInt("Stable"); - this.time = nbttagcompound.getInt("Tick"); - this.noBreedTicks = nbttagcompound.getInt("MTick"); - this.center.x = nbttagcompound.getInt("CX"); - this.center.y = nbttagcompound.getInt("CY"); - this.center.z = nbttagcompound.getInt("CZ"); - this.c.x = nbttagcompound.getInt("ACX"); - this.c.y = nbttagcompound.getInt("ACY"); - this.c.z = nbttagcompound.getInt("ACZ"); - NBTTagList nbttaglist = nbttagcompound.getList("Doors", 10); - - for (int i = 0; i < nbttaglist.size(); ++i) { - NBTTagCompound nbttagcompound1 = nbttaglist.get(i); - VillageDoor villagedoor = new VillageDoor(nbttagcompound1.getInt("X"), nbttagcompound1.getInt("Y"), nbttagcompound1.getInt("Z"), nbttagcompound1.getInt("IDX"), nbttagcompound1.getInt("IDZ"), nbttagcompound1.getInt("TS")); - - this.doors.add(villagedoor); - } - - NBTTagList nbttaglist1 = nbttagcompound.getList("Players", 10); - - for (int j = 0; j < nbttaglist1.size(); ++j) { - NBTTagCompound nbttagcompound2 = nbttaglist1.get(j); - - this.playerStandings.put(nbttagcompound2.getString("Name"), Integer.valueOf(nbttagcompound2.getInt("S"))); - } - } - - public void b(NBTTagCompound nbttagcompound) { - nbttagcompound.setInt("PopSize", this.population); - nbttagcompound.setInt("Radius", this.size); - nbttagcompound.setInt("Golems", this.ironGolemCount); - nbttagcompound.setInt("Stable", this.f); - nbttagcompound.setInt("Tick", this.time); - nbttagcompound.setInt("MTick", this.noBreedTicks); - nbttagcompound.setInt("CX", this.center.x); - nbttagcompound.setInt("CY", this.center.y); - nbttagcompound.setInt("CZ", this.center.z); - nbttagcompound.setInt("ACX", this.c.x); - nbttagcompound.setInt("ACY", this.c.y); - nbttagcompound.setInt("ACZ", this.c.z); - NBTTagList nbttaglist = new NBTTagList(); - Iterator iterator = this.doors.iterator(); - - while (iterator.hasNext()) { - VillageDoor villagedoor = (VillageDoor) iterator.next(); - NBTTagCompound nbttagcompound1 = new NBTTagCompound(); - - nbttagcompound1.setInt("X", villagedoor.locX); - nbttagcompound1.setInt("Y", villagedoor.locY); - nbttagcompound1.setInt("Z", villagedoor.locZ); - nbttagcompound1.setInt("IDX", villagedoor.d); - nbttagcompound1.setInt("IDZ", villagedoor.e); - nbttagcompound1.setInt("TS", villagedoor.addedTime); - nbttaglist.add(nbttagcompound1); - } - - nbttagcompound.set("Doors", nbttaglist); - NBTTagList nbttaglist1 = new NBTTagList(); - Iterator iterator1 = this.playerStandings.keySet().iterator(); - - while (iterator1.hasNext()) { - String s = (String) iterator1.next(); - NBTTagCompound nbttagcompound2 = new NBTTagCompound(); - - nbttagcompound2.setString("Name", s); - nbttagcompound2.setInt("S", ((Integer) this.playerStandings.get(s)).intValue()); - nbttaglist1.add(nbttagcompound2); - } - - nbttagcompound.set("Players", nbttaglist1); - } - - public void h() { - this.noBreedTicks = this.time; - } - - public boolean i() { - return this.noBreedTicks == 0 || this.time - this.noBreedTicks >= 3600; - } - - public void b(int i) { - Iterator iterator = this.playerStandings.keySet().iterator(); - - while (iterator.hasNext()) { - String s = (String) iterator.next(); - - this.a(s, i); - } - } -} diff --git a/src/main/java/net/minecraft/server/VillageSiege.java b/src/main/java/net/minecraft/server/VillageSiege.java deleted file mode 100644 index 93e1a1ed1d..0000000000 --- a/src/main/java/net/minecraft/server/VillageSiege.java +++ /dev/null @@ -1,172 +0,0 @@ -package net.minecraft.server; - -import java.util.Iterator; -import java.util.List; - -public class VillageSiege { - - private World world; - private boolean b; - private int c = -1; - private int d; - private int e; - private Village f; - private int g; - private int h; - private int i; - - public VillageSiege(World world) { - this.world = world; - } - - public void a() { - boolean flag = false; - - if (flag) { - if (this.c == 2) { - this.d = 100; - return; - } - } else { - if (this.world.w()) { - this.c = 0; - return; - } - - if (this.c == 2) { - return; - } - - if (this.c == 0) { - float f = this.world.c(0.0F); - - if ((double) f < 0.5D || (double) f > 0.501D) { - return; - } - - this.c = this.world.random.nextInt(10) == 0 ? 1 : 2; - this.b = false; - if (this.c == 2) { - return; - } - } - } - - if (!this.b) { - if (!this.b()) { - return; - } - - this.b = true; - } - - if (this.e > 0) { - --this.e; - } else { - this.e = 2; - if (this.d > 0) { - this.c(); - --this.d; - } else { - this.c = 2; - } - } - } - - private boolean b() { - List list = this.world.players; - Iterator iterator = list.iterator(); - - while (iterator.hasNext()) { - EntityHuman entityhuman = (EntityHuman) iterator.next(); - - this.f = this.world.villages.getClosestVillage((int) entityhuman.locX, (int) entityhuman.locY, (int) entityhuman.locZ, 1); - if (this.f != null && this.f.getDoorCount() >= 10 && this.f.d() >= 20 && this.f.getPopulationCount() >= 20) { - ChunkCoordinates chunkcoordinates = this.f.getCenter(); - float f = (float) this.f.getSize(); - boolean flag = false; - int i = 0; - - while (true) { - if (i < 10) { - this.g = chunkcoordinates.x + (int) ((double) (MathHelper.cos(this.world.random.nextFloat() * 3.1415927F * 2.0F) * f) * 0.9D); - this.h = chunkcoordinates.y; - this.i = chunkcoordinates.z + (int) ((double) (MathHelper.sin(this.world.random.nextFloat() * 3.1415927F * 2.0F) * f) * 0.9D); - flag = false; - Iterator iterator1 = this.world.villages.getVillages().iterator(); - - while (iterator1.hasNext()) { - Village village = (Village) iterator1.next(); - - if (village != this.f && village.a(this.g, this.h, this.i)) { - flag = true; - break; - } - } - - if (flag) { - ++i; - continue; - } - } - - if (flag) { - return false; - } - - Vec3D vec3d = this.a(this.g, this.h, this.i); - - if (vec3d != null) { - this.e = 0; - this.d = 20; - return true; - } - break; - } - } - } - - return false; - } - - private boolean c() { - Vec3D vec3d = this.a(this.g, this.h, this.i); - - if (vec3d == null) { - return false; - } else { - EntityZombie entityzombie; - - try { - entityzombie = new EntityZombie(this.world); - entityzombie.prepare((GroupDataEntity) null); - entityzombie.setVillager(false); - } catch (Exception exception) { - exception.printStackTrace(); - return false; - } - - entityzombie.setPositionRotation(vec3d.a, vec3d.b, vec3d.c, this.world.random.nextFloat() * 360.0F, 0.0F); - this.world.addEntity(entityzombie, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.VILLAGE_INVASION); // CraftBukkit - ChunkCoordinates chunkcoordinates = this.f.getCenter(); - - entityzombie.a(chunkcoordinates.x, chunkcoordinates.y, chunkcoordinates.z, this.f.getSize()); - return true; - } - } - - private Vec3D a(int i, int j, int k) { - for (int l = 0; l < 10; ++l) { - int i1 = i + this.world.random.nextInt(16) - 8; - int j1 = j + this.world.random.nextInt(6) - 3; - int k1 = k + this.world.random.nextInt(16) - 8; - - if (this.f.a(i1, j1, k1) && SpawnerCreature.a(EnumCreatureType.MONSTER, this.world, i1, j1, k1)) { - // CraftBukkit - add Return - return Vec3D.a((double) i1, (double) j1, (double) k1); - } - } - - return null; - } -} diff --git a/src/main/java/net/minecraft/server/World.java b/src/main/java/net/minecraft/server/World.java deleted file mode 100644 index 08c506cef2..0000000000 --- a/src/main/java/net/minecraft/server/World.java +++ /dev/null @@ -1,2873 +0,0 @@ -package net.minecraft.server; - -import java.util.ArrayList; -import java.util.Calendar; -import java.util.Collection; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Random; -import java.util.Set; -import java.util.UUID; -import java.util.concurrent.Callable; - -// CraftBukkit start -import org.bukkit.Bukkit; -import org.bukkit.block.BlockState; -import org.bukkit.craftbukkit.util.CraftMagicNumbers; -import org.bukkit.craftbukkit.util.LongHashSet; -import org.bukkit.generator.ChunkGenerator; -import org.bukkit.craftbukkit.CraftServer; -import org.bukkit.craftbukkit.CraftWorld; -import org.bukkit.craftbukkit.event.CraftEventFactory; -import org.bukkit.event.block.BlockCanBuildEvent; -import org.bukkit.event.block.BlockPhysicsEvent; -import org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason; -import org.bukkit.event.weather.WeatherChangeEvent; -import org.bukkit.event.weather.ThunderChangeEvent; -// CraftBukkit end - -public abstract class World implements IBlockAccess { - - public boolean d; - public List entityList = new ArrayList(); - protected List f = new ArrayList(); - public Set tileEntityList = new HashSet(); // CraftBukkit - ArrayList -> HashSet - private List a = new ArrayList(); - private List b = new ArrayList(); - public List players = new ArrayList(); - public List i = new ArrayList(); - private long c = 16777215L; - public int j; - protected int k = (new Random()).nextInt(); - protected final int l = 1013904223; - protected float m; - protected float n; - protected float o; - protected float p; - public int q; - public EnumDifficulty difficulty; - public Random random = new Random(); - public WorldProvider worldProvider; // CraftBukkit - remove final - protected List u = new ArrayList(); - public IChunkProvider chunkProvider; // CraftBukkit - public - protected final IDataManager dataManager; - public WorldData worldData; // CraftBukkit - public - public boolean isLoading; - public PersistentCollection worldMaps; - public final PersistentVillage villages; - protected final VillageSiege siegeManager = new VillageSiege(this); - public final MethodProfiler methodProfiler; - private final Calendar J = Calendar.getInstance(); - public Scoreboard scoreboard = new Scoreboard(); // CraftBukkit - protected -> public - public boolean isStatic; - // CraftBukkit start - public, longhashset - protected LongHashSet chunkTickList = new LongHashSet(); - private int K; - public boolean allowMonsters; - public boolean allowAnimals; - // Added the following - public boolean captureBlockStates = false; - public boolean captureTreeGeneration = false; - public ArrayList capturedBlockStates= new ArrayList(); - public long ticksPerAnimalSpawns; - public long ticksPerMonsterSpawns; - public boolean populating; - private int tickPosition; - // CraftBukkit end - private ArrayList L; - private boolean M; - int[] I; - - public BiomeBase getBiome(int i, int j) { - if (this.isLoaded(i, 0, j)) { - Chunk chunk = this.getChunkAtWorldCoords(i, j); - - try { - return chunk.getBiome(i & 15, j & 15, this.worldProvider.e); - } catch (Throwable throwable) { - CrashReport crashreport = CrashReport.a(throwable, "Getting biome"); - CrashReportSystemDetails crashreportsystemdetails = crashreport.a("Coordinates of biome request"); - - crashreportsystemdetails.a("Location", (Callable) (new CrashReportWorldLocation(this, i, j))); - throw new ReportedException(crashreport); - } - } else { - return this.worldProvider.e.getBiome(i, j); - } - } - - public WorldChunkManager getWorldChunkManager() { - return this.worldProvider.e; - } - - // CraftBukkit start - private final CraftWorld world; - public boolean pvpMode; - public boolean keepSpawnInMemory = true; - public ChunkGenerator generator; - - public CraftWorld getWorld() { - return this.world; - } - - public CraftServer getServer() { - return (CraftServer) Bukkit.getServer(); - } - - public Chunk getChunkIfLoaded(int x, int z) { - return ((ChunkProviderServer) this.chunkProvider).getChunkIfLoaded(x, z); - } - - // Changed signature - added gen and env - public World(IDataManager idatamanager, String s, WorldSettings worldsettings, WorldProvider worldprovider, MethodProfiler methodprofiler, ChunkGenerator gen, org.bukkit.World.Environment env) { - this.generator = gen; - this.world = new CraftWorld((WorldServer) this, gen, env); - this.ticksPerAnimalSpawns = this.getServer().getTicksPerAnimalSpawns(); // CraftBukkit - this.ticksPerMonsterSpawns = this.getServer().getTicksPerMonsterSpawns(); // CraftBukkit - // CraftBukkit end - - this.K = this.random.nextInt(12000); - this.allowMonsters = true; - this.allowAnimals = true; - this.L = new ArrayList(); - this.I = new int['\u8000']; - this.dataManager = idatamanager; - this.methodProfiler = methodprofiler; - this.worldMaps = new PersistentCollection(idatamanager); - this.worldData = idatamanager.getWorldData(); - if (worldprovider != null) { - this.worldProvider = worldprovider; - } else if (this.worldData != null && this.worldData.j() != 0) { - this.worldProvider = WorldProvider.byDimension(this.worldData.j()); - } else { - this.worldProvider = WorldProvider.byDimension(0); - } - - if (this.worldData == null) { - this.worldData = new WorldData(worldsettings, s); - } else { - this.worldData.setName(s); - } - - this.worldProvider.a(this); - this.chunkProvider = this.j(); - if (!this.worldData.isInitialized()) { - try { - this.a(worldsettings); - } catch (Throwable throwable) { - CrashReport crashreport = CrashReport.a(throwable, "Exception initializing level"); - - try { - this.a(crashreport); - } catch (Throwable throwable1) { - ; - } - - throw new ReportedException(crashreport); - } - - this.worldData.d(true); - } - - PersistentVillage persistentvillage = (PersistentVillage) this.worldMaps.get(PersistentVillage.class, "villages"); - - if (persistentvillage == null) { - this.villages = new PersistentVillage(this); - this.worldMaps.a("villages", this.villages); - } else { - this.villages = persistentvillage; - this.villages.a(this); - } - - this.B(); - this.a(); - - this.getServer().addWorld(this.world); // CraftBukkit - } - - protected abstract IChunkProvider j(); - - protected void a(WorldSettings worldsettings) { - this.worldData.d(true); - } - - public Block b(int i, int j) { - int k; - - for (k = 63; !this.isEmpty(i, k + 1, j); ++k) { - ; - } - - return this.getType(i, k, j); - } - - public Block getType(int i, int j, int k) { - // CraftBukkit start - tree generation - if (captureTreeGeneration) { - Iterator it = capturedBlockStates.iterator(); - while (it.hasNext()) { - BlockState previous = it.next(); - if (previous.getX() == i && previous.getY() == j && previous.getZ() == k) { - return CraftMagicNumbers.getBlock(previous.getTypeId()); - } - } - } - // CraftBukkit end - if (i >= -30000000 && k >= -30000000 && i < 30000000 && k < 30000000 && j >= 0 && j < 256) { - Chunk chunk = null; - - try { - chunk = this.getChunkAt(i >> 4, k >> 4); - return chunk.getType(i & 15, j, k & 15); - } catch (Throwable throwable) { - CrashReport crashreport = CrashReport.a(throwable, "Exception getting block type in world"); - CrashReportSystemDetails crashreportsystemdetails = crashreport.a("Requested block coordinates"); - - crashreportsystemdetails.a("Found chunk", Boolean.valueOf(chunk == null)); - crashreportsystemdetails.a("Location", CrashReportSystemDetails.a(i, j, k)); - throw new ReportedException(crashreport); - } - } else { - return Blocks.AIR; - } - } - - public boolean isEmpty(int i, int j, int k) { - return this.getType(i, j, k).getMaterial() == Material.AIR; - } - - public boolean isLoaded(int i, int j, int k) { - return j >= 0 && j < 256 ? this.isChunkLoaded(i >> 4, k >> 4) : false; - } - - public boolean areChunksLoaded(int i, int j, int k, int l) { - return this.b(i - l, j - l, k - l, i + l, j + l, k + l); - } - - public boolean b(int i, int j, int k, int l, int i1, int j1) { - if (i1 >= 0 && j < 256) { - i >>= 4; - k >>= 4; - l >>= 4; - j1 >>= 4; - - for (int k1 = i; k1 <= l; ++k1) { - for (int l1 = k; l1 <= j1; ++l1) { - if (!this.isChunkLoaded(k1, l1)) { - return false; - } - } - } - - return true; - } else { - return false; - } - } - - protected boolean isChunkLoaded(int i, int j) { - return this.chunkProvider.isChunkLoaded(i, j); - } - - public Chunk getChunkAtWorldCoords(int i, int j) { - return this.getChunkAt(i >> 4, j >> 4); - } - - public Chunk getChunkAt(int i, int j) { - return this.chunkProvider.getOrCreateChunk(i, j); - } - - public boolean setTypeAndData(int i, int j, int k, Block block, int l, int i1) { - // CraftBukkit start - tree generation - if (this.captureTreeGeneration) { - BlockState blockstate = null; - Iterator it = capturedBlockStates.iterator(); - while (it.hasNext()) { - BlockState previous = it.next(); - if (previous.getX() == i && previous.getY() == j && previous.getZ() == k) { - blockstate = previous; - it.remove(); - break; - } - } - if (blockstate == null) { - blockstate = org.bukkit.craftbukkit.block.CraftBlockState.getBlockState(this, i, j, k, i1); - } - blockstate.setTypeId(CraftMagicNumbers.getId(block)); - blockstate.setRawData((byte) l); - this.capturedBlockStates.add(blockstate); - return true; - } - if (i >= -30000000 && k >= -30000000 && i < 30000000 && k < 30000000) { - if (j < 0) { - return false; - } else if (j >= 256) { - return false; - } else { - Chunk chunk = this.getChunkAt(i >> 4, k >> 4); - Block block1 = null; - - if ((i1 & 1) != 0) { - block1 = chunk.getType(i & 15, j, k & 15); - } - - // CraftBukkit start - capture blockstates - BlockState blockstate = null; - if (this.captureBlockStates) { - blockstate = org.bukkit.craftbukkit.block.CraftBlockState.getBlockState(this, i, j, k, i1); - this.capturedBlockStates.add(blockstate); - } - // CraftBukkit end - - boolean flag = chunk.a(i & 15, j, k & 15, block, l); - - // CraftBukkit start - remove blockstate if failed - if (!flag && this.captureBlockStates) { - this.capturedBlockStates.remove(blockstate); - } - // CraftBukkit end - - this.methodProfiler.a("checkLight"); - this.t(i, j, k); - this.methodProfiler.b(); - // CraftBukkit start - if (flag && !this.captureBlockStates) { // Don't notify clients or update physics while capturing blockstates - // Modularize client and physic updates - this.notifyAndUpdatePhysics(i, j, k, chunk, block1, block, i1); - // CraftBukkit end - } - - return flag; - } - } else { - return false; - } - } - - // CraftBukkit start - Split off from original setTypeAndData(int i, int j, int k, Block block, int l, int i1) method in order to directly send client and physic updates - public void notifyAndUpdatePhysics(int i, int j, int k, Chunk chunk, Block oldBlock, Block newBlock, int flag) - { - // should be isReady() - if ((flag & 2) != 0 && (chunk == null || chunk.isReady())) { // allow chunk to be null here as chunk.isReady() is false when we send our notification during block placement - this.notify(i, j, k); - } - - if ((flag & 1) != 0) { - this.update(i, j, k, oldBlock); - if (newBlock.isComplexRedstone()) { - this.updateAdjacentComparators(i, j, k, newBlock); - } - } - } - // CraftBukkit end - - public int getData(int i, int j, int k) { - // CraftBukkit start - tree generation - if (captureTreeGeneration) { - Iterator it = capturedBlockStates.iterator(); - while (it.hasNext()) { - BlockState previous = it.next(); - if (previous.getX() == i && previous.getY() == j && previous.getZ() == k) { - return previous.getRawData(); - } - } - } - // CraftBukkit end - if (i >= -30000000 && k >= -30000000 && i < 30000000 && k < 30000000) { - if (j < 0) { - return 0; - } else if (j >= 256) { - return 0; - } else { - Chunk chunk = this.getChunkAt(i >> 4, k >> 4); - - i &= 15; - k &= 15; - return chunk.getData(i, j, k); - } - } else { - return 0; - } - } - - public boolean setData(int i, int j, int k, int l, int i1) { - // CraftBukkit start - tree generation - if (this.captureTreeGeneration) { - BlockState blockstate = null; - Iterator it = capturedBlockStates.iterator(); - while (it.hasNext()) { - BlockState previous = it.next(); - if (previous.getX() == i && previous.getY() == j && previous.getZ() == k) { - blockstate = previous; - it.remove(); - break; - } - } - if (blockstate == null) { - blockstate = org.bukkit.craftbukkit.block.CraftBlockState.getBlockState(this, i, j, k, i1); - } - blockstate.setRawData((byte) l); - this.capturedBlockStates.add(blockstate); - return true; - } - // CraftBukkit end - if (i >= -30000000 && k >= -30000000 && i < 30000000 && k < 30000000) { - if (j < 0) { - return false; - } else if (j >= 256) { - return false; - } else { - Chunk chunk = this.getChunkAt(i >> 4, k >> 4); - int j1 = i & 15; - int k1 = k & 15; - boolean flag = chunk.a(j1, j, k1, l); - - if (flag) { - Block block = chunk.getType(j1, j, k1); - - if ((i1 & 2) != 0 && (!this.isStatic || (i1 & 4) == 0) && chunk.isReady()) { - this.notify(i, j, k); - } - - if (!this.isStatic && (i1 & 1) != 0) { - this.update(i, j, k, block); - if (block.isComplexRedstone()) { - this.updateAdjacentComparators(i, j, k, block); - } - } - } - - return flag; - } - } else { - return false; - } - } - - public boolean setAir(int i, int j, int k) { - return this.setTypeAndData(i, j, k, Blocks.AIR, 0, 3); - } - - public boolean setAir(int i, int j, int k, boolean flag) { - Block block = this.getType(i, j, k); - - if (block.getMaterial() == Material.AIR) { - return false; - } else { - int l = this.getData(i, j, k); - - this.triggerEffect(2001, i, j, k, Block.getId(block) + (l << 12)); - if (flag) { - block.b(this, i, j, k, l, 0); - } - - return this.setTypeAndData(i, j, k, Blocks.AIR, 0, 3); - } - } - - public boolean setTypeUpdate(int i, int j, int k, Block block) { - return this.setTypeAndData(i, j, k, block, 0, 3); - } - - public void notify(int i, int j, int k) { - for (int l = 0; l < this.u.size(); ++l) { - ((IWorldAccess) this.u.get(l)).a(i, j, k); - } - } - - public void update(int i, int j, int k, Block block) { - // CraftBukkit start - if (this.populating) { - return; - } - // CraftBukkit end - this.applyPhysics(i, j, k, block); - } - - public void b(int i, int j, int k, int l) { - int i1; - - if (k > l) { - i1 = l; - l = k; - k = i1; - } - - if (!this.worldProvider.g) { - for (i1 = k; i1 <= l; ++i1) { - this.c(EnumSkyBlock.SKY, i, i1, j); - } - } - - this.c(i, k, j, i, l, j); - } - - public void c(int i, int j, int k, int l, int i1, int j1) { - for (int k1 = 0; k1 < this.u.size(); ++k1) { - ((IWorldAccess) this.u.get(k1)).a(i, j, k, l, i1, j1); - } - } - - public void applyPhysics(int i, int j, int k, Block block) { - this.e(i - 1, j, k, block); - this.e(i + 1, j, k, block); - this.e(i, j - 1, k, block); - this.e(i, j + 1, k, block); - this.e(i, j, k - 1, block); - this.e(i, j, k + 1, block); - } - - public void b(int i, int j, int k, Block block, int l) { - if (l != 4) { - this.e(i - 1, j, k, block); - } - - if (l != 5) { - this.e(i + 1, j, k, block); - } - - if (l != 0) { - this.e(i, j - 1, k, block); - } - - if (l != 1) { - this.e(i, j + 1, k, block); - } - - if (l != 2) { - this.e(i, j, k - 1, block); - } - - if (l != 3) { - this.e(i, j, k + 1, block); - } - } - - public void e(int i, int j, int k, Block block) { - if (!this.isStatic) { - Block block1 = this.getType(i, j, k); - - try { - // CraftBukkit start - CraftWorld world = ((WorldServer) this).getWorld(); - if (world != null) { - BlockPhysicsEvent event = new BlockPhysicsEvent(world.getBlockAt(i, j, k), CraftMagicNumbers.getId(block)); - this.getServer().getPluginManager().callEvent(event); - - if (event.isCancelled()) { - return; - } - } - // CraftBukkit end - - block1.doPhysics(this, i, j, k, block); - } catch (Throwable throwable) { - CrashReport crashreport = CrashReport.a(throwable, "Exception while updating neighbours"); - CrashReportSystemDetails crashreportsystemdetails = crashreport.a("Block being updated"); - - int l; - - try { - l = this.getData(i, j, k); - } catch (Throwable throwable1) { - l = -1; - } - - crashreportsystemdetails.a("Source block type", (Callable) (new CrashReportSourceBlockType(this, block))); - CrashReportSystemDetails.a(crashreportsystemdetails, i, j, k, block1, l); - throw new ReportedException(crashreport); - } - } - } - - public boolean a(int i, int j, int k, Block block) { - return false; - } - - public boolean i(int i, int j, int k) { - return this.getChunkAt(i >> 4, k >> 4).d(i & 15, j, k & 15); - } - - public int j(int i, int j, int k) { - if (j < 0) { - return 0; - } else { - if (j >= 256) { - j = 255; - } - - return this.getChunkAt(i >> 4, k >> 4).b(i & 15, j, k & 15, 0); - } - } - - public int getLightLevel(int i, int j, int k) { - return this.b(i, j, k, true); - } - - public int b(int i, int j, int k, boolean flag) { - if (i >= -30000000 && k >= -30000000 && i < 30000000 && k < 30000000) { - if (flag && this.getType(i, j, k).n()) { - int l = this.b(i, j + 1, k, false); - int i1 = this.b(i + 1, j, k, false); - int j1 = this.b(i - 1, j, k, false); - int k1 = this.b(i, j, k + 1, false); - int l1 = this.b(i, j, k - 1, false); - - if (i1 > l) { - l = i1; - } - - if (j1 > l) { - l = j1; - } - - if (k1 > l) { - l = k1; - } - - if (l1 > l) { - l = l1; - } - - return l; - } else if (j < 0) { - return 0; - } else { - if (j >= 256) { - j = 255; - } - - Chunk chunk = this.getChunkAt(i >> 4, k >> 4); - - i &= 15; - k &= 15; - return chunk.b(i, j, k, this.j); - } - } else { - return 15; - } - } - - public int getHighestBlockYAt(int i, int j) { - if (i >= -30000000 && j >= -30000000 && i < 30000000 && j < 30000000) { - if (!this.isChunkLoaded(i >> 4, j >> 4)) { - return 0; - } else { - Chunk chunk = this.getChunkAt(i >> 4, j >> 4); - - return chunk.b(i & 15, j & 15); - } - } else { - return 64; - } - } - - public int g(int i, int j) { - if (i >= -30000000 && j >= -30000000 && i < 30000000 && j < 30000000) { - if (!this.isChunkLoaded(i >> 4, j >> 4)) { - return 0; - } else { - Chunk chunk = this.getChunkAt(i >> 4, j >> 4); - - return chunk.r; - } - } else { - return 64; - } - } - - public int b(EnumSkyBlock enumskyblock, int i, int j, int k) { - if (j < 0) { - j = 0; - } - - if (j >= 256) { - j = 255; - } - - if (i >= -30000000 && k >= -30000000 && i < 30000000 && k < 30000000) { - int l = i >> 4; - int i1 = k >> 4; - - if (!this.isChunkLoaded(l, i1)) { - return enumskyblock.c; - } else { - Chunk chunk = this.getChunkAt(l, i1); - - return chunk.getBrightness(enumskyblock, i & 15, j, k & 15); - } - } else { - return enumskyblock.c; - } - } - - public void b(EnumSkyBlock enumskyblock, int i, int j, int k, int l) { - if (i >= -30000000 && k >= -30000000 && i < 30000000 && k < 30000000) { - if (j >= 0) { - if (j < 256) { - if (this.isChunkLoaded(i >> 4, k >> 4)) { - Chunk chunk = this.getChunkAt(i >> 4, k >> 4); - - chunk.a(enumskyblock, i & 15, j, k & 15, l); - - for (int i1 = 0; i1 < this.u.size(); ++i1) { - ((IWorldAccess) this.u.get(i1)).b(i, j, k); - } - } - } - } - } - } - - public void m(int i, int j, int k) { - for (int l = 0; l < this.u.size(); ++l) { - ((IWorldAccess) this.u.get(l)).b(i, j, k); - } - } - - public float n(int i, int j, int k) { - return this.worldProvider.h[this.getLightLevel(i, j, k)]; - } - - public boolean w() { - return this.j < 4; - } - - public MovingObjectPosition a(Vec3D vec3d, Vec3D vec3d1) { - return this.rayTrace(vec3d, vec3d1, false, false, false); - } - - public MovingObjectPosition rayTrace(Vec3D vec3d, Vec3D vec3d1, boolean flag) { - return this.rayTrace(vec3d, vec3d1, flag, false, false); - } - - public MovingObjectPosition rayTrace(Vec3D vec3d, Vec3D vec3d1, boolean flag, boolean flag1, boolean flag2) { - if (!Double.isNaN(vec3d.a) && !Double.isNaN(vec3d.b) && !Double.isNaN(vec3d.c)) { - if (!Double.isNaN(vec3d1.a) && !Double.isNaN(vec3d1.b) && !Double.isNaN(vec3d1.c)) { - int i = MathHelper.floor(vec3d1.a); - int j = MathHelper.floor(vec3d1.b); - int k = MathHelper.floor(vec3d1.c); - int l = MathHelper.floor(vec3d.a); - int i1 = MathHelper.floor(vec3d.b); - int j1 = MathHelper.floor(vec3d.c); - Block block = this.getType(l, i1, j1); - int k1 = this.getData(l, i1, j1); - - if ((!flag1 || block.a(this, l, i1, j1) != null) && block.a(k1, flag)) { - MovingObjectPosition movingobjectposition = block.a(this, l, i1, j1, vec3d, vec3d1); - - if (movingobjectposition != null) { - return movingobjectposition; - } - } - - MovingObjectPosition movingobjectposition1 = null; - - k1 = 200; - - while (k1-- >= 0) { - if (Double.isNaN(vec3d.a) || Double.isNaN(vec3d.b) || Double.isNaN(vec3d.c)) { - return null; - } - - if (l == i && i1 == j && j1 == k) { - return flag2 ? movingobjectposition1 : null; - } - - boolean flag3 = true; - boolean flag4 = true; - boolean flag5 = true; - double d0 = 999.0D; - double d1 = 999.0D; - double d2 = 999.0D; - - if (i > l) { - d0 = (double) l + 1.0D; - } else if (i < l) { - d0 = (double) l + 0.0D; - } else { - flag3 = false; - } - - if (j > i1) { - d1 = (double) i1 + 1.0D; - } else if (j < i1) { - d1 = (double) i1 + 0.0D; - } else { - flag4 = false; - } - - if (k > j1) { - d2 = (double) j1 + 1.0D; - } else if (k < j1) { - d2 = (double) j1 + 0.0D; - } else { - flag5 = false; - } - - double d3 = 999.0D; - double d4 = 999.0D; - double d5 = 999.0D; - double d6 = vec3d1.a - vec3d.a; - double d7 = vec3d1.b - vec3d.b; - double d8 = vec3d1.c - vec3d.c; - - if (flag3) { - d3 = (d0 - vec3d.a) / d6; - } - - if (flag4) { - d4 = (d1 - vec3d.b) / d7; - } - - if (flag5) { - d5 = (d2 - vec3d.c) / d8; - } - - boolean flag6 = false; - byte b0; - - if (d3 < d4 && d3 < d5) { - if (i > l) { - b0 = 4; - } else { - b0 = 5; - } - - vec3d.a = d0; - vec3d.b += d7 * d3; - vec3d.c += d8 * d3; - } else if (d4 < d5) { - if (j > i1) { - b0 = 0; - } else { - b0 = 1; - } - - vec3d.a += d6 * d4; - vec3d.b = d1; - vec3d.c += d8 * d4; - } else { - if (k > j1) { - b0 = 2; - } else { - b0 = 3; - } - - vec3d.a += d6 * d5; - vec3d.b += d7 * d5; - vec3d.c = d2; - } - - Vec3D vec3d2 = Vec3D.a(vec3d.a, vec3d.b, vec3d.c); - - l = (int) (vec3d2.a = (double) MathHelper.floor(vec3d.a)); - if (b0 == 5) { - --l; - ++vec3d2.a; - } - - i1 = (int) (vec3d2.b = (double) MathHelper.floor(vec3d.b)); - if (b0 == 1) { - --i1; - ++vec3d2.b; - } - - j1 = (int) (vec3d2.c = (double) MathHelper.floor(vec3d.c)); - if (b0 == 3) { - --j1; - ++vec3d2.c; - } - - Block block1 = this.getType(l, i1, j1); - int l1 = this.getData(l, i1, j1); - - if (!flag1 || block1.a(this, l, i1, j1) != null) { - if (block1.a(l1, flag)) { - MovingObjectPosition movingobjectposition2 = block1.a(this, l, i1, j1, vec3d, vec3d1); - - if (movingobjectposition2 != null) { - return movingobjectposition2; - } - } else { - movingobjectposition1 = new MovingObjectPosition(l, i1, j1, b0, vec3d, false); - } - } - } - - return flag2 ? movingobjectposition1 : null; - } else { - return null; - } - } else { - return null; - } - } - - public void makeSound(Entity entity, String s, float f, float f1) { - for (int i = 0; i < this.u.size(); ++i) { - ((IWorldAccess) this.u.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) { - for (int i = 0; i < this.u.size(); ++i) { - ((IWorldAccess) this.u.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) { - for (int i = 0; i < this.u.size(); ++i) { - ((IWorldAccess) this.u.get(i)).a(s, d0, d1, d2, f, 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.u.size(); ++l) { - ((IWorldAccess) this.u.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.u.size(); ++i) { - ((IWorldAccess) this.u.get(i)).a(s, d0, d1, d2, d3, d4, d5); - } - } - - public boolean strikeLightning(Entity entity) { - this.i.add(entity); - return true; - } - - public boolean addEntity(Entity entity) { - // CraftBukkit start - Used for entities other than creatures - return this.addEntity(entity, SpawnReason.DEFAULT); // Set reason as DEFAULT - } - - public boolean addEntity(Entity entity, SpawnReason spawnReason) { // Changed signature, added SpawnReason - if (entity == null) return false; - // CraftBukkit end - - int i = MathHelper.floor(entity.locX / 16.0D); - int j = MathHelper.floor(entity.locZ / 16.0D); - boolean flag = entity.attachedToPlayer; - - if (entity instanceof EntityHuman) { - flag = true; - } - - // CraftBukkit start - org.bukkit.event.Cancellable event = null; - if (entity instanceof EntityLiving && !(entity instanceof EntityPlayer)) { - boolean isAnimal = entity instanceof EntityAnimal || entity instanceof EntityWaterAnimal || entity instanceof EntityGolem; - boolean isMonster = entity instanceof EntityMonster || entity instanceof EntityGhast || entity instanceof EntitySlime; - - if (spawnReason != SpawnReason.CUSTOM) { - if (isAnimal && !allowAnimals || isMonster && !allowMonsters) { - entity.dead = true; - return false; - } - } - - event = CraftEventFactory.callCreatureSpawnEvent((EntityLiving) entity, spawnReason); - } else if (entity instanceof EntityItem) { - event = CraftEventFactory.callItemSpawnEvent((EntityItem) entity); - } else if (entity.getBukkitEntity() instanceof org.bukkit.entity.Projectile) { - // Not all projectiles extend EntityProjectile, so check for Bukkit interface instead - event = CraftEventFactory.callProjectileLaunchEvent(entity); - } - - if (event != null && (event.isCancelled() || entity.dead)) { - entity.dead = true; - return false; - } - // CraftBukkit end - - if (!flag && !this.isChunkLoaded(i, j)) { - entity.dead = true; // CraftBukkit - return false; - } else { - if (entity instanceof EntityHuman) { - EntityHuman entityhuman = (EntityHuman) entity; - - this.players.add(entityhuman); - this.everyoneSleeping(); - this.b(entity); - } - - this.getChunkAt(i, j).a(entity); - this.entityList.add(entity); - this.a(entity); - return true; - } - } - - protected void a(Entity entity) { - for (int i = 0; i < this.u.size(); ++i) { - ((IWorldAccess) this.u.get(i)).a(entity); - } - - entity.valid = true; // CraftBukkit - } - - protected void b(Entity entity) { - for (int i = 0; i < this.u.size(); ++i) { - ((IWorldAccess) this.u.get(i)).b(entity); - } - - entity.valid = false; // CraftBukkit - } - - public void kill(Entity entity) { - if (entity.passenger != null) { - entity.passenger.mount((Entity) null); - } - - if (entity.vehicle != null) { - entity.mount((Entity) null); - } - - entity.die(); - if (entity instanceof EntityHuman) { - this.players.remove(entity); - this.everyoneSleeping(); - } - } - - public void removeEntity(Entity entity) { - entity.die(); - if (entity instanceof EntityHuman) { - this.players.remove(entity); - this.everyoneSleeping(); - } - - int i = entity.ah; - int j = entity.aj; - - if (entity.ag && this.isChunkLoaded(i, j)) { - this.getChunkAt(i, j).b(entity); - } - - // CraftBukkit start - Decrement loop variable field if we've already ticked this entity - int index = this.entityList.indexOf(entity); - if (index != -1) { - if (index <= this.tickPosition) { - this.tickPosition--; - } - this.entityList.remove(index); - } - // CraftBukkit end - - this.b(entity); - } - - public void addIWorldAccess(IWorldAccess iworldaccess) { - this.u.add(iworldaccess); - } - - public List getCubes(Entity entity, AxisAlignedBB axisalignedbb) { - this.L.clear(); - int i = MathHelper.floor(axisalignedbb.a); - int j = MathHelper.floor(axisalignedbb.d + 1.0D); - int k = MathHelper.floor(axisalignedbb.b); - int l = MathHelper.floor(axisalignedbb.e + 1.0D); - int i1 = MathHelper.floor(axisalignedbb.c); - int j1 = MathHelper.floor(axisalignedbb.f + 1.0D); - - for (int k1 = i; k1 < j; ++k1) { - for (int l1 = i1; l1 < j1; ++l1) { - if (this.isLoaded(k1, 64, l1)) { - for (int i2 = k - 1; i2 < l; ++i2) { - Block block; - - if (k1 >= -30000000 && k1 < 30000000 && l1 >= -30000000 && l1 < 30000000) { - block = this.getType(k1, i2, l1); - } else { - block = Blocks.STONE; - } - - block.a(this, k1, i2, l1, axisalignedbb, this.L, entity); - } - } - } - } - - double d0 = 0.25D; - List list = this.getEntities(entity, axisalignedbb.grow(d0, d0, d0)); - - for (int j2 = 0; j2 < list.size(); ++j2) { - AxisAlignedBB axisalignedbb1 = ((Entity) list.get(j2)).J(); - - if (axisalignedbb1 != null && axisalignedbb1.b(axisalignedbb)) { - this.L.add(axisalignedbb1); - } - - axisalignedbb1 = entity.h((Entity) list.get(j2)); - if (axisalignedbb1 != null && axisalignedbb1.b(axisalignedbb)) { - this.L.add(axisalignedbb1); - } - } - - return this.L; - } - - public List a(AxisAlignedBB axisalignedbb) { - this.L.clear(); - int i = MathHelper.floor(axisalignedbb.a); - int j = MathHelper.floor(axisalignedbb.d + 1.0D); - int k = MathHelper.floor(axisalignedbb.b); - int l = MathHelper.floor(axisalignedbb.e + 1.0D); - int i1 = MathHelper.floor(axisalignedbb.c); - int j1 = MathHelper.floor(axisalignedbb.f + 1.0D); - - for (int k1 = i; k1 < j; ++k1) { - for (int l1 = i1; l1 < j1; ++l1) { - if (this.isLoaded(k1, 64, l1)) { - for (int i2 = k - 1; i2 < l; ++i2) { - Block block; - - if (k1 >= -30000000 && k1 < 30000000 && l1 >= -30000000 && l1 < 30000000) { - block = this.getType(k1, i2, l1); - } else { - block = Blocks.BEDROCK; - } - - block.a(this, k1, i2, l1, axisalignedbb, this.L, (Entity) null); - } - } - } - } - - return this.L; - } - - public int a(float f) { - float f1 = this.c(f); - float f2 = 1.0F - (MathHelper.cos(f1 * 3.1415927F * 2.0F) * 2.0F + 0.5F); - - if (f2 < 0.0F) { - f2 = 0.0F; - } - - if (f2 > 1.0F) { - f2 = 1.0F; - } - - f2 = 1.0F - f2; - f2 = (float) ((double) f2 * (1.0D - (double) (this.j(f) * 5.0F) / 16.0D)); - f2 = (float) ((double) f2 * (1.0D - (double) (this.h(f) * 5.0F) / 16.0D)); - f2 = 1.0F - f2; - return (int) (f2 * 11.0F); - } - - public float c(float f) { - return this.worldProvider.a(this.worldData.getDayTime(), f); - } - - public float y() { - return WorldProvider.a[this.worldProvider.a(this.worldData.getDayTime())]; - } - - public float d(float f) { - float f1 = this.c(f); - - return f1 * 3.1415927F * 2.0F; - } - - public int h(int i, int j) { - return this.getChunkAtWorldCoords(i, j).d(i & 15, j & 15); - } - - public int i(int i, int j) { - Chunk chunk = this.getChunkAtWorldCoords(i, j); - int k = chunk.h() + 15; - - i &= 15; - - for (j &= 15; k > 0; --k) { - Block block = chunk.getType(i, k, j); - - if (block.getMaterial().isSolid() && block.getMaterial() != Material.LEAVES) { - return k + 1; - } - } - - return -1; - } - - public void a(int i, int j, int k, Block block, int l) {} - - public void a(int i, int j, int k, Block block, int l, int i1) {} - - public void b(int i, int j, int k, Block block, int l, int i1) {} - - public void tickEntities() { - this.methodProfiler.a("entities"); - this.methodProfiler.a("global"); - - int i; - Entity entity; - CrashReport crashreport; - CrashReportSystemDetails crashreportsystemdetails; - - for (i = 0; i < this.i.size(); ++i) { - entity = (Entity) this.i.get(i); - // CraftBukkit start - Fixed an NPE - if (entity == null) { - continue; - } - // CraftBukkit end - - try { - ++entity.ticksLived; - entity.h(); - } catch (Throwable throwable) { - crashreport = CrashReport.a(throwable, "Ticking entity"); - crashreportsystemdetails = crashreport.a("Entity being ticked"); - if (entity == null) { - crashreportsystemdetails.a("Entity", "~~NULL~~"); - } else { - entity.a(crashreportsystemdetails); - } - - throw new ReportedException(crashreport); - } - - if (entity.dead) { - this.i.remove(i--); - } - } - - this.methodProfiler.c("remove"); - this.entityList.removeAll(this.f); - - int j; - int k; - - for (i = 0; i < this.f.size(); ++i) { - entity = (Entity) this.f.get(i); - j = entity.ah; - k = entity.aj; - if (entity.ag && this.isChunkLoaded(j, k)) { - this.getChunkAt(j, k).b(entity); - } - } - - for (i = 0; i < this.f.size(); ++i) { - this.b((Entity) this.f.get(i)); - } - - this.f.clear(); - this.methodProfiler.c("regular"); - - // CraftBukkit start - Use field for loop variable - for (this.tickPosition = 0; this.tickPosition < this.entityList.size(); ++this.tickPosition) { - entity = (Entity) this.entityList.get(this.tickPosition); - if (entity.vehicle != null) { - if (!entity.vehicle.dead && entity.vehicle.passenger == entity) { - continue; - } - - entity.vehicle.passenger = null; - entity.vehicle = null; - } - - this.methodProfiler.a("tick"); - if (!entity.dead) { - try { - this.playerJoinedWorld(entity); - } catch (Throwable throwable1) { - crashreport = CrashReport.a(throwable1, "Ticking entity"); - crashreportsystemdetails = crashreport.a("Entity being ticked"); - entity.a(crashreportsystemdetails); - throw new ReportedException(crashreport); - } - } - - this.methodProfiler.b(); - this.methodProfiler.a("remove"); - if (entity.dead) { - j = entity.ah; - k = entity.aj; - if (entity.ag && this.isChunkLoaded(j, k)) { - this.getChunkAt(j, k).b(entity); - } - - this.entityList.remove(this.tickPosition--); // CraftBukkit - Use field for loop variable - this.b(entity); - } - - this.methodProfiler.b(); - } - - this.methodProfiler.c("blockEntities"); - this.M = true; - // CraftBukkit start - From below, clean up tile entities before ticking them - if (!this.b.isEmpty()) { - this.tileEntityList.removeAll(this.b); - this.b.clear(); - } - // CraftBukkit end - - Iterator iterator = this.tileEntityList.iterator(); - - while (iterator.hasNext()) { - TileEntity tileentity = (TileEntity) iterator.next(); - - if (!tileentity.r() && tileentity.o() && this.isLoaded(tileentity.x, tileentity.y, tileentity.z)) { - try { - tileentity.h(); - } catch (Throwable throwable2) { - crashreport = CrashReport.a(throwable2, "Ticking block entity"); - crashreportsystemdetails = crashreport.a("Block entity being ticked"); - tileentity.a(crashreportsystemdetails); - throw new ReportedException(crashreport); - } - } - - if (tileentity.r()) { - iterator.remove(); - if (this.isChunkLoaded(tileentity.x >> 4, tileentity.z >> 4)) { - Chunk chunk = this.getChunkAt(tileentity.x >> 4, tileentity.z >> 4); - - if (chunk != null) { - chunk.f(tileentity.x & 15, tileentity.y, tileentity.z & 15); - } - } - } - } - - this.M = false; - /* CraftBukkit start - Moved up - if (!this.b.isEmpty()) { - this.tileEntityList.removeAll(this.b); - this.b.clear(); - } - */ // CraftBukkit end - - this.methodProfiler.c("pendingBlockEntities"); - if (!this.a.isEmpty()) { - for (int l = 0; l < this.a.size(); ++l) { - TileEntity tileentity1 = (TileEntity) this.a.get(l); - - if (!tileentity1.r()) { - /* CraftBukkit start - Order matters, moved down - if (!this.tileEntityList.contains(tileentity1)) { - this.tileEntityList.add(tileentity1); - } - // CraftBukkit end */ - - if (this.isChunkLoaded(tileentity1.x >> 4, tileentity1.z >> 4)) { - Chunk chunk1 = this.getChunkAt(tileentity1.x >> 4, tileentity1.z >> 4); - - if (chunk1 != null) { - chunk1.a(tileentity1.x & 15, tileentity1.y, tileentity1.z & 15, tileentity1); - // CraftBukkit start - Moved down from above - if (!this.tileEntityList.contains(tileentity1)) { - this.tileEntityList.add(tileentity1); - } - // CraftBukkit end - } - } - - this.notify(tileentity1.x, tileentity1.y, tileentity1.z); - } - } - - this.a.clear(); - } - - this.methodProfiler.b(); - this.methodProfiler.b(); - } - - public void a(Collection collection) { - if (this.M) { - this.a.addAll(collection); - } else { - this.tileEntityList.addAll(collection); - } - } - - public void playerJoinedWorld(Entity entity) { - this.entityJoinedWorld(entity, true); - } - - public void entityJoinedWorld(Entity entity, boolean flag) { - int i = MathHelper.floor(entity.locX); - int j = MathHelper.floor(entity.locZ); - byte b0 = 32; - - // CraftBukkit start - Use neighbor cache instead of looking up - Chunk startingChunk = this.getChunkIfLoaded(i >> 4, j >> 4); - if (!flag || (startingChunk != null && startingChunk.areNeighborsLoaded(2)) /* this.b(i - b0, 0, j - b0, i + b0, 0, j + b0) */) { - // CraftBukkit end - entity.S = entity.locX; - entity.T = entity.locY; - entity.U = entity.locZ; - entity.lastYaw = entity.yaw; - entity.lastPitch = entity.pitch; - if (flag && entity.ag) { - ++entity.ticksLived; - if (entity.vehicle != null) { - entity.ab(); - } else { - entity.h(); - } - } - - this.methodProfiler.a("chunkCheck"); - if (Double.isNaN(entity.locX) || Double.isInfinite(entity.locX)) { - entity.locX = entity.S; - } - - if (Double.isNaN(entity.locY) || Double.isInfinite(entity.locY)) { - entity.locY = entity.T; - } - - if (Double.isNaN(entity.locZ) || Double.isInfinite(entity.locZ)) { - entity.locZ = entity.U; - } - - if (Double.isNaN((double) entity.pitch) || Double.isInfinite((double) entity.pitch)) { - entity.pitch = entity.lastPitch; - } - - if (Double.isNaN((double) entity.yaw) || Double.isInfinite((double) entity.yaw)) { - entity.yaw = entity.lastYaw; - } - - int k = MathHelper.floor(entity.locX / 16.0D); - int l = MathHelper.floor(entity.locY / 16.0D); - int i1 = MathHelper.floor(entity.locZ / 16.0D); - - if (!entity.ag || entity.ah != k || entity.ai != l || entity.aj != i1) { - if (entity.ag && this.isChunkLoaded(entity.ah, entity.aj)) { - this.getChunkAt(entity.ah, entity.aj).a(entity, entity.ai); - } - - if (this.isChunkLoaded(k, i1)) { - entity.ag = true; - this.getChunkAt(k, i1).a(entity); - } else { - entity.ag = false; - } - } - - this.methodProfiler.b(); - if (flag && entity.ag && entity.passenger != null) { - if (!entity.passenger.dead && entity.passenger.vehicle == entity) { - this.playerJoinedWorld(entity.passenger); - } else { - entity.passenger.vehicle = null; - entity.passenger = null; - } - } - } - } - - public boolean b(AxisAlignedBB axisalignedbb) { - return this.a(axisalignedbb, (Entity) null); - } - - public boolean a(AxisAlignedBB axisalignedbb, Entity entity) { - List list = this.getEntities((Entity) null, axisalignedbb); - - for (int i = 0; i < list.size(); ++i) { - Entity entity1 = (Entity) list.get(i); - - if (!entity1.dead && entity1.k && entity1 != entity) { - return false; - } - } - - return true; - } - - public boolean c(AxisAlignedBB axisalignedbb) { - int i = MathHelper.floor(axisalignedbb.a); - int j = MathHelper.floor(axisalignedbb.d + 1.0D); - int k = MathHelper.floor(axisalignedbb.b); - int l = MathHelper.floor(axisalignedbb.e + 1.0D); - int i1 = MathHelper.floor(axisalignedbb.c); - int j1 = MathHelper.floor(axisalignedbb.f + 1.0D); - - if (axisalignedbb.a < 0.0D) { - --i; - } - - if (axisalignedbb.b < 0.0D) { - --k; - } - - if (axisalignedbb.c < 0.0D) { - --i1; - } - - for (int k1 = i; k1 < j; ++k1) { - for (int l1 = k; l1 < l; ++l1) { - for (int i2 = i1; i2 < j1; ++i2) { - Block block = this.getType(k1, l1, i2); - - if (block.getMaterial() != Material.AIR) { - return true; - } - } - } - } - - return false; - } - - public boolean containsLiquid(AxisAlignedBB axisalignedbb) { - int i = MathHelper.floor(axisalignedbb.a); - int j = MathHelper.floor(axisalignedbb.d + 1.0D); - int k = MathHelper.floor(axisalignedbb.b); - int l = MathHelper.floor(axisalignedbb.e + 1.0D); - int i1 = MathHelper.floor(axisalignedbb.c); - int j1 = MathHelper.floor(axisalignedbb.f + 1.0D); - - if (axisalignedbb.a < 0.0D) { - --i; - } - - if (axisalignedbb.b < 0.0D) { - --k; - } - - if (axisalignedbb.c < 0.0D) { - --i1; - } - - for (int k1 = i; k1 < j; ++k1) { - for (int l1 = k; l1 < l; ++l1) { - for (int i2 = i1; i2 < j1; ++i2) { - Block block = this.getType(k1, l1, i2); - - if (block.getMaterial().isLiquid()) { - return true; - } - } - } - } - - return false; - } - - public boolean e(AxisAlignedBB axisalignedbb) { - int i = MathHelper.floor(axisalignedbb.a); - int j = MathHelper.floor(axisalignedbb.d + 1.0D); - int k = MathHelper.floor(axisalignedbb.b); - int l = MathHelper.floor(axisalignedbb.e + 1.0D); - int i1 = MathHelper.floor(axisalignedbb.c); - int j1 = MathHelper.floor(axisalignedbb.f + 1.0D); - - if (this.b(i, k, i1, j, l, j1)) { - for (int k1 = i; k1 < j; ++k1) { - for (int l1 = k; l1 < l; ++l1) { - for (int i2 = i1; i2 < j1; ++i2) { - Block block = this.getType(k1, l1, i2); - - if (block == Blocks.FIRE || block == Blocks.LAVA || block == Blocks.STATIONARY_LAVA) { - return true; - } - } - } - } - } - - return false; - } - - public boolean a(AxisAlignedBB axisalignedbb, Material material, Entity entity) { - int i = MathHelper.floor(axisalignedbb.a); - int j = MathHelper.floor(axisalignedbb.d + 1.0D); - int k = MathHelper.floor(axisalignedbb.b); - int l = MathHelper.floor(axisalignedbb.e + 1.0D); - int i1 = MathHelper.floor(axisalignedbb.c); - int j1 = MathHelper.floor(axisalignedbb.f + 1.0D); - - if (!this.b(i, k, i1, j, l, j1)) { - return false; - } else { - boolean flag = false; - Vec3D vec3d = Vec3D.a(0.0D, 0.0D, 0.0D); - - for (int k1 = i; k1 < j; ++k1) { - for (int l1 = k; l1 < l; ++l1) { - for (int i2 = i1; i2 < j1; ++i2) { - Block block = this.getType(k1, l1, i2); - - if (block.getMaterial() == material) { - double d0 = (double) ((float) (l1 + 1) - BlockFluids.b(this.getData(k1, l1, i2))); - - if ((double) l >= d0) { - flag = true; - block.a(this, k1, l1, i2, entity, vec3d); - } - } - } - } - } - - if (vec3d.b() > 0.0D && entity.aC()) { - vec3d = vec3d.a(); - double d1 = 0.014D; - - entity.motX += vec3d.a * d1; - entity.motY += vec3d.b * d1; - entity.motZ += vec3d.c * d1; - } - - return flag; - } - } - - public boolean a(AxisAlignedBB axisalignedbb, Material material) { - int i = MathHelper.floor(axisalignedbb.a); - int j = MathHelper.floor(axisalignedbb.d + 1.0D); - int k = MathHelper.floor(axisalignedbb.b); - int l = MathHelper.floor(axisalignedbb.e + 1.0D); - int i1 = MathHelper.floor(axisalignedbb.c); - int j1 = MathHelper.floor(axisalignedbb.f + 1.0D); - - for (int k1 = i; k1 < j; ++k1) { - for (int l1 = k; l1 < l; ++l1) { - for (int i2 = i1; i2 < j1; ++i2) { - if (this.getType(k1, l1, i2).getMaterial() == material) { - return true; - } - } - } - } - - return false; - } - - public boolean b(AxisAlignedBB axisalignedbb, Material material) { - int i = MathHelper.floor(axisalignedbb.a); - int j = MathHelper.floor(axisalignedbb.d + 1.0D); - int k = MathHelper.floor(axisalignedbb.b); - int l = MathHelper.floor(axisalignedbb.e + 1.0D); - int i1 = MathHelper.floor(axisalignedbb.c); - int j1 = MathHelper.floor(axisalignedbb.f + 1.0D); - - for (int k1 = i; k1 < j; ++k1) { - for (int l1 = k; l1 < l; ++l1) { - for (int i2 = i1; i2 < j1; ++i2) { - Block block = this.getType(k1, l1, i2); - - if (block.getMaterial() == material) { - int j2 = this.getData(k1, l1, i2); - double d0 = (double) (l1 + 1); - - if (j2 < 8) { - d0 = (double) (l1 + 1) - (double) j2 / 8.0D; - } - - if (d0 >= axisalignedbb.b) { - return true; - } - } - } - } - } - - return false; - } - - public Explosion explode(Entity entity, double d0, double d1, double d2, float f, boolean flag) { - return this.createExplosion(entity, d0, d1, d2, f, false, flag); - } - - public Explosion createExplosion(Entity entity, double d0, double d1, double d2, float f, boolean flag, boolean flag1) { - Explosion explosion = new Explosion(this, entity, d0, d1, d2, f); - - explosion.a = flag; - explosion.b = flag1; - explosion.a(); - explosion.a(true); - return explosion; - } - - public float a(Vec3D vec3d, AxisAlignedBB axisalignedbb) { - double d0 = 1.0D / ((axisalignedbb.d - axisalignedbb.a) * 2.0D + 1.0D); - double d1 = 1.0D / ((axisalignedbb.e - axisalignedbb.b) * 2.0D + 1.0D); - double d2 = 1.0D / ((axisalignedbb.f - axisalignedbb.c) * 2.0D + 1.0D); - - if (d0 >= 0.0D && d1 >= 0.0D && d2 >= 0.0D) { - int i = 0; - int j = 0; - - Vec3D vec3d2 = vec3d.a(0, 0, 0); // CraftBukkit - for (float f = 0.0F; f <= 1.0F; f = (float) ((double) f + d0)) { - for (float f1 = 0.0F; f1 <= 1.0F; f1 = (float) ((double) f1 + d1)) { - for (float f2 = 0.0F; f2 <= 1.0F; f2 = (float) ((double) f2 + d2)) { - double d3 = axisalignedbb.a + (axisalignedbb.d - axisalignedbb.a) * (double) f; - double d4 = axisalignedbb.b + (axisalignedbb.e - axisalignedbb.b) * (double) f1; - double d5 = axisalignedbb.c + (axisalignedbb.f - axisalignedbb.c) * (double) f2; - - if (this.a(vec3d2.b(d3, d4, d5), vec3d) == null) { // CraftBukkit - ++i; - } - - ++j; - } - } - } - - return (float) i / (float) j; - } else { - return 0.0F; - } - } - - public boolean douseFire(EntityHuman entityhuman, int i, int j, int k, int l) { - if (l == 0) { - --j; - } - - if (l == 1) { - ++j; - } - - if (l == 2) { - --k; - } - - if (l == 3) { - ++k; - } - - if (l == 4) { - --i; - } - - if (l == 5) { - ++i; - } - - if (this.getType(i, j, k) == Blocks.FIRE) { - this.a(entityhuman, 1004, i, j, k, 0); - this.setAir(i, j, k); - return true; - } else { - return false; - } - } - - public TileEntity getTileEntity(int i, int j, int k) { - if (j >= 0 && j < 256) { - TileEntity tileentity = null; - int l; - TileEntity tileentity1; - - if (this.M) { - for (l = 0; l < this.a.size(); ++l) { - tileentity1 = (TileEntity) this.a.get(l); - if (!tileentity1.r() && tileentity1.x == i && tileentity1.y == j && tileentity1.z == k) { - tileentity = tileentity1; - break; - } - } - } - - if (tileentity == null) { - Chunk chunk = this.getChunkAt(i >> 4, k >> 4); - - if (chunk != null) { - tileentity = chunk.e(i & 15, j, k & 15); - } - } - - if (tileentity == null) { - for (l = 0; l < this.a.size(); ++l) { - tileentity1 = (TileEntity) this.a.get(l); - if (!tileentity1.r() && tileentity1.x == i && tileentity1.y == j && tileentity1.z == k) { - tileentity = tileentity1; - break; - } - } - } - - return tileentity; - } else { - return null; - } - } - - public void setTileEntity(int i, int j, int k, TileEntity tileentity) { - if (tileentity != null && !tileentity.r()) { - if (this.M) { - tileentity.x = i; - tileentity.y = j; - tileentity.z = k; - Iterator iterator = this.a.iterator(); - - while (iterator.hasNext()) { - TileEntity tileentity1 = (TileEntity) iterator.next(); - - if (tileentity1.x == i && tileentity1.y == j && tileentity1.z == k) { - tileentity1.s(); - iterator.remove(); - } - } - - this.a.add(tileentity); - } else { - this.tileEntityList.add(tileentity); - Chunk chunk = this.getChunkAt(i >> 4, k >> 4); - - if (chunk != null) { - chunk.a(i & 15, j, k & 15, tileentity); - } - } - } - } - - public void p(int i, int j, int k) { - TileEntity tileentity = this.getTileEntity(i, j, k); - - if (tileentity != null && this.M) { - tileentity.s(); - this.a.remove(tileentity); - } else { - if (tileentity != null) { - this.a.remove(tileentity); - this.tileEntityList.remove(tileentity); - } - - Chunk chunk = this.getChunkAt(i >> 4, k >> 4); - - if (chunk != null) { - chunk.f(i & 15, j, k & 15); - } - } - } - - public void a(TileEntity tileentity) { - this.b.add(tileentity); - } - - public boolean q(int i, int j, int k) { - AxisAlignedBB axisalignedbb = this.getType(i, j, k).a(this, i, j, k); - - return axisalignedbb != null && axisalignedbb.a() >= 1.0D; - } - - public static boolean a(IBlockAccess iblockaccess, int i, int j, int k) { - Block block = iblockaccess.getType(i, j, k); - int l = iblockaccess.getData(i, j, k); - - return block.getMaterial().k() && block.d() ? true : (block instanceof BlockStairs ? (l & 4) == 4 : (block instanceof BlockStepAbstract ? (l & 8) == 8 : (block instanceof BlockHopper ? true : (block instanceof BlockSnow ? (l & 7) == 7 : false)))); - } - - public boolean c(int i, int j, int k, boolean flag) { - if (i >= -30000000 && k >= -30000000 && i < 30000000 && k < 30000000) { - Chunk chunk = this.chunkProvider.getOrCreateChunk(i >> 4, k >> 4); - - if (chunk != null && !chunk.isEmpty()) { - Block block = this.getType(i, j, k); - - return block.getMaterial().k() && block.d(); - } else { - return flag; - } - } else { - return flag; - } - } - - public void B() { - int i = this.a(1.0F); - - if (i != this.j) { - this.j = i; - } - } - - public void setSpawnFlags(boolean flag, boolean flag1) { - this.allowMonsters = flag; - this.allowAnimals = flag1; - } - - public void doTick() { - this.o(); - } - - private void a() { - if (this.worldData.hasStorm()) { - this.n = 1.0F; - if (this.worldData.isThundering()) { - this.p = 1.0F; - } - } - } - - protected void o() { - if (!this.worldProvider.g) { - if (!this.isStatic) { - int i = this.worldData.getThunderDuration(); - - if (i <= 0) { - if (this.worldData.isThundering()) { - this.worldData.setThunderDuration(this.random.nextInt(12000) + 3600); - } else { - this.worldData.setThunderDuration(this.random.nextInt(168000) + 12000); - } - } else { - --i; - this.worldData.setThunderDuration(i); - if (i <= 0) { - // CraftBukkit start - ThunderChangeEvent thunder = new ThunderChangeEvent(this.getWorld(), !this.worldData.isThundering()); - this.getServer().getPluginManager().callEvent(thunder); - if (!thunder.isCancelled()) { - this.worldData.setThundering(!this.worldData.isThundering()); - } - // CraftBukkit end - } - } - - this.o = this.p; - if (this.worldData.isThundering()) { - this.p = (float) ((double) this.p + 0.01D); - } else { - this.p = (float) ((double) this.p - 0.01D); - } - - this.p = MathHelper.a(this.p, 0.0F, 1.0F); - int j = this.worldData.getWeatherDuration(); - - if (j <= 0) { - if (this.worldData.hasStorm()) { - this.worldData.setWeatherDuration(this.random.nextInt(12000) + 12000); - } else { - this.worldData.setWeatherDuration(this.random.nextInt(168000) + 12000); - } - } else { - --j; - this.worldData.setWeatherDuration(j); - if (j <= 0) { - // CraftBukkit start - WeatherChangeEvent weather = new WeatherChangeEvent(this.getWorld(), !this.worldData.hasStorm()); - this.getServer().getPluginManager().callEvent(weather); - - if (!weather.isCancelled()) { - this.worldData.setStorm(!this.worldData.hasStorm()); - } - // CraftBukkit end - } - } - - this.m = this.n; - if (this.worldData.hasStorm()) { - this.n = (float) ((double) this.n + 0.01D); - } else { - this.n = (float) ((double) this.n - 0.01D); - } - - this.n = MathHelper.a(this.n, 0.0F, 1.0F); - } - } - } - - protected void C() { - // this.chunkTickList.clear(); // CraftBukkit - removed - this.methodProfiler.a("buildList"); - - int i; - EntityHuman entityhuman; - int j; - int k; - int l; - - for (i = 0; i < this.players.size(); ++i) { - entityhuman = (EntityHuman) this.players.get(i); - j = MathHelper.floor(entityhuman.locX / 16.0D); - k = MathHelper.floor(entityhuman.locZ / 16.0D); - l = this.p(); - - for (int i1 = -l; i1 <= l; ++i1) { - for (int j1 = -l; j1 <= l; ++j1) { - this.chunkTickList.add(org.bukkit.craftbukkit.util.LongHash.toLong(i1 + j, j1 + k)); // CraftBukkit - } - } - } - - this.methodProfiler.b(); - if (this.K > 0) { - --this.K; - } - - this.methodProfiler.a("playerCheckLight"); - if (!this.players.isEmpty()) { - i = this.random.nextInt(this.players.size()); - entityhuman = (EntityHuman) this.players.get(i); - j = MathHelper.floor(entityhuman.locX) + this.random.nextInt(11) - 5; - k = MathHelper.floor(entityhuman.locY) + this.random.nextInt(11) - 5; - l = MathHelper.floor(entityhuman.locZ) + this.random.nextInt(11) - 5; - this.t(j, k, l); - } - - this.methodProfiler.b(); - } - - protected abstract int p(); - - protected void a(int i, int j, Chunk chunk) { - this.methodProfiler.c("moodSound"); - if (this.K == 0 && !this.isStatic) { - this.k = this.k * 3 + 1013904223; - int k = this.k >> 2; - int l = k & 15; - int i1 = k >> 8 & 15; - int j1 = k >> 16 & 255; - Block block = chunk.getType(l, j1, i1); - - l += i; - i1 += j; - if (block.getMaterial() == Material.AIR && this.j(l, j1, i1) <= this.random.nextInt(8) && this.b(EnumSkyBlock.SKY, l, j1, i1) <= 0) { - EntityHuman entityhuman = this.findNearbyPlayer((double) l + 0.5D, (double) j1 + 0.5D, (double) i1 + 0.5D, 8.0D); - - 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.K = this.random.nextInt(12000) + 6000; - } - } - } - - this.methodProfiler.c("checkLight"); - chunk.o(); - } - - protected void g() { - this.C(); - } - - public boolean r(int i, int j, int k) { - return this.d(i, j, k, false); - } - - public boolean s(int i, int j, int k) { - return this.d(i, j, k, true); - } - - public boolean d(int i, int j, int k, boolean flag) { - BiomeBase biomebase = this.getBiome(i, k); - float f = biomebase.a(i, j, k); - - if (f > 0.15F) { - return false; - } else { - if (j >= 0 && j < 256 && this.b(EnumSkyBlock.BLOCK, i, j, k) < 10) { - Block block = this.getType(i, j, k); - - if ((block == Blocks.STATIONARY_WATER || block == Blocks.WATER) && this.getData(i, j, k) == 0) { - if (!flag) { - return true; - } - - boolean flag1 = true; - - if (flag1 && this.getType(i - 1, j, k).getMaterial() != Material.WATER) { - flag1 = false; - } - - if (flag1 && this.getType(i + 1, j, k).getMaterial() != Material.WATER) { - flag1 = false; - } - - if (flag1 && this.getType(i, j, k - 1).getMaterial() != Material.WATER) { - flag1 = false; - } - - if (flag1 && this.getType(i, j, k + 1).getMaterial() != Material.WATER) { - flag1 = false; - } - - if (!flag1) { - return true; - } - } - } - - return false; - } - } - - public boolean e(int i, int j, int k, boolean flag) { - BiomeBase biomebase = this.getBiome(i, k); - float f = biomebase.a(i, j, k); - - if (f > 0.15F) { - return false; - } else if (!flag) { - return true; - } else { - if (j >= 0 && j < 256 && this.b(EnumSkyBlock.BLOCK, i, j, k) < 10) { - Block block = this.getType(i, j, k); - - if (block.getMaterial() == Material.AIR && Blocks.SNOW.canPlace(this, i, j, k)) { - return true; - } - } - - return false; - } - } - - public boolean t(int i, int j, int k) { - boolean flag = false; - - if (!this.worldProvider.g) { - flag |= this.c(EnumSkyBlock.SKY, i, j, k); - } - - flag |= this.c(EnumSkyBlock.BLOCK, i, j, k); - return flag; - } - - private int a(int i, int j, int k, EnumSkyBlock enumskyblock) { - if (enumskyblock == EnumSkyBlock.SKY && this.i(i, j, k)) { - return 15; - } else { - Block block = this.getType(i, j, k); - int l = enumskyblock == EnumSkyBlock.SKY ? 0 : block.m(); - int i1 = block.k(); - - if (i1 >= 15 && block.m() > 0) { - i1 = 1; - } - - if (i1 < 1) { - i1 = 1; - } - - if (i1 >= 15) { - return 0; - } else if (l >= 14) { - return l; - } else { - for (int j1 = 0; j1 < 6; ++j1) { - int k1 = i + Facing.b[j1]; - int l1 = j + Facing.c[j1]; - int i2 = k + Facing.d[j1]; - int j2 = this.b(enumskyblock, k1, l1, i2) - i1; - - if (j2 > l) { - l = j2; - } - - if (l >= 14) { - return l; - } - } - - return l; - } - } - } - - public boolean c(EnumSkyBlock enumskyblock, int i, int j, int k) { - // CraftBukkit start - Use neighbor cache instead of looking up - Chunk chunk = this.getChunkIfLoaded(i >> 4, k >> 4); - if (chunk == null || !chunk.areNeighborsLoaded(1) /* !this.areChunksLoaded(i, j, k, 17)*/) { - // CraftBukkit end - return false; - } else { - int l = 0; - int i1 = 0; - - this.methodProfiler.a("getBrightness"); - int j1 = this.b(enumskyblock, i, j, k); - int k1 = this.a(i, j, k, enumskyblock); - int l1; - int i2; - int j2; - int k2; - int l2; - int i3; - int j3; - int k3; - int l3; - - if (k1 > j1) { - this.I[i1++] = 133152; - } else if (k1 < j1) { - this.I[i1++] = 133152 | j1 << 18; - - while (l < i1) { - l1 = this.I[l++]; - i2 = (l1 & 63) - 32 + i; - j2 = (l1 >> 6 & 63) - 32 + j; - k2 = (l1 >> 12 & 63) - 32 + k; - l2 = l1 >> 18 & 15; - i3 = this.b(enumskyblock, i2, j2, k2); - if (i3 == l2) { - this.b(enumskyblock, i2, j2, k2, 0); - if (l2 > 0) { - j3 = MathHelper.a(i2 - i); - l3 = MathHelper.a(j2 - j); - k3 = MathHelper.a(k2 - k); - if (j3 + l3 + k3 < 17) { - for (int i4 = 0; i4 < 6; ++i4) { - int j4 = i2 + Facing.b[i4]; - int k4 = j2 + Facing.c[i4]; - int l4 = k2 + Facing.d[i4]; - int i5 = Math.max(1, this.getType(j4, k4, l4).k()); - - i3 = this.b(enumskyblock, j4, k4, l4); - if (i3 == l2 - i5 && i1 < this.I.length) { - this.I[i1++] = j4 - i + 32 | k4 - j + 32 << 6 | l4 - k + 32 << 12 | l2 - i5 << 18; - } - } - } - } - } - } - - l = 0; - } - - this.methodProfiler.b(); - this.methodProfiler.a("checkedPosition < toCheckCount"); - - while (l < i1) { - l1 = this.I[l++]; - i2 = (l1 & 63) - 32 + i; - j2 = (l1 >> 6 & 63) - 32 + j; - k2 = (l1 >> 12 & 63) - 32 + k; - l2 = this.b(enumskyblock, i2, j2, k2); - i3 = this.a(i2, j2, k2, enumskyblock); - if (i3 != l2) { - this.b(enumskyblock, i2, j2, k2, i3); - if (i3 > l2) { - j3 = Math.abs(i2 - i); - l3 = Math.abs(j2 - j); - k3 = Math.abs(k2 - k); - boolean flag = i1 < this.I.length - 6; - - if (j3 + l3 + k3 < 17 && flag) { - if (this.b(enumskyblock, i2 - 1, j2, k2) < i3) { - this.I[i1++] = i2 - 1 - i + 32 + (j2 - j + 32 << 6) + (k2 - k + 32 << 12); - } - - if (this.b(enumskyblock, i2 + 1, j2, k2) < i3) { - this.I[i1++] = i2 + 1 - i + 32 + (j2 - j + 32 << 6) + (k2 - k + 32 << 12); - } - - if (this.b(enumskyblock, i2, j2 - 1, k2) < i3) { - this.I[i1++] = i2 - i + 32 + (j2 - 1 - j + 32 << 6) + (k2 - k + 32 << 12); - } - - if (this.b(enumskyblock, i2, j2 + 1, k2) < i3) { - this.I[i1++] = i2 - i + 32 + (j2 + 1 - j + 32 << 6) + (k2 - k + 32 << 12); - } - - if (this.b(enumskyblock, i2, j2, k2 - 1) < i3) { - this.I[i1++] = i2 - i + 32 + (j2 - j + 32 << 6) + (k2 - 1 - k + 32 << 12); - } - - if (this.b(enumskyblock, i2, j2, k2 + 1) < i3) { - this.I[i1++] = i2 - i + 32 + (j2 - j + 32 << 6) + (k2 + 1 - k + 32 << 12); - } - } - } - } - } - - this.methodProfiler.b(); - return true; - } - } - - public boolean a(boolean flag) { - return false; - } - - public List a(Chunk chunk, boolean flag) { - return null; - } - - public List getEntities(Entity entity, AxisAlignedBB axisalignedbb) { - return this.getEntities(entity, axisalignedbb, (IEntitySelector) null); - } - - public List getEntities(Entity entity, AxisAlignedBB axisalignedbb, IEntitySelector ientityselector) { - ArrayList arraylist = new ArrayList(); - 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); - int l = MathHelper.floor((axisalignedbb.f + 2.0D) / 16.0D); - - 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, arraylist, ientityselector); - } - } - } - - return arraylist; - } - - public List a(Class oclass, AxisAlignedBB axisalignedbb) { - return this.a(oclass, axisalignedbb, (IEntitySelector) null); - } - - public List a(Class oclass, AxisAlignedBB axisalignedbb, IEntitySelector ientityselector) { - 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); - int l = MathHelper.floor((axisalignedbb.f + 2.0D) / 16.0D); - ArrayList arraylist = new ArrayList(); - - for (int i1 = i; i1 <= j; ++i1) { - for (int j1 = k; j1 <= l; ++j1) { - if (this.isChunkLoaded(i1, j1)) { - this.getChunkAt(i1, j1).a(oclass, axisalignedbb, arraylist, ientityselector); - } - } - } - - return arraylist; - } - - public Entity a(Class oclass, AxisAlignedBB axisalignedbb, Entity entity) { - List list = this.a(oclass, axisalignedbb); - Entity entity1 = null; - double d0 = Double.MAX_VALUE; - - for (int i = 0; i < list.size(); ++i) { - Entity entity2 = (Entity) list.get(i); - - if (entity2 != entity) { - double d1 = entity.f(entity2); - - if (d1 <= d0) { - entity1 = entity2; - d0 = d1; - } - } - } - - return entity1; - } - - public abstract Entity getEntity(int i); - - public void b(int i, int j, int k, TileEntity tileentity) { - if (this.isLoaded(i, j, k)) { - this.getChunkAtWorldCoords(i, k).e(); - } - } - - public int a(Class oclass) { - int i = 0; - - for (int j = 0; j < this.entityList.size(); ++j) { - Entity entity = (Entity) this.entityList.get(j); - - // CraftBukkit start - Split out persistent check, don't apply it to special persistent mobs - if (entity instanceof EntityInsentient) { - EntityInsentient entityinsentient = (EntityInsentient) entity; - if (entityinsentient.isTypeNotPersistent() && entityinsentient.isPersistent()) { - continue; - } - } - - if (oclass.isAssignableFrom(entity.getClass())) { - // if ((!(entity instanceof EntityInsentient) || !((EntityInsentient) entity).isPersistent()) && oclass.isAssignableFrom(entity.getClass())) { - // CraftBukkit end - ++i; - } - } - - return i; - } - - public void a(List list) { - // CraftBukkit start - // this.entityList.addAll(list); - Entity entity = null; - - for (int i = 0; i < list.size(); ++i) { - entity = (Entity) list.get(i); - if (entity == null) { - continue; - } - this.entityList.add(entity); - // CraftBukkit end - this.a((Entity) list.get(i)); - } - } - - public void b(List list) { - this.f.addAll(list); - } - - public boolean mayPlace(Block block, int i, int j, int k, boolean flag, int l, Entity entity, ItemStack itemstack) { - Block block1 = this.getType(i, j, k); - AxisAlignedBB axisalignedbb = flag ? null : block.a(this, i, j, k); - - // CraftBukkit start - store default return - boolean defaultReturn = axisalignedbb != null && !this.a(axisalignedbb, entity) ? false : (block1.getMaterial() == Material.ORIENTABLE && block == Blocks.ANVIL ? true : block1.getMaterial().isReplaceable() && block.canPlace(this, i, j, k, l, itemstack)); - - // CraftBukkit start - BlockCanBuildEvent event = new BlockCanBuildEvent(this.getWorld().getBlockAt(i, j, k), CraftMagicNumbers.getId(block), defaultReturn); - this.getServer().getPluginManager().callEvent(event); - - return event.isBuildable(); - // CraftBukkit end - } - - public PathEntity findPath(Entity entity, Entity entity1, float f, boolean flag, boolean flag1, boolean flag2, boolean flag3) { - this.methodProfiler.a("pathfind"); - int i = MathHelper.floor(entity.locX); - int j = MathHelper.floor(entity.locY + 1.0D); - int k = MathHelper.floor(entity.locZ); - int l = (int) (f + 16.0F); - int i1 = i - l; - int j1 = j - l; - int k1 = k - l; - int l1 = i + l; - int i2 = j + l; - int j2 = k + l; - ChunkCache chunkcache = new ChunkCache(this, i1, j1, k1, l1, i2, j2, 0); - PathEntity pathentity = (new Pathfinder(chunkcache, flag, flag1, flag2, flag3)).a(entity, entity1, f); - - this.methodProfiler.b(); - return pathentity; - } - - public PathEntity a(Entity entity, int i, int j, int k, float f, boolean flag, boolean flag1, boolean flag2, boolean flag3) { - this.methodProfiler.a("pathfind"); - int l = MathHelper.floor(entity.locX); - int i1 = MathHelper.floor(entity.locY); - int j1 = MathHelper.floor(entity.locZ); - int k1 = (int) (f + 8.0F); - int l1 = l - k1; - int i2 = i1 - k1; - int j2 = j1 - k1; - int k2 = l + k1; - int l2 = i1 + k1; - int i3 = j1 + k1; - ChunkCache chunkcache = new ChunkCache(this, l1, i2, j2, k2, l2, i3, 0); - PathEntity pathentity = (new Pathfinder(chunkcache, flag, flag1, flag2, flag3)).a(entity, i, j, k, f); - - this.methodProfiler.b(); - return pathentity; - } - - public int getBlockPower(int i, int j, int k, int l) { - return this.getType(i, j, k).c(this, i, j, k, l); - } - - public int getBlockPower(int i, int j, int k) { - byte b0 = 0; - int l = Math.max(b0, this.getBlockPower(i, j - 1, k, 0)); - - if (l >= 15) { - return l; - } else { - l = Math.max(l, this.getBlockPower(i, j + 1, k, 1)); - if (l >= 15) { - return l; - } else { - l = Math.max(l, this.getBlockPower(i, j, k - 1, 2)); - if (l >= 15) { - return l; - } else { - l = Math.max(l, this.getBlockPower(i, j, k + 1, 3)); - if (l >= 15) { - return l; - } else { - l = Math.max(l, this.getBlockPower(i - 1, j, k, 4)); - if (l >= 15) { - return l; - } else { - l = Math.max(l, this.getBlockPower(i + 1, j, k, 5)); - return l >= 15 ? l : l; - } - } - } - } - } - } - - public boolean isBlockFacePowered(int i, int j, int k, int l) { - return this.getBlockFacePower(i, j, k, l) > 0; - } - - public int getBlockFacePower(int i, int j, int k, int l) { - return this.getType(i, j, k).r() ? this.getBlockPower(i, j, k) : this.getType(i, j, k).b(this, i, j, k, l); - } - - public boolean isBlockIndirectlyPowered(int i, int j, int k) { - return this.getBlockFacePower(i, j - 1, k, 0) > 0 ? true : (this.getBlockFacePower(i, j + 1, k, 1) > 0 ? true : (this.getBlockFacePower(i, j, k - 1, 2) > 0 ? true : (this.getBlockFacePower(i, j, k + 1, 3) > 0 ? true : (this.getBlockFacePower(i - 1, j, k, 4) > 0 ? true : this.getBlockFacePower(i + 1, j, k, 5) > 0)))); - } - - public int getHighestNeighborSignal(int i, int j, int k) { - int l = 0; - - for (int i1 = 0; i1 < 6; ++i1) { - int j1 = this.getBlockFacePower(i + Facing.b[i1], j + Facing.c[i1], k + Facing.d[i1], i1); - - if (j1 >= 15) { - return 15; - } - - if (j1 > l) { - l = j1; - } - } - - return l; - } - - public EntityHuman findNearbyPlayer(Entity entity, double d0) { - return this.findNearbyPlayer(entity.locX, entity.locY, entity.locZ, d0); - } - - public EntityHuman findNearbyPlayer(double d0, double d1, double d2, double d3) { - double d4 = -1.0D; - EntityHuman entityhuman = null; - - for (int i = 0; i < this.players.size(); ++i) { - EntityHuman entityhuman1 = (EntityHuman) this.players.get(i); - // CraftBukkit start - Fixed an NPE - if (entityhuman1 == null || entityhuman1.dead) { - continue; - } - // CraftBukkit end - double d5 = entityhuman1.e(d0, d1, d2); - - if ((d3 < 0.0D || d5 < d3 * d3) && (d4 == -1.0D || d5 < d4)) { - d4 = d5; - entityhuman = entityhuman1; - } - } - - return entityhuman; - } - - public EntityHuman findNearbyVulnerablePlayer(Entity entity, double d0) { - return this.findNearbyVulnerablePlayer(entity.locX, entity.locY, entity.locZ, d0); - } - - public EntityHuman findNearbyVulnerablePlayer(double d0, double d1, double d2, double d3) { - double d4 = -1.0D; - EntityHuman entityhuman = null; - - for (int i = 0; i < this.players.size(); ++i) { - EntityHuman entityhuman1 = (EntityHuman) this.players.get(i); - // CraftBukkit start - Fixed an NPE - if (entityhuman1 == null || entityhuman1.dead) { - continue; - } - // CraftBukkit end - - if (!entityhuman1.abilities.isInvulnerable && entityhuman1.isAlive()) { - double d5 = entityhuman1.e(d0, d1, d2); - double d6 = d3; - - if (entityhuman1.isSneaking()) { - d6 = d3 * 0.800000011920929D; - } - - if (entityhuman1.isInvisible()) { - float f = entityhuman1.bE(); - - if (f < 0.1F) { - f = 0.1F; - } - - d6 *= (double) (0.7F * f); - } - - if ((d3 < 0.0D || d5 < d6 * d6) && (d4 == -1.0D || d5 < d4)) { - d4 = d5; - entityhuman = entityhuman1; - } - } - } - - return entityhuman; - } - - public EntityHuman a(String s) { - for (int i = 0; i < this.players.size(); ++i) { - EntityHuman entityhuman = (EntityHuman) this.players.get(i); - - if (s.equals(entityhuman.getName())) { - return entityhuman; - } - } - - return null; - } - - public EntityHuman a(UUID uuid) { - for (int i = 0; i < this.players.size(); ++i) { - EntityHuman entityhuman = (EntityHuman) this.players.get(i); - - if (uuid.equals(entityhuman.getUniqueID())) { - return entityhuman; - } - } - - return null; - } - - public void G() throws ExceptionWorldConflict { // CraftBukkit - added throws - this.dataManager.checkSession(); - } - - public long getSeed() { - return this.worldData.getSeed(); - } - - public long getTime() { - return this.worldData.getTime(); - } - - public long getDayTime() { - return this.worldData.getDayTime(); - } - - public void setDayTime(long i) { - this.worldData.setDayTime(i); - } - - public ChunkCoordinates getSpawn() { - return new ChunkCoordinates(this.worldData.c(), this.worldData.d(), this.worldData.e()); - } - - public void x(int i, int j, int k) { - this.worldData.setSpawn(i, j, k); - } - - public boolean a(EntityHuman entityhuman, int i, int j, int k) { - return true; - } - - public void broadcastEntityEffect(Entity entity, byte b0) {} - - public IChunkProvider L() { - return this.chunkProvider; - } - - public void playBlockAction(int i, int j, int k, Block block, int l, int i1) { - block.a(this, i, j, k, l, i1); - } - - public IDataManager getDataManager() { - return this.dataManager; - } - - public WorldData getWorldData() { - return this.worldData; - } - - public GameRules getGameRules() { - return this.worldData.getGameRules(); - } - - public void everyoneSleeping() {} - - // CraftBukkit start - // Calls the method that checks to see if players are sleeping - // Called by CraftPlayer.setPermanentSleeping() - public void checkSleepStatus() { - if (!this.isStatic) { - this.everyoneSleeping(); - } - } - // CraftBukkit end - - public float h(float f) { - return (this.o + (this.p - this.o) * f) * this.j(f); - } - - public float j(float f) { - return this.m + (this.n - this.m) * f; - } - - public boolean P() { - return (double) this.h(1.0F) > 0.9D; - } - - public boolean Q() { - return (double) this.j(1.0F) > 0.2D; - } - - public boolean isRainingAt(int i, int j, int k) { - if (!this.Q()) { - return false; - } else if (!this.i(i, j, k)) { - return false; - } else if (this.h(i, k) > j) { - return false; - } else { - BiomeBase biomebase = this.getBiome(i, k); - - return biomebase.d() ? false : (this.e(i, j, k, false) ? false : biomebase.e()); - } - } - - public boolean z(int i, int j, int k) { - BiomeBase biomebase = this.getBiome(i, k); - - return biomebase.f(); - } - - public void a(String s, PersistentBase persistentbase) { - this.worldMaps.a(s, persistentbase); - } - - public PersistentBase a(Class oclass, String s) { - return this.worldMaps.get(oclass, s); - } - - public int b(String s) { - return this.worldMaps.a(s); - } - - public void b(int i, int j, int k, int l, int i1) { - for (int j1 = 0; j1 < this.u.size(); ++j1) { - ((IWorldAccess) this.u.get(j1)).a(i, j, k, l, i1); - } - } - - public void triggerEffect(int i, int j, int k, int l, int i1) { - this.a((EntityHuman) null, i, j, k, l, i1); - } - - public void a(EntityHuman entityhuman, int i, int j, int k, int l, int i1) { - try { - for (int j1 = 0; j1 < this.u.size(); ++j1) { - ((IWorldAccess) this.u.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); - } - } - - public int getHeight() { - return 256; - } - - public int S() { - return this.worldProvider.g ? 128 : 256; - } - - public Random A(int i, int j, int k) { - long l = (long) i * 341873128712L + (long) j * 132897987541L + this.getWorldData().getSeed() + (long) k; - - this.random.setSeed(l); - return this.random; - } - - public ChunkPosition b(String s, int i, int j, int k) { - return this.L().findNearestMapFeature(this, s, i, j, k); - } - - public CrashReportSystemDetails a(CrashReport crashreport) { - CrashReportSystemDetails crashreportsystemdetails = crashreport.a("Affected level", 1); - - crashreportsystemdetails.a("Level name", (this.worldData == null ? "????" : this.worldData.getName())); - crashreportsystemdetails.a("All players", (Callable) (new CrashReportPlayers(this))); - crashreportsystemdetails.a("Chunk stats", (Callable) (new CrashReportChunkStats(this))); - - try { - this.worldData.a(crashreportsystemdetails); - } catch (Throwable throwable) { - crashreportsystemdetails.a("Level Data Unobtainable", throwable); - } - - return crashreportsystemdetails; - } - - public void d(int i, int j, int k, int l, int i1) { - for (int j1 = 0; j1 < this.u.size(); ++j1) { - IWorldAccess iworldaccess = (IWorldAccess) this.u.get(j1); - - iworldaccess.b(i, j, k, l, i1); - } - } - - public Calendar V() { - if (this.getTime() % 600L == 0L) { - this.J.setTimeInMillis(MinecraftServer.ar()); - } - - return this.J; - } - - public Scoreboard getScoreboard() { - return this.scoreboard; - } - - public void updateAdjacentComparators(int i, int j, int k, Block block) { - for (int l = 0; l < 4; ++l) { - int i1 = i + Direction.a[l]; - int j1 = k + Direction.b[l]; - Block block1 = this.getType(i1, j, j1); - - if (Blocks.REDSTONE_COMPARATOR_OFF.e(block1)) { - block1.doPhysics(this, i1, j, j1, block); - } else if (block1.r()) { - i1 += Direction.a[l]; - j1 += Direction.b[l]; - Block block2 = this.getType(i1, j, j1); - - if (Blocks.REDSTONE_COMPARATOR_OFF.e(block2)) { - block2.doPhysics(this, i1, j, j1, block); - } - } - } - } - - public float b(double d0, double d1, double d2) { - return this.B(MathHelper.floor(d0), MathHelper.floor(d1), MathHelper.floor(d2)); - } - - public float B(int i, int j, int k) { - float f = 0.0F; - boolean flag = this.difficulty == EnumDifficulty.HARD; - - if (this.isLoaded(i, j, k)) { - float f1 = this.y(); - - f += MathHelper.a((float) this.getChunkAtWorldCoords(i, k).s / 3600000.0F, 0.0F, 1.0F) * (flag ? 1.0F : 0.75F); - f += f1 * 0.25F; - } - - if (this.difficulty == EnumDifficulty.EASY || this.difficulty == EnumDifficulty.PEACEFUL) { - f *= (float) this.difficulty.a() / 2.0F; - } - - return MathHelper.a(f, 0.0F, flag ? 1.5F : 1.0F); - } - - public void X() { - Iterator iterator = this.u.iterator(); - - while (iterator.hasNext()) { - IWorldAccess iworldaccess = (IWorldAccess) iterator.next(); - - iworldaccess.b(); - } - } -} diff --git a/src/main/java/net/minecraft/server/WorldGenBigTree.java b/src/main/java/net/minecraft/server/WorldGenBigTree.java deleted file mode 100644 index 1f8f1a98f6..0000000000 --- a/src/main/java/net/minecraft/server/WorldGenBigTree.java +++ /dev/null @@ -1,372 +0,0 @@ -package net.minecraft.server; - -import java.util.Random; - -public class WorldGenBigTree extends WorldGenTreeAbstract { - - static final byte[] a = new byte[] { (byte) 2, (byte) 0, (byte) 0, (byte) 1, (byte) 2, (byte) 1}; - Random b = new Random(); - World world; - int[] d = new int[] { 0, 0, 0}; - int e; - int f; - double g = 0.618D; - double h = 1.0D; - double i = 0.381D; - double j = 1.0D; - double k = 1.0D; - int l = 1; - int m = 12; - int n = 4; - int[][] o; - - public WorldGenBigTree(boolean flag) { - super(flag); - } - - void a() { - this.f = (int) ((double) this.e * this.g); - if (this.f >= this.e) { - this.f = this.e - 1; - } - - int i = (int) (1.382D + Math.pow(this.k * (double) this.e / 13.0D, 2.0D)); - - if (i < 1) { - i = 1; - } - - int[][] aint = new int[i * this.e][4]; - int j = this.d[1] + this.e - this.n; - int k = 1; - int l = this.d[1] + this.f; - int i1 = j - this.d[1]; - - aint[0][0] = this.d[0]; - aint[0][1] = j; - aint[0][2] = this.d[2]; - aint[0][3] = l; - --j; - - while (i1 >= 0) { - int j1 = 0; - float f = this.a(i1); - - if (f < 0.0F) { - --j; - --i1; - } else { - for (double d0 = 0.5D; j1 < i; ++j1) { - double d1 = this.j * (double) f * ((double) this.b.nextFloat() + 0.328D); - double d2 = (double) this.b.nextFloat() * 2.0D * 3.14159D; - int k1 = MathHelper.floor(d1 * Math.sin(d2) + (double) this.d[0] + d0); - int l1 = MathHelper.floor(d1 * Math.cos(d2) + (double) this.d[2] + d0); - int[] aint1 = new int[] { k1, j, l1}; - int[] aint2 = new int[] { k1, j + this.n, l1}; - - if (this.a(aint1, aint2) == -1) { - int[] aint3 = new int[] { this.d[0], this.d[1], this.d[2]}; - double d3 = Math.sqrt(Math.pow((double) Math.abs(this.d[0] - aint1[0]), 2.0D) + Math.pow((double) Math.abs(this.d[2] - aint1[2]), 2.0D)); - double d4 = d3 * this.i; - - if ((double) aint1[1] - d4 > (double) l) { - aint3[1] = l; - } else { - aint3[1] = (int) ((double) aint1[1] - d4); - } - - if (this.a(aint3, aint1) == -1) { - aint[k][0] = k1; - aint[k][1] = j; - aint[k][2] = l1; - aint[k][3] = aint3[1]; - ++k; - } - } - } - - --j; - --i1; - } - } - - this.o = new int[k][4]; - System.arraycopy(aint, 0, this.o, 0, k); - } - - void a(int i, int j, int k, float f, byte b0, Block block) { - int l = (int) ((double) f + 0.618D); - byte b1 = a[b0]; - byte b2 = a[b0 + 3]; - int[] aint = new int[] { i, j, k}; - int[] aint1 = new int[] { 0, 0, 0}; - int i1 = -l; - int j1 = -l; - - for (aint1[b0] = aint[b0]; i1 <= l; ++i1) { - aint1[b1] = aint[b1] + i1; - j1 = -l; - - while (j1 <= l) { - double d0 = Math.pow((double) Math.abs(i1) + 0.5D, 2.0D) + Math.pow((double) Math.abs(j1) + 0.5D, 2.0D); - - if (d0 > (double) (f * f)) { - ++j1; - } else { - aint1[b2] = aint[b2] + j1; - Block block1 = this.world.getType(aint1[0], aint1[1], aint1[2]); - - if (block1.getMaterial() != Material.AIR && block1.getMaterial() != Material.LEAVES) { - ++j1; - } else { - this.setTypeAndData(this.world, aint1[0], aint1[1], aint1[2], block, 0); - ++j1; - } - } - } - } - } - - float a(int i) { - if ((double) i < (double) ((float) this.e) * 0.3D) { - return -1.618F; - } else { - float f = (float) this.e / 2.0F; - float f1 = (float) this.e / 2.0F - (float) i; - float f2; - - if (f1 == 0.0F) { - f2 = f; - } else if (Math.abs(f1) >= f) { - f2 = 0.0F; - } else { - f2 = (float) Math.sqrt(Math.pow((double) Math.abs(f), 2.0D) - Math.pow((double) Math.abs(f1), 2.0D)); - } - - f2 *= 0.5F; - return f2; - } - } - - float b(int i) { - return i >= 0 && i < this.n ? (i != 0 && i != this.n - 1 ? 3.0F : 2.0F) : -1.0F; - } - - void a(int i, int j, int k) { - int l = j; - - for (int i1 = j + this.n; l < i1; ++l) { - float f = this.b(l - j); - - this.a(i, l, k, f, (byte) 1, Blocks.LEAVES); - } - } - - void a(int[] aint, int[] aint1, Block block) { - int[] aint2 = new int[] { 0, 0, 0}; - byte b0 = 0; - - byte b1; - - for (b1 = 0; b0 < 3; ++b0) { - aint2[b0] = aint1[b0] - aint[b0]; - if (Math.abs(aint2[b0]) > Math.abs(aint2[b1])) { - b1 = b0; - } - } - - if (aint2[b1] != 0) { - byte b2 = a[b1]; - byte b3 = a[b1 + 3]; - byte b4; - - if (aint2[b1] > 0) { - b4 = 1; - } else { - b4 = -1; - } - - double d0 = (double) aint2[b2] / (double) aint2[b1]; - double d1 = (double) aint2[b3] / (double) aint2[b1]; - int[] aint3 = new int[] { 0, 0, 0}; - int i = 0; - - for (int j = aint2[b1] + b4; i != j; i += b4) { - aint3[b1] = MathHelper.floor((double) (aint[b1] + i) + 0.5D); - aint3[b2] = MathHelper.floor((double) aint[b2] + (double) i * d0 + 0.5D); - aint3[b3] = MathHelper.floor((double) aint[b3] + (double) i * d1 + 0.5D); - byte b5 = 0; - int k = Math.abs(aint3[0] - aint[0]); - int l = Math.abs(aint3[2] - aint[2]); - int i1 = Math.max(k, l); - - if (i1 > 0) { - if (k == i1) { - b5 = 4; - } else if (l == i1) { - b5 = 8; - } - } - - this.setTypeAndData(this.world, aint3[0], aint3[1], aint3[2], block, b5); - } - } - } - - void b() { - int i = 0; - - for (int j = this.o.length; i < j; ++i) { - int k = this.o[i][0]; - int l = this.o[i][1]; - int i1 = this.o[i][2]; - - this.a(k, l, i1); - } - } - - boolean c(int i) { - return (double) i >= (double) this.e * 0.2D; - } - - void c() { - int i = this.d[0]; - int j = this.d[1]; - int k = this.d[1] + this.f; - int l = this.d[2]; - int[] aint = new int[] { i, j, l}; - int[] aint1 = new int[] { i, k, l}; - - this.a(aint, aint1, Blocks.LOG); - if (this.l == 2) { - ++aint[0]; - ++aint1[0]; - this.a(aint, aint1, Blocks.LOG); - ++aint[2]; - ++aint1[2]; - this.a(aint, aint1, Blocks.LOG); - aint[0] += -1; - aint1[0] += -1; - this.a(aint, aint1, Blocks.LOG); - } - } - - void d() { - int i = 0; - int j = this.o.length; - - for (int[] aint = new int[] { this.d[0], this.d[1], this.d[2]}; i < j; ++i) { - int[] aint1 = this.o[i]; - int[] aint2 = new int[] { aint1[0], aint1[1], aint1[2]}; - - aint[1] = aint1[3]; - int k = aint[1] - this.d[1]; - - if (this.c(k)) { - this.a(aint, aint2, Blocks.LOG); - } - } - } - - int a(int[] aint, int[] aint1) { - int[] aint2 = new int[] { 0, 0, 0}; - byte b0 = 0; - - byte b1; - - for (b1 = 0; b0 < 3; ++b0) { - aint2[b0] = aint1[b0] - aint[b0]; - if (Math.abs(aint2[b0]) > Math.abs(aint2[b1])) { - b1 = b0; - } - } - - if (aint2[b1] == 0) { - return -1; - } else { - byte b2 = a[b1]; - byte b3 = a[b1 + 3]; - byte b4; - - if (aint2[b1] > 0) { - b4 = 1; - } else { - b4 = -1; - } - - double d0 = (double) aint2[b2] / (double) aint2[b1]; - double d1 = (double) aint2[b3] / (double) aint2[b1]; - int[] aint3 = new int[] { 0, 0, 0}; - int i = 0; - - int j; - - for (j = aint2[b1] + b4; i != j; i += b4) { - aint3[b1] = aint[b1] + i; - aint3[b2] = MathHelper.floor((double) aint[b2] + (double) i * d0); - aint3[b3] = MathHelper.floor((double) aint[b3] + (double) i * d1); - Block block = this.world.getType(aint3[0], aint3[1], aint3[2]); - - if (!this.a(block) || aint[1] >= 256) { // CraftBukkit - fix trees wrapping around - break; - } - } - - return i == j ? -1 : Math.abs(i); - } - } - - boolean e() { - int[] aint = new int[] { this.d[0], this.d[1], this.d[2]}; - int[] aint1 = new int[] { this.d[0], this.d[1] + this.e - 1, this.d[2]}; - Block block = this.world.getType(this.d[0], this.d[1] - 1, this.d[2]); - - if (block != Blocks.DIRT && block != Blocks.GRASS && block != Blocks.SOIL) { - return false; - } else { - int i = this.a(aint, aint1); - - if (i == -1) { - return true; - } else if (i < 6) { - return false; - } else { - this.e = i; - return true; - } - } - } - - public void a(double d0, double d1, double d2) { - this.m = (int) (d0 * 12.0D); - if (d0 > 0.5D) { - this.n = 5; - } - - this.j = d1; - this.k = d2; - } - - public boolean generate(World world, Random random, int i, int j, int k) { - this.world = world; - long l = random.nextLong(); - - this.b.setSeed(l); - this.d[0] = i; - this.d[1] = j; - this.d[2] = k; - if (this.e == 0) { - this.e = 5 + this.b.nextInt(this.m); - } - - if (!this.e()) { - return false; - } else { - this.a(); - this.b(); - this.c(); - this.d(); - return true; - } - } -} diff --git a/src/main/java/net/minecraft/server/WorldGenGroundBush.java b/src/main/java/net/minecraft/server/WorldGenGroundBush.java deleted file mode 100644 index ea8fdb55f4..0000000000 --- a/src/main/java/net/minecraft/server/WorldGenGroundBush.java +++ /dev/null @@ -1,53 +0,0 @@ -package net.minecraft.server; - -import java.util.Random; - -public class WorldGenGroundBush extends WorldGenTrees { - - private int a; - private int b; - - public WorldGenGroundBush(int i, int j) { - super(false); - this.b = i; - this.a = j; - } - - public boolean a(World world, Random random, int i, int j, int k) { - Block block; - - while (((block = world.getType(i, j, k)).getMaterial() == Material.AIR || block.getMaterial() == Material.LEAVES) && j > 0) { - --j; - } - - Block block1 = world.getType(i, j, k); - - if (block1 == Blocks.DIRT || block1 == Blocks.GRASS) { - ++j; - this.setTypeAndData(world, i, j, k, Blocks.LOG, this.b); - - for (int l = j; l <= j + 2; ++l) { - int i1 = l - j; - int j1 = 2 - i1; - - for (int k1 = i - j1; k1 <= i + j1; ++k1) { - int l1 = k1 - i; - - for (int i2 = k - j1; i2 <= k + j1; ++i2) { - int j2 = i2 - k; - - if ((Math.abs(l1) != j1 || Math.abs(j2) != j1 || random.nextInt(2) != 0) && !world.getType(k1, l, i2).j()) { - this.setTypeAndData(world, k1, l, i2, Blocks.LEAVES, this.a); - } - } - } - } - // CraftBukkit start - Return false if gen was unsuccessful - } else { - return false; - } - // CraftBukkit end - - return true; - } -} diff --git a/src/main/java/net/minecraft/server/WorldGenMegaTreeAbstract.java b/src/main/java/net/minecraft/server/WorldGenMegaTreeAbstract.java deleted file mode 100644 index 0fd21716fa..0000000000 --- a/src/main/java/net/minecraft/server/WorldGenMegaTreeAbstract.java +++ /dev/null @@ -1,126 +0,0 @@ -package net.minecraft.server; - -import java.util.Random; - -public abstract class WorldGenMegaTreeAbstract extends WorldGenTreeAbstract { - - protected final int a; - protected final int b; - protected final int c; - protected int d; - - public WorldGenMegaTreeAbstract(boolean flag, int i, int j, int k, int l) { - super(flag); - this.a = i; - this.d = j; - this.b = k; - this.c = l; - } - - protected int a(Random random) { - int i = random.nextInt(3) + this.a; - - if (this.d > 1) { - i += random.nextInt(this.d); - } - - return i; - } - - private boolean b(World world, Random random, int i, int j, int k, int l) { - boolean flag = true; - - if (j >= 1 && j + l + 1 <= 256) { - for (int i1 = j; i1 <= j + 1 + l; ++i1) { - byte b0 = 2; - - if (i1 == j) { - b0 = 1; - } - - if (i1 >= j + 1 + l - 2) { - b0 = 2; - } - - for (int j1 = i - b0; j1 <= i + b0 && flag; ++j1) { - for (int k1 = k - b0; k1 <= k + b0 && flag; ++k1) { - if (i1 >= 0 && i1 < 256) { - Block block = world.getType(j1, i1, k1); - - // CraftBukkit - ignore our own saplings - if (block != Blocks.SAPLING && !this.a(block)) { - flag = false; - } - } else { - flag = false; - } - } - } - } - - return flag; - } else { - return false; - } - } - - private boolean c(World world, Random random, int i, int j, int k) { - Block block = world.getType(i, j - 1, k); - - if ((block == Blocks.GRASS || block == Blocks.DIRT) && j >= 2) { - world.setTypeAndData(i, j - 1, k, Blocks.DIRT, 0, 2); - world.setTypeAndData(i + 1, j - 1, k, Blocks.DIRT, 0, 2); - world.setTypeAndData(i, j - 1, k + 1, Blocks.DIRT, 0, 2); - world.setTypeAndData(i + 1, j - 1, k + 1, Blocks.DIRT, 0, 2); - return true; - } else { - return false; - } - } - - protected boolean a(World world, Random random, int i, int j, int k, int l) { - return this.b(world, random, i, j, k, l) && this.c(world, random, i, j, k); - } - - protected void a(World world, int i, int j, int k, int l, Random random) { - int i1 = l * l; - - for (int j1 = i - l; j1 <= i + l + 1; ++j1) { - int k1 = j1 - i; - - for (int l1 = k - l; l1 <= k + l + 1; ++l1) { - int i2 = l1 - k; - int j2 = k1 - 1; - int k2 = i2 - 1; - - if (k1 * k1 + i2 * i2 <= i1 || j2 * j2 + k2 * k2 <= i1 || k1 * k1 + k2 * k2 <= i1 || j2 * j2 + i2 * i2 <= i1) { - Block block = world.getType(j1, j, l1); - - if (block.getMaterial() == Material.AIR || block.getMaterial() == Material.LEAVES) { - this.setTypeAndData(world, j1, j, l1, Blocks.LEAVES, this.c); - } - } - } - } - } - - protected void b(World world, int i, int j, int k, int l, Random random) { - int i1 = l * l; - - for (int j1 = i - l; j1 <= i + l; ++j1) { - int k1 = j1 - i; - - for (int l1 = k - l; l1 <= k + l; ++l1) { - int i2 = l1 - k; - - if (k1 * k1 + i2 * i2 <= i1) { - Block block = world.getType(j1, j, l1); - - if (block.getMaterial() == Material.AIR || block.getMaterial() == Material.LEAVES) { - this.setTypeAndData(world, j1, j, l1, Blocks.LEAVES, this.c); - } - } - } - } - } -} diff --git a/src/main/java/net/minecraft/server/WorldGenVillagePiece.java b/src/main/java/net/minecraft/server/WorldGenVillagePiece.java deleted file mode 100644 index dd228e777d..0000000000 --- a/src/main/java/net/minecraft/server/WorldGenVillagePiece.java +++ /dev/null @@ -1,189 +0,0 @@ -package net.minecraft.server; - -import java.util.List; -import java.util.Random; - -abstract class WorldGenVillagePiece extends StructurePiece { - - protected int k = -1; - private int a; - private boolean b; - - public WorldGenVillagePiece() {} - - protected WorldGenVillagePiece(WorldGenVillageStartPiece worldgenvillagestartpiece, int i) { - super(i); - if (worldgenvillagestartpiece != null) { - this.b = worldgenvillagestartpiece.b; - } - } - - protected void a(NBTTagCompound nbttagcompound) { - nbttagcompound.setInt("HPos", this.k); - nbttagcompound.setInt("VCount", this.a); - nbttagcompound.setBoolean("Desert", this.b); - } - - protected void b(NBTTagCompound nbttagcompound) { - this.k = nbttagcompound.getInt("HPos"); - this.a = nbttagcompound.getInt("VCount"); - this.b = nbttagcompound.getBoolean("Desert"); - } - - protected StructurePiece a(WorldGenVillageStartPiece worldgenvillagestartpiece, List list, Random random, int i, int j) { - switch (this.g) { - case 0: - return WorldGenVillagePieces.a(worldgenvillagestartpiece, list, random, this.f.a - 1, this.f.b + i, this.f.c + j, 1, this.d()); - - case 1: - return WorldGenVillagePieces.a(worldgenvillagestartpiece, list, random, this.f.a + j, this.f.b + i, this.f.c - 1, 2, this.d()); - - case 2: - return WorldGenVillagePieces.a(worldgenvillagestartpiece, list, random, this.f.a - 1, this.f.b + i, this.f.c + j, 1, this.d()); - - case 3: - return WorldGenVillagePieces.a(worldgenvillagestartpiece, list, random, this.f.a + j, this.f.b + i, this.f.c - 1, 2, this.d()); - - default: - return null; - } - } - - protected StructurePiece b(WorldGenVillageStartPiece worldgenvillagestartpiece, List list, Random random, int i, int j) { - switch (this.g) { - case 0: - return WorldGenVillagePieces.a(worldgenvillagestartpiece, list, random, this.f.d + 1, this.f.b + i, this.f.c + j, 3, this.d()); - - case 1: - return WorldGenVillagePieces.a(worldgenvillagestartpiece, list, random, this.f.a + j, this.f.b + i, this.f.f + 1, 0, this.d()); - - case 2: - return WorldGenVillagePieces.a(worldgenvillagestartpiece, list, random, this.f.d + 1, this.f.b + i, this.f.c + j, 3, this.d()); - - case 3: - return WorldGenVillagePieces.a(worldgenvillagestartpiece, list, random, this.f.a + j, this.f.b + i, this.f.f + 1, 0, this.d()); - - default: - return null; - } - } - - protected int b(World world, StructureBoundingBox structureboundingbox) { - int i = 0; - int j = 0; - - for (int k = this.f.c; k <= this.f.f; ++k) { - for (int l = this.f.a; l <= this.f.d; ++l) { - if (structureboundingbox.b(l, 64, k)) { - i += Math.max(world.i(l, k), world.worldProvider.getSeaLevel()); - ++j; - } - } - } - - if (j == 0) { - return -1; - } else { - return i / j; - } - } - - protected static boolean a(StructureBoundingBox structureboundingbox) { - return structureboundingbox != null && structureboundingbox.b > 10; - } - - protected void a(World world, StructureBoundingBox structureboundingbox, int i, int j, int k, int l) { - if (this.a < l) { - for (int i1 = this.a; i1 < l; ++i1) { - int j1 = this.a(i + i1, k); - int k1 = this.a(j); - int l1 = this.b(i + i1, k); - - if (!structureboundingbox.b(j1, k1, l1)) { - break; - } - - ++this.a; - EntityVillager entityvillager = new EntityVillager(world, this.b(i1)); - - entityvillager.setPositionRotation((double) j1 + 0.5D, (double) k1, (double) l1 + 0.5D, 0.0F, 0.0F); - world.addEntity(entityvillager, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.CHUNK_GEN); // CraftBukkit - add SpawnReason - } - } - } - - protected int b(int i) { - return 0; - } - - protected Block b(Block block, int i) { - if (this.b) { - if (block == Blocks.LOG || block == Blocks.LOG2) { - return Blocks.SANDSTONE; - } - - if (block == Blocks.COBBLESTONE) { - return Blocks.SANDSTONE; - } - - if (block == Blocks.WOOD) { - return Blocks.SANDSTONE; - } - - if (block == Blocks.WOOD_STAIRS) { - return Blocks.SANDSTONE_STAIRS; - } - - if (block == Blocks.COBBLESTONE_STAIRS) { - return Blocks.SANDSTONE_STAIRS; - } - - if (block == Blocks.GRAVEL) { - return Blocks.SANDSTONE; - } - } - - return block; - } - - protected int c(Block block, int i) { - if (this.b) { - if (block == Blocks.LOG || block == Blocks.LOG2) { - return 0; - } - - if (block == Blocks.COBBLESTONE) { - return 0; - } - - if (block == Blocks.WOOD) { - return 2; - } - } - - return i; - } - - protected void a(World world, Block block, int i, int j, int k, int l, StructureBoundingBox structureboundingbox) { - Block block1 = this.b(block, i); - int i1 = this.c(block, i); - - super.a(world, block1, i1, j, k, l, structureboundingbox); - } - - protected void a(World world, StructureBoundingBox structureboundingbox, int i, int j, int k, int l, int i1, int j1, Block block, Block block1, boolean flag) { - Block block2 = this.b(block, 0); - int k1 = this.c(block, 0); - Block block3 = this.b(block1, 0); - int l1 = this.c(block1, 0); - - super.a(world, structureboundingbox, i, j, k, l, i1, j1, block2, k1, block3, l1, flag); - } - - protected void b(World world, Block block, int i, int j, int k, int l, StructureBoundingBox structureboundingbox) { - Block block1 = this.b(block, i); - int i1 = this.c(block, i); - - super.b(world, block1, i1, j, k, l, structureboundingbox); - } -} diff --git a/src/main/java/net/minecraft/server/WorldGenVillagePieces.java b/src/main/java/net/minecraft/server/WorldGenVillagePieces.java deleted file mode 100644 index e08c6fe2ac..0000000000 --- a/src/main/java/net/minecraft/server/WorldGenVillagePieces.java +++ /dev/null @@ -1,199 +0,0 @@ -package net.minecraft.server; - -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; -import java.util.Random; - -public class WorldGenVillagePieces { - - public static void a() { - WorldGenFactory.a(WorldGenVillageLibrary.class, "ViBH"); - WorldGenFactory.a(WorldGenVillageFarm2.class, "ViDF"); - WorldGenFactory.a(WorldGenVillageFarm.class, "ViF"); - WorldGenFactory.a(WorldGenVillageLight.class, "ViL"); - WorldGenFactory.a(WorldGenVillageButcher.class, "ViPH"); - WorldGenFactory.a(WorldGenVillageHouse.class, "ViSH"); - WorldGenFactory.a(WorldGenVillageHut.class, "ViSmH"); - WorldGenFactory.a(WorldGenVillageTemple.class, "ViST"); - WorldGenFactory.a(WorldGenVillageBlacksmith.class, "ViS"); - WorldGenFactory.a(WorldGenVillageStartPiece.class, "ViStart"); - WorldGenFactory.a(WorldGenVillageRoad.class, "ViSR"); - WorldGenFactory.a(WorldGenVillageHouse2.class, "ViTRH"); - WorldGenFactory.a(WorldGenVillageWell.class, "ViW"); - } - - public static List a(Random random, int i) { - ArrayList arraylist = new ArrayList(); - - arraylist.add(new WorldGenVillagePieceWeight(WorldGenVillageHouse.class, 4, MathHelper.nextInt(random, 2 + i, 4 + i * 2))); - arraylist.add(new WorldGenVillagePieceWeight(WorldGenVillageTemple.class, 20, MathHelper.nextInt(random, 0 + i, 1 + i))); - arraylist.add(new WorldGenVillagePieceWeight(WorldGenVillageLibrary.class, 20, MathHelper.nextInt(random, 0 + i, 2 + i))); - arraylist.add(new WorldGenVillagePieceWeight(WorldGenVillageHut.class, 3, MathHelper.nextInt(random, 2 + i, 5 + i * 3))); - arraylist.add(new WorldGenVillagePieceWeight(WorldGenVillageButcher.class, 15, MathHelper.nextInt(random, 0 + i, 2 + i))); - arraylist.add(new WorldGenVillagePieceWeight(WorldGenVillageFarm2.class, 3, MathHelper.nextInt(random, 1 + i, 4 + i))); - arraylist.add(new WorldGenVillagePieceWeight(WorldGenVillageFarm.class, 3, MathHelper.nextInt(random, 2 + i, 4 + i * 2))); - arraylist.add(new WorldGenVillagePieceWeight(WorldGenVillageBlacksmith.class, 15, MathHelper.nextInt(random, 0, 1 + i))); - arraylist.add(new WorldGenVillagePieceWeight(WorldGenVillageHouse2.class, 8, MathHelper.nextInt(random, 0 + i, 3 + i * 2))); - Iterator iterator = arraylist.iterator(); - - while (iterator.hasNext()) { - if (((WorldGenVillagePieceWeight) iterator.next()).d == 0) { - iterator.remove(); - } - } - - return arraylist; - } - - private static int a(List list) { - boolean flag = false; - int i = 0; - - WorldGenVillagePieceWeight worldgenvillagepieceweight; - - for (Iterator iterator = list.iterator(); iterator.hasNext(); i += worldgenvillagepieceweight.b) { - worldgenvillagepieceweight = (WorldGenVillagePieceWeight) iterator.next(); - if (worldgenvillagepieceweight.d > 0 && worldgenvillagepieceweight.c < worldgenvillagepieceweight.d) { - flag = true; - } - } - - return flag ? i : -1; - } - - private static WorldGenVillagePiece a(WorldGenVillageStartPiece worldgenvillagestartpiece, WorldGenVillagePieceWeight worldgenvillagepieceweight, List list, Random random, int i, int j, int k, int l, int i1) { - Class oclass = worldgenvillagepieceweight.a; - Object object = null; - - if (oclass == WorldGenVillageHouse.class) { - object = WorldGenVillageHouse.a(worldgenvillagestartpiece, list, random, i, j, k, l, i1); - } else if (oclass == WorldGenVillageTemple.class) { - object = WorldGenVillageTemple.a(worldgenvillagestartpiece, list, random, i, j, k, l, i1); - } else if (oclass == WorldGenVillageLibrary.class) { - object = WorldGenVillageLibrary.a(worldgenvillagestartpiece, list, random, i, j, k, l, i1); - } else if (oclass == WorldGenVillageHut.class) { - object = WorldGenVillageHut.a(worldgenvillagestartpiece, list, random, i, j, k, l, i1); - } else if (oclass == WorldGenVillageButcher.class) { - object = WorldGenVillageButcher.a(worldgenvillagestartpiece, list, random, i, j, k, l, i1); - } else if (oclass == WorldGenVillageFarm2.class) { - object = WorldGenVillageFarm2.a(worldgenvillagestartpiece, list, random, i, j, k, l, i1); - } else if (oclass == WorldGenVillageFarm.class) { - object = WorldGenVillageFarm.a(worldgenvillagestartpiece, list, random, i, j, k, l, i1); - } else if (oclass == WorldGenVillageBlacksmith.class) { - object = WorldGenVillageBlacksmith.a(worldgenvillagestartpiece, list, random, i, j, k, l, i1); - } else if (oclass == WorldGenVillageHouse2.class) { - object = WorldGenVillageHouse2.a(worldgenvillagestartpiece, list, random, i, j, k, l, i1); - } - - return (WorldGenVillagePiece) object; - } - - private static WorldGenVillagePiece c(WorldGenVillageStartPiece worldgenvillagestartpiece, List list, Random random, int i, int j, int k, int l, int i1) { - int j1 = a(worldgenvillagestartpiece.e); - - if (j1 <= 0) { - return null; - } else { - int k1 = 0; - - while (k1 < 5) { - ++k1; - int l1 = random.nextInt(j1); - Iterator iterator = worldgenvillagestartpiece.e.iterator(); - - while (iterator.hasNext()) { - WorldGenVillagePieceWeight worldgenvillagepieceweight = (WorldGenVillagePieceWeight) iterator.next(); - - l1 -= worldgenvillagepieceweight.b; - if (l1 < 0) { - if (!worldgenvillagepieceweight.a(i1) || worldgenvillagepieceweight == worldgenvillagestartpiece.d && worldgenvillagestartpiece.e.size() > 1) { - break; - } - - WorldGenVillagePiece worldgenvillagepiece = a(worldgenvillagestartpiece, worldgenvillagepieceweight, list, random, i, j, k, l, i1); - - if (worldgenvillagepiece != null) { - ++worldgenvillagepieceweight.c; - worldgenvillagestartpiece.d = worldgenvillagepieceweight; - if (!worldgenvillagepieceweight.a()) { - worldgenvillagestartpiece.e.remove(worldgenvillagepieceweight); - } - - return worldgenvillagepiece; - } - } - } - } - - StructureBoundingBox structureboundingbox = WorldGenVillageLight.a(worldgenvillagestartpiece, list, random, i, j, k, l); - - if (structureboundingbox != null) { - return new WorldGenVillageLight(worldgenvillagestartpiece, i1, random, structureboundingbox, l); - } else { - return null; - } - } - } - - private static StructurePiece d(WorldGenVillageStartPiece worldgenvillagestartpiece, List list, Random random, int i, int j, int k, int l, int i1) { - if (i1 > 50) { - return null; - } else if (Math.abs(i - worldgenvillagestartpiece.c().a) <= 112 && Math.abs(k - worldgenvillagestartpiece.c().c) <= 112) { - WorldGenVillagePiece worldgenvillagepiece = c(worldgenvillagestartpiece, list, random, i, j, k, l, i1 + 1); - - if (worldgenvillagepiece != null) { - int j1 = (worldgenvillagepiece.f.a + worldgenvillagepiece.f.d) / 2; - int k1 = (worldgenvillagepiece.f.c + worldgenvillagepiece.f.f) / 2; - int l1 = worldgenvillagepiece.f.d - worldgenvillagepiece.f.a; - int i2 = worldgenvillagepiece.f.f - worldgenvillagepiece.f.c; - int j2 = l1 > i2 ? l1 : i2; - - if (worldgenvillagestartpiece.e().a(j1, k1, j2 / 2 + 4, WorldGenVillage.e)) { - list.add(worldgenvillagepiece); - worldgenvillagestartpiece.i.add(worldgenvillagepiece); - return worldgenvillagepiece; - } - } - - return null; - } else { - return null; - } - } - - private static StructurePiece e(WorldGenVillageStartPiece worldgenvillagestartpiece, List list, Random random, int i, int j, int k, int l, int i1) { - if (i1 > 3 + worldgenvillagestartpiece.c) { - return null; - } else if (Math.abs(i - worldgenvillagestartpiece.c().a) <= 112 && Math.abs(k - worldgenvillagestartpiece.c().c) <= 112) { - StructureBoundingBox structureboundingbox = WorldGenVillageRoad.a(worldgenvillagestartpiece, list, random, i, j, k, l); - - if (structureboundingbox != null && structureboundingbox.b > 10) { - WorldGenVillageRoad worldgenvillageroad = new WorldGenVillageRoad(worldgenvillagestartpiece, i1, random, structureboundingbox, l); - int j1 = (worldgenvillageroad.f.a + worldgenvillageroad.f.d) / 2; - int k1 = (worldgenvillageroad.f.c + worldgenvillageroad.f.f) / 2; - int l1 = worldgenvillageroad.f.d - worldgenvillageroad.f.a; - int i2 = worldgenvillageroad.f.f - worldgenvillageroad.f.c; - int j2 = l1 > i2 ? l1 : i2; - - if (worldgenvillagestartpiece.e().a(j1, k1, j2 / 2 + 4, WorldGenVillage.e)) { - list.add(worldgenvillageroad); - worldgenvillagestartpiece.j.add(worldgenvillageroad); - return worldgenvillageroad; - } - } - - return null; - } else { - return null; - } - } - - static StructurePiece a(WorldGenVillageStartPiece worldgenvillagestartpiece, List list, Random random, int i, int j, int k, int l, int i1) { - return d(worldgenvillagestartpiece, list, random, i, j, k, l, i1); - } - - static StructurePiece b(WorldGenVillageStartPiece worldgenvillagestartpiece, List list, Random random, int i, int j, int k, int l, int i1) { - return e(worldgenvillagestartpiece, list, random, i, j, k, l, i1); - } -} diff --git a/src/main/java/net/minecraft/server/WorldGenWitchHut.java b/src/main/java/net/minecraft/server/WorldGenWitchHut.java deleted file mode 100644 index ae60aeb884..0000000000 --- a/src/main/java/net/minecraft/server/WorldGenWitchHut.java +++ /dev/null @@ -1,87 +0,0 @@ -package net.minecraft.server; - -import java.util.Random; - -public class WorldGenWitchHut extends WorldGenScatteredPiece { - - private boolean e; - - public WorldGenWitchHut() {} - - public WorldGenWitchHut(Random random, int i, int j) { - super(random, i, 64, j, 7, 5, 9); - } - - protected void a(NBTTagCompound nbttagcompound) { - super.a(nbttagcompound); - nbttagcompound.setBoolean("Witch", this.e); - } - - protected void b(NBTTagCompound nbttagcompound) { - super.b(nbttagcompound); - this.e = nbttagcompound.getBoolean("Witch"); - } - - public boolean a(World world, Random random, StructureBoundingBox structureboundingbox) { - if (!this.a(world, structureboundingbox, 0)) { - return false; - } else { - this.a(world, structureboundingbox, 1, 1, 1, 5, 1, 7, Blocks.WOOD, 1, Blocks.WOOD, 1, false); - this.a(world, structureboundingbox, 1, 4, 2, 5, 4, 7, Blocks.WOOD, 1, Blocks.WOOD, 1, false); - this.a(world, structureboundingbox, 2, 1, 0, 4, 1, 0, Blocks.WOOD, 1, Blocks.WOOD, 1, false); - this.a(world, structureboundingbox, 2, 2, 2, 3, 3, 2, Blocks.WOOD, 1, Blocks.WOOD, 1, false); - this.a(world, structureboundingbox, 1, 2, 3, 1, 3, 6, Blocks.WOOD, 1, Blocks.WOOD, 1, false); - this.a(world, structureboundingbox, 5, 2, 3, 5, 3, 6, Blocks.WOOD, 1, Blocks.WOOD, 1, false); - this.a(world, structureboundingbox, 2, 2, 7, 4, 3, 7, Blocks.WOOD, 1, Blocks.WOOD, 1, false); - this.a(world, structureboundingbox, 1, 0, 2, 1, 3, 2, Blocks.LOG, Blocks.LOG, false); - this.a(world, structureboundingbox, 5, 0, 2, 5, 3, 2, Blocks.LOG, Blocks.LOG, false); - this.a(world, structureboundingbox, 1, 0, 7, 1, 3, 7, Blocks.LOG, Blocks.LOG, false); - this.a(world, structureboundingbox, 5, 0, 7, 5, 3, 7, Blocks.LOG, Blocks.LOG, false); - this.a(world, Blocks.FENCE, 0, 2, 3, 2, structureboundingbox); - this.a(world, Blocks.FENCE, 0, 3, 3, 7, structureboundingbox); - this.a(world, Blocks.AIR, 0, 1, 3, 4, structureboundingbox); - this.a(world, Blocks.AIR, 0, 5, 3, 4, structureboundingbox); - this.a(world, Blocks.AIR, 0, 5, 3, 5, structureboundingbox); - this.a(world, Blocks.FLOWER_POT, 7, 1, 3, 5, structureboundingbox); - this.a(world, Blocks.WORKBENCH, 0, 3, 2, 6, structureboundingbox); - this.a(world, Blocks.CAULDRON, 0, 4, 2, 6, structureboundingbox); - this.a(world, Blocks.FENCE, 0, 1, 2, 1, structureboundingbox); - this.a(world, Blocks.FENCE, 0, 5, 2, 1, structureboundingbox); - int i = this.a(Blocks.WOOD_STAIRS, 3); - int j = this.a(Blocks.WOOD_STAIRS, 1); - int k = this.a(Blocks.WOOD_STAIRS, 0); - int l = this.a(Blocks.WOOD_STAIRS, 2); - - this.a(world, structureboundingbox, 0, 4, 1, 6, 4, 1, Blocks.SPRUCE_WOOD_STAIRS, i, Blocks.SPRUCE_WOOD_STAIRS, i, false); - this.a(world, structureboundingbox, 0, 4, 2, 0, 4, 7, Blocks.SPRUCE_WOOD_STAIRS, k, Blocks.SPRUCE_WOOD_STAIRS, k, false); - this.a(world, structureboundingbox, 6, 4, 2, 6, 4, 7, Blocks.SPRUCE_WOOD_STAIRS, j, Blocks.SPRUCE_WOOD_STAIRS, j, false); - this.a(world, structureboundingbox, 0, 4, 8, 6, 4, 8, Blocks.SPRUCE_WOOD_STAIRS, l, Blocks.SPRUCE_WOOD_STAIRS, l, false); - - int i1; - int j1; - - for (i1 = 2; i1 <= 7; i1 += 5) { - for (j1 = 1; j1 <= 5; j1 += 4) { - this.b(world, Blocks.LOG, 0, j1, -1, i1, structureboundingbox); - } - } - - if (!this.e) { - i1 = this.a(2, 5); - j1 = this.a(2); - int k1 = this.b(2, 5); - - if (structureboundingbox.b(i1, j1, k1)) { - this.e = true; - EntityWitch entitywitch = new EntityWitch(world); - - entitywitch.setPositionRotation((double) i1 + 0.5D, (double) j1, (double) k1 + 0.5D, 0.0F, 0.0F); - entitywitch.prepare((GroupDataEntity) null); - world.addEntity(entitywitch, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.CHUNK_GEN); // CraftBukkit - add SpawnReason - } - } - - return true; - } - } -} diff --git a/src/main/java/net/minecraft/server/WorldManager.java b/src/main/java/net/minecraft/server/WorldManager.java deleted file mode 100644 index b3499024ed..0000000000 --- a/src/main/java/net/minecraft/server/WorldManager.java +++ /dev/null @@ -1,73 +0,0 @@ -package net.minecraft.server; - -import java.util.Iterator; - -public class WorldManager implements IWorldAccess { - - private MinecraftServer server; - public WorldServer world; // CraftBukkit - private -> public - - public WorldManager(MinecraftServer minecraftserver, WorldServer worldserver) { - this.server = minecraftserver; - this.world = worldserver; - } - - public void a(String s, double d0, double d1, double d2, double d3, double d4, double d5) {} - - public void a(Entity entity) { - this.world.getTracker().track(entity); - } - - public void b(Entity entity) { - this.world.getTracker().untrackEntity(entity); - } - - public void a(String s, double d0, double d1, double d2, float f, float f1) { - // CraftBukkit - this.world.dimension - this.server.getPlayerList().sendPacketNearby(d0, d1, d2, f > 1.0F ? (double) (16.0F * f) : 16.0D, this.world.dimension, new PacketPlayOutNamedSoundEffect(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.getPlayerList().sendPacketNearby(entityhuman, d0, d1, d2, f > 1.0F ? (double) (16.0F * f) : 16.0D, this.world.dimension, new PacketPlayOutNamedSoundEffect(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.getPlayerChunkMap().flagDirty(i, j, k); - } - - public void b(int i, int j, int k) {} - - public void a(String s, int i, int j, int k) {} - - public void a(EntityHuman entityhuman, int i, int j, int k, int l, int i1) { - // CraftBukkit - this.world.dimension - this.server.getPlayerList().sendPacketNearby(entityhuman, (double) j, (double) k, (double) l, 64.0D, this.world.dimension, new PacketPlayOutWorldEvent(i, j, k, l, i1, false)); - } - - public void a(int i, int j, int k, int l, int i1) { - this.server.getPlayerList().sendAll(new PacketPlayOutWorldEvent(i, j, k, l, i1, true)); - } - - public void b(int i, int j, int k, int l, int i1) { - Iterator iterator = this.server.getPlayerList().players.iterator(); - - while (iterator.hasNext()) { - EntityPlayer entityplayer = (EntityPlayer) iterator.next(); - - if (entityplayer != null && entityplayer.world == this.world && entityplayer.getId() != i) { - double d0 = (double) j - entityplayer.locX; - double d1 = (double) k - entityplayer.locY; - double d2 = (double) l - entityplayer.locZ; - - if (d0 * d0 + d1 * d1 + d2 * d2 < 1024.0D) { - entityplayer.playerConnection.sendPacket(new PacketPlayOutBlockBreakAnimation(i, j, k, l, i1)); - } - } - } - } - - public void b() {} -} diff --git a/src/main/java/net/minecraft/server/WorldMap.java b/src/main/java/net/minecraft/server/WorldMap.java deleted file mode 100644 index bd5cfca8c2..0000000000 --- a/src/main/java/net/minecraft/server/WorldMap.java +++ /dev/null @@ -1,243 +0,0 @@ -package net.minecraft.server; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; - -// CraftBukkit start -import java.util.UUID; - -import org.bukkit.craftbukkit.CraftServer; -import org.bukkit.craftbukkit.CraftWorld; -import org.bukkit.craftbukkit.map.CraftMapView; -// CraftBukkit end - -public class WorldMap extends PersistentBase { - - public int centerX; - public int centerZ; - public byte map; - public byte scale; - public byte[] colors = new byte[16384]; - public List f = new ArrayList(); - private Map i = new HashMap(); - public Map decorations = new LinkedHashMap(); - - // CraftBukkit start - public final CraftMapView mapView; - private CraftServer server; - private UUID uniqueId = null; - // CraftBukkit end - - public WorldMap(String s) { - super(s); - // CraftBukkit start - mapView = new CraftMapView(this); - server = (CraftServer) org.bukkit.Bukkit.getServer(); - // CraftBukkit end - } - - public void a(NBTTagCompound nbttagcompound) { - // CraftBukkit start - byte dimension = nbttagcompound.getByte("dimension"); - - if (dimension >= 10) { - long least = nbttagcompound.getLong("UUIDLeast"); - long most = nbttagcompound.getLong("UUIDMost"); - - if (least != 0L && most != 0L) { - this.uniqueId = new UUID(most, least); - - CraftWorld world = (CraftWorld) server.getWorld(this.uniqueId); - // Check if the stored world details are correct. - if (world == null) { - /* All Maps which do not have their valid world loaded are set to a dimension which hopefully won't be reached. - This is to prevent them being corrupted with the wrong map data. */ - dimension = 127; - } else { - dimension = (byte) world.getHandle().dimension; - } - } - } - - this.map = dimension; - // CraftBukkit end - this.centerX = nbttagcompound.getInt("xCenter"); - this.centerZ = nbttagcompound.getInt("zCenter"); - this.scale = nbttagcompound.getByte("scale"); - if (this.scale < 0) { - this.scale = 0; - } - - if (this.scale > 4) { - this.scale = 4; - } - - short short1 = nbttagcompound.getShort("width"); - short short2 = nbttagcompound.getShort("height"); - - if (short1 == 128 && short2 == 128) { - this.colors = nbttagcompound.getByteArray("colors"); - } else { - byte[] abyte = nbttagcompound.getByteArray("colors"); - - this.colors = new byte[16384]; - int i = (128 - short1) / 2; - int j = (128 - short2) / 2; - - for (int k = 0; k < short2; ++k) { - int l = k + j; - - if (l >= 0 || l < 128) { - for (int i1 = 0; i1 < short1; ++i1) { - int j1 = i1 + i; - - if (j1 >= 0 || j1 < 128) { - this.colors[j1 + l * 128] = abyte[i1 + k * short1]; - } - } - } - } - } - } - - public void b(NBTTagCompound nbttagcompound) { - // CraftBukkit start - if (this.map >= 10) { - if (this.uniqueId == null) { - for (org.bukkit.World world : server.getWorlds()) { - CraftWorld cWorld = (CraftWorld) world; - if (cWorld.getHandle().dimension == this.map) { - this.uniqueId = cWorld.getUID(); - break; - } - } - } - /* Perform a second check to see if a matching world was found, this is a necessary - change incase Maps are forcefully unlinked from a World and lack a UID.*/ - if (this.uniqueId != null) { - nbttagcompound.setLong("UUIDLeast", this.uniqueId.getLeastSignificantBits()); - nbttagcompound.setLong("UUIDMost", this.uniqueId.getMostSignificantBits()); - } - } - // CraftBukkit end - nbttagcompound.setByte("dimension", this.map); - nbttagcompound.setInt("xCenter", this.centerX); - nbttagcompound.setInt("zCenter", this.centerZ); - nbttagcompound.setByte("scale", this.scale); - nbttagcompound.setShort("width", (short) 128); - nbttagcompound.setShort("height", (short) 128); - nbttagcompound.setByteArray("colors", this.colors); - } - - public void a(EntityHuman entityhuman, ItemStack itemstack) { - if (!this.i.containsKey(entityhuman)) { - WorldMapHumanTracker worldmaphumantracker = new WorldMapHumanTracker(this, entityhuman); - - this.i.put(entityhuman, worldmaphumantracker); - this.f.add(worldmaphumantracker); - } - - if (!entityhuman.inventory.c(itemstack)) { - this.decorations.remove(entityhuman.getName()); - } - - for (int i = 0; i < this.f.size(); ++i) { - WorldMapHumanTracker worldmaphumantracker1 = (WorldMapHumanTracker) this.f.get(i); - - if (!worldmaphumantracker1.trackee.dead && (worldmaphumantracker1.trackee.inventory.c(itemstack) || itemstack.A())) { - if (!itemstack.A() && worldmaphumantracker1.trackee.dimension == this.map) { - this.a(0, worldmaphumantracker1.trackee.world, worldmaphumantracker1.trackee.getName(), worldmaphumantracker1.trackee.locX, worldmaphumantracker1.trackee.locZ, (double) worldmaphumantracker1.trackee.yaw); - } - } else { - this.i.remove(worldmaphumantracker1.trackee); - this.f.remove(worldmaphumantracker1); - } - } - - if (itemstack.A()) { - this.a(1, entityhuman.world, "frame-" + itemstack.B().getId(), (double) itemstack.B().x, (double) itemstack.B().z, (double) (itemstack.B().direction * 90)); - } - } - - private void a(int i, World world, String s, double d0, double d1, double d2) { - int j = 1 << this.scale; - float f = (float) (d0 - (double) this.centerX) / (float) j; - float f1 = (float) (d1 - (double) this.centerZ) / (float) j; - byte b0 = (byte) ((int) ((double) (f * 2.0F) + 0.5D)); - byte b1 = (byte) ((int) ((double) (f1 * 2.0F) + 0.5D)); - byte b2 = 63; - byte b3; - - if (f >= (float) (-b2) && f1 >= (float) (-b2) && f <= (float) b2 && f1 <= (float) b2) { - d2 += d2 < 0.0D ? -8.0D : 8.0D; - b3 = (byte) ((int) (d2 * 16.0D / 360.0D)); - if (this.map < 0) { - int k = (int) (world.getWorldData().getDayTime() / 10L); - - b3 = (byte) (k * k * 34187121 + k * 121 >> 15 & 15); - } - } else { - if (Math.abs(f) >= 320.0F || Math.abs(f1) >= 320.0F) { - this.decorations.remove(s); - return; - } - - i = 6; - b3 = 0; - if (f <= (float) (-b2)) { - b0 = (byte) ((int) ((double) (b2 * 2) + 2.5D)); - } - - if (f1 <= (float) (-b2)) { - b1 = (byte) ((int) ((double) (b2 * 2) + 2.5D)); - } - - if (f >= (float) b2) { - b0 = (byte) (b2 * 2 + 1); - } - - if (f1 >= (float) b2) { - b1 = (byte) (b2 * 2 + 1); - } - } - - this.decorations.put(s, new WorldMapDecoration(this, (byte) i, b0, b1, b3)); - } - - public byte[] getUpdatePacket(ItemStack itemstack, World world, EntityHuman entityhuman) { - WorldMapHumanTracker worldmaphumantracker = (WorldMapHumanTracker) this.i.get(entityhuman); - - return worldmaphumantracker == null ? null : worldmaphumantracker.a(itemstack); - } - - public void flagDirty(int i, int j, int k) { - super.c(); - - for (int l = 0; l < this.f.size(); ++l) { - WorldMapHumanTracker worldmaphumantracker = (WorldMapHumanTracker) this.f.get(l); - - if (worldmaphumantracker.b[i] < 0 || worldmaphumantracker.b[i] > j) { - worldmaphumantracker.b[i] = j; - } - - if (worldmaphumantracker.c[i] < 0 || worldmaphumantracker.c[i] < k) { - worldmaphumantracker.c[i] = k; - } - } - } - - public WorldMapHumanTracker a(EntityHuman entityhuman) { - WorldMapHumanTracker worldmaphumantracker = (WorldMapHumanTracker) this.i.get(entityhuman); - - if (worldmaphumantracker == null) { - worldmaphumantracker = new WorldMapHumanTracker(this, entityhuman); - this.i.put(entityhuman, worldmaphumantracker); - this.f.add(worldmaphumantracker); - } - - return worldmaphumantracker; - } -} diff --git a/src/main/java/net/minecraft/server/WorldMapHumanTracker.java b/src/main/java/net/minecraft/server/WorldMapHumanTracker.java deleted file mode 100644 index ec708d1adb..0000000000 --- a/src/main/java/net/minecraft/server/WorldMapHumanTracker.java +++ /dev/null @@ -1,103 +0,0 @@ -package net.minecraft.server; - -import java.util.Iterator; - -public class WorldMapHumanTracker { - - public final EntityHuman trackee; - public int[] b; - public int[] c; - private int f; - private int g; - private byte[] h; - public int d; - private boolean i; - final WorldMap worldMap; - - public WorldMapHumanTracker(WorldMap worldmap, EntityHuman entityhuman) { - this.worldMap = worldmap; - this.b = new int[128]; - this.c = new int[128]; - this.trackee = entityhuman; - - for (int i = 0; i < this.b.length; ++i) { - this.b[i] = 0; - this.c[i] = 127; - } - } - - public byte[] a(ItemStack itemstack) { - byte[] abyte; - - if (!this.i) { - abyte = new byte[] { (byte) 2, this.worldMap.scale}; - this.i = true; - return abyte; - } else { - int i; - int j; - - org.bukkit.craftbukkit.map.RenderData render = this.worldMap.mapView.render((org.bukkit.craftbukkit.entity.CraftPlayer) trackee.getBukkitEntity()); // CraftBukkit - - if (--this.g < 0) { - this.g = 4; - abyte = new byte[render.cursors.size() * 3 + 1]; // CraftBukkit - abyte[0] = 1; - i = 0; - - // CraftBukkit start - for (i = 0; i < render.cursors.size(); ++i) { - org.bukkit.map.MapCursor cursor = render.cursors.get(i); - if (!cursor.isVisible()) continue; - - abyte[i * 3 + 1] = (byte) (cursor.getRawType() << 4 | cursor.getDirection() & 15); - abyte[i * 3 + 2] = (byte) cursor.getX(); - abyte[i * 3 + 3] = (byte) cursor.getY(); - } - // CraftBukkit end - - boolean flag = !itemstack.A(); - - if (this.h != null && this.h.length == abyte.length) { - for (j = 0; j < abyte.length; ++j) { - if (abyte[j] != this.h[j]) { - flag = false; - break; - } - } - } else { - flag = false; - } - - if (!flag) { - this.h = abyte; - return abyte; - } - } - - for (int k = 0; k < 1; ++k) { - i = this.f++ * 11 % 128; - if (this.b[i] >= 0) { - int l = this.c[i] - this.b[i] + 1; - - j = this.b[i]; - byte[] abyte1 = new byte[l + 3]; - - abyte1[0] = 0; - abyte1[1] = (byte) i; - abyte1[2] = (byte) j; - - for (int i1 = 0; i1 < abyte1.length - 3; ++i1) { - abyte1[i1 + 3] = render.buffer[(i1 + j) * 128 + i]; // CraftBukkit - } - - this.c[i] = -1; - this.b[i] = -1; - return abyte1; - } - } - - return null; - } - } -} diff --git a/src/main/java/net/minecraft/server/WorldNBTStorage.java b/src/main/java/net/minecraft/server/WorldNBTStorage.java deleted file mode 100644 index 93ff8d3bd7..0000000000 --- a/src/main/java/net/minecraft/server/WorldNBTStorage.java +++ /dev/null @@ -1,310 +0,0 @@ -package net.minecraft.server; - -import java.io.DataInputStream; -import java.io.DataOutputStream; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; - -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; - -// CraftBukkit start -import java.util.UUID; - -import org.bukkit.craftbukkit.entity.CraftPlayer; -// CraftBukkit end - -public class WorldNBTStorage implements IDataManager, IPlayerFileData { - - private static final Logger a = LogManager.getLogger(); - private final File baseDir; - private final File playerDir; - private final File dataDir; - private final long sessionId = MinecraftServer.ar(); - private final String f; - private UUID uuid = null; // CraftBukkit - - public WorldNBTStorage(File file1, String s, boolean flag) { - this.baseDir = new File(file1, s); - this.baseDir.mkdirs(); - this.playerDir = new File(this.baseDir, "playerdata"); - this.dataDir = new File(this.baseDir, "data"); - this.dataDir.mkdirs(); - this.f = s; - if (flag) { - this.playerDir.mkdirs(); - } - - this.h(); - } - - private void h() { - try { - File file1 = new File(this.baseDir, "session.lock"); - DataOutputStream dataoutputstream = new DataOutputStream(new FileOutputStream(file1)); - - try { - dataoutputstream.writeLong(this.sessionId); - } finally { - dataoutputstream.close(); - } - } catch (IOException ioexception) { - ioexception.printStackTrace(); - throw new RuntimeException("Failed to check session lock, aborting"); - } - } - - public File getDirectory() { - return this.baseDir; - } - - public void checkSession() throws ExceptionWorldConflict { // CraftBukkit - throws ExceptionWorldConflict - try { - File file1 = new File(this.baseDir, "session.lock"); - DataInputStream datainputstream = new DataInputStream(new FileInputStream(file1)); - - try { - if (datainputstream.readLong() != this.sessionId) { - throw new ExceptionWorldConflict("The save is being accessed from another location, aborting"); - } - } finally { - datainputstream.close(); - } - } catch (IOException ioexception) { - throw new ExceptionWorldConflict("Failed to check session lock, aborting"); - } - } - - public IChunkLoader createChunkLoader(WorldProvider worldprovider) { - throw new RuntimeException("Old Chunk Storage is no longer supported."); - } - - public WorldData getWorldData() { - File file1 = new File(this.baseDir, "level.dat"); - NBTTagCompound nbttagcompound; - NBTTagCompound nbttagcompound1; - - if (file1.exists()) { - try { - nbttagcompound = NBTCompressedStreamTools.a((InputStream) (new FileInputStream(file1))); - nbttagcompound1 = nbttagcompound.getCompound("Data"); - return new WorldData(nbttagcompound1); - } catch (Exception exception) { - exception.printStackTrace(); - } - } - - file1 = new File(this.baseDir, "level.dat_old"); - if (file1.exists()) { - try { - nbttagcompound = NBTCompressedStreamTools.a((InputStream) (new FileInputStream(file1))); - nbttagcompound1 = nbttagcompound.getCompound("Data"); - return new WorldData(nbttagcompound1); - } catch (Exception exception1) { - exception1.printStackTrace(); - } - } - - return null; - } - - public void saveWorldData(WorldData worlddata, NBTTagCompound nbttagcompound) { - NBTTagCompound nbttagcompound1 = worlddata.a(nbttagcompound); - NBTTagCompound nbttagcompound2 = new NBTTagCompound(); - - nbttagcompound2.set("Data", nbttagcompound1); - - try { - File file1 = new File(this.baseDir, "level.dat_new"); - File file2 = new File(this.baseDir, "level.dat_old"); - File file3 = new File(this.baseDir, "level.dat"); - - NBTCompressedStreamTools.a(nbttagcompound2, (OutputStream) (new FileOutputStream(file1))); - if (file2.exists()) { - file2.delete(); - } - - file3.renameTo(file2); - if (file3.exists()) { - file3.delete(); - } - - file1.renameTo(file3); - if (file1.exists()) { - file1.delete(); - } - } catch (Exception exception) { - exception.printStackTrace(); - } - } - - public void saveWorldData(WorldData worlddata) { - NBTTagCompound nbttagcompound = worlddata.a(); - NBTTagCompound nbttagcompound1 = new NBTTagCompound(); - - nbttagcompound1.set("Data", nbttagcompound); - - try { - File file1 = new File(this.baseDir, "level.dat_new"); - File file2 = new File(this.baseDir, "level.dat_old"); - File file3 = new File(this.baseDir, "level.dat"); - - NBTCompressedStreamTools.a(nbttagcompound1, (OutputStream) (new FileOutputStream(file1))); - if (file2.exists()) { - file2.delete(); - } - - file3.renameTo(file2); - if (file3.exists()) { - file3.delete(); - } - - file1.renameTo(file3); - if (file1.exists()) { - file1.delete(); - } - } catch (Exception exception) { - exception.printStackTrace(); - } - } - - public void save(EntityHuman entityhuman) { - try { - NBTTagCompound nbttagcompound = new NBTTagCompound(); - - entityhuman.e(nbttagcompound); - File file1 = new File(this.playerDir, entityhuman.getUniqueID().toString() + ".dat.tmp"); - File file2 = new File(this.playerDir, entityhuman.getUniqueID().toString() + ".dat"); - - NBTCompressedStreamTools.a(nbttagcompound, (OutputStream) (new FileOutputStream(file1))); - if (file2.exists()) { - file2.delete(); - } - - file1.renameTo(file2); - } catch (Exception exception) { - a.warn("Failed to save player data for " + entityhuman.getName()); - } - } - - public NBTTagCompound load(EntityHuman entityhuman) { - NBTTagCompound nbttagcompound = null; - - try { - File file1 = new File(this.playerDir, entityhuman.getUniqueID().toString() + ".dat"); - - if (file1.exists() && file1.isFile()) { - nbttagcompound = NBTCompressedStreamTools.a((InputStream) (new FileInputStream(file1))); - } - } catch (Exception exception) { - a.warn("Failed to load player data for " + entityhuman.getName()); - } - - if (nbttagcompound != null) { - // CraftBukkit start - if (entityhuman instanceof EntityPlayer) { - CraftPlayer player = (CraftPlayer) entityhuman.bukkitEntity; - // Only update first played if it is older than the one we have - long modified = new File(this.playerDir, entityhuman.getUniqueID().toString() + ".dat").lastModified(); - if (modified < player.getFirstPlayed()) { - player.setFirstPlayed(modified); - } - } - // CraftBukkit end - - entityhuman.f(nbttagcompound); - } - - return nbttagcompound; - } - - public NBTTagCompound getPlayerData(String s) { - try { - File file1 = new File(this.playerDir, s + ".dat"); - - if (file1.exists()) { - return NBTCompressedStreamTools.a((InputStream) (new FileInputStream(file1))); - } - } catch (Exception exception) { - a.warn("Failed to load player data for " + s); - } - - return null; - } - - public IPlayerFileData getPlayerFileData() { - return this; - } - - public String[] getSeenPlayers() { - String[] astring = this.playerDir.list(); - - for (int i = 0; i < astring.length; ++i) { - if (astring[i].endsWith(".dat")) { - astring[i] = astring[i].substring(0, astring[i].length() - 4); - } - } - - return astring; - } - - public void a() {} - - public File getDataFile(String s) { - return new File(this.dataDir, s + ".dat"); - } - - public String g() { - return this.f; - } - - // CraftBukkit start - public UUID getUUID() { - if (uuid != null) return uuid; - File file1 = new File(this.baseDir, "uid.dat"); - if (file1.exists()) { - DataInputStream dis = null; - try { - dis = new DataInputStream(new FileInputStream(file1)); - return uuid = new UUID(dis.readLong(), dis.readLong()); - } catch (IOException ex) { - a.warn("Failed to read " + file1 + ", generating new random UUID", ex); - } finally { - if (dis != null) { - try { - dis.close(); - } catch (IOException ex) { - // NOOP - } - } - } - } - uuid = UUID.randomUUID(); - DataOutputStream dos = null; - try { - dos = new DataOutputStream(new FileOutputStream(file1)); - dos.writeLong(uuid.getMostSignificantBits()); - dos.writeLong(uuid.getLeastSignificantBits()); - } catch (IOException ex) { - a.warn("Failed to write " + file1, ex); - } finally { - if (dos != null) { - try { - dos.close(); - } catch (IOException ex) { - // NOOP - } - } - } - return uuid; - } - - public File getPlayerDir() { - return playerDir; - } - // CraftBukkit end -} diff --git a/src/main/java/net/minecraft/server/WorldServer.java b/src/main/java/net/minecraft/server/WorldServer.java deleted file mode 100644 index ba7965db6d..0000000000 --- a/src/main/java/net/minecraft/server/WorldServer.java +++ /dev/null @@ -1,1006 +0,0 @@ -package net.minecraft.server; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Random; -import java.util.Set; -import java.util.TreeSet; - -import net.minecraft.util.com.google.common.collect.Lists; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; - -// CraftBukkit start -import org.bukkit.WeatherType; -import org.bukkit.block.BlockState; -import org.bukkit.craftbukkit.util.LongHash; - -import org.bukkit.event.block.BlockFormEvent; -import org.bukkit.event.weather.LightningStrikeEvent; -import org.bukkit.event.weather.ThunderChangeEvent; -import org.bukkit.event.weather.WeatherChangeEvent; -// CraftBukkit end - -public class WorldServer extends World { - - private static final Logger a = LogManager.getLogger(); - private final MinecraftServer server; - public EntityTracker tracker; // CraftBukkit - private final -> public - private final PlayerChunkMap manager; - private Set M; - private TreeSet N; - public ChunkProviderServer chunkProviderServer; - public boolean savingDisabled; - private boolean O; - private int emptyTime; - private final PortalTravelAgent Q; - private final SpawnerCreature R = new SpawnerCreature(); - private BlockActionDataList[] S = new BlockActionDataList[] { new BlockActionDataList((BananaAPI) null), new BlockActionDataList((BananaAPI) null)}; - private int T; - private static final StructurePieceTreasure[] U = new StructurePieceTreasure[] { new StructurePieceTreasure(Items.STICK, 0, 1, 3, 10), new StructurePieceTreasure(Item.getItemOf(Blocks.WOOD), 0, 1, 3, 10), new StructurePieceTreasure(Item.getItemOf(Blocks.LOG), 0, 1, 3, 10), new StructurePieceTreasure(Items.STONE_AXE, 0, 1, 1, 3), new StructurePieceTreasure(Items.WOOD_AXE, 0, 1, 1, 5), new StructurePieceTreasure(Items.STONE_PICKAXE, 0, 1, 1, 3), new StructurePieceTreasure(Items.WOOD_PICKAXE, 0, 1, 1, 5), new StructurePieceTreasure(Items.APPLE, 0, 2, 3, 5), new StructurePieceTreasure(Items.BREAD, 0, 2, 3, 3), new StructurePieceTreasure(Item.getItemOf(Blocks.LOG2), 0, 1, 3, 10)}; - private List V = new ArrayList(); - private IntHashMap entitiesById; - - // CraftBukkit start - public final int dimension; - - // Add env and gen to constructor - public WorldServer(MinecraftServer minecraftserver, IDataManager idatamanager, String s, int i, WorldSettings worldsettings, MethodProfiler methodprofiler, org.bukkit.World.Environment env, org.bukkit.generator.ChunkGenerator gen) { - super(idatamanager, s, worldsettings, WorldProvider.byDimension(env.getId()), methodprofiler, gen, env); - this.dimension = i; - this.pvpMode = minecraftserver.getPvP(); - // CraftBukkit end - this.server = minecraftserver; - this.tracker = new EntityTracker(this); - this.manager = new PlayerChunkMap(this); - if (this.entitiesById == null) { - this.entitiesById = new IntHashMap(); - } - - if (this.M == null) { - this.M = new HashSet(); - } - - if (this.N == null) { - this.N = new TreeSet(); - } - - this.Q = new org.bukkit.craftbukkit.CraftTravelAgent(this); // CraftBukkit - this.scoreboard = new ScoreboardServer(minecraftserver); - PersistentScoreboard persistentscoreboard = (PersistentScoreboard) this.worldMaps.get(PersistentScoreboard.class, "scoreboard"); - - if (persistentscoreboard == null) { - persistentscoreboard = new PersistentScoreboard(); - this.worldMaps.a("scoreboard", persistentscoreboard); - } - - persistentscoreboard.a(this.scoreboard); - ((ScoreboardServer) this.scoreboard).a(persistentscoreboard); - } - - // CraftBukkit start - @Override - public TileEntity getTileEntity(int i, int j, int k) { - TileEntity result = super.getTileEntity(i, j, k); - Block type = getType(i, j, k); - - if (type == Blocks.CHEST) { - if (!(result instanceof TileEntityChest)) { - result = fixTileEntity(i, j, k, type, result); - } - } else if (type == Blocks.FURNACE) { - if (!(result instanceof TileEntityFurnace)) { - result = fixTileEntity(i, j, k, type, result); - } - } else if (type == Blocks.DROPPER) { - if (!(result instanceof TileEntityDropper)) { - result = fixTileEntity(i, j, k, type, result); - } - } else if (type == Blocks.DISPENSER) { - if (!(result instanceof TileEntityDispenser)) { - result = fixTileEntity(i, j, k, type, result); - } - } else if (type == Blocks.JUKEBOX) { - if (!(result instanceof TileEntityRecordPlayer)) { - result = fixTileEntity(i, j, k, type, result); - } - } else if (type == Blocks.NOTE_BLOCK) { - if (!(result instanceof TileEntityNote)) { - result = fixTileEntity(i, j, k, type, result); - } - } else if (type == Blocks.MOB_SPAWNER) { - if (!(result instanceof TileEntityMobSpawner)) { - result = fixTileEntity(i, j, k, type, result); - } - } else if ((type == Blocks.SIGN_POST) || (type == Blocks.WALL_SIGN)) { - if (!(result instanceof TileEntitySign)) { - result = fixTileEntity(i, j, k, type, result); - } - } else if (type == Blocks.ENDER_CHEST) { - if (!(result instanceof TileEntityEnderChest)) { - result = fixTileEntity(i, j, k, type, result); - } - } else if (type == Blocks.BREWING_STAND) { - if (!(result instanceof TileEntityBrewingStand)) { - result = fixTileEntity(i, j, k, type, result); - } - } else if (type == Blocks.BEACON) { - if (!(result instanceof TileEntityBeacon)) { - result = fixTileEntity(i, j, k, type, result); - } - } else if (type == Blocks.HOPPER) { - if (!(result instanceof TileEntityHopper)) { - result = fixTileEntity(i, j, k, type, result); - } - } - - return result; - } - - private TileEntity fixTileEntity(int x, int y, int z, Block type, TileEntity found) { - this.getServer().getLogger().severe("Block at " + x + "," + y + "," + z + " is " + org.bukkit.Material.getMaterial(Block.getId(type)).toString() + " but has " + found + ". " - + "Bukkit will attempt to fix this, but there may be additional damage that we cannot recover."); - - if (type instanceof IContainer) { - TileEntity replacement = ((IContainer) type).a(this, this.getData(x, y, z)); - replacement.world = this; - this.setTileEntity(x, y, z, replacement); - return replacement; - } else { - this.getServer().getLogger().severe("Don't know how to fix for this type... Can't do anything! :("); - return found; - } - } - - private boolean canSpawn(int x, int z) { - if (this.generator != null) { - return this.generator.canSpawn(this.getWorld(), x, z); - } else { - return this.worldProvider.canSpawn(x, z); - } - } - // CraftBukkit end - - public void doTick() { - super.doTick(); - if (this.getWorldData().isHardcore() && this.difficulty != EnumDifficulty.HARD) { - this.difficulty = EnumDifficulty.HARD; - } - - this.worldProvider.e.b(); - if (this.everyoneDeeplySleeping()) { - if (this.getGameRules().getBoolean("doDaylightCycle")) { - long i = this.worldData.getDayTime() + 24000L; - - this.worldData.setDayTime(i - i % 24000L); - } - - this.d(); - } - - this.methodProfiler.a("mobSpawner"); - // CraftBukkit start - Only call spawner if we have players online and the world allows for mobs or animals - long time = this.worldData.getTime(); - if (this.getGameRules().getBoolean("doMobSpawning") && (this.allowMonsters || this.allowAnimals) && (this instanceof WorldServer && this.players.size() > 0)) { - this.R.spawnEntities(this, this.allowMonsters && (this.ticksPerMonsterSpawns != 0 && time % this.ticksPerMonsterSpawns == 0L), this.allowAnimals && (this.ticksPerAnimalSpawns != 0 && time % this.ticksPerAnimalSpawns == 0L), this.worldData.getTime() % 400L == 0L); - // CraftBukkit end - } - - this.methodProfiler.c("chunkSource"); - this.chunkProvider.unloadChunks(); - int j = this.a(1.0F); - - if (j != this.j) { - this.j = j; - } - - this.worldData.setTime(this.worldData.getTime() + 1L); - if (this.getGameRules().getBoolean("doDaylightCycle")) { - this.worldData.setDayTime(this.worldData.getDayTime() + 1L); - } - - this.methodProfiler.c("tickPending"); - this.a(false); - this.methodProfiler.c("tickBlocks"); - this.g(); - this.methodProfiler.c("chunkMap"); - this.manager.flush(); - this.methodProfiler.c("village"); - this.villages.tick(); - this.siegeManager.a(); - this.methodProfiler.c("portalForcer"); - this.Q.a(this.getTime()); - this.methodProfiler.b(); - this.Z(); - - this.getWorld().processChunkGC(); // CraftBukkit - } - - public BiomeMeta a(EnumCreatureType enumcreaturetype, int i, int j, int k) { - List list = this.L().getMobsFor(enumcreaturetype, i, j, k); - - return list != null && !list.isEmpty() ? (BiomeMeta) WeightedRandom.a(this.random, (Collection) list) : null; - } - - public void everyoneSleeping() { - this.O = !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; - break; - } - } - } - - protected void d() { - this.O = false; - Iterator iterator = this.players.iterator(); - - while (iterator.hasNext()) { - EntityHuman entityhuman = (EntityHuman) iterator.next(); - - if (entityhuman.isSleeping()) { - entityhuman.a(false, false, true); - } - } - - this.Y(); - } - - private void Y() { - // CraftBukkit start - WeatherChangeEvent weather = new WeatherChangeEvent(this.getWorld(), false); - this.getServer().getPluginManager().callEvent(weather); - - ThunderChangeEvent thunder = new ThunderChangeEvent(this.getWorld(), false); - this.getServer().getPluginManager().callEvent(thunder); - if (!weather.isCancelled()) { - this.worldData.setWeatherDuration(0); - this.worldData.setStorm(false); - } - if (!thunder.isCancelled()) { - this.worldData.setThunderDuration(0); - this.worldData.setThundering(false); - } - // CraftBukkit end - } - - public boolean everyoneDeeplySleeping() { - if (this.O && !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 - boolean foundActualSleepers = false; - - EntityHuman entityhuman; - - do { - if (!iterator.hasNext()) { - return foundActualSleepers; // CraftBukkit - } - - entityhuman = (EntityHuman) iterator.next(); - // CraftBukkit start - if (entityhuman.isDeeplySleeping()) { - foundActualSleepers = true; - } - } while (entityhuman.isDeeplySleeping() || entityhuman.fauxSleeping); - // CraftBukkit end - - return false; - } else { - return false; - } - } - - protected void g() { - super.g(); - int i = 0; - int j = 0; - // CraftBukkit start - // Iterator iterator = this.chunkTickList.iterator(); - - for (long chunkCoord : this.chunkTickList.popAll()) { - // ChunkCoordIntPair chunkcoordintpair = (ChunkCoordIntPair) iterator.next(); - int chunkX = LongHash.msw(chunkCoord); - int chunkZ = LongHash.lsw(chunkCoord); - int k = chunkX * 16; - int l = chunkZ * 16; - - this.methodProfiler.a("getChunk"); - Chunk chunk = this.getChunkAt(chunkX, chunkZ); - // CraftBukkit end - - this.a(k, l, chunk); - this.methodProfiler.c("tickChunk"); - chunk.b(false); - this.methodProfiler.c("thunder"); - int i1; - int j1; - int k1; - int l1; - - if (this.random.nextInt(100000) == 0 && this.Q() && this.P()) { - this.k = this.k * 3 + 1013904223; - i1 = this.k >> 2; - j1 = k + (i1 & 15); - k1 = l + (i1 >> 8 & 15); - l1 = this.h(j1, k1); - if (this.isRainingAt(j1, l1, k1)) { - this.strikeLightning(new EntityLightning(this, (double) j1, (double) l1, (double) k1)); - } - } - - this.methodProfiler.c("iceandsnow"); - if (this.random.nextInt(16) == 0) { - this.k = this.k * 3 + 1013904223; - i1 = this.k >> 2; - j1 = i1 & 15; - k1 = i1 >> 8 & 15; - l1 = this.h(j1 + k, k1 + l); - if (this.s(j1 + k, l1 - 1, k1 + l)) { - // CraftBukkit start - BlockState blockState = this.getWorld().getBlockAt(j1 + k, l1 - 1, k1 + l).getState(); - blockState.setTypeId(Block.getId(Blocks.ICE)); - - BlockFormEvent iceBlockForm = new BlockFormEvent(blockState.getBlock(), blockState); - this.getServer().getPluginManager().callEvent(iceBlockForm); - if (!iceBlockForm.isCancelled()) { - blockState.update(true); - } - // CraftBukkit end - } - - if (this.Q() && this.e(j1 + k, l1, k1 + l, true)) { - // CraftBukkit start - BlockState blockState = this.getWorld().getBlockAt(j1 + k, l1, k1 + l).getState(); - blockState.setTypeId(Block.getId(Blocks.SNOW)); - - BlockFormEvent snow = new BlockFormEvent(blockState.getBlock(), blockState); - this.getServer().getPluginManager().callEvent(snow); - if (!snow.isCancelled()) { - blockState.update(true); - } - // CraftBukkit end - } - - if (this.Q()) { - BiomeBase biomebase = this.getBiome(j1 + k, k1 + l); - - if (biomebase.e()) { - this.getType(j1 + k, l1 - 1, k1 + l).l(this, j1 + k, l1 - 1, k1 + l); - } - } - } - - this.methodProfiler.c("tickBlocks"); - ChunkSection[] achunksection = chunk.getSections(); - - j1 = achunksection.length; - - for (k1 = 0; k1 < j1; ++k1) { - ChunkSection chunksection = achunksection[k1]; - - if (chunksection != null && chunksection.shouldTick()) { - for (int i2 = 0; i2 < 3; ++i2) { - this.k = this.k * 3 + 1013904223; - int j2 = this.k >> 2; - int k2 = j2 & 15; - int l2 = j2 >> 8 & 15; - int i3 = j2 >> 16 & 15; - - ++j; - Block block = chunksection.getTypeId(k2, i3, l2); - - if (block.isTicking()) { - ++i; - block.a(this, k2 + k, i3 + chunksection.getYPosition(), l2 + l, this.random); - } - } - } - } - - this.methodProfiler.b(); - } - } - - public boolean a(int i, int j, int k, Block block) { - NextTickListEntry nextticklistentry = new NextTickListEntry(i, j, k, block); - - return this.V.contains(nextticklistentry); - } - - public void a(int i, int j, int k, Block block, int l) { - this.a(i, j, k, block, l, 0); - } - - public void a(int i, int j, int k, Block block, int l, int i1) { - NextTickListEntry nextticklistentry = new NextTickListEntry(i, j, k, block); - byte b0 = 0; - - if (this.d && block.getMaterial() != Material.AIR) { - if (block.L()) { - b0 = 8; - if (this.b(nextticklistentry.a - b0, nextticklistentry.b - b0, nextticklistentry.c - b0, nextticklistentry.a + b0, nextticklistentry.b + b0, nextticklistentry.c + b0)) { - Block block1 = this.getType(nextticklistentry.a, nextticklistentry.b, nextticklistentry.c); - - if (block1.getMaterial() != Material.AIR && block1 == nextticklistentry.a()) { - block1.a(this, nextticklistentry.a, nextticklistentry.b, nextticklistentry.c, this.random); - } - } - - return; - } - - l = 1; - } - - if (this.b(i - b0, j - b0, k - b0, i + b0, j + b0, k + b0)) { - if (block.getMaterial() != Material.AIR) { - nextticklistentry.a((long) l + this.worldData.getTime()); - nextticklistentry.a(i1); - } - - if (!this.M.contains(nextticklistentry)) { - this.M.add(nextticklistentry); - this.N.add(nextticklistentry); - } - } - } - - public void b(int i, int j, int k, Block block, int l, int i1) { - NextTickListEntry nextticklistentry = new NextTickListEntry(i, j, k, block); - - nextticklistentry.a(i1); - if (block.getMaterial() != Material.AIR) { - nextticklistentry.a((long) l + this.worldData.getTime()); - } - - if (!this.M.contains(nextticklistentry)) { - this.M.add(nextticklistentry); - this.N.add(nextticklistentry); - } - } - - public void tickEntities() { - if (false && this.players.isEmpty()) { // CraftBukkit - this prevents entity cleanup, other issues on servers with no players - if (this.emptyTime++ >= 1200) { - return; - } - } else { - this.i(); - } - - super.tickEntities(); - } - - public void i() { - this.emptyTime = 0; - } - - public boolean a(boolean flag) { - int i = this.N.size(); - - if (i != this.M.size()) { - throw new IllegalStateException("TickNextTick list out of synch"); - } else { - if (i > 1000) { - // CraftBukkit start - If the server has too much to process over time, try to alleviate that - if (i > 20 * 1000) { - i = i / 20; - } else { - i = 1000; - } - // CraftBukkit end - } - - this.methodProfiler.a("cleaning"); - - NextTickListEntry nextticklistentry; - - for (int j = 0; j < i; ++j) { - nextticklistentry = (NextTickListEntry) this.N.first(); - if (!flag && nextticklistentry.d > this.worldData.getTime()) { - break; - } - - this.N.remove(nextticklistentry); - this.M.remove(nextticklistentry); - this.V.add(nextticklistentry); - } - - this.methodProfiler.b(); - this.methodProfiler.a("ticking"); - Iterator iterator = this.V.iterator(); - - while (iterator.hasNext()) { - nextticklistentry = (NextTickListEntry) iterator.next(); - iterator.remove(); - byte b0 = 0; - - if (this.b(nextticklistentry.a - b0, nextticklistentry.b - b0, nextticklistentry.c - b0, nextticklistentry.a + b0, nextticklistentry.b + b0, nextticklistentry.c + b0)) { - Block block = this.getType(nextticklistentry.a, nextticklistentry.b, nextticklistentry.c); - - if (block.getMaterial() != Material.AIR && Block.a(block, nextticklistentry.a())) { - try { - block.a(this, nextticklistentry.a, nextticklistentry.b, nextticklistentry.c, this.random); - } catch (Throwable throwable) { - CrashReport crashreport = CrashReport.a(throwable, "Exception while ticking a block"); - CrashReportSystemDetails crashreportsystemdetails = crashreport.a("Block being ticked"); - - int k; - - try { - k = this.getData(nextticklistentry.a, nextticklistentry.b, nextticklistentry.c); - } catch (Throwable throwable1) { - k = -1; - } - - CrashReportSystemDetails.a(crashreportsystemdetails, nextticklistentry.a, nextticklistentry.b, nextticklistentry.c, block, k); - throw new ReportedException(crashreport); - } - } - } else { - this.a(nextticklistentry.a, nextticklistentry.b, nextticklistentry.c, nextticklistentry.a(), 0); - } - } - - this.methodProfiler.b(); - this.V.clear(); - return !this.N.isEmpty(); - } - } - - public List a(Chunk chunk, boolean flag) { - ArrayList arraylist = null; - ChunkCoordIntPair chunkcoordintpair = chunk.l(); - int i = (chunkcoordintpair.x << 4) - 2; - int j = i + 16 + 2; - int k = (chunkcoordintpair.z << 4) - 2; - int l = k + 16 + 2; - - for (int i1 = 0; i1 < 2; ++i1) { - Iterator iterator; - - if (i1 == 0) { - iterator = this.N.iterator(); - } else { - iterator = this.V.iterator(); - if (!this.V.isEmpty()) { - a.debug("toBeTicked = " + this.V.size()); - } - } - - 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); - iterator.remove(); - } - - if (arraylist == null) { - arraylist = new ArrayList(); - } - - arraylist.add(nextticklistentry); - } - } - } - - return arraylist; - } - - /* CraftBukkit start - We prevent spawning in general, so this butchering is not needed - public void entityJoinedWorld(Entity entity, boolean flag) { - if (!this.server.getSpawnAnimals() && (entity instanceof EntityAnimal || entity instanceof EntityWaterAnimal)) { - entity.die(); - } - - if (!this.server.getSpawnNPCs() && entity instanceof NPC) { - entity.die(); - } - - super.entityJoinedWorld(entity, flag); - } - // CraftBukkit end */ - - protected IChunkProvider j() { - IChunkLoader ichunkloader = this.dataManager.createChunkLoader(this.worldProvider); - - // CraftBukkit start - org.bukkit.craftbukkit.generator.InternalChunkGenerator gen; - - if (this.generator != null) { - gen = new org.bukkit.craftbukkit.generator.CustomChunkGenerator(this, this.getSeed(), this.generator); - } else if (this.worldProvider instanceof WorldProviderHell) { - gen = new org.bukkit.craftbukkit.generator.NetherChunkGenerator(this, this.getSeed()); - } else if (this.worldProvider instanceof WorldProviderTheEnd) { - gen = new org.bukkit.craftbukkit.generator.SkyLandsChunkGenerator(this, this.getSeed()); - } else { - gen = new org.bukkit.craftbukkit.generator.NormalChunkGenerator(this, this.getSeed()); - } - - this.chunkProviderServer = new ChunkProviderServer(this, ichunkloader, gen); - // CraftBukkit end - - return this.chunkProviderServer; - } - - public List getTileEntities(int i, int j, int k, int l, int i1, int j1) { - ArrayList arraylist = new ArrayList(); - - // CraftBukkit start - Get tile entities from chunks instead of world - for (int chunkX = (i >> 4); chunkX <= ((l - 1) >> 4); chunkX++) { - for (int chunkZ = (k >> 4); chunkZ <= ((j1 - 1) >> 4); chunkZ++) { - Chunk chunk = getChunkAt(chunkX, chunkZ); - if (chunk == null) { - continue; - } - - for (Object te : chunk.tileEntities.values()) { - TileEntity tileentity = (TileEntity) te; - if ((tileentity.x >= i) && (tileentity.y >= j) && (tileentity.z >= k) && (tileentity.x < l) && (tileentity.y < i1) && (tileentity.z < j1)) { - arraylist.add(tileentity); - } - } - } - } - // CraftBukkit end - - return arraylist; - } - - public boolean a(EntityHuman entityhuman, int i, int j, int k) { - return !this.server.a(this, i, j, k, entityhuman); - } - - protected void a(WorldSettings worldsettings) { - if (this.entitiesById == null) { - this.entitiesById = new IntHashMap(); - } - - if (this.M == null) { - this.M = new HashSet(); - } - - if (this.N == null) { - this.N = new TreeSet(); - } - - this.b(worldsettings); - super.a(worldsettings); - } - - protected void b(WorldSettings worldsettings) { - if (!this.worldProvider.e()) { - this.worldData.setSpawn(0, this.worldProvider.getSeaLevel(), 0); - } else { - this.isLoading = true; - WorldChunkManager worldchunkmanager = this.worldProvider.e; - List list = worldchunkmanager.a(); - Random random = new Random(this.getSeed()); - ChunkPosition chunkposition = worldchunkmanager.a(0, 0, 256, list, random); - int i = 0; - int j = this.worldProvider.getSeaLevel(); - int k = 0; - - // CraftBukkit start - if (this.generator != null) { - Random rand = new Random(this.getSeed()); - org.bukkit.Location spawn = this.generator.getFixedSpawnLocation(((WorldServer) this).getWorld(), rand); - - if (spawn != null) { - if (spawn.getWorld() != ((WorldServer) this).getWorld()) { - throw new IllegalStateException("Cannot set spawn point for " + this.worldData.getName() + " to be in another world (" + spawn.getWorld().getName() + ")"); - } else { - this.worldData.setSpawn(spawn.getBlockX(), spawn.getBlockY(), spawn.getBlockZ()); - this.isLoading = false; - return; - } - } - } - // CraftBukkit end - - if (chunkposition != null) { - i = chunkposition.x; - k = chunkposition.z; - } else { - a.warn("Unable to find spawn biome"); - } - - int l = 0; - - while (!this.canSpawn(i, k)) { // CraftBukkit - use our own canSpawn - i += random.nextInt(64) - random.nextInt(64); - k += random.nextInt(64) - random.nextInt(64); - ++l; - if (l == 1000) { - break; - } - } - - this.worldData.setSpawn(i, j, k); - this.isLoading = false; - if (worldsettings.c()) { - this.k(); - } - } - } - - protected void k() { - WorldGenBonusChest worldgenbonuschest = new WorldGenBonusChest(U, 10); - - for (int i = 0; i < 10; ++i) { - int j = this.worldData.c() + this.random.nextInt(6) - this.random.nextInt(6); - int k = this.worldData.e() + this.random.nextInt(6) - this.random.nextInt(6); - int l = this.i(j, k) + 1; - - if (worldgenbonuschest.generate(this, this.random, j, l, k)) { - break; - } - } - } - - public ChunkCoordinates getDimensionSpawn() { - return this.worldProvider.h(); - } - - public void save(boolean flag, IProgressUpdate iprogressupdate) throws ExceptionWorldConflict { // CraftBukkit - added throws - if (this.chunkProvider.canSave()) { - if (iprogressupdate != null) { - iprogressupdate.a("Saving level"); - } - - this.a(); - if (iprogressupdate != null) { - iprogressupdate.c("Saving chunks"); - } - - this.chunkProvider.saveChunks(flag, iprogressupdate); - // CraftBukkit - ArrayList -> Collection - Collection arraylist = this.chunkProviderServer.a(); - Iterator iterator = arraylist.iterator(); - - while (iterator.hasNext()) { - Chunk chunk = (Chunk) iterator.next(); - - if (chunk != null && !this.manager.a(chunk.locX, chunk.locZ)) { - this.chunkProviderServer.queueUnload(chunk.locX, chunk.locZ); - } - } - } - } - - public void flushSave() { - if (this.chunkProvider.canSave()) { - this.chunkProvider.c(); - } - } - - protected void a() throws ExceptionWorldConflict { // CraftBukkit - added throws - this.G(); - this.dataManager.saveWorldData(this.worldData, this.server.getPlayerList().t()); - // CraftBukkit start - save worldMaps once, rather than once per shared world - if (!(this instanceof SecondaryWorldServer)) { - this.worldMaps.a(); - } - // CraftBukkit end - } - - protected void a(Entity entity) { - super.a(entity); - this.entitiesById.a(entity.getId(), entity); - Entity[] aentity = entity.at(); - - if (aentity != null) { - for (int i = 0; i < aentity.length; ++i) { - this.entitiesById.a(aentity[i].getId(), aentity[i]); - } - } - } - - protected void b(Entity entity) { - super.b(entity); - this.entitiesById.d(entity.getId()); - Entity[] aentity = entity.at(); - - if (aentity != null) { - for (int i = 0; i < aentity.length; ++i) { - this.entitiesById.d(aentity[i].getId()); - } - } - } - - public Entity getEntity(int i) { - return (Entity) this.entitiesById.get(i); - } - - public boolean strikeLightning(Entity entity) { - // CraftBukkit start - LightningStrikeEvent lightning = new LightningStrikeEvent(this.getWorld(), (org.bukkit.entity.LightningStrike) entity.getBukkitEntity()); - this.getServer().getPluginManager().callEvent(lightning); - - if (lightning.isCancelled()) { - return false; - } - - if (super.strikeLightning(entity)) { - this.server.getPlayerList().sendPacketNearby(entity.locX, entity.locY, entity.locZ, 512.0D, this.dimension, new PacketPlayOutSpawnEntityWeather(entity)); - // CraftBukkit end - return true; - } else { - return false; - } - } - - public void broadcastEntityEffect(Entity entity, byte b0) { - this.getTracker().sendPacketToEntity(entity, new PacketPlayOutEntityStatus(entity, b0)); - } - - public Explosion createExplosion(Entity entity, double d0, double d1, double d2, float f, boolean flag, boolean flag1) { - // CraftBukkit start - Explosion explosion = super.createExplosion(entity, d0, d1, d2, f, flag, flag1); - - if (explosion.wasCanceled) { - return explosion; - } - - /* Remove - explosion.a = flag; - explosion.b = flag1; - explosion.a(); - explosion.a(false); - */ - // CraftBukkit end - TODO: Check if explosions are still properly implemented - - if (!flag1) { - explosion.blocks.clear(); - } - - Iterator iterator = this.players.iterator(); - - while (iterator.hasNext()) { - EntityHuman entityhuman = (EntityHuman) iterator.next(); - - if (entityhuman.e(d0, d1, d2) < 4096.0D) { - ((EntityPlayer) entityhuman).playerConnection.sendPacket(new PacketPlayOutExplosion(d0, d1, d2, f, explosion.blocks, (Vec3D) explosion.b().get(entityhuman))); - } - } - - return explosion; - } - - public void playBlockAction(int i, int j, int k, Block block, int l, int i1) { - BlockActionData blockactiondata = new BlockActionData(i, j, k, block, l, i1); - Iterator iterator = this.S[this.T].iterator(); - - BlockActionData blockactiondata1; - - do { - if (!iterator.hasNext()) { - this.S[this.T].add(blockactiondata); - return; - } - - blockactiondata1 = (BlockActionData) iterator.next(); - } while (!blockactiondata1.equals(blockactiondata)); - - } - - private void Z() { - while (!this.S[this.T].isEmpty()) { - int i = this.T; - - this.T ^= 1; - Iterator iterator = this.S[i].iterator(); - - while (iterator.hasNext()) { - BlockActionData blockactiondata = (BlockActionData) iterator.next(); - - if (this.a(blockactiondata)) { - // CraftBukkit - this.worldProvider.dimension -> this.dimension - this.server.getPlayerList().sendPacketNearby((double) blockactiondata.a(), (double) blockactiondata.b(), (double) blockactiondata.c(), 64.0D, this.dimension, new PacketPlayOutBlockAction(blockactiondata.a(), blockactiondata.b(), blockactiondata.c(), blockactiondata.f(), blockactiondata.d(), blockactiondata.e())); - } - } - - this.S[i].clear(); - } - } - - private boolean a(BlockActionData blockactiondata) { - Block block = this.getType(blockactiondata.a(), blockactiondata.b(), blockactiondata.c()); - - return block == blockactiondata.f() ? block.a(this, blockactiondata.a(), blockactiondata.b(), blockactiondata.c(), blockactiondata.d(), blockactiondata.e()) : false; - } - - public void saveLevel() { - this.dataManager.a(); - } - - protected void o() { - boolean flag = this.Q(); - - super.o(); - /* CraftBukkit start - if (this.m != this.n) { - this.server.getPlayerList().a(new PacketPlayOutGameStateChange(7, this.n), this.worldProvider.dimension); - } - - if (this.o != this.p) { - this.server.getPlayerList().a(new PacketPlayOutGameStateChange(8, this.p), this.worldProvider.dimension); - } - - if (flag != this.Q()) { - if (flag) { - this.server.getPlayerList().sendAll(new PacketPlayOutGameStateChange(2, 0.0F)); - } else { - this.server.getPlayerList().sendAll(new PacketPlayOutGameStateChange(1, 0.0F)); - } - - this.server.getPlayerList().sendAll(new PacketPlayOutGameStateChange(7, this.n)); - this.server.getPlayerList().sendAll(new PacketPlayOutGameStateChange(8, this.p)); - } - // */ - if (flag != this.Q()) { - // Only send 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)).setPlayerWeather((!flag ? WeatherType.DOWNFALL : WeatherType.CLEAR), false); - } - } - // CraftBukkit end - } - } - - protected int p() { - return this.server.getPlayerList().s(); - } - - public MinecraftServer getMinecraftServer() { - return this.server; - } - - public EntityTracker getTracker() { - return this.tracker; - } - - public PlayerChunkMap getPlayerChunkMap() { - return this.manager; - } - - public PortalTravelAgent getTravelAgent() { - return this.Q; - } - - public void a(String s, double d0, double d1, double d2, int i, double d3, double d4, double d5, double d6) { - PacketPlayOutWorldParticles packetplayoutworldparticles = new PacketPlayOutWorldParticles(s, (float) d0, (float) d1, (float) d2, (float) d3, (float) d4, (float) d5, (float) d6, i); - - for (int j = 0; j < this.players.size(); ++j) { - EntityPlayer entityplayer = (EntityPlayer) this.players.get(j); - ChunkCoordinates chunkcoordinates = entityplayer.getChunkCoordinates(); - double d7 = d0 - (double) chunkcoordinates.x; - double d8 = d1 - (double) chunkcoordinates.y; - double d9 = d2 - (double) chunkcoordinates.z; - double d10 = d7 * d7 + d8 * d8 + d9 * d9; - - if (d10 <= 256.0D) { - entityplayer.playerConnection.sendPacket(packetplayoutworldparticles); - } - } - } - - // CraftBukkit start - Helper method - public int getTypeId(int x, int y, int z) { - return Block.getId(getType(x, y, z)); - } - // CraftBukkit end -} diff --git a/src/main/java/org/bukkit/craftbukkit/CraftArt.java b/src/main/java/org/bukkit/craftbukkit/CraftArt.java index f617e9e2ea..dd4dc541be 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftArt.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftArt.java @@ -11,7 +11,7 @@ public class CraftArt { case KEBAB: return Art.KEBAB; case AZTEC: return Art.AZTEC; case ALBAN: return Art.ALBAN; - case AZTEC2: return Art.AZTEC2; + case AZTEC_2: return Art.AZTEC2; case BOMB: return Art.BOMB; case PLANT: return Art.PLANT; case WASTELAND: return Art.WASTELAND; @@ -30,9 +30,9 @@ public class CraftArt { case FIGHTERS: return Art.FIGHTERS; case POINTER: return Art.POINTER; case PIGSCENE: return Art.PIGSCENE; - case BURNINGSKULL: return Art.BURNINGSKULL; + case BURNING_SKULL: return Art.BURNINGSKULL; case SKELETON: return Art.SKELETON; - case DONKEYKONG: return Art.DONKEYKONG; + case DONKEY_KONG: return Art.DONKEYKONG; case WITHER: return Art.WITHER; default: throw new AssertionError(art); @@ -44,7 +44,7 @@ public class CraftArt { case KEBAB: return EnumArt.KEBAB; case AZTEC: return EnumArt.AZTEC; case ALBAN: return EnumArt.ALBAN; - case AZTEC2: return EnumArt.AZTEC2; + case AZTEC2: return EnumArt.AZTEC_2; case BOMB: return EnumArt.BOMB; case PLANT: return EnumArt.PLANT; case WASTELAND: return EnumArt.WASTELAND; @@ -63,9 +63,9 @@ public class CraftArt { case FIGHTERS: return EnumArt.FIGHTERS; case POINTER: return EnumArt.POINTER; case PIGSCENE: return EnumArt.PIGSCENE; - case BURNINGSKULL: return EnumArt.BURNINGSKULL; + case BURNINGSKULL: return EnumArt.BURNING_SKULL; case SKELETON: return EnumArt.SKELETON; - case DONKEYKONG: return EnumArt.DONKEYKONG; + case DONKEYKONG: return EnumArt.DONKEY_KONG; case WITHER: return EnumArt.WITHER; default: throw new AssertionError(art); diff --git a/src/main/java/org/bukkit/craftbukkit/CraftChunk.java b/src/main/java/org/bukkit/craftbukkit/CraftChunk.java index 99d3d40f79..0cba7fd99d 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftChunk.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftChunk.java @@ -3,12 +3,7 @@ package org.bukkit.craftbukkit; import java.lang.ref.WeakReference; import java.util.Arrays; -import net.minecraft.server.BiomeBase; -import net.minecraft.server.ChunkPosition; -import net.minecraft.server.ChunkSection; -import net.minecraft.server.EmptyChunk; -import net.minecraft.server.WorldChunkManager; -import net.minecraft.server.WorldServer; +import net.minecraft.server.*; import org.bukkit.Chunk; import org.bukkit.World; @@ -91,6 +86,7 @@ public class CraftChunk implements Chunk { Entity[] entities = new Entity[count]; for (int i = 0; i < 16; i++) { + for (Object obj : chunk.entitySlices[i].toArray()) { if (!(obj instanceof net.minecraft.server.Entity)) { continue; @@ -106,15 +102,16 @@ public class CraftChunk implements Chunk { public BlockState[] getTileEntities() { int index = 0; net.minecraft.server.Chunk chunk = getHandle(); + BlockState[] entities = new BlockState[chunk.tileEntities.size()]; for (Object obj : chunk.tileEntities.keySet().toArray()) { - if (!(obj instanceof ChunkPosition)) { + if (!(obj instanceof BlockPosition)) { continue; } - ChunkPosition position = (ChunkPosition) obj; - entities[index++] = worldServer.getWorld().getBlockAt(position.x + (chunk.locX << 4), position.y, position.z + (chunk.locZ << 4)).getState(); + BlockPosition position = (BlockPosition) obj; + entities[index++] = worldServer.getWorld().getBlockAt(position.getX() + (chunk.locX << 4), position.getY(), position.getZ() + (chunk.locZ << 4)).getState(); } return entities; } @@ -158,49 +155,40 @@ public class CraftChunk implements Chunk { boolean[] sectionEmpty = new boolean[cs.length]; for (int i = 0; i < cs.length; i++) { - if (cs[i] == null) { /* Section is empty? */ + if (cs[i] == null) { // Section is empty? sectionBlockIDs[i] = emptyBlockIDs; sectionBlockData[i] = emptyData; sectionSkyLights[i] = emptySkyLight; sectionEmitLights[i] = emptyData; sectionEmpty[i] = true; - } else { /* Not empty */ + } else { // Not empty short[] blockids = new short[4096]; - byte[] baseids = cs[i].getIdArray(); + char[] baseids = cs[i].getIdArray(); + byte[] dataValues = sectionBlockData[i] = new byte[2048]; - /* Copy base IDs */ + // Copy base IDs for (int j = 0; j < 4096; j++) { - blockids[j] = (short) (baseids[j] & 0xFF); - } - - if (cs[i].getExtendedIdArray() != null) { /* If we've got extended IDs */ - byte[] extids = cs[i].getExtendedIdArray().a; - - for (int j = 0; j < 2048; j++) { - short b = (short) (extids[j] & 0xFF); - - if (b == 0) { - continue; - } - - blockids[j<<1] |= (b & 0x0F) << 8; - blockids[(j<<1)+1] |= (b & 0xF0) << 4; + IBlockData blockData = net.minecraft.server.Block.getByCombinedId(baseids[j]); + blockids[j] = (short) net.minecraft.server.Block.getId(blockData.getBlock()); + int data = blockData.getBlock().toLegacyData(blockData); + int jj = j >> 1; + if ((j & 1) == 0) { + dataValues[jj] = (byte) ((dataValues[jj] & 0xF0) | (data & 0xF)); + } else { + dataValues[jj] = (byte) ((dataValues[jj] & 0xF) | ((data & 0xF) << 4)); } - } + } sectionBlockIDs[i] = blockids; - - /* Get block data nibbles */ - sectionBlockData[i] = new byte[2048]; - System.arraycopy(cs[i].getDataArray().a, 0, sectionBlockData[i], 0, 2048); + if (cs[i].getSkyLightArray() == null) { sectionSkyLights[i] = emptyData; } else { sectionSkyLights[i] = new byte[2048]; - System.arraycopy(cs[i].getSkyLightArray().a, 0, sectionSkyLights[i], 0, 2048); + System.arraycopy(cs[i].getSkyLightArray().a(), 0, sectionSkyLights[i], 0, 2048); } sectionEmitLights[i] = new byte[2048]; - System.arraycopy(cs[i].getEmittedLightArray().a, 0, sectionEmitLights[i], 0, 2048); + System.arraycopy(cs[i].getEmittedLightArray().a(), 0, sectionEmitLights[i], 0, 2048); } } @@ -221,7 +209,7 @@ public class CraftChunk implements Chunk { if (includeBiome) { biome = new BiomeBase[256]; for (int i = 0; i < 256; i++) { - biome[i] = chunk.getBiome(i & 0xF, i >> 4, wcm); + biome[i] = chunk.getBiome(new BlockPosition(i & 0xF, 0, i >> 4), wcm); } } @@ -257,7 +245,7 @@ public class CraftChunk implements Chunk { if (includeBiome) { biome = new BiomeBase[256]; for (int i = 0; i < 256; i++) { - biome[i] = world.getHandle().getBiome((x << 4) + (i & 0xF), (z << 4) + (i >> 4)); + biome[i] = world.getHandle().getBiome(new BlockPosition((x << 4) + (i & 0xF), 0, (z << 4) + (i >> 4))); } } diff --git a/src/main/java/org/bukkit/craftbukkit/CraftOfflinePlayer.java b/src/main/java/org/bukkit/craftbukkit/CraftOfflinePlayer.java index 1328c175ec..8be0698476 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftOfflinePlayer.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftOfflinePlayer.java @@ -1,5 +1,6 @@ package org.bukkit.craftbukkit; +import com.mojang.authlib.GameProfile; import java.io.File; import java.util.LinkedHashMap; import java.util.List; @@ -10,7 +11,6 @@ import net.minecraft.server.EntityPlayer; import net.minecraft.server.NBTTagCompound; import net.minecraft.server.WorldNBTStorage; -import net.minecraft.util.com.mojang.authlib.GameProfile; import org.bukkit.BanList; import org.bukkit.Bukkit; import org.bukkit.Location; diff --git a/src/main/java/org/bukkit/craftbukkit/CraftProfileBanEntry.java b/src/main/java/org/bukkit/craftbukkit/CraftProfileBanEntry.java index 7ec0006887..9540bf4fb3 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftProfileBanEntry.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftProfileBanEntry.java @@ -1,9 +1,9 @@ package org.bukkit.craftbukkit; +import com.mojang.authlib.GameProfile; import net.minecraft.server.GameProfileBanEntry; import net.minecraft.server.GameProfileBanList; import net.minecraft.server.MinecraftServer; -import net.minecraft.util.com.mojang.authlib.GameProfile; import java.io.IOException; import java.util.Date; diff --git a/src/main/java/org/bukkit/craftbukkit/CraftProfileBanList.java b/src/main/java/org/bukkit/craftbukkit/CraftProfileBanList.java index fad6a9655d..700c9f7c2e 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftProfileBanList.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftProfileBanList.java @@ -8,12 +8,12 @@ import net.minecraft.server.GameProfileBanEntry; import net.minecraft.server.GameProfileBanList; import net.minecraft.server.JsonListEntry; import net.minecraft.server.MinecraftServer; -import net.minecraft.util.com.mojang.authlib.GameProfile; import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.Validate; import com.google.common.collect.ImmutableSet; +import com.mojang.authlib.GameProfile; public class CraftProfileBanList implements org.bukkit.BanList { private final GameProfileBanList list; diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java index a666131f99..f2a78c1757 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java @@ -23,83 +23,7 @@ import java.util.regex.Pattern; import javax.imageio.ImageIO; -import net.minecraft.server.ChunkCoordinates; -import net.minecraft.server.CommandAchievement; -import net.minecraft.server.CommandBan; -import net.minecraft.server.CommandBanIp; -import net.minecraft.server.CommandBanList; -import net.minecraft.server.CommandClear; -import net.minecraft.server.CommandDeop; -import net.minecraft.server.CommandDifficulty; -import net.minecraft.server.CommandEffect; -import net.minecraft.server.CommandEnchant; -import net.minecraft.server.CommandGamemode; -import net.minecraft.server.CommandGamemodeDefault; -import net.minecraft.server.CommandGamerule; -import net.minecraft.server.CommandGive; -import net.minecraft.server.CommandHelp; -import net.minecraft.server.CommandIdleTimeout; -import net.minecraft.server.CommandKick; -import net.minecraft.server.CommandKill; -import net.minecraft.server.CommandList; -import net.minecraft.server.CommandMe; -import net.minecraft.server.CommandNetstat; -import net.minecraft.server.CommandOp; -import net.minecraft.server.CommandPardon; -import net.minecraft.server.CommandPardonIP; -import net.minecraft.server.CommandPlaySound; -import net.minecraft.server.CommandSay; -import net.minecraft.server.CommandScoreboard; -import net.minecraft.server.CommandSeed; -import net.minecraft.server.CommandSetBlock; -import net.minecraft.server.CommandSetWorldSpawn; -import net.minecraft.server.CommandSpawnpoint; -import net.minecraft.server.CommandSpreadPlayers; -import net.minecraft.server.CommandSummon; -import net.minecraft.server.CommandTell; -import net.minecraft.server.CommandTellRaw; -import net.minecraft.server.CommandTestFor; -import net.minecraft.server.CommandTestForBlock; -import net.minecraft.server.CommandTime; -import net.minecraft.server.CommandToggleDownfall; -import net.minecraft.server.CommandTp; -import net.minecraft.server.CommandWeather; -import net.minecraft.server.CommandWhitelist; -import net.minecraft.server.CommandXp; -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.EnumDifficulty; -import net.minecraft.server.EnumGamemode; -import net.minecraft.server.ExceptionWorldConflict; -import net.minecraft.server.Items; -import net.minecraft.server.JsonListEntry; -import net.minecraft.server.PlayerList; -import net.minecraft.server.RecipesFurnace; -import net.minecraft.server.MinecraftServer; -import net.minecraft.server.MobEffectList; -import net.minecraft.server.PropertyManager; -import net.minecraft.server.ServerCommand; -import net.minecraft.server.ServerNBTManager; -import net.minecraft.server.WorldLoaderServer; -import net.minecraft.server.WorldManager; -import net.minecraft.server.WorldMap; -import net.minecraft.server.PersistentCollection; -import net.minecraft.server.WorldNBTStorage; -import net.minecraft.server.WorldServer; -import net.minecraft.server.WorldSettings; -import net.minecraft.server.WorldType; -import net.minecraft.util.com.google.common.base.Charsets; -import net.minecraft.util.com.mojang.authlib.GameProfile; -import net.minecraft.util.io.netty.buffer.ByteBuf; -import net.minecraft.util.io.netty.buffer.ByteBufOutputStream; -import net.minecraft.util.io.netty.buffer.Unpooled; -import net.minecraft.util.io.netty.handler.codec.base64.Base64; +import net.minecraft.server.*; import org.bukkit.BanList; import org.bukkit.Bukkit; @@ -139,8 +63,6 @@ import org.bukkit.craftbukkit.metadata.WorldMetadataStore; import org.bukkit.craftbukkit.potion.CraftPotionBrewer; import org.bukkit.craftbukkit.scheduler.CraftScheduler; import org.bukkit.craftbukkit.scoreboard.CraftScoreboardManager; -import org.bukkit.craftbukkit.updater.AutoUpdater; -import org.bukkit.craftbukkit.updater.BukkitDLUpdaterService; import org.bukkit.craftbukkit.util.CraftIconCache; import org.bukkit.craftbukkit.util.CraftMagicNumbers; import org.bukkit.craftbukkit.util.DatFileFilter; @@ -186,8 +108,16 @@ import com.avaje.ebean.config.DataSourceConfig; import com.avaje.ebean.config.ServerConfig; import com.avaje.ebean.config.dbplatform.SQLitePlatform; import com.avaje.ebeaninternal.server.lib.sql.TransactionIsolation; +import com.google.common.base.Charsets; +import com.google.common.base.Function; import com.google.common.collect.ImmutableList; +import com.google.common.collect.Lists; import com.google.common.collect.MapMaker; +import com.mojang.authlib.GameProfile; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufOutputStream; +import io.netty.buffer.Unpooled; +import io.netty.handler.codec.base64.Base64; import jline.console.ConsoleReader; @@ -210,7 +140,6 @@ public final class CraftServer implements Server { private YamlConfiguration commandsConfiguration; private final Yaml yaml = new Yaml(new SafeConstructor()); private final Map offlinePlayers = new MapMaker().softValues().makeMap(); - private final AutoUpdater updater; private final EntityMetadataStore entityMetadata = new EntityMetadataStore(); private final PlayerMetadataStore playerMetadata = new PlayerMetadataStore(); private final WorldMetadataStore worldMetadata = new WorldMetadataStore(); @@ -244,7 +173,7 @@ public final class CraftServer implements Server { public CraftServer(MinecraftServer console, PlayerList playerList) { this.console = console; this.playerList = (DedicatedPlayerList) playerList; - this.playerView = Collections.unmodifiableList(net.minecraft.util.com.google.common.collect.Lists.transform(playerList.players, new net.minecraft.util.com.google.common.base.Function() { + this.playerView = Collections.unmodifiableList(Lists.transform(playerList.players, new Function() { @Override public CraftPlayer apply(EntityPlayer player) { return player.getBukkitEntity(); @@ -316,13 +245,6 @@ public final class CraftServer implements Server { chunkGCLoadThresh = configuration.getInt("chunk-gc.load-threshold"); loadIcon(); - updater = new AutoUpdater(new BukkitDLUpdaterService(configuration.getString("auto-updater.host")), getLogger(), configuration.getString("auto-updater.preferred-channel")); - updater.setEnabled(configuration.getBoolean("auto-updater.enabled")); - updater.setSuggestChannels(configuration.getBoolean("auto-updater.suggest-channels")); - updater.getOnBroken().addAll(configuration.getStringList("auto-updater.on-broken")); - updater.getOnUpdate().addAll(configuration.getStringList("auto-updater.on-update")); - updater.check(serverVersion); - loadPlugins(); enablePlugins(PluginLoadOrder.STARTUP); } @@ -405,49 +327,10 @@ public final class CraftServer implements Server { } private void setVanillaCommands() { - commandMap.register("minecraft", new VanillaCommandWrapper(new CommandAchievement(), "/achievement give [player]")); - commandMap.register("minecraft", new VanillaCommandWrapper(new CommandBan(), "/ban [reason]")); - commandMap.register("minecraft", new VanillaCommandWrapper(new CommandBanIp(), "/ban-ip ")); - commandMap.register("minecraft", new VanillaCommandWrapper(new CommandBanList(), "/banlist [ips]")); - commandMap.register("minecraft", new VanillaCommandWrapper(new CommandClear(), "/clear [item] [metadata]")); - commandMap.register("minecraft", new VanillaCommandWrapper(new CommandGamemodeDefault(), "/defaultgamemode ")); - commandMap.register("minecraft", new VanillaCommandWrapper(new CommandDeop(), "/deop ")); - commandMap.register("minecraft", new VanillaCommandWrapper(new CommandDifficulty(), "/difficulty ")); - commandMap.register("minecraft", new VanillaCommandWrapper(new CommandEffect(), "/effect [seconds] [amplifier]")); - commandMap.register("minecraft", new VanillaCommandWrapper(new CommandEnchant(), "/enchant [enchantment level]")); - commandMap.register("minecraft", new VanillaCommandWrapper(new CommandGamemode(), "/gamemode [player]")); - commandMap.register("minecraft", new VanillaCommandWrapper(new CommandGamerule(), "/gamerule [true|false]")); - commandMap.register("minecraft", new VanillaCommandWrapper(new CommandGive(), "/give [amount] [metadata] [dataTag]")); - commandMap.register("minecraft", new VanillaCommandWrapper(new CommandHelp(), "/help [page|commandname]")); - commandMap.register("minecraft", new VanillaCommandWrapper(new CommandIdleTimeout(), "/setidletimeout ")); - commandMap.register("minecraft", new VanillaCommandWrapper(new CommandKick(), "/kick [reason]")); - commandMap.register("minecraft", new VanillaCommandWrapper(new CommandKill(), "/kill [playername]")); - commandMap.register("minecraft", new VanillaCommandWrapper(new CommandList(), "/list")); - commandMap.register("minecraft", new VanillaCommandWrapper(new CommandMe(), "/me ")); - commandMap.register("minecraft", new VanillaCommandWrapper(new CommandOp(), "/op ")); - commandMap.register("minecraft", new VanillaCommandWrapper(new CommandPardon(), "/pardon ")); - commandMap.register("minecraft", new VanillaCommandWrapper(new CommandPardonIP(), "/pardon-ip ")); - commandMap.register("minecraft", new VanillaCommandWrapper(new CommandPlaySound(), "/playsound [x] [y] [z] [volume] [pitch] [minimumVolume]")); - commandMap.register("minecraft", new VanillaCommandWrapper(new CommandSay(), "/say ")); - commandMap.register("minecraft", new VanillaCommandWrapper(new CommandScoreboard(), "/scoreboard")); - commandMap.register("minecraft", new VanillaCommandWrapper(new CommandSeed(), "/seed")); - commandMap.register("minecraft", new VanillaCommandWrapper(new CommandSetBlock(), "/setblock [datavalue] [oldblockHandling] [dataTag]")); - commandMap.register("minecraft", new VanillaCommandWrapper(new CommandSetWorldSpawn(), "/setworldspawn [x] [y] [z]")); - commandMap.register("minecraft", new VanillaCommandWrapper(new CommandSpawnpoint(), "/spawnpoint [x] [y] [z]")); - commandMap.register("minecraft", new VanillaCommandWrapper(new CommandSpreadPlayers(), "/spreadplayers [spreadDistance] [maxRange] [respectTeams] ")); - commandMap.register("minecraft", new VanillaCommandWrapper(new CommandSummon(), "/summon [x] [y] [z] [dataTag]")); - commandMap.register("minecraft", new VanillaCommandWrapper(new CommandTp(), "/tp [player] \n/tp [player] ")); - commandMap.register("minecraft", new VanillaCommandWrapper(new CommandTell(), "/tell ")); - commandMap.register("minecraft", new VanillaCommandWrapper(new CommandTellRaw(), "/tellraw ")); - commandMap.register("minecraft", new VanillaCommandWrapper(new CommandTestFor(), "/testfor [dataTag]")); - commandMap.register("minecraft", new VanillaCommandWrapper(new CommandTestForBlock(), "/testforblock [datavalue] [dataTag]")); - commandMap.register("minecraft", new VanillaCommandWrapper(new CommandTime(), "/time set \n/time add ")); - commandMap.register("minecraft", new VanillaCommandWrapper(new CommandToggleDownfall(), "/toggledownfall")); - commandMap.register("minecraft", new VanillaCommandWrapper(new CommandWeather(), "/weather [duration in seconds]")); - commandMap.register("minecraft", new VanillaCommandWrapper(new CommandWhitelist(), "/whitelist (add|remove) \n/whitelist (on|off|list|reload)")); - commandMap.register("minecraft", new VanillaCommandWrapper(new CommandXp(), "/xp [player]\n/xp L [player]")); - // This is what is in the lang file, I swear. - commandMap.register("minecraft", new VanillaCommandWrapper(new CommandNetstat(), "/list")); + Map commands = new CommandDispatcher().getCommands(); + for (ICommand cmd : commands.values()) { + commandMap.register("minecraft", new VanillaCommandWrapper((CommandAbstract) cmd, LocaleI18n.get(cmd.getUsage(null)))); + } } private void loadPlugin(Plugin plugin) { @@ -550,7 +433,7 @@ public final class CraftServer implements Server { } public Player getPlayer(final EntityPlayer entity) { - return entity.playerConnection.getPlayer(); + return entity.getBukkitEntity(); } @Override @@ -759,12 +642,12 @@ public final class CraftServer implements Server { ((DedicatedServer) console).propertyManager = config; boolean animals = config.getBoolean("spawn-animals", console.getSpawnAnimals()); - boolean monsters = config.getBoolean("spawn-monsters", console.worlds.get(0).difficulty != EnumDifficulty.PEACEFUL); - EnumDifficulty difficulty = EnumDifficulty.getById(config.getInt("difficulty", console.worlds.get(0).difficulty.ordinal())); + boolean monsters = config.getBoolean("spawn-monsters", console.worlds.get(0).getDifficulty() != EnumDifficulty.PEACEFUL); + EnumDifficulty difficulty = EnumDifficulty.getById(config.getInt("difficulty", console.worlds.get(0).getDifficulty().ordinal())); online.value = config.getBoolean("online-mode", console.getOnlineMode()); console.setSpawnAnimals(config.getBoolean("spawn-animals", console.getSpawnAnimals())); - console.setPvP(config.getBoolean("pvp", console.getPvP())); + console.setPVP(config.getBoolean("pvp", console.getPVP())); console.setAllowFlight(config.getBoolean("allow-flight", console.getAllowFlight())); console.setMotd(config.getString("motd", console.getMotd())); monsterSpawn = configuration.getInt("spawn-limits.monsters"); @@ -790,7 +673,7 @@ public final class CraftServer implements Server { } for (WorldServer world : console.worlds) { - world.difficulty = difficulty; + world.worldData.setDifficulty(difficulty); world.setSpawnFlags(monsters, animals); if (this.getTicksPerAnimalSpawns() < 0) { world.ticksPerAnimalSpawns = 400; @@ -961,7 +844,8 @@ public final class CraftServer implements Server { } while(used); boolean hardcore = false; - WorldServer internal = new WorldServer(console, new ServerNBTManager(getWorldContainer(), name, true), name, dimension, new WorldSettings(creator.seed(), EnumGamemode.getById(getDefaultGameMode().getValue()), generateStructures, hardcore, type), console.methodProfiler, creator.environment(), generator); + WorldData worlddata = new WorldData(new WorldSettings(creator.seed(), EnumGamemode.getById(getDefaultGameMode().getValue()), generateStructures, hardcore, type), name); + WorldServer internal = (WorldServer) new WorldServer(console, new ServerNBTManager(getWorldContainer(), name, true), worlddata, dimension, console.methodProfiler, creator.environment(), generator).b(); if (!(worlds.containsKey(name.toLowerCase()))) { return null; @@ -971,7 +855,7 @@ public final class CraftServer implements Server { internal.tracker = new EntityTracker(internal); internal.addIWorldAccess(new WorldManager(console, internal)); - internal.difficulty = EnumDifficulty.EASY; + internal.worldData.setDifficulty(EnumDifficulty.EASY); internal.setSpawnFlags(true, true); console.worlds.add(internal); @@ -1001,8 +885,8 @@ public final class CraftServer implements Server { i = l; } - ChunkCoordinates chunkcoordinates = internal.getSpawn(); - internal.chunkProviderServer.getChunkAt(chunkcoordinates.x + j >> 4, chunkcoordinates.z + k >> 4); + BlockPosition chunkcoordinates = internal.getSpawn(); + internal.chunkProviderServer.getChunkAt(chunkcoordinates.getX() + j >> 4, chunkcoordinates.getZ() + k >> 4); } } } @@ -1055,7 +939,6 @@ public final class CraftServer implements Server { worlds.remove(world.getName().toLowerCase()); console.worlds.remove(console.worlds.indexOf(handle)); - return true; } @@ -1312,7 +1195,7 @@ public final class CraftServer implements Server { Validate.notNull(world, "World cannot be null"); net.minecraft.server.ItemStack stack = new net.minecraft.server.ItemStack(Items.MAP, 1, -1); - WorldMap worldmap = Items.MAP.getSavedMap(stack, ((CraftWorld) world).getHandle()); + WorldMap worldmap = Items.FILLED_MAP.getSavedMap(stack, ((CraftWorld) world).getHandle()); return worldmap.mapView; } @@ -1415,7 +1298,7 @@ public final class CraftServer implements Server { for (JsonListEntry entry : playerList.getProfileBans().getValues()) { result.add(getOfflinePlayer((GameProfile) entry.getKey())); - } + } return result; } @@ -1497,27 +1380,6 @@ public final class CraftServer implements Server { return worldMetadata; } - public void detectListNameConflict(EntityPlayer entityPlayer) { - // Collisions will make for invisible people - for (int i = 0; i < getHandle().players.size(); ++i) { - EntityPlayer testEntityPlayer = (EntityPlayer) getHandle().players.get(i); - - // We have a problem! - if (testEntityPlayer != entityPlayer && testEntityPlayer.listName.equals(entityPlayer.listName)) { - String oldName = entityPlayer.listName; - int spaceLeft = 16 - oldName.length(); - - if (spaceLeft <= 1) { // We also hit the list name length limit! - entityPlayer.listName = oldName.subSequence(0, oldName.length() - 2 - spaceLeft) + String.valueOf(System.currentTimeMillis() % 99); - } else { - entityPlayer.listName = oldName + String.valueOf(System.currentTimeMillis() % 99); - } - - return; - } - } - } - @Override public File getWorldContainer() { if (this.getServer().universe != null) { @@ -1575,16 +1437,6 @@ public final class CraftServer implements Server { return result; } - public void onPlayerJoin(Player player) { - if ((updater.isEnabled()) && (updater.getCurrent() != null) && (player.hasPermission(Server.BROADCAST_CHANNEL_ADMINISTRATIVE))) { - if ((updater.getCurrent().isBroken()) && (updater.getOnBroken().contains(AutoUpdater.WARN_OPERATORS))) { - player.sendMessage(ChatColor.DARK_RED + "The version of CraftBukkit that this server is running is known to be broken. Please consider updating to the latest version at dl.bukkit.org."); - } else if ((updater.isUpdateAvailable()) && (updater.getOnUpdate().contains(AutoUpdater.WARN_OPERATORS))) { - player.sendMessage(ChatColor.DARK_PURPLE + "The version of CraftBukkit that this server is running is out of date. Please consider updating to the latest version at dl.bukkit.org."); - } - } - } - @Override public Inventory createInventory(InventoryHolder owner, InventoryType type) { // TODO: Create the appropriate type, rather than Custom? diff --git a/src/main/java/org/bukkit/craftbukkit/CraftStatistic.java b/src/main/java/org/bukkit/craftbukkit/CraftStatistic.java index 24c8bf24cd..a261c77dcb 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftStatistic.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftStatistic.java @@ -13,6 +13,9 @@ import com.google.common.base.CaseFormat; import com.google.common.collect.BiMap; import com.google.common.collect.ImmutableBiMap; import com.google.common.collect.ImmutableMap; +import net.minecraft.server.Block; +import net.minecraft.server.Item; +import net.minecraft.server.MinecraftKey; public class CraftStatistic { private static final BiMap statistics; @@ -131,12 +134,19 @@ public class CraftStatistic { public static Material getMaterialFromStatistic(net.minecraft.server.Statistic statistic) { String statisticString = statistic.name; - int id; + String val = statisticString.substring(statisticString.lastIndexOf(".") + 1); + Item item = (Item) Item.REGISTRY.get(new MinecraftKey(val)); + if (item != null) { + return Material.getMaterial(Item.getId(item)); + } + Block block = (Block) Block.REGISTRY.get(new MinecraftKey(val)); + if (block != null) { + return Material.getMaterial(Block.getId(block)); + } try { - id = Integer.valueOf(statisticString.substring(statisticString.lastIndexOf(".") + 1)); + return Material.getMaterial(Integer.parseInt(val)); } catch (NumberFormatException e) { return null; } - return Material.getMaterial(id); } } diff --git a/src/main/java/org/bukkit/craftbukkit/CraftTravelAgent.java b/src/main/java/org/bukkit/craftbukkit/CraftTravelAgent.java index f7ca6a3f72..cae65cf86f 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftTravelAgent.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftTravelAgent.java @@ -1,6 +1,6 @@ package org.bukkit.craftbukkit; -import net.minecraft.server.ChunkCoordinates; +import net.minecraft.server.BlockPosition; import net.minecraft.server.PortalTravelAgent; import net.minecraft.server.WorldServer; @@ -22,6 +22,7 @@ public class CraftTravelAgent extends PortalTravelAgent implements TravelAgent { } } + @Override public Location findOrCreate(Location target) { WorldServer worldServer = ((CraftWorld) target.getWorld()).getHandle(); boolean before = worldServer.chunkProviderServer.forceChunkLoad; @@ -40,39 +41,47 @@ public class CraftTravelAgent extends PortalTravelAgent implements TravelAgent { return found; } + @Override public Location findPortal(Location location) { PortalTravelAgent pta = ((CraftWorld) location.getWorld()).getHandle().getTravelAgent(); - ChunkCoordinates found = pta.findPortal(location.getX(), location.getY(), location.getZ(), this.getSearchRadius()); - return found != null ? new Location(location.getWorld(), found.x, found.y, found.z, location.getYaw(), location.getPitch()) : null; + BlockPosition found = pta.findPortal(location.getX(), location.getY(), location.getZ(), this.getSearchRadius()); + return found != null ? new Location(location.getWorld(), found.getX(), found.getY(), found.getZ(), location.getYaw(), location.getPitch()) : null; } + @Override public boolean createPortal(Location location) { PortalTravelAgent pta = ((CraftWorld) location.getWorld()).getHandle().getTravelAgent(); return pta.createPortal(location.getX(), location.getY(), location.getZ(), this.getCreationRadius()); } + @Override public TravelAgent setSearchRadius(int radius) { this.searchRadius = radius; return this; } + @Override public int getSearchRadius() { return this.searchRadius; } + @Override public TravelAgent setCreationRadius(int radius) { this.creationRadius = radius < 2 ? 0 : radius; return this; } + @Override public int getCreationRadius() { return this.creationRadius; } + @Override public boolean getCanCreatePortal() { return this.canCreatePortal; } + @Override public void setCanCreatePortal(boolean create) { this.canCreatePortal = create; } diff --git a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java index f4dec5bf15..f20a040636 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java @@ -86,7 +86,7 @@ public class CraftWorld implements World { } public int getBlockTypeIdAt(int x, int y, int z) { - return world.getTypeId(x, y, z); + return CraftMagicNumbers.getId(world.getType(new BlockPosition(x, y, z)).getBlock()); } public int getHighestBlockYAt(int x, int z) { @@ -94,18 +94,18 @@ public class CraftWorld implements World { loadChunk(x >> 4, z >> 4); } - return world.getHighestBlockYAt(x, z); + return world.getHighestBlockYAt(new BlockPosition(x, 0, z)).getY(); } public Location getSpawnLocation() { - ChunkCoordinates spawn = world.getSpawn(); - return new Location(this, spawn.x, spawn.y, spawn.z); + BlockPosition spawn = world.getSpawn(); + return new Location(this, spawn.getX(), spawn.getY(), spawn.getZ()); } public boolean setSpawnLocation(int x, int y, int z) { try { Location previousLocation = getSpawnLocation(); - world.worldData.setSpawn(x, y, z); + world.worldData.setSpawn(new BlockPosition(x, y, z)); // Notify anyone who's listening. SpawnChangeEvent event = new SpawnChangeEvent(this, previousLocation); @@ -227,9 +227,9 @@ public class CraftWorld implements World { // This flags 65 blocks distributed across all the sections of the chunk, so that everything is sent, including biomes int height = getMaxHeight() / 16; for (int idx = 0; idx < 64; idx++) { - world.notify(px + (idx / height), ((idx % height) * 16), pz); + world.notify(new BlockPosition(px + (idx / height), ((idx % height) * 16), pz)); } - world.notify(px + 15, (height * 16) - 1, pz + 15); + world.notify(new BlockPosition(px + 15, (height * 16) - 1, pz + 15)); return true; } @@ -407,7 +407,7 @@ public class CraftWorld implements World { break; } - return gen.generate(world, rand, loc.getBlockX(), loc.getBlockY(), loc.getBlockZ()); + return gen.generate(world, rand, new BlockPosition(loc.getBlockX(), loc.getBlockY(), loc.getBlockZ())); } public boolean generateTree(Location loc, TreeType type, BlockChangeDelegate delegate) { @@ -421,13 +421,14 @@ public class CraftWorld implements World { int x = blockstate.getX(); int y = blockstate.getY(); int z = blockstate.getZ(); - net.minecraft.server.Block oldBlock = world.getType(x, y, z); + BlockPosition position = new BlockPosition(x, y, z); + net.minecraft.server.Block oldBlock = world.getType(position).getBlock(); int typeId = blockstate.getTypeId(); int data = blockstate.getRawData(); int flag = ((CraftBlockState)blockstate).getFlag(); delegate.setTypeIdAndData(x, y, z, typeId, data); - net.minecraft.server.Block newBlock = world.getType(x, y, z); - world.notifyAndUpdatePhysics(x, y, z, null, oldBlock, newBlock, flag); + net.minecraft.server.Block newBlock = world.getType(position).getBlock(); + world.notifyAndUpdatePhysics(position, null, oldBlock, newBlock, flag); } world.capturedBlockStates.clear(); return true; @@ -438,7 +439,7 @@ public class CraftWorld implements World { } public TileEntity getTileEntityAt(final int x, final int y, final int z) { - return world.getTileEntity(x, y, z); + return world.getTileEntity(new BlockPosition(x, y, z)); } public String getName() { @@ -551,27 +552,27 @@ public class CraftWorld implements World { } public Biome getBiome(int x, int z) { - return CraftBlock.biomeBaseToBiome(this.world.getBiome(x, z)); + return CraftBlock.biomeBaseToBiome(this.world.getBiome(new BlockPosition(x, 0, z))); } public void setBiome(int x, int z, Biome bio) { BiomeBase bb = CraftBlock.biomeToBiomeBase(bio); - if (this.world.isLoaded(x, 0, z)) { - net.minecraft.server.Chunk chunk = this.world.getChunkAtWorldCoords(x, z); + if (this.world.isLoaded(new BlockPosition(x, 0, z))) { + net.minecraft.server.Chunk chunk = this.world.getChunkAtWorldCoords(new BlockPosition(x, 0, z)); if (chunk != null) { - byte[] biomevals = chunk.m(); + byte[] biomevals = chunk.getBiomeIndex(); biomevals[((z & 0xF) << 4) | (x & 0xF)] = (byte)bb.id; } } } public double getTemperature(int x, int z) { - return this.world.getBiome(x, z).temperature; + return this.world.getBiome(new BlockPosition(x, 0, z)).temperature; } public double getHumidity(int x, int z) { - return this.world.getBiome(x, z).humidity; + return this.world.getBiome(new BlockPosition(x, 0, z)).humidity; } public List getEntities() { @@ -704,11 +705,11 @@ public class CraftWorld implements World { } public void setDifficulty(Difficulty difficulty) { - this.getHandle().difficulty = EnumDifficulty.getById(difficulty.getValue()); + this.getHandle().worldData.setDifficulty(EnumDifficulty.getById(difficulty.getValue())); } public Difficulty getDifficulty() { - return Difficulty.getByValue(this.getHandle().difficulty.ordinal()); + return Difficulty.getByValue(this.getHandle().getDifficulty().ordinal()); } public BlockMetadataStore getBlockMetadata() { @@ -814,7 +815,7 @@ public class CraftWorld implements World { Validate.notNull(effect, "Effect cannot be null"); Validate.notNull(location.getWorld(), "World cannot be null"); int packetData = effect.getId(); - PacketPlayOutWorldEvent packet = new PacketPlayOutWorldEvent(packetData, location.getBlockX(), location.getBlockY(), location.getBlockZ(), data, false); + PacketPlayOutWorldEvent packet = new PacketPlayOutWorldEvent(packetData, new BlockPosition(location.getBlockX(), location.getBlockY(), location.getBlockZ()), data, false); int distance; radius *= radius; @@ -842,7 +843,7 @@ public class CraftWorld implements World { double y = location.getBlockY() + 0.5; double z = location.getBlockZ() + 0.5; - EntityFallingBlock entity = new EntityFallingBlock(world, x, y, z, net.minecraft.server.Block.getById(material.getId()), data); + EntityFallingBlock entity = new EntityFallingBlock(world, x, y, z, net.minecraft.server.Block.getById(material.getId()).fromLegacyData(data)); entity.ticksLived = 1; world.addEntity(entity, SpawnReason.CUSTOM); @@ -874,10 +875,11 @@ public class CraftWorld implements World { x = location.getBlockX(); y = location.getBlockY(); z = location.getBlockZ(); - int type = world.getTypeId((int) x, (int) y, (int) z); - int data = world.getData((int) x, (int) y, (int) z); + IBlockData blockData = world.getType(new BlockPosition(x, y, z)); + int type = CraftMagicNumbers.getId(blockData.getBlock()); + int data = blockData.getBlock().toLegacyData(blockData); - entity = new EntityFallingBlock(world, x + 0.5, y + 0.5, z + 0.5, net.minecraft.server.Block.getById(type), data); + entity = new EntityFallingBlock(world, x + 0.5, y + 0.5, z + 0.5, net.minecraft.server.Block.getById(type).fromLegacyData(data)); } else if (Projectile.class.isAssignableFrom(clazz)) { if (Snowball.class.isAssignableFrom(clazz)) { entity = new EntitySnowball(world, x, y, z); @@ -890,7 +892,7 @@ public class CraftWorld implements World { entity = new EntityThrownExpBottle(world); entity.setPositionRotation(x, y, z, 0, 0); } else if (EnderPearl.class.isAssignableFrom(clazz)) { - entity = new EntityEnderPearl(world); + entity = new EntityEnderPearl(world, null); entity.setPositionRotation(x, y, z, 0, 0); } else if (ThrownPotion.class.isAssignableFrom(clazz)) { entity = new EntityPotion(world, x, y, z, CraftItemStack.asNMSCopy(new ItemStack(org.bukkit.Material.POTION, 1))); @@ -1000,6 +1002,14 @@ public class CraftWorld implements World { if (Bat.class.isAssignableFrom(clazz)) { entity = new EntityBat(world); } + } else if (Rabbit.class.isAssignableFrom(clazz)) { + entity = new EntityRabbit(world); + } else if (Endermite.class.isAssignableFrom(clazz)) { + entity = new EntityEndermite(world); + } else if (Guardian.class.isAssignableFrom(clazz)){ + entity = new EntityGuardian(world); + } else if (ArmorStand.class.isAssignableFrom(clazz)) { + entity = new EntityArmorStand(world, x, y, z); } if (entity != null) { @@ -1017,29 +1027,29 @@ public class CraftWorld implements World { } else if (block.getRelative(BlockFace.SOUTH).getTypeId() == 0) { face = BlockFace.SOUTH; } - int dir; + EnumDirection dir; switch (face) { case SOUTH: default: - dir = 0; + dir = EnumDirection.SOUTH; break; case WEST: - dir = 1; + dir = EnumDirection.WEST; break; case NORTH: - dir = 2; + dir = EnumDirection.NORTH; break; case EAST: - dir = 3; + dir = EnumDirection.EAST; break; } if (Painting.class.isAssignableFrom(clazz)) { - entity = new EntityPainting(world, (int) x, (int) y, (int) z, dir); + entity = new EntityPainting(world, new BlockPosition((int) x, (int) y, (int) z), dir); } else if (ItemFrame.class.isAssignableFrom(clazz)) { - entity = new EntityItemFrame(world, (int) x, (int) y, (int) z, dir); + entity = new EntityItemFrame(world, new BlockPosition((int) x, (int) y, (int) z), dir); } else if (LeashHitch.class.isAssignableFrom(clazz)) { - entity = new EntityLeash(world, (int) x, (int) y, (int) z); + entity = new EntityLeash(world, new BlockPosition((int) x, (int) y, (int) z)); entity.attachedToPlayer = true; } @@ -1062,7 +1072,7 @@ public class CraftWorld implements World { if (entity != null) { if (entity instanceof EntityInsentient) { - ((EntityInsentient) entity).prepare((GroupDataEntity) null); + ((EntityInsentient) entity).prepare(getHandle().E(new BlockPosition(entity)), (GroupDataEntity) null); } world.addEntity(entity, reason); @@ -1103,9 +1113,9 @@ public class CraftWorld implements World { public void setKeepSpawnInMemory(boolean keepLoaded) { world.keepSpawnInMemory = keepLoaded; // Grab the worlds spawn chunk - ChunkCoordinates chunkcoordinates = this.world.getSpawn(); - int chunkCoordX = chunkcoordinates.x >> 4; - int chunkCoordZ = chunkcoordinates.z >> 4; + BlockPosition chunkcoordinates = this.world.getSpawn(); + int chunkCoordX = chunkcoordinates.getX() >> 4; + int chunkCoordZ = chunkcoordinates.getZ() >> 4; // Cycle through the 25x25 Chunks around it to load/unload the chunks. for (int x = -12; x <= 12; x++) { for (int z = -12; z <= 12; z++) { diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftBanner.java b/src/main/java/org/bukkit/craftbukkit/block/CraftBanner.java new file mode 100644 index 0000000000..5a76958d86 --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/CraftBanner.java @@ -0,0 +1,105 @@ +package org.bukkit.craftbukkit.block; + +import java.util.ArrayList; +import java.util.List; +import net.minecraft.server.NBTTagCompound; +import net.minecraft.server.NBTTagList; +import net.minecraft.server.TileEntityBanner; +import org.bukkit.DyeColor; +import org.bukkit.block.Banner; +import org.bukkit.block.Block; +import org.bukkit.block.banner.Pattern; +import org.bukkit.block.banner.PatternType; +import org.bukkit.craftbukkit.CraftWorld; + +public class CraftBanner extends CraftBlockState implements Banner { + + private final TileEntityBanner banner; + private DyeColor base; + private List patterns = new ArrayList(); + + public CraftBanner(final Block block) { + super(block); + + CraftWorld world = (CraftWorld) block.getWorld(); + banner = (TileEntityBanner) world.getTileEntityAt(getX(), getY(), getZ()); + + base = DyeColor.getByDyeData((byte) banner.color); + + if (banner.patterns != null) { + for (int i = 0; i < banner.patterns.size(); i++) { + NBTTagCompound p = (NBTTagCompound) banner.patterns.get(i); + patterns.add(new Pattern(DyeColor.getByDyeData((byte) p.getInt("Color")), PatternType.getByIdentifier(p.getString("Pattern")))); + } + } + } + + @Override + public DyeColor getBaseColor() { + return this.base; + } + + @Override + public void setBaseColor(DyeColor color) { + this.base = color; + } + + @Override + public List getPatterns() { + return new ArrayList(patterns); + } + + @Override + public void setPatterns(List patterns) { + this.patterns = new ArrayList(patterns); + } + + @Override + public void addPattern(Pattern pattern) { + this.patterns.add(pattern); + } + + @Override + public Pattern getPattern(int i) { + return this.patterns.get(i); + } + + @Override + public Pattern removePattern(int i) { + return this.patterns.remove(i); + } + + @Override + public void setPattern(int i, Pattern pattern) { + this.patterns.set(i, pattern); + } + + @Override + public int numberOfPatterns() { + return patterns.size(); + } + + @Override + public boolean update(boolean force, boolean applyPhysics) { + boolean result = super.update(force, applyPhysics); + + if (result) { + banner.color = base.getDyeData(); + + NBTTagList newPatterns = new NBTTagList(); + + for (Pattern p : patterns) { + NBTTagCompound compound = new NBTTagCompound(); + compound.setInt("Color", p.getColor().getDyeData()); + compound.setString("Pattern", p.getPattern().getIdentifier()); + newPatterns.add(compound); + } + + banner.patterns = newPatterns; + + banner.update(); + } + + return result; + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftBlock.java b/src/main/java/org/bukkit/craftbukkit/block/CraftBlock.java index 87d79aec14..fe5d231eb8 100644 --- a/src/main/java/org/bukkit/craftbukkit/block/CraftBlock.java +++ b/src/main/java/org/bukkit/craftbukkit/block/CraftBlock.java @@ -5,15 +5,7 @@ import java.util.Collection; import java.util.Collections; import java.util.List; -import net.minecraft.server.BiomeBase; -import net.minecraft.server.BlockCocoa; -import net.minecraft.server.BlockRedstoneWire; -import net.minecraft.server.Blocks; -import net.minecraft.server.EnumSkyBlock; -import net.minecraft.server.GameProfileSerializer; -import net.minecraft.server.Item; -import net.minecraft.server.NBTTagCompound; -import net.minecraft.server.TileEntitySkull; +import net.minecraft.server.*; import org.bukkit.Chunk; import org.bukkit.Location; @@ -97,19 +89,27 @@ public class CraftBlock implements Block { } public void setData(final byte data) { - chunk.getHandle().world.setData(x, y, z, data, 3); + setData(data, 3); } public void setData(final byte data, boolean applyPhysics) { if (applyPhysics) { - chunk.getHandle().world.setData(x, y, z, data, 3); + setData(data, 3); } else { - chunk.getHandle().world.setData(x, y, z, data, 2); + setData(data, 2); } } + private void setData(final byte data, int flag) { + net.minecraft.server.World world = chunk.getHandle().getWorld(); + BlockPosition position = new BlockPosition(x, y, z); + IBlockData blockData = world.getType(position); + world.setTypeAndData(position, blockData.getBlock().fromLegacyData(data), flag); + } + public byte getData() { - return (byte) chunk.getHandle().getData(this.x & 0xF, this.y & 0xFF, this.z & 0xF); + IBlockData blockData = chunk.getHandle().getBlockData(new BlockPosition(x, y, z)); + return (byte) blockData.getBlock().toLegacyData(blockData); } public void setType(final Material type) { @@ -125,12 +125,14 @@ public class CraftBlock implements Block { } public boolean setTypeIdAndData(final int type, final byte data, final boolean applyPhysics) { + IBlockData blockData = getNMSBlock(type).fromLegacyData(data); + BlockPosition position = new BlockPosition(x, y, z); if (applyPhysics) { - return chunk.getHandle().world.setTypeAndData(x, y, z, getNMSBlock(type), data, 3); + return chunk.getHandle().getWorld().setTypeAndData(position, blockData, 3); } else { - boolean success = chunk.getHandle().world.setTypeAndData(x, y, z, getNMSBlock(type), data, 2); + boolean success = chunk.getHandle().getWorld().setTypeAndData(position, blockData, 2); if (success) { - chunk.getHandle().world.notify(x, y, z); + chunk.getHandle().getWorld().notify(position); } return success; } @@ -143,19 +145,19 @@ public class CraftBlock implements Block { @Deprecated @Override public int getTypeId() { - return CraftMagicNumbers.getId(chunk.getHandle().getType(this.x & 0xF, this.y & 0xFF, this.z & 0xF)); + return CraftMagicNumbers.getId(chunk.getHandle().getType(new BlockPosition(this.x, this.y, this.z))); } public byte getLightLevel() { - return (byte) chunk.getHandle().world.getLightLevel(this.x, this.y, this.z); + return (byte) chunk.getHandle().getWorld().getLightLevel(new BlockPosition(this.x, this.y, this.z)); } public byte getLightFromSky() { - return (byte) chunk.getHandle().getBrightness(EnumSkyBlock.SKY, this.x & 0xF, this.y & 0xFF, this.z & 0xF); + return (byte) chunk.getHandle().getBrightness(EnumSkyBlock.SKY, new BlockPosition(this.x, this.y, this.z)); } public byte getLightFromBlocks() { - return (byte) chunk.getHandle().getBrightness(EnumSkyBlock.BLOCK, this.x & 0xF, this.y & 0xFF, this.z & 0xF); + return (byte) chunk.getHandle().getBrightness(EnumSkyBlock.BLOCK, new BlockPosition(this.x, this.y, this.z)); } @@ -199,47 +201,42 @@ public class CraftBlock implements Block { return "CraftBlock{" + "chunk=" + chunk + ",x=" + x + ",y=" + y + ",z=" + z + ",type=" + getType() + ",data=" + getData() + '}'; } - /** - * Notch uses a 0-5 to mean DOWN, UP, NORTH, SOUTH, WEST, EAST - * in that order all over. This method is convenience to convert for us. - * - * @return BlockFace the BlockFace represented by this number - */ - public static BlockFace notchToBlockFace(int notch) { + public static BlockFace notchToBlockFace(EnumDirection notch) { + if (notch == null) return BlockFace.SELF; switch (notch) { - case 0: + case DOWN: return BlockFace.DOWN; - case 1: + case UP: return BlockFace.UP; - case 2: + case NORTH: return BlockFace.NORTH; - case 3: + case SOUTH: return BlockFace.SOUTH; - case 4: + case WEST: return BlockFace.WEST; - case 5: + case EAST: return BlockFace.EAST; default: return BlockFace.SELF; } } - public static int blockFaceToNotch(BlockFace face) { + public static EnumDirection blockFaceToNotch(BlockFace face) { switch (face) { case DOWN: - return 0; + return EnumDirection.DOWN; case UP: - return 1; + return EnumDirection.UP; case NORTH: - return 2; + return EnumDirection.NORTH; case SOUTH: - return 3; + return EnumDirection.SOUTH; case WEST: - return 4; + return EnumDirection.WEST; case EAST: - return 5; + return EnumDirection.EAST; default: - return 7; // Good as anything here, but technically invalid + return null; } } @@ -277,6 +274,9 @@ public class CraftBlock implements Block { return new CraftCommandBlock(this); case BEACON: return new CraftBeacon(this); + case BANNER: + case WALL_BANNER: + return new CraftBanner(this); default: return new CraftBlockState(this); } @@ -314,11 +314,11 @@ public class CraftBlock implements Block { } public boolean isBlockPowered() { - return chunk.getHandle().world.getBlockPower(x, y, z) > 0; + return chunk.getHandle().getWorld().getBlockPower(new BlockPosition(x, y, z)) > 0; } public boolean isBlockIndirectlyPowered() { - return chunk.getHandle().world.isBlockIndirectlyPowered(x, y, z); + return chunk.getHandle().getWorld().isBlockIndirectlyPowered(new BlockPosition(x, y, z)); } @Override @@ -336,11 +336,11 @@ public class CraftBlock implements Block { } public boolean isBlockFacePowered(BlockFace face) { - return chunk.getHandle().world.isBlockFacePowered(x, y, z, blockFaceToNotch(face)); + return chunk.getHandle().getWorld().isBlockFacePowered(new BlockPosition(x, y, z), blockFaceToNotch(face)); } public boolean isBlockFaceIndirectlyPowered(BlockFace face) { - int power = chunk.getHandle().world.getBlockFacePower(x, y, z, blockFaceToNotch(face)); + int power = chunk.getHandle().getWorld().getBlockFacePower(new BlockPosition(x, y, z), blockFaceToNotch(face)); Block relative = getRelative(face); if (relative.getType() == Material.REDSTONE_WIRE) { @@ -353,13 +353,13 @@ public class CraftBlock implements Block { public int getBlockPower(BlockFace face) { int power = 0; BlockRedstoneWire wire = Blocks.REDSTONE_WIRE; - net.minecraft.server.World world = chunk.getHandle().world; - if ((face == BlockFace.DOWN || face == BlockFace.SELF) && world.isBlockFacePowered(x, y - 1, z, 0)) power = wire.getPower(world, x, y - 1, z, power); - if ((face == BlockFace.UP || face == BlockFace.SELF) && world.isBlockFacePowered(x, y + 1, z, 1)) power = wire.getPower(world, x, y + 1, z, power); - if ((face == BlockFace.EAST || face == BlockFace.SELF) && world.isBlockFacePowered(x + 1, y, z, 2)) power = wire.getPower(world, x + 1, y, z, power); - if ((face == BlockFace.WEST || face == BlockFace.SELF) && world.isBlockFacePowered(x - 1, y, z, 3)) power = wire.getPower(world, x - 1, y, z, power); - if ((face == BlockFace.NORTH || face == BlockFace.SELF) && world.isBlockFacePowered(x, y, z - 1, 4)) power = wire.getPower(world, x, y, z - 1, power); - if ((face == BlockFace.SOUTH || face == BlockFace.SELF) && world.isBlockFacePowered(x, y, z + 1, 5)) power = wire.getPower(world, x, y, z - 1, power); + net.minecraft.server.World world = chunk.getHandle().getWorld(); + if ((face == BlockFace.DOWN || face == BlockFace.SELF) && world.isBlockFacePowered(new BlockPosition(x, y - 1, z), EnumDirection.DOWN)) power = wire.getPower(world, new BlockPosition(x, y - 1, z), power); + if ((face == BlockFace.UP || face == BlockFace.SELF) && world.isBlockFacePowered(new BlockPosition(x, y + 1, z), EnumDirection.UP)) power = wire.getPower(world, new BlockPosition(x, y + 1, z), power); + if ((face == BlockFace.EAST || face == BlockFace.SELF) && world.isBlockFacePowered(new BlockPosition(x + 1, y, z), EnumDirection.EAST)) power = wire.getPower(world, new BlockPosition(x + 1, y, z), power); + if ((face == BlockFace.WEST || face == BlockFace.SELF) && world.isBlockFacePowered(new BlockPosition(x - 1, y, z), EnumDirection.WEST)) power = wire.getPower(world, new BlockPosition(x - 1, y, z), power); + if ((face == BlockFace.NORTH || face == BlockFace.SELF) && world.isBlockFacePowered(new BlockPosition(x, y, z - 1), EnumDirection.NORTH)) power = wire.getPower(world, new BlockPosition(x, y, z - 1), power); + if ((face == BlockFace.SOUTH || face == BlockFace.SELF) && world.isBlockFacePowered(new BlockPosition(x, y, z + 1), EnumDirection.SOUTH)) power = wire.getPower(world, new BlockPosition(x, y, z - 1), power); return power > 0 ? power : (face == BlockFace.SELF ? isBlockIndirectlyPowered() : isBlockFaceIndirectlyPowered(face)) ? 15 : 0; } @@ -392,7 +392,7 @@ public class CraftBlock implements Block { boolean result = false; if (block != null && block != Blocks.AIR) { - block.dropNaturally(chunk.getHandle().world, x, y, z, data, 1.0F, 0); + block.dropNaturally(chunk.getHandle().getWorld(), new BlockPosition(x, y, z), block.fromLegacyData(data), 1.0F, 0); result = true; } @@ -415,14 +415,14 @@ public class CraftBlock implements Block { if (block != Blocks.AIR) { byte data = getData(); // based on nms.Block.dropNaturally - int count = block.getDropCount(0, chunk.getHandle().world.random); + int count = block.getDropCount(0, chunk.getHandle().getWorld().random); for (int i = 0; i < count; ++i) { - Item item = block.getDropType(data, chunk.getHandle().world.random, 0); + Item item = block.getDropType(block.fromLegacyData(data), chunk.getHandle().getWorld().random, 0); if (item != null) { // Skulls are special, their data is based on the tile entity if (Blocks.SKULL == block) { - net.minecraft.server.ItemStack nmsStack = new net.minecraft.server.ItemStack(item, 1, block.getDropData(chunk.getHandle().world, x, y, z)); - TileEntitySkull tileentityskull = (TileEntitySkull) chunk.getHandle().world.getTileEntity(x, y, z); + net.minecraft.server.ItemStack nmsStack = new net.minecraft.server.ItemStack(item, 1, block.getDropData(chunk.getHandle().getWorld(), new BlockPosition(x, y, z))); + TileEntitySkull tileentityskull = (TileEntitySkull) chunk.getHandle().getWorld().getTileEntity(new BlockPosition(x, y, z)); if (tileentityskull.getSkullType() == 3 && tileentityskull.getGameProfile() != null) { nmsStack.setTag(new NBTTagCompound()); @@ -435,12 +435,13 @@ public class CraftBlock implements Block { drops.add(CraftItemStack.asBukkitCopy(nmsStack)); // We don't want to drop cocoa blocks, we want to drop cocoa beans. } else if (Blocks.COCOA == block) { - int dropAmount = (BlockCocoa.c(data) >= 2 ? 3 : 1); + int age = (Integer) block.fromLegacyData(data).get(BlockCocoa.AGE); + int dropAmount = (age >= 2 ? 3 : 1); for (int j = 0; j < dropAmount; ++j) { drops.add(new ItemStack(Material.INK_SACK, 1, (short) 3)); } } else { - drops.add(new ItemStack(org.bukkit.craftbukkit.util.CraftMagicNumbers.getMaterial(item), 1, (short) block.getDropData(data))); + drops.add(new ItemStack(org.bukkit.craftbukkit.util.CraftMagicNumbers.getMaterial(item), 1, (short) block.getDropData(block.fromLegacyData(data)))); } } } diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftBlockState.java b/src/main/java/org/bukkit/craftbukkit/block/CraftBlockState.java index 2297cc756c..9fb32a82fb 100644 --- a/src/main/java/org/bukkit/craftbukkit/block/CraftBlockState.java +++ b/src/main/java/org/bukkit/craftbukkit/block/CraftBlockState.java @@ -1,5 +1,6 @@ package org.bukkit.craftbukkit.block; +import net.minecraft.server.BlockPosition; import org.bukkit.Location; import org.bukkit.block.Block; import org.bukkit.Chunk; @@ -147,7 +148,7 @@ public class CraftBlockState implements BlockState { } block.setData(getRawData(), applyPhysics); - world.getHandle().notify(x, y, z); + world.getHandle().notify(new BlockPosition(x, y, z)); return true; } diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftChest.java b/src/main/java/org/bukkit/craftbukkit/block/CraftChest.java index 21f7b73261..0e5c240412 100644 --- a/src/main/java/org/bukkit/craftbukkit/block/CraftChest.java +++ b/src/main/java/org/bukkit/craftbukkit/block/CraftChest.java @@ -1,5 +1,6 @@ package org.bukkit.craftbukkit.block; +import net.minecraft.server.BlockPosition; import net.minecraft.server.TileEntityChest; import org.bukkit.Material; @@ -41,19 +42,19 @@ public class CraftChest extends CraftBlockState implements Chest { } if (world.getBlockTypeIdAt(x - 1, y, z) == id) { - CraftInventory left = new CraftInventory((TileEntityChest)world.getHandle().getTileEntity(x - 1, y, z)); + CraftInventory left = new CraftInventory((TileEntityChest)world.getHandle().getTileEntity(new BlockPosition(x - 1, y, z))); inventory = new CraftInventoryDoubleChest(left, inventory); } if (world.getBlockTypeIdAt(x + 1, y, z) == id) { - CraftInventory right = new CraftInventory((TileEntityChest) world.getHandle().getTileEntity(x + 1, y, z)); + CraftInventory right = new CraftInventory((TileEntityChest) world.getHandle().getTileEntity(new BlockPosition(x + 1, y, z))); inventory = new CraftInventoryDoubleChest(inventory, right); } if (world.getBlockTypeIdAt(x, y, z - 1) == id) { - CraftInventory left = new CraftInventory((TileEntityChest) world.getHandle().getTileEntity(x, y, z - 1)); + CraftInventory left = new CraftInventory((TileEntityChest) world.getHandle().getTileEntity(new BlockPosition(x, y, z - 1))); inventory = new CraftInventoryDoubleChest(left, inventory); } if (world.getBlockTypeIdAt(x, y, z + 1) == id) { - CraftInventory right = new CraftInventory((TileEntityChest) world.getHandle().getTileEntity(x, y, z + 1)); + CraftInventory right = new CraftInventory((TileEntityChest) world.getHandle().getTileEntity(new BlockPosition(x, y, z + 1))); inventory = new CraftInventoryDoubleChest(inventory, right); } return inventory; diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftDispenser.java b/src/main/java/org/bukkit/craftbukkit/block/CraftDispenser.java index 762a8e6dcd..ab6e55f408 100644 --- a/src/main/java/org/bukkit/craftbukkit/block/CraftDispenser.java +++ b/src/main/java/org/bukkit/craftbukkit/block/CraftDispenser.java @@ -1,6 +1,7 @@ package org.bukkit.craftbukkit.block; import net.minecraft.server.BlockDispenser; +import net.minecraft.server.BlockPosition; import net.minecraft.server.Blocks; import net.minecraft.server.TileEntityDispenser; @@ -44,7 +45,7 @@ public class CraftDispenser extends CraftBlockState implements Dispenser { if (block.getType() == Material.DISPENSER) { BlockDispenser dispense = (BlockDispenser) Blocks.DISPENSER; - dispense.dispense(world.getHandle(), getX(), getY(), getZ()); + dispense.dispense(world.getHandle(), new BlockPosition(getX(), getY(), getZ())); return true; } else { return false; diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftDropper.java b/src/main/java/org/bukkit/craftbukkit/block/CraftDropper.java index 6b4ef8ad3a..327f47663c 100644 --- a/src/main/java/org/bukkit/craftbukkit/block/CraftDropper.java +++ b/src/main/java/org/bukkit/craftbukkit/block/CraftDropper.java @@ -1,6 +1,7 @@ package org.bukkit.craftbukkit.block; import net.minecraft.server.BlockDropper; +import net.minecraft.server.BlockPosition; import net.minecraft.server.Blocks; import net.minecraft.server.TileEntityDropper; @@ -32,7 +33,7 @@ public class CraftDropper extends CraftBlockState implements Dropper { if (block.getType() == Material.DROPPER) { BlockDropper drop = (BlockDropper) Blocks.DROPPER; - drop.dispense(world.getHandle(), getX(), getY(), getZ()); + drop.dispense(world.getHandle(), new BlockPosition(getX(), getY(), getZ())); } } diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftJukebox.java b/src/main/java/org/bukkit/craftbukkit/block/CraftJukebox.java index 761b76af09..ce744c977e 100644 --- a/src/main/java/org/bukkit/craftbukkit/block/CraftJukebox.java +++ b/src/main/java/org/bukkit/craftbukkit/block/CraftJukebox.java @@ -1,9 +1,6 @@ package org.bukkit.craftbukkit.block; -import net.minecraft.server.BlockJukeBox; -import net.minecraft.server.Blocks; -import net.minecraft.server.ItemStack; -import net.minecraft.server.TileEntityRecordPlayer; +import net.minecraft.server.*; import org.bukkit.Effect; import org.bukkit.Material; import org.bukkit.block.Block; @@ -41,9 +38,13 @@ public class CraftJukebox extends CraftBlockState implements Jukebox { } jukebox.update(); if (record == Material.AIR) { - world.getHandle().setData(getX(), getY(), getZ(), 0, 3); + world.getHandle().setTypeAndData(new BlockPosition(getX(), getY(), getZ()), + Blocks.JUKEBOX.getBlockData() + .set(BlockJukeBox.HAS_RECORD, false), 3); } else { - world.getHandle().setData(getX(), getY(), getZ(), 1, 3); + world.getHandle().setTypeAndData(new BlockPosition(getX(), getY(), getZ()), + Blocks.JUKEBOX.getBlockData() + .set(BlockJukeBox.HAS_RECORD, true), 3); } world.playEffect(getLocation(), Effect.RECORD_PLAY, record.getId()); } @@ -54,7 +55,7 @@ public class CraftJukebox extends CraftBlockState implements Jukebox { public boolean eject() { boolean result = isPlaying(); - ((BlockJukeBox) Blocks.JUKEBOX).dropRecord(world.getHandle(), getX(), getY(), getZ()); + ((BlockJukeBox) Blocks.JUKEBOX).dropRecord(world.getHandle(), new BlockPosition(getX(), getY(), getZ()), null); return result; } } diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftNoteBlock.java b/src/main/java/org/bukkit/craftbukkit/block/CraftNoteBlock.java index b83e33513f..79d8e6ddc9 100644 --- a/src/main/java/org/bukkit/craftbukkit/block/CraftNoteBlock.java +++ b/src/main/java/org/bukkit/craftbukkit/block/CraftNoteBlock.java @@ -1,5 +1,6 @@ package org.bukkit.craftbukkit.block; +import net.minecraft.server.BlockPosition; import net.minecraft.server.TileEntityNote; import org.bukkit.Instrument; @@ -41,7 +42,7 @@ public class CraftNoteBlock extends CraftBlockState implements NoteBlock { Block block = getBlock(); if (block.getType() == Material.NOTE_BLOCK) { - note.play(world.getHandle(), getX(), getY(), getZ()); + note.play(world.getHandle(), new BlockPosition(getX(), getY(), getZ())); return true; } else { return false; @@ -53,7 +54,7 @@ public class CraftNoteBlock extends CraftBlockState implements NoteBlock { Block block = getBlock(); if (block.getType() == Material.NOTE_BLOCK) { - world.getHandle().playBlockAction(getX(), getY(), getZ(), CraftMagicNumbers.getBlock(block), instrument, note); + world.getHandle().playBlockAction(new BlockPosition(getX(), getY(), getZ()), CraftMagicNumbers.getBlock(block), instrument, note); return true; } else { return false; @@ -65,7 +66,7 @@ public class CraftNoteBlock extends CraftBlockState implements NoteBlock { Block block = getBlock(); if (block.getType() == Material.NOTE_BLOCK) { - world.getHandle().playBlockAction(getX(), getY(), getZ(), CraftMagicNumbers.getBlock(block), instrument.getType(), note.getId()); + world.getHandle().playBlockAction(new BlockPosition(getX(), getY(), getZ()), CraftMagicNumbers.getBlock(block), instrument.getType(), note.getId()); return true; } else { return false; diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftSign.java b/src/main/java/org/bukkit/craftbukkit/block/CraftSign.java index 77717d5b2b..724dbd128d 100644 --- a/src/main/java/org/bukkit/craftbukkit/block/CraftSign.java +++ b/src/main/java/org/bukkit/craftbukkit/block/CraftSign.java @@ -1,9 +1,12 @@ package org.bukkit.craftbukkit.block; +import net.minecraft.server.ChatComponentText; +import net.minecraft.server.IChatBaseComponent; import net.minecraft.server.TileEntitySign; import org.bukkit.block.Block; import org.bukkit.block.Sign; import org.bukkit.craftbukkit.CraftWorld; +import org.bukkit.craftbukkit.util.CraftChatMessage; public class CraftSign extends CraftBlockState implements Sign { private final TileEntitySign sign; @@ -15,7 +18,7 @@ public class CraftSign extends CraftBlockState implements Sign { CraftWorld world = (CraftWorld) block.getWorld(); sign = (TileEntitySign) world.getTileEntityAt(getX(), getY(), getZ()); lines = new String[sign.lines.length]; - System.arraycopy(sign.lines, 0, lines, 0, lines.length); + System.arraycopy(revertComponents(sign.lines), 0, lines, 0, lines.length); } public String[] getLines() { @@ -35,24 +38,37 @@ public class CraftSign extends CraftBlockState implements Sign { boolean result = super.update(force, applyPhysics); if (result) { - sign.lines = sanitizeLines(lines); + IChatBaseComponent[] newLines = sanitizeLines(lines); + System.arraycopy(newLines, 0, sign.lines, 0, 4); sign.update(); } return result; } - public static String[] sanitizeLines(String[] lines) { - String[] astring = new String[4]; + public static IChatBaseComponent[] sanitizeLines(String[] lines) { + IChatBaseComponent[] components = new IChatBaseComponent[4]; for (int i = 0; i < 4; i++) { if (i < lines.length && lines[i] != null) { - astring[i] = lines[i]; + components[i] = CraftChatMessage.fromString(lines[i])[0]; } else { - astring[i] = ""; + components[i] = new ChatComponentText(""); } } - return TileEntitySign.sanitizeLines(astring); + return components; + } + + public static String[] revertComponents(IChatBaseComponent[] components) { + String[] lines = new String[components.length]; + for (int i = 0; i < lines.length; i++) { + lines[i] = revertComponent(components[i]); + } + return lines; + } + + private static String revertComponent(IChatBaseComponent component) { + return CraftChatMessage.fromComponent(component); } } diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftSkull.java b/src/main/java/org/bukkit/craftbukkit/block/CraftSkull.java index dc9a587e8c..8d751c11ae 100644 --- a/src/main/java/org/bukkit/craftbukkit/block/CraftSkull.java +++ b/src/main/java/org/bukkit/craftbukkit/block/CraftSkull.java @@ -1,8 +1,8 @@ package org.bukkit.craftbukkit.block; +import com.mojang.authlib.GameProfile; import net.minecraft.server.MinecraftServer; import net.minecraft.server.TileEntitySkull; -import net.minecraft.util.com.mojang.authlib.GameProfile; import org.bukkit.SkullType; import org.bukkit.block.Block; @@ -24,7 +24,7 @@ public class CraftSkull extends CraftBlockState implements Skull { skull = (TileEntitySkull) world.getTileEntityAt(getX(), getY(), getZ()); profile = skull.getGameProfile(); skullType = getSkullType(skull.getSkullType()); - rotation = (byte) skull.getRotation(); + rotation = (byte) skull.rotation; } static SkullType getSkullType(int id) { diff --git a/src/main/java/org/bukkit/craftbukkit/chunkio/ChunkIOProvider.java b/src/main/java/org/bukkit/craftbukkit/chunkio/ChunkIOProvider.java index 9cf1b49332..c2d4c2e4f3 100644 --- a/src/main/java/org/bukkit/craftbukkit/chunkio/ChunkIOProvider.java +++ b/src/main/java/org/bukkit/craftbukkit/chunkio/ChunkIOProvider.java @@ -35,17 +35,17 @@ class ChunkIOProvider implements AsynchronousExecutor.CallBackProvider) vanillaCommand.tabComplete(getListener(sender), args); + return (List) vanillaCommand.tabComplete(getListener(sender), args, new BlockPosition(0, 0, 0)); } public final int dispatchVanillaCommandBlock(CommandBlockListenerAbstract icommandlistener, String s) { @@ -97,26 +87,35 @@ public final class VanillaCommandWrapper extends VanillaCommand { try { if (vanillaCommand.canUse(icommandlistener)) { if (i > -1) { - EntityPlayer aentityplayer[] = PlayerSelector.getPlayers(icommandlistener, as[i]); + List list = ((List)PlayerSelector.getPlayers(icommandlistener, as[i], Entity.class)); String s2 = as[i]; - EntityPlayer aentityplayer1[] = aentityplayer; - int k = aentityplayer1.length; - for (int l = 0; l < k;l++) { - EntityPlayer entityplayer = aentityplayer1[l]; - as[i] = entityplayer.getName(); + + icommandlistener.a(EnumCommandResult.AFFECTED_ENTITIES, list.size()); + Iterator iterator = list.iterator(); + + while (iterator.hasNext()) { + Entity entity = iterator.next(); + try { + as[i] = entity.getUniqueID().toString(); vanillaCommand.execute(icommandlistener, as); j++; - continue; - } catch (CommandException commandexception1) { - ChatMessage chatmessage4 = new ChatMessage(commandexception1.getMessage(), commandexception1.getArgs()); - chatmessage4.getChatModifier().setColor(EnumChatFormat.RED); - icommandlistener.sendMessage(chatmessage4); - } + // PAIL fake throws + if (false) throw new ExceptionUsage(null, null); + if (false) throw new CommandException(null, null); + } catch (ExceptionUsage exceptionusage) { + ChatMessage chatmessage = new ChatMessage("commands.generic.usage", new Object[] { new ChatMessage(exceptionusage.getMessage(), exceptionusage.getArgs())}); + chatmessage.getChatModifier().setColor(EnumChatFormat.RED); + icommandlistener.sendMessage(chatmessage); + } catch (CommandException commandexception) { + ChatMessage chatmessage = new ChatMessage(commandexception.getMessage(), commandexception.getArgs()); + chatmessage.getChatModifier().setColor(EnumChatFormat.RED); + icommandlistener.sendMessage(chatmessage); + } } - as[i] = s2; } else { + icommandlistener.a(EnumCommandResult.AFFECTED_ENTITIES, 1); vanillaCommand.execute(icommandlistener, as); j++; } @@ -125,6 +124,10 @@ public final class VanillaCommandWrapper extends VanillaCommand { chatmessage.getChatModifier().setColor(EnumChatFormat.RED); icommandlistener.sendMessage(chatmessage); } + // PAIL start: fix compile error + if (false) throw new ExceptionUsage(null, null); + if (false) throw new CommandException(null, null); + // PAIL end } catch (ExceptionUsage exceptionusage) { ChatMessage chatmessage1 = new ChatMessage("commands.generic.usage", new Object[] { new ChatMessage(exceptionusage.getMessage(), exceptionusage.getArgs()) }); chatmessage1.getChatModifier().setColor(EnumChatFormat.RED); @@ -139,16 +142,17 @@ public final class VanillaCommandWrapper extends VanillaCommand { icommandlistener.sendMessage(chatmessage3); if(icommandlistener instanceof TileEntityCommandListener) { TileEntityCommandListener listener = (TileEntityCommandListener) icommandlistener; - MinecraftServer.getLogger().log(Level.WARN, String.format("CommandBlock at (%d,%d,%d) failed to handle command", listener.getChunkCoordinates().x, listener.getChunkCoordinates().y, listener.getChunkCoordinates().z), throwable); + MinecraftServer.getLogger().log(Level.WARN, String.format("CommandBlock at (%d,%d,%d) failed to handle command", listener.getChunkCoordinates().getX(), listener.getChunkCoordinates().getY(), listener.getChunkCoordinates().getZ()), throwable); } else if (icommandlistener instanceof EntityMinecartCommandBlockListener) { EntityMinecartCommandBlockListener listener = (EntityMinecartCommandBlockListener) icommandlistener; - MinecraftServer.getLogger().log(Level.WARN, String.format("MinecartCommandBlock at (%d,%d,%d) failed to handle command", listener.getChunkCoordinates().x, listener.getChunkCoordinates().y, listener.getChunkCoordinates().z), throwable); + MinecraftServer.getLogger().log(Level.WARN, String.format("MinecartCommandBlock at (%d,%d,%d) failed to handle command", listener.getChunkCoordinates().getX(), listener.getChunkCoordinates().getY(), listener.getChunkCoordinates().getZ()), throwable); } else { MinecraftServer.getLogger().log(Level.WARN, String.format("Unknown CommandBlock failed to handle command"), throwable); } } finally { MinecraftServer.getServer().worldServer = prev; } + icommandlistener.a(EnumCommandResult.SUCCESS_COUNT, j); return j; } @@ -163,7 +167,7 @@ public final class VanillaCommandWrapper extends VanillaCommand { return ((EntityMinecartCommandBlock) ((CraftMinecartCommand) sender).getHandle()).getCommandBlock(); } if (sender instanceof RemoteConsoleCommandSender) { - return RemoteControlCommandListener.instance; + return RemoteControlCommandListener.getInstance(); } if (sender instanceof ConsoleCommandSender) { return ((CraftServer) sender.getServer()).getServer(); diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftArmorStand.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftArmorStand.java new file mode 100644 index 0000000000..2896603e7c --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftArmorStand.java @@ -0,0 +1,214 @@ +package org.bukkit.craftbukkit.entity; + +import net.minecraft.server.EntityArmorStand; +import net.minecraft.server.Vector3f; +import org.bukkit.craftbukkit.CraftServer; +import org.bukkit.craftbukkit.inventory.CraftItemStack; +import org.bukkit.entity.ArmorStand; +import org.bukkit.entity.EntityType; +import org.bukkit.inventory.ItemStack; +import org.bukkit.util.EulerAngle; + +public class CraftArmorStand extends CraftLivingEntity implements ArmorStand { + + private static final int HAND = 0; + private static final int FEET = 1; + private static final int LEGS = 2; + private static final int CHEST = 3; + private static final int HEAD = 4; + + public CraftArmorStand(CraftServer server, EntityArmorStand entity) { + super(server, entity); + } + + @Override + public String toString() { + return "CraftArmorStand"; + } + + @Override + public EntityType getType() { + return EntityType.ARMOR_STAND; + } + + @Override + public EntityArmorStand getHandle() { + return (EntityArmorStand) super.getHandle(); + } + + @Override + public ItemStack getItemInHand() { + return CraftItemStack.asBukkitCopy(getHandle().getEquipment(HAND)); + } + + @Override + public void setItemInHand(ItemStack item) { + getHandle().setEquipment(HAND, CraftItemStack.asNMSCopy(item)); + } + + @Override + public ItemStack getBoots() { + return CraftItemStack.asBukkitCopy(getHandle().getEquipment(FEET)); + } + + @Override + public void setBoots(ItemStack item) { + getHandle().setEquipment(FEET, CraftItemStack.asNMSCopy(item)); + } + + @Override + public ItemStack getLeggings() { + return CraftItemStack.asBukkitCopy(getHandle().getEquipment(LEGS)); + } + + @Override + public void setLeggings(ItemStack item) { + getHandle().setEquipment(LEGS, CraftItemStack.asNMSCopy(item)); + } + + @Override + public ItemStack getChestplate() { + return CraftItemStack.asBukkitCopy(getHandle().getEquipment(CHEST)); + } + + @Override + public void setChestplate(ItemStack item) { + getHandle().setEquipment(CHEST, CraftItemStack.asNMSCopy(item)); + } + + @Override + public ItemStack getHelmet() { + return CraftItemStack.asBukkitCopy(getHandle().getEquipment(HEAD)); + } + + @Override + public void setHelmet(ItemStack item) { + getHandle().setEquipment(HEAD, CraftItemStack.asNMSCopy(item)); + } + + @Override + public EulerAngle getBodyPose() { + return fromNMS(getHandle().bodyPose); + } + + @Override + public void setBodyPose(EulerAngle pose) { + getHandle().setBodyPose(toNMS(pose)); + } + + @Override + public EulerAngle getLeftArmPose() { + return fromNMS(getHandle().leftArmPose); + } + + @Override + public void setLeftArmPose(EulerAngle pose) { + getHandle().setLeftArmPose(toNMS(pose)); + } + + @Override + public EulerAngle getRightArmPose() { + return fromNMS(getHandle().rightArmPose); + } + + @Override + public void setRightArmPose(EulerAngle pose) { + getHandle().setRightArmPose(toNMS(pose)); + } + + @Override + public EulerAngle getLeftLegPose() { + return fromNMS(getHandle().leftLegPose); + } + + @Override + public void setLeftLegPose(EulerAngle pose) { + getHandle().setLeftLegPose(toNMS(pose)); + } + + @Override + public EulerAngle getRightLegPose() { + return fromNMS(getHandle().rightLegPose); + } + + @Override + public void setRightLegPose(EulerAngle pose) { + getHandle().setRightLegPose(toNMS(pose)); + } + + @Override + public EulerAngle getHeadPose() { + return fromNMS(getHandle().headPose); + } + + @Override + public void setHeadPose(EulerAngle pose) { + getHandle().setHeadPose(toNMS(pose)); + } + + @Override + public boolean hasBasePlate() { + return !getHandle().hasBasePlate(); + } + + @Override + public void setBasePlate(boolean basePlate) { + getHandle().setBasePlate(!basePlate); + } + + @Override + public boolean hasGravity() { + return !getHandle().hasGravity(); + } + + @Override + public void setGravity(boolean gravity) { + getHandle().setGravity(!gravity); + } + + @Override + public boolean isVisible() { + return !getHandle().isInvisible(); + } + + @Override + public void setVisible(boolean visible) { + getHandle().setInvisible(!visible); + } + + @Override + public boolean hasArms() { + return getHandle().hasArms(); + } + + @Override + public void setArms(boolean arms) { + getHandle().setArms(arms); + } + + @Override + public boolean isSmall() { + return getHandle().isSmall(); + } + + @Override + public void setSmall(boolean small) { + getHandle().setSmall(small); + } + + private static EulerAngle fromNMS(Vector3f old) { + return new EulerAngle( + Math.toRadians(old.getX()), + Math.toRadians(old.getY()), + Math.toRadians(old.getZ()) + ); + } + + private static Vector3f toNMS(EulerAngle old) { + return new Vector3f( + (float) Math.toDegrees(old.getX()), + (float) Math.toDegrees(old.getY()), + (float) Math.toDegrees(old.getZ()) + ); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftArrow.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftArrow.java index 4f8d47d6e5..dca8520464 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftArrow.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftArrow.java @@ -33,7 +33,7 @@ public class CraftArrow extends AbstractProjectile implements Arrow { } public ProjectileSource getShooter() { - return getHandle().projectileSource; + return getHandle().projectileSource; } public void setShooter(ProjectileSource shooter) { diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftCreature.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftCreature.java index a6c0b94e5c..09d42141fb 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftCreature.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftCreature.java @@ -1,7 +1,6 @@ package org.bukkit.craftbukkit.entity; import net.minecraft.server.EntityCreature; -import net.minecraft.server.EntityLiving; import org.bukkit.craftbukkit.CraftServer; import org.bukkit.entity.Creature; import org.bukkit.entity.LivingEntity; @@ -14,20 +13,16 @@ public class CraftCreature extends CraftLivingEntity implements Creature { public void setTarget(LivingEntity target) { EntityCreature entity = getHandle(); if (target == null) { - entity.target = null; - entity.setGoalTarget(null); + entity.setGoalTarget(null, null, false); } else if (target instanceof CraftLivingEntity) { - entity.target = ((CraftLivingEntity) target).getHandle(); - entity.pathEntity = entity.world.findPath(entity, entity.target, 16.0F, true, false, false, true); - entity.setGoalTarget(((CraftLivingEntity) target).getHandle()); + entity.setGoalTarget(((CraftLivingEntity) target).getHandle(), null, false); } } public CraftLivingEntity getTarget() { - if (getHandle().target == null) return null; - if (!(getHandle().target instanceof EntityLiving)) return null; + if (getHandle().getGoalTarget() == null) return null; - return (CraftLivingEntity) getHandle().target.getBukkitEntity(); + return (CraftLivingEntity) getHandle().getGoalTarget().getBukkitEntity(); } @Override diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftEnderman.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftEnderman.java index 09a03c05ed..b1bf7a46ec 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftEnderman.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftEnderman.java @@ -2,6 +2,7 @@ package org.bukkit.craftbukkit.entity; import net.minecraft.server.EntityEnderman; +import net.minecraft.server.IBlockData; import org.bukkit.craftbukkit.CraftServer; import org.bukkit.craftbukkit.util.CraftMagicNumbers; import org.bukkit.entity.Enderman; @@ -14,12 +15,12 @@ public class CraftEnderman extends CraftMonster implements Enderman { } public MaterialData getCarriedMaterial() { - return CraftMagicNumbers.getMaterial(getHandle().getCarried()).getNewData((byte) getHandle().getCarriedData()); + IBlockData blockData = getHandle().getCarried(); + return CraftMagicNumbers.getMaterial(blockData.getBlock()).getNewData((byte) blockData.getBlock().toLegacyData(blockData)); } public void setCarriedMaterial(MaterialData data) { - getHandle().setCarried(CraftMagicNumbers.getBlock(data.getItemTypeId())); - getHandle().setCarriedData(data.getData()); + getHandle().setCarried(CraftMagicNumbers.getBlock(data.getItemTypeId()).fromLegacyData(data.getData())); } @Override diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftEndermite.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftEndermite.java new file mode 100644 index 0000000000..4fd49ead9b --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftEndermite.java @@ -0,0 +1,23 @@ +package org.bukkit.craftbukkit.entity; + +import net.minecraft.server.EntityEndermite; +import org.bukkit.craftbukkit.CraftServer; +import org.bukkit.entity.Endermite; +import org.bukkit.entity.EntityType; + +public class CraftEndermite extends CraftMonster implements Endermite { + + public CraftEndermite(CraftServer server, EntityEndermite entity) { + super(server, entity); + } + + @Override + public String toString() { + return "CraftEndermite"; + } + + @Override + public EntityType getType() { + return EntityType.ENDERMITE; + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java index b8a9a14888..b7e9d8fd5b 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java @@ -37,6 +37,11 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity { if (entity instanceof EntityPlayer) { return new CraftPlayer(server, (EntityPlayer) entity); } else { return new CraftHumanEntity(server, (EntityHuman) entity); } } + // Water Animals + else if (entity instanceof EntityWaterAnimal) { + if (entity instanceof EntitySquid) { return new CraftSquid(server, (EntitySquid) entity); } + else { return new CraftWaterMob(server, (EntityWaterAnimal) entity); } + } else if (entity instanceof EntityCreature) { // Animals if (entity instanceof EntityAnimal) { @@ -52,6 +57,7 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity { } else if (entity instanceof EntitySheep) { return new CraftSheep(server, (EntitySheep) entity); } else if (entity instanceof EntityHorse) { return new CraftHorse(server, (EntityHorse) entity); } + else if (entity instanceof EntityRabbit) { return new CraftRabbit(server, (EntityRabbit) entity); } else { return new CraftAnimals(server, (EntityAnimal) entity); } } // Monsters @@ -72,14 +78,11 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity { if (entity instanceof EntityCaveSpider) { return new CraftCaveSpider(server, (EntityCaveSpider) entity); } else { return new CraftSpider(server, (EntitySpider) entity); } } + else if (entity instanceof EntityEndermite) { return new CraftEndermite(server, (EntityEndermite) entity); } + else if (entity instanceof EntityGuardian) { return new CraftGuardian(server, (EntityGuardian) entity); } else { return new CraftMonster(server, (EntityMonster) entity); } } - // Water Animals - else if (entity instanceof EntityWaterAnimal) { - if (entity instanceof EntitySquid) { return new CraftSquid(server, (EntitySquid) entity); } - else { return new CraftWaterMob(server, (EntityWaterAnimal) entity); } - } else if (entity instanceof EntityGolem) { if (entity instanceof EntitySnowman) { return new CraftSnowman(server, (EntitySnowman) entity); } else if (entity instanceof EntityIronGolem) { return new CraftIronGolem(server, (EntityIronGolem) entity); } @@ -105,6 +108,7 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity { if (entity instanceof EntityBat) { return new CraftBat(server, (EntityBat) entity); } else { return new CraftAmbient(server, (EntityAmbient) entity); } } + else if (entity instanceof EntityArmorStand) { return new CraftArmorStand(server, (EntityArmorStand) entity); } else { return new CraftLivingEntity(server, (EntityLiving) entity); } } else if (entity instanceof EntityComplexPart) { @@ -154,7 +158,7 @@ public abstract class CraftEntity implements org.bukkit.entity.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 AssertionError("Unknown entity " + entity == null ? null : entity.getClass()); + throw new AssertionError("Unknown entity " + (entity == null ? null : entity.getClass())); } public Location getLocation() { @@ -224,7 +228,7 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity { public List getNearbyEntities(double x, double y, double z) { @SuppressWarnings("unchecked") - List notchEntityList = entity.world.getEntities(entity, entity.boundingBox.grow(x, y, z)); + List notchEntityList = entity.world.getEntities(entity, entity.getBoundingBox().grow(x, y, z)); List bukkitEntityList = new java.util.ArrayList(notchEntityList.size()); for (Entity e : notchEntityList) { @@ -316,7 +320,7 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity { } public UUID getUniqueId() { - return getHandle().uniqueID; + return getHandle().getUniqueID(); } public int getTicksLived() { @@ -402,4 +406,34 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity { return getHandle().vehicle.getBukkitEntity(); } + + @Override + public void setCustomName(String name) { + if (name == null) { + name = ""; + } + + getHandle().setCustomName(name); + } + + @Override + public String getCustomName() { + String name = getHandle().getCustomName(); + + if (name == null || name.length() == 0) { + return null; + } + + return name; + } + + @Override + public void setCustomNameVisible(boolean flag) { + getHandle().setCustomNameVisible(flag); + } + + @Override + public boolean isCustomNameVisible() { + return getHandle().getCustomNameVisible(); + } } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftFallingSand.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftFallingSand.java index d67ddd086a..788f26ba5c 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftFallingSand.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftFallingSand.java @@ -33,11 +33,11 @@ public class CraftFallingSand extends CraftEntity implements FallingSand { } public int getBlockId() { - return CraftMagicNumbers.getId(getHandle().id); + return CraftMagicNumbers.getId(getHandle().getBlock().getBlock()); } public byte getBlockData() { - return (byte) getHandle().data; + return (byte) getHandle().getBlock().getBlock().toLegacyData(getHandle().getBlock()); } public boolean getDropItem() { diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftFish.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftFish.java index edb30e7c68..ecfc316bb2 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftFish.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftFish.java @@ -1,5 +1,6 @@ package org.bukkit.craftbukkit.entity; +import net.minecraft.server.BlockPosition; import net.minecraft.server.EntityFishingHook; import net.minecraft.server.EntityHuman; import net.minecraft.server.MathHelper; @@ -50,7 +51,7 @@ public class CraftFish extends AbstractProjectile implements Fish { EntityFishingHook hook = getHandle(); if (this.biteChance == -1) { - if (hook.world.isRainingAt(MathHelper.floor(hook.locX), MathHelper.floor(hook.locY) + 1, MathHelper.floor(hook.locZ))) { + if (hook.world.isRainingAt(new BlockPosition(MathHelper.floor(hook.locX), MathHelper.floor(hook.locY) + 1, MathHelper.floor(hook.locZ)))) { return 1/300.0; } return 1/500.0; diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftGuardian.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftGuardian.java new file mode 100644 index 0000000000..f254e809e9 --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftGuardian.java @@ -0,0 +1,23 @@ +package org.bukkit.craftbukkit.entity; + +import net.minecraft.server.EntityGuardian; +import org.bukkit.craftbukkit.CraftServer; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.Guardian; + +public class CraftGuardian extends CraftMonster implements Guardian { + + public CraftGuardian(CraftServer server, EntityGuardian entity) { + super(server, entity); + } + + @Override + public String toString() { + return "CraftGuardian"; + } + + @Override + public EntityType getType() { + return EntityType.GUARDIAN; + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftHanging.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftHanging.java index e51dddbd56..3bf83db1b8 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftHanging.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftHanging.java @@ -1,6 +1,8 @@ package org.bukkit.craftbukkit.entity; +import net.minecraft.server.BlockPosition; import net.minecraft.server.EntityHanging; +import net.minecraft.server.EnumDirection; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; import org.bukkit.craftbukkit.CraftServer; @@ -23,30 +25,27 @@ public class CraftHanging extends CraftEntity implements Hanging { public boolean setFacingDirection(BlockFace face, boolean force) { Block block = getLocation().getBlock().getRelative(getAttachedFace()).getRelative(face.getOppositeFace()).getRelative(getFacing()); EntityHanging hanging = getHandle(); - int x = hanging.x, y = hanging.y, z = hanging.z, dir = hanging.direction; - hanging.x = block.getX(); - hanging.y = block.getY(); - hanging.z = block.getZ(); + BlockPosition old = hanging.getBlockPosition(); + EnumDirection dir = hanging.direction; + hanging.blockPosition = new BlockPosition(block.getX(), block.getY(), block.getZ()); switch (face) { case SOUTH: default: - getHandle().setDirection(0); + getHandle().setDirection(EnumDirection.SOUTH); break; case WEST: - getHandle().setDirection(1); + getHandle().setDirection(EnumDirection.WEST); break; case NORTH: - getHandle().setDirection(2); + getHandle().setDirection(EnumDirection.NORTH); break; case EAST: - getHandle().setDirection(3); + getHandle().setDirection(EnumDirection.EAST); break; } if (!force && !hanging.survives()) { // Revert since it doesn't fit - hanging.x = x; - hanging.y = y; - hanging.z = z; + hanging.blockPosition = old; hanging.setDirection(dir); return false; } @@ -55,14 +54,14 @@ public class CraftHanging extends CraftEntity implements Hanging { public BlockFace getFacing() { switch (this.getHandle().direction) { - case 0: + case SOUTH: default: return BlockFace.SOUTH; - case 1: + case WEST: return BlockFace.WEST; - case 2: + case NORTH: return BlockFace.NORTH; - case 3: + case EAST: return BlockFace.EAST; } } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftHorse.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftHorse.java index 8522cad0e0..230ae9ee4b 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftHorse.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftHorse.java @@ -107,7 +107,7 @@ public class CraftHorse extends CraftAnimals implements Horse { public void setOwner(AnimalTamer owner) { if (owner != null) { setTamed(true); - getHandle().setPathEntity(null); + getHandle().setGoalTarget(null, null, false); setOwnerUUID(owner.getUniqueId()); } else { setTamed(false); diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftHumanEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftHumanEntity.java index 3d1ca3d81f..e69f417bc5 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftHumanEntity.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftHumanEntity.java @@ -2,16 +2,7 @@ package org.bukkit.craftbukkit.entity; import java.util.Set; -import net.minecraft.server.Container; -import net.minecraft.server.EntityHuman; -import net.minecraft.server.EntityMinecartHopper; -import net.minecraft.server.EntityPlayer; -import net.minecraft.server.PacketPlayInCloseWindow; -import net.minecraft.server.PacketPlayOutOpenWindow; -import net.minecraft.server.TileEntityBrewingStand; -import net.minecraft.server.TileEntityDispenser; -import net.minecraft.server.TileEntityFurnace; -import net.minecraft.server.TileEntityHopper; +import net.minecraft.server.*; import org.bukkit.GameMode; import org.bukkit.Location; @@ -194,38 +185,38 @@ public class CraftHumanEntity extends CraftLivingEntity implements HumanEntity { break; case DISPENSER: if (craftinv.getInventory() instanceof TileEntityDispenser) { - getHandle().openDispenser((TileEntityDispenser) craftinv.getInventory()); + getHandle().openTileEntity((TileEntityDispenser) craftinv.getInventory()); } else { - openCustomInventory(inventory, player, 3); + openCustomInventory(inventory, player, "minecraft:dispenser"); } break; case FURNACE: if (craftinv.getInventory() instanceof TileEntityFurnace) { - getHandle().openFurnace((TileEntityFurnace) craftinv.getInventory()); + getHandle().openTileEntity((TileEntityFurnace) craftinv.getInventory()); } else { - openCustomInventory(inventory, player, 2); + openCustomInventory(inventory, player, "minecraft:furnace"); } break; case WORKBENCH: - openCustomInventory(inventory, player, 1); + openCustomInventory(inventory, player, "minecraft:crafting_table"); break; case BREWING: if (craftinv.getInventory() instanceof TileEntityBrewingStand) { - getHandle().openBrewingStand((TileEntityBrewingStand) craftinv.getInventory()); + getHandle().openTileEntity((TileEntityBrewingStand) craftinv.getInventory()); } else { - openCustomInventory(inventory, player, 5); + openCustomInventory(inventory, player, "minecraft:brewing_stand"); } break; case ENCHANTING: - openCustomInventory(inventory, player, 4); + openCustomInventory(inventory, player, "minecraft:enchanting_table"); break; case HOPPER: if (craftinv.getInventory() instanceof TileEntityHopper) { - getHandle().openHopper((TileEntityHopper) craftinv.getInventory()); + getHandle().openTileEntity((TileEntityHopper) craftinv.getInventory()); } else if (craftinv.getInventory() instanceof EntityMinecartHopper) { - getHandle().openMinecartHopper((EntityMinecartHopper) craftinv.getInventory()); + getHandle().openTileEntity((EntityMinecartHopper) craftinv.getInventory()); } else { - openCustomInventory(inventory, player, 9); + openCustomInventory(inventory, player, "minecraft:hopper"); } break; case CREATIVE: @@ -239,7 +230,7 @@ public class CraftHumanEntity extends CraftLivingEntity implements HumanEntity { return getHandle().activeContainer.getBukkitView(); } - private void openCustomInventory(Inventory inventory, EntityPlayer player, int windowType) { + private void openCustomInventory(Inventory inventory, EntityPlayer player, String windowType) { if (player.playerConnection == null) return; Container container = new CraftContainer(inventory, this, player.nextContainerCounter()); @@ -249,7 +240,7 @@ public class CraftHumanEntity extends CraftLivingEntity implements HumanEntity { String title = container.getBukkitView().getTitle(); int size = container.getBukkitView().getTopInventory().getSize(); - player.playerConnection.sendPacket(new PacketPlayOutOpenWindow(container.windowId, windowType, title, size, true)); + player.playerConnection.sendPacket(new PacketPlayOutOpenWindow(container.windowId, windowType, new ChatComponentText(title), size)); getHandle().activeContainer = container; getHandle().activeContainer.addSlotListener(player); } @@ -264,7 +255,7 @@ public class CraftHumanEntity extends CraftLivingEntity implements HumanEntity { if (location == null) { location = getLocation(); } - getHandle().startCrafting(location.getBlockX(), location.getBlockY(), location.getBlockZ()); + getHandle().openTileEntity(new TileEntityContainerWorkbench(getHandle().world, new BlockPosition(location.getBlockX(), location.getBlockY(), location.getBlockZ()))); if (force) { getHandle().activeContainer.checkReachable = false; } @@ -281,7 +272,7 @@ public class CraftHumanEntity extends CraftLivingEntity implements HumanEntity { if (location == null) { location = getLocation(); } - getHandle().startEnchanting(location.getBlockX(), location.getBlockY(), location.getBlockZ(), null); + getHandle().openTileEntity((ITileEntityContainer) getHandle().world.getTileEntity(new BlockPosition(location.getBlockX(), location.getBlockY(), location.getBlockZ()))); if (force) { getHandle().activeContainer.checkReachable = false; } @@ -311,10 +302,10 @@ public class CraftHumanEntity extends CraftLivingEntity implements HumanEntity { // Now open the window InventoryType type = inventory.getType(); - int windowType = CraftContainer.getNotchInventoryType(type); + String windowType = CraftContainer.getNotchInventoryType(type); String title = inventory.getTitle(); int size = inventory.getTopInventory().getSize(); - player.playerConnection.sendPacket(new PacketPlayOutOpenWindow(container.windowId, windowType, title, size, false)); + player.playerConnection.sendPacket(new PacketPlayOutOpenWindow(container.windowId, windowType, new ChatComponentText(title), size)); player.activeContainer = container; player.activeContainer.addSlotListener(player); } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java index add554e9b2..e31fcc1741 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java @@ -197,11 +197,7 @@ public class CraftLivingEntity extends CraftEntity implements LivingEntity { reason = DamageSource.mobAttack(((CraftLivingEntity) source).getHandle()); } - if (entity instanceof EntityEnderDragon) { - ((EntityEnderDragon) entity).dealDamage(reason, (float) amount); - } else { - entity.damageEntity(reason, (float) amount); - } + entity.damageEntity(reason, (float) amount); } public Location getEyeLocation() { @@ -263,7 +259,7 @@ public class CraftLivingEntity extends CraftEntity implements LivingEntity { } removePotionEffect(effect.getType()); } - getHandle().addEffect(new MobEffect(effect.getType().getId(), effect.getDuration(), effect.getAmplifier(), effect.isAmbient())); + getHandle().addEffect(new MobEffect(effect.getType().getId(), effect.getDuration(), effect.getAmplifier(), effect.isAmbient(), true)); return true; } @@ -384,47 +380,6 @@ public class CraftLivingEntity extends CraftEntity implements LivingEntity { return super.teleport(location, cause); } - public void setCustomName(String name) { - if (!(getHandle() instanceof EntityInsentient)) { - return; - } - - if (name == null) { - name = ""; - } - - // Names cannot be more than 64 characters due to DataWatcher limitations - if (name.length() > 64) { - name = name.substring(0, 64); - } - - ((EntityInsentient) getHandle()).setCustomName(name); - } - - public String getCustomName() { - if (!(getHandle() instanceof EntityInsentient)) { - return null; - } - - String name = ((EntityInsentient) getHandle()).getCustomName(); - - if (name == null || name.length() == 0) { - return null; - } - - return name; - } - - public void setCustomNameVisible(boolean flag) { - if (getHandle() instanceof EntityInsentient) { - ((EntityInsentient) getHandle()).setCustomNameVisible(flag); - } - } - - public boolean isCustomNameVisible() { - return getHandle() instanceof EntityInsentient && ((EntityInsentient) getHandle()).getCustomNameVisible(); - } - public boolean isLeashed() { if (!(getHandle() instanceof EntityInsentient)) { return false; diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPainting.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPainting.java index 925a15f0a7..efad618f7f 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPainting.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPainting.java @@ -54,9 +54,7 @@ public class CraftPainting extends CraftHanging implements Painting { private void update() { WorldServer world = ((CraftWorld) getWorld()).getHandle(); EntityPainting painting = new EntityPainting(world); - painting.x = getHandle().x; - painting.y = getHandle().y; - painting.z = getHandle().z; + painting.blockPosition = getHandle().blockPosition; painting.art = getHandle().art; painting.setDirection(getHandle().direction); getHandle().die(); diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java index bbf310b080..286a58c2f4 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java @@ -1,12 +1,14 @@ package org.bukkit.craftbukkit.entity; import com.google.common.collect.ImmutableSet; -import com.google.common.collect.MapMaker; +import com.mojang.authlib.GameProfile; +import io.netty.buffer.Unpooled; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.net.InetSocketAddress; import java.net.SocketAddress; +import java.util.ArrayList; import java.util.Collection; import java.util.HashSet; import java.util.LinkedHashMap; @@ -19,7 +21,6 @@ import java.util.logging.Logger; import net.minecraft.server.*; -import net.minecraft.util.com.mojang.authlib.GameProfile; import org.apache.commons.lang.Validate; import org.apache.commons.lang.NotImplementedException; import org.bukkit.*; @@ -53,6 +54,7 @@ import org.bukkit.event.player.PlayerRegisterChannelEvent; import org.bukkit.event.player.PlayerTeleportEvent; import org.bukkit.event.player.PlayerUnregisterChannelEvent; import org.bukkit.inventory.InventoryView.Property; +import org.bukkit.map.MapCursor; import org.bukkit.map.MapView; import org.bukkit.metadata.MetadataValue; import org.bukkit.plugin.Plugin; @@ -174,44 +176,18 @@ public class CraftPlayer extends CraftHumanEntity implements Player { @Override public String getPlayerListName() { - return getHandle().listName; + return CraftChatMessage.fromComponent(getHandle().listName); } @Override public void setPlayerListName(String name) { - String oldName = getHandle().listName; - if (name == null) { name = getName(); } - - if (oldName.equals(name)) { - return; - } - - if (name.length() > 16) { - throw new IllegalArgumentException("Player list names can only be a maximum of 16 characters long"); - } - - // Collisions will make for invisible people - for (int i = 0; i < server.getHandle().players.size(); ++i) { - if (((EntityPlayer) server.getHandle().players.get(i)).listName.equals(name)) { - throw new IllegalArgumentException(name + " is already assigned as a player list name for someone"); - } - } - - getHandle().listName = name; - - // Change the name on the client side - PacketPlayOutPlayerInfo oldpacket = new PacketPlayOutPlayerInfo(oldName, false, 9999); - PacketPlayOutPlayerInfo packet = new PacketPlayOutPlayerInfo(name, true, getHandle().ping); - for (int i = 0; i < server.getHandle().players.size(); ++i) { - EntityPlayer entityplayer = (EntityPlayer) server.getHandle().players.get(i); - if (entityplayer.playerConnection == null) continue; - - if (entityplayer.getBukkitEntity().canSee(this)) { - entityplayer.playerConnection.sendPacket(oldpacket); - entityplayer.playerConnection.sendPacket(packet); + getHandle().listName = name.equals(getName()) ? null : CraftChatMessage.fromString(name)[0]; + for (EntityPlayer player : (List)server.getHandle().players) { + if (player.getBukkitEntity().canSee(this)) { + player.playerConnection.sendPacket(new PacketPlayOutPlayerInfo(EnumPlayerInfoAction.UPDATE_DISPLAY_NAME, getHandle())); } } } @@ -248,7 +224,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player { if (getHandle().playerConnection == null) return; // Do not directly assign here, from the packethandler we'll assign it. - getHandle().playerConnection.sendPacket(new PacketPlayOutSpawnPosition(loc.getBlockX(), loc.getBlockY(), loc.getBlockZ())); + getHandle().playerConnection.sendPacket(new PacketPlayOutSpawnPosition(new BlockPosition(loc.getBlockX(), loc.getBlockY(), loc.getBlockZ()))); } @Override @@ -343,7 +319,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player { if (getHandle().playerConnection == null) return; int packetData = effect.getId(); - PacketPlayOutWorldEvent packet = new PacketPlayOutWorldEvent(packetData, loc.getBlockX(), loc.getBlockY(), loc.getBlockZ(), data, false); + PacketPlayOutWorldEvent packet = new PacketPlayOutWorldEvent(packetData, new BlockPosition(loc.getBlockX(), loc.getBlockY(), loc.getBlockZ()), data, false); getHandle().playerConnection.sendPacket(packet); } @@ -368,10 +344,9 @@ public class CraftPlayer extends CraftHumanEntity implements Player { public void sendBlockChange(Location loc, int material, byte data) { if (getHandle().playerConnection == null) return; - PacketPlayOutBlockChange packet = new PacketPlayOutBlockChange(loc.getBlockX(), loc.getBlockY(), loc.getBlockZ(), ((CraftWorld) loc.getWorld()).getHandle()); + PacketPlayOutBlockChange packet = new PacketPlayOutBlockChange(((CraftWorld) loc.getWorld()).getHandle(), new BlockPosition(loc.getBlockX(), loc.getBlockY(), loc.getBlockZ())); - packet.block = CraftMagicNumbers.getBlock(material); - packet.data = data; + packet.block = CraftMagicNumbers.getBlock(material).fromLegacyData(data); getHandle().playerConnection.sendPacket(packet); } @@ -390,10 +365,9 @@ public class CraftPlayer extends CraftHumanEntity implements Player { throw new IllegalArgumentException("Must have at least 4 lines"); } - // Limit to 15 chars per line and set null lines to blank - String[] astring = CraftSign.sanitizeLines(lines); + IChatBaseComponent[] components = CraftSign.sanitizeLines(lines); - getHandle().playerConnection.sendPacket(new PacketPlayOutUpdateSign(loc.getBlockX(), loc.getBlockY(), loc.getBlockZ(), astring)); + getHandle().playerConnection.sendPacket(new PacketPlayOutUpdateSign(getHandle().world, new BlockPosition(loc.getBlockX(), loc.getBlockY(), loc.getBlockZ()), components)); } @Override @@ -435,15 +409,15 @@ public class CraftPlayer extends CraftHumanEntity implements Player { if (getHandle().playerConnection == null) return; RenderData data = ((CraftMapView) map).render(this); - for (int x = 0; x < 128; ++x) { - byte[] bytes = new byte[131]; - bytes[1] = (byte) x; - for (int y = 0; y < 128; ++y) { - bytes[y + 3] = data.buffer[y * 128 + x]; + Collection icons = new ArrayList(); + for (MapCursor cursor : data.cursors) { + if (cursor.isVisible()) { + icons.add(new MapIcon(cursor.getRawType(), cursor.getX(), cursor.getY(), cursor.getDirection())); } - PacketPlayOutMap packet = new PacketPlayOutMap(map.getId(), bytes); - getHandle().playerConnection.sendPacket(packet); } + + PacketPlayOutMap packet = new PacketPlayOutMap(map.getId(), map.getScale().getValue(), icons, data.buffer, 0, 0, 0, 0); + getHandle().playerConnection.sendPacket(packet); } @Override @@ -455,7 +429,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player { } if (entity.playerConnection == null || entity.playerConnection.isDisconnected()) { - return false; + return false; } if (entity.passenger != null) { @@ -781,7 +755,8 @@ public class CraftPlayer extends CraftHumanEntity implements Player { if (event.isCancelled()) { return; } - + + getHandle().e((Entity) getHandle()); // RENAME getHandle().playerInteractManager.setGameMode(EnumGamemode.getById(mode.getValue())); getHandle().fallDistance = 0; getHandle().playerConnection.sendPacket(new PacketPlayOutGameStateChange(3, mode.getValue())); @@ -793,90 +768,108 @@ public class CraftPlayer extends CraftHumanEntity implements Player { return GameMode.getByValue(getHandle().playerInteractManager.getGameMode().getId()); } + @Override public void giveExp(int exp) { getHandle().giveExp(exp); } + @Override public void giveExpLevels(int levels) { getHandle().levelDown(levels); } + @Override public float getExp() { return getHandle().exp; } + @Override public void setExp(float exp) { getHandle().exp = exp; getHandle().lastSentExp = -1; } + @Override public int getLevel() { return getHandle().expLevel; } + @Override public void setLevel(int level) { getHandle().expLevel = level; getHandle().lastSentExp = -1; } + @Override public int getTotalExperience() { return getHandle().expTotal; } + @Override public void setTotalExperience(int exp) { getHandle().expTotal = exp; } + @Override public float getExhaustion() { return getHandle().getFoodData().exhaustionLevel; } + @Override public void setExhaustion(float value) { getHandle().getFoodData().exhaustionLevel = value; } + @Override public float getSaturation() { return getHandle().getFoodData().saturationLevel; } + @Override public void setSaturation(float value) { getHandle().getFoodData().saturationLevel = value; } + @Override public int getFoodLevel() { return getHandle().getFoodData().foodLevel; } + @Override public void setFoodLevel(int value) { getHandle().getFoodData().foodLevel = value; } + @Override public Location getBedSpawnLocation() { World world = getServer().getWorld(getHandle().spawnWorld); - ChunkCoordinates bed = getHandle().getBed(); + BlockPosition bed = getHandle().getBed(); if (world != null && bed != null) { bed = EntityHuman.getBed(((CraftWorld) world).getHandle(), bed, getHandle().isRespawnForced()); if (bed != null) { - return new Location(world, bed.x, bed.y, bed.z); + return new Location(world, bed.getX(), bed.getY(), bed.getZ()); } } return null; } + @Override public void setBedSpawnLocation(Location location) { setBedSpawnLocation(location, false); } + @Override public void setBedSpawnLocation(Location location, boolean override) { if (location == null) { getHandle().setRespawnPosition(null, override); } else { - getHandle().setRespawnPosition(new ChunkCoordinates(location.getBlockX(), location.getBlockY(), location.getBlockZ()), override); + getHandle().setRespawnPosition(new BlockPosition(location.getBlockX(), location.getBlockY(), location.getBlockZ()), override); getHandle().spawnWorld = location.getWorld().getName(); } } + @Override public void hidePlayer(Player player) { Validate.notNull(player, "hidden player cannot be null"); if (getHandle().playerConnection == null) return; @@ -893,9 +886,10 @@ public class CraftPlayer extends CraftHumanEntity implements Player { } //remove the hidden player from this player user list - getHandle().playerConnection.sendPacket(new PacketPlayOutPlayerInfo(player.getPlayerListName(), false, 9999)); + getHandle().playerConnection.sendPacket(new PacketPlayOutPlayerInfo(EnumPlayerInfoAction.REMOVE_PLAYER, other)); } + @Override public void showPlayer(Player player) { Validate.notNull(player, "shown player cannot be null"); if (getHandle().playerConnection == null) return; @@ -910,17 +904,19 @@ public class CraftPlayer extends CraftHumanEntity implements Player { entry.updatePlayer(getHandle()); } - getHandle().playerConnection.sendPacket(new PacketPlayOutPlayerInfo(player.getPlayerListName(), true, getHandle().ping)); + getHandle().playerConnection.sendPacket(new PacketPlayOutPlayerInfo(EnumPlayerInfoAction.ADD_PLAYER, other)); } public void removeDisconnectingPlayer(Player player) { hiddenPlayers.remove(player.getUniqueId()); } + @Override public boolean canSee(Player player) { return !hiddenPlayers.contains(player.getUniqueId()); } + @Override public Map serialize() { Map result = new LinkedHashMap(); @@ -929,6 +925,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player { return result; } + @Override public Player getPlayer() { return this; } @@ -955,14 +952,17 @@ public class CraftPlayer extends CraftHumanEntity implements Player { return hash; } + @Override public long getFirstPlayed() { return firstPlayed; } + @Override public long getLastPlayed() { return lastPlayed; } + @Override public boolean hasPlayedBefore() { return hasPlayedBefore; } @@ -1009,36 +1009,43 @@ public class CraftPlayer extends CraftHumanEntity implements Player { data.setString("lastKnownName", handle.getName()); } + @Override public boolean beginConversation(Conversation conversation) { return conversationTracker.beginConversation(conversation); } + @Override public void abandonConversation(Conversation conversation) { conversationTracker.abandonConversation(conversation, new ConversationAbandonedEvent(conversation, new ManuallyAbandonedConversationCanceller())); } + @Override public void abandonConversation(Conversation conversation, ConversationAbandonedEvent details) { conversationTracker.abandonConversation(conversation, details); } + @Override public void acceptConversationInput(String input) { conversationTracker.acceptConversationInput(input); } + @Override public boolean isConversing() { return conversationTracker.isConversing(); } + @Override public void sendPluginMessage(Plugin source, String channel, byte[] message) { StandardMessenger.validatePluginMessage(server.getMessenger(), source, channel, message); if (getHandle().playerConnection == null) return; if (channels.contains(channel)) { - PacketPlayOutCustomPayload packet = new PacketPlayOutCustomPayload(channel, message); + PacketPlayOutCustomPayload packet = new PacketPlayOutCustomPayload(channel, new PacketDataSerializer(Unpooled.wrappedBuffer(message))); getHandle().playerConnection.sendPacket(packet); } } + @Override public void setTexturePack(String url) { setResourcePack(url); } @@ -1047,7 +1054,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player { public void setResourcePack(String url) { Validate.notNull(url, "Resource pack URL cannot be null"); - getHandle().setResourcePack(url); + getHandle().setResourcePack(url, "null"); } public void addChannel(String channel) { @@ -1062,6 +1069,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player { } } + @Override public Set getListeningPluginChannels() { return ImmutableSet.copyOf(channels); } @@ -1082,7 +1090,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player { } } - getHandle().playerConnection.sendPacket(new PacketPlayOutCustomPayload("REGISTER", stream.toByteArray())); + getHandle().playerConnection.sendPacket(new PacketPlayOutCustomPayload("REGISTER", new PacketDataSerializer(Unpooled.wrappedBuffer(stream.toByteArray())))); } } @@ -1126,10 +1134,12 @@ public class CraftPlayer extends CraftHumanEntity implements Player { perm.clearPermissions(); } + @Override public boolean isFlying() { return getHandle().abilities.isFlying; } + @Override public void setFlying(boolean value) { if (!getAllowFlight() && value) { throw new IllegalArgumentException("Cannot make player fly if getAllowFlight() is false"); @@ -1139,10 +1149,12 @@ public class CraftPlayer extends CraftHumanEntity implements Player { getHandle().updateAbilities(); } + @Override public boolean getAllowFlight() { return getHandle().abilities.canFly; } + @Override public void setAllowFlight(boolean value) { if (isFlying() && !value) { getHandle().abilities.isFlying = false; @@ -1161,6 +1173,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player { } } + @Override public void setFlySpeed(float value) { validateSpeed(value); EntityPlayer player = getHandle(); @@ -1169,6 +1182,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player { } + @Override public void setWalkSpeed(float value) { validateSpeed(value); EntityPlayer player = getHandle(); @@ -1176,10 +1190,12 @@ public class CraftPlayer extends CraftHumanEntity implements Player { player.updateAbilities(); } + @Override public float getFlySpeed() { return getHandle().abilities.flySpeed * 2f; } + @Override public float getWalkSpeed() { return getHandle().abilities.walkSpeed * 2f; } @@ -1209,10 +1225,12 @@ public class CraftPlayer extends CraftHumanEntity implements Player { getHandle().triggerHealthUpdate(); } + @Override public CraftScoreboard getScoreboard() { return this.server.getScoreboardManager().getPlayerBoard(this); } + @Override public void setScoreboard(Scoreboard scoreboard) { Validate.notNull(scoreboard, "Scoreboard cannot be null"); PlayerConnection playerConnection = getHandle().playerConnection; @@ -1226,6 +1244,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player { this.server.getScoreboardManager().setPlayerBoard(this, scoreboard); } + @Override public void setHealthScale(double value) { Validate.isTrue((float) value > 0F, "Must be greater than 0"); healthScale = value; @@ -1233,16 +1252,19 @@ public class CraftPlayer extends CraftHumanEntity implements Player { updateScaledHealth(); } + @Override public double getHealthScale() { return healthScale; } + @Override public void setHealthScaled(boolean scale) { if (scaledHealth != (scaledHealth = scale)) { updateScaledHealth(); } } + @Override public boolean isHealthScaled() { return scaledHealth; } @@ -1285,6 +1307,6 @@ public class CraftPlayer extends CraftHumanEntity implements Player { break; } } - collection.add(new AttributeModifiable(getHandle().getAttributeMap(), (new AttributeRanged("generic.maxHealth", scaledHealth ? healthScale : getMaxHealth(), 0.0D, Float.MAX_VALUE)).a("Max Health").a(true))); + collection.add(new AttributeModifiable(getHandle().getAttributeMap(), (new AttributeRanged(null, "generic.maxHealth", scaledHealth ? healthScale : getMaxHealth(), 0.0D, Float.MAX_VALUE)).a("Max Health").a(true))); } } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftRabbit.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftRabbit.java new file mode 100644 index 0000000000..62fc7ef24b --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftRabbit.java @@ -0,0 +1,23 @@ +package org.bukkit.craftbukkit.entity; + +import net.minecraft.server.EntityRabbit; +import org.bukkit.craftbukkit.CraftServer; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.Rabbit; + +public class CraftRabbit extends CraftAnimals implements Rabbit { + + public CraftRabbit(CraftServer server, EntityRabbit entity) { + super(server, entity); + } + + @Override + public String toString() { + return "CraftRabbit"; + } + + @Override + public EntityType getType() { + return EntityType.RABBIT; + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftSheep.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftSheep.java index 81b938a210..f7253554cb 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftSheep.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftSheep.java @@ -2,6 +2,7 @@ package org.bukkit.craftbukkit.entity; import net.minecraft.server.EntitySheep; +import net.minecraft.server.EnumColor; import org.bukkit.DyeColor; import org.bukkit.craftbukkit.CraftServer; import org.bukkit.entity.EntityType; @@ -13,11 +14,11 @@ public class CraftSheep extends CraftAnimals implements Sheep { } public DyeColor getColor() { - return DyeColor.getByWoolData((byte) getHandle().getColor()); + return DyeColor.getByWoolData((byte) getHandle().getColor().getColorIndex()); } public void setColor(DyeColor color) { - getHandle().setColor(color.getWoolData()); + getHandle().setColor(EnumColor.fromColorIndex(color.getWoolData())); } public boolean isSheared() { diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftTameableAnimal.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftTameableAnimal.java index d4bf3a0e1f..ea1d10b3cc 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftTameableAnimal.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftTameableAnimal.java @@ -54,7 +54,7 @@ public class CraftTameableAnimal extends CraftAnimals implements Tameable, Creat public void setOwner(AnimalTamer tamer) { if (tamer != null) { setTamed(true); - getHandle().setPathEntity(null); + getHandle().setGoalTarget(null, null, false); setOwnerUUID(tamer.getUniqueId()); } else { setTamed(false); diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftVillager.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftVillager.java index 398029b90c..6fe21cce71 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftVillager.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftVillager.java @@ -3,10 +3,13 @@ package org.bukkit.craftbukkit.entity; import net.minecraft.server.EntityVillager; import org.apache.commons.lang.Validate; import org.bukkit.craftbukkit.CraftServer; +import org.bukkit.craftbukkit.inventory.CraftInventory; import org.bukkit.entity.EntityType; import org.bukkit.entity.Villager; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.InventoryHolder; -public class CraftVillager extends CraftAgeable implements Villager { +public class CraftVillager extends CraftAgeable implements Villager, InventoryHolder { public CraftVillager(CraftServer server, EntityVillager entity) { super(server, entity); } @@ -33,4 +36,9 @@ public class CraftVillager extends CraftAgeable implements Villager { Validate.notNull(profession); getHandle().setProfession(profession.getId()); } + + @Override + public Inventory getInventory() { + return new CraftInventory(getHandle().inventory); + } } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftWaterMob.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftWaterMob.java index 39e8d89bf4..ee21d7b6e9 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftWaterMob.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftWaterMob.java @@ -3,9 +3,10 @@ package org.bukkit.craftbukkit.entity; import net.minecraft.server.EntityWaterAnimal; import org.bukkit.craftbukkit.CraftServer; +import org.bukkit.entity.LivingEntity; import org.bukkit.entity.WaterMob; -public class CraftWaterMob extends CraftCreature implements WaterMob { +public class CraftWaterMob extends CraftLivingEntity implements WaterMob { public CraftWaterMob(CraftServer server, EntityWaterAnimal entity) { super(server, entity); diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftWolf.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftWolf.java index 3d0e7cb5b5..55ce37c7f6 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftWolf.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftWolf.java @@ -1,6 +1,7 @@ package org.bukkit.craftbukkit.entity; import net.minecraft.server.EntityWolf; +import net.minecraft.server.EnumColor; import org.bukkit.DyeColor; import org.bukkit.craftbukkit.CraftServer; import org.bukkit.entity.EntityType; @@ -30,10 +31,10 @@ public class CraftWolf extends CraftTameableAnimal implements Wolf { } public DyeColor getCollarColor() { - return DyeColor.getByWoolData((byte) getHandle().getCollarColor()); + return DyeColor.getByWoolData((byte) getHandle().getCollarColor().getColorIndex()); } public void setCollarColor(DyeColor color) { - getHandle().setCollarColor(color.getWoolData()); + getHandle().setCollarColor(EnumColor.fromColorIndex(color.getWoolData())); } } diff --git a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java index 9b10c418e1..cc1d37187a 100644 --- a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java +++ b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java @@ -9,30 +9,7 @@ import java.util.Map; import com.google.common.base.Function; import com.google.common.base.Functions; -import net.minecraft.server.ChunkCoordinates; -import net.minecraft.server.Container; -import net.minecraft.server.DamageSource; -import net.minecraft.server.Entity; -import net.minecraft.server.EntityArrow; -import net.minecraft.server.EntityDamageSource; -import net.minecraft.server.EntityDamageSourceIndirect; -import net.minecraft.server.EntityEnderCrystal; -import net.minecraft.server.EntityEnderDragon; -import net.minecraft.server.EntityHuman; -import net.minecraft.server.EntityInsentient; -import net.minecraft.server.EntityItem; -import net.minecraft.server.EntityLiving; -import net.minecraft.server.EntityPlayer; -import net.minecraft.server.EntityPotion; -import net.minecraft.server.Explosion; -import net.minecraft.server.InventoryCrafting; -import net.minecraft.server.ItemStack; -import net.minecraft.server.Items; -import net.minecraft.server.PacketPlayInCloseWindow; -import net.minecraft.server.PacketPlayOutSetSlot; -import net.minecraft.server.Slot; -import net.minecraft.server.World; -import net.minecraft.server.WorldServer; +import net.minecraft.server.*; import org.bukkit.Bukkit; import org.bukkit.Material; @@ -97,9 +74,9 @@ public class CraftEventFactory { if (((CraftServer) Bukkit.getServer()).getHandle().getOPs().isEmpty()) return true; if (player.isOp()) return true; - ChunkCoordinates chunkcoordinates = worldServer.getSpawn(); + BlockPosition chunkcoordinates = worldServer.getSpawn(); - int distanceFromSpawn = Math.max(Math.abs(x - chunkcoordinates.x), Math.abs(z - chunkcoordinates.z)); + int distanceFromSpawn = Math.max(Math.abs(x - chunkcoordinates.getX()), Math.abs(z - chunkcoordinates.getY())); return distanceFromSpawn > spawnSize; } @@ -152,15 +129,15 @@ public class CraftEventFactory { /** * Bucket methods */ - public static PlayerBucketEmptyEvent callPlayerBucketEmptyEvent(EntityHuman who, int clickedX, int clickedY, int clickedZ, int clickedFace, ItemStack itemInHand) { + public static PlayerBucketEmptyEvent callPlayerBucketEmptyEvent(EntityHuman who, int clickedX, int clickedY, int clickedZ, EnumDirection clickedFace, ItemStack itemInHand) { return (PlayerBucketEmptyEvent) getPlayerBucketEvent(false, who, clickedX, clickedY, clickedZ, clickedFace, itemInHand, Items.BUCKET); } - public static PlayerBucketFillEvent callPlayerBucketFillEvent(EntityHuman who, int clickedX, int clickedY, int clickedZ, int clickedFace, ItemStack itemInHand, net.minecraft.server.Item bucket) { + public static PlayerBucketFillEvent callPlayerBucketFillEvent(EntityHuman who, int clickedX, int clickedY, int clickedZ, EnumDirection clickedFace, ItemStack itemInHand, net.minecraft.server.Item bucket) { return (PlayerBucketFillEvent) getPlayerBucketEvent(true, who, clickedX, clickedY, clickedZ, clickedFace, itemInHand, bucket); } - private static PlayerEvent getPlayerBucketEvent(boolean isFilling, EntityHuman who, int clickedX, int clickedY, int clickedZ, int clickedFace, ItemStack itemstack, net.minecraft.server.Item item) { + private static PlayerEvent getPlayerBucketEvent(boolean isFilling, EntityHuman who, int clickedX, int clickedY, int clickedZ, EnumDirection clickedFace, ItemStack itemstack, net.minecraft.server.Item item) { Player player = (who == null) ? null : (Player) who.getBukkitEntity(); CraftItemStack itemInHand = CraftItemStack.asNewCraftStack(item); Material bucket = CraftMagicNumbers.getMaterial(itemstack.getItem()); @@ -192,20 +169,24 @@ public class CraftEventFactory { if (action != Action.LEFT_CLICK_AIR && action != Action.RIGHT_CLICK_AIR) { throw new AssertionError(String.format("%s performing %s with %s", who, action, itemstack)); } - return callPlayerInteractEvent(who, action, 0, 256, 0, 0, itemstack); + return callPlayerInteractEvent(who, action, new BlockPosition(0, 256, 0), EnumDirection.SOUTH, itemstack); } - public static PlayerInteractEvent callPlayerInteractEvent(EntityHuman who, Action action, int clickedX, int clickedY, int clickedZ, int clickedFace, ItemStack itemstack) { + public static PlayerInteractEvent callPlayerInteractEvent(EntityHuman who, Action action, BlockPosition position, EnumDirection direction, ItemStack itemstack) { + return callPlayerInteractEvent(who, action, position, direction, itemstack, false); + } + + public static PlayerInteractEvent callPlayerInteractEvent(EntityHuman who, Action action, BlockPosition position, EnumDirection direction, ItemStack itemstack, boolean cancelledBlock) { Player player = (who == null) ? null : (Player) who.getBukkitEntity(); CraftItemStack itemInHand = CraftItemStack.asCraftMirror(itemstack); CraftWorld craftWorld = (CraftWorld) player.getWorld(); CraftServer craftServer = (CraftServer) player.getServer(); - Block blockClicked = craftWorld.getBlockAt(clickedX, clickedY, clickedZ); - BlockFace blockFace = CraftBlock.notchToBlockFace(clickedFace); + Block blockClicked = craftWorld.getBlockAt(position.getX(), position.getY(), position.getZ()); + BlockFace blockFace = CraftBlock.notchToBlockFace(direction); - if (clickedY > 255) { + if (position.getY() > 255) { blockClicked = null; switch (action) { case LEFT_CLICK_BLOCK: @@ -222,6 +203,9 @@ public class CraftEventFactory { } PlayerInteractEvent event = new PlayerInteractEvent(player, action, itemInHand, blockClicked, blockFace); + if (cancelledBlock) { + event.setUseInteractedBlock(Event.Result.DENY); + } craftServer.getPluginManager().callEvent(event); return event; @@ -415,7 +399,7 @@ public class CraftEventFactory { EntityDamageEvent event; if (damager == null) { event = new EntityDamageByBlockEvent(null, entity.getBukkitEntity(), DamageCause.BLOCK_EXPLOSION, modifiers, modifierFunctions); - } else if (entity instanceof EntityEnderDragon && ((EntityEnderDragon) entity).bC == damager) { + } else if (entity instanceof EntityEnderDragon && ((EntityEnderDragon) entity).bx == damager) { event = new EntityDamageEvent(entity.getBukkitEntity(), DamageCause.ENTITY_EXPLOSION, modifiers, modifierFunctions); } else { if (damager instanceof org.bukkit.entity.TNTPrimed) { @@ -840,7 +824,7 @@ public class CraftEventFactory { ItemStack itemInHand = player.inventory.getItem(itemInHandIndex); // If they've got the same item in their hand, it'll need to be updated. - if (itemInHand != null && itemInHand.getItem() == Items.BOOK_AND_QUILL) { + if (itemInHand != null && itemInHand.getItem() == Items.WRITABLE_BOOK) { if (!editBookEvent.isCancelled()) { CraftItemStack.setItemMeta(itemInHand, editBookEvent.getNewBookMeta()); if (editBookEvent.isSigning()) { @@ -876,6 +860,10 @@ public class CraftEventFactory { event = new PlayerAchievementAwardedEvent(player, CraftStatistic.getBukkitAchievement((net.minecraft.server.Achievement) statistic)); } else { org.bukkit.Statistic stat = CraftStatistic.getBukkitStatistic(statistic); + if (stat == null) { + System.err.println("Unhandled statistic: " + statistic); + return null; + } switch (stat) { case FALL_ONE_CM: case BOAT_ONE_CM: @@ -888,6 +876,9 @@ public class CraftEventFactory { case PLAY_ONE_TICK: case SWIM_ONE_CM: case WALK_ONE_CM: + case SPRINT_ONE_CM: + case CROUCH_ONE_CM: + case TIME_SINCE_DEATH: // Do not process event for these - too spammy return null; default: diff --git a/src/main/java/org/bukkit/craftbukkit/generator/CustomChunkGenerator.java b/src/main/java/org/bukkit/craftbukkit/generator/CustomChunkGenerator.java index 9a46d0c72b..d47755a091 100644 --- a/src/main/java/org/bukkit/craftbukkit/generator/CustomChunkGenerator.java +++ b/src/main/java/org/bukkit/craftbukkit/generator/CustomChunkGenerator.java @@ -3,16 +3,7 @@ package org.bukkit.craftbukkit.generator; import java.util.List; import java.util.Random; -import net.minecraft.server.BiomeBase; -import net.minecraft.server.Chunk; -import net.minecraft.server.ChunkPosition; -import net.minecraft.server.ChunkSection; -import net.minecraft.server.EnumCreatureType; -import net.minecraft.server.IChunkProvider; -import net.minecraft.server.IProgressUpdate; -import net.minecraft.server.World; -import net.minecraft.server.WorldGenStronghold; -import net.minecraft.server.WorldServer; +import net.minecraft.server.*; import org.bukkit.block.Biome; import org.bukkit.generator.BlockPopulator; @@ -71,27 +62,14 @@ public class CustomChunkGenerator extends InternalChunkGenerator { if (xbtypes[sec] == null) { continue; } - byte[] secBlkID = new byte[4096]; // Allocate blk ID bytes - byte[] secExtBlkID = null; // Delay getting extended ID nibbles + char[] secBlkID = new char[4096]; // Allocate blk ID bytes short[] bdata = xbtypes[sec]; // Loop through data, 2 blocks at a time - for (int i = 0, j = 0; i < bdata.length; i += 2, j++) { - short b1 = bdata[i]; - short b2 = bdata[i + 1]; - byte extb = (byte) ((b1 >> 8) | ((b2 >> 4) & 0xF0)); - - secBlkID[i] = (byte) b1; - secBlkID[(i + 1)] = (byte) b2; - - if (extb != 0) { // If extended block ID data - if (secExtBlkID == null) { // Allocate if needed - secExtBlkID = new byte[2048]; - } - secExtBlkID[j] = extb; - } + for (int i = 0; i < bdata.length; i++) { + secBlkID[i] = (char) ((int)bdata[i] << 4); } // Build chunk section - csect[sec] = new ChunkSection(sec << 4, true, secBlkID, secExtBlkID); + csect[sec] = new ChunkSection(sec << 4, true, secBlkID); } } else { // Else check for byte-per-block section data @@ -107,7 +85,12 @@ public class CustomChunkGenerator extends InternalChunkGenerator { if (btypes[sec] == null) { continue; } - csect[sec] = new ChunkSection(sec << 4, true, btypes[sec], null); + + char[] secBlkID = new char[4096]; // Allocate block ID bytes + for (int i = 0; i < secBlkID.length; i++) { + secBlkID[i] = (char)(((int) btypes[sec][i]) << 4); + } + csect[sec] = new ChunkSection(sec << 4, true, secBlkID); } } else { // Else, fall back to pre 1.2 method @@ -124,7 +107,7 @@ public class CustomChunkGenerator extends InternalChunkGenerator { // Loop through sections for (int sec = 0; sec < scnt; sec++) { ChunkSection cs = null; // Add sections when needed - byte[] csbytes = null; + char[] csbytes = null; for (int cy = 0; cy < 16; cy++) { int cyoff = cy | (sec << 4); @@ -140,7 +123,7 @@ public class CustomChunkGenerator extends InternalChunkGenerator { cs = csect[sec] = new ChunkSection(sec << 4, true); csbytes = cs.getIdArray(); } - csbytes[(cy << 8) | (cz << 4) | cx] = blk; + csbytes[(cy << 8) | (cz << 4) | cx] = (char)((int)blk << 4); } } } @@ -153,7 +136,7 @@ public class CustomChunkGenerator extends InternalChunkGenerator { } } // Set biome grid - byte[] biomeIndex = chunk.m(); + byte[] biomeIndex = chunk.getBiomeIndex(); for (int i = 0; i < biomeIndex.length; i++) { biomeIndex[i] = (byte) (biomegrid.biome[i].id & 0xFF); } @@ -163,10 +146,20 @@ public class CustomChunkGenerator extends InternalChunkGenerator { return chunk; } + @Override + public Chunk getChunkAt(BlockPosition blockPosition) { + return getChunkAt(blockPosition.getX() >> 4, blockPosition.getZ() >> 4); + } + public void getChunkAt(IChunkProvider icp, int i, int i1) { // Nothing! } + @Override + public boolean a(IChunkProvider iChunkProvider, Chunk chunk, int i, int i1) { + return false; + } + public boolean saveChunks(boolean bln, IProgressUpdate ipu) { return true; } @@ -206,14 +199,16 @@ public class CustomChunkGenerator extends InternalChunkGenerator { return generator.getDefaultPopulators(world); } - public List getMobsFor(EnumCreatureType type, int x, int y, int z) { - BiomeBase biomebase = world.getBiome(x, z); + @Override + public List getMobsFor(EnumCreatureType type, BlockPosition position) { + BiomeBase biomebase = world.getBiome(position); return biomebase == null ? null : biomebase.getMobs(type); } - public ChunkPosition findNearestMapFeature(World world, String type, int x, int y, int z) { - return "Stronghold".equals(type) && this.strongholdGen != null ? this.strongholdGen.getNearestGeneratedFeature(world, x, y, z) : null; + @Override + public BlockPosition findNearestMapFeature(World world, String type, BlockPosition position) { + return "Stronghold".equals(type) && this.strongholdGen != null ? this.strongholdGen.getNearestGeneratedFeature(world, position) : null; } public void recreateStructures(int i, int j) {} @@ -222,6 +217,11 @@ public class CustomChunkGenerator extends InternalChunkGenerator { return 0; } + @Override + public void recreateStructures(Chunk chunk, int i, int i1) { + + } + public String getName() { return "CustomChunkGenerator"; } diff --git a/src/main/java/org/bukkit/craftbukkit/generator/NormalChunkGenerator.java b/src/main/java/org/bukkit/craftbukkit/generator/NormalChunkGenerator.java index ceab581644..4230bdb2a4 100644 --- a/src/main/java/org/bukkit/craftbukkit/generator/NormalChunkGenerator.java +++ b/src/main/java/org/bukkit/craftbukkit/generator/NormalChunkGenerator.java @@ -4,12 +4,7 @@ import java.util.ArrayList; import java.util.List; import java.util.Random; -import net.minecraft.server.Chunk; -import net.minecraft.server.ChunkPosition; -import net.minecraft.server.EnumCreatureType; -import net.minecraft.server.IChunkProvider; -import net.minecraft.server.IProgressUpdate; -import net.minecraft.server.World; +import net.minecraft.server.*; import org.bukkit.craftbukkit.CraftWorld; import org.bukkit.generator.BlockPopulator; @@ -21,66 +16,87 @@ public class NormalChunkGenerator extends InternalChunkGenerator { provider = world.worldProvider.getChunkProvider(); } + @Override public byte[] generate(org.bukkit.World world, Random random, int x, int z) { throw new UnsupportedOperationException("Not supported."); } + @Override public boolean canSpawn(org.bukkit.World world, int x, int z) { return ((CraftWorld) world).getHandle().worldProvider.canSpawn(x, z); } + @Override public List getDefaultPopulators(org.bukkit.World world) { return new ArrayList(); } + @Override public boolean isChunkLoaded(int i, int i1) { return provider.isChunkLoaded(i, i1); } + @Override public Chunk getOrCreateChunk(int i, int i1) { return provider.getOrCreateChunk(i, i1); } - public Chunk getChunkAt(int i, int i1) { - return provider.getChunkAt(i, i1); + @Override + public Chunk getChunkAt(BlockPosition blockPosition) { + return provider.getChunkAt(blockPosition); } + @Override public void getChunkAt(IChunkProvider icp, int i, int i1) { provider.getChunkAt(icp, i, i1); } + @Override + public boolean a(IChunkProvider iChunkProvider, Chunk chunk, int i, int i1) { + return provider.a(provider, chunk, i, i1); + } + + @Override public boolean saveChunks(boolean bln, IProgressUpdate ipu) { return provider.saveChunks(bln, ipu); } + @Override public boolean unloadChunks() { return provider.unloadChunks(); } + @Override public boolean canSave() { return provider.canSave(); } - public List getMobsFor(EnumCreatureType ect, int i, int i1, int i2) { - return provider.getMobsFor(ect, i, i1, i2); + @Override + public List getMobsFor(EnumCreatureType ect, BlockPosition position) { + return provider.getMobsFor(ect, position); } - public ChunkPosition findNearestMapFeature(World world, String string, int i, int i1, int i2) { - return provider.findNearestMapFeature(world, string, i, i1, i2); - } - - public void recreateStructures(int i, int j) { - provider.recreateStructures(i, j); + @Override + public BlockPosition findNearestMapFeature(World world, String string, BlockPosition position) { + return provider.findNearestMapFeature(world, string, position); } // n.m.s implementations always return 0. (The true implementation is in ChunkProviderServer) + @Override public int getLoadedChunks() { return 0; } + @Override + public void recreateStructures(Chunk chunk, int i, int i1) { + provider.recreateStructures(chunk, i, i1); + } + + @Override public String getName() { return "NormalWorldGenerator"; } + @Override public void c() {} } diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftContainer.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftContainer.java index 42568a2435..1dbc588e72 100644 --- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftContainer.java +++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftContainer.java @@ -1,5 +1,6 @@ package org.bukkit.craftbukkit.inventory; +import net.minecraft.server.ChatComponentText; import org.bukkit.craftbukkit.entity.CraftPlayer; import org.bukkit.entity.HumanEntity; import org.bukkit.event.inventory.InventoryType; @@ -76,7 +77,7 @@ public class CraftContainer extends Container { cachedTitle = view.getTitle(); if (view.getPlayer() instanceof CraftPlayer) { CraftPlayer player = (CraftPlayer) view.getPlayer(); - int type = getNotchInventoryType(cachedType); + String type = getNotchInventoryType(cachedType); IInventory top = ((CraftInventory)view.getTopInventory()).getInventory(); IInventory bottom = ((CraftInventory)view.getBottomInventory()).getInventory(); this.b.clear(); @@ -85,44 +86,33 @@ public class CraftContainer extends Container { setupSlots(top, bottom); } int size = getSize(); - player.getHandle().playerConnection.sendPacket(new PacketPlayOutOpenWindow(this.windowId, type, cachedTitle, size, true)); + player.getHandle().playerConnection.sendPacket(new PacketPlayOutOpenWindow(this.windowId, type, new ChatComponentText(cachedTitle), size)); player.updateInventory(); } return true; } - public static int getNotchInventoryType(InventoryType type) { - int typeID; + public static String getNotchInventoryType(InventoryType type) { switch(type) { case WORKBENCH: - typeID = 1; - break; + return "minecraft:crafting_table"; case FURNACE: - typeID = 2; - break; + return "minecraft:furnace"; case DISPENSER: - typeID = 3; - break; + return "minecraft:dispenser"; case ENCHANTING: - typeID = 4; - break; + return "minecraft:enchanting_table"; case BREWING: - typeID = 5; - break; + return "minecraft:brewing_stand"; case BEACON: - typeID = 7; - break; + return "minecraft:beacon"; case ANVIL: - typeID = 8; - break; + return "minecraft:anvil"; case HOPPER: - typeID = 9; - break; + return "minecraft:hopper"; default: - typeID = 0; - break; + return "minecraft:chest"; } - return typeID; } private void setupSlots(IInventory top, IInventory bottom) { diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventory.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventory.java index 6748465da6..7ae6f12c54 100644 --- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventory.java +++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventory.java @@ -42,7 +42,7 @@ public class CraftInventory implements Inventory { } public String getName() { - return getInventory().getInventoryName(); + return getInventory().getName(); } public ItemStack getItem(int index) { @@ -58,7 +58,6 @@ public class CraftInventory implements Inventory { for (int i = 0; i < size; i++) { items[i] = mcItems[i] == null ? null : CraftItemStack.asCraftMirror(mcItems[i]); } - return items; } @@ -421,7 +420,7 @@ public class CraftInventory implements Inventory { } public String getTitle() { - return inventory.getInventoryName(); + return inventory.getName(); } public InventoryType getType() { @@ -437,7 +436,7 @@ public class CraftInventory implements Inventory { } else if (inventory instanceof TileEntityFurnace) { return InventoryType.FURNACE; } else if (inventory instanceof ContainerEnchantTableInventory) { - return InventoryType.ENCHANTING; + return InventoryType.ENCHANTING; } else if (inventory instanceof TileEntityBrewingStand) { return InventoryType.BREWING; } else if (inventory instanceof CraftInventoryCustom.MinecraftInventory) { @@ -449,7 +448,7 @@ public class CraftInventory implements Inventory { } else if (inventory instanceof TileEntityBeacon) { return InventoryType.BEACON; } else if (inventory instanceof ContainerAnvilInventory) { - return InventoryType.ANVIL; + return InventoryType.ANVIL; } else if (inventory instanceof IHopper) { return InventoryType.HOPPER; } else { diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventoryCrafting.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventoryCrafting.java index 7bbf1df5c7..e155329ef5 100644 --- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventoryCrafting.java +++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventoryCrafting.java @@ -55,7 +55,7 @@ public class CraftInventoryCrafting extends CraftInventory implements CraftingIn for (int j = 0; j < mcItems.length; j++) { items[i + j] = CraftItemStack.asCraftMirror(mcItems[j]); } - + return items; } diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventoryCustom.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventoryCustom.java index 8b8a317cea..947c4939d1 100644 --- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventoryCustom.java +++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventoryCustom.java @@ -2,7 +2,9 @@ package org.bukkit.craftbukkit.inventory; import java.util.ArrayList; import java.util.List; +import net.minecraft.server.ChatComponentText; +import net.minecraft.server.IChatBaseComponent; import org.apache.commons.lang.Validate; import org.bukkit.craftbukkit.entity.CraftHumanEntity; import org.bukkit.entity.HumanEntity; @@ -106,10 +108,6 @@ public class CraftInventoryCustom extends CraftInventory { } } - public String getInventoryName() { - return title; - } - public int getMaxStackSize() { return maxStack; } @@ -143,21 +141,58 @@ public class CraftInventoryCustom extends CraftInventory { public InventoryType getType() { return type; } - - public void closeContainer() {} - + public InventoryHolder getOwner() { return owner; } - public void startOpen() {} - - public boolean k_() { - return false; - } - public boolean b(int i, ItemStack itemstack) { return true; } + + @Override + public void startOpen(EntityHuman entityHuman) { + + } + + @Override + public void closeContainer(EntityHuman entityHuman) { + + } + + @Override + public int getProperty(int i) { + return 0; + } + + @Override + public void b(int i, int i1) { + + } + + @Override + public int g() { + return 0; + } + + @Override + public void l() { + + } + + @Override + public String getName() { + return title; + } + + @Override + public boolean hasCustomName() { + return title != null; + } + + @Override + public IChatBaseComponent getScoreboardDisplayName() { + return new ChatComponentText(title); + } } } diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventoryDoubleChest.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventoryDoubleChest.java index 0459f41ffa..87252cad4f 100644 --- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventoryDoubleChest.java +++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventoryDoubleChest.java @@ -1,5 +1,7 @@ package org.bukkit.craftbukkit.inventory; +import net.minecraft.server.ITileEntityContainer; +import net.minecraft.server.ITileInventory; import org.bukkit.block.DoubleChest; import org.bukkit.inventory.DoubleChestInventory; import org.bukkit.inventory.Inventory; @@ -12,7 +14,7 @@ public class CraftInventoryDoubleChest extends CraftInventory implements DoubleC private final CraftInventory right; public CraftInventoryDoubleChest(CraftInventory left, CraftInventory right) { - super(new InventoryLargeChest("Large chest", left.getInventory(), right.getInventory())); + super(new InventoryLargeChest("Large chest", (ITileInventory) left.getInventory(), (ITileInventory) right.getInventory())); this.left = left; this.right = right; } diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventoryEnchanting.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventoryEnchanting.java index fdc58f1600..068881d2de 100644 --- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventoryEnchanting.java +++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventoryEnchanting.java @@ -10,10 +10,12 @@ public class CraftInventoryEnchanting extends CraftInventory implements Enchanti super(inventory); } + @Override public void setItem(ItemStack item) { setItem(0,item); } + @Override public ItemStack getItem() { return getItem(0); } @@ -22,4 +24,14 @@ public class CraftInventoryEnchanting extends CraftInventory implements Enchanti public ContainerEnchantTableInventory getInventory() { return (ContainerEnchantTableInventory)inventory; } + + @Override + public void setSecondary(ItemStack item) { + setItem(1, item); + } + + @Override + public ItemStack getSecondary() { + return getItem(1); + } } diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftItemFactory.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftItemFactory.java index 1b2394def0..8dd889de61 100644 --- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftItemFactory.java +++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftItemFactory.java @@ -81,6 +81,8 @@ public final class CraftItemFactory implements ItemFactory { return meta instanceof CraftMetaCharge ? meta : new CraftMetaCharge(meta); case ENCHANTED_BOOK: return meta instanceof CraftMetaEnchantedBook ? meta : new CraftMetaEnchantedBook(meta); + case BANNER: + return meta instanceof CraftMetaBanner ? meta : new CraftMetaBanner(meta); default: return new CraftMetaItem(meta); } diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftItemStack.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftItemStack.java index 704be690c8..b49c2dca22 100644 --- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftItemStack.java +++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftItemStack.java @@ -185,7 +185,7 @@ public final class CraftItemStack extends ItemStack { NBTTagList list = getEnchantmentList(handle); if (list == null) { list = new NBTTagList(); - handle.tag.set(ENCHANTMENTS.NBT, list); + handle.getTag().set(ENCHANTMENTS.NBT, list); } int size = list.size(); @@ -208,7 +208,7 @@ public final class CraftItemStack extends ItemStack { return false; } - if (item.tag == null) { + if (item.getTag() == null) { item.setTag(new NBTTagCompound()); } @@ -255,9 +255,9 @@ public final class CraftItemStack extends ItemStack { return 0; } if (size == 1) { - handle.tag.remove(ENCHANTMENTS.NBT); - if (handle.tag.isEmpty()) { - handle.tag = null; + handle.getTag().remove(ENCHANTMENTS.NBT); + if (handle.getTag().isEmpty()) { + handle.setTag(null); } return level; } @@ -269,7 +269,7 @@ public final class CraftItemStack extends ItemStack { listCopy.add(list.get(i)); } } - handle.tag.set(ENCHANTMENTS.NBT, listCopy); + handle.getTag().set(ENCHANTMENTS.NBT, listCopy); return level; } @@ -323,26 +323,28 @@ public final class CraftItemStack extends ItemStack { switch (getType(item)) { case WRITTEN_BOOK: case BOOK_AND_QUILL: - return new CraftMetaBook(item.tag); + return new CraftMetaBook(item.getTag()); case SKULL_ITEM: - return new CraftMetaSkull(item.tag); + return new CraftMetaSkull(item.getTag()); case LEATHER_HELMET: case LEATHER_CHESTPLATE: case LEATHER_LEGGINGS: case LEATHER_BOOTS: - return new CraftMetaLeatherArmor(item.tag); + return new CraftMetaLeatherArmor(item.getTag()); case POTION: - return new CraftMetaPotion(item.tag); + return new CraftMetaPotion(item.getTag()); case MAP: - return new CraftMetaMap(item.tag); + return new CraftMetaMap(item.getTag()); case FIREWORK: - return new CraftMetaFirework(item.tag); + return new CraftMetaFirework(item.getTag()); case FIREWORK_CHARGE: - return new CraftMetaCharge(item.tag); + return new CraftMetaCharge(item.getTag()); case ENCHANTED_BOOK: - return new CraftMetaEnchantedBook(item.tag); + return new CraftMetaEnchantedBook(item.getTag()); + case BANNER: + return new CraftMetaBanner(item.getTag()); default: - return new CraftMetaItem(item.tag); + return new CraftMetaItem(item.getTag()); } } @@ -361,7 +363,7 @@ public final class CraftItemStack extends ItemStack { return false; } if (CraftItemFactory.instance().equals(itemMeta, null)) { - item.tag = null; + item.setTag(null); return true; } if (!CraftItemFactory.instance().isApplicable(itemMeta, getType(item))) { @@ -397,7 +399,7 @@ public final class CraftItemStack extends ItemStack { if (!(that.getTypeId() == getTypeId() && getDurability() == that.getDurability())) { return false; } - return hasItemMeta() ? that.hasItemMeta() && handle.tag.equals(that.handle.tag) : !that.hasItemMeta(); + return hasItemMeta() ? that.hasItemMeta() && handle.getTag().equals(that.handle.getTag()) : !that.hasItemMeta(); } @Override @@ -406,6 +408,6 @@ public final class CraftItemStack extends ItemStack { } static boolean hasItemMeta(net.minecraft.server.ItemStack item) { - return !(item == null || item.tag == null || item.tag.isEmpty()); + return !(item == null || item.getTag() == null || item.getTag().isEmpty()); } } diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaBanner.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaBanner.java new file mode 100644 index 0000000000..d61615bfad --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaBanner.java @@ -0,0 +1,196 @@ +package org.bukkit.craftbukkit.inventory; + +import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableMap; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import net.minecraft.server.NBTTagCompound; +import net.minecraft.server.NBTTagList; +import org.bukkit.DyeColor; +import org.bukkit.Material; +import org.bukkit.block.banner.Pattern; +import org.bukkit.block.banner.PatternType; +import org.bukkit.configuration.serialization.DelegateDeserialization; +import org.bukkit.inventory.meta.BannerMeta; + +@DelegateDeserialization(CraftMetaItem.SerializableMeta.class) +public class CraftMetaBanner extends CraftMetaItem implements BannerMeta { + + static final ItemMetaKey BASE = new ItemMetaKey("Base", "base-color"); + static final ItemMetaKey PATTERNS = new ItemMetaKey("Patterns", "patterns"); + static final ItemMetaKey COLOR = new ItemMetaKey("Color", "color"); + static final ItemMetaKey PATTERN = new ItemMetaKey("Pattern", "pattern"); + + private DyeColor base; + private List patterns = new ArrayList(); + + CraftMetaBanner(CraftMetaItem meta) { + super(meta); + + if (!(meta instanceof CraftMetaBanner)) { + return; + } + + CraftMetaBanner banner = (CraftMetaBanner) meta; + base = banner.base; + patterns = new ArrayList(banner.patterns); + } + + CraftMetaBanner(NBTTagCompound tag) { + super(tag); + + if (!tag.hasKey("BlockEntityTag")) { + return; + } + + NBTTagCompound entityTag = tag.getCompound("BlockEntityTag"); + + base = entityTag.hasKey(BASE.NBT) ? DyeColor.getByDyeData((byte) entityTag.getInt(BASE.NBT)) : null; + + if (entityTag.hasKey(PATTERNS.NBT)) { + NBTTagList patterns = entityTag.getList(PATTERNS.NBT, 10); + for (int i = 0; i < patterns.size(); i++) { + NBTTagCompound p = (NBTTagCompound) patterns.get(i); + this.patterns.add(new Pattern(DyeColor.getByDyeData((byte) p.getInt(COLOR.NBT)), PatternType.getByIdentifier(p.getString(PATTERN.NBT)))); + } + } + } + + CraftMetaBanner(Map map) { + super(map); + + base = SerializableMeta.getObject(DyeColor.class, map, BASE.BUKKIT, true); + + Iterable rawPatternList = SerializableMeta.getObject(Iterable.class, map, PATTERNS.BUKKIT, true); + if (rawPatternList == null) { + return; + } + + for (Object obj : rawPatternList) { + if (!(obj instanceof Pattern)) { + throw new IllegalArgumentException("Object in pattern list is not valid. " + obj.getClass()); + } + addPattern((Pattern) obj); + } + } + @Override + void applyToItem(NBTTagCompound tag) { + super.applyToItem(tag); + + NBTTagCompound entityTag = new NBTTagCompound(); + if (base != null) { + entityTag.setInt(BASE.NBT, base.getDyeData()); + } + + NBTTagList newPatterns = new NBTTagList(); + + for (Pattern p : patterns) { + NBTTagCompound compound = new NBTTagCompound(); + compound.setInt(COLOR.NBT, p.getColor().getDyeData()); + compound.setString(PATTERN.NBT, p.getPattern().getIdentifier()); + newPatterns.add(compound); + } + entityTag.set(PATTERNS.NBT, newPatterns); + + tag.set("BlockEntityTag", entityTag); + } + + @Override + public DyeColor getBaseColor() { + return base; + } + + @Override + public void setBaseColor(DyeColor color) { + base = color; + } + + @Override + public List getPatterns() { + return new ArrayList(patterns); + } + + @Override + public void setPatterns(List patterns) { + this.patterns = new ArrayList(patterns); + } + + @Override + public void addPattern(Pattern pattern) { + patterns.add(pattern); + } + + @Override + public Pattern getPattern(int i) { + return patterns.get(i); + } + + @Override + public Pattern removePattern(int i) { + return patterns.remove(i); + } + + @Override + public void setPattern(int i, Pattern pattern) { + patterns.set(i, pattern); + } + + @Override + public int numberOfPatterns() { + return patterns.size(); + } + + @Override + ImmutableMap.Builder serialize(ImmutableMap.Builder builder) { + super.serialize(builder); + + builder.put(BASE.BUKKIT, base); + builder.put(PATTERNS.BUKKIT, ImmutableList.copyOf(patterns)); + + return builder; + } + + @Override + int applyHash() { + final int original; + int hash = original = super.applyHash(); + if (base != null) { + hash = 31 * hash + base.hashCode(); + } + if (!patterns.isEmpty()) { + hash = 31 * hash + patterns.hashCode(); + } + return original != hash ? CraftMetaBanner.class.hashCode() ^ hash : hash; + } + + @Override + public boolean equalsCommon(CraftMetaItem meta) { + if (!super.equalsCommon(meta)) { + return false; + } + if (meta instanceof CraftMetaBanner) { + CraftMetaBanner that = (CraftMetaBanner) meta; + + return base == that.base && patterns.equals(that.patterns); + } + return true; + } + + @Override + boolean notUncommon(CraftMetaItem meta) { + return super.notUncommon(meta) && (meta instanceof CraftMetaBanner || (patterns.isEmpty() && base == null)); + } + + + @Override + boolean isEmpty() { + return super.isEmpty() && patterns.isEmpty() && base == null; + } + + + @Override + boolean applicableTo(Material type) { + return type == Material.BANNER; + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaBook.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaBook.java index 1cf8fce416..9a24d2e7dd 100644 --- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaBook.java +++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaBook.java @@ -16,18 +16,25 @@ import org.bukkit.inventory.meta.BookMeta; import com.google.common.base.Strings; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap.Builder; +import net.minecraft.server.ChatSerializer; +import net.minecraft.server.NBTTagString; +import org.bukkit.craftbukkit.util.CraftChatMessage; @DelegateDeserialization(SerializableMeta.class) class CraftMetaBook extends CraftMetaItem implements BookMeta { static final ItemMetaKey BOOK_TITLE = new ItemMetaKey("title"); static final ItemMetaKey BOOK_AUTHOR = new ItemMetaKey("author"); static final ItemMetaKey BOOK_PAGES = new ItemMetaKey("pages"); + static final ItemMetaKey RESOLVED = new ItemMetaKey("resolved"); + static final ItemMetaKey GENERATION = new ItemMetaKey("generation"); static final int MAX_PAGE_LENGTH = 256; static final int MAX_TITLE_LENGTH = 0xffff; private String title; private String author; private List pages = new ArrayList(); + private Boolean resolved; + private Integer generation; CraftMetaBook(CraftMetaItem meta) { super(meta); @@ -39,6 +46,8 @@ class CraftMetaBook extends CraftMetaItem implements BookMeta { this.title = bookMeta.title; this.author = bookMeta.author; pages.addAll(bookMeta.pages); + this.resolved = bookMeta.resolved; + this.generation = bookMeta.generation; } CraftMetaBook(NBTTagCompound tag) { @@ -51,6 +60,14 @@ class CraftMetaBook extends CraftMetaItem implements BookMeta { if (tag.hasKey(BOOK_AUTHOR.NBT)) { this.author = tag.getString(BOOK_AUTHOR.NBT); } + + if (tag.hasKey(RESOLVED.NBT)) { + resolved = tag.getBoolean(RESOLVED.NBT); + } + + if (tag.hasKey(GENERATION.NBT)) { + generation = tag.getInt(GENERATION.NBT); + } if (tag.hasKey(BOOK_PAGES.NBT)) { NBTTagList pages = tag.getList(BOOK_PAGES.NBT, 8); @@ -58,6 +75,9 @@ class CraftMetaBook extends CraftMetaItem implements BookMeta { for (int i = 0; i < pages.size(); i++) { String page = pages.getString(i); + if (resolved != null && resolved) { + page = CraftChatMessage.fromComponent(ChatSerializer.a(page)); + } pageArray[i] = page; } @@ -74,6 +94,9 @@ class CraftMetaBook extends CraftMetaItem implements BookMeta { Iterable pages = SerializableMeta.getObject(Iterable.class, map, BOOK_PAGES.BUKKIT, true); CraftMetaItem.safelyAdd(pages, this.pages, MAX_PAGE_LENGTH); + + resolved = SerializableMeta.getObject(Boolean.class, map, RESOLVED.BUKKIT, true); + generation = SerializableMeta.getObject(Integer.class, map, GENERATION.BUKKIT, true); } @Override @@ -89,7 +112,25 @@ class CraftMetaBook extends CraftMetaItem implements BookMeta { } if (hasPages()) { - itemData.set(BOOK_PAGES.NBT, createStringList(pages)); + NBTTagList list = new NBTTagList(); + for (String page : pages) { + if (resolved != null && resolved) { + list.add(new NBTTagString( + ChatSerializer.a(CraftChatMessage.fromString(page, true)[0]) + )); + } else { + list.add(new NBTTagString(page)); + } + } + itemData.set(BOOK_PAGES.NBT, list); + } + + if (resolved != null) { + itemData.setBoolean(RESOLVED.NBT, resolved); + } + + if (generation != null) { + itemData.setInt(GENERATION.NBT, generation); } } @@ -255,6 +296,14 @@ class CraftMetaBook extends CraftMetaItem implements BookMeta { if (hasPages()) { builder.put(BOOK_PAGES.BUKKIT, pages); } + + if (resolved != null) { + builder.put(RESOLVED.BUKKIT, resolved); + } + + if (generation != null) { + builder.put(GENERATION.BUKKIT, generation); + } return builder; } diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaCharge.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaCharge.java index bff3be9dc7..6c6fde739d 100644 --- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaCharge.java +++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaCharge.java @@ -31,7 +31,7 @@ class CraftMetaCharge extends CraftMetaItem implements FireworkEffectMeta { setEffect(SerializableMeta.getObject(FireworkEffect.class, map, EXPLOSION.BUKKIT, true)); } - + CraftMetaCharge(NBTTagCompound tag) { super(tag); @@ -40,14 +40,17 @@ class CraftMetaCharge extends CraftMetaItem implements FireworkEffectMeta { } } + @Override public void setEffect(FireworkEffect effect) { this.effect = effect; } + @Override public boolean hasEffect() { return effect != null; } + @Override public FireworkEffect getEffect() { return effect; } diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaSkull.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaSkull.java index d648d052b6..1d30e5e1bb 100644 --- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaSkull.java +++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaSkull.java @@ -3,9 +3,7 @@ package org.bukkit.craftbukkit.inventory; import java.util.Map; import net.minecraft.server.GameProfileSerializer; -import net.minecraft.server.MinecraftServer; import net.minecraft.server.NBTTagCompound; -import net.minecraft.util.com.mojang.authlib.GameProfile; import org.bukkit.Material; import org.bukkit.configuration.serialization.DelegateDeserialization; @@ -13,6 +11,7 @@ import org.bukkit.craftbukkit.inventory.CraftMetaItem.SerializableMeta; import org.bukkit.inventory.meta.SkullMeta; import com.google.common.collect.ImmutableMap.Builder; +import com.mojang.authlib.GameProfile; @DelegateDeserialization(SerializableMeta.class) class CraftMetaSkull extends CraftMetaItem implements SkullMeta { diff --git a/src/main/java/org/bukkit/craftbukkit/map/CraftMapCanvas.java b/src/main/java/org/bukkit/craftbukkit/map/CraftMapCanvas.java index b5e9e31095..1c3e198113 100644 --- a/src/main/java/org/bukkit/craftbukkit/map/CraftMapCanvas.java +++ b/src/main/java/org/bukkit/craftbukkit/map/CraftMapCanvas.java @@ -37,7 +37,7 @@ public class CraftMapCanvas implements MapCanvas { return; if (buffer[y * 128 + x] != color) { buffer[y * 128 + x] = color; - mapView.worldMap.flagDirty(x, y, y); + mapView.worldMap.flagDirty(x, y); } } diff --git a/src/main/java/org/bukkit/craftbukkit/map/CraftMapRenderer.java b/src/main/java/org/bukkit/craftbukkit/map/CraftMapRenderer.java index 392dba4a50..d56a291cdb 100644 --- a/src/main/java/org/bukkit/craftbukkit/map/CraftMapRenderer.java +++ b/src/main/java/org/bukkit/craftbukkit/map/CraftMapRenderer.java @@ -1,7 +1,7 @@ package org.bukkit.craftbukkit.map; import net.minecraft.server.WorldMap; -import net.minecraft.server.WorldMapDecoration; +import net.minecraft.server.MapIcon; import org.bukkit.Bukkit; import org.bukkit.entity.Player; @@ -41,8 +41,9 @@ public class CraftMapRenderer extends MapRenderer { continue; } - WorldMapDecoration decoration = (WorldMapDecoration) worldMap.decorations.get(key); - cursors.addCursor(decoration.locX, decoration.locY, (byte) (decoration.rotation & 15), decoration.type); + + MapIcon decoration = (MapIcon) worldMap.decorations.get(key); + cursors.addCursor(decoration.getX(), decoration.getY(), (byte) (decoration.getRotation() & 15), decoration.getType()); } } diff --git a/src/main/java/org/bukkit/craftbukkit/projectiles/CraftBlockProjectileSource.java b/src/main/java/org/bukkit/craftbukkit/projectiles/CraftBlockProjectileSource.java index 0959a09e2e..b8bf7541f6 100644 --- a/src/main/java/org/bukkit/craftbukkit/projectiles/CraftBlockProjectileSource.java +++ b/src/main/java/org/bukkit/craftbukkit/projectiles/CraftBlockProjectileSource.java @@ -32,7 +32,7 @@ import net.minecraft.server.EntitySmallFireball; import net.minecraft.server.EntitySnowball; import net.minecraft.server.EntityThrownExpBottle; import net.minecraft.server.EntityWitherSkull; -import net.minecraft.server.EnumFacing; +import net.minecraft.server.EnumDirection; import net.minecraft.server.IPosition; import net.minecraft.server.IProjectile; import net.minecraft.server.MathHelper; @@ -48,7 +48,7 @@ public class CraftBlockProjectileSource implements BlockProjectileSource { @Override public Block getBlock() { - return dispenserBlock.getWorld().getWorld().getBlockAt(dispenserBlock.x, dispenserBlock.y, dispenserBlock.z); + return dispenserBlock.getWorld().getWorld().getBlockAt(dispenserBlock.getPosition().getX(), dispenserBlock.getPosition().getY(), dispenserBlock.getPosition().getZ()); } @Override @@ -60,10 +60,10 @@ public class CraftBlockProjectileSource implements BlockProjectileSource { public T launchProjectile(Class projectile, Vector velocity) { Validate.isTrue(getBlock().getType() == Material.DISPENSER, "Block is no longer dispenser"); // Copied from BlockDispenser.dispense() - SourceBlock isourceblock = new SourceBlock(dispenserBlock.getWorld(), dispenserBlock.x, dispenserBlock.y, dispenserBlock.z); + SourceBlock isourceblock = new SourceBlock(dispenserBlock.getWorld(), dispenserBlock.getPosition()); // Copied from DispenseBehaviorProjectile IPosition iposition = BlockDispenser.a(isourceblock); - EnumFacing enumfacing = BlockDispenser.b(isourceblock.h()); + EnumDirection enumdirection = BlockDispenser.b(isourceblock.f()); net.minecraft.server.World world = dispenserBlock.getWorld(); net.minecraft.server.Entity launch = null; @@ -72,7 +72,7 @@ public class CraftBlockProjectileSource implements BlockProjectileSource { } else if (Egg.class.isAssignableFrom(projectile)) { launch = new EntityEgg(world, iposition.getX(), iposition.getY(), iposition.getZ()); } else if (EnderPearl.class.isAssignableFrom(projectile)) { - launch = new EntityEnderPearl(world); + launch = new EntityEnderPearl(world, null); launch.setPosition(iposition.getX(), iposition.getY(), iposition.getZ()); } else if (ThrownExpBottle.class.isAssignableFrom(projectile)) { launch = new EntityThrownExpBottle(world, iposition.getX(), iposition.getY(), iposition.getZ()); @@ -83,13 +83,13 @@ public class CraftBlockProjectileSource implements BlockProjectileSource { ((EntityArrow) launch).fromPlayer = 1; ((EntityArrow) launch).projectileSource = this; } else if (Fireball.class.isAssignableFrom(projectile)) { - double d0 = iposition.getX() + (double) ((float) enumfacing.getAdjacentX() * 0.3F); - double d1 = iposition.getY() + (double) ((float) enumfacing.getAdjacentY() * 0.3F); - double d2 = iposition.getZ() + (double) ((float) enumfacing.getAdjacentZ() * 0.3F); + double d0 = iposition.getX() + (double) ((float) enumdirection.getAdjacentX() * 0.3F); + double d1 = iposition.getY() + (double) ((float) enumdirection.getAdjacentY() * 0.3F); + double d2 = iposition.getZ() + (double) ((float) enumdirection.getAdjacentZ() * 0.3F); Random random = world.random; - double d3 = random.nextGaussian() * 0.05D + (double) enumfacing.getAdjacentX(); - double d4 = random.nextGaussian() * 0.05D + (double) enumfacing.getAdjacentY(); - double d5 = random.nextGaussian() * 0.05D + (double) enumfacing.getAdjacentZ(); + double d3 = random.nextGaussian() * 0.05D + (double) enumdirection.getAdjacentX(); + double d4 = random.nextGaussian() * 0.05D + (double) enumdirection.getAdjacentY(); + double d5 = random.nextGaussian() * 0.05D + (double) enumdirection.getAdjacentZ(); if (SmallFireball.class.isAssignableFrom(projectile)) { launch = new EntitySmallFireball(world, d0, d1, d2, d3, d4, d5); @@ -129,7 +129,7 @@ public class CraftBlockProjectileSource implements BlockProjectileSource { b *= 1.25F; } // Copied from DispenseBehaviorProjectile - ((IProjectile) launch).shoot((double) enumfacing.getAdjacentX(), (double) ((float) enumfacing.getAdjacentY() + 0.1F), (double) enumfacing.getAdjacentZ(), b, a); + ((IProjectile) launch).shoot((double) enumdirection.getAdjacentX(), (double) ((float) enumdirection.getAdjacentY() + 0.1F), (double) enumdirection.getAdjacentZ(), b, a); } if (velocity != null) { diff --git a/src/main/java/org/bukkit/craftbukkit/scoreboard/CraftCriteria.java b/src/main/java/org/bukkit/craftbukkit/scoreboard/CraftCriteria.java index 612a52434a..7dedd0222a 100644 --- a/src/main/java/org/bukkit/craftbukkit/scoreboard/CraftCriteria.java +++ b/src/main/java/org/bukkit/craftbukkit/scoreboard/CraftCriteria.java @@ -17,9 +17,6 @@ final class CraftCriteria { for (Map.Entry entry : ((Map ) IScoreboardCriteria.criteria).entrySet()) { String name = entry.getKey().toString(); IScoreboardCriteria criteria = (IScoreboardCriteria) entry.getValue(); - if (!criteria.getName().equals(name)) { - throw new AssertionError("Unexpected entry " + name + " to criteria " + criteria + "(" + criteria.getName() + ")"); - } defaults.put(name, new CraftCriteria(criteria)); } diff --git a/src/main/java/org/bukkit/craftbukkit/scoreboard/CraftScoreboard.java b/src/main/java/org/bukkit/craftbukkit/scoreboard/CraftScoreboard.java index ad65b3f859..62bb8a362b 100644 --- a/src/main/java/org/bukkit/craftbukkit/scoreboard/CraftScoreboard.java +++ b/src/main/java/org/bukkit/craftbukkit/scoreboard/CraftScoreboard.java @@ -97,13 +97,17 @@ public final class CraftScoreboard implements org.bukkit.scoreboard.Scoreboard { public void resetScores(OfflinePlayer player) throws IllegalArgumentException { Validate.notNull(player, "OfflinePlayer cannot be null"); - board.resetPlayerScores(player.getName()); + for (CraftObjective objective : objectives.values()) { + board.resetPlayerScores(player.getName(), objective.getHandle()); // PAIL: check me + } } public void resetScores(String entry) throws IllegalArgumentException { Validate.notNull(entry, "Entry cannot be null"); - board.resetPlayerScores(entry); + for (CraftObjective objective : objectives.values()) { + board.resetPlayerScores(entry, objective.getHandle()); // PAIL: check me + } } public Team getPlayerTeam(OfflinePlayer player) throws IllegalArgumentException { diff --git a/src/main/java/org/bukkit/craftbukkit/updater/ArtifactDetails.java b/src/main/java/org/bukkit/craftbukkit/updater/ArtifactDetails.java deleted file mode 100644 index a9c5eafc94..0000000000 --- a/src/main/java/org/bukkit/craftbukkit/updater/ArtifactDetails.java +++ /dev/null @@ -1,128 +0,0 @@ -package org.bukkit.craftbukkit.updater; - -import java.util.Date; - -public class ArtifactDetails { - private String brokenReason; - private boolean isBroken; - private int buildNumber; - private String htmlUrl; - private String version; - private Date created; - private FileDetails file; - private ChannelDetails channel; - - public ChannelDetails getChannel() { - return channel; - } - - public void setChannel(ChannelDetails channel) { - this.channel = channel; - } - - public boolean isIsBroken() { - return isBroken; - } - - public void setIsBroken(boolean isBroken) { - this.isBroken = isBroken; - } - - public FileDetails getFile() { - return file; - } - - public void setFile(FileDetails file) { - this.file = file; - } - - public String getBrokenReason() { - return brokenReason; - } - - public void setBrokenReason(String brokenReason) { - this.brokenReason = brokenReason; - } - - public int getBuildNumber() { - return buildNumber; - } - - public void setBuildNumber(int buildNumber) { - this.buildNumber = buildNumber; - } - - public Date getCreated() { - return created; - } - - public void setCreated(Date created) { - this.created = created; - } - - public String getHtmlUrl() { - return htmlUrl; - } - - public void setHtmlUrl(String htmlUrl) { - this.htmlUrl = htmlUrl; - } - - public boolean isBroken() { - return isBroken; - } - - public void setBroken(boolean isBroken) { - this.isBroken = isBroken; - } - - public String getVersion() { - return version; - } - - public void setVersion(String version) { - this.version = version; - } - - public static class FileDetails { - private String url; - - public String getUrl() { - return url; - } - - public void setUrl(String url) { - this.url = url; - } - } - - public static class ChannelDetails { - private String name; - private String slug; - private int priority; - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public int getPriority() { - return priority; - } - - public void setPriority(int priority) { - this.priority = priority; - } - - public String getSlug() { - return slug; - } - - public void setSlug(String slug) { - this.slug = slug; - } - } -} diff --git a/src/main/java/org/bukkit/craftbukkit/updater/AutoUpdater.java b/src/main/java/org/bukkit/craftbukkit/updater/AutoUpdater.java deleted file mode 100644 index f21301ce29..0000000000 --- a/src/main/java/org/bukkit/craftbukkit/updater/AutoUpdater.java +++ /dev/null @@ -1,127 +0,0 @@ -package org.bukkit.craftbukkit.updater; - -import java.util.ArrayList; -import java.util.List; -import java.util.logging.Logger; - -public class AutoUpdater { - public static final String WARN_CONSOLE = "warn-console"; - public static final String WARN_OPERATORS = "warn-ops"; - - private final BukkitDLUpdaterService service; - private final List onUpdate = new ArrayList(); - private final List onBroken = new ArrayList(); - private final Logger log; - private final String channel; - private boolean enabled; - private ArtifactDetails current = null; - private ArtifactDetails latest = null; - private boolean suggestChannels = true; - - public AutoUpdater(BukkitDLUpdaterService service, Logger log, String channel) { - this.service = service; - this.log = log; - this.channel = channel; - } - - public String getChannel() { - return channel; - } - - public boolean isEnabled() { - return enabled; - } - - public void setEnabled(boolean isEnabled) { - this.enabled = isEnabled; - } - - public boolean shouldSuggestChannels() { - return suggestChannels; - } - - public void setSuggestChannels(boolean suggestChannels) { - this.suggestChannels = suggestChannels; - } - - public List getOnBroken() { - return onBroken; - } - - public List getOnUpdate() { - return onUpdate; - } - - public boolean isUpdateAvailable() { - if ((latest == null) || (current == null) || (!isEnabled())) { - return false; - } else { - return latest.getCreated().after(current.getCreated()); - } - } - - public ArtifactDetails getCurrent() { - return current; - } - - public ArtifactDetails getLatest() { - return latest; - } - - public void check(final String currentSlug) { - if (!isEnabled()) return; - - new Thread() { - @Override - public void run() { - current = service.getArtifact(currentSlug, "information about this CraftBukkit version; perhaps you are running a custom one?"); - latest = service.getArtifact("latest-" + channel, "latest artifact information"); - - if (isUpdateAvailable()) { - if ((current.isBroken()) && (onBroken.contains(WARN_CONSOLE))) { - log.severe("----- Bukkit Auto Updater -----"); - log.severe("Your version of CraftBukkit is known to be broken. It is strongly advised that you update to a more recent version ASAP."); - log.severe("Known issues with your version:"); - - for (String line : current.getBrokenReason().split("\n")) { - log.severe("> " + line); - } - - log.severe("Newer version " + latest.getVersion() + " (build #" + latest.getBuildNumber() + ") was released on " + latest.getCreated() + "."); - log.severe("Details: " + latest.getHtmlUrl()); - log.severe("Download: " + latest.getFile().getUrl()); - log.severe("----- ------------------- -----"); - } else if (onUpdate.contains(WARN_CONSOLE)) { - log.warning("----- Bukkit Auto Updater -----"); - log.warning("Your version of CraftBukkit is out of date. Version " + latest.getVersion() + " (build #" + latest.getBuildNumber() + ") was released on " + latest.getCreated() + "."); - log.warning("Details: " + latest.getHtmlUrl()); - log.warning("Download: " + latest.getFile().getUrl()); - log.warning("----- ------------------- -----"); - } - } else if ((current != null) && (current.isBroken()) && (onBroken.contains(WARN_CONSOLE))) { - log.severe("----- Bukkit Auto Updater -----"); - log.severe("Your version of CraftBukkit is known to be broken. It is strongly advised that you update to a more recent version ASAP."); - log.severe("Known issues with your version:"); - - for (String line : current.getBrokenReason().split("\n")) { - log.severe("> " + line); - } - - log.severe("Unfortunately, there is not yet a newer version suitable for your server. We would advise you wait an hour or two, or try out a dev build."); - log.severe("----- ------------------- -----"); - } else if ((current != null) && (shouldSuggestChannels())) { - ArtifactDetails.ChannelDetails prefChan = service.getChannel(channel, "preferred channel details"); - - if ((prefChan != null) && (current.getChannel().getPriority() < prefChan.getPriority())) { - log.info("----- Bukkit Auto Updater -----"); - log.info("It appears that you're running a " + current.getChannel().getName() + ", when you've specified in bukkit.yml that you prefer to run " + prefChan.getName() + "s."); - log.info("If you would like to be kept informed about new " + current.getChannel().getName() + " releases, it is recommended that you change 'preferred-channel' in your bukkit.yml to '" + current.getChannel().getSlug() + "'."); - log.info("With that set, you will be told whenever a new version is available for download, so that you can always keep up to date and secure with the latest fixes."); - log.info("If you would like to disable this warning, simply set 'suggest-channels' to false in bukkit.yml."); - log.info("----- ------------------- -----"); - } - } - } - }.start(); - } -} diff --git a/src/main/java/org/bukkit/craftbukkit/updater/BukkitDLUpdaterService.java b/src/main/java/org/bukkit/craftbukkit/updater/BukkitDLUpdaterService.java deleted file mode 100644 index 0145ac36a8..0000000000 --- a/src/main/java/org/bukkit/craftbukkit/updater/BukkitDLUpdaterService.java +++ /dev/null @@ -1,102 +0,0 @@ -package org.bukkit.craftbukkit.updater; - -import com.google.gson.*; -import java.io.IOException; -import java.io.InputStreamReader; -import java.io.UnsupportedEncodingException; -import java.lang.reflect.Type; -import java.net.URL; -import java.net.URLConnection; -import java.text.ParseException; -import java.text.SimpleDateFormat; -import java.util.Date; -import java.util.logging.Level; -import java.util.logging.Logger; - -import org.bukkit.Bukkit; - -public class BukkitDLUpdaterService { - private static final String API_PREFIX_ARTIFACT = "/api/1.0/downloads/projects/craftbukkit/view/"; - private static final String API_PREFIX_CHANNEL = "/api/1.0/downloads/channels/"; - private static final DateDeserializer dateDeserializer = new DateDeserializer(); - private final String host; - - public BukkitDLUpdaterService(String host) { - this.host = host; - } - - public ArtifactDetails getArtifact(String slug, String name) { - try { - return fetchArtifact(slug); - } catch (UnsupportedEncodingException ex) { - Bukkit.getLogger().log(Level.WARNING, "Could not get " + name + ": " + ex.getClass().getSimpleName()); - } catch (IOException ex) { - Bukkit.getLogger().log(Level.WARNING, "Could not get " + name + ": " + ex.getClass().getSimpleName()); - } - - return null; - } - - private String getUserAgent() { - return "CraftBukkit/" + BukkitDLUpdaterService.class.getPackage().getImplementationVersion() + "/" + System.getProperty("java.version"); - } - - public ArtifactDetails fetchArtifact(String slug) throws IOException { - URL url = new URL("http", host, API_PREFIX_ARTIFACT + slug + "/"); - InputStreamReader reader = null; - - try { - URLConnection connection = url.openConnection(); - connection.setRequestProperty("User-Agent", getUserAgent()); - reader = new InputStreamReader(connection.getInputStream()); - Gson gson = new GsonBuilder().registerTypeAdapter(Date.class, dateDeserializer).setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES).create(); - return gson.fromJson(reader, ArtifactDetails.class); - } finally { - if (reader != null) { - reader.close(); - } - } - } - - public ArtifactDetails.ChannelDetails getChannel(String slug, String name) { - try { - return fetchChannel(slug); - } catch (UnsupportedEncodingException ex) { - Bukkit.getLogger().log(Level.WARNING, "Could not get " + name + ": " + ex.getClass().getSimpleName()); - } catch (IOException ex) { - Bukkit.getLogger().log(Level.WARNING, "Could not get " + name + ": " + ex.getClass().getSimpleName()); - } - - return null; - } - - public ArtifactDetails.ChannelDetails fetchChannel(String slug) throws IOException { - URL url = new URL("http", host, API_PREFIX_CHANNEL + slug + "/"); - InputStreamReader reader = null; - - try { - URLConnection connection = url.openConnection(); - connection.setRequestProperty("User-Agent", getUserAgent()); - reader = new InputStreamReader(connection.getInputStream()); - Gson gson = new GsonBuilder().registerTypeAdapter(Date.class, dateDeserializer).setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES).create(); - - return gson.fromJson(reader, ArtifactDetails.ChannelDetails.class); - } finally { - if (reader != null) { - reader.close(); - } - } - } - - static class DateDeserializer implements JsonDeserializer { - private static final SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); - - public Date deserialize(JsonElement je, Type type, JsonDeserializationContext jdc) throws JsonParseException { - try { - return format.parse(je.getAsString()); - } catch (ParseException ex) { - throw new JsonParseException("Date is not formatted correctly", ex); - } - } - } -} diff --git a/src/main/java/org/bukkit/craftbukkit/util/BlockStateListPopulator.java b/src/main/java/org/bukkit/craftbukkit/util/BlockStateListPopulator.java index 30f2622d99..2dbedd2d09 100644 --- a/src/main/java/org/bukkit/craftbukkit/util/BlockStateListPopulator.java +++ b/src/main/java/org/bukkit/craftbukkit/util/BlockStateListPopulator.java @@ -4,6 +4,8 @@ import java.util.ArrayList; import java.util.List; import net.minecraft.server.Block; +import net.minecraft.server.BlockPosition; +import net.minecraft.server.IBlockData; import org.bukkit.World; import org.bukkit.block.BlockState; @@ -35,6 +37,11 @@ public class BlockStateListPopulator { public void setTypeUpdate(int x, int y, int z, Block block) { this.setType(x, y, z, block); + } + + public void setTypeUpdate(BlockPosition position, IBlockData data) { + setTypeAndData(position.getX(), position.getY(), position.getZ(), data.getBlock(), data.getBlock().toLegacyData(data), 0); + } public void setType(int x, int y, int z, Block block) { diff --git a/src/main/java/org/bukkit/craftbukkit/util/CraftChatMessage.java b/src/main/java/org/bukkit/craftbukkit/util/CraftChatMessage.java index 256f053107..58ff7d963b 100644 --- a/src/main/java/org/bukkit/craftbukkit/util/CraftChatMessage.java +++ b/src/main/java/org/bukkit/craftbukkit/util/CraftChatMessage.java @@ -24,7 +24,7 @@ public final class CraftChatMessage { static { Builder builder = ImmutableMap.builder(); for (EnumChatFormat format : EnumChatFormat.values()) { - builder.put(Character.toLowerCase(format.getChar()), format); + builder.put(Character.toLowerCase(format.toString().charAt(1)), format); } formatMap = builder.build(); } @@ -36,7 +36,7 @@ public final class CraftChatMessage { private int currentIndex; private final String message; - private StringMessage(String message) { + private StringMessage(String message, boolean keepNewlines) { this.message = message; if (message == null) { output = new IChatBaseComponent[] { currentChatComponent }; @@ -71,7 +71,7 @@ public final class CraftChatMessage { case UNDERLINE: modifier.setUnderline(Boolean.TRUE); break; - case RANDOM: + case OBFUSCATED: modifier.setRandom(Boolean.TRUE); break; default: @@ -82,7 +82,11 @@ public final class CraftChatMessage { } break; case 2: - currentChatComponent = null; + if (keepNewlines) { + currentChatComponent.addSibling(new ChatComponentText("\n")); + } else { + currentChatComponent = null; + } break; case 3: modifier.setChatClickable(new ChatClickable(EnumClickAction.OPEN_URL, match)); @@ -119,7 +123,38 @@ public final class CraftChatMessage { } public static IChatBaseComponent[] fromString(String message) { - return new StringMessage(message).getOutput(); + return fromString(message, false); + } + + public static IChatBaseComponent[] fromString(String message, boolean keepNewlines) { + return new StringMessage(message, keepNewlines).getOutput(); + } + + public static String fromComponent(IChatBaseComponent component) { + if (component == null) return ""; + StringBuilder out = new StringBuilder(); + + for (IChatBaseComponent c : (Iterable) component) { + ChatModifier modi = c.getChatModifier(); + out.append(modi.getColor() == null ? EnumChatFormat.BLACK : modi.getColor()); + if (modi.isBold()) { + out.append(EnumChatFormat.BOLD); + } + if (modi.isItalic()) { + out.append(EnumChatFormat.ITALIC); + } + if (modi.isUnderlined()) { + out.append(EnumChatFormat.UNDERLINE); + } + if (modi.isStrikethrough()) { + out.append(EnumChatFormat.STRIKETHROUGH); + } + if (modi.isRandom()) { + out.append(EnumChatFormat.OBFUSCATED); + } + out.append(c.getText()); + } + return out.toString(); } private CraftChatMessage() { diff --git a/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java b/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java index 52aa5d1831..b84ed46d5b 100644 --- a/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java +++ b/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java @@ -1,12 +1,15 @@ package org.bukkit.craftbukkit.util; +import com.google.common.collect.Lists; import java.util.ArrayList; import java.util.Iterator; import java.util.List; +import java.util.Set; import net.minecraft.server.Block; import net.minecraft.server.Blocks; import net.minecraft.server.Item; +import net.minecraft.server.MinecraftKey; import net.minecraft.server.MojangsonParser; import net.minecraft.server.NBTTagCompound; import net.minecraft.server.StatisticList; @@ -88,12 +91,16 @@ public final class CraftMagicNumbers implements UnsafeValues { @Override public Material getMaterialFromInternalName(String name) { - return getMaterial((Item) Item.REGISTRY.get(name)); + return getMaterial((Item) Item.REGISTRY.get(new MinecraftKey(name))); } @Override public List tabCompleteInternalMaterialName(String token, List completions) { - return StringUtil.copyPartialMatches(token, Item.REGISTRY.keySet(), completions); + ArrayList results = Lists.newArrayList(); + for (MinecraftKey key : (Set)Item.REGISTRY.keySet()) { + results.add(key.toString()); + } + return StringUtil.copyPartialMatches(token, results, completions); } @Override diff --git a/src/main/java/org/bukkit/craftbukkit/util/LazyPlayerSet.java b/src/main/java/org/bukkit/craftbukkit/util/LazyPlayerSet.java index 90b2e6ac46..ae19da4d83 100644 --- a/src/main/java/org/bukkit/craftbukkit/util/LazyPlayerSet.java +++ b/src/main/java/org/bukkit/craftbukkit/util/LazyPlayerSet.java @@ -1,25 +1,25 @@ -package org.bukkit.craftbukkit.util; - -import java.util.HashSet; -import java.util.List; -import net.minecraft.server.EntityPlayer; -import net.minecraft.server.MinecraftServer; - -import org.bukkit.entity.Player; - -public class LazyPlayerSet extends LazyHashSet { - - @Override - HashSet makeReference() { - if (reference != null) { - throw new IllegalStateException("Reference already created!"); - } - List players = MinecraftServer.getServer().getPlayerList().players; - HashSet reference = new HashSet(players.size()); - for (EntityPlayer player : players) { - reference.add(player.getBukkitEntity()); - } - return reference; - } - -} +package org.bukkit.craftbukkit.util; + +import java.util.HashSet; +import java.util.List; +import net.minecraft.server.EntityPlayer; +import net.minecraft.server.MinecraftServer; + +import org.bukkit.entity.Player; + +public class LazyPlayerSet extends LazyHashSet { + + @Override + HashSet makeReference() { + if (reference != null) { + throw new IllegalStateException("Reference already created!"); + } + List players = MinecraftServer.getServer().getPlayerList().players; + HashSet reference = new HashSet(players.size()); + for (EntityPlayer player : players) { + reference.add(player.getBukkitEntity()); + } + return reference; + } + +} diff --git a/src/main/java/org/bukkit/craftbukkit/util/MojangNameLookup.java b/src/main/java/org/bukkit/craftbukkit/util/MojangNameLookup.java index 1db4874d6d..93a8f0bd70 100644 --- a/src/main/java/org/bukkit/craftbukkit/util/MojangNameLookup.java +++ b/src/main/java/org/bukkit/craftbukkit/util/MojangNameLookup.java @@ -1,8 +1,7 @@ package org.bukkit.craftbukkit.util; -import net.minecraft.util.com.google.gson.Gson; -import net.minecraft.util.com.google.common.base.Charsets; -import net.minecraft.util.org.apache.commons.io.IOUtils; +import com.google.common.base.Charsets; +import com.google.gson.Gson; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -12,6 +11,7 @@ import java.net.MalformedURLException; import java.net.URL; import java.net.URLConnection; import java.util.UUID; +import org.apache.commons.io.IOUtils; public class MojangNameLookup { private static final Logger logger = LogManager.getFormatterLogger(MojangNameLookup.class); diff --git a/src/main/java/org/bukkit/craftbukkit/util/TerminalConsoleWriterThread.java b/src/main/java/org/bukkit/craftbukkit/util/TerminalConsoleWriterThread.java index 0bdfde6d55..772f730ffb 100644 --- a/src/main/java/org/bukkit/craftbukkit/util/TerminalConsoleWriterThread.java +++ b/src/main/java/org/bukkit/craftbukkit/util/TerminalConsoleWriterThread.java @@ -5,7 +5,7 @@ import java.io.OutputStream; import java.util.logging.Level; import java.util.logging.Logger; import jline.console.ConsoleReader; -import net.minecraft.util.com.mojang.util.QueueLogAppender; +import com.mojang.util.QueueLogAppender; import org.bukkit.craftbukkit.Main; public class TerminalConsoleWriterThread implements Runnable { diff --git a/src/main/resources/configurations/bukkit.yml b/src/main/resources/configurations/bukkit.yml index 129ac34dd3..a6c11786c7 100644 --- a/src/main/resources/configurations/bukkit.yml +++ b/src/main/resources/configurations/bukkit.yml @@ -37,13 +37,6 @@ ticks-per: animal-spawns: 400 monster-spawns: 1 autosave: 6000 -auto-updater: - enabled: true - on-broken: [warn-console, warn-ops] - on-update: [warn-console, warn-ops] - preferred-channel: rb - host: dl.bukkit.org - suggest-channels: true aliases: now-in-commands.yml database: username: bukkit diff --git a/src/test/java/org/bukkit/DyeColorsTest.java b/src/test/java/org/bukkit/DyeColorsTest.java index 0e3a7c7503..f0b889b344 100644 --- a/src/test/java/org/bukkit/DyeColorsTest.java +++ b/src/test/java/org/bukkit/DyeColorsTest.java @@ -7,6 +7,7 @@ import java.util.ArrayList; import java.util.List; import net.minecraft.server.EntitySheep; +import net.minecraft.server.EnumColor; import net.minecraft.server.ItemDye; import org.bukkit.support.AbstractTestingBase; @@ -33,7 +34,7 @@ public class DyeColorsTest extends AbstractTestingBase { @Test public void checkColor() { Color color = dye.getColor(); - float[] nmsColorArray = EntitySheep.bp[dye.getWoolData()]; + float[] nmsColorArray = EntitySheep.a(EnumColor.fromColorIndex(dye.getWoolData())); Color nmsColor = Color.fromRGB((int) (nmsColorArray[0] * 255), (int) (nmsColorArray[1] * 255), (int) (nmsColorArray[2] * 255)); assertThat(color, is(nmsColor)); } @@ -41,7 +42,7 @@ public class DyeColorsTest extends AbstractTestingBase { @Test public void checkFireworkColor() { Color color = dye.getFireworkColor(); - int nmsColor = ItemDye.c[dye.getDyeData()]; + int nmsColor = ItemDye.a[dye.getDyeData()]; assertThat(color, is(Color.fromRGB(nmsColor))); } } diff --git a/src/test/java/org/bukkit/PerMaterialTest.java b/src/test/java/org/bukkit/PerMaterialTest.java index a33fcbffd8..f689cbf403 100644 --- a/src/test/java/org/bukkit/PerMaterialTest.java +++ b/src/test/java/org/bukkit/PerMaterialTest.java @@ -23,16 +23,18 @@ import org.junit.runners.Parameterized.Parameter; import org.junit.runners.Parameterized.Parameters; import com.google.common.collect.Lists; +import java.util.Map; +import net.minecraft.server.Block; import net.minecraft.server.Blocks; import org.bukkit.craftbukkit.util.CraftMagicNumbers; @RunWith(Parameterized.class) public class PerMaterialTest extends AbstractTestingBase { - private static int[] fireValues; + private static Map fireValues; @BeforeClass public static void getFireValues() { - fireValues = Util.getInternalState(BlockFire.class, Blocks.FIRE, "a"); + fireValues = Util.getInternalState(BlockFire.class, Blocks.FIRE, "S"); } @Parameters(name= "{index}: {0}") @@ -120,7 +122,8 @@ public class PerMaterialTest extends AbstractTestingBase { @Test public void isBurnable() { if (material.isBlock()) { - assertThat(material.isBurnable(), is(fireValues[material.getId()] > 0)); + Block block = CraftMagicNumbers.getBlock(material); + assertThat(material.isBurnable(), is(fireValues.containsKey(block) && fireValues.get(block) > 0)); } else { assertFalse(material.isBurnable()); } @@ -129,7 +132,7 @@ public class PerMaterialTest extends AbstractTestingBase { @Test public void isOccluding() { if (material.isBlock()) { - assertThat(material.isOccluding(), is(CraftMagicNumbers.getBlock(material).r())); + assertThat(material.isOccluding(), is(CraftMagicNumbers.getBlock(material).isOccluding())); } else { assertFalse(material.isOccluding()); } diff --git a/src/test/java/org/bukkit/craftbukkit/inventory/ItemMetaTest.java b/src/test/java/org/bukkit/craftbukkit/inventory/ItemMetaTest.java index 2331c18072..11d2906901 100644 --- a/src/test/java/org/bukkit/craftbukkit/inventory/ItemMetaTest.java +++ b/src/test/java/org/bukkit/craftbukkit/inventory/ItemMetaTest.java @@ -8,15 +8,19 @@ import java.util.List; import org.bukkit.Bukkit; import org.bukkit.Color; +import org.bukkit.DyeColor; import org.bukkit.FireworkEffect; import org.bukkit.Material; import org.bukkit.FireworkEffect.Type; +import org.bukkit.block.banner.Pattern; +import org.bukkit.block.banner.PatternType; import org.bukkit.craftbukkit.inventory.ItemStackTest.StackProvider; import org.bukkit.craftbukkit.inventory.ItemStackTest.StackWrapper; import org.bukkit.craftbukkit.inventory.ItemStackTest.BukkitWrapper; import org.bukkit.craftbukkit.inventory.ItemStackTest.CraftWrapper; import org.bukkit.enchantments.Enchantment; import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.BannerMeta; import org.bukkit.inventory.meta.BookMeta; import org.bukkit.inventory.meta.EnchantmentStorageMeta; import org.bukkit.inventory.meta.FireworkEffectMeta; @@ -25,7 +29,6 @@ import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.inventory.meta.LeatherArmorMeta; import org.bukkit.inventory.meta.MapMeta; import org.bukkit.inventory.meta.PotionMeta; -import org.bukkit.inventory.meta.SkullMeta; import org.bukkit.potion.PotionEffectType; import org.bukkit.support.AbstractTestingBase; import org.junit.Test; @@ -192,6 +195,15 @@ public class ItemMetaTest extends AbstractTestingBase { cleanStack.setItemMeta(meta); return cleanStack; } + }, + new StackProvider(Material.BANNER) { + @Override ItemStack operate(ItemStack cleanStack) { + final BannerMeta meta = (BannerMeta) cleanStack.getItemMeta(); + meta.setBaseColor(DyeColor.CYAN); + meta.addPattern(new Pattern(DyeColor.WHITE, PatternType.BRICKS)); + cleanStack.setItemMeta(meta); + return cleanStack; + } } ); diff --git a/src/test/java/org/bukkit/craftbukkit/updater/BukkitDLUpdaterServiceTest.java b/src/test/java/org/bukkit/craftbukkit/updater/BukkitDLUpdaterServiceTest.java deleted file mode 100644 index df7437c9b6..0000000000 --- a/src/test/java/org/bukkit/craftbukkit/updater/BukkitDLUpdaterServiceTest.java +++ /dev/null @@ -1,32 +0,0 @@ -package org.bukkit.craftbukkit.updater; - -import static org.junit.Assert.*; -import static org.hamcrest.Matchers.*; - -import java.io.FileNotFoundException; -import java.io.IOException; - -import org.junit.Test; - -public class BukkitDLUpdaterServiceTest { - @Test(expected=IOException.class) - public void testHostNotFound() throws IOException { - BukkitDLUpdaterService service = new BukkitDLUpdaterService("404.example.org"); - - service.fetchArtifact("rb"); - } - - @Test(expected=FileNotFoundException.class) - public void testArtifactNotFound() throws IOException { - BukkitDLUpdaterService service = new BukkitDLUpdaterService("dl.bukkit.org"); - - service.fetchArtifact("meep"); - } - - @Test - public void testArtifactExists() throws IOException { - BukkitDLUpdaterService service = new BukkitDLUpdaterService("dl.bukkit.org"); - - assertThat(service.fetchArtifact("latest-dev"), is(not(nullValue()))); - } -} diff --git a/src/test/java/org/bukkit/support/AbstractTestingBase.java b/src/test/java/org/bukkit/support/AbstractTestingBase.java index 7c4484f07e..b280ebe4fb 100644 --- a/src/test/java/org/bukkit/support/AbstractTestingBase.java +++ b/src/test/java/org/bukkit/support/AbstractTestingBase.java @@ -15,11 +15,62 @@ import org.junit.BeforeClass; * extend this class to solve it. */ public abstract class AbstractTestingBase { - public static final List INVALIDATED_MATERIALS = ImmutableList.builder().add(Material.BREWING_STAND, Material.BED_BLOCK, Material.NETHER_WARTS, Material.CAULDRON, Material.FLOWER_POT, Material.CROPS, Material.SUGAR_CANE_BLOCK, Material.CAKE_BLOCK, Material.SKULL, Material.PISTON_EXTENSION, Material.PISTON_MOVING_PIECE, Material.GLOWING_REDSTONE_ORE, Material.DIODE_BLOCK_ON, Material.PUMPKIN_STEM, Material.SIGN_POST, Material.REDSTONE_COMPARATOR_ON, Material.TRIPWIRE, Material.REDSTONE_LAMP_ON, Material.MELON_STEM, Material.REDSTONE_TORCH_OFF, Material.REDSTONE_COMPARATOR_OFF, Material.REDSTONE_WIRE, Material.WALL_SIGN, Material.DIODE_BLOCK_OFF, Material.IRON_DOOR_BLOCK, Material.WOODEN_DOOR).add(Material.LOCKED_CHEST).build(); + public static final List INVALIDATED_MATERIALS = ImmutableList.builder() + .add( + Material.BREWING_STAND, + Material.BED_BLOCK, + Material.NETHER_WARTS, + Material.CAULDRON, + Material.FLOWER_POT, + Material.CROPS, + Material.SUGAR_CANE_BLOCK, + Material.CAKE_BLOCK, + Material.SKULL, + Material.PISTON_EXTENSION, + Material.PISTON_MOVING_PIECE, + Material.GLOWING_REDSTONE_ORE, + Material.DIODE_BLOCK_ON, + Material.PUMPKIN_STEM, + Material.SIGN_POST, + Material.REDSTONE_COMPARATOR_ON, + Material.TRIPWIRE, + Material.REDSTONE_LAMP_ON, + Material.MELON_STEM, + Material.REDSTONE_TORCH_OFF, + Material.REDSTONE_COMPARATOR_OFF, + Material.REDSTONE_WIRE, + Material.WALL_SIGN, + Material.DIODE_BLOCK_OFF, + Material.IRON_DOOR_BLOCK, + Material.WOODEN_DOOR, + Material.LOCKED_CHEST, + Material.WATER, + Material.STATIONARY_WATER, + Material.LAVA, + Material.STATIONARY_LAVA, + Material.DOUBLE_STEP, + Material.DOUBLE_STEP, + Material.FIRE, + Material.PORTAL, + Material.ENDER_PORTAL, + Material.WOOD_DOUBLE_STEP, + Material.COCOA, + Material.CARROT, + Material.POTATO, + Material.STANDING_BANNER, + Material.WALL_BANNER, + Material.DAYLIGHT_DETECTOR_INVERTED, + Material.DOUBLE_STONE_SLAB2, + Material.SPRUCE_DOOR, + Material.BIRCH_DOOR, + Material.JUNGLE_DOOR, + Material.ACACIA_DOOR, + Material.DARK_OAK_DOOR + ).build(); @BeforeClass public static void setup() { - DispenserRegistry.b(); + DispenserRegistry.c(); DummyServer.setup(); DummyPotions.setup(); DummyEnchantments.setup(); diff --git a/src/test/java/org/bukkit/support/DummyEnchantments.java b/src/test/java/org/bukkit/support/DummyEnchantments.java index 5ed00a72b0..a0e0396bf1 100644 --- a/src/test/java/org/bukkit/support/DummyEnchantments.java +++ b/src/test/java/org/bukkit/support/DummyEnchantments.java @@ -4,7 +4,7 @@ import net.minecraft.server.Enchantment; public class DummyEnchantments { static { - Enchantment.byId.getClass(); + Enchantment.getNames(); org.bukkit.enchantments.Enchantment.stopAcceptingRegistrations(); }