summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.gitignore2
-rwxr-xr-xmakePatches.sh16
-rw-r--r--nms-patches/BiomeTheEndDecorator.patch11
-rw-r--r--nms-patches/Block.patch23
-rw-r--r--nms-patches/BlockBloodStone.patch28
-rw-r--r--nms-patches/BlockButtonAbstract.patch111
-rw-r--r--nms-patches/BlockCactus.patch31
-rw-r--r--nms-patches/BlockCake.patch22
-rw-r--r--nms-patches/BlockCocoa.patch35
-rw-r--r--nms-patches/BlockCommand.patch34
-rw-r--r--nms-patches/BlockCrops.patch35
-rw-r--r--nms-patches/BlockDaylightDetector.patch10
-rw-r--r--nms-patches/BlockDiodeAbstract.patch30
-rw-r--r--nms-patches/BlockDispenser.patch18
-rw-r--r--nms-patches/BlockDoor.patch43
-rw-r--r--nms-patches/BlockDragonEgg.patch30
-rw-r--r--nms-patches/BlockDropper.patch41
-rw-r--r--nms-patches/BlockEnderPortal.patch22
-rw-r--r--nms-patches/BlockFire.patch110
-rw-r--r--nms-patches/BlockFlowing.patch83
-rw-r--r--nms-patches/BlockGrass.patch77
-rw-r--r--nms-patches/BlockIce.patch15
-rw-r--r--nms-patches/BlockLeaves.patch26
-rw-r--r--nms-patches/BlockLever.patch32
-rw-r--r--nms-patches/BlockMinecartDetector.patch29
-rw-r--r--nms-patches/BlockMobSpawner.patch22
-rw-r--r--nms-patches/BlockMonsterEggs.patch20
-rw-r--r--nms-patches/BlockMushroom.patch57
-rw-r--r--nms-patches/BlockMycel.patch58
-rw-r--r--nms-patches/BlockNetherWart.patch12
-rw-r--r--nms-patches/BlockOre.patch42
-rw-r--r--nms-patches/BlockPiston.patch76
-rw-r--r--nms-patches/BlockPortal.patch53
-rw-r--r--nms-patches/BlockPoweredRail.patch25
-rw-r--r--nms-patches/BlockPressurePlateAbstract.patch31
-rw-r--r--nms-patches/BlockPressurePlateBinary.patch38
-rw-r--r--nms-patches/BlockPressurePlateWeighted.patch43
-rw-r--r--nms-patches/BlockPumpkin.patch117
-rw-r--r--nms-patches/BlockRedstoneLamp.patch47
-rw-r--r--nms-patches/BlockRedstoneOre.patch102
-rw-r--r--nms-patches/BlockRedstoneTorch.patch55
-rw-r--r--nms-patches/BlockRedstoneWire.patch27
-rw-r--r--nms-patches/BlockReed.patch18
-rw-r--r--nms-patches/BlockSapling.patch125
-rw-r--r--nms-patches/BlockSkull.patch133
-rw-r--r--nms-patches/BlockSnow.patch14
-rw-r--r--nms-patches/BlockSoil.patch52
-rw-r--r--nms-patches/BlockStationary.patch40
-rw-r--r--nms-patches/BlockStem.patch41
-rw-r--r--nms-patches/BlockTrapdoor.patch31
-rw-r--r--nms-patches/BlockTripwire.patch52
-rw-r--r--nms-patches/BlockTripwireHook.patch29
-rw-r--r--nms-patches/BlockVine.patch76
-rw-r--r--nms-patches/Chunk.patch169
-rw-r--r--nms-patches/ChunkProviderServer.patch348
-rw-r--r--nms-patches/ChunkRegionLoader.patch131
-rw-r--r--nms-patches/ChunkSection.patch21
-rw-r--r--nms-patches/CommandBlockListenerAbstract.patch162
-rw-r--r--nms-patches/Container.patch204
-rw-r--r--nms-patches/ContainerAnvil.patch51
-rw-r--r--nms-patches/ContainerAnvilInventory.patch58
-rw-r--r--nms-patches/ContainerBeacon.patch47
-rw-r--r--nms-patches/ContainerBrewingStand.patch52
-rw-r--r--nms-patches/ContainerChest.patch59
-rw-r--r--nms-patches/ContainerDispenser.patch54
-rw-r--r--nms-patches/ContainerEnchantTable.patch170
-rw-r--r--nms-patches/ContainerEnchantTableInventory.patch58
-rw-r--r--nms-patches/ContainerFurnace.patch51
-rw-r--r--nms-patches/ContainerHopper.patch44
-rw-r--r--nms-patches/ContainerHorse.patch36
-rw-r--r--nms-patches/ContainerMerchant.patch36
-rw-r--r--nms-patches/ContainerPlayer.patch74
-rw-r--r--nms-patches/ContainerWorkbench.patch79
-rw-r--r--nms-patches/ControllerLook.patch23
-rw-r--r--nms-patches/ControllerMove.patch12
-rw-r--r--nms-patches/CraftingManager.patch57
-rw-r--r--nms-patches/CrashReport.patch10
-rw-r--r--nms-patches/DedicatedServer.patch162
-rw-r--r--nms-patches/DispenseBehaviorArmor.patch59
-rw-r--r--nms-patches/DispenseBehaviorBoat.patch54
-rw-r--r--nms-patches/DispenseBehaviorBonemeal.patch44
-rw-r--r--nms-patches/DispenseBehaviorEmptyBucket.patch44
-rw-r--r--nms-patches/DispenseBehaviorFilledBucket.patch65
-rw-r--r--nms-patches/DispenseBehaviorFireball.patch55
-rw-r--r--nms-patches/DispenseBehaviorFlintAndSteel.patch57
-rw-r--r--nms-patches/DispenseBehaviorItem.patch76
-rw-r--r--nms-patches/DispenseBehaviorMinecart.patch58
-rw-r--r--nms-patches/DispenseBehaviorMonsterEgg.patch61
-rw-r--r--nms-patches/DispenseBehaviorProjectile.patch54
-rw-r--r--nms-patches/DispenseBehaviorTNT.patch56
-rw-r--r--nms-patches/Enchantment.patch19
-rw-r--r--nms-patches/Entity.patch578
-rw-r--r--nms-patches/EntityAgeable.patch48
-rw-r--r--nms-patches/EntityArrow.patch106
-rw-r--r--nms-patches/EntityBoat.patch249
-rw-r--r--nms-patches/EntityChicken.patch14
-rw-r--r--nms-patches/EntityCow.patch42
-rw-r--r--nms-patches/EntityCreature.patch31
-rw-r--r--nms-patches/EntityCreeper.patch104
-rw-r--r--nms-patches/EntityDamageSourceIndirect.patch14
-rw-r--r--nms-patches/EntityEgg.patch65
-rw-r--r--nms-patches/EntityEnderCrystal.patch43
-rw-r--r--nms-patches/EntityEnderDragon.patch330
-rw-r--r--nms-patches/EntityEnderPearl.patch50
-rw-r--r--nms-patches/EntityEnderman.patch34
-rw-r--r--nms-patches/EntityExperienceOrb.patch82
-rw-r--r--nms-patches/EntityFallingBlock.patch44
-rw-r--r--nms-patches/EntityFireball.patch111
-rw-r--r--nms-patches/EntityFishingHook.patch159
-rw-r--r--nms-patches/EntityHanging.patch111
-rw-r--r--nms-patches/EntityHorse.patch140
-rw-r--r--nms-patches/EntityHuman.patch383
-rw-r--r--nms-patches/EntityInsentient.patch164
-rw-r--r--nms-patches/EntityIronGolem.patch11
-rw-r--r--nms-patches/EntityItem.patch115
-rw-r--r--nms-patches/EntityItemFrame.patch15
-rw-r--r--nms-patches/EntityLargeFireball.patch38
-rw-r--r--nms-patches/EntityLeash.patch61
-rw-r--r--nms-patches/EntityLightning.patch111
-rw-r--r--nms-patches/EntityLiving.patch440
-rw-r--r--nms-patches/EntityMinecartAbstract.patch231
-rw-r--r--nms-patches/EntityMinecartCommandBlockListener.patch10
-rw-r--r--nms-patches/EntityMinecartContainer.patch61
-rw-r--r--nms-patches/EntityMonster.patch26
-rw-r--r--nms-patches/EntityMushroomCow.patch26
-rw-r--r--nms-patches/EntityOcelot.patch30
-rw-r--r--nms-patches/EntityPainting.patch10
-rw-r--r--nms-patches/EntityPig.patch29
-rw-r--r--nms-patches/EntityPlayer.patch542
-rw-r--r--nms-patches/EntityPotion.patch70
-rw-r--r--nms-patches/EntityProjectile.patch31
-rw-r--r--nms-patches/EntitySheep.patch54
-rw-r--r--nms-patches/EntitySkeleton.patch60
-rw-r--r--nms-patches/EntitySlime.patch40
-rw-r--r--nms-patches/EntitySmallFireball.patch39
-rw-r--r--nms-patches/EntitySnowman.patch42
-rw-r--r--nms-patches/EntitySpider.patch11
-rw-r--r--nms-patches/EntitySquid.patch37
-rw-r--r--nms-patches/EntityTNTPrimed.patch52
-rw-r--r--nms-patches/EntityThrownExpBottle.patch22
-rw-r--r--nms-patches/EntityTrackerEntry.patch176
-rw-r--r--nms-patches/EntityVillager.patch19
-rw-r--r--nms-patches/EntityWither.patch78
-rw-r--r--nms-patches/EntityWitherSkull.patch36
-rw-r--r--nms-patches/EntityWolf.patch87
-rw-r--r--nms-patches/EntityZombie.patch108
-rw-r--r--nms-patches/ExpirableListEntry.patch42
-rw-r--r--nms-patches/Explosion.patch127
-rw-r--r--nms-patches/FoodMetaData.patch66
-rw-r--r--nms-patches/HandshakeListener.patch69
-rw-r--r--nms-patches/IDataManager.patch18
-rw-r--r--nms-patches/IInventory.patch31
-rw-r--r--nms-patches/IRecipe.patch9
-rw-r--r--nms-patches/InventoryCraftResult.patch48
-rw-r--r--nms-patches/InventoryCrafting.patch64
-rw-r--r--nms-patches/InventoryEnderChest.patch51
-rw-r--r--nms-patches/InventoryHorseChest.patch63
-rw-r--r--nms-patches/InventoryLargeChest.patch66
-rw-r--r--nms-patches/InventoryMerchant.patch59
-rw-r--r--nms-patches/InventorySubcontainer.patch59
-rw-r--r--nms-patches/ItemBoat.patch17
-rw-r--r--nms-patches/ItemBow.patch49
-rw-r--r--nms-patches/ItemBucket.patch102
-rw-r--r--nms-patches/ItemDye.patch28
-rw-r--r--nms-patches/ItemFireball.patch19
-rw-r--r--nms-patches/ItemFishingRod.patch31
-rw-r--r--nms-patches/ItemFlintAndSteel.patch47
-rw-r--r--nms-patches/ItemHanging.patch41
-rw-r--r--nms-patches/ItemLeash.patch35
-rw-r--r--nms-patches/ItemMapEmpty.patch24
-rw-r--r--nms-patches/ItemMinecart.patch16
-rw-r--r--nms-patches/ItemMonsterEgg.patch25
-rw-r--r--nms-patches/ItemStack.patch219
-rw-r--r--nms-patches/ItemWaterLily.patch18
-rw-r--r--nms-patches/ItemWorldMap.patch75
-rw-r--r--nms-patches/JsonList.patch33
-rw-r--r--nms-patches/LoginListener.patch35
-rw-r--r--nms-patches/MethodProfiler.patch135
-rw-r--r--nms-patches/MinecraftServer.patch726
-rw-r--r--nms-patches/MobEffectList.patch74
-rw-r--r--nms-patches/MobSpawnerAbstract.patch38
-rw-r--r--nms-patches/NameReferencingFileConverter.patch76
-rw-r--r--nms-patches/NetworkManager.patch20
-rw-r--r--nms-patches/Packet.patch14
-rw-r--r--nms-patches/PacketDataSerializer.patch122
-rw-r--r--nms-patches/PacketPlayInBlockPlace.patch32
-rw-r--r--nms-patches/PacketPlayInCloseWindow.patch29
-rw-r--r--nms-patches/PacketStatusListener.patch113
-rw-r--r--nms-patches/Path.patch11
-rw-r--r--nms-patches/PathfinderGoalBreakDoor.patch15
-rw-r--r--nms-patches/PathfinderGoalBreed.patch23
-rw-r--r--nms-patches/PathfinderGoalDefendVillage.patch11
-rw-r--r--nms-patches/PathfinderGoalEatTile.patch34
-rw-r--r--nms-patches/PathfinderGoalEndermanPickupBlock.patch17
-rw-r--r--nms-patches/PathfinderGoalEndermanPlaceBlock.patch15
-rw-r--r--nms-patches/PathfinderGoalGhastAttackTarget.patch12
-rw-r--r--nms-patches/PathfinderGoalHurtByTarget.patch19
-rw-r--r--nms-patches/PathfinderGoalMakeLove.patch11
-rw-r--r--nms-patches/PathfinderGoalNearestAttackableTarget.patch11
-rw-r--r--nms-patches/PathfinderGoalNearestAttackableTargetInsentient.patch11
-rw-r--r--nms-patches/PathfinderGoalOwnerHurtByTarget.patch11
-rw-r--r--nms-patches/PathfinderGoalOwnerHurtTarget.patch11
-rw-r--r--nms-patches/PathfinderGoalPanic.patch15
-rw-r--r--nms-patches/PathfinderGoalSelector.patch32
-rw-r--r--nms-patches/PathfinderGoalSilverfishHideInBlock.patch14
-rw-r--r--nms-patches/PathfinderGoalSilverfishWakeOthers.patch14
-rw-r--r--nms-patches/PathfinderGoalSit.patch11
-rw-r--r--nms-patches/PathfinderGoalTame.patch31
-rw-r--r--nms-patches/PathfinderGoalTargetNearestPlayer.patch11
-rw-r--r--nms-patches/PlayerChunk.patch104
-rw-r--r--nms-patches/PlayerChunkMap.patch208
-rw-r--r--nms-patches/PlayerConnection.patch1458
-rw-r--r--nms-patches/PlayerDatFileConverter.patch33
-rw-r--r--nms-patches/PlayerInteractManager.patch289
-rw-r--r--nms-patches/PlayerInventory.patch100
-rw-r--r--nms-patches/PlayerList.patch788
-rw-r--r--nms-patches/PlayerSelector.patch14
-rw-r--r--nms-patches/PortalCreator.patch102
-rw-r--r--nms-patches/PortalTravelAgent.patch273
-rw-r--r--nms-patches/PropertyManager.patch94
-rw-r--r--nms-patches/RecipeArmorDye.patch18
-rw-r--r--nms-patches/RecipeBookClone.patch17
-rw-r--r--nms-patches/RecipeFireworks.patch21
-rw-r--r--nms-patches/RecipeMapClone.patch17
-rw-r--r--nms-patches/RecipeRepair.patch39
-rw-r--r--nms-patches/RecipesBannerInnerClass1.patch17
-rw-r--r--nms-patches/RecipesBannerInnerClass2.patch17
-rw-r--r--nms-patches/RecipesFurnace.patch49
-rw-r--r--nms-patches/RegionFile.patch81
-rw-r--r--nms-patches/RemoteControlCommandListener.patch15
-rw-r--r--nms-patches/ScoreboardServer.patch126
-rw-r--r--nms-patches/SecondaryWorldServer.patch15
-rw-r--r--nms-patches/ShapedRecipes.patch77
-rw-r--r--nms-patches/ShapelessRecipes.patch35
-rw-r--r--nms-patches/SlotFurnaceResult.patch31
-rw-r--r--nms-patches/SpawnerCreature.patch109
-rw-r--r--nms-patches/StatisticManager.patch15
-rw-r--r--nms-patches/SwitchHelperLogVariant.patch9
-rw-r--r--nms-patches/ThreadCommandReader.patch43
-rw-r--r--nms-patches/ThreadPlayerLookupUUID.patch72
-rw-r--r--nms-patches/TileEntity.patch24
-rw-r--r--nms-patches/TileEntityBeacon.patch54
-rw-r--r--nms-patches/TileEntityBrewingStand.patch94
-rw-r--r--nms-patches/TileEntityChest.patch104
-rw-r--r--nms-patches/TileEntityCommandListener.patch10
-rw-r--r--nms-patches/TileEntityDispenser.patch63
-rw-r--r--nms-patches/TileEntityFurnace.patch183
-rw-r--r--nms-patches/TileEntityHopper.patch154
-rw-r--r--nms-patches/TileEntityNote.patch16
-rw-r--r--nms-patches/TileEntityPiston.patch10
-rw-r--r--nms-patches/TileEntityRecordPlayer.patch14
-rw-r--r--nms-patches/TileEntitySkull.patch13
-rw-r--r--nms-patches/Village.patch11
-rw-r--r--nms-patches/VillageSiege.patch11
-rw-r--r--nms-patches/World.patch560
-rw-r--r--nms-patches/WorldBorder.patch25
-rw-r--r--nms-patches/WorldGenGroundBush.patch14
-rw-r--r--nms-patches/WorldGenMegaTreeAbstract.patch11
-rw-r--r--nms-patches/WorldGenVillagePiece.patch11
-rw-r--r--nms-patches/WorldGenVillagePieces.patch0
-rw-r--r--nms-patches/WorldGenWitchHut.patch11
-rw-r--r--nms-patches/WorldManager.patch28
-rw-r--r--nms-patches/WorldMap.patch95
-rw-r--r--nms-patches/WorldMapHumanTracker.patch31
-rw-r--r--nms-patches/WorldNBTStorage.patch123
-rw-r--r--nms-patches/WorldServer.patch550
-rw-r--r--pom.xml31
-rw-r--r--src/main/java/net/minecraft/server/BiomeTheEndDecorator.java28
-rw-r--r--src/main/java/net/minecraft/server/Block.java807
-rw-r--r--src/main/java/net/minecraft/server/BlockActionDataList.java13
-rw-r--r--src/main/java/net/minecraft/server/BlockBloodStone.java27
-rw-r--r--src/main/java/net/minecraft/server/BlockButtonAbstract.java332
-rw-r--r--src/main/java/net/minecraft/server/BlockCactus.java86
-rw-r--r--src/main/java/net/minecraft/server/BlockCake.java98
-rw-r--r--src/main/java/net/minecraft/server/BlockCocoa.java144
-rw-r--r--src/main/java/net/minecraft/server/BlockCommand.java87
-rw-r--r--src/main/java/net/minecraft/server/BlockCrops.java136
-rw-r--r--src/main/java/net/minecraft/server/BlockDaylightDetector.java72
-rw-r--r--src/main/java/net/minecraft/server/BlockDiodeAbstract.java259
-rw-r--r--src/main/java/net/minecraft/server/BlockDispenser.java189
-rw-r--r--src/main/java/net/minecraft/server/BlockDoor.java240
-rw-r--r--src/main/java/net/minecraft/server/BlockDragonEgg.java121
-rw-r--r--src/main/java/net/minecraft/server/BlockDropper.java75
-rw-r--r--src/main/java/net/minecraft/server/BlockEnderPortal.java66
-rw-r--r--src/main/java/net/minecraft/server/BlockFire.java281
-rw-r--r--src/main/java/net/minecraft/server/BlockFlowing.java299
-rw-r--r--src/main/java/net/minecraft/server/BlockGrass.java121
-rw-r--r--src/main/java/net/minecraft/server/BlockHopper.java166
-rw-r--r--src/main/java/net/minecraft/server/BlockIce.java65
-rw-r--r--src/main/java/net/minecraft/server/BlockLeaves.java203
-rw-r--r--src/main/java/net/minecraft/server/BlockLever.java278
-rw-r--r--src/main/java/net/minecraft/server/BlockMinecartDetector.java120
-rw-r--r--src/main/java/net/minecraft/server/BlockMobSpawner.java41
-rw-r--r--src/main/java/net/minecraft/server/BlockMonsterEggs.java121
-rw-r--r--src/main/java/net/minecraft/server/BlockMushroom.java126
-rw-r--r--src/main/java/net/minecraft/server/BlockMycel.java64
-rw-r--r--src/main/java/net/minecraft/server/BlockNetherWart.java62
-rw-r--r--src/main/java/net/minecraft/server/BlockOre.java83
-rw-r--r--src/main/java/net/minecraft/server/BlockPiston.java400
-rw-r--r--src/main/java/net/minecraft/server/BlockPistonExtension.java169
-rw-r--r--src/main/java/net/minecraft/server/BlockPortal.java122
-rw-r--r--src/main/java/net/minecraft/server/BlockPoweredRail.java146
-rw-r--r--src/main/java/net/minecraft/server/BlockPressurePlateAbstract.java174
-rw-r--r--src/main/java/net/minecraft/server/BlockPressurePlateBinary.java74
-rw-r--r--src/main/java/net/minecraft/server/BlockPressurePlateWeighted.java58
-rw-r--r--src/main/java/net/minecraft/server/BlockPumpkin.java98
-rw-r--r--src/main/java/net/minecraft/server/BlockRedstoneLamp.java70
-rw-r--r--src/main/java/net/minecraft/server/BlockRedstoneOre.java155
-rw-r--r--src/main/java/net/minecraft/server/BlockRedstoneTorch.java176
-rw-r--r--src/main/java/net/minecraft/server/BlockRedstoneWire.java323
-rw-r--r--src/main/java/net/minecraft/server/BlockReed.java81
-rw-r--r--src/main/java/net/minecraft/server/BlockSapling.java203
-rw-r--r--src/main/java/net/minecraft/server/BlockSign.java127
-rw-r--r--src/main/java/net/minecraft/server/BlockSkull.java244
-rw-r--r--src/main/java/net/minecraft/server/BlockSnow.java93
-rw-r--r--src/main/java/net/minecraft/server/BlockSoil.java121
-rw-r--r--src/main/java/net/minecraft/server/BlockStationary.java93
-rw-r--r--src/main/java/net/minecraft/server/BlockStem.java190
-rw-r--r--src/main/java/net/minecraft/server/BlockTallPlant.java160
-rw-r--r--src/main/java/net/minecraft/server/BlockTrapdoor.java212
-rw-r--r--src/main/java/net/minecraft/server/BlockTripwire.java201
-rw-r--r--src/main/java/net/minecraft/server/BlockTripwireHook.java300
-rw-r--r--src/main/java/net/minecraft/server/BlockVine.java304
-rw-r--r--src/main/java/net/minecraft/server/Chunk.java1093
-rw-r--r--src/main/java/net/minecraft/server/ChunkProviderServer.java399
-rw-r--r--src/main/java/net/minecraft/server/ChunkRegionLoader.java406
-rw-r--r--src/main/java/net/minecraft/server/ChunkSection.java488
-rw-r--r--src/main/java/net/minecraft/server/ClientCommandOrdinalWrapper.java27
-rw-r--r--src/main/java/net/minecraft/server/CommandBlockListenerAbstract.java230
-rw-r--r--src/main/java/net/minecraft/server/Container.java615
-rw-r--r--src/main/java/net/minecraft/server/ContainerAnvil.java400
-rw-r--r--src/main/java/net/minecraft/server/ContainerAnvilInventory.java58
-rw-r--r--src/main/java/net/minecraft/server/ContainerBeacon.java114
-rw-r--r--src/main/java/net/minecraft/server/ContainerBrewingStand.java126
-rw-r--r--src/main/java/net/minecraft/server/ContainerChest.java104
-rw-r--r--src/main/java/net/minecraft/server/ContainerDispenser.java91
-rw-r--r--src/main/java/net/minecraft/server/ContainerEnchantTable.java284
-rw-r--r--src/main/java/net/minecraft/server/ContainerEnchantTableInventory.java57
-rw-r--r--src/main/java/net/minecraft/server/ContainerFurnace.java135
-rw-r--r--src/main/java/net/minecraft/server/ContainerHopper.java85
-rw-r--r--src/main/java/net/minecraft/server/ContainerHorse.java104
-rw-r--r--src/main/java/net/minecraft/server/ContainerMerchant.java131
-rw-r--r--src/main/java/net/minecraft/server/ContainerPlayer.java157
-rw-r--r--src/main/java/net/minecraft/server/ContainerWorkbench.java145
-rw-r--r--src/main/java/net/minecraft/server/ControllerLook.java87
-rw-r--r--src/main/java/net/minecraft/server/ControllerMove.java71
-rw-r--r--src/main/java/net/minecraft/server/CraftingManager.java313
-rw-r--r--src/main/java/net/minecraft/server/CrashReport.java235
-rw-r--r--src/main/java/net/minecraft/server/DedicatedServer.java472
-rw-r--r--src/main/java/net/minecraft/server/DispenseBehaviorArmor.java67
-rw-r--r--src/main/java/net/minecraft/server/DispenseBehaviorBoat.java73
-rw-r--r--src/main/java/net/minecraft/server/DispenseBehaviorBonemeal.java67
-rw-r--r--src/main/java/net/minecraft/server/DispenseBehaviorEmptyBucket.java68
-rw-r--r--src/main/java/net/minecraft/server/DispenseBehaviorFilledBucket.java69
-rw-r--r--src/main/java/net/minecraft/server/DispenseBehaviorFireball.java65
-rw-r--r--src/main/java/net/minecraft/server/DispenseBehaviorFireworks.java58
-rw-r--r--src/main/java/net/minecraft/server/DispenseBehaviorFlintAndSteel.java71
-rw-r--r--src/main/java/net/minecraft/server/DispenseBehaviorItem.java98
-rw-r--r--src/main/java/net/minecraft/server/DispenseBehaviorMinecart.java78
-rw-r--r--src/main/java/net/minecraft/server/DispenseBehaviorMonsterEgg.java57
-rw-r--r--src/main/java/net/minecraft/server/DispenseBehaviorProjectile.java66
-rw-r--r--src/main/java/net/minecraft/server/DispenseBehaviorTNT.java52
-rw-r--r--src/main/java/net/minecraft/server/Enchantment.java122
-rw-r--r--src/main/java/net/minecraft/server/Entity.java1892
-rw-r--r--src/main/java/net/minecraft/server/EntityAgeable.java124
-rw-r--r--src/main/java/net/minecraft/server/EntityArrow.java462
-rw-r--r--src/main/java/net/minecraft/server/EntityBoat.java498
-rw-r--r--src/main/java/net/minecraft/server/EntityChicken.java158
-rw-r--r--src/main/java/net/minecraft/server/EntityCow.java110
-rw-r--r--src/main/java/net/minecraft/server/EntityCreature.java313
-rw-r--r--src/main/java/net/minecraft/server/EntityCreeper.java228
-rw-r--r--src/main/java/net/minecraft/server/EntityDamageSourceIndirect.java34
-rw-r--r--src/main/java/net/minecraft/server/EntityEgg.java68
-rw-r--r--src/main/java/net/minecraft/server/EntityEnderCrystal.java88
-rw-r--r--src/main/java/net/minecraft/server/EntityEnderDragon.java682
-rw-r--r--src/main/java/net/minecraft/server/EntityEnderPearl.java60
-rw-r--r--src/main/java/net/minecraft/server/EntityEnderman.java382
-rw-r--r--src/main/java/net/minecraft/server/EntityExperienceOrb.java188
-rw-r--r--src/main/java/net/minecraft/server/EntityFallingBlock.java233
-rw-r--r--src/main/java/net/minecraft/server/EntityFireball.java269
-rw-r--r--src/main/java/net/minecraft/server/EntityFireworks.java121
-rw-r--r--src/main/java/net/minecraft/server/EntityFishingHook.java475
-rw-r--r--src/main/java/net/minecraft/server/EntityGhast.java238
-rw-r--r--src/main/java/net/minecraft/server/EntityHanging.java340
-rw-r--r--src/main/java/net/minecraft/server/EntityHorse.java1226
-rw-r--r--src/main/java/net/minecraft/server/EntityHuman.java1599
-rw-r--r--src/main/java/net/minecraft/server/EntityInsentient.java892
-rw-r--r--src/main/java/net/minecraft/server/EntityIronGolem.java190
-rw-r--r--src/main/java/net/minecraft/server/EntityItem.java341
-rw-r--r--src/main/java/net/minecraft/server/EntityItemFrame.java152
-rw-r--r--src/main/java/net/minecraft/server/EntityLargeFireball.java49
-rw-r--r--src/main/java/net/minecraft/server/EntityLeash.java137
-rw-r--r--src/main/java/net/minecraft/server/EntityLightning.java133
-rw-r--r--src/main/java/net/minecraft/server/EntityLiving.java1720
-rw-r--r--src/main/java/net/minecraft/server/EntityMinecartAbstract.java882
-rw-r--r--src/main/java/net/minecraft/server/EntityMinecartCommandBlockListener.java25
-rw-r--r--src/main/java/net/minecraft/server/EntityMinecartContainer.java243
-rw-r--r--src/main/java/net/minecraft/server/EntityMonster.java177
-rw-r--r--src/main/java/net/minecraft/server/EntityMushroomCow.java72
-rw-r--r--src/main/java/net/minecraft/server/EntityOcelot.java232
-rw-r--r--src/main/java/net/minecraft/server/EntityPainting.java81
-rw-r--r--src/main/java/net/minecraft/server/EntityPig.java159
-rw-r--r--src/main/java/net/minecraft/server/EntityPigZombie.java160
-rw-r--r--src/main/java/net/minecraft/server/EntityPlayer.java1112
-rw-r--r--src/main/java/net/minecraft/server/EntityPotion.java157
-rw-r--r--src/main/java/net/minecraft/server/EntityProjectile.java249
-rw-r--r--src/main/java/net/minecraft/server/EntitySheep.java219
-rw-r--r--src/main/java/net/minecraft/server/EntitySilverfish.java171
-rw-r--r--src/main/java/net/minecraft/server/EntitySkeleton.java294
-rw-r--r--src/main/java/net/minecraft/server/EntitySlime.java265
-rw-r--r--src/main/java/net/minecraft/server/EntitySmallFireball.java85
-rw-r--r--src/main/java/net/minecraft/server/EntitySnowman.java89
-rw-r--r--src/main/java/net/minecraft/server/EntitySpider.java162
-rw-r--r--src/main/java/net/minecraft/server/EntitySquid.java151
-rw-r--r--src/main/java/net/minecraft/server/EntityTNTPrimed.java98
-rw-r--r--src/main/java/net/minecraft/server/EntityThrownExpBottle.java53
-rw-r--r--src/main/java/net/minecraft/server/EntityTracker.java211
-rw-r--r--src/main/java/net/minecraft/server/EntityTrackerEntry.java523
-rw-r--r--src/main/java/net/minecraft/server/EntityWither.java477
-rw-r--r--src/main/java/net/minecraft/server/EntityWitherSkull.java93
-rw-r--r--src/main/java/net/minecraft/server/EntityWolf.java379
-rw-r--r--src/main/java/net/minecraft/server/EntityZombie.java524
-rw-r--r--src/main/java/net/minecraft/server/ExpirableListEntry.java95
-rw-r--r--src/main/java/net/minecraft/server/Explosion.java269
-rw-r--r--src/main/java/net/minecraft/server/FileConversionException.java22
-rw-r--r--src/main/java/net/minecraft/server/FoodMetaData.java116
-rw-r--r--src/main/java/net/minecraft/server/GroupDataZombie.java21
-rw-r--r--src/main/java/net/minecraft/server/HandshakeListener.java99
-rw-r--r--src/main/java/net/minecraft/server/IDataManager.java28
-rw-r--r--src/main/java/net/minecraft/server/IInventory.java48
-rw-r--r--src/main/java/net/minecraft/server/IRecipe.java14
-rw-r--r--src/main/java/net/minecraft/server/IntHashMap.java167
-rw-r--r--src/main/java/net/minecraft/server/InventoryCraftResult.java96
-rw-r--r--src/main/java/net/minecraft/server/InventoryCrafting.java149
-rw-r--r--src/main/java/net/minecraft/server/InventoryEnderChest.java110
-rw-r--r--src/main/java/net/minecraft/server/InventoryHorseChest.java60
-rw-r--r--src/main/java/net/minecraft/server/InventoryLargeChest.java129
-rw-r--r--src/main/java/net/minecraft/server/InventoryMerchant.java192
-rw-r--r--src/main/java/net/minecraft/server/InventorySubcontainer.java120
-rw-r--r--src/main/java/net/minecraft/server/Item.java503
-rw-r--r--src/main/java/net/minecraft/server/ItemBoat.java93
-rw-r--r--src/main/java/net/minecraft/server/ItemBow.java109
-rw-r--r--src/main/java/net/minecraft/server/ItemBucket.java171
-rw-r--r--src/main/java/net/minecraft/server/ItemDye.java129
-rw-r--r--src/main/java/net/minecraft/server/ItemFireball.java67
-rw-r--r--src/main/java/net/minecraft/server/ItemFishingRod.java47
-rw-r--r--src/main/java/net/minecraft/server/ItemFlintAndSteel.java72
-rw-r--r--src/main/java/net/minecraft/server/ItemHanging.java67
-rw-r--r--src/main/java/net/minecraft/server/ItemLeash.java70
-rw-r--r--src/main/java/net/minecraft/server/ItemMapEmpty.java37
-rw-r--r--src/main/java/net/minecraft/server/ItemMinecart.java40
-rw-r--r--src/main/java/net/minecraft/server/ItemMonsterEgg.java124
-rw-r--r--src/main/java/net/minecraft/server/ItemStack.java593
-rw-r--r--src/main/java/net/minecraft/server/ItemWaterLily.java48
-rw-r--r--src/main/java/net/minecraft/server/ItemWorldMap.java231
-rw-r--r--src/main/java/net/minecraft/server/JsonList.java166
-rw-r--r--src/main/java/net/minecraft/server/JsonListEntry.java26
-rw-r--r--src/main/java/net/minecraft/server/JsonListEntrySerializer.java51
-rw-r--r--src/main/java/net/minecraft/server/LoginListener.java151
-rw-r--r--src/main/java/net/minecraft/server/MethodProfiler.java24
-rw-r--r--src/main/java/net/minecraft/server/MinecraftServer.java1321
-rw-r--r--src/main/java/net/minecraft/server/MobEffectList.java231
-rw-r--r--src/main/java/net/minecraft/server/MobSpawnerAbstract.java286
-rw-r--r--src/main/java/net/minecraft/server/NameReferencingFileConverter.java402
-rw-r--r--src/main/java/net/minecraft/server/NetworkManager.java210
-rw-r--r--src/main/java/net/minecraft/server/Packet.java63
-rw-r--r--src/main/java/net/minecraft/server/PacketDataSerializer.java726
-rw-r--r--src/main/java/net/minecraft/server/PacketHandshakingInSetProtocol.java47
-rw-r--r--src/main/java/net/minecraft/server/PacketPlayInChat.java49
-rw-r--r--src/main/java/net/minecraft/server/PacketPlayInCloseWindow.java29
-rw-r--r--src/main/java/net/minecraft/server/PacketPlayInCustomPayload.java45
-rw-r--r--src/main/java/net/minecraft/server/PacketPlayOutBlockChange.java48
-rw-r--r--src/main/java/net/minecraft/server/PacketPlayOutMapChunkBulk.java190
-rw-r--r--src/main/java/net/minecraft/server/PacketPlayOutNamedEntitySpawn.java102
-rw-r--r--src/main/java/net/minecraft/server/PacketPlayOutSpawnPosition.java44
-rw-r--r--src/main/java/net/minecraft/server/PacketStatusListener.java128
-rw-r--r--src/main/java/net/minecraft/server/Path.java128
-rw-r--r--src/main/java/net/minecraft/server/PathfinderGoalArrowAttack.java105
-rw-r--r--src/main/java/net/minecraft/server/PathfinderGoalBreakDoor.java59
-rw-r--r--src/main/java/net/minecraft/server/PathfinderGoalBreed.java112
-rw-r--r--src/main/java/net/minecraft/server/PathfinderGoalEatTile.java75
-rw-r--r--src/main/java/net/minecraft/server/PathfinderGoalHurtByTarget.java48
-rw-r--r--src/main/java/net/minecraft/server/PathfinderGoalMakeLove.java90
-rw-r--r--src/main/java/net/minecraft/server/PathfinderGoalMeleeAttack.java103
-rw-r--r--src/main/java/net/minecraft/server/PathfinderGoalOcelotAttack.java63
-rw-r--r--src/main/java/net/minecraft/server/PathfinderGoalPanic.java47
-rw-r--r--src/main/java/net/minecraft/server/PathfinderGoalSelector.java153
-rw-r--r--src/main/java/net/minecraft/server/PathfinderGoalSit.java39
-rw-r--r--src/main/java/net/minecraft/server/PathfinderGoalTame.java72
-rw-r--r--src/main/java/net/minecraft/server/PathfinderGoalTarget.java165
-rw-r--r--src/main/java/net/minecraft/server/PlayerAbilities.java54
-rw-r--r--src/main/java/net/minecraft/server/PlayerChunk.java215
-rw-r--r--src/main/java/net/minecraft/server/PlayerChunkMap.java371
-rw-r--r--src/main/java/net/minecraft/server/PlayerConnection.java1855
-rw-r--r--src/main/java/net/minecraft/server/PlayerDatFileConverter.java98
-rw-r--r--src/main/java/net/minecraft/server/PlayerInteractManager.java411
-rw-r--r--src/main/java/net/minecraft/server/PlayerInventory.java539
-rw-r--r--src/main/java/net/minecraft/server/PlayerList.java1216
-rw-r--r--src/main/java/net/minecraft/server/PlayerSelector.java247
-rw-r--r--src/main/java/net/minecraft/server/PortalCreator.java197
-rw-r--r--src/main/java/net/minecraft/server/PortalTravelAgent.java533
-rw-r--r--src/main/java/net/minecraft/server/PropertyManager.java130
-rw-r--r--src/main/java/net/minecraft/server/ProtocolOrdinalWrapper.java21
-rw-r--r--src/main/java/net/minecraft/server/QueuedPacket.java23
-rw-r--r--src/main/java/net/minecraft/server/RecipeArmorDye.java124
-rw-r--r--src/main/java/net/minecraft/server/RecipeBookClone.java68
-rw-r--r--src/main/java/net/minecraft/server/RecipeFireworks.java176
-rw-r--r--src/main/java/net/minecraft/server/RecipeMapClone.java82
-rw-r--r--src/main/java/net/minecraft/server/RecipesFurnace.java121
-rw-r--r--src/main/java/net/minecraft/server/RegionFile.java289
-rw-r--r--src/main/java/net/minecraft/server/RemoteControlCommandListener.java47
-rw-r--r--src/main/java/net/minecraft/server/ScoreboardServer.java222
-rw-r--r--src/main/java/net/minecraft/server/SecondaryWorldServer.java14
-rw-r--r--src/main/java/net/minecraft/server/ShapedRecipes.java159
-rw-r--r--src/main/java/net/minecraft/server/ShapelessRecipes.java78
-rw-r--r--src/main/java/net/minecraft/server/Slot.java74
-rw-r--r--src/main/java/net/minecraft/server/SlotFurnaceResult.java85
-rw-r--r--src/main/java/net/minecraft/server/SpawnerCreature.java255
-rw-r--r--src/main/java/net/minecraft/server/StatisticManager.java68
-rw-r--r--src/main/java/net/minecraft/server/ThreadCommandReader.java45
-rw-r--r--src/main/java/net/minecraft/server/ThreadPlayerLookupUUID.java96
-rw-r--r--src/main/java/net/minecraft/server/TileEntity.java183
-rw-r--r--src/main/java/net/minecraft/server/TileEntityBeacon.java276
-rw-r--r--src/main/java/net/minecraft/server/TileEntityBrewingStand.java297
-rw-r--r--src/main/java/net/minecraft/server/TileEntityChest.java410
-rw-r--r--src/main/java/net/minecraft/server/TileEntityCommandListener.java29
-rw-r--r--src/main/java/net/minecraft/server/TileEntityDispenser.java188
-rw-r--r--src/main/java/net/minecraft/server/TileEntityFurnace.java343
-rw-r--r--src/main/java/net/minecraft/server/TileEntityHopper.java584
-rw-r--r--src/main/java/net/minecraft/server/TileEntityNote.java61
-rw-r--r--src/main/java/net/minecraft/server/TileEntityPiston.java132
-rw-r--r--src/main/java/net/minecraft/server/TileEntityRecordPlayer.java40
-rw-r--r--src/main/java/net/minecraft/server/TileEntitySign.java63
-rw-r--r--src/main/java/net/minecraft/server/TileEntitySkull.java97
-rw-r--r--src/main/java/net/minecraft/server/Village.java446
-rw-r--r--src/main/java/net/minecraft/server/VillageSiege.java172
-rw-r--r--src/main/java/net/minecraft/server/World.java2873
-rw-r--r--src/main/java/net/minecraft/server/WorldGenBigTree.java372
-rw-r--r--src/main/java/net/minecraft/server/WorldGenGroundBush.java53
-rw-r--r--src/main/java/net/minecraft/server/WorldGenMegaTreeAbstract.java126
-rw-r--r--src/main/java/net/minecraft/server/WorldGenVillagePiece.java189
-rw-r--r--src/main/java/net/minecraft/server/WorldGenVillagePieces.java199
-rw-r--r--src/main/java/net/minecraft/server/WorldGenWitchHut.java87
-rw-r--r--src/main/java/net/minecraft/server/WorldManager.java73
-rw-r--r--src/main/java/net/minecraft/server/WorldMap.java243
-rw-r--r--src/main/java/net/minecraft/server/WorldMapHumanTracker.java103
-rw-r--r--src/main/java/net/minecraft/server/WorldNBTStorage.java310
-rw-r--r--src/main/java/net/minecraft/server/WorldServer.java1006
-rw-r--r--src/main/java/org/bukkit/craftbukkit/CraftArt.java12
-rw-r--r--src/main/java/org/bukkit/craftbukkit/CraftChunk.java62
-rw-r--r--src/main/java/org/bukkit/craftbukkit/CraftOfflinePlayer.java2
-rw-r--r--src/main/java/org/bukkit/craftbukkit/CraftProfileBanEntry.java2
-rw-r--r--src/main/java/org/bukkit/craftbukkit/CraftProfileBanList.java2
-rw-r--r--src/main/java/org/bukkit/craftbukkit/CraftServer.java200
-rw-r--r--src/main/java/org/bukkit/craftbukkit/CraftStatistic.java16
-rw-r--r--src/main/java/org/bukkit/craftbukkit/CraftTravelAgent.java15
-rw-r--r--src/main/java/org/bukkit/craftbukkit/CraftWorld.java86
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/CraftBanner.java105
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/CraftBlock.java119
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/CraftBlockState.java3
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/CraftChest.java9
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/CraftDispenser.java3
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/CraftDropper.java3
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/CraftJukebox.java15
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/CraftNoteBlock.java7
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/CraftSign.java30
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/CraftSkull.java4
-rw-r--r--src/main/java/org/bukkit/craftbukkit/chunkio/ChunkIOProvider.java6
-rw-r--r--src/main/java/org/bukkit/craftbukkit/command/CraftBlockCommandSender.java2
-rw-r--r--src/main/java/org/bukkit/craftbukkit/command/CraftRemoteConsoleCommandSender.java3
-rw-r--r--src/main/java/org/bukkit/craftbukkit/command/VanillaCommandWrapper.java68
-rw-r--r--src/main/java/org/bukkit/craftbukkit/entity/CraftArmorStand.java214
-rw-r--r--src/main/java/org/bukkit/craftbukkit/entity/CraftArrow.java2
-rw-r--r--src/main/java/org/bukkit/craftbukkit/entity/CraftCreature.java13
-rw-r--r--src/main/java/org/bukkit/craftbukkit/entity/CraftEnderman.java7
-rw-r--r--src/main/java/org/bukkit/craftbukkit/entity/CraftEndermite.java23
-rw-r--r--src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java50
-rw-r--r--src/main/java/org/bukkit/craftbukkit/entity/CraftFallingSand.java4
-rw-r--r--src/main/java/org/bukkit/craftbukkit/entity/CraftFish.java3
-rw-r--r--src/main/java/org/bukkit/craftbukkit/entity/CraftGuardian.java23
-rw-r--r--src/main/java/org/bukkit/craftbukkit/entity/CraftHanging.java29
-rw-r--r--src/main/java/org/bukkit/craftbukkit/entity/CraftHorse.java2
-rw-r--r--src/main/java/org/bukkit/craftbukkit/entity/CraftHumanEntity.java45
-rw-r--r--src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java49
-rw-r--r--src/main/java/org/bukkit/craftbukkit/entity/CraftPainting.java4
-rw-r--r--src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java140
-rw-r--r--src/main/java/org/bukkit/craftbukkit/entity/CraftRabbit.java23
-rw-r--r--src/main/java/org/bukkit/craftbukkit/entity/CraftSheep.java5
-rw-r--r--src/main/java/org/bukkit/craftbukkit/entity/CraftTameableAnimal.java2
-rw-r--r--src/main/java/org/bukkit/craftbukkit/entity/CraftVillager.java10
-rw-r--r--src/main/java/org/bukkit/craftbukkit/entity/CraftWaterMob.java3
-rw-r--r--src/main/java/org/bukkit/craftbukkit/entity/CraftWolf.java5
-rw-r--r--src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java63
-rw-r--r--src/main/java/org/bukkit/craftbukkit/generator/CustomChunkGenerator.java70
-rw-r--r--src/main/java/org/bukkit/craftbukkit/generator/NormalChunkGenerator.java48
-rw-r--r--src/main/java/org/bukkit/craftbukkit/inventory/CraftContainer.java36
-rw-r--r--src/main/java/org/bukkit/craftbukkit/inventory/CraftInventory.java9
-rw-r--r--src/main/java/org/bukkit/craftbukkit/inventory/CraftInventoryCrafting.java2
-rw-r--r--src/main/java/org/bukkit/craftbukkit/inventory/CraftInventoryCustom.java59
-rw-r--r--src/main/java/org/bukkit/craftbukkit/inventory/CraftInventoryDoubleChest.java4
-rw-r--r--src/main/java/org/bukkit/craftbukkit/inventory/CraftInventoryEnchanting.java12
-rw-r--r--src/main/java/org/bukkit/craftbukkit/inventory/CraftItemFactory.java2
-rw-r--r--src/main/java/org/bukkit/craftbukkit/inventory/CraftItemStack.java38
-rw-r--r--src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaBanner.java196
-rw-r--r--src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaBook.java51
-rw-r--r--src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaCharge.java5
-rw-r--r--src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaSkull.java3
-rw-r--r--src/main/java/org/bukkit/craftbukkit/map/CraftMapCanvas.java2
-rw-r--r--src/main/java/org/bukkit/craftbukkit/map/CraftMapRenderer.java7
-rw-r--r--src/main/java/org/bukkit/craftbukkit/projectiles/CraftBlockProjectileSource.java24
-rw-r--r--src/main/java/org/bukkit/craftbukkit/scoreboard/CraftCriteria.java3
-rw-r--r--src/main/java/org/bukkit/craftbukkit/scoreboard/CraftScoreboard.java8
-rw-r--r--src/main/java/org/bukkit/craftbukkit/updater/ArtifactDetails.java128
-rw-r--r--src/main/java/org/bukkit/craftbukkit/updater/AutoUpdater.java127
-rw-r--r--src/main/java/org/bukkit/craftbukkit/updater/BukkitDLUpdaterService.java102
-rw-r--r--src/main/java/org/bukkit/craftbukkit/util/BlockStateListPopulator.java7
-rw-r--r--src/main/java/org/bukkit/craftbukkit/util/CraftChatMessage.java45
-rw-r--r--src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java11
-rw-r--r--src/main/java/org/bukkit/craftbukkit/util/LazyPlayerSet.java50
-rw-r--r--src/main/java/org/bukkit/craftbukkit/util/MojangNameLookup.java6
-rw-r--r--src/main/java/org/bukkit/craftbukkit/util/TerminalConsoleWriterThread.java2
-rw-r--r--src/main/resources/configurations/bukkit.yml7
-rw-r--r--src/test/java/org/bukkit/DyeColorsTest.java5
-rw-r--r--src/test/java/org/bukkit/PerMaterialTest.java11
-rw-r--r--src/test/java/org/bukkit/craftbukkit/inventory/ItemMetaTest.java14
-rw-r--r--src/test/java/org/bukkit/craftbukkit/updater/BukkitDLUpdaterServiceTest.java32
-rw-r--r--src/test/java/org/bukkit/support/AbstractTestingBase.java55
-rw-r--r--src/test/java/org/bukkit/support/DummyEnchantments.java2
628 files changed, 22150 insertions, 65097 deletions
diff --git a/.gitignore b/.gitignore
index c3faf577..73c16b1d 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 00000000..771e39f8
--- /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 00000000..6c957c2a
--- /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 00000000..fc44dc75
--- /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 00000000..82233f90
--- /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 00000000..b41c8016
--- /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 00000000..7159a89e
--- /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 00000000..facc1d4f
--- /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 00000000..40006fff
--- /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 00000000..e7fe808d
--- /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 00000000..fde60f42
--- /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 00000000..7f37a071
--- /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 00000000..f0c210d8
--- /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 00000000..35ad0d58
--- /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 00000000..a14fff0f
--- /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 00000000..d2415b9b
--- /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 00000000..43df579c
--- /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 00000000..ae5743c2
--- /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 00000000..0abc00c0
--- /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 00000000..84b3101d
--- /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 00000000..b52f01fd
--- /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 00000000..91033f00
--- /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 00000000..067c5808
--- /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 00000000..fa9482b1
--- /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 00000000..4e33f431
--- /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 00000000..5be7f790
--- /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 00000000..9260842f
--- /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 00000000..5f2477b7
--- /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 00000000..0a0bd4fb
--- /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 00000000..c6f458eb
--- /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 00000000..473fcbaf
--- /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 00000000..816eebdc
--- /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<org.bukkit.block.Block> blocks = new AbstractList<org.bukkit.block.Block>() {
++
++ @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 00000000..d575fc78
--- /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 00000000..a43bdf22
--- /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 00000000..a226e9c4
--- /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 00000000..a1d38a16
--- /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 00000000..bd07b6a6
--- /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 00000000..abf3e858
--- /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 00000000..66c81280
--- /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 00000000..fcc0a637
--- /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 00000000..60516593
--- /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 00000000..79e7b08f
--- /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 00000000..667af180
--- /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 00000000..5212c9d9
--- /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<BlockState> blocks = (List<BlockState>) 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 00000000..0bebb84d
--- /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 00000000..5727d5a5
--- /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 00000000..cd0c3d50
--- /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 00000000..5ffd0a2e
--- /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 00000000..b20e09ca
--- /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 00000000..8b2992a9
--- /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 00000000..f3954aa5
--- /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 00000000..d4da9326
--- /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 00000000..5e920272
--- /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 00000000..d2f4392f
--- /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<Entity> newList = Lists.newArrayList(this.entitySlices[i]);
++ java.util.Iterator<Entity> 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 00000000..bbe662e2
--- /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<Chunk> chunks = new LongObjectHashMap<Chunk>();
++ 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 00000000..35c373ed
--- /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 00000000..4063d6cc
--- /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 00000000..c49fad99
--- /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<String[]> commands = new ArrayList<String[]>();
++
++ // 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<EntityPlayer>)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<String[]> newCommands = new ArrayList<String[]>();
++ 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<String[]> 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<String[]> buildCommands(String[] args, int pos) {
++ ArrayList<String[]> commands = new ArrayList<String[]>();
++ EntityPlayer[] players = ((java.util.List<EntityPlayer>)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 00000000..4891ecc5
--- /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<Integer, ItemStack> draggedSlots = new HashMap<Integer, ItemStack>(); // 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<Integer, org.bukkit.inventory.ItemStack> eventmap = new HashMap<Integer, org.bukkit.inventory.ItemStack>();
++ for (Map.Entry<Integer, ItemStack> 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<Integer, ItemStack> 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 00000000..1c0c583a
--- /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 00000000..16649334
--- /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<HumanEntity> transaction = new java.util.ArrayList<HumanEntity>();
++ 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<HumanEntity> 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 00000000..178e143c
--- /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 00000000..b7aba135
--- /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 00000000..7021c61b
--- /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 00000000..cee54779
--- /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 00000000..f2d866d8
--- /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<WeightedRandomEnchant>();
++ }
++ // CraftBukkit end
+ boolean flag = itemstack.getItem() == Items.BOOK;
+
+ if (list != null) {
+- entityhuman.b(j);
++ // CraftBukkit start
++ Map<org.bukkit.enchantments.Enchantment, Integer> enchants = new java.util.HashMap<org.bukkit.enchantments.Enchantment, Integer>();
++ 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<org.bukkit.enchantments.Enchantment, Integer> 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 00000000..f2f80b3e
--- /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<HumanEntity> transaction = new java.util.ArrayList<HumanEntity>();
++ 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<HumanEntity> 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 00000000..b299ee20
--- /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 00000000..4654d33a
--- /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 00000000..9c9fa57a
--- /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 00000000..d62ffe9e
--- /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 00000000..8b2c347b
--- /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 00000000..045167c1
--- /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 00000000..212d063e
--- /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 00000000..9963db77
--- /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 00000000..8d0f4bde
--- /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 00000000..3518bd3e
--- /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 00000000..814b166b
--- /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 00000000..6c420e65
--- /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 00000000..19daf555
--- /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 00000000..32cea5b7
--- /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 00000000..9727c367
--- /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 00000000..e3bcc62e
--- /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 00000000..1d21873f
--- /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 00000000..26ab2df0
--- /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 00000000..b902b835
--- /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 00000000..454c15b7
--- /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 00000000..56a05a54
--- /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 00000000..b4e7083b
--- /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 00000000..1dd1d42c
--- /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 00000000..8b09c515
--- /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 00000000..95a7509b
--- /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 00000000..f1fe109b
--- /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 00000000..2912f97b
--- /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 00000000..6ab202bf
--- /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 00000000..07602829
--- /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 00000000..c8aafbcc
--- /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 00000000..f9d70d5e
--- /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 00000000..47e72258
--- /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 00000000..efcfd591
--- /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 00000000..9b51e766
--- /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 00000000..0bf41baa
--- /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 00000000..a58d2f8f
--- /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<org.bukkit.block.Block> destroyedBlocks = new java.util.ArrayList<org.bukkit.block.Block>();
++ 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<EntityPlayer>) 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 00000000..de13eefd
--- /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 00000000..1fb9b606
--- /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 00000000..0f389895
--- /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 00000000..2b53c264
--- /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 00000000..67022e16
--- /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 00000000..b2a015b8
--- /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 00000000..d65c6dd9
--- /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 00000000..f4ff42d0
--- /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 00000000..185b52b4
--- /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<ScoreboardScore> collection = this.world.getServer().getScoreboardManager().getScoreboardScores(IScoreboardCriteria.e, this.getName(), new java.util.ArrayList<ScoreboardScore>());
++
+
+ 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 00000000..17867b8d
--- /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 00000000..e71334e1
--- /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 00000000..0873e363
--- /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 00000000..1ae52fd2
--- /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 00000000..2e14fc4d
--- /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 00000000..65d979ac
--- /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 00000000..7e8633d2
--- /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<EntityPlayer>) 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 00000000..880a5b32
--- /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<org.bukkit.inventory.ItemStack> 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<org.bukkit.inventory.ItemStack>(); // 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<Double, Double> hardHat = new Function<Double, Double>() {
++ @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<Double, Double> blocking = new Function<Double, Double>() {
++ @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<Double, Double> armor = new Function<Double, Double>() {
++ @Override
++ public Double apply(Double f) {
++ return -(f - EntityLiving.this.applyArmorModifier(damagesource, f.floatValue()));
++ }
++ };
++ float armorModifier = armor.apply((double) f).floatValue();
++ f += armorModifier;
++
++ Function<Double, Double> resistance = new Function<Double, Double>() {
++ @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<Double, Double> magic = new Function<Double, Double>() {
++ @Override
++ public Double apply(Double f) {
++ return -(f - EntityLiving.this.applyMagicModifier(damagesource, f.floatValue()));
++ }
++ };
++ float magicModifier = magic.apply((double) f).floatValue();
++ f += magicModifier;
++
++ Function<Double, Double> absorption = new Function<Double, Double>() {
++ @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 00000000..c8ed3d56
--- /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 00000000..ccfa4973
--- /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 00000000..3a7c0c58
--- /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<HumanEntity> transaction = new java.util.ArrayList<HumanEntity>();
++ 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<HumanEntity> 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 00000000..f5500fac
--- /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 00000000..2d2507ed
--- /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 00000000..1abf343c
--- /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 00000000..7c698b4f
--- /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 00000000..064655a7
--- /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 00000000..e63348a0
--- /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<org.bukkit.inventory.ItemStack> loot = new java.util.ArrayList<org.bukkit.inventory.ItemStack>();
++ 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<ScoreboardScore>());
+ 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 00000000..fd9e7d33
--- /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<LivingEntity, Double> affected = new HashMap<LivingEntity, Double>();
+
+ 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 00000000..bd4789e6
--- /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 00000000..b1737592
--- /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 00000000..fe603518
--- /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 00000000..02d48970
--- /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 00000000..7d2e7589
--- /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 00000000..67e4371f
--- /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 00000000..c9c70dc8
--- /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 00000000..83d481ae
--- /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 00000000..96c3399a
--- /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 00000000..c6b40039
--- /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 00000000..9d0f38de
--- /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 00000000..e2b327ae
--- /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 00000000..7caa58e9
--- /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<EntityPlayer>) 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 00000000..1428bf51
--- /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 00000000..1621a484
--- /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 00000000..634ca939
--- /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 00000000..6bb3d391
--- /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 00000000..3d0b5b84
--- /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<org.bukkit.block.Block> 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 00000000..bfd974b3
--- /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 00000000..651b7fee
--- /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<InetAddress, Long> throttleTracker = new HashMap<InetAddress, Long>();
++ 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<InetAddress, Long> 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 00000000..0c8a3723
--- /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 00000000..d65dcde8
--- /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<org.bukkit.entity.HumanEntity> 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 00000000..cdc66801
--- /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 00000000..af51f97f
--- /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<HumanEntity> getViewers() {
++ return new java.util.ArrayList<HumanEntity>();
++ }
++
++ 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 00000000..84e27a99
--- /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<HumanEntity> transaction = new java.util.ArrayList<HumanEntity>();
++ 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<HumanEntity> 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 00000000..ee181fb3
--- /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<HumanEntity> transaction = new java.util.ArrayList<HumanEntity>();
++ 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<HumanEntity> 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 00000000..4146987e
--- /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<HumanEntity> transaction = new java.util.ArrayList<HumanEntity>();
++ 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<HumanEntity> 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 00000000..2e1b2eaa
--- /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<HumanEntity> transaction = new java.util.ArrayList<HumanEntity>();
++
++ 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<HumanEntity> 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 00000000..bc24b3dc
--- /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<HumanEntity> transaction = new java.util.ArrayList<HumanEntity>();
++ 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<HumanEntity> 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 00000000..ddacf613
--- /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<HumanEntity> transaction = new java.util.ArrayList<HumanEntity>();
++ 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<HumanEntity> 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 00000000..29142514
--- /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 00000000..9f8c9f51
--- /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 00000000..d037c57b
--- /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 00000000..8586e786
--- /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 00000000..6a754928
--- /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 00000000..564c24b4
--- /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 00000000..a27cc0b6
--- /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 00000000..0a312a80
--- /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 00000000..2836ac93
--- /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 00000000..9159a106
--- /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 00000000..5cff838f
--- /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 00000000..3a5fbee6
--- /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 00000000..da50d5cf
--- /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<BlockState> blocks = (List<BlockState>) 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<BlockState> blocks = (List<BlockState>) 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 00000000..2158f642
--- /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 00000000..f85596fd
--- /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 00000000..0dcf0352
--- /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<JsonListEntry> 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 00000000..b80cdad0
--- /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 00000000..62424983
--- /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 00000000..22d7748f
--- /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<WorldServer> worlds = new ArrayList<WorldServer>();
++ 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<Runnable> processQueue = new java.util.concurrent.ConcurrentLinkedQueue<Runnable>();
++ 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<String> waitable = new Waitable<String>() {
++ @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 00000000..33ebcae2
--- /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 00000000..1a936183
--- /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 00000000..621762db
--- /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 00000000..99a6dc91
--- /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 00000000..29864db4
--- /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 00000000..20a1268c
--- /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 00000000..d986bc09
--- /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 00000000..14efaf9c
--- /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 00000000..b7aad224
--- /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<Player> iterator() throws UnsupportedOperationException {
++ return new Iterator<Player>() {
++ 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<GameProfile> profiles = new java.util.ArrayList<GameProfile>(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 00000000..39db7a87
--- /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 00000000..c690fcf5
--- /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 00000000..50c07973
--- /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 00000000..2f2260c3
--- /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 00000000..88f1cd79
--- /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 00000000..31b450c1
--- /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 00000000..e858f052
--- /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 00000000..adc48e2b
--- /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 00000000..c0763af1
--- /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 00000000..ce58bcfe
--- /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 00000000..438278b0
--- /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 00000000..fefd3ad8
--- /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 00000000..b8b709f2
--- /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 00000000..6e0843f1
--- /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 00000000..e6b5dc80
--- /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 00000000..e4b9428f
--- /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 00000000..31d6582b
--- /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 00000000..f8fb1845
--- /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 00000000..f7333321
--- /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 00000000..94aa0e1b
--- /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 00000000..054d1b3c
--- /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 00000000..6170f804
--- /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<EntityPlayer, Runnable> players = new HashMap<EntityPlayer, Runnable>();
++ 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 00000000..48b86df8
--- /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<ChunkCoordIntPair> chunkList = new LinkedList<ChunkCoordIntPair>();
+
+ 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<ChunkCoordIntPair> chunksToLoad = new LinkedList<ChunkCoordIntPair>(); // 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<ChunkCoordIntPair> {
++ 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 00000000..577557e6
--- /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<Integer> invalidItems = new HashSet<Integer>(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 00000000..a1286509
--- /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 00000000..ac0ab569
--- /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 00000000..e4b36670
--- /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<HumanEntity> transaction = new java.util.ArrayList<HumanEntity>();
++ 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<HumanEntity> 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 00000000..f38a5b9d
--- /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 00000000..e5583a10
--- /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 00000000..5bb4eae9
--- /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<org.bukkit.block.Block> blocks = new java.util.HashSet<org.bukkit.block.Block>(); // 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 00000000..1a6d02d9
--- /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 00000000..9812b439
--- /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> 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 00000000..80002455
--- /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 00000000..5d14c2db
--- /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 00000000..b7b388d0
--- /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 00000000..a33ee9e9
--- /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 00000000..51349bb2
--- /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<ItemStack> ingredients = new ArrayList<ItemStack>();
++ 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 00000000..78471632
--- /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 00000000..3fa03250
--- /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 00000000..be4d28fb
--- /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 00000000..80999d9c
--- /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 00000000..9cf48bf6
--- /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 00000000..4b480d13
--- /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<EntityPlayer>) 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 00000000..935246b6
--- /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 00000000..5b3908ce
--- /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 00000000..7e4230c9
--- /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<ItemStack>) 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 00000000..626529de
--- /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 00000000..96828173
--- /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 00000000..5b9486b3
--- /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 00000000..e6b38cc5
--- /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 00000000..87bf341a
--- /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 00000000..d0732690
--- /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<PlayerPreLoginEvent.Result> waitable = new Waitable<PlayerPreLoginEvent.Result>() {
++ @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 00000000..dd76aea1
--- /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 00000000..a5179536
--- /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<HumanEntity> transaction = new java.util.ArrayList<HumanEntity>();
++ 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<HumanEntity> 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 00000000..80e791ad
--- /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<HumanEntity> transaction = new java.util.ArrayList<HumanEntity>();
++ private int maxStack = 64;
++
++ public void onOpen(CraftHumanEntity who) {
++ transaction.add(who);
++ }
++
++ public void onClose(CraftHumanEntity who) {
++ transaction.remove(who);
++ }
++
++ public List<HumanEntity> 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 00000000..52d98548
--- /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<HumanEntity> transaction = new java.util.ArrayList<HumanEntity>();
++ 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<HumanEntity> 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 00000000..92b43a41
--- /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 00000000..918eb349
--- /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<HumanEntity> transaction = new java.util.ArrayList<HumanEntity>();
++ 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<HumanEntity> 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 00000000..911664c5
--- /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<HumanEntity> transaction = new java.util.ArrayList<HumanEntity>();
++
++ public ItemStack[] getContents() {
++ return this.items;
++ }
++
++ public void onOpen(CraftHumanEntity who) {
++ transaction.add(who);
++ }
++
++ public void onClose(CraftHumanEntity who) {
++ transaction.remove(who);
++ }
++
++ public List<HumanEntity> 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 00000000..a8f1dc57
--- /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<HumanEntity> transaction = new java.util.ArrayList<HumanEntity>();
++ 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<HumanEntity> 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 00000000..fd9a329b
--- /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 00000000..0c1fa1d0
--- /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 00000000..068fc0b2
--- /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 00000000..1504054f
--- /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 00000000..9b58e724
--- /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 00000000..f6da3f10
--- /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 00000000..03912ea0
--- /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<BlockState> capturedBlockStates= new ArrayList<BlockState>();
++ 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<BlockState> 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<BlockState> 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 00000000..37416ef7
--- /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 00000000..9a633c3b
--- /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 00000000..4dcc8625
--- /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 00000000..ff11ea6a
--- /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 00000000..e69de29b
--- /dev/null
+++ b/nms-patches/WorldGenVillagePieces.patch
diff --git a/nms-patches/WorldGenWitchHut.patch b/nms-patches/WorldGenWitchHut.patch
new file mode 100644
index 00000000..cfd76bed
--- /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 00000000..a7f97b03
--- /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 00000000..86ba2aa6
--- /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 00000000..627bbbfd
--- /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<MapIcon> icons = new java.util.ArrayList<MapIcon>();
++
++ 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 00000000..503af702
--- /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 00000000..b1ad5607
--- /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 8dc82eb7..e2d4c7de 100644
--- a/pom.xml
+++ b/pom.xml
@@ -4,7 +4,7 @@
<groupId>org.bukkit</groupId>
<artifactId>craftbukkit</artifactId>
<packaging>jar</packaging>
- <version>1.7.10-R0.1-SNAPSHOT</version>
+ <version>1.8-R0.1-SNAPSHOT</version>
<name>CraftBukkit</name>
<url>http://www.bukkit.org</url>
@@ -12,31 +12,12 @@
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<api.version>unknown</api.version>
<junit.version>4.11</junit.version>
- <minecraft.version>1.7.10</minecraft.version>
- <minecraft_version>1_7_R4</minecraft_version>
+ <minecraft.version>1.8</minecraft.version>
+ <minecraft_version>1_8_R1</minecraft_version>
<buildtag.prefix>git-Bukkit-</buildtag.prefix>
<buildtag.suffix></buildtag.suffix>
</properties>
- <scm>
- <connection>scm:git:git://github.com/Bukkit/CraftBukkit.git</connection>
- <developerConnection>scm:git:ssh://git@github.com/Bukkit/CraftBukkit.git</developerConnection>
- <url>https://github.com/Bukkit/CraftBukkit</url>
- </scm>
-
- <distributionManagement>
- <repository>
- <id>repobo-rel</id>
- <name>repo.bukkit.org Releases</name>
- <url>http://repo.bukkit.org/content/repositories/releases/</url>
- </repository>
- <snapshotRepository>
- <id>repobo-snap</id>
- <name>repo.bukkit.org Snapshots</name>
- <url>http://repo.bukkit.org/content/repositories/snapshots/</url>
- </snapshotRepository>
- </distributionManagement>
-
<repositories>
<repository>
<id>repobo-snap</id>
@@ -60,9 +41,9 @@
<scope>compile</scope>
</dependency>
<dependency>
- <groupId>org.bukkit</groupId>
+ <groupId>org.spigotmc</groupId>
<artifactId>minecraft-server</artifactId>
- <version>${minecraft.version}</version>
+ <version>${minecraft.version}-SNAPSHOT</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
@@ -124,7 +105,7 @@
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
- <version>10.0</version>
+ <version>17.0</version>
<type>jar</type>
<scope>provided</scope>
</dependency>
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 2f4e7495..00000000
--- 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 9876ebfa..00000000
--- 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 30109ecc..00000000
--- 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 ca46ea62..00000000
--- 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 6e542058..00000000
--- 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 e920c6f4..00000000
--- 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 e65a2705..00000000
--- 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 5584fbd9..00000000
--- 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 c60f0a94..00000000
--- 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 875181f5..00000000
--- 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 96e9c37e..00000000
--- 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 ec581e0f..00000000
--- 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 9450df9b..00000000
--- 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 9c3ae2e1..00000000
--- 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 b1c3f10e..00000000
--- 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 039afd39..00000000
--- 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 0b24c153..00000000
--- 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 44994a14..00000000
--- 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 cdce3ff1..00000000
--- 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 abd991b4..00000000
--- 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 b85b72f3..00000000
--- 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 25cb3271..00000000
--- 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 d6afe5b0..00000000
--- 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 e00cea3d..00000000
--- 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 207da243..00000000
--- 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 c32db8f6..00000000
--- 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 d9f87415..00000000
--- 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 6671a84b..00000000
--- 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 a01a6e62..00000000
--- 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 ea12b917..00000000
--- 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 42f44006..00000000
--- 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 8d8963cc..00000000
--- 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 cb7455da..00000000
--- 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 bec5aa8a..00000000
--- 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 cd209058..00000000
--- 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 c2dfc861..00000000
--- 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 25ef883d..00000000
--- 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 b6f22f02..00000000
--- 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 a8632a77..00000000
--- 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 cb802e80..00000000
--- 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 0cd2e04e..00000000
--- 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 8e014149..00000000
--- 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 3cec3789..00000000
--- 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 a1350f62..00000000
--- 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 89e60a88..00000000
--- 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<BlockState> blocks = (List<BlockState>) 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 4ee33197..00000000
--- 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 3075dbc8..00000000
--- 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 02f428e5..00000000
--- 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 b234a537..00000000
--- 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 51b9604a..00000000
--- 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 40ad1c65..00000000
--- 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 f8adc614..00000000
--- 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 ecc429ea..00000000
--- 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 cf84d794..00000000
--- 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 c2342658..00000000
--- 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 ed007140..00000000
--- 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 3ac0ae47..00000000
--- 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<Object> 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 c88d5d4d..00000000
--- 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<Chunk> chunks = new LongObjectHashMap<Chunk>();
- 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 9402f0fd..00000000
--- 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 db1e52c9..00000000
--- 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 04eacb8e..00000000
--- 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 0cd512d5..00000000
--- 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<String[]> commands = new ArrayList<String[]>();
-
- // 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<String[]> newCommands = new ArrayList<String[]>();
- 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<String[]> 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<String[]> buildCommands(String[] args, int pos) {
- ArrayList<String[]> commands = new ArrayList<String[]>();
- 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 a10108b9..00000000
--- 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<Integer, ItemStack> draggedSlots = new HashMap<Integer, ItemStack>(); // 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<Integer, org.bukkit.inventory.ItemStack> eventmap = new HashMap<Integer, org.bukkit.inventory.ItemStack>();
- for (Map.Entry<Integer, ItemStack> 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<Integer, ItemStack> 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 af8847f1..00000000
--- 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 6cc0d924..00000000
--- 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<HumanEntity> transaction = new java.util.ArrayList<HumanEntity>();
- 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<HumanEntity> 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 b7fa7b42..00000000
--- 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 903489ae..00000000
--- 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 c2c4fb53..00000000
--- 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 32187ec1..00000000
--- 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 5f948e47..00000000
--- 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<EnchantmentInstance>();
- }
- // CraftBukkit end
-
- boolean flag = itemstack.getItem() == Items.BOOK;
-
- if (list != null) {
- // CraftBukkit start
- Map<org.bukkit.enchantments.Enchantment, Integer> enchants = new java.util.HashMap<org.bukkit.enchantments.Enchantment, Integer>();
- 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<org.bukkit.enchantments.Enchantment, Integer> 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 b9dbf60a..00000000
--- 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<HumanEntity> transaction = new java.util.ArrayList<HumanEntity>();
- 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<HumanEntity> 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 24385282..00000000
--- 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 e2c789b4..00000000
--- 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 79aa1826..00000000
--- 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 97f97f3e..00000000
--- 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 587ee261..00000000
--- 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 37c61054..00000000
--- 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 f1e8b3dc..00000000
--- 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 525a4d17..00000000
--- 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 9675edb2..00000000
--- 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<ItemStack> ingredients = new ArrayList<ItemStack>();
- 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 7e060027..00000000
--- 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 83f2dad5..00000000
--- 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 9df12c0f..00000000
--- 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 5bd6ec75..00000000
--- 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 b547bc97..00000000
--- 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 d7decfce..00000000
--- 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 4a3691a1..00000000
--- 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 d16f035f..00000000
--- 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 09a0842b..00000000
--- 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 c4bbd6b3..00000000
--- 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 e7196db0..00000000
--- 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 3df54aad..00000000
--- 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 c3454101..00000000
--- 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 b9063735..00000000
--- 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 d9493393..00000000
--- 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 d96ca7d4..00000000
--- 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 09c9c8ee..00000000
--- 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 36ed8316..00000000
--- 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 88b07510..00000000
--- 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 8a3ea635..00000000
--- 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 a5a5ab5e..00000000
--- 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 df21fde2..00000000
--- 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 6960b058..00000000
--- 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 a8162c75..00000000
--- 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 8c4670ba..00000000
--- 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 f999ddd6..00000000
--- 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 cb023e2e..00000000
--- 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 78023c4b..00000000
--- 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<org.bukkit.block.Block> destroyedBlocks = new java.util.ArrayList<org.bukkit.block.Block>();
- 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<EntityPlayer>) 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 336b6b07..00000000
--- 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 fa6670bc..00000000
--- 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 57507603..00000000
--- 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 5576f151..00000000
--- 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 02d90aa2..00000000
--- 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 759d46c4..00000000
--- 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 9d4ea60f..00000000
--- 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 d543fcae..00000000
--- 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 eec465b4..00000000
--- 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 d167c001..00000000
--- 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 331dbac1..00000000
--- 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<ScoreboardScore> collection = this.world.getServer().getScoreboardManager().getScoreboardScores(IScoreboardCriteria.e, this.getName(), new java.util.ArrayList<ScoreboardScore>());
-
- 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 a812656f..00000000
--- 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 a274d03c..00000000
--- 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 394bfbf6..00000000
--- 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 d1d73f91..00000000
--- 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 326f7ea6..00000000
--- 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 9b2ac823..00000000
--- 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 66402a05..00000000
--- 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<EntityPlayer>) 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 0c63b2c6..00000000
--- 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<org.bukkit.inventory.ItemStack> 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<org.bukkit.inventory.ItemStack>(); // 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<Double, Double> hardHat = new Function<Double, Double>() {
- @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<Double, Double> blocking = new Function<Double, Double>() {
- @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<Double, Double> armor = new Function<Double, Double>() {
- @Override
- public Double apply(Double f) {
- return -(f - EntityLiving.this.applyArmorModifier(damagesource, f.floatValue()));
- }
- };
- float armorModifier = armor.apply((double) f).floatValue();
- f += armorModifier;
-
- Function<Double, Double> resistance = new Function<Double, Double>() {
- @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<Double, Double> magic = new Function<Double, Double>() {
- @Override
- public Double apply(Double f) {
- return -(f - EntityLiving.this.applyMagicModifier(damagesource, f.floatValue()));
- }
- };
- float magicModifier = magic.apply((double) f).floatValue();
- f += magicModifier;
-
- Function<Double, Double> absorption = new Function<Double, Double>() {
- @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 f1ccd3a9..00000000
--- 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 5b452856..00000000
--- 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 13b75ff8..00000000
--- 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<HumanEntity> transaction = new java.util.ArrayList<HumanEntity>();
- 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<HumanEntity> 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 49aef649..00000000
--- 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 b4e43061..00000000
--- 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 aba37489..00000000
--- 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 2c3a233d..00000000
--- 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 98bfd08f..00000000
--- 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 f2e895e8..00000000
--- 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 84673b46..00000000
--- 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<org.bukkit.inventory.ItemStack> loot = new java.util.ArrayList<org.bukkit.inventory.ItemStack>();
- 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<ScoreboardScore> collection = this.world.getServer().getScoreboardManager().getScoreboardScores(IScoreboardCriteria.c, this.getName(), new java.util.ArrayList<ScoreboardScore>());
- 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 69db29f6..00000000
--- 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<LivingEntity, Double> affected = new HashMap<LivingEntity, Double>();
-
- 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 7f8a33bc..00000000
--- 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 381ae787..00000000
--- 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 ac5714f0..00000000
--- 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 479936f3..00000000
--- 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 65cd24dd..00000000
--- 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 4d61eec2..00000000
--- 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 2811fb46..00000000
--- 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 99704478..00000000
--- 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 6e6d612b..00000000
--- 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 13cbc79b..00000000
--- 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 68625a48..00000000
--- 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 1af0e67e..00000000
--- 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 0cf9ad5b..00000000
--- 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 75b3ca3a..00000000
--- 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<EntityPlayer>) 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 b797f8a4..00000000
--- 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 8f1ebf2e..00000000
--- 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 7d8cb937..00000000
--- 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 2cf6e232..00000000
--- 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 56fa9998..00000000
--- 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<org.bukkit.block.Block> blockList = new ArrayList<org.bukkit.block.Block>();
- 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 4b189bfb..00000000
--- 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 41692318..00000000
--- 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 340af90f..00000000
--- 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 52bc69b6..00000000
--- 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<InetAddress, Long> throttleTracker = new HashMap<InetAddress, Long>();
- 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<InetAddress, Long> 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 e5d578df..00000000
--- 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 bfc5c869..00000000
--- 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<org.bukkit.entity.HumanEntity> 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 bb28c12f..00000000
--- 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 fff9d7ac..00000000
--- 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 7db82900..00000000
--- 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<HumanEntity> getViewers() {
- return new java.util.ArrayList<HumanEntity>();
- }
-
- 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 5b46597d..00000000
--- 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<HumanEntity> transaction = new java.util.ArrayList<HumanEntity>();
- 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<HumanEntity> 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 ed23f787..00000000
--- 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<HumanEntity> transaction = new java.util.ArrayList<HumanEntity>();
- 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<HumanEntity> 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 01289950..00000000
--- 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<HumanEntity> transaction = new java.util.ArrayList<HumanEntity>();
- 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<HumanEntity> 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 263de7c5..00000000
--- 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<HumanEntity> transaction = new java.util.ArrayList<HumanEntity>();
-
- 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<HumanEntity> 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 b5617b32..00000000
--- 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<HumanEntity> transaction = new java.util.ArrayList<HumanEntity>();
- 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<HumanEntity> 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 9a775e4c..00000000
--- 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 4382f1ab..00000000
--- 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 e044b03d..00000000
--- 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 a1bf31af..00000000
--- 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 a58d4e73..00000000
--- 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 156af8e3..00000000
--- 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 0a3bf131..00000000
--- 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 2f34151b..00000000
--- 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 ec2edea5..00000000
--- 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 d88d36ac..00000000
--- 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 8655b9f1..00000000
--- 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 8998a3fe..00000000
--- 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 02a1fd8e..00000000
--- 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 639ddf56..00000000
--- 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 c9d74d37..00000000
--- 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<BlockState> blocks = (List<BlockState>) 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<BlockState> blocks = (List<BlockState>) 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 246090d6..00000000
--- 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 c08cccaf..00000000
--- 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 9d1cb336..00000000
--- 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<JsonListEntry> 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 1cd5104b..00000000
--- 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 f4eee668..00000000
--- 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 8f982f17..00000000
--- 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 7285e09e..00000000
--- 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 e65cbfae..00000000
--- 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<WorldServer> worlds = new ArrayList<WorldServer>();
- 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<Runnable> processQueue = new java.util.concurrent.ConcurrentLinkedQueue<Runnable>();
- 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<String> waitable = new Waitable<String>() {
- @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 6ec03bbe..00000000
--- 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 93bb1adc..00000000
--- 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 ce66cca1..00000000
--- 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 1b080c77..00000000
--- 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 592ffc58..00000000
--- 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 8d3cf1f9..00000000
--- 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 16d47650..00000000
--- 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 604a7af5..00000000
--- 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 43df03a9..00000000
--- 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 5df99a44..00000000
--- 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 4c622e26..00000000
--- 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 3eac231d..00000000
--- 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<Deflater> localDeflater = new ThreadLocal<Deflater>() {
- @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 0023f18d..00000000
--- 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 92e40367..00000000
--- 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 cd063053..00000000
--- 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<Player> iterator() throws UnsupportedOperationException {
- return new Iterator<Player>() {
- 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<GameProfile> profiles = new java.util.ArrayList<GameProfile>(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 90c3ef97..00000000
--- 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 cb2af02f..00000000
--- 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 727f5f0c..00000000
--- 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 65f86908..00000000
--- 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 a38f2a26..00000000
--- 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 4f476e6f..00000000
--- 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 f7bd8e82..00000000
--- 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 be541f81..00000000
--- 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 0c08df38..00000000
--- 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 1b8608d0..00000000
--- 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 33aded08..00000000
--- 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 60371bed..00000000
--- 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 a13c6382..00000000
--- 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 761fe6da..00000000
--- 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 88718ce0..00000000
--- 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 f5afcb7e..00000000
--- 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<EntityPlayer, Runnable> players = new HashMap<EntityPlayer, Runnable>();
- 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 ae53635d..00000000
--- 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<ChunkCoordIntPair> chunkList = new LinkedList<ChunkCoordIntPair>();
- 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<ChunkCoordIntPair> chunksToLoad = new LinkedList<ChunkCoordIntPair>(); // 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<ChunkCoordIntPair> {
- 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 3a984394..00000000
--- 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<Integer> invalidItems = new HashSet<Integer>(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 27651b5a..00000000
--- 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 7607155f..00000000
--- 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 5cd6e14f..00000000
--- 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<HumanEntity> transaction = new java.util.ArrayList<HumanEntity>();
- 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<HumanEntity> 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 e6012fba..00000000
--- 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 819a1333..00000000
--- 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 309239de..00000000
--- 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<org.bukkit.block.Block> blocks = new java.util.HashSet<org.bukkit.block.Block>(); // 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 70e6e81d..00000000
--- 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 c6cd6fb6..00000000
--- 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> 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 d6e7f362..00000000
--- 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 fdebf9dd..00000000
--- 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 13bb7082..00000000
--- 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 8182a5fd..00000000
--- 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 816df8c1..00000000
--- 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 793883fe..00000000
--- 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 c474d548..00000000
--- 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 9cd34a44..00000000
--- 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 fd967c12..00000000
--- 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 15910585..00000000
--- 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<EntityPlayer>) 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 5236f81e..00000000
--- 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 cc444db8..00000000
--- 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 0fab83c6..00000000
--- 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<ItemStack>) 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 ac9e04cf..00000000
--- 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 9b8e39bc..00000000
--- 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 1dfc3460..00000000
--- 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<Boolean> a = new LongObjectHashMap<Boolean>(); // 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 d41dc4dd..00000000
--- 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 a5e8a45e..00000000
--- 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 6b91be70..00000000
--- 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<PlayerPreLoginEvent.Result> waitable = new Waitable<PlayerPreLoginEvent.Result>() {
- @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 b2de58b5..00000000
--- 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 09313eae..00000000
--- 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<HumanEntity> transaction = new java.util.ArrayList<HumanEntity>();
- 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<HumanEntity> 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 c0ca4a49..00000000
--- 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<HumanEntity> transaction = new java.util.ArrayList<HumanEntity>();
- private int maxStack = 64;
-
- public void onOpen(CraftHumanEntity who) {
- transaction.add(who);
- }
-
- public void onClose(CraftHumanEntity who) {
- transaction.remove(who);
- }
-
- public List<HumanEntity> 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 c900cafb..00000000
--- 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<HumanEntity> transaction = new java.util.ArrayList<HumanEntity>();
- 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<HumanEntity> 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 45cefdac..00000000
--- 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 7900b37e..00000000
--- 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<HumanEntity> transaction = new java.util.ArrayList<HumanEntity>();
- 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<HumanEntity> 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 430fc69c..00000000
--- 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<HumanEntity> transaction = new java.util.ArrayList<HumanEntity>();
-
- public ItemStack[] getContents() {
- return this.items;
- }
-
- public void onOpen(CraftHumanEntity who) {
- transaction.add(who);
- }
-
- public void onClose(CraftHumanEntity who) {
- transaction.remove(who);
- }
-
- public List<HumanEntity> 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 ebdf08e7..00000000
--- 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<HumanEntity> transaction = new java.util.ArrayList<HumanEntity>();
- 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<HumanEntity> 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 aa020389..00000000
--- 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 69fe247b..00000000
--- 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 8abeac49..00000000
--- 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 552919c4..00000000
--- 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 7c3757fb..00000000
--- 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 89f1b74e..00000000
--- 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 93e1a1ed..00000000
--- 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 08c506ce..00000000
--- 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<BlockState> capturedBlockStates= new ArrayList<BlockState>();
- 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<BlockState> 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<BlockState> 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<BlockState> 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<BlockState> 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 1f8f1a98..00000000
--- 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 ea8fdb55..00000000
--- 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 0fd21716..00000000
--- 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 dd228e77..00000000
--- 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 e08c6fe2..00000000
--- 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 ae60aeb8..00000000
--- 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 b3499024..00000000
--- 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 bd5cfca8..00000000
--- 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 ec708d1a..00000000
--- 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 93ff8d3b..00000000
--- 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 ba7965db..00000000
--- 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 f617e9e2..dd4dc541 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 99d3d40f..0cba7fd9 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 1328c175..8be06984 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 7ec00068..9540bf4f 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 fad6a965..700c9f7c 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 a666131f..f2a78c17 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<UUID, OfflinePlayer> 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<EntityPlayer, CraftPlayer>() {
+ this.playerView = Collections.unmodifiableList(Lists.transform(playerList.players, new Function<EntityPlayer, CraftPlayer>() {
@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 <stat_name> [player]"));
- commandMap.register("minecraft", new VanillaCommandWrapper(new CommandBan(), "/ban <playername> [reason]"));
- commandMap.register("minecraft", new VanillaCommandWrapper(new CommandBanIp(), "/ban-ip <ip-address|playername>"));
- commandMap.register("minecraft", new VanillaCommandWrapper(new CommandBanList(), "/banlist [ips]"));
- commandMap.register("minecraft", new VanillaCommandWrapper(new CommandClear(), "/clear <playername> [item] [metadata]"));
- commandMap.register("minecraft", new VanillaCommandWrapper(new CommandGamemodeDefault(), "/defaultgamemode <mode>"));
- commandMap.register("minecraft", new VanillaCommandWrapper(new CommandDeop(), "/deop <playername>"));
- commandMap.register("minecraft", new VanillaCommandWrapper(new CommandDifficulty(), "/difficulty <new difficulty>"));
- commandMap.register("minecraft", new VanillaCommandWrapper(new CommandEffect(), "/effect <player> <effect|clear> [seconds] [amplifier]"));
- commandMap.register("minecraft", new VanillaCommandWrapper(new CommandEnchant(), "/enchant <playername> <enchantment ID> [enchantment level]"));
- commandMap.register("minecraft", new VanillaCommandWrapper(new CommandGamemode(), "/gamemode <mode> [player]"));
- commandMap.register("minecraft", new VanillaCommandWrapper(new CommandGamerule(), "/gamerule <rulename> [true|false]"));
- commandMap.register("minecraft", new VanillaCommandWrapper(new CommandGive(), "/give <playername> <item> [amount] [metadata] [dataTag]"));
- commandMap.register("minecraft", new VanillaCommandWrapper(new CommandHelp(), "/help [page|commandname]"));
- commandMap.register("minecraft", new VanillaCommandWrapper(new CommandIdleTimeout(), "/setidletimeout <Minutes until kick>"));
- commandMap.register("minecraft", new VanillaCommandWrapper(new CommandKick(), "/kick <playername> [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 <actiontext>"));
- commandMap.register("minecraft", new VanillaCommandWrapper(new CommandOp(), "/op <playername>"));
- commandMap.register("minecraft", new VanillaCommandWrapper(new CommandPardon(), "/pardon <playername>"));
- commandMap.register("minecraft", new VanillaCommandWrapper(new CommandPardonIP(), "/pardon-ip <ip-address>"));
- commandMap.register("minecraft", new VanillaCommandWrapper(new CommandPlaySound(), "/playsound <sound> <playername> [x] [y] [z] [volume] [pitch] [minimumVolume]"));
- commandMap.register("minecraft", new VanillaCommandWrapper(new CommandSay(), "/say <message>"));
- commandMap.register("minecraft", new VanillaCommandWrapper(new CommandScoreboard(), "/scoreboard"));
- commandMap.register("minecraft", new VanillaCommandWrapper(new CommandSeed(), "/seed"));
- commandMap.register("minecraft", new VanillaCommandWrapper(new CommandSetBlock(), "/setblock <x> <y> <z> <tilename> [datavalue] [oldblockHandling] [dataTag]"));
- commandMap.register("minecraft", new VanillaCommandWrapper(new CommandSetWorldSpawn(), "/setworldspawn [x] [y] [z]"));
- commandMap.register("minecraft", new VanillaCommandWrapper(new CommandSpawnpoint(), "/spawnpoint <playername> [x] [y] [z]"));
- commandMap.register("minecraft", new VanillaCommandWrapper(new CommandSpreadPlayers(), "/spreadplayers <x> <z> [spreadDistance] [maxRange] [respectTeams] <playernames>"));
- commandMap.register("minecraft", new VanillaCommandWrapper(new CommandSummon(), "/summon <EntityName> [x] [y] [z] [dataTag]"));
- commandMap.register("minecraft", new VanillaCommandWrapper(new CommandTp(), "/tp [player] <target>\n/tp [player] <x> <y> <z>"));
- commandMap.register("minecraft", new VanillaCommandWrapper(new CommandTell(), "/tell <playername> <message>"));
- commandMap.register("minecraft", new VanillaCommandWrapper(new CommandTellRaw(), "/tellraw <playername> <raw message>"));
- commandMap.register("minecraft", new VanillaCommandWrapper(new CommandTestFor(), "/testfor <playername | selector> [dataTag]"));
- commandMap.register("minecraft", new VanillaCommandWrapper(new CommandTestForBlock(), "/testforblock <x> <y> <z> <tilename> [datavalue] [dataTag]"));
- commandMap.register("minecraft", new VanillaCommandWrapper(new CommandTime(), "/time set <value>\n/time add <value>"));
- commandMap.register("minecraft", new VanillaCommandWrapper(new CommandToggleDownfall(), "/toggledownfall"));
- commandMap.register("minecraft", new VanillaCommandWrapper(new CommandWeather(), "/weather <clear/rain/thunder> [duration in seconds]"));
- commandMap.register("minecraft", new VanillaCommandWrapper(new CommandWhitelist(), "/whitelist (add|remove) <player>\n/whitelist (on|off|list|reload)"));
- commandMap.register("minecraft", new VanillaCommandWrapper(new CommandXp(), "/xp <amount> [player]\n/xp <amount>L [player]"));
- // This is what is in the lang file, I swear.
- commandMap.register("minecraft", new VanillaCommandWrapper(new CommandNetstat(), "/list"));
+ Map<String, ICommand> 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 24c8bf24..a261c77d 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<String, org.bukkit.Statistic> 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 f7ca6a3f..cae65cf8 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 f4dec5bf..f20a0406 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<Entity> 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 00000000..5a76958d
--- /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<Pattern> patterns = new ArrayList<Pattern>();
+
+ 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<Pattern> getPatterns() {
+ return new ArrayList<Pattern>(patterns);
+ }
+
+ @Override
+ public void setPatterns(List<Pattern> patterns) {
+ this.patterns = new ArrayList<Pattern>(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 87d79aec..fe5d231e 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 2297cc75..9fb32a82 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 21f7b732..0e5c2404 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 762a8e6d..ab6e55f4 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 6b4ef8ad..327f4766 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 761b76af..ce744c97 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 b83e3351..79d8e6dd 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 77717d5b..724dbd12 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 dc9a587e..8d751c11 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 9cf1b493..c2d4c2e4 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<QueuedChu
}
queuedChunk.loader.loadEntities(chunk, queuedChunk.compound.getCompound("Level"), queuedChunk.world);
- chunk.lastSaved = queuedChunk.provider.world.getTime();
+ chunk.setLastSaved(queuedChunk.provider.world.getTime());
queuedChunk.provider.chunks.put(LongHash.toLong(queuedChunk.x, queuedChunk.z), chunk);
chunk.addEntities();
if (queuedChunk.provider.chunkProvider != null) {
- queuedChunk.provider.chunkProvider.recreateStructures(queuedChunk.x, queuedChunk.z);
+ queuedChunk.provider.chunkProvider.recreateStructures(chunk, queuedChunk.x, queuedChunk.z);
}
Server server = queuedChunk.provider.world.getServer();
if (server != null) {
- server.getPluginManager().callEvent(new org.bukkit.event.world.ChunkLoadEvent(chunk.bukkitChunk, false));
+ server.getPluginManager().callEvent(new org.bukkit.event.world.ChunkLoadEvent(chunk.bukkitChunk, false));
}
// Update neighbor counts
diff --git a/src/main/java/org/bukkit/craftbukkit/command/CraftBlockCommandSender.java b/src/main/java/org/bukkit/craftbukkit/command/CraftBlockCommandSender.java
index bdee7d73..a5174166 100644
--- a/src/main/java/org/bukkit/craftbukkit/command/CraftBlockCommandSender.java
+++ b/src/main/java/org/bukkit/craftbukkit/command/CraftBlockCommandSender.java
@@ -18,7 +18,7 @@ public class CraftBlockCommandSender extends ServerCommandSender implements Bloc
}
public Block getBlock() {
- return commandBlock.getWorld().getWorld().getBlockAt(commandBlock.getChunkCoordinates().x, commandBlock.getChunkCoordinates().y, commandBlock.getChunkCoordinates().z);
+ return commandBlock.getWorld().getWorld().getBlockAt(commandBlock.getChunkCoordinates().getX(), commandBlock.getChunkCoordinates().getY(), commandBlock.getChunkCoordinates().getZ());
}
public void sendMessage(String message) {
diff --git a/src/main/java/org/bukkit/craftbukkit/command/CraftRemoteConsoleCommandSender.java b/src/main/java/org/bukkit/craftbukkit/command/CraftRemoteConsoleCommandSender.java
index 25d12558..7c5523b0 100644
--- a/src/main/java/org/bukkit/craftbukkit/command/CraftRemoteConsoleCommandSender.java
+++ b/src/main/java/org/bukkit/craftbukkit/command/CraftRemoteConsoleCommandSender.java
@@ -1,5 +1,6 @@
package org.bukkit.craftbukkit.command;
+import net.minecraft.server.ChatComponentText;
import net.minecraft.server.RemoteControlCommandListener;
import org.bukkit.command.RemoteConsoleCommandSender;
@@ -10,7 +11,7 @@ public class CraftRemoteConsoleCommandSender extends ServerCommandSender impleme
@Override
public void sendMessage(String message) {
- RemoteControlCommandListener.instance.sendMessage(message + "\n"); // Send a newline after each message, to preserve formatting.
+ RemoteControlCommandListener.getInstance().sendMessage(new ChatComponentText(message + "\n")); // Send a newline after each message, to preserve formatting.
}
@Override
diff --git a/src/main/java/org/bukkit/craftbukkit/command/VanillaCommandWrapper.java b/src/main/java/org/bukkit/craftbukkit/command/VanillaCommandWrapper.java
index 5909613c..229a65d9 100644
--- a/src/main/java/org/bukkit/craftbukkit/command/VanillaCommandWrapper.java
+++ b/src/main/java/org/bukkit/craftbukkit/command/VanillaCommandWrapper.java
@@ -1,22 +1,9 @@
package org.bukkit.craftbukkit.command;
+import java.util.Iterator;
import java.util.List;
-import net.minecraft.server.ChatMessage;
-import net.minecraft.server.CommandAbstract;
-import net.minecraft.server.CommandBlockListenerAbstract;
-import net.minecraft.server.CommandException;
-import net.minecraft.server.EntityMinecartCommandBlock;
-import net.minecraft.server.EntityMinecartCommandBlockListener;
-import net.minecraft.server.EntityPlayer;
-import net.minecraft.server.EnumChatFormat;
-import net.minecraft.server.ExceptionUsage;
-import net.minecraft.server.ICommandListener;
-import net.minecraft.server.MinecraftServer;
-import net.minecraft.server.PlayerSelector;
-import net.minecraft.server.RemoteControlCommandListener;
-import net.minecraft.server.TileEntityCommandListener;
-import net.minecraft.server.WorldServer;
+import net.minecraft.server.*;
import org.apache.commons.lang.Validate;
import org.apache.logging.log4j.Level;
@@ -58,6 +45,9 @@ public final class VanillaCommandWrapper extends VanillaCommand {
MinecraftServer.getServer().worldServer = new WorldServer[]{(WorldServer) icommandlistener.getWorld()};
try {
vanillaCommand.execute(icommandlistener, args);
+ // 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);
@@ -77,7 +67,7 @@ public final class VanillaCommandWrapper extends VanillaCommand {
Validate.notNull(sender, "Sender cannot be null");
Validate.notNull(args, "Arguments cannot be null");
Validate.notNull(alias, "Alias cannot be null");
- return (List<String>) vanillaCommand.tabComplete(getListener(sender), args);
+ return (List<String>) 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<Entity> list = ((List<Entity>)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<Entity> 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 00000000..2896603e
--- /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 4f8d47d6..dca85204 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 a6c0b94e..09d42141 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 09a03c05..b1bf7a46 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 00000000..4fd49ead
--- /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 b8a9a148..b7e9d8fd 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<org.bukkit.entity.Entity> getNearbyEntities(double x, double y, double z) {
@SuppressWarnings("unchecked")
- List<Entity> notchEntityList = entity.world.getEntities(entity, entity.boundingBox.grow(x, y, z));
+ List<Entity> notchEntityList = entity.world.getEntities(entity, entity.getBoundingBox().grow(x, y, z));
List<org.bukkit.entity.Entity> bukkitEntityList = new java.util.ArrayList<org.bukkit.entity.Entity>(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 d67ddd08..788f26ba 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 edb30e7c..ecfc316b 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 00000000..f254e809
--- /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 e51dddbd..3bf83db1 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 8522cad0..230ae9ee 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 3d1ca3d8..e69f417b 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 add554e9..e31fcc17 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 925a15f0..efad618f 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 bbf310b0..286a58c2 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<EntityPlayer>)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<MapIcon> icons = new ArrayList<MapIcon>();
+ 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<String, Object> serialize() {
Map<String, Object> result = new LinkedHashMap<String, Object>();
@@ -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<String> 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 00000000..62fc7ef2
--- /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 81b938a2..f7253554 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 d4bf3a0e..ea1d10b3 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 398029b9..6fe21cce 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 39e8d89b..ee21d7b6 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 3d0e7cb5..55ce37c7 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 9b10c418..cc1d3718 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 9a46d0c7..d47755a0 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 ceab5816..4230bdb2 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<BlockPopulator> getDefaultPopulators(org.bukkit.World world) {
return new ArrayList<BlockPopulator>();
}
+ @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);
- }
-
- public ChunkPosition findNearestMapFeature(World world, String string, int i, int i1, int i2) {
- return provider.findNearestMapFeature(world, string, i, i1, i2);
+ @Override
+ public List<?> getMobsFor(EnumCreatureType ect, BlockPosition position) {
+ return provider.getMobsFor(ect, position);
}
- 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 42568a24..1dbc588e 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 6748465d..7ae6f12c 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 7bbf1df5..e155329e 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 8b8a317c..947c4939 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 b(int i, ItemStack itemstack) {
+ return true;
+ }
+
+ @Override
+ public void startOpen(EntityHuman entityHuman) {
- public boolean k_() {
- return false;
}
- public boolean b(int i, ItemStack itemstack) {
- return true;
+ @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 0459f41f..87252cad 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 fdc58f16..068881d2 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 1b2394de..8dd889de 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 704be690..b49c2dca 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 00000000..d61615bf
--- /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<Pattern> patterns = new ArrayList<Pattern>();
+
+ CraftMetaBanner(CraftMetaItem meta) {
+ super(meta);
+
+ if (!(meta instanceof CraftMetaBanner)) {
+ return;
+ }
+
+ CraftMetaBanner banner = (CraftMetaBanner) meta;
+ base = banner.base;
+ patterns = new ArrayList<Pattern>(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<String, Object> 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<Pattern> getPatterns() {
+ return new ArrayList<Pattern>(patterns);
+ }
+
+ @Override
+ public void setPatterns(List<Pattern> patterns) {
+ this.patterns = new ArrayList<Pattern>(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<String, Object> serialize(ImmutableMap.Builder<String, Object> 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 1cf8fce4..9a24d2e7 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<String> pages = new ArrayList<String>();
+ 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 bff3be9d..6c6fde73 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 d648d052..1d30e5e1 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 b5e9e310..1c3e1981 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 392dba4a..d56a291c 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 0959a09e..b8bf7541 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 extends Projectile> T launchProjectile(Class<? extends T> 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 612a5243..7dedd022 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 ad65b3f8..62bb8a36 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 a9c5eafc..00000000
--- 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 f21301ce..00000000
--- 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<String> onUpdate = new ArrayList<String>();
- private final List<String> onBroken = new ArrayList<String>();
- 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<String> getOnBroken() {
- return onBroken;
- }
-
- public List<String> 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 0145ac36..00000000
--- 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<Date> {
- 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 30f2622d..2dbedd2d 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 256f0531..58ff7d96 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<Character, EnumChatFormat> 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<IChatBaseComponent>) 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 52aa5d18..b84ed46d 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<String> tabCompleteInternalMaterialName(String token, List<String> completions) {
- return StringUtil.copyPartialMatches(token, Item.REGISTRY.keySet(), completions);
+ ArrayList<String> results = Lists.newArrayList();
+ for (MinecraftKey key : (Set<MinecraftKey>)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 90b2e6ac..ae19da4d 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<Player> {
-
- @Override
- HashSet<Player> makeReference() {
- if (reference != null) {
- throw new IllegalStateException("Reference already created!");
- }
- List<EntityPlayer> players = MinecraftServer.getServer().getPlayerList().players;
- HashSet<Player> reference = new HashSet<Player>(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<Player> {
+
+ @Override
+ HashSet<Player> makeReference() {
+ if (reference != null) {
+ throw new IllegalStateException("Reference already created!");
+ }
+ List<EntityPlayer> players = MinecraftServer.getServer().getPlayerList().players;
+ HashSet<Player> reference = new HashSet<Player>(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 1db4874d..93a8f0bd 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 0bdfde6d..772f730f 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 129ac34d..a6c11786 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 0e3a7c75..f0b889b3 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 a33fcbff..f689cbf4 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<Block, Integer> 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 2331c180..11d29069 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 df7437c9..00000000
--- 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 7c4484f0..b280ebe4 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<Material> INVALIDATED_MATERIALS = ImmutableList.<Material>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<Material> INVALIDATED_MATERIALS = ImmutableList.<Material>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 5ed00a72..a0e0396b 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();
}