summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.gitignore1
-rw-r--r--nms-patches/Advancement.patch11
-rw-r--r--nms-patches/AdvancementDataPlayer.patch59
-rw-r--r--nms-patches/AdvancementRewards.patch52
-rw-r--r--nms-patches/Advancements.patch6
-rw-r--r--nms-patches/Block.patch61
-rw-r--r--nms-patches/BlockButtonAbstract.patch76
-rw-r--r--nms-patches/BlockCactus.patch25
-rw-r--r--nms-patches/BlockCake.patch4
-rw-r--r--nms-patches/BlockCauldron.patch70
-rw-r--r--nms-patches/BlockChorusFlower.patch75
-rw-r--r--nms-patches/BlockCocoa.patch26
-rw-r--r--nms-patches/BlockCommand.patch4
-rw-r--r--nms-patches/BlockConcretePowder.patch48
-rw-r--r--nms-patches/BlockCrops.patch20
-rw-r--r--nms-patches/BlockDaylightDetector.patch6
-rw-r--r--nms-patches/BlockDiodeAbstract.patch22
-rw-r--r--nms-patches/BlockDirtSnowSpreadable.patch23
-rw-r--r--nms-patches/BlockDispenser.patch22
-rw-r--r--nms-patches/BlockDoor.patch47
-rw-r--r--nms-patches/BlockDragonEgg.patch41
-rw-r--r--nms-patches/BlockDropper.patch54
-rw-r--r--nms-patches/BlockEnderPortal.patch14
-rw-r--r--nms-patches/BlockFire.patch158
-rw-r--r--nms-patches/BlockFlowing.patch66
-rw-r--r--nms-patches/BlockFluids.patch30
-rw-r--r--nms-patches/BlockGrass.patch72
-rw-r--r--nms-patches/BlockIce.patch8
-rw-r--r--nms-patches/BlockJukeBox.patch14
-rw-r--r--nms-patches/BlockLeaves.patch34
-rw-r--r--nms-patches/BlockLever.patch17
-rw-r--r--nms-patches/BlockMagma.patch2
-rw-r--r--nms-patches/BlockMinecartDetector.patch8
-rw-r--r--nms-patches/BlockMobSpawner.patch10
-rw-r--r--nms-patches/BlockMonsterEggs.patch8
-rw-r--r--nms-patches/BlockMushroom.patch38
-rw-r--r--nms-patches/BlockMycel.patch58
-rw-r--r--nms-patches/BlockNetherWart.patch9
-rw-r--r--nms-patches/BlockNote.patch46
-rw-r--r--nms-patches/BlockOre.patch18
-rw-r--r--nms-patches/BlockPiston.patch51
-rw-r--r--nms-patches/BlockPlant.patch24
-rw-r--r--nms-patches/BlockPortal.patch80
-rw-r--r--nms-patches/BlockPoweredRail.patch19
-rw-r--r--nms-patches/BlockPressurePlateAbstract.patch8
-rw-r--r--nms-patches/BlockPressurePlateBinary.patch2
-rw-r--r--nms-patches/BlockPressurePlateWeighted.patch6
-rw-r--r--nms-patches/BlockPumpkin.patch81
-rw-r--r--nms-patches/BlockPumpkinCarved.patch65
-rw-r--r--nms-patches/BlockRedstoneLamp.patch57
-rw-r--r--nms-patches/BlockRedstoneOre.patch69
-rw-r--r--nms-patches/BlockRedstoneTorch.patch39
-rw-r--r--nms-patches/BlockRedstoneWire.patch8
-rw-r--r--nms-patches/BlockReed.patch21
-rw-r--r--nms-patches/BlockSapling.patch135
-rw-r--r--nms-patches/BlockShulkerBox.patch65
-rw-r--r--nms-patches/BlockSkull.patch123
-rw-r--r--nms-patches/BlockSkullAbstract.patch45
-rw-r--r--nms-patches/BlockSnow.patch8
-rw-r--r--nms-patches/BlockSnowBlock.patch8
-rw-r--r--nms-patches/BlockSoil.patch23
-rw-r--r--nms-patches/BlockStateInteger.patch18
-rw-r--r--nms-patches/BlockStationary.patch40
-rw-r--r--nms-patches/BlockStem.patch44
-rw-r--r--nms-patches/BlockTNT.patch6
-rw-r--r--nms-patches/BlockTallPlant.patch20
-rw-r--r--nms-patches/BlockTrapdoor.patch14
-rw-r--r--nms-patches/BlockTripwire.patch8
-rw-r--r--nms-patches/BlockTripwireHook.patch6
-rw-r--r--nms-patches/BlockVine.patch102
-rw-r--r--nms-patches/BlockWaterLily.patch8
-rw-r--r--nms-patches/BlockWitherSkull.patch66
-rw-r--r--nms-patches/ChatBaseComponent.patch11
-rw-r--r--nms-patches/ChatModifier.patch45
-rw-r--r--nms-patches/Chunk.patch167
-rw-r--r--nms-patches/ChunkMap.patch88
-rw-r--r--nms-patches/ChunkProviderGenerate.patch13
-rw-r--r--nms-patches/ChunkProviderServer.patch136
-rw-r--r--nms-patches/ChunkRegionLoader.patch284
-rw-r--r--nms-patches/ChunkSection.patch36
-rw-r--r--nms-patches/CommandBlockListenerAbstract.patch214
-rw-r--r--nms-patches/CommandDebug.patch46
-rw-r--r--nms-patches/CommandDispatcher.patch189
-rw-r--r--nms-patches/CommandExecute.patch58
-rw-r--r--nms-patches/CommandGamemode.patch45
-rw-r--r--nms-patches/CommandGamerule.patch23
-rw-r--r--nms-patches/CommandListenerWrapper.patch46
-rw-r--r--nms-patches/CommandSpreadPlayers.patch42
-rw-r--r--nms-patches/CommandTeleport.patch27
-rw-r--r--nms-patches/CommandTp.patch45
-rw-r--r--nms-patches/Container.patch10
-rw-r--r--nms-patches/ContainerAnvil.patch24
-rw-r--r--nms-patches/ContainerEnchantTable.patch42
-rw-r--r--nms-patches/ContainerFurnace.patch15
-rw-r--r--nms-patches/ContainerPlayer.patch30
-rw-r--r--nms-patches/ContainerWorkbench.patch10
-rw-r--r--nms-patches/CraftingManager.patch43
-rw-r--r--nms-patches/CrashReport.patch6
-rw-r--r--nms-patches/CustomFunction.patch22
-rw-r--r--nms-patches/CustomFunctionData.patch65
-rw-r--r--nms-patches/DamageSource.patch6
-rw-r--r--nms-patches/DataConverterFlatten.patch11
-rw-r--r--nms-patches/DataConverterMap.patch20
-rw-r--r--nms-patches/DataInspectorBlockEntity.patch12
-rw-r--r--nms-patches/DataPaletteBlock.patch25
-rw-r--r--nms-patches/DataWatcher.patch14
-rw-r--r--nms-patches/DedicatedServer.patch111
-rw-r--r--nms-patches/DispenseBehaviorItem.patch7
-rw-r--r--nms-patches/DispenseBehaviorProjectile.patch2
-rw-r--r--nms-patches/DispenserRegistry.patch386
-rw-r--r--nms-patches/Enchantment.patch35
-rw-r--r--nms-patches/EnchantmentFrostWalker.patch12
-rw-r--r--nms-patches/EnchantmentThorns.patch2
-rw-r--r--nms-patches/Entity.patch217
-rw-r--r--nms-patches/EntityAgeable.patch36
-rw-r--r--nms-patches/EntityAnimal.patch18
-rw-r--r--nms-patches/EntityAreaEffectCloud.patch16
-rw-r--r--nms-patches/EntityArmorStand.patch76
-rw-r--r--nms-patches/EntityArrow.patch72
-rw-r--r--nms-patches/EntityBoat.patch56
-rw-r--r--nms-patches/EntityChicken.patch22
-rw-r--r--nms-patches/EntityCow.patch2
-rw-r--r--nms-patches/EntityCreature.patch13
-rw-r--r--nms-patches/EntityCreeper.patch33
-rw-r--r--nms-patches/EntityDamageSourceIndirect.patch2
-rw-r--r--nms-patches/EntityEgg.patch2
-rw-r--r--nms-patches/EntityEnderCrystal.patch8
-rw-r--r--nms-patches/EntityEnderDragon.patch25
-rw-r--r--nms-patches/EntityEnderPearl.patch2
-rw-r--r--nms-patches/EntityEnderSignal.patch19
-rw-r--r--nms-patches/EntityEnderman.patch43
-rw-r--r--nms-patches/EntityEvokerFangs.patch2
-rw-r--r--nms-patches/EntityExperienceOrb.patch27
-rw-r--r--nms-patches/EntityFallingBlock.patch22
-rw-r--r--nms-patches/EntityFireball.patch21
-rw-r--r--nms-patches/EntityFireworks.patch14
-rw-r--r--nms-patches/EntityFishingHook.patch54
-rw-r--r--nms-patches/EntityGhast.patch2
-rw-r--r--nms-patches/EntityHanging.patch14
-rw-r--r--nms-patches/EntityHorseAbstract.patch50
-rw-r--r--nms-patches/EntityHorseChestedAbstract.patch2
-rw-r--r--nms-patches/EntityHuman.patch100
-rw-r--r--nms-patches/EntityInsentient.patch77
-rw-r--r--nms-patches/EntityIronGolem.patch17
-rw-r--r--nms-patches/EntityItem.patch48
-rw-r--r--nms-patches/EntityItemFrame.patch6
-rw-r--r--nms-patches/EntityLargeFireball.patch6
-rw-r--r--nms-patches/EntityLeash.patch2
-rw-r--r--nms-patches/EntityLightning.patch90
-rw-r--r--nms-patches/EntityLiving.patch143
-rw-r--r--nms-patches/EntityLlamaSpit.patch2
-rw-r--r--nms-patches/EntityMinecartAbstract.patch58
-rw-r--r--nms-patches/EntityMinecartCommandBlock.patch21
-rw-r--r--nms-patches/EntityMinecartContainer.patch8
-rw-r--r--nms-patches/EntityMonster.patch26
-rw-r--r--nms-patches/EntityMushroomCow.patch4
-rw-r--r--nms-patches/EntityOcelot.patch10
-rw-r--r--nms-patches/EntityPainting.patch9
-rw-r--r--nms-patches/EntityParrot.patch97
-rw-r--r--nms-patches/EntityPhantom.patch20
-rw-r--r--nms-patches/EntityPig.patch14
-rw-r--r--nms-patches/EntityPlayer.patch425
-rw-r--r--nms-patches/EntityPotion.patch14
-rw-r--r--nms-patches/EntityProjectile.patch12
-rw-r--r--nms-patches/EntityRabbit.patch16
-rw-r--r--nms-patches/EntitySheep.patch43
-rw-r--r--nms-patches/EntityShulker.patch15
-rw-r--r--nms-patches/EntityShulkerBullet.patch12
-rw-r--r--nms-patches/EntitySilverfish.patch16
-rw-r--r--nms-patches/EntitySkeleton.patch6
-rw-r--r--nms-patches/EntitySkeletonAbstract.patch38
-rw-r--r--nms-patches/EntitySkeletonWither.patch6
-rw-r--r--nms-patches/EntitySlime.patch9
-rw-r--r--nms-patches/EntitySmallFireball.patch12
-rw-r--r--nms-patches/EntitySnowman.patch14
-rw-r--r--nms-patches/EntitySpider.patch2
-rw-r--r--nms-patches/EntityTNTPrimed.patch6
-rw-r--r--nms-patches/EntityThrownExpBottle.patch2
-rw-r--r--nms-patches/EntityTracker.patch15
-rw-r--r--nms-patches/EntityTrackerEntry.patch2
-rw-r--r--nms-patches/EntityTypes.patch39
-rw-r--r--nms-patches/EntityVex.patch2
-rw-r--r--nms-patches/EntityVillager.patch39
-rw-r--r--nms-patches/EntityWither.patch20
-rw-r--r--nms-patches/EntityWitherSkull.patch6
-rw-r--r--nms-patches/EntityWolf.patch28
-rw-r--r--nms-patches/EntityZombie.patch56
-rw-r--r--nms-patches/EntityZombieVillager.patch16
-rw-r--r--nms-patches/ExpirableListEntry.patch4
-rw-r--r--nms-patches/Explosion.patch36
-rw-r--r--nms-patches/FluidTypeFlowing.patch46
-rw-r--r--nms-patches/FluidTypeLava.patch44
-rw-r--r--nms-patches/FoodMetaData.patch2
-rw-r--r--nms-patches/FurnaceRecipe.patch44
-rw-r--r--nms-patches/HandshakeListener.patch4
-rw-r--r--nms-patches/ICommandListener.patch9
-rw-r--r--nms-patches/IDataManager.patch6
-rw-r--r--nms-patches/IInventory.patch15
-rw-r--r--nms-patches/IRecipe.patch10
-rw-r--r--nms-patches/IWorldWriter.patch11
-rw-r--r--nms-patches/InventoryCraftResult.patch4
-rw-r--r--nms-patches/InventoryCrafting.patch20
-rw-r--r--nms-patches/InventoryEnderChest.patch2
-rw-r--r--nms-patches/InventoryHorseChest.patch8
-rw-r--r--nms-patches/InventoryLargeChest.patch13
-rw-r--r--nms-patches/InventoryMerchant.patch8
-rw-r--r--nms-patches/InventorySubcontainer.patch22
-rw-r--r--nms-patches/ItemArmor.patch12
-rw-r--r--nms-patches/ItemBlock.patch32
-rw-r--r--nms-patches/ItemBoat.patch14
-rw-r--r--nms-patches/ItemBow.patch24
-rw-r--r--nms-patches/ItemBucket.patch87
-rw-r--r--nms-patches/ItemChorusFruit.patch4
-rw-r--r--nms-patches/ItemDye.patch20
-rw-r--r--nms-patches/ItemEnderPearl.patch6
-rw-r--r--nms-patches/ItemFireball.patch28
-rw-r--r--nms-patches/ItemFishingRod.patch35
-rw-r--r--nms-patches/ItemFlintAndSteel.patch26
-rw-r--r--nms-patches/ItemHanging.patch6
-rw-r--r--nms-patches/ItemLeash.patch4
-rw-r--r--nms-patches/ItemMinecart.patch4
-rw-r--r--nms-patches/ItemMonsterEgg.patch30
-rw-r--r--nms-patches/ItemRecord.patch10
-rw-r--r--nms-patches/ItemRedstone.patch11
-rw-r--r--nms-patches/ItemReed.patch11
-rw-r--r--nms-patches/ItemSkullPlayer.patch (renamed from nms-patches/ItemSkull.patch)6
-rw-r--r--nms-patches/ItemSnowball.patch8
-rw-r--r--nms-patches/ItemStack.patch388
-rw-r--r--nms-patches/ItemWaterLily.patch12
-rw-r--r--nms-patches/ItemWorldMap.patch137
-rw-r--r--nms-patches/ItemWrittenBook.patch54
-rw-r--r--nms-patches/JsonList.patch29
-rw-r--r--nms-patches/LoginListener.patch39
-rw-r--r--nms-patches/MethodProfiler.patch66
-rw-r--r--nms-patches/MinecraftServer.patch520
-rw-r--r--nms-patches/MobEffectList.patch29
-rw-r--r--nms-patches/MobSpawnerAbstract.patch40
-rw-r--r--nms-patches/NameReferencingFileConverter.patch14
-rw-r--r--nms-patches/NetworkManager.patch31
-rw-r--r--nms-patches/PacketDataSerializer.patch4
-rw-r--r--nms-patches/PacketStatusListener.patch2
-rw-r--r--nms-patches/PathfinderGoalBreakDoor.patch6
-rw-r--r--nms-patches/PathfinderGoalBreed.patch12
-rw-r--r--nms-patches/PathfinderGoalEatTile.patch33
-rw-r--r--nms-patches/PathfinderGoalFollowOwner.patch14
-rw-r--r--nms-patches/PathfinderGoalHorseTrap.patch2
-rw-r--r--nms-patches/PathfinderGoalHurtByTarget.patch2
-rw-r--r--nms-patches/PathfinderGoalMakeLove.patch16
-rw-r--r--nms-patches/PathfinderGoalNearestAttackableTarget.patch17
-rw-r--r--nms-patches/PathfinderGoalNearestAttackableTargetInsentient.patch2
-rw-r--r--nms-patches/PathfinderGoalPanic.patch2
-rw-r--r--nms-patches/PathfinderGoalSit.patch2
-rw-r--r--nms-patches/PathfinderGoalTargetNearestPlayer.patch2
-rw-r--r--nms-patches/PathfinderGoalTempt.patch14
-rw-r--r--nms-patches/PathfinderGoalVillagerFarm.patch14
-rw-r--r--nms-patches/PlayerChunk.patch72
-rw-r--r--nms-patches/PlayerChunkMap.patch41
-rw-r--r--nms-patches/PlayerConnection.patch722
-rw-r--r--nms-patches/PlayerInteractManager.patch228
-rw-r--r--nms-patches/PlayerInventory.patch16
-rw-r--r--nms-patches/PlayerList.patch258
-rw-r--r--nms-patches/PortalTravelAgent.patch37
-rw-r--r--nms-patches/RecipeArmorDye.patch16
-rw-r--r--nms-patches/RecipeBannerAdd.patch18
-rw-r--r--nms-patches/RecipeBannerDuplicate.patch17
-rw-r--r--nms-patches/RecipeBookClone.patch17
-rw-r--r--nms-patches/RecipeFireworks.patch21
-rw-r--r--nms-patches/RecipeFireworksFade.patch20
-rw-r--r--nms-patches/RecipeFireworksStar.patch30
-rw-r--r--nms-patches/RecipeMapClone.patch16
-rw-r--r--nms-patches/RecipeRepair.patch46
-rw-r--r--nms-patches/RecipeShulkerBox.patch25
-rw-r--r--nms-patches/RecipeTippedArrow.patch16
-rw-r--r--nms-patches/RecipesBanner.patch37
-rw-r--r--nms-patches/RecipesFurnace.patch80
-rw-r--r--nms-patches/RecipiesShield.patch25
-rw-r--r--nms-patches/RegionFileCache.patch5
-rw-r--r--nms-patches/RegionLimitedWorldAccess.patch30
-rw-r--r--nms-patches/RemoteControlCommandListener.patch11
-rw-r--r--nms-patches/ScoreboardServer.patch51
-rw-r--r--nms-patches/ScoreboardTeam.patch47
-rw-r--r--nms-patches/SecondaryWorldServer.patch12
-rw-r--r--nms-patches/ShapedRecipes.patch44
-rw-r--r--nms-patches/ShapelessRecipes.patch45
-rw-r--r--nms-patches/SlotFurnaceResult.patch40
-rw-r--r--nms-patches/SpawnerCreature.patch82
-rw-r--r--nms-patches/StatisticManager.patch6
-rw-r--r--nms-patches/TickListServer.patch111
-rw-r--r--nms-patches/TileEntity.patch30
-rw-r--r--nms-patches/TileEntityBanner.patch12
-rw-r--r--nms-patches/TileEntityBeacon.patch30
-rw-r--r--nms-patches/TileEntityBrewingStand.patch26
-rw-r--r--nms-patches/TileEntityChest.patch66
-rw-r--r--nms-patches/TileEntityCommand.patch20
-rw-r--r--nms-patches/TileEntityContainer.patch6
-rw-r--r--nms-patches/TileEntityDispenser.patch6
-rw-r--r--nms-patches/TileEntityEndGateway.patch6
-rw-r--r--nms-patches/TileEntityFurnace.patch70
-rw-r--r--nms-patches/TileEntityHopper.patch40
-rw-r--r--nms-patches/TileEntityJukeBox.patch14
-rw-r--r--nms-patches/TileEntityNote.patch16
-rw-r--r--nms-patches/TileEntityShulkerBox.patch20
-rw-r--r--nms-patches/TileEntitySign.patch63
-rw-r--r--nms-patches/TileEntitySkull.patch23
-rw-r--r--nms-patches/TileEntityStructure.patch36
-rw-r--r--nms-patches/UserCache.patch2
-rw-r--r--nms-patches/Village.patch16
-rw-r--r--nms-patches/World.patch291
-rw-r--r--nms-patches/WorldData.patch38
-rw-r--r--nms-patches/WorldGenGroundBush.patch2
-rw-r--r--nms-patches/WorldGenMegaTreeAbstract.patch11
-rw-r--r--nms-patches/WorldGenRegistration.patch11
-rw-r--r--nms-patches/WorldGenTreeProvider.patch40
-rw-r--r--nms-patches/WorldGenVillagePieces.patch46
-rw-r--r--nms-patches/WorldGenWitchHut.patch11
-rw-r--r--nms-patches/WorldMap.patch28
-rw-r--r--nms-patches/WorldNBTStorage.patch23
-rw-r--r--nms-patches/WorldProviderHell.patch2
-rw-r--r--nms-patches/WorldServer.patch408
-rw-r--r--pom.xml38
-rw-r--r--src/main/java/com/mojang/brigadier/tree/CommandNode.java200
-rw-r--r--src/main/java/org/bukkit/craftbukkit/CraftArt.java85
-rw-r--r--src/main/java/org/bukkit/craftbukkit/CraftChunk.java69
-rw-r--r--src/main/java/org/bukkit/craftbukkit/CraftChunkSnapshot.java35
-rw-r--r--src/main/java/org/bukkit/craftbukkit/CraftCrashReport.java4
-rw-r--r--src/main/java/org/bukkit/craftbukkit/CraftEffect.java7
-rw-r--r--src/main/java/org/bukkit/craftbukkit/CraftOfflinePlayer.java5
-rw-r--r--src/main/java/org/bukkit/craftbukkit/CraftParticle.java148
-rw-r--r--src/main/java/org/bukkit/craftbukkit/CraftServer.java179
-rw-r--r--src/main/java/org/bukkit/craftbukkit/CraftSound.java383
-rw-r--r--src/main/java/org/bukkit/craftbukkit/CraftStatistic.java177
-rw-r--r--src/main/java/org/bukkit/craftbukkit/CraftWorld.java121
-rw-r--r--src/main/java/org/bukkit/craftbukkit/Main.java12
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/CraftBanner.java4
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/CraftBeacon.java5
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/CraftBed.java57
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/CraftBlock.java277
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/CraftBlockEntityState.java9
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/CraftBlockState.java92
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/CraftBrewingStand.java5
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/CraftChest.java30
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/CraftCommandBlock.java5
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/CraftConduit.java17
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/CraftCreatureSpawner.java3
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/CraftEnchantingTable.java5
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/CraftFlowerPot.java46
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/CraftFurnace.java5
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/CraftJukebox.java17
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/CraftLootable.java5
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/CraftNoteBlock.java83
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/CraftSkull.java150
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/CraftStructureBlock.java55
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/data/CraftAgeable.java23
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/data/CraftAnaloguePowerable.java23
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/data/CraftAttachable.java18
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/data/CraftBisected.java18
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/data/CraftBlockData.java356
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/data/CraftDirectional.java23
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/data/CraftLevelled.java23
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/data/CraftLightable.java18
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/data/CraftMultipleFacing.java46
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/data/CraftOpenable.java18
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/data/CraftOrientable.java23
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/data/CraftPowerable.java18
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/data/CraftRail.java23
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/data/CraftRotatable.java107
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/data/CraftSnowable.java18
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/data/CraftWaterlogged.java19
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/data/type/CraftBed.java25
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/data/type/CraftBrewingStand.java39
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/data/type/CraftBubbleColumn.java19
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/data/type/CraftCake.java24
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/data/type/CraftChest.java19
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/data/type/CraftCommandBlock.java19
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/data/type/CraftComparator.java19
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/data/type/CraftDaylightDetector.java19
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/data/type/CraftDispenser.java19
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/data/type/CraftDoor.java19
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/data/type/CraftEndPortalFrame.java19
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/data/type/CraftFarmland.java24
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/data/type/CraftGate.java19
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/data/type/CraftHopper.java19
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/data/type/CraftJukebox.java14
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/data/type/CraftLeaves.java30
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/data/type/CraftNoteBlock.java30
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/data/type/CraftPiston.java19
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/data/type/CraftPistonHead.java19
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/data/type/CraftRedstoneWire.java49
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/data/type/CraftRepeater.java40
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/data/type/CraftSapling.java24
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/data/type/CraftSeaPickle.java29
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/data/type/CraftSlab.java19
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/data/type/CraftSnow.java29
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/data/type/CraftStairs.java19
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/data/type/CraftStructureBlock.java19
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/data/type/CraftSwitch.java19
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/data/type/CraftTechnicalPiston.java19
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/data/type/CraftTripwire.java19
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/data/type/CraftTurtleEgg.java45
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/impl/CraftAnvil.java34
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/impl/CraftBanner.java118
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/impl/CraftBannerWall.java34
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/impl/CraftBed.java54
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/impl/CraftBeetroot.java34
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/impl/CraftBrewingStand.java49
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/impl/CraftBubbleColumn.java29
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/impl/CraftCactus.java34
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/impl/CraftCake.java34
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/impl/CraftCarrots.java34
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/impl/CraftCauldron.java34
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/impl/CraftChest.java62
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/impl/CraftChestTrapped.java62
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/impl/CraftChorusFlower.java34
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/impl/CraftChorusFruit.java57
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/impl/CraftCobbleWall.java71
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/impl/CraftCocoa.java53
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/impl/CraftCommand.java48
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/impl/CraftCoralFan.java34
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/impl/CraftCrops.java34
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/impl/CraftDaylightDetector.java48
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/impl/CraftDirtSnow.java29
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/impl/CraftDispenser.java48
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/impl/CraftDoor.java90
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/impl/CraftDropper.java48
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/impl/CraftEndRod.java34
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/impl/CraftEnderChest.java48
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/impl/CraftEnderPortalFrame.java48
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/impl/CraftFence.java71
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/impl/CraftFenceGate.java76
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/impl/CraftFire.java76
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/impl/CraftFloorSign.java132
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/impl/CraftFluids.java34
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/impl/CraftFurnace.java48
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/impl/CraftGlassPane.java71
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/impl/CraftGlazedTerracotta.java34
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/impl/CraftGrass.java29
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/impl/CraftHay.java34
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/impl/CraftHopper.java48
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/impl/CraftHugeMushroom.java57
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/impl/CraftIceFrost.java34
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/impl/CraftIronBars.java71
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/impl/CraftJukeBox.java24
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/impl/CraftKelp.java34
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/impl/CraftLadder.java48
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/impl/CraftLeaves.java40
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/impl/CraftLever.java62
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/impl/CraftLogAbstract.java34
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/impl/CraftMinecartDetector.java48
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/impl/CraftMinecartTrack.java34
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/impl/CraftMycel.java29
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/impl/CraftNetherWart.java34
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/impl/CraftNote.java54
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/impl/CraftObserver.java48
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/impl/CraftPiston.java48
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/impl/CraftPistonExtension.java62
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/impl/CraftPistonMoving.java48
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/impl/CraftPortal.java34
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/impl/CraftPotatoes.java34
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/impl/CraftPoweredRail.java48
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/impl/CraftPressurePlateBinary.java29
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/impl/CraftPressurePlateWeighted.java34
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/impl/CraftPumpkinCarved.java34
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/impl/CraftRedstoneComparator.java62
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/impl/CraftRedstoneLamp.java29
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/impl/CraftRedstoneOre.java29
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/impl/CraftRedstoneTorch.java29
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/impl/CraftRedstoneTorchWall.java48
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/impl/CraftRedstoneWire.java78
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/impl/CraftReed.java34
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/impl/CraftRepeater.java83
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/impl/CraftRotatable.java34
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/impl/CraftSapling.java34
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/impl/CraftSeaPickle.java53
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/impl/CraftShulkerBox.java34
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/impl/CraftSkull.java118
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/impl/CraftSkullPlayer.java118
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/impl/CraftSkullPlayerWall.java34
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/impl/CraftSkullWall.java34
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/impl/CraftSnow.java39
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/impl/CraftSoil.java34
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/impl/CraftStainedGlassPane.java71
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/impl/CraftStairs.java76
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/impl/CraftStem.java34
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/impl/CraftStemAttached.java34
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/impl/CraftStepAbstract.java43
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/impl/CraftStoneButton.java62
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/impl/CraftStructure.java29
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/impl/CraftTallPlantFlower.java29
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/impl/CraftTallPlantShearable.java29
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/impl/CraftTallSeaGrass.java29
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/impl/CraftTorchWall.java34
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/impl/CraftTrapdoor.java90
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/impl/CraftTripwire.java99
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/impl/CraftTripwireHook.java62
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/impl/CraftTurtleEgg.java55
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/impl/CraftVine.java57
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/impl/CraftWallSign.java48
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/impl/CraftWitherSkull.java118
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/impl/CraftWitherSkullWall.java34
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/impl/CraftWoodButton.java62
-rw-r--r--src/main/java/org/bukkit/craftbukkit/boss/CraftBossBar.java2
-rw-r--r--src/main/java/org/bukkit/craftbukkit/chunkio/ChunkIOProvider.java12
-rw-r--r--src/main/java/org/bukkit/craftbukkit/command/BukkitCommandWrapper.java56
-rw-r--r--src/main/java/org/bukkit/craftbukkit/command/CraftBlockCommandSender.java14
-rw-r--r--src/main/java/org/bukkit/craftbukkit/command/CraftCommandMap.java17
-rw-r--r--src/main/java/org/bukkit/craftbukkit/command/CraftFunctionCommandSender.java47
-rw-r--r--src/main/java/org/bukkit/craftbukkit/command/ProxiedNativeCommandSender.java8
-rw-r--r--src/main/java/org/bukkit/craftbukkit/command/VanillaCommandWrapper.java163
-rw-r--r--src/main/java/org/bukkit/craftbukkit/enchantments/CraftEnchantment.java62
-rw-r--r--src/main/java/org/bukkit/craftbukkit/entity/CraftArrow.java2
-rw-r--r--src/main/java/org/bukkit/craftbukkit/entity/CraftCod.java28
-rw-r--r--src/main/java/org/bukkit/craftbukkit/entity/CraftDolphin.java28
-rw-r--r--src/main/java/org/bukkit/craftbukkit/entity/CraftDrowned.java28
-rw-r--r--src/main/java/org/bukkit/craftbukkit/entity/CraftEnderSignal.java10
-rw-r--r--src/main/java/org/bukkit/craftbukkit/entity/CraftEnderman.java18
-rw-r--r--src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java34
-rw-r--r--src/main/java/org/bukkit/craftbukkit/entity/CraftFallingBlock.java12
-rw-r--r--src/main/java/org/bukkit/craftbukkit/entity/CraftFirework.java6
-rw-r--r--src/main/java/org/bukkit/craftbukkit/entity/CraftFish.java53
-rw-r--r--src/main/java/org/bukkit/craftbukkit/entity/CraftFishHook.java65
-rw-r--r--src/main/java/org/bukkit/craftbukkit/entity/CraftHumanEntity.java10
-rw-r--r--src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java4
-rw-r--r--src/main/java/org/bukkit/craftbukkit/entity/CraftMinecart.java24
-rw-r--r--src/main/java/org/bukkit/craftbukkit/entity/CraftMinecartCommand.java5
-rw-r--r--src/main/java/org/bukkit/craftbukkit/entity/CraftPainting.java6
-rw-r--r--src/main/java/org/bukkit/craftbukkit/entity/CraftPhantom.java38
-rw-r--r--src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java89
-rw-r--r--src/main/java/org/bukkit/craftbukkit/entity/CraftProjectile.java6
-rw-r--r--src/main/java/org/bukkit/craftbukkit/entity/CraftPufferFish.java38
-rw-r--r--src/main/java/org/bukkit/craftbukkit/entity/CraftSalmon.java28
-rw-r--r--src/main/java/org/bukkit/craftbukkit/entity/CraftTrident.java28
-rw-r--r--src/main/java/org/bukkit/craftbukkit/entity/CraftTropicalFish.java111
-rw-r--r--src/main/java/org/bukkit/craftbukkit/entity/CraftTurtle.java28
-rw-r--r--src/main/java/org/bukkit/craftbukkit/entity/CraftVillager.java8
-rw-r--r--src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java125
-rw-r--r--src/main/java/org/bukkit/craftbukkit/generator/CraftChunkData.java133
-rw-r--r--src/main/java/org/bukkit/craftbukkit/generator/CustomChunkGenerator.java248
-rw-r--r--src/main/java/org/bukkit/craftbukkit/generator/InternalChunkGenerator.java4
-rw-r--r--src/main/java/org/bukkit/craftbukkit/generator/NormalChunkGenerator.java84
-rw-r--r--src/main/java/org/bukkit/craftbukkit/inventory/CraftFurnaceRecipe.java17
-rw-r--r--src/main/java/org/bukkit/craftbukkit/inventory/CraftInventory.java67
-rw-r--r--src/main/java/org/bukkit/craftbukkit/inventory/CraftInventoryCrafting.java5
-rw-r--r--src/main/java/org/bukkit/craftbukkit/inventory/CraftInventoryCustom.java16
-rw-r--r--src/main/java/org/bukkit/craftbukkit/inventory/CraftInventoryDoubleChest.java3
-rw-r--r--src/main/java/org/bukkit/craftbukkit/inventory/CraftInventoryPlayer.java17
-rw-r--r--src/main/java/org/bukkit/craftbukkit/inventory/CraftItemFactory.java127
-rw-r--r--src/main/java/org/bukkit/craftbukkit/inventory/CraftItemStack.java178
-rw-r--r--src/main/java/org/bukkit/craftbukkit/inventory/CraftMerchantCustom.java4
-rw-r--r--src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaBanner.java40
-rw-r--r--src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaBlockState.java186
-rw-r--r--src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaBook.java2
-rw-r--r--src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaBookSigned.java2
-rw-r--r--src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaCharge.java2
-rw-r--r--src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaFirework.java2
-rw-r--r--src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaItem.java97
-rw-r--r--src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaMap.java2
-rw-r--r--src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaPotion.java2
-rw-r--r--src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaSkull.java16
-rw-r--r--src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaSpawnEgg.java92
-rw-r--r--src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaTropicalFishBucket.java168
-rw-r--r--src/main/java/org/bukkit/craftbukkit/inventory/CraftShapedRecipe.java9
-rw-r--r--src/main/java/org/bukkit/craftbukkit/inventory/CraftShapelessRecipe.java9
-rw-r--r--src/main/java/org/bukkit/craftbukkit/inventory/InventoryWrapper.java15
-rw-r--r--src/main/java/org/bukkit/craftbukkit/inventory/RecipeIterator.java35
-rw-r--r--src/main/java/org/bukkit/craftbukkit/map/CraftMapRenderer.java2
-rw-r--r--src/main/java/org/bukkit/craftbukkit/map/CraftMapView.java2
-rw-r--r--src/main/java/org/bukkit/craftbukkit/potion/CraftPotionEffectType.java4
-rw-r--r--src/main/java/org/bukkit/craftbukkit/potion/CraftPotionUtil.java6
-rw-r--r--src/main/java/org/bukkit/craftbukkit/scoreboard/CraftObjective.java4
-rw-r--r--src/main/java/org/bukkit/craftbukkit/scoreboard/CraftScoreboard.java10
-rw-r--r--src/main/java/org/bukkit/craftbukkit/scoreboard/CraftScoreboardManager.java8
-rw-r--r--src/main/java/org/bukkit/craftbukkit/scoreboard/CraftTeam.java2
-rw-r--r--src/main/java/org/bukkit/craftbukkit/tag/CraftBlockTag.java28
-rw-r--r--src/main/java/org/bukkit/craftbukkit/tag/CraftItemTag.java28
-rw-r--r--src/main/java/org/bukkit/craftbukkit/util/BlockStateListPopulator.java39
-rw-r--r--src/main/java/org/bukkit/craftbukkit/util/Commodore.java268
-rw-r--r--src/main/java/org/bukkit/craftbukkit/util/CraftChatMessage.java18
-rw-r--r--src/main/java/org/bukkit/craftbukkit/util/CraftEvil.java80
-rw-r--r--src/main/java/org/bukkit/craftbukkit/util/CraftLegacy.java366
-rw-r--r--src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java196
-rw-r--r--src/main/java/org/bukkit/craftbukkit/util/DummyGeneratorAccess.java254
-rw-r--r--src/main/java/org/bukkit/craftbukkit/util/StructureGrowDelegate.java70
-rw-r--r--src/main/java/org/bukkit/craftbukkit/util/permissions/CommandPermissions.java2
-rw-r--r--src/test/java/org/bukkit/ArtTest.java30
-rw-r--r--src/test/java/org/bukkit/BlockDataTest.java58
-rw-r--r--src/test/java/org/bukkit/DyeColorsTest.java5
-rw-r--r--src/test/java/org/bukkit/EnchantmentTest.java24
-rw-r--r--src/test/java/org/bukkit/LegacyTest.java89
-rw-r--r--src/test/java/org/bukkit/MaterialTest.java8
-rw-r--r--src/test/java/org/bukkit/ParticleTest.java25
-rw-r--r--src/test/java/org/bukkit/PerMaterialTest.java22
-rw-r--r--src/test/java/org/bukkit/StatisticsAndAchievementsTest.java46
-rw-r--r--src/test/java/org/bukkit/craftbukkit/generator/ChunkDataTest.java21
-rw-r--r--src/test/java/org/bukkit/craftbukkit/inventory/CompositeSerialization.java31
-rw-r--r--src/test/java/org/bukkit/craftbukkit/inventory/ItemFactoryTest.java4
-rw-r--r--src/test/java/org/bukkit/craftbukkit/inventory/ItemMetaTest.java62
-rw-r--r--src/test/java/org/bukkit/craftbukkit/inventory/ItemStackBookTest.java2
-rw-r--r--src/test/java/org/bukkit/craftbukkit/inventory/ItemStackFireworkChargeTest.java2
-rw-r--r--src/test/java/org/bukkit/craftbukkit/inventory/ItemStackFireworkTest.java2
-rw-r--r--src/test/java/org/bukkit/craftbukkit/inventory/ItemStackMapTest.java2
-rw-r--r--src/test/java/org/bukkit/craftbukkit/inventory/ItemStackSkullTest.java2
-rw-r--r--src/test/java/org/bukkit/craftbukkit/inventory/NMSCraftItemStackTest.java1
-rw-r--r--src/test/java/org/bukkit/entity/EntityTypesTest.java29
-rw-r--r--src/test/java/org/bukkit/entity/TropicalFishTest.java45
-rw-r--r--src/test/java/org/bukkit/map/MapTest.java2
-rw-r--r--src/test/java/org/bukkit/potion/PotionTest.java2
-rw-r--r--src/test/java/org/bukkit/support/AbstractTestingBase.java87
-rw-r--r--src/test/java/org/bukkit/support/DummyServer.java20
608 files changed, 17747 insertions, 9337 deletions
diff --git a/.gitignore b/.gitignore
index 73c16b1d..67fb370c 100644
--- a/.gitignore
+++ b/.gitignore
@@ -24,6 +24,7 @@ dependency-reduced-pom.xml
/manifest.mf
/world
+/logs
# Mac filesystem dust
.DS_Store
diff --git a/nms-patches/Advancement.patch b/nms-patches/Advancement.patch
index ba026b62..348a5175 100644
--- a/nms-patches/Advancement.patch
+++ b/nms-patches/Advancement.patch
@@ -1,6 +1,6 @@
--- a/net/minecraft/server/Advancement.java
+++ b/net/minecraft/server/Advancement.java
-@@ -24,6 +24,7 @@
+@@ -27,6 +27,7 @@
private final String[][] f;
private final Set<Advancement> g = Sets.newLinkedHashSet();
private final IChatBaseComponent h;
@@ -8,3 +8,12 @@
public Advancement(MinecraftKey minecraftkey, @Nullable Advancement advancement, @Nullable AdvancementDisplay advancementdisplay, AdvancementRewards advancementrewards, Map<String, Criterion> map, String[][] astring) {
this.d = minecraftkey;
+@@ -206,7 +207,7 @@
+ }
+
+ public Advancement b(MinecraftKey minecraftkey) {
+- if (!this.a((minecraftkey) -> {
++ if (!this.a((Function<MinecraftKey, Advancement>) (minecraftkey1) -> { // CraftBukkit - decompile error
+ return null;
+ })) {
+ throw new IllegalStateException("Tried to build incomplete advancement!");
diff --git a/nms-patches/AdvancementDataPlayer.patch b/nms-patches/AdvancementDataPlayer.patch
index 947510a9..0cadb6c8 100644
--- a/nms-patches/AdvancementDataPlayer.patch
+++ b/nms-patches/AdvancementDataPlayer.patch
@@ -1,6 +1,6 @@
--- a/net/minecraft/server/AdvancementDataPlayer.java
+++ b/net/minecraft/server/AdvancementDataPlayer.java
-@@ -31,7 +31,7 @@
+@@ -38,7 +38,7 @@
private static final Logger a = LogManager.getLogger();
private static final Gson b = (new GsonBuilder()).registerTypeAdapter(AdvancementProgress.class, new AdvancementProgress.a()).registerTypeAdapter(MinecraftKey.class, new MinecraftKey.a()).setPrettyPrinting().create();
@@ -9,7 +9,7 @@
};
private final MinecraftServer d;
private final File e;
-@@ -93,7 +93,7 @@
+@@ -100,7 +100,7 @@
Iterator iterator = this.data.entrySet().iterator();
while (iterator.hasNext()) {
@@ -18,29 +18,38 @@
if (((AdvancementProgress) entry.getValue()).isDone()) {
arraylist.add(entry.getKey());
-@@ -129,7 +129,7 @@
- if (this.e.isFile()) {
- try {
- String s = Files.toString(this.e, StandardCharsets.UTF_8);
-- Map map = (Map) ChatDeserializer.a(AdvancementDataPlayer.b, s, AdvancementDataPlayer.c.getType());
-+ Map<MinecraftKey, AdvancementProgress> map = (Map) ChatDeserializer.a(AdvancementDataPlayer.b, s, AdvancementDataPlayer.c.getType()); // CraftBukkit
-
- if (map == null) {
- throw new JsonParseException("Found null for advancements");
-@@ -143,7 +143,11 @@
- Advancement advancement = this.d.getAdvancementData().a((MinecraftKey) entry.getKey());
-
- if (advancement == null) {
-- AdvancementDataPlayer.a.warn("Ignored advancement \'" + entry.getKey() + "\' in progress file " + this.e + " - it doesn\'t exist anymore?");
-+ // CraftBukkit start
-+ if (((MinecraftKey) entry.getKey()).b().equals("minecraft")) {
-+ AdvancementDataPlayer.a.warn("Ignored advancement \'" + entry.getKey() + "\' in progress file " + this.e + " - it doesn\'t exist anymore?");
-+ }
-+ // CraftBukkit end
- } else {
- this.a(advancement, (AdvancementProgress) entry.getValue());
- }
-@@ -195,6 +199,7 @@
+@@ -140,7 +140,7 @@
+
+ try {
+ jsonreader.setLenient(false);
+- Dynamic dynamic = new Dynamic(JsonOps.INSTANCE, Streams.parse(jsonreader));
++ Dynamic<?> dynamic = new Dynamic(JsonOps.INSTANCE, Streams.parse(jsonreader)); // CraftBukkit - decompile error
+
+ if (!dynamic.get("DataVersion").flatMap(Dynamic::getNumberValue).isPresent()) {
+ dynamic = dynamic.set("DataVersion", dynamic.createInt(1343));
+@@ -148,7 +148,7 @@
+
+ dynamic = this.d.aB().update(DataFixTypes.ADVANCEMENTS, dynamic, dynamic.getInt("DataVersion"), 1513);
+ dynamic = dynamic.remove("DataVersion");
+- Map map = (Map) AdvancementDataPlayer.b.getAdapter(AdvancementDataPlayer.c).fromJsonTree((JsonElement) dynamic.getValue());
++ Map<MinecraftKey, AdvancementProgress> map = (Map) AdvancementDataPlayer.b.getAdapter(AdvancementDataPlayer.c).fromJsonTree((JsonElement) dynamic.getValue()); // CraftBukkit - decompile error
+
+ if (map == null) {
+ throw new JsonParseException("Found null for advancements");
+@@ -162,7 +162,11 @@
+ Advancement advancement = this.d.getAdvancementData().a((MinecraftKey) entry.getKey());
+
+ if (advancement == null) {
+- AdvancementDataPlayer.a.warn("Ignored advancement \'{}\' in progress file {} - it doesn\'t exist anymore?", entry.getKey(), this.e);
++ // CraftBukkit start
++ if (((MinecraftKey) entry.getKey()).b().equals("minecraft")) {
++ AdvancementDataPlayer.a.warn("Ignored advancement \'{}\' in progress file {} - it doesn\'t exist anymore?", entry.getKey(), this.e);
++ }
++ // CraftBukkit end
+ } else {
+ this.a(advancement, (AdvancementProgress) entry.getValue());
+ }
+@@ -231,6 +235,7 @@
this.i.add(advancement);
flag = true;
if (!flag1 && advancementprogress.isDone()) {
diff --git a/nms-patches/AdvancementRewards.patch b/nms-patches/AdvancementRewards.patch
deleted file mode 100644
index 8f0ea2c3..00000000
--- a/nms-patches/AdvancementRewards.patch
+++ /dev/null
@@ -1,52 +0,0 @@
---- a/net/minecraft/server/AdvancementRewards.java
-+++ b/net/minecraft/server/AdvancementRewards.java
-@@ -66,7 +66,24 @@
- CustomFunction customfunction = this.e.a(minecraftserver.aL());
-
- if (customfunction != null) {
-- ICommandListener icommandlistener = new ICommandListener() {
-+ // CraftBukkit start
-+ ICommandListener icommandlistener = new AdvancementCommandListener(entityplayer, minecraftserver);
-+
-+ minecraftserver.aL().a(customfunction, icommandlistener);
-+ }
-+
-+ }
-+
-+ public static class AdvancementCommandListener implements ICommandListener {
-+
-+ private final EntityPlayer entityplayer;
-+ private final MinecraftServer minecraftserver;
-+
-+ public AdvancementCommandListener(EntityPlayer entityplayer, MinecraftServer minecraftserver) {
-+ this.entityplayer = entityplayer;
-+ this.minecraftserver = minecraftserver;
-+ }
-+
- public String getName() {
- return entityplayer.getName();
- }
-@@ -108,12 +125,8 @@
- public MinecraftServer C_() {
- return entityplayer.C_();
- }
-- };
--
-- minecraftserver.aL().a(customfunction, icommandlistener);
-- }
--
-- }
-+ }
-+ // CraftBukkit end
-
- public String toString() {
- return "AdvancementRewards{experience=" + this.b + ", loot=" + Arrays.toString(this.c) + ", recipes=" + Arrays.toString(this.d) + ", function=" + this.e + '}';
-@@ -156,7 +169,7 @@
- return new AdvancementRewards(i, aminecraftkey, aminecraftkey1, customfunction_a);
- }
-
-- public Object deserialize(JsonElement jsonelement, Type type, JsonDeserializationContext jsondeserializationcontext) throws JsonParseException {
-+ public AdvancementRewards deserialize(JsonElement jsonelement, Type type, JsonDeserializationContext jsondeserializationcontext) throws JsonParseException { // CraftBukkit - decompile error
- return this.a(jsonelement, type, jsondeserializationcontext);
- }
- }
diff --git a/nms-patches/Advancements.patch b/nms-patches/Advancements.patch
index c6fb5b4c..9871ffc7 100644
--- a/nms-patches/Advancements.patch
+++ b/nms-patches/Advancements.patch
@@ -1,11 +1,11 @@
--- a/net/minecraft/server/Advancements.java
+++ b/net/minecraft/server/Advancements.java
-@@ -71,7 +71,7 @@
+@@ -72,7 +72,7 @@
}
}
-- Advancements.a.info("Loaded " + this.advancements.size() + " advancements");
-+ // Advancements.a.info("Loaded " + this.b.size() + " advancements"); // CraftBukkit - moved to AdvancementDataWorld#reload
+- Advancements.a.info("Loaded {} advancements", Integer.valueOf(this.advancements.size()));
++ // Advancements.a.info("Loaded {} advancements", Integer.valueOf(this.advancements.size())); // CraftBukkit - moved to AdvancementDataWorld#reload
}
public void a() {
diff --git a/nms-patches/Block.patch b/nms-patches/Block.patch
index 8060e69d..abff3dcd 100644
--- a/nms-patches/Block.patch
+++ b/nms-patches/Block.patch
@@ -1,28 +1,28 @@
--- a/net/minecraft/server/Block.java
+++ b/net/minecraft/server/Block.java
-@@ -37,7 +37,7 @@
- private String name;
-
- public static int getId(Block block) {
-- return Block.REGISTRY.a((Object) block);
-+ return Block.REGISTRY.a(block); // CraftBukkit - decompile error
+@@ -213,7 +213,7 @@
}
- public static int getCombinedId(IBlockData iblockdata) {
-@@ -343,7 +343,8 @@
- int j = this.getDropCount(i, world.random);
+ public Block(Block.Info block_info) {
+- BlockStateList.a blockstatelist_a = new BlockStateList.a(this);
++ BlockStateList.a<Block, IBlockData> blockstatelist_a = new BlockStateList.a(this); // CraftBukkit - decompile error
+
+ this.a(blockstatelist_a);
+ this.blockStateList = blockstatelist_a.a(BlockData::new);
+@@ -428,7 +428,8 @@
+ int j = this.getDropCount(iblockdata, i, world, blockposition, world.random);
for (int k = 0; k < j; ++k) {
-- if (world.random.nextFloat() <= f) {
+- if (f >= 1.0F || 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 (f >= 1.0F || world.random.nextFloat() < f) {
+ Item item = this.getDropType(iblockdata, world, blockposition, i).getItem();
- if (item != Items.a) {
-@@ -364,7 +365,13 @@
+ if (item != Items.AIR) {
+@@ -449,7 +450,13 @@
EntityItem entityitem = new EntityItem(world, (double) blockposition.getX() + d0, (double) blockposition.getY() + d1, (double) blockposition.getZ() + d2, itemstack);
- entityitem.q();
+ entityitem.n();
- world.addEntity(entityitem);
+ // CraftBukkit start
+ if (world.captureDrops != null) {
@@ -34,34 +34,25 @@
}
}
-@@ -931,7 +938,7 @@
-
- if (hashset.contains(block16)) {
- for (int i = 0; i < 15; ++i) {
-- int j = Block.REGISTRY.a((Object) block16) << 4 | i;
-+ int j = Block.REGISTRY.a(block16) << 4 | i; // CraftBukkit - decompile error
-
- Block.REGISTRY_ID.a(block16.fromLegacyData(i), j);
- }
-@@ -940,7 +947,7 @@
+@@ -668,7 +675,7 @@
+ }
- while (unmodifiableiterator.hasNext()) {
- IBlockData iblockdata = (IBlockData) unmodifiableiterator.next();
-- int k = Block.REGISTRY.a((Object) block16) << 4 | block16.toLegacyData(iblockdata);
-+ int k = Block.REGISTRY.a(block16) << 4 | block16.toLegacyData(iblockdata); // CraftBukkit - decompile error
+ public String toString() {
+- return "Block{" + Block.REGISTRY.b(this) + "}";
++ return Block.REGISTRY.b(this).toString(); // CraftBukkit - cheap hack
+ }
- Block.REGISTRY_ID.a(iblockdata, k);
- }
-@@ -949,6 +956,12 @@
+ public static boolean c(Block block) {
+@@ -1380,6 +1387,12 @@
}
+ // CraftBukkit start
-+ public int getExpDrop(World world, IBlockData data, int enchantmentLevel) {
++ public int getExpDrop(IBlockData iblockdata, World world, BlockPosition blockposition, int enchantmentLevel) {
+ return 0;
+ }
+ // CraftBukkit end
+
- private static void a(int i, MinecraftKey minecraftkey, Block block) {
- Block.REGISTRY.a(i, minecraftkey, block);
+ private static void a(MinecraftKey minecraftkey, Block block) {
+ Block.REGISTRY.a(minecraftkey, block);
}
diff --git a/nms-patches/BlockButtonAbstract.patch b/nms-patches/BlockButtonAbstract.patch
index bf32c8f2..028d1dd1 100644
--- a/nms-patches/BlockButtonAbstract.patch
+++ b/nms-patches/BlockButtonAbstract.patch
@@ -9,10 +9,10 @@
+import org.bukkit.event.entity.EntityInteractEvent;
+// CraftBukkit end
+
- public abstract class BlockButtonAbstract extends BlockDirectional {
+ public abstract class BlockButtonAbstract extends BlockAttachable {
- public static final BlockStateBoolean POWERED = BlockStateBoolean.of("powered");
-@@ -126,6 +131,19 @@
+ public static final BlockStateBoolean POWERED = BlockProperties.t;
+@@ -77,6 +82,19 @@
if (((Boolean) iblockdata.get(BlockButtonAbstract.POWERED)).booleanValue()) {
return true;
} else {
@@ -29,27 +29,27 @@
+ return true;
+ }
+ // CraftBukkit end
- world.setTypeAndData(blockposition, iblockdata.set(BlockButtonAbstract.POWERED, Boolean.valueOf(true)), 3);
- world.b(blockposition, blockposition);
- this.a(entityhuman, world, blockposition);
-@@ -167,6 +185,16 @@
- if (this.I) {
- this.d(iblockdata, world, blockposition);
- } else {
-+ // CraftBukkit start
-+ org.bukkit.block.Block block = world.getWorld().getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ());
+ world.setTypeAndData(blockposition, (IBlockData) iblockdata.set(BlockButtonAbstract.POWERED, Boolean.valueOf(true)), 3);
+ this.a(entityhuman, world, blockposition, true);
+ this.c(iblockdata, world, blockposition);
+@@ -118,6 +136,16 @@
+ if (this.F) {
+ this.b(iblockdata, world, blockposition);
+ } 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);
++ 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.c(world, blockposition, (EnumDirection) iblockdata.get(BlockButtonAbstract.FACING));
- this.b(world, blockposition);
-@@ -192,7 +220,41 @@
++ if (eventRedstone.getNewCurrent() > 0) {
++ return;
++ }
++ // CraftBukkit end
+ world.setTypeAndData(blockposition, (IBlockData) iblockdata.set(BlockButtonAbstract.POWERED, Boolean.valueOf(false)), 3);
+ this.c(iblockdata, world, blockposition);
+ this.a((EntityHuman) null, world, blockposition, false);
+@@ -137,7 +165,44 @@
boolean flag = !list.isEmpty();
boolean flag1 = ((Boolean) iblockdata.get(BlockButtonAbstract.POWERED)).booleanValue();
@@ -77,34 +77,20 @@
+ }
+ // 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.c(world, blockposition, (EnumDirection) iblockdata.get(BlockButtonAbstract.FACING));
- world.b(blockposition, blockposition);
-@@ -200,6 +262,16 @@
- }
-
- if (!flag && flag1) {
+ if (flag != flag1) {
+ // CraftBukkit start
++ boolean powered = flag1;
+ 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, 15, 0);
++ BlockRedstoneEvent eventRedstone = new BlockRedstoneEvent(block, old, current);
+ world.getServer().getPluginManager().callEvent(eventRedstone);
+
-+ if (eventRedstone.getNewCurrent() > 0) {
++ if ((flag && eventRedstone.getNewCurrent() <= 0) || (!flag && eventRedstone.getNewCurrent() > 0)) {
+ return;
+ }
+ // CraftBukkit end
- world.setTypeUpdate(blockposition, iblockdata.set(BlockButtonAbstract.POWERED, Boolean.valueOf(false)));
- this.c(world, blockposition, (EnumDirection) iblockdata.get(BlockButtonAbstract.FACING));
- world.b(blockposition, blockposition);
+ world.setTypeAndData(blockposition, (IBlockData) iblockdata.set(BlockButtonAbstract.POWERED, Boolean.valueOf(flag)), 3);
+ this.c(iblockdata, world, blockposition);
+ this.a((EntityHuman) null, world, blockposition, flag);
diff --git a/nms-patches/BlockCactus.patch b/nms-patches/BlockCactus.patch
index 282dcd80..9be8a495 100644
--- a/nms-patches/BlockCactus.patch
+++ b/nms-patches/BlockCactus.patch
@@ -8,26 +8,23 @@
+
public class BlockCactus extends Block {
- public static final BlockStateInteger AGE = BlockStateInteger.of("age", 0, 15);
-@@ -30,9 +32,10 @@
- int j = ((Integer) iblockdata.get(BlockCactus.AGE)).intValue();
+ public static final BlockStateInteger AGE = BlockProperties.W;
+@@ -31,7 +33,7 @@
+ int j = ((Integer) iblockdata.get(BlockCactus.AGE)).intValue();
- if (j == 15) {
-- world.setTypeUpdate(blockposition1, this.getBlockData());
-+ // world.setTypeUpdate(blockposition1, this.getBlockData()); // CraftBukkit
- IBlockData iblockdata1 = iblockdata.set(BlockCactus.AGE, Integer.valueOf(0));
+ if (j == 15) {
+- world.setTypeUpdate(blockposition1, this.getBlockData());
++ CraftEventFactory.handleBlockGrowEvent(world, blockposition1, this.getBlockData()); // CraftBukkit
+ IBlockData iblockdata1 = (IBlockData) iblockdata.set(BlockCactus.AGE, Integer.valueOf(0));
-+ CraftEventFactory.handleBlockGrowEvent(world, blockposition1.getX(), blockposition1.getY(), blockposition1.getZ(), this, 0); // CraftBukkit
- world.setTypeAndData(blockposition, iblockdata1, 4);
- iblockdata1.doPhysics(world, blockposition1, this, blockposition);
- } else {
-@@ -87,7 +90,9 @@
+ world.setTypeAndData(blockposition, iblockdata1, 4);
+@@ -92,7 +94,9 @@
}
- public void a(World world, BlockPosition blockposition, IBlockData iblockdata, Entity entity) {
+ public void a(IBlockData iblockdata, World world, BlockPosition blockposition, 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) {
+ public TextureType c() {
diff --git a/nms-patches/BlockCake.patch b/nms-patches/BlockCake.patch
index 80b0801d..4830491d 100644
--- a/nms-patches/BlockCake.patch
+++ b/nms-patches/BlockCake.patch
@@ -1,9 +1,9 @@
--- a/net/minecraft/server/BlockCake.java
+++ b/net/minecraft/server/BlockCake.java
-@@ -40,7 +40,18 @@
+@@ -33,7 +33,18 @@
return false;
} else {
- entityhuman.b(StatisticList.H);
+ entityhuman.a(StatisticList.EAT_CAKE_SLICE);
- entityhuman.getFoodData().eat(2, 0.1F);
+ // CraftBukkit start
+ // entityhuman.getFoodData().eat(2, 0.1F);
diff --git a/nms-patches/BlockCauldron.patch b/nms-patches/BlockCauldron.patch
index 4ba652e4..9b862840 100644
--- a/nms-patches/BlockCauldron.patch
+++ b/nms-patches/BlockCauldron.patch
@@ -1,14 +1,14 @@
--- a/net/minecraft/server/BlockCauldron.java
+++ b/net/minecraft/server/BlockCauldron.java
-@@ -3,6 +3,7 @@
- import java.util.List;
- import java.util.Random;
- import javax.annotation.Nullable;
-+import org.bukkit.event.block.CauldronLevelChangeEvent; // CraftBukkit
+@@ -1,5 +1,7 @@
+ package net.minecraft.server;
++import org.bukkit.event.block.CauldronLevelChangeEvent; // CraftBukkit
++
public class BlockCauldron extends Block {
-@@ -43,8 +44,13 @@
+ public static final BlockStateInteger LEVEL = BlockProperties.ae;
+@@ -32,8 +34,13 @@
float f = (float) blockposition.getY() + (6.0F + (float) (3 * i)) / 16.0F;
if (!world.isClientSide && entity.isBurning() && i > 0 && entity.getBoundingBox().b <= (double) f) {
@@ -23,7 +23,7 @@
}
}
-@@ -60,18 +66,27 @@
+@@ -49,18 +56,27 @@
if (item == Items.WATER_BUCKET) {
if (i < 3 && !world.isClientSide) {
@@ -35,11 +35,11 @@
entityhuman.a(enumhand, new ItemStack(Items.BUCKET));
}
- entityhuman.b(StatisticList.I);
+ entityhuman.a(StatisticList.FILL_CAULDRON);
- this.a(world, blockposition, iblockdata, 3);
+ // this.a(world, blockposition, iblockdata, 3);
+ // CraftBukkit end
- world.a((EntityHuman) null, blockposition, SoundEffects.Q, SoundCategory.BLOCKS, 1.0F, 1.0F);
+ world.a((EntityHuman) null, blockposition, SoundEffects.ITEM_BUCKET_EMPTY, SoundCategory.BLOCKS, 1.0F, 1.0F);
}
return true;
@@ -52,17 +52,17 @@
if (!entityhuman.abilities.canInstantlyBuild) {
itemstack.subtract(1);
if (itemstack.isEmpty()) {
-@@ -82,7 +97,8 @@
+@@ -71,7 +87,8 @@
}
- entityhuman.b(StatisticList.J);
+ entityhuman.a(StatisticList.USE_CAULDRON);
- this.a(world, blockposition, iblockdata, 0);
+ // this.a(world, blockposition, iblockdata, 0);
+ // CraftBukkit end
- world.a((EntityHuman) null, blockposition, SoundEffects.S, SoundCategory.BLOCKS, 1.0F, 1.0F);
+ world.a((EntityHuman) null, blockposition, SoundEffects.ITEM_BUCKET_FILL, SoundCategory.BLOCKS, 1.0F, 1.0F);
}
-@@ -92,6 +108,10 @@
+@@ -81,6 +98,10 @@
if (item == Items.GLASS_BOTTLE) {
if (i > 0 && !world.isClientSide) {
@@ -72,11 +72,11 @@
+ }
if (!entityhuman.abilities.canInstantlyBuild) {
itemstack1 = PotionUtil.a(new ItemStack(Items.POTION), Potions.b);
- entityhuman.b(StatisticList.J);
-@@ -106,12 +126,17 @@
+ entityhuman.a(StatisticList.USE_CAULDRON);
+@@ -95,12 +116,17 @@
}
- world.a((EntityHuman) null, blockposition, SoundEffects.N, SoundCategory.BLOCKS, 1.0F, 1.0F);
+ world.a((EntityHuman) null, blockposition, SoundEffects.ITEM_BOTTLE_FILL, SoundCategory.BLOCKS, 1.0F, 1.0F);
- this.a(world, blockposition, iblockdata, i - 1);
+ // this.a(world, blockposition, iblockdata, i - 1);
+ // CraftBukkit end
@@ -91,44 +91,44 @@
+ }
if (!entityhuman.abilities.canInstantlyBuild) {
itemstack1 = new ItemStack(Items.GLASS_BOTTLE);
- entityhuman.b(StatisticList.J);
-@@ -122,7 +147,8 @@
+ entityhuman.a(StatisticList.USE_CAULDRON);
+@@ -111,7 +137,8 @@
}
- world.a((EntityHuman) null, blockposition, SoundEffects.M, SoundCategory.BLOCKS, 1.0F, 1.0F);
+ world.a((EntityHuman) null, blockposition, SoundEffects.ITEM_BOTTLE_EMPTY, SoundCategory.BLOCKS, 1.0F, 1.0F);
- this.a(world, blockposition, iblockdata, i + 1);
+ // this.a(world, blockposition, iblockdata, i + 1);
+ // CraftBukkit end
}
return true;
-@@ -131,8 +157,13 @@
- ItemArmor itemarmor = (ItemArmor) item;
+@@ -120,8 +147,13 @@
+ ItemArmorColorable itemarmorcolorable = (ItemArmorColorable) item;
- if (itemarmor.d() == ItemArmor.EnumArmorMaterial.LEATHER && itemarmor.e_(itemstack) && !world.isClientSide) {
+ if (itemarmorcolorable.e(itemstack) && !world.isClientSide) {
+ // CraftBukkit start
+ if (!this.changeLevel(world, blockposition, iblockdata, i - 1, entityhuman, CauldronLevelChangeEvent.ChangeReason.ARMOR_WASH)) {
+ return true;
+ }
- itemarmor.d(itemstack);
+ itemarmorcolorable.g(itemstack);
- this.a(world, blockposition, iblockdata, i - 1);
+ // this.a(world, blockposition, iblockdata, i - 1);
+ // CraftBukkit end
- entityhuman.b(StatisticList.K);
+ entityhuman.a(StatisticList.CLEAN_ARMOR);
return true;
}
-@@ -140,13 +171,18 @@
+@@ -129,13 +161,18 @@
if (i > 0 && item instanceof ItemBanner) {
- if (TileEntityBanner.b(itemstack) > 0 && !world.isClientSide) {
+ if (TileEntityBanner.a(itemstack) > 0 && !world.isClientSide) {
+ // CraftBukkit start
+ if (!this.changeLevel(world, blockposition, iblockdata, i - 1, entityhuman, CauldronLevelChangeEvent.ChangeReason.BANNER_WASH)) {
+ return true;
+ }
itemstack1 = itemstack.cloneItemStack();
itemstack1.setCount(1);
- TileEntityBanner.c(itemstack1);
- entityhuman.b(StatisticList.L);
+ TileEntityBanner.b(itemstack1);
+ entityhuman.a(StatisticList.CLEAN_BANNER);
if (!entityhuman.abilities.canInstantlyBuild) {
itemstack.subtract(1);
- this.a(world, blockposition, iblockdata, i - 1);
@@ -137,13 +137,13 @@
}
if (itemstack.isEmpty()) {
-@@ -167,9 +203,25 @@
+@@ -171,9 +208,25 @@
}
}
+ // CraftBukkit start
public void a(World world, BlockPosition blockposition, IBlockData iblockdata, int i) {
-- world.setTypeAndData(blockposition, iblockdata.set(BlockCauldron.LEVEL, Integer.valueOf(MathHelper.clamp(i, 0, 3))), 2);
+- world.setTypeAndData(blockposition, (IBlockData) iblockdata.set(BlockCauldron.LEVEL, Integer.valueOf(MathHelper.clamp(i, 0, 3))), 2);
+ this.changeLevel(world, blockposition, iblockdata, i, null, CauldronLevelChangeEvent.ChangeReason.UNKNOWN);
+ }
+
@@ -157,19 +157,19 @@
+ if (event.isCancelled()) {
+ return false;
+ }
-+ world.setTypeAndData(blockposition, iblockdata.set(BlockCauldron.LEVEL, event.getNewLevel()), 2);
++ world.setTypeAndData(blockposition, (IBlockData) iblockdata.set(BlockCauldron.LEVEL, event.getNewLevel()), 2);
world.updateAdjacentComparators(blockposition, this);
+ return true;
+ // CraftBukkit end
}
- public void h(World world, BlockPosition blockposition) {
-@@ -180,7 +232,7 @@
+ public void c(World world, BlockPosition blockposition) {
+@@ -184,7 +237,7 @@
IBlockData iblockdata = world.getType(blockposition);
if (((Integer) iblockdata.get(BlockCauldron.LEVEL)).intValue() < 3) {
-- world.setTypeAndData(blockposition, iblockdata.a((IBlockState) BlockCauldron.LEVEL), 2);
-+ this.a(world, blockposition, iblockdata.a((IBlockState) BlockCauldron.LEVEL), 2); // CraftBukkit
+- world.setTypeAndData(blockposition, (IBlockData) iblockdata.a((IBlockState) BlockCauldron.LEVEL), 2);
++ this.a(world, blockposition, (IBlockData) iblockdata.a((IBlockState) BlockCauldron.LEVEL), 2); // CraftBukkit
}
}
diff --git a/nms-patches/BlockChorusFlower.patch b/nms-patches/BlockChorusFlower.patch
index e5482d55..2e24180c 100644
--- a/nms-patches/BlockChorusFlower.patch
+++ b/nms-patches/BlockChorusFlower.patch
@@ -8,46 +8,31 @@
+
public class BlockChorusFlower extends Block {
- public static final BlockStateInteger AGE = BlockStateInteger.of("age", 0, 5);
-@@ -68,8 +70,20 @@
+ public static final BlockStateInteger AGE = BlockProperties.U;
+@@ -61,8 +63,12 @@
}
- if (flag && a(world, blockposition1, (EnumDirection) null) && world.isEmpty(blockposition.up(2))) {
-- world.setTypeAndData(blockposition, Blocks.CHORUS_PLANT.getBlockData(), 2);
-- this.a(world, blockposition1, i);
-+ // world.setTypeAndData(blockposition, Blocks.CHORUS_PLANT.getBlockData(), 2);
-+ // this.a(world, blockposition1, i);
+ if (flag && a((IWorldReader) world, blockposition1, (EnumDirection) null) && world.isEmpty(blockposition.up(2))) {
+- world.setTypeAndData(blockposition, this.b.a((IBlockAccess) world, blockposition), 2);
+- this.b(world, blockposition1, i);
+ // CraftBukkit start - add event
-+ BlockPosition target = blockposition1;
-+ if (CraftEventFactory.handleBlockSpreadEvent(
-+ world.getWorld().getBlockAt(target.getX(), target.getY(), target.getZ()),
-+ world.getWorld().getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ()),
-+ this,
-+ toLegacyData(this.getBlockData().set(BlockChorusFlower.AGE, Integer.valueOf(i)))
-+ )) {
-+ world.setTypeAndData(blockposition, Blocks.CHORUS_PLANT.getBlockData(), 2);
-+ world.triggerEffect(1033, blockposition, 0);
++ if (CraftEventFactory.handleBlockSpreadEvent(world, blockposition, blockposition1, this.getBlockData().set(BlockChorusFlower.AGE, Integer.valueOf(i)), 2)) {
++ world.setTypeAndData(blockposition, this.b.a((IBlockAccess) world, blockposition), 2);
++ this.b(world, blockposition1, i);
+ }
+ // CraftBukkit end
} else if (i < 4) {
j = random.nextInt(4);
- boolean flag2 = false;
-@@ -83,18 +97,53 @@
+ if (flag1) {
+@@ -76,18 +82,30 @@
BlockPosition blockposition2 = blockposition.shift(enumdirection);
- if (world.isEmpty(blockposition2) && world.isEmpty(blockposition2.down()) && a(world, blockposition2, enumdirection.opposite())) {
-- this.a(world, blockposition2, i + 1);
+ if (world.isEmpty(blockposition2) && world.isEmpty(blockposition2.down()) && a((IWorldReader) world, blockposition2, enumdirection.opposite())) {
+- this.b(world, blockposition2, i + 1);
- flag2 = true;
+ // CraftBukkit start - add event
-+ // this.a(world, blockposition2, i + 1);
-+ BlockPosition target = blockposition2;
-+ if (CraftEventFactory.handleBlockSpreadEvent(
-+ world.getWorld().getBlockAt(target.getX(), target.getY(), target.getZ()),
-+ world.getWorld().getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ()),
-+ this,
-+ toLegacyData(this.getBlockData().set(BlockChorusFlower.AGE, Integer.valueOf(i + 1)))
-+ )) {
-+ world.triggerEffect(1033, blockposition, 0);
++ if (CraftEventFactory.handleBlockSpreadEvent(world, blockposition, blockposition2, this.getBlockData().set(BlockChorusFlower.AGE, Integer.valueOf(i + 1)), 2)) {
++ this.b(world, blockposition2, i + 1);
+ flag2 = true;
+ }
+ // CraftBukkit end
@@ -55,37 +40,21 @@
}
if (flag2) {
- world.setTypeAndData(blockposition, Blocks.CHORUS_PLANT.getBlockData(), 2);
+ world.setTypeAndData(blockposition, this.b.a((IBlockAccess) world, blockposition), 2);
} else {
-- this.c(world, blockposition);
+- this.a(world, blockposition);
+ // CraftBukkit - add event
-+ if (CraftEventFactory.handleBlockGrowEvent(
-+ world,
-+ blockposition.getX(),
-+ blockposition.getY(),
-+ blockposition.getZ(),
-+ this,
-+ toLegacyData(iblockdata.set(BlockChorusFlower.AGE, Integer.valueOf(5)))
-+ )) {
-+ world.triggerEffect(1034, blockposition, 0);
++ if (CraftEventFactory.handleBlockGrowEvent(world, blockposition, this.getBlockData().set(BlockChorusFlower.AGE, Integer.valueOf(5)), 2)) {
++ this.a(world, blockposition);
+ }
-+ // this.c(world, blockposition);
+ // CraftBukkit end
}
- } else if (i == 4) {
-- this.c(world, blockposition);
+ } else {
+- this.a(world, blockposition);
+ // CraftBukkit - add event
-+ if (CraftEventFactory.handleBlockGrowEvent(
-+ world,
-+ blockposition.getX(),
-+ blockposition.getY(),
-+ blockposition.getZ(),
-+ this,
-+ toLegacyData(iblockdata.set(BlockChorusFlower.AGE, Integer.valueOf(5)))
-+ )) {
-+ world.triggerEffect(1034, blockposition, 0);
++ if (CraftEventFactory.handleBlockGrowEvent(world, blockposition, this.getBlockData().set(BlockChorusFlower.AGE, Integer.valueOf(5)), 2)) {
++ this.a(world, blockposition);
+ }
-+ // this.c(world, blockposition);
+ // CraftBukkit end
}
diff --git a/nms-patches/BlockCocoa.patch b/nms-patches/BlockCocoa.patch
index 470a26f6..3affcb74 100644
--- a/nms-patches/BlockCocoa.patch
+++ b/nms-patches/BlockCocoa.patch
@@ -1,35 +1,29 @@
--- a/net/minecraft/server/BlockCocoa.java
+++ b/net/minecraft/server/BlockCocoa.java
-@@ -2,6 +2,8 @@
-
+@@ -3,6 +3,8 @@
import java.util.Random;
+ import javax.annotation.Nullable;
+import org.bukkit.craftbukkit.event.CraftEventFactory; // CraftBukkit
+
public class BlockCocoa extends BlockFacingHorizontal implements IBlockFragilePlantElement {
- public static final BlockStateInteger AGE = BlockStateInteger.of("age", 0, 2);
-@@ -23,7 +25,10 @@
+ public static final BlockStateInteger AGE = BlockProperties.S;
+@@ -21,7 +23,7 @@
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
+- world.setTypeAndData(blockposition, (IBlockData) iblockdata.set(BlockCocoa.AGE, Integer.valueOf(i + 1)), 2);
++ CraftEventFactory.handleBlockGrowEvent(world, blockposition, (IBlockData) iblockdata.set(BlockCocoa.AGE, Integer.valueOf(i + 1)), 2); // CraftBukkkit
}
}
-@@ -124,7 +129,10 @@
+@@ -109,7 +111,7 @@
}
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
+- world.setTypeAndData(blockposition, (IBlockData) iblockdata.set(BlockCocoa.AGE, Integer.valueOf(((Integer) iblockdata.get(BlockCocoa.AGE)).intValue() + 1)), 2);
++ CraftEventFactory.handleBlockGrowEvent(world, blockposition, (IBlockData) iblockdata.set(BlockCocoa.AGE, Integer.valueOf(((Integer) iblockdata.get(BlockCocoa.AGE)).intValue() + 1)), 2); // CraftBukkit
}
- public IBlockData fromLegacyData(int i) {
+ public TextureType c() {
diff --git a/nms-patches/BlockCommand.patch b/nms-patches/BlockCommand.patch
index 12a88a41..4f0974f2 100644
--- a/nms-patches/BlockCommand.patch
+++ b/nms-patches/BlockCommand.patch
@@ -12,7 +12,7 @@
@@ -30,6 +32,15 @@
TileEntityCommand tileentitycommand = (TileEntityCommand) tileentity;
boolean flag = world.isBlockIndirectlyPowered(blockposition);
- boolean flag1 = tileentitycommand.f();
+ boolean flag1 = tileentitycommand.d();
+ // CraftBukkit start
+ org.bukkit.block.Block bukkitBlock = world.getWorld().getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ());
+ int old = flag1 ? 15 : 0;
@@ -24,4 +24,4 @@
+ // CraftBukkit end
tileentitycommand.a(flag);
- if (!flag1 && !tileentitycommand.h() && tileentitycommand.l() != TileEntityCommand.Type.SEQUENCE) {
+ if (!flag1 && !tileentitycommand.e() && tileentitycommand.j() != TileEntityCommand.Type.SEQUENCE) {
diff --git a/nms-patches/BlockConcretePowder.patch b/nms-patches/BlockConcretePowder.patch
index dd2708f7..83e11280 100644
--- a/nms-patches/BlockConcretePowder.patch
+++ b/nms-patches/BlockConcretePowder.patch
@@ -1,22 +1,46 @@
--- a/net/minecraft/server/BlockConcretePowder.java
+++ b/net/minecraft/server/BlockConcretePowder.java
-@@ -11,8 +11,8 @@
+@@ -1,5 +1,10 @@
+ package net.minecraft.server;
+
++// CraftBukkit start
++import org.bukkit.craftbukkit.block.CraftBlockState;
++import org.bukkit.event.block.BlockFormEvent;
++// CraftBukkit end
++
+ public class BlockConcretePowder extends BlockFalling {
+
+ private final IBlockData a;
+@@ -10,8 +15,8 @@
}
public void a(World world, BlockPosition blockposition, IBlockData iblockdata, IBlockData iblockdata1) {
- if (iblockdata1.getMaterial().isLiquid()) {
-- world.setTypeAndData(blockposition, Blocks.dR.getBlockData().set(BlockCloth.COLOR, iblockdata.get(BlockConcretePowder.a)), 3);
-+ if (iblockdata1.getMaterial().isLiquid() && world.getType(blockposition).getBlock() != Blocks.dR) { // CraftBukkit - don't double concrete
-+ org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockFormEvent(world, blockposition, Blocks.dR.getBlockData().set(BlockCloth.COLOR, iblockdata.get(BlockConcretePowder.a)), null); // CraftBukkit
+- world.setTypeAndData(blockposition, this.a, 3);
++ if (iblockdata1.getMaterial().isLiquid() && !(world.getType(blockposition).getBlock() instanceof BlockConcretePowder)) { // CraftBukkit - don't double concrete
++ org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockFormEvent(world, blockposition, this.a, 3);
}
}
-@@ -36,7 +36,7 @@
- }
-
- if (flag) {
-- world.setTypeAndData(blockposition, Blocks.dR.getBlockData().set(BlockCloth.COLOR, iblockdata.get(BlockConcretePowder.a)), 3);
-+ org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockFormEvent(world, blockposition, Blocks.dR.getBlockData().set(BlockCloth.COLOR, iblockdata.get(BlockConcretePowder.a)), null); // CraftBukkit
- }
+@@ -45,6 +50,20 @@
+ }
- return flag;
+ public IBlockData updateState(IBlockData iblockdata, EnumDirection enumdirection, IBlockData iblockdata1, GeneratorAccess generatoraccess, BlockPosition blockposition, BlockPosition blockposition1) {
+- return a((IBlockAccess) generatoraccess, blockposition) ? this.a : super.updateState(iblockdata, enumdirection, iblockdata1, generatoraccess, blockposition, blockposition1);
++ // CraftBukkit start
++ if (a((IBlockAccess) generatoraccess, blockposition)) {
++ CraftBlockState blockState = CraftBlockState.getBlockState(generatoraccess, blockposition);
++ blockState.setData(this.a);
++
++ BlockFormEvent event = new BlockFormEvent(blockState.getBlock(), blockState);
++ generatoraccess.getMinecraftWorld().getMinecraftServer().server.getPluginManager().callEvent(event);
++
++ if (!event.isCancelled()) {
++ return blockState.getHandle();
++ }
++ }
++
++ return super.updateState(iblockdata, enumdirection, iblockdata1, generatoraccess, blockposition, blockposition1);
++ // CraftBukkit end
+ }
+ }
diff --git a/nms-patches/BlockCrops.patch b/nms-patches/BlockCrops.patch
index 385751da..f5169e79 100644
--- a/nms-patches/BlockCrops.patch
+++ b/nms-patches/BlockCrops.patch
@@ -8,28 +8,22 @@
+
public class BlockCrops extends BlockPlant implements IBlockFragilePlantElement {
- public static final BlockStateInteger AGE = BlockStateInteger.of("age", 0, 7);
-@@ -53,7 +55,10 @@
- float f = a((Block) this, world, blockposition);
+ public static final BlockStateInteger AGE = BlockProperties.V;
+@@ -49,7 +51,7 @@
+ float f = a((Block) this, (IBlockAccess) world, blockposition);
if (random.nextInt((int) (25.0F / f) + 1) == 0) {
- world.setTypeAndData(blockposition, this.setAge(i + 1), 2);
-+ // CraftBukkit start
-+ IBlockData data = this.setAge(i + 1);
-+ CraftEventFactory.handleBlockGrowEvent(world, blockposition.getX(), blockposition.getY(), blockposition.getZ(), this, toLegacyData(data));
-+ // CraftBukkit end
++ CraftEventFactory.handleBlockGrowEvent(world, blockposition, this.setAge(i + 1), 2); // CraftBukkit
}
}
}
-@@ -68,7 +73,10 @@
+@@ -64,7 +66,7 @@
i = j;
}
- world.setTypeAndData(blockposition, this.setAge(i), 2);
-+ // CraftBukkit start
-+ IBlockData data = this.setAge(i);
-+ CraftEventFactory.handleBlockGrowEvent(world, blockposition.getX(), blockposition.getY(), blockposition.getZ(), this, toLegacyData(data));
-+ // CraftBukkit end
++ CraftEventFactory.handleBlockGrowEvent(world, blockposition, this.setAge(i), 2); // CraftBukkit
}
- protected int b(World world) {
+ protected int a(World world) {
diff --git a/nms-patches/BlockDaylightDetector.patch b/nms-patches/BlockDaylightDetector.patch
index a9525a88..b62dbbf6 100644
--- a/nms-patches/BlockDaylightDetector.patch
+++ b/nms-patches/BlockDaylightDetector.patch
@@ -1,10 +1,10 @@
--- a/net/minecraft/server/BlockDaylightDetector.java
+++ b/net/minecraft/server/BlockDaylightDetector.java
-@@ -45,6 +45,7 @@
+@@ -36,6 +36,7 @@
i = MathHelper.clamp(i, 0, 15);
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);
++ i = org.bukkit.craftbukkit.event.CraftEventFactory.callRedstoneChange(world, blockposition, ((Integer) iblockdata.get(POWER)), i).getNewCurrent(); // CraftBukkit - Call BlockRedstoneEvent
+ world.setTypeAndData(blockposition, (IBlockData) iblockdata.set(BlockDaylightDetector.POWER, Integer.valueOf(i)), 3);
}
diff --git a/nms-patches/BlockDiodeAbstract.patch b/nms-patches/BlockDiodeAbstract.patch
index f7f4522e..b870476b 100644
--- a/nms-patches/BlockDiodeAbstract.patch
+++ b/nms-patches/BlockDiodeAbstract.patch
@@ -8,23 +8,23 @@
+
public abstract class BlockDiodeAbstract extends BlockFacingHorizontal {
- protected static final AxisAlignedBB c = new AxisAlignedBB(0.0D, 0.0D, 0.0D, 1.0D, 0.125D, 1.0D);
-@@ -35,8 +37,18 @@
- boolean flag = this.e(world, blockposition, iblockdata);
+ protected static final VoxelShape b = Block.a(0.0D, 0.0D, 0.0D, 16.0D, 2.0D, 16.0D);
+@@ -29,8 +31,18 @@
+ boolean flag1 = this.a(world, blockposition, iblockdata);
- if (this.d && !flag) {
+ if (flag && !flag1) {
+ // CraftBukkit start
-+ if (CraftEventFactory.callRedstoneChange(world, blockposition.getX(), blockposition.getY(), blockposition.getZ(), 15, 0).getNewCurrent() != 0) {
++ if (CraftEventFactory.callRedstoneChange(world, blockposition, 15, 0).getNewCurrent() != 0) {
+ return;
+ }
+ // CraftBukkit end
- world.setTypeAndData(blockposition, this.z(iblockdata), 2);
- } else if (!this.d) {
+ world.setTypeAndData(blockposition, (IBlockData) iblockdata.set(BlockDiodeAbstract.c, Boolean.valueOf(false)), 2);
+ } else if (!flag) {
+ // CraftBukkit start
-+ if (CraftEventFactory.callRedstoneChange(world, blockposition.getX(), blockposition.getY(), blockposition.getZ(), 0, 15).getNewCurrent() != 15) {
++ if (CraftEventFactory.callRedstoneChange(world, blockposition, 0, 15).getNewCurrent() != 15) {
+ return;
+ }
+ // CraftBukkit end
- world.setTypeAndData(blockposition, this.y(iblockdata), 2);
- if (!flag) {
- world.a(blockposition, this.y(iblockdata).getBlock(), this.E(iblockdata), -1);
+ world.setTypeAndData(blockposition, (IBlockData) iblockdata.set(BlockDiodeAbstract.c, Boolean.valueOf(true)), 2);
+ if (!flag1) {
+ world.I().a(blockposition, this, this.j(iblockdata), TickListPriority.HIGH);
diff --git a/nms-patches/BlockDirtSnowSpreadable.patch b/nms-patches/BlockDirtSnowSpreadable.patch
new file mode 100644
index 00000000..af18d01d
--- /dev/null
+++ b/nms-patches/BlockDirtSnowSpreadable.patch
@@ -0,0 +1,23 @@
+--- a/net/minecraft/server/BlockDirtSnowSpreadable.java
++++ b/net/minecraft/server/BlockDirtSnowSpreadable.java
+@@ -23,6 +23,11 @@
+ public void a(IBlockData iblockdata, World world, BlockPosition blockposition, Random random) {
+ if (!world.isClientSide) {
+ if (!a((IWorldReader) world, blockposition)) {
++ // CraftBukkit start
++ if (org.bukkit.craftbukkit.event.CraftEventFactory.callBlockFadeEvent(world, blockposition, Blocks.DIRT.getBlockData()).isCancelled()) {
++ return;
++ }
++ // CraftBukkit end
+ world.setTypeUpdate(blockposition, Blocks.DIRT.getBlockData());
+ } else {
+ if (world.getLightLevel(blockposition.up()) >= 9) {
+@@ -34,7 +39,7 @@
+ }
+
+ if (world.getType(blockposition1).getBlock() == Blocks.DIRT && b(world, blockposition1)) {
+- world.setTypeUpdate(blockposition1, this.getBlockData());
++ org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockSpreadEvent(world, blockposition, blockposition1, this.getBlockData()); // CraftBukkit
+ }
+ }
+ }
diff --git a/nms-patches/BlockDispenser.patch b/nms-patches/BlockDispenser.patch
index a46b1eef..45431d4b 100644
--- a/nms-patches/BlockDispenser.patch
+++ b/nms-patches/BlockDispenser.patch
@@ -1,18 +1,18 @@
--- a/net/minecraft/server/BlockDispenser.java
+++ b/net/minecraft/server/BlockDispenser.java
-@@ -8,6 +8,7 @@
- public static final BlockStateBoolean TRIGGERED = BlockStateBoolean.of("triggered");
+@@ -7,6 +7,7 @@
+ public static final BlockStateDirection FACING = BlockDirectional.FACING;
+ public static final BlockStateBoolean TRIGGERED = BlockProperties.w;
public static final RegistryDefault<Item, IDispenseBehavior> REGISTRY = new RegistryDefault(new DispenseBehaviorItem());
- protected Random d = new Random();
+ public static boolean eventFired = false; // CraftBukkit
- protected BlockDispenser() {
- super(Material.STONE);
-@@ -82,6 +83,7 @@
- IDispenseBehavior idispensebehavior = this.a(itemstack);
+ public static void a(IMaterial imaterial, IDispenseBehavior idispensebehavior) {
+ BlockDispenser.REGISTRY.a(imaterial.getItem(), idispensebehavior);
+@@ -52,6 +53,7 @@
+ IDispenseBehavior idispensebehavior = this.a(itemstack);
- if (idispensebehavior != IDispenseBehavior.NONE) {
-+ eventFired = false; // CraftBukkit - reset event status
- tileentitydispenser.setItem(i, idispensebehavior.a(sourceblock, itemstack));
- }
+ if (idispensebehavior != IDispenseBehavior.NONE) {
++ eventFired = false; // CraftBukkit - reset event status
+ tileentitydispenser.setItem(i, idispensebehavior.dispense(sourceblock, itemstack));
+ }
diff --git a/nms-patches/BlockDoor.patch b/nms-patches/BlockDoor.patch
index 063d2ea1..e47addb1 100644
--- a/nms-patches/BlockDoor.patch
+++ b/nms-patches/BlockDoor.patch
@@ -2,36 +2,37 @@
+++ b/net/minecraft/server/BlockDoor.java
@@ -2,6 +2,8 @@
- import java.util.Random;
+ import javax.annotation.Nullable;
+import org.bukkit.event.block.BlockRedstoneEvent; // CraftBukkit
+
public class BlockDoor extends Block {
public static final BlockStateDirection FACING = BlockFacingHorizontal.FACING;
-@@ -137,9 +139,23 @@
- this.b(world, blockposition, iblockdata, 0);
- }
- } else {
-- boolean flag1 = world.isBlockIndirectlyPowered(blockposition) || world.isBlockIndirectlyPowered(blockposition3);
+@@ -169,9 +171,24 @@
+ }
-- if (block != this && (flag1 || block.getBlockData().m()) && flag1 != ((Boolean) iblockdata2.get(BlockDoor.POWERED)).booleanValue()) {
-+ // 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(blockposition3.getX(), blockposition3.getY(), blockposition3.getZ());
+ public void doPhysics(IBlockData iblockdata, World world, BlockPosition blockposition, Block block, BlockPosition blockposition1) {
+- boolean flag = world.isBlockIndirectlyPowered(blockposition) || world.isBlockIndirectlyPowered(blockposition.shift(iblockdata.get(BlockDoor.HALF) == BlockPropertyDoubleBlockHalf.LOWER ? EnumDirection.UP : EnumDirection.DOWN));
++ // CraftBukkit start
++ BlockPosition otherHalf = blockposition.shift(iblockdata.get(BlockDoor.HALF) == BlockPropertyDoubleBlockHalf.LOWER ? EnumDirection.UP : EnumDirection.DOWN);
+
-+ int power = bukkitBlock.getBlockPower();
-+ int powerTop = blockTop.getBlockPower();
-+ if (powerTop > power) power = powerTop;
-+ int oldPower = (Boolean) iblockdata2.get(BlockDoor.POWERED) ? 15 : 0;
++ 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(otherHalf.getX(), otherHalf.getY(), otherHalf.getZ());
+
-+ if (oldPower == 0 ^ power == 0) {
-+ BlockRedstoneEvent eventRedstone = new BlockRedstoneEvent(bukkitBlock, oldPower, power);
-+ world.getServer().getPluginManager().callEvent(eventRedstone);
++ int power = bukkitBlock.getBlockPower();
++ int powerTop = blockTop.getBlockPower();
++ if (powerTop > power) power = powerTop;
++ int oldPower = ((Boolean) iblockdata.get(BlockDoor.POWERED)).booleanValue() ? 15 : 0;
+
-+ boolean flag1 = eventRedstone.getNewCurrent() > 0;
-+ // CraftBukkit end
- world.setTypeAndData(blockposition3, 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);
++ if (oldPower == 0 ^ power == 0) {
++ BlockRedstoneEvent eventRedstone = new BlockRedstoneEvent(bukkitBlock, oldPower, power);
++ world.getServer().getPluginManager().callEvent(eventRedstone);
+
+- if (block != this && flag != ((Boolean) iblockdata.get(BlockDoor.POWERED)).booleanValue()) {
++ boolean flag = eventRedstone.getNewCurrent() > 0;
++ // CraftBukkit end
+ if (flag != ((Boolean) iblockdata.get(BlockDoor.OPEN)).booleanValue()) {
+ this.b(world, blockposition, flag);
+ }
diff --git a/nms-patches/BlockDragonEgg.patch b/nms-patches/BlockDragonEgg.patch
index af397c67..1533b9bd 100644
--- a/nms-patches/BlockDragonEgg.patch
+++ b/nms-patches/BlockDragonEgg.patch
@@ -1,30 +1,29 @@
--- a/net/minecraft/server/BlockDragonEgg.java
+++ b/net/minecraft/server/BlockDragonEgg.java
-@@ -2,6 +2,8 @@
-
- import java.util.Random;
+@@ -1,5 +1,7 @@
+ package net.minecraft.server;
+import org.bukkit.event.block.BlockFromToEvent; // CraftBukkit
+
- public class BlockDragonEgg extends Block {
+ public class BlockDragonEgg extends BlockFalling {
- protected static final AxisAlignedBB a = new AxisAlignedBB(0.0625D, 0.0D, 0.0625D, 0.9375D, 1.0D, 0.9375D);
-@@ -66,6 +68,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));
+ protected static final VoxelShape a = Block.a(1.0D, 0.0D, 1.0D, 15.0D, 16.0D, 15.0D);
+@@ -26,6 +28,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 (world.getType(blockposition1).isAir()) {
++ // 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;
-+ }
++ if (event.isCancelled()) {
++ return;
++ }
+
-+ blockposition1 = new BlockPosition(event.getToBlock().getX(), event.getToBlock().getY(), event.getToBlock().getZ());
-+ // CraftBukkit end
- if (world.isClientSide) {
- for (int j = 0; j < 128; ++j) {
- double d0 = world.random.nextDouble();
++ blockposition1 = new BlockPosition(event.getToBlock().getX(), event.getToBlock().getY(), event.getToBlock().getZ());
++ // CraftBukkit end
+ if (world.isClientSide) {
+ for (int j = 0; j < 128; ++j) {
+ double d0 = world.random.nextDouble();
diff --git a/nms-patches/BlockDropper.patch b/nms-patches/BlockDropper.patch
index 07c21cb4..ba4ddc9b 100644
--- a/nms-patches/BlockDropper.patch
+++ b/nms-patches/BlockDropper.patch
@@ -10,32 +10,32 @@
+
public class BlockDropper extends BlockDispenser {
- private final IDispenseBehavior e = new DispenseBehaviorItem();
-@@ -35,8 +40,25 @@
- if (iinventory == null) {
- itemstack1 = this.e.a(sourceblock, itemstack);
- } else {
-- itemstack1 = TileEntityHopper.addItem(tileentitydispenser, iinventory, itemstack.cloneItemStack().cloneAndSubtract(1), enumdirection.opposite());
-- if (itemstack1.isEmpty()) {
-+ // CraftBukkit start - Fire event when pushing items into other inventories
-+ CraftItemStack oitemstack = CraftItemStack.asCraftMirror(itemstack.cloneItemStack().cloneAndSubtract(1));
+ private static final IDispenseBehavior c = new DispenseBehaviorItem();
+@@ -34,8 +39,25 @@
+ if (iinventory == null) {
+ itemstack1 = BlockDropper.c.dispense(sourceblock, itemstack);
+ } else {
+- itemstack1 = TileEntityHopper.addItem(tileentitydispenser, iinventory, itemstack.cloneItemStack().cloneAndSubtract(1), enumdirection.opposite());
+- if (itemstack1.isEmpty()) {
++ // CraftBukkit start - Fire event when pushing items into other inventories
++ CraftItemStack oitemstack = CraftItemStack.asCraftMirror(itemstack.cloneItemStack().cloneAndSubtract(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();
-+ }
++ 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(tileentitydispenser, iinventory, CraftItemStack.asNMSCopy(event.getItem()), enumdirection.opposite());
-+ if (event.getItem().equals(oitemstack) && itemstack1.isEmpty()) {
-+ // CraftBukkit end
- itemstack1 = itemstack.cloneItemStack();
- itemstack1.subtract(1);
- } else {
++ InventoryMoveItemEvent event = new InventoryMoveItemEvent(tileentitydispenser.getOwner().getInventory(), oitemstack.clone(), destinationInventory, true);
++ world.getServer().getPluginManager().callEvent(event);
++ if (event.isCancelled()) {
++ return;
++ }
++ itemstack1 = TileEntityHopper.addItem(tileentitydispenser, iinventory, CraftItemStack.asNMSCopy(event.getItem()), enumdirection.opposite());
++ if (event.getItem().equals(oitemstack) && itemstack1.isEmpty()) {
++ // CraftBukkit end
+ itemstack1 = itemstack.cloneItemStack();
+ itemstack1.subtract(1);
+ } else {
diff --git a/nms-patches/BlockEnderPortal.patch b/nms-patches/BlockEnderPortal.patch
index 52f8b812..9f871fba 100644
--- a/nms-patches/BlockEnderPortal.patch
+++ b/nms-patches/BlockEnderPortal.patch
@@ -1,22 +1,22 @@
--- a/net/minecraft/server/BlockEnderPortal.java
+++ b/net/minecraft/server/BlockEnderPortal.java
-@@ -4,6 +4,8 @@
+@@ -2,6 +2,8 @@
+
import java.util.Random;
- import javax.annotation.Nullable;
+import org.bukkit.event.entity.EntityPortalEnterEvent; // CraftBukkit
+
public class BlockEnderPortal extends BlockTileEntity {
- protected static final AxisAlignedBB a = new AxisAlignedBB(0.0D, 0.0D, 0.0D, 1.0D, 0.75D, 1.0D);
-@@ -37,6 +39,10 @@
+ protected static final VoxelShape a = Block.a(0.0D, 0.0D, 0.0D, 16.0D, 12.0D, 16.0D);
+@@ -28,6 +30,10 @@
- public void a(World world, BlockPosition blockposition, IBlockData iblockdata, Entity entity) {
- if (!world.isClientSide && !entity.isPassenger() && !entity.isVehicle() && entity.bf() && entity.getBoundingBox().c(iblockdata.e(world, blockposition).a(blockposition))) {
+ public void a(IBlockData iblockdata, World world, BlockPosition blockposition, Entity entity) {
+ if (!world.isClientSide && !entity.isPassenger() && !entity.isVehicle() && entity.bm() && VoxelShapes.c(VoxelShapes.a(entity.getBoundingBox().d((double) (-blockposition.getX()), (double) (-blockposition.getY()), (double) (-blockposition.getZ()))), iblockdata.g(world, blockposition), OperatorBoolean.AND)) {
+ // 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.b(1);
+ entity.d(1);
}
diff --git a/nms-patches/BlockFire.patch b/nms-patches/BlockFire.patch
index f5ce1cd8..9f26ccf3 100644
--- a/nms-patches/BlockFire.patch
+++ b/nms-patches/BlockFire.patch
@@ -1,39 +1,65 @@
--- a/net/minecraft/server/BlockFire.java
+++ b/net/minecraft/server/BlockFire.java
-@@ -5,6 +5,12 @@
- import java.util.Random;
+@@ -8,6 +8,16 @@
+ import java.util.function.Predicate;
import javax.annotation.Nullable;
+// CraftBukkit start
++
++import org.bukkit.Bukkit;
++import org.bukkit.craftbukkit.block.CraftBlockState;
+import org.bukkit.craftbukkit.event.CraftEventFactory;
+import org.bukkit.event.block.BlockBurnEvent;
++import org.bukkit.event.block.BlockFadeEvent;
+import org.bukkit.event.block.BlockSpreadEvent;
+// CraftBukkit end
+
public class BlockFire extends Block {
- public static final BlockStateInteger AGE = BlockStateInteger.of("age", 0, 15);
-@@ -95,7 +101,7 @@
- public void b(World world, BlockPosition blockposition, IBlockData iblockdata, Random random) {
+ public static final BlockStateInteger AGE = BlockProperties.W;
+@@ -32,7 +42,20 @@
+ }
+
+ public IBlockData updateState(IBlockData iblockdata, EnumDirection enumdirection, IBlockData iblockdata1, GeneratorAccess generatoraccess, BlockPosition blockposition, BlockPosition blockposition1) {
+- return this.canPlace(iblockdata, generatoraccess, blockposition) ? (IBlockData) this.a((IBlockAccess) generatoraccess, blockposition).set(BlockFire.AGE, iblockdata.get(BlockFire.AGE)) : Blocks.AIR.getBlockData();
++ // CraftBukkit start
++ if (!iblockdata.canPlace(generatoraccess, blockposition)) {
++ CraftBlockState blockState = CraftBlockState.getBlockState(generatoraccess, blockposition);
++ blockState.setData(Blocks.AIR.getBlockData());
++
++ BlockFadeEvent event = new BlockFadeEvent(blockState.getBlock(), blockState);
++ generatoraccess.getMinecraftWorld().getMinecraftServer().server.getPluginManager().callEvent(event);
++
++ if (!event.isCancelled()) {
++ return blockState.getHandle();
++ }
++ }
++ return this.a((IBlockAccess) generatoraccess, blockposition).set(BlockFire.AGE, iblockdata.get(BlockFire.AGE));
++ // CraftBukkit end
+ }
+
+ @Nullable
+@@ -82,7 +105,7 @@
+ public void a(IBlockData iblockdata, World world, BlockPosition blockposition, Random random) {
if (world.getGameRules().getBoolean("doFireTick")) {
- if (!this.canPlace(world, blockposition)) {
+ if (!iblockdata.canPlace(world, blockposition)) {
- world.setAir(blockposition);
+ fireExtinguished(world, blockposition); // CraftBukkit - invalid place location
}
Block block = world.getType(blockposition.down()).getBlock();
-@@ -108,7 +114,7 @@
+@@ -90,7 +113,7 @@
int i = ((Integer) iblockdata.get(BlockFire.AGE)).intValue();
- if (!flag && world.isRaining() && this.b(world, blockposition) && random.nextFloat() < 0.2F + (float) i * 0.03F) {
+ if (!flag && world.isRaining() && this.a(world, blockposition) && random.nextFloat() < 0.2F + (float) i * 0.03F) {
- world.setAir(blockposition);
+ fireExtinguished(world, blockposition); // CraftBukkit - extinguished by rain
} else {
- if (i < 15) {
- iblockdata = iblockdata.set(BlockFire.AGE, Integer.valueOf(i + random.nextInt(3) / 2));
-@@ -119,14 +125,14 @@
- if (!flag) {
- if (!this.c(world, blockposition)) {
+ int j = Math.min(15, i + random.nextInt(3) / 2);
+
+@@ -103,14 +126,14 @@
+ world.I().a(blockposition, this, this.a((IWorldReader) world) + random.nextInt(10));
+ if (!this.d(world, blockposition)) {
if (!world.getType(blockposition.down()).q() || i > 3) {
- world.setAir(blockposition);
+ fireExtinguished(world, blockposition); // CraftBukkit
@@ -42,68 +68,57 @@
return;
}
- if (!this.c((IBlockAccess) world, blockposition.down()) && i == 15 && random.nextInt(4) == 0) {
+ if (i == 15 && random.nextInt(4) == 0 && !this.j(world.getType(blockposition.down()))) {
- world.setAir(blockposition);
+ fireExtinguished(world, blockposition); // CraftBukkit
return;
}
}
-@@ -138,12 +144,14 @@
- b0 = -50;
- }
+@@ -118,12 +141,14 @@
+ boolean flag1 = world.x(blockposition);
+ int k = flag1 ? -50 : 0;
-- this.a(world, blockposition.east(), 300 + b0, random, i);
-- this.a(world, blockposition.west(), 300 + b0, random, i);
-- this.a(world, blockposition.down(), 250 + b0, random, i);
-- this.a(world, blockposition.up(), 250 + b0, random, i);
-- this.a(world, blockposition.north(), 300 + b0, random, i);
-- this.a(world, blockposition.south(), 300 + b0, random, i);
+- this.a(world, blockposition.east(), 300 + k, random, i);
+- this.a(world, blockposition.west(), 300 + k, random, i);
+- this.a(world, blockposition.down(), 250 + k, random, i);
+- this.a(world, blockposition.up(), 250 + k, random, i);
+- this.a(world, blockposition.north(), 300 + k, random, i);
+- this.a(world, blockposition.south(), 300 + k, random, i);
+ // CraftBukkit start - add source blockposition to burn calls
-+ this.a(world, blockposition.east(), 300 + b0, random, i, blockposition);
-+ this.a(world, blockposition.west(), 300 + b0, random, i, blockposition);
-+ this.a(world, blockposition.down(), 250 + b0, random, i, blockposition);
-+ this.a(world, blockposition.up(), 250 + b0, random, i, blockposition);
-+ this.a(world, blockposition.north(), 300 + b0, random, i, blockposition);
-+ this.a(world, blockposition.south(), 300 + b0, random, i, blockposition);
++ this.a(world, blockposition.east(), 300 + k, random, i, blockposition);
++ this.a(world, blockposition.west(), 300 + k, random, i, blockposition);
++ this.a(world, blockposition.down(), 250 + k, random, i, blockposition);
++ this.a(world, blockposition.up(), 250 + k, random, i, blockposition);
++ this.a(world, blockposition.north(), 300 + k, random, i, blockposition);
++ this.a(world, blockposition.south(), 300 + k, random, i, blockposition);
+ // CraftBukkit end
+ BlockPosition.MutableBlockPosition blockposition_mutableblockposition = new BlockPosition.MutableBlockPosition();
- for (int j = -1; j <= 1; ++j) {
- for (int k = -1; k <= 1; ++k) {
-@@ -172,7 +180,26 @@
- l1 = 15;
- }
+ for (int l = -1; l <= 1; ++l) {
+@@ -149,7 +174,15 @@
+ if (i2 > 0 && random.nextInt(k1) <= i2 && (!world.isRaining() || !this.a(world, (BlockPosition) blockposition_mutableblockposition))) {
+ int j2 = Math.min(15, i + random.nextInt(5) / 4);
-- world.setTypeAndData(blockposition1, iblockdata.set(BlockFire.AGE, Integer.valueOf(l1)), 3);
+- world.setTypeAndData(blockposition_mutableblockposition, (IBlockData) this.a((IBlockAccess) world, (BlockPosition) blockposition_mutableblockposition).set(BlockFire.AGE, Integer.valueOf(j2)), 3);
+ // CraftBukkit start - Call to stop spread of fire
-+ if (world.getType(blockposition1) != Blocks.FIRE) {
-+ if (CraftEventFactory.callBlockIgniteEvent(world, blockposition1.getX(), blockposition1.getY(), blockposition1.getZ(), blockposition.getX(), blockposition.getY(), blockposition.getZ()).isCancelled()) {
++ if (world.getType(blockposition_mutableblockposition) != Blocks.FIRE) {
++ if (CraftEventFactory.callBlockIgniteEvent(world, blockposition_mutableblockposition, blockposition).isCancelled()) {
+ continue;
+ }
+
-+ org.bukkit.Server server = world.getServer();
-+ org.bukkit.World bworld = world.getWorld();
-+ org.bukkit.block.BlockState blockState = bworld.getBlockAt(blockposition1.getX(), blockposition1.getY(), blockposition1.getZ()).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(blockposition.getX(), blockposition.getY(), blockposition.getZ()), blockState);
-+ server.getPluginManager().callEvent(spreadEvent);
-+
-+ if (!spreadEvent.isCancelled()) {
-+ blockState.update(true);
-+ }
++ CraftEventFactory.handleBlockSpreadEvent(world, blockposition, blockposition_mutableblockposition, (IBlockData) this.a((IBlockAccess) world, (BlockPosition) blockposition_mutableblockposition).set(BlockFire.AGE, Integer.valueOf(j2)), 3); // CraftBukkit
+ }
+ // CraftBukkit end
}
}
}
-@@ -204,12 +231,24 @@
- return integer == null ? 0 : integer.intValue();
+@@ -173,12 +206,24 @@
+ return this.flameChances.getInt(block);
}
- private void a(World world, BlockPosition blockposition, int i, Random random, int j) {
+ private void a(World world, BlockPosition blockposition, int i, Random random, int j, BlockPosition sourceposition) { // CraftBukkit add sourceposition
- int k = this.e(world.getType(blockposition).getBlock());
+ int k = this.f(world.getType(blockposition).getBlock());
if (random.nextInt(i) < k) {
IBlockData iblockdata = world.getType(blockposition);
@@ -121,34 +136,25 @@
+ // CraftBukkit end
+
if (random.nextInt(j + 10) < 5 && !world.isRainingAt(blockposition)) {
- int l = j + random.nextInt(5) / 4;
-
-@@ -276,7 +315,7 @@
-
- public void a(IBlockData iblockdata, World world, BlockPosition blockposition, Block block, BlockPosition blockposition1) {
- if (!world.getType(blockposition.down()).q() && !this.c(world, blockposition)) {
-- world.setAir(blockposition);
-+ fireExtinguished(world, blockposition); // CraftBukkit - fuel block gone
- }
+ int l = Math.min(j + random.nextInt(5) / 4, 15);
- }
-@@ -284,7 +323,7 @@
- public void onPlace(World world, BlockPosition blockposition, IBlockData iblockdata) {
- if (world.worldProvider.getDimensionManager().getDimensionID() > 0 || !Blocks.PORTAL.b(world, blockposition)) {
- if (!world.getType(blockposition.down()).q() && !this.c(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));
- }
-@@ -310,4 +349,12 @@
- public EnumBlockFaceShape a(IBlockAccess iblockaccess, IBlockData iblockdata, BlockPosition blockposition, EnumDirection enumdirection) {
- return EnumBlockFaceShape.UNDEFINED;
+@@ -241,7 +286,7 @@
+ if (iblockdata1.getBlock() != iblockdata.getBlock()) {
+ if (world.worldProvider.getDimensionManager().getDimensionID() > 0 || !((BlockPortal) Blocks.NETHER_PORTAL).a((GeneratorAccess) world, blockposition)) {
+ if (!iblockdata.canPlace(world, blockposition)) {
+- world.setAir(blockposition);
++ fireExtinguished(world, blockposition); // CraftBukkit - fuel block broke
+ } else {
+ world.I().a(blockposition, this, this.a((IWorldReader) world) + world.random.nextInt(10));
+ }
+@@ -387,4 +432,12 @@
+ blockfire.a(Blocks.BLACK_CARPET, 60, 20);
+ blockfire.a(Blocks.DRIED_KELP_BLOCK, 30, 60);
}
+
+ // CraftBukkit start
-+ private void fireExtinguished(World world, BlockPosition position) {
-+ if (!CraftEventFactory.callBlockFadeEvent(world.getWorld().getBlockAt(position.getX(), position.getY(), position.getZ()), Blocks.AIR).isCancelled()) {
++ private void fireExtinguished(GeneratorAccess world, BlockPosition position) {
++ if (!CraftEventFactory.callBlockFadeEvent(world, position, Blocks.AIR.getBlockData()).isCancelled()) {
+ world.setAir(position);
+ }
+ }
diff --git a/nms-patches/BlockFlowing.patch b/nms-patches/BlockFlowing.patch
deleted file mode 100644
index 55906695..00000000
--- a/nms-patches/BlockFlowing.patch
+++ /dev/null
@@ -1,66 +0,0 @@
---- a/net/minecraft/server/BlockFlowing.java
-+++ b/net/minecraft/server/BlockFlowing.java
-@@ -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;
-@@ -85,12 +90,25 @@
- this.f(world, blockposition, iblockdata);
- }
-
-+ org.bukkit.block.Block source = world.getWorld().getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ()); // CraftBukkit
- IBlockData iblockdata2 = world.getType(blockposition.down());
-
- if (this.h(world, blockposition.down(), iblockdata2)) {
-+ // CraftBukkit start
-+ BlockFromToEvent event = new BlockFromToEvent(source, BlockFace.DOWN);
-+ world.getServer().getPluginManager().callEvent(event);
-+
-+ if (event.isCancelled()) {
-+ return;
-+ }
-+ // CraftBukkit end
-+
- if (this.material == Material.LAVA && world.getType(blockposition.down()).getMaterial() == Material.WATER) {
-- world.setTypeUpdate(blockposition.down(), Blocks.STONE.getBlockData());
-- this.fizz(world, blockposition.down());
-+ // CraftBukkit start
-+ if (org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockFormEvent(world, blockposition.down(), Blocks.STONE.getBlockData(), null)) {
-+ this.fizz(world, blockposition.down());
-+ }
-+ // CraftBukkit end
- return;
- }
-
-@@ -116,14 +134,21 @@
- 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));
-+ world.getServer().getPluginManager().callEvent(event);
-+
-+ if (!event.isCancelled()) {
-+ this.flow(world, blockposition.shift(enumdirection1), world.getType(blockposition.shift(enumdirection1)), k);
-+ }
-+ // CraftBukkit end
- }
- }
-
- }
-
- private void flow(World world, BlockPosition blockposition, IBlockData iblockdata, int i) {
-- if (this.h(world, blockposition, iblockdata)) {
-+ if (world.isLoaded(blockposition) && this.h(world, blockposition, iblockdata)) { // CraftBukkit - add isLoaded check
- if (iblockdata.getMaterial() != Material.AIR) {
- if (this.material == Material.LAVA) {
- this.fizz(world, blockposition);
diff --git a/nms-patches/BlockFluids.patch b/nms-patches/BlockFluids.patch
index cccec394..cad979d2 100644
--- a/nms-patches/BlockFluids.patch
+++ b/nms-patches/BlockFluids.patch
@@ -1,27 +1,41 @@
--- a/net/minecraft/server/BlockFluids.java
+++ b/net/minecraft/server/BlockFluids.java
-@@ -175,14 +175,20 @@
- Integer integer = (Integer) iblockdata.get(BlockFluids.LEVEL);
+@@ -46,10 +46,10 @@
+ public VoxelShape a(IBlockData iblockdata, IBlockAccess iblockaccess, BlockPosition blockposition) {
+ Fluid fluid = iblockaccess.b(blockposition.up());
- if (integer.intValue() == 0) {
+- return fluid.c().a((FluidType) this.b) ? VoxelShapes.b() : (VoxelShape) this.c.computeIfAbsent(iblockdata, (iblockdata) -> {
+- Fluid fluid = iblockdata.s();
++ return fluid.c().a((FluidType) this.b) ? VoxelShapes.b() : (VoxelShape) this.c.computeIfAbsent(iblockdata, (iblockdata1) -> { // CraftBukkit - decompile errors
++ Fluid fluid1 = iblockdata1.s();
+
+- return VoxelShapes.a(0.0D, 0.0D, 0.0D, 1.0D, (double) fluid.f(), 1.0D);
++ return VoxelShapes.a(0.0D, 0.0D, 0.0D, 1.0D, (double) fluid1.f(), 1.0D);
+ });
+ }
+
+@@ -106,14 +106,20 @@
+ Fluid fluid = world.b(blockposition);
+
+ if (fluid.d()) {
- world.setTypeUpdate(blockposition, Blocks.OBSIDIAN.getBlockData());
- this.fizz(world, blockposition);
+ // CraftBukkit start
-+ if (org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockFormEvent(world, blockposition, Blocks.OBSIDIAN.getBlockData(), null)) {
++ if (org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockFormEvent(world, blockposition, Blocks.OBSIDIAN.getBlockData())) {
+ this.fizz(world, blockposition);
+ }
+ // CraftBukkit end
- return true;
+ return false;
}
- if (integer.intValue() <= 4) {
+ if (fluid.f() >= 0.44444445F) {
- world.setTypeUpdate(blockposition, Blocks.COBBLESTONE.getBlockData());
- this.fizz(world, blockposition);
+ // CraftBukkit start
-+ if (org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockFormEvent(world, blockposition, Blocks.COBBLESTONE.getBlockData(), null)) {
++ if (org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockFormEvent(world, blockposition, Blocks.COBBLESTONE.getBlockData())) {
+ this.fizz(world, blockposition);
+ }
+ // CraftBukkit end
- return true;
+ return false;
}
}
diff --git a/nms-patches/BlockGrass.patch b/nms-patches/BlockGrass.patch
index 040f26ae..68f953a2 100644
--- a/nms-patches/BlockGrass.patch
+++ b/nms-patches/BlockGrass.patch
@@ -1,77 +1,11 @@
--- a/net/minecraft/server/BlockGrass.java
+++ b/net/minecraft/server/BlockGrass.java
-@@ -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.isClientSide) {
- if (world.getLightLevel(blockposition.up()) < 4 && world.getType(blockposition.up()).c() > 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) {
-@@ -36,7 +56,19 @@
- IBlockData iblockdata2 = world.getType(blockposition1);
-
- if (iblockdata2.getBlock() == Blocks.DIRT && iblockdata2.get(BlockDirt.VARIANT) == BlockDirt.EnumDirtVariant.DIRT && world.getLightLevel(blockposition1.up()) >= 4 && iblockdata1.c() <= 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
- }
- }
- }
-@@ -79,13 +111,15 @@
- IBlockData iblockdata1 = blockflowers.getBlockData().set(blockflowers.g(), blockflowers_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
+@@ -51,7 +51,7 @@
}
- } else {
- IBlockData iblockdata2 = Blocks.TALLGRASS.getBlockData().set(BlockLongGrass.TYPE, BlockLongGrass.EnumTallGrassType.GRASS);
- if (Blocks.TALLGRASS.f(world, blockposition2, iblockdata2)) {
+ if (iblockdata2.canPlace(world, blockposition2)) {
- 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
++ org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockGrowEvent(world, blockposition2, iblockdata2, 3); // CraftBukkit
}
}
}
diff --git a/nms-patches/BlockIce.patch b/nms-patches/BlockIce.patch
index 2971d276..e7a33760 100644
--- a/nms-patches/BlockIce.patch
+++ b/nms-patches/BlockIce.patch
@@ -1,14 +1,14 @@
--- a/net/minecraft/server/BlockIce.java
+++ b/net/minecraft/server/BlockIce.java
-@@ -47,6 +47,11 @@
+@@ -52,6 +52,11 @@
}
- protected void b(World world, BlockPosition blockposition) {
+ protected void b(IBlockData iblockdata, World world, BlockPosition blockposition) {
+ // CraftBukkit start
-+ if (org.bukkit.craftbukkit.event.CraftEventFactory.callBlockFadeEvent(world.getWorld().getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ()), world.worldProvider.l() ? Blocks.AIR : Blocks.WATER).isCancelled()) {
++ if (org.bukkit.craftbukkit.event.CraftEventFactory.callBlockFadeEvent(world, blockposition, world.worldProvider.isNether() ? Blocks.AIR.getBlockData() : Blocks.WATER.getBlockData()).isCancelled()) {
+ return;
+ }
+ // CraftBukkit end
- if (world.worldProvider.l()) {
+ if (world.worldProvider.isNether()) {
world.setAir(blockposition);
} else {
diff --git a/nms-patches/BlockJukeBox.patch b/nms-patches/BlockJukeBox.patch
deleted file mode 100644
index 2b1a5cd6..00000000
--- a/nms-patches/BlockJukeBox.patch
+++ /dev/null
@@ -1,14 +0,0 @@
---- a/net/minecraft/server/BlockJukeBox.java
-+++ b/net/minecraft/server/BlockJukeBox.java
-@@ -141,6 +141,11 @@
- }
-
- public void setRecord(ItemStack itemstack) {
-+ // CraftBukkit start - There can only be one
-+ if (!itemstack.isEmpty()) {
-+ itemstack.setCount(1);
-+ }
-+ // CraftBukkit end
- this.record = itemstack;
- this.update();
- }
diff --git a/nms-patches/BlockLeaves.patch b/nms-patches/BlockLeaves.patch
index bb3a479d..3aad2770 100644
--- a/nms-patches/BlockLeaves.patch
+++ b/nms-patches/BlockLeaves.patch
@@ -1,26 +1,26 @@
--- a/net/minecraft/server/BlockLeaves.java
+++ b/net/minecraft/server/BlockLeaves.java
-@@ -2,6 +2,8 @@
-
+@@ -3,6 +3,8 @@
import java.util.Random;
+ import javax.annotation.Nullable;
+import org.bukkit.event.block.LeavesDecayEvent; // CraftBukkit
+
- public abstract class BlockLeaves extends Block {
+ public class BlockLeaves extends Block {
- public static final BlockStateBoolean DECAYABLE = BlockStateBoolean.of("decayable");
-@@ -132,6 +134,14 @@
- }
+ public static final BlockStateInteger DISTANCE = BlockProperties.aa;
+@@ -20,6 +22,14 @@
- private void b(World world, BlockPosition blockposition) {
-+ // CraftBukkit start
-+ LeavesDecayEvent event = new LeavesDecayEvent(world.getWorld().getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ()));
-+ world.getServer().getPluginManager().callEvent(event);
+ public void b(IBlockData iblockdata, World world, BlockPosition blockposition, Random random) {
+ if (!((Boolean) iblockdata.get(BlockLeaves.PERSISTENT)).booleanValue() && ((Integer) iblockdata.get(BlockLeaves.DISTANCE)).intValue() == 7) {
++ // CraftBukkit start
++ LeavesDecayEvent event = new LeavesDecayEvent(world.getWorld().getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ()));
++ world.getServer().getPluginManager().callEvent(event);
+
-+ if (event.isCancelled() || world.getType(blockposition).getBlock() != this) {
-+ return;
-+ }
-+ // CraftBukkit end
- this.b(world, blockposition, world.getType(blockposition), 0);
- world.setAir(blockposition);
- }
++ if (event.isCancelled() || world.getType(blockposition).getBlock() != this) {
++ return;
++ }
++ // CraftBukkit end
+ iblockdata.a(world, blockposition, 0);
+ world.setAir(blockposition);
+ }
diff --git a/nms-patches/BlockLever.patch b/nms-patches/BlockLever.patch
index db03cc1f..945ac935 100644
--- a/nms-patches/BlockLever.patch
+++ b/nms-patches/BlockLever.patch
@@ -1,16 +1,15 @@
--- a/net/minecraft/server/BlockLever.java
+++ b/net/minecraft/server/BlockLever.java
-@@ -3,6 +3,8 @@
- import java.util.Iterator;
- import javax.annotation.Nullable;
+@@ -1,5 +1,7 @@
+ package net.minecraft.server;
+import org.bukkit.event.block.BlockRedstoneEvent; // CraftBukkit
+
- public class BlockLever extends Block {
+ public class BlockLever extends BlockAttachable {
+
+ public static final BlockStateBoolean POWERED = BlockProperties.t;
+@@ -73,6 +75,20 @@
- public static final BlockStateEnum<BlockLever.EnumLeverPosition> FACING = BlockStateEnum.of("facing", BlockLever.EnumLeverPosition.class);
-@@ -129,6 +131,20 @@
- if (world.isClientSide) {
return true;
} else {
+ // CraftBukkit start - Interact Lever
@@ -27,6 +26,6 @@
+ }
+ // CraftBukkit end
+
- iblockdata = iblockdata.a((IBlockState) BlockLever.POWERED);
world.setTypeAndData(blockposition, iblockdata, 3);
- float f3 = ((Boolean) iblockdata.get(BlockLever.POWERED)).booleanValue() ? 0.6F : 0.5F;
+ float f3 = flag ? 0.6F : 0.5F;
+
diff --git a/nms-patches/BlockMagma.patch b/nms-patches/BlockMagma.patch
index 75f5fbad..6e1cc11c 100644
--- a/nms-patches/BlockMagma.patch
+++ b/nms-patches/BlockMagma.patch
@@ -1,6 +1,6 @@
--- a/net/minecraft/server/BlockMagma.java
+++ b/net/minecraft/server/BlockMagma.java
-@@ -17,7 +17,9 @@
+@@ -10,7 +10,9 @@
public void stepOn(World world, BlockPosition blockposition, Entity entity) {
if (!entity.isFireProof() && entity instanceof EntityLiving && !EnchantmentManager.i((EntityLiving) entity)) {
diff --git a/nms-patches/BlockMinecartDetector.patch b/nms-patches/BlockMinecartDetector.patch
index 014c5102..071412c9 100644
--- a/nms-patches/BlockMinecartDetector.patch
+++ b/nms-patches/BlockMinecartDetector.patch
@@ -1,15 +1,15 @@
--- a/net/minecraft/server/BlockMinecartDetector.java
+++ b/net/minecraft/server/BlockMinecartDetector.java
@@ -6,6 +6,8 @@
- import java.util.Random;
+ import java.util.function.Predicate;
import javax.annotation.Nullable;
+import org.bukkit.event.block.BlockRedstoneEvent; // CraftBukkit
+
public class BlockMinecartDetector extends BlockMinecartTrackAbstract {
- public static final BlockStateEnum<BlockMinecartTrackAbstract.EnumTrackPosition> SHAPE = BlockStateEnum.a("shape", BlockMinecartTrackAbstract.EnumTrackPosition.class, new Predicate() {
-@@ -66,6 +68,17 @@
+ public static final BlockStateEnum<BlockPropertyTrackPosition> SHAPE = BlockProperties.R;
+@@ -55,6 +57,17 @@
flag1 = true;
}
@@ -25,5 +25,5 @@
+ // CraftBukkit end
+
if (flag1 && !flag) {
- world.setTypeAndData(blockposition, iblockdata.set(BlockMinecartDetector.POWERED, Boolean.valueOf(true)), 3);
+ world.setTypeAndData(blockposition, (IBlockData) iblockdata.set(BlockMinecartDetector.POWERED, Boolean.valueOf(true)), 3);
this.b(world, blockposition, iblockdata, true);
diff --git a/nms-patches/BlockMobSpawner.patch b/nms-patches/BlockMobSpawner.patch
index 67c46a90..2b95d6b1 100644
--- a/nms-patches/BlockMobSpawner.patch
+++ b/nms-patches/BlockMobSpawner.patch
@@ -1,9 +1,9 @@
--- a/net/minecraft/server/BlockMobSpawner.java
+++ b/net/minecraft/server/BlockMobSpawner.java
-@@ -22,9 +22,19 @@
+@@ -16,9 +16,19 @@
- public void dropNaturally(World world, BlockPosition blockposition, IBlockData iblockdata, float f, int i) {
- super.dropNaturally(world, blockposition, iblockdata, f, i);
+ public void dropNaturally(IBlockData iblockdata, World world, BlockPosition blockposition, float f, int i) {
+ super.dropNaturally(iblockdata, world, blockposition, f, i);
+ /* CraftBukkit start - Delegate to getExpDrop
int j = 15 + world.random.nextInt(15) + world.random.nextInt(15);
@@ -12,11 +12,11 @@
+ }
+
+ @Override
-+ public int getExpDrop(World world, IBlockData iblockdata, int enchantmentLevel) {
++ public int getExpDrop(IBlockData iblockdata, World world, BlockPosition blockposition, int enchantmentLevel) {
+ int j = 15 + world.random.nextInt(15) + world.random.nextInt(15);
+
+ return j;
+ // CraftBukkit end
}
- public boolean b(IBlockData iblockdata) {
+ public EnumRenderType c(IBlockData iblockdata) {
diff --git a/nms-patches/BlockMonsterEggs.patch b/nms-patches/BlockMonsterEggs.patch
index ae60b27d..7b493438 100644
--- a/nms-patches/BlockMonsterEggs.patch
+++ b/nms-patches/BlockMonsterEggs.patch
@@ -1,15 +1,15 @@
--- a/net/minecraft/server/BlockMonsterEggs.java
+++ b/net/minecraft/server/BlockMonsterEggs.java
-@@ -2,6 +2,8 @@
-
+@@ -4,6 +4,8 @@
+ import java.util.Map;
import java.util.Random;
+import org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason; // CraftBukkit
+
public class BlockMonsterEggs extends Block {
- public static final BlockStateEnum<BlockMonsterEggs.EnumMonsterEggVarient> VARIANT = BlockStateEnum.of("variant", BlockMonsterEggs.EnumMonsterEggVarient.class);
-@@ -50,7 +52,7 @@
+ private final Block a;
+@@ -36,7 +38,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);
diff --git a/nms-patches/BlockMushroom.patch b/nms-patches/BlockMushroom.patch
index 911f296f..0787a57c 100644
--- a/nms-patches/BlockMushroom.patch
+++ b/nms-patches/BlockMushroom.patch
@@ -1,55 +1,41 @@
--- a/net/minecraft/server/BlockMushroom.java
+++ b/net/minecraft/server/BlockMushroom.java
-@@ -3,6 +3,12 @@
+@@ -3,6 +3,10 @@
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 static final AxisAlignedBB a = new AxisAlignedBB(0.30000001192092896D, 0.0D, 0.30000001192092896D, 0.699999988079071D, 0.4000000059604645D, 0.699999988079071D);
-@@ -16,6 +22,7 @@
+ protected static final VoxelShape a = Block.a(5.0D, 0.0D, 5.0D, 11.0D, 6.0D, 11.0D);
+@@ -16,6 +20,7 @@
}
- public void b(World world, BlockPosition blockposition, IBlockData iblockdata, Random random) {
+ public void a(IBlockData iblockdata, World world, BlockPosition blockposition, 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;
-@@ -43,7 +50,19 @@
+@@ -43,7 +48,7 @@
}
- if (world.isEmpty(blockposition2) && this.f(world, blockposition2, this.getBlockData())) {
-- world.setTypeAndData(blockposition2, this.getBlockData(), 2);
-+ // 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
+ if (world.isEmpty(blockposition2) && iblockdata.canPlace(world, blockposition2)) {
+- world.setTypeAndData(blockposition2, iblockdata, 2);
++ org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockSpreadEvent(world, blockposition, blockposition2, iblockdata, 2); // CraftBukkit
}
}
-@@ -72,8 +91,10 @@
- WorldGenHugeMushroom worldgenhugemushroom = null;
+@@ -66,8 +71,10 @@
+ WorldGenerator worldgenerator = null;
if (this == Blocks.BROWN_MUSHROOM) {
+ BlockSapling.treeType = TreeType.BROWN_MUSHROOM; // CraftBukkit
- worldgenhugemushroom = new WorldGenHugeMushroom(Blocks.BROWN_MUSHROOM_BLOCK);
+ worldgenerator = WorldGenerator.U;
} else if (this == Blocks.RED_MUSHROOM) {
+ BlockSapling.treeType = TreeType.RED_MUSHROOM; // CraftBukkit
- worldgenhugemushroom = new WorldGenHugeMushroom(Blocks.RED_MUSHROOM_BLOCK);
+ worldgenerator = WorldGenerator.T;
}
diff --git a/nms-patches/BlockMycel.patch b/nms-patches/BlockMycel.patch
deleted file mode 100644
index 626b81bf..00000000
--- a/nms-patches/BlockMycel.patch
+++ /dev/null
@@ -1,58 +0,0 @@
---- a/net/minecraft/server/BlockMycel.java
-+++ b/net/minecraft/server/BlockMycel.java
-@@ -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.isClientSide) {
- if (world.getLightLevel(blockposition.up()) < 4 && world.getType(blockposition.up()).c() > 2) {
-- world.setTypeUpdate(blockposition, Blocks.DIRT.getBlockData().set(BlockDirt.VARIANT, BlockDirt.EnumDirtVariant.DIRT));
-+ // CraftBukkit start
-+ // world.setTypeUpdate(blockposition, Blocks.DIRT.getBlockData().set(BlockDirt.VARIANT, BlockDirt.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 @@
- IBlockData iblockdata2 = world.getType(blockposition1.up());
-
- if (iblockdata1.getBlock() == Blocks.DIRT && iblockdata1.get(BlockDirt.VARIANT) == BlockDirt.EnumDirtVariant.DIRT && world.getLightLevel(blockposition1.up()) >= 4 && iblockdata2.c() <= 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
index 1af3f818..f0aca39f 100644
--- a/nms-patches/BlockNetherWart.patch
+++ b/nms-patches/BlockNetherWart.patch
@@ -1,12 +1,11 @@
--- a/net/minecraft/server/BlockNetherWart.java
+++ b/net/minecraft/server/BlockNetherWart.java
-@@ -31,7 +31,8 @@
+@@ -25,7 +25,7 @@
if (i < 3 && random.nextInt(10) == 0) {
- iblockdata = iblockdata.set(BlockNetherWart.AGE, Integer.valueOf(i + 1));
+ iblockdata = (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
++ org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockGrowEvent(world, blockposition, iblockdata, 2); // CraftBukkit
}
- super.b(world, blockposition, iblockdata, random);
+ super.a(iblockdata, world, blockposition, random);
diff --git a/nms-patches/BlockNote.patch b/nms-patches/BlockNote.patch
new file mode 100644
index 00000000..246b882b
--- /dev/null
+++ b/nms-patches/BlockNote.patch
@@ -0,0 +1,46 @@
+--- a/net/minecraft/server/BlockNote.java
++++ b/net/minecraft/server/BlockNote.java
+@@ -24,7 +24,7 @@
+
+ if (flag != ((Boolean) iblockdata.get(BlockNote.POWERED)).booleanValue()) {
+ if (flag) {
+- this.play(world, blockposition);
++ this.play(world, blockposition, iblockdata); // CraftBukkit
+ }
+
+ world.setTypeAndData(blockposition, (IBlockData) iblockdata.set(BlockNote.POWERED, Boolean.valueOf(flag)), 3);
+@@ -32,9 +32,14 @@
+
+ }
+
+- private void play(World world, BlockPosition blockposition) {
++ private void play(World world, BlockPosition blockposition, IBlockData data) { // CraftBukkit
+ if (world.getType(blockposition.up()).isAir()) {
+- world.playBlockAction(blockposition, this, 0, 0);
++ // CraftBukkit start
++ org.bukkit.event.block.NotePlayEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callNotePlayEvent(world, blockposition, data.get(BlockNote.INSTRUMENT), data.get(BlockNote.NOTE));
++ if (!event.isCancelled()) {
++ world.playBlockAction(blockposition, this, 0, 0);
++ }
++ // CraftBukkit end
+ }
+
+ }
+@@ -45,7 +50,7 @@
+ } else {
+ iblockdata = (IBlockData) iblockdata.a((IBlockState) BlockNote.NOTE);
+ world.setTypeAndData(blockposition, iblockdata, 3);
+- this.play(world, blockposition);
++ this.play(world, blockposition, iblockdata); // CraftBukkit
+ entityhuman.a(StatisticList.TUNE_NOTEBLOCK);
+ return true;
+ }
+@@ -53,7 +58,7 @@
+
+ public void attack(IBlockData iblockdata, World world, BlockPosition blockposition, EntityHuman entityhuman) {
+ if (!world.isClientSide) {
+- this.play(world, blockposition);
++ this.play(world, blockposition, iblockdata); // CraftBukkit
+ entityhuman.a(StatisticList.PLAY_NOTEBLOCK);
+ }
+ }
diff --git a/nms-patches/BlockOre.patch b/nms-patches/BlockOre.patch
index 236ce96e..38a98939 100644
--- a/nms-patches/BlockOre.patch
+++ b/nms-patches/BlockOre.patch
@@ -1,14 +1,14 @@
--- a/net/minecraft/server/BlockOre.java
+++ b/net/minecraft/server/BlockOre.java
-@@ -37,6 +37,7 @@
+@@ -32,6 +32,7 @@
- public void dropNaturally(World world, BlockPosition blockposition, IBlockData iblockdata, float f, int i) {
- super.dropNaturally(world, blockposition, iblockdata, f, i);
+ public void dropNaturally(IBlockData iblockdata, World world, BlockPosition blockposition, float f, int i) {
+ super.dropNaturally(iblockdata, world, blockposition, f, i);
+ /* CraftBukkit start - Delegated to getExpDrop
- if (this.getDropType(iblockdata, world.random, i) != Item.getItemOf(this)) {
+ if (this.getDropType(iblockdata, world, blockposition, i) != this) {
int j = 0;
-@@ -54,9 +55,34 @@
+@@ -49,9 +50,34 @@
this.dropExperience(world, blockposition, j);
}
@@ -17,8 +17,8 @@
}
+ @Override
-+ public int getExpDrop(World world, IBlockData iblockdata, int i) {
-+ if (this.getDropType(iblockdata, world.random, i) != Item.getItemOf(this)) {
++ public int getExpDrop(IBlockData iblockdata, World world, BlockPosition blockposition, int enchantmentLevel) {
++ if (this.getDropType(iblockdata, world, blockposition, enchantmentLevel) != this) {
+ int j = 0;
+
+ if (this == Blocks.COAL_ORE) {
@@ -29,7 +29,7 @@
+ 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) {
++ } else if (this == Blocks.NETHER_QUARTZ_ORE) {
+ j = MathHelper.nextInt(world.random, 2, 5);
+ }
+
@@ -40,6 +40,6 @@
+ // CraftBukkit end
+ }
+
- public ItemStack a(World world, BlockPosition blockposition, IBlockData iblockdata) {
+ public ItemStack a(IBlockAccess iblockaccess, BlockPosition blockposition, IBlockData iblockdata) {
return new ItemStack(this);
}
diff --git a/nms-patches/BlockPiston.patch b/nms-patches/BlockPiston.patch
index c7e24f36..ae8fcc83 100644
--- a/nms-patches/BlockPiston.patch
+++ b/nms-patches/BlockPiston.patch
@@ -1,8 +1,8 @@
--- a/net/minecraft/server/BlockPiston.java
+++ b/net/minecraft/server/BlockPiston.java
-@@ -5,6 +5,18 @@
+@@ -7,6 +7,18 @@
+ import java.util.Iterator;
import java.util.List;
- import javax.annotation.Nullable;
+// CraftBukkit start
+import java.util.AbstractList;
@@ -18,39 +18,30 @@
+
public class BlockPiston extends BlockDirectional {
- public static final BlockStateBoolean EXTENDED = BlockStateBoolean.of("extended");
-@@ -103,6 +115,18 @@
- world.playBlockAction(blockposition, this, 0, enumdirection.a());
- }
- } else if (!flag && ((Boolean) iblockdata.get(BlockPiston.EXTENDED)).booleanValue()) {
-+ // CraftBukkit start
-+ if (!this.sticky) {
-+ org.bukkit.block.Block block = world.getWorld().getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ());
-+ BlockPistonRetractEvent event = new BlockPistonRetractEvent(block, ImmutableList.<org.bukkit.block.Block>of(), CraftBlock.notchToBlockFace(enumdirection));
-+ world.getServer().getPluginManager().callEvent(event);
-+
-+ if (event.isCancelled()) {
-+ return;
-+ }
-+ }
-+ // PAIL: checkME - what happened to setTypeAndData?
-+ // CraftBukkit end
- world.playBlockAction(blockposition, this, 1, enumdirection.a());
- }
-
-@@ -193,7 +217,7 @@
+ public static final BlockStateBoolean EXTENDED = BlockProperties.f;
+@@ -109,6 +121,18 @@
+ b0 = 2;
}
}
++ // CraftBukkit start
++ if (!this.sticky) {
++ org.bukkit.block.Block block = world.getWorld().getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ());
++ BlockPistonRetractEvent event = new BlockPistonRetractEvent(block, ImmutableList.<org.bukkit.block.Block>of(), CraftBlock.notchToBlockFace(enumdirection));
++ world.getServer().getPluginManager().callEvent(event);
++
++ if (event.isCancelled()) {
++ return;
++ }
++ }
++ // PAIL: checkME - what happened to setTypeAndData?
++ // CraftBukkit end
+ }
-- if (!flag1 && iblockdata1.getMaterial() != Material.AIR && a(iblockdata1, world, blockposition1, enumdirection.opposite(), false, enumdirection) && (iblockdata1.o() == EnumPistonReaction.NORMAL || block == Blocks.PISTON || block == Blocks.STICKY_PISTON)) {
-+ if (!flag1 && a(iblockdata1, world, blockposition1, enumdirection.opposite(), false, enumdirection) && (iblockdata1.o() == EnumPistonReaction.NORMAL || block == Blocks.PISTON || block == Blocks.STICKY_PISTON)) { // CraftBukkit - remove 'block.getMaterial() != Material.AIR' condition
- this.a(world, blockposition, enumdirection, false);
- }
- } else {
-@@ -277,6 +301,48 @@
- int j = list.size() + list1.size();
+ world.playBlockAction(blockposition, this, b0, enumdirection.a());
+@@ -271,6 +295,48 @@
IBlockData[] aiblockdata = new IBlockData[j];
EnumDirection enumdirection1 = flag ? enumdirection : enumdirection.opposite();
+ HashSet hashset = Sets.newHashSet(list);
+ // CraftBukkit start
+ final org.bukkit.block.Block bblock = world.getWorld().getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ());
+
diff --git a/nms-patches/BlockPlant.patch b/nms-patches/BlockPlant.patch
index c9ac5dc7..d3ff331e 100644
--- a/nms-patches/BlockPlant.patch
+++ b/nms-patches/BlockPlant.patch
@@ -1,14 +1,18 @@
--- a/net/minecraft/server/BlockPlant.java
+++ b/net/minecraft/server/BlockPlant.java
-@@ -40,6 +40,11 @@
+@@ -13,7 +13,14 @@
+ }
- protected void e(World world, BlockPosition blockposition, IBlockData iblockdata) {
- if (!this.f(world, blockposition, iblockdata)) {
-+ // CraftBukkit start
-+ if (org.bukkit.craftbukkit.event.CraftEventFactory.callBlockPhysicsEvent(world, blockposition).isCancelled()) {
-+ return;
+ public IBlockData updateState(IBlockData iblockdata, EnumDirection enumdirection, IBlockData iblockdata1, GeneratorAccess generatoraccess, BlockPosition blockposition, BlockPosition blockposition1) {
+- return !iblockdata.canPlace(generatoraccess, blockposition) ? Blocks.AIR.getBlockData() : super.updateState(iblockdata, enumdirection, iblockdata1, generatoraccess, blockposition, blockposition1);
++ // CraftBukkit start
++ if (!iblockdata.canPlace(generatoraccess, blockposition)) {
++ if (!org.bukkit.craftbukkit.event.CraftEventFactory.callBlockPhysicsEvent(generatoraccess, blockposition).isCancelled()) {
++ return Blocks.AIR.getBlockData();
+ }
-+ // CraftBukkit end
- this.b(world, blockposition, iblockdata, 0);
- world.setTypeAndData(blockposition, Blocks.AIR.getBlockData(), 3);
- }
++ }
++ return super.updateState(iblockdata, enumdirection, iblockdata1, generatoraccess, blockposition, blockposition1);
++ // CraftBukkit end
+ }
+
+ public boolean canPlace(IBlockData iblockdata, IWorldReader iworldreader, BlockPosition blockposition) {
diff --git a/nms-patches/BlockPortal.patch b/nms-patches/BlockPortal.patch
index f9ccf2aa..07c4cf20 100644
--- a/nms-patches/BlockPortal.patch
+++ b/nms-patches/BlockPortal.patch
@@ -1,50 +1,45 @@
--- a/net/minecraft/server/BlockPortal.java
+++ b/net/minecraft/server/BlockPortal.java
-@@ -4,6 +4,9 @@
+@@ -4,6 +4,12 @@
import java.util.Random;
import javax.annotation.Nullable;
-+import org.bukkit.event.entity.EntityPortalEnterEvent; // CraftBukkit
-+import org.bukkit.event.world.PortalCreateEvent; // CraftBukkit
++// CraftBukkit start
++import org.bukkit.craftbukkit.block.CraftBlock;
++import org.bukkit.event.entity.EntityPortalEnterEvent;
++import org.bukkit.event.world.PortalCreateEvent;
++// CraftBukkit end
+
- public class BlockPortal extends BlockHalfTransparent {
+ public class BlockPortal extends Block {
- public static final BlockStateEnum<EnumDirection.EnumAxis> AXIS = BlockStateEnum.of("axis", EnumDirection.EnumAxis.class, new EnumDirection.EnumAxis[] { EnumDirection.EnumAxis.X, EnumDirection.EnumAxis.Z});
-@@ -43,7 +46,8 @@
+ public static final BlockStateEnum<EnumDirection.EnumAxis> AXIS = BlockProperties.y;
+@@ -37,7 +43,8 @@
}
- if (i > 0 && !world.getType(blockposition1.up()).l()) {
-- Entity entity = ItemMonsterEgg.a(world, EntityTypes.getName(EntityPigZombie.class), (double) blockposition1.getX() + 0.5D, (double) blockposition1.getY() + 1.1D, (double) blockposition1.getZ() + 0.5D);
+ if (i > 0 && !world.getType(blockposition1.up()).isOccluding()) {
+- Entity entity = EntityTypes.ZOMBIE_PIGMAN.a(world, (NBTTagCompound) null, (IChatBaseComponent) null, (EntityHuman) null, blockposition1.up(), false, false);
+ // CraftBukkit - set spawn reason to NETHER_PORTAL
-+ Entity entity = ItemMonsterEgg.spawnCreature(world, EntityTypes.getName(EntityPigZombie.class), (double) blockposition1.getX() + 0.5D, (double) blockposition1.getY() + 1.1D, (double) blockposition1.getZ() + 0.5D, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.NETHER_PORTAL);
++ Entity entity = EntityTypes.ZOMBIE_PIGMAN.spawnCreature(world, (NBTTagCompound) null, (IChatBaseComponent) null, (EntityHuman) null, blockposition1.up(), false, false, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.NETHER_PORTAL);
if (entity != null) {
- entity.portalCooldown = entity.aM();
-@@ -70,14 +74,16 @@
- BlockPortal.Shape blockportal_shape = new BlockPortal.Shape(world, blockposition, EnumDirection.EnumAxis.X);
+ entity.portalCooldown = entity.aQ();
+@@ -55,8 +62,10 @@
+ BlockPortal.Shape blockportal_shape = this.b(generatoraccess, blockposition);
- if (blockportal_shape.d() && blockportal_shape.e == 0) {
+ if (blockportal_shape != null) {
- blockportal_shape.createPortal();
- return true;
+ // CraftBukkit start - return portalcreator
+ return blockportal_shape.createPortal();
+ // return true;
++ // CraftBukkit end
} else {
- BlockPortal.Shape blockportal_shape1 = new BlockPortal.Shape(world, blockposition, EnumDirection.EnumAxis.Z);
-
- if (blockportal_shape1.d() && blockportal_shape1.e == 0) {
-- blockportal_shape1.createPortal();
-- return true;
-+ return blockportal_shape1.createPortal();
-+ // return true;
-+ // CraftBukkit end
- } else {
- return false;
- }
-@@ -108,6 +114,10 @@
+ return false;
+ }
+@@ -93,6 +102,10 @@
- public void a(World world, BlockPosition blockposition, IBlockData iblockdata, Entity entity) {
- if (!entity.isPassenger() && !entity.isVehicle() && entity.bf()) {
+ public void a(IBlockData iblockdata, World world, BlockPosition blockposition, Entity entity) {
+ if (!entity.isPassenger() && !entity.isVehicle() && entity.bm()) {
+ // 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);
@@ -52,33 +47,32 @@
entity.e(blockposition);
}
-@@ -216,6 +226,7 @@
+@@ -193,6 +206,7 @@
private BlockPosition position;
private int height;
private int width;
+ java.util.Collection<org.bukkit.block.Block> blocks = new java.util.HashSet<org.bukkit.block.Block>(); // CraftBukkit - add field
- public Shape(World world, BlockPosition blockposition, EnumDirection.EnumAxis enumdirection_enumaxis) {
- this.a = world;
-@@ -274,6 +285,10 @@
+ public Shape(GeneratorAccess generatoraccess, BlockPosition blockposition, EnumDirection.EnumAxis enumdirection_enumaxis) {
+ this.a = generatoraccess;
+@@ -251,6 +265,9 @@
}
protected int c() {
+ // CraftBukkit start
+ this.blocks.clear();
-+ org.bukkit.World bworld = this.a.getWorld();
+ // CraftBukkit end
int i;
label56:
-@@ -294,11 +309,21 @@
+@@ -273,11 +290,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()));
++ blocks.add(CraftBlock.at(this.a, pos));
+ // CraftBukkit end
}
} else if (i == this.width - 1) {
@@ -88,31 +82,31 @@
+ // 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()));
++ blocks.add(CraftBlock.at(this.a, pos));
+ // CraftBukkit end
}
}
}
-@@ -308,6 +333,11 @@
+@@ -287,6 +314,11 @@
if (this.a.getType(this.position.shift(this.c, i).up(this.height)).getBlock() != Blocks.OBSIDIAN) {
this.height = 0;
break;
+ // CraftBukkit start - add the block to our list
+ } else {
+ BlockPosition pos = this.position.shift(this.c, i).up(this.height);
-+ blocks.add(bworld.getBlockAt(pos.getX(), pos.getY(), pos.getZ()));
++ blocks.add(CraftBlock.at(this.a, pos));
+ // CraftBukkit end
}
}
-@@ -329,7 +359,27 @@
+@@ -310,7 +342,27 @@
return this.position != null && this.width >= 2 && this.width <= 21 && this.height >= 3 && this.height <= 21;
}
- public void createPortal() {
+ // CraftBukkit start - return boolean
+ public boolean createPortal() {
-+ org.bukkit.World bworld = this.a.getWorld();
++ org.bukkit.World bworld = this.a.getMinecraftWorld().getWorld();
+
+ // Copy below for loop
+ for (int i = 0; i < this.width; ++i) {
@@ -125,7 +119,7 @@
+ }
+
+ PortalCreateEvent event = new PortalCreateEvent(blocks, bworld, PortalCreateEvent.CreateReason.FIRE);
-+ this.a.getServer().getPluginManager().callEvent(event);
++ this.a.getMinecraftWorld().getMinecraftServer().server.getPluginManager().callEvent(event);
+
+ if (event.isCancelled()) {
+ return false;
@@ -134,11 +128,11 @@
for (int i = 0; i < this.width; ++i) {
BlockPosition blockposition = this.position.shift(this.c, i);
-@@ -338,6 +388,7 @@
+@@ -319,6 +371,7 @@
}
}
+ return true; // CraftBukkit
}
- }
- }
+
+ private boolean g() {
diff --git a/nms-patches/BlockPoweredRail.patch b/nms-patches/BlockPoweredRail.patch
index 973f5576..5a9e7598 100644
--- a/nms-patches/BlockPoweredRail.patch
+++ b/nms-patches/BlockPoweredRail.patch
@@ -1,25 +1,24 @@
--- a/net/minecraft/server/BlockPoweredRail.java
+++ b/net/minecraft/server/BlockPoweredRail.java
-@@ -3,6 +3,8 @@
- import com.google.common.base.Predicate;
- import javax.annotation.Nullable;
+@@ -1,5 +1,7 @@
+ package net.minecraft.server;
+import org.bukkit.craftbukkit.event.CraftEventFactory; // CraftBukkit
+
public class BlockPoweredRail extends BlockMinecartTrackAbstract {
- public static final BlockStateEnum<BlockMinecartTrackAbstract.EnumTrackPosition> SHAPE = BlockStateEnum.a("shape", BlockMinecartTrackAbstract.EnumTrackPosition.class, new Predicate() {
-@@ -117,6 +119,13 @@
+ public static final BlockStateEnum<BlockPropertyTrackPosition> SHAPE = BlockProperties.R;
+@@ -106,6 +108,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();
++ int power = flag ? 15 : 0;
++ int newPower = CraftEventFactory.callRedstoneChange(world, blockposition, 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, false);
- if (((BlockMinecartTrackAbstract.EnumTrackPosition) iblockdata.get(BlockPoweredRail.SHAPE)).c()) {
+ world.setTypeAndData(blockposition, (IBlockData) iblockdata.set(BlockPoweredRail.POWERED, Boolean.valueOf(flag1)), 3);
+ world.applyPhysics(blockposition.down(), this);
+ if (((BlockPropertyTrackPosition) iblockdata.get(BlockPoweredRail.SHAPE)).c()) {
diff --git a/nms-patches/BlockPressurePlateAbstract.patch b/nms-patches/BlockPressurePlateAbstract.patch
index 775f0989..08fea30f 100644
--- a/nms-patches/BlockPressurePlateAbstract.patch
+++ b/nms-patches/BlockPressurePlateAbstract.patch
@@ -1,15 +1,15 @@
--- a/net/minecraft/server/BlockPressurePlateAbstract.java
+++ b/net/minecraft/server/BlockPressurePlateAbstract.java
-@@ -3,6 +3,8 @@
+@@ -2,6 +2,8 @@
+
import java.util.Random;
- import javax.annotation.Nullable;
+import org.bukkit.event.block.BlockRedstoneEvent; // CraftBukkit
+
public abstract class BlockPressurePlateAbstract extends Block {
- protected static final AxisAlignedBB a = new AxisAlignedBB(0.0625D, 0.0D, 0.0625D, 0.9375D, 0.03125D, 0.9375D);
-@@ -95,6 +97,19 @@
+ protected static final VoxelShape a = Block.a(1.0D, 0.0D, 1.0D, 15.0D, 0.5D, 15.0D);
+@@ -65,6 +67,19 @@
boolean flag = i > 0;
boolean flag1 = j > 0;
diff --git a/nms-patches/BlockPressurePlateBinary.patch b/nms-patches/BlockPressurePlateBinary.patch
index fea5dce1..6607944b 100644
--- a/nms-patches/BlockPressurePlateBinary.patch
+++ b/nms-patches/BlockPressurePlateBinary.patch
@@ -8,7 +8,7 @@
+
public class BlockPressurePlateBinary extends BlockPressurePlateAbstract {
- public static final BlockStateBoolean POWERED = BlockStateBoolean.of("powered");
+ public static final BlockStateBoolean POWERED = BlockProperties.t;
@@ -63,6 +65,26 @@
while (iterator.hasNext()) {
Entity entity = (Entity) iterator.next();
diff --git a/nms-patches/BlockPressurePlateWeighted.patch b/nms-patches/BlockPressurePlateWeighted.patch
index d24fd748..6550159b 100644
--- a/nms-patches/BlockPressurePlateWeighted.patch
+++ b/nms-patches/BlockPressurePlateWeighted.patch
@@ -7,11 +7,11 @@
+
public class BlockPressurePlateWeighted extends BlockPressurePlateAbstract {
- public static final BlockStateInteger POWER = BlockStateInteger.of("power", 0, 15);
-@@ -16,7 +18,31 @@
+ public static final BlockStateInteger POWER = BlockProperties.ak;
+@@ -12,7 +14,31 @@
}
- protected int e(World world, BlockPosition blockposition) {
+ protected int b(World world, BlockPosition blockposition) {
- int i = Math.min(world.a(Entity.class, BlockPressurePlateWeighted.c.a(blockposition)).size(), this.weight);
+ // CraftBukkit start
+ // int i = Math.min(world.a(Entity.class, BlockPressurePlateWeighted.c.a(blockposition)).size(), this.weight);
diff --git a/nms-patches/BlockPumpkin.patch b/nms-patches/BlockPumpkin.patch
deleted file mode 100644
index 04cdad4b..00000000
--- a/nms-patches/BlockPumpkin.patch
+++ /dev/null
@@ -1,81 +0,0 @@
---- a/net/minecraft/server/BlockPumpkin.java
-+++ b/net/minecraft/server/BlockPumpkin.java
-@@ -4,6 +4,12 @@
- import java.util.Iterator;
- import javax.annotation.Nullable;
-
-+// 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 BlockFacingHorizontal {
-
- private ShapeDetector snowGolemPart;
-@@ -43,18 +49,25 @@
- EntityPlayer entityplayer;
- int j;
-
-+ BlockStateListPopulator blockList = new BlockStateListPopulator(world.getWorld()); // CraftBukkit - Use BlockStateListPopulator
- if (shapedetector_shapedetectorcollection != null) {
- for (i = 0; i < this.getDetectorSnowGolem().b(); ++i) {
- ShapeDetectorBlock shapedetectorblock = shapedetector_shapedetectorcollection.a(0, i, 0);
-
-- world.setTypeAndData(shapedetectorblock.getPosition(), Blocks.AIR.getBlockData(), 2);
-+ // CraftBukkit start
-+ // world.setTypeAndData(shapedetectorblock.d(), Blocks.AIR.getBlockData(), 2);
-+ BlockPosition pos = shapedetectorblock.getPosition();
-+ blockList.setTypeId(pos.getX(), pos.getY(), pos.getZ(), 0);
-+ // CraftBukkit end
- }
-
- EntitySnowman entitysnowman = new EntitySnowman(world);
- BlockPosition blockposition1 = shapedetector_shapedetectorcollection.a(0, 2, 0).getPosition();
-
- 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();
- iterator = world.a(EntityPlayer.class, entitysnowman.getBoundingBox().g(5.0D)).iterator();
-
- while (iterator.hasNext()) {
-@@ -71,12 +84,17 @@
-
- world.update(shapedetectorblock1.getPosition(), Blocks.AIR, false);
- }
-+ } // CraftBukkit end
- } else {
- shapedetector_shapedetectorcollection = this.getDetectorIronGolem().a(world, blockposition);
- if (shapedetector_shapedetectorcollection != null) {
- for (i = 0; i < this.getDetectorIronGolem().c(); ++i) {
- for (int k = 0; k < this.getDetectorIronGolem().b(); ++k) {
-- world.setTypeAndData(shapedetector_shapedetectorcollection.a(i, k, 0).getPosition(), Blocks.AIR.getBlockData(), 2);
-+ // CraftBukkit start
-+ // world.setTypeAndData(shapedetector_shapedetectorcollection.a(i, k, 0).getPosition(), Blocks.AIR.getBlockData(), 2);
-+ BlockPosition pos = shapedetector_shapedetectorcollection.a(i, k, 0).getPosition();
-+ blockList.setTypeId(pos.getX(), pos.getY(), pos.getZ(), 0);
-+ // CraftBukkit end
- }
- }
-
-@@ -85,7 +103,9 @@
-
- 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);
-+ // CraftBukkit start
-+ if (world.addEntity(entityirongolem, SpawnReason.BUILD_IRONGOLEM)) {
-+ blockList.updateList();
- iterator = world.a(EntityPlayer.class, entityirongolem.getBoundingBox().g(5.0D)).iterator();
-
- while (iterator.hasNext()) {
-@@ -105,6 +125,7 @@
- }
- }
- }
-+ } // CraftBukkit end
- }
-
- }
diff --git a/nms-patches/BlockPumpkinCarved.patch b/nms-patches/BlockPumpkinCarved.patch
new file mode 100644
index 00000000..8e2dfb39
--- /dev/null
+++ b/nms-patches/BlockPumpkinCarved.patch
@@ -0,0 +1,65 @@
+--- a/net/minecraft/server/BlockPumpkinCarved.java
++++ b/net/minecraft/server/BlockPumpkinCarved.java
+@@ -3,6 +3,12 @@
+ import java.util.Iterator;
+ import java.util.function.Predicate;
+
++// 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 BlockPumpkinCarved extends BlockFacingHorizontal {
+
+ public static final BlockStateDirection a = BlockFacingHorizontal.FACING;
+@@ -38,18 +44,24 @@
+ int j;
+ int k;
+
++ BlockStateListPopulator blockList = new BlockStateListPopulator(world); // CraftBukkit - Use BlockStateListPopulator
+ if (shapedetector_shapedetectorcollection != null) {
+ for (i = 0; i < this.d().b(); ++i) {
+ ShapeDetectorBlock shapedetectorblock1 = shapedetector_shapedetectorcollection.a(0, i, 0);
+
+- world.setTypeAndData(shapedetectorblock1.getPosition(), Blocks.AIR.getBlockData(), 2);
++ blockList.setTypeAndData(shapedetectorblock1.getPosition(), Blocks.AIR.getBlockData(), 2); // CraftBukkit
+ }
+
+ EntitySnowman entitysnowman = new EntitySnowman(world);
+ BlockPosition blockposition1 = shapedetector_shapedetectorcollection.a(0, 2, 0).getPosition();
+
+ 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)) {
++ return;
++ }
++ blockList.updateList();
++ // CraftBukkit end
+ iterator = world.a(EntityPlayer.class, entitysnowman.getBoundingBox().g(5.0D)).iterator();
+
+ while (iterator.hasNext()) {
+@@ -70,7 +82,7 @@
+ if (shapedetector_shapedetectorcollection != null) {
+ for (i = 0; i < this.f().c(); ++i) {
+ for (int l = 0; l < this.f().b(); ++l) {
+- world.setTypeAndData(shapedetector_shapedetectorcollection.a(i, l, 0).getPosition(), Blocks.AIR.getBlockData(), 2);
++ blockList.setTypeAndData(shapedetector_shapedetectorcollection.a(i, l, 0).getPosition(), Blocks.AIR.getBlockData(), 2); // CraftBukkit
+ }
+ }
+
+@@ -79,7 +91,12 @@
+
+ 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);
++ // CraftBukkit start
++ if (!world.addEntity(entityirongolem, SpawnReason.BUILD_IRONGOLEM)) {
++ return;
++ }
++ blockList.updateList();
++ // CraftBukkit end
+ iterator = world.a(EntityPlayer.class, entityirongolem.getBoundingBox().g(5.0D)).iterator();
+
+ while (iterator.hasNext()) {
diff --git a/nms-patches/BlockRedstoneLamp.patch b/nms-patches/BlockRedstoneLamp.patch
index e349acdc..71ed926c 100644
--- a/nms-patches/BlockRedstoneLamp.patch
+++ b/nms-patches/BlockRedstoneLamp.patch
@@ -1,54 +1,35 @@
--- a/net/minecraft/server/BlockRedstoneLamp.java
+++ b/net/minecraft/server/BlockRedstoneLamp.java
-@@ -2,6 +2,8 @@
-
+@@ -3,6 +3,8 @@
import java.util.Random;
+ import javax.annotation.Nullable;
+import org.bukkit.craftbukkit.event.CraftEventFactory; // CraftBukkit
+
public class BlockRedstoneLamp extends Block {
- private final boolean a;
-@@ -18,8 +20,18 @@
- public void onPlace(World world, BlockPosition blockposition, IBlockData iblockdata) {
- if (!world.isClientSide) {
- 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);
- } 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 +43,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);
+ public static final BlockStateBoolean a = BlockRedstoneTorch.LIT;
+@@ -33,6 +35,11 @@
+ if (flag) {
+ world.I().a(blockposition, this, 4);
+ } else {
++ // CraftBukkit start
++ if (CraftEventFactory.callRedstoneChange(world, blockposition, 0, 15).getNewCurrent() != 15) {
++ return;
++ }
++ // CraftBukkit end
+ world.setTypeAndData(blockposition, (IBlockData) iblockdata.a((IBlockState) BlockRedstoneLamp.a), 2);
+ }
}
-
-@@ -40,6 +57,11 @@
- public void b(World world, BlockPosition blockposition, IBlockData iblockdata, Random random) {
+@@ -43,6 +50,11 @@
+ public void a(IBlockData iblockdata, World world, BlockPosition blockposition, Random random) {
if (!world.isClientSide) {
- if (this.a && !world.isBlockIndirectlyPowered(blockposition)) {
+ if (((Boolean) iblockdata.get(BlockRedstoneLamp.a)).booleanValue() && !world.isBlockIndirectlyPowered(blockposition)) {
+ // CraftBukkit start
-+ if (CraftEventFactory.callRedstoneChange(world, blockposition.getX(), blockposition.getY(), blockposition.getZ(), 15, 0).getNewCurrent() != 0) {
++ if (CraftEventFactory.callRedstoneChange(world, blockposition, 15, 0).getNewCurrent() != 0) {
+ return;
+ }
+ // CraftBukkit end
- world.setTypeAndData(blockposition, Blocks.REDSTONE_LAMP.getBlockData(), 2);
+ world.setTypeAndData(blockposition, (IBlockData) iblockdata.a((IBlockState) BlockRedstoneLamp.a), 2);
}
diff --git a/nms-patches/BlockRedstoneOre.patch b/nms-patches/BlockRedstoneOre.patch
index c4b08ac9..e9312c2c 100644
--- a/nms-patches/BlockRedstoneOre.patch
+++ b/nms-patches/BlockRedstoneOre.patch
@@ -11,76 +11,75 @@
+
public class BlockRedstoneOre extends Block {
- private final boolean a;
-@@ -20,23 +25,45 @@
+ public static final BlockStateBoolean a = BlockRedstoneTorch.LIT;
+@@ -16,23 +21,44 @@
}
- public void attack(World world, BlockPosition blockposition, EntityHuman entityhuman) {
-- this.interact(world, blockposition);
-+ this.interact(world, blockposition, entityhuman); // CraftBukkit - add entityhuman
- super.attack(world, blockposition, entityhuman);
+ public void attack(IBlockData iblockdata, World world, BlockPosition blockposition, EntityHuman entityhuman) {
+- interact(iblockdata, world, blockposition);
++ interact(iblockdata, world, blockposition, entityhuman); // CraftBukkit - add entityhuman
+ super.attack(iblockdata, world, blockposition, entityhuman);
}
public void stepOn(World world, BlockPosition blockposition, Entity entity) {
-- this.interact(world, blockposition);
+- interact(world.getType(blockposition), world, blockposition);
- super.stepOn(world, blockposition, entity);
+ // CraftBukkit start
-+ // this.interact(world, blockposition);
++ // interact(world.getType(blockposition), world, blockposition);
+ // super.stepOn(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, null);
+ if (!event.isCancelled()) {
-+ this.interact(world, blockposition, entity); // add entity
++ interact(world.getType(blockposition), world, blockposition, entity); // add entity
+ super.stepOn(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.interact(world, blockposition, entity); // add entity
++ interact(world.getType(blockposition), world, blockposition, entity); // add entity
+ super.stepOn(world, blockposition, entity);
+ }
+ }
+ // CraftBukkit end
}
-+
- public boolean interact(World world, BlockPosition blockposition, IBlockData iblockdata, EntityHuman entityhuman, EnumHand enumhand, EnumDirection enumdirection, float f, float f1, float f2) {
-- this.interact(world, blockposition);
-+ this.interact(world, blockposition, entityhuman); // CraftBukkit - add entityhuman
- return super.interact(world, blockposition, iblockdata, entityhuman, enumhand, enumdirection, f, f1, f2);
+ public boolean interact(IBlockData iblockdata, World world, BlockPosition blockposition, EntityHuman entityhuman, EnumHand enumhand, EnumDirection enumdirection, float f, float f1, float f2) {
+- interact(iblockdata, world, blockposition);
++ interact(iblockdata, world, blockposition, entityhuman); // CraftBukkit - add entityhuman
+ return super.interact(iblockdata, world, blockposition, entityhuman, enumhand, enumdirection, f, f1, f2);
}
-- private void interact(World world, BlockPosition blockposition) {
-+ private void interact(World world, BlockPosition blockposition, Entity entity) { // CraftBukkit - add Entity
- this.playEffect(world, blockposition);
- if (this == Blocks.REDSTONE_ORE) {
+- private static void interact(IBlockData iblockdata, World world, BlockPosition blockposition) {
++ private static void interact(IBlockData iblockdata, World world, BlockPosition blockposition, Entity entity) { // CraftBukkit - add Entity
+ playEffect(world, blockposition);
+ if (!((Boolean) iblockdata.get(BlockRedstoneOre.a)).booleanValue()) {
+ // CraftBukkit start
-+ if (CraftEventFactory.callEntityChangeBlockEvent(entity, blockposition, Blocks.LIT_REDSTONE_ORE, 0).isCancelled()) {
++ if (CraftEventFactory.callEntityChangeBlockEvent(entity, blockposition, iblockdata.set(BlockRedstoneOre.a, Boolean.valueOf(true))).isCancelled()) {
+ return;
+ }
+ // CraftBukkit end
- world.setTypeUpdate(blockposition, Blocks.LIT_REDSTONE_ORE.getBlockData());
+ world.setTypeAndData(blockposition, (IBlockData) iblockdata.set(BlockRedstoneOre.a, Boolean.valueOf(true)), 3);
}
-@@ -44,6 +71,11 @@
+@@ -40,6 +66,11 @@
- public void b(World world, BlockPosition blockposition, IBlockData iblockdata, Random random) {
- if (this == Blocks.LIT_REDSTONE_ORE) {
+ public void a(IBlockData iblockdata, World world, BlockPosition blockposition, Random random) {
+ if (((Boolean) iblockdata.get(BlockRedstoneOre.a)).booleanValue()) {
+ // CraftBukkit start
-+ if (CraftEventFactory.callBlockFadeEvent(world.getWorld().getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ()), Blocks.REDSTONE_ORE).isCancelled()) {
++ if (CraftEventFactory.callBlockFadeEvent(world, blockposition, iblockdata.set(BlockRedstoneOre.a, Boolean.valueOf(false))).isCancelled()) {
+ return;
+ }
+ // CraftBukkit end
- world.setTypeUpdate(blockposition, Blocks.REDSTONE_ORE.getBlockData());
+ world.setTypeAndData(blockposition, (IBlockData) iblockdata.set(BlockRedstoneOre.a, Boolean.valueOf(false)), 3);
}
-@@ -63,12 +95,25 @@
+@@ -59,12 +90,25 @@
- public void dropNaturally(World world, BlockPosition blockposition, IBlockData iblockdata, float f, int i) {
- super.dropNaturally(world, blockposition, iblockdata, f, i);
+ public void dropNaturally(IBlockData iblockdata, World world, BlockPosition blockposition, float f, int i) {
+ super.dropNaturally(iblockdata, world, blockposition, f, i);
+ /* CraftBukkit start - Delegated to getExpDrop
- if (this.getDropType(iblockdata, world.random, i) != Item.getItemOf(this)) {
+ if (this.getDropType(iblockdata, world, blockposition, i) != this) {
int j = 1 + world.random.nextInt(5);
this.dropExperience(world, blockposition, j);
@@ -88,16 +87,16 @@
+ // */
+
+ }
-+
+
+ @Override
-+ public int getExpDrop(World world, IBlockData data, int i) {
-+ if (this.getDropType(data, world.random, i) != Item.getItemOf(this)) {
++ public int getExpDrop(IBlockData iblockdata, World world, BlockPosition blockposition, int enchantmentLevel) {
++ if (this.getDropType(iblockdata, world, blockposition, enchantmentLevel) != this) {
+ int j = 1 + world.random.nextInt(5);
-
++
+ return j;
+ }
+ return 0;
+ // CraftBukkit end
}
- private void playEffect(World world, BlockPosition blockposition) {
+ private static void playEffect(World world, BlockPosition blockposition) {
diff --git a/nms-patches/BlockRedstoneTorch.patch b/nms-patches/BlockRedstoneTorch.patch
index e35ce527..4506c4b4 100644
--- a/nms-patches/BlockRedstoneTorch.patch
+++ b/nms-patches/BlockRedstoneTorch.patch
@@ -8,29 +8,19 @@
+
public class BlockRedstoneTorch extends BlockTorch {
- private static final Map<World, List<BlockRedstoneTorch.RedstoneUpdateInfo>> g = Maps.newHashMap();
-@@ -13,7 +15,7 @@
-
- private boolean a(World world, BlockPosition blockposition, boolean flag) {
- if (!BlockRedstoneTorch.g.containsKey(world)) {
-- BlockRedstoneTorch.g.put(world, Lists.newArrayList());
-+ BlockRedstoneTorch.g.put(world, Lists.<BlockRedstoneTorch.RedstoneUpdateInfo>newArrayList()); // CraftBukkit - fix decompile error
- }
-
- List list = (List) BlockRedstoneTorch.g.get(world);
-@@ -96,8 +98,25 @@
+ public static final BlockStateBoolean LIT = BlockProperties.o;
+@@ -65,8 +67,24 @@
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;
++ int oldCurrent = ((Boolean) iblockdata.get(BlockRedstoneTorch.LIT)).booleanValue() ? 15 : 0;
+
+ BlockRedstoneEvent event = new BlockRedstoneEvent(block, oldCurrent, oldCurrent);
+ // CraftBukkit end
-+
- if (this.isOn) {
+ if (((Boolean) iblockdata.get(BlockRedstoneTorch.LIT)).booleanValue()) {
if (flag) {
+ // CraftBukkit start
+ if (oldCurrent != 0) {
@@ -41,13 +31,13 @@
+ }
+ }
+ // 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.a((EntityHuman) null, blockposition, SoundEffects.gm, SoundCategory.BLOCKS, 0.5F, 2.6F + (world.random.nextFloat() - world.random.nextFloat()) * 0.8F);
-@@ -114,6 +133,15 @@
+ world.setTypeAndData(blockposition, (IBlockData) iblockdata.set(BlockRedstoneTorch.LIT, Boolean.valueOf(false)), 3);
+ if (a(world, blockposition, true)) {
+ world.a((EntityHuman) null, blockposition, SoundEffects.BLOCK_REDSTONE_TORCH_BURNOUT, SoundCategory.BLOCKS, 0.5F, 2.6F + (world.random.nextFloat() - world.random.nextFloat()) * 0.8F);
+@@ -83,6 +101,15 @@
}
}
- } else if (!flag && !this.a(world, blockposition, false)) {
+ } else if (!flag && !a(world, blockposition, false)) {
+ // CraftBukkit start
+ if (oldCurrent != 15) {
+ event.setNewCurrent(15);
@@ -57,6 +47,15 @@
+ }
+ }
+ // CraftBukkit end
- world.setTypeAndData(blockposition, Blocks.REDSTONE_TORCH.getBlockData().set(BlockRedstoneTorch.FACING, iblockdata.get(BlockRedstoneTorch.FACING)), 3);
+ world.setTypeAndData(blockposition, (IBlockData) iblockdata.set(BlockRedstoneTorch.LIT, Boolean.valueOf(true)), 3);
}
+@@ -112,7 +139,7 @@
+ }
+
+ private static boolean a(World world, BlockPosition blockposition, boolean flag) {
+- Object object = (List) BlockRedstoneTorch.b.get(world);
++ List<RedstoneUpdateInfo> object = (List) BlockRedstoneTorch.b.get(world); // CraftBukkit - decompile error
+
+ if (object == null) {
+ object = Lists.newArrayList();
diff --git a/nms-patches/BlockRedstoneWire.patch b/nms-patches/BlockRedstoneWire.patch
index 0f200a35..206d6222 100644
--- a/nms-patches/BlockRedstoneWire.patch
+++ b/nms-patches/BlockRedstoneWire.patch
@@ -1,6 +1,6 @@
--- a/net/minecraft/server/BlockRedstoneWire.java
+++ b/net/minecraft/server/BlockRedstoneWire.java
-@@ -9,6 +9,8 @@
+@@ -11,6 +11,8 @@
import java.util.Set;
import javax.annotation.Nullable;
@@ -8,8 +8,8 @@
+
public class BlockRedstoneWire extends Block {
- public static final BlockStateEnum<BlockRedstoneWire.EnumRedstoneWireConnection> NORTH = BlockStateEnum.of("north", BlockRedstoneWire.EnumRedstoneWireConnection.class);
-@@ -168,6 +170,15 @@
+ public static final BlockStateEnum<BlockPropertyRedstoneSide> NORTH = BlockProperties.L;
+@@ -216,6 +218,15 @@
j = k;
}
@@ -23,5 +23,5 @@
+ // CraftBukkit end
+
if (i != j) {
- iblockdata = iblockdata.set(BlockRedstoneWire.POWER, Integer.valueOf(j));
+ iblockdata = (IBlockData) iblockdata.set(BlockRedstoneWire.POWER, Integer.valueOf(j));
if (world.getType(blockposition) == iblockdata1) {
diff --git a/nms-patches/BlockReed.patch b/nms-patches/BlockReed.patch
index 8acc843a..4bdaf9e7 100644
--- a/nms-patches/BlockReed.patch
+++ b/nms-patches/BlockReed.patch
@@ -1,16 +1,11 @@
--- a/net/minecraft/server/BlockReed.java
+++ b/net/minecraft/server/BlockReed.java
-@@ -32,8 +32,12 @@
- int j = ((Integer) iblockdata.get(BlockReed.AGE)).intValue();
+@@ -29,7 +29,7 @@
+ int j = ((Integer) iblockdata.get(BlockReed.AGE)).intValue();
- if (j == 15) {
-- world.setTypeUpdate(blockposition.up(), this.getBlockData());
-+ // CraftBukkit start
-+ // world.setTypeUpdate(blockposition.up(), this.getBlockData()); // CraftBukkit
-+ BlockPosition upPos = blockposition.up();
-+ org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockGrowEvent(world, upPos.getX(), upPos.getY(), upPos.getZ(), this, 0);
- world.setTypeAndData(blockposition, iblockdata.set(BlockReed.AGE, Integer.valueOf(0)), 4);
-+ // CraftBukkit end
- } else {
- world.setTypeAndData(blockposition, iblockdata.set(BlockReed.AGE, Integer.valueOf(j + 1)), 4);
- }
+ if (j == 15) {
+- world.setTypeUpdate(blockposition.up(), this.getBlockData());
++ org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockGrowEvent(world, blockposition.up(), this.getBlockData()); // CraftBukkit
+ world.setTypeAndData(blockposition, (IBlockData) iblockdata.set(BlockReed.AGE, Integer.valueOf(0)), 4);
+ } else {
+ world.setTypeAndData(blockposition, (IBlockData) iblockdata.set(BlockReed.AGE, Integer.valueOf(j + 1)), 4);
diff --git a/nms-patches/BlockSapling.patch b/nms-patches/BlockSapling.patch
index c5f6c374..3dab6232 100644
--- a/nms-patches/BlockSapling.patch
+++ b/nms-patches/BlockSapling.patch
@@ -15,112 +15,41 @@
+
public class BlockSapling extends BlockPlant implements IBlockFragilePlantElement {
- public static final BlockStateEnum<BlockWood.EnumLogVariant> TYPE = BlockStateEnum.of("type", BlockWood.EnumLogVariant.class);
- public static final BlockStateInteger STAGE = BlockStateInteger.of("stage", 0, 1);
- protected static final AxisAlignedBB d = new AxisAlignedBB(0.09999999403953552D, 0.0D, 0.09999999403953552D, 0.8999999761581421D, 0.800000011920929D, 0.8999999761581421D);
+ public static final BlockStateInteger STAGE = BlockProperties.al;
+ protected static final VoxelShape b = Block.a(2.0D, 0.0D, 2.0D, 14.0D, 12.0D, 14.0D);
+ private final WorldGenTreeProvider c;
+ public static TreeType treeType; // CraftBukkit
- protected BlockSapling() {
- this.w(this.blockStateList.getBlockData().set(BlockSapling.TYPE, BlockWood.EnumLogVariant.OAK).set(BlockSapling.STAGE, Integer.valueOf(0)));
-@@ -25,7 +35,30 @@
- if (!world.isClientSide) {
- 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);
-+ }
+ protected BlockSapling(WorldGenTreeProvider worldgentreeprovider, Block.Info block_info) {
+ super(block_info);
+@@ -21,7 +31,30 @@
+ public void a(IBlockData iblockdata, World world, BlockPosition blockposition, Random random) {
+ super.a(iblockdata, world, blockposition, 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
- }
-
++ }
++ // CraftBukkit end
}
-@@ -41,7 +74,17 @@
- }
-
- public void d(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;
-@@ -53,6 +96,7 @@
- for (i = 0; i >= -1; --i) {
- for (j = 0; j >= -1; --j) {
- if (this.a(world, blockposition, i, j, BlockWood.EnumLogVariant.SPRUCE)) {
-+ treeType = TreeType.MEGA_REDWOOD; // CraftBukkit
- object = new WorldGenMegaTree(false, random.nextBoolean());
- flag = true;
- break label66;
-@@ -63,11 +107,13 @@
- if (!flag) {
- i = 0;
- j = 0;
-+ treeType = TreeType.REDWOOD; // CraftBukkit
- object = new WorldGenTaiga2(true);
- }
- break;
- case BIRCH:
-+ treeType = TreeType.BIRCH; // CraftBukkit
- object = new WorldGenForest(true, false);
- break;
-
-@@ -79,6 +125,7 @@
- for (i = 0; i >= -1; --i) {
- for (j = 0; j >= -1; --j) {
- if (this.a(world, blockposition, i, j, BlockWood.EnumLogVariant.JUNGLE)) {
-+ treeType = TreeType.JUNGLE; // CraftBukkit
- object = new WorldGenJungleTree(true, 10, 20, iblockdata1, iblockdata2);
- flag = true;
- break label78;
-@@ -89,11 +136,13 @@
- if (!flag) {
- i = 0;
- j = 0;
-+ treeType = TreeType.SMALL_JUNGLE; // CraftBukkit
- object = new WorldGenTrees(true, 4 + random.nextInt(7), iblockdata1, iblockdata2, false);
- }
- break;
-
- case ACACIA:
-+ treeType = TreeType.ACACIA; // CraftBukkit
- object = new WorldGenAcaciaTree(true);
- break;
-
-@@ -102,6 +151,7 @@
- for (i = 0; i >= -1; --i) {
- for (j = 0; j >= -1; --j) {
- if (this.a(world, blockposition, i, j, BlockWood.EnumLogVariant.DARK_OAK)) {
-+ treeType = TreeType.DARK_OAK; // CraftBukkit
- object = new WorldGenForestTree(true);
- flag = true;
- break label90;
+ }
diff --git a/nms-patches/BlockShulkerBox.patch b/nms-patches/BlockShulkerBox.patch
index e0a5aaa3..e4c24bc9 100644
--- a/nms-patches/BlockShulkerBox.patch
+++ b/nms-patches/BlockShulkerBox.patch
@@ -1,32 +1,31 @@
--- a/net/minecraft/server/BlockShulkerBox.java
+++ b/net/minecraft/server/BlockShulkerBox.java
-@@ -92,7 +92,32 @@
-
+@@ -81,7 +81,31 @@
+ super.a(world, blockposition, iblockdata, entityhuman);
}
-- public void dropNaturally(World world, BlockPosition blockposition, IBlockData iblockdata, float f, int i) {}
+- public void dropNaturally(IBlockData iblockdata, World world, BlockPosition blockposition, float f, int i) {}
+ // CraftBukkit start - override to prevent duplication when dropping
-+ public void dropNaturally(World world, BlockPosition blockposition, IBlockData iblockdata, float f, int i) {
-+ TileEntity tileentity = world.getTileEntity(blockposition);
++ @Override
++ public void dropNaturally(IBlockData iblockdata, World world, BlockPosition blockposition, float f, int i) {
++ if (true) {
++ TileEntity tileentity = world.getTileEntity(blockposition);
+
-+ if (tileentity instanceof TileEntityShulkerBox) {
-+ TileEntityShulkerBox tileentityshulkerbox = (TileEntityShulkerBox) tileentity;
++ if (tileentity instanceof TileEntityShulkerBox) {
++ TileEntityShulkerBox tileentityshulkerbox = (TileEntityShulkerBox) tileentity;
+
-+ if (!tileentityshulkerbox.r() && tileentityshulkerbox.F()) {
-+ ItemStack itemstack = new ItemStack(Item.getItemOf(this));
-+ NBTTagCompound nbttagcompound = new NBTTagCompound();
-+ NBTTagCompound nbttagcompound1 = new NBTTagCompound();
++ if (!tileentityshulkerbox.s() && tileentityshulkerbox.G()) {
++ ItemStack itemstack = new ItemStack(this);
+
-+ nbttagcompound.set("BlockEntityTag", ((TileEntityShulkerBox) tileentity).f(nbttagcompound1));
-+ itemstack.setTag(nbttagcompound);
-+ if (tileentityshulkerbox.hasCustomName()) {
-+ itemstack.g(tileentityshulkerbox.getName());
-+ tileentityshulkerbox.setCustomName("");
-+ }
++ itemstack.getOrCreateTag().set("BlockEntityTag", ((TileEntityShulkerBox) tileentity).g(new NBTTagCompound()));
++ if (tileentityshulkerbox.hasCustomName()) {
++ itemstack.a(tileentityshulkerbox.getCustomName());
++ tileentityshulkerbox.setCustomName((IChatBaseComponent) null);
++ }
+
-+ a(world, blockposition, itemstack);
++ a(world, blockposition, itemstack);
++ }
+ }
-+
+ world.updateAdjacentComparators(blockposition, iblockdata.getBlock());
+ }
+ }
@@ -34,22 +33,22 @@
public void postPlace(World world, BlockPosition blockposition, IBlockData iblockdata, EntityLiving entityliving, ItemStack itemstack) {
if (itemstack.hasName()) {
-@@ -108,7 +133,7 @@
- public void remove(World world, BlockPosition blockposition, IBlockData iblockdata) {
- TileEntity tileentity = world.getTileEntity(blockposition);
+@@ -98,7 +122,7 @@
+ if (iblockdata.getBlock() != iblockdata1.getBlock()) {
+ TileEntity tileentity = world.getTileEntity(blockposition);
-- if (tileentity instanceof TileEntityShulkerBox) {
-+ if (false && tileentity instanceof TileEntityShulkerBox) { // CraftBukkit - moved up
- TileEntityShulkerBox tileentityshulkerbox = (TileEntityShulkerBox) tileentity;
+- if (tileentity instanceof TileEntityShulkerBox) {
++ if (false && tileentity instanceof TileEntityShulkerBox) { // CraftBukkit - moved up
+ TileEntityShulkerBox tileentityshulkerbox = (TileEntityShulkerBox) tileentity;
- if (!tileentityshulkerbox.r() && tileentityshulkerbox.F()) {
-@@ -126,8 +151,8 @@
- a(world, blockposition, itemstack);
+ if (!tileentityshulkerbox.s() && tileentityshulkerbox.G()) {
+@@ -113,8 +137,8 @@
+ a(world, blockposition, itemstack);
+ }
+
+- world.updateAdjacentComparators(blockposition, iblockdata.getBlock());
}
++ world.updateAdjacentComparators(blockposition, iblockdata.getBlock()); // CraftBukkit - moved down
-- world.updateAdjacentComparators(blockposition, iblockdata.getBlock());
+ super.remove(iblockdata, world, blockposition, iblockdata1, flag);
}
-+ world.updateAdjacentComparators(blockposition, iblockdata.getBlock()); // CraftBukkit - moved down
-
- super.remove(world, blockposition, iblockdata);
- }
diff --git a/nms-patches/BlockSkull.patch b/nms-patches/BlockSkull.patch
deleted file mode 100644
index b2c8601e..00000000
--- a/nms-patches/BlockSkull.patch
+++ /dev/null
@@ -1,123 +0,0 @@
---- a/net/minecraft/server/BlockSkull.java
-+++ b/net/minecraft/server/BlockSkull.java
-@@ -5,6 +5,11 @@
- import java.util.Random;
- import javax.annotation.Nullable;
-
-+// CraftBukkit start
-+import org.bukkit.craftbukkit.util.BlockStateListPopulator;
-+import org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason;
-+// CraftBukkit end
-+
- public class BlockSkull extends BlockTileEntity {
-
- public static final BlockStateDirection FACING = BlockDirectional.FACING;
-@@ -82,7 +87,29 @@
- return new ItemStack(Items.SKULL, 1, i);
- }
-
-- public void dropNaturally(World world, BlockPosition blockposition, IBlockData iblockdata, float f, int i) {}
-+ // CraftBukkit start - Special case dropping so we can get info from the tile entity
-+ @Override
-+ public void dropNaturally(World world, BlockPosition blockposition, IBlockData iblockdata, float f, int i) {
-+ if (world.random.nextFloat() < f) {
-+ TileEntity tileentity = world.getTileEntity(blockposition);
-+
-+ if (tileentity instanceof TileEntitySkull) {
-+ TileEntitySkull tileentityskull = (TileEntitySkull) tileentity;
-+ ItemStack itemstack = this.a(world, blockposition, iblockdata);
-+
-+ 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);
-+ }
-+
-+ a(world, blockposition, itemstack);
-+ }
-+ }
-+ }
-+ // CraftBukkit end
-
- public void a(World world, BlockPosition blockposition, IBlockData iblockdata, EntityHuman entityhuman) {
- if (entityhuman.abilities.canInstantlyBuild) {
-@@ -95,7 +122,10 @@
-
- public void remove(World world, BlockPosition blockposition, IBlockData iblockdata) {
- if (!world.isClientSide) {
-- 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) {
-@@ -127,24 +157,36 @@
- }
-
- public void a(World world, BlockPosition blockposition, TileEntitySkull tileentityskull) {
-+ if (world.captureBlockStates) return; // CraftBukkit
- if (tileentityskull.getSkullType() == 1 && blockposition.getY() >= 2 && world.getDifficulty() != EnumDifficulty.PEACEFUL && !world.isClientSide) {
- ShapeDetector shapedetector = this.g();
- ShapeDetector.ShapeDetectorCollection shapedetector_shapedetectorcollection = shapedetector.a(world, blockposition);
-
- if (shapedetector_shapedetectorcollection != null) {
-+ // CraftBukkit start - Use BlockStateListPopulator
-+ BlockStateListPopulator blockList = new BlockStateListPopulator(world.getWorld());
- int i;
-
- for (i = 0; i < 3; ++i) {
- ShapeDetectorBlock shapedetectorblock = shapedetector_shapedetectorcollection.a(i, 0, 0);
-
-- world.setTypeAndData(shapedetectorblock.getPosition(), shapedetectorblock.a().set(BlockSkull.NODROP, Boolean.valueOf(true)), 2);
-+ // CraftBukkit start
-+ // world.setTypeAndData(shapedetectorblock.getPosition(), shapedetectorblock.a().set(BlockSkull.NODROP, Boolean.valueOf(true)), 2);
-+ BlockPosition pos = shapedetectorblock.getPosition();
-+ 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 = shapedetector_shapedetectorcollection.a(i, j, 0);
-
-- world.setTypeAndData(shapedetectorblock1.getPosition(), Blocks.AIR.getBlockData(), 2);
-+ // CraftBukkit start
-+ // world.setTypeAndData(shapedetectorblock1.getPosition(), Blocks.AIR.getBlockData(), 2);
-+ BlockPosition pos = shapedetectorblock1.getPosition();
-+ blockList.setTypeAndData(pos.getX(), pos.getY(), pos.getZ(), Blocks.AIR, 0, 2);
-+ // CraftBukkit end
- }
- }
-
-@@ -157,14 +199,16 @@
- entitywither.p();
- Iterator iterator = world.a(EntityPlayer.class, entitywither.getBoundingBox().g(50.0D)).iterator();
-
-+ // CraftBukkit start
-+ if (world.addEntity(entitywither, SpawnReason.BUILD_WITHER)) {
-+ blockList.updateList();
-+
- while (iterator.hasNext()) {
- EntityPlayer entityplayer = (EntityPlayer) iterator.next();
-
- CriterionTriggers.m.a(entityplayer, (Entity) entitywither);
- }
-
-- world.addEntity(entitywither);
--
- int k;
-
- for (k = 0; k < 120; ++k) {
-@@ -178,6 +222,7 @@
- world.update(shapedetectorblock2.getPosition(), Blocks.AIR, false);
- }
- }
-+ } // CraftBukkit end
-
- }
- }
diff --git a/nms-patches/BlockSkullAbstract.patch b/nms-patches/BlockSkullAbstract.patch
new file mode 100644
index 00000000..84a88f4b
--- /dev/null
+++ b/nms-patches/BlockSkullAbstract.patch
@@ -0,0 +1,45 @@
+--- a/net/minecraft/server/BlockSkullAbstract.java
++++ b/net/minecraft/server/BlockSkullAbstract.java
+@@ -17,7 +17,32 @@
+ return new TileEntitySkull();
+ }
+
+- public void dropNaturally(IBlockData iblockdata, World world, BlockPosition blockposition, float f, int i) {}
++ // CraftBukkit start - Special case dropping so we can get info from the tile entity
++ @Override
++ public void dropNaturally(IBlockData iblockdata, World world, BlockPosition blockposition, float f, int i) {
++ if (world.random.nextFloat() < f) {
++ TileEntity tileentity = world.getTileEntity(blockposition);
++
++ if (tileentity instanceof TileEntitySkull) {
++ TileEntitySkull tileentityskull = (TileEntitySkull) tileentity;
++
++ if (tileentityskull.shouldDrop()) {
++ ItemStack itemstack = this.a((IBlockAccess) world, blockposition, iblockdata);
++ Block block = tileentityskull.getBlock().getBlock();
++
++ if ((block == Blocks.PLAYER_HEAD || block == Blocks.PLAYER_WALL_HEAD) && tileentityskull.getGameProfile() != null) {
++ NBTTagCompound nbttagcompound = new NBTTagCompound();
++
++ GameProfileSerializer.serialize(nbttagcompound, tileentityskull.getGameProfile());
++ itemstack.getOrCreateTag().set("SkullOwner", nbttagcompound);
++ }
++
++ a(world, blockposition, itemstack);
++ }
++ }
++ }
++ }
++ // CraftBukkit end
+
+ public void a(World world, BlockPosition blockposition, IBlockData iblockdata, EntityHuman entityhuman) {
+ if (!world.isClientSide && entityhuman.abilities.canInstantlyBuild) {
+@@ -35,7 +60,7 @@
+ if (iblockdata.getBlock() != iblockdata1.getBlock() && !world.isClientSide) {
+ TileEntity tileentity = world.getTileEntity(blockposition);
+
+- if (tileentity instanceof TileEntitySkull) {
++ if (false && tileentity instanceof TileEntitySkull) { // CraftBukkit - Drop item in code above, not here
+ TileEntitySkull tileentityskull = (TileEntitySkull) tileentity;
+
+ if (tileentityskull.shouldDrop()) {
diff --git a/nms-patches/BlockSnow.patch b/nms-patches/BlockSnow.patch
index b69c90e1..00bda675 100644
--- a/nms-patches/BlockSnow.patch
+++ b/nms-patches/BlockSnow.patch
@@ -1,14 +1,14 @@
--- a/net/minecraft/server/BlockSnow.java
+++ b/net/minecraft/server/BlockSnow.java
-@@ -91,6 +91,11 @@
+@@ -88,6 +88,11 @@
- public void b(World world, BlockPosition blockposition, IBlockData iblockdata, Random random) {
+ public void a(IBlockData iblockdata, World world, BlockPosition blockposition, Random random) {
if (world.getBrightness(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()) {
++ if (org.bukkit.craftbukkit.event.CraftEventFactory.callBlockFadeEvent(world, blockposition, Blocks.AIR.getBlockData()).isCancelled()) {
+ return;
+ }
+ // CraftBukkit end
- this.b(world, blockposition, world.getType(blockposition), 0);
+ iblockdata.a(world, blockposition, 0);
world.setAir(blockposition);
}
diff --git a/nms-patches/BlockSnowBlock.patch b/nms-patches/BlockSnowBlock.patch
index 53291493..0bd8cb69 100644
--- a/nms-patches/BlockSnowBlock.patch
+++ b/nms-patches/BlockSnowBlock.patch
@@ -1,14 +1,14 @@
--- a/net/minecraft/server/BlockSnowBlock.java
+++ b/net/minecraft/server/BlockSnowBlock.java
-@@ -20,6 +20,11 @@
+@@ -18,6 +18,11 @@
- public void b(World world, BlockPosition blockposition, IBlockData iblockdata, Random random) {
+ public void a(IBlockData iblockdata, World world, BlockPosition blockposition, Random random) {
if (world.getBrightness(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()) {
++ if (org.bukkit.craftbukkit.event.CraftEventFactory.callBlockFadeEvent(world, blockposition, Blocks.AIR.getBlockData()).isCancelled()) {
+ return;
+ }
+ // CraftBukkit end
- this.b(world, blockposition, world.getType(blockposition), 0);
+ iblockdata.a(world, blockposition, 0);
world.setAir(blockposition);
}
diff --git a/nms-patches/BlockSoil.patch b/nms-patches/BlockSoil.patch
index a7d37719..7c6475a0 100644
--- a/nms-patches/BlockSoil.patch
+++ b/nms-patches/BlockSoil.patch
@@ -1,7 +1,7 @@
--- a/net/minecraft/server/BlockSoil.java
+++ b/net/minecraft/server/BlockSoil.java
-@@ -4,6 +4,11 @@
- import java.util.List;
+@@ -3,6 +3,11 @@
+ import java.util.Iterator;
import java.util.Random;
+// CraftBukkit start
@@ -11,8 +11,8 @@
+
public class BlockSoil extends Block {
- public static final BlockStateInteger MOISTURE = BlockStateInteger.of("moisture", 0, 7);
-@@ -45,14 +50,38 @@
+ public static final BlockStateInteger MOISTURE = BlockProperties.ah;
+@@ -63,14 +68,37 @@
}
public void fallOn(World world, BlockPosition blockposition, Entity entity, float f) {
@@ -31,24 +31,23 @@
+ return;
+ }
+
-+ if (CraftEventFactory.callEntityChangeBlockEvent(entity, blockposition, Blocks.DIRT, 0).isCancelled()) {
++ if (CraftEventFactory.callEntityChangeBlockEvent(entity, blockposition, Blocks.DIRT.getBlockData()).isCancelled()) {
+ return;
+ }
+ // CraftBukkit end
- b(world, blockposition);
+ b(world.getType(blockposition), world, blockposition);
}
- super.fallOn(world, blockposition, entity, f);
+ // super.fallOn(world, blockposition, entity, f); // CraftBukkit - moved up
}
- protected static void b(World world, BlockPosition blockposition) {
+ protected static void b(IBlockData iblockdata, World world, BlockPosition blockposition) {
+ // CraftBukkit start
-+ org.bukkit.block.Block block = world.getWorld().getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ());
-+ if (CraftEventFactory.callBlockFadeEvent(block, Blocks.DIRT).isCancelled()) {
++ if (CraftEventFactory.callBlockFadeEvent(world, blockposition, Blocks.DIRT.getBlockData()).isCancelled()) {
+ return;
+ }
+ // CraftBukkit end
- world.setTypeUpdate(blockposition, Blocks.DIRT.getBlockData());
- AxisAlignedBB axisalignedbb = BlockSoil.c.a(blockposition);
- List list = world.getEntities((Entity) null, axisalignedbb);
+ world.setTypeUpdate(blockposition, a(iblockdata, Blocks.DIRT.getBlockData(), (GeneratorAccess) world, blockposition));
+ }
+
diff --git a/nms-patches/BlockStateInteger.patch b/nms-patches/BlockStateInteger.patch
new file mode 100644
index 00000000..878d458d
--- /dev/null
+++ b/nms-patches/BlockStateInteger.patch
@@ -0,0 +1,18 @@
+--- a/net/minecraft/server/BlockStateInteger.java
++++ b/net/minecraft/server/BlockStateInteger.java
+@@ -9,9 +9,15 @@
+ public class BlockStateInteger extends BlockState<Integer> {
+
+ private final ImmutableSet<Integer> a;
++ // CraftBukkit start
++ public final int min;
++ public final int max;
+
+ protected BlockStateInteger(String s, int i, int j) {
+ super(s, Integer.class);
++ this.min = i;
++ this.max = j;
++ // CraftBukkit end
+ if (i < 0) {
+ throw new IllegalArgumentException("Min value of " + s + " must be 0 or greater");
+ } else if (j <= i) {
diff --git a/nms-patches/BlockStationary.patch b/nms-patches/BlockStationary.patch
deleted file mode 100644
index 02a516fd..00000000
--- a/nms-patches/BlockStationary.patch
+++ /dev/null
@@ -1,40 +0,0 @@
---- a/net/minecraft/server/BlockStationary.java
-+++ b/net/minecraft/server/BlockStationary.java
-@@ -2,6 +2,8 @@
-
- import java.util.Random;
-
-+import org.bukkit.craftbukkit.event.CraftEventFactory; // CraftBukkit
-+
- public class BlockStationary extends BlockFluids {
-
- protected BlockStationary(Material material) {
-@@ -45,6 +47,13 @@
-
- if (block.material == Material.AIR) {
- if (this.c(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;
- }
-@@ -61,6 +70,14 @@
- }
-
- if (world.isEmpty(blockposition2.up()) && this.d(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
index df952dca..1159ca0a 100644
--- a/nms-patches/BlockStem.patch
+++ b/nms-patches/BlockStem.patch
@@ -1,6 +1,6 @@
--- a/net/minecraft/server/BlockStem.java
+++ b/net/minecraft/server/BlockStem.java
-@@ -4,6 +4,8 @@
+@@ -3,6 +3,8 @@
import java.util.Random;
import javax.annotation.Nullable;
@@ -8,34 +8,30 @@
+
public class BlockStem extends BlockPlant implements IBlockFragilePlantElement {
- public static final BlockStateInteger AGE = BlockStateInteger.of("age", 0, 7);
-@@ -54,7 +56,8 @@
+ public static final BlockStateInteger AGE = BlockProperties.V;
+@@ -33,14 +35,14 @@
if (i < 7) {
- iblockdata = iblockdata.set(BlockStem.AGE, Integer.valueOf(i + 1));
+ iblockdata = (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
++ CraftEventFactory.handleBlockGrowEvent(world, blockposition, iblockdata, 2); // CraftBukkit
} else {
- Iterator iterator = EnumDirection.EnumDirectionLimit.HORIZONTAL.iterator();
+ EnumDirection enumdirection = EnumDirection.EnumDirectionLimit.HORIZONTAL.a(random);
+ BlockPosition blockposition1 = blockposition.shift(enumdirection);
+ Block block = world.getType(blockposition1.down()).getBlock();
-@@ -70,7 +73,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
+ if (world.getType(blockposition1).isAir() && (block == Blocks.FARMLAND || block == Blocks.DIRT || block == Blocks.COARSE_DIRT || block == Blocks.PODZOL || block == Blocks.GRASS_BLOCK)) {
+- world.setTypeUpdate(blockposition1, this.blockFruit.getBlockData());
++ CraftEventFactory.handleBlockGrowEvent(world, blockposition1, this.blockFruit.getBlockData()); // CraftBukkit
+ world.setTypeUpdate(blockposition, (IBlockData) this.blockFruit.d().getBlockData().set(BlockFacingHorizontal.FACING, enumdirection));
}
}
- }
-@@ -81,7 +85,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
- }
+@@ -94,7 +96,7 @@
+ int i = Math.min(7, ((Integer) iblockdata.get(BlockStem.AGE)).intValue() + MathHelper.nextInt(world.random, 2, 5));
+ IBlockData iblockdata1 = (IBlockData) iblockdata.set(BlockStem.AGE, Integer.valueOf(i));
- public void dropNaturally(World world, BlockPosition blockposition, IBlockData iblockdata, float f, int i) {
+- world.setTypeAndData(blockposition, iblockdata1, 2);
++ CraftEventFactory.handleBlockGrowEvent(world, blockposition, iblockdata1, 2); // CraftBukkit
+ if (i == 7) {
+ iblockdata1.a(world, blockposition, world.random);
+ }
diff --git a/nms-patches/BlockTNT.patch b/nms-patches/BlockTNT.patch
index ef5838b9..1af71a5f 100644
--- a/nms-patches/BlockTNT.patch
+++ b/nms-patches/BlockTNT.patch
@@ -1,14 +1,14 @@
--- a/net/minecraft/server/BlockTNT.java
+++ b/net/minecraft/server/BlockTNT.java
-@@ -75,6 +75,11 @@
+@@ -72,6 +72,11 @@
EntityArrow entityarrow = (EntityArrow) entity;
if (entityarrow.isBurning()) {
+ // CraftBukkit start
-+ if (org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(entityarrow, blockposition, Blocks.AIR, 0).isCancelled()) {
++ if (org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(entityarrow, blockposition, Blocks.AIR.getBlockData()).isCancelled()) {
+ return;
+ }
+ // CraftBukkit end
- this.a(world, blockposition, world.getType(blockposition).set(BlockTNT.EXPLODE, Boolean.valueOf(true)), entityarrow.shooter instanceof EntityLiving ? (EntityLiving) entityarrow.shooter : null);
+ this.a(world, blockposition, entityarrow.shooter instanceof EntityLiving ? (EntityLiving) entityarrow.shooter : null);
world.setAir(blockposition);
}
diff --git a/nms-patches/BlockTallPlant.patch b/nms-patches/BlockTallPlant.patch
index a1127a3a..70676d56 100644
--- a/nms-patches/BlockTallPlant.patch
+++ b/nms-patches/BlockTallPlant.patch
@@ -1,14 +1,14 @@
--- a/net/minecraft/server/BlockTallPlant.java
+++ b/net/minecraft/server/BlockTallPlant.java
@@ -48,6 +48,11 @@
+ }
- protected void e(World world, BlockPosition blockposition, IBlockData iblockdata) {
- if (!this.f(world, blockposition, iblockdata)) {
-+ // CraftBukkit start
-+ if (org.bukkit.craftbukkit.event.CraftEventFactory.callBlockPhysicsEvent(world, blockposition).isCancelled()) {
-+ return;
-+ }
-+ // CraftBukkit end
- boolean flag = iblockdata.get(BlockTallPlant.HALF) == BlockTallPlant.EnumTallPlantHalf.UPPER;
- BlockPosition blockposition1 = flag ? blockposition : blockposition.up();
- BlockPosition blockposition2 = flag ? blockposition.down() : blockposition;
+ public void a(World world, BlockPosition blockposition, IBlockData iblockdata, EntityHuman entityhuman) {
++ // CraftBukkit start
++ if (org.bukkit.craftbukkit.event.CraftEventFactory.callBlockPhysicsEvent(world, blockposition).isCancelled()) {
++ return;
++ }
++ // CraftBukkit end
+ BlockPropertyDoubleBlockHalf blockpropertydoubleblockhalf = (BlockPropertyDoubleBlockHalf) iblockdata.get(BlockTallPlant.HALF);
+ boolean flag = blockpropertydoubleblockhalf == BlockPropertyDoubleBlockHalf.LOWER;
+ BlockPosition blockposition1 = flag ? blockposition.up() : blockposition.down();
diff --git a/nms-patches/BlockTrapdoor.patch b/nms-patches/BlockTrapdoor.patch
index 31007095..c809229b 100644
--- a/nms-patches/BlockTrapdoor.patch
+++ b/nms-patches/BlockTrapdoor.patch
@@ -6,12 +6,12 @@
import javax.annotation.Nullable;
+import org.bukkit.event.block.BlockRedstoneEvent; // CraftBukkit
- public class BlockTrapdoor extends Block {
+ public class BlockTrapdoor extends BlockFacingHorizontal implements IFluidSource, IFluidContainer {
-@@ -91,6 +92,19 @@
+@@ -94,6 +95,19 @@
boolean flag = world.isBlockIndirectlyPowered(blockposition);
- if (flag || block.getBlockData().m()) {
+ if (flag != ((Boolean) iblockdata.get(BlockTrapdoor.c)).booleanValue()) {
+ // CraftBukkit start
+ org.bukkit.World bworld = world.getWorld();
+ org.bukkit.block.Block bblock = bworld.getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ());
@@ -19,12 +19,12 @@
+ int power = bblock.getBlockPower();
+ int oldPower = (Boolean) iblockdata.get(OPEN) ? 15 : 0;
+
-+ if (oldPower == 0 ^ power == 0 || block.getBlockData().n()) {
++ if (oldPower == 0 ^ power == 0 || block.getBlockData().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) {
+ if (((Boolean) iblockdata.get(BlockTrapdoor.OPEN)).booleanValue() != flag) {
+ iblockdata = (IBlockData) iblockdata.set(BlockTrapdoor.OPEN, Boolean.valueOf(flag));
+ this.a((EntityHuman) null, world, blockposition, flag);
diff --git a/nms-patches/BlockTripwire.patch b/nms-patches/BlockTripwire.patch
index 3f955f11..598b9c1b 100644
--- a/nms-patches/BlockTripwire.patch
+++ b/nms-patches/BlockTripwire.patch
@@ -1,15 +1,15 @@
--- a/net/minecraft/server/BlockTripwire.java
+++ b/net/minecraft/server/BlockTripwire.java
@@ -5,6 +5,8 @@
+ import java.util.Map;
import java.util.Random;
- import javax.annotation.Nullable;
+import org.bukkit.event.entity.EntityInteractEvent; // CraftBukkit
+
public class BlockTripwire extends Block {
- public static final BlockStateBoolean POWERED = BlockStateBoolean.of("powered");
-@@ -138,6 +140,40 @@
+ public static final BlockStateBoolean POWERED = BlockProperties.t;
+@@ -134,6 +136,40 @@
}
}
@@ -48,5 +48,5 @@
+ // CraftBukkit end
+
if (flag1 != flag) {
- iblockdata = iblockdata.set(BlockTripwire.POWERED, Boolean.valueOf(flag1));
+ iblockdata = (IBlockData) iblockdata.set(BlockTripwire.POWERED, Boolean.valueOf(flag1));
world.setTypeAndData(blockposition, iblockdata, 3);
diff --git a/nms-patches/BlockTripwireHook.patch b/nms-patches/BlockTripwireHook.patch
index d3cf0947..dcc5409e 100644
--- a/nms-patches/BlockTripwireHook.patch
+++ b/nms-patches/BlockTripwireHook.patch
@@ -1,6 +1,6 @@
--- a/net/minecraft/server/BlockTripwireHook.java
+++ b/net/minecraft/server/BlockTripwireHook.java
-@@ -5,6 +5,8 @@
+@@ -4,6 +4,8 @@
import java.util.Random;
import javax.annotation.Nullable;
@@ -9,7 +9,7 @@
public class BlockTripwireHook extends Block {
public static final BlockStateDirection FACING = BlockFacingHorizontal.FACING;
-@@ -160,6 +162,17 @@
+@@ -137,6 +139,17 @@
this.a(world, blockposition1, flag4, flag5, flag2, flag3);
}
@@ -26,4 +26,4 @@
+
this.a(world, blockposition, flag4, flag5, flag2, flag3);
if (!flag) {
- world.setTypeAndData(blockposition, iblockdata3.set(BlockTripwireHook.FACING, enumdirection), 3);
+ world.setTypeAndData(blockposition, (IBlockData) iblockdata3.set(BlockTripwireHook.FACING, enumdirection), 3);
diff --git a/nms-patches/BlockVine.patch b/nms-patches/BlockVine.patch
index aa2e152b..d7093f6f 100644
--- a/nms-patches/BlockVine.patch
+++ b/nms-patches/BlockVine.patch
@@ -1,71 +1,59 @@
--- a/net/minecraft/server/BlockVine.java
+++ b/net/minecraft/server/BlockVine.java
-@@ -4,6 +4,8 @@
- import java.util.Random;
+@@ -7,6 +7,8 @@
+ import java.util.function.Predicate;
import javax.annotation.Nullable;
+import org.bukkit.craftbukkit.event.CraftEventFactory; // CraftBukkit
+
public class BlockVine extends Block {
- public static final BlockStateBoolean UP = BlockStateBoolean.of("up");
-@@ -177,7 +179,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(blockposition1, iblockdata1, 2);
-+ // CraftBukkit start - Call BlockSpreadEvent
-+ // world.setTypeAndData(blockposition1, iblockdata1, 2);
-+ BlockPosition target = blockposition1;
-+ 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
- }
-
- } else {
-@@ -198,15 +206,26 @@
- BlockPosition blockposition3 = blockposition2.shift(enumdirection2);
- BlockPosition blockposition4 = blockposition2.shift(enumdirection3);
+ public static final BlockStateBoolean UP = BlockSprawling.q;
+@@ -183,20 +185,24 @@
+ BlockPosition blockposition3 = blockposition2.shift(enumdirection1);
+ BlockPosition blockposition4 = blockposition2.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(blockposition2.getX(), blockposition2.getY(), blockposition2.getZ());
++ // CraftBukkit start - Call BlockSpreadEvent
++ BlockPosition source = blockposition;
+
- if (flag2 && this.a(world, blockposition3.shift(enumdirection2), enumdirection2)) {
-- world.setTypeAndData(blockposition2, this.getBlockData().set(getDirection(enumdirection2), Boolean.valueOf(true)), 2);
-+ // world.setTypeAndData(blockposition2, this.getBlockData().set(getDirection(enumdirection2), Boolean.valueOf(true)), 2);
-+ CraftEventFactory.handleBlockSpreadEvent(bukkitBlock, source, this, toLegacyData(this.getBlockData().set(getDirection(enumdirection2), Boolean.valueOf(true))));
- } else if (flag3 && this.a(world, blockposition4.shift(enumdirection3), enumdirection3)) {
-- world.setTypeAndData(blockposition2, this.getBlockData().set(getDirection(enumdirection3), Boolean.valueOf(true)), 2);
-+ // world.setTypeAndData(blockposition2, this.getBlockData().set(getDirection(enumdirection3), Boolean.valueOf(true)), 2);
-+ CraftEventFactory.handleBlockSpreadEvent(bukkitBlock, source, this, toLegacyData(this.getBlockData().set(getDirection(enumdirection3), Boolean.valueOf(true))));
- } else if (flag2 && world.isEmpty(blockposition3) && this.a(world, blockposition3, enumdirection)) {
-- world.setTypeAndData(blockposition3, this.getBlockData().set(getDirection(enumdirection.opposite()), Boolean.valueOf(true)), 2);
-+ // world.setTypeAndData(blockposition3, this.getBlockData().set(getDirection(enumdirection.opposite()), Boolean.valueOf(true)), 2);
-+ bukkitBlock = world.getWorld().getBlockAt(blockposition3.getX(), blockposition3.getY(), blockposition3.getZ());
-+ CraftEventFactory.handleBlockSpreadEvent(bukkitBlock, source, this, toLegacyData(this.getBlockData().set(getDirection(enumdirection.opposite()), Boolean.valueOf(true))));
- } else if (flag3 && world.isEmpty(blockposition4) && this.a(world, blockposition4, enumdirection)) {
-- world.setTypeAndData(blockposition4, this.getBlockData().set(getDirection(enumdirection.opposite()), Boolean.valueOf(true)), 2);
-+ // world.setTypeAndData(blockposition4, this.getBlockData().set(getDirection(enumdirection.opposite()), Boolean.valueOf(true)), 2);
-+ bukkitBlock = world.getWorld().getBlockAt(blockposition4.getX(), blockposition4.getY(), blockposition4.getZ());
-+ CraftEventFactory.handleBlockSpreadEvent(bukkitBlock, source, this, toLegacyData(this.getBlockData().set(getDirection(enumdirection.opposite()), Boolean.valueOf(true))));
+ if (flag && this.b(world, blockposition3, enumdirection1)) {
+- world.setTypeAndData(blockposition2, (IBlockData) this.getBlockData().set(getDirection(enumdirection1), Boolean.valueOf(true)), 2);
++ CraftEventFactory.handleBlockSpreadEvent(world, source, blockposition2, (IBlockData) this.getBlockData().set(getDirection(enumdirection1), Boolean.valueOf(true)), 2);
+ } else if (flag1 && this.b(world, blockposition4, enumdirection2)) {
+- world.setTypeAndData(blockposition2, (IBlockData) this.getBlockData().set(getDirection(enumdirection2), Boolean.valueOf(true)), 2);
++ CraftEventFactory.handleBlockSpreadEvent(world, source, blockposition2, (IBlockData) this.getBlockData().set(getDirection(enumdirection2), Boolean.valueOf(true)), 2);
+ } else {
+ EnumDirection enumdirection3 = enumdirection.opposite();
+
+ if (flag && world.isEmpty(blockposition3) && this.b(world, blockposition.shift(enumdirection1), enumdirection3)) {
+- world.setTypeAndData(blockposition3, (IBlockData) this.getBlockData().set(getDirection(enumdirection3), Boolean.valueOf(true)), 2);
++ CraftEventFactory.handleBlockSpreadEvent(world, source, blockposition3, (IBlockData) this.getBlockData().set(getDirection(enumdirection3), Boolean.valueOf(true)), 2);
+ } else if (flag1 && world.isEmpty(blockposition4) && this.b(world, blockposition.shift(enumdirection2), enumdirection3)) {
+- world.setTypeAndData(blockposition4, (IBlockData) this.getBlockData().set(getDirection(enumdirection3), Boolean.valueOf(true)), 2);
++ CraftEventFactory.handleBlockSpreadEvent(world, source, blockposition4, (IBlockData) this.getBlockData().set(getDirection(enumdirection3), Boolean.valueOf(true)), 2);
+ } else if ((double) world.random.nextFloat() < 0.05D && this.b(world, blockposition2.up(), EnumDirection.UP)) {
+- world.setTypeAndData(blockposition2, (IBlockData) this.getBlockData().set(BlockVine.UP, Boolean.valueOf(true)), 2);
++ CraftEventFactory.handleBlockSpreadEvent(world, source, blockposition2, (IBlockData) this.getBlockData().set(BlockVine.UP, Boolean.valueOf(true)), 2);
}
+ // CraftBukkit end
- } else if (iblockdata2.d(world, blockposition2, enumdirection) == EnumBlockFaceShape.SOLID) {
- world.setTypeAndData(blockposition, iblockdata.set(getDirection(enumdirection), Boolean.valueOf(true)), 2);
}
-@@ -233,7 +252,12 @@
- }
+ } else if (this.b(world, blockposition2, enumdirection)) {
+ world.setTypeAndData(blockposition, (IBlockData) iblockdata.set(getDirection(enumdirection), Boolean.valueOf(true)), 2);
+@@ -226,7 +232,7 @@
+ }
- 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(blockposition2, iblockdata3, 2);
-+ // CraftBukkit start - Call BlockSpreadEvent
-+ // world.setTypeAndData(blockposition2, iblockdata3, 2);
-+ org.bukkit.block.Block source = world.getWorld().getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ());
-+ org.bukkit.block.Block bukkitBlock = world.getWorld().getBlockAt(blockposition2.getX(), blockposition2.getY(), blockposition2.getZ());
-+ CraftEventFactory.handleBlockSpreadEvent(bukkitBlock, source, this, toLegacyData(iblockdata3));
-+ // CraftBukkit end
- }
- } else if (block == this) {
- iblockdata3 = iblockdata2;
+ if (this.x(iblockdata3)) {
+- world.setTypeAndData(blockposition1, iblockdata3, 2);
++ CraftEventFactory.handleBlockSpreadEvent(world, blockposition, blockposition1, iblockdata3, 2); // CraftBukkit
+ }
+
+ return;
+@@ -241,7 +247,7 @@
+ IBlockData iblockdata5 = this.a(iblockdata, iblockdata4, random);
+
+ if (iblockdata4 != iblockdata5 && this.x(iblockdata5)) {
+- world.setTypeAndData(blockposition2, iblockdata5, 2);
++ CraftEventFactory.handleBlockSpreadEvent(world, blockposition, blockposition2, iblockdata5, 2); // CraftBukkit
+ }
+ }
+ }
diff --git a/nms-patches/BlockWaterLily.patch b/nms-patches/BlockWaterLily.patch
index 83a6ae1d..e055a696 100644
--- a/nms-patches/BlockWaterLily.patch
+++ b/nms-patches/BlockWaterLily.patch
@@ -1,11 +1,11 @@
--- a/net/minecraft/server/BlockWaterLily.java
+++ b/net/minecraft/server/BlockWaterLily.java
-@@ -20,7 +20,7 @@
+@@ -10,7 +10,7 @@
- public void a(World world, BlockPosition blockposition, IBlockData iblockdata, Entity entity) {
- super.a(world, blockposition, iblockdata, entity);
+ public void a(IBlockData iblockdata, World world, BlockPosition blockposition, Entity entity) {
+ super.a(iblockdata, world, blockposition, entity);
- if (entity instanceof EntityBoat) {
-+ if (entity instanceof EntityBoat && !org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(entity, blockposition, Blocks.AIR, 0).isCancelled()) { // CraftBukkit
++ if (entity instanceof EntityBoat && !org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(entity, blockposition, Blocks.AIR.getBlockData()).isCancelled()) { // CraftBukkit
world.setAir(new BlockPosition(blockposition), true);
}
diff --git a/nms-patches/BlockWitherSkull.patch b/nms-patches/BlockWitherSkull.patch
new file mode 100644
index 00000000..bc921119
--- /dev/null
+++ b/nms-patches/BlockWitherSkull.patch
@@ -0,0 +1,66 @@
+--- a/net/minecraft/server/BlockWitherSkull.java
++++ b/net/minecraft/server/BlockWitherSkull.java
+@@ -3,6 +3,11 @@
+ import java.util.Iterator;
+ import javax.annotation.Nullable;
+
++// CraftBukkit start
++import org.bukkit.craftbukkit.util.BlockStateListPopulator;
++import org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason;
++// CraftBukkit end
++
+ public class BlockWitherSkull extends BlockSkull {
+
+ private static ShapeDetector c;
+@@ -23,6 +28,7 @@
+ }
+
+ public static void a(World world, BlockPosition blockposition, TileEntitySkull tileentityskull) {
++ if (world.captureBlockStates) return; // CraftBukkit
+ Block block = tileentityskull.getBlock().getBlock();
+ boolean flag = block == Blocks.WITHER_SKELETON_SKULL || block == Blocks.WITHER_SKELETON_WALL_SKULL;
+
+@@ -31,6 +37,8 @@
+ ShapeDetector.ShapeDetectorCollection shapedetector_shapedetectorcollection = shapedetector.a(world, blockposition);
+
+ if (shapedetector_shapedetectorcollection != null) {
++ // CraftBukkit start - Use BlockStateListPopulator
++ BlockStateListPopulator blockList = new BlockStateListPopulator(world);
+ int i;
+
+ for (i = 0; i < 3; ++i) {
+@@ -39,7 +47,7 @@
+
+ for (i = 0; i < shapedetector.c(); ++i) {
+ for (int j = 0; j < shapedetector.b(); ++j) {
+- world.setTypeAndData(shapedetector_shapedetectorcollection.a(i, j, 0).getPosition(), Blocks.AIR.getBlockData(), 2);
++ blockList.setTypeAndData(shapedetector_shapedetectorcollection.a(i, j, 0).getPosition(), Blocks.AIR.getBlockData(), 2); // CraftBukkit
+ }
+ }
+
+@@ -50,6 +58,16 @@
+ entitywither.setPositionRotation((double) blockposition2.getX() + 0.5D, (double) blockposition2.getY() + 0.55D, (double) blockposition2.getZ() + 0.5D, shapedetector_shapedetectorcollection.getFacing().k() == EnumDirection.EnumAxis.X ? 0.0F : 90.0F, 0.0F);
+ entitywither.aQ = shapedetector_shapedetectorcollection.getFacing().k() == EnumDirection.EnumAxis.X ? 0.0F : 90.0F;
+ entitywither.l();
++ // CraftBukkit start
++ if (!world.addEntity(entitywither, SpawnReason.BUILD_WITHER)) {
++ // Restore drop status from above
++ for (i = 0; i < 3; ++i) {
++ TileEntitySkull.setShouldDrop(world, shapedetector_shapedetectorcollection.a(i, 0, 0).getPosition(), true);
++ }
++ return;
++ }
++ blockList.updateList();
++ // CraftBukkit end
+ Iterator iterator = world.a(EntityPlayer.class, entitywither.getBoundingBox().g(50.0D)).iterator();
+
+ while (iterator.hasNext()) {
+@@ -58,7 +76,7 @@
+ CriterionTriggers.n.a(entityplayer, (Entity) entitywither);
+ }
+
+- world.addEntity(entitywither);
++ // world.addEntity(entitywither); // CraftBukkit - moved up
+
+ int k;
+
diff --git a/nms-patches/ChatBaseComponent.patch b/nms-patches/ChatBaseComponent.patch
deleted file mode 100644
index bd82c4a1..00000000
--- a/nms-patches/ChatBaseComponent.patch
+++ /dev/null
@@ -1,11 +0,0 @@
---- a/net/minecraft/server/ChatBaseComponent.java
-+++ b/net/minecraft/server/ChatBaseComponent.java
-@@ -112,7 +112,7 @@
- }
-
- public int hashCode() {
-- return 31 * this.b.hashCode() + this.a.hashCode();
-+ return 31 * this.getChatModifier().hashCode() + this.a.hashCode(); // CraftBukkit - fix null pointer
- }
-
- public String toString() {
diff --git a/nms-patches/ChatModifier.patch b/nms-patches/ChatModifier.patch
deleted file mode 100644
index bd72bcff..00000000
--- a/nms-patches/ChatModifier.patch
+++ /dev/null
@@ -1,45 +0,0 @@
---- a/net/minecraft/server/ChatModifier.java
-+++ b/net/minecraft/server/ChatModifier.java
-@@ -263,16 +263,18 @@
- }
-
- public int hashCode() {
-- int i = this.b.hashCode();
-+ // CraftBukkit start - fix npe
-+ int i = b == null ? 0 : this.b.hashCode();
-
-- i = 31 * i + this.c.hashCode();
-- i = 31 * i + this.d.hashCode();
-- i = 31 * i + this.e.hashCode();
-- i = 31 * i + this.f.hashCode();
-- i = 31 * i + this.g.hashCode();
-- i = 31 * i + this.h.hashCode();
-- i = 31 * i + this.i.hashCode();
-- i = 31 * i + this.j.hashCode();
-+ i = 31 * i + (c == null ? 0 : this.c.hashCode());
-+ i = 31 * i + (d == null ? 0 : this.d.hashCode());
-+ i = 31 * i + (e == null ? 0 : this.e.hashCode());
-+ i = 31 * i + (f == null ? 0 : this.f.hashCode());
-+ i = 31 * i + (g == null ? 0 : this.g.hashCode());
-+ i = 31 * i + (h == null ? 0 : this.h.hashCode());
-+ i = 31 * i + (this.i == null ? 0 : this.i.hashCode());
-+ i = 31 * i + (j == null ? 0 : this.j.hashCode());
-+ // CraftBukkit end
- return i;
- }
-
-@@ -441,12 +443,12 @@
- }
-
- @Nullable
-- public JsonElement serialize(Object object, Type type, JsonSerializationContext jsonserializationcontext) {
-+ public JsonElement serialize(ChatModifier object, Type type, JsonSerializationContext jsonserializationcontext) { // CraftBukkit - fix decompile error
- return this.a((ChatModifier) object, type, jsonserializationcontext);
- }
-
- @Nullable
-- public Object deserialize(JsonElement jsonelement, Type type, JsonDeserializationContext jsondeserializationcontext) throws JsonParseException {
-+ public ChatModifier deserialize(JsonElement jsonelement, Type type, JsonDeserializationContext jsondeserializationcontext) throws JsonParseException { // CraftBukkit - fix decompile error
- return this.a(jsonelement, type, jsondeserializationcontext);
- }
- }
diff --git a/nms-patches/Chunk.patch b/nms-patches/Chunk.patch
index 92d24e2d..7159a34c 100644
--- a/nms-patches/Chunk.patch
+++ b/nms-patches/Chunk.patch
@@ -1,18 +1,17 @@
--- a/net/minecraft/server/Chunk.java
+++ b/net/minecraft/server/Chunk.java
-@@ -14,6 +14,9 @@
+@@ -23,6 +23,8 @@
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
+import com.google.common.collect.Lists; // CraftBukkit
-+import org.bukkit.Server; // CraftBukkit
+
- public class Chunk {
+ public class Chunk implements IChunkAccess {
private static final Logger e = LogManager.getLogger();
-@@ -42,6 +45,35 @@
- private final ConcurrentLinkedQueue<BlockPosition> y;
- public boolean d;
+@@ -58,6 +60,35 @@
+ private int E;
+ private final AtomicInteger F;
+ // CraftBukkit start - Neighbor loaded cache for chunk lighting and entity ticking
+ private int neighbors = 0x1 << 12;
@@ -43,13 +42,13 @@
+ }
+ // CraftBukkit end
+
- public Chunk(World world, int i, int j) {
+ public Chunk(World world, int i, int j, BiomeBase[] abiomebase, ChunkConverter chunkconverter, TickList<Block> ticklist, TickList<FluidType> ticklist1, long k) {
this.sections = new ChunkSection[16];
- this.g = new byte[256];
-@@ -62,8 +94,15 @@
-
- Arrays.fill(this.h, -999);
- Arrays.fill(this.g, (byte) -1);
+ this.h = new boolean[256];
+@@ -95,8 +126,16 @@
+ this.t = ticklist;
+ this.u = ticklist1;
+ this.A = k;
+ // CraftBukkit start
+ this.bukkitChunk = new org.bukkit.craftbukkit.CraftChunk(this);
+ this.chunkKey = ChunkCoordIntPair.a(this.locX, this.locZ);
@@ -57,22 +56,41 @@
+ public org.bukkit.Chunk bukkitChunk;
+ public boolean mustSave;
++ public boolean newChunk;
+ // CraftBukkit end
+
- public Chunk(World world, ChunkSnapshot chunksnapshot, int i, int j) {
- this(world, i, j);
- boolean flag = true;
-@@ -467,7 +506,8 @@
+ public Chunk(World world, ProtoChunk protochunk, int i, int j) {
+ this(world, i, j, protochunk.getBiomeIndex(), protochunk.v(), protochunk.n(), protochunk.o(), protochunk.m());
+
+@@ -136,14 +175,15 @@
+ HeightMap.Type heightmap_type = (HeightMap.Type) iterator.next();
+
+ if (heightmap_type.c() == HeightMap.Use.LIVE_WORLD) {
+- ((HeightMap) this.heightMap.computeIfAbsent(heightmap_type, (heightmap_type) -> {
+- return new HeightMap(this, heightmap_type);
++ ((HeightMap) this.heightMap.computeIfAbsent(heightmap_type, (heightmap_type1) -> { // CraftBukkit - decompile error
++ return new HeightMap(this, heightmap_type1); // CraftBukkit - decompile error
+ })).a(protochunk.b(heightmap_type).b());
+ }
+ }
+
+ this.y = true;
+ this.a(ChunkStatus.FULLCHUNK);
++ this.newChunk = true; // CraftBukkit
+ }
+
+ public Set<BlockPosition> t() {
+@@ -474,7 +514,8 @@
}
}
-- if (!this.world.isClientSide && block1 != block) {
+- if (!this.world.isClientSide) {
+ // 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.isClientSide && block1 != block && (!this.world.captureBlockStates || block instanceof BlockTileEntity)) {
- block.onPlace(this.world, blockposition, iblockdata);
++ if (!this.world.isClientSide && (!this.world.captureBlockStates || block instanceof BlockTileEntity)) {
+ iblockdata.onPlace(this.world, blockposition, iblockdata1);
}
-@@ -604,7 +644,15 @@
+@@ -654,7 +695,15 @@
@Nullable
public TileEntity a(BlockPosition blockposition, Chunk.EnumTileEntityState chunk_enumtileentitystate) {
@@ -89,21 +107,21 @@
if (tileentity == null) {
if (chunk_enumtileentitystate == Chunk.EnumTileEntityState.IMMEDIATE) {
-@@ -639,6 +687,13 @@
+@@ -689,6 +738,13 @@
- tileentity.A();
+ tileentity.z();
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(getBlockData(blockposition).getBlock()) + ") where there was no entity tile!");
++ + " (" + getType(blockposition) + ") where there was no entity tile!");
+ System.out.println("Chunk coordinates: " + (this.locX * 16) + "," + (this.locZ * 16));
+ new Exception().printStackTrace();
+ // CraftBukkit end
}
}
-@@ -681,9 +736,21 @@
+@@ -735,9 +791,21 @@
int i = aentityslice.length;
for (int j = 0; j < i; ++j) {
@@ -127,80 +145,49 @@
}
}
-@@ -745,8 +812,8 @@
+@@ -799,8 +867,8 @@
while (iterator.hasNext()) {
Entity entity = (Entity) iterator.next();
-- if (entity.getBoundingBox().c(axisalignedbb) && (predicate == null || predicate.apply(entity))) {
+- if (entity.getBoundingBox().c(axisalignedbb) && (predicate == null || predicate.test(entity))) {
- list.add(entity);
-+ if (entity.getBoundingBox().c(axisalignedbb) && (predicate == null || predicate.apply((T) entity))) { // CraftBukkit - fix decompile error
++ if (entity.getBoundingBox().c(axisalignedbb) && (predicate == null || predicate.test((T) entity))) { // CraftBukkit - fix decompile error
+ list.add((T) entity); // Fix decompile error
}
}
}
-@@ -773,7 +840,34 @@
- return false;
+@@ -1006,13 +1074,13 @@
+
+ @Nullable
+ public LongSet b(String s) {
+- return (LongSet) this.r.computeIfAbsent(s, (s) -> {
++ return (LongSet) this.r.computeIfAbsent(s, (s1) -> { // CraftBukkit - decompile error
+ return new LongOpenHashSet();
+ });
}
-- public void loadNearby(IChunkProvider ichunkprovider, ChunkGenerator chunkgenerator) {
-+ // CraftBukkit start
-+ public void loadNearby(IChunkProvider ichunkprovider, ChunkGenerator chunkgenerator, boolean newChunk) {
-+ 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(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 = getWorld().getChunkIfLoaded(locX + x, locZ + z);
-+ if (neighbor != null) {
-+ neighbor.setNeighborLoaded(-x, -z);
-+ setNeighborLoaded(x, z);
-+ }
-+ }
-+ }
-+ // CraftBukkit end
-+
- Chunk chunk = ichunkprovider.getLoadedChunkAt(this.locX, this.locZ - 1);
- Chunk chunk1 = ichunkprovider.getLoadedChunkAt(this.locX + 1, this.locZ);
- Chunk chunk2 = ichunkprovider.getLoadedChunkAt(this.locX, this.locZ + 1);
-@@ -809,6 +903,29 @@
- } else {
- this.o();
- chunkgenerator.recreateStructures(this.locX, this.locZ);
-+
-+ // 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) locX * xRand + (long) locZ * 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, bukkitChunk);
-+ }
-+ } finally {
-+ this.world.populating = false;
-+ }
-+ }
-+ BlockSand.instaFall = false;
-+ this.world.getServer().getPluginManager().callEvent(new org.bukkit.event.world.ChunkPopulateEvent(bukkitChunk));
-+ // CraftBukkit end
- this.markDirty();
- }
+ public void a(String s, long i) {
+- ((LongSet) this.r.computeIfAbsent(s, (s) -> {
++ ((LongSet) this.r.computeIfAbsent(s, (s1) -> { // CraftBukkit - decompile error
+ return new LongOpenHashSet();
+ })).add(i);
+ }
+@@ -1061,14 +1129,14 @@
+ }
+
+ if (this.t instanceof ProtoChunkTickList) {
+- ((ProtoChunkTickList) this.t).a(this.world.I(), (blockposition) -> {
+- return this.world.getType(blockposition).getBlock();
++ ((ProtoChunkTickList<Block>) this.t).a(this.world.I(), (blockposition1) -> { // CraftBukkit - decompile error
++ return this.world.getType(blockposition1).getBlock();
+ });
+ }
+
+ if (this.u instanceof ProtoChunkTickList) {
+- ((ProtoChunkTickList) this.u).a(this.world.H(), (blockposition) -> {
+- return this.world.b(blockposition).c();
++ ((ProtoChunkTickList<FluidType>) this.u).a(this.world.H(), (blockposition1) -> { // CraftBukkit - decompile error
++ return this.world.b(blockposition1).c();
+ });
+ }
diff --git a/nms-patches/ChunkMap.patch b/nms-patches/ChunkMap.patch
new file mode 100644
index 00000000..8007134e
--- /dev/null
+++ b/nms-patches/ChunkMap.patch
@@ -0,0 +1,88 @@
+--- a/net/minecraft/server/ChunkMap.java
++++ b/net/minecraft/server/ChunkMap.java
+@@ -31,6 +31,54 @@
+ }
+ }
+
++ org.bukkit.Server server = chunk.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, chunk.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.get(ChunkCoordIntPair.a(chunkcoordintpair.x + x, chunkcoordintpair.z + z));
++ if (neighbor != null) {
++ neighbor.setNeighborLoaded(-x, -z);
++ chunk.setNeighborLoaded(x, z);
++ }
++ }
++ }
++
++ if (chunk.newChunk) {
++ BlockSand.instaFall = true;
++ java.util.Random random = new java.util.Random();
++ random.setSeed(chunk.world.getSeed());
++ long xRand = random.nextLong() / 2L * 2L + 1L;
++ long zRand = random.nextLong() / 2L * 2L + 1L;
++ random.setSeed((long) chunk.locX * xRand + (long) chunk.locZ * zRand ^ chunk.world.getSeed());
++
++ org.bukkit.World world = chunk.world.getWorld();
++ if (world != null) {
++ chunk.world.populating = true;
++ try {
++ for (org.bukkit.generator.BlockPopulator populator : world.getPopulators()) {
++ populator.populate(world, random, chunk.bukkitChunk);
++ }
++ } finally {
++ chunk.world.populating = false;
++ }
++ }
++ BlockSand.instaFall = false;
++ chunk.world.getServer().getPluginManager().callEvent(new org.bukkit.event.world.ChunkPopulateEvent(chunk.bukkitChunk));
++ }
++
+ return chunk1;
+ }
+
+@@ -69,23 +117,25 @@
+ throw new RuntimeException("Not yet implemented");
+ }
+
+- public Object remove(Object object) {
++ // CraftBukkit start - decompile errors
++ public Chunk remove(Object object) {
+ return this.a(object);
+ }
+
+- public Object remove(long i) {
++ public Chunk remove(long i) {
+ return this.a(i);
+ }
+
+- public Object put(Long olong, Object object) {
++ public Chunk put(Long olong, Chunk object) {
+ return this.a(olong, (Chunk) object);
+ }
+
+- public Object put(long i, Object object) {
++ public Chunk put(long i, Chunk object) {
+ return this.a(i, (Chunk) object);
+ }
+
+- public Object put(Object object, Object object1) {
++ public Object put(Object object, Chunk object1) {
+ return this.a((Long) object, (Chunk) object1);
+ }
++ // CraftBukkit end
+ }
diff --git a/nms-patches/ChunkProviderGenerate.patch b/nms-patches/ChunkProviderGenerate.patch
index 65c2bcd9..f884de90 100644
--- a/nms-patches/ChunkProviderGenerate.patch
+++ b/nms-patches/ChunkProviderGenerate.patch
@@ -1,6 +1,6 @@
--- a/net/minecraft/server/ChunkProviderGenerate.java
+++ b/net/minecraft/server/ChunkProviderGenerate.java
-@@ -234,6 +234,11 @@
+@@ -166,6 +166,11 @@
f5 = 1.0F + f5 * 2.0F;
f6 = 1.0F + f6 * 4.0F;
}
@@ -10,5 +10,14 @@
+ }
+ // CraftBukkit end
- float f7 = this.r[l1 + 2 + (i2 + 2) * 5] / (f5 + 2.0F);
+ float f7 = this.o[l1 + 2 + (i2 + 2) * 5] / (f5 + 2.0F);
+@@ -267,7 +272,7 @@
+ return this.a.getSeaLevel() + 1;
+ }
+
+- public GeneratorSettings getSettings() {
++ public GeneratorSettingsOverworld getSettings() { // CraftBukkit - decompile error
+ return this.f();
+ }
+ }
diff --git a/nms-patches/ChunkProviderServer.patch b/nms-patches/ChunkProviderServer.patch
index 9f92a1c3..008a069b 100644
--- a/nms-patches/ChunkProviderServer.patch
+++ b/nms-patches/ChunkProviderServer.patch
@@ -1,6 +1,6 @@
--- a/net/minecraft/server/ChunkProviderServer.java
+++ b/net/minecraft/server/ChunkProviderServer.java
-@@ -15,6 +15,11 @@
+@@ -20,6 +20,11 @@
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
@@ -12,40 +12,31 @@
public class ChunkProviderServer implements IChunkProvider {
private static final Logger a = LogManager.getLogger();
-@@ -70,19 +75,82 @@
- Chunk chunk = this.getLoadedChunkAt(i, j);
+@@ -35,7 +40,7 @@
+ this.world = worldserver;
+ this.chunkLoader = ichunkloader;
+ this.chunkGenerator = chunkgenerator;
+- this.f = new ChunkTaskScheduler(2, worldserver, chunkgenerator, ichunkloader, iasynctaskhandler);
++ this.f = new ChunkTaskScheduler(0, worldserver, chunkgenerator, ichunkloader, iasynctaskhandler); // CraftBukkit - very buggy, broken in lots of __subtle__ ways. Same goes for async chunk loading. Also Bukkit API / plugins can't handle async events at all anyway.
+ this.g = new SchedulerBatch(this.f);
+ }
+
+@@ -77,9 +82,10 @@
+ @Nullable
+ private Chunk loadChunkAt(int i, int j) {
+ try {
+- Chunk chunk = this.chunkLoader.a(this.world, i, j, (chunk) -> {
+- chunk.setLastSaved(this.world.getTime());
+- this.chunks.put(ChunkCoordIntPair.a(i, j), chunk);
++ // CraftBukkit - decompile error
++ Chunk chunk = this.chunkLoader.a(this.world, i, j, (chunk1) -> {
++ chunk1.setLastSaved(this.world.getTime());
++ this.chunks.put(ChunkCoordIntPair.a(i, j), chunk1);
+ });
- if (chunk == null) {
-+ // CraftBukkit start
-+ ChunkRegionLoader loader = null;
-+
-+ if (this.chunkLoader instanceof ChunkRegionLoader) {
-+ loader = (ChunkRegionLoader) this.chunkLoader;
-+ }
-+ if (loader != null && loader.chunkExists(i, j)) {
-+ chunk = ChunkIOExecutor.syncChunkLoad(world, loader, this, i, j);
-+ }
-+ }
-+
-+ return chunk;
-+ }
-+
-+ @Nullable
-+ public Chunk originalGetOrLoadChunkAt(int i, int j) {
-+ // CraftBukkit end
-+ Chunk chunk = this.getLoadedChunkAt(i, j);
-+
-+ if (chunk == null) {
- chunk = this.loadChunk(i, j);
if (chunk != null) {
- this.chunks.put(ChunkCoordIntPair.a(i, j), chunk);
- chunk.addEntities();
-- chunk.loadNearby(this, this.chunkGenerator);
-+ chunk.loadNearby(this, this.chunkGenerator, false); // CraftBukkit
- }
+@@ -104,6 +110,12 @@
}
-
- return chunk;
}
+ // CraftBukkit start
@@ -55,74 +46,27 @@
+ // CraftBukkit end
+
public Chunk getChunkAt(int i, int j) {
-- Chunk chunk = this.getOrLoadChunkAt(i, j);
-+ return getChunkAt(i, j, null);
-+ }
-+
-+ public Chunk getChunkAt(int i, int j, Runnable runnable) {
-+ return getChunkAt(i, j, runnable, true);
-+ }
-+
-+ public Chunk getChunkAt(int i, int j, Runnable runnable, boolean generate) {
-+ Chunk chunk = getLoadedChunkAt(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(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 && generate) {
-+ 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) {
-+ Chunk chunk = this.originalGetOrLoadChunkAt(i, j);
-+ // CraftBukkit end
+ Chunk chunk = this.getOrLoadChunkAt(i, j);
- if (chunk == null) {
- long k = ChunkCoordIntPair.a(i, j);
-@@ -101,7 +169,7 @@
+@@ -125,7 +137,7 @@
+ synchronized (this.chunks) {
+ IChunkAccess ichunkaccess = (IChunkAccess) this.chunks.get(ChunkCoordIntPair.a(i, j));
- this.chunks.put(k, chunk);
- chunk.addEntities();
-- chunk.loadNearby(this, this.chunkGenerator);
-+ chunk.loadNearby(this, this.chunkGenerator, true); // CraftBukkit
+- return ichunkaccess != null ? ichunkaccess : (IChunkAccess) this.f.c((Object) (new ChunkCoordIntPair(i, j)));
++ return ichunkaccess != null ? ichunkaccess : (IChunkAccess) this.f.c((new ChunkCoordIntPair(i, j))); // CraftBukkit - decompile error
}
+ }
- return chunk;
-@@ -147,10 +215,12 @@
-
- public boolean a(boolean flag) {
- int i = 0;
-- ArrayList arraylist = Lists.newArrayList(this.chunks.values());
-
-- for (int j = 0; j < arraylist.size(); ++j) {
-- Chunk chunk = (Chunk) arraylist.get(j);
-+ // CraftBukkit start
-+ Iterator iterator = this.chunks.values().iterator();
-+ while (iterator.hasNext()) {
-+ Chunk chunk = (Chunk) iterator.next();
-+ // CraftBukkit end
+@@ -150,7 +162,7 @@
+ public CompletableFuture<Chunk> generateChunk(int i, int j) {
+ this.g.b();
+ this.g.a(new ChunkCoordIntPair(i, j));
+- CompletableFuture completablefuture = this.g.c();
++ CompletableFuture<ProtoChunk> completablefuture = this.g.c(); // CraftBukkit - decompile error
- if (flag) {
- this.saveChunkNOP(chunk);
-@@ -183,10 +253,12 @@
+ return completablefuture.thenApply(this::a);
+ }
+@@ -268,10 +280,12 @@
Chunk chunk = (Chunk) this.chunks.get(olong);
if (chunk != null && chunk.d) {
@@ -139,7 +83,7 @@
++i;
}
}
-@@ -198,6 +270,40 @@
+@@ -284,6 +298,40 @@
return false;
}
diff --git a/nms-patches/ChunkRegionLoader.patch b/nms-patches/ChunkRegionLoader.patch
index bf874a1b..d657e19a 100644
--- a/nms-patches/ChunkRegionLoader.patch
+++ b/nms-patches/ChunkRegionLoader.patch
@@ -1,112 +1,123 @@
--- a/net/minecraft/server/ChunkRegionLoader.java
+++ b/net/minecraft/server/ChunkRegionLoader.java
-@@ -19,29 +19,47 @@
-
- private static final Logger a = LogManager.getLogger();
- private final Map<ChunkCoordIntPair, NBTTagCompound> b = Maps.newConcurrentMap();
-- private final Set<ChunkCoordIntPair> c = Collections.newSetFromMap(Maps.newConcurrentMap());
-+ // CraftBukkit
-+ // private final Set<ChunkCoordIntPair> c = Collections.newSetFromMap(Maps.newConcurrentMap());
- private final File d;
- private final DataConverterManager e;
+@@ -34,7 +34,7 @@
+ private final File c;
+ private final DataFixer d;
+ private PersistentStructureLegacy e;
- private boolean f;
-+ // private boolean f;
-+ // CraftBukkit
++ // private boolean f; // CraftBukkit
- public ChunkRegionLoader(File file, DataConverterManager dataconvertermanager) {
- this.d = file;
- this.e = dataconvertermanager;
+ public ChunkRegionLoader(File file, DataFixer datafixer) {
+ this.c = file;
+@@ -50,12 +50,13 @@
+
+ @Nullable
+ private NBTTagCompound b(GeneratorAccess generatoraccess, int i, int j) throws IOException {
+- DataInputStream datainputstream = RegionFileCache.d(this.c, i, j);
++ // CraftBukkit start
++ NBTTagCompound nbttagcompound = RegionFileCache.d(this.c, i, j);
+
+- if (datainputstream == null) {
++ if (nbttagcompound == null) {
+ return null;
+ } else {
+- NBTTagCompound nbttagcompound = NBTCompressedStreamTools.a(datainputstream);
++ // CraftBukkit end
+ int k = nbttagcompound.hasKeyOfType("DataVersion", 99) ? nbttagcompound.getInt("DataVersion") : -1;
+
+ if (k < 1493) {
+@@ -78,13 +79,29 @@
+ }
}
+ // CraftBukkit start - Add async variant, provide compatibility
@Nullable
- public Chunk a(World world, int i, int j) throws IOException {
-+ Object[] data = loadChunk(world, i, j);
+ public synchronized Chunk a(GeneratorAccess generatoraccess, int i, int j, Consumer<Chunk> consumer) throws IOException {
++ Object[] data = loadChunk(generatoraccess, i, j, consumer);
+ if (data != null) {
+ Chunk chunk = (Chunk) data[0];
+ NBTTagCompound nbttagcompound = (NBTTagCompound) data[1];
-+ loadEntities(chunk, nbttagcompound.getCompound("Level"), world);
++ consumer.accept(chunk);
++ this.loadEntities(nbttagcompound.getCompound("Level"), chunk);
+ return chunk;
+ }
+
+ return null;
+ }
+
-+ public Object[] loadChunk(World world, int i, int j) throws IOException {
++ public synchronized Object[] loadChunk(GeneratorAccess generatoraccess, int i, int j, Consumer<Chunk> consumer) throws IOException {
+ // CraftBukkit end
- ChunkCoordIntPair chunkcoordintpair = new ChunkCoordIntPair(i, j);
- NBTTagCompound nbttagcompound = (NBTTagCompound) this.b.get(chunkcoordintpair);
+ NBTTagCompound nbttagcompound = this.a(generatoraccess, i, j);
if (nbttagcompound == null) {
-- DataInputStream datainputstream = RegionFileCache.d(this.d, i, j);
-+ // CraftBukkit start
-+ nbttagcompound = RegionFileCache.d(this.d, i, j);
+ return null;
+ } else {
++ /*
+ Chunk chunk = this.a(generatoraccess, i, j, nbttagcompound);
-- if (datainputstream == null) {
-+ if (nbttagcompound == null) {
- return null;
+ if (chunk != null) {
+@@ -93,6 +110,9 @@
}
-- nbttagcompound = this.e.a((DataConverterType) DataConverterTypes.CHUNK, NBTCompressedStreamTools.a(datainputstream));
-+ nbttagcompound = this.e.a((DataConverterType) DataConverterTypes.CHUNK, nbttagcompound);
-+ // CraftBukkit end
+ return chunk;
++ */
++
++ return this.a(generatoraccess, i, j, nbttagcompound);
}
+ }
- return this.a(world, i, j, nbttagcompound);
-@@ -55,7 +73,7 @@
+@@ -121,7 +141,7 @@
}
@Nullable
-- 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 {},{} is missing level data, skipping", Integer.valueOf(i), Integer.valueOf(j));
- return null;
-@@ -72,10 +90,28 @@
- ChunkRegionLoader.a.error("Chunk file at {},{} is in the wrong location; relocating. (Expected {}, {}, got {}, {})", Integer.valueOf(i), Integer.valueOf(j), Integer.valueOf(i), Integer.valueOf(j), Integer.valueOf(chunk.locX), Integer.valueOf(chunk.locZ));
- nbttagcompound1.setInt("xPos", i);
- nbttagcompound1.setInt("zPos", j);
+- protected Chunk a(GeneratorAccess generatoraccess, int i, int j, NBTTagCompound nbttagcompound) {
++ protected Object[] a(GeneratorAccess generatoraccess, int i, int j, NBTTagCompound nbttagcompound) { // CraftBukkit - return Chunk -> Object[]
+ if (nbttagcompound.hasKeyOfType("Level", 10) && nbttagcompound.getCompound("Level").hasKeyOfType("Status", 8)) {
+ ChunkStatus.Type chunkstatus_type = this.a(nbttagcompound);
+
+@@ -140,10 +160,28 @@
+ ChunkRegionLoader.a.error("Chunk file at {},{} is in the wrong location; relocating. (Expected {}, {}, got {}, {})", Integer.valueOf(i), Integer.valueOf(j), Integer.valueOf(i), Integer.valueOf(j), Integer.valueOf(chunk.locX), Integer.valueOf(chunk.locZ));
+ nbttagcompound1.setInt("xPos", i);
+ nbttagcompound1.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 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(generatoraccess, nbttagcompound1);
+ }
+
+- return chunk;
++ // CraftBukkit start
++ Object[] data = new Object[2];
++ data[0] = chunk;
++ data[1] = nbttagcompound;
++ return data;
+ // CraftBukkit end
- chunk = this.a(world, nbttagcompound1);
}
-
-- return chunk;
-+ // CraftBukkit start
-+ Object[] data = new Object[2];
-+ data[0] = chunk;
-+ data[1] = nbttagcompound;
-+ return data;
-+ // CraftBukkit end
}
- }
- }
-@@ -98,7 +134,9 @@
- }
+ } else {
+@@ -158,7 +196,7 @@
+ ChunkStatus.Type chunkstatus_type = this.a(nbttagcompound);
- protected void a(ChunkCoordIntPair chunkcoordintpair, NBTTagCompound nbttagcompound) {
-- if (!this.c.contains(chunkcoordintpair)) {
-+ // CraftBukkit
-+ // if (!this.c.contains(chunkcoordintpair))
-+ {
- this.b.put(chunkcoordintpair, nbttagcompound);
- }
+ if (chunkstatus_type == ChunkStatus.Type.LEVELCHUNK) {
+- return new ProtoChunkExtension(this.a(generatoraccess, i, j, nbttagcompound));
++ return new ProtoChunkExtension((IChunkAccess) this.a(generatoraccess, i, j, nbttagcompound)[0]); // CraftBukkit - fix up access
+ } else {
+ NBTTagCompound nbttagcompound1 = nbttagcompound.getCompound("Level");
-@@ -106,20 +144,32 @@
+@@ -204,19 +242,30 @@
}
- public boolean a() {
+ public synchronized boolean a() {
- if (this.b.isEmpty()) {
- if (this.f) {
+ // CraftBukkit start
@@ -118,7 +129,7 @@
+ if (!iter.hasNext()) {
+ if (logCompletion) {
+ // CraftBukkit end
- ChunkRegionLoader.a.info("ThreadedAnvilChunkStorage ({}): All chunks are saved", this.d.getName());
+ ChunkRegionLoader.a.info("ThreadedAnvilChunkStorage ({}): All chunks are saved", this.c.getName());
}
return false;
@@ -133,40 +144,37 @@
boolean flag;
try {
-- this.c.add(chunkcoordintpair);
-- NBTTagCompound nbttagcompound = (NBTTagCompound) this.b.remove(chunkcoordintpair);
-+ // this.c.add(chunkcoordintpair);
-+ // NBTTagCompound nbttagcompound = (NBTTagCompound) this.b.remove(chunkcoordintpair);
-+ // CraftBukkit
+- NBTTagCompound nbttagcompound = (NBTTagCompound) this.b.get(chunkcoordintpair);
++ // NBTTagCompound nbttagcompound = (NBTTagCompound) this.b.get(chunkcoordintpair); // CraftBukkit
if (nbttagcompound != null) {
try {
-@@ -131,7 +181,7 @@
+@@ -228,7 +277,7 @@
flag = true;
} finally {
-- this.c.remove(chunkcoordintpair);
+- this.b.remove(chunkcoordintpair);
+ this.b.remove(chunkcoordintpair, nbttagcompound); // CraftBukkit
}
return flag;
-@@ -139,10 +189,14 @@
+@@ -248,10 +297,14 @@
}
private void b(ChunkCoordIntPair chunkcoordintpair, NBTTagCompound nbttagcompound) throws IOException {
-- DataOutputStream dataoutputstream = RegionFileCache.e(this.d, chunkcoordintpair.x, chunkcoordintpair.z);
+- DataOutputStream dataoutputstream = RegionFileCache.e(this.c, chunkcoordintpair.x, chunkcoordintpair.z);
+ // CraftBukkit start
-+ RegionFileCache.e(this.d, chunkcoordintpair.x, chunkcoordintpair.z, nbttagcompound);
++ RegionFileCache.e(this.c, chunkcoordintpair.x, chunkcoordintpair.z, nbttagcompound);
+ /*
NBTCompressedStreamTools.a(nbttagcompound, (DataOutput) dataoutputstream);
dataoutputstream.close();
+ */
+ // CraftBukkit end
- }
-
- public void b(World world, Chunk chunk) throws IOException {}
-@@ -151,15 +205,16 @@
+ if (this.e != null) {
+ this.e.a(chunkcoordintpair.a());
+ }
+@@ -264,15 +317,16 @@
public void c() {
try {
@@ -186,30 +194,52 @@
}
}
-@@ -334,6 +389,13 @@
- chunk.a(nbttagcompound.getByteArray("Biomes"));
+@@ -301,7 +355,7 @@
+
+ if (abiomebase != null) {
+ for (int k = 0; k < abiomebase.length; ++k) {
+- aint[k] = BiomeBase.REGISTRY_ID.a((Object) abiomebase[k]);
++ aint[k] = BiomeBase.REGISTRY_ID.a(abiomebase[k]); // CraftBukkit - decompile error
+ }
}
-+ // 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);
+@@ -383,7 +437,7 @@
+ int[] aint = new int[abiomebase.length];
- for (int l = 0; l < nbttaglist1.size(); ++l) {
-@@ -371,7 +433,7 @@
- }
+ for (int i = 0; i < abiomebase.length; ++i) {
+- aint[i] = BiomeBase.REGISTRY_ID.a((Object) abiomebase[i]);
++ aint[i] = BiomeBase.REGISTRY_ID.a(abiomebase[i]); // CraftBukkit - decompile error
}
-- return chunk;
-+ // return chunk; // CraftBukkit
- }
+ nbttagcompound.setIntArray("Biomes", aint);
+@@ -485,7 +539,7 @@
+ }
- @Nullable
-@@ -399,14 +461,20 @@
+ ChunkConverter chunkconverter = nbttagcompound.hasKeyOfType("UpgradeData", 10) ? new ChunkConverter(nbttagcompound.getCompound("UpgradeData")) : ChunkConverter.a;
+- Predicate predicate = (block) -> {
++ Predicate<Block> predicate = (block) -> { // CraftBukkit - decompile error
+ return block.getBlockData().isAir();
+ };
+ RegistryBlocks registryblocks = Block.REGISTRY;
+@@ -497,7 +551,7 @@
+ Block.REGISTRY.getClass();
+ ProtoChunkTickList protochunkticklist = new ProtoChunkTickList(predicate, function, registryblocks1::get, new ChunkCoordIntPair(i, j));
+
+- predicate = (fluidtype) -> {
++ Predicate<FluidType> predicate1 = (fluidtype) -> { // CraftBukkit - decompile error
+ return fluidtype == FluidTypes.a;
+ };
+ registryblocks = FluidType.c;
+@@ -505,7 +559,7 @@
+ function = registryblocks::b;
+ registryblocks1 = FluidType.c;
+ FluidType.c.getClass();
+- ProtoChunkTickList protochunkticklist1 = new ProtoChunkTickList(predicate, function, registryblocks1::get, new ChunkCoordIntPair(i, j));
++ ProtoChunkTickList protochunkticklist1 = new ProtoChunkTickList(predicate1, function, registryblocks1::get, new ChunkCoordIntPair(i, j)); // CraftBukkit - decompile error
+ long i1 = nbttagcompound.getLong("InhabitedTime");
+ Chunk chunk = new Chunk(generatoraccess.getMinecraftWorld(), i, j, abiomebase, chunkconverter, protochunkticklist, protochunkticklist1, i1);
+
+@@ -852,17 +906,29 @@
}
@Nullable
@@ -220,30 +250,40 @@
+
+ public static Entity spawnEntity(NBTTagCompound nbttagcompound, World world, double d0, double d1, double d2, boolean flag, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason spawnReason) {
+ // CraftBukkit end
- Entity entity = a(nbttagcompound, world);
-
- if (entity == null) {
- return null;
- } else {
+ return a(nbttagcompound, world, (entity) -> {
entity.setPositionRotation(d0, d1, d2, entity.yaw, entity.pitch);
-- if (flag && !world.addEntity(entity)) {
-+ if (flag && !world.addEntity(entity, spawnReason)) { // CraftBukkit
- return null;
- } else {
- if (nbttagcompound.hasKeyOfType("Passengers", 9)) {
-@@ -435,8 +503,14 @@
+- return flag && !world.addEntity(entity) ? null : entity;
++ return flag && !world.addEntity(entity, spawnReason) ? null : entity;
+ });
+ }
+
+ @Nullable
++ // CraftBukkit start
+ public static Entity a(NBTTagCompound nbttagcompound, World world, boolean flag) {
++ return spawnEntity(nbttagcompound, world, flag, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.DEFAULT);
++ }
++
++ public static Entity spawnEntity(NBTTagCompound nbttagcompound, World world, boolean flag, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason spawnReason) {
++ // CraftBukkit end
+ return a(nbttagcompound, world, (entity) -> {
+- return flag && !world.addEntity(entity) ? null : entity;
++ return flag && !world.addEntity(entity, spawnReason) ? null : entity; // CraftBukkit
+ });
+ }
+
+@@ -876,8 +942,14 @@
}
}
+ // CraftBukkit start
- public static void a(Entity entity, World world) {
-- if (world.addEntity(entity) && entity.isVehicle()) {
-+ a(entity, world, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.DEFAULT);
+ public static void a(Entity entity, GeneratorAccess generatoraccess) {
+- if (generatoraccess.addEntity(entity) && entity.isVehicle()) {
++ a(entity, generatoraccess, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.DEFAULT);
+ }
+
-+ public static void a(Entity entity, World world, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason reason) {
-+ if (world.addEntity(entity, reason) && entity.isVehicle()) {
++ public static void a(Entity entity, GeneratorAccess generatoraccess, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason reason) {
++ if (generatoraccess.addEntity(entity, reason) && entity.isVehicle()) {
+ // CraftBukkit end
- Iterator iterator = entity.bF().iterator();
+ Iterator iterator = entity.bP().iterator();
while (iterator.hasNext()) {
diff --git a/nms-patches/ChunkSection.patch b/nms-patches/ChunkSection.patch
index 7a9ab688..88b6e356 100644
--- a/nms-patches/ChunkSection.patch
+++ b/nms-patches/ChunkSection.patch
@@ -1,31 +1,15 @@
--- a/net/minecraft/server/ChunkSection.java
+++ b/net/minecraft/server/ChunkSection.java
-@@ -19,6 +19,24 @@
+@@ -15,7 +15,7 @@
- }
-
-+ // CraftBukkit start
-+ public ChunkSection(int y, boolean flag, char[] blockIds) {
-+ this.yPos = y;
-+ this.blockIds = new DataPaletteBlock();
-+ for (int i = 0; i < blockIds.length; i++) {
-+ int xx = i & 15;
-+ int yy = (i >> 8) & 15;
-+ int zz = (i >> 4) & 15;
-+ this.blockIds.setBlock(xx, yy, zz, Block.REGISTRY_ID.fromId(blockIds[i]));
-+ }
-+ this.emittedLight = new NibbleArray();
-+ if (flag) {
-+ this.skyLight = new NibbleArray();
-+ }
-+ recalcBlockCounts();
-+ }
-+ // CraftBukkit end
-+
- public IBlockData getType(int i, int j, int k) {
- return this.blockIds.a(i, j, k);
- }
-@@ -46,7 +64,7 @@
+ public ChunkSection(int i, boolean flag) {
+ this.yPos = i;
+- this.blockIds = new DataPaletteBlock(ChunkSection.GLOBAL_PALETTE, Block.REGISTRY_ID, GameProfileSerializer::d, GameProfileSerializer::a, Blocks.AIR.getBlockData());
++ this.blockIds = new DataPaletteBlock<>(ChunkSection.GLOBAL_PALETTE, Block.REGISTRY_ID, GameProfileSerializer::d, GameProfileSerializer::a, Blocks.AIR.getBlockData()); // CraftBukkit - decompile error
+ this.emittedLight = new NibbleArray();
+ if (flag) {
+ this.skyLight = new NibbleArray();
+@@ -62,7 +62,7 @@
}
public boolean a() {
@@ -33,4 +17,4 @@
+ return false; // CraftBukkit - MC-80966
}
- public boolean shouldTick() {
+ public boolean b() {
diff --git a/nms-patches/CommandBlockListenerAbstract.patch b/nms-patches/CommandBlockListenerAbstract.patch
index 359289f0..84668fcc 100644
--- a/nms-patches/CommandBlockListenerAbstract.patch
+++ b/nms-patches/CommandBlockListenerAbstract.patch
@@ -1,209 +1,37 @@
--- a/net/minecraft/server/CommandBlockListenerAbstract.java
+++ b/net/minecraft/server/CommandBlockListenerAbstract.java
-@@ -4,6 +4,15 @@
+@@ -5,6 +5,7 @@
+ import java.text.SimpleDateFormat;
import java.util.Date;
import javax.annotation.Nullable;
-
-+// CraftBukkit start
-+import java.util.ArrayList;
-+import org.bukkit.craftbukkit.command.VanillaCommandWrapper;
-+import com.google.common.base.Joiner;
-+import java.util.logging.Level;
+import org.bukkit.command.CommandSender;
-+import org.bukkit.event.server.ServerCommandEvent;
-+// CraftBukkit end
-+
+
public abstract class CommandBlockListenerAbstract implements ICommandListener {
- private static final SimpleDateFormat a = new SimpleDateFormat("HH:mm:ss");
-@@ -15,6 +24,7 @@
+@@ -16,6 +17,10 @@
+ private IChatBaseComponent f;
private String g = "";
- private String h = "@";
- private final CommandObjectiveExecutor i = new CommandObjectiveExecutor();
-+ protected org.bukkit.command.CommandSender sender; // CraftBukkit - add sender
+ private IChatBaseComponent h = new ChatComponentText("@");
++ // CraftBukkit start
++ @Override
++ public abstract CommandSender getBukkitSender(CommandListenerWrapper wrapper);
++ // CraftBukkit end
public CommandBlockListenerAbstract() {}
-@@ -107,7 +117,9 @@
- if (minecraftserver != null && minecraftserver.M() && minecraftserver.getEnableCommandBlock()) {
+@@ -103,14 +108,7 @@
+ if (minecraftserver != null && minecraftserver.F() && minecraftserver.getEnableCommandBlock() && !UtilColor.b(this.g)) {
try {
this.f = null;
-- this.d = minecraftserver.getCommandHandler().a(this, this.g);
-+ // CraftBukkit start - Handle command block commands using Bukkit dispatcher
-+ this.d = executeSafely(this, sender, this.g);
-+ // CraftBukkit end
+- CommandListenerWrapper commandlistenerwrapper = this.getWrapper().a((commandcontext, flag, i) -> {
+- if (flag) {
+- ++this.d;
+- }
+-
+- });
+-
+- minecraftserver.getCommandDispatcher().a(commandlistenerwrapper, this.g);
++ this.d = minecraftserver.getCommandDispatcher().dispatchServerCommand(this.getWrapper(), this.g); // CraftBukkit
} catch (Throwable throwable) {
CrashReport crashreport = CrashReport.a(throwable, "Executing command block");
CrashReportSystemDetails crashreportsystemdetails = crashreport.a("Command to be executed");
-@@ -149,6 +161,171 @@
- }
- }
-
-+ public static int executeSafely(ICommandListener sender, org.bukkit.command.CommandSender bSender, String command) {
-+ try {
-+ return executeCommand(sender, bSender, command);
-+ } catch (CommandException commandexception) {
-+ // Taken from CommandHandler
-+ ChatMessage chatmessage = new ChatMessage(commandexception.getMessage(), commandexception.getArgs());
-+ chatmessage.getChatModifier().setColor(EnumChatFormat.RED);
-+ sender.sendMessage(chatmessage);
-+ }
-+
-+ return 0;
-+ }
-+
-+ // CraftBukkit start
-+ public static int executeCommand(ICommandListener sender, org.bukkit.command.CommandSender bSender, String command) throws CommandException {
-+ org.bukkit.command.SimpleCommandMap commandMap = sender.getWorld().getServer().getCommandMap();
-+ Joiner joiner = Joiner.on(" ");
-+ if (command.startsWith("/")) {
-+ command = command.substring(1);
-+ }
-+
-+ ServerCommandEvent event = new ServerCommandEvent(bSender, command);
-+ org.bukkit.Bukkit.getPluginManager().callEvent(event);
-+ if (event.isCancelled()) {
-+ return 0;
-+ }
-+ command = event.getCommand();
-+
-+ String[] args = command.split(" ");
-+ ArrayList<String[]> commands = new ArrayList<String[]>();
-+
-+ String cmd = args[0];
-+ if (cmd.startsWith("minecraft:")) cmd = cmd.substring("minecraft:".length());
-+ if (cmd.startsWith("bukkit:")) cmd = cmd.substring("bukkit:".length());
-+
-+ // Block disallowed commands
-+ if (cmd.equalsIgnoreCase("stop") || cmd.equalsIgnoreCase("kick") || cmd.equalsIgnoreCase("op")
-+ || cmd.equalsIgnoreCase("deop") || cmd.equalsIgnoreCase("ban") || cmd.equalsIgnoreCase("ban-ip")
-+ || cmd.equalsIgnoreCase("pardon") || cmd.equalsIgnoreCase("pardon-ip") || cmd.equalsIgnoreCase("reload")) {
-+ return 0;
-+ }
-+
-+ // Handle vanilla commands;
-+ org.bukkit.command.Command commandBlockCommand = commandMap.getCommand(args[0]);
-+ if (sender.getWorld().getServer().getCommandBlockOverride(args[0])) {
-+ commandBlockCommand = commandMap.getCommand("minecraft:" + args[0]);
-+ }
-+ if (commandBlockCommand instanceof VanillaCommandWrapper) {
-+ command = command.trim();
-+ if (command.startsWith("/")) {
-+ command = command.substring(1);
-+ }
-+ String as[] = command.split(" ");
-+ as = VanillaCommandWrapper.dropFirstArgument(as);
-+ if (!sender.getWorld().getServer().getPermissionOverride(sender) && !((VanillaCommandWrapper) commandBlockCommand).testPermission(bSender)) {
-+ return 0;
-+ }
-+ return ((VanillaCommandWrapper) commandBlockCommand).dispatchVanillaCommand(bSender, sender, as);
-+ }
-+
-+ // Make sure this is a valid command
-+ if (commandMap.getCommand(args[0]) == null) {
-+ return 0;
-+ }
-+
-+ commands.add(args);
-+
-+ // Find positions of command block syntax, if any
-+ WorldServer[] prev = MinecraftServer.getServer().worldServer;
-+ MinecraftServer server = MinecraftServer.getServer();
-+ server.worldServer = new WorldServer[server.worlds.size()];
-+ server.worldServer[0] = (WorldServer) sender.getWorld();
-+ int bpos = 0;
-+ for (int pos = 1; pos < server.worldServer.length; pos++) {
-+ WorldServer world = server.worlds.get(bpos++);
-+ if (server.worldServer[0] == world) {
-+ pos--;
-+ continue;
-+ }
-+ server.worldServer[pos] = world;
-+ }
-+ try {
-+ 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(buildCommands(sender, commands.get(j), i));
-+ }
-+ ArrayList<String[]> temp = commands;
-+ commands = newCommands;
-+ newCommands = temp;
-+ newCommands.clear();
-+ }
-+ }
-+ } finally {
-+ MinecraftServer.getServer().worldServer = prev;
-+ }
-+
-+ 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(bSender, joiner.join(java.util.Arrays.asList(commands.get(i))))) {
-+ completed++;
-+ }
-+ } catch (Throwable exception) {
-+ if (sender.f() instanceof EntityMinecartCommandBlock) {
-+ MinecraftServer.getServer().server.getLogger().log(Level.WARNING, String.format("MinecartCommandBlock at (%d,%d,%d) failed to handle command", sender.getChunkCoordinates().getX(), sender.getChunkCoordinates().getY(), sender.getChunkCoordinates().getZ()), exception);
-+ } else if (sender instanceof CommandBlockListenerAbstract) {
-+ CommandBlockListenerAbstract listener = (CommandBlockListenerAbstract) sender;
-+ MinecraftServer.getServer().server.getLogger().log(Level.WARNING, String.format("CommandBlock at (%d,%d,%d) failed to handle command", listener.getChunkCoordinates().getX(), listener.getChunkCoordinates().getY(), listener.getChunkCoordinates().getZ()), exception);
-+ } else {
-+ MinecraftServer.getServer().server.getLogger().log(Level.WARNING, String.format("Unknown CommandBlock failed to handle command"), exception);
-+ }
-+ }
-+ }
-+
-+ return completed;
-+ }
-+
-+ private static ArrayList<String[]> buildCommands(ICommandListener sender, String[] args, int pos) throws CommandException {
-+ ArrayList<String[]> commands = new ArrayList<String[]>();
-+ java.util.List<EntityPlayer> players = (java.util.List<EntityPlayer>)PlayerSelector.getPlayers(sender, args[pos], EntityPlayer.class);
-+
-+ if (players != null) {
-+ for (EntityPlayer player : players) {
-+ if (player.world != sender.getWorld()) {
-+ continue;
-+ }
-+ String[] command = args.clone();
-+ command[pos] = player.getName();
-+ commands.add(command);
-+ }
-+ }
-+
-+ return commands;
-+ }
-+
-+ public static CommandSender unwrapSender(ICommandListener listener) {
-+ org.bukkit.command.CommandSender sender = null;
-+ while (sender == null) {
-+ if (listener instanceof DedicatedServer) {
-+ sender = ((DedicatedServer) listener).console;
-+ } else if (listener instanceof RemoteControlCommandListener) {
-+ sender = ((RemoteControlCommandListener) listener).C_().remoteConsole;
-+ } else if (listener instanceof CommandBlockListenerAbstract) {
-+ sender = ((CommandBlockListenerAbstract) listener).sender;
-+ } else if (listener instanceof CustomFunctionData.CustomFunctionListener) {
-+ sender = ((CustomFunctionData.CustomFunctionListener) listener).sender;
-+ } else if (listener instanceof CommandListenerWrapper) {
-+ listener = ((CommandListenerWrapper) listener).base; // Search deeper
-+ } else if (VanillaCommandWrapper.lastSender != null) {
-+ sender = VanillaCommandWrapper.lastSender;
-+ } else if (listener.f() != null) {
-+ sender = listener.f().getBukkitEntity();
-+ } else {
-+ throw new RuntimeException("Unhandled executor " + listener.getClass().getSimpleName());
-+ }
-+ }
-+
-+ return sender;
-+ }
-+ // CraftBukkit end
-+
- public String getName() {
- return this.h;
- }
diff --git a/nms-patches/CommandDebug.patch b/nms-patches/CommandDebug.patch
index 68da6b1f..d982a483 100644
--- a/nms-patches/CommandDebug.patch
+++ b/nms-patches/CommandDebug.patch
@@ -1,32 +1,32 @@
--- a/net/minecraft/server/CommandDebug.java
+++ b/net/minecraft/server/CommandDebug.java
-@@ -34,6 +34,14 @@
+@@ -35,6 +35,14 @@
}
- public void execute(MinecraftServer minecraftserver, ICommandListener icommandlistener, String[] astring) throws CommandException {
+ private static int a(CommandListenerWrapper commandlistenerwrapper) throws CommandSyntaxException {
+ // CraftBukkit start - only allow use when enabled (so that no blank profile results occur)
-+ if (!minecraftserver.methodProfiler.ENABLED) {
-+ icommandlistener.sendMessage(new ChatComponentText("Vanilla debug profiling is disabled."));
-+ icommandlistener.sendMessage(new ChatComponentText("To enable, restart the server with `-DenableDebugMethodProfiler=true' before `-jar'."));
-+ icommandlistener.sendMessage(new ChatComponentText("Use `/timings' for plugin timings."));
-+ return;
++ if (!commandlistenerwrapper.getServer().methodProfiler.ENABLED) {
++ commandlistenerwrapper.sendFailureMessage(new ChatComponentText("Vanilla debug profiling is disabled."));
++ commandlistenerwrapper.sendFailureMessage(new ChatComponentText("To enable, restart the server with `-DenableDebugMethodProfiler=true' before `-jar'."));
++ commandlistenerwrapper.sendFailureMessage(new ChatComponentText("Use `/timings' for plugin timings."));
++ return 0;
+ }
+ // CraftBukkit end
- if (astring.length < 1) {
- throw new ExceptionUsage("commands.debug.usage", new Object[0]);
- } else {
-@@ -142,6 +150,13 @@
- }
+ MinecraftServer minecraftserver = commandlistenerwrapper.getServer();
+ MethodProfiler methodprofiler = minecraftserver.methodProfiler;
- public List<String> tabComplete(MinecraftServer minecraftserver, ICommandListener icommandlistener, String[] astring, @Nullable BlockPosition blockposition) {
-- return astring.length == 1 ? a(astring, new String[] { "start", "stop"}) : Collections.emptyList();
-+ return astring.length == 1 ? a(astring, new String[] { "start", "stop"}) : Collections.<String>emptyList(); // CraftBukkit - decompile error
-+ }
-+
-+ // CraftBukkit start - fix decompile error
-+ @Override
-+ public int compareTo(ICommand o) {
-+ return a((ICommand) o);
+@@ -48,6 +56,14 @@
}
-+ // CraftBukkit end
- }
+
+ private static int b(CommandListenerWrapper commandlistenerwrapper) throws CommandSyntaxException {
++ // CraftBukkit start - only allow use when enabled (so that no blank profile results occur)
++ if (!commandlistenerwrapper.getServer().methodProfiler.ENABLED) {
++ commandlistenerwrapper.sendFailureMessage(new ChatComponentText("Vanilla debug profiling is disabled."));
++ commandlistenerwrapper.sendFailureMessage(new ChatComponentText("To enable, restart the server with `-DenableDebugMethodProfiler=true' before `-jar'."));
++ commandlistenerwrapper.sendFailureMessage(new ChatComponentText("Use `/timings' for plugin timings."));
++ return 0;
++ }
++ // CraftBukkit end
+ MinecraftServer minecraftserver = commandlistenerwrapper.getServer();
+ MethodProfiler methodprofiler = minecraftserver.methodProfiler;
+
diff --git a/nms-patches/CommandDispatcher.patch b/nms-patches/CommandDispatcher.patch
new file mode 100644
index 00000000..f9842a44
--- /dev/null
+++ b/nms-patches/CommandDispatcher.patch
@@ -0,0 +1,189 @@
+--- a/net/minecraft/server/CommandDispatcher.java
++++ b/net/minecraft/server/CommandDispatcher.java
+@@ -26,12 +26,19 @@
+ import org.apache.logging.log4j.LogManager;
+ import org.apache.logging.log4j.Logger;
+
++// CraftBukkit start
++import com.google.common.base.Joiner;
++import org.apache.logging.log4j.Level;
++import org.bukkit.event.server.ServerCommandEvent;
++// CraftBukkit end
++
+ public class CommandDispatcher {
+
+ private static final Logger a = LogManager.getLogger();
+ private final com.mojang.brigadier.CommandDispatcher<CommandListenerWrapper> b = new com.mojang.brigadier.CommandDispatcher();
+
+- public CommandDispatcher(boolean flag) {
++ // CraftBukkit start
++ public final CommandDispatcher init(boolean flag) {
+ CommandAdvancement.a(this.b);
+ CommandExecute.a(this.b);
+ CommmandBossBar.a(this.b);
+@@ -100,6 +107,11 @@
+ this.b.findAmbiguities((commandnode, commandnode1, commandnode2, collection) -> {
+ CommandDispatcher.a.warn("Ambiguity between arguments {} and {} with inputs: {}", this.b.getPath(commandnode1), this.b.getPath(commandnode2), collection);
+ });
++ return this;
++ }
++
++ public CommandDispatcher() {
++ // CraftBukkit end
+ this.b.setConsumer((commandcontext, flag, i) -> {
+ ((CommandListenerWrapper) commandcontext.getSource()).a(commandcontext, flag, i);
+ });
+@@ -114,7 +126,58 @@
+
+ }
+
++ // CraftBukkit start
++ public int dispatchServerCommand(CommandListenerWrapper sender, String command) {
++ Joiner joiner = Joiner.on(" ");
++ if (command.startsWith("/")) {
++ command = command.substring(1);
++ }
++
++ ServerCommandEvent event = new ServerCommandEvent(sender.getBukkitSender(), command);
++ org.bukkit.Bukkit.getPluginManager().callEvent(event);
++ if (event.isCancelled()) {
++ return 0;
++ }
++ command = event.getCommand();
++
++ String[] args = command.split(" ");
++
++ String cmd = args[0];
++ if (cmd.startsWith("minecraft:")) cmd = cmd.substring("minecraft:".length());
++ if (cmd.startsWith("bukkit:")) cmd = cmd.substring("bukkit:".length());
++
++ // Block disallowed commands
++ if (cmd.equalsIgnoreCase("stop") || cmd.equalsIgnoreCase("kick") || cmd.equalsIgnoreCase("op")
++ || cmd.equalsIgnoreCase("deop") || cmd.equalsIgnoreCase("ban") || cmd.equalsIgnoreCase("ban-ip")
++ || cmd.equalsIgnoreCase("pardon") || cmd.equalsIgnoreCase("pardon-ip") || cmd.equalsIgnoreCase("reload")) {
++ return 0;
++ }
++
++ // Handle vanilla commands;
++ if (sender.getWorld().getServer().getCommandBlockOverride(args[0])) {
++ args[0] = "minecraft:" + args[0];
++ }
++
++ return this.a(sender, joiner.join(args));
++ }
++
+ public int a(CommandListenerWrapper commandlistenerwrapper, String s) {
++ // Some commands use the worldserver variable but we leave it full of null values,
++ // so we must temporarily populate it with the world of the commandsender
++ WorldServer[] prev = MinecraftServer.getServer().worldServer;
++ MinecraftServer server = MinecraftServer.getServer();
++ server.worldServer = new WorldServer[server.worlds.size()];
++ server.worldServer[0] = (WorldServer) commandlistenerwrapper.getWorld();
++ int bpos = 0;
++ for (int pos = 1; pos < server.worldServer.length; pos++) {
++ WorldServer world = server.worlds.get(bpos++);
++ if (server.worldServer[0] == world) {
++ pos--;
++ continue;
++ }
++ server.worldServer[pos] = world;
++ }
++ // CraftBukkit end
+ String s1 = s;
+
+ if (s.startsWith("/")) {
+@@ -126,7 +189,6 @@
+ byte b0;
+
+ try {
+- byte b1;
+ ChatComponentText chatcomponenttext;
+
+ try {
+@@ -135,54 +197,59 @@
+ return i;
+ } catch (CommandException commandexception) {
+ commandlistenerwrapper.sendFailureMessage(commandexception.a());
+- b1 = 0;
+- return b1;
++ b0 = 0;
++ return b0;
+ } catch (CommandSyntaxException commandsyntaxexception) {
+ commandlistenerwrapper.sendFailureMessage(ChatComponentUtils.a(commandsyntaxexception.getRawMessage()));
+ if (commandsyntaxexception.getInput() != null && commandsyntaxexception.getCursor() >= 0) {
+ int j = Math.min(commandsyntaxexception.getInput().length(), commandsyntaxexception.getCursor());
+- IChatBaseComponent ichatbasecomponent = (new ChatComponentText("")).a(EnumChatFormat.GRAY).a((chatmodifier) -> {
+- chatmodifier.setChatClickable(new ChatClickable(ChatClickable.EnumClickAction.SUGGEST_COMMAND, s));
+- });
+
++ chatcomponenttext = new ChatComponentText("");
+ if (j > 10) {
+- ichatbasecomponent.a("...");
++ chatcomponenttext.a("...");
+ }
+
+- ichatbasecomponent.a(commandsyntaxexception.getInput().substring(Math.max(0, j - 10), j));
++ chatcomponenttext.a(commandsyntaxexception.getInput().substring(Math.max(0, j - 10), j));
+ if (j < commandsyntaxexception.getInput().length()) {
+- IChatBaseComponent ichatbasecomponent1 = (new ChatComponentText(commandsyntaxexception.getInput().substring(j))).a(new EnumChatFormat[] { EnumChatFormat.RED, EnumChatFormat.UNDERLINE});
++ ChatComponentText chatcomponenttext1 = new ChatComponentText(commandsyntaxexception.getInput().substring(j));
+
+- ichatbasecomponent.addSibling(ichatbasecomponent1);
++ chatcomponenttext1.getChatModifier().setColor(EnumChatFormat.RED);
++ chatcomponenttext1.getChatModifier().setUnderline(Boolean.valueOf(true));
++ chatcomponenttext.addSibling(chatcomponenttext1);
+ }
+
+- ichatbasecomponent.addSibling((new ChatMessage("command.context.here", new Object[0])).a(new EnumChatFormat[] { EnumChatFormat.RED, EnumChatFormat.ITALIC}));
+- commandlistenerwrapper.sendFailureMessage(ichatbasecomponent);
++ ChatMessage chatmessage = new ChatMessage("command.context.here", new Object[0]);
++
++ chatmessage.getChatModifier().setItalic(Boolean.valueOf(true));
++ chatmessage.getChatModifier().setColor(EnumChatFormat.RED);
++ chatcomponenttext.addSibling(chatmessage);
++ chatcomponenttext.getChatModifier().setColor(EnumChatFormat.GRAY);
++ chatcomponenttext.getChatModifier().setChatClickable(new ChatClickable(ChatClickable.EnumClickAction.SUGGEST_COMMAND, s1));
++ commandlistenerwrapper.sendFailureMessage(chatcomponenttext);
+ }
+
+- b1 = 0;
+- return b1;
++ b0 = 0;
+ } catch (Exception exception) {
+- chatcomponenttext = new ChatComponentText;
+- }
++ ChatMessage chatmessage1 = new ChatMessage("command.failed", new Object[0]);
+
+- chatcomponenttext.<init>(exception.getMessage() == null ? exception.getClass().getName() : exception.getMessage());
+- ChatComponentText chatcomponenttext1 = chatcomponenttext;
++ chatcomponenttext = new ChatComponentText(exception.getMessage() == null ? exception.getClass().getName() : exception.getMessage());
++ if (CommandDispatcher.a.isDebugEnabled()) {
++ StackTraceElement[] astacktraceelement = exception.getStackTrace();
+
+- if (CommandDispatcher.a.isDebugEnabled()) {
+- StackTraceElement[] astacktraceelement = exception.getStackTrace();
+-
+- for (int k = 0; k < Math.min(astacktraceelement.length, 3); ++k) {
+- chatcomponenttext1.a("\n\n").a(astacktraceelement[k].getMethodName()).a("\n ").a(astacktraceelement[k].getFileName()).a(":").a(String.valueOf(astacktraceelement[k].getLineNumber()));
++ for (int k = 0; k < Math.min(astacktraceelement.length, 3); ++k) {
++ chatcomponenttext.a("\n\n" + astacktraceelement[k].getMethodName() + "\n " + astacktraceelement[k].getFileName() + ":" + astacktraceelement[k].getLineNumber());
++ }
+ }
+- }
+
+- commandlistenerwrapper.sendFailureMessage((new ChatMessage("command.failed", new Object[0])).a((chatmodifier) -> {
+- chatmodifier.setChatHoverable(new ChatHoverable(ChatHoverable.EnumHoverAction.SHOW_TEXT, ichatbasecomponent));
+- }));
+- b0 = 0;
++ chatmessage1.getChatModifier().setChatHoverable(new ChatHoverable(ChatHoverable.EnumHoverAction.SHOW_TEXT, chatcomponenttext));
++ commandlistenerwrapper.sendFailureMessage(chatmessage1);
++ byte b1 = 0;
++
++ return b1;
++ }
+ } finally {
+ commandlistenerwrapper.getServer().methodProfiler.e();
++ MinecraftServer.getServer().worldServer = prev; // CraftBukkit
+ }
+
+ return b0;
diff --git a/nms-patches/CommandExecute.patch b/nms-patches/CommandExecute.patch
deleted file mode 100644
index eef65e5b..00000000
--- a/nms-patches/CommandExecute.patch
+++ /dev/null
@@ -1,58 +0,0 @@
---- a/net/minecraft/server/CommandExecute.java
-+++ b/net/minecraft/server/CommandExecute.java
-@@ -4,6 +4,10 @@
- import java.util.Collections;
- import java.util.List;
- import javax.annotation.Nullable;
-+// CraftBukkit start
-+import org.bukkit.craftbukkit.command.ProxiedNativeCommandSender;
-+import org.bukkit.craftbukkit.command.VanillaCommandWrapper;
-+// CraftBukkit end
-
- public class CommandExecute extends CommandAbstract {
-
-@@ -59,26 +63,41 @@
- }
-
- String s = a(astring, b0);
-- CommandListenerWrapper commandlistenerwrapper = CommandListenerWrapper.a(icommandlistener).a(entity, new Vec3D(d0, d1, d2)).a(minecraftserver.worldServer[0].getGameRules().getBoolean("commandBlockOutput"));
-+ CommandListenerWrapper commandlistenerwrapper = CommandListenerWrapper.a(icommandlistener).a(entity, new Vec3D(d0, d1, d2)).a(minecraftserver.worlds.get(0).getGameRules().getBoolean("commandBlockOutput")); // CraftBukkit
- ICommandHandler icommandhandler = minecraftserver.getCommandHandler();
-
- try {
-- int i = icommandhandler.a(commandlistenerwrapper, s);
-+ // CraftBukkit start
-+ org.bukkit.command.CommandSender sender = CommandBlockListenerAbstract.unwrapSender(icommandlistener);
-+ int i = CommandBlockListenerAbstract.executeCommand(commandlistenerwrapper, new ProxiedNativeCommandSender(commandlistenerwrapper, sender, entity.getBukkitEntity()), s);
-+ // CraftBukkit end
-
- if (i < 1) {
- throw new CommandException("commands.execute.allInvocationsFailed", new Object[] { s});
- }
- } catch (Throwable throwable) {
-+ // CraftBukkit start
-+ if (throwable instanceof CommandException) {
-+ throw (CommandException) throwable;
-+ }
-+ // CraftBukkit end
- throw new CommandException("commands.execute.failed", new Object[] { s, entity.getName()});
- }
- }
- }
-
- public List<String> tabComplete(MinecraftServer minecraftserver, ICommandListener icommandlistener, String[] astring, @Nullable BlockPosition blockposition) {
-- return astring.length == 1 ? a(astring, minecraftserver.getPlayers()) : (astring.length > 1 && astring.length <= 4 ? a(astring, 1, blockposition) : (astring.length > 5 && astring.length <= 8 && "detect".equals(astring[4]) ? a(astring, 5, blockposition) : (astring.length == 9 && "detect".equals(astring[4]) ? a(astring, (Collection) Block.REGISTRY.keySet()) : Collections.emptyList())));
-+ return astring.length == 1 ? a(astring, minecraftserver.getPlayers()) : (astring.length > 1 && astring.length <= 4 ? a(astring, 1, blockposition) : (astring.length > 5 && astring.length <= 8 && "detect".equals(astring[4]) ? a(astring, 5, blockposition) : (astring.length == 9 && "detect".equals(astring[4]) ? a(astring, (Collection) Block.REGISTRY.keySet()) : Collections.<String>emptyList()))); // CraftBukkit - decompile error
- }
-
- public boolean isListStart(String[] astring, int i) {
- return i == 0;
- }
-+
-+ // CraftBukkit start - fix decompiler error
-+ @Override
-+ public int compareTo(ICommand o) {
-+ return a((ICommand) o);
-+ }
-+ // CraftBukkit end
- }
diff --git a/nms-patches/CommandGamemode.patch b/nms-patches/CommandGamemode.patch
index 1c227638..939a80d3 100644
--- a/nms-patches/CommandGamemode.patch
+++ b/nms-patches/CommandGamemode.patch
@@ -1,34 +1,15 @@
--- a/net/minecraft/server/CommandGamemode.java
+++ b/net/minecraft/server/CommandGamemode.java
-@@ -28,6 +28,12 @@
- EntityPlayer entityplayer = astring.length >= 2 ? b(minecraftserver, icommandlistener, astring[1]) : a(icommandlistener);
-
- entityplayer.a(enumgamemode);
-+ // CraftBukkit start - handle event cancelling the change
-+ if (entityplayer.playerInteractManager.getGameMode() != enumgamemode) {
-+ icommandlistener.sendMessage(new ChatComponentText("Failed to set the gamemode of '" + entityplayer.getName() + "'"));
-+ return;
-+ }
-+ // CraftBukkit end
- ChatMessage chatmessage = new ChatMessage("gameMode." + enumgamemode.b(), new Object[0]);
-
- if (icommandlistener.getWorld().getGameRules().getBoolean("sendCommandFeedback")) {
-@@ -50,10 +56,17 @@
- }
-
- public List<String> tabComplete(MinecraftServer minecraftserver, ICommandListener icommandlistener, String[] astring, @Nullable BlockPosition blockposition) {
-- return astring.length == 1 ? a(astring, new String[] { "survival", "creative", "adventure", "spectator"}) : (astring.length == 2 ? a(astring, minecraftserver.getPlayers()) : Collections.emptyList());
-+ return astring.length == 1 ? a(astring, new String[] { "survival", "creative", "adventure", "spectator"}) : (astring.length == 2 ? a(astring, minecraftserver.getPlayers()) : Collections.<String>emptyList()); // CraftBukkit - decompile error
- }
-
- public boolean isListStart(String[] astring, int i) {
- return i == 1;
- }
-+
-+ // CraftBukkit start - fix decompiler error
-+ @Override
-+ public int compareTo(ICommand o) {
-+ return a((ICommand) o);
-+ }
-+ // CraftBukkit end
- }
+@@ -57,6 +57,12 @@
+
+ if (entityplayer.playerInteractManager.getGameMode() != enumgamemode) {
+ entityplayer.a(enumgamemode);
++ // CraftBukkit start - handle event cancelling the change
++ if (entityplayer.playerInteractManager.getGameMode() != enumgamemode) {
++ commandcontext.getSource().sendFailureMessage(new ChatComponentText("Failed to set the gamemode of '" + entityplayer.getName() + "'"));
++ continue;
++ }
++ // CraftBukkit end
+ a((CommandListenerWrapper) commandcontext.getSource(), entityplayer, enumgamemode);
+ ++i;
+ }
diff --git a/nms-patches/CommandGamerule.patch b/nms-patches/CommandGamerule.patch
deleted file mode 100644
index 6de41819..00000000
--- a/nms-patches/CommandGamerule.patch
+++ /dev/null
@@ -1,23 +0,0 @@
---- a/net/minecraft/server/CommandGamerule.java
-+++ b/net/minecraft/server/CommandGamerule.java
-@@ -23,7 +23,7 @@
- }
-
- public void execute(MinecraftServer minecraftserver, ICommandListener icommandlistener, String[] astring) throws CommandException {
-- GameRules gamerules = this.a(minecraftserver);
-+ GameRules gamerules = icommandlistener.getWorld().getGameRules(); // CraftBukkit - Use current world
- String s = astring.length > 0 ? astring[0] : "";
- String s1 = astring.length > 1 ? a(astring, 1) : "";
-
-@@ -92,4 +92,11 @@
- private GameRules a(MinecraftServer minecraftserver) {
- return minecraftserver.getWorldServer(0).getGameRules();
- }
-+
-+ // CraftBukkit start - fix decompile error
-+ @Override
-+ public int compareTo(ICommand o) {
-+ return a((ICommand) o);
-+ }
-+ // CraftBukkit end
- }
diff --git a/nms-patches/CommandListenerWrapper.patch b/nms-patches/CommandListenerWrapper.patch
new file mode 100644
index 00000000..0f8d1c9d
--- /dev/null
+++ b/nms-patches/CommandListenerWrapper.patch
@@ -0,0 +1,46 @@
+--- a/net/minecraft/server/CommandListenerWrapper.java
++++ b/net/minecraft/server/CommandListenerWrapper.java
+@@ -7,6 +7,7 @@
+ import com.mojang.brigadier.exceptions.SimpleCommandExceptionType;
+ import com.mojang.brigadier.suggestion.Suggestions;
+ import com.mojang.brigadier.suggestion.SuggestionsBuilder;
++import com.mojang.brigadier.tree.CommandNode;
+ import java.util.Collection;
+ import java.util.Collections;
+ import java.util.Iterator;
+@@ -31,9 +32,10 @@
+ private final ResultConsumer<CommandListenerWrapper> l;
+ private final ArgumentAnchor.Anchor m;
+ private final Vec2F n;
++ public CommandNode currentCommand; // CraftBukkit
+
+ public CommandListenerWrapper(ICommandListener icommandlistener, Vec3D vec3d, Vec2F vec2f, WorldServer worldserver, int i, String s, IChatBaseComponent ichatbasecomponent, MinecraftServer minecraftserver, @Nullable Entity entity) {
+- this(icommandlistener, vec3d, vec2f, worldserver, i, s, ichatbasecomponent, minecraftserver, entity, false, (commandcontext, flag, i) -> {
++ this(icommandlistener, vec3d, vec2f, worldserver, i, s, ichatbasecomponent, minecraftserver, entity, false, (commandcontext, flag, ix) -> { // CraftBukkit - decompile error
+ }, ArgumentAnchor.Anchor.FEET);
+ }
+
+@@ -119,6 +121,12 @@
+ }
+
+ public boolean hasPermission(int i) {
++ // CraftBukkit start
++ if (currentCommand != null) {
++ return this.f >= i || getBukkitSender().hasPermission(org.bukkit.craftbukkit.command.VanillaCommandWrapper.getPermission(currentCommand));
++ }
++ // CraftBukkit end
++
+ return this.f >= i;
+ }
+
+@@ -232,4 +240,10 @@
+ public Collection<ICompletionProvider.a> a(boolean flag) {
+ return Collections.singleton(ICompletionProvider.a.b);
+ }
++
++ // CraftBukkit start
++ public org.bukkit.command.CommandSender getBukkitSender() {
++ return base.getBukkitSender(this);
++ }
++ // CraftBukkit end
+ }
diff --git a/nms-patches/CommandSpreadPlayers.patch b/nms-patches/CommandSpreadPlayers.patch
index 33279985..652eaa86 100644
--- a/nms-patches/CommandSpreadPlayers.patch
+++ b/nms-patches/CommandSpreadPlayers.patch
@@ -1,50 +1,32 @@
--- a/net/minecraft/server/CommandSpreadPlayers.java
+++ b/net/minecraft/server/CommandSpreadPlayers.java
-@@ -240,9 +240,16 @@
- }
-
- public List<String> tabComplete(MinecraftServer minecraftserver, ICommandListener icommandlistener, String[] astring, @Nullable BlockPosition blockposition) {
-- return astring.length >= 1 && astring.length <= 2 ? b(astring, 0, blockposition) : Collections.emptyList();
-+ return astring.length >= 1 && astring.length <= 2 ? b(astring, 0, blockposition) : Collections.<String>emptyList(); // CraftBukkit - decompile error
- }
-
-+ // CraftBukkit start - fix decompile error
-+ @Override
-+ public int compareTo(ICommand o) {
-+ return a(o);
-+ }
-+ // CraftBukkit end
-+
- static class Location2D {
-
- double a;
-@@ -309,7 +316,7 @@
+@@ -269,7 +269,7 @@
}
blockposition = blockposition.down();
-- } while (world.getType(blockposition).getMaterial() == Material.AIR);
-+ } while (getType(world, blockposition).getMaterial() == Material.AIR); // CraftBukkit
+- } while (iblockaccess.getType(blockposition).isAir());
++ } while (getType(iblockaccess, blockposition).isAir()); // CraftBukkit
return blockposition.getY() + 1;
}
-@@ -325,7 +332,7 @@
+@@ -285,7 +285,7 @@
}
blockposition = blockposition.down();
-- material = world.getType(blockposition).getMaterial();
-+ material = getType(world, blockposition).getMaterial(); // CraftBukkit
- } while (material == Material.AIR);
+- iblockdata = iblockaccess.getType(blockposition);
++ iblockdata = getType(iblockaccess, blockposition); // CraftBukkit
+ } while (iblockdata.isAir());
- return !material.isLiquid() && material != Material.FIRE;
-@@ -335,5 +342,12 @@
+ Material material = iblockdata.getMaterial();
+@@ -297,5 +297,12 @@
this.a = MathHelper.a(random, d0, d2);
this.b = MathHelper.a(random, d1, d3);
}
+
+ // CraftBukkit start - add a version of getType which force loads chunks
-+ private static IBlockData getType(World world, BlockPosition position) {
-+ ((ChunkProviderServer) world.chunkProvider).getChunkAt(position.getX() >> 4, position.getZ() >> 4);
-+ return world.getType(position);
++ private static IBlockData getType(IBlockAccess iblockaccess, BlockPosition position) {
++ ((ChunkProviderServer) ((World) iblockaccess).chunkProvider).getChunkAt(position.getX() >> 4, position.getZ() >> 4);
++ return iblockaccess.getType(position);
+ }
+ // CraftBukkit end
}
diff --git a/nms-patches/CommandTeleport.patch b/nms-patches/CommandTeleport.patch
index 003cc6c1..3b5763e9 100644
--- a/nms-patches/CommandTeleport.patch
+++ b/nms-patches/CommandTeleport.patch
@@ -1,23 +1,14 @@
--- a/net/minecraft/server/CommandTeleport.java
+++ b/net/minecraft/server/CommandTeleport.java
-@@ -69,7 +69,7 @@
+@@ -116,9 +116,9 @@
+ if (entity instanceof EntityPlayer) {
+ entity.stopRiding();
+ if (worldserver == entity.world) {
+- ((EntityPlayer) entity).playerConnection.a(d0, d1, d2, f, f1, set);
++ ((EntityPlayer) entity).playerConnection.a(d0, d1, d2, f, f1, set, org.bukkit.event.player.PlayerTeleportEvent.TeleportCause.COMMAND); // CraftBukkit
+ } else {
+- ((EntityPlayer) entity).a(worldserver, d0, d1, d2, f, f1);
++ ((EntityPlayer) entity).a(worldserver, d0, d1, d2, f, f1, org.bukkit.event.player.PlayerTeleportEvent.TeleportCause.COMMAND); // CraftBukkit
}
- entity.stopRiding();
-- ((EntityPlayer) entity).playerConnection.a(commandabstract_commandnumber.a(), commandabstract_commandnumber1.a(), commandabstract_commandnumber2.a(), f, f1, enumset);
-+ ((EntityPlayer) entity).playerConnection.a(commandabstract_commandnumber.a(), commandabstract_commandnumber1.a(), commandabstract_commandnumber2.a(), f, f1, enumset, org.bukkit.event.player.PlayerTeleportEvent.TeleportCause.COMMAND); // CraftBukkit
entity.setHeadRotation(f);
- } else {
- float f2 = (float) MathHelper.g(commandabstract_commandnumber3.a());
-@@ -94,4 +94,11 @@
- public boolean isListStart(String[] astring, int i) {
- return i == 0;
- }
-+
-+ // CraftBukkit start - fix decompile error
-+ @Override
-+ public int compareTo(ICommand o) {
-+ return a((ICommand) o);
-+ }
-+ // CraftBukkit end
- }
diff --git a/nms-patches/CommandTp.patch b/nms-patches/CommandTp.patch
deleted file mode 100644
index 603af708..00000000
--- a/nms-patches/CommandTp.patch
+++ /dev/null
@@ -1,45 +0,0 @@
---- a/net/minecraft/server/CommandTp.java
-+++ b/net/minecraft/server/CommandTp.java
-@@ -53,17 +53,11 @@
- } else {
- Entity entity = c(minecraftserver, icommandlistener, astring[astring.length - 1]);
-
-- if (entity.world != ((Entity) object).world) {
-- throw new CommandException("commands.tp.notSameDimension", new Object[0]);
-- } else {
-- ((Entity) object).stopRiding();
-- if (object instanceof EntityPlayer) {
-- ((EntityPlayer) object).playerConnection.a(entity.locX, entity.locY, entity.locZ, entity.yaw, entity.pitch);
-- } else {
-- ((Entity) object).setPositionRotation(entity.locX, entity.locY, entity.locZ, entity.yaw, entity.pitch);
-- }
--
-+ // CraftBukkit Start
-+ // Use Bukkit teleport method in all cases. It has cross dimensional handling, events
-+ if (((Entity) object).getBukkitEntity().teleport(entity.getBukkitEntity(), org.bukkit.event.player.PlayerTeleportEvent.TeleportCause.COMMAND)) {
- a(icommandlistener, (ICommand) this, "commands.tp.success", new Object[] { ((Entity) object).getName(), entity.getName()});
-+ // CraftBukkit End
- }
- }
- }
-@@ -107,7 +101,7 @@
- }
-
- entity.stopRiding();
-- ((EntityPlayer) entity).playerConnection.a(commandabstract_commandnumber.b(), commandabstract_commandnumber1.b(), commandabstract_commandnumber2.b(), f, f1, enumset);
-+ ((EntityPlayer) entity).playerConnection.a(commandabstract_commandnumber.b(), commandabstract_commandnumber1.b(), commandabstract_commandnumber2.b(), f, f1, enumset, org.bukkit.event.player.PlayerTeleportEvent.TeleportCause.COMMAND); // CraftBukkit
- entity.setHeadRotation(f);
- } else {
- float f2 = (float) MathHelper.g(commandabstract_commandnumber3.a());
-@@ -132,4 +126,11 @@
- public boolean isListStart(String[] astring, int i) {
- return i == 0;
- }
-+
-+ // CraftBukkit start - fix decompile error
-+ @Override
-+ public int compareTo(ICommand o) {
-+ return a((ICommand) o);
-+ }
-+ // CraftBukkit end
- }
diff --git a/nms-patches/Container.patch b/nms-patches/Container.patch
index 26daef63..ef86d902 100644
--- a/nms-patches/Container.patch
+++ b/nms-patches/Container.patch
@@ -96,7 +96,7 @@
+ // CraftBukkit end
}
- this.d();
+ this.c();
@@ -165,8 +225,11 @@
if (i == -999) {
if (!playerinventory.getCarried().isEmpty()) {
@@ -126,11 +126,11 @@
}
}
} else if (inventoryclicktype == InventoryClickType.SWAP && j >= 0 && j < 9) {
-@@ -564,6 +636,7 @@
- inventorycraftresult.a(irecipe);
- itemstack = irecipe.craftItem(inventorycrafting);
+@@ -567,6 +639,7 @@
+ if (inventorycraftresult.a(world, entityplayer, irecipe) && irecipe != null) {
+ itemstack = irecipe.craftItem(iinventory);
}
-+ itemstack = org.bukkit.craftbukkit.event.CraftEventFactory.callPreCraftEvent(inventorycrafting, itemstack, getBukkitView(), false); // CraftBukkit
++ itemstack = org.bukkit.craftbukkit.event.CraftEventFactory.callPreCraftEvent(iinventory, inventorycraftresult, itemstack, getBukkitView(), false); // CraftBukkit
inventorycraftresult.setItem(0, itemstack);
entityplayer.playerConnection.sendPacket(new PacketPlayOutSetSlot(this.windowId, 0, itemstack));
diff --git a/nms-patches/ContainerAnvil.patch b/nms-patches/ContainerAnvil.patch
index e32f857e..0f9f7d3a 100644
--- a/nms-patches/ContainerAnvil.patch
+++ b/nms-patches/ContainerAnvil.patch
@@ -26,7 +26,7 @@
this.j = blockposition;
this.i = world;
this.m = entityhuman;
-@@ -110,7 +120,7 @@
+@@ -111,7 +121,7 @@
byte b1 = 0;
if (itemstack.isEmpty()) {
@@ -35,25 +35,25 @@
this.levelCost = 0;
} else {
ItemStack itemstack1 = itemstack.cloneItemStack();
-@@ -128,7 +138,7 @@
- if (itemstack1.f() && itemstack1.getItem().a(itemstack, itemstack2)) {
- k = Math.min(itemstack1.i(), itemstack1.k() / 4);
+@@ -129,7 +139,7 @@
+ if (itemstack1.e() && itemstack1.getItem().a(itemstack, itemstack2)) {
+ k = Math.min(itemstack1.getDamage(), itemstack1.h() / 4);
if (k <= 0) {
- this.g.setItem(0, ItemStack.a);
+ org.bukkit.craftbukkit.event.CraftEventFactory.callPrepareAnvilEvent(getBukkitView(), ItemStack.a); // CraftBukkit
this.levelCost = 0;
return;
}
-@@ -143,7 +153,7 @@
+@@ -144,7 +154,7 @@
this.k = l;
} else {
- if (!flag && (itemstack1.getItem() != itemstack2.getItem() || !itemstack1.f())) {
+ if (!flag && (itemstack1.getItem() != itemstack2.getItem() || !itemstack1.e())) {
- this.g.setItem(0, ItemStack.a);
+ org.bukkit.craftbukkit.event.CraftEventFactory.callPrepareAnvilEvent(getBukkitView(), ItemStack.a); // CraftBukkit
this.levelCost = 0;
return;
}
-@@ -236,7 +246,7 @@
+@@ -237,7 +247,7 @@
}
if (flag2 && !flag1) {
@@ -62,7 +62,7 @@
this.levelCost = 0;
return;
}
-@@ -283,7 +293,7 @@
+@@ -284,7 +294,7 @@
EnchantmentManager.a(map, itemstack1);
}
@@ -71,17 +71,17 @@
this.b();
}
}
-@@ -301,6 +311,7 @@
+@@ -302,6 +312,7 @@
}
public boolean canUse(EntityHuman entityhuman) {
+ if (!this.checkReachable) return true; // CraftBukkit
- return this.i.getType(this.j).getBlock() != Blocks.ANVIL ? false : entityhuman.d((double) this.j.getX() + 0.5D, (double) this.j.getY() + 0.5D, (double) this.j.getZ() + 0.5D) <= 64.0D;
+ return !this.i.getType(this.j).a(TagsBlock.x) ? false : entityhuman.d((double) this.j.getX() + 0.5D, (double) this.j.getY() + 0.5D, (double) this.j.getZ() + 0.5D) <= 64.0D;
}
-@@ -356,4 +367,33 @@
+@@ -357,4 +368,33 @@
- this.e();
+ this.d();
}
+
+ // CraftBukkit start
diff --git a/nms-patches/ContainerEnchantTable.patch b/nms-patches/ContainerEnchantTable.patch
index 6b4c4a70..a6d9ffd1 100644
--- a/nms-patches/ContainerEnchantTable.patch
+++ b/nms-patches/ContainerEnchantTable.patch
@@ -1,6 +1,6 @@
--- a/net/minecraft/server/ContainerEnchantTable.java
+++ b/net/minecraft/server/ContainerEnchantTable.java
-@@ -3,6 +3,19 @@
+@@ -3,6 +3,21 @@
import java.util.List;
import java.util.Random;
@@ -8,9 +8,11 @@
+import java.util.Collections;
+import java.util.Map;
+import org.bukkit.Location;
++import org.bukkit.NamespacedKey;
+import org.bukkit.craftbukkit.inventory.CraftInventoryEnchanting;
+import org.bukkit.craftbukkit.inventory.CraftInventoryView;
+import org.bukkit.craftbukkit.inventory.CraftItemStack;
++import org.bukkit.craftbukkit.util.CraftNamespacedKey;
+import org.bukkit.enchantments.EnchantmentOffer;
+import org.bukkit.event.enchantment.EnchantItemEvent;
+import org.bukkit.event.enchantment.PrepareItemEnchantEvent;
@@ -19,8 +21,8 @@
+
public class ContainerEnchantTable extends Container {
- public IInventory enchantSlots = new InventorySubcontainer("Enchant", true, 2) {
-@@ -14,6 +27,13 @@
+ public IInventory enchantSlots = new InventorySubcontainer(new ChatComponentText("Enchant"), 2) {
+@@ -14,6 +29,13 @@
super.update();
ContainerEnchantTable.this.a((IInventory) this);
}
@@ -34,7 +36,7 @@
};
public World world;
private final BlockPosition position;
-@@ -22,6 +42,10 @@
+@@ -22,6 +44,10 @@
public int[] costs = new int[3];
public int[] h = new int[] { -1, -1, -1};
public int[] i = new int[] { -1, -1, -1};
@@ -45,7 +47,7 @@
public ContainerEnchantTable(PlayerInventory playerinventory, World world, BlockPosition blockposition) {
this.world = world;
-@@ -54,6 +78,9 @@
+@@ -54,6 +80,9 @@
this.a(new Slot(playerinventory, i, 8 + i * 18, 142));
}
@@ -55,7 +57,7 @@
}
protected void c(ICrafting icrafting) {
-@@ -90,7 +117,7 @@
+@@ -90,7 +119,7 @@
ItemStack itemstack = iinventory.getItem(0);
int i;
@@ -64,7 +66,14 @@
if (!this.world.isClientSide) {
i = 0;
-@@ -152,6 +179,41 @@
+@@ -146,12 +175,47 @@
+ if (list != null && !list.isEmpty()) {
+ WeightedRandomEnchant weightedrandomenchant = (WeightedRandomEnchant) list.get(this.l.nextInt(list.size()));
+
+- this.h[j] = Enchantment.enchantments.a((Object) weightedrandomenchant.enchantment);
++ this.h[j] = Enchantment.enchantments.a(weightedrandomenchant.enchantment); // CraftBukkit - decompile error
+ this.i[j] = weightedrandomenchant.level;
+ }
}
}
@@ -72,7 +81,7 @@
+ CraftItemStack item = CraftItemStack.asCraftMirror(itemstack);
+ org.bukkit.enchantments.EnchantmentOffer[] offers = new EnchantmentOffer[3];
+ for (j = 0; j < 3; ++j) {
-+ org.bukkit.enchantments.Enchantment enchantment = (this.h[j] >= 0) ? org.bukkit.enchantments.Enchantment.getById(this.h[j]) : null;
++ org.bukkit.enchantments.Enchantment enchantment = (this.h[j] >= 0) ? org.bukkit.enchantments.Enchantment.getByKey(CraftNamespacedKey.fromMinecraft(Enchantment.getId(Enchantment.enchantments.getId(this.h[j])))) : null;
+ offers[j] = (enchantment != null) ? new EnchantmentOffer(enchantment, this.i[j], this.costs[j]) : null;
+ }
+
@@ -93,7 +102,7 @@
+ EnchantmentOffer offer = event.getOffers()[j];
+ if (offer != null) {
+ this.costs[j] = offer.getCost();
-+ this.h[j] = offer.getEnchantment().getId();
++ this.h[j] = Enchantment.enchantments.a(Enchantment.fromId(CraftNamespacedKey.toMinecraft(offer.getEnchantment().getKey())));
+ this.i[j] = offer.getEnchantmentLevel();
+ } else {
+ this.costs[j] = 0;
@@ -106,7 +115,7 @@
this.b();
}
} else {
-@@ -176,25 +238,52 @@
+@@ -176,25 +240,53 @@
if (!this.world.isClientSide) {
List list = this.a(itemstack, i, this.costs[i]);
@@ -119,7 +128,7 @@
+ 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(Enchantment.getId(instance.enchantment)), instance.level);
++ enchants.put(org.bukkit.enchantments.Enchantment.getByKey(CraftNamespacedKey.fromMinecraft(Enchantment.getId(instance.enchantment))), instance.level);
+ }
+ CraftItemStack item = CraftItemStack.asCraftMirror(itemstack);
+
@@ -141,8 +150,9 @@
+ for (Map.Entry<org.bukkit.enchantments.Enchantment, Integer> entry : event.getEnchantsToAdd().entrySet()) {
+ try {
+ if (flag) {
-+ int enchantId = entry.getKey().getId();
-+ if (Enchantment.c(enchantId) == null) {
++ NamespacedKey enchantId = entry.getKey().getKey();
++ Enchantment nms = Enchantment.fromId(CraftNamespacedKey.toMinecraft(enchantId));
++ if (nms == null) {
+ continue;
+ }
@@ -150,7 +160,7 @@
- ItemEnchantedBook.a(itemstack, weightedrandomenchant);
- } else {
- itemstack.addEnchantment(weightedrandomenchant.enchantment, weightedrandomenchant.level);
-+ WeightedRandomEnchant weightedrandomenchant = new WeightedRandomEnchant(Enchantment.c(enchantId), entry.getValue());
++ WeightedRandomEnchant weightedrandomenchant = new WeightedRandomEnchant(nms, entry.getValue());
+ ItemEnchantedBook.a(itemstack, weightedrandomenchant);
+ } else {
+ item.addUnsafeEnchantment(entry.getKey(), entry.getValue());
@@ -167,7 +177,7 @@
if (!entityhuman.abilities.canInstantlyBuild) {
itemstack1.subtract(j);
if (itemstack1.isEmpty()) {
-@@ -233,12 +322,18 @@
+@@ -233,12 +325,18 @@
public void b(EntityHuman entityhuman) {
super.b(entityhuman);
@@ -186,7 +196,7 @@
return this.world.getType(this.position).getBlock() != Blocks.ENCHANTING_TABLE ? false : entityhuman.d((double) this.position.getX() + 0.5D, (double) this.position.getY() + 0.5D, (double) this.position.getZ() + 0.5D) <= 64.0D;
}
-@@ -291,4 +386,17 @@
+@@ -291,4 +389,17 @@
return itemstack;
}
diff --git a/nms-patches/ContainerFurnace.patch b/nms-patches/ContainerFurnace.patch
index 51ddf578..320e3f3d 100644
--- a/nms-patches/ContainerFurnace.patch
+++ b/nms-patches/ContainerFurnace.patch
@@ -1,19 +1,19 @@
--- a/net/minecraft/server/ContainerFurnace.java
+++ b/net/minecraft/server/ContainerFurnace.java
-@@ -1,5 +1,10 @@
+@@ -1,6 +1,10 @@
package net.minecraft.server;
+ import java.util.Iterator;
+// 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;
-@@ -8,11 +13,28 @@
- private int h;
+ public class ContainerFurnace extends ContainerRecipeBook {
+
+@@ -11,12 +15,29 @@
private int i;
+ private int j;
+ // CraftBukkit start
+ private CraftInventoryView bukkitEntity = null;
@@ -33,6 +33,7 @@
+
public ContainerFurnace(PlayerInventory playerinventory, IInventory iinventory) {
this.furnace = iinventory;
+ this.f = playerinventory.player.world;
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)));
@@ -40,7 +41,7 @@
int i;
-@@ -63,6 +85,7 @@
+@@ -95,6 +116,7 @@
}
public boolean canUse(EntityHuman entityhuman) {
diff --git a/nms-patches/ContainerPlayer.patch b/nms-patches/ContainerPlayer.patch
index feaa5bcd..40595e49 100644
--- a/nms-patches/ContainerPlayer.patch
+++ b/nms-patches/ContainerPlayer.patch
@@ -8,10 +8,10 @@
+import org.bukkit.craftbukkit.inventory.CraftInventoryView;
+// CraftBukkit end
+
- public class ContainerPlayer extends Container {
+ public class ContainerPlayer extends ContainerRecipeBook {
- private static final EnumItemSlot[] h = new EnumItemSlot[] { EnumItemSlot.HEAD, EnumItemSlot.CHEST, EnumItemSlot.LEGS, EnumItemSlot.FEET};
-@@ -7,10 +12,20 @@
+ private static final String[] h = new String[] { "item/empty_armor_slot_boots", "item/empty_armor_slot_leggings", "item/empty_armor_slot_chestplate", "item/empty_armor_slot_helmet"};
+@@ -8,10 +13,20 @@
public InventoryCraftResult resultInventory = new InventoryCraftResult();
public boolean g;
private final EntityHuman owner;
@@ -32,27 +32,9 @@
this.a((Slot) (new SlotResult(playerinventory.player, this.craftInventory, this.resultInventory, 0, 154, 28)));
int i;
-@@ -23,7 +38,7 @@
- }
-
- for (i = 0; i < 4; ++i) {
-- final EnumItemSlot enumitemslot = ContainerPlayer.h[i];
-+ final EnumItemSlot enumitemslot1 = ContainerPlayer.h[i];
-
- this.a(new Slot(playerinventory, 36 + (3 - i), 8, 8 + i * 18) {
- public int getMaxStackSize() {
-@@ -31,7 +46,7 @@
- }
-
- public boolean isAllowed(ItemStack itemstack) {
-- return enumitemslot == EntityInsentient.d(itemstack);
-+ return enumitemslot1 == EntityInsentient.d(itemstack); // CraftBukkit - decompile error
- }
-
- public boolean isAllowed(EntityHuman entityhuman) {
-@@ -141,4 +156,17 @@
- public boolean a(ItemStack itemstack, Slot slot) {
- return slot.inventory != this.resultInventory && super.a(itemstack, slot);
+@@ -167,4 +182,17 @@
+ public int g() {
+ return this.craftInventory.n();
}
+
+ // CraftBukkit start
diff --git a/nms-patches/ContainerWorkbench.patch b/nms-patches/ContainerWorkbench.patch
index 153d2c64..f5dd0d2d 100644
--- a/nms-patches/ContainerWorkbench.patch
+++ b/nms-patches/ContainerWorkbench.patch
@@ -8,7 +8,7 @@
+import org.bukkit.craftbukkit.inventory.CraftInventoryView;
+// CraftBukkit end
+
- public class ContainerWorkbench extends Container {
+ public class ContainerWorkbench extends ContainerRecipeBook {
- public InventoryCrafting craftInventory = new InventoryCrafting(this, 3, 3);
- public InventoryCraftResult resultInventory = new InventoryCraftResult();
@@ -32,7 +32,7 @@
this.g = world;
this.h = blockposition;
this.i = playerinventory.player;
-@@ -47,6 +62,7 @@
+@@ -60,6 +75,7 @@
}
public boolean canUse(EntityHuman entityhuman) {
@@ -40,9 +40,9 @@
return this.g.getType(this.h).getBlock() != Blocks.CRAFTING_TABLE ? false : entityhuman.d((double) this.h.getX() + 0.5D, (double) this.h.getY() + 0.5D, (double) this.h.getZ() + 0.5D) <= 64.0D;
}
-@@ -100,4 +116,17 @@
- public boolean a(ItemStack itemstack, Slot slot) {
- return slot.inventory != this.resultInventory && super.a(itemstack, slot);
+@@ -125,4 +141,17 @@
+ public int g() {
+ return this.craftInventory.n();
}
+
+ // CraftBukkit start
diff --git a/nms-patches/CraftingManager.patch b/nms-patches/CraftingManager.patch
index a619d68f..c788f891 100644
--- a/nms-patches/CraftingManager.patch
+++ b/nms-patches/CraftingManager.patch
@@ -1,57 +1,32 @@
--- a/net/minecraft/server/CraftingManager.java
+++ b/net/minecraft/server/CraftingManager.java
-@@ -34,6 +34,7 @@
-
- public static boolean init() {
- try {
-+ CraftingManager.c = 0; // Reset recipe ID count
- a("armordye", new RecipeArmorDye());
- a("bookcloning", new RecipeBookClone());
- a("mapcloning", new RecipeMapClone());
-@@ -147,6 +148,7 @@
- if (CraftingManager.recipes.d(minecraftkey)) {
- throw new IllegalStateException("Duplicate recipe ignored with ID " + minecraftkey);
- } else {
-+ irecipe.setKey(minecraftkey); // CraftBukkit
- CraftingManager.recipes.a(CraftingManager.c++, minecraftkey, irecipe);
- }
- }
-@@ -158,12 +160,14 @@
+@@ -96,12 +96,14 @@
do {
if (!iterator.hasNext()) {
-+ inventorycrafting.currentRecipe = null; // CraftBukkit - Clear recipe when no recipe is found
++ iinventory.setCurrentRecipe(null); // CraftBukkit - Clear recipe when no recipe is found
return ItemStack.a;
}
irecipe = (IRecipe) iterator.next();
- } while (!irecipe.a(inventorycrafting, world));
+ } while (!irecipe.a(iinventory, world));
-+ inventorycrafting.currentRecipe = irecipe; // CraftBukkit
- return irecipe.craftItem(inventorycrafting);
++ iinventory.setCurrentRecipe(irecipe); // CraftBukkit
+ return irecipe.craftItem(iinventory);
}
-@@ -175,12 +179,14 @@
+@@ -113,12 +115,14 @@
do {
if (!iterator.hasNext()) {
-+ inventorycrafting.currentRecipe = null; // CraftBukkit - Clear recipe when no recipe is found
++ iinventory.setCurrentRecipe(null); // CraftBukkit - Clear recipe when no recipe is found
return null;
}
irecipe = (IRecipe) iterator.next();
- } while (!irecipe.a(inventorycrafting, world));
+ } while (!irecipe.a(iinventory, world));
-+ inventorycrafting.currentRecipe = irecipe; // CraftBukkit
++ iinventory.setCurrentRecipe(irecipe); // CraftBukkit
return irecipe;
}
-@@ -210,7 +216,7 @@
- }
-
- public static int a(IRecipe irecipe) {
-- return CraftingManager.recipes.a((Object) irecipe);
-+ return CraftingManager.recipes.a(irecipe); // CraftBukkit - decompile error
- }
-
- @Nullable
diff --git a/nms-patches/CrashReport.patch b/nms-patches/CrashReport.patch
index de74312b..7e9cb276 100644
--- a/nms-patches/CrashReport.patch
+++ b/nms-patches/CrashReport.patch
@@ -1,8 +1,8 @@
--- a/net/minecraft/server/CrashReport.java
+++ b/net/minecraft/server/CrashReport.java
-@@ -125,6 +125,7 @@
- return this.a();
- }
+@@ -63,6 +63,7 @@
+
+ return String.format("%d total; %s", new Object[] { Integer.valueOf(list.size()), list.stream().collect(Collectors.joining(" "))});
});
+ this.d.a("CraftBukkit Information", (CrashReportCallable) new org.bukkit.craftbukkit.CraftCrashReport()); // CraftBukkit
}
diff --git a/nms-patches/CustomFunction.patch b/nms-patches/CustomFunction.patch
index a01167d4..034c3546 100644
--- a/nms-patches/CustomFunction.patch
+++ b/nms-patches/CustomFunction.patch
@@ -1,19 +1,11 @@
--- a/net/minecraft/server/CustomFunction.java
+++ b/net/minecraft/server/CustomFunction.java
-@@ -122,7 +122,15 @@
- }
+@@ -45,7 +45,7 @@
+ }
- public void a(CustomFunctionData customfunctiondata, ICommandListener icommandlistener, ArrayDeque<CustomFunctionData.a> arraydeque, int i) {
-- customfunctiondata.a().a(icommandlistener, this.a);
-+ // CraftBukkit start
-+ org.bukkit.command.CommandSender sender;
-+ if (icommandlistener instanceof CustomFunctionData.CustomFunctionListener) {
-+ sender = ((CustomFunctionData.CustomFunctionListener) icommandlistener).sender;
-+ } else {
-+ sender = CommandBlockListenerAbstract.unwrapSender(icommandlistener);
-+ }
-+ CommandBlockListenerAbstract.executeSafely(icommandlistener, sender, this.a);
-+ // CraftBukkit end
- }
+ try {
+- ParseResults parseresults = customfunctiondata.a().getCommandDispatcher().a().parse(s, customfunctiondata.f());
++ ParseResults parseresults = customfunctiondata.d().parse(s, customfunctiondata.f()); // CraftBukkit
- public String toString() {
+ if (parseresults.getReader().canRead()) {
+ if (parseresults.getExceptions().size() == 1) {
diff --git a/nms-patches/CustomFunctionData.patch b/nms-patches/CustomFunctionData.patch
index 821ff006..d478a823 100644
--- a/nms-patches/CustomFunctionData.patch
+++ b/nms-patches/CustomFunctionData.patch
@@ -1,45 +1,38 @@
--- a/net/minecraft/server/CustomFunctionData.java
+++ b/net/minecraft/server/CustomFunctionData.java
-@@ -23,7 +23,14 @@
- private CustomFunction f;
- private final ArrayDeque<CustomFunctionData.a> g = new ArrayDeque();
- private boolean h = false;
-- private final ICommandListener i = new ICommandListener() {
-+ // CraftBukkit start
-+ private final ICommandListener i = new CustomFunctionListener();
-+
-+ public class CustomFunctionListener implements ICommandListener {
-+
-+ protected org.bukkit.command.CommandSender sender = new org.bukkit.craftbukkit.command.CraftFunctionCommandSender(this);
-+ // CraftBukkit end
-+
- public String getName() {
- return CustomFunctionData.this.e;
- }
-@@ -33,7 +40,7 @@
- }
+@@ -32,14 +32,16 @@
+ private final Map<MinecraftKey, CustomFunction> g = Maps.newHashMap();
+ private final ArrayDeque<CustomFunctionData.a> h = new ArrayDeque();
+ private boolean i;
+- private final Tags<CustomFunction> j = new Tags((minecraftkey) -> {
++ private final Tags<CustomFunction> j = new Tags<>((minecraftkey) -> { // CraftBukkit - decompile error
+ return this.a(minecraftkey) != null;
+ }, this::a, "tags/functions", true, "function");
+ private final List<CustomFunction> k = Lists.newArrayList();
+ private boolean l;
++ private final com.mojang.brigadier.CommandDispatcher<CommandListenerWrapper> dispatcher; // CraftBukkit
- public World getWorld() {
-- return CustomFunctionData.this.c.worldServer[0];
-+ return CustomFunctionData.this.c.worlds.get(0); // CraftBukkit
- }
-
- public MinecraftServer C_() {
-@@ -57,7 +64,7 @@
+ public CustomFunctionData(MinecraftServer minecraftserver) {
+ this.f = minecraftserver;
++ this.dispatcher = this.f.getCommandDispatcher().a(); // CraftBukkit
}
- public int c() {
-- return this.c.worldServer[0].getGameRules().c("maxCommandChainLength");
-+ return this.c.worlds.get(0).getGameRules().c("maxCommandChainLength"); // CraftBukkit
+ @Nullable
+@@ -60,7 +62,7 @@
}
- public Map<MinecraftKey, CustomFunction> d() {
-@@ -65,7 +72,7 @@
+ public com.mojang.brigadier.CommandDispatcher<CommandListenerWrapper> d() {
+- return this.f.getCommandDispatcher().a();
++ return dispatcher; // CraftBukkit
}
- public void e() {
-- String s = this.c.worldServer[0].getGameRules().get("gameLoopFunction");
-+ String s = this.c.worlds.get(0).getGameRules().get("gameLoopFunction"); // CraftBukkit
-
- if (!s.equals(this.e)) {
- this.e = s;
+ public void X_() {
+@@ -164,7 +166,7 @@
+ arraylist.add(CompletableFuture.supplyAsync(() -> {
+ return a(iresourcemanager, minecraftkey);
+ }, Resource.a).thenApplyAsync((list) -> {
+- return CustomFunction.a(minecraftkey, this, list);
++ return CustomFunction.a(minecraftkey1, this, list); // CraftBukkit - decompile error
+ }).handle((customfunction, throwable) -> {
+ return this.a(customfunction, throwable, minecraftkey);
+ }));
diff --git a/nms-patches/DamageSource.patch b/nms-patches/DamageSource.patch
index ac9ca78e..9a4a324c 100644
--- a/nms-patches/DamageSource.patch
+++ b/nms-patches/DamageSource.patch
@@ -1,9 +1,9 @@
--- a/net/minecraft/server/DamageSource.java
+++ b/net/minecraft/server/DamageSource.java
-@@ -34,6 +34,18 @@
- private boolean C;
+@@ -35,6 +35,18 @@
private boolean D;
- public String translationIndex;
+ private boolean E;
+ public final String translationIndex;
+ // CraftBukkit start
+ private boolean sweep;
+
diff --git a/nms-patches/DataConverterFlatten.patch b/nms-patches/DataConverterFlatten.patch
new file mode 100644
index 00000000..4c4a198f
--- /dev/null
+++ b/nms-patches/DataConverterFlatten.patch
@@ -0,0 +1,11 @@
+--- a/net/minecraft/server/DataConverterFlatten.java
++++ b/net/minecraft/server/DataConverterFlatten.java
+@@ -378,7 +378,7 @@
+ Typed typed2 = typed.getOrCreateTyped(opticfinder1);
+ Dynamic dynamic1 = (Dynamic) typed2.get(DSL.remainderFinder());
+
+- dynamic1 = dynamic1.set("Damage", dynamic1.createInt(i));
++ if (i != 0) dynamic1 = dynamic1.set("Damage", dynamic1.createInt(i)); // CraftBukkit
+ typed1 = typed1.set(opticfinder1, typed2.set(DSL.remainderFinder(), dynamic1));
+ }
+
diff --git a/nms-patches/DataConverterMap.patch b/nms-patches/DataConverterMap.patch
new file mode 100644
index 00000000..190d6490
--- /dev/null
+++ b/nms-patches/DataConverterMap.patch
@@ -0,0 +1,20 @@
+--- a/net/minecraft/server/DataConverterMap.java
++++ b/net/minecraft/server/DataConverterMap.java
+@@ -22,7 +22,7 @@
+ public TypeRewriteRule makeRule() {
+ Type type = this.getInputSchema().getType(DataConverterTypes.ITEM_STACK);
+ OpticFinder opticfinder = DSL.fieldFinder("id", DSL.named(DataConverterTypes.q.typeName(), DSL.namespacedString()));
+- OpticFinder opticfinder1 = type.findField("tag");
++ OpticFinder<?> opticfinder1 = type.findField("tag"); // CraftBukkit - decompile error
+
+ return this.fixTypeEverywhereTyped("ItemInstanceMapIdFix", type, (typed) -> {
+ Optional optional = typed.getOptional(opticfinder);
+@@ -32,7 +32,7 @@
+ Typed typed1 = typed.getOrCreateTyped(opticfinder1);
+ Dynamic dynamic1 = (Dynamic) typed1.get(DSL.remainderFinder());
+
+- dynamic1 = dynamic1.set("map", dynamic1.createInt(dynamic.getInt("Damage")));
++ if (!dynamic1.get("map").isPresent()) dynamic1 = dynamic1.set("map", dynamic1.createInt(dynamic.getInt("Damage"))); // CraftBukkit
+ return typed.set(opticfinder1, typed1.set(DSL.remainderFinder(), dynamic1));
+ } else {
+ return typed;
diff --git a/nms-patches/DataInspectorBlockEntity.patch b/nms-patches/DataInspectorBlockEntity.patch
deleted file mode 100644
index 0ec5d799..00000000
--- a/nms-patches/DataInspectorBlockEntity.patch
+++ /dev/null
@@ -1,12 +0,0 @@
---- a/net/minecraft/server/DataInspectorBlockEntity.java
-+++ b/net/minecraft/server/DataInspectorBlockEntity.java
-@@ -32,7 +32,8 @@
- boolean flag;
-
- if (s1 == null) {
-- DataInspectorBlockEntity.a.warn("Unable to resolve BlockEntity for ItemInstance: {}", s);
-+ // CraftBukkit - Remove unnecessary warning (occurs when deserializing a Shulker Box item)
-+ // DataInspectorBlockEntity.a.warn("Unable to resolve BlockEntity for ItemInstance: {}", s);
- flag = false;
- } else {
- flag = !nbttagcompound2.hasKey("id");
diff --git a/nms-patches/DataPaletteBlock.patch b/nms-patches/DataPaletteBlock.patch
deleted file mode 100644
index 676b070e..00000000
--- a/nms-patches/DataPaletteBlock.patch
+++ /dev/null
@@ -1,25 +0,0 @@
---- a/net/minecraft/server/DataPaletteBlock.java
-+++ b/net/minecraft/server/DataPaletteBlock.java
-@@ -112,7 +112,21 @@
- int i1 = nibblearray1 == null ? 0 : nibblearray1.a(j, k, l);
- int j1 = i1 << 12 | (abyte[i] & 255) << 4 | nibblearray.a(j, k, l);
-
-- this.setBlockIndex(i, (IBlockData) Block.REGISTRY_ID.fromId(j1));
-+ // CraftBukkit start - fix blocks with random data values (caused by plugins)
-+ IBlockData data = Block.REGISTRY_ID.fromId(j1);
-+ if (data == null) {
-+ Block block = Block.getById(j1 >> 4);
-+ if (block != null) {
-+ try {
-+ data = block.fromLegacyData(j1 & 0xF);
-+ } catch (Exception ignored) {
-+ data = block.getBlockData();
-+ }
-+ }
-+ }
-+ this.setBlockIndex(i, data);
-+ // this.setBlockIndex(i, (IBlockData) Block.REGISTRY_ID.fromId(j1));
-+ // CraftBukkit end
- }
-
- }
diff --git a/nms-patches/DataWatcher.patch b/nms-patches/DataWatcher.patch
index 131d78a7..676bc64c 100644
--- a/nms-patches/DataWatcher.patch
+++ b/nms-patches/DataWatcher.patch
@@ -18,3 +18,17 @@
DataWatcher.Item datawatcher_item = new DataWatcher.Item(datawatcherobject, t0);
this.e.writeLock().lock();
+@@ -128,6 +128,13 @@
+
+ }
+
++ // CraftBukkit start - add method from above
++ public <T> void markDirty(DataWatcherObject<T> datawatcherobject) {
++ this.b(datawatcherobject).a(true);
++ this.g = true;
++ }
++ // CraftBukkit end
++
+ public boolean a() {
+ return this.g;
+ }
diff --git a/nms-patches/DedicatedServer.patch b/nms-patches/DedicatedServer.patch
index 9cd3444c..e2d9e6ee 100644
--- a/nms-patches/DedicatedServer.patch
+++ b/nms-patches/DedicatedServer.patch
@@ -1,6 +1,6 @@
--- a/net/minecraft/server/DedicatedServer.java
+++ b/net/minecraft/server/DedicatedServer.java
-@@ -19,11 +19,21 @@
+@@ -23,11 +23,22 @@
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
@@ -8,6 +8,7 @@
+import java.io.PrintStream;
+import org.apache.logging.log4j.Level;
+
++import org.bukkit.command.CommandSender;
+import org.bukkit.craftbukkit.LoggerOutputStream;
+import org.bukkit.event.server.ServerCommandEvent;
+import org.bukkit.craftbukkit.util.Waitable;
@@ -17,26 +18,26 @@
public class DedicatedServer extends MinecraftServer implements IMinecraftServer {
private static final Logger LOGGER = LogManager.getLogger();
- private static final Pattern l = Pattern.compile("^[a-fA-F0-9]{40}$");
+ private static final Pattern i = Pattern.compile("^[a-fA-F0-9]{40}$");
- private final List<ServerCommand> serverCommandQueue = Collections.synchronizedList(Lists.newArrayList());
+ private final List<ServerCommand> serverCommandQueue = Collections.synchronizedList(Lists.<ServerCommand>newArrayList()); // CraftBukkit - fix decompile error
- private RemoteStatusListener n;
+ private RemoteStatusListener k;
public final RemoteControlCommandListener remoteControlCommandListener = new RemoteControlCommandListener(this);
- private RemoteControlListener p;
-@@ -33,8 +43,10 @@
- private EnumGamemode t;
- private boolean u;
+ private RemoteControlListener m;
+@@ -37,8 +48,10 @@
+ private EnumGamemode q;
+ private boolean r;
-- public DedicatedServer(File file, DataConverterManager dataconvertermanager, YggdrasilAuthenticationService yggdrasilauthenticationservice, MinecraftSessionService minecraftsessionservice, GameProfileRepository gameprofilerepository, UserCache usercache) {
-- super(file, Proxy.NO_PROXY, dataconvertermanager, yggdrasilauthenticationservice, minecraftsessionservice, gameprofilerepository, usercache);
+- public DedicatedServer(File file, DataFixer datafixer, YggdrasilAuthenticationService yggdrasilauthenticationservice, MinecraftSessionService minecraftsessionservice, GameProfileRepository gameprofilerepository, UserCache usercache) {
+- super(file, Proxy.NO_PROXY, datafixer, new CommandDispatcher(true), yggdrasilauthenticationservice, minecraftsessionservice, gameprofilerepository, usercache);
+ // CraftBukkit start - Signature changed
-+ public DedicatedServer(joptsimple.OptionSet options, DataConverterManager dataconvertermanager, YggdrasilAuthenticationService yggdrasilauthenticationservice, MinecraftSessionService minecraftsessionservice, GameProfileRepository gameprofilerepository, UserCache usercache) {
-+ super(options, Proxy.NO_PROXY, dataconvertermanager, yggdrasilauthenticationservice, minecraftsessionservice, gameprofilerepository, usercache);
++ public DedicatedServer(joptsimple.OptionSet options, DataFixer datafixer, YggdrasilAuthenticationService yggdrasilauthenticationservice, MinecraftSessionService minecraftsessionservice, GameProfileRepository gameprofilerepository, UserCache usercache) {
++ super(options, Proxy.NO_PROXY, datafixer, new CommandDispatcher().init(true), yggdrasilauthenticationservice, minecraftsessionservice, gameprofilerepository, usercache);
+ // CraftBukkit end
Thread thread = new Thread("Server Infinisleeper") {
{
this.setDaemon(true);
-@@ -53,16 +65,30 @@
+@@ -58,16 +71,30 @@
};
}
@@ -56,22 +57,22 @@
try {
- while (!DedicatedServer.this.isStopped() && DedicatedServer.this.isRunning() && (s = bufferedreader.readLine()) != null) {
-- DedicatedServer.this.issueCommand(s, DedicatedServer.this);
+- DedicatedServer.this.issueCommand(s, DedicatedServer.this.getServerCommandListener());
+ // CraftBukkit start - JLine disabling compatibility
-+ while (!isStopped() && isRunning()) {
++ while (!DedicatedServer.this.isStopped() && DedicatedServer.this.isRunning()) {
+ if (org.bukkit.craftbukkit.Main.useJline) {
+ s = bufferedreader.readLine(">", null);
+ } else {
+ s = bufferedreader.readLine();
+ }
+ if (s != null && s.trim().length() > 0) { // Trim to filter lines which are just spaces
-+ issueCommand(s, DedicatedServer.this);
++ DedicatedServer.this.issueCommand(s, DedicatedServer.this.getServerCommandListener());
+ }
+ // CraftBukkit end
}
} catch (IOException ioexception) {
DedicatedServer.LOGGER.error("Exception handling console input", ioexception);
-@@ -71,6 +97,27 @@
+@@ -76,6 +103,27 @@
}
};
@@ -97,18 +98,18 @@
+ // CraftBukkit end
+
thread.setDaemon(true);
+ thread.setUncaughtExceptionHandler(new DefaultUncaughtExceptionHandler(DedicatedServer.LOGGER));
thread.start();
- DedicatedServer.LOGGER.info("Starting minecraft server version 1.12.2");
-@@ -79,7 +126,7 @@
+@@ -85,7 +133,7 @@
}
DedicatedServer.LOGGER.info("Loading properties");
- this.propertyManager = new PropertyManager(new File("server.properties"));
+ this.propertyManager = new PropertyManager(this.options); // CraftBukkit - CLI argument support
- this.r = new EULA(new File("eula.txt"));
- if (!this.r.a()) {
+ 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.");
-@@ -136,6 +183,12 @@
+@@ -143,6 +191,12 @@
return false;
}
@@ -121,28 +122,19 @@
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.");
-@@ -150,7 +203,7 @@
+@@ -157,7 +211,7 @@
if (!NameReferencingFileConverter.a(this.propertyManager)) {
return false;
} else {
- this.a((PlayerList) (new DedicatedPlayerList(this)));
-+ this.convertable = new WorldLoaderServer(server.getWorldContainer(), this.dataConverterManager); // CraftBukkit - moved from MinecraftServer constructor
- long j = System.nanoTime();
++ this.convertable = new WorldLoaderServer(server.getWorldContainer().toPath(), server.getWorldContainer().toPath().resolve("../backups"), this.dataConverterManager); // CraftBukkit - moved from MinecraftServer constructor
+ long j = SystemUtils.c();
- if (this.S() == null) {
-@@ -198,7 +251,7 @@
-
- DedicatedServer.LOGGER.info("Done ({})! For help, type \"help\" or \"?\"", s3);
- if (this.propertyManager.a("announce-player-achievements")) {
-- this.worldServer[0].getGameRules().set("announceAdvancements", this.propertyManager.getBoolean("announce-player-achievements", true) ? "true" : "false");
-+ this.worlds.get(0).getGameRules().set("announceAdvancements", this.propertyManager.getBoolean("announce-player-achievements", true) ? "true" : "false"); // CraftBukkit
- this.propertyManager.b("announce-player-achievements");
- this.propertyManager.savePropertiesFile();
- }
-@@ -213,7 +266,18 @@
+ if (this.K() == null) {
+@@ -228,7 +282,18 @@
DedicatedServer.LOGGER.info("Starting remote control listener");
- this.p = new RemoteControlListener(this);
- this.p.a();
+ this.m = new RemoteControlListener(this);
+ this.m.a();
+ this.remoteConsole = new org.bukkit.craftbukkit.command.CraftRemoteConsoleCommandSender(this.remoteControlCommandListener); // CraftBukkit
+ }
+
@@ -156,40 +148,40 @@
}
+ // CraftBukkit end
- if (this.aT() > 0L) {
+ if (this.ba() > 0L) {
Thread thread1 = new Thread(new ThreadWatchdog(this));
-@@ -299,11 +363,11 @@
+@@ -303,11 +368,11 @@
return crashreport;
}
-- protected void B() {
-+ public void B() {
+- protected void u() {
++ public void u() { // CraftBukkit - decompile error
System.exit(0);
}
-- protected void D() {
-+ public void D() { // CraftBukkit - fix decompile error
- super.D();
- this.aP();
+- protected void w() {
++ public void w() { // CraftBukkit - fix decompile error
+ super.w();
+ this.aW();
}
-@@ -334,7 +398,15 @@
+@@ -342,7 +407,15 @@
while (!this.serverCommandQueue.isEmpty()) {
ServerCommand servercommand = (ServerCommand) this.serverCommandQueue.remove(0);
-- this.getCommandHandler().a(servercommand.source, servercommand.command);
+- this.getCommandDispatcher().a(servercommand.source, servercommand.command);
+ // CraftBukkit start - ServerCommand for preprocessing
+ ServerCommandEvent event = new ServerCommandEvent(console, servercommand.command);
+ server.getPluginManager().callEvent(event);
+ if (event.isCancelled()) continue;
+ servercommand = new ServerCommand(event.getCommand(), servercommand.source);
+
-+ // this.getCommandHandler().a(servercommand.source, servercommand.command); // Called in dispatchServerCommand
++ // this.getCommandDispatcher().a(servercommand.source, servercommand.command); // Called in dispatchServerCommand
+ server.dispatchServerCommand(console, servercommand);
+ // CraftBukkit end
}
}
-@@ -537,16 +609,70 @@
+@@ -549,16 +622,75 @@
}
public String getPlugins() {
@@ -210,17 +202,17 @@
+ if (i > 0) {
+ result.append("; ");
+ }
-+
+
+- public String executeRemoteCommand(String s) {
+- this.remoteControlCommandListener.clearMessages();
+- this.getCommandDispatcher().a(this.remoteControlCommandListener.f(), s);
+- return this.remoteControlCommandListener.getMessages();
+ result.append(plugins[i].getDescription().getName());
+ result.append(" ");
+ result.append(plugins[i].getDescription().getVersion().replaceAll(";", ","));
+ }
+ }
-
-- public String executeRemoteCommand(String s) {
-- this.remoteControlCommandListener.clearMessages();
-- this.b.a(this.remoteControlCommandListener, s);
-- return this.remoteControlCommandListener.getMessages();
++
+ return result.toString();
+ // CraftBukkit end
+ }
@@ -238,7 +230,7 @@
+ return "";
+ }
+ // Event change end
-+ ServerCommand serverCommand = new ServerCommand(event.getCommand(), remoteControlCommandListener);
++ ServerCommand serverCommand = new ServerCommand(event.getCommand(), remoteControlCommandListener.f());
+ server.dispatchServerCommand(remoteConsole, serverCommand);
+ return remoteControlCommandListener.getMessages();
+ }
@@ -256,7 +248,7 @@
}
public PlayerList getPlayerList() {
- return this.aQ();
+ return this.aX();
}
+
+ // CraftBukkit start
@@ -264,5 +256,10 @@
+ public PropertyManager getPropertyManager() {
+ return this.propertyManager;
+ }
++
++ @Override
++ public CommandSender getBukkitSender(CommandListenerWrapper wrapper) {
++ return console;
++ }
+ // CraftBukkit end
}
diff --git a/nms-patches/DispenseBehaviorItem.patch b/nms-patches/DispenseBehaviorItem.patch
index f325425f..50eb6ee9 100644
--- a/nms-patches/DispenseBehaviorItem.patch
+++ b/nms-patches/DispenseBehaviorItem.patch
@@ -11,7 +11,7 @@
public class DispenseBehaviorItem implements IDispenseBehavior {
public DispenseBehaviorItem() {}
-@@ -17,11 +22,18 @@
+@@ -17,11 +22,19 @@
IPosition iposition = BlockDispenser.a(isourceblock);
ItemStack itemstack1 = itemstack.cloneAndSubtract(1);
@@ -27,12 +27,13 @@
- 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) {
++ if (itemstack.isEmpty()) return true;
+ IPosition iposition = BlockDispenser.a(isourceblock);
+ // CraftBukkit end
double d0 = iposition.getX();
double d1 = iposition.getY();
double d2 = iposition.getZ();
-@@ -41,7 +53,41 @@
+@@ -41,7 +54,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;
@@ -60,7 +61,7 @@
+ ItemStack eventStack = CraftItemStack.asNMSCopy(event.getItem());
+ IDispenseBehavior idispensebehavior = (IDispenseBehavior) BlockDispenser.REGISTRY.get(eventStack.getItem());
+ if (idispensebehavior != IDispenseBehavior.NONE && idispensebehavior.getClass() != DispenseBehaviorItem.class) {
-+ idispensebehavior.a(isourceblock, eventStack);
++ idispensebehavior.dispense(isourceblock, eventStack);
+ } else {
+ world.addEntity(entityitem);
+ }
diff --git a/nms-patches/DispenseBehaviorProjectile.patch b/nms-patches/DispenseBehaviorProjectile.patch
index a7f5100e..e3b3fd05 100644
--- a/nms-patches/DispenseBehaviorProjectile.patch
+++ b/nms-patches/DispenseBehaviorProjectile.patch
@@ -38,7 +38,7 @@
+ ItemStack eventStack = CraftItemStack.asNMSCopy(event.getItem());
+ IDispenseBehavior idispensebehavior = (IDispenseBehavior) BlockDispenser.REGISTRY.get(eventStack.getItem());
+ if (idispensebehavior != IDispenseBehavior.NONE && idispensebehavior != this) {
-+ idispensebehavior.a(isourceblock, eventStack);
++ idispensebehavior.dispense(isourceblock, eventStack);
+ return itemstack;
+ }
+ }
diff --git a/nms-patches/DispenserRegistry.patch b/nms-patches/DispenserRegistry.patch
index 5d7bba4e..47b0478d 100644
--- a/nms-patches/DispenserRegistry.patch
+++ b/nms-patches/DispenserRegistry.patch
@@ -16,38 +16,35 @@
public class DispenserRegistry {
public static final PrintStream a = System.out;
-@@ -71,7 +80,7 @@
- BlockDispenser.REGISTRY.a(Items.SPLASH_POTION, new IDispenseBehavior() {
- public ItemStack a(ISourceBlock isourceblock, final ItemStack itemstack) {
+@@ -70,7 +79,7 @@
+ BlockDispenser.a((IMaterial) Items.SPLASH_POTION, new IDispenseBehavior() {
+ public ItemStack dispense(ISourceBlock isourceblock, final ItemStack itemstack) {
return (new DispenseBehaviorProjectile() {
- protected IProjectile a(World world, IPosition iposition, ItemStack itemstack) {
+ protected IProjectile a(World world, IPosition iposition, ItemStack itemstack1) { // CraftBukkit - decompile issue
return new EntityPotion(world, iposition.getX(), iposition.getY(), iposition.getZ(), itemstack1.cloneItemStack());
}
-@@ -88,7 +97,7 @@
- BlockDispenser.REGISTRY.a(Items.LINGERING_POTION, new IDispenseBehavior() {
- public ItemStack a(ISourceBlock isourceblock, final ItemStack itemstack) {
+@@ -87,7 +96,7 @@
+ BlockDispenser.a((IMaterial) Items.LINGERING_POTION, new IDispenseBehavior() {
+ public ItemStack dispense(ISourceBlock isourceblock, final ItemStack itemstack) {
return (new DispenseBehaviorProjectile() {
- protected IProjectile a(World world, IPosition iposition, ItemStack itemstack) {
+ protected IProjectile a(World world, IPosition iposition, ItemStack itemstack1) { // CraftBukkit - decompile issue
return new EntityPotion(world, iposition.getX(), iposition.getY(), iposition.getZ(), itemstack1.cloneItemStack());
}
-@@ -108,14 +117,46 @@
- double d0 = isourceblock.getX() + (double) enumdirection.getAdjacentX();
- double d1 = (double) ((float) (isourceblock.getBlockPosition().getY() + enumdirection.getAdjacentY()) + 0.2F);
- double d2 = isourceblock.getZ() + (double) enumdirection.getAdjacentZ();
-- Entity entity = ItemMonsterEgg.a(isourceblock.getWorld(), ItemMonsterEgg.h(itemstack), d0, d1, d2);
-+ // Entity entity = ItemMonsterEgg.a(isourceblock.getWorld(), ItemMonsterEgg.h(itemstack), d0, d1, d2);
-+
+@@ -106,11 +115,39 @@
+ EnumDirection enumdirection = (EnumDirection) isourceblock.e().get(BlockDispenser.FACING);
+ EntityTypes entitytypes = ((ItemMonsterEgg) itemstack.getItem()).b(itemstack.getTag());
+
+ // CraftBukkit start
+ World world = isourceblock.getWorld();
+ ItemStack itemstack1 = itemstack.cloneAndSubtract(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));
++ BlockDispenseEvent event = new BlockDispenseEvent(block, craftItem.clone(), new org.bukkit.util.Vector(0, 0, 0));
+ if (!BlockDispenser.eventFired) {
+ world.getServer().getPluginManager().callEvent(event);
+ }
@@ -63,27 +60,22 @@
+ ItemStack eventStack = CraftItemStack.asNMSCopy(event.getItem());
+ IDispenseBehavior idispensebehavior = (IDispenseBehavior) BlockDispenser.REGISTRY.get(eventStack.getItem());
+ if (idispensebehavior != IDispenseBehavior.NONE && idispensebehavior != this) {
-+ idispensebehavior.a(isourceblock, eventStack);
++ idispensebehavior.dispense(isourceblock, eventStack);
+ return itemstack;
+ }
+ }
+
-+ itemstack1 = CraftItemStack.asNMSCopy(event.getItem());
-+
-+ Entity entity = ItemMonsterEgg.spawnCreature(isourceblock.getWorld(), ItemMonsterEgg.h(itemstack), event.getVelocity().getX(), event.getVelocity().getY(), event.getVelocity().getZ(), org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.DISPENSE_EGG);
-
- if (entity instanceof EntityLiving && itemstack.hasName()) {
- entity.setCustomName(itemstack.getName());
+ if (entitytypes != null) {
+ entitytypes.a(isourceblock.getWorld(), itemstack, (EntityHuman) null, isourceblock.getBlockPosition().shift(enumdirection), enumdirection != EnumDirection.UP, false);
}
- ItemMonsterEgg.a(isourceblock.getWorld(), (EntityHuman) null, itemstack, entity);
- itemstack.subtract(1);
-+ // itemstack.subtract(1);// Handled during event processing
++ // itemstack.subtract(1); // Handled during event processing
+ // CraftBukkit end
return itemstack;
}
- });
-@@ -125,10 +166,39 @@
+ };
+@@ -128,10 +165,39 @@
double d0 = isourceblock.getX() + (double) enumdirection.getAdjacentX();
double d1 = (double) ((float) isourceblock.getBlockPosition().getY() + 0.2F);
double d2 = isourceblock.getZ() + (double) enumdirection.getAdjacentZ();
@@ -110,7 +102,7 @@
+ ItemStack eventStack = CraftItemStack.asNMSCopy(event.getItem());
+ IDispenseBehavior idispensebehavior = (IDispenseBehavior) BlockDispenser.REGISTRY.get(eventStack.getItem());
+ if (idispensebehavior != IDispenseBehavior.NONE && idispensebehavior != this) {
-+ idispensebehavior.a(isourceblock, eventStack);
++ idispensebehavior.dispense(isourceblock, eventStack);
+ return itemstack;
+ }
+ }
@@ -125,7 +117,7 @@
return itemstack;
}
-@@ -149,8 +219,38 @@
+@@ -152,8 +218,38 @@
double d4 = random.nextGaussian() * 0.05D + (double) enumdirection.getAdjacentY();
double d5 = random.nextGaussian() * 0.05D + (double) enumdirection.getAdjacentZ();
@@ -152,7 +144,7 @@
+ ItemStack eventStack = CraftItemStack.asNMSCopy(event.getItem());
+ IDispenseBehavior idispensebehavior = (IDispenseBehavior) BlockDispenser.REGISTRY.get(eventStack.getItem());
+ if (idispensebehavior != IDispenseBehavior.NONE && idispensebehavior != this) {
-+ idispensebehavior.a(isourceblock, eventStack);
++ idispensebehavior.dispense(isourceblock, eventStack);
+ return itemstack;
+ }
+ }
@@ -166,13 +158,11 @@
return itemstack;
}
-@@ -171,7 +271,53 @@
- ItemBucket itembucket = (ItemBucket) itemstack.getItem();
+@@ -175,9 +271,49 @@
BlockPosition blockposition = isourceblock.getBlockPosition().shift((EnumDirection) isourceblock.e().get(BlockDispenser.FACING));
+ World world = isourceblock.getWorld();
-- return itembucket.a((EntityHuman) null, isourceblock.getWorld(), blockposition) ? new ItemStack(Items.BUCKET) : this.b.a(isourceblock, itemstack);
+ // CraftBukkit start
-+ World world = isourceblock.getWorld();
+ int x = blockposition.getX();
+ int y = blockposition.getY();
+ int z = blockposition.getZ();
@@ -194,7 +184,7 @@
+ ItemStack eventStack = CraftItemStack.asNMSCopy(event.getItem());
+ IDispenseBehavior idispensebehavior = (IDispenseBehavior) BlockDispenser.REGISTRY.get(eventStack.getItem());
+ if (idispensebehavior != IDispenseBehavior.NONE && idispensebehavior != this) {
-+ idispensebehavior.a(isourceblock, eventStack);
++ idispensebehavior.dispense(isourceblock, eventStack);
+ return itemstack;
+ }
+ }
@@ -203,7 +193,9 @@
+ }
+ // CraftBukkit end
+
-+ if (itembucket.a((EntityHuman) null, isourceblock.getWorld(), blockposition)) {
+ if (itembucket.a((EntityHuman) null, world, blockposition, (MovingObjectPosition) null)) {
+- itembucket.a(world, itemstack, blockposition);
+- return new ItemStack(Items.BUCKET);
+ // CraftBukkit start - Handle stacked buckets
+ Item item = Items.BUCKET;
+ itemstack.subtract(1);
@@ -211,25 +203,53 @@
+ itemstack.setItem(Items.BUCKET);
+ itemstack.setCount(1);
+ } else if (((TileEntityDispenser) isourceblock.getTileEntity()).addItem(new ItemStack(item)) < 0) {
-+ this.b.a(isourceblock, new ItemStack(item));
++ this.a.dispense(isourceblock, new ItemStack(item));
+ }
+ // CraftBukkit end
+ return itemstack;
-+ } else {
-+ return this.b.a(isourceblock, itemstack);
-+ }
- }
- };
-
-@@ -198,6 +344,30 @@
- item = Items.LAVA_BUCKET;
+ } else {
+ return this.a.dispense(isourceblock, itemstack);
}
+@@ -207,6 +343,30 @@
+ } else {
+ Item item = fluidtype.b();
+
++ // 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.REGISTRY.get(eventStack.getItem());
++ if (idispensebehavior != IDispenseBehavior.NONE && idispensebehavior != this) {
++ idispensebehavior.dispense(isourceblock, eventStack);
++ return itemstack;
++ }
++ }
++ // CraftBukkit end
++
+ itemstack.subtract(1);
+ if (itemstack.isEmpty()) {
+ return new ItemStack(item);
+@@ -227,14 +387,42 @@
+ protected ItemStack a(ISourceBlock isourceblock, ItemStack itemstack) {
+ World world = isourceblock.getWorld();
+ // 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()));
++ BlockDispenseEvent event = new BlockDispenseEvent(bukkitBlock, craftItem.clone(), new org.bukkit.util.Vector(0, 0, 0));
+ if (!BlockDispenser.eventFired) {
+ world.getServer().getPluginManager().callEvent(event);
+ }
@@ -243,19 +263,34 @@
+ ItemStack eventStack = CraftItemStack.asNMSCopy(event.getItem());
+ IDispenseBehavior idispensebehavior = (IDispenseBehavior) BlockDispenser.REGISTRY.get(eventStack.getItem());
+ if (idispensebehavior != IDispenseBehavior.NONE && idispensebehavior != this) {
-+ idispensebehavior.a(isourceblock, eventStack);
++ idispensebehavior.dispense(isourceblock, eventStack);
+ return itemstack;
+ }
+ }
+ // CraftBukkit end
+
- world.setAir(blockposition);
- itemstack.subtract(1);
- if (itemstack.isEmpty()) {
-@@ -215,14 +385,42 @@
- protected ItemStack b(ISourceBlock isourceblock, ItemStack itemstack) {
- World world = isourceblock.getWorld();
+ this.a = true;
+ BlockPosition blockposition = isourceblock.getBlockPosition().shift((EnumDirection) isourceblock.e().get(BlockDispenser.FACING));
+ if (ItemFlintAndSteel.a((GeneratorAccess) world, blockposition)) {
+- world.setTypeUpdate(blockposition, Blocks.FIRE.getBlockData());
+- if (itemstack.isDamaged(1, world.random, (EntityPlayer) null)) {
+- itemstack.setCount(0);
++ // CraftBukkit start - Ignition by dispensing flint and steel
++ if (!org.bukkit.craftbukkit.event.CraftEventFactory.callBlockIgniteEvent(world, blockposition, isourceblock.getBlockPosition()).isCancelled()) {
++ world.setTypeUpdate(blockposition, Blocks.FIRE.getBlockData());
++ if (itemstack.isDamaged(1, world.random, (EntityPlayer) null)) {
++ itemstack.setCount(0);
++ }
+ }
++ // CraftBukkit end
+ } else {
+ Block block = world.getType(blockposition).getBlock();
+
+@@ -254,12 +442,55 @@
+ this.a = true;
+ World world = isourceblock.getWorld();
+ BlockPosition blockposition = isourceblock.getBlockPosition().shift((EnumDirection) isourceblock.e().get(BlockDispenser.FACING));
+ // CraftBukkit start
+ org.bukkit.block.Block block = world.getWorld().getBlockAt(isourceblock.getBlockPosition().getX(), isourceblock.getBlockPosition().getY(), isourceblock.getBlockPosition().getZ());
+ CraftItemStack craftItem = CraftItemStack.asCraftMirror(itemstack);
@@ -274,92 +309,42 @@
+ ItemStack eventStack = CraftItemStack.asNMSCopy(event.getItem());
+ IDispenseBehavior idispensebehavior = (IDispenseBehavior) BlockDispenser.REGISTRY.get(eventStack.getItem());
+ if (idispensebehavior != IDispenseBehavior.NONE && idispensebehavior != this) {
-+ idispensebehavior.a(isourceblock, eventStack);
++ idispensebehavior.dispense(isourceblock, eventStack);
+ return itemstack;
+ }
+ }
+ // CraftBukkit end
-+
- this.b = true;
- BlockPosition blockposition = isourceblock.getBlockPosition().shift((EnumDirection) isourceblock.e().get(BlockDispenser.FACING));
- if (world.isEmpty(blockposition)) {
-- world.setTypeUpdate(blockposition, Blocks.FIRE.getBlockData());
-- if (itemstack.isDamaged(1, world.random, (EntityPlayer) null)) {
-- itemstack.setCount(0);
-+ // 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, (EntityPlayer) null)) {
-+ itemstack.setCount(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);
-@@ -240,6 +438,32 @@
- World world = isourceblock.getWorld();
- BlockPosition blockposition = isourceblock.getBlockPosition().shift((EnumDirection) isourceblock.e().get(BlockDispenser.FACING));
-
-+ // 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 (!ItemBoneMeal.a(itemstack, world, blockposition) && !ItemBoneMeal.b(itemstack, world, blockposition)) {
+ this.a = false;
+ } else if (!world.isClientSide) {
+ world.triggerEffect(2005, blockposition, 0);
+ }
++ // 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<org.bukkit.block.BlockState> blocks = (List<org.bukkit.block.BlockState>) world.capturedBlockStates.clone();
++ world.capturedBlockStates.clear();
++ StructureGrowEvent structureEvent = null;
++ if (treeType != null) {
++ structureEvent = new StructureGrowEvent(location, treeType, false, null, blocks);
++ org.bukkit.Bukkit.getPluginManager().callEvent(structureEvent);
+ }
-+
-+ if (!event.getItem().equals(craftItem)) {
-+ // Chain to handler for new item
-+ ItemStack eventStack = CraftItemStack.asNMSCopy(event.getItem());
-+ IDispenseBehavior idispensebehavior = (IDispenseBehavior) BlockDispenser.REGISTRY.get(eventStack.getItem());
-+ if (idispensebehavior != IDispenseBehavior.NONE && idispensebehavior != this) {
-+ idispensebehavior.a(isourceblock, eventStack);
-+ return itemstack;
++ if (structureEvent == null || !structureEvent.isCancelled()) {
++ for (org.bukkit.block.BlockState blockstate : blocks) {
++ blockstate.update(true);
+ }
+ }
-+
-+ world.captureTreeGeneration = true;
-+ // CraftBukkit end
-+
- if (ItemDye.a(itemstack, world, blockposition)) {
- if (!world.isClientSide) {
- world.triggerEffect(2005, blockposition, 0);
-@@ -247,6 +471,26 @@
- } else {
- this.b = false;
- }
-+ // 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<org.bukkit.block.BlockState> blocks = (List<org.bukkit.block.BlockState>) world.capturedBlockStates.clone();
-+ world.capturedBlockStates.clear();
-+ StructureGrowEvent structureEvent = null;
-+ if (treeType != null) {
-+ structureEvent = new StructureGrowEvent(location, treeType, false, null, blocks);
-+ org.bukkit.Bukkit.getPluginManager().callEvent(structureEvent);
-+ }
-+ if (structureEvent == null || !structureEvent.isCancelled()) {
-+ for (org.bukkit.block.BlockState blockstate : blocks) {
-+ blockstate.update(true);
-+ }
-+ }
-+ }
-+ // CraftBukkit end
++ }
++ // CraftBukkit end
- return itemstack;
- } else {
-@@ -258,11 +502,40 @@
- protected ItemStack b(ISourceBlock isourceblock, ItemStack itemstack) {
+ return itemstack;
+ }
+@@ -268,11 +499,40 @@
+ protected ItemStack a(ISourceBlock isourceblock, ItemStack itemstack) {
World world = isourceblock.getWorld();
BlockPosition blockposition = isourceblock.getBlockPosition().shift((EnumDirection) isourceblock.e().get(BlockDispenser.FACING));
- EntityTNTPrimed entitytntprimed = new EntityTNTPrimed(world, (double) blockposition.getX() + 0.5D, (double) blockposition.getY(), (double) blockposition.getZ() + 0.5D, (EntityLiving) null);
@@ -386,7 +371,7 @@
+ ItemStack eventStack = CraftItemStack.asNMSCopy(event.getItem());
+ IDispenseBehavior idispensebehavior = (IDispenseBehavior) BlockDispenser.REGISTRY.get(eventStack.getItem());
+ if (idispensebehavior != IDispenseBehavior.NONE && idispensebehavior != this) {
-+ idispensebehavior.a(isourceblock, eventStack);
++ idispensebehavior.dispense(isourceblock, eventStack);
+ return itemstack;
+ }
+ }
@@ -395,15 +380,15 @@
+ // CraftBukkit end
world.addEntity(entitytntprimed);
- world.a((EntityHuman) null, entitytntprimed.locX, entitytntprimed.locY, entitytntprimed.locZ, SoundEffects.hW, SoundCategory.BLOCKS, 1.0F, 1.0F);
+ world.a((EntityHuman) null, entitytntprimed.locX, entitytntprimed.locY, entitytntprimed.locZ, SoundEffects.ENTITY_TNT_PRIMED, SoundCategory.BLOCKS, 1.0F, 1.0F);
- itemstack.subtract(1);
+ // itemstack.subtract(1); // CraftBukkit - handled above
return itemstack;
}
- });
-@@ -273,6 +546,30 @@
+ }));
+@@ -294,6 +554,30 @@
+ EnumDirection enumdirection = (EnumDirection) isourceblock.e().get(BlockDispenser.FACING);
BlockPosition blockposition = isourceblock.getBlockPosition().shift(enumdirection);
- BlockSkull blockskull = Blocks.SKULL;
+ // CraftBukkit start
+ org.bukkit.block.Block bukkitBlock = world.getWorld().getBlockAt(isourceblock.getBlockPosition().getX(), isourceblock.getBlockPosition().getY(), isourceblock.getBlockPosition().getZ());
@@ -423,18 +408,18 @@
+ ItemStack eventStack = CraftItemStack.asNMSCopy(event.getItem());
+ IDispenseBehavior idispensebehavior = (IDispenseBehavior) BlockDispenser.REGISTRY.get(eventStack.getItem());
+ if (idispensebehavior != IDispenseBehavior.NONE && idispensebehavior != this) {
-+ idispensebehavior.a(isourceblock, eventStack);
++ idispensebehavior.dispense(isourceblock, eventStack);
+ return itemstack;
+ }
+ }
+ // CraftBukkit end
+
- this.b = true;
- if (world.isEmpty(blockposition) && blockskull.b(world, blockposition, itemstack)) {
- if (!world.isClientSide) {
-@@ -321,6 +618,30 @@
+ this.a = true;
+ if (world.isEmpty(blockposition) && BlockWitherSkull.b(world, blockposition, itemstack)) {
+ world.setTypeAndData(blockposition, (IBlockData) Blocks.WITHER_SKELETON_SKULL.getBlockData().set(BlockSkull.a, Integer.valueOf(enumdirection.opposite().get2DRotationValue() * 4)), 3);
+@@ -317,6 +601,30 @@
BlockPosition blockposition = isourceblock.getBlockPosition().shift((EnumDirection) isourceblock.e().get(BlockDispenser.FACING));
- BlockPumpkin blockpumpkin = (BlockPumpkin) Blocks.PUMPKIN;
+ BlockPumpkinCarved blockpumpkincarved = (BlockPumpkinCarved) Blocks.CARVED_PUMPKIN;
+ // CraftBukkit start
+ org.bukkit.block.Block bukkitBlock = world.getWorld().getBlockAt(isourceblock.getBlockPosition().getX(), isourceblock.getBlockPosition().getY(), isourceblock.getBlockPosition().getZ());
@@ -454,47 +439,108 @@
+ ItemStack eventStack = CraftItemStack.asNMSCopy(event.getItem());
+ IDispenseBehavior idispensebehavior = (IDispenseBehavior) BlockDispenser.REGISTRY.get(eventStack.getItem());
+ if (idispensebehavior != IDispenseBehavior.NONE && idispensebehavior != this) {
-+ idispensebehavior.a(isourceblock, eventStack);
++ idispensebehavior.dispense(isourceblock, eventStack);
+ return itemstack;
+ }
+ }
+ // CraftBukkit end
+
- this.b = true;
- if (world.isEmpty(blockposition) && blockpumpkin.b(world, blockposition)) {
+ this.a = true;
+ if (world.isEmpty(blockposition) && blockpumpkincarved.a((IWorldReader) world, blockposition)) {
if (!world.isClientSide) {
-@@ -407,6 +728,30 @@
- EnumDirection enumdirection = (EnumDirection) isourceblock.e().get(BlockDispenser.FACING);
- BlockPosition blockposition = isourceblock.getBlockPosition().shift(enumdirection);
+@@ -378,6 +686,51 @@
+ }
-+ // 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);
-+ }
+ d();
++ // CraftBukkit start - easier than fixing the decompile
++ DataConverterFlattenData.a(1440, "{Name:\'minecraft:portal\',Properties:{axis:\'x\'}}", new String[]{"{Name:\'minecraft:portal\',Properties:{axis:\'x\'}}"});
++
++ DataConverterMaterialId.ID_MAPPING.put(409, "minecraft:prismarine_shard");
++ DataConverterMaterialId.ID_MAPPING.put(410, "minecraft:prismarine_crystals");
++ DataConverterMaterialId.ID_MAPPING.put(411, "minecraft:rabbit");
++ DataConverterMaterialId.ID_MAPPING.put(412, "minecraft:cooked_rabbit");
++ DataConverterMaterialId.ID_MAPPING.put(413, "minecraft:rabbit_stew");
++ DataConverterMaterialId.ID_MAPPING.put(414, "minecraft:rabbit_foot");
++ DataConverterMaterialId.ID_MAPPING.put(415, "minecraft:rabbit_hide");
++ DataConverterMaterialId.ID_MAPPING.put(416, "minecraft:armor_stand");
++
++ DataConverterMaterialId.ID_MAPPING.put(423, "minecraft:mutton");
++ DataConverterMaterialId.ID_MAPPING.put(424, "minecraft:cooked_mutton");
++ DataConverterMaterialId.ID_MAPPING.put(425, "minecraft:banner");
++ DataConverterMaterialId.ID_MAPPING.put(426, "minecraft:end_crystal");
++ DataConverterMaterialId.ID_MAPPING.put(427, "minecraft:spruce_door");
++ DataConverterMaterialId.ID_MAPPING.put(428, "minecraft:birch_door");
++ DataConverterMaterialId.ID_MAPPING.put(429, "minecraft:jungle_door");
++ DataConverterMaterialId.ID_MAPPING.put(430, "minecraft:acacia_door");
++ DataConverterMaterialId.ID_MAPPING.put(431, "minecraft:dark_oak_door");
++ DataConverterMaterialId.ID_MAPPING.put(432, "minecraft:chorus_fruit");
++ DataConverterMaterialId.ID_MAPPING.put(433, "minecraft:chorus_fruit_popped");
++ DataConverterMaterialId.ID_MAPPING.put(434, "minecraft:beetroot");
++ DataConverterMaterialId.ID_MAPPING.put(435, "minecraft:beetroot_seeds");
++ DataConverterMaterialId.ID_MAPPING.put(436, "minecraft:beetroot_soup");
++ DataConverterMaterialId.ID_MAPPING.put(437, "minecraft:dragon_breath");
++ DataConverterMaterialId.ID_MAPPING.put(438, "minecraft:splash_potion");
++ DataConverterMaterialId.ID_MAPPING.put(439, "minecraft:spectral_arrow");
++ DataConverterMaterialId.ID_MAPPING.put(440, "minecraft:tipped_arrow");
++ DataConverterMaterialId.ID_MAPPING.put(441, "minecraft:lingering_potion");
++ DataConverterMaterialId.ID_MAPPING.put(442, "minecraft:shield");
++ DataConverterMaterialId.ID_MAPPING.put(443, "minecraft:elytra");
++ DataConverterMaterialId.ID_MAPPING.put(444, "minecraft:spruce_boat");
++ DataConverterMaterialId.ID_MAPPING.put(445, "minecraft:birch_boat");
++ DataConverterMaterialId.ID_MAPPING.put(446, "minecraft:jungle_boat");
++ DataConverterMaterialId.ID_MAPPING.put(447, "minecraft:acacia_boat");
++ DataConverterMaterialId.ID_MAPPING.put(448, "minecraft:dark_oak_boat");
++ DataConverterMaterialId.ID_MAPPING.put(449, "minecraft:totem_of_undying");
++ DataConverterMaterialId.ID_MAPPING.put(450, "minecraft:shulker_shell");
++ DataConverterMaterialId.ID_MAPPING.put(452, "minecraft:iron_nugget");
++ DataConverterMaterialId.ID_MAPPING.put(453, "minecraft:knowledge_book");
++
++ DataConverterSpawnEgg.ID_MAPPING[23] = "Arrow";
++ // CraftBukkit end
+ }
+ }
+ }
+@@ -386,7 +739,7 @@
+ LocaleLanguage localelanguage = LocaleLanguage.a();
+
+ registrymaterials.iterator().forEachRemaining((object) -> {
+- String s = (String) function.apply(object);
++ String s1 = (String) function.apply(object); // CraftBukkit - decompile error
+
+ if (!localelanguage.b(s)) {
+ DispenserRegistry.c.warn("Missing translation for {}: {} (key: \'{}\')", s1, registrymaterials.b(object), s);
+@@ -480,6 +833,30 @@
+ BlockPosition blockposition = isourceblock.getBlockPosition().shift(enumdirection);
+ EnumDirection enumdirection1 = isourceblock.getWorld().isEmpty(blockposition.down()) ? enumdirection : EnumDirection.UP;
+
++ // CraftBukkit start
++ org.bukkit.block.Block bukkitBlock = isourceblock.getWorld().getWorld().getBlockAt(isourceblock.getBlockPosition().getX(), isourceblock.getBlockPosition().getY(), isourceblock.getBlockPosition().getZ());
++ CraftItemStack craftItem = CraftItemStack.asCraftMirror(itemstack);
+
-+ if (event.isCancelled()) {
-+ return itemstack;
-+ }
++ BlockDispenseEvent event = new BlockDispenseEvent(bukkitBlock, craftItem.clone(), new org.bukkit.util.Vector(blockposition.getX(), blockposition.getY(), blockposition.getZ()));
++ if (!BlockDispenser.eventFired) {
++ isourceblock.getWorld().getServer().getPluginManager().callEvent(event);
++ }
+
-+ if (!event.getItem().equals(craftItem)) {
-+ // Chain to handler for new item
-+ ItemStack eventStack = CraftItemStack.asNMSCopy(event.getItem());
-+ IDispenseBehavior idispensebehavior = (IDispenseBehavior) BlockDispenser.REGISTRY.get(eventStack.getItem());
-+ if (idispensebehavior != IDispenseBehavior.NONE && idispensebehavior != this) {
-+ idispensebehavior.a(isourceblock, eventStack);
++ if (event.isCancelled()) {
+ return itemstack;
+ }
-+ }
-+ // CraftBukkit end
+
- this.b = world.a(block, blockposition, false, EnumDirection.DOWN, (Entity) null);
- if (this.b) {
- EnumDirection enumdirection1 = world.isEmpty(blockposition.down()) ? enumdirection : EnumDirection.UP;
-@@ -475,12 +820,40 @@
++ if (!event.getItem().equals(craftItem)) {
++ // Chain to handler for new item
++ ItemStack eventStack = CraftItemStack.asNMSCopy(event.getItem());
++ IDispenseBehavior idispensebehavior = (IDispenseBehavior) BlockDispenser.REGISTRY.get(eventStack.getItem());
++ if (idispensebehavior != IDispenseBehavior.NONE && idispensebehavior != this) {
++ idispensebehavior.dispense(isourceblock, eventStack);
++ return itemstack;
++ }
++ }
++ // CraftBukkit end
++
+ this.a = ((ItemBlock) item).a((BlockActionContext) (new DispenserRegistry.b(isourceblock.getWorld(), blockposition, enumdirection, itemstack, enumdirection1))) == EnumInteractionResult.SUCCESS;
+ if (this.a) {
+ itemstack.subtract(1);
+@@ -533,12 +910,40 @@
d3 = 0.0D;
}
@@ -521,7 +567,7 @@
+ ItemStack eventStack = CraftItemStack.asNMSCopy(event.getItem());
+ IDispenseBehavior idispensebehavior = (IDispenseBehavior) BlockDispenser.REGISTRY.get(eventStack.getItem());
+ if (idispensebehavior != IDispenseBehavior.NONE && idispensebehavior != this) {
-+ idispensebehavior.a(isourceblock, eventStack);
++ idispensebehavior.dispense(isourceblock, eventStack);
+ return itemstack;
+ }
+ }
@@ -529,7 +575,7 @@
+ EntityBoat entityboat = new EntityBoat(world, event.getVelocity().getX(), event.getVelocity().getY(), event.getVelocity().getZ());
+ // CraftBukkit end
- entityboat.setType(this.c);
+ entityboat.setType(this.b);
entityboat.yaw = enumdirection.l();
- world.addEntity(entityboat);
- itemstack.subtract(1);
diff --git a/nms-patches/Enchantment.patch b/nms-patches/Enchantment.patch
index 498dc965..25991604 100644
--- a/nms-patches/Enchantment.patch
+++ b/nms-patches/Enchantment.patch
@@ -1,18 +1,27 @@
--- a/net/minecraft/server/Enchantment.java
+++ b/net/minecraft/server/Enchantment.java
-@@ -20,7 +20,7 @@
- }
-
- public static int getId(Enchantment enchantment) {
-- return Enchantment.enchantments.a((Object) enchantment);
-+ return Enchantment.enchantments.a(enchantment); // CraftBukkit - fix decompile error
- }
-
+@@ -15,6 +15,17 @@
@Nullable
-@@ -155,6 +155,11 @@
- Enchantment.enchantments.a(62, new MinecraftKey("lure"), new EnchantmentLure(Enchantment.Rarity.RARE, EnchantmentSlotType.FISHING_ROD, new EnumItemSlot[] { EnumItemSlot.MAINHAND}));
- Enchantment.enchantments.a(70, new MinecraftKey("mending"), new EnchantmentMending(Enchantment.Rarity.RARE, EnumItemSlot.values()));
- Enchantment.enchantments.a(71, new MinecraftKey("vanishing_curse"), new EnchantmentVanishing(Enchantment.Rarity.VERY_RARE, EnumItemSlot.values()));
+ protected String d;
+
++ // CraftBukkit start - add back
++ @Nullable
++ public static Enchantment fromId(MinecraftKey key) {
++ return Enchantment.enchantments.get(key);
++ }
++
++ public static MinecraftKey getId(Enchantment enchantment) {
++ return Enchantment.enchantments.b(enchantment);
++ }
++ // CraftBukkit end
++
+ protected Enchantment(Enchantment.Rarity enchantment_rarity, EnchantmentSlotType enchantmentslottype, EnumItemSlot[] aenumitemslot) {
+ this.e = enchantment_rarity;
+ this.itemTarget = enchantmentslottype;
+@@ -153,6 +164,11 @@
+ a("channeling", new EnchantmentTridentChanneling(Enchantment.Rarity.VERY_RARE, new EnumItemSlot[] { EnumItemSlot.MAINHAND}));
+ a("mending", new EnchantmentMending(Enchantment.Rarity.RARE, EnumItemSlot.values()));
+ a("vanishing_curse", new EnchantmentVanishing(Enchantment.Rarity.VERY_RARE, EnumItemSlot.values()));
+ // CraftBukkit start
+ for (Object enchantment : Enchantment.enchantments) {
+ org.bukkit.enchantments.Enchantment.registerEnchantment(new org.bukkit.craftbukkit.enchantments.CraftEnchantment((Enchantment) enchantment));
@@ -20,4 +29,4 @@
+ // CraftBukkit end
}
- public static enum Rarity {
+ private static void a(String s, Enchantment enchantment) {
diff --git a/nms-patches/EnchantmentFrostWalker.patch b/nms-patches/EnchantmentFrostWalker.patch
index c4f9f2b8..5ebd39a3 100644
--- a/nms-patches/EnchantmentFrostWalker.patch
+++ b/nms-patches/EnchantmentFrostWalker.patch
@@ -10,14 +10,14 @@
public class EnchantmentFrostWalker extends Enchantment {
@@ -42,8 +45,11 @@
- IBlockData iblockdata1 = world.getType(blockposition_mutableblockposition1);
+ IBlockData iblockdata2 = world.getType(blockposition_mutableblockposition1);
- if (iblockdata1.getMaterial() == Material.WATER && ((Integer) iblockdata1.get(BlockFluids.LEVEL)).intValue() == 0 && world.a(Blocks.FROSTED_ICE, blockposition_mutableblockposition1, false, EnumDirection.DOWN, (Entity) null)) {
-- world.setTypeUpdate(blockposition_mutableblockposition1, Blocks.FROSTED_ICE.getBlockData());
-- world.a(blockposition_mutableblockposition1.h(), Blocks.FROSTED_ICE, MathHelper.nextInt(entityliving.getRandom(), 60, 120));
+ if (iblockdata2.getMaterial() == Material.WATER && ((Integer) iblockdata2.get(BlockFluids.LEVEL)).intValue() == 0 && iblockdata.canPlace(world, blockposition_mutableblockposition1) && world.a(iblockdata, (BlockPosition) blockposition_mutableblockposition1)) {
+- world.setTypeUpdate(blockposition_mutableblockposition1, iblockdata);
+- world.I().a(blockposition_mutableblockposition1.h(), Blocks.FROSTED_ICE, MathHelper.nextInt(entityliving.getRandom(), 60, 120));
+ // CraftBukkit Start - Call EntityBlockFormEvent for Frost Walker
-+ if (org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockFormEvent(world, blockposition_mutableblockposition1, Blocks.FROSTED_ICE.getBlockData(), entityliving)) {
-+ world.a(blockposition_mutableblockposition1.h(), Blocks.FROSTED_ICE, MathHelper.nextInt(entityliving.getRandom(), 60, 120));
++ if (org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockFormEvent(world, blockposition_mutableblockposition1, iblockdata, entityliving)) {
++ world.I().a(blockposition_mutableblockposition1.h(), Blocks.FROSTED_ICE, MathHelper.nextInt(entityliving.getRandom(), 60, 120));
+ }
+ // CraftBukkit End
}
diff --git a/nms-patches/EnchantmentThorns.patch b/nms-patches/EnchantmentThorns.patch
index 82ffbcd9..8f997f9e 100644
--- a/nms-patches/EnchantmentThorns.patch
+++ b/nms-patches/EnchantmentThorns.patch
@@ -1,6 +1,6 @@
--- a/net/minecraft/server/EnchantmentThorns.java
+++ b/net/minecraft/server/EnchantmentThorns.java
-@@ -29,7 +29,7 @@
+@@ -28,7 +28,7 @@
Random random = entityliving.getRandom();
ItemStack itemstack = EnchantmentManager.b(Enchantments.THORNS, entityliving);
diff --git a/nms-patches/Entity.patch b/nms-patches/Entity.patch
index 39777cd1..b7bc2f61 100644
--- a/nms-patches/Entity.patch
+++ b/nms-patches/Entity.patch
@@ -1,6 +1,6 @@
--- a/net/minecraft/server/Entity.java
+++ b/net/minecraft/server/Entity.java
-@@ -16,8 +16,48 @@
+@@ -19,8 +19,54 @@
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
@@ -10,6 +10,7 @@
+import org.bukkit.Server;
+import org.bukkit.TravelAgent;
+import org.bukkit.block.BlockFace;
++import org.bukkit.command.CommandSender;
+import org.bukkit.entity.Hanging;
+import org.bukkit.entity.LivingEntity;
+import org.bukkit.entity.Vehicle;
@@ -28,7 +29,7 @@
+import org.bukkit.plugin.PluginManager;
+// CraftBukkit end
+
- public abstract class Entity implements ICommandListener {
+ public abstract class Entity implements INamableTileEntity, ICommandListener {
+ // CraftBukkit start
+ private static final int CURRENT_LEVEL = 2;
@@ -44,15 +45,20 @@
+ }
+ return bukkitEntity;
+ }
-+ // CraftBukikt end
-+
- private static final Logger a = LogManager.getLogger();
- private static final List<ItemStack> b = Collections.emptyList();
- private static final AxisAlignedBB c = new AxisAlignedBB(0.0D, 0.0D, 0.0D, 0.0D, 0.0D, 0.0D);
-@@ -102,6 +142,15 @@
- private boolean aI;
- private final double[] aJ;
- private long aK;
++
++ @Override
++ public CommandSender getBukkitSender(CommandListenerWrapper wrapper) {
++ return getBukkitEntity();
++ }
++ // CraftBukkit end
++
+ protected static final Logger i = LogManager.getLogger();
+ private static final List<ItemStack> a = Collections.emptyList();
+ private static final AxisAlignedBB b = new AxisAlignedBB(0.0D, 0.0D, 0.0D, 0.0D, 0.0D, 0.0D);
+@@ -107,6 +153,15 @@
+ private boolean aK;
+ private final double[] aL;
+ private long aM;
+ // CraftBukkit start
+ public boolean valid;
+ public org.bukkit.projectiles.ProjectileSource projectileSource; // For projectiles only
@@ -63,9 +69,9 @@
+ }
+ // CraftBukkit end
- public Entity(World world) {
+ public Entity(EntityTypes<?> entitytypes, World world) {
this.id = Entity.entityCount++;
-@@ -208,6 +257,33 @@
+@@ -212,6 +267,33 @@
}
protected void setYawPitch(float f, float f1) {
@@ -99,8 +105,8 @@
this.yaw = f % 360.0F;
this.pitch = f1 % 360.0F;
}
-@@ -230,6 +306,51 @@
- this.Y();
+@@ -234,6 +316,51 @@
+ this.W();
}
+ // CraftBukkit start
@@ -108,16 +114,16 @@
+ // No clean way to break out of ticking once the entity has been copied to a new world, so instead we move the portalling later in the tick cycle
+ if (!this.world.isClientSide && this.world instanceof WorldServer) {
+ this.world.methodProfiler.a("portal");
-+ if (this.ak) {
++ if (this.an) {
+ MinecraftServer minecraftserver = this.world.getMinecraftServer();
+
+ if (true || minecraftserver.getAllowNether()) { // CraftBukkit
+ if (!this.isPassenger()) {
-+ int i = this.Z();
++ int i = this.X();
+
-+ if (this.al++ >= i) {
-+ this.al = i;
-+ this.portalCooldown = this.aM();
++ if (this.ao++ >= i) {
++ this.ao = i;
++ this.portalCooldown = this.aQ();
+ byte b0;
+
+ if (this.world.worldProvider.getDimensionManager().getDimensionID() == -1) {
@@ -126,32 +132,32 @@
+ b0 = -1;
+ }
+
-+ this.b(b0);
++ this.d(b0);
+ }
+ }
+
-+ this.ak = false;
++ this.an = false;
+ }
+ } else {
-+ if (this.al > 0) {
-+ this.al -= 4;
++ if (this.ao > 0) {
++ this.ao -= 4;
+ }
+
-+ if (this.al < 0) {
-+ this.al = 0;
++ if (this.ao < 0) {
++ this.ao = 0;
+ }
+ }
+
-+ this.I();
-+ this.world.methodProfiler.b();
++ this.E();
++ this.world.methodProfiler.e();
+ }
+ }
+ // CraftBukkit end
+
- public void Y() {
+ public void W() {
this.world.methodProfiler.a("entityBaseTick");
- if (this.isPassenger() && this.bJ().dead) {
-@@ -246,6 +367,8 @@
+ if (this.isPassenger() && this.getVehicle().dead) {
+@@ -250,6 +377,8 @@
this.lastZ = this.locZ;
this.lastPitch = this.pitch;
this.lastYaw = this.yaw;
@@ -159,16 +165,16 @@
+ /*
if (!this.world.isClientSide && this.world instanceof WorldServer) {
this.world.methodProfiler.a("portal");
- if (this.ak) {
-@@ -285,6 +408,7 @@
- this.I();
- this.world.methodProfiler.b();
+ if (this.an) {
+@@ -289,6 +418,7 @@
+ this.E();
+ this.world.methodProfiler.e();
}
+ */
- this.as();
- this.aq();
-@@ -336,6 +460,27 @@
+ this.av();
+ this.r();
+@@ -340,6 +470,27 @@
protected void burnFromLava() {
if (!this.fireProof) {
this.damageEntity(DamageSource.LAVA, 4.0F);
@@ -196,7 +202,7 @@
this.setOnFire(15);
}
}
-@@ -376,6 +521,22 @@
+@@ -378,6 +529,22 @@
this.a(this.getBoundingBox().d(d0, d1, d2));
this.recalcPosition();
} else {
@@ -219,7 +225,7 @@
if (enummovetype == EnumMoveType.PISTON) {
long i = this.world.getTime();
-@@ -517,7 +678,7 @@
+@@ -505,7 +672,7 @@
}
}
@@ -227,18 +233,18 @@
+ boolean flag = this.onGround || d1 != d8 && d1 < 0.0D; // CraftBukkit - decompile error
double d11;
- if (this.P > 0.0F && flag && (d7 != d0 || d9 != d2)) {
-@@ -615,7 +776,7 @@
+ if (this.Q > 0.0F && flag && (d7 != d0 || d9 != d2)) {
+@@ -592,7 +759,7 @@
this.world.methodProfiler.a("rest");
this.recalcPosition();
this.positionChanged = d7 != d0 || d9 != d2;
-- this.B = d1 != d1;
-+ this.B = d1 != d8; // CraftBukkit - decompile error
- this.onGround = this.B && d8 < 0.0D;
- this.C = this.positionChanged || this.B;
- l = MathHelper.floor(this.locX);
-@@ -650,6 +811,28 @@
- block1.a(this.world, this);
+- this.C = d1 != d1;
++ this.C = d1 != d8; // CraftBukkit - decompile error
+ this.onGround = this.C && d8 < 0.0D;
+ this.D = this.positionChanged || this.C;
+ int k = MathHelper.floor(this.locX);
+@@ -627,6 +794,28 @@
+ block1.a((IBlockAccess) this.world, this);
}
+ // CraftBukkit start
@@ -266,7 +272,7 @@
if (this.playStepSound() && (!this.onGround || !this.isSneaking() || !(this instanceof EntityHuman)) && !this.isPassenger()) {
double d22 = this.locX - d4;
double d23 = this.locY - d5;
-@@ -685,6 +868,8 @@
+@@ -662,6 +851,8 @@
}
}
@@ -275,16 +281,16 @@
try {
this.checkBlockCollisions();
} catch (Throwable throwable) {
-@@ -694,6 +879,8 @@
+@@ -671,6 +862,8 @@
this.appendEntityCrashDetails(crashreportsystemdetails);
throw new ReportedException(crashreport);
}
+ */
+ // CraftBukkit end
- boolean flag1 = this.an();
+ boolean flag1 = this.ap();
-@@ -702,7 +889,14 @@
+@@ -679,7 +872,14 @@
if (!flag1) {
++this.fireTicks;
if (this.fireTicks == 0) {
@@ -300,7 +306,7 @@
}
}
} else if (this.fireTicks <= 0) {
-@@ -834,7 +1028,7 @@
+@@ -875,7 +1075,7 @@
return null;
}
@@ -309,7 +315,7 @@
if (!this.fireProof) {
this.damageEntity(DamageSource.FIRE, (float) i);
}
-@@ -1008,6 +1202,13 @@
+@@ -1094,6 +1294,13 @@
}
public void spawnIn(World world) {
@@ -323,7 +329,7 @@
this.world = world;
}
-@@ -1245,6 +1446,18 @@
+@@ -1318,6 +1525,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}));
@@ -342,7 +348,7 @@
nbttagcompound.set("Rotation", this.a(new float[] { this.yaw, this.pitch}));
nbttagcompound.setFloat("FallDistance", this.fallDistance);
nbttagcompound.setShort("Fire", (short) this.fireTicks);
-@@ -1254,6 +1467,12 @@
+@@ -1327,6 +1546,12 @@
nbttagcompound.setBoolean("Invulnerable", this.invulnerable);
nbttagcompound.setInt("PortalCooldown", this.portalCooldown);
nbttagcompound.a("UUID", this.getUniqueID());
@@ -352,27 +358,27 @@
+ nbttagcompound.setLong("WorldUUIDMost", this.world.getDataManager().getUUID().getMostSignificantBits());
+ nbttagcompound.setInt("Bukkit.updateLevel", CURRENT_LEVEL);
+ // CraftBukkit end
- if (this.hasCustomName()) {
- nbttagcompound.setString("CustomName", this.getCustomName());
- }
-@@ -1329,6 +1548,8 @@
- this.motX = nbttaglist1.f(0);
- this.motY = nbttaglist1.f(1);
- this.motZ = nbttaglist1.f(2);
+ IChatBaseComponent ichatbasecomponent = this.getCustomName();
+
+ if (ichatbasecomponent != null) {
+@@ -1403,6 +1628,8 @@
+ this.motX = nbttaglist1.k(0);
+ this.motY = nbttaglist1.k(1);
+ this.motZ = nbttaglist1.k(2);
+
+ /* CraftBukkit start - Moved section down
if (Math.abs(this.motX) > 10.0D) {
this.motX = 0.0D;
}
-@@ -1340,6 +1561,7 @@
+@@ -1414,6 +1641,7 @@
if (Math.abs(this.motZ) > 10.0D) {
this.motZ = 0.0D;
}
+ // CraftBukkit end */
- this.locX = nbttaglist.f(0);
- this.locY = nbttaglist.f(1);
-@@ -1397,6 +1619,57 @@
+ this.locX = nbttaglist.k(0);
+ this.locY = nbttaglist.k(1);
+@@ -1470,6 +1698,57 @@
this.setPosition(this.locX, this.locY, this.locZ);
}
@@ -430,7 +436,7 @@
} catch (Throwable throwable) {
CrashReport crashreport = CrashReport.a(throwable, "Loading entity NBT");
CrashReportSystemDetails crashreportsystemdetails = crashreport.a("Entity being loaded");
-@@ -1464,6 +1737,12 @@
+@@ -1543,6 +1822,12 @@
if (itemstack.isEmpty()) {
return null;
} else {
@@ -442,9 +448,9 @@
+ // CraftBukkit end
EntityItem entityitem = new EntityItem(this.world, this.locX, this.locY + (double) f, this.locZ, itemstack);
- entityitem.q();
-@@ -1589,6 +1868,24 @@
- if (entity.bJ() != this) {
+ entityitem.n();
+@@ -1687,6 +1972,24 @@
+ if (entity.getVehicle() != this) {
throw new IllegalStateException("Use x.startRiding(y), not y.addPassenger(x)");
} else {
+ // CraftBukkit start
@@ -465,11 +471,11 @@
+ }
+ }
+ // CraftBukkit end
- if (!this.world.isClientSide && entity instanceof EntityHuman && !(this.bE() instanceof EntityHuman)) {
+ if (!this.world.isClientSide && entity instanceof EntityHuman && !(this.bO() instanceof EntityHuman)) {
this.passengers.add(0, entity);
} else {
-@@ -1602,6 +1899,22 @@
- if (entity.bJ() == this) {
+@@ -1700,6 +2003,22 @@
+ if (entity.getVehicle() == this) {
throw new IllegalStateException("Use x.stopRiding(y), not y.removePassenger(x)");
} else {
+ // CraftBukkit start
@@ -489,20 +495,20 @@
+ }
+ // CraftBukkit end
this.passengers.remove(entity);
- entity.j = 60;
+ entity.k = 60;
}
-@@ -1741,14 +2054,49 @@
+@@ -1859,14 +2178,49 @@
}
public void setAirTicks(int i) {
-- this.datawatcher.set(Entity.aA, Integer.valueOf(i));
+- this.datawatcher.set(Entity.aD, Integer.valueOf(i));
+ // CraftBukkit start
+ EntityAirChangeEvent event = new EntityAirChangeEvent(this.getBukkitEntity(), i);
+ event.getEntity().getServer().getPluginManager().callEvent(event);
+ if (event.isCancelled()) {
+ return;
+ }
-+ this.datawatcher.set(Entity.aA, Integer.valueOf(event.getAmount()));
++ this.datawatcher.set(Entity.aD, Integer.valueOf(event.getAmount()));
+ // CraftBukkit end
}
@@ -544,10 +550,10 @@
}
}
-@@ -1893,19 +2241,76 @@
+@@ -2035,19 +2389,76 @@
if (!this.world.isClientSide && !this.dead) {
this.world.methodProfiler.a("changeDimension");
- MinecraftServer minecraftserver = this.C_();
+ MinecraftServer minecraftserver = this.bK();
- int j = this.dimension;
- WorldServer worldserver = minecraftserver.getWorldServer(j);
- WorldServer worldserver1 = minecraftserver.getWorldServer(i);
@@ -596,7 +602,7 @@
+
+ // Need to make sure the profiler state is reset afterwards (but we still want to time the call)
+ Entity entity = this.teleportTo(exit, true);
-+ this.world.methodProfiler.b();
++ this.world.methodProfiler.e();
+ return entity;
+ }
+ return null;
@@ -612,7 +618,7 @@
this.dimension = i;
+ /* CraftBukkit start - TODO: Check if we need this
if (j == 1 && i == 1) {
- worldserver1 = minecraftserver.getWorldServer(0);
+ worldserver1 = minecraftserver.a(DimensionManager.OVERWORLD);
this.dimension = 0;
}
+ // CraftBukkit end */
@@ -624,7 +630,7 @@
BlockPosition blockposition;
if (i == 1) {
-@@ -1934,12 +2339,18 @@
+@@ -2076,12 +2487,18 @@
blockposition = new BlockPosition(this);
}
@@ -636,15 +642,15 @@
+ // worldserver.entityJoinedWorld(this, false); // Handled in repositionEntity
+ // CraftBukkit end
this.world.methodProfiler.c("reloading");
- Entity entity = EntityTypes.a(this.getClass(), (World) worldserver1);
+ Entity entity = this.P().a((World) worldserver1);
if (entity != null) {
- entity.a(this);
+ entity.v(this);
+ /* CraftBukkit start - We need to do this...
if (j == 1 && i == 1) {
- BlockPosition blockposition1 = worldserver1.q(worldserver1.getSpawn());
+ BlockPosition blockposition1 = worldserver1.getHighestBlockYAt(HeightMap.Type.MOTION_BLOCKING_NO_LEAVES, worldserver1.getSpawn());
-@@ -1947,6 +2358,7 @@
+@@ -2089,6 +2506,7 @@
} else {
entity.setPositionRotation(blockposition, entity.yaw, entity.pitch);
}
@@ -652,7 +658,7 @@
boolean flag = entity.attachedToPlayer;
-@@ -1954,13 +2366,21 @@
+@@ -2096,13 +2514,21 @@
worldserver1.addEntity(entity);
entity.attachedToPlayer = flag;
worldserver1.entityJoinedWorld(entity, false);
@@ -667,27 +673,15 @@
}
this.dead = true;
- this.world.methodProfiler.b();
- worldserver.m();
- worldserver1.m();
-- this.world.methodProfiler.b();
-+ // this.world.methodProfiler.b(); // CraftBukkit: Moved up to keep balanced
+ this.world.methodProfiler.e();
+ worldserver.q_();
+ worldserver1.q_();
+- this.world.methodProfiler.e();
++ // this.world.methodProfiler.e(); // CraftBukkit: Moved up to keep balanced
return entity;
} else {
return null;
-@@ -2064,6 +2484,11 @@
- }
-
- public void setCustomName(String s) {
-+ // CraftBukkit start - Add a sane limit for name length
-+ if (s.length() > 256) {
-+ s = s.substring(0, 256);
-+ }
-+ // CraftBukkit end
- this.datawatcher.set(Entity.aB, s);
- }
-
-@@ -2121,7 +2546,26 @@
+@@ -2242,7 +2668,26 @@
}
public void a(AxisAlignedBB axisalignedbb) {
@@ -715,12 +709,3 @@
}
public float getHeadHeight() {
-@@ -2295,7 +2739,7 @@
- for (Iterator iterator = this.bF().iterator(); iterator.hasNext(); entity.a(oclass, set)) {
- entity = (Entity) iterator.next();
- if (oclass.isAssignableFrom(entity.getClass())) {
-- set.add(entity);
-+ set.add((T) entity); // CraftBukkit - decompile error
- }
- }
-
diff --git a/nms-patches/EntityAgeable.patch b/nms-patches/EntityAgeable.patch
index 5800328e..02e44b54 100644
--- a/nms-patches/EntityAgeable.patch
+++ b/nms-patches/EntityAgeable.patch
@@ -2,22 +2,22 @@
+++ b/net/minecraft/server/EntityAgeable.java
@@ -10,6 +10,7 @@
protected int c;
- private float by = -1.0F;
- private float bz;
+ private float bD = -1.0F;
+ private float bE;
+ public boolean ageLocked; // CraftBukkit
- public EntityAgeable(World world) {
- super(world);
-@@ -31,7 +32,7 @@
- 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());
- }
-@@ -110,12 +111,14 @@
+ protected EntityAgeable(EntityTypes<?> entitytypes, World world) {
+ super(entitytypes, world);
+@@ -29,7 +30,7 @@
+ 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());
+ }
+@@ -97,12 +98,14 @@
super.b(nbttagcompound);
nbttagcompound.setInt("Age", this.getAge());
nbttagcompound.setInt("ForcedAge", this.b);
@@ -32,12 +32,12 @@
}
public void a(DataWatcherObject<?> datawatcherobject) {
-@@ -128,7 +131,7 @@
+@@ -115,7 +118,7 @@
- public void n() {
- super.n();
+ public void k() {
+ super.k();
- if (this.world.isClientSide) {
+ if (this.world.isClientSide || 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]);
+ this.world.addParticle(Particles.z, 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);
diff --git a/nms-patches/EntityAnimal.patch b/nms-patches/EntityAnimal.patch
index 80469e67..a095cddf 100644
--- a/nms-patches/EntityAnimal.patch
+++ b/nms-patches/EntityAnimal.patch
@@ -1,13 +1,13 @@
--- a/net/minecraft/server/EntityAnimal.java
+++ b/net/minecraft/server/EntityAnimal.java
@@ -8,6 +8,7 @@
- protected Block bA;
- private int bx;
- private UUID by;
+ protected Block bF;
+ private int bC;
+ private UUID bD;
+ public ItemStack breedItem; // CraftBukkit - Add breedItem variable
- public EntityAnimal(World world) {
- super(world);
+ protected EntityAnimal(EntityTypes<?> entitytypes, World world) {
+ super(entitytypes, world);
@@ -41,6 +42,9 @@
}
@@ -24,11 +24,11 @@
}
+ // CraftBukkit end */
- public float a(BlockPosition blockposition) {
- return this.world.getType(blockposition.down()).getBlock() == this.bA ? 10.0F : this.world.n(blockposition) - 0.5F;
-@@ -130,6 +135,7 @@
+ public float a(BlockPosition blockposition, IWorldReader iworldreader) {
+ return iworldreader.getType(blockposition.down()).getBlock() == this.bF ? 10.0F : iworldreader.A(blockposition) - 0.5F;
+@@ -134,6 +139,7 @@
if (entityhuman != null) {
- this.by = entityhuman.getUniqueID();
+ this.bD = entityhuman.getUniqueID();
}
+ this.breedItem = entityhuman.inventory.getItemInHand(); // CraftBukkit
diff --git a/nms-patches/EntityAreaEffectCloud.patch b/nms-patches/EntityAreaEffectCloud.patch
index c5009a55..ab14a3ca 100644
--- a/nms-patches/EntityAreaEffectCloud.patch
+++ b/nms-patches/EntityAreaEffectCloud.patch
@@ -1,6 +1,6 @@
--- a/net/minecraft/server/EntityAreaEffectCloud.java
+++ b/net/minecraft/server/EntityAreaEffectCloud.java
-@@ -8,6 +8,10 @@
+@@ -10,6 +10,10 @@
import java.util.List;
import java.util.Map;
import java.util.UUID;
@@ -10,15 +10,15 @@
+
import java.util.Map.Entry;
import javax.annotation.Nullable;
-
-@@ -101,6 +105,22 @@
+ import org.apache.logging.log4j.LogManager;
+@@ -102,6 +106,22 @@
}
+ // CraftBukkit start accessor methods
+ public void refreshEffects() {
+ if (!this.hasColor) {
-+ this.getDataWatcher().set(EntityAreaEffectCloud.b, Integer.valueOf(PotionUtil.a((Collection) PotionUtil.a(this.potionRegistry, (Collection) this.effects)))); // PAIL: rename
++ this.getDataWatcher().set(EntityAreaEffectCloud.c, Integer.valueOf(PotionUtil.a((Collection) PotionUtil.a(this.potionRegistry, (Collection) this.effects)))); // PAIL: rename
+ }
+ }
+
@@ -32,9 +32,9 @@
+ // CraftBukkit end
+
public int getColor() {
- return ((Integer) this.getDataWatcher().get(EntityAreaEffectCloud.b)).intValue();
+ return ((Integer) this.getDataWatcher().get(EntityAreaEffectCloud.c)).intValue();
}
-@@ -270,6 +290,7 @@
+@@ -245,6 +265,7 @@
if (!list.isEmpty()) {
Iterator iterator2 = list.iterator();
@@ -42,7 +42,7 @@
while (iterator2.hasNext()) {
EntityLiving entityliving = (EntityLiving) iterator2.next();
-@@ -279,6 +300,17 @@
+@@ -254,6 +275,17 @@
double d2 = d0 * d0 + d1 * d1;
if (d2 <= (double) (f * f)) {
@@ -57,6 +57,6 @@
+ if (entity instanceof CraftLivingEntity) {
+ EntityLiving entityliving = ((CraftLivingEntity) entity).getHandle();
+ // CraftBukkit end
- this.at.put(entityliving, Integer.valueOf(this.ticksLived + this.reapplicationDelay));
+ this.h.put(entityliving, Integer.valueOf(this.ticksLived + this.reapplicationDelay));
Iterator iterator3 = arraylist.iterator();
diff --git a/nms-patches/EntityArmorStand.patch b/nms-patches/EntityArmorStand.patch
index 496a0925..a0f06e68 100644
--- a/nms-patches/EntityArmorStand.patch
+++ b/nms-patches/EntityArmorStand.patch
@@ -1,7 +1,7 @@
--- a/net/minecraft/server/EntityArmorStand.java
+++ b/net/minecraft/server/EntityArmorStand.java
@@ -5,6 +5,15 @@
- import java.util.List;
+ import java.util.function.Predicate;
import javax.annotation.Nullable;
+// CraftBukkit start
@@ -15,8 +15,8 @@
+
public class EntityArmorStand extends EntityLiving {
- private static final Vector3f br = new Vector3f(0.0F, 0.0F, 0.0F);
-@@ -61,6 +70,13 @@
+ private static final Vector3f bx = new Vector3f(0.0F, 0.0F, 0.0F);
+@@ -56,6 +65,13 @@
this.setPosition(d0, d1, d2);
}
@@ -30,9 +30,9 @@
public final void setSize(float f, float f1) {
double d0 = this.locX;
double d1 = this.locY;
-@@ -364,6 +380,21 @@
- if (itemstack1.isEmpty() || (this.bB & 1 << enumitemslot.c() + 8) == 0) {
- if (!itemstack1.isEmpty() || (this.bB & 1 << enumitemslot.c() + 16) == 0) {
+@@ -355,6 +371,21 @@
+ if (itemstack1.isEmpty() || (this.bH & 1 << enumitemslot.c() + 8) == 0) {
+ if (!itemstack1.isEmpty() || (this.bH & 1 << enumitemslot.c() + 16) == 0) {
ItemStack itemstack2;
+ // CraftBukkit start
+ org.bukkit.inventory.ItemStack armorStandItem = CraftItemStack.asCraftMirror(itemstack1);
@@ -52,7 +52,7 @@
if (entityhuman.abilities.canInstantlyBuild && itemstack1.isEmpty() && !itemstack.isEmpty()) {
itemstack2 = itemstack.cloneItemStack();
-@@ -385,14 +416,19 @@
+@@ -376,14 +407,19 @@
}
public boolean damageEntity(DamageSource damagesource, float f) {
@@ -66,69 +66,69 @@
- this.die();
+ this.killEntity(); // CraftBukkit - this.die() -> this.killEntity()
return false;
- } else if (!this.isInvulnerable(damagesource) && !this.bA && !this.isMarker()) {
+ } else if (!this.isInvulnerable(damagesource) && !this.bG && !this.isMarker()) {
if (damagesource.isExplosion()) {
- this.F();
+ this.D();
- this.die();
+ this.killEntity(); // CraftBukkit - this.die() -> this.killEntity()
return false;
} else if (DamageSource.FIRE.equals(damagesource)) {
if (this.isBurning()) {
-@@ -421,7 +457,7 @@
- } else if (damagesource.u()) {
- this.H();
- this.D();
+@@ -407,7 +443,7 @@
+ } else if (damagesource.v()) {
+ this.F();
+ this.A();
+- this.die();
++ this.killEntity(); // CraftBukkit - this.die() -> this.killEntity()
+ return false;
+ } else {
+ long i = this.world.getTime();
+@@ -418,7 +454,7 @@
+ } else {
+ this.B();
+ this.A();
- this.die();
+ this.killEntity(); // CraftBukkit - this.die() -> this.killEntity()
- return false;
- } else {
- long i = this.world.getTime();
-@@ -432,7 +468,7 @@
- } else {
- this.E();
- this.D();
-- this.die();
-+ this.killEntity(); // CraftBukkit - this.die() -> this.killEntity()
- }
+ }
- return false;
-@@ -460,7 +496,7 @@
+ return true;
+@@ -445,7 +481,7 @@
f1 -= f;
if (f1 <= 0.5F) {
- this.F();
+ this.D();
- this.die();
+ this.killEntity(); // CraftBukkit - this.die() -> this.killEntity()
} else {
this.setHealth(f1);
}
-@@ -468,7 +504,7 @@
+@@ -453,7 +489,7 @@
}
- private void E() {
+ private void B() {
- Block.a(this.world, new BlockPosition(this), new ItemStack(Items.ARMOR_STAND));
+ drops.add(org.bukkit.craftbukkit.inventory.CraftItemStack.asBukkitCopy(new ItemStack(Items.ARMOR_STAND))); // CraftBukkit - add to drops
- this.F();
+ this.D();
}
-@@ -481,7 +517,7 @@
- for (i = 0; i < this.by.size(); ++i) {
- itemstack = (ItemStack) this.by.get(i);
+@@ -466,7 +502,7 @@
+ for (i = 0; i < this.bE.size(); ++i) {
+ itemstack = (ItemStack) this.bE.get(i);
if (!itemstack.isEmpty()) {
- Block.a(this.world, (new BlockPosition(this)).up(), itemstack);
+ drops.add(org.bukkit.craftbukkit.inventory.CraftItemStack.asBukkitCopy(itemstack)); // CraftBukkit - add to drops
- this.by.set(i, ItemStack.a);
+ this.bE.set(i, ItemStack.a);
}
}
-@@ -489,7 +525,7 @@
- for (i = 0; i < this.bz.size(); ++i) {
- itemstack = (ItemStack) this.bz.get(i);
+@@ -474,7 +510,7 @@
+ for (i = 0; i < this.bF.size(); ++i) {
+ itemstack = (ItemStack) this.bF.get(i);
if (!itemstack.isEmpty()) {
- Block.a(this.world, (new BlockPosition(this)).up(), itemstack);
+ drops.add(org.bukkit.craftbukkit.inventory.CraftItemStack.asBukkitCopy(itemstack)); // CraftBukkit - add to drops
- this.bz.set(i, ItemStack.a);
+ this.bF.set(i, ItemStack.a);
}
}
-@@ -601,6 +637,7 @@
+@@ -586,6 +622,7 @@
}
public void killEntity() {
diff --git a/nms-patches/EntityArrow.patch b/nms-patches/EntityArrow.patch
index 3d27615c..91b2b41f 100644
--- a/nms-patches/EntityArrow.patch
+++ b/nms-patches/EntityArrow.patch
@@ -1,7 +1,7 @@
--- a/net/minecraft/server/EntityArrow.java
+++ b/net/minecraft/server/EntityArrow.java
@@ -5,6 +5,13 @@
- import java.util.List;
+ import java.util.function.Predicate;
import javax.annotation.Nullable;
+// CraftBukkit start
@@ -13,58 +13,44 @@
+
public abstract class EntityArrow extends Entity implements IProjectile {
- private static final Predicate<Entity> f = Predicates.and(new Predicate[] { IEntitySelector.e, IEntitySelector.a, new Predicate() {
-@@ -17,9 +24,9 @@
- }
- }});
- private static final DataWatcherObject<Byte> g = DataWatcher.a(EntityArrow.class, DataWatcherRegistry.a);
-- private int h;
-- private int at;
-- private int au;
-+ public int h; // PAIL: private->public
-+ public int at; // PAIL: private->public
-+ public int au; // PAIL: private->public
- private Block av;
- private int aw;
- public boolean inGround;
-@@ -50,6 +57,7 @@
- public EntityArrow(World world, EntityLiving entityliving) {
- this(world, entityliving.locX, entityliving.locY + (double) entityliving.getHeadHeight() - 0.10000000149011612D, entityliving.locZ);
+ private static final Predicate<Entity> f = IEntitySelector.e.and(IEntitySelector.a.and(Entity::isInteractable));
+@@ -42,6 +49,7 @@
+ protected EntityArrow(EntityTypes<?> entitytypes, EntityLiving entityliving, World world) {
+ this(entitytypes, entityliving.locX, entityliving.locY + (double) entityliving.getHeadHeight() - 0.10000000149011612D, entityliving.locZ, world);
this.shooter = entityliving;
+ this.projectileSource = (LivingEntity) entityliving.getBukkitEntity(); // CraftBukkit
if (entityliving instanceof EntityHuman) {
this.fromPlayer = EntityArrow.PickupStatus.ALLOWED;
}
-@@ -236,7 +244,7 @@
+@@ -245,6 +253,7 @@
+ }
protected void a(MovingObjectPosition movingobjectposition) {
- Entity entity = movingobjectposition.entity;
--
+ org.bukkit.craftbukkit.event.CraftEventFactory.callProjectileHitEvent(this, movingobjectposition); // CraftBukkit - Call event
- if (entity != null) {
- float f = MathHelper.sqrt(this.motX * this.motX + this.motY * this.motY + this.motZ * this.motZ);
- int i = MathHelper.f((double) f * this.damage);
-@@ -254,7 +262,13 @@
- }
+ if (movingobjectposition.entity != null) {
+ this.b(movingobjectposition);
+ } else {
+@@ -293,7 +302,13 @@
+ }
- if (this.isBurning() && !(entity instanceof EntityEnderman)) {
-- entity.setOnFire(5);
-+ // CraftBukkit start
-+ EntityCombustByEntityEvent combustEvent = new EntityCombustByEntityEvent(this.getBukkitEntity(), entity.getBukkitEntity(), 5);
-+ org.bukkit.Bukkit.getPluginManager().callEvent(combustEvent);
-+ if (!combustEvent.isCancelled()) {
-+ entity.setOnFire(combustEvent.getDuration());
-+ }
-+ // CraftBukkit end
- }
+ if (this.isBurning() && !(entity instanceof EntityEnderman)) {
+- entity.setOnFire(5);
++ // CraftBukkit start
++ EntityCombustByEntityEvent combustEvent = new EntityCombustByEntityEvent(this.getBukkitEntity(), entity.getBukkitEntity(), 5);
++ org.bukkit.Bukkit.getPluginManager().callEvent(combustEvent);
++ if (!combustEvent.isCancelled()) {
++ entity.setOnFire(combustEvent.getDuration());
++ }
++ // CraftBukkit end
+ }
- if (entity.damageEntity(damagesource, (float) i)) {
-@@ -422,9 +436,22 @@
+ if (entity.damageEntity(damagesource, (float) i)) {
+@@ -430,9 +445,22 @@
public void d(EntityHuman entityhuman) {
- if (!this.world.isClientSide && this.inGround && this.shake <= 0) {
+ if (!this.world.isClientSide && (this.inGround || this.p()) && this.shake <= 0) {
+ // CraftBukkit start
-+ ItemStack itemstack = this.j(); // PAIL: rename
++ ItemStack itemstack = this.getItemStack();
+ EntityItem item = new EntityItem(this.world, this.locX, this.locY, this.locZ, itemstack);
+ if (this.fromPlayer == PickupStatus.ALLOWED && entityhuman.inventory.canHold(itemstack) > 0) {
+ PlayerPickupArrowEvent event = new PlayerPickupArrowEvent((org.bukkit.entity.Player) entityhuman.getBukkitEntity(), new org.bukkit.craftbukkit.entity.CraftItem(this.world.getServer(), this, item), (org.bukkit.entity.Arrow) this.getBukkitEntity());
@@ -75,15 +61,15 @@
+ return;
+ }
+ }
- boolean flag = this.fromPlayer == EntityArrow.PickupStatus.ALLOWED || this.fromPlayer == EntityArrow.PickupStatus.CREATIVE_ONLY && entityhuman.abilities.canInstantlyBuild;
+ boolean flag = this.fromPlayer == EntityArrow.PickupStatus.ALLOWED || this.fromPlayer == EntityArrow.PickupStatus.CREATIVE_ONLY && entityhuman.abilities.canInstantlyBuild || this.p() && this.shooter == entityhuman;
-- if (this.fromPlayer == EntityArrow.PickupStatus.ALLOWED && !entityhuman.inventory.pickup(this.j())) {
+- if (this.fromPlayer == EntityArrow.PickupStatus.ALLOWED && !entityhuman.inventory.pickup(this.getItemStack())) {
+ if (this.fromPlayer == EntityArrow.PickupStatus.ALLOWED && !entityhuman.inventory.pickup(item.getItemStack())) {
+ // CraftBukkit end
flag = false;
}
-@@ -493,7 +520,14 @@
+@@ -505,7 +533,14 @@
}
if (EnchantmentManager.a(Enchantments.ARROW_FIRE, entityliving) > 0) {
diff --git a/nms-patches/EntityBoat.patch b/nms-patches/EntityBoat.patch
index e322502a..949598f6 100644
--- a/nms-patches/EntityBoat.patch
+++ b/nms-patches/EntityBoat.patch
@@ -1,6 +1,6 @@
--- a/net/minecraft/server/EntityBoat.java
+++ b/net/minecraft/server/EntityBoat.java
-@@ -5,6 +5,15 @@
+@@ -3,6 +3,15 @@
import java.util.List;
import javax.annotation.Nullable;
@@ -16,9 +16,9 @@
public class EntityBoat extends Entity {
private static final DataWatcherObject<Integer> a = DataWatcher.a(EntityBoat.class, DataWatcherRegistry.b);
-@@ -32,6 +41,14 @@
- private EntityBoat.EnumStatus aH;
- private double aI;
+@@ -37,6 +46,14 @@
+ private float aR;
+ private float aS;
+ // CraftBukkit start
+ // PAIL: Some of these haven't worked since a few updates, and since 1.9 they are less and less applicable.
@@ -29,9 +29,9 @@
+ // CraftBukkit end
+
public EntityBoat(World world) {
- super(world);
- this.f = new float[2];
-@@ -95,6 +112,19 @@
+ super(EntityTypes.BOAT, world);
+ this.h = new float[2];
+@@ -94,6 +111,19 @@
if (damagesource instanceof EntityDamageSourceIndirect && damagesource.getEntity() != null && this.w(damagesource.getEntity())) {
return false;
} else {
@@ -48,13 +48,13 @@
+ // f = event.getDamage(); // TODO Why don't we do this?
+ // CraftBukkit end
+
- this.d(-this.r());
- this.c(10);
- this.setDamage(this.p() + f * 10.0F);
-@@ -102,6 +132,15 @@
+ this.c(-this.o());
+ this.b(10);
+ this.setDamage(this.m() + f * 10.0F);
+@@ -101,6 +131,15 @@
boolean flag = damagesource.getEntity() instanceof EntityHuman && ((EntityHuman) damagesource.getEntity()).abilities.canInstantlyBuild;
- if (flag || this.p() > 40.0F) {
+ if (flag || this.m() > 40.0F) {
+ // CraftBukkit start
+ VehicleDestroyEvent destroyEvent = new VehicleDestroyEvent(vehicle, attacker);
+ this.world.getServer().getPluginManager().callEvent(destroyEvent);
@@ -65,9 +65,9 @@
+ }
+ // CraftBukkit end
if (!flag && this.world.getGameRules().getBoolean("doEntityDrops")) {
- this.a(this.j(), 1, 0.0F);
+ this.a((IMaterial) this.f());
}
-@@ -119,9 +158,25 @@
+@@ -134,9 +173,25 @@
public void collide(Entity entity) {
if (entity instanceof EntityBoat) {
if (entity.getBoundingBox().b < this.getBoundingBox().e) {
@@ -93,23 +93,15 @@
super.collide(entity);
}
-@@ -158,6 +213,7 @@
+@@ -173,6 +228,7 @@
return this.getDirection().e();
}
+ private Location lastLocation; // CraftBukkit
- public void B_() {
- this.aH = this.aG;
- this.aG = this.u();
-@@ -178,7 +234,6 @@
- if (this.p() > 0.0F) {
- this.setDamage(this.p() - 1.0F);
- }
--
- this.lastX = this.locX;
- this.lastY = this.locY;
- this.lastZ = this.locZ;
-@@ -202,6 +257,22 @@
+ public void tick() {
+ this.aM = this.aL;
+ this.aL = this.s();
+@@ -217,6 +273,22 @@
this.motZ = 0.0D;
}
@@ -129,12 +121,12 @@
+ lastLocation = vehicle.getLocation();
+ // CraftBukkit end
+
+ this.q();
+
for (int i = 0; i <= 1; ++i) {
- if (this.a(i)) {
- if (!this.isSilent() && (double) (this.f[i] % 6.2831855F) <= 0.7853981852531433D && ((double) this.f[i] + 0.39269909262657166D) % 6.2831854820251465D >= 0.7853981852531433D) {
-@@ -622,6 +693,11 @@
+@@ -737,6 +809,11 @@
- this.e(this.fallDistance, 1.0F);
+ this.c(this.fallDistance, 1.0F);
if (!this.world.isClientSide && !this.dead) {
+ // CraftBukkit start
+ Vehicle vehicle = (Vehicle) this.getBukkitEntity();
@@ -144,7 +136,7 @@
this.die();
if (this.world.getGameRules().getBoolean("doEntityDrops")) {
int i;
-@@ -635,6 +711,7 @@
+@@ -750,6 +827,7 @@
}
}
}
diff --git a/nms-patches/EntityChicken.patch b/nms-patches/EntityChicken.patch
index d98f010b..11ec20a8 100644
--- a/nms-patches/EntityChicken.patch
+++ b/nms-patches/EntityChicken.patch
@@ -1,24 +1,24 @@
--- a/net/minecraft/server/EntityChicken.java
+++ b/net/minecraft/server/EntityChicken.java
-@@ -44,6 +44,11 @@
+@@ -42,6 +42,11 @@
}
- public void n() {
+ public void k() {
+ // CraftBukkit start
+ if (this.isChickenJockey()) {
+ this.persistent = !this.isTypeNotPersistent();
+ }
+ // CraftBukkit end
- super.n();
- this.bB = this.bx;
- this.bz = this.by;
-@@ -61,7 +66,9 @@
- this.bx += this.bC * 2.0F;
- if (!this.world.isClientSide && !this.isBaby() && !this.isChickenJockey() && --this.bD <= 0) {
- this.a(SoundEffects.af, 1.0F, (this.random.nextFloat() - this.random.nextFloat()) * 0.2F + 1.0F);
+ super.k();
+ this.bG = this.bC;
+ this.bE = this.bD;
+@@ -59,7 +64,9 @@
+ this.bC += this.bH * 2.0F;
+ if (!this.world.isClientSide && !this.isBaby() && !this.isChickenJockey() && --this.bI <= 0) {
+ this.a(SoundEffects.ENTITY_CHICKEN_EGG, 1.0F, (this.random.nextFloat() - this.random.nextFloat()) * 0.2F + 1.0F);
+ this.forceDrops = true; // CraftBukkit
- this.a(Items.EGG, 1);
+ this.a((IMaterial) Items.EGG);
+ this.forceDrops = false; // CraftBukkit
- this.bD = this.random.nextInt(6000) + 6000;
+ this.bI = this.random.nextInt(6000) + 6000;
}
diff --git a/nms-patches/EntityCow.patch b/nms-patches/EntityCow.patch
index a69a0750..fda4509e 100644
--- a/nms-patches/EntityCow.patch
+++ b/nms-patches/EntityCow.patch
@@ -24,7 +24,7 @@
+ }
+
+ ItemStack result = CraftItemStack.asNMSCopy(event.getItemStack());
- entityhuman.a(SoundEffects.au, 1.0F, 1.0F);
+ entityhuman.a(SoundEffects.ENTITY_COW_MILK, 1.0F, 1.0F);
itemstack.subtract(1);
if (itemstack.isEmpty()) {
- entityhuman.a(enumhand, new ItemStack(Items.MILK_BUCKET));
diff --git a/nms-patches/EntityCreature.patch b/nms-patches/EntityCreature.patch
index 7813c998..6580470d 100644
--- a/nms-patches/EntityCreature.patch
+++ b/nms-patches/EntityCreature.patch
@@ -1,8 +1,7 @@
--- a/net/minecraft/server/EntityCreature.java
+++ b/net/minecraft/server/EntityCreature.java
-@@ -2,6 +2,10 @@
-
- import java.util.UUID;
+@@ -1,5 +1,9 @@
+ package net.minecraft.server;
+// CraftBukkit start
+import org.bukkit.event.entity.EntityUnleashEvent;
@@ -10,8 +9,8 @@
+
public abstract class EntityCreature extends EntityInsentient {
- public static final UUID bv = UUID.fromString("E199AD21-BA8A-4C53-8D13-6182D5C69D3A");
-@@ -68,6 +72,7 @@
+ private BlockPosition a;
+@@ -66,6 +70,7 @@
if (this instanceof EntityTameableAnimal && ((EntityTameableAnimal) this).isSitting()) {
if (f > 10.0F) {
@@ -19,9 +18,9 @@
this.unleash(true, true);
}
-@@ -76,6 +81,7 @@
+@@ -74,6 +79,7 @@
- this.q(f);
+ this.u(f);
if (f > 10.0F) {
+ this.world.getServer().getPluginManager().callEvent(new EntityUnleashEvent(this.getBukkitEntity(), EntityUnleashEvent.UnleashReason.DISTANCE)); // CraftBukkit
this.unleash(true, true);
diff --git a/nms-patches/EntityCreeper.patch b/nms-patches/EntityCreeper.patch
index 580aeb91..4a0912c6 100644
--- a/nms-patches/EntityCreeper.patch
+++ b/nms-patches/EntityCreeper.patch
@@ -11,18 +11,7 @@
public class EntityCreeper extends EntityMonster {
-@@ -11,8 +15,8 @@
- private static final DataWatcherObject<Boolean> c = DataWatcher.a(EntityCreeper.class, DataWatcherRegistry.h);
- private int bx;
- private int fuseTicks;
-- private int maxFuseTicks = 30;
-- private int explosionRadius = 3;
-+ public int maxFuseTicks = 30; // PAIL private -> public
-+ public int explosionRadius = 3; // PAIL private -> public
- private int bB;
-
- public EntityCreeper(World world) {
-@@ -125,7 +129,7 @@
+@@ -121,7 +125,7 @@
}
public void die(DamageSource damagesource) {
@@ -30,16 +19,16 @@
+ // super.die(damagesource); // CraftBukkit - Moved to end
if (this.world.getGameRules().getBoolean("doMobLoot")) {
if (damagesource.getEntity() instanceof EntitySkeleton) {
- int i = Item.getId(Items.RECORD_13);
-@@ -138,6 +142,7 @@
- this.a(new ItemStack(Items.SKULL, 1, 4), 0.0F);
+ this.a((IMaterial) ItemRecord.a(this.random));
+@@ -130,6 +134,7 @@
+ this.a((IMaterial) Items.CREEPER_HEAD);
}
}
+ super.die(damagesource); // CraftBukkit - Moved from above
}
-@@ -164,9 +169,19 @@
+@@ -156,9 +161,19 @@
public void onLightningStrike(EntityLightning entitylightning) {
super.onLightningStrike(entitylightning);
@@ -60,22 +49,22 @@
protected boolean a(EntityHuman entityhuman, EnumHand enumhand) {
ItemStack itemstack = entityhuman.b(enumhand);
-@@ -188,10 +203,18 @@
+@@ -180,10 +195,18 @@
boolean flag = this.world.getGameRules().getBoolean("mobGriefing");
float f = this.isPowered() ? 2.0F : 1.0F;
-- this.aU = true;
+- this.aX = true;
- this.world.explode(this, this.locX, this.locY, this.locZ, (float) this.explosionRadius * f, flag);
- this.die();
-- this.ds();
+- this.dF();
+ // CraftBukkit start
+ ExplosionPrimeEvent event = new ExplosionPrimeEvent(this.getBukkitEntity(), this.explosionRadius * f, false);
+ this.world.getServer().getPluginManager().callEvent(event);
+ if (!event.isCancelled()) {
-+ this.aU = true;
++ this.aX = true;
+ this.world.createExplosion(this, this.locX, this.locY, this.locZ, event.getRadius(), event.getFire(), flag);
+ this.die();
-+ this.ds();
++ this.dF();
+ } else {
+ fuseTicks = 0;
+ }
@@ -83,7 +72,7 @@
}
}
-@@ -202,6 +225,7 @@
+@@ -194,6 +217,7 @@
if (!collection.isEmpty()) {
EntityAreaEffectCloud entityareaeffectcloud = new EntityAreaEffectCloud(this.world, this.locX, this.locY, this.locZ);
diff --git a/nms-patches/EntityDamageSourceIndirect.patch b/nms-patches/EntityDamageSourceIndirect.patch
index 2bd5300b..9e9dd43d 100644
--- a/nms-patches/EntityDamageSourceIndirect.patch
+++ b/nms-patches/EntityDamageSourceIndirect.patch
@@ -2,7 +2,7 @@
+++ b/net/minecraft/server/EntityDamageSourceIndirect.java
@@ -29,4 +29,10 @@
- return !itemstack.isEmpty() && itemstack.hasName() && LocaleI18n.c(s1) ? new ChatMessage(s1, new Object[] { entityliving.getScoreboardDisplayName(), ichatbasecomponent, itemstack.C()}) : new ChatMessage(s, new Object[] { entityliving.getScoreboardDisplayName(), ichatbasecomponent});
+ return !itemstack.isEmpty() && itemstack.hasName() ? new ChatMessage(s1, new Object[] { entityliving.getScoreboardDisplayName(), ichatbasecomponent, itemstack.A()}) : new ChatMessage(s, new Object[] { entityliving.getScoreboardDisplayName(), ichatbasecomponent});
}
+
+ // CraftBukkit start
diff --git a/nms-patches/EntityEgg.patch b/nms-patches/EntityEgg.patch
index 314bd2fe..3d0192eb 100644
--- a/nms-patches/EntityEgg.patch
+++ b/nms-patches/EntityEgg.patch
@@ -13,7 +13,7 @@
public class EntityEgg extends EntityProjectile {
public EntityEgg(World world) {
-@@ -24,20 +31,40 @@
+@@ -20,20 +27,40 @@
}
if (!this.world.isClientSide) {
diff --git a/nms-patches/EntityEnderCrystal.patch b/nms-patches/EntityEnderCrystal.patch
index e8fe828c..81245d86 100644
--- a/nms-patches/EntityEnderCrystal.patch
+++ b/nms-patches/EntityEnderCrystal.patch
@@ -1,7 +1,7 @@
--- a/net/minecraft/server/EntityEnderCrystal.java
+++ b/net/minecraft/server/EntityEnderCrystal.java
@@ -3,6 +3,11 @@
- import com.google.common.base.Optional;
+ import java.util.Optional;
import javax.annotation.Nullable;
+// CraftBukkit start
@@ -11,14 +11,14 @@
+
public class EntityEnderCrystal extends Entity {
- private static final DataWatcherObject<Optional<BlockPosition>> b = DataWatcher.a(EntityEnderCrystal.class, DataWatcherRegistry.k);
+ private static final DataWatcherObject<Optional<BlockPosition>> b = DataWatcher.a(EntityEnderCrystal.class, DataWatcherRegistry.m);
@@ -39,7 +44,11 @@
BlockPosition blockposition = new BlockPosition(this);
- if (this.world.worldProvider instanceof WorldProviderTheEnd && this.world.getType(blockposition).getBlock() != Blocks.FIRE) {
+ if (this.world.worldProvider instanceof WorldProviderTheEnd && this.world.getType(blockposition).isAir()) {
- this.world.setTypeUpdate(blockposition, Blocks.FIRE.getBlockData());
+ // CraftBukkit start
-+ if (!CraftEventFactory.callBlockIgniteEvent(this.world, blockposition.getX(), blockposition.getY(), blockposition.getZ(), this).isCancelled()) {
++ if (!CraftEventFactory.callBlockIgniteEvent(this.world, blockposition, this).isCancelled()) {
+ this.world.setTypeUpdate(blockposition, Blocks.FIRE.getBlockData());
+ }
+ // CraftBukkit end
diff --git a/nms-patches/EntityEnderDragon.patch b/nms-patches/EntityEnderDragon.patch
index 6bfae174..8c1b4cde 100644
--- a/nms-patches/EntityEnderDragon.patch
+++ b/nms-patches/EntityEnderDragon.patch
@@ -12,16 +12,16 @@
+// PAIL: Fixme
public class EntityEnderDragon extends EntityInsentient implements IComplex, IMonster {
- private static final Logger bJ = LogManager.getLogger();
+ private static final Logger bQ = LogManager.getLogger();
@@ -33,6 +38,7 @@
- private final PathPoint[] bO = new PathPoint[24];
- private final int[] bP = new int[24];
- private final Path bQ = new Path();
+ private final PathPoint[] bV = new PathPoint[24];
+ private final int[] bW = new int[24];
+ private final Path bX = new Path();
+ 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);
-@@ -171,7 +177,7 @@
+ super(EntityTypes.ENDER_DRAGON, world);
+@@ -170,7 +176,7 @@
Vec3D vec3d = idragoncontroller.g();
@@ -30,7 +30,7 @@
d0 = vec3d.x - this.locX;
d1 = vec3d.y - this.locY;
d2 = vec3d.z - this.locZ;
-@@ -327,7 +333,14 @@
+@@ -326,7 +332,14 @@
if (this.currentEnderCrystal.dead) {
this.currentEnderCrystal = null;
} else if (this.ticksLived % 10 == 0 && this.getHealth() < this.getMaxHealth()) {
@@ -46,7 +46,7 @@
}
}
-@@ -400,6 +413,10 @@
+@@ -399,6 +412,10 @@
int j1 = MathHelper.floor(axisalignedbb.f);
boolean flag = false;
boolean flag1 = false;
@@ -57,10 +57,10 @@
for (int k1 = i; k1 <= l; ++k1) {
for (int l1 = j; l1 <= i1; ++l1) {
-@@ -413,7 +430,11 @@
+@@ -412,7 +429,11 @@
flag = true;
} else if (block != Blocks.BARRIER && block != Blocks.OBSIDIAN && block != Blocks.END_STONE && block != Blocks.BEDROCK && block != Blocks.END_PORTAL && block != Blocks.END_PORTAL_FRAME) {
- if (block != Blocks.COMMAND_BLOCK && block != Blocks.dc && block != Blocks.dd && block != Blocks.IRON_BARS && block != Blocks.END_GATEWAY) {
+ if (block != Blocks.COMMAND_BLOCK && block != Blocks.REPEATING_COMMAND_BLOCK && block != Blocks.CHAIN_COMMAND_BLOCK && block != Blocks.IRON_BARS && block != Blocks.END_GATEWAY) {
- flag1 = this.world.setAir(blockposition) || flag1;
+ // CraftBukkit start - Add blocks to list rather than destroying them
+ // flag1 = this.world.setAir(blockposition) || flag1;
@@ -70,7 +70,7 @@
} else {
flag = true;
}
-@@ -425,6 +446,41 @@
+@@ -424,6 +445,42 @@
}
}
@@ -100,7 +100,8 @@
+
+ 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);
++ BlockPosition pos = new BlockPosition(blockX, blockY, blockZ);
++ nmsBlock.dropNaturally(world.getType(pos), world, pos, event.getYield(), 0);
+ }
+ nmsBlock.wasExploded(world, new BlockPosition(blockX, blockY, blockZ), explosionSource);
+
diff --git a/nms-patches/EntityEnderPearl.patch b/nms-patches/EntityEnderPearl.patch
index d61d7c67..9f8b18a9 100644
--- a/nms-patches/EntityEnderPearl.patch
+++ b/nms-patches/EntityEnderPearl.patch
@@ -13,7 +13,7 @@
public class EntityEnderPearl extends EntityProjectile {
-@@ -61,21 +67,35 @@
+@@ -57,21 +63,35 @@
EntityPlayer entityplayer = (EntityPlayer) entityliving;
if (entityplayer.playerConnection.a().isConnected() && entityplayer.world == this.world && !entityplayer.isSleeping()) {
diff --git a/nms-patches/EntityEnderSignal.patch b/nms-patches/EntityEnderSignal.patch
deleted file mode 100644
index b611b974..00000000
--- a/nms-patches/EntityEnderSignal.patch
+++ /dev/null
@@ -1,19 +0,0 @@
---- a/net/minecraft/server/EntityEnderSignal.java
-+++ b/net/minecraft/server/EntityEnderSignal.java
-@@ -2,11 +2,11 @@
-
- public class EntityEnderSignal extends Entity {
-
-- private double a;
-- private double b;
-- private double c;
-- private int d;
-- private boolean e;
-+ public double a; // CraftBukkit private -> public // PAIL rename targetX
-+ public double b; // CraftBukkit private -> public // PAIL rename targetY
-+ public double c; // CraftBukkit private -> public // PAIL rename targetZ
-+ public int d; // CraftBukkit private -> public // PAIL rename despawnTimer
-+ public boolean e; // CraftBukkit private -> public // PAIL rename shouldDropItem
-
- public EntityEnderSignal(World world) {
- super(world);
diff --git a/nms-patches/EntityEnderman.patch b/nms-patches/EntityEnderman.patch
index dc6ad778..fdfcc0f5 100644
--- a/nms-patches/EntityEnderman.patch
+++ b/nms-patches/EntityEnderman.patch
@@ -1,21 +1,28 @@
--- a/net/minecraft/server/EntityEnderman.java
+++ b/net/minecraft/server/EntityEnderman.java
-@@ -4,6 +4,8 @@
- import com.google.common.base.Optional;
- import com.google.common.base.Predicate;
- import com.google.common.collect.Sets;
-+import org.bukkit.event.entity.EntityTargetEvent;
-+
- import java.util.Random;
- import java.util.Set;
- import java.util.UUID;
-@@ -56,7 +58,17 @@
+@@ -33,7 +33,14 @@
+ this.goalSelector.a(11, new EntityEnderman.PathfinderGoalEndermanPickupBlock(this));
+ this.targetSelector.a(1, new EntityEnderman.PathfinderGoalPlayerWhoLookedAtTarget(this));
+ this.targetSelector.a(2, new PathfinderGoalHurtByTarget(this, false, new Class[0]));
+- this.targetSelector.a(3, new PathfinderGoalNearestAttackableTarget(this, EntityEndermite.class, 10, true, false, EntityEndermite::l));
++ // CraftBukkit - decompile error
++ this.targetSelector.a(3, new PathfinderGoalNearestAttackableTarget(this, EntityEndermite.class, 10, true, false, new Predicate<EntityEndermite>() {
++ @Override
++ public boolean test(EntityEndermite entityendermite) {
++ return entityendermite.l();
++ }
++ }));
++ // CraftBukkit end
+ }
+
+ protected void initAttributes() {
+@@ -45,7 +52,17 @@
}
public void setGoalTarget(@Nullable EntityLiving entityliving) {
- super.setGoalTarget(entityliving);
+ // CraftBukkit start - fire event
-+ setGoalTarget(entityliving, EntityTargetEvent.TargetReason.UNKNOWN, true);
++ setGoalTarget(entityliving, org.bukkit.event.entity.EntityTargetEvent.TargetReason.UNKNOWN, true);
+ }
+
+ @Override
@@ -28,7 +35,7 @@
AttributeInstance attributeinstance = this.getAttributeInstance(GenericAttributes.MOVEMENT_SPEED);
if (entityliving == null) {
-@@ -70,6 +82,7 @@
+@@ -59,6 +76,7 @@
attributeinstance.b(EntityEnderman.b);
}
}
@@ -36,14 +43,14 @@
}
-@@ -317,8 +330,12 @@
+@@ -277,8 +295,12 @@
boolean flag = movingobjectposition != null && movingobjectposition.a().equals(blockposition);
- if (EntityEnderman.c.contains(block) && flag) {
+ if (block.a(TagsBlock.G) && flag) {
- this.enderman.setCarried(iblockdata);
- world.setAir(blockposition);
+ // 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()) {
++ if (!org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(this.enderman, blockposition, Blocks.AIR.getBlockData()).isCancelled()) {
+ this.enderman.setCarried(iblockdata);
+ world.setAir(blockposition);
+ }
@@ -51,12 +58,12 @@
}
}
-@@ -348,8 +365,12 @@
+@@ -308,8 +330,12 @@
IBlockData iblockdata2 = this.a.getCarried();
- if (iblockdata2 != null && this.a(world, blockposition, iblockdata2.getBlock(), iblockdata, iblockdata1)) {
+ if (iblockdata2 != null && this.a(world, blockposition, iblockdata2, iblockdata, iblockdata1)) {
+ // CraftBukkit start - Place event
-+ if (!org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(this.a, blockposition, this.a.getCarried().getBlock(), this.a.getCarried().getBlock().toLegacyData(this.a.getCarried())).isCancelled()) {
++ if (!org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(this.a, blockposition, iblockdata2).isCancelled()) {
world.setTypeAndData(blockposition, iblockdata2, 3);
this.a.setCarried((IBlockData) null);
+ }
diff --git a/nms-patches/EntityEvokerFangs.patch b/nms-patches/EntityEvokerFangs.patch
index 0e392ed5..b90581a8 100644
--- a/nms-patches/EntityEvokerFangs.patch
+++ b/nms-patches/EntityEvokerFangs.patch
@@ -2,7 +2,7 @@
+++ b/net/minecraft/server/EntityEvokerFangs.java
@@ -108,7 +108,9 @@
- if (entityliving.isAlive() && !entityliving.be() && entityliving != entityliving1) {
+ if (entityliving.isAlive() && !entityliving.bl() && entityliving != entityliving1) {
if (entityliving1 == null) {
+ org.bukkit.craftbukkit.event.CraftEventFactory.entityDamage = this; // CraftBukkit
entityliving.damageEntity(DamageSource.MAGIC, 6.0F);
diff --git a/nms-patches/EntityExperienceOrb.patch b/nms-patches/EntityExperienceOrb.patch
index bd249662..050cf6e0 100644
--- a/nms-patches/EntityExperienceOrb.patch
+++ b/nms-patches/EntityExperienceOrb.patch
@@ -14,13 +14,13 @@
public int a;
@@ -34,6 +40,7 @@
- public void B_() {
- super.B_();
+ public void tick() {
+ super.tick();
+ EntityHuman prevTarget = this.targetPlayer;// CraftBukkit - store old target
if (this.c > 0) {
--this.c;
}
-@@ -68,6 +75,16 @@
+@@ -70,6 +77,16 @@
}
if (this.targetPlayer != null) {
@@ -37,7 +37,7 @@
double d1 = (this.targetPlayer.locX - this.locX) / 8.0D;
double d2 = (this.targetPlayer.locY + (double) this.targetPlayer.getHeadHeight() / 2.0D - this.locY) / 8.0D;
double d3 = (this.targetPlayer.locZ - this.locZ) / 8.0D;
-@@ -80,6 +97,8 @@
+@@ -82,6 +99,8 @@
this.motY += d2 / d4 * d5 * 0.1D;
this.motZ += d3 / d4 * d5 * 0.1D;
}
@@ -46,22 +46,21 @@
}
this.move(EnumMoveType.SELF, this.motX, this.motY, this.motZ);
-@@ -148,12 +167,18 @@
- if (!itemstack.isEmpty() && itemstack.h()) {
- int i = Math.min(this.d(this.value), itemstack.i());
+@@ -155,12 +174,18 @@
+ if (!itemstack.isEmpty() && itemstack.f()) {
+ int i = Math.min(this.c(this.value), itemstack.getDamage());
-- this.value -= this.c(i);
-- itemstack.setData(itemstack.i() - i);
-- }
+- this.value -= this.b(i);
+- itemstack.setDamage(itemstack.getDamage() - i);
+ // CraftBukkit start
+ org.bukkit.event.player.PlayerItemMendEvent event = CraftEventFactory.callPlayerItemMendEvent(entityhuman, this, itemstack, i);
+ i = event.getRepairAmount();
+ if (!event.isCancelled()) {
-+ this.value -= this.c(i);
-+ itemstack.setData(itemstack.i() - i);
++ this.value -= this.b(i);
++ itemstack.setDamage(itemstack.getDamage() - i);
+ }
+ // CraftBukkit end
-+ }
+ }
if (this.value > 0) {
- entityhuman.giveExp(this.value);
@@ -69,7 +68,7 @@
}
this.die();
-@@ -175,6 +200,24 @@
+@@ -182,6 +207,24 @@
}
public static int getOrbValue(int i) {
diff --git a/nms-patches/EntityFallingBlock.patch b/nms-patches/EntityFallingBlock.patch
index afdb8dbb..c09b0e5f 100644
--- a/nms-patches/EntityFallingBlock.patch
+++ b/nms-patches/EntityFallingBlock.patch
@@ -1,40 +1,40 @@
--- a/net/minecraft/server/EntityFallingBlock.java
+++ b/net/minecraft/server/EntityFallingBlock.java
-@@ -5,6 +5,8 @@
+@@ -4,6 +4,8 @@
+ import java.util.ArrayList;
import java.util.Iterator;
- import javax.annotation.Nullable;
+import org.bukkit.craftbukkit.event.CraftEventFactory; // CraftBukkit
+
public class EntityFallingBlock extends Entity {
private IBlockData block;
-@@ -69,7 +71,7 @@
+@@ -71,7 +73,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, Blocks.AIR, 0).isCancelled()) {
++ if (this.world.getType(blockposition).getBlock() == block && !CraftEventFactory.callEntityChangeBlockEvent(this, blockposition, Blocks.AIR.getBlockData()).isCancelled()) {
this.world.setAir(blockposition);
} else if (!this.world.isClientSide) {
this.die();
-@@ -110,7 +112,7 @@
+@@ -112,7 +114,7 @@
- if (!flag1 && BlockFalling.x(this.world.getType(new BlockPosition(this.locX, this.locY - 0.009999999776482582D, this.locZ)))) {
+ if (!flag1 && BlockFalling.j(this.world.getType(new BlockPosition(this.locX, this.locY - 0.009999999776482582D, this.locZ)))) {
this.onGround = false;
- return;
+ // return; // CraftBukkit
}
this.motX *= 0.699999988079071D;
-@@ -119,7 +121,13 @@
- if (iblockdata.getBlock() != Blocks.PISTON_EXTENSION) {
+@@ -121,7 +123,13 @@
+ if (iblockdata.getBlock() != Blocks.MOVING_PISTON) {
this.die();
if (!this.f) {
-- if (this.world.a(block, blockposition, true, EnumDirection.UP, (Entity) null) && (flag1 || !BlockFalling.x(this.world.getType(blockposition.down()))) && this.world.setTypeAndData(blockposition, this.block, 3)) {
+- if (iblockdata.getMaterial().isReplaceable() && (flag1 || !BlockFalling.j(this.world.getType(blockposition.down()))) && this.world.setTypeAndData(blockposition, this.block, 3)) {
+ // CraftBukkit start
-+ if (this.world.a(block, blockposition, true, EnumDirection.UP, (Entity) null) && (flag1 || !BlockFalling.x(this.world.getType(blockposition.down())))) {
-+ if (CraftEventFactory.callEntityChangeBlockEvent(this, blockposition, this.block.getBlock(), this.block.getBlock().toLegacyData(this.block)).isCancelled()) {
++ if (iblockdata.getMaterial().isReplaceable() && (flag1 || !BlockFalling.j(this.world.getType(blockposition.down())))) {
++ if (CraftEventFactory.callEntityChangeBlockEvent(this, blockposition, this.block).isCancelled()) {
+ return;
+ }
+ this.world.setTypeAndData(blockposition, this.block, 3);
diff --git a/nms-patches/EntityFireball.patch b/nms-patches/EntityFireball.patch
index e9e26fd1..b236dc4b 100644
--- a/nms-patches/EntityFireball.patch
+++ b/nms-patches/EntityFireball.patch
@@ -15,14 +15,13 @@
+ public float bukkitYield = 1; // CraftBukkit
+ public boolean isIncendiary = true; // CraftBukkit
- public EntityFireball(World world) {
- super(world);
-@@ -31,12 +35,19 @@
- public EntityFireball(World world, EntityLiving entityliving, double d0, double d1, double d2) {
- super(world);
+ protected EntityFireball(EntityTypes<?> entitytypes, World world, float f, float f1) {
+ super(entitytypes, world);
+@@ -28,11 +32,18 @@
+ public EntityFireball(EntityTypes<?> entitytypes, EntityLiving entityliving, double d0, double d1, double d2, World world, float f, float f1) {
+ this(entitytypes, world, f, f1);
this.shooter = entityliving;
+ this.projectileSource = (org.bukkit.entity.LivingEntity) entityliving.getBukkitEntity(); // CraftBukkit
- this.setSize(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 = 0.0D;
@@ -37,7 +36,7 @@
d0 += this.random.nextGaussian() * 0.4D;
d1 += this.random.nextGaussian() * 0.4D;
d2 += this.random.nextGaussian() * 0.4D;
-@@ -61,6 +72,12 @@
+@@ -59,6 +70,12 @@
if (movingobjectposition != null) {
this.a(movingobjectposition);
@@ -50,19 +49,19 @@
}
this.locX += this.motX;
-@@ -150,6 +167,11 @@
+@@ -146,6 +163,11 @@
} else {
- this.ax();
+ this.aA();
if (damagesource.getEntity() != null) {
+ // CraftBukkit start
+ if (CraftEventFactory.handleNonLivingEntityDamageEvent(this, damagesource, f)) {
+ return false;
+ }
+ // CraftBukkit end
- Vec3D vec3d = damagesource.getEntity().aJ();
+ Vec3D vec3d = damagesource.getEntity().aN();
if (vec3d != null) {
-@@ -163,6 +185,7 @@
+@@ -159,6 +181,7 @@
if (damagesource.getEntity() instanceof EntityLiving) {
this.shooter = (EntityLiving) damagesource.getEntity();
diff --git a/nms-patches/EntityFireworks.patch b/nms-patches/EntityFireworks.patch
index 99fc74ae..a0176143 100644
--- a/nms-patches/EntityFireworks.patch
+++ b/nms-patches/EntityFireworks.patch
@@ -8,37 +8,37 @@
public class EntityFireworks extends Entity {
-@@ -117,8 +118,12 @@
+@@ -114,8 +115,12 @@
}
if (!this.world.isClientSide && this.ticksFlown > this.expectedLifespan) {
- this.world.broadcastEntityEffect(this, (byte) 17);
-- this.k();
+- this.i();
+ // CraftBukkit start
+ if (!org.bukkit.craftbukkit.event.CraftEventFactory.callFireworkExplodeEvent(this).isCancelled()) {
+ this.world.broadcastEntityEffect(this, (byte) 17);
-+ this.k();
++ this.i();
+ }
+ // CraftBukkit end
this.die();
}
-@@ -136,7 +141,9 @@
+@@ -133,7 +138,9 @@
if (f > 0.0F) {
if (this.e != null) {
+ CraftEventFactory.entityDamage = this; // CraftBukkit
- this.e.damageEntity(DamageSource.t, (float) (5 + nbttaglist.size() * 2));
+ this.e.damageEntity(DamageSource.FIREWORKS, (float) (5 + nbttaglist.size() * 2));
+ CraftEventFactory.entityDamage = null; // CraftBukkit
}
double d0 = 5.0D;
-@@ -162,7 +169,9 @@
+@@ -159,7 +166,9 @@
if (flag) {
float f1 = f * (float) Math.sqrt((5.0D - (double) this.g(entityliving)) / 5.0D);
+ CraftEventFactory.entityDamage = this; // CraftBukkit
- entityliving.damageEntity(DamageSource.t, f1);
+ entityliving.damageEntity(DamageSource.FIREWORKS, f1);
+ CraftEventFactory.entityDamage = null; // CraftBukkit
}
}
diff --git a/nms-patches/EntityFishingHook.patch b/nms-patches/EntityFishingHook.patch
index bcad37d4..10a8f121 100644
--- a/nms-patches/EntityFishingHook.patch
+++ b/nms-patches/EntityFishingHook.patch
@@ -1,71 +1,71 @@
--- a/net/minecraft/server/EntityFishingHook.java
+++ b/net/minecraft/server/EntityFishingHook.java
-@@ -2,6 +2,11 @@
-
+@@ -3,6 +3,11 @@
+ import java.util.Collections;
import java.util.Iterator;
import java.util.List;
+// CraftBukkit start
+import org.bukkit.entity.Player;
-+import org.bukkit.entity.Fish;
++import org.bukkit.entity.FishHook;
+import org.bukkit.event.player.PlayerFishEvent;
+// CraftBukkit end
public class EntityFishingHook extends Entity {
-@@ -261,6 +266,7 @@
+@@ -266,6 +271,7 @@
}
if (movingobjectposition != null && movingobjectposition.type != MovingObjectPosition.EnumMovingObjectType.MISS) {
+ org.bukkit.craftbukkit.event.CraftEventFactory.callProjectileHitEvent(this, movingobjectposition); // Craftbukkit - Call event
if (movingobjectposition.type == MovingObjectPosition.EnumMovingObjectType.ENTITY) {
this.hooked = movingobjectposition.entity;
- this.s();
-@@ -293,6 +299,10 @@
+ this.o();
+@@ -298,6 +304,10 @@
if (this.g <= 0) {
this.h = 0;
- this.at = 0;
+ this.aw = 0;
+ // CraftBukkit start
-+ PlayerFishEvent playerFishEvent = new PlayerFishEvent((Player) this.owner.getBukkitEntity(), null, (Fish) this.getBukkitEntity(), PlayerFishEvent.State.FAILED_ATTEMPT);
++ PlayerFishEvent playerFishEvent = new PlayerFishEvent((Player) this.owner.getBukkitEntity(), null, (FishHook) this.getBukkitEntity(), PlayerFishEvent.State.FAILED_ATTEMPT);
+ this.world.getServer().getPluginManager().callEvent(playerFishEvent);
+ // CraftBukkit end
} else {
this.motY -= 0.2D * (double) this.random.nextFloat() * (double) this.random.nextFloat();
}
-@@ -328,6 +338,13 @@
- worldserver.a(EnumParticle.WATER_WAKE, d0, d1, d2, 0, (double) (-f4), 0.01D, (double) f3, 1.0D, new int[0]);
+@@ -333,6 +343,13 @@
+ worldserver.a(Particles.x, d0, d1, d2, 0, (double) (-f4), 0.01D, (double) f3, 1.0D);
}
} else {
+ // CraftBukkit start
-+ PlayerFishEvent playerFishEvent = new PlayerFishEvent((Player) this.owner.getBukkitEntity(), null, (Fish) this.getBukkitEntity(), PlayerFishEvent.State.BITE);
++ PlayerFishEvent playerFishEvent = new PlayerFishEvent((Player) this.owner.getBukkitEntity(), null, (FishHook) this.getBukkitEntity(), PlayerFishEvent.State.BITE);
+ this.world.getServer().getPluginManager().callEvent(playerFishEvent);
+ if (playerFishEvent.isCancelled()) {
+ return;
+ }
+ // CraftBukkit end
this.motY = (double) (-0.4F * MathHelper.a(this.random, 0.6F, 1.0F));
- this.a(SoundEffects.K, 0.25F, 1.0F + (this.random.nextFloat() - this.random.nextFloat()) * 0.4F);
+ this.a(SoundEffects.ENTITY_FISHING_BOBBER_SPLASH, 0.25F, 1.0F + (this.random.nextFloat() - this.random.nextFloat()) * 0.4F);
double d3 = this.getBoundingBox().b + 0.5D;
-@@ -384,6 +401,14 @@
+@@ -389,6 +406,14 @@
int i = 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);
++ PlayerFishEvent playerFishEvent = new PlayerFishEvent((Player) this.owner.getBukkitEntity(), this.hooked.getBukkitEntity(), (FishHook) this.getBukkitEntity(), PlayerFishEvent.State.CAUGHT_ENTITY);
+ this.world.getServer().getPluginManager().callEvent(playerFishEvent);
+
+ if (playerFishEvent.isCancelled()) {
+ return 0;
+ }
+ // CraftBukkit end
- this.k();
+ this.f();
+ CriterionTriggers.D.a((EntityPlayer) this.owner, itemstack, this, Collections.emptyList());
this.world.broadcastEntityEffect(this, (byte) 31);
- i = this.hooked instanceof EntityItem ? 3 : 5;
-@@ -396,6 +421,15 @@
+@@ -405,6 +430,15 @@
while (iterator.hasNext()) {
- ItemStack itemstack = (ItemStack) iterator.next();
- EntityItem entityitem = new EntityItem(this.world, this.locX, this.locY, this.locZ, itemstack);
+ ItemStack itemstack1 = (ItemStack) iterator.next();
+ EntityItem entityitem = new EntityItem(this.world, this.locX, this.locY, this.locZ, itemstack1);
+ // CraftBukkit start
-+ PlayerFishEvent playerFishEvent = new PlayerFishEvent((Player) this.owner.getBukkitEntity(), entityitem.getBukkitEntity(), (Fish) this.getBukkitEntity(), PlayerFishEvent.State.CAUGHT_FISH);
++ PlayerFishEvent playerFishEvent = new PlayerFishEvent((Player) this.owner.getBukkitEntity(), entityitem.getBukkitEntity(), (FishHook) this.getBukkitEntity(), PlayerFishEvent.State.CAUGHT_FISH);
+ playerFishEvent.setExpToDrop(this.random.nextInt(6) + 1);
+ this.world.getServer().getPluginManager().callEvent(playerFishEvent);
+
@@ -76,7 +76,7 @@
double d0 = this.owner.locX - this.locX;
double d1 = this.owner.locY - this.locY;
double d2 = this.owner.locZ - this.locZ;
-@@ -406,7 +440,11 @@
+@@ -415,7 +449,11 @@
entityitem.motY = d1 * 0.1D + (double) MathHelper.sqrt(d3) * 0.08D;
entityitem.motZ = d2 * 0.1D;
this.world.addEntity(entityitem);
@@ -86,15 +86,15 @@
+ this.owner.world.addEntity(new EntityExperienceOrb(this.owner.world, this.owner.locX, this.owner.locY + 0.5D, this.owner.locZ + 0.5D, playerFishEvent.getExpToDrop()));
+ }
+ // CraftBukkit end
- Item item = itemstack.getItem();
-
- if (item == Items.FISH || item == Items.COOKED_FISH) {
-@@ -418,8 +456,25 @@
+ if (itemstack1.getItem().a(TagsItem.G)) {
+ this.owner.a(StatisticList.FISH_CAUGHT, 1);
+ }
+@@ -425,8 +463,25 @@
}
if (this.isInGround) {
+ // CraftBukkit start
-+ PlayerFishEvent playerFishEvent = new PlayerFishEvent((Player) this.owner.getBukkitEntity(), null, (Fish) this.getBukkitEntity(), PlayerFishEvent.State.IN_GROUND);
++ PlayerFishEvent playerFishEvent = new PlayerFishEvent((Player) this.owner.getBukkitEntity(), null, (FishHook) this.getBukkitEntity(), PlayerFishEvent.State.IN_GROUND);
+ this.world.getServer().getPluginManager().callEvent(playerFishEvent);
+
+ if (playerFishEvent.isCancelled()) {
@@ -105,7 +105,7 @@
}
+ // CraftBukkit start
+ if (i == 0) {
-+ PlayerFishEvent playerFishEvent = new PlayerFishEvent((Player) this.owner.getBukkitEntity(), null, (Fish) this.getBukkitEntity(), PlayerFishEvent.State.FAILED_ATTEMPT);
++ PlayerFishEvent playerFishEvent = new PlayerFishEvent((Player) this.owner.getBukkitEntity(), null, (FishHook) this.getBukkitEntity(), PlayerFishEvent.State.FAILED_ATTEMPT);
+ this.world.getServer().getPluginManager().callEvent(playerFishEvent);
+ if (playerFishEvent.isCancelled()) {
+ return 0;
diff --git a/nms-patches/EntityGhast.patch b/nms-patches/EntityGhast.patch
index e4a07c97..8e11962a 100644
--- a/nms-patches/EntityGhast.patch
+++ b/nms-patches/EntityGhast.patch
@@ -1,6 +1,6 @@
--- a/net/minecraft/server/EntityGhast.java
+++ b/net/minecraft/server/EntityGhast.java
-@@ -158,7 +158,8 @@
+@@ -154,7 +154,8 @@
world.a((EntityHuman) null, 1016, new BlockPosition(this.ghast), 0);
EntityLargeFireball entitylargefireball = new EntityLargeFireball(world, this.ghast, d2, d3, d4);
diff --git a/nms-patches/EntityHanging.patch b/nms-patches/EntityHanging.patch
index 1c6ff302..83063756 100644
--- a/nms-patches/EntityHanging.patch
+++ b/nms-patches/EntityHanging.patch
@@ -12,8 +12,8 @@
+
public abstract class EntityHanging extends Entity {
- private static final Predicate<Entity> c = new Predicate() {
-@@ -41,43 +47,52 @@
+ protected static final Predicate<Entity> a = (entity) -> {
+@@ -35,43 +41,52 @@
this.updateBoundingBox();
}
@@ -98,7 +98,7 @@
return i % 32 == 0 ? 0.5D : 0.0D;
}
-@@ -88,6 +103,24 @@
+@@ -82,6 +97,24 @@
if (this.d++ == 100 && !this.world.isClientSide) {
this.d = 0;
if (!this.dead && !this.survives()) {
@@ -123,7 +123,7 @@
this.die();
this.a((Entity) null);
}
-@@ -140,6 +173,21 @@
+@@ -134,6 +167,21 @@
return false;
} else {
if (!this.dead && !this.world.isClientSide) {
@@ -143,9 +143,9 @@
+ // CraftBukkit end
+
this.die();
- this.ax();
+ this.aA();
this.a(damagesource.getEntity());
-@@ -151,6 +199,18 @@
+@@ -145,6 +193,18 @@
public void move(EnumMoveType enummovetype, double d0, double d1, double d2) {
if (!this.world.isClientSide && !this.dead && d0 * d0 + d1 * d1 + d2 * d2 > 0.0D) {
@@ -164,7 +164,7 @@
this.die();
this.a((Entity) null);
}
-@@ -158,7 +218,7 @@
+@@ -152,7 +212,7 @@
}
public void f(double d0, double d1, double d2) {
diff --git a/nms-patches/EntityHorseAbstract.patch b/nms-patches/EntityHorseAbstract.patch
index 58896b49..f4b2eeda 100644
--- a/nms-patches/EntityHorseAbstract.patch
+++ b/nms-patches/EntityHorseAbstract.patch
@@ -1,31 +1,31 @@
--- a/net/minecraft/server/EntityHorseAbstract.java
+++ b/net/minecraft/server/EntityHorseAbstract.java
@@ -6,6 +6,7 @@
- import java.util.List;
import java.util.UUID;
+ import java.util.function.Predicate;
import javax.annotation.Nullable;
+import org.bukkit.event.entity.EntityRegainHealthEvent.RegainReason; // CraftBukkit
public abstract class EntityHorseAbstract extends EntityAnimal implements IInventoryListener, IJumpable {
-@@ -39,6 +40,7 @@
- private float bT;
- protected boolean bF = true;
- protected int bG;
+@@ -33,6 +34,7 @@
+ private float bY;
+ protected boolean bK = true;
+ protected int bL;
+ public int maxDomestication = 100; // CraftBukkit - store max domestication value
- public EntityHorseAbstract(World world) {
- super(world);
-@@ -214,7 +216,7 @@
+ protected EntityHorseAbstract(EntityTypes<?> entitytypes, World world) {
+ super(entitytypes, world);
+@@ -212,7 +214,7 @@
public void loadChest() {
InventoryHorseChest inventoryhorsechest = this.inventoryChest;
-- this.inventoryChest = new InventoryHorseChest("HorseChest", this.dn());
-+ this.inventoryChest = new InventoryHorseChest("HorseChest", this.dn(), this); // CraftBukkit
- this.inventoryChest.a(this.getName());
+- this.inventoryChest = new InventoryHorseChest(this.getDisplayName(), this.dA());
++ this.inventoryChest = new InventoryHorseChest(this.getDisplayName(), this.dA(), this); // CraftBukkit
+ this.inventoryChest.a(this.getCustomName());
if (inventoryhorsechest != null) {
inventoryhorsechest.b(this);
-@@ -354,7 +356,7 @@
+@@ -348,7 +350,7 @@
}
public int getMaxDomestication() {
@@ -33,8 +33,8 @@
+ return this.maxDomestication; // CraftBukkit - return stored max domestication instead of 100
}
- protected float cq() {
-@@ -414,7 +416,7 @@
+ protected float cC() {
+@@ -408,7 +410,7 @@
}
if (this.getHealth() < this.getMaxHealth() && f > 0.0F) {
@@ -43,7 +43,7 @@
flag = true;
}
-@@ -465,7 +467,7 @@
+@@ -459,7 +461,7 @@
}
public void die(DamageSource damagesource) {
@@ -52,24 +52,24 @@
if (!this.world.isClientSide && this.inventoryChest != null) {
for (int i = 0; i < this.inventoryChest.getSize(); ++i) {
ItemStack itemstack = this.inventoryChest.getItem(i);
-@@ -476,6 +478,7 @@
+@@ -470,6 +472,7 @@
}
}
+ super.die(damagesource); // CraftBukkit
}
- public void n() {
-@@ -486,7 +489,7 @@
- super.n();
+ public void k() {
+@@ -480,7 +483,7 @@
+ super.k();
if (!this.world.isClientSide) {
if (this.random.nextInt(900) == 0 && this.deathTicks == 0) {
- this.heal(1.0F);
+ this.heal(1.0F, RegainReason.REGEN); // CraftBukkit
}
- if (this.dJ()) {
-@@ -723,6 +726,7 @@
+ if (this.dY()) {
+@@ -716,6 +719,7 @@
if (this.getOwnerUUID() != null) {
nbttagcompound.setString("OwnerUUID", this.getOwnerUUID().toString());
}
@@ -77,7 +77,7 @@
if (!this.inventoryChest.getItem(0).isEmpty()) {
nbttagcompound.set("SaddleItem", this.inventoryChest.getItem(0).save(new NBTTagCompound()));
-@@ -749,6 +753,11 @@
+@@ -742,6 +746,11 @@
if (!s.isEmpty()) {
this.setOwnerUUID(UUID.fromString(s));
}
@@ -89,10 +89,10 @@
AttributeInstance attributeinstance = this.getAttributeMap().a("Speed");
-@@ -801,6 +810,18 @@
+@@ -794,6 +803,18 @@
}
- public void b_(int i) {
+ public void b(int i) {
+ // CraftBukkit start
+ float power;
+ if (i >= 90) {
@@ -106,5 +106,5 @@
+ }
+ // CraftBukkit end
this.canSlide = true;
- this.dt();
+ this.dH();
}
diff --git a/nms-patches/EntityHorseChestedAbstract.patch b/nms-patches/EntityHorseChestedAbstract.patch
index 2e49b194..0fff1fc3 100644
--- a/nms-patches/EntityHorseChestedAbstract.patch
+++ b/nms-patches/EntityHorseChestedAbstract.patch
@@ -8,7 +8,7 @@
+ // super.die(damagesource); // CraftBukkit - moved down
if (this.isCarryingChest()) {
if (!this.world.isClientSide) {
- this.a(Item.getItemOf(Blocks.CHEST), 1);
+ this.a((IMaterial) Blocks.CHEST);
}
- this.setCarryingChest(false);
diff --git a/nms-patches/EntityHuman.patch b/nms-patches/EntityHuman.patch
index 42eff8f3..d8a3d00c 100644
--- a/nms-patches/EntityHuman.patch
+++ b/nms-patches/EntityHuman.patch
@@ -1,7 +1,7 @@
--- a/net/minecraft/server/EntityHuman.java
+++ b/net/minecraft/server/EntityHuman.java
-@@ -9,6 +9,19 @@
- import java.util.UUID;
+@@ -15,6 +15,19 @@
+ import java.util.function.ToIntFunction;
import javax.annotation.Nullable;
+// CraftBukkit start
@@ -20,9 +20,9 @@
public abstract class EntityHuman extends EntityLiving {
private static final DataWatcherObject<Float> a = DataWatcher.a(EntityHuman.class, DataWatcherRegistry.c);
-@@ -18,10 +31,10 @@
- protected static final DataWatcherObject<NBTTagCompound> bt = DataWatcher.a(EntityHuman.class, DataWatcherRegistry.n);
- protected static final DataWatcherObject<NBTTagCompound> bu = DataWatcher.a(EntityHuman.class, DataWatcherRegistry.n);
+@@ -24,10 +37,10 @@
+ protected static final DataWatcherObject<NBTTagCompound> bz = DataWatcher.a(EntityHuman.class, DataWatcherRegistry.p);
+ protected static final DataWatcherObject<NBTTagCompound> bA = DataWatcher.a(EntityHuman.class, DataWatcherRegistry.p);
public PlayerInventory inventory = new PlayerInventory(this);
- protected InventoryEnderChest enderChest = new InventoryEnderChest();
+ protected InventoryEnderChest enderChest = new InventoryEnderChest(this); // CraftBukkit - add "this" to constructor
@@ -30,10 +30,10 @@
public Container activeContainer;
- protected FoodMetaData foodData = new FoodMetaData();
+ protected FoodMetaData foodData = new FoodMetaData(this); // CraftBukkit - add "this" to constructor
- protected int bA;
- public float bB;
- public float bC;
-@@ -52,6 +65,17 @@
+ protected int bG;
+ public float bH;
+ public float bI;
+@@ -60,6 +73,17 @@
@Nullable
public EntityFishingHook hookedFish;
@@ -48,10 +48,10 @@
+ }
+ // CraftBukkit end
+
- protected ItemCooldown l() {
- return new ItemCooldown();
- }
-@@ -310,7 +334,8 @@
+ public EntityHuman(World world, GameProfile gameprofile) {
+ super(EntityTypes.PLAYER, world);
+ this.cd = ItemStack.a;
+@@ -369,7 +393,8 @@
if (this.world.getDifficulty() == EnumDifficulty.PEACEFUL && this.world.getGameRules().getBoolean("naturalRegeneration")) {
if (this.getHealth() < this.getMaxHealth() && this.ticksLived % 20 == 0) {
@@ -61,16 +61,16 @@
}
if (this.foodData.c() && this.ticksLived % 10 == 0) {
-@@ -334,7 +359,7 @@
+@@ -393,7 +418,7 @@
- this.k((float) attributeinstance.getValue());
+ this.o((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;
-@@ -456,6 +481,7 @@
+@@ -516,6 +541,7 @@
@Nullable
public EntityItem a(boolean flag) {
@@ -78,7 +78,7 @@
return this.a(this.inventory.splitStack(this.inventory.itemInHandIndex, flag && !this.inventory.getItemInHand().isEmpty() ? this.inventory.getItemInHand().getCount() : 1), false, true);
}
-@@ -498,6 +524,30 @@
+@@ -558,6 +584,30 @@
entityitem.motZ += Math.sin((double) f1) * (double) f;
}
@@ -109,7 +109,7 @@
ItemStack itemstack1 = this.a(entityitem);
if (flag1) {
-@@ -613,6 +663,13 @@
+@@ -655,6 +705,13 @@
this.a(true, true, false);
}
@@ -121,9 +121,9 @@
+ // CraftBukkit end
+
if (nbttagcompound.hasKeyOfType("SpawnX", 99) && nbttagcompound.hasKeyOfType("SpawnY", 99) && nbttagcompound.hasKeyOfType("SpawnZ", 99)) {
- this.d = new BlockPosition(nbttagcompound.getInt("SpawnX"), nbttagcompound.getInt("SpawnY"), nbttagcompound.getInt("SpawnZ"));
- this.e = nbttagcompound.getBoolean("SpawnForced");
-@@ -665,6 +722,7 @@
+ this.e = new BlockPosition(nbttagcompound.getInt("SpawnX"), nbttagcompound.getInt("SpawnY"), nbttagcompound.getInt("SpawnZ"));
+ this.f = nbttagcompound.getBoolean("SpawnForced");
+@@ -705,6 +762,7 @@
if (!this.getShoulderEntityRight().isEmpty()) {
nbttagcompound.set("ShoulderEntityRight", this.getShoulderEntityRight());
}
@@ -131,20 +131,20 @@
}
-@@ -682,10 +740,10 @@
+@@ -722,10 +780,10 @@
this.a(true, true, false);
}
- this.releaseShoulderEntities();
+ // this.releaseShoulderEntities(); // CraftBukkit - moved down
- if (damagesource.r()) {
+ if (damagesource.s()) {
if (this.world.getDifficulty() == EnumDifficulty.PEACEFUL) {
- f = 0.0F;
+ return false; // CraftBukkit - f = 0.0f -> return false
}
if (this.world.getDifficulty() == EnumDifficulty.EASY) {
-@@ -697,7 +755,13 @@
+@@ -737,7 +795,13 @@
}
}
@@ -159,12 +159,12 @@
}
}
}
-@@ -711,10 +775,29 @@
+@@ -751,10 +815,29 @@
}
public boolean a(EntityHuman entityhuman) {
-- ScoreboardTeamBase scoreboardteambase = this.aY();
-- ScoreboardTeamBase scoreboardteambase1 = entityhuman.aY();
+- ScoreboardTeamBase scoreboardteambase = this.be();
+- ScoreboardTeamBase scoreboardteambase1 = entityhuman.be();
+ // 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;
@@ -192,7 +192,7 @@
}
protected void damageArmor(float f) {
-@@ -757,7 +840,12 @@
+@@ -797,7 +880,12 @@
return (float) i / (float) this.inventory.armor.size();
}
@@ -206,7 +206,7 @@
if (!this.isInvulnerable(damagesource)) {
f = this.applyArmorModifier(damagesource, f);
f = this.applyMagicModifier(damagesource, f);
-@@ -777,6 +865,7 @@
+@@ -817,6 +905,7 @@
}
}
@@ -214,7 +214,7 @@
}
public void openSign(TileEntitySign tileentitysign) {}
-@@ -898,8 +987,15 @@
+@@ -938,8 +1027,15 @@
if (entity instanceof EntityLiving) {
f3 = ((EntityLiving) entity).getHealth();
if (j > 0 && !entity.isBurning()) {
@@ -232,7 +232,7 @@
}
}
-@@ -930,8 +1026,11 @@
+@@ -970,8 +1066,11 @@
EntityLiving entityliving = (EntityLiving) iterator.next();
if (entityliving != this && entityliving != entity && !this.r(entityliving) && this.h(entityliving) < 9.0D) {
@@ -245,7 +245,7 @@
}
}
-@@ -940,11 +1039,28 @@
+@@ -980,11 +1079,28 @@
}
if (entity instanceof EntityPlayer && entity.velocityChanged) {
@@ -274,9 +274,9 @@
}
if (flag2) {
-@@ -993,7 +1109,14 @@
+@@ -1033,7 +1149,14 @@
- this.a(StatisticList.y, Math.round(f5 * 10.0F));
+ this.a(StatisticList.DAMAGE_DEALT, Math.round(f5 * 10.0F));
if (j > 0) {
- entity.setOnFire(j * 4);
+ // CraftBukkit start - Call a combust event when somebody hits with a fire enchanted item
@@ -290,7 +290,7 @@
}
if (this.world instanceof WorldServer && f5 > 2.0F) {
-@@ -1009,6 +1132,11 @@
+@@ -1049,6 +1172,11 @@
if (flag4) {
entity.extinguish();
}
@@ -302,7 +302,7 @@
}
}
-@@ -1099,6 +1227,20 @@
+@@ -1145,6 +1273,20 @@
this.stopRiding();
}
@@ -321,9 +321,9 @@
+ // CraftBukkit end
+
this.releaseShoulderEntities();
+ this.a(StatisticList.CUSTOM.b(StatisticList.n));
this.setSize(0.2F, 0.2F);
- if (this.world.isLoaded(blockposition)) {
-@@ -1159,6 +1301,23 @@
+@@ -1206,6 +1348,23 @@
this.world.everyoneSleeping();
}
@@ -347,21 +347,21 @@
this.sleepTicks = flag ? 0 : 100;
if (flag2) {
this.setRespawnPosition(this.bedPosition, false);
-@@ -1210,9 +1369,11 @@
+@@ -1257,9 +1416,11 @@
if (blockposition != null) {
- this.d = blockposition;
- this.e = flag;
+ this.e = blockposition;
+ this.f = flag;
+ this.spawnWorld = this.world.worldData.getName(); // CraftBukkit
} else {
- this.d = null;
- this.e = false;
+ this.e = null;
+ this.f = false;
+ this.spawnWorld = ""; // CraftBukkit
}
}
-@@ -1256,7 +1417,11 @@
+@@ -1325,7 +1486,11 @@
this.motY = d3 * 0.6D;
- this.aR = f3;
+ this.aU = f3;
this.fallDistance = 0.0F;
- this.setFlag(7, false);
+ // CraftBukkit start
@@ -372,7 +372,7 @@
} else {
super.a(f, f1, f2);
}
-@@ -1540,13 +1705,17 @@
+@@ -1636,13 +1801,17 @@
}
protected void releaseShoulderEntities() {
@@ -395,7 +395,7 @@
if (!this.world.isClientSide && !nbttagcompound.isEmpty()) {
Entity entity = EntityTypes.a(nbttagcompound, this.world);
-@@ -1555,9 +1724,10 @@
+@@ -1651,9 +1820,10 @@
}
entity.setPosition(this.locX, this.locY + 0.699999988079071D, this.locZ);
@@ -407,12 +407,12 @@
}
public abstract boolean isSpectator();
-@@ -1759,7 +1929,7 @@
+@@ -1864,7 +2034,7 @@
return entitymonster.c(this.a);
}
-- public boolean apply(@Nullable Object object) {
-+ public boolean apply(@Nullable EntityMonster object) { // CraftBukkit - decompile error
+- public boolean test(@Nullable Object object) {
++ public boolean test(@Nullable EntityMonster object) { // CraftBukkit - decompile error
return this.a((EntityMonster) object);
}
diff --git a/nms-patches/EntityInsentient.patch b/nms-patches/EntityInsentient.patch
index ef6aadb7..a93da205 100644
--- a/nms-patches/EntityInsentient.patch
+++ b/nms-patches/EntityInsentient.patch
@@ -1,6 +1,6 @@
--- a/net/minecraft/server/EntityInsentient.java
+++ b/net/minecraft/server/EntityInsentient.java
-@@ -9,6 +9,17 @@
+@@ -9,6 +9,18 @@
import java.util.UUID;
import javax.annotation.Nullable;
@@ -8,6 +8,7 @@
+import org.bukkit.craftbukkit.event.CraftEventFactory;
+import org.bukkit.craftbukkit.entity.CraftLivingEntity;
+import org.bukkit.entity.LivingEntity;
++import org.bukkit.event.entity.EntityCombustByEntityEvent;
+import org.bukkit.event.entity.EntityPickupItemEvent;
+import org.bukkit.event.entity.EntityTargetLivingEntityEvent;
+import org.bukkit.event.entity.EntityTargetEvent;
@@ -18,17 +19,17 @@
public abstract class EntityInsentient extends EntityLiving {
private static final DataWatcherObject<Byte> a = DataWatcher.a(EntityInsentient.class, DataWatcherRegistry.a);
-@@ -27,7 +38,7 @@
+@@ -27,7 +39,7 @@
public float[] dropChanceHand;
- private final NonNullList<ItemStack> by;
+ private final NonNullList<ItemStack> bE;
public float[] dropChanceArmor;
- public boolean canPickUpLoot;
+ // public boolean canPickUpLoot; // CraftBukkit - moved up to EntityLiving
public boolean persistent;
- private final Map<PathType, Float> bB;
- private MinecraftKey bC;
-@@ -57,6 +68,9 @@
- this.r();
+ private final Map<PathType, Float> bH;
+ private MinecraftKey bI;
+@@ -57,6 +69,9 @@
+ this.n();
}
+ // CraftBukkit start - default persistance to type's persistance value
@@ -36,8 +37,8 @@
+ // CraftBukkit end
}
- protected void r() {}
-@@ -110,7 +124,38 @@
+ protected void n() {}
+@@ -110,7 +125,38 @@
}
public void setGoalTarget(@Nullable EntityLiving entityliving) {
@@ -75,18 +76,18 @@
+ // CraftBukkit end
}
- public boolean d(Class<? extends EntityLiving> oclass) {
-@@ -340,11 +385,20 @@
+ public boolean b(Class<? extends EntityLiving> oclass) {
+@@ -336,11 +382,20 @@
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.m(nbttagcompound.getBoolean("CanPickUpLoot"));
+- this.p(nbttagcompound.getBoolean("CanPickUpLoot"));
+ boolean data = nbttagcompound.getBoolean("CanPickUpLoot");
+ if (isLevelAtLeast(nbttagcompound, 1) || data) {
-+ this.m(data);
++ this.p(data);
+ }
}
@@ -99,13 +100,13 @@
NBTTagList nbttaglist;
int i;
-@@ -508,7 +562,15 @@
- }
- }
+@@ -470,11 +525,21 @@
+ ItemStack itemstack1 = this.getEquipment(enumitemslot);
+ boolean flag = this.a(itemstack, itemstack1, enumitemslot);
-- if (flag && this.c(itemstack)) {
+- if (flag && this.d(itemstack)) {
+ // CraftBukkit start
-+ boolean canPickup = flag && this.c(itemstack);
++ boolean canPickup = flag && this.d(itemstack);
+
+ EntityPickupItemEvent entityEvent = new EntityPickupItemEvent((LivingEntity) getBukkitEntity(), (org.bukkit.entity.Item) entityitem.getBukkitEntity(), 0);
+ entityEvent.setCancelled(!canPickup);
@@ -113,20 +114,16 @@
+ canPickup = !entityEvent.isCancelled();
+ if (canPickup) {
+ // CraftBukkit end
- double d0;
-
- switch (enumitemslot.a()) {
-@@ -525,7 +587,9 @@
- }
+ double d0 = this.c(enumitemslot);
if (!itemstack1.isEmpty() && (double) (this.random.nextFloat() - 0.1F) < d0) {
+ this.forceDrops = true; // CraftBukkit
- this.a(itemstack1, 0.0F);
+ this.a_(itemstack1);
+ this.forceDrops = false; // CraftBukkit
}
this.setSlot(enumitemslot, itemstack);
-@@ -565,11 +629,11 @@
+@@ -554,11 +619,11 @@
double d2 = entityhuman.locZ - this.locZ;
double d3 = d0 * d0 + d1 * d1 + d2 * d2;
@@ -140,7 +137,7 @@
this.die();
} else if (d3 < 1024.0D) {
this.ticksFarFromPlayer = 0;
-@@ -938,12 +1002,24 @@
+@@ -946,12 +1011,24 @@
public final boolean b(EntityHuman entityhuman, EnumHand enumhand) {
if (this.isLeashed() && this.getLeashHolder() == entityhuman) {
@@ -165,9 +162,9 @@
this.setLeashHolder(entityhuman, true);
itemstack.subtract(1);
return true;
-@@ -964,10 +1040,12 @@
+@@ -972,10 +1049,12 @@
- if (this.bE) {
+ if (this.bK) {
if (!this.isAlive()) {
+ this.world.getServer().getPluginManager().callEvent(new EntityUnleashEvent(this.getBukkitEntity(), UnleashReason.PLAYER_UNLEASH)); // CraftBukkit
this.unleash(true, true);
@@ -178,17 +175,17 @@
this.unleash(true, true);
}
}
-@@ -978,7 +1056,9 @@
- this.bE = false;
+@@ -986,7 +1065,9 @@
+ this.bK = false;
this.leashHolder = null;
if (!this.world.isClientSide && flag1) {
+ this.forceDrops = true; // CraftBukkit
- this.a(Items.LEAD, 1);
+ this.a((IMaterial) Items.LEAD);
+ this.forceDrops = false; // CraftBukkit
}
if (!this.world.isClientSide && flag && this.world instanceof WorldServer) {
-@@ -1048,6 +1128,7 @@
+@@ -1056,6 +1137,7 @@
this.setLeashHolder(entityleash, true);
} else {
@@ -196,3 +193,19 @@
this.unleash(false, true);
}
}
+@@ -1151,7 +1233,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
+ }
+
+ if (entity instanceof EntityHuman) {
diff --git a/nms-patches/EntityIronGolem.patch b/nms-patches/EntityIronGolem.patch
index 45aee397..5b53545a 100644
--- a/nms-patches/EntityIronGolem.patch
+++ b/nms-patches/EntityIronGolem.patch
@@ -1,6 +1,21 @@
--- a/net/minecraft/server/EntityIronGolem.java
+++ b/net/minecraft/server/EntityIronGolem.java
-@@ -73,7 +73,7 @@
+@@ -28,8 +28,12 @@
+ this.goalSelector.a(8, new PathfinderGoalRandomLookaround(this));
+ this.targetSelector.a(1, new PathfinderGoalDefendVillage(this));
+ this.targetSelector.a(2, new PathfinderGoalHurtByTarget(this, false, new Class[0]));
+- this.targetSelector.a(3, new PathfinderGoalNearestAttackableTarget(this, EntityInsentient.class, 10, false, true, (entityinsentient) -> {
+- return entityinsentient != null && IMonster.e.test(entityinsentient) && !(entityinsentient instanceof EntityCreeper);
++ // CraftBukkit start - decompile error
++ this.targetSelector.a(3, new PathfinderGoalNearestAttackableTarget(this, EntityInsentient.class, 10, false, true, new Predicate<EntityInsentient>() {
++ public boolean test(@Nullable EntityInsentient entityinsentient) {
++ return entityinsentient != null && IMonster.e.test(entityinsentient) && !(entityinsentient instanceof EntityCreeper);
++ }
++ // CraftBukkit end
+ }));
+ }
+
+@@ -67,7 +71,7 @@
protected void C(Entity entity) {
if (entity instanceof IMonster && !(entity instanceof EntityCreeper) && this.getRandom().nextInt(20) == 0) {
diff --git a/nms-patches/EntityItem.patch b/nms-patches/EntityItem.patch
index 0cb43b4b..f12c053c 100644
--- a/nms-patches/EntityItem.patch
+++ b/nms-patches/EntityItem.patch
@@ -1,9 +1,9 @@
--- a/net/minecraft/server/EntityItem.java
+++ b/net/minecraft/server/EntityItem.java
-@@ -4,6 +4,10 @@
+@@ -3,6 +3,10 @@
+ import java.util.Iterator;
+ import java.util.UUID;
import javax.annotation.Nullable;
- import org.apache.logging.log4j.LogManager;
- import org.apache.logging.log4j.Logger;
+// CraftBukkit start
+import org.bukkit.event.entity.EntityPickupItemEvent;
+import org.bukkit.event.player.PlayerPickupItemEvent;
@@ -11,18 +11,18 @@
public class EntityItem extends Entity {
-@@ -15,6 +19,7 @@
- private String g;
- private String h;
+@@ -13,6 +17,7 @@
+ private UUID f;
+ private UUID g;
public float a;
+ private int lastTick = MinecraftServer.currentTick - 1; // CraftBukkit
- public EntityItem(World world, double d0, double d1, double d2) {
- super(world);
-@@ -54,9 +59,12 @@
+ public EntityItem(World world) {
+ super(EntityTypes.ITEM, world);
+@@ -48,9 +53,12 @@
this.die();
} else {
- super.B_();
+ super.tick();
- if (this.pickupDelay > 0 && this.pickupDelay != 32767) {
- --this.pickupDelay;
- }
@@ -35,7 +35,7 @@
this.lastX = this.locX;
this.lastY = this.locY;
-@@ -104,9 +112,11 @@
+@@ -100,9 +108,11 @@
this.motY *= -0.5D;
}
@@ -45,9 +45,9 @@
}
+ // Craftbukkit end */
- this.aq();
+ this.impulse |= this.at();
if (!this.world.isClientSide) {
-@@ -121,6 +131,12 @@
+@@ -117,6 +127,12 @@
}
if (!this.world.isClientSide && this.age >= 6000) {
@@ -60,7 +60,7 @@
this.die();
}
-@@ -162,6 +178,7 @@
+@@ -165,6 +181,7 @@
} else if (itemstack1.getCount() + itemstack.getCount() > itemstack1.getMaxStackSize()) {
return false;
} else {
@@ -68,7 +68,7 @@
itemstack1.add(itemstack.getCount());
entityitem.pickupDelay = Math.max(entityitem.pickupDelay, this.pickupDelay);
entityitem.age = Math.min(entityitem.age, this.age);
-@@ -208,6 +225,11 @@
+@@ -197,6 +214,11 @@
} else if (!this.getItemStack().isEmpty() && this.getItemStack().getItem() == Items.NETHER_STAR && damagesource.isExplosion()) {
return false;
} else {
@@ -77,10 +77,10 @@
+ return false;
+ }
+ // CraftBukkit end
- this.ax();
- this.f = (int) ((float) this.f - f);
- if (this.f <= 0) {
-@@ -270,6 +292,35 @@
+ this.aA();
+ this.e = (int) ((float) this.e - f);
+ if (this.e <= 0) {
+@@ -255,6 +277,35 @@
Item item = itemstack.getItem();
int i = itemstack.getCount();
@@ -113,6 +113,14 @@
+ }
+ // CraftBukkit end
+
- if (this.pickupDelay == 0 && (this.h == null || 6000 - this.age <= 200 || this.h.equals(entityhuman.getName())) && entityhuman.inventory.pickup(itemstack)) {
+ if (this.pickupDelay == 0 && (this.g == null || 6000 - this.age <= 200 || this.g.equals(entityhuman.getUniqueID())) && entityhuman.inventory.pickup(itemstack)) {
entityhuman.receive(this, i);
if (itemstack.isEmpty()) {
+@@ -294,6 +345,7 @@
+ }
+
+ public void setItemStack(ItemStack itemstack) {
++ com.google.common.base.Preconditions.checkArgument(!itemstack.isEmpty(), "Cannot drop air"); // CraftBukkit
+ this.getDataWatcher().set(EntityItem.b, itemstack);
+ }
+
diff --git a/nms-patches/EntityItemFrame.patch b/nms-patches/EntityItemFrame.patch
index f2cd4fa0..e15c81e4 100644
--- a/nms-patches/EntityItemFrame.patch
+++ b/nms-patches/EntityItemFrame.patch
@@ -1,6 +1,6 @@
--- a/net/minecraft/server/EntityItemFrame.java
+++ b/net/minecraft/server/EntityItemFrame.java
-@@ -31,6 +31,11 @@
+@@ -97,6 +97,11 @@
return false;
} else if (!damagesource.isExplosion() && !this.getItem().isEmpty()) {
if (!this.world.isClientSide) {
@@ -10,5 +10,5 @@
+ }
+ // CraftBukkit end
this.b(damagesource.getEntity(), false);
- this.a(SoundEffects.du, 1.0F, 1.0F);
- this.setItem(ItemStack.a);
+ this.a(SoundEffects.ENTITY_ITEM_FRAME_REMOVE_ITEM, 1.0F, 1.0F);
+ }
diff --git a/nms-patches/EntityLargeFireball.patch b/nms-patches/EntityLargeFireball.patch
index 3e4e73c7..d3072c01 100644
--- a/nms-patches/EntityLargeFireball.patch
+++ b/nms-patches/EntityLargeFireball.patch
@@ -10,12 +10,12 @@
public int yield = 1;
public EntityLargeFireball(World world) {
- super(world);
+ super(EntityTypes.FIREBALL, world, 1.0F, 1.0F);
+ isIncendiary = this.world.getGameRules().getBoolean("mobGriefing"); // CraftBukkit
}
public EntityLargeFireball(World world, EntityLiving entityliving, double d0, double d1, double d2) {
- super(world, entityliving, d0, d1, d2);
+ super(EntityTypes.FIREBALL, entityliving, d0, d1, d2, world, 1.0F, 1.0F);
+ isIncendiary = this.world.getGameRules().getBoolean("mobGriefing"); // CraftBukkit
}
@@ -37,7 +37,7 @@
this.die();
}
-@@ -39,7 +51,8 @@
+@@ -35,7 +47,8 @@
public void a(NBTTagCompound nbttagcompound) {
super.a(nbttagcompound);
if (nbttagcompound.hasKeyOfType("ExplosionPower", 99)) {
diff --git a/nms-patches/EntityLeash.patch b/nms-patches/EntityLeash.patch
index c742be1c..78552678 100644
--- a/nms-patches/EntityLeash.patch
+++ b/nms-patches/EntityLeash.patch
@@ -8,7 +8,7 @@
import java.util.Iterator;
import java.util.List;
import javax.annotation.Nullable;
-@@ -71,22 +73,42 @@
+@@ -67,22 +69,42 @@
while (iterator.hasNext()) {
entityinsentient = (EntityInsentient) iterator.next();
if (entityinsentient.isLeashed() && entityinsentient.getLeashHolder() == entityhuman) {
diff --git a/nms-patches/EntityLightning.patch b/nms-patches/EntityLightning.patch
index ec1e14a8..d57c0b1a 100644
--- a/nms-patches/EntityLightning.patch
+++ b/nms-patches/EntityLightning.patch
@@ -1,57 +1,33 @@
--- a/net/minecraft/server/EntityLightning.java
+++ b/net/minecraft/server/EntityLightning.java
-@@ -2,15 +2,19 @@
-
+@@ -4,6 +4,8 @@
import java.util.List;
+ import javax.annotation.Nullable;
+import org.bukkit.craftbukkit.event.CraftEventFactory; // CraftBukkit
+
public class EntityLightning extends EntityWeather {
private int lifeTicks;
- public long a;
- private int c;
+@@ -12,9 +14,11 @@
private final boolean d;
+ @Nullable
+ private EntityPlayer e;
+ public boolean isEffect; // CraftBukkit
public EntityLightning(World world, double d0, double d1, double d2, boolean flag) {
- super(world);
+ super(EntityTypes.LIGHTNING_BOLT, world);
+ this.isEffect = flag; // CraftBukkit
this.setPositionRotation(d0, d1, d2, 0.0F, 0.0F);
this.lifeTicks = 2;
this.a = this.random.nextLong();
-@@ -20,14 +24,22 @@
-
- if (!flag && !world.isClientSide && world.getGameRules().getBoolean("doFireTick") && (world.getDifficulty() == EnumDifficulty.NORMAL || world.getDifficulty() == EnumDifficulty.HARD) && world.areChunksLoaded(blockposition, 10)) {
- if (world.getType(blockposition).getMaterial() == Material.AIR && Blocks.FIRE.canPlace(world, blockposition)) {
-- world.setTypeUpdate(blockposition, Blocks.FIRE.getBlockData());
-+ // 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).getMaterial() == Material.AIR && Blocks.FIRE.canPlace(world, blockposition1)) {
-- world.setTypeUpdate(blockposition1, Blocks.FIRE.getBlockData());
-+ // CraftBukkit start
-+ if (!CraftEventFactory.callBlockIgniteEvent(world, blockposition1.getX(), blockposition1.getY(), blockposition1.getZ(), this).isCancelled()) {
-+ world.setTypeUpdate(blockposition1, Blocks.FIRE.getBlockData());
-+ }
-+ // CraftBukkit end
- }
- }
- }
-@@ -41,7 +53,24 @@
- public void B_() {
- super.B_();
+@@ -39,7 +43,24 @@
+ public void tick() {
+ super.tick();
if (this.lifeTicks == 2) {
-- this.world.a((EntityHuman) null, this.locX, this.locY, this.locZ, SoundEffects.dK, SoundCategory.WEATHER, 10000.0F, 0.8F + this.random.nextFloat() * 0.2F);
+- this.world.a((EntityHuman) null, this.locX, this.locY, this.locZ, SoundEffects.ENTITY_LIGHTNING_BOLT_THUNDER, SoundCategory.WEATHER, 10000.0F, 0.8F + this.random.nextFloat() * 0.2F);
+ // CraftBukkit start - Use relative location for far away sounds
-+ // this.world.a((EntityHuman) null, this.locX, this.locY, this.locZ, SoundEffects.dG, SoundCategory.WEATHER, 10000.0F, 0.8F + this.random.nextFloat() * 0.2F);
++ // this.world.a((EntityHuman) null, this.locX, this.locY, this.locZ, SoundEffects.ENTITY_LIGHTNING_BOLT_THUNDER, SoundCategory.WEATHER, 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>) (List) this.world.players) {
@@ -62,27 +38,16 @@
+ double deltaLength = Math.sqrt(distanceSquared);
+ double relativeX = player.locX + (deltaX / deltaLength) * viewDistance;
+ double relativeZ = player.locZ + (deltaZ / deltaLength) * viewDistance;
-+ player.playerConnection.sendPacket(new PacketPlayOutNamedSoundEffect(SoundEffects.dK, SoundCategory.WEATHER, relativeX, this.locY, relativeZ, 10000.0F, pitch));
++ player.playerConnection.sendPacket(new PacketPlayOutNamedSoundEffect(SoundEffects.ENTITY_LIGHTNING_BOLT_THUNDER, SoundCategory.WEATHER, relativeX, this.locY, relativeZ, 10000.0F, pitch));
+ } else {
-+ player.playerConnection.sendPacket(new PacketPlayOutNamedSoundEffect(SoundEffects.dK, SoundCategory.WEATHER, this.locX, this.locY, this.locZ, 10000.0F, pitch));
++ player.playerConnection.sendPacket(new PacketPlayOutNamedSoundEffect(SoundEffects.ENTITY_LIGHTNING_BOLT_THUNDER, SoundCategory.WEATHER, this.locX, this.locY, this.locZ, 10000.0F, pitch));
+ }
+ }
+ // CraftBukkit end
- this.world.a((EntityHuman) null, this.locX, this.locY, this.locZ, SoundEffects.dJ, SoundCategory.WEATHER, 2.0F, 0.5F + this.random.nextFloat() * 0.2F);
+ this.world.a((EntityHuman) null, this.locX, this.locY, this.locZ, SoundEffects.ENTITY_LIGHTNING_BOLT_IMPACT, SoundCategory.WEATHER, 2.0F, 0.5F + this.random.nextFloat() * 0.2F);
}
-@@ -57,13 +86,17 @@
- BlockPosition blockposition = new BlockPosition(this);
-
- if (this.world.getGameRules().getBoolean("doFireTick") && this.world.areChunksLoaded(blockposition, 10) && this.world.getType(blockposition).getMaterial() == Material.AIR && Blocks.FIRE.canPlace(this.world, blockposition)) {
-- this.world.setTypeUpdate(blockposition, Blocks.FIRE.getBlockData());
-+ // CraftBukkit start - add "!isEffect"
-+ if (!isEffect && !CraftEventFactory.callBlockIgniteEvent(world, blockposition.getX(), blockposition.getY(), blockposition.getZ(), this).isCancelled()) {
-+ this.world.setTypeUpdate(blockposition, Blocks.FIRE.getBlockData());
-+ }
-+ // CraftBukkit end
- }
- }
+@@ -55,7 +76,7 @@
}
}
@@ -91,3 +56,28 @@
if (this.world.isClientSide) {
this.world.d(2);
} else if (!this.d) {
+@@ -82,14 +103,22 @@
+ BlockPosition blockposition = new BlockPosition(this);
+
+ if (this.world.areChunksLoaded(blockposition, 10) && this.world.getType(blockposition).isAir() && iblockdata.canPlace(this.world, blockposition)) {
+- this.world.setTypeUpdate(blockposition, iblockdata);
++ // CraftBukkit start - add "!isEffect"
++ if (!isEffect && !CraftEventFactory.callBlockIgniteEvent(world, blockposition, this).isCancelled()) {
++ this.world.setTypeUpdate(blockposition, iblockdata);
++ }
++ // CraftBukkit end
+ }
+
+ for (int j = 0; j < i; ++j) {
+ BlockPosition blockposition1 = blockposition.a(this.random.nextInt(3) - 1, this.random.nextInt(3) - 1, this.random.nextInt(3) - 1);
+
+ if (this.world.getType(blockposition1).isAir() && iblockdata.canPlace(this.world, blockposition1)) {
+- this.world.setTypeUpdate(blockposition1, iblockdata);
++ // CraftBukkit start - add "!isEffect"
++ if (!isEffect && !CraftEventFactory.callBlockIgniteEvent(world, blockposition1, this).isCancelled()) {
++ this.world.setTypeUpdate(blockposition1, iblockdata);
++ }
++ // CraftBukkit end
+ }
+ }
+
diff --git a/nms-patches/EntityLiving.patch b/nms-patches/EntityLiving.patch
index 72d5cdcc..df052af4 100644
--- a/nms-patches/EntityLiving.patch
+++ b/nms-patches/EntityLiving.patch
@@ -25,10 +25,10 @@
public abstract class EntityLiving extends Entity {
private static final Logger a = LogManager.getLogger();
-@@ -88,6 +106,20 @@
- private BlockPosition bF;
- private DamageSource bG;
- private long bH;
+@@ -93,6 +111,20 @@
+ protected int bw;
+ private float bO;
+ private float bP;
+ // CraftBukkit start
+ public int expToDrop;
+ public int maxAirTicks = 300;
@@ -44,48 +44,35 @@
+ }
+ // CraftBukkit end
- public void killEntity() {
- this.damageEntity(DamageSource.OUT_OF_WORLD, Float.MAX_VALUE);
-@@ -102,7 +134,8 @@
+ protected EntityLiving(EntityTypes<?> entitytypes, World world) {
+ super(entitytypes, world);
+@@ -103,7 +135,8 @@
this.updateEffects = true;
this.activeItem = ItemStack.a;
this.initAttributes();
- 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.set(EntityLiving.HEALTH, (float) this.getAttributeInstance(GenericAttributes.maxHealth).getValue());
- this.i = true;
- this.aM = (float) ((Math.random() + 1.0D) * 0.009999999776482582D);
+ this.j = true;
+ this.aP = (float) ((Math.random() + 1.0D) * 0.009999999776482582D);
this.setPosition(this.locX, this.locY, this.locZ);
-@@ -140,7 +173,13 @@
+@@ -145,7 +178,13 @@
double d1 = Math.min((double) (0.2F + f / 15.0F), 2.5D);
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)});
+- ((WorldServer) this.world).a(new ParticleParamBlock(Particles.d, iblockdata), this.locX, this.locY, this.locZ, i, 0.0D, 0.0D, 0.0D, 0.15000000596046448D);
+ // 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)});
++ ((WorldServer) this.world).sendParticles((EntityPlayer) this, new ParticleParamBlock(Particles.d, iblockdata), this.locX, this.locY, this.locZ, i, 0.0D, 0.0D, 0.0D, 0.15000000596046448D);
+ } 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)});
++ ((WorldServer) this.world).a(new ParticleParamBlock(Particles.d, iblockdata), this.locX, this.locY, this.locZ, i, 0.0D, 0.0D, 0.0D, 0.15000000596046448D);
+ }
+ // CraftBukkit end
}
}
-@@ -202,7 +241,11 @@
- this.stopRiding();
- }
- } 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.world.isClientSide) {
-@@ -259,6 +302,18 @@
- this.world.methodProfiler.b();
+@@ -264,6 +303,18 @@
+ this.world.methodProfiler.e();
}
+ // CraftBukkit start
@@ -103,9 +90,9 @@
protected void b(BlockPosition blockposition) {
int i = EnchantmentManager.a(Enchantments.j, this);
-@@ -274,19 +329,19 @@
+@@ -283,19 +334,19 @@
- protected void bO() {
+ protected void ca() {
++this.deathTicks;
- if (this.deathTicks == 20) {
+ if (this.deathTicks >= 20 && !this.dead) { // CraftBukkit - (this.deathTicks == 20) -> (this.deathTicks >= 20 && !this.dead)
@@ -113,14 +100,14 @@
- if (!this.world.isClientSide && (this.alwaysGivesExp() || this.lastDamageByPlayerTime > 0 && this.isDropExperience() && this.world.getGameRules().getBoolean("doMobLoot"))) {
- i = this.getExpValue(this.killer);
--
-- while (i > 0) {
-- int j = EntityExperienceOrb.getOrbValue(i);
+ // CraftBukkit start - Update getExpReward() above if the removed if() changes!
+ i = this.expToDrop;
+ while (i > 0) {
+ int j = EntityExperienceOrb.getOrbValue(i);
+- while (i > 0) {
+- int j = EntityExperienceOrb.getOrbValue(i);
+-
- i -= j;
- this.world.addEntity(new EntityExperienceOrb(this.world, this.locX, this.locY, this.locZ, j));
- }
@@ -132,7 +119,7 @@
this.die();
-@@ -442,6 +497,17 @@
+@@ -455,6 +506,17 @@
}
}
@@ -150,7 +137,7 @@
if (nbttagcompound.hasKeyOfType("Health", 99)) {
this.setHealth(nbttagcompound.getFloat("Health"));
}
-@@ -464,9 +530,15 @@
+@@ -478,9 +540,15 @@
}
@@ -166,7 +153,7 @@
try {
while (iterator.hasNext()) {
MobEffectList mobeffectlist = (MobEffectList) iterator.next();
-@@ -484,6 +556,17 @@
+@@ -498,6 +566,17 @@
} catch (ConcurrentModificationException concurrentmodificationexception) {
;
}
@@ -184,20 +171,20 @@
if (this.updateEffects) {
if (!this.world.isClientSide) {
-@@ -585,6 +668,12 @@
+@@ -604,6 +683,12 @@
}
- public void addEffect(MobEffect mobeffect) {
+ public boolean addEffect(MobEffect mobeffect) {
+ // CraftBukkit start
+ if (isTickingEffects) {
+ effectsToProcess.add(mobeffect);
-+ return;
++ return true;
+ }
+ // CraftBukkit end
- if (this.d(mobeffect)) {
- MobEffect mobeffect1 = (MobEffect) this.effects.get(mobeffect.getMobEffect());
-
-@@ -617,6 +706,12 @@
+ if (!this.d(mobeffect)) {
+ return false;
+ } else {
+@@ -640,6 +725,12 @@
@Nullable
public MobEffect c(@Nullable MobEffectList mobeffectlist) {
@@ -210,7 +197,7 @@
return (MobEffect) this.effects.remove(mobeffectlist);
}
-@@ -656,20 +751,52 @@
+@@ -681,20 +772,52 @@
}
@@ -235,7 +222,7 @@
}
- public final float getHealth() {
+ public float getHealth() {
+ // CraftBukkit start - Use unscaled health
+ if (this instanceof EntityPlayer) {
+ return (float) ((EntityPlayer) this).getBukkitEntity().getHealth();
@@ -264,7 +251,7 @@
this.datawatcher.set(EntityLiving.HEALTH, Float.valueOf(MathHelper.a(f, 0.0F, this.getMaxHealth())));
}
-@@ -687,14 +814,16 @@
+@@ -712,14 +835,16 @@
} else {
float f1 = f;
@@ -283,8 +270,8 @@
+ if (false && f > 0.0F && this.applyBlockingModifier(damagesource)) {
this.damageShield(f);
f = 0.0F;
- if (!damagesource.a()) {
-@@ -713,20 +842,39 @@
+ if (!damagesource.b()) {
+@@ -738,20 +863,39 @@
if ((float) this.noDamageTicks > (float) this.maxNoDamageTicks / 2.0F) {
if (f <= this.lastDamage) {
@@ -310,8 +297,8 @@
- this.damageEntity0(damagesource, f);
+ // this.damageEntity0(damagesource, f);
+ // CraftBukkit end
- this.az = 10;
- this.hurtTicks = this.az;
+ this.aC = 10;
+ this.hurtTicks = this.aC;
}
+ // CraftBukkit start
@@ -323,10 +310,10 @@
+ }
+ // CraftBukkit end
+
- this.aA = 0.0F;
+ this.aD = 0.0F;
Entity entity1 = damagesource.getEntity();
-@@ -833,19 +981,29 @@
+@@ -858,19 +1002,29 @@
EnumHand[] aenumhand = EnumHand.values();
int i = aenumhand.length;
@@ -337,7 +324,7 @@
- ItemStack itemstack1 = this.b(enumhand);
+ itemstack1 = this.b(enumhand);
- if (itemstack1.getItem() == Items.cY) {
+ if (itemstack1.getItem() == Items.TOTEM_OF_UNDYING) {
itemstack = itemstack1.cloneItemStack();
- itemstack1.subtract(1);
+ // itemstack1.subtract(1); // CraftBukkit
@@ -359,8 +346,8 @@
+ // CraftBukkit end
EntityPlayer entityplayer = (EntityPlayer) this;
- entityplayer.b(StatisticList.b(Items.cY));
-@@ -859,7 +1017,7 @@
+ entityplayer.b(StatisticList.ITEM_USED.b(Items.TOTEM_OF_UNDYING));
+@@ -884,7 +1038,7 @@
this.world.broadcastEntityEffect(this, (byte) 35);
}
@@ -369,7 +356,7 @@
}
}
-@@ -944,6 +1102,12 @@
+@@ -955,6 +1109,12 @@
boolean flag = this.lastDamageByPlayerTime > 0;
this.a(flag, i, damagesource);
@@ -382,7 +369,7 @@
}
}
-@@ -1033,8 +1197,13 @@
+@@ -1044,8 +1204,13 @@
int i = MathHelper.f((f - 3.0F - f2) * f1);
if (i > 0) {
@@ -391,13 +378,13 @@
+ return;
+ }
+ // CraftBukkit end
- this.a(this.e(i), 1.0F, 1.0F);
+ this.a(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);
-@@ -1061,7 +1230,7 @@
+@@ -1072,7 +1237,7 @@
protected float applyArmorModifier(DamageSource damagesource, float f) {
if (!damagesource.ignoresArmor()) {
@@ -406,7 +393,7 @@
f = CombatMath.a(f, (float) this.getArmorStrength(), (float) this.getAttributeInstance(GenericAttributes.i).getValue());
}
-@@ -1074,7 +1243,8 @@
+@@ -1085,7 +1250,8 @@
} else {
int i;
@@ -416,7 +403,7 @@
i = (this.getEffect(MobEffects.RESISTANCE).getAmplifier() + 1) * 5;
int j = 25 - i;
float f1 = f * (float) j;
-@@ -1095,22 +1265,142 @@
+@@ -1106,22 +1272,142 @@
}
}
@@ -518,7 +505,7 @@
+ // Apply blocking code // PAIL: steal from above
+ if (event.getDamage(DamageModifier.BLOCKING) < 0) {
+ this.damageShield((float) -event.getDamage(DamageModifier.BLOCKING));
-+ Entity entity = damagesource.i();
++ Entity entity = damagesource.j();
+
+ if (entity instanceof EntityLiving) {
+ this.c((EntityLiving) entity);
@@ -532,7 +519,7 @@
+ // PAIL: Be sure to drag all this code from the EntityHuman subclass each update.
+ ((EntityHuman) this).applyExhaustion(damagesource.getExhaustionCost());
+ if (f < 3.4028235E37F) {
-+ ((EntityHuman) this).a(StatisticList.z, Math.round(f * 10.0F));
++ ((EntityHuman) this).a(StatisticList.DAMAGE_TAKEN, Math.round(f * 10.0F));
+ }
+ }
+ // CraftBukkit end
@@ -569,7 +556,7 @@
}
public CombatTracker getCombatTracker() {
-@@ -1177,6 +1467,7 @@
+@@ -1188,6 +1474,7 @@
public AttributeMapBase getAttributeMap() {
if (this.attributeMap == null) {
this.attributeMap = new AttributeMapServer();
@@ -577,7 +564,7 @@
}
return this.attributeMap;
-@@ -1469,6 +1760,7 @@
+@@ -1490,6 +1777,7 @@
}
if (this.onGround && !this.world.isClientSide) {
@@ -585,7 +572,7 @@
this.setFlag(7, false);
}
} else {
-@@ -1838,6 +2130,7 @@
+@@ -1891,6 +2179,7 @@
}
if (!this.world.isClientSide) {
@@ -593,7 +580,7 @@
this.setFlag(7, flag);
}
-@@ -1931,11 +2224,11 @@
+@@ -2018,11 +2307,11 @@
}
public boolean isInteractable() {
@@ -602,16 +589,16 @@
}
public boolean isCollidable() {
-- return this.isAlive() && !this.m_();
-+ return this.isAlive() && !this.m_() && this.collides; // CraftBukkit
+- return this.isAlive() && !this.z_();
++ return this.isAlive() && !this.z_() && this.collides; // CraftBukkit
}
- protected void ax() {
-@@ -2072,7 +2365,27 @@
- protected void v() {
+ protected void aA() {
+@@ -2182,7 +2471,27 @@
+ protected void q() {
if (!this.activeItem.isEmpty() && this.isHandRaised()) {
this.b(this.activeItem, 16);
-- this.a(this.cH(), this.activeItem.a(this.world, this));
+- this.a(this.cT(), this.activeItem.a(this.world, this));
+ // CraftBukkit start - fire PlayerItemConsumeEvent
+ ItemStack itemstack;
+ if (this instanceof EntityPlayer) {
@@ -631,17 +618,17 @@
+ itemstack = this.activeItem.a(this.world, this);
+ }
+
-+ this.a(this.cH(), itemstack);
++ this.a(this.cT(), itemstack);
+ // CraftBukkit end
- this.cN();
+ this.cZ();
}
-@@ -2151,10 +2464,18 @@
+@@ -2261,10 +2570,18 @@
}
if (flag1) {
- this.enderTeleportTo(this.locX, this.locY, this.locZ);
-- if (world.getCubes(this, this.getBoundingBox()).isEmpty() && !world.containsLiquid(this.getBoundingBox())) {
+- if (world.getCubes(this, this.getBoundingBox()) && !world.containsLiquid(this.getBoundingBox())) {
- flag = true;
+ // CraftBukkit start - Teleport event
+ // this.enderTeleportTo(this.locX, this.locY, this.locZ);
@@ -650,7 +637,7 @@
+ if (!teleport.isCancelled()) {
+ Location to = teleport.getTo();
+ this.enderTeleportTo(to.getX(), to.getY(), to.getZ());
-+ if (world.getCubes(this, this.getBoundingBox()).isEmpty() && !world.containsLiquid(this.getBoundingBox())) {
++ if (world.getCubes((Entity) this, this.getBoundingBox()) && !world.containsLiquid(this.getBoundingBox())) {
+ flag = true;
+ }
}
diff --git a/nms-patches/EntityLlamaSpit.patch b/nms-patches/EntityLlamaSpit.patch
index 4b284248..02f5ea83 100644
--- a/nms-patches/EntityLlamaSpit.patch
+++ b/nms-patches/EntityLlamaSpit.patch
@@ -15,5 +15,5 @@
public void a(MovingObjectPosition movingobjectposition) {
+ org.bukkit.craftbukkit.event.CraftEventFactory.callProjectileHitEvent(this, movingobjectposition); // Craftbukkit - Call event
if (movingobjectposition.entity != null && this.shooter != null) {
- movingobjectposition.entity.damageEntity(DamageSource.a(this, this.shooter).b(), 1.0F);
+ movingobjectposition.entity.damageEntity(DamageSource.a(this, (EntityLiving) this.shooter).c(), 1.0F);
}
diff --git a/nms-patches/EntityMinecartAbstract.patch b/nms-patches/EntityMinecartAbstract.patch
index 7e9aac01..d3ac7cc3 100644
--- a/nms-patches/EntityMinecartAbstract.patch
+++ b/nms-patches/EntityMinecartAbstract.patch
@@ -1,7 +1,7 @@
--- a/net/minecraft/server/EntityMinecartAbstract.java
+++ b/net/minecraft/server/EntityMinecartAbstract.java
-@@ -6,6 +6,15 @@
- import java.util.Map;
+@@ -8,6 +8,15 @@
+ import java.util.function.ToIntFunction;
import javax.annotation.Nullable;
+// CraftBukkit start
@@ -16,9 +16,9 @@
public abstract class EntityMinecartAbstract extends Entity implements INamableTileEntity {
private static final DataWatcherObject<Integer> a = DataWatcher.a(EntityMinecartAbstract.class, DataWatcherRegistry.b);
-@@ -23,6 +32,17 @@
- private double ax;
- private double ay;
+@@ -25,6 +34,17 @@
+ private double aA;
+ private double aB;
+ // CraftBukkit start
+ public boolean slowWhenEmpty = true;
@@ -31,10 +31,10 @@
+ public double maxSpeed = 0.4D;
+ // CraftBukkit end
+
- public EntityMinecartAbstract(World world) {
- super(world);
- this.i = true;
-@@ -101,6 +121,19 @@
+ protected EntityMinecartAbstract(EntityTypes<?> entitytypes, World world) {
+ super(entitytypes, world);
+ this.j = true;
+@@ -98,6 +118,19 @@
if (this.isInvulnerable(damagesource)) {
return false;
} else {
@@ -51,10 +51,10 @@
+
+ f = (float) event.getDamage();
+ // CraftBukkit end
- this.e(-this.u());
- this.d(10);
- this.ax();
-@@ -108,6 +141,15 @@
+ this.l(-this.u());
+ this.e(10);
+ this.aA();
+@@ -105,6 +138,15 @@
boolean flag = damagesource.getEntity() instanceof EntityHuman && ((EntityHuman) damagesource.getEntity()).abilities.canInstantlyBuild;
if (flag || this.getDamage() > 40.0F) {
@@ -70,10 +70,10 @@
this.ejectPassengers();
if (flag && !this.hasCustomName()) {
this.die();
-@@ -146,6 +188,14 @@
+@@ -143,6 +185,14 @@
}
- public void B_() {
+ public void tick() {
+ // CraftBukkit start
+ double prevX = this.locX;
+ double prevY = this.locY;
@@ -83,9 +83,9 @@
+ // CraftBukkit end
+
if (this.getType() > 0) {
- this.d(this.getType() - 1);
+ this.e(this.getType() - 1);
}
-@@ -160,6 +210,8 @@
+@@ -157,6 +207,8 @@
int i;
@@ -94,15 +94,15 @@
if (!this.world.isClientSide && this.world instanceof WorldServer) {
this.world.methodProfiler.a("portal");
MinecraftServer minecraftserver = this.world.getMinecraftServer();
-@@ -199,6 +251,7 @@
+@@ -196,6 +248,7 @@
- this.world.methodProfiler.b();
+ this.world.methodProfiler.e();
}
+ */
if (this.world.isClientSide) {
- if (this.at > 0) {
-@@ -266,6 +319,18 @@
+ if (this.aw > 0) {
+@@ -263,6 +316,18 @@
}
this.setYawPitch(this.yaw, this.pitch);
@@ -121,7 +121,7 @@
if (this.v() == EntityMinecartAbstract.EnumMinecartType.RIDEABLE && this.motX * this.motX + this.motZ * this.motZ > 0.01D) {
List list = this.world.getEntities(this, this.getBoundingBox().grow(0.20000000298023224D, 0.0D, 0.20000000298023224D), IEntitySelector.a(this));
-@@ -274,8 +339,24 @@
+@@ -271,8 +336,24 @@
Entity entity = (Entity) list.get(l);
if (!(entity instanceof EntityHuman) && !(entity instanceof EntityIronGolem) && !(entity instanceof EntityMinecartAbstract) && !this.isVehicle() && !entity.isPassenger()) {
@@ -146,7 +146,7 @@
entity.collide(this);
}
}
-@@ -287,6 +368,14 @@
+@@ -284,6 +365,14 @@
Entity entity1 = (Entity) iterator.next();
if (!this.w(entity1) && entity1.isCollidable() && entity1 instanceof EntityMinecartAbstract) {
@@ -161,7 +161,7 @@
entity1.collide(this);
}
}
-@@ -297,7 +386,7 @@
+@@ -294,7 +383,7 @@
}
protected double p() {
@@ -170,7 +170,7 @@
}
public void a(int i, int j, int k, boolean flag) {}
-@@ -308,16 +397,20 @@
+@@ -305,16 +394,20 @@
this.motX = MathHelper.a(this.motX, -d0, d0);
this.motZ = MathHelper.a(this.motZ, -d0, d0);
if (this.onGround) {
@@ -197,7 +197,7 @@
}
}
-@@ -505,7 +598,7 @@
+@@ -502,7 +595,7 @@
}
protected void r() {
@@ -206,7 +206,7 @@
this.motX *= 0.996999979019165D;
this.motY *= 0.0D;
this.motZ *= 0.996999979019165D;
-@@ -618,6 +711,14 @@
+@@ -599,6 +692,14 @@
if (!this.world.isClientSide) {
if (!entity.noclip && !this.noclip) {
if (!this.w(entity)) {
@@ -221,8 +221,8 @@
double d0 = entity.locX - this.locX;
double d1 = entity.locZ - this.locZ;
double d2 = d0 * d0 + d1 * d1;
-@@ -780,4 +881,26 @@
-
+@@ -745,4 +846,26 @@
+ return this.i;
}
}
+
diff --git a/nms-patches/EntityMinecartCommandBlock.patch b/nms-patches/EntityMinecartCommandBlock.patch
index 1f44e4af..e6ac3a1c 100644
--- a/nms-patches/EntityMinecartCommandBlock.patch
+++ b/nms-patches/EntityMinecartCommandBlock.patch
@@ -1,12 +1,15 @@
--- a/net/minecraft/server/EntityMinecartCommandBlock.java
+++ b/net/minecraft/server/EntityMinecartCommandBlock.java
-@@ -5,6 +5,9 @@
- public static final DataWatcherObject<String> COMMAND = DataWatcher.a(EntityMinecartCommandBlock.class, DataWatcherRegistry.d);
- private static final DataWatcherObject<IChatBaseComponent> b = DataWatcher.a(EntityMinecartCommandBlock.class, DataWatcherRegistry.e);
- private final CommandBlockListenerAbstract c = new CommandBlockListenerAbstract() {
-+ {
-+ this.sender = (org.bukkit.craftbukkit.entity.CraftMinecartCommand) EntityMinecartCommandBlock.this.getBukkitEntity(); // CraftBukkit - Set the sender
+@@ -92,5 +92,12 @@
+ public CommandListenerWrapper getWrapper() {
+ return new CommandListenerWrapper(this, new Vec3D(EntityMinecartCommandBlock.this.locX, EntityMinecartCommandBlock.this.locY, EntityMinecartCommandBlock.this.locZ), EntityMinecartCommandBlock.this.aO(), this.d(), 2, this.getName().getString(), EntityMinecartCommandBlock.this.getScoreboardDisplayName(), this.d().getMinecraftServer(), EntityMinecartCommandBlock.this);
+ }
++
++ // CraftBukkit start
++ @Override
++ public org.bukkit.command.CommandSender getBukkitSender(CommandListenerWrapper wrapper) {
++ return (org.bukkit.craftbukkit.entity.CraftMinecartCommand) EntityMinecartCommandBlock.this.getBukkitEntity();
+ }
- public void i() {
- EntityMinecartCommandBlock.this.getDataWatcher().set(EntityMinecartCommandBlock.COMMAND, this.getCommand());
- EntityMinecartCommandBlock.this.getDataWatcher().set(EntityMinecartCommandBlock.b, this.l());
++ // CraftBukkit end
+ }
+ }
diff --git a/nms-patches/EntityMinecartContainer.patch b/nms-patches/EntityMinecartContainer.patch
index 19c2f366..f2044686 100644
--- a/nms-patches/EntityMinecartContainer.patch
+++ b/nms-patches/EntityMinecartContainer.patch
@@ -54,15 +54,15 @@
+ }
+ // CraftBukkit end
+
- public EntityMinecartContainer(World world) {
- super(world);
+ protected EntityMinecartContainer(EntityTypes<?> entitytypes, World world) {
+ super(entitytypes, world);
- this.items = NonNullList.a(36, ItemStack.a);
+ this.items = NonNullList.a(this.getSize(), ItemStack.a); // CraftBukkit - SPIGOT-3513
this.b = true;
}
- public EntityMinecartContainer(World world, double d0, double d1, double d2) {
- super(world, d0, d1, d2);
+ protected EntityMinecartContainer(EntityTypes<?> entitytypes, double d0, double d1, double d2, World world) {
+ super(entitytypes, world, d0, d1, d2);
- this.items = NonNullList.a(36, ItemStack.a);
+ this.items = NonNullList.a(this.getSize(), ItemStack.a); // CraftBukkit - SPIGOT-3513
this.b = true;
diff --git a/nms-patches/EntityMonster.patch b/nms-patches/EntityMonster.patch
deleted file mode 100644
index 0a19ca7d..00000000
--- a/nms-patches/EntityMonster.patch
+++ /dev/null
@@ -1,26 +0,0 @@
---- a/net/minecraft/server/EntityMonster.java
-+++ b/net/minecraft/server/EntityMonster.java
-@@ -1,5 +1,7 @@
- package net.minecraft.server;
-
-+import org.bukkit.event.entity.EntityCombustByEntityEvent; // CraftBukkit
-+
- public abstract class EntityMonster extends EntityCreature implements IMonster {
-
- public EntityMonster(World world) {
-@@ -75,7 +77,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
- }
-
- if (entity instanceof EntityHuman) {
diff --git a/nms-patches/EntityMushroomCow.patch b/nms-patches/EntityMushroomCow.patch
index 4fa155b3..8888c99b 100644
--- a/nms-patches/EntityMushroomCow.patch
+++ b/nms-patches/EntityMushroomCow.patch
@@ -8,7 +8,7 @@
public class EntityMushroomCow extends EntityCow {
-@@ -27,6 +28,14 @@
+@@ -23,6 +24,14 @@
return true;
} else if (itemstack.getItem() == Items.SHEARS && this.getAge() >= 0) {
@@ -21,5 +21,5 @@
+ }
+ // 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]);
+ this.world.addParticle(Particles.u, this.locX, this.locY + (double) (this.length / 2.0F), this.locZ, 0.0D, 0.0D, 0.0D);
if (!this.world.isClientSide) {
diff --git a/nms-patches/EntityOcelot.patch b/nms-patches/EntityOcelot.patch
index 1caea988..9f18245b 100644
--- a/nms-patches/EntityOcelot.patch
+++ b/nms-patches/EntityOcelot.patch
@@ -1,6 +1,6 @@
--- a/net/minecraft/server/EntityOcelot.java
+++ b/net/minecraft/server/EntityOcelot.java
-@@ -57,7 +57,7 @@
+@@ -60,7 +60,7 @@
}
protected boolean isTypeNotPersistent() {
@@ -9,7 +9,7 @@
}
protected void initAttributes() {
-@@ -108,7 +108,8 @@
+@@ -107,7 +107,8 @@
return false;
} else {
if (this.goalSit != null) {
@@ -19,7 +19,7 @@
}
return super.damageEntity(damagesource, f);
-@@ -133,7 +134,8 @@
+@@ -132,7 +133,8 @@
}
if (!this.world.isClientSide) {
@@ -28,8 +28,8 @@
+ if (this.random.nextInt(3) == 0 && !org.bukkit.craftbukkit.event.CraftEventFactory.callEntityTameEvent(this, entityhuman).isCancelled()) {
this.c(entityhuman);
this.setCatType(1 + this.world.random.nextInt(3));
- this.p(true);
-@@ -237,7 +239,7 @@
+ this.s(true);
+@@ -238,7 +240,7 @@
entityocelot.setPositionRotation(this.locX, this.locY, this.locZ, this.yaw, 0.0F);
entityocelot.setAgeRaw(-24000);
diff --git a/nms-patches/EntityPainting.patch b/nms-patches/EntityPainting.patch
index 06269bbb..cc62b670 100644
--- a/nms-patches/EntityPainting.patch
+++ b/nms-patches/EntityPainting.patch
@@ -1,10 +1,13 @@
--- a/net/minecraft/server/EntityPainting.java
+++ b/net/minecraft/server/EntityPainting.java
-@@ -11,6 +11,7 @@
+@@ -11,6 +11,10 @@
public EntityPainting(World world) {
- super(world);
-+ this.art = EnumArt.values()[this.random.nextInt(EnumArt.values().length)]; // CraftBukkit - generate a non-null painting
+ super(EntityTypes.PAINTING, world);
++ // CraftBukkit start - generate a non-null painting
++ ArrayList arraylist = Lists.newArrayList(Paintings.a);
++ this.art = (Paintings) arraylist.get(this.random.nextInt(arraylist.size()));
++ // CraftBukkit end
}
public EntityPainting(World world, BlockPosition blockposition, EnumDirection enumdirection) {
diff --git a/nms-patches/EntityParrot.patch b/nms-patches/EntityParrot.patch
index 432c1d97..07a227bb 100644
--- a/nms-patches/EntityParrot.patch
+++ b/nms-patches/EntityParrot.patch
@@ -1,33 +1,24 @@
--- a/net/minecraft/server/EntityParrot.java
+++ b/net/minecraft/server/EntityParrot.java
-@@ -15,7 +15,7 @@
- private static final DataWatcherObject<Integer> bG = DataWatcher.a(EntityParrot.class, DataWatcherRegistry.b);
- private static final Predicate<EntityInsentient> bH = new Predicate() {
- public boolean a(@Nullable EntityInsentient entityinsentient) {
-- return entityinsentient != null && EntityParrot.bK.containsKey(EntityTypes.b.a((Object) entityinsentient.getClass()));
-+ return entityinsentient != null && EntityParrot.bK.containsKey(EntityTypes.b.a(entityinsentient.getClass())); // CraftBukkit - decompile error
- }
-
- public boolean apply(@Nullable Object object) {
-@@ -114,7 +114,7 @@
- EntityInsentient entityinsentient = (EntityInsentient) list.get(world.random.nextInt(list.size()));
-
- if (!entityinsentient.isSilent()) {
-- SoundEffect soundeffect = g(EntityTypes.b.a((Object) entityinsentient.getClass()));
-+ SoundEffect soundeffect = g(EntityTypes.b.a(entityinsentient.getClass())); // CraftBukkit - decompile error
-
- world.a((EntityHuman) null, entity.locX, entity.locY, entity.locZ, soundeffect, entity.bK(), 0.7F, b(world.random));
- return true;
-@@ -140,7 +140,7 @@
+@@ -27,7 +27,7 @@
+ };
+ private static final Item bN = Items.COOKIE;
+ private static final Set<Item> bO = Sets.newHashSet(new Item[] { Items.WHEAT_SEEDS, Items.MELON_SEEDS, Items.PUMPKIN_SEEDS, Items.BEETROOT_SEEDS});
+- private static final Map<EntityTypes<?>, SoundEffect> bP = (Map) SystemUtils.a((Object) Maps.newHashMap(), (hashmap) -> {
++ private static final Map<EntityTypes<?>, SoundEffect> bP = (Map) SystemUtils.a(Maps.newHashMap(), (hashmap) -> { // CraftBukkit - decompile error
+ hashmap.put(EntityTypes.BLAZE, SoundEffects.ENTITY_PARROT_IMITATE_BLAZE);
+ hashmap.put(EntityTypes.CAVE_SPIDER, SoundEffects.ENTITY_PARROT_IMITATE_SPIDER);
+ hashmap.put(EntityTypes.CREEPER, SoundEffects.ENTITY_PARROT_IMITATE_CREEPER);
+@@ -174,7 +174,7 @@
}
if (!this.world.isClientSide) {
- if (this.random.nextInt(10) == 0) {
+ if (this.random.nextInt(10) == 0 && !org.bukkit.craftbukkit.event.CraftEventFactory.callEntityTameEvent(this, entityhuman).isCancelled()) { // CraftBukkit
this.c(entityhuman);
- this.p(true);
+ this.s(true);
this.world.broadcastEntityEffect(this, (byte) 7);
-@@ -276,7 +276,8 @@
+@@ -310,7 +310,8 @@
return false;
} else {
if (this.goalSit != null) {
@@ -37,67 +28,3 @@
}
return super.damageEntity(damagesource, f);
-@@ -316,33 +317,35 @@
- }
-
- static {
-- EntityParrot.bK.put(EntityTypes.b.a((Object) EntityBlaze.class), SoundEffects.eM);
-- EntityParrot.bK.put(EntityTypes.b.a((Object) EntityCaveSpider.class), SoundEffects.fc);
-- EntityParrot.bK.put(EntityTypes.b.a((Object) EntityCreeper.class), SoundEffects.eN);
-- EntityParrot.bK.put(EntityTypes.b.a((Object) EntityGuardianElder.class), SoundEffects.eO);
-- EntityParrot.bK.put(EntityTypes.b.a((Object) EntityEnderDragon.class), SoundEffects.eP);
-- EntityParrot.bK.put(EntityTypes.b.a((Object) EntityEnderman.class), SoundEffects.eQ);
-- EntityParrot.bK.put(EntityTypes.b.a((Object) EntityEndermite.class), SoundEffects.eR);
-- EntityParrot.bK.put(EntityTypes.b.a((Object) EntityEvoker.class), SoundEffects.eS);
-- EntityParrot.bK.put(EntityTypes.b.a((Object) EntityGhast.class), SoundEffects.eT);
-- EntityParrot.bK.put(EntityTypes.b.a((Object) EntityZombieHusk.class), SoundEffects.eU);
-- EntityParrot.bK.put(EntityTypes.b.a((Object) EntityIllagerIllusioner.class), SoundEffects.eV);
-- EntityParrot.bK.put(EntityTypes.b.a((Object) EntityMagmaCube.class), SoundEffects.eW);
-- EntityParrot.bK.put(EntityTypes.b.a((Object) EntityPigZombie.class), SoundEffects.fl);
-- EntityParrot.bK.put(EntityTypes.b.a((Object) EntityPolarBear.class), SoundEffects.eX);
-- EntityParrot.bK.put(EntityTypes.b.a((Object) EntityShulker.class), SoundEffects.eY);
-- EntityParrot.bK.put(EntityTypes.b.a((Object) EntitySilverfish.class), SoundEffects.eZ);
-- EntityParrot.bK.put(EntityTypes.b.a((Object) EntitySkeleton.class), SoundEffects.fa);
-- EntityParrot.bK.put(EntityTypes.b.a((Object) EntitySlime.class), SoundEffects.fb);
-- EntityParrot.bK.put(EntityTypes.b.a((Object) EntitySpider.class), SoundEffects.fc);
-- EntityParrot.bK.put(EntityTypes.b.a((Object) EntitySkeletonStray.class), SoundEffects.fd);
-- EntityParrot.bK.put(EntityTypes.b.a((Object) EntityVex.class), SoundEffects.fe);
-- EntityParrot.bK.put(EntityTypes.b.a((Object) EntityVindicator.class), SoundEffects.ff);
-- EntityParrot.bK.put(EntityTypes.b.a((Object) EntityWitch.class), SoundEffects.fg);
-- EntityParrot.bK.put(EntityTypes.b.a((Object) EntityWither.class), SoundEffects.fh);
-- EntityParrot.bK.put(EntityTypes.b.a((Object) EntitySkeletonWither.class), SoundEffects.fi);
-- EntityParrot.bK.put(EntityTypes.b.a((Object) EntityWolf.class), SoundEffects.fj);
-- EntityParrot.bK.put(EntityTypes.b.a((Object) EntityZombie.class), SoundEffects.fk);
-- EntityParrot.bK.put(EntityTypes.b.a((Object) EntityZombieVillager.class), SoundEffects.fm);
-+ // CraftBukkit start
-+ EntityParrot.bK.put(EntityTypes.b.a(EntityBlaze.class), SoundEffects.eM);
-+ EntityParrot.bK.put(EntityTypes.b.a(EntityCaveSpider.class), SoundEffects.fc);
-+ EntityParrot.bK.put(EntityTypes.b.a(EntityCreeper.class), SoundEffects.eN);
-+ EntityParrot.bK.put(EntityTypes.b.a(EntityGuardianElder.class), SoundEffects.eO);
-+ EntityParrot.bK.put(EntityTypes.b.a(EntityEnderDragon.class), SoundEffects.eP);
-+ EntityParrot.bK.put(EntityTypes.b.a(EntityEnderman.class), SoundEffects.eQ);
-+ EntityParrot.bK.put(EntityTypes.b.a(EntityEndermite.class), SoundEffects.eR);
-+ EntityParrot.bK.put(EntityTypes.b.a(EntityEvoker.class), SoundEffects.eS);
-+ EntityParrot.bK.put(EntityTypes.b.a(EntityGhast.class), SoundEffects.eT);
-+ EntityParrot.bK.put(EntityTypes.b.a(EntityZombieHusk.class), SoundEffects.eU);
-+ EntityParrot.bK.put(EntityTypes.b.a(EntityIllagerIllusioner.class), SoundEffects.eV);
-+ EntityParrot.bK.put(EntityTypes.b.a(EntityMagmaCube.class), SoundEffects.eW);
-+ EntityParrot.bK.put(EntityTypes.b.a(EntityPigZombie.class), SoundEffects.fl);
-+ EntityParrot.bK.put(EntityTypes.b.a(EntityPolarBear.class), SoundEffects.eX);
-+ EntityParrot.bK.put(EntityTypes.b.a(EntityShulker.class), SoundEffects.eY);
-+ EntityParrot.bK.put(EntityTypes.b.a(EntitySilverfish.class), SoundEffects.eZ);
-+ EntityParrot.bK.put(EntityTypes.b.a(EntitySkeleton.class), SoundEffects.fa);
-+ EntityParrot.bK.put(EntityTypes.b.a(EntitySlime.class), SoundEffects.fb);
-+ EntityParrot.bK.put(EntityTypes.b.a(EntitySpider.class), SoundEffects.fc);
-+ EntityParrot.bK.put(EntityTypes.b.a(EntitySkeletonStray.class), SoundEffects.fd);
-+ EntityParrot.bK.put(EntityTypes.b.a(EntityVex.class), SoundEffects.fe);
-+ EntityParrot.bK.put(EntityTypes.b.a(EntityVindicator.class), SoundEffects.ff);
-+ EntityParrot.bK.put(EntityTypes.b.a(EntityWitch.class), SoundEffects.fg);
-+ EntityParrot.bK.put(EntityTypes.b.a(EntityWither.class), SoundEffects.fh);
-+ EntityParrot.bK.put(EntityTypes.b.a(EntitySkeletonWither.class), SoundEffects.fi);
-+ EntityParrot.bK.put(EntityTypes.b.a(EntityWolf.class), SoundEffects.fj);
-+ EntityParrot.bK.put(EntityTypes.b.a(EntityZombie.class), SoundEffects.fk);
-+ EntityParrot.bK.put(EntityTypes.b.a(EntityZombieVillager.class), SoundEffects.fm);
-+ // CraftBukkit end
- }
- }
diff --git a/nms-patches/EntityPhantom.patch b/nms-patches/EntityPhantom.patch
new file mode 100644
index 00000000..a6589d39
--- /dev/null
+++ b/nms-patches/EntityPhantom.patch
@@ -0,0 +1,20 @@
+--- a/net/minecraft/server/EntityPhantom.java
++++ b/net/minecraft/server/EntityPhantom.java
+@@ -186,7 +186,7 @@
+ } else {
+ this.b = 60;
+ AxisAlignedBB axisalignedbb = EntityPhantom.this.getBoundingBox().grow(16.0D, 64.0D, 16.0D);
+- List list = EntityPhantom.this.world.a(EntityHuman.class, axisalignedbb);
++ List<EntityHuman> list = EntityPhantom.this.world.a(EntityHuman.class, axisalignedbb); // CraftBukkit - decompile error
+
+ if (!list.isEmpty()) {
+ list.sort((entityhuman, entityhuman1) -> {
+@@ -198,7 +198,7 @@
+ EntityHuman entityhuman = (EntityHuman) iterator.next();
+
+ if (PathfinderGoalTarget.a(EntityPhantom.this, entityhuman, false, false)) {
+- EntityPhantom.this.setGoalTarget(entityhuman);
++ EntityPhantom.this.setGoalTarget(entityhuman, org.bukkit.event.entity.EntityTargetEvent.TargetReason.CLOSEST_PLAYER, true); // CraftBukkit - reason
+ return true;
+ }
+ }
diff --git a/nms-patches/EntityPig.patch b/nms-patches/EntityPig.patch
index 0af22aaf..02669176 100644
--- a/nms-patches/EntityPig.patch
+++ b/nms-patches/EntityPig.patch
@@ -1,15 +1,15 @@
--- a/net/minecraft/server/EntityPig.java
+++ b/net/minecraft/server/EntityPig.java
-@@ -4,6 +4,8 @@
- import java.util.Set;
+@@ -2,6 +2,8 @@
+
import javax.annotation.Nullable;
+import org.bukkit.craftbukkit.event.CraftEventFactory; // CraftBukkit
+
public class EntityPig extends EntityAnimal {
- private static final DataWatcherObject<Boolean> bx = DataWatcher.a(EntityPig.class, DataWatcherRegistry.h);
-@@ -124,13 +126,14 @@
+ private static final DataWatcherObject<Boolean> bC = DataWatcher.a(EntityPig.class, DataWatcherRegistry.i);
+@@ -118,13 +120,14 @@
}
public void die(DamageSource damagesource) {
@@ -17,7 +17,7 @@
+ // super.die(damagesource); // CraftBukkit - Moved to end
if (!this.world.isClientSide) {
if (this.hasSaddle()) {
- this.a(Items.SADDLE, 1);
+ this.a((IMaterial) Items.SADDLE);
}
}
@@ -25,7 +25,7 @@
}
@Nullable
-@@ -155,6 +158,12 @@
+@@ -149,6 +152,12 @@
if (!this.world.isClientSide && !this.dead) {
EntityPigZombie entitypigzombie = new EntityPigZombie(this.world);
@@ -38,7 +38,7 @@
entitypigzombie.setSlot(EnumItemSlot.MAINHAND, new ItemStack(Items.GOLDEN_SWORD));
entitypigzombie.setPositionRotation(this.locX, this.locY, this.locZ, this.yaw, this.pitch);
entitypigzombie.setNoAI(this.isNoAI());
-@@ -163,7 +172,8 @@
+@@ -157,7 +166,8 @@
entitypigzombie.setCustomNameVisible(this.getCustomNameVisible());
}
diff --git a/nms-patches/EntityPlayer.patch b/nms-patches/EntityPlayer.patch
index 364fe7e4..71ab9dcd 100644
--- a/nms-patches/EntityPlayer.patch
+++ b/nms-patches/EntityPlayer.patch
@@ -1,6 +1,6 @@
--- a/net/minecraft/server/EntityPlayer.java
+++ b/net/minecraft/server/EntityPlayer.java
-@@ -11,10 +11,27 @@
+@@ -15,11 +15,29 @@
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
@@ -8,6 +8,7 @@
+import com.google.common.base.Preconditions;
+import org.bukkit.Bukkit;
+import org.bukkit.GameMode;
++import org.bukkit.Location;
+import org.bukkit.WeatherType;
+import org.bukkit.craftbukkit.CraftWorld;
+import org.bukkit.craftbukkit.entity.CraftPlayer;
@@ -23,13 +24,14 @@
+
public class EntityPlayer extends EntityHuman implements ICrafting {
- private static final Logger bV = LogManager.getLogger();
+ private static final Logger cc = LogManager.getLogger();
+ private static final IChatBaseComponent cd = (new ChatMessage("multiplayer.message_not_delivered", new Object[0])).a(EnumChatFormat.RED);
- public String locale = "en_US";
+ public String locale = "en_us"; // CraftBukkit - lowercase
public PlayerConnection playerConnection;
public final MinecraftServer server;
public final PlayerInteractManager playerInteractManager;
-@@ -50,10 +67,45 @@
+@@ -55,6 +73,19 @@
public int ping;
public boolean viewingCredits;
@@ -47,69 +49,73 @@
+ // CraftBukkit end
+
public EntityPlayer(MinecraftServer minecraftserver, WorldServer worldserver, GameProfile gameprofile, PlayerInteractManager playerinteractmanager) {
- super(worldserver, gameprofile);
+ super((World) worldserver, gameprofile);
playerinteractmanager.player = this;
- this.playerInteractManager = playerinteractmanager;
-+ // CraftBukkit start
-+ BlockPosition blockposition = getSpawnPoint(minecraftserver, worldserver);
-+
-+ this.server = minecraftserver;
-+ this.bZ = minecraftserver.getPlayerList().getStatisticManager(this);
-+ this.bY = minecraftserver.getPlayerList().h(this);
-+ this.P = 1.0F;
-+ this.setPositionRotation(blockposition, 0.0F, 0.0F);
-+ // CraftBukkit end
-+
-+ while (!worldserver.getCubes(this, this.getBoundingBox()).isEmpty() && this.locY < 255.0D) {
-+ this.setPosition(this.locX, this.locY + 1.0D, this.locZ);
-+ }
+@@ -65,7 +96,49 @@
+ this.cg = minecraftserver.getPlayerList().h(this);
+ this.Q = 1.0F;
+ this.a(worldserver);
+
+ // CraftBukkit start
+ this.displayName = this.getName();
+ this.canPickUpLoot = true;
+ this.maxHealthCache = this.getMaxHealth();
-+ // CraftBukkit end
+ }
+
-+ public final BlockPosition getSpawnPoint(MinecraftServer minecraftserver, WorldServer worldserver) {
- BlockPosition blockposition = worldserver.getSpawn();
-
- if (worldserver.worldProvider.m() && worldserver.getWorldData().getGameType() != EnumGamemode.ADVENTURE) {
-@@ -71,17 +123,9 @@
- blockposition = worldserver.q(blockposition.a(this.random.nextInt(i * 2 + 1) - i, 0, this.random.nextInt(i * 2 + 1) - i));
- }
-
-- this.server = minecraftserver;
-- this.bZ = minecraftserver.getPlayerList().getStatisticManager(this);
-- this.bY = minecraftserver.getPlayerList().h(this);
-- this.P = 1.0F;
-- this.setPositionRotation(blockposition, 0.0F, 0.0F);
--
-- while (!worldserver.getCubes(this, this.getBoundingBox()).isEmpty() && this.locY < 255.0D) {
-- this.setPosition(this.locX, this.locY + 1.0D, this.locZ);
-- }
--
++ // Yes, this doesn't match Vanilla, but it's the best we can do for now.
++ // If this is an issue, PRs are welcome
++ public final BlockPosition getSpawnPoint(WorldServer worldserver) {
++ BlockPosition blockposition = worldserver.getSpawn();
++
++ if (worldserver.worldProvider.g() && worldserver.getWorldData().getGameType() != EnumGamemode.ADVENTURE) {
++ int i = Math.max(0, this.server.a(worldserver));
++ int j = MathHelper.floor(worldserver.getWorldBorder().b((double) blockposition.getX(), (double) blockposition.getZ()));
++
++ if (j < i) {
++ i = j;
++ }
++
++ if (j <= 1) {
++ i = 1;
++ }
++
++ int k = (i * 2 + 1) * (i * 2 + 1);
++ int l = this.s(k);
++ int i1 = (new Random()).nextInt(k);
++
++ for (int j1 = 0; j1 < k; ++j1) {
++ int k1 = (i1 + l * j1) % k;
++ int l1 = k1 % (i * 2 + 1);
++ int i2 = k1 / (i * 2 + 1);
++ BlockPosition blockposition1 = worldserver.o().a(blockposition.getX() + l1 - i, blockposition.getZ() + i2 - i, false);
++
++ if (blockposition1 != null) {
++ return blockposition1;
++ }
++ }
++ }
++
+ return blockposition;
}
+ // CraftBukkit end
- public void a(NBTTagCompound nbttagcompound) {
- super.a(nbttagcompound);
-@@ -103,6 +147,7 @@
+ private void a(WorldServer worldserver) {
+ BlockPosition blockposition = worldserver.getSpawn();
+@@ -133,6 +206,7 @@
if (nbttagcompound.hasKeyOfType("recipeBook", 10)) {
- this.cr.a(nbttagcompound.getCompound("recipeBook"));
+ this.cz.a(nbttagcompound.getCompound("recipeBook"));
}
+ this.getBukkitEntity().readExtraData(nbttagcompound); // CraftBukkit
}
-@@ -149,7 +194,33 @@
+@@ -163,8 +237,34 @@
}
- nbttagcompound.set("recipeBook", this.cr.c());
+ nbttagcompound.set("recipeBook", this.cz.e());
+ this.getBukkitEntity().setExtraData(nbttagcompound); // CraftBukkit
-+ }
-+
+ }
+
+ // CraftBukkit start - World fallback code, either respawn location or global spawn
+ public void spawnIn(World world) {
+ super.spawnIn(world);
@@ -132,15 +138,16 @@
+ }
+ this.dimension = ((WorldServer) this.world).dimension;
+ this.playerInteractManager.a((WorldServer) world);
- }
++ }
+ // CraftBukkit end
-
- public void levelDown(int i) {
- super.levelDown(i);
-@@ -184,6 +255,11 @@
++
+ public void a(int i) {
+ float f = (float) this.getExpToLevel();
+ float f1 = (f - 1.0F) / f;
+@@ -211,6 +311,11 @@
}
- public void B_() {
+ public void tick() {
+ // CraftBukkit start
+ if (this.joining) {
+ this.joining = false;
@@ -149,17 +156,17 @@
this.playerInteractManager.a();
--this.invulnerableTicks;
if (this.noDamageTicks > 0) {
-@@ -249,7 +325,7 @@
+@@ -276,7 +381,7 @@
}
- if (this.getHealth() != this.lastHealthSent || this.ch != this.foodData.getFoodLevel() || this.foodData.getSaturationLevel() == 0.0F != this.ci) {
+ if (this.getHealth() != this.lastHealthSent || this.cp != this.foodData.getFoodLevel() || this.foodData.getSaturationLevel() == 0.0F != this.cq) {
- 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())); // CraftBukkit
this.lastHealthSent = this.getHealth();
- this.ch = this.foodData.getFoodLevel();
- this.ci = this.foodData.getSaturationLevel() == 0.0F;
-@@ -270,6 +346,12 @@
- this.a(IScoreboardCriteria.i, MathHelper.f((float) this.cc));
+ this.cp = this.foodData.getFoodLevel();
+ this.cq = this.foodData.getSaturationLevel() == 0.0F;
+@@ -307,6 +412,12 @@
+ this.a(IScoreboardCriteria.k, MathHelper.f((float) this.cn));
}
+ // CraftBukkit start - Force max health updates
@@ -168,11 +175,11 @@
+ }
+ // CraftBukkit end
+
- if (this.getArmorStrength() != this.cd) {
- this.cd = this.getArmorStrength();
- this.a(IScoreboardCriteria.j, MathHelper.f((float) this.cd));
-@@ -294,6 +376,16 @@
- CriterionTriggers.o.a(this);
+ if (this.expLevel != this.cm) {
+ this.cm = this.expLevel;
+ this.a(IScoreboardCriteria.l, MathHelper.f((float) this.cm));
+@@ -321,6 +432,16 @@
+ CriterionTriggers.p.a(this);
}
+ // CraftBukkit start - initialize oldLevel and fire PlayerLevelChangeEvent
@@ -188,27 +195,22 @@
} catch (Throwable throwable) {
CrashReport crashreport = CrashReport.a(throwable, "Ticking player");
CrashReportSystemDetails crashreportsystemdetails = crashreport.a("Player being ticked");
-@@ -304,12 +396,11 @@
+@@ -331,7 +452,8 @@
}
private void a(IScoreboardCriteria iscoreboardcriteria, int i) {
-- Collection collection = this.getScoreboard().getObjectivesForCriteria(iscoreboardcriteria);
-+ Collection collection = this.world.getServer().getScoreboardManager().getScoreboardScores(iscoreboardcriteria, this.getName(), new java.util.ArrayList<ScoreboardScore>()); // CraftBukkit - Use our scores instead
- 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
-
+- this.getScoreboard().getObjectivesForCriteria(iscoreboardcriteria, this.getName(), (scoreboardscore) -> {
++ // CraftBukkit - Use our scores instead
++ this.world.getServer().getScoreboardManager().getScoreboardScores(iscoreboardcriteria, this.getName(), (scoreboardscore) -> {
scoreboardscore.setScore(i);
- }
-@@ -320,32 +411,62 @@
+ });
+ }
+@@ -340,27 +462,59 @@
boolean flag = this.world.getGameRules().getBoolean("showDeathMessages");
this.playerConnection.sendPacket(new PacketPlayOutCombatEvent(this.getCombatTracker(), PacketPlayOutCombatEvent.EnumCombatEventType.ENTITY_DIED, flag));
- if (flag) {
-- ScoreboardTeamBase scoreboardteambase = this.aY();
+- ScoreboardTeamBase scoreboardteambase = this.be();
+ // CraftBukkit start - fire PlayerDeathEvent
+ if (this.dead) {
+ return;
@@ -223,22 +225,22 @@
+ }
+ }
+ }
-+
-+ IChatBaseComponent chatmessage = this.getCombatTracker().getDeathMessage();
-+
-+ String deathmessage = chatmessage.toPlainText();
-+ org.bukkit.event.entity.PlayerDeathEvent event = CraftEventFactory.callPlayerDeathEvent(this, loot, deathmessage, keepInventory);
- if (scoreboardteambase != null && scoreboardteambase.getDeathMessageVisibility() != ScoreboardTeamBase.EnumNameTagVisibility.ALWAYS) {
- if (scoreboardteambase.getDeathMessageVisibility() == ScoreboardTeamBase.EnumNameTagVisibility.HIDE_FOR_OTHER_TEAMS) {
- this.server.getPlayerList().a((EntityHuman) this, this.getCombatTracker().getDeathMessage());
- } else if (scoreboardteambase.getDeathMessageVisibility() == ScoreboardTeamBase.EnumNameTagVisibility.HIDE_FOR_OWN_TEAM) {
- this.server.getPlayerList().b((EntityHuman) this, this.getCombatTracker().getDeathMessage());
++ IChatBaseComponent chatmessage = this.getCombatTracker().getDeathMessage();
++
++ String deathmessage = chatmessage.getString();
++ org.bukkit.event.entity.PlayerDeathEvent event = CraftEventFactory.callPlayerDeathEvent(this, loot, deathmessage, keepInventory);
++
+ String deathMessage = event.getDeathMessage();
+
+ if (deathMessage != null && deathMessage.length() > 0 && flag) { // TODO: allow plugins to override?
+ if (deathMessage.equals(deathmessage)) {
-+ ScoreboardTeamBase scoreboardteambase = this.aY();
++ ScoreboardTeamBase scoreboardteambase = this.be();
+
+ if (scoreboardteambase != null && scoreboardteambase.getDeathMessageVisibility() != ScoreboardTeamBase.EnumNameTagVisibility.ALWAYS) {
+ if (scoreboardteambase.getDeathMessageVisibility() == ScoreboardTeamBase.EnumNameTagVisibility.HIDE_FOR_OTHER_TEAMS) {
@@ -257,85 +259,50 @@
this.releaseShoulderEntities();
- if (!this.world.getGameRules().getBoolean("keepInventory") && !this.isSpectator()) {
-- this.cV();
-- this.inventory.o();
+- this.di();
+- this.inventory.q();
+ // we clean the player's inventory after the EntityDeathEvent is called so plugins can get the exact state of the inventory.
+ if (!event.getKeepInventory()) {
+ this.inventory.clear();
}
-- Collection collection = this.world.getScoreboard().getObjectivesForCriteria(IScoreboardCriteria.d);
+- this.getScoreboard().getObjectivesForCriteria(IScoreboardCriteria.d, this.getName(), ScoreboardScore::incrementScore);
+ this.closeInventory();
+ this.setSpectatorTarget(this); // Remove spectated target
+ // CraftBukkit end
+
+ // CraftBukkit - Get our scores instead
-+ Collection collection = this.world.getServer().getScoreboardManager().getScoreboardScores(IScoreboardCriteria.d, this.getName(), new java.util.ArrayList<ScoreboardScore>());
- Iterator iterator = collection.iterator();
++ this.world.getServer().getScoreboardManager().getScoreboardScores(IScoreboardCriteria.d, this.getName(), ScoreboardScore::incrementScore);
++
+ EntityLiving entityliving = this.cu();
- 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
+ if (entityliving != null) {
+@@ -383,10 +537,12 @@
+ String s = this.getName();
+ String s1 = entity.getName();
- scoreboardscore.incrementScore();
- }
-@@ -373,29 +494,36 @@
- if (entity != this) {
- super.a(entity, i, damagesource);
- this.addScore(i);
-- Collection collection = this.getScoreboard().getObjectivesForCriteria(IScoreboardCriteria.f);
+- this.getScoreboard().getObjectivesForCriteria(IScoreboardCriteria.f, s, ScoreboardScore::incrementScore);
+ // CraftBukkit - Get our scores instead
-+ Collection<ScoreboardScore> collection = this.world.getServer().getScoreboardManager().getScoreboardScores(IScoreboardCriteria.f, this.getName(), new java.util.ArrayList<ScoreboardScore>());
-
++ this.world.getServer().getScoreboardManager().getScoreboardScores(IScoreboardCriteria.f, s, ScoreboardScore::incrementScore);
if (entity instanceof EntityHuman) {
- this.b(StatisticList.D);
-- collection.addAll(this.getScoreboard().getObjectivesForCriteria(IScoreboardCriteria.e));
+ this.a(StatisticList.PLAYER_KILLS);
+- this.getScoreboard().getObjectivesForCriteria(IScoreboardCriteria.e, s, ScoreboardScore::incrementScore);
+ // CraftBukkit - Get our scores instead
-+ this.world.getServer().getScoreboardManager().getScoreboardScores(IScoreboardCriteria.e, this.getName(), collection);
-+ // collection.addAll(this.getScoreboard().getObjectivesForCriteria(IScoreboardCriteria.e));
-+ // CraftBukkit end
++ this.world.getServer().getScoreboardManager().getScoreboardScores(IScoreboardCriteria.e, s, ScoreboardScore::incrementScore);
} else {
- this.b(StatisticList.B);
- }
-
- collection.addAll(this.E(entity));
-- Iterator iterator = collection.iterator();
-+ Iterator<ScoreboardScore> iterator = collection.iterator(); // CraftBukkit
-
- while (iterator.hasNext()) {
-- ScoreboardObjective scoreboardobjective = (ScoreboardObjective) iterator.next();
-+ // CraftBukkit start
-+ // ScoreboardObjective scoreboardobjective = (ScoreboardObjective) iterator.next();
-
-- this.getScoreboard().getPlayerScoreForObjective(this.getName(), scoreboardobjective).incrementScore();
-+ // this.getScoreboard().getPlayerScoreForObjective(this.getName(), scoreboardobjective).incrementScore();
-+ iterator.next().incrementScore();
-+ // CraftBukkit end
+ this.a(StatisticList.MOB_KILLS);
}
+@@ -404,7 +560,8 @@
+ int i = scoreboardteam.getColor().b();
- CriterionTriggers.b.a(this, entity, damagesource);
- }
- }
-
-- private Collection<ScoreboardObjective> E(Entity entity) {
-+ private Collection<ScoreboardScore> E(Entity entity) { // CraftBukkit
- String s = entity instanceof EntityHuman ? entity.getName() : entity.bn();
- ScoreboardTeam scoreboardteam = this.getScoreboard().getPlayerTeam(this.getName());
-
-@@ -420,7 +548,10 @@
- int j = scoreboardteam1.getColor().b();
-
- if (j >= 0 && j < IScoreboardCriteria.m.length) {
-- return this.getScoreboard().getObjectivesForCriteria(IScoreboardCriteria.m[j]);
+ if (i >= 0 && i < aiscoreboardcriteria.length) {
+- this.getScoreboard().getObjectivesForCriteria(aiscoreboardcriteria[i], s, ScoreboardScore::incrementScore);
+ // CraftBukkit - Get our scores instead
-+ return this.world.getServer().getScoreboardManager().getScoreboardScores(IScoreboardCriteria.m[j], this.getName(), new java.util.ArrayList<ScoreboardScore>());
-+ // return this.getScoreboard().getObjectivesForCriteria(IScoreboardCriteria.m[j]);
-+ // CraftBukkit end
++ this.world.getServer().getScoreboardManager().getScoreboardScores(aiscoreboardcriteria[i], s, ScoreboardScore::incrementScore);
}
}
-@@ -462,12 +593,14 @@
+@@ -445,12 +602,14 @@
}
private boolean canPvP() {
@@ -345,14 +312,14 @@
}
@Nullable
- public Entity b(int i) {
+ public Entity d(int i) {
- this.worldChangeInvuln = true;
+ if (this.isSleeping()) return this; // CraftBukkit - SPIGOT-3154
+ // this.worldChangeInvuln = true; // CraftBukkit - Moved down and into PlayerList#changeDimension
if (this.dimension == 0 && i == -1) {
- this.cv = new Vec3D(this.locX, this.locY, this.locZ);
+ this.cD = new Vec3D(this.locX, this.locY, this.locZ);
} else if (this.dimension != -1 && i != 0) {
-@@ -475,6 +608,7 @@
+@@ -458,6 +617,7 @@
}
if (this.dimension == 1 && i == 1) {
@@ -360,7 +327,7 @@
this.world.kill(this);
if (!this.viewingCredits) {
this.viewingCredits = true;
-@@ -488,7 +622,10 @@
+@@ -471,7 +631,10 @@
i = 1;
}
@@ -372,15 +339,15 @@
this.playerConnection.sendPacket(new PacketPlayOutWorldEvent(1032, BlockPosition.ZERO, 0, false));
this.lastSentExp = -1;
this.lastHealthSent = -1.0F;
-@@ -534,6 +671,7 @@
+@@ -517,6 +680,7 @@
}
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.x().getTracker().sendPacketToEntity(this, new PacketPlayOutAnimation(this, 2));
+ this.getWorldServer().getTracker().sendPacketToEntity(this, new PacketPlayOutAnimation(this, 2));
}
-@@ -612,23 +750,55 @@
+@@ -595,23 +759,55 @@
this.playerConnection.sendPacket(new PacketPlayOutOpenSignEditor(tileentitysign.getPosition()));
}
@@ -391,12 +358,12 @@
}
public void openTileEntity(ITileEntityContainer itileentitycontainer) {
-- if (itileentitycontainer instanceof ILootable && ((ILootable) itileentitycontainer).b() != null && this.isSpectator()) {
+- if (itileentitycontainer instanceof ILootable && ((ILootable) itileentitycontainer).Q_() != null && this.isSpectator()) {
+ // CraftBukkit start - Inventory open hook
-+ if (false && itileentitycontainer instanceof ILootable && ((ILootable) itileentitycontainer).b() != null && this.isSpectator()) {
- this.a((new ChatMessage("container.spectatorCantOpen", new Object[0])).setChatModifier((new ChatModifier()).setColor(EnumChatFormat.RED)), true);
++ if (false && itileentitycontainer instanceof ILootable && ((ILootable) itileentitycontainer).Q_() != null && this.isSpectator()) {
+ this.a((new ChatMessage("container.spectatorCantOpen", new Object[0])).a(EnumChatFormat.RED), true);
} else {
-+ boolean cancelled = itileentitycontainer instanceof ILootable && ((ILootable) itileentitycontainer).b() != null && this.isSpectator();
++ boolean cancelled = itileentitycontainer instanceof ILootable && ((ILootable) itileentitycontainer).Q_() != null && this.isSpectator();
+ Container container = CraftEventFactory.callInventoryOpenEvent(this, itileentitycontainer.createContainer(this.inventory, this), cancelled);
+ if (container == null) {
+ return;
@@ -436,13 +403,13 @@
+ }
+ // CraftBukkit end
+
- if (iinventory instanceof ILootable && ((ILootable) iinventory).b() != null && this.isSpectator()) {
- this.a((new ChatMessage("container.spectatorCantOpen", new Object[0])).setChatModifier((new ChatModifier()).setColor(EnumChatFormat.RED)), true);
+ if (iinventory instanceof ILootable && ((ILootable) iinventory).Q_() != null && this.isSpectator()) {
+ this.a((new ChatMessage("container.spectatorCantOpen", new Object[0])).a(EnumChatFormat.RED), true);
} else {
-@@ -642,18 +812,21 @@
+@@ -625,18 +821,21 @@
if (itileinventory.isLocked() && !this.a(itileinventory.getLock()) && !this.isSpectator()) {
this.playerConnection.sendPacket(new PacketPlayOutChat(new ChatMessage("container.isLocked", new Object[] { iinventory.getScoreboardDisplayName()}), ChatMessageType.GAME_INFO));
- this.playerConnection.sendPacket(new PacketPlayOutNamedSoundEffect(SoundEffects.ab, SoundCategory.BLOCKS, this.locX, this.locY, this.locZ, 1.0F, 1.0F));
+ this.playerConnection.sendPacket(new PacketPlayOutNamedSoundEffect(SoundEffects.BLOCK_CHEST_LOCKED, SoundCategory.BLOCKS, this.locX, this.locY, this.locZ, 1.0F, 1.0F));
+ iinventory.closeContainer(this); // CraftBukkit
return;
}
@@ -463,7 +430,7 @@
this.activeContainer.windowId = this.containerCounter;
this.activeContainer.addSlotListener(this);
-@@ -661,8 +834,14 @@
+@@ -644,8 +843,14 @@
}
public void openTrade(IMerchant imerchant) {
@@ -478,8 +445,8 @@
+ this.activeContainer = container; // CraftBukkit
this.activeContainer.windowId = this.containerCounter;
this.activeContainer.addSlotListener(this);
- InventoryMerchant inventorymerchant = ((ContainerMerchant) this.activeContainer).e();
-@@ -682,13 +861,20 @@
+ InventoryMerchant inventorymerchant = ((ContainerMerchant) this.activeContainer).d();
+@@ -665,13 +870,20 @@
}
public void openHorseInventory(EntityHorseAbstract entityhorseabstract, IInventory iinventory) {
@@ -501,7 +468,7 @@
this.activeContainer.windowId = this.containerCounter;
this.activeContainer.addSlotListener(this);
}
-@@ -729,6 +915,11 @@
+@@ -712,6 +924,11 @@
public void a(Container container, NonNullList<ItemStack> nonnulllist) {
this.playerConnection.sendPacket(new PacketPlayOutWindowItems(container.windowId, nonnulllist));
this.playerConnection.sendPacket(new PacketPlayOutSetSlot(-1, -1, this.inventory.getCarried()));
@@ -513,59 +480,59 @@
}
public void setContainerData(Container container, int i, int j) {
-@@ -743,6 +934,7 @@
+@@ -726,6 +943,7 @@
}
public void closeInventory() {
+ CraftEventFactory.handleInventoryCloseEvent(this); // CraftBukkit
this.playerConnection.sendPacket(new PacketPlayOutCloseWindow(this.activeContainer.windowId));
- this.r();
+ this.m();
+ }
+@@ -759,14 +977,14 @@
+
+ public void a(Statistic<?> statistic, int i) {
+ this.ch.b(this, statistic, i);
+- this.getScoreboard().getObjectivesForCriteria(statistic, this.getName(), (scoreboardscore) -> {
++ this.world.getServer().getScoreboardManager().getScoreboardScores(statistic, this.getName(), (scoreboardscore) -> { // CraftBukkit - Get our scores instead
+ scoreboardscore.addScore(i);
+ });
}
-@@ -814,10 +1006,16 @@
- for (int j = 0; j < i; ++j) {
- MinecraftKey minecraftkey = aminecraftkey1[j];
-
-+ // CraftBukkit start
-+ if (CraftingManager.a(minecraftkey) == null) {
-+ Bukkit.getLogger().warning("Ignoring grant of non existent recipe " + minecraftkey);
-+ continue;
-+ }
-+ // CraftBukit end
- arraylist.add(CraftingManager.a(minecraftkey));
- }
-- this.a((List) arraylist);
-+ this.a((List<IRecipe>) arraylist); // CraftBukkit - decompile error
+ public void a(Statistic<?> statistic) {
+ this.ch.setStatistic(this, statistic, 0);
+- this.getScoreboard().getObjectivesForCriteria(statistic, this.getName(), ScoreboardScore::c);
++ this.world.getServer().getScoreboardManager().getScoreboardScores(statistic, this.getName(), ScoreboardScore::c); // CraftBukkit - Get our scores instead
}
- public void b(List<IRecipe> list) {
-@@ -839,7 +1037,16 @@
+ public int a(Collection<IRecipe> collection) {
+@@ -814,8 +1032,17 @@
public void triggerHealthUpdate() {
this.lastHealthSent = -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 a(IChatBaseComponent ichatbasecomponent, boolean flag) {
this.playerConnection.sendPacket(new PacketPlayOutChat(ichatbasecomponent, flag ? ChatMessageType.GAME_INFO : ChatMessageType.CHAT));
-@@ -879,7 +1086,7 @@
+ }
+@@ -866,7 +1093,7 @@
this.lastSentExp = -1;
this.lastHealthSent = -1.0F;
- this.ch = -1;
-- this.cr.a((RecipeBook) entityplayer.cr);
-+ // this.cr.a((RecipeBook) entityplayer.cr); // CraftBukkit
+ this.cp = -1;
+- this.cz.a((RecipeBook) entityplayer.cz);
++ // this.cz.a((RecipeBook) entityplayer.cz); // CraftBukkit
this.removeQueue.addAll(entityplayer.removeQueue);
- this.cq = entityplayer.cq;
- this.cv = entityplayer.cv;
-@@ -938,6 +1145,18 @@
+ this.cy = entityplayer.cy;
+ this.cD = entityplayer.cD;
+@@ -925,6 +1152,18 @@
}
public void a(EnumGamemode enumgamemode) {
@@ -584,31 +551,7 @@
this.playerInteractManager.setGameMode(enumgamemode);
this.playerConnection.sendPacket(new PacketPlayOutGameStateChange(3, (float) enumgamemode.getId()));
if (enumgamemode == EnumGamemode.SPECTATOR) {
-@@ -964,6 +1183,7 @@
- }
-
- public boolean a(int i, String s) {
-+ /* CraftBukkit start
- if ("seed".equals(s) && !this.server.aa()) {
- return true;
- } else if (!"tell".equals(s) && !"help".equals(s) && !"me".equals(s) && !"trigger".equals(s)) {
-@@ -977,6 +1197,15 @@
- } else {
- return true;
- }
-+ */
-+ if ("@".equals(s)) {
-+ return getBukkitEntity().hasPermission("minecraft.command.selector");
-+ }
-+ if ("".equals(s)) {
-+ return getBukkitEntity().isOp();
-+ }
-+ return getBukkitEntity().hasPermission("minecraft.command." + s);
-+ // CraftBukkit end
- }
-
- public String A() {
-@@ -988,6 +1217,16 @@
+@@ -968,6 +1207,16 @@
}
public void a(PacketPlayInSettings packetplayinsettings) {
@@ -618,23 +561,23 @@
+ this.server.server.getPluginManager().callEvent(event);
+ }
+ if (!this.locale.equals(packetplayinsettings.a())) {
-+ PlayerLocaleChangeEvent event = new PlayerLocaleChangeEvent(getBukkitEntity(), packetplayinsettings.a());
++ PlayerLocaleChangeEvent event = new PlayerLocaleChangeEvent(getBukkitEntity(), packetplayinsettings.b());
+ this.server.server.getPluginManager().callEvent(event);
+ }
+ // CraftBukkit end
- this.locale = packetplayinsettings.a();
- this.cl = packetplayinsettings.c();
- this.cm = packetplayinsettings.d();
-@@ -1053,7 +1292,7 @@
- this.co = (Entity) (entity == null ? this : entity);
- if (entity1 != this.co) {
- this.playerConnection.sendPacket(new PacketPlayOutCamera(this.co));
-- this.enderTeleportTo(this.co.locX, this.co.locY, this.co.locZ);
-+ this.playerConnection.a(this.co.locX, this.co.locY, this.co.locZ, this.yaw, this.pitch, TeleportCause.SPECTATE); // CraftBukkit
+ this.locale = packetplayinsettings.b();
+ this.ct = packetplayinsettings.d();
+ this.cu = packetplayinsettings.e();
+@@ -1039,7 +1288,7 @@
+ this.cw = (Entity) (entity == null ? this : entity);
+ if (entity1 != this.cw) {
+ this.playerConnection.sendPacket(new PacketPlayOutCamera(this.cw));
+- this.enderTeleportTo(this.cw.locX, this.cw.locY, this.cw.locZ);
++ this.playerConnection.a(this.cw.locX, this.cw.locY, this.cw.locZ, this.yaw, this.pitch, TeleportCause.SPECTATE); // CraftBukkit
}
}
-@@ -1080,7 +1319,7 @@
+@@ -1066,7 +1315,7 @@
@Nullable
public IChatBaseComponent getPlayerListName() {
@@ -643,15 +586,15 @@
}
public void a(EnumHand enumhand) {
-@@ -1097,12 +1336,17 @@
+@@ -1083,12 +1332,17 @@
}
- public void N() {
+ public void J() {
+ if (!CraftEventFactory.callToggleGlideEvent(this, true).isCancelled()) // CraftBukkit
this.setFlag(7, true);
}
- public void O() {
+ public void K() {
+ // CraftBukkit start
+ if (!CraftEventFactory.callToggleGlideEvent(this, false).isCancelled()) {
this.setFlag(7, true);
@@ -661,10 +604,32 @@
}
public AdvancementDataPlayer getAdvancementData() {
-@@ -1113,4 +1357,144 @@
- public Vec3D Q() {
- return this.cv;
+@@ -1100,9 +1354,16 @@
+ return this.cD;
}
+
++ // CraftBukkit start
+ public void a(WorldServer worldserver, double d0, double d1, double d2, float f, float f1) {
++ this.a(worldserver, d0, d1, d2, f, f1, org.bukkit.event.player.PlayerTeleportEvent.TeleportCause.UNKNOWN);
++ }
++
++ public void a(WorldServer worldserver, double d0, double d1, double d2, float f, float f1, org.bukkit.event.player.PlayerTeleportEvent.TeleportCause cause) {
++ // CraftBukkit end
+ this.setSpectatorTarget(this);
+ this.stopRiding();
++ /* CraftBukkit start - replace with bukkit handling for multi-world
+ if (worldserver == this.world) {
+ this.playerConnection.a(d0, d1, d2, f, f1);
+ } else {
+@@ -1127,6 +1388,149 @@
+ this.server.getPlayerList().b(this, worldserver);
+ this.server.getPlayerList().updateClient(this);
+ }
++ */
++ this.getBukkitEntity().teleport(new Location(worldserver.getWorld(), d0, d1, d2, f, f1), cause);
++ // CraftBukkit end
++
++ }
+
+ // CraftBukkit start - Add per-player time and weather.
+ public long timeOffset = 0;
@@ -799,10 +764,10 @@
+ }
+ 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
index 117e59dc..f39d8365 100644
--- a/nms-patches/EntityPotion.patch
+++ b/nms-patches/EntityPotion.patch
@@ -1,7 +1,7 @@
--- a/net/minecraft/server/EntityPotion.java
+++ b/net/minecraft/server/EntityPotion.java
-@@ -6,6 +6,12 @@
- import javax.annotation.Nullable;
+@@ -5,6 +5,12 @@
+ import java.util.function.Predicate;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
+// CraftBukkit start
@@ -13,16 +13,16 @@
public class EntityPotion extends EntityProjectile {
-@@ -87,7 +93,7 @@
+@@ -77,7 +83,7 @@
if (flag) {
- this.n();
+ this.l();
- } else if (!list.isEmpty()) {
+ } else if (true || !list.isEmpty()) { // CraftBukkit - Call event even if no effects to apply
if (this.isLingering()) {
this.a(itemstack, potionregistry);
} else {
-@@ -124,6 +130,7 @@
+@@ -114,6 +120,7 @@
private void a(MovingObjectPosition movingobjectposition, List<MobEffect> list) {
AxisAlignedBB axisalignedbb = this.getBoundingBox().grow(4.0D, 2.0D, 4.0D);
List list1 = this.world.a(EntityLiving.class, axisalignedbb);
@@ -30,7 +30,7 @@
if (!list1.isEmpty()) {
Iterator iterator = list1.iterator();
-@@ -141,21 +148,46 @@
+@@ -131,21 +138,46 @@
d1 = 1.0D;
}
@@ -91,7 +91,7 @@
}
}
}
-@@ -187,7 +219,14 @@
+@@ -177,7 +209,14 @@
entityareaeffectcloud.setColor(nbttagcompound.getInt("CustomPotionColor"));
}
diff --git a/nms-patches/EntityProjectile.patch b/nms-patches/EntityProjectile.patch
index af70eb1b..3e8aa8a0 100644
--- a/nms-patches/EntityProjectile.patch
+++ b/nms-patches/EntityProjectile.patch
@@ -1,14 +1,14 @@
--- a/net/minecraft/server/EntityProjectile.java
+++ b/net/minecraft/server/EntityProjectile.java
-@@ -35,6 +35,7 @@
- public EntityProjectile(World world, EntityLiving entityliving) {
- this(world, entityliving.locX, entityliving.locY + (double) entityliving.getHeadHeight() - 0.10000000149011612D, entityliving.locZ);
+@@ -33,6 +33,7 @@
+ this(entitytypes, entityliving.locX, entityliving.locY + (double) entityliving.getHeadHeight() - 0.10000000149011612D, entityliving.locZ, world);
this.shooter = entityliving;
+ this.shooterId = entityliving.getUniqueID();
+ this.projectileSource = (org.bukkit.entity.LivingEntity) entityliving.getBukkitEntity(); // CraftBukkit
}
- protected void i() {}
-@@ -127,7 +128,7 @@
+ protected void x_() {}
+@@ -111,7 +112,7 @@
if (entity1.isInteractable()) {
if (entity1 == this.d) {
flag = true;
@@ -17,7 +17,7 @@
this.d = entity1;
flag = true;
} else {
-@@ -164,6 +165,11 @@
+@@ -148,6 +149,11 @@
this.e(movingobjectposition.a());
} else {
this.a(movingobjectposition);
diff --git a/nms-patches/EntityRabbit.patch b/nms-patches/EntityRabbit.patch
index 890a0efd..91309d3b 100644
--- a/nms-patches/EntityRabbit.patch
+++ b/nms-patches/EntityRabbit.patch
@@ -1,8 +1,8 @@
--- a/net/minecraft/server/EntityRabbit.java
+++ b/net/minecraft/server/EntityRabbit.java
-@@ -16,8 +16,14 @@
+@@ -17,8 +17,14 @@
this.setSize(0.4F, 0.5F);
- this.g = new EntityRabbit.ControllerJumpRabbit(this);
+ this.h = new EntityRabbit.ControllerJumpRabbit(this);
this.moveController = new EntityRabbit.ControllerMoveRabbit(this);
+ this.initializePathFinderGoals(); // CraftBukkit - moved code
+ }
@@ -13,14 +13,14 @@
}
+ // CraftBukkit end
- protected void r() {
+ protected void n() {
this.goalSelector.a(1, new PathfinderGoalFloat(this));
-@@ -400,9 +406,23 @@
+@@ -397,9 +403,23 @@
Integer integer = (Integer) iblockdata.get(BlockCarrots.AGE);
if (integer.intValue() == 0) {
+ // CraftBukkit start
-+ if (org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(this.c, blockposition, Blocks.AIR, 0).isCancelled()) {
++ if (org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(this.f, blockposition, Blocks.AIR.getBlockData()).isCancelled()) {
+ return;
+ }
+ // CraftBukkit end
@@ -29,13 +29,13 @@
} else {
+ // CraftBukkit start
+ if (org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(
-+ this.c,
++ this.f,
+ blockposition,
-+ block, block.toLegacyData(iblockdata.set(BlockCarrots.AGE, Integer.valueOf(integer.intValue() - 1)))
++ iblockdata.set(BlockCarrots.AGE, Integer.valueOf(integer.intValue() - 1))
+ ).isCancelled()) {
+ return;
+ }
+ // CraftBukkit end
- world.setTypeAndData(blockposition, iblockdata.set(BlockCarrots.AGE, Integer.valueOf(integer.intValue() - 1)), 2);
+ world.setTypeAndData(blockposition, (IBlockData) iblockdata.set(BlockCarrots.AGE, Integer.valueOf(integer.intValue() - 1)), 2);
world.triggerEffect(2001, blockposition, Block.getCombinedId(iblockdata));
}
diff --git a/nms-patches/EntitySheep.patch b/nms-patches/EntitySheep.patch
index 2f4845db..d9a10993 100644
--- a/nms-patches/EntitySheep.patch
+++ b/nms-patches/EntitySheep.patch
@@ -1,7 +1,7 @@
--- a/net/minecraft/server/EntitySheep.java
+++ b/net/minecraft/server/EntitySheep.java
-@@ -5,6 +5,12 @@
- import java.util.Random;
+@@ -10,6 +10,12 @@
+ import java.util.stream.Collectors;
import javax.annotation.Nullable;
+// CraftBukkit start
@@ -12,8 +12,8 @@
+
public class EntitySheep extends EntityAnimal {
- private static final DataWatcherObject<Byte> bx = DataWatcher.a(EntitySheep.class, DataWatcherRegistry.a);
-@@ -12,6 +18,13 @@
+ private static final DataWatcherObject<Byte> bC = DataWatcher.a(EntitySheep.class, DataWatcherRegistry.a);
+@@ -17,8 +23,15 @@
public boolean canUse(EntityHuman entityhuman) {
return false;
}
@@ -25,17 +25,12 @@
+ }
+ // CraftBukkit end
}, 2, 1);
- private static final Map<EnumColor, float[]> bz = Maps.newEnumMap(EnumColor.class);
- private int bB;
-@@ -29,6 +42,7 @@
- this.setSize(0.9F, 1.3F);
- this.container.setItem(0, new ItemStack(Items.DYE));
- this.container.setItem(1, new ItemStack(Items.DYE));
-+ this.container.resultInventory = new InventoryCraftResult(); // CraftBukkit - add result slot for event
- }
-
- protected void r() {
-@@ -131,11 +145,22 @@
+- private static final Map<EnumColor, IMaterial> bE = (Map) SystemUtils.a((Object) Maps.newEnumMap(EnumColor.class), (enummap) -> {
++ private static final Map<EnumColor, IMaterial> bE = (Map) SystemUtils.a(Maps.newEnumMap(EnumColor.class), (enummap) -> { // CraftBukkit - decompile error
+ enummap.put(EnumColor.WHITE, Blocks.WHITE_WOOL);
+ enummap.put(EnumColor.ORANGE, Blocks.ORANGE_WOOL);
+ enummap.put(EnumColor.MAGENTA, Blocks.MAGENTA_WOOL);
+@@ -158,11 +171,22 @@
if (itemstack.getItem() == Items.SHEARS && !this.isSheared() && !this.isBaby()) {
if (!this.world.isClientSide) {
@@ -53,15 +48,15 @@
for (int j = 0; j < i; ++j) {
+ this.forceDrops = true; // CraftBukkit
- EntityItem entityitem = this.a(new ItemStack(Item.getItemOf(Blocks.WOOL), 1, this.getColor().getColorIndex()), 1.0F);
+ EntityItem entityitem = this.a((IMaterial) EntitySheep.bE.get(this.getColor()), 1);
+ this.forceDrops = false; // CraftBukkit
- entityitem.motY += (double) (this.random.nextFloat() * 0.05F);
- entityitem.motX += (double) ((this.random.nextFloat() - this.random.nextFloat()) * 0.1F);
-@@ -222,6 +247,12 @@
+ if (entityitem != null) {
+ entityitem.motY += (double) (this.random.nextFloat() * 0.05F);
+@@ -247,6 +271,12 @@
}
- public void A() {
+ public void x() {
+ // CraftBukkit start
+ SheepRegrowWoolEvent event = new SheepRegrowWoolEvent((org.bukkit.entity.Sheep) this.getBukkitEntity());
+ this.world.getServer().getPluginManager().callEvent(event);
@@ -71,3 +66,11 @@
this.setSheared(false);
if (this.isBaby()) {
this.setAge(60);
+@@ -267,6 +297,7 @@
+
+ this.container.setItem(0, new ItemStack(ItemDye.a(enumcolor)));
+ this.container.setItem(1, new ItemStack(ItemDye.a(enumcolor1)));
++ this.container.resultInventory = new InventoryCraftResult(); // CraftBukkit - add result slot for event
+ ItemStack itemstack = entityanimal.world.D().craft(this.container, ((EntitySheep) entityanimal).world);
+ Item item = itemstack.getItem();
+ EnumColor enumcolor2;
diff --git a/nms-patches/EntityShulker.patch b/nms-patches/EntityShulker.patch
index 9b21b293..80e651f4 100644
--- a/nms-patches/EntityShulker.patch
+++ b/nms-patches/EntityShulker.patch
@@ -1,8 +1,8 @@
--- a/net/minecraft/server/EntityShulker.java
+++ b/net/minecraft/server/EntityShulker.java
@@ -6,6 +6,10 @@
- import java.util.List;
import java.util.UUID;
+ import java.util.function.Predicate;
import javax.annotation.Nullable;
+// CraftBukkit start
+import org.bukkit.Location;
@@ -11,19 +11,10 @@
public class EntityShulker extends EntityGolem implements IMonster {
-@@ -112,7 +116,7 @@
-
- this.datawatcher.set(EntityShulker.b, Optional.of(new BlockPosition(i, j, k)));
- } else {
-- this.datawatcher.set(EntityShulker.b, Optional.absent());
-+ this.datawatcher.set(EntityShulker.b, Optional.<BlockPosition>absent());
- }
-
- }
-@@ -331,8 +335,17 @@
+@@ -326,8 +330,17 @@
EnumDirection enumdirection = aenumdirection[k];
- if (this.world.d(blockposition1.shift(enumdirection), false)) {
+ if (this.world.q(blockposition1.shift(enumdirection))) {
- this.datawatcher.set(EntityShulker.a, enumdirection);
- flag = true;
+ // CraftBukkit start
diff --git a/nms-patches/EntityShulkerBullet.patch b/nms-patches/EntityShulkerBullet.patch
index 915d3747..a3b15400 100644
--- a/nms-patches/EntityShulkerBullet.patch
+++ b/nms-patches/EntityShulkerBullet.patch
@@ -1,6 +1,6 @@
--- a/net/minecraft/server/EntityShulkerBullet.java
+++ b/net/minecraft/server/EntityShulkerBullet.java
-@@ -46,8 +46,29 @@
+@@ -42,8 +42,29 @@
this.target = entity;
this.c = EnumDirection.UP;
this.a(enumdirection_enumaxis);
@@ -27,14 +27,14 @@
+ }
+ // CraftBukkit end
+
- protected void b(NBTTagCompound nbttagcompound) {
- BlockPosition blockposition;
- NBTTagCompound nbttagcompound1;
+ public SoundCategory bV() {
+ return SoundCategory.HOSTILE;
+ }
@@ -287,6 +308,7 @@
}
protected void a(MovingObjectPosition movingobjectposition) {
+ org.bukkit.craftbukkit.event.CraftEventFactory.callProjectileHitEvent(this, movingobjectposition); // Craftbukkit - Call event
if (movingobjectposition.entity == null) {
- ((WorldServer) this.world).a(EnumParticle.EXPLOSION_LARGE, this.locX, this.locY, this.locZ, 2, 0.2D, 0.2D, 0.2D, 0.0D, new int[0]);
- this.a(SoundEffects.gD, 1.0F, 1.0F);
+ ((WorldServer) this.world).a(Particles.u, this.locX, this.locY, this.locZ, 2, 0.2D, 0.2D, 0.2D, 0.0D);
+ this.a(SoundEffects.ENTITY_SHULKER_BULLET_HIT, 1.0F, 1.0F);
diff --git a/nms-patches/EntitySilverfish.patch b/nms-patches/EntitySilverfish.patch
index c631fa4c..6eeae7d5 100644
--- a/nms-patches/EntitySilverfish.patch
+++ b/nms-patches/EntitySilverfish.patch
@@ -1,23 +1,23 @@
--- a/net/minecraft/server/EntitySilverfish.java
+++ b/net/minecraft/server/EntitySilverfish.java
-@@ -157,6 +157,11 @@
+@@ -153,6 +153,11 @@
IBlockData iblockdata = world.getType(blockposition);
- if (BlockMonsterEggs.x(iblockdata)) {
+ if (BlockMonsterEggs.j(iblockdata)) {
+ // CraftBukkit start
-+ if (org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(this.a, blockposition, Blocks.MONSTER_EGG, Block.getId(BlockMonsterEggs.getById(iblockdata.getBlock().toLegacyData(iblockdata)))).isCancelled()) {
++ if (org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(this.a, blockposition, BlockMonsterEggs.f(iblockdata.getBlock())).isCancelled()) {
+ return;
+ }
+ // CraftBukkit end
- world.setTypeAndData(blockposition, Blocks.MONSTER_EGG.getBlockData().set(BlockMonsterEggs.VARIANT, BlockMonsterEggs.EnumMonsterEggVarient.a(iblockdata)), 3);
+ world.setTypeAndData(blockposition, BlockMonsterEggs.f(iblockdata.getBlock()), 3);
this.a.doSpawnEffect();
this.a.die();
-@@ -200,6 +205,11 @@
- IBlockData iblockdata = world.getType(blockposition1);
+@@ -197,6 +202,11 @@
+ Block block = iblockdata.getBlock();
- if (iblockdata.getBlock() == Blocks.MONSTER_EGG) {
+ if (block instanceof BlockMonsterEggs) {
+ // CraftBukkit start
-+ if (org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(this.silverfish, blockposition1, Blocks.AIR, 0).isCancelled()) {
++ if (org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(this.silverfish, blockposition1, Blocks.AIR.getBlockData()).isCancelled()) {
+ continue;
+ }
+ // CraftBukkit end
diff --git a/nms-patches/EntitySkeleton.patch b/nms-patches/EntitySkeleton.patch
index 18243710..c763f721 100644
--- a/nms-patches/EntitySkeleton.patch
+++ b/nms-patches/EntitySkeleton.patch
@@ -1,6 +1,6 @@
--- a/net/minecraft/server/EntitySkeleton.java
+++ b/net/minecraft/server/EntitySkeleton.java
-@@ -34,7 +34,7 @@
+@@ -30,7 +30,7 @@
}
public void die(DamageSource damagesource) {
@@ -9,8 +9,8 @@
if (damagesource.getEntity() instanceof EntityCreeper) {
EntityCreeper entitycreeper = (EntityCreeper) damagesource.getEntity();
-@@ -43,6 +43,7 @@
- this.a(new ItemStack(Items.SKULL, 1, 0), 0.0F);
+@@ -39,6 +39,7 @@
+ this.a((IMaterial) Items.SKELETON_SKULL);
}
}
+ super.die(damagesource); // CraftBukkit - moved from above
diff --git a/nms-patches/EntitySkeletonAbstract.patch b/nms-patches/EntitySkeletonAbstract.patch
index 424cca7c..9b16ed82 100644
--- a/nms-patches/EntitySkeletonAbstract.patch
+++ b/nms-patches/EntitySkeletonAbstract.patch
@@ -1,37 +1,37 @@
--- a/net/minecraft/server/EntitySkeletonAbstract.java
+++ b/net/minecraft/server/EntitySkeletonAbstract.java
-@@ -2,12 +2,13 @@
-
- import java.util.Calendar;
+@@ -3,12 +3,13 @@
+ import java.time.LocalDate;
+ import java.time.temporal.ChronoField;
import javax.annotation.Nullable;
+import org.bukkit.event.entity.EntityCombustEvent; // CraftBukkit
public abstract class EntitySkeletonAbstract extends EntityMonster implements IRangedEntity {
- private static final DataWatcherObject<Boolean> a = DataWatcher.a(EntitySkeletonAbstract.class, DataWatcherRegistry.h);
+ private static final DataWatcherObject<Boolean> a = DataWatcher.a(EntitySkeletonAbstract.class, DataWatcherRegistry.i);
private final PathfinderGoalBowShoot<EntitySkeletonAbstract> b = new PathfinderGoalBowShoot(this, 1.0D, 20, 15.0F);
- private final PathfinderGoalMeleeAttack c = new PathfinderGoalMeleeAttack(this, 1.2D, flag) {
+ private final PathfinderGoalMeleeAttack c = new PathfinderGoalMeleeAttack(this, 1.2D, false) { // CraftBukkit - decompile error
public void d() {
super.d();
- EntitySkeletonAbstract.this.p(false);
-@@ -80,7 +81,14 @@
- }
+ EntitySkeletonAbstract.this.s(false);
+@@ -78,7 +79,14 @@
+ }
- if (flag) {
-- this.setOnFire(8);
-+ // CraftBukkit start
-+ EntityCombustEvent event = new EntityCombustEvent(this.getBukkitEntity(), 8);
-+ this.world.getServer().getPluginManager().callEvent(event);
+ 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
- }
++ if (!event.isCancelled()) {
++ this.setOnFire(event.getDuration());
++ }
++ // CraftBukkit end
}
}
-@@ -152,8 +160,19 @@
+
+@@ -151,8 +159,19 @@
double d3 = (double) MathHelper.sqrt(d0 * d0 + d2 * d2);
entityarrow.shoot(d0, d1 + d3 * 0.20000000298023224D, d2, 1.6F, (float) (14 - this.world.getDifficulty().a() * 4));
@@ -46,7 +46,7 @@
+ world.addEntity(entityarrow);
+ }
+ // CraftBukkit end
- this.a(SoundEffects.gW, 1.0F, 1.0F / (this.getRandom().nextFloat() * 0.4F + 0.8F));
+ this.a(SoundEffects.ENTITY_SKELETON_SHOOT, 1.0F, 1.0F / (this.getRandom().nextFloat() * 0.4F + 0.8F));
- this.world.addEntity(entityarrow);
+ // this.world.addEntity(entityarrow); // CraftBukkit - moved up
}
diff --git a/nms-patches/EntitySkeletonWither.patch b/nms-patches/EntitySkeletonWither.patch
index 25d7fc87..d66a1b59 100644
--- a/nms-patches/EntitySkeletonWither.patch
+++ b/nms-patches/EntitySkeletonWither.patch
@@ -1,6 +1,6 @@
--- a/net/minecraft/server/EntitySkeletonWither.java
+++ b/net/minecraft/server/EntitySkeletonWither.java
-@@ -36,7 +36,7 @@
+@@ -32,7 +32,7 @@
}
public void die(DamageSource damagesource) {
@@ -9,8 +9,8 @@
if (damagesource.getEntity() instanceof EntityCreeper) {
EntityCreeper entitycreeper = (EntityCreeper) damagesource.getEntity();
-@@ -45,6 +45,7 @@
- this.a(new ItemStack(Items.SKULL, 1, 1), 0.0F);
+@@ -41,6 +41,7 @@
+ this.a((IMaterial) Items.WITHER_SKELETON_SKULL);
}
}
+ super.die(damagesource); // CraftBukkit - moved from above
diff --git a/nms-patches/EntitySlime.patch b/nms-patches/EntitySlime.patch
index 6e55a144..0e817f25 100644
--- a/nms-patches/EntitySlime.patch
+++ b/nms-patches/EntitySlime.patch
@@ -10,6 +10,15 @@
public class EntitySlime extends EntityInsentient implements IMonster {
+@@ -134,7 +137,7 @@
+ }
+
+ public EntityTypes<? extends EntitySlime> P() {
+- return super.P();
++ return (EntityTypes<? extends EntitySlime>) super.P(); // CraftBukkit - decompile error
+ }
+
+ public void die() {
@@ -143,6 +146,18 @@
if (!this.world.isClientSide && i > 1 && this.getHealth() <= 0.0F) {
int j = 2 + this.random.nextInt(3);
diff --git a/nms-patches/EntitySmallFireball.patch b/nms-patches/EntitySmallFireball.patch
index 0833ca94..0a93a44c 100644
--- a/nms-patches/EntitySmallFireball.patch
+++ b/nms-patches/EntitySmallFireball.patch
@@ -8,10 +8,10 @@
public class EntitySmallFireball extends EntityFireball {
public EntitySmallFireball(World world) {
-@@ -10,6 +12,11 @@
+@@ -8,6 +10,11 @@
+
public EntitySmallFireball(World world, EntityLiving entityliving, double d0, double d1, double d2) {
- super(world, entityliving, d0, d1, d2);
- this.setSize(0.3125F, 0.3125F);
+ super(EntityTypes.SMALL_FIREBALL, entityliving, d0, d1, d2, world, 0.3125F, 0.3125F);
+ // CraftBukkit start
+ if (this.shooter != null && this.shooter instanceof EntityInsentient) {
+ isIncendiary = this.world.getGameRules().getBoolean("mobGriefing");
@@ -20,7 +20,7 @@
}
public EntitySmallFireball(World world, double d0, double d1, double d2, double d3, double d4, double d5) {
-@@ -27,10 +34,17 @@
+@@ -20,10 +27,17 @@
if (movingobjectposition.entity != null) {
if (!movingobjectposition.entity.isFireProof()) {
@@ -41,7 +41,7 @@
}
}
} else {
-@@ -39,11 +53,15 @@
+@@ -32,11 +46,15 @@
flag = this.world.getGameRules().getBoolean("mobGriefing");
}
@@ -52,7 +52,7 @@
if (this.world.isEmpty(blockposition)) {
- this.world.setTypeUpdate(blockposition, Blocks.FIRE.getBlockData());
-+ if (!org.bukkit.craftbukkit.event.CraftEventFactory.callBlockIgniteEvent(world, blockposition.getX(), blockposition.getY(), blockposition.getZ(), this).isCancelled()) {
++ if (!org.bukkit.craftbukkit.event.CraftEventFactory.callBlockIgniteEvent(world, blockposition, this).isCancelled()) {
+ this.world.setTypeUpdate(blockposition, Blocks.FIRE.getBlockData());
+ }
+ // CraftBukkit end
diff --git a/nms-patches/EntitySnowman.patch b/nms-patches/EntitySnowman.patch
index bf919be5..d78d5726 100644
--- a/nms-patches/EntitySnowman.patch
+++ b/nms-patches/EntitySnowman.patch
@@ -11,25 +11,25 @@
public class EntitySnowman extends EntityGolem implements IRangedEntity {
-@@ -59,7 +63,7 @@
+@@ -55,7 +59,7 @@
}
- if (this.world.getBiome(new BlockPosition(i, 0, k)).a(new BlockPosition(i, j, k)) > 1.0F) {
+ if (this.world.getBiome(new BlockPosition(i, 0, k)).c(new BlockPosition(i, j, k)) > 1.0F) {
- this.damageEntity(DamageSource.BURN, 1.0F);
+ this.damageEntity(CraftEventFactory.MELTING, 1.0F); // CraftBukkit - DamageSource.BURN -> CraftEventFactory.MELTING
}
if (!this.world.getGameRules().getBoolean("mobGriefing")) {
-@@ -73,7 +77,7 @@
+@@ -71,7 +75,7 @@
BlockPosition blockposition = new BlockPosition(i, j, k);
- if (this.world.getType(blockposition).getMaterial() == Material.AIR && this.world.getBiome(blockposition).a(blockposition) < 0.8F && Blocks.SNOW_LAYER.canPlace(this.world, blockposition)) {
-- this.world.setTypeUpdate(blockposition, Blocks.SNOW_LAYER.getBlockData());
-+ org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockFormEvent(this.world, blockposition, Blocks.SNOW_LAYER.getBlockData(), this); // CraftBukkit
+ if (this.world.getType(blockposition).isAir() && this.world.getBiome(blockposition).c(blockposition) < 0.8F && iblockdata.canPlace(this.world, blockposition)) {
+- this.world.setTypeUpdate(blockposition, iblockdata);
++ org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockFormEvent(this.world, blockposition, iblockdata, this); // CraftBukkit
}
}
}
-@@ -106,6 +110,15 @@
+@@ -104,6 +108,15 @@
ItemStack itemstack = entityhuman.b(enumhand);
if (itemstack.getItem() == Items.SHEARS && this.hasPumpkin() && !this.world.isClientSide) {
diff --git a/nms-patches/EntitySpider.patch b/nms-patches/EntitySpider.patch
index 4c7b19b3..ce14684d 100644
--- a/nms-patches/EntitySpider.patch
+++ b/nms-patches/EntitySpider.patch
@@ -3,7 +3,7 @@
@@ -115,7 +115,7 @@
entityskeleton.setPositionRotation(this.locX, this.locY, this.locZ, this.yaw, 0.0F);
- entityskeleton.prepare(difficultydamagescaler, (GroupDataEntity) null);
+ entityskeleton.prepare(difficultydamagescaler, (GroupDataEntity) null, (NBTTagCompound) null);
- this.world.addEntity(entityskeleton);
+ this.world.addEntity(entityskeleton, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.JOCKEY); // CraftBukkit - add SpawnReason
entityskeleton.startRiding(this);
diff --git a/nms-patches/EntityTNTPrimed.patch b/nms-patches/EntityTNTPrimed.patch
index 0836702c..d5a2e2c3 100644
--- a/nms-patches/EntityTNTPrimed.patch
+++ b/nms-patches/EntityTNTPrimed.patch
@@ -16,7 +16,7 @@
+ public boolean isIncendiary = false; // CraftBukkit - add field
public EntityTNTPrimed(World world) {
- super(world);
+ super(EntityTypes.TNT, world);
@@ -64,10 +67,13 @@
--this.c;
@@ -30,8 +30,8 @@
+ this.die();
+ // CraftBukkit end
} else {
- this.aq();
- this.world.addParticle(EnumParticle.SMOKE_NORMAL, this.locX, this.locY + 0.5D, this.locZ, 0.0D, 0.0D, 0.0D, new int[0]);
+ this.at();
+ this.world.addParticle(Particles.M, this.locX, this.locY + 0.5D, this.locZ, 0.0D, 0.0D, 0.0D);
@@ -76,9 +82,17 @@
}
diff --git a/nms-patches/EntityThrownExpBottle.patch b/nms-patches/EntityThrownExpBottle.patch
index 256bf0ad..6f2cee21 100644
--- a/nms-patches/EntityThrownExpBottle.patch
+++ b/nms-patches/EntityThrownExpBottle.patch
@@ -1,6 +1,6 @@
--- a/net/minecraft/server/EntityThrownExpBottle.java
+++ b/net/minecraft/server/EntityThrownExpBottle.java
-@@ -24,9 +24,18 @@
+@@ -20,9 +20,18 @@
protected void a(MovingObjectPosition movingobjectposition) {
if (!this.world.isClientSide) {
diff --git a/nms-patches/EntityTracker.patch b/nms-patches/EntityTracker.patch
index 1e0a52a9..795c5f22 100644
--- a/nms-patches/EntityTracker.patch
+++ b/nms-patches/EntityTracker.patch
@@ -9,18 +9,3 @@
} else if (entity instanceof EntityEnderCrystal) {
this.addEntity(entity, 256, Integer.MAX_VALUE, false);
} else if (entity instanceof EntityEvokerFangs) {
-@@ -120,11 +120,12 @@
- CrashReportSystemDetails crashreportsystemdetails = crashreport.a("Entity To Track");
-
- crashreportsystemdetails.a("Tracking range", (Object) (i + " blocks"));
-+ final int finalI = i; // CraftBukkit - fix decompile error
- crashreportsystemdetails.a("Update interval", new CrashReportCallable() {
- public String a() throws Exception {
-- String s = "Once per " + i + " ticks";
-+ String s = "Once per " + finalI + " ticks"; // CraftBukkit
-
-- if (i == Integer.MAX_VALUE) {
-+ if (finalI == Integer.MAX_VALUE) { // CraftBukkit
- s = "Maximum (" + s + ")";
- }
-
diff --git a/nms-patches/EntityTrackerEntry.patch b/nms-patches/EntityTrackerEntry.patch
index 88438c35..cb8903ad 100644
--- a/nms-patches/EntityTrackerEntry.patch
+++ b/nms-patches/EntityTrackerEntry.patch
@@ -28,7 +28,7 @@
- if (itemstack.getItem() instanceof ItemWorldMap) {
+ if (this.a % 10 == 0 && itemstack.getItem() instanceof ItemWorldMap) { // CraftBukkit - Moved this.a % 10 logic here so item frames do not enter the other blocks
- WorldMap worldmap = Items.FILLED_MAP.getSavedMap(itemstack, this.tracker.world);
+ WorldMap worldmap = ItemWorldMap.getSavedMap(itemstack, this.tracker.world);
- Iterator iterator = list.iterator();
+ Iterator iterator = this.trackedPlayers.iterator(); // CraftBukkit
diff --git a/nms-patches/EntityTypes.patch b/nms-patches/EntityTypes.patch
new file mode 100644
index 00000000..8b0f7041
--- /dev/null
+++ b/nms-patches/EntityTypes.patch
@@ -0,0 +1,39 @@
+--- a/net/minecraft/server/EntityTypes.java
++++ b/net/minecraft/server/EntityTypes.java
+@@ -148,10 +148,16 @@
+
+ @Nullable
+ public T a(World world, @Nullable NBTTagCompound nbttagcompound, @Nullable IChatBaseComponent ichatbasecomponent, @Nullable EntityHuman entityhuman, BlockPosition blockposition, boolean flag, boolean flag1) {
++ // CraftBukkit start
++ return spawnCreature(world, nbttagcompound, ichatbasecomponent, entityhuman, blockposition, flag, flag1, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.SPAWNER_EGG);
++ }
++
++ @Nullable
++ public T spawnCreature(World world, @Nullable NBTTagCompound nbttagcompound, @Nullable IChatBaseComponent ichatbasecomponent, @Nullable EntityHuman entityhuman, BlockPosition blockposition, boolean flag, boolean flag1, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason spawnReason) {
+ Entity entity = this.b(world, nbttagcompound, ichatbasecomponent, entityhuman, blockposition, flag, flag1);
+
+- world.addEntity(entity);
+- return entity;
++ return world.addEntity(entity, spawnReason) ? (T) entity : null; // Don't return an entity when CreatureSpawnEvent is canceled
++ // CraftBukkit end
+ }
+
+ @Nullable
+@@ -185,7 +191,7 @@
+ }
+
+ a(world, entityhuman, entity, nbttagcompound);
+- return entity;
++ return (T) entity; // CraftBukkit - decompile error
+ }
+ }
+
+@@ -240,7 +246,7 @@
+
+ @Nullable
+ public T a(World world) {
+- return (Entity) this.aU.apply(world);
++ return this.aU.apply(world); // CraftBukkit - decompile error
+ }
+
+ @Nullable
diff --git a/nms-patches/EntityVex.patch b/nms-patches/EntityVex.patch
index 0c50e0e2..08fc317e 100644
--- a/nms-patches/EntityVex.patch
+++ b/nms-patches/EntityVex.patch
@@ -8,7 +8,7 @@
public class EntityVex extends EntityMonster {
-@@ -182,7 +183,7 @@
+@@ -178,7 +179,7 @@
}
public void c() {
diff --git a/nms-patches/EntityVillager.patch b/nms-patches/EntityVillager.patch
index 8693d0ff..201e9a2c 100644
--- a/nms-patches/EntityVillager.patch
+++ b/nms-patches/EntityVillager.patch
@@ -1,6 +1,6 @@
--- a/net/minecraft/server/EntityVillager.java
+++ b/net/minecraft/server/EntityVillager.java
-@@ -6,6 +6,14 @@
+@@ -7,6 +7,14 @@
import javax.annotation.Nullable;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
@@ -15,32 +15,16 @@
public class EntityVillager extends EntityAgeable implements NPC, IMerchant {
-@@ -18,13 +26,13 @@
- @Nullable
- private EntityHuman tradingPlayer;
- @Nullable
-- private MerchantRecipeList trades;
-+ public MerchantRecipeList trades; // PAIL private -> public
- private int bF;
- private boolean bG;
- private boolean bH;
- public int riches;
- private String bJ;
-- private int bK;
-+ public int bK; // PAIL private -> public // PAIL rename careerID
- private int bL;
- private boolean bM;
- private boolean bN;
-@@ -37,7 +45,7 @@
+@@ -38,7 +46,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
+ super(EntityTypes.VILLAGER, world);
+- this.inventory = new InventorySubcontainer(new ChatComponentText("Items"), 8);
++ this.inventory = new InventorySubcontainer(new ChatComponentText("Items"), 8, (CraftVillager) this.getBukkitEntity()); // CraftBukkit add argument
this.setProfession(i);
this.setSize(0.6F, 1.95F);
((Navigation) this.getNavigation()).a(true);
-@@ -119,7 +127,14 @@
+@@ -120,7 +128,14 @@
MerchantRecipe merchantrecipe = (MerchantRecipe) iterator.next();
if (merchantrecipe.h()) {
@@ -56,16 +40,7 @@
}
}
-@@ -432,7 +447,7 @@
- return this.trades;
- }
-
-- private void dx() {
-+ public void dx() { // CraftBukkit private -> public // PAIL rename populateTrades
- EntityVillager.IMerchantRecipeOption[][][] aentityvillager_imerchantrecipeoption = EntityVillager.bP[this.getProfession()];
-
- if (this.bK != 0 && this.bL != 0) {
-@@ -460,7 +475,20 @@
+@@ -434,7 +449,20 @@
for (int l = 0; l < k; ++l) {
EntityVillager.IMerchantRecipeOption entityvillager_imerchantrecipeoption = aentityvillager_imerchantrecipeoption3[l];
diff --git a/nms-patches/EntityWither.patch b/nms-patches/EntityWither.patch
index c6a4a11e..26eb069d 100644
--- a/nms-patches/EntityWither.patch
+++ b/nms-patches/EntityWither.patch
@@ -1,7 +1,7 @@
--- a/net/minecraft/server/EntityWither.java
+++ b/net/minecraft/server/EntityWither.java
@@ -5,6 +5,12 @@
- import java.util.List;
+ import java.util.function.Predicate;
import javax.annotation.Nullable;
+// CraftBukkit start
@@ -13,9 +13,9 @@
public class EntityWither extends EntityMonster implements IRangedEntity {
private static final DataWatcherObject<Integer> a = DataWatcher.a(EntityWither.class, DataWatcherRegistry.b);
-@@ -192,13 +198,38 @@
- if (this.dm() > 0) {
- i = this.dm() - 1;
+@@ -181,13 +187,38 @@
+ if (this.dz() > 0) {
+ i = this.dz() - 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(1023, new BlockPosition(this), 0);
@@ -48,26 +48,26 @@
+ // CraftBukkit end
}
- this.g(i);
+ this.e(i);
if (this.ticksLived % 10 == 0) {
- this.heal(10.0F);
+ this.heal(10.0F, EntityRegainHealthEvent.RegainReason.WITHER_SPAWN); // CraftBukkit
}
} else {
-@@ -289,6 +320,11 @@
+@@ -278,6 +309,11 @@
Block block = iblockdata.getBlock();
- if (iblockdata.getMaterial() != Material.AIR && a(block)) {
+ if (!iblockdata.isAir() && a(block)) {
+ // CraftBukkit start
-+ if (CraftEventFactory.callEntityChangeBlockEvent(this, blockposition, Blocks.AIR, 0).isCancelled()) {
++ if (CraftEventFactory.callEntityChangeBlockEvent(this, blockposition, Blocks.AIR.getBlockData()).isCancelled()) {
+ continue;
+ }
+ // CraftBukkit end
flag = this.world.setAir(blockposition, true) || flag;
}
}
-@@ -302,7 +338,7 @@
+@@ -291,7 +327,7 @@
}
if (this.ticksLived % 20 == 0) {
@@ -75,4 +75,4 @@
+ this.heal(1.0F, EntityRegainHealthEvent.RegainReason.REGEN); // CraftBukkit
}
- this.bG.setProgress(this.getHealth() / this.getMaxHealth());
+ this.bL.setProgress(this.getHealth() / this.getMaxHealth());
diff --git a/nms-patches/EntityWitherSkull.patch b/nms-patches/EntityWitherSkull.patch
index ba9d9478..c700d1a9 100644
--- a/nms-patches/EntityWitherSkull.patch
+++ b/nms-patches/EntityWitherSkull.patch
@@ -7,8 +7,8 @@
+
public class EntityWitherSkull extends EntityFireball {
- private static final DataWatcherObject<Boolean> e = DataWatcher.a(EntityWitherSkull.class, DataWatcherRegistry.h);
-@@ -41,11 +43,11 @@
+ private static final DataWatcherObject<Boolean> e = DataWatcher.a(EntityWitherSkull.class, DataWatcherRegistry.i);
+@@ -28,11 +30,11 @@
if (!this.world.isClientSide) {
if (movingobjectposition.entity != null) {
if (this.shooter != null) {
@@ -22,7 +22,7 @@
}
}
} else {
-@@ -67,7 +69,15 @@
+@@ -54,7 +56,15 @@
}
}
diff --git a/nms-patches/EntityWolf.patch b/nms-patches/EntityWolf.patch
index 1efa3ef5..69378f11 100644
--- a/nms-patches/EntityWolf.patch
+++ b/nms-patches/EntityWolf.patch
@@ -1,7 +1,7 @@
--- a/net/minecraft/server/EntityWolf.java
+++ b/net/minecraft/server/EntityWolf.java
@@ -4,6 +4,11 @@
- import java.util.UUID;
+ import java.util.function.Predicate;
import javax.annotation.Nullable;
+// CraftBukkit start
@@ -12,7 +12,7 @@
public class EntityWolf extends EntityTameableAnimal {
private static final DataWatcherObject<Float> DATA_HEALTH = DataWatcher.a(EntityWolf.class, DataWatcherRegistry.c);
-@@ -62,6 +67,22 @@
+@@ -57,6 +62,22 @@
this.getAttributeMap().b(GenericAttributes.ATTACK_DAMAGE).setValue(2.0D);
}
@@ -35,7 +35,7 @@
public void setGoalTarget(@Nullable EntityLiving entityliving) {
super.setGoalTarget(entityliving);
if (entityliving == null) {
-@@ -200,9 +221,9 @@
+@@ -191,7 +212,8 @@
Entity entity = damagesource.getEntity();
if (this.goalSit != null) {
@@ -43,11 +43,9 @@
+ // CraftBukkit - moved into EntityLiving.d(DamageSource, float)
+ // this.goalSit.setSitting(false);
}
--
+
if (entity != null && !(entity instanceof EntityHuman) && !(entity instanceof EntityArrow)) {
- f = (f + 1.0F) / 2.0F;
- }
-@@ -245,7 +266,7 @@
+@@ -237,7 +259,7 @@
itemstack.subtract(1);
}
@@ -55,17 +53,17 @@
+ this.heal((float) itemfood.getNutrition(itemstack), org.bukkit.event.entity.EntityRegainHealthEvent.RegainReason.EATING); // CraftBukkit
return true;
}
- } else if (itemstack.getItem() == Items.DYE) {
-@@ -266,7 +287,7 @@
+ } else if (item instanceof ItemDye) {
+@@ -258,7 +280,7 @@
this.goalSit.setSitting(!this.isSitting());
- this.bd = false;
- this.navigation.p();
+ this.bg = false;
+ this.navigation.r();
- this.setGoalTarget((EntityLiving) null);
+ this.setGoalTarget((EntityLiving) null, TargetReason.FORGOT_TARGET, true); // CraftBukkit - reason
}
- } else if (itemstack.getItem() == Items.BONE && !this.isAngry()) {
+ } else if (item == Items.BONE && !this.isAngry()) {
if (!entityhuman.abilities.canInstantlyBuild) {
-@@ -274,12 +295,13 @@
+@@ -266,12 +288,13 @@
}
if (!this.world.isClientSide) {
@@ -73,11 +71,11 @@
+ // CraftBukkit - added event call and isCancelled check.
+ if (this.random.nextInt(3) == 0 && !CraftEventFactory.callEntityTameEvent(this, entityhuman).isCancelled()) {
this.c(entityhuman);
- this.navigation.p();
+ this.navigation.r();
this.setGoalTarget((EntityLiving) null);
this.goalSit.setSitting(true);
- this.setHealth(20.0F);
+ this.setHealth(this.getMaxHealth()); // CraftBukkit - 20.0 -> getMaxHealth()
- this.p(true);
+ this.s(true);
this.world.broadcastEntityEffect(this, (byte) 7);
} else {
diff --git a/nms-patches/EntityZombie.patch b/nms-patches/EntityZombie.patch
index 60c08876..4ae666cd 100644
--- a/nms-patches/EntityZombie.patch
+++ b/nms-patches/EntityZombie.patch
@@ -1,6 +1,6 @@
--- a/net/minecraft/server/EntityZombie.java
+++ b/net/minecraft/server/EntityZombie.java
-@@ -5,6 +5,13 @@
+@@ -6,6 +6,13 @@
import java.util.UUID;
import javax.annotation.Nullable;
@@ -13,36 +13,36 @@
+
public class EntityZombie extends EntityMonster {
- protected static final IAttribute a = (new AttributeRanged((IAttribute) null, "zombie.spawnReinforcements", 0.0D, 0.0D, 1.0D)).a("Spawn Reinforcements Chance");
-@@ -133,7 +140,14 @@
- }
+ protected static final IAttribute c = (new AttributeRanged((IAttribute) null, "zombie.spawnReinforcements", 0.0D, 0.0D, 1.0D)).a("Spawn Reinforcements Chance");
+@@ -182,7 +189,14 @@
+ }
- if (flag) {
-- this.setOnFire(8);
-+ // CraftBukkit start
-+ EntityCombustEvent event = new EntityCombustEvent(this.getBukkitEntity(), 8);
-+ this.world.getServer().getPluginManager().callEvent(event);
+ 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
- }
++ if (!event.isCancelled()) {
++ this.setOnFire(event.getDuration());
++ }
++ // CraftBukkit end
}
}
-@@ -167,8 +181,8 @@
+
+@@ -251,8 +265,8 @@
if (this.world.getType(new BlockPosition(i1, j1 - 1, k1)).q() && 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())) {
+ if (!this.world.isPlayerNearby((double) i1, (double) j1, (double) k1, 7.0D) && this.world.b((Entity) entityzombie, entityzombie.getBoundingBox()) && this.world.getCubes(entityzombie, entityzombie.getBoundingBox()) && !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.D(new BlockPosition(entityzombie)), (GroupDataEntity) null);
- this.getAttributeInstance(EntityZombie.a).b(new AttributeModifier("Zombie reinforcement caller charge", -0.05000000074505806D, 0));
- entityzombie.getAttributeInstance(EntityZombie.a).b(new AttributeModifier("Zombie reinforcement callee charge", -0.05000000074505806D, 0));
-@@ -191,7 +205,14 @@
- float f = this.world.D(new BlockPosition(this)).b();
++ entityzombie.setGoalTarget(entityliving, EntityTargetEvent.TargetReason.REINFORCEMENT_TARGET, true); // CraftBukkit
+ entityzombie.prepare(this.world.getDamageScaler(new BlockPosition(entityzombie)), (GroupDataEntity) null, (NBTTagCompound) null);
+ this.getAttributeInstance(EntityZombie.c).b(new AttributeModifier("Zombie reinforcement caller charge", -0.05000000074505806D, 0));
+ entityzombie.getAttributeInstance(EntityZombie.c).b(new AttributeModifier("Zombie reinforcement callee charge", -0.05000000074505806D, 0));
+@@ -275,7 +289,14 @@
+ float f = this.world.getDamageScaler(new BlockPosition(this)).b();
if (this.getItemInMainHand().isEmpty() && this.isBurning() && this.random.nextFloat() < f * 0.3F) {
- entity.setOnFire(2 * (int) f);
@@ -57,7 +57,7 @@
}
}
-@@ -284,7 +305,7 @@
+@@ -371,7 +392,7 @@
entityzombievillager.setCustomNameVisible(entityvillager.getCustomNameVisible());
}
@@ -66,16 +66,16 @@
this.world.a((EntityHuman) null, 1026, new BlockPosition(this), 0);
}
-@@ -334,7 +355,7 @@
+@@ -421,7 +442,7 @@
entitychicken1.setPositionRotation(this.locX, this.locY, this.locZ, this.yaw, 0.0F);
- entitychicken1.prepare(difficultydamagescaler, (GroupDataEntity) null);
- entitychicken1.p(true);
+ entitychicken1.prepare(difficultydamagescaler, (GroupDataEntity) null, (NBTTagCompound) null);
+ entitychicken1.s(true);
- this.world.addEntity(entitychicken1);
+ this.world.addEntity(entitychicken1, CreatureSpawnEvent.SpawnReason.MOUNT); // CraftBukkit
this.startRiding(entitychicken1);
}
}
-@@ -392,7 +413,7 @@
+@@ -494,7 +515,7 @@
}
public void die(DamageSource damagesource) {
@@ -84,7 +84,7 @@
if (damagesource.getEntity() instanceof EntityCreeper) {
EntityCreeper entitycreeper = (EntityCreeper) damagesource.getEntity();
-@@ -405,6 +426,7 @@
+@@ -507,6 +528,7 @@
}
}
}
diff --git a/nms-patches/EntityZombieVillager.patch b/nms-patches/EntityZombieVillager.patch
index 247d0227..c4d767bc 100644
--- a/nms-patches/EntityZombieVillager.patch
+++ b/nms-patches/EntityZombieVillager.patch
@@ -1,17 +1,17 @@
--- a/net/minecraft/server/EntityZombieVillager.java
+++ b/net/minecraft/server/EntityZombieVillager.java
@@ -9,6 +9,7 @@
- private static final DataWatcherObject<Integer> c = DataWatcher.a(EntityZombieVillager.class, DataWatcherRegistry.b);
+ private static final DataWatcherObject<Integer> b = DataWatcher.a(EntityZombieVillager.class, DataWatcherRegistry.b);
private int conversionTime;
- private UUID by;
+ private UUID bD;
+ private int lastTick = MinecraftServer.currentTick; // CraftBukkit - add field
public EntityZombieVillager(World world) {
- super(world);
-@@ -60,6 +61,11 @@
- public void B_() {
+ super(EntityTypes.ZOMBIE_VILLAGER, world);
+@@ -56,6 +57,11 @@
+ public void tick() {
if (!this.world.isClientSide && this.isConverting()) {
- int i = this.du();
+ int i = this.dK();
+ // CraftBukkit start - Use wall time instead of ticks for villager conversion
+ int elapsedTicks = MinecraftServer.currentTick - this.lastTick;
+ this.lastTick = MinecraftServer.currentTick;
@@ -26,6 +26,6 @@
- this.world.addEntity(entityvillager);
+ this.world.addEntity(entityvillager, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.CURED); // CraftBukkit - add SpawnReason
- if (this.by != null) {
- EntityHuman entityhuman = this.world.b(this.by);
+ if (this.bD != null) {
+ EntityHuman entityhuman = this.world.b(this.bD);
diff --git a/nms-patches/ExpirableListEntry.patch b/nms-patches/ExpirableListEntry.patch
index aa81c824..6b07ceff 100644
--- a/nms-patches/ExpirableListEntry.patch
+++ b/nms-patches/ExpirableListEntry.patch
@@ -1,6 +1,6 @@
--- a/net/minecraft/server/ExpirableListEntry.java
+++ b/net/minecraft/server/ExpirableListEntry.java
-@@ -22,7 +22,7 @@
+@@ -23,7 +23,7 @@
}
protected ExpirableListEntry(T t0, JsonObject jsonobject) {
@@ -9,7 +9,7 @@
Date date;
-@@ -65,4 +65,30 @@
+@@ -72,4 +72,30 @@
jsonobject.addProperty("expires", this.d == null ? "forever" : ExpirableListEntry.a.format(this.d));
jsonobject.addProperty("reason", this.e);
}
diff --git a/nms-patches/Explosion.patch b/nms-patches/Explosion.patch
index ccc8d40f..be06f65b 100644
--- a/nms-patches/Explosion.patch
+++ b/nms-patches/Explosion.patch
@@ -14,13 +14,13 @@
public class Explosion {
private final boolean a;
-@@ -23,11 +30,12 @@
- private final float size;
+@@ -24,11 +31,12 @@
+ private DamageSource j;
private final List<BlockPosition> blocks = Lists.newArrayList();
- private final Map<EntityHuman, Vec3D> k = Maps.newHashMap();
+ private final Map<EntityHuman, Vec3D> l = 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) {
+ public Explosion(World world, @Nullable Entity entity, double d0, double d1, double d2, float f, boolean flag, boolean flag1) {
this.world = world;
this.source = entity;
- this.size = f;
@@ -28,7 +28,7 @@
this.posX = d0;
this.posY = d1;
this.posZ = d2;
-@@ -36,6 +44,11 @@
+@@ -38,6 +46,11 @@
}
public void a() {
@@ -40,7 +40,7 @@
HashSet hashset = Sets.newHashSet();
boolean flag = true;
-@@ -69,7 +82,7 @@
+@@ -75,7 +88,7 @@
f -= (f2 + 0.3F) * 0.3F;
}
@@ -49,16 +49,16 @@
hashset.add(blockposition);
}
-@@ -113,7 +126,16 @@
+@@ -119,7 +132,16 @@
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 * 7.0D * (double) f3 + 1.0D)));
+- entity.damageEntity(this.b(), (float) ((int) ((d13 * d13 + d13) / 2.0D * 7.0D * (double) f3 + 1.0D)));
+ // CraftBukkit start
-+ // entity.damageEntity(DamageSource.explosion(this), (float) ((int) ((d13 * d13 + d13) / 2.0D * 7.0D * (double) f3 + 1.0D)));
++ // entity.damageEntity(this.b(), (float) ((int) ((d13 * d13 + d13) / 2.0D * 7.0D * (double) f3 + 1.0D)));
+ CraftEventFactory.entityDamage = source;
+ entity.forceExplosionKnockback = false;
-+ boolean wasDamaged = entity.damageEntity(DamageSource.explosion(this), (float) ((int) ((d13 * d13 + d13) / 2.0D * 7.0D * (double) f3 + 1.0D)));
++ boolean wasDamaged = entity.damageEntity(this.b(), (float) ((int) ((d13 * d13 + d13) / 2.0D * 7.0D * (double) f3 + 1.0D)));
+ CraftEventFactory.entityDamage = null;
+ if (!wasDamaged && !(entity instanceof EntityTNTPrimed || entity instanceof EntityFallingBlock) && !entity.forceExplosionKnockback) {
+ continue;
@@ -67,7 +67,7 @@
double d14 = d13;
if (entity instanceof EntityLiving) {
-@@ -149,6 +171,50 @@
+@@ -155,6 +177,50 @@
BlockPosition blockposition;
if (this.b) {
@@ -118,20 +118,20 @@
iterator = this.blocks.iterator();
while (iterator.hasNext()) {
-@@ -180,7 +246,8 @@
+@@ -186,7 +252,8 @@
- if (iblockdata.getMaterial() != Material.AIR) {
+ if (!iblockdata.isAir()) {
if (block.a(this)) {
-- block.dropNaturally(this.world, blockposition, this.world.getType(blockposition), 1.0F / this.size, 0);
+- iblockdata.dropNaturally(this.world, blockposition, 1.0F / this.size, 0);
+ // CraftBukkit - add yield
-+ block.dropNaturally(this.world, blockposition, this.world.getType(blockposition), yield, 0);
++ iblockdata.dropNaturally(this.world, blockposition, yield, 0);
}
this.world.setTypeAndData(blockposition, Blocks.AIR.getBlockData(), 3);
-@@ -195,7 +262,11 @@
+@@ -201,7 +268,11 @@
while (iterator.hasNext()) {
blockposition = (BlockPosition) iterator.next();
- if (this.world.getType(blockposition).getMaterial() == Material.AIR && this.world.getType(blockposition.down()).b() && this.c.nextInt(3) == 0) {
+ if (this.world.getType(blockposition).isAir() && this.world.getType(blockposition.down()).f(this.world, blockposition.down()) && this.c.nextInt(3) == 0) {
- this.world.setTypeUpdate(blockposition, Blocks.FIRE.getBlockData());
+ // CraftBukkit start - Ignition by explosion
+ if (!org.bukkit.craftbukkit.event.CraftEventFactory.callBlockIgniteEvent(this.world, blockposition.getX(), blockposition.getY(), blockposition.getZ(), this).isCancelled()) {
@@ -141,7 +141,7 @@
}
}
}
-@@ -208,7 +279,9 @@
+@@ -222,7 +293,9 @@
@Nullable
public EntityLiving getSource() {
diff --git a/nms-patches/FluidTypeFlowing.patch b/nms-patches/FluidTypeFlowing.patch
new file mode 100644
index 00000000..d1f69c07
--- /dev/null
+++ b/nms-patches/FluidTypeFlowing.patch
@@ -0,0 +1,46 @@
+--- a/net/minecraft/server/FluidTypeFlowing.java
++++ b/net/minecraft/server/FluidTypeFlowing.java
+@@ -5,6 +5,11 @@
+ import java.util.Iterator;
+ import java.util.Map;
+ import java.util.Map.Entry;
++// CraftBukkit start
++import org.bukkit.block.BlockFace;
++import org.bukkit.craftbukkit.block.CraftBlock;
++import org.bukkit.event.block.BlockFromToEvent;
++// CraftBukkit end
+
+ public abstract class FluidTypeFlowing extends FluidType {
+
+@@ -116,6 +121,15 @@
+ Fluid fluid1 = this.a((IWorldReader) generatoraccess, blockposition1, iblockdata1);
+
+ if (this.a(generatoraccess, blockposition, iblockdata, EnumDirection.DOWN, blockposition1, iblockdata1, generatoraccess.b(blockposition1), fluid1.c())) {
++ // CraftBukkit start
++ org.bukkit.block.Block source = CraftBlock.at(generatoraccess, blockposition);
++ BlockFromToEvent event = new BlockFromToEvent(source, BlockFace.DOWN);
++ generatoraccess.getMinecraftWorld().getServer().getPluginManager().callEvent(event);
++
++ if (event.isCancelled()) {
++ return;
++ }
++ // CraftBukkit end
+ this.a(generatoraccess, blockposition1, iblockdata1, EnumDirection.DOWN, fluid1);
+ if (this.a((IWorldReader) generatoraccess, blockposition) >= 3) {
+ this.a(generatoraccess, blockposition, fluid, iblockdata);
+@@ -146,6 +160,15 @@
+ IBlockData iblockdata1 = generatoraccess.getType(blockposition1);
+
+ if (this.a(generatoraccess, blockposition, iblockdata, enumdirection, blockposition1, iblockdata1, generatoraccess.b(blockposition1), fluid1.c())) {
++ // CraftBukkit start
++ org.bukkit.block.Block source = CraftBlock.at(generatoraccess, blockposition);
++ BlockFromToEvent event = new BlockFromToEvent(source, org.bukkit.craftbukkit.block.CraftBlock.notchToBlockFace(enumdirection));
++ generatoraccess.getMinecraftWorld().getServer().getPluginManager().callEvent(event);
++
++ if (event.isCancelled()) {
++ continue;
++ }
++ // CraftBukkit end
+ this.a(generatoraccess, blockposition1, iblockdata1, enumdirection, fluid1);
+ }
+ }
diff --git a/nms-patches/FluidTypeLava.patch b/nms-patches/FluidTypeLava.patch
new file mode 100644
index 00000000..ef36738d
--- /dev/null
+++ b/nms-patches/FluidTypeLava.patch
@@ -0,0 +1,44 @@
+--- a/net/minecraft/server/FluidTypeLava.java
++++ b/net/minecraft/server/FluidTypeLava.java
+@@ -35,6 +35,13 @@
+
+ if (iblockdata.isAir()) {
+ if (this.a((IWorldReader) world, blockposition1)) {
++ // CraftBukkit start - Prevent lava putting something on fire
++ if (world.getType(blockposition1) != Blocks.FIRE) {
++ if (org.bukkit.craftbukkit.event.CraftEventFactory.callBlockIgniteEvent(world, blockposition1, blockposition).isCancelled()) {
++ continue;
++ }
++ }
++ // CraftBukkit end
+ world.setTypeUpdate(blockposition1, Blocks.FIRE.getBlockData());
+ return;
+ }
+@@ -51,6 +58,14 @@
+ }
+
+ if (world.isEmpty(blockposition2.up()) && this.b(world, blockposition2)) {
++ // CraftBukkit start - Prevent lava putting something on fire
++ BlockPosition up = blockposition2.up();
++ if (world.getType(up) != Blocks.FIRE) {
++ if (org.bukkit.craftbukkit.event.CraftEventFactory.callBlockIgniteEvent(world, up, blockposition).isCancelled()) {
++ continue;
++ }
++ }
++ // CraftBukkit end
+ world.setTypeUpdate(blockposition2.up(), Blocks.FIRE.getBlockData());
+ }
+ }
+@@ -139,7 +154,11 @@
+
+ if (this.a(TagsFluid.b) && fluid1.a(TagsFluid.a)) {
+ if (iblockdata.getBlock() instanceof BlockFluids) {
+- generatoraccess.setTypeAndData(blockposition, Blocks.STONE.getBlockData(), 3);
++ // CraftBukkit start
++ if (!org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockFormEvent(generatoraccess.getMinecraftWorld(), blockposition, Blocks.STONE.getBlockData(), 3)) {
++ return;
++ }
++ // CraftBukkit end
+ }
+
+ this.a(generatoraccess, blockposition);
diff --git a/nms-patches/FoodMetaData.patch b/nms-patches/FoodMetaData.patch
index 121f388b..3383084e 100644
--- a/nms-patches/FoodMetaData.patch
+++ b/nms-patches/FoodMetaData.patch
@@ -64,7 +64,7 @@
this.a(f);
this.foodTickTimer = 0;
}
- } else if (flag && this.foodLevel >= 18 && entityhuman.dj()) {
+ } else if (flag && this.foodLevel >= 18 && entityhuman.dw()) {
++this.foodTickTimer;
if (this.foodTickTimer >= 80) {
- entityhuman.heal(1.0F);
diff --git a/nms-patches/FurnaceRecipe.patch b/nms-patches/FurnaceRecipe.patch
new file mode 100644
index 00000000..30eb77a1
--- /dev/null
+++ b/nms-patches/FurnaceRecipe.patch
@@ -0,0 +1,44 @@
+--- a/net/minecraft/server/FurnaceRecipe.java
++++ b/net/minecraft/server/FurnaceRecipe.java
+@@ -2,6 +2,10 @@
+
+ import com.google.gson.JsonElement;
+ import com.google.gson.JsonObject;
++import org.bukkit.craftbukkit.inventory.CraftFurnaceRecipe;
++import org.bukkit.craftbukkit.inventory.CraftItemStack;
++import org.bukkit.craftbukkit.util.CraftNamespacedKey;
++import org.bukkit.inventory.Recipe;
+
+ public class FurnaceRecipe implements IRecipe {
+
+@@ -56,6 +60,16 @@
+ return this.key;
+ }
+
++ @Override
++ public Recipe toBukkitRecipe() {
++ CraftItemStack result = CraftItemStack.asCraftMirror(this.result);
++ RecipeItemStack list = this.ingredient;
++ list.buildChoices();
++ net.minecraft.server.ItemStack stack = list.choices[0];
++
++ return new CraftFurnaceRecipe(CraftNamespacedKey.fromMinecraft(this.key), result, CraftItemStack.asCraftMirror(stack), this.experience, this.cookingTime);
++ }
++
+ public static class a implements RecipeSerializer<FurnaceRecipe> {
+
+ public a() {}
+@@ -106,11 +120,11 @@
+ return "smelting";
+ }
+
+- public IRecipe a(MinecraftKey minecraftkey, PacketDataSerializer packetdataserializer) {
++ public FurnaceRecipe a(MinecraftKey minecraftkey, PacketDataSerializer packetdataserializer) { // CraftBukkit - decompile error
+ return this.b(minecraftkey, packetdataserializer);
+ }
+
+- public IRecipe a(MinecraftKey minecraftkey, JsonObject jsonobject) {
++ public FurnaceRecipe a(MinecraftKey minecraftkey, JsonObject jsonobject) { // CraftBukkit - decompile error
+ return this.b(minecraftkey, jsonobject);
+ }
+ }
diff --git a/nms-patches/HandshakeListener.patch b/nms-patches/HandshakeListener.patch
index 8799f9f0..0b5c975c 100644
--- a/nms-patches/HandshakeListener.patch
+++ b/nms-patches/HandshakeListener.patch
@@ -57,8 +57,8 @@
+ }
+ // CraftBukkit end
+
- if (packethandshakinginsetprotocol.b() > 340) {
- chatmessage = new ChatMessage("multiplayer.disconnect.outdated_server", new Object[] { "1.12.2"});
+ if (packethandshakinginsetprotocol.c() > 389) {
+ chatmessage = new ChatMessage("multiplayer.disconnect.outdated_server", new Object[] { "1.13-pre7"});
this.b.sendPacket(new PacketLoginOutDisconnect(chatmessage));
@@ -26,6 +71,7 @@
this.b.close(chatmessage);
diff --git a/nms-patches/ICommandListener.patch b/nms-patches/ICommandListener.patch
new file mode 100644
index 00000000..d1efb9cd
--- /dev/null
+++ b/nms-patches/ICommandListener.patch
@@ -0,0 +1,9 @@
+--- a/net/minecraft/server/ICommandListener.java
++++ b/net/minecraft/server/ICommandListener.java
+@@ -9,4 +9,6 @@
+ boolean b();
+
+ boolean B_();
++
++ org.bukkit.command.CommandSender getBukkitSender(CommandListenerWrapper wrapper); // CraftBukkit
+ }
diff --git a/nms-patches/IDataManager.patch b/nms-patches/IDataManager.patch
index 362ecd76..a02e77ba 100644
--- a/nms-patches/IDataManager.patch
+++ b/nms-patches/IDataManager.patch
@@ -1,9 +1,9 @@
--- a/net/minecraft/server/IDataManager.java
+++ b/net/minecraft/server/IDataManager.java
-@@ -25,4 +25,6 @@
- File getDataFile(String s);
-
+@@ -29,4 +29,6 @@
DefinedStructureManager h();
+
+ DataFixer i();
+
+ java.util.UUID getUUID(); // CraftBukkit
}
diff --git a/nms-patches/IInventory.patch b/nms-patches/IInventory.patch
index 0d2e884c..4dd0f897 100644
--- a/nms-patches/IInventory.patch
+++ b/nms-patches/IInventory.patch
@@ -8,10 +8,10 @@
public interface IInventory extends INamableTileEntity {
int getSize();
-@@ -33,4 +35,22 @@
- int h();
-
- void clear();
+@@ -41,4 +43,29 @@
+ default int U_() {
+ return 0;
+ }
+
+ // CraftBukkit start
+ java.util.List<ItemStack> getContents();
@@ -28,6 +28,13 @@
+
+ org.bukkit.Location getLocation();
+
++ default IRecipe getCurrentRecipe() {
++ return null;
++ }
++
++ default void setCurrentRecipe(IRecipe recipe) {
++ }
++
+ int MAX_STACK = 64;
+ // CraftBukkit end
}
diff --git a/nms-patches/IRecipe.patch b/nms-patches/IRecipe.patch
index 325b5b69..c6b88882 100644
--- a/nms-patches/IRecipe.patch
+++ b/nms-patches/IRecipe.patch
@@ -1,11 +1,9 @@
--- a/net/minecraft/server/IRecipe.java
+++ b/net/minecraft/server/IRecipe.java
-@@ -17,4 +17,8 @@
- default boolean c() {
- return false;
- }
+@@ -33,4 +33,6 @@
+ MinecraftKey getKey();
+
+ RecipeSerializer<?> a();
+
+ org.bukkit.inventory.Recipe toBukkitRecipe(); // CraftBukkit
-+
-+ void setKey(MinecraftKey key); // CraftBukkit
}
diff --git a/nms-patches/IWorldWriter.patch b/nms-patches/IWorldWriter.patch
new file mode 100644
index 00000000..2315ab9b
--- /dev/null
+++ b/nms-patches/IWorldWriter.patch
@@ -0,0 +1,11 @@
+--- a/net/minecraft/server/IWorldWriter.java
++++ b/net/minecraft/server/IWorldWriter.java
+@@ -6,6 +6,8 @@
+
+ boolean addEntity(Entity entity);
+
++ boolean addEntity(Entity entity, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason reason); // CraftBukkit
++
+ boolean setAir(BlockPosition blockposition);
+
+ void a(EnumSkyBlock enumskyblock, BlockPosition blockposition, int i);
diff --git a/nms-patches/InventoryCraftResult.patch b/nms-patches/InventoryCraftResult.patch
index 70c8e7f1..4f275b25 100644
--- a/nms-patches/InventoryCraftResult.patch
+++ b/nms-patches/InventoryCraftResult.patch
@@ -10,7 +10,7 @@
+import org.bukkit.entity.HumanEntity;
+// CraftBukkit end
- public class InventoryCraftResult implements IInventory {
+ public class InventoryCraftResult implements IInventory, RecipeHolder {
private final NonNullList<ItemStack> items;
private IRecipe b;
@@ -46,7 +46,7 @@
public InventoryCraftResult() {
this.items = NonNullList.a(1, ItemStack.a);
}
-@@ -61,7 +94,7 @@
+@@ -62,7 +95,7 @@
}
public int getMaxStackSize() {
diff --git a/nms-patches/InventoryCrafting.patch b/nms-patches/InventoryCrafting.patch
index 3ddb4a1c..336fdb19 100644
--- a/nms-patches/InventoryCrafting.patch
+++ b/nms-patches/InventoryCrafting.patch
@@ -1,9 +1,9 @@
--- a/net/minecraft/server/InventoryCrafting.java
+++ b/net/minecraft/server/InventoryCrafting.java
-@@ -1,6 +1,14 @@
- package net.minecraft.server;
+@@ -2,6 +2,14 @@
import java.util.Iterator;
+ import javax.annotation.Nullable;
+// CraftBukkit start
+import java.util.List;
+import org.bukkit.Location;
@@ -13,15 +13,15 @@
+import org.bukkit.event.inventory.InventoryType;
+// CraftBukkit end
- public class InventoryCrafting implements IInventory {
+ public class InventoryCrafting implements IInventory, AutoRecipeOutput {
-@@ -9,6 +17,53 @@
+@@ -10,6 +18,63 @@
private final int c;
public final Container container;
+ // CraftBukkit start - add fields
+ public List<HumanEntity> transaction = new java.util.ArrayList<HumanEntity>();
-+ public IRecipe currentRecipe;
++ private IRecipe currentRecipe;
+ public IInventory resultInventory;
+ private EntityHuman owner;
+ private int maxStack = MAX_STACK;
@@ -60,6 +60,16 @@
+ return owner.getBukkitEntity().getLocation();
+ }
+
++ @Override
++ public IRecipe getCurrentRecipe() {
++ return currentRecipe;
++ }
++
++ @Override
++ public void setCurrentRecipe(IRecipe currentRecipe) {
++ this.currentRecipe = currentRecipe;
++ }
++
+ public InventoryCrafting(Container container, int i, int j, EntityHuman player) {
+ this(container, i, j);
+ this.owner = player;
diff --git a/nms-patches/InventoryEnderChest.patch b/nms-patches/InventoryEnderChest.patch
index 18f4a07b..c31016ff 100644
--- a/nms-patches/InventoryEnderChest.patch
+++ b/nms-patches/InventoryEnderChest.patch
@@ -23,7 +23,7 @@
- public InventoryEnderChest() {
+ public InventoryEnderChest(EntityHuman owner) {
- super("container.enderchest", false, 27);
+ super(new ChatMessage("container.enderchest", new Object[0]), 27);
+ this.owner = owner;
+ // CraftBukkit end
}
diff --git a/nms-patches/InventoryHorseChest.patch b/nms-patches/InventoryHorseChest.patch
index 875dd670..05e5572c 100644
--- a/nms-patches/InventoryHorseChest.patch
+++ b/nms-patches/InventoryHorseChest.patch
@@ -4,11 +4,11 @@
public class InventoryHorseChest extends InventorySubcontainer {
-- public InventoryHorseChest(String s, int i) {
-- super(s, false, i);
+- public InventoryHorseChest(IChatBaseComponent ichatbasecomponent, int i) {
+- super(ichatbasecomponent, i);
+ // CraftBukkit start
-+ public InventoryHorseChest(String s, int i, EntityHorseAbstract owner) {
-+ super(s, false, i, (org.bukkit.entity.AbstractHorse) owner.getBukkitEntity());
++ public InventoryHorseChest(IChatBaseComponent ichatbasecomponent, int i, EntityHorseAbstract owner) {
++ super(ichatbasecomponent, i, (org.bukkit.entity.AbstractHorse) owner.getBukkitEntity());
+ // CraftBukkit end
}
}
diff --git a/nms-patches/InventoryLargeChest.patch b/nms-patches/InventoryLargeChest.patch
index 3ed9ccd8..f4fdba28 100644
--- a/nms-patches/InventoryLargeChest.patch
+++ b/nms-patches/InventoryLargeChest.patch
@@ -1,8 +1,9 @@
--- a/net/minecraft/server/InventoryLargeChest.java
+++ b/net/minecraft/server/InventoryLargeChest.java
-@@ -1,11 +1,62 @@
+@@ -1,6 +1,14 @@
package net.minecraft.server;
+ import javax.annotation.Nullable;
+// CraftBukkit start
+import java.util.ArrayList;
+import java.util.List;
@@ -11,10 +12,10 @@
+import org.bukkit.craftbukkit.entity.CraftHumanEntity;
+import org.bukkit.entity.HumanEntity;
+// CraftBukkit end
-+
+
public class InventoryLargeChest implements ITileInventory {
- private final String a;
+@@ -8,6 +16,48 @@
public final ITileInventory left;
public final ITileInventory right;
@@ -60,10 +61,10 @@
+ }
+ // CraftBukkit end
+
- public InventoryLargeChest(String s, ITileInventory itileinventory, ITileInventory itileinventory1) {
- this.a = s;
+ public InventoryLargeChest(IChatBaseComponent ichatbasecomponent, ITileInventory itileinventory, ITileInventory itileinventory1) {
+ this.a = ichatbasecomponent;
if (itileinventory == null) {
-@@ -72,7 +123,7 @@
+@@ -75,7 +125,7 @@
}
public int getMaxStackSize() {
diff --git a/nms-patches/InventoryMerchant.patch b/nms-patches/InventoryMerchant.patch
index 8c566307..30897b1d 100644
--- a/nms-patches/InventoryMerchant.patch
+++ b/nms-patches/InventoryMerchant.patch
@@ -1,9 +1,9 @@
--- a/net/minecraft/server/InventoryMerchant.java
+++ b/net/minecraft/server/InventoryMerchant.java
-@@ -1,6 +1,13 @@
- package net.minecraft.server;
+@@ -2,6 +2,13 @@
import java.util.Iterator;
+ import javax.annotation.Nullable;
+// CraftBukkit start
+import java.util.List;
+import org.bukkit.Location;
@@ -14,7 +14,7 @@
public class InventoryMerchant implements IInventory {
-@@ -10,6 +17,40 @@
+@@ -11,6 +18,40 @@
private MerchantRecipe recipe;
public int selectedIndex;
@@ -55,7 +55,7 @@
public InventoryMerchant(EntityHuman entityhuman, IMerchant imerchant) {
this.itemsInSlots = NonNullList.a(3, ItemStack.a);
this.player = entityhuman;
-@@ -89,7 +130,7 @@
+@@ -91,7 +132,7 @@
}
public int getMaxStackSize() {
diff --git a/nms-patches/InventorySubcontainer.patch b/nms-patches/InventorySubcontainer.patch
index ee8e435a..237b30c7 100644
--- a/nms-patches/InventorySubcontainer.patch
+++ b/nms-patches/InventorySubcontainer.patch
@@ -1,8 +1,8 @@
--- a/net/minecraft/server/InventorySubcontainer.java
+++ b/net/minecraft/server/InventorySubcontainer.java
-@@ -4,6 +4,13 @@
- import java.util.Iterator;
+@@ -5,6 +5,13 @@
import java.util.List;
+ import javax.annotation.Nullable;
+// CraftBukkit start
+import java.util.List;
@@ -11,12 +11,12 @@
+import org.bukkit.entity.HumanEntity;
+// CraftBukkit end
+
- public class InventorySubcontainer implements IInventory {
+ public class InventorySubcontainer implements IInventory, AutoRecipeOutput {
- private String a;
-@@ -12,7 +19,47 @@
+ private final IChatBaseComponent a;
+@@ -13,7 +20,47 @@
private List<IInventoryListener> d;
- private boolean e;
+ private IChatBaseComponent e;
+ // CraftBukkit start - add fields and methods
+ public List<HumanEntity> transaction = new java.util.ArrayList<HumanEntity>();
@@ -52,13 +52,13 @@
+ return null;
+ }
+
- public InventorySubcontainer(String s, boolean flag, int i) {
-+ this(s, flag, i, null);
+ public InventorySubcontainer(IChatBaseComponent ichatbasecomponent, int i) {
++ this(ichatbasecomponent, i, null);
+ }
+
-+ public InventorySubcontainer(String s, boolean flag, int i, org.bukkit.inventory.InventoryHolder owner) {
++ public InventorySubcontainer(IChatBaseComponent ichatbasecomponent, int i, org.bukkit.inventory.InventoryHolder owner) {
+ this.bukkitOwner = owner;
+ // CraftBukkit end
- this.a = s;
- this.e = flag;
+ this.a = ichatbasecomponent;
this.b = i;
+ this.items = NonNullList.a(i, ItemStack.a);
diff --git a/nms-patches/ItemArmor.patch b/nms-patches/ItemArmor.patch
index 61627ea6..082ce788 100644
--- a/nms-patches/ItemArmor.patch
+++ b/nms-patches/ItemArmor.patch
@@ -1,6 +1,6 @@
--- a/net/minecraft/server/ItemArmor.java
+++ b/net/minecraft/server/ItemArmor.java
-@@ -5,6 +5,11 @@
+@@ -4,6 +4,11 @@
import java.util.List;
import java.util.UUID;
@@ -11,10 +11,10 @@
+
public class ItemArmor extends Item {
- private static final int[] n = new int[] { 13, 15, 16, 11};
-@@ -33,6 +38,32 @@
+ private static final UUID[] l = new UUID[] { UUID.fromString("845DB27C-C624-495F-8C9F-6020A9A58B6B"), UUID.fromString("D8499B04-0E66-4726-AB29-64469D734E0D"), UUID.fromString("9F3D476D-C118-4544-8365-64846904B48E"), UUID.fromString("2AD3F246-FEE1-4E67-B886-69FD380BB150")};
+@@ -29,6 +34,32 @@
EntityLiving entityliving = (EntityLiving) list.get(0);
- EnumItemSlot enumitemslot = EntityInsentient.d(itemstack);
+ EnumItemSlot enumitemslot = EntityInsentient.e(itemstack);
ItemStack itemstack1 = itemstack.cloneAndSubtract(1);
+ // CraftBukkit start
+ World world = isourceblock.getWorld();
@@ -36,8 +36,8 @@
+ // Chain to handler for new item
+ ItemStack eventStack = CraftItemStack.asNMSCopy(event.getItem());
+ IDispenseBehavior idispensebehavior = (IDispenseBehavior) BlockDispenser.REGISTRY.get(eventStack.getItem());
-+ if (idispensebehavior != IDispenseBehavior.NONE && idispensebehavior != ItemArmor.b) {
-+ idispensebehavior.a(isourceblock, eventStack);
++ if (idispensebehavior != IDispenseBehavior.NONE && idispensebehavior != ItemArmor.a) {
++ idispensebehavior.dispense(isourceblock, eventStack);
+ return itemstack;
+ }
+ }
diff --git a/nms-patches/ItemBlock.patch b/nms-patches/ItemBlock.patch
index 859afa28..b0bf1a67 100644
--- a/nms-patches/ItemBlock.patch
+++ b/nms-patches/ItemBlock.patch
@@ -1,11 +1,39 @@
--- a/net/minecraft/server/ItemBlock.java
+++ b/net/minecraft/server/ItemBlock.java
-@@ -36,7 +36,7 @@
+@@ -2,6 +2,11 @@
- SoundEffectType soundeffecttype = this.a.getStepSound();
+ import java.util.Map;
+ import javax.annotation.Nullable;
++// CraftBukkit start
++import org.bukkit.craftbukkit.block.CraftBlock;
++import org.bukkit.craftbukkit.block.data.CraftBlockData;
++import org.bukkit.event.block.BlockCanBuildEvent;
++// CraftBukkit end
+
+ public class ItemBlock extends Item {
+
+@@ -45,7 +50,7 @@
+
+ SoundEffectType soundeffecttype = block.getStepSound();
- world.a(entityhuman, blockposition, soundeffecttype.e(), SoundCategory.BLOCKS, (soundeffecttype.a() + 1.0F) / 2.0F, soundeffecttype.b() * 0.8F);
+ // world.a(entityhuman, blockposition, soundeffecttype.e(), SoundCategory.BLOCKS, (soundeffecttype.a() + 1.0F) / 2.0F, soundeffecttype.b() * 0.8F); // CraftBukkit - SPIGOT-1288
itemstack.subtract(1);
+ return EnumInteractionResult.SUCCESS;
}
+@@ -64,7 +69,14 @@
+ }
+
+ protected boolean b(BlockActionContext blockactioncontext, IBlockData iblockdata) {
+- return iblockdata.canPlace(blockactioncontext.getWorld(), blockactioncontext.getClickPosition()) && blockactioncontext.getWorld().a(iblockdata, blockactioncontext.getClickPosition());
++ // CraftBukkit start - store default return
++ boolean defaultReturn = iblockdata.canPlace(blockactioncontext.getWorld(), blockactioncontext.getClickPosition()) && blockactioncontext.getWorld().a(iblockdata, blockactioncontext.getClickPosition());
++
++ BlockCanBuildEvent event = new BlockCanBuildEvent(CraftBlock.at(blockactioncontext.getWorld(), blockactioncontext.getClickPosition()), CraftBlockData.fromData(iblockdata), defaultReturn);
++ blockactioncontext.getWorld().getServer().getPluginManager().callEvent(event);
++
++ return event.isBuildable();
++ // CraftBukkit end
+ }
+ protected boolean a(BlockActionContext blockactioncontext, IBlockData iblockdata) {
diff --git a/nms-patches/ItemBoat.patch b/nms-patches/ItemBoat.patch
index e25ef73f..e51c9eb5 100644
--- a/nms-patches/ItemBoat.patch
+++ b/nms-patches/ItemBoat.patch
@@ -1,9 +1,9 @@
--- a/net/minecraft/server/ItemBoat.java
+++ b/net/minecraft/server/ItemBoat.java
-@@ -56,6 +56,13 @@
- } else if (movingobjectposition.type != MovingObjectPosition.EnumMovingObjectType.BLOCK) {
+@@ -52,6 +52,13 @@
+ if (flag) {
return new InteractionResultWrapper(EnumInteractionResult.PASS, itemstack);
- } else {
+ } else if (movingobjectposition.type == MovingObjectPosition.EnumMovingObjectType.BLOCK) {
+ // 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, movingobjectposition.a(), movingobjectposition.direction, itemstack, enumhand);
+
@@ -11,10 +11,10 @@
+ return new InteractionResultWrapper(EnumInteractionResult.PASS, itemstack);
+ }
+ // CraftBukkit end
- Block block = world.getType(movingobjectposition.a()).getBlock();
- boolean flag1 = block == Blocks.WATER || block == Blocks.FLOWING_WATER;
- EntityBoat entityboat = new EntityBoat(world, movingobjectposition.pos.x, flag1 ? movingobjectposition.pos.y - 0.12D : movingobjectposition.pos.y, movingobjectposition.pos.z);
-@@ -66,7 +73,7 @@
+ BlockPosition blockposition = movingobjectposition.a();
+ Block block = world.getType(blockposition).getBlock();
+ EntityBoat entityboat = new EntityBoat(world, movingobjectposition.pos.x, movingobjectposition.pos.y, movingobjectposition.pos.z);
+@@ -62,7 +69,7 @@
return new InteractionResultWrapper(EnumInteractionResult.FAIL, itemstack);
} else {
if (!world.isClientSide) {
diff --git a/nms-patches/ItemBow.patch b/nms-patches/ItemBow.patch
index d17d8d15..4f227519 100644
--- a/nms-patches/ItemBow.patch
+++ b/nms-patches/ItemBow.patch
@@ -1,14 +1,28 @@
--- a/net/minecraft/server/ItemBow.java
+++ b/net/minecraft/server/ItemBow.java
-@@ -1,5 +1,7 @@
+@@ -1,15 +1,21 @@
package net.minecraft.server;
+import org.bukkit.event.entity.EntityCombustEvent; // CraftBukkit
+
public class ItemBow extends Item {
- public ItemBow() {
-@@ -73,7 +75,20 @@
+ public ItemBow(Item.Info item_info) {
+ super(item_info);
++ // CraftBukkit start - obfuscator went a little crazy
++ /*
+ this.a(new MinecraftKey("pull"), (itemstack, world, entityliving) -> {
+ return entityliving == null ? 0.0F : (entityliving.cV().getItem() != Items.BOW ? 0.0F : (float) (itemstack.k() - entityliving.cW()) / 20.0F);
+ });
+ this.a(new MinecraftKey("pulling"), (itemstack, world, entityliving) -> {
+ return entityliving != null && entityliving.isHandRaised() && entityliving.cV() == itemstack ? 1.0F : 0.0F;
+ });
++ */
++ // CraftBukkit end
+ }
+
+ private ItemStack a(EntityHuman entityhuman) {
+@@ -73,7 +79,20 @@
}
if (EnchantmentManager.getEnchantmentLevel(Enchantments.ARROW_FIRE, itemstack) > 0) {
@@ -30,7 +44,7 @@
}
itemstack.damage(1, entityhuman);
-@@ -81,7 +96,15 @@
+@@ -81,7 +100,15 @@
entityarrow.fromPlayer = EntityArrow.PickupStatus.CREATIVE_ONLY;
}
@@ -46,4 +60,4 @@
+ // CraftBukkit end
}
- world.a((EntityHuman) null, entityhuman.locX, entityhuman.locY, entityhuman.locZ, SoundEffects.w, SoundCategory.PLAYERS, 1.0F, 1.0F / (ItemBow.j.nextFloat() * 0.4F + 1.2F) + f * 0.5F);
+ world.a((EntityHuman) null, entityhuman.locX, entityhuman.locY, entityhuman.locZ, SoundEffects.ENTITY_ARROW_SHOOT, SoundCategory.PLAYERS, 1.0F, 1.0F / (ItemBow.k.nextFloat() * 0.4F + 1.2F) + f * 0.5F);
diff --git a/nms-patches/ItemBucket.patch b/nms-patches/ItemBucket.patch
index 0d6b49e1..029b2023 100644
--- a/nms-patches/ItemBucket.patch
+++ b/nms-patches/ItemBucket.patch
@@ -1,62 +1,53 @@
--- a/net/minecraft/server/ItemBucket.java
+++ b/net/minecraft/server/ItemBucket.java
-@@ -1,6 +1,12 @@
+@@ -1,6 +1,13 @@
package net.minecraft.server;
import javax.annotation.Nullable;
+// CraftBukkit start
+import org.bukkit.craftbukkit.event.CraftEventFactory;
+import org.bukkit.craftbukkit.inventory.CraftItemStack;
++import org.bukkit.craftbukkit.util.DummyGeneratorAccess;
+import org.bukkit.event.player.PlayerBucketEmptyEvent;
+import org.bukkit.event.player.PlayerBucketFillEvent;
+// CraftBukkit end
public class ItemBucket extends Item {
-@@ -34,15 +40,29 @@
- Material material = iblockdata.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 new InteractionResultWrapper(EnumInteractionResult.FAIL, itemstack);
-+ }
-+ // CraftBukkit end
- world.setTypeAndData(blockposition, Blocks.AIR.getBlockData(), 11);
- entityhuman.b(StatisticList.b((Item) this));
- entityhuman.a(SoundEffects.S, 1.0F, 1.0F);
-- return new InteractionResultWrapper(EnumInteractionResult.SUCCESS, this.a(itemstack, entityhuman, Items.WATER_BUCKET));
-+ return new InteractionResultWrapper(EnumInteractionResult.SUCCESS, this.a(itemstack, entityhuman, Items.WATER_BUCKET, event.getItemStack())); // CraftBukkit
- } else if (material == Material.LAVA && ((Integer) iblockdata.get(BlockFluids.LEVEL)).intValue() == 0) {
+@@ -28,12 +35,20 @@
+ if (this.a == FluidTypes.a) {
+ iblockdata = world.getType(blockposition);
+ if (iblockdata.getBlock() instanceof IFluidSource) {
+ // CraftBukkit start
-+ PlayerBucketFillEvent event = CraftEventFactory.callPlayerBucketFillEvent(entityhuman, blockposition.getX(), blockposition.getY(), blockposition.getZ(), null, itemstack, Items.LAVA_BUCKET);
++ FluidType dummyFluid = ((IFluidSource) iblockdata.getBlock()).b(DummyGeneratorAccess.INSTANCE, blockposition, iblockdata);
++ PlayerBucketFillEvent event = CraftEventFactory.callPlayerBucketFillEvent(entityhuman, blockposition.getX(), blockposition.getY(), blockposition.getZ(), null, itemstack, dummyFluid.b());
+
+ if (event.isCancelled()) {
+ return new InteractionResultWrapper(EnumInteractionResult.FAIL, itemstack);
+ }
+ // CraftBukkit end
- entityhuman.a(SoundEffects.T, 1.0F, 1.0F);
- world.setTypeAndData(blockposition, Blocks.AIR.getBlockData(), 11);
- entityhuman.b(StatisticList.b((Item) this));
-- return new InteractionResultWrapper(EnumInteractionResult.SUCCESS, this.a(itemstack, entityhuman, Items.LAVA_BUCKET));
-+ return new InteractionResultWrapper(EnumInteractionResult.SUCCESS, this.a(itemstack, entityhuman, Items.LAVA_BUCKET, event.getItemStack())); // CraftBukkit
- } else {
- return new InteractionResultWrapper(EnumInteractionResult.FAIL, itemstack);
- }
-@@ -53,7 +73,7 @@
+ FluidType fluidtype = ((IFluidSource) iblockdata.getBlock()).b(world, blockposition, iblockdata);
- if (!entityhuman.a(blockposition1, movingobjectposition.direction, itemstack)) {
- return new InteractionResultWrapper(EnumInteractionResult.FAIL, itemstack);
-- } else if (this.a(entityhuman, world, blockposition1)) {
-+ } else if (this.a(entityhuman, world, blockposition1, movingobjectposition.direction, blockposition, itemstack)) { // CraftBukkit
- if (entityhuman instanceof EntityPlayer) {
- CriterionTriggers.x.a((EntityPlayer) entityhuman, blockposition1, itemstack);
- }
-@@ -67,16 +87,19 @@
- }
- }
+ if (fluidtype != FluidTypes.a) {
+ entityhuman.b(StatisticList.ITEM_USED.b(this));
+ entityhuman.a(fluidtype.a(TagsFluid.b) ? SoundEffects.ITEM_BUCKET_FILL_LAVA : SoundEffects.ITEM_BUCKET_FILL, 1.0F, 1.0F);
+- ItemStack itemstack1 = this.a(itemstack, entityhuman, fluidtype.b());
++ ItemStack itemstack1 = this.a(itemstack, entityhuman, fluidtype.b(), event.getItemStack()); // CraftBukkit
+
+ if (!world.isClientSide) {
+ CriterionTriggers.j.a((EntityPlayer) entityhuman, new ItemStack(fluidtype.b()));
+@@ -48,7 +63,7 @@
+ iblockdata = world.getType(blockposition);
+ BlockPosition blockposition1 = this.a(iblockdata, blockposition, movingobjectposition);
+
+- if (this.a(entityhuman, world, blockposition1, movingobjectposition)) {
++ if (this.a(entityhuman, world, blockposition1, movingobjectposition, blockposition, itemstack)) { // CraftBukkit
+ this.a(world, itemstack, blockposition1);
+ if (entityhuman instanceof EntityPlayer) {
+ CriterionTriggers.y.a((EntityPlayer) entityhuman, blockposition1, itemstack);
+@@ -76,16 +91,19 @@
+
+ public void a(World world, ItemStack itemstack, BlockPosition blockposition) {}
- private ItemStack a(ItemStack itemstack, EntityHuman entityhuman, Item item) {
+ // CraftBukkit - added ob.ItemStack result - TODO: Is this... the right way to handle this?
@@ -78,33 +69,33 @@
}
return itemstack;
-@@ -84,7 +107,13 @@
+@@ -93,7 +111,13 @@
}
}
+ // CraftBukkit start
- public boolean a(@Nullable EntityHuman entityhuman, World world, BlockPosition blockposition) {
-+ return a(entityhuman, world, blockposition, null, blockposition, null);
+ public boolean a(@Nullable EntityHuman entityhuman, World world, BlockPosition blockposition, @Nullable MovingObjectPosition movingobjectposition) {
++ return a(entityhuman, world, blockposition, movingobjectposition, null, null);
+ }
+
-+ public boolean a(EntityHuman entityhuman, World world, BlockPosition blockposition, EnumDirection enumdirection, BlockPosition clicked, ItemStack itemstack) {
++ public boolean a(EntityHuman entityhuman, World world, BlockPosition blockposition, @Nullable MovingObjectPosition movingobjectposition, BlockPosition clicked, ItemStack itemstack) {
+ // CraftBukkit end
- if (this.a == Blocks.AIR) {
+ if (!(this.a instanceof FluidTypeFlowing)) {
return false;
} else {
-@@ -96,6 +125,15 @@
- if (!world.isEmpty(blockposition) && !flag && !flag1) {
- return false;
+@@ -105,6 +129,15 @@
+ if (!world.isEmpty(blockposition) && !flag && !flag1 && (!(iblockdata.getBlock() instanceof IFluidContainer) || !((IFluidContainer) iblockdata.getBlock()).a((IBlockAccess) world, blockposition, iblockdata, this.a))) {
+ return movingobjectposition == null ? false : this.a(entityhuman, world, movingobjectposition.a().shift(movingobjectposition.direction), (MovingObjectPosition) null);
} else {
+ // CraftBukkit start
+ if (entityhuman != null) {
-+ PlayerBucketEmptyEvent event = CraftEventFactory.callPlayerBucketEmptyEvent(entityhuman, clicked.getX(), clicked.getY(), clicked.getZ(), enumdirection, itemstack);
++ PlayerBucketEmptyEvent event = CraftEventFactory.callPlayerBucketEmptyEvent(entityhuman, clicked.getX(), clicked.getY(), clicked.getZ(), movingobjectposition.direction, itemstack);
+ if (event.isCancelled()) {
+ // TODO: inventory not updated
+ return false;
+ }
+ }
+ // CraftBukkit end
- if (world.worldProvider.l() && this.a == Blocks.FLOWING_WATER) {
+ if (world.worldProvider.isNether() && this.a.a(TagsFluid.a)) {
int i = blockposition.getX();
int j = blockposition.getY();
diff --git a/nms-patches/ItemChorusFruit.patch b/nms-patches/ItemChorusFruit.patch
index c05c10b5..70f0423c 100644
--- a/nms-patches/ItemChorusFruit.patch
+++ b/nms-patches/ItemChorusFruit.patch
@@ -11,9 +11,9 @@
+
public class ItemChorusFruit extends ItemFood {
- public ItemChorusFruit(int i, float f) {
+ public ItemChorusFruit(int i, float f, Item.Info item_info) {
@@ -19,6 +25,20 @@
- double d4 = MathHelper.a(entityliving.locY + (double) (entityliving.getRandom().nextInt(16) - 8), 0.0D, (double) (world.ab() - 1));
+ double d4 = MathHelper.a(entityliving.locY + (double) (entityliving.getRandom().nextInt(16) - 8), 0.0D, (double) (world.aa() - 1));
double d5 = entityliving.locZ + (entityliving.getRandom().nextDouble() - 0.5D) * 16.0D;
+ // CraftBukkit start
diff --git a/nms-patches/ItemDye.patch b/nms-patches/ItemDye.patch
index e92fa188..ab3d4cd2 100644
--- a/nms-patches/ItemDye.patch
+++ b/nms-patches/ItemDye.patch
@@ -1,19 +1,21 @@
--- a/net/minecraft/server/ItemDye.java
+++ b/net/minecraft/server/ItemDye.java
-@@ -1,5 +1,7 @@
- package net.minecraft.server;
+@@ -3,6 +3,8 @@
+ import com.google.common.collect.Maps;
+ import java.util.Map;
+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());
+ private static final Map<EnumColor, ItemDye> a = Maps.newEnumMap(EnumColor.class);
+@@ -19,7 +21,17 @@
+ EntitySheep entitysheep = (EntitySheep) entityliving;
- if (!entitysheep.isSheared() && entitysheep.getColor() != enumcolor) {
+ if (!entitysheep.isSheared() && entitysheep.getColor() != this.b) {
+- entitysheep.setColor(this.b);
+ // CraftBukkit start
-+ byte bColor = (byte) enumcolor.getColorIndex();
++ byte bColor = (byte) this.b.getColorIndex();
+ SheepDyeWoolEvent event = new SheepDyeWoolEvent((org.bukkit.entity.Sheep) entitysheep.getBukkitEntity(), org.bukkit.DyeColor.getByWoolData(bColor));
+ entitysheep.world.getServer().getPluginManager().callEvent(event);
+
@@ -21,8 +23,8 @@
+ return false;
+ }
+
-+ enumcolor = EnumColor.fromColorIndex((byte) event.getColor().getWoolData());
++ entitysheep.setColor(EnumColor.fromColorIndex((byte) event.getColor().getWoolData()));
+ // CraftBukkit end
- entitysheep.setColor(enumcolor);
itemstack.subtract(1);
}
+
diff --git a/nms-patches/ItemEnderPearl.patch b/nms-patches/ItemEnderPearl.patch
index ea00f572..baec115c 100644
--- a/nms-patches/ItemEnderPearl.patch
+++ b/nms-patches/ItemEnderPearl.patch
@@ -1,6 +1,6 @@
--- a/net/minecraft/server/ItemEnderPearl.java
+++ b/net/minecraft/server/ItemEnderPearl.java
-@@ -10,18 +10,26 @@
+@@ -9,18 +9,26 @@
public InteractionResultWrapper<ItemStack> a(World world, EntityHuman entityhuman, EnumHand enumhand) {
ItemStack itemstack = entityhuman.b(enumhand);
@@ -21,7 +21,7 @@
itemstack.subtract(1);
}
- world.a((EntityHuman) null, entityhuman.locX, entityhuman.locY, entityhuman.locZ, SoundEffects.bn, SoundCategory.NEUTRAL, 0.5F, 0.4F / (ItemEnderPearl.j.nextFloat() * 0.4F + 0.8F));
+ world.a((EntityHuman) null, entityhuman.locX, entityhuman.locY, entityhuman.locZ, SoundEffects.ENTITY_ENDER_PEARL_THROW, SoundCategory.NEUTRAL, 0.5F, 0.4F / (ItemEnderPearl.k.nextFloat() * 0.4F + 0.8F));
entityhuman.getCooldownTracker().a(this, 20);
- if (!world.isClientSide) {
- EntityEnderPearl entityenderpearl = new EntityEnderPearl(world, entityhuman);
@@ -31,5 +31,5 @@
- }
+ // CraftBukkit end
- entityhuman.b(StatisticList.b((Item) this));
+ entityhuman.b(StatisticList.ITEM_USED.b(this));
return new InteractionResultWrapper(EnumInteractionResult.SUCCESS, itemstack);
diff --git a/nms-patches/ItemFireball.patch b/nms-patches/ItemFireball.patch
index aa84efa1..fdab04fa 100644
--- a/nms-patches/ItemFireball.patch
+++ b/nms-patches/ItemFireball.patch
@@ -1,17 +1,17 @@
--- a/net/minecraft/server/ItemFireball.java
+++ b/net/minecraft/server/ItemFireball.java
-@@ -17,6 +17,14 @@
- return EnumInteractionResult.FAIL;
- } else {
- if (world.getType(blockposition).getMaterial() == Material.AIR) {
-+ // 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.subtract(1);
-+ }
-+ return EnumInteractionResult.PASS;
+@@ -15,6 +15,14 @@
+ BlockPosition blockposition = itemactioncontext.getClickPosition().shift(itemactioncontext.getClickedFace());
+
+ if (world.getType(blockposition).isAir()) {
++ // CraftBukkit start - fire BlockIgniteEvent
++ if (org.bukkit.craftbukkit.event.CraftEventFactory.callBlockIgniteEvent(world, blockposition, org.bukkit.event.block.BlockIgniteEvent.IgniteCause.FIREBALL, itemactioncontext.getEntity()).isCancelled()) {
++ if (!itemactioncontext.getEntity().abilities.canInstantlyBuild) {
++ itemactioncontext.getItemStack().subtract(1);
+ }
-+ // CraftBukkit end
- world.a((EntityHuman) null, blockposition, SoundEffects.bD, SoundCategory.BLOCKS, 1.0F, (ItemFireball.j.nextFloat() - ItemFireball.j.nextFloat()) * 0.2F + 1.0F);
- world.setTypeUpdate(blockposition, Blocks.FIRE.getBlockData());
- }
++ return EnumInteractionResult.PASS;
++ }
++ // CraftBukkit end
+ world.a((EntityHuman) null, blockposition, SoundEffects.ITEM_FIRECHARGE_USE, SoundCategory.BLOCKS, 1.0F, (ItemFireball.k.nextFloat() - ItemFireball.k.nextFloat()) * 0.2F + 1.0F);
+ world.setTypeUpdate(blockposition, ((BlockFire) Blocks.FIRE).a((IBlockAccess) world, blockposition));
+ }
diff --git a/nms-patches/ItemFishingRod.patch b/nms-patches/ItemFishingRod.patch
index ca728962..f9fd1bdc 100644
--- a/nms-patches/ItemFishingRod.patch
+++ b/nms-patches/ItemFishingRod.patch
@@ -1,35 +1,50 @@
--- a/net/minecraft/server/ItemFishingRod.java
+++ b/net/minecraft/server/ItemFishingRod.java
-@@ -1,5 +1,7 @@
+@@ -1,9 +1,13 @@
package net.minecraft.server;
+import org.bukkit.event.player.PlayerFishEvent; // CraftBukkit
+
public class ItemFishingRod extends Item {
- public ItemFishingRod() {
-@@ -20,7 +22,7 @@
+ public ItemFishingRod(Item.Info item_info) {
+ super(item_info);
++ // CraftBukkit start - obfuscator went a little crazy
++ /*
+ this.a(new MinecraftKey("cast"), (itemstack, world, entityliving) -> {
+ if (entityliving == null) {
+ return 0.0F;
+@@ -18,6 +22,8 @@
+ return (flag || flag1) && entityliving instanceof EntityHuman && ((EntityHuman) entityliving).hookedFish != null ? 1.0F : 0.0F;
+ }
+ });
++ */
++ // CraftBukkit end
+ }
+
+ public InteractionResultWrapper<ItemStack> a(World world, EntityHuman entityhuman, EnumHand enumhand) {
+@@ -30,7 +36,7 @@
entityhuman.a(enumhand);
- world.a((EntityHuman) null, entityhuman.locX, entityhuman.locY, entityhuman.locZ, SoundEffects.J, SoundCategory.NEUTRAL, 1.0F, 0.4F / (ItemFishingRod.j.nextFloat() * 0.4F + 0.8F));
+ world.a((EntityHuman) null, entityhuman.locX, entityhuman.locY, entityhuman.locZ, SoundEffects.ENTITY_FISHING_BOBBER_RETRIEVE, SoundCategory.NEUTRAL, 1.0F, 0.4F / (ItemFishingRod.k.nextFloat() * 0.4F + 0.8F));
} else {
-- world.a((EntityHuman) null, entityhuman.locX, entityhuman.locY, entityhuman.locZ, SoundEffects.L, SoundCategory.NEUTRAL, 0.5F, 0.4F / (ItemFishingRod.j.nextFloat() * 0.4F + 0.8F));
-+ // world.a((EntityHuman) null, entityhuman.locX, entityhuman.locY, entityhuman.locZ, SoundEffects.L, SoundCategory.NEUTRAL, 0.5F, 0.4F / (ItemFishingRod.j.nextFloat() * 0.4F + 0.8F)); // CraftBukkit - moved down
+- world.a((EntityHuman) null, entityhuman.locX, entityhuman.locY, entityhuman.locZ, SoundEffects.ENTITY_FISHING_BOBBER_THROW, SoundCategory.NEUTRAL, 0.5F, 0.4F / (ItemFishingRod.k.nextFloat() * 0.4F + 0.8F));
++ // world.a((EntityHuman) null, entityhuman.locX, entityhuman.locY, entityhuman.locZ, SoundEffects.ENTITY_FISHING_BOBBER_THROW, SoundCategory.NEUTRAL, 0.5F, 0.4F / (ItemFishingRod.k.nextFloat() * 0.4F + 0.8F));
if (!world.isClientSide) {
EntityFishingHook entityfishinghook = new EntityFishingHook(world, entityhuman);
int j = EnchantmentManager.c(itemstack);
-@@ -35,6 +37,17 @@
- entityfishinghook.c(k);
+@@ -45,6 +51,17 @@
+ entityfishinghook.b(k);
}
+ // CraftBukkit start
-+ PlayerFishEvent playerFishEvent = new PlayerFishEvent((org.bukkit.entity.Player) entityhuman.getBukkitEntity(), null, (org.bukkit.entity.Fish) entityfishinghook.getBukkitEntity(), PlayerFishEvent.State.FISHING);
++ PlayerFishEvent playerFishEvent = new PlayerFishEvent((org.bukkit.entity.Player) entityhuman.getBukkitEntity(), null, (org.bukkit.entity.FishHook) entityfishinghook.getBukkitEntity(), PlayerFishEvent.State.FISHING);
+ world.getServer().getPluginManager().callEvent(playerFishEvent);
+
+ if (playerFishEvent.isCancelled()) {
+ entityhuman.hookedFish = null;
+ return new InteractionResultWrapper(EnumInteractionResult.PASS, itemstack);
+ }
-+ world.a((EntityHuman) null, entityhuman.locX, entityhuman.locY, entityhuman.locZ, SoundEffects.L, SoundCategory.NEUTRAL, 0.5F, 0.4F / (ItemFishingRod.j.nextFloat() * 0.4F + 0.8F));
++ world.a((EntityHuman) null, entityhuman.locX, entityhuman.locY, entityhuman.locZ, SoundEffects.ENTITY_FISHING_BOBBER_THROW, SoundCategory.NEUTRAL, 0.5F, 0.4F / (ItemFishingRod.k.nextFloat() * 0.4F + 0.8F));
+ // CraftBukkit end
+
world.addEntity(entityfishinghook);
diff --git a/nms-patches/ItemFlintAndSteel.patch b/nms-patches/ItemFlintAndSteel.patch
index 7442ab6f..81a7ef48 100644
--- a/nms-patches/ItemFlintAndSteel.patch
+++ b/nms-patches/ItemFlintAndSteel.patch
@@ -1,15 +1,15 @@
--- a/net/minecraft/server/ItemFlintAndSteel.java
+++ b/net/minecraft/server/ItemFlintAndSteel.java
-@@ -16,6 +16,12 @@
- return EnumInteractionResult.FAIL;
- } else {
- if (world.getType(blockposition).getMaterial() == Material.AIR) {
-+ // CraftBukkit start - Store the clicked block
-+ if (org.bukkit.craftbukkit.event.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 EnumInteractionResult.PASS;
-+ }
-+ // CraftBukkit end
- world.a(entityhuman, blockposition, SoundEffects.bO, SoundCategory.BLOCKS, 1.0F, ItemFlintAndSteel.j.nextFloat() * 0.4F + 0.8F);
- world.setTypeAndData(blockposition, Blocks.FIRE.getBlockData(), 11);
- }
+@@ -14,6 +14,12 @@
+ BlockPosition blockposition = itemactioncontext.getClickPosition().shift(itemactioncontext.getClickedFace());
+
+ if (a((GeneratorAccess) world, blockposition)) {
++ // CraftBukkit start - Store the clicked block
++ if (org.bukkit.craftbukkit.event.CraftEventFactory.callBlockIgniteEvent(world, blockposition, org.bukkit.event.block.BlockIgniteEvent.IgniteCause.FLINT_AND_STEEL, entityhuman).isCancelled()) {
++ itemactioncontext.getItemStack().damage(1, entityhuman);
++ return EnumInteractionResult.PASS;
++ }
++ // CraftBukkit end
+ world.a(entityhuman, blockposition, SoundEffects.ITEM_FLINTANDSTEEL_USE, SoundCategory.BLOCKS, 1.0F, ItemFlintAndSteel.k.nextFloat() * 0.4F + 0.8F);
+ IBlockData iblockdata = ((BlockFire) Blocks.FIRE).a((IBlockAccess) world, blockposition);
+
diff --git a/nms-patches/ItemHanging.patch b/nms-patches/ItemHanging.patch
index f6826f00..2991d715 100644
--- a/nms-patches/ItemHanging.patch
+++ b/nms-patches/ItemHanging.patch
@@ -11,12 +11,12 @@
public class ItemHanging extends Item {
-@@ -20,6 +24,18 @@
+@@ -25,6 +29,18 @@
if (entityhanging != null && entityhanging.survives()) {
if (!world.isClientSide) {
+ // CraftBukkit start - fire HangingPlaceEvent
-+ Player who = (entityhuman == null) ? null : (Player) entityhuman.getBukkitEntity();
++ Player who = (itemactioncontext.getEntity() == null) ? null : (Player) itemactioncontext.getEntity().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);
+
@@ -27,6 +27,6 @@
+ return EnumInteractionResult.FAIL;
+ }
+ // CraftBukkit end
- entityhanging.p();
+ entityhanging.m();
world.addEntity(entityhanging);
}
diff --git a/nms-patches/ItemLeash.patch b/nms-patches/ItemLeash.patch
index d51c6786..6a695213 100644
--- a/nms-patches/ItemLeash.patch
+++ b/nms-patches/ItemLeash.patch
@@ -8,8 +8,8 @@
+
public class ItemLeash extends Item {
- public ItemLeash() {
-@@ -39,7 +41,23 @@
+ public ItemLeash(Item.Info item_info) {
+@@ -43,7 +45,23 @@
if (entityinsentient.isLeashed() && entityinsentient.getLeashHolder() == entityhuman) {
if (entityleash == null) {
entityleash = EntityLeash.a(world, blockposition);
diff --git a/nms-patches/ItemMinecart.patch b/nms-patches/ItemMinecart.patch
index 60c5b2e5..ef20cdf9 100644
--- a/nms-patches/ItemMinecart.patch
+++ b/nms-patches/ItemMinecart.patch
@@ -38,7 +38,7 @@
+ ItemStack eventStack = CraftItemStack.asNMSCopy(event.getItem());
+ IDispenseBehavior idispensebehavior = (IDispenseBehavior) BlockDispenser.REGISTRY.get(eventStack.getItem());
+ if (idispensebehavior != IDispenseBehavior.NONE && idispensebehavior != this) {
-+ idispensebehavior.a(isourceblock, eventStack);
++ idispensebehavior.dispense(isourceblock, eventStack);
+ return itemstack;
+ }
+ }
@@ -58,7 +58,7 @@
return itemstack;
}
-@@ -83,7 +117,7 @@
+@@ -84,7 +118,7 @@
entityminecartabstract.setCustomName(itemstack.getName());
}
diff --git a/nms-patches/ItemMonsterEgg.patch b/nms-patches/ItemMonsterEgg.patch
deleted file mode 100644
index 2069ea11..00000000
--- a/nms-patches/ItemMonsterEgg.patch
+++ /dev/null
@@ -1,30 +0,0 @@
---- a/net/minecraft/server/ItemMonsterEgg.java
-+++ b/net/minecraft/server/ItemMonsterEgg.java
-@@ -152,6 +152,11 @@
-
- @Nullable
- public static Entity a(World world, @Nullable MinecraftKey minecraftkey, double d0, double d1, double d2) {
-+ return spawnCreature(world, minecraftkey, d0, d1, d2, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.SPAWNER_EGG);
-+ }
-+
-+ @Nullable
-+ public static Entity spawnCreature(World world, @Nullable MinecraftKey minecraftkey, double d0, double d1, double d2, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason spawnReason) {
- if (minecraftkey != null && EntityTypes.eggInfo.containsKey(minecraftkey)) {
- Entity entity = null;
-
-@@ -164,8 +169,13 @@
- entityinsentient.aP = entityinsentient.yaw;
- entityinsentient.aN = entityinsentient.yaw;
- entityinsentient.prepare(world.D(new BlockPosition(entityinsentient)), (GroupDataEntity) null);
-- world.addEntity(entity);
-- entityinsentient.D();
-+ // CraftBukkit start - don't return an entity when CreatureSpawnEvent is canceled
-+ if (!world.addEntity(entity, spawnReason)) {
-+ entity = null;
-+ } else {
-+ entityinsentient.D();
-+ }
-+ // CraftBukkit end
- }
- }
-
diff --git a/nms-patches/ItemRecord.patch b/nms-patches/ItemRecord.patch
index 0dff1125..ab2b7647 100644
--- a/nms-patches/ItemRecord.patch
+++ b/nms-patches/ItemRecord.patch
@@ -1,10 +1,10 @@
--- a/net/minecraft/server/ItemRecord.java
+++ b/net/minecraft/server/ItemRecord.java
-@@ -22,6 +22,7 @@
+@@ -34,6 +34,7 @@
+ ItemStack itemstack = itemactioncontext.getItemStack();
- if (iblockdata.getBlock() == Blocks.JUKEBOX && !((Boolean) iblockdata.get(BlockJukeBox.HAS_RECORD)).booleanValue()) {
if (!world.isClientSide) {
+ if (true) return EnumInteractionResult.SUCCESS; // CraftBukkit - handled in ItemStack
- ItemStack itemstack = entityhuman.b(enumhand);
-
- ((BlockJukeBox) Blocks.JUKEBOX).a(world, blockposition, iblockdata, itemstack);
+ ((BlockJukeBox) Blocks.JUKEBOX).a((GeneratorAccess) world, blockposition, iblockdata, itemstack);
+ world.a((EntityHuman) null, 1010, blockposition, Item.getId(this));
+ itemstack.subtract(1);
diff --git a/nms-patches/ItemRedstone.patch b/nms-patches/ItemRedstone.patch
deleted file mode 100644
index 62cf2e35..00000000
--- a/nms-patches/ItemRedstone.patch
+++ /dev/null
@@ -1,11 +0,0 @@
---- a/net/minecraft/server/ItemRedstone.java
-+++ b/net/minecraft/server/ItemRedstone.java
-@@ -11,7 +11,7 @@
- BlockPosition blockposition1 = flag ? blockposition : blockposition.shift(enumdirection);
- ItemStack itemstack = entityhuman.b(enumhand);
-
-- if (entityhuman.a(blockposition1, enumdirection, itemstack) && world.a(world.getType(blockposition1).getBlock(), blockposition1, false, enumdirection, (Entity) null) && Blocks.REDSTONE_WIRE.canPlace(world, blockposition1)) {
-+ if (!itemstack.isEmpty() && entityhuman.a(blockposition1, enumdirection, itemstack) && world.a(world.getType(blockposition1).getBlock(), blockposition1, false, enumdirection, (Entity) null) && Blocks.REDSTONE_WIRE.canPlace(world, blockposition1)) { // CraftBukkit
- world.setTypeUpdate(blockposition1, Blocks.REDSTONE_WIRE.getBlockData());
- if (entityhuman instanceof EntityPlayer) {
- CriterionTriggers.x.a((EntityPlayer) entityhuman, blockposition1, itemstack);
diff --git a/nms-patches/ItemReed.patch b/nms-patches/ItemReed.patch
deleted file mode 100644
index c3c66584..00000000
--- a/nms-patches/ItemReed.patch
+++ /dev/null
@@ -1,11 +0,0 @@
---- a/net/minecraft/server/ItemReed.java
-+++ b/net/minecraft/server/ItemReed.java
-@@ -2,7 +2,7 @@
-
- public class ItemReed extends Item {
-
-- private final Block a;
-+ public final Block a; // PAIL: private->public
-
- public ItemReed(Block block) {
- this.a = block;
diff --git a/nms-patches/ItemSkull.patch b/nms-patches/ItemSkullPlayer.patch
index e0f0e443..0679f503 100644
--- a/nms-patches/ItemSkull.patch
+++ b/nms-patches/ItemSkullPlayer.patch
@@ -1,6 +1,6 @@
---- a/net/minecraft/server/ItemSkull.java
-+++ b/net/minecraft/server/ItemSkull.java
-@@ -133,6 +133,15 @@
+--- a/net/minecraft/server/ItemSkullPlayer.java
++++ b/net/minecraft/server/ItemSkullPlayer.java
+@@ -42,6 +42,15 @@
nbttagcompound.set("SkullOwner", GameProfileSerializer.serialize(new NBTTagCompound(), gameprofile));
return true;
} else {
diff --git a/nms-patches/ItemSnowball.patch b/nms-patches/ItemSnowball.patch
index 77d48395..498fa712 100644
--- a/nms-patches/ItemSnowball.patch
+++ b/nms-patches/ItemSnowball.patch
@@ -1,6 +1,6 @@
--- a/net/minecraft/server/ItemSnowball.java
+++ b/net/minecraft/server/ItemSnowball.java
-@@ -10,17 +10,29 @@
+@@ -9,17 +9,29 @@
public InteractionResultWrapper<ItemStack> a(World world, EntityHuman entityhuman, EnumHand enumhand) {
ItemStack itemstack = entityhuman.b(enumhand);
@@ -10,7 +10,7 @@
itemstack.subtract(1);
}
- world.a((EntityHuman) null, entityhuman.locX, entityhuman.locY, entityhuman.locZ, SoundEffects.hp, SoundCategory.NEUTRAL, 0.5F, 0.4F / (ItemSnowball.j.nextFloat() * 0.4F + 0.8F));
+ world.a((EntityHuman) null, entityhuman.locX, entityhuman.locY, entityhuman.locZ, SoundEffects.ENTITY_SNOWBALL_THROW, SoundCategory.NEUTRAL, 0.5F, 0.4F / (ItemSnowball.k.nextFloat() * 0.4F + 0.8F));
+ */
if (!world.isClientSide) {
EntitySnowball entitysnowball = new EntitySnowball(world, entityhuman);
@@ -22,12 +22,12 @@
+ itemstack.subtract(1);
+ }
+
-+ world.a((EntityHuman) null, entityhuman.locX, entityhuman.locY, entityhuman.locZ, SoundEffects.hp, SoundCategory.NEUTRAL, 0.5F, 0.4F / (ItemSnowball.j.nextFloat() * 0.4F + 0.8F));
++ world.a((EntityHuman) null, entityhuman.locX, entityhuman.locY, entityhuman.locZ, SoundEffects.ENTITY_SNOWBALL_THROW, SoundCategory.NEUTRAL, 0.5F, 0.4F / (ItemSnowball.k.nextFloat() * 0.4F + 0.8F));
+ } else if (entityhuman instanceof EntityPlayer) {
+ ((EntityPlayer) entityhuman).getBukkitEntity().updateInventory();
+ }
}
+ // CraftBukkit end
- entityhuman.b(StatisticList.b((Item) this));
+ entityhuman.b(StatisticList.ITEM_USED.b(this));
return new InteractionResultWrapper(EnumInteractionResult.SUCCESS, itemstack);
diff --git a/nms-patches/ItemStack.patch b/nms-patches/ItemStack.patch
index 0e6dbd50..672002cd 100644
--- a/nms-patches/ItemStack.patch
+++ b/nms-patches/ItemStack.patch
@@ -1,10 +1,11 @@
--- a/net/minecraft/server/ItemStack.java
+++ b/net/minecraft/server/ItemStack.java
-@@ -6,6 +6,19 @@
- import java.util.Random;
- import javax.annotation.Nullable;
+@@ -16,6 +16,20 @@
+ import org.apache.logging.log4j.LogManager;
+ import org.apache.logging.log4j.Logger;
+// CraftBukkit start
++import com.mojang.datafixers.Dynamic;
+import java.util.List;
+import java.util.Map;
+
@@ -19,291 +20,211 @@
+
public final class ItemStack {
- public static final ItemStack a = new ItemStack((Item) null);
-@@ -42,32 +55,74 @@
- this(item, i, 0);
- }
-
-+ // CraftBukkit start
- public ItemStack(Item item, int i, int j) {
-+ this(item, i, j, true);
-+ }
-+
-+ public ItemStack(Item item, int i, int j, boolean convert) {
-+ // CraftBukkit end
- this.item = item;
- this.damage = j;
- this.count = i;
-+ // CraftBukkit start - Pass to setData to do filtering
-+ if (MinecraftServer.getServer() != null) {
-+ this.setData(j);
-+ }
-+ if (convert) {
-+ this.convertStack();
-+ }
-+ // CraftBukkit end
- if (this.damage < 0) {
-- this.damage = 0;
-+ // this.damage = 0; // CraftBukkit - remove this.
- }
-
- this.F();
+ private static final Logger c = LogManager.getLogger();
+@@ -50,25 +64,43 @@
+ this.E();
}
+ // Called to run this stack through the data converter to handle older storage methods and serialized items
+ public void convertStack() {
+ if (MinecraftServer.getServer() != null) {
-+ // Don't convert beds - both the old and new data values are valid
-+ // Conversion would make getting white beds (data value 0) impossible
-+ if (this.item == Items.BED) {
-+ return;
-+ }
-+
+ NBTTagCompound savedStack = new NBTTagCompound();
+ this.save(savedStack);
-+ MinecraftServer.getServer().dataConverterManager.a(DataConverterTypes.ITEM_INSTANCE, savedStack); // PAIL: convert
++ MinecraftServer.getServer().dataConverterManager.update(DataConverterTypes.ITEM_STACK, new Dynamic(DynamicOpsNBT.a, savedStack), -1, CraftMagicNumbers.DATA_VERSION);
+ this.load(savedStack);
+ }
+ }
+
- private void F() {
-+ if (this.g && this == ItemStack.a) throw new AssertionError("TRAP"); // CraftBukkit
- this.g = this.isEmpty();
+ private void E() {
++ if (this.h && this == ItemStack.a) throw new AssertionError("TRAP"); // CraftBukkit
+ this.h = false;
+ this.h = this.isEmpty();
}
-- public ItemStack(NBTTagCompound nbttagcompound) {
+- private ItemStack(NBTTagCompound nbttagcompound) {
+ // CraftBukkit - break into own method
-+ public void load(NBTTagCompound nbttagcompound) {
- this.item = Item.b(nbttagcompound.getString("id"));
++ private void load(NBTTagCompound nbttagcompound) {
+ Item item = (Item) Item.REGISTRY.get(new MinecraftKey(nbttagcompound.getString("id")));
+
+ this.item = item == null ? Items.AIR : item;
this.count = nbttagcompound.getByte("Count");
-- this.damage = Math.max(0, nbttagcompound.getShort("Damage"));
-+ // CraftBukkit start - Route through setData for filtering
-+ // this.damage = Math.max(0, nbttagcompound.getShort("Damage"));
-+ this.setData(nbttagcompound.getShort("Damage"));
-+ // CraftBukkit end
-+
if (nbttagcompound.hasKeyOfType("tag", 10)) {
- this.tag = nbttagcompound.getCompound("tag");
+- this.getItem().a(nbttagcompound);
+ // CraftBukkit start - 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(nbttagcompound);
-+ this.item.a(this.tag);
-+ // CraftBukkit end
- }
++ this.getItem().a(this.tag);
++ // CraftBukkit end
+ }
+
+ if (this.getItem().usesDurability()) {
+ this.setDamage(this.getDamage());
}
+ }
-+ public ItemStack(NBTTagCompound nbttagcompound) {
++ private ItemStack(NBTTagCompound nbttagcompound) {
+ this.load(nbttagcompound);
+ // CraftBukkit end
- this.F();
+ this.E();
}
-@@ -94,11 +149,138 @@
+@@ -98,7 +130,7 @@
+ return this.h ? Items.AIR : this.item;
}
- public EnumInteractionResult placeItem(EntityHuman entityhuman, World world, BlockPosition blockposition, EnumHand enumhand, EnumDirection enumdirection, float f, float f1, float f2) {
-+ // CraftBukkit start - handle all block place event logic here
-+ int oldData = this.getData();
-+ int oldCount = this.getCount();
-+
-+ 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;
+- public EnumInteractionResult placeItem(ItemActionContext itemactioncontext) {
++ public EnumInteractionResult placeItem(ItemActionContext itemactioncontext, EnumHand enumhand) { // CraftBukkit - add hand
+ EntityHuman entityhuman = itemactioncontext.getEntity();
+ BlockPosition blockposition = itemactioncontext.getClickPosition();
+ ShapeDetectorBlock shapedetectorblock = new ShapeDetectorBlock(itemactioncontext.getWorld(), blockposition, false);
+@@ -106,12 +138,124 @@
+ if (entityhuman != null && !entityhuman.abilities.mayBuild && !this.b(itemactioncontext.getWorld().E(), shapedetectorblock)) {
+ return EnumInteractionResult.PASS;
+ } else {
++ // CraftBukkit start - handle all block place event logic here
++ int oldCount = this.getCount();
++ World world = itemactioncontext.getWorld();
++
++ if (!(this.getItem() instanceof ItemBucket)) { // if not bucket
++ world.captureBlockStates = true;
++ // special case bonemeal
++ if (this.getItem() == Items.BONE_MEAL) {
++ Block block = world.getType(blockposition).getBlock();
++ if (block instanceof BlockSapling || block instanceof BlockMushroom) {
++ world.captureTreeGeneration = true;
++ }
+ }
+ }
-+ }
- EnumInteractionResult enuminteractionresult = this.getItem().a(entityhuman, world, blockposition, enumhand, enumdirection, f, f1, f2);
-+ int newData = this.getData();
-+ int newCount = this.getCount();
-+ this.setCount(oldCount);
-+ this.setData(oldData);
-+ world.captureBlockStates = false;
-+ if (enuminteractionresult == EnumInteractionResult.SUCCESS && 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) {
-+ boolean isBonemeal = getItem() == Items.DYE && oldData == 15;
-+ event = new StructureGrowEvent(location, treeType, isBonemeal, (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.getCount() == oldCount && this.getData() == oldData) {
-+ this.setData(newData);
-+ this.setCount(newCount);
+ Item item = this.getItem();
+ EnumInteractionResult enuminteractionresult = item.a(itemactioncontext);
++ int newCount = this.getCount();
++ this.setCount(oldCount);
++ world.captureBlockStates = false;
++ if (enuminteractionresult == EnumInteractionResult.SUCCESS && 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) {
++ boolean isBonemeal = getItem() == Items.BONE_MEAL;
++ event = new StructureGrowEvent(location, treeType, isBonemeal, (Player) entityhuman.getBukkitEntity(), blocks);
++ org.bukkit.Bukkit.getPluginManager().callEvent(event);
+ }
-+ for (BlockState blockstate : blocks) {
-+ blockstate.update(true);
++ if (event == null || !event.isCancelled()) {
++ // Change the stack to its new contents if it hasn't been tampered with.
++ if (this.getCount() == oldCount) {
++ this.setCount(newCount);
++ }
++ for (BlockState blockstate : blocks) {
++ blockstate.update(true);
++ }
+ }
-+ }
+
-+ return enuminteractionresult;
-+ }
-+ world.captureTreeGeneration = false;
-
- if (enuminteractionresult == EnumInteractionResult.SUCCESS) {
-- entityhuman.b(StatisticList.b(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, enumhand, blocks, blockposition.getX(), blockposition.getY(), blockposition.getZ());
-+ } else if (blocks.size() == 1) {
-+ placeEvent = org.bukkit.craftbukkit.event.CraftEventFactory.callBlockPlaceEvent(world, entityhuman, enumhand, blocks.get(0), blockposition.getX(), blockposition.getY(), blockposition.getZ());
++ return enuminteractionresult;
+ }
-+
-+ if (placeEvent != null && (placeEvent.isCancelled() || !placeEvent.canBuild())) {
-+ enuminteractionresult = EnumInteractionResult.FAIL; // cancel placement
-+ // PAIL: Remove this when MC-99075 fixed
-+ placeEvent.getPlayer().updateInventory();
-+ // 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.getCount() == oldCount && this.getData() == oldData) {
-+ this.setData(newData);
-+ this.setCount(newCount);
-+ }
-+
-+ for (Map.Entry<BlockPosition, TileEntity> e : world.capturedTileEntities.entrySet()) {
-+ world.setTileEntity(e.getKey(), e.getValue());
++ world.captureTreeGeneration = false;
+
+ if (entityhuman != null && enuminteractionresult == EnumInteractionResult.SUCCESS) {
+- entityhuman.b(StatisticList.ITEM_USED.b(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, enumhand, blocks, blockposition.getX(), blockposition.getY(), blockposition.getZ());
++ } else if (blocks.size() == 1) {
++ placeEvent = org.bukkit.craftbukkit.event.CraftEventFactory.callBlockPlaceEvent(world, entityhuman, enumhand, blocks.get(0), blockposition.getX(), blockposition.getY(), blockposition.getZ());
+ }
+
-+ 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 (placeEvent != null && (placeEvent.isCancelled() || !placeEvent.canBuild())) {
++ enuminteractionresult = EnumInteractionResult.FAIL; // cancel placement
++ // PAIL: Remove this when MC-99075 fixed
++ placeEvent.getPlayer().updateInventory();
++ // 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.getCount() == oldCount) {
++ this.setCount(newCount);
++ }
+
-+ if (!(block.getBlock() instanceof BlockTileEntity)) { // Containers get placed automatically
-+ block.getBlock().onPlace(world, newblockposition, block);
++ for (Map.Entry<BlockPosition, TileEntity> e : world.capturedTileEntities.entrySet()) {
++ world.setTileEntity(e.getKey(), e.getValue());
+ }
+
-+ world.notifyAndUpdatePhysics(newblockposition, null, oldBlock.getBlockData(), block, updateFlag); // send null chunk as chunk.k() returns false by this point
-+ }
++ for (BlockState blockstate : blocks) {
++ int x = blockstate.getX();
++ int y = blockstate.getY();
++ int z = blockstate.getZ();
++ int updateFlag = ((CraftBlockState) blockstate).getFlag();
++ IBlockData oldBlock = ((CraftBlockState) blockstate).getHandle();
++ BlockPosition newblockposition = new BlockPosition(x, y, z);
++ IBlockData block = world.getType(newblockposition);
++
++ if (!(block.getBlock() instanceof BlockTileEntity)) { // Containers get placed automatically
++ block.getBlock().onPlace(block, world, newblockposition, oldBlock);
++ }
+
-+ // Special case juke boxes as they update their tile entity. Copied from ItemRecord.
-+ // PAIL: checkme on updates.
-+ if (this.item instanceof ItemRecord) {
-+ ((BlockJukeBox) Blocks.JUKEBOX).a(world, blockposition, world.getType(blockposition), this);
-+ world.a((EntityHuman) null, 1010, blockposition, Item.getId(this.item));
-+ this.subtract(1);
-+ entityhuman.b(StatisticList.Z);
-+ }
++ world.notifyAndUpdatePhysics(newblockposition, null, oldBlock, block, world.getType(newblockposition), updateFlag); // send null chunk as chunk.k() returns false by this point
++ }
+
-+ if (this.item == Items.SKULL) { // Special case skulls to allow wither spawns to be cancelled
-+ BlockPosition bp = blockposition;
-+ if (!world.getType(blockposition).getBlock().a(world, blockposition)) {
-+ if (!world.getType(blockposition).getMaterial().isBuildable()) {
-+ bp = null;
-+ } else {
-+ bp = bp.shift(enumdirection);
-+ }
++ // Special case juke boxes as they update their tile entity. Copied from ItemRecord.
++ // PAIL: checkme on updates.
++ if (this.item instanceof ItemRecord) {
++ ((BlockJukeBox) Blocks.JUKEBOX).a(world, blockposition, world.getType(blockposition), this);
++ world.a((EntityHuman) null, 1010, blockposition, Item.getId(this.item));
++ this.subtract(1);
++ entityhuman.a(StatisticList.PLAY_RECORD);
+ }
-+ if (bp != null) {
-+ TileEntity te = world.getTileEntity(bp);
++
++ if (this.item == Items.WITHER_SKELETON_SKULL) { // Special case skulls to allow wither spawns to be cancelled
++ TileEntity te = world.getTileEntity(blockposition);
+ if (te instanceof TileEntitySkull) {
-+ Blocks.SKULL.a(world, bp, (TileEntitySkull) te);
++ BlockWitherSkull.a(world, blockposition, (TileEntitySkull) te);
+ }
+ }
-+ }
+
-+ // SPIGOT-1288 - play sound stripped from ItemBlock
-+ if (this.item instanceof ItemBlock) {
-+ SoundEffectType soundeffecttype = ((ItemBlock) this.item).getBlock().getStepSound();
-+ world.a(entityhuman, blockposition, soundeffecttype.e(), SoundCategory.BLOCKS, (soundeffecttype.a() + 1.0F) / 2.0F, soundeffecttype.b() * 0.8F);
-+ }
++ // SPIGOT-1288 - play sound stripped from ItemBlock
++ if (this.item instanceof ItemBlock) {
++ SoundEffectType soundeffecttype = ((ItemBlock) this.item).getBlock().getStepSound();
++ world.a(entityhuman, blockposition, soundeffecttype.e(), SoundCategory.BLOCKS, (soundeffecttype.a() + 1.0F) / 2.0F, soundeffecttype.b() * 0.8F);
++ }
+
-+ entityhuman.b(StatisticList.b(this.item));
-+ }
- }
-+ world.capturedTileEntities.clear();
-+ world.capturedBlockStates.clear();
-+ // CraftBukkit end
++ entityhuman.b(StatisticList.ITEM_USED.b(item));
++ }
+ }
++ world.capturedTileEntities.clear();
++ world.capturedBlockStates.clear();
++ // CraftBukkit end
- return enuminteractionresult;
- }
-@@ -122,7 +304,7 @@
+ return enuminteractionresult;
+ }
+@@ -135,7 +279,7 @@
+ nbttagcompound.setString("id", minecraftkey == null ? "minecraft:air" : minecraftkey.toString());
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;
-@@ -157,11 +339,30 @@
- }
-
- 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) {
-- this.damage = 0;
-+ // this.damage = 0; // CraftBukkit - remove this.
- }
--
- }
-
- public int k() {
-@@ -202,6 +403,11 @@
- if (this.f()) {
+@@ -213,6 +357,11 @@
if (this.isDamaged(i, entityliving.getRandom(), entityliving instanceof EntityPlayer ? (EntityPlayer) entityliving : null)) {
- entityliving.b(this);
+ entityliving.c(this);
+ Item item = this.getItem();
+ // CraftBukkit start - Check for item breaking
+ if (this.count == 1 && entityliving instanceof EntityHuman) {
+ org.bukkit.craftbukkit.event.CraftEventFactory.callPlayerItemBreakEvent((EntityHuman) entityliving, this);
+ }
+ // CraftBukkit end
+
this.subtract(1);
if (entityliving instanceof EntityHuman) {
- EntityHuman entityhuman = (EntityHuman) entityliving;
-@@ -243,7 +449,7 @@
- }
-
- public ItemStack cloneItemStack() {
-- ItemStack itemstack = new ItemStack(this.item, this.count, this.damage);
-+ ItemStack itemstack = new ItemStack(this.item, this.count, this.damage, false); // CraftBukkit
-
- itemstack.d(this.D());
- if (this.tag != null) {
-@@ -464,6 +670,14 @@
+@@ -480,6 +629,14 @@
}
public void setRepairCost(int i) {
@@ -315,19 +236,20 @@
+ return;
+ }
+ // CraftBukkit end
- if (!this.hasTag()) {
- this.tag = new NBTTagCompound();
- }
-@@ -513,6 +727,12 @@
- nbttaglist.add(nbttagcompound);
+ this.getOrCreateTag().setInt("RepairCost", i);
+ }
+
+@@ -522,6 +679,13 @@
+ nbttaglist.add((NBTBase) nbttagcompound);
}
++ // CraftBukkit start
+ @Deprecated
+ public void setItem(Item item) {
+ this.item = item;
-+ this.setData(this.getData()); // CraftBukkit - Set data again to ensure it is filtered properly
+ }
++ // CraftBukkit end
+
- public IChatBaseComponent C() {
- ChatComponentText chatcomponenttext = new ChatComponentText(this.getName());
+ public IChatBaseComponent A() {
+ IChatBaseComponent ichatbasecomponent = (new ChatComponentText("")).addSibling(this.getName());
diff --git a/nms-patches/ItemWaterLily.patch b/nms-patches/ItemWaterLily.patch
index 65b3ab61..0e9db92f 100644
--- a/nms-patches/ItemWaterLily.patch
+++ b/nms-patches/ItemWaterLily.patch
@@ -1,12 +1,12 @@
--- a/net/minecraft/server/ItemWaterLily.java
+++ b/net/minecraft/server/ItemWaterLily.java
-@@ -24,7 +24,15 @@
- IBlockData iblockdata = world.getType(blockposition);
+@@ -30,7 +30,15 @@
+ Fluid fluid = world.b(blockposition);
- if (iblockdata.getMaterial() == Material.WATER && ((Integer) iblockdata.get(BlockFluids.LEVEL)).intValue() == 0 && world.isEmpty(blockposition1)) {
+ if ((fluid.c() == FluidTypes.c || material == Material.ICE) && 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.setTypeAndData(blockposition1, Blocks.WATERLILY.getBlockData(), 11);
++ org.bukkit.block.BlockState blockstate = org.bukkit.craftbukkit.block.CraftBlockState.getBlockState(world, blockposition1);
+ world.setTypeAndData(blockposition1, Blocks.LILY_PAD.getBlockData(), 11);
+ org.bukkit.event.block.BlockPlaceEvent placeEvent = org.bukkit.craftbukkit.event.CraftEventFactory.callBlockPlaceEvent(world, entityhuman, enumhand, blockstate, blockposition.getX(), blockposition.getY(), blockposition.getZ());
+ if (placeEvent != null && (placeEvent.isCancelled() || !placeEvent.canBuild())) {
+ blockstate.update(true, false);
@@ -14,5 +14,5 @@
+ }
+ // CraftBukkit end
if (entityhuman instanceof EntityPlayer) {
- CriterionTriggers.x.a((EntityPlayer) entityhuman, blockposition1, itemstack);
+ CriterionTriggers.y.a((EntityPlayer) entityhuman, blockposition1, itemstack);
}
diff --git a/nms-patches/ItemWorldMap.patch b/nms-patches/ItemWorldMap.patch
index 8705b251..c5dfff5d 100644
--- a/nms-patches/ItemWorldMap.patch
+++ b/nms-patches/ItemWorldMap.patch
@@ -1,7 +1,7 @@
--- a/net/minecraft/server/ItemWorldMap.java
+++ b/net/minecraft/server/ItemWorldMap.java
-@@ -5,6 +5,11 @@
- import com.google.common.collect.Multisets;
+@@ -6,6 +6,11 @@
+ import java.util.function.Function;
import javax.annotation.Nullable;
+// CraftBukkit start
@@ -11,57 +11,62 @@
+
public class ItemWorldMap extends ItemWorldMapBase {
- protected ItemWorldMap() {
-@@ -12,41 +17,50 @@
+ public ItemWorldMap(Item.Info item_info) {
+@@ -15,7 +20,7 @@
+ public static ItemStack a(World world, int i, int j, byte b0, boolean flag, boolean flag1) {
+ ItemStack itemstack = new ItemStack(Items.FILLED_MAP);
+
+- a(itemstack, world, i, j, b0, flag, flag1, world.worldProvider.getDimensionManager().getDimensionID());
++ a(itemstack, world, i, j, b0, flag, flag1, ((WorldServer) world).dimension); // CraftBukkit - fixes Bukkit multiworld maps
+ return itemstack;
}
- public static ItemStack a(World world, double d0, double d1, byte b0, boolean flag, boolean flag1) {
-- ItemStack itemstack = new ItemStack(Items.FILLED_MAP, 1, world.b("map"));
-+ World worldMain = world.getServer().getServer().worlds.get(0); // CraftBukkit - store reference to primary world
-+ ItemStack itemstack = new ItemStack(Items.FILLED_MAP, 1, worldMain.b("map")); // CraftBukkit - use primary world for maps
- String s = "map_" + itemstack.getData();
- WorldMap worldmap = new WorldMap(s);
+@@ -24,7 +29,7 @@
+ WorldMap worldmap = a((GeneratorAccess) world, "map_" + e(itemstack));
-- world.a(s, (PersistentBase) worldmap);
-+ worldMain.a(s, (PersistentBase) worldmap); // CraftBukkit
- worldmap.scale = b0;
- worldmap.a(d0, d1, worldmap.scale);
-- worldmap.map = (byte) world.worldProvider.getDimensionManager().getDimensionID();
-+ worldmap.map = (byte) ((WorldServer) world).dimension; // CraftBukkit - use bukkit dimension
- worldmap.track = flag;
- worldmap.unlimitedTracking = flag1;
- worldmap.c();
-+ org.bukkit.craftbukkit.event.CraftEventFactory.callEvent(new org.bukkit.event.server.MapInitializeEvent(worldmap.mapView)); // CraftBukkit
- return itemstack;
+ if (worldmap == null && !world.isClientSide) {
+- worldmap = a(itemstack, world, world.getWorldData().b(), world.getWorldData().d(), 3, false, false, world.worldProvider.getDimensionManager().getDimensionID());
++ worldmap = a(itemstack, world, world.getWorldData().b(), world.getWorldData().d(), 3, false, false, ((WorldServer) world).dimension); // CraftBukkit - fixes Bukkit multiworld maps
+ }
+
+ return worldmap;
+@@ -33,26 +38,40 @@
+ public static int e(ItemStack itemstack) {
+ NBTTagCompound nbttagcompound = itemstack.getTag();
+
+- return nbttagcompound != null && nbttagcompound.hasKeyOfType("map", 99) ? nbttagcompound.getInt("map") : 0;
++ return nbttagcompound != null && nbttagcompound.hasKeyOfType("map", 99) ? nbttagcompound.getInt("map") : -1; // CraftBukkit - make new maps for no tag
}
- @Nullable
- public WorldMap getSavedMap(ItemStack itemstack, World world) {
+ private static WorldMap a(ItemStack itemstack, World world, int i, int j, int k, boolean flag, boolean flag1, int l) {
+- int i1 = world.b("map");
+ 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
++ int i1 = worldMain.b("map"); // CraftBukkit - use primary world for maps
+ WorldMap worldmap = new WorldMap("map_" + i1);
- if (worldmap == null && !world.isClientSide) {
-- 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().b(), (double) world.getWorldData().d(), worldmap.scale);
-- worldmap.map = (byte) world.worldProvider.getDimensionManager().getDimensionID();
-+ 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
+ worldmap.a(i, j, k, flag, flag1, l);
+- world.a(worldmap.getId(), (PersistentBase) worldmap);
++ worldMain.a(worldmap.getId(), (PersistentBase) worldmap); // CraftBukkit - use primary world for maps
+ itemstack.getOrCreateTag().setInt("map", i1);
+
-+ // CraftBukkit start
++ // CraftBukkit start
++ MapInitializeEvent event = new MapInitializeEvent(worldmap.mapView);
++ Bukkit.getServer().getPluginManager().callEvent(event);
++ // CraftBukkit end
+ return worldmap;
+ }
+
+ @Nullable
+ public static WorldMap a(GeneratorAccess generatoraccess, String s) {
+- return (WorldMap) generatoraccess.a(WorldMap::new, s);
++ // CraftBukkit start
++ WorldMap worldmap = (WorldMap) MinecraftServer.getServer().worlds.get(0).a(WorldMap::new, s); // CraftBukkit - use primary world for maps
++ if (worldmap != null) {
+ MapInitializeEvent event = new MapInitializeEvent(worldmap.mapView);
+ Bukkit.getServer().getPluginManager().callEvent(event);
-+ // CraftBukkit end
- }
-
- return worldmap;
++ }
++ return worldmap;
++ // CraftBukkit end
}
public void a(World world, Entity entity, WorldMap worldmap) {
@@ -71,41 +76,13 @@
int i = 1 << worldmap.scale;
int j = worldmap.centerX;
int k = worldmap.centerZ;
-@@ -309,6 +323,7 @@
- protected static void a(ItemStack itemstack, World world, int i) {
- 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());
-
-@@ -319,6 +334,10 @@
- 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
- }
+@@ -199,7 +218,8 @@
+ WorldMap worldmap = getSavedMap(itemstack, world);
- }
-@@ -326,6 +345,7 @@
- protected static void b(ItemStack itemstack, World world) {
- 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());
-
-@@ -337,6 +357,10 @@
- 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
- }
-
- }
+ if (worldmap != null) {
+- if (world.worldProvider.getDimensionManager().getDimensionID() == worldmap.map) {
++ // CraftBukkit - world.worldProvider -> ((WorldServer) world)
++ if (((WorldServer) world).dimension == worldmap.map) {
+ int i = 1 << worldmap.scale;
+ int j = worldmap.centerX;
+ int k = worldmap.centerZ;
diff --git a/nms-patches/ItemWrittenBook.patch b/nms-patches/ItemWrittenBook.patch
index 3a4e4761..e43dd909 100644
--- a/nms-patches/ItemWrittenBook.patch
+++ b/nms-patches/ItemWrittenBook.patch
@@ -1,34 +1,34 @@
--- a/net/minecraft/server/ItemWrittenBook.java
+++ b/net/minecraft/server/ItemWrittenBook.java
-@@ -61,6 +61,23 @@
+@@ -62,6 +62,23 @@
- Object object;
+ Object object;
-+ // CraftBukkit start
-+ // Some commands use the worldserver variable but we leave it full of null values,
-+ // so we must temporarily populate it with the world of the commandsender
-+ WorldServer[] prev = MinecraftServer.getServer().worldServer;
-+ MinecraftServer server = MinecraftServer.getServer();
-+ server.worldServer = new WorldServer[server.worlds.size()];
-+ server.worldServer[0] = (WorldServer) entityhuman.getWorld();
-+ int bpos = 0;
-+ for (int pos = 1; pos < server.worldServer.length; pos++) {
-+ WorldServer world = server.worlds.get(bpos++);
-+ if (server.worldServer[0] == world) {
-+ pos--;
-+ continue;
-+ }
-+ server.worldServer[pos] = world;
++ // CraftBukkit start
++ // Some commands use the worldserver variable but we leave it full of null values,
++ // so we must temporarily populate it with the world of the commandsender
++ WorldServer[] prev = MinecraftServer.getServer().worldServer;
++ MinecraftServer server = MinecraftServer.getServer();
++ server.worldServer = new WorldServer[server.worlds.size()];
++ server.worldServer[0] = (WorldServer) entityhuman.getWorld();
++ int bpos = 0;
++ for (int pos = 1; pos < server.worldServer.length; pos++) {
++ WorldServer world = server.worlds.get(bpos++);
++ if (server.worldServer[0] == world) {
++ pos--;
++ continue;
+ }
-+ // CraftBukkit end
- try {
- IChatBaseComponent ichatbasecomponent = IChatBaseComponent.ChatSerializer.b(s);
++ server.worldServer[pos] = world;
++ }
++ // CraftBukkit end
+ try {
+ IChatBaseComponent ichatbasecomponent = IChatBaseComponent.ChatSerializer.b(s);
-@@ -68,6 +85,7 @@
- } catch (Exception exception) {
- object = new ChatComponentText(s);
- }
-+ finally { MinecraftServer.getServer().worldServer = prev; } // CraftBukkit
-
- nbttaglist.a(i, new NBTTagString(IChatBaseComponent.ChatSerializer.a((IChatBaseComponent) object)));
+@@ -69,6 +86,7 @@
+ } catch (Exception exception) {
+ object = new ChatComponentText(s);
}
++ finally { MinecraftServer.getServer().worldServer = prev; } // CraftBukkit
+
+ nbttaglist.set(i, (NBTBase) (new NBTTagString(IChatBaseComponent.ChatSerializer.a((IChatBaseComponent) object))));
+ }
diff --git a/nms-patches/JsonList.patch b/nms-patches/JsonList.patch
index 9cdf691b..0db0f198 100644
--- a/nms-patches/JsonList.patch
+++ b/nms-patches/JsonList.patch
@@ -1,7 +1,7 @@
--- a/net/minecraft/server/JsonList.java
+++ b/net/minecraft/server/JsonList.java
-@@ -84,7 +84,7 @@
-
+@@ -86,7 +86,7 @@
+ @Nullable
public V get(K k0) {
this.h();
- return (JsonListEntry) this.d.get(this.a(k0));
@@ -9,7 +9,7 @@
}
public void remove(K k0) {
-@@ -102,6 +102,12 @@
+@@ -108,6 +108,12 @@
return (String[]) this.d.keySet().toArray(new String[this.d.size()]);
}
@@ -22,16 +22,25 @@
public boolean isEmpty() {
return this.d.size() < 1;
}
-@@ -178,7 +184,7 @@
- JsonListEntry jsonlistentry = (JsonListEntry) iterator.next();
+@@ -137,7 +143,7 @@
+ while (iterator.hasNext()) {
+ Object object = iterator.next();
+
+- this.d.remove(this.a(object));
++ this.d.remove(this.a((K) object)); // CraftBukkit - decompile error
+ }
+
+ }
+@@ -180,7 +186,7 @@
+ JsonListEntry jsonlistentry = (JsonListEntry) iterator.next();
- if (jsonlistentry.getKey() != null) {
-- this.d.put(this.a(jsonlistentry.getKey()), jsonlistentry);
-+ this.d.put(this.a((K) jsonlistentry.getKey()), (V) jsonlistentry); // CraftBukkit - fix decompile error
+ if (jsonlistentry.getKey() != null) {
+- this.d.put(this.a(jsonlistentry.getKey()), jsonlistentry);
++ this.d.put(this.a((K) jsonlistentry.getKey()), (V) jsonlistentry); // CraftBukkit - fix decompile error
+ }
}
}
- }
-@@ -207,11 +213,11 @@
+@@ -212,11 +218,11 @@
}
}
diff --git a/nms-patches/LoginListener.patch b/nms-patches/LoginListener.patch
index 789331f0..f1671027 100644
--- a/nms-patches/LoginListener.patch
+++ b/nms-patches/LoginListener.patch
@@ -1,6 +1,6 @@
--- a/net/minecraft/server/LoginListener.java
+++ b/net/minecraft/server/LoginListener.java
-@@ -22,6 +22,12 @@
+@@ -19,6 +19,12 @@
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
@@ -13,7 +13,7 @@
public class LoginListener implements PacketLoginInListener, ITickable {
private static final AtomicInteger b = new AtomicInteger(0);
-@@ -36,6 +42,7 @@
+@@ -33,6 +39,7 @@
private final String j;
private SecretKey loginKey;
private EntityPlayer l;
@@ -21,7 +21,7 @@
public LoginListener(MinecraftServer minecraftserver, NetworkManager networkmanager) {
this.g = LoginListener.EnumProtocolState.HELLO;
-@@ -64,6 +71,20 @@
+@@ -61,6 +68,20 @@
}
@@ -41,33 +41,24 @@
+
public void disconnect(IChatBaseComponent ichatbasecomponent) {
try {
- LoginListener.c.info("Disconnecting {}: {}", this.c(), ichatbasecomponent.toPlainText());
-@@ -80,10 +101,12 @@
+ LoginListener.c.info("Disconnecting {}: {}", this.c(), ichatbasecomponent.getString());
+@@ -77,10 +98,12 @@
this.i = this.a(this.i);
}
-- String s = this.server.getPlayerList().attemptLogin(this.networkManager.getSocketAddress(), this.i);
+- IChatBaseComponent ichatbasecomponent = 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(new ChatMessage(s, new Object[0]));
+- if (ichatbasecomponent != null) {
+- this.disconnect(ichatbasecomponent);
+ if (s == null) {
-+ // this.disconnect(new ChatMessage(s, new Object[0]));
++ // this.disconnect(ichatbasecomponent);
+ // CraftBukkit end
} else {
this.g = LoginListener.EnumProtocolState.ACCEPTED;
- if (this.server.aG() >= 0 && !this.networkManager.isLocal()) {
-@@ -92,7 +115,7 @@
- LoginListener.this.networkManager.setCompressionLevel(LoginListener.this.server.aG());
- }
-
-- public void operationComplete(Future future) throws Exception {
-+ public void operationComplete(ChannelFuture future) throws Exception { // CraftBukkit - fix decompile error
- this.a((ChannelFuture) future);
- }
- }, new GenericFutureListener[0]);
-@@ -103,9 +126,9 @@
+ if (this.server.ay() >= 0 && !this.networkManager.isLocal()) {
+@@ -94,9 +117,9 @@
if (entityplayer != null) {
this.g = LoginListener.EnumProtocolState.DELAY_ACCEPT;
@@ -79,9 +70,9 @@
}
}
-@@ -150,6 +173,43 @@
+@@ -141,6 +164,43 @@
- LoginListener.this.i = LoginListener.this.server.az().hasJoinedServer(new GameProfile((UUID) null, gameprofile.getName()), s, this.a());
+ LoginListener.this.i = LoginListener.this.server.ar().hasJoinedServer(new GameProfile((UUID) null, gameprofile.getName()), s, this.a());
if (LoginListener.this.i != null) {
+ // CraftBukkit start - fire PlayerPreLoginEvent
+ if (!networkManager.isConnected()) {
@@ -122,8 +113,8 @@
+ // CraftBukkit end
LoginListener.c.info("UUID of player {} is {}", LoginListener.this.i.getName(), LoginListener.this.i.getId());
LoginListener.this.g = LoginListener.EnumProtocolState.READY_TO_ACCEPT;
- } else if (LoginListener.this.server.R()) {
-@@ -169,6 +229,11 @@
+ } else if (LoginListener.this.server.J()) {
+@@ -160,6 +220,11 @@
LoginListener.this.disconnect(new ChatMessage("multiplayer.disconnect.authservers_down", new Object[0]));
LoginListener.c.error("Couldn\'t verify username because servers are unavailable");
}
diff --git a/nms-patches/MethodProfiler.patch b/nms-patches/MethodProfiler.patch
index b608e64a..97e1ed3f 100644
--- a/nms-patches/MethodProfiler.patch
+++ b/nms-patches/MethodProfiler.patch
@@ -5,63 +5,63 @@
public class MethodProfiler {
+ public static final boolean ENABLED = Boolean.getBoolean("enableDebugMethodProfiler"); // CraftBukkit - disable unless specified in JVM arguments
- private static final Logger b = LogManager.getLogger();
- private final List<String> c = Lists.newArrayList();
- private final List<Long> d = Lists.newArrayList();
-@@ -23,12 +24,14 @@
- public MethodProfiler() {}
+ private static final Logger a = LogManager.getLogger();
+ private final List<String> b = Lists.newArrayList();
+ private final List<Long> c = Lists.newArrayList();
+@@ -41,6 +42,7 @@
+ }
- public void a() {
-+ if (!ENABLED) return; // CraftBukkit
- this.f.clear();
- this.e = "";
- this.c.clear();
+ public void a(int i) {
++ if (!ENABLED) return; // CraftBukkit
+ if (!this.d) {
+ this.d = true;
+ this.f.clear();
+@@ -52,6 +54,7 @@
}
public void a(String s) {
-+ if (!ENABLED) return; // CraftBukkit
- if (this.a) {
++ if (!ENABLED) return; // CraftBukkit
+ if (this.d) {
if (!this.e.isEmpty()) {
this.e = this.e + ".";
-@@ -41,12 +44,14 @@
+@@ -64,12 +67,14 @@
}
public void a(Supplier<String> supplier) {
-+ if (!ENABLED) return; // CraftBukkit
- if (this.a) {
++ if (!ENABLED) return; // CraftBukkit
+ if (this.d) {
this.a((String) supplier.get());
}
}
- public void b() {
-+ if (!ENABLED) return; // CraftBukkit
- if (this.a) {
- long i = System.nanoTime();
- long j = ((Long) this.d.remove(this.d.size() - 1)).longValue();
-@@ -69,7 +74,7 @@
+ public void e() {
++ if (!ENABLED) return; // CraftBukkit
+ if (this.d && !this.c.isEmpty()) {
+ long i = SystemUtils.c();
+ long j = ((Long) this.c.remove(this.c.size() - 1)).longValue();
+@@ -92,6 +97,7 @@
}
public List<MethodProfiler.ProfilerInfo> b(String s) {
-- if (!this.a) {
-+ if (!ENABLED || !this.a) { // CraftBukkit
- return Collections.emptyList();
- } else {
- long i = this.f.containsKey("root") ? ((Long) this.f.get("root")).longValue() : 0L;
-@@ -135,11 +140,13 @@
++ if (!ENABLED) return Collections.emptyList(); // CraftBukkit
+ 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();
+@@ -154,11 +160,13 @@
}
public void c(String s) {
-+ if (!ENABLED) return; // CraftBukkit
- this.b();
++ if (!ENABLED) return; // CraftBukkit
+ this.e();
this.a(s);
}
- public String c() {
-+ if (!ENABLED) return "[DISABLED]"; // CraftBukkit
- return this.c.isEmpty() ? "[UNKNOWN]" : (String) this.c.get(this.c.size() - 1);
+ public String f() {
++ if (!ENABLED) return "[DISABLED]"; // CraftBukkit
+ return this.b.isEmpty() ? "[UNKNOWN]" : (String) this.b.get(this.b.size() - 1);
}
-@@ -159,7 +166,7 @@
+@@ -178,7 +186,7 @@
return methodprofiler_profilerinfo.a < this.a ? -1 : (methodprofiler_profilerinfo.a > this.a ? 1 : methodprofiler_profilerinfo.c.compareTo(this.c));
}
diff --git a/nms-patches/MinecraftServer.patch b/nms-patches/MinecraftServer.patch
index 1493d7e5..5d140dd5 100644
--- a/nms-patches/MinecraftServer.patch
+++ b/nms-patches/MinecraftServer.patch
@@ -1,6 +1,6 @@
--- a/net/minecraft/server/MinecraftServer.java
+++ b/net/minecraft/server/MinecraftServer.java
-@@ -41,6 +41,13 @@
+@@ -55,6 +55,13 @@
import org.apache.commons.lang3.Validate;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
@@ -12,13 +12,13 @@
+import org.bukkit.craftbukkit.Main;
+// CraftBukkit end
- public abstract class MinecraftServer implements ICommandListener, Runnable, IAsyncTaskHandler, IMojangStatistics {
+ public abstract class MinecraftServer implements IAsyncTaskHandler, IMojangStatistics, ICommandListener, Runnable {
-@@ -98,19 +105,61 @@
- private Thread serverThread;
- private long ab = aw();
+@@ -124,7 +131,22 @@
+ private boolean an;
+ private float ao;
-- public MinecraftServer(File file, Proxy proxy, DataConverterManager dataconvertermanager, YggdrasilAuthenticationService yggdrasilauthenticationservice, MinecraftSessionService minecraftsessionservice, GameProfileRepository gameprofilerepository, UserCache usercache) {
+- public MinecraftServer(@Nullable File file, Proxy proxy, DataFixer datafixer, CommandDispatcher commanddispatcher, YggdrasilAuthenticationService yggdrasilauthenticationservice, MinecraftSessionService minecraftsessionservice, GameProfileRepository gameprofilerepository, UserCache usercache) {
+ // CraftBukkit start
+ public List<WorldServer> worlds = new ArrayList<WorldServer>();
+ public org.bukkit.craftbukkit.CraftServer server;
@@ -30,21 +30,36 @@
+ public final Thread primaryThread;
+ public java.util.Queue<Runnable> processQueue = new java.util.concurrent.ConcurrentLinkedQueue<Runnable>();
+ public int autosavePeriod;
++ public File bukkitDataPackFolder;
+ // CraftBukkit end
+
-+ public MinecraftServer(OptionSet options, Proxy proxy, DataConverterManager dataconvertermanager, YggdrasilAuthenticationService yggdrasilauthenticationservice, MinecraftSessionService minecraftsessionservice, GameProfileRepository gameprofilerepository, UserCache usercache) {
- this.e = proxy;
- this.V = yggdrasilauthenticationservice;
- this.W = minecraftsessionservice;
- this.X = gameprofilerepository;
- this.Y = usercache;
++ public MinecraftServer(OptionSet options, Proxy proxy, DataFixer datafixer, CommandDispatcher commanddispatcher, YggdrasilAuthenticationService yggdrasilauthenticationservice, MinecraftSessionService minecraftsessionservice, GameProfileRepository gameprofilerepository, UserCache usercache) {
++ this.commandDispatcher = commanddispatcher; // CraftBukkit
+ this.ac = new ResourceManager(EnumResourcePackType.SERVER_DATA);
+ this.resourcePackRepository = new ResourcePackRepository(ResourcePackLoader::new);
+ this.ag = new CraftingManager();
+@@ -135,22 +157,51 @@
+ this.al = new AdvancementDataWorld();
+ this.am = new CustomFunctionData(this);
+ this.d = proxy;
+- this.commandDispatcher = commanddispatcher;
++ // this.commandDispatcher = commanddispatcher; // CraftBukkit - moved up
+ this.U = yggdrasilauthenticationservice;
+ this.V = minecraftsessionservice;
+ this.W = gameprofilerepository;
+ this.X = usercache;
- this.universe = file;
+- this.m = file == null ? null : new ServerConnection(this);
+- this.convertable = file == null ? null : new WorldLoaderServer(file.toPath(), file.toPath().resolve("../backups"), datafixer);
+ // this.universe = file; // CraftBukkit
- this.p = new ServerConnection(this);
- this.b = this.i();
-- this.convertable = new WorldLoaderServer(file, dataconvertermanager);
-+ // this.convertable = new WorldLoaderServer(file); // CraftBukkit - moved to DedicatedServer.init
- this.dataConverterManager = dataconvertermanager;
++ this.m = new ServerConnection(this); // CraftBukkit
++ // this.convertable = file == null ? null : new WorldLoaderServer(file.toPath(), file.toPath().resolve("../backups"), datafixer); // CraftBukkit - moved to DedicatedServer.init
+ this.dataConverterManager = datafixer;
+ this.ac.a((IResourcePackListener) this.ah);
+ this.ac.a((IResourcePackListener) this.ag);
+ this.ac.a((IResourcePackListener) this.ak);
+ this.ac.a((IResourcePackListener) this.am);
+ this.ac.a((IResourcePackListener) this.al);
+ // CraftBukkit start
+ this.options = options;
+ // Try to see if we're actually running in a terminal, disable jline if not
@@ -76,21 +91,21 @@
+ public abstract PropertyManager getPropertyManager();
+ // CraftBukkit end
+
- protected CommandDispatcher i() {
- return new CommandDispatcher(this);
- }
-@@ -148,6 +197,7 @@
+ public abstract boolean init() throws IOException;
+
+ protected void a(String s) {
+@@ -184,6 +235,7 @@
this.a(s);
- this.b("menu.loadingLevel");
+ this.b((IChatBaseComponent) (new ChatMessage("menu.loadingLevel", new Object[0])));
this.worldServer = new WorldServer[3];
+ /* CraftBukkit start - Remove ticktime arrays and worldsettings
- this.i = new long[this.worldServer.length][100];
- IDataManager idatamanager = this.convertable.a(s, true);
+ this.f = new long[this.worldServer.length][100];
+ IDataManager idatamanager = this.convertable.a(s, this);
-@@ -171,36 +221,108 @@
- worlddata.a(s1);
- worldsettings = new WorldSettings(worlddata);
+@@ -209,40 +261,115 @@
}
+
+ this.a(idatamanager.getDirectory(), worlddata);
+ */
+ int worldCount = 3;
@@ -98,6 +113,7 @@
- byte b0 = 0;
+ for (int j = 0; j < worldCount; ++j) {
+ WorldServer world;
++ WorldData worlddata;
+ byte dimension = 0;
if (j == 1) {
@@ -123,16 +139,16 @@
+
+ org.bukkit.generator.ChunkGenerator gen = this.server.getGenerator(name);
+ WorldSettings worldsettings = new WorldSettings(i, this.getGamemode(), this.getGenerateStructures(), this.isHardcore(), worldtype);
-+ worldsettings.setGeneratorSettings(s2);
++ worldsettings.setGeneratorSettings(jsonelement);
+
if (j == 0) {
-+ IDataManager idatamanager = new ServerNBTManager(server.getWorldContainer(), s1, true, this.dataConverterManager);
-+ WorldData worlddata = idatamanager.getWorldData();
++ IDataManager idatamanager = new ServerNBTManager(server.getWorldContainer(), s1, this, this.dataConverterManager);
++ worlddata = idatamanager.getWorldData();
+ if (worlddata == null) {
+ worlddata = new WorldData(worldsettings, s1);
+ }
+ worlddata.checkName(s1); // CraftBukkit - Migration did not rewrite the level.dat; This forces 1.8 to take the last loaded world as respawn (in this case the end)
- if (this.V()) {
+ if (this.N()) {
- 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 {
@@ -142,6 +158,7 @@
- this.worldServer[j].a(worldsettings);
+ world.a(worldsettings);
++ this.a(idatamanager.getDirectory(), worlddata);
+ 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();
@@ -180,9 +197,9 @@
+ }
+ }
+
-+ IDataManager idatamanager = new ServerNBTManager(server.getWorldContainer(), name, true, this.dataConverterManager);
++ IDataManager idatamanager = new ServerNBTManager(server.getWorldContainer(), name, this, this.dataConverterManager);
+ // world =, b0 to dimension, s1 to name, added Environment and gen
-+ WorldData worlddata = idatamanager.getWorldData();
++ worlddata = idatamanager.getWorldData();
+ if (worlddata == null) {
+ worlddata = new WorldData(worldsettings, name);
+ }
@@ -194,77 +211,136 @@
+ this.server.getPluginManager().callEvent(new org.bukkit.event.world.WorldInitEvent(world.getWorld()));
+
+ world.addIWorldAccess(new WorldManager(this, world));
- if (!this.R()) {
+ if (!this.J()) {
- this.worldServer[j].getWorldData().setGameType(this.getGamemode());
+ world.getWorldData().setGameType(this.getGamemode());
}
- }
+- this.s.setPlayerFileData(this.worldServer);
+- if (worlddata.P() != null) {
+- this.aR().a(worlddata.P());
+ worlds.add(world);
+ getPlayerList().setPlayerFileData(worlds.toArray(new WorldServer[worlds.size()]));
-+ }
++
++ if (worlddata.P() != null) {
++ this.aR().a(worlddata.P());
++ }
+ }
++ this.s.setPlayerFileData(this.worldServer);
+ // CraftBukkit end
- this.v.setPlayerFileData(this.worldServer);
+
this.a(this.getDifficulty());
- this.l();
-@@ -216,25 +338,38 @@
- this.b("menu.generatingTerrain");
- boolean flag4 = false;
+ this.g_();
+@@ -251,6 +378,25 @@
+ protected void a(File file, WorldData worlddata) {
+ this.resourcePackRepository.a((ResourcePackSource) (new ResourcePackSourceVanilla()));
+ this.resourcePackFolder = new ResourcePackSourceFolder(new File(file, "datapacks"));
++ // CraftBukkit start
++ bukkitDataPackFolder = new File(new File(file, "datapacks"), "bukkit");
++ if (!bukkitDataPackFolder.exists()) {
++ bukkitDataPackFolder.mkdirs();
++ }
++ File mcMeta = new File(bukkitDataPackFolder, "pack.mcmeta");
++ if (!mcMeta.exists()) {
++ try {
++ com.google.common.io.Files.write("{\n"
++ + " \"pack\": {\n"
++ + " \"description\": \"Data pack for resources provided by Bukkit plugins\",\n"
++ + " \"pack_format\": 1\n"
++ + " }\n"
++ + "}", mcMeta, com.google.common.base.Charsets.UTF_8);
++ } catch (IOException ex) {
++ throw new RuntimeException("Could not initialize Bukkit datapack", ex);
++ }
++ }
++ // CraftBukkit end
+ this.resourcePackRepository.a((ResourcePackSource) this.resourcePackFolder);
+ this.resourcePackRepository.a();
+ ArrayList arraylist = Lists.newArrayList();
+@@ -281,41 +427,52 @@
+ this.b((IChatBaseComponent) (new ChatMessage("menu.generatingTerrain", new Object[0])));
+ boolean flag5 = false;
- MinecraftServer.LOGGER.info("Preparing start region for level 0");
- WorldServer worldserver = this.worldServer[0];
- BlockPosition blockposition = worldserver.getSpawn();
-- long j = aw();
--
-- for (int k = -192; k <= 192 && this.isRunning(); k += 16) {
-- for (int l = -192; l <= 192 && this.isRunning(); l += 16) {
-- long i1 = aw();
--
-- if (i1 - j > 1000L) {
-- this.a_("Preparing spawn area", i * 100 / 625);
-- j = i1;
-- }
+- ArrayList arraylist = Lists.newArrayList();
+- Set set = Sets.newConcurrentHashSet();
+ // CraftBukkit start - fire WorldLoadEvent and handle whether or not to keep the spawn in memory
+ Stopwatch stopwatch = Stopwatch.createStarted();
+-
+- for (int i = -192; i <= 192 && this.isRunning(); i += 16) {
+- for (int j = -192; j <= 192 && this.isRunning(); j += 16) {
+- arraylist.add(new ChunkCoordIntPair(blockposition.getX() + i >> 4, blockposition.getZ() + j >> 4));
+ for (int m = 0; m < worlds.size(); m++) {
+ WorldServer worldserver = this.worlds.get(m);
+ MinecraftServer.LOGGER.info("Preparing start region for level " + m + " (Seed: " + worldserver.getSeed() + ")");
-+
+ if (!worldserver.getWorld().getKeepSpawnInMemory()) {
+ continue;
-+ }
-+
+ }
+
+- CompletableFuture completablefuture = worldserver.getChunkProviderServer().a((Iterable) arraylist, (chunk) -> {
+- set.add(chunk.getPos());
+- });
+ BlockPosition blockposition = worldserver.getSpawn();
-+ long j = aw();
-+ i = 0;
++ ArrayList arraylist = Lists.newArrayList();
++ Set set = Sets.newConcurrentHashSet();
+
-+ for (int k = -192; k <= 192 && this.isRunning(); k += 16) {
-+ for (int l = -192; l <= 192 && this.isRunning(); l += 16) {
-+ long i1 = aw();
++ for (int i = -192; i <= 192 && this.isRunning(); i += 16) {
++ for (int j = -192; j <= 192 && this.isRunning(); j += 16) {
++ arraylist.add(new ChunkCoordIntPair(blockposition.getX() + i >> 4, blockposition.getZ() + j >> 4));
++ }
+
+- while (!completablefuture.isDone()) {
+- try {
+- completablefuture.get(1L, TimeUnit.SECONDS);
+- } catch (InterruptedException interruptedexception) {
+- throw new RuntimeException(interruptedexception);
+- } catch (ExecutionException executionexception) {
+- if (executionexception.getCause() instanceof RuntimeException) {
+- throw (RuntimeException) executionexception.getCause();
+- }
++ CompletableFuture completablefuture = worldserver.getChunkProviderServer().a((Iterable) arraylist, (chunk) -> {
++ set.add(chunk.getPos());
++ });
+
+- throw new RuntimeException(executionexception.getCause());
+- } catch (TimeoutException timeoutexception) {
+- this.a(new ChatMessage("menu.preparingSpawn", new Object[0]), set.size() * 100 / 625);
++ while (!completablefuture.isDone()) {
++ try {
++ completablefuture.get(1L, TimeUnit.SECONDS);
++ } catch (InterruptedException interruptedexception) {
++ throw new RuntimeException(interruptedexception);
++ } catch (ExecutionException executionexception) {
++ if (executionexception.getCause() instanceof RuntimeException) {
++ throw (RuntimeException) executionexception.getCause();
++ }
+
-+ if (i1 - j > 1000L) {
-+ this.a_("Preparing spawn area", i * 100 / 625);
-+ j = i1;
++ throw new RuntimeException(executionexception.getCause());
++ } catch (TimeoutException timeoutexception) {
++ this.a(new ChatMessage("menu.preparingSpawn", new Object[0]), set.size() * 100 / 625);
+ }
+ }
+- }
-- ++i;
-- worldserver.getChunkProviderServer().getChunkAt(blockposition.getX() + k >> 4, blockposition.getZ() + l >> 4);
-+ ++i;
-+ worldserver.getChunkProviderServer().getChunkAt(blockposition.getX() + k >> 4, blockposition.getZ() + l >> 4);
-+ }
- }
+- this.a(new ChatMessage("menu.preparingSpawn", new Object[0]), set.size() * 100 / 625);
++ this.a(new ChatMessage("menu.preparingSpawn", new Object[0]), set.size() * 100 / 625);
++ }
}
+ for (WorldServer world : this.worlds) {
+ this.server.getPluginManager().callEvent(new org.bukkit.event.world.WorldLoadEvent(world.getWorld()));
+ }
+ // CraftBukkit end
- this.t();
+ this.m();
+ MinecraftServer.LOGGER.info("Time elapsed: {} ms", Long.valueOf(stopwatch.elapsed(TimeUnit.MILLISECONDS)));
}
-
-@@ -274,14 +409,17 @@
- protected void t() {
- this.f = null;
- this.g = 0;
+@@ -354,14 +511,17 @@
+ protected void m() {
+ this.w = null;
+ this.x = 0;
+ this.server.enablePlugins(org.bukkit.plugin.PluginLoadOrder.POSTWORLD); // CraftBukkit
}
@@ -281,15 +357,7 @@
if (worldserver != null) {
if (!flag) {
-@@ -290,6 +428,7 @@
-
- try {
- worldserver.save(true, (IProgressUpdate) null);
-+ worldserver.saveLevel(); // CraftBukkit
- } catch (ExceptionWorldConflict exceptionworldconflict) {
- MinecraftServer.LOGGER.warn(exceptionworldconflict.getMessage());
- }
-@@ -298,8 +437,24 @@
+@@ -378,8 +538,24 @@
}
@@ -312,55 +380,58 @@
+ this.server.disablePlugins();
+ }
+ // CraftBukkit end
- if (this.an() != null) {
- this.an().b();
+ if (this.getServerConnection() != null) {
+ this.getServerConnection().b();
}
-@@ -308,6 +463,7 @@
+@@ -388,6 +564,7 @@
MinecraftServer.LOGGER.info("Saving players");
- this.v.savePlayers();
- this.v.u();
+ this.s.savePlayers();
+ this.s.u();
+ try { Thread.sleep(100); } catch (InterruptedException ex) {} // CraftBukkit - SPIGOT-625 - give server at least a chance to send packets
}
if (this.worldServer != null) {
-@@ -329,12 +485,14 @@
+@@ -398,8 +575,10 @@
+ int j;
+ WorldServer worldserver;
+
+- for (j = 0; j < i; ++j) {
+- worldserver = aworldserver[j];
++ // CraftBukkit start
++ for (j = 0; j < worlds.size(); ++j) {
++ worldserver = worlds.get(j);
++ // CraftBukkit end
+ if (worldserver != null) {
+ worldserver.savingDisabled = false;
+ }
+@@ -409,8 +588,10 @@
aworldserver = this.worldServer;
i = aworldserver.length;
-+ /* CraftBukkit start - Handled in saveChunks
- for (j = 0; j < i; ++j) {
- worldserver = aworldserver[j];
+- for (j = 0; j < i; ++j) {
+- worldserver = aworldserver[j];
++ // CraftBukkit start
++ for (j = 0; j < worlds.size(); ++j) {
++ worldserver = worlds.get(j);
++ // CraftBukkit end
if (worldserver != null) {
- worldserver.saveLevel();
+ worldserver.close();
}
- }
-+ // CraftBukkit end */
- }
-
- if (this.m.d()) {
-@@ -374,6 +532,7 @@
- long k = j - this.ab;
+@@ -453,11 +634,13 @@
+ if (i > 2000L && this.aa - this.Q >= 15000L) {
+ long j = i / 50L;
- 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)", Long.valueOf(k), Long.valueOf(k / 50L));
- k = 2000L;
- this.R = this.ab;
-@@ -386,11 +545,12 @@
-
- i += k;
- this.ab = j;
-- if (this.worldServer[0].everyoneDeeplySleeping()) {
-+ if (this.worlds.get(0).everyoneDeeplySleeping()) { // CraftBukkit
- this.C();
- i = 0L;
- } else {
- while (i > 50L) {
-+ MinecraftServer.currentTick = (int) (System.currentTimeMillis() / 50); // CraftBukkit
- i -= 50L;
- this.C();
- }
-@@ -428,6 +588,12 @@
+ MinecraftServer.LOGGER.warn("Can\'t keep up! Is the server overloaded? Running {}ms or {} ticks behind", Long.valueOf(i), Long.valueOf(j));
+ this.aa += j * 50L;
+ this.Q = this.aa;
+ }
+
++ MinecraftServer.currentTick = (int) (System.currentTimeMillis() / 50); // CraftBukkit
+ this.v();
+ this.aa += 50L;
+
+@@ -496,6 +679,12 @@
} catch (Throwable throwable1) {
MinecraftServer.LOGGER.error("Exception stopping the server", throwable1);
} finally {
@@ -370,37 +441,28 @@
+ } catch (Exception ignored) {
+ }
+ // CraftBukkit end
- this.B();
+ this.u();
}
-@@ -471,7 +637,7 @@
-
- public void B() {}
-
-- protected void C() {
-+ protected void C() throws ExceptionWorldConflict { // CraftBukkit - added throws
- long i = System.nanoTime();
-
- ++this.ticks;
-@@ -497,7 +663,7 @@
- this.q.b().a(agameprofile);
+@@ -564,7 +753,7 @@
+ this.n.b().a(agameprofile);
}
- if (this.ticks % 900 == 0) {
+ if (autosavePeriod > 0 && this.ticks % autosavePeriod == 0) { // CraftBukkit
this.methodProfiler.a("save");
- this.v.savePlayers();
+ this.s.savePlayers();
this.saveChunks(true);
-@@ -521,6 +687,7 @@
+@@ -590,6 +779,7 @@
}
- public void D() {
+ public void w() {
+ this.server.getScheduler().mainThreadHeartbeat(this.ticks); // CraftBukkit
this.methodProfiler.a("jobs");
- Queue queue = this.j;
-
-@@ -532,22 +699,40 @@
+ FutureTask futuretask;
+@@ -602,22 +792,40 @@
+ this.aD().X_();
this.methodProfiler.c("levels");
+ // CraftBukkit start
@@ -423,11 +485,11 @@
- for (i = 0; i < this.worldServer.length; ++i) {
+ for (i = 0; i < this.worlds.size(); ++i) { // CraftBukkit
- long j = System.nanoTime();
+ long j = SystemUtils.c();
- if (i == 0 || this.getAllowNether()) {
- WorldServer worldserver = this.worldServer[i];
-+ // if (i == 0 || this.getAllowNether()) {
++ if (true || i == 0 || this.getAllowNether()) { // CraftBukkit
+ WorldServer worldserver = this.worlds.get(i);
this.methodProfiler.a(() -> {
@@ -436,27 +498,24 @@
+ /* Drop global time updates
if (this.ticks % 20 == 0) {
this.methodProfiler.a("timeSync");
- this.v.a((Packet) (new PacketPlayOutUpdateTime(worldserver.getTime(), worldserver.getDayTime(), worldserver.getGameRules().getBoolean("doDaylightCycle"))), worldserver.worldProvider.getDimensionManager().getDimensionID());
- this.methodProfiler.b();
+ this.s.a((Packet) (new PacketPlayOutUpdateTime(worldserver.getTime(), worldserver.getDayTime(), worldserver.getGameRules().getBoolean("doDaylightCycle"))), worldserver.worldProvider.getDimensionManager().getDimensionID());
+ this.methodProfiler.e();
}
+ // CraftBukkit end */
this.methodProfiler.a("tick");
-@@ -574,9 +759,9 @@
- worldserver.getTracker().updatePlayers();
- this.methodProfiler.b();
- this.methodProfiler.b();
-- }
-+ // } // CraftBukkit
+@@ -646,7 +854,7 @@
+ this.methodProfiler.e();
+ }
-- this.i[i][this.ticks % 100] = System.nanoTime() - j;
-+ // this.i[i][this.ticks % 100] = System.nanoTime() - j; // CraftBukkit
+- this.f[i][this.ticks % 100] = SystemUtils.c() - j;
++ // this.f[i][this.ticks % 100] = SystemUtils.c() - j; // CraftBukkit
}
this.methodProfiler.c("connection");
-@@ -602,10 +787,11 @@
- this.o.add(itickable);
+@@ -670,10 +878,11 @@
+ this.l.add(itickable);
}
- public static void main(String[] astring) {
@@ -468,7 +527,7 @@
boolean flag = true;
String s = null;
String s1 = ".";
-@@ -650,13 +836,16 @@
+@@ -718,13 +927,16 @@
++j;
}
}
@@ -484,12 +543,12 @@
+ /* CraftBukkit start
if (s != null) {
- dedicatedserver.i(s);
+ dedicatedserver.h(s);
}
-@@ -687,6 +876,25 @@
- dedicatedserver.stop();
- }
- });
+@@ -758,6 +970,25 @@
+
+ thread.setUncaughtExceptionHandler(new DefaultUncaughtExceptionHandler(MinecraftServer.LOGGER));
+ Runtime.getRuntime().addShutdownHook(thread);
+ */
+
+ if (options.has("port")) {
@@ -512,18 +571,21 @@
} catch (Exception exception) {
MinecraftServer.LOGGER.fatal("Failed to start the minecraft server", exception);
}
-@@ -694,8 +902,10 @@
+@@ -765,11 +996,13 @@
}
- public void F() {
+ public void y() {
+ /* CraftBukkit start - prevent abuse
this.serverThread = new Thread(this, "Server thread");
+ this.serverThread.setUncaughtExceptionHandler((thread, throwable) -> {
+ MinecraftServer.LOGGER.error(throwable);
+ });
this.serverThread.start();
+ // CraftBukkit end */
}
- public File d(String s) {
-@@ -711,7 +921,14 @@
+ public File c(String s) {
+@@ -785,11 +1018,18 @@
}
public WorldServer getWorldServer(int i) {
@@ -538,8 +600,13 @@
+ // CraftBukkit end
}
+ public WorldServer a(DimensionManager dimensionmanager) {
+- return dimensionmanager == DimensionManager.NETHER ? this.worldServer[1] : (dimensionmanager == DimensionManager.THE_END ? this.worldServer[2] : this.worldServer[0]);
++ return dimensionmanager == DimensionManager.NETHER ? this.worlds.get(1) : (dimensionmanager == DimensionManager.THE_END ? this.worlds.get(2) : this.worlds.get(0)); // CraftBukkit
+ }
+
public String getVersion() {
-@@ -735,7 +952,7 @@
+@@ -809,7 +1049,7 @@
}
public boolean isDebugging() {
@@ -547,8 +614,8 @@
+ return this.getPropertyManager().getBoolean("debug", false); // CraftBukkit - don't hardcode
}
- public void g(String s) {
-@@ -750,7 +967,7 @@
+ public void f(String s) {
+@@ -824,7 +1064,7 @@
}
public String getServerModName() {
@@ -557,30 +624,16 @@
}
public CrashReport b(CrashReport crashreport) {
-@@ -779,6 +996,7 @@
- }
-
- public List<String> tabCompleteCommand(ICommandListener icommandlistener, String s, @Nullable BlockPosition blockposition, boolean flag) {
-+ /* CraftBukkit start - Allow tab-completion of Bukkit commands
- ArrayList arraylist = Lists.newArrayList();
- boolean flag1 = s.startsWith("/");
-
-@@ -821,10 +1039,13 @@
-
- return arraylist;
- }
-+ */
-+ return server.tabComplete(icommandlistener, s, blockposition, flag);
-+ // CraftBukkit end
+@@ -860,7 +1100,7 @@
}
- public boolean M() {
+ public boolean F() {
- return this.universe != null;
+ return true; // CraftBukkit
}
- public String getName() {
-@@ -880,11 +1101,13 @@
+ public void sendMessage(IChatBaseComponent ichatbasecomponent) {
+@@ -904,11 +1144,13 @@
}
public void a(EnumDifficulty enumdifficulty) {
@@ -597,7 +650,7 @@
if (worldserver != null) {
if (worldserver.getWorldData().isHardcore()) {
-@@ -951,13 +1174,11 @@
+@@ -975,13 +1217,11 @@
int i = 0;
if (this.worldServer != null) {
@@ -615,8 +668,8 @@
WorldData worlddata = worldserver.getWorldData();
mojangstatisticsgenerator.a("world[" + i + "][dimension]", Integer.valueOf(worldserver.worldProvider.getDimensionManager().getDimensionID()));
-@@ -990,7 +1211,7 @@
- public abstract boolean aa();
+@@ -1007,7 +1247,7 @@
+ public abstract boolean S();
public boolean getOnlineMode() {
- return this.onlineMode;
@@ -624,8 +677,8 @@
}
public void setOnlineMode(boolean flag) {
-@@ -1070,13 +1291,9 @@
- }
+@@ -1089,13 +1329,9 @@
+ public abstract boolean af();
public void setGamemode(EnumGamemode enumgamemode) {
- WorldServer[] aworldserver = this.worldServer;
@@ -641,70 +694,65 @@
}
}
-@@ -1100,7 +1317,7 @@
- }
-
- public World getWorld() {
-- return this.worldServer[0];
-+ return this.worlds.get(0); // CraftBukkit
- }
-
- public int getSpawnProtection() {
-@@ -1160,8 +1377,10 @@
- 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);
-@@ -1176,7 +1395,7 @@
- }
-
- public boolean getSendCommandFeedback() {
-- return this.worldServer[0].getGameRules().getBoolean("sendCommandFeedback");
-+ return worlds.get(0).getGameRules().getBoolean("sendCommandFeedback");
- }
-
- public MinecraftServer C_() {
-@@ -1189,7 +1408,7 @@
+@@ -1168,7 +1404,7 @@
public <V> ListenableFuture<V> a(Callable<V> callable) {
Validate.notNull(callable);
- if (!this.isMainThread() && !this.isStopped()) {
+ if (!this.isMainThread()) { // CraftBukkit && !this.isStopped()) {
ListenableFutureTask listenablefuturetask = ListenableFutureTask.create(callable);
- Queue queue = this.j;
-@@ -1232,17 +1451,17 @@
+ this.g.add(listenablefuturetask);
+@@ -1225,7 +1461,7 @@
+ } else {
+ this.getPlayerList().savePlayers();
+ this.resourcePackRepository.a();
+- this.a(this.worldServer[0].getWorldData());
++ this.a(this.worlds.get(0).getWorldData()); // CraftBukkit
+ this.getPlayerList().reload();
+ }
+ }
+@@ -1239,8 +1475,8 @@
+
+ if (!worlddata.N().contains(resourcepackloader.e()) && !arraylist.contains(resourcepackloader)) {
+ MinecraftServer.LOGGER.info("Found new data pack {}, loading it automatically", resourcepackloader.e());
+- resourcepackloader.h().a(arraylist, resourcepackloader, (resourcepackloader) -> {
+- return resourcepackloader;
++ resourcepackloader.h().a(arraylist, resourcepackloader, (resourcepackloader1) -> { // CraftBukkit - decompile error
++ return resourcepackloader1; // CraftBukkit - decompile error
+ }, false);
+ }
+ }
+@@ -1249,7 +1485,7 @@
+ ArrayList arraylist1 = Lists.newArrayList();
+
+ this.resourcePackRepository.d().forEach((resourcepackloader) -> {
+- list.add(resourcepackloader.d());
++ arraylist1.add(resourcepackloader.d()); // CraftBukkit - decompile error
+ });
+ this.ac.a((List) arraylist1);
+ worlddata.O().clear();
+@@ -1299,7 +1535,7 @@
}
- public AdvancementDataWorld getAdvancementData() {
-- return this.worldServer[0].z();
-+ return this.worlds.get(0).z(); // CraftBukkit
+ public CommandListenerWrapper getServerCommandListener() {
+- return new CommandListenerWrapper(this, this.worldServer[0] == null ? Vec3D.a : new Vec3D(this.worldServer[0].getSpawn()), Vec2F.a, this.worldServer[0], 4, "Server", new ChatComponentText("Server"), this, (Entity) null);
++ return new CommandListenerWrapper(this, this.worlds.isEmpty() ? Vec3D.a : new Vec3D(this.worlds.get(0).getSpawn()), Vec2F.a, this.worlds.isEmpty() ? null : this.worlds.get(0), 4, "Server", new ChatComponentText("Server"), this, (Entity) null); // CraftBukkit
}
- public CustomFunctionData aL() {
-- return this.worldServer[0].A();
-+ return this.worlds.get(0).A(); // CraftBukkit
+ public boolean a() {
+@@ -1327,7 +1563,7 @@
}
- public void reload() {
- if (this.isMainThread()) {
- this.getPlayerList().savePlayers();
-- this.worldServer[0].getLootTableRegistry().reload();
-+ this.worlds.get(0).getLootTableRegistry().reload(); // CraftBukkit
- this.getAdvancementData().reload();
- this.aL().f();
- this.getPlayerList().reload();
-@@ -1251,4 +1470,11 @@
- }
+ public GameRules aQ() {
+- return this.worldServer[0].getGameRules();
++ return this.worlds.get(0).getGameRules(); // CraftBukkit
+ }
+ public BossBattleCustomData aR() {
+@@ -1341,4 +1577,11 @@
+ public void k(boolean flag) {
+ this.an = flag;
}
+
+ // CraftBukkit start
diff --git a/nms-patches/MobEffectList.patch b/nms-patches/MobEffectList.patch
index cfe1bc3b..22ff3c21 100644
--- a/nms-patches/MobEffectList.patch
+++ b/nms-patches/MobEffectList.patch
@@ -1,7 +1,7 @@
--- a/net/minecraft/server/MobEffectList.java
+++ b/net/minecraft/server/MobEffectList.java
-@@ -7,6 +7,11 @@
- import java.util.Map.Entry;
+@@ -8,6 +8,11 @@
+ import java.util.function.Supplier;
import javax.annotation.Nullable;
+// CraftBukkit start
@@ -12,7 +12,7 @@
public class MobEffectList {
public static final RegistryMaterials<MinecraftKey, MobEffectList> REGISTRY = new RegistryMaterials();
-@@ -24,7 +29,7 @@
+@@ -26,7 +31,7 @@
}
public static int getId(MobEffectList mobeffectlist) {
@@ -20,8 +20,8 @@
+ return MobEffectList.REGISTRY.a(mobeffectlist); // CraftBukkit - decompile error
}
- @Nullable
-@@ -51,11 +56,11 @@
+ protected MobEffectList(boolean flag, int i) {
+@@ -48,11 +53,11 @@
public void tick(EntityLiving entityliving, int i) {
if (this == MobEffects.REGENERATION) {
if (entityliving.getHealth() < entityliving.getMaxHealth()) {
@@ -35,7 +35,7 @@
}
} else if (this == MobEffects.WITHER) {
entityliving.damageEntity(DamageSource.WITHER, 1.0F);
-@@ -63,14 +68,25 @@
+@@ -60,14 +65,25 @@
((EntityHuman) entityliving).applyExhaustion(0.005F * (float) (i + 1));
} else if (this == MobEffects.SATURATION && entityliving instanceof EntityHuman) {
if (!entityliving.world.isClientSide) {
@@ -53,8 +53,8 @@
+ ((EntityPlayer) entityhuman).playerConnection.sendPacket(new PacketPlayOutUpdateHealth(((EntityPlayer) entityhuman).getBukkitEntity().getScaledHealth(), entityhuman.getFoodData().foodLevel, entityhuman.getFoodData().saturationLevel));
+ // CraftBukkit end
}
- } else if ((this != MobEffects.HEAL || entityliving.cc()) && (this != MobEffects.HARM || !entityliving.cc())) {
- if (this == MobEffects.HARM && !entityliving.cc() || this == MobEffects.HEAL && entityliving.cc()) {
+ } else if ((this != MobEffects.HEAL || entityliving.co()) && (this != MobEffects.HARM || !entityliving.co())) {
+ if (this == MobEffects.HARM && !entityliving.co() || this == MobEffects.HEAL && entityliving.co()) {
entityliving.damageEntity(DamageSource.MAGIC, (float) (6 << i));
}
} else {
@@ -63,7 +63,7 @@
}
}
-@@ -89,7 +105,7 @@
+@@ -88,7 +104,7 @@
}
} else {
j = (int) (d0 * (double) (4 << i) + 0.5D);
@@ -72,14 +72,15 @@
}
}
-@@ -208,5 +224,10 @@
- MobEffectList.REGISTRY.a(25, new MinecraftKey("levitation"), (new MobEffectList(true, 13565951)).c("effect.levitation").b(3, 2));
- MobEffectList.REGISTRY.a(26, new MinecraftKey("luck"), (new MobEffectList(false, 3381504)).c("effect.luck").b(5, 2).j().a(GenericAttributes.j, "03C3C89D-7037-4B42-869F-B146BCB64D2E", 1.0D, 0));
- MobEffectList.REGISTRY.a(27, new MinecraftKey("unluck"), (new MobEffectList(true, 12624973)).c("effect.unluck").b(6, 2).a(GenericAttributes.j, "CC5AF142-2BD2-4215-B636-2605AED11727", -1.0D, 0));
+@@ -217,6 +233,11 @@
+ a(28, "slow_falling", (new MobEffectList(false, 16773073)).b(8, 0).l());
+ a(29, "conduit_power", (new MobEffectList(false, 1950417)).b(9, 0).l());
+ a(30, "dolphins_grace", (new MobEffectList(false, 8954814)).b(10, 0).l());
+ // CraftBukkit start
+ for (Object effect : REGISTRY) {
+ org.bukkit.potion.PotionEffectType.registerPotionEffectType(new org.bukkit.craftbukkit.potion.CraftPotionEffectType((MobEffectList) effect));
+ }
+ // CraftBukkit end
}
- }
+
+ private static void a(int i, String s, MobEffectList mobeffectlist) {
diff --git a/nms-patches/MobSpawnerAbstract.patch b/nms-patches/MobSpawnerAbstract.patch
index 9f63bb2a..abcecdf9 100644
--- a/nms-patches/MobSpawnerAbstract.patch
+++ b/nms-patches/MobSpawnerAbstract.patch
@@ -1,39 +1,19 @@
--- a/net/minecraft/server/MobSpawnerAbstract.java
+++ b/net/minecraft/server/MobSpawnerAbstract.java
-@@ -12,13 +12,13 @@
- private MobSpawnerData spawnData = new MobSpawnerData();
- private double d;
- private double e;
-- private int minSpawnDelay = 200;
-- private int maxSpawnDelay = 800;
-- private int spawnCount = 4;
-+ public int minSpawnDelay = 200; // CraftBukkit private -> public
-+ public int maxSpawnDelay = 800; // CraftBukkit private -> public
-+ public int spawnCount = 4; // CraftBukkit private -> public
- private Entity i;
-- private int maxNearbyEntities = 6;
-- private int requiredPlayerRange = 16;
-- private int spawnRange = 4;
-+ public int maxNearbyEntities = 6; // CraftBukkit private -> public
-+ public int requiredPlayerRange = 16; // CraftBukkit private -> public
-+ public int spawnRange = 4; // CraftBukkit private -> public
-
- public MobSpawnerAbstract() {}
-
-@@ -32,6 +32,7 @@
- public void setMobName(@Nullable MinecraftKey minecraftkey) {
- if (minecraftkey != null) {
- this.spawnData.b().setString("id", minecraftkey.toString());
-+ this.mobs.clear(); // CraftBukkit - SPIGOT-3496, MC-92282
- }
+@@ -41,6 +41,7 @@
+ public void setMobName(EntityTypes<?> entitytypes) {
+ this.spawnData.b().setString("id", ((MinecraftKey) EntityTypes.REGISTRY.b(entitytypes)).toString());
++ this.mobs.clear(); // CraftBukkit - SPIGOT-3496, MC-92282
}
-@@ -102,7 +103,7 @@
- ((EntityInsentient) entity).prepare(world.D(new BlockPosition(entity)), (GroupDataEntity) null);
+
+ private boolean h() {
+@@ -110,7 +111,7 @@
+ ((EntityInsentient) entity).prepare(world.getDamageScaler(new BlockPosition(entity)), (GroupDataEntity) null, (NBTTagCompound) null);
}
-- ChunkRegionLoader.a(entity, world);
-+ ChunkRegionLoader.a(entity, world, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.SPAWNER); // CraftBukkit
+- ChunkRegionLoader.a(entity, (GeneratorAccess) world);
++ ChunkRegionLoader.a(entity, (GeneratorAccess) world, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.SPAWNER); // CraftBukkit
world.triggerEffect(2004, blockposition, 0);
if (entityinsentient != null) {
entityinsentient.doSpawnEffect();
diff --git a/nms-patches/NameReferencingFileConverter.patch b/nms-patches/NameReferencingFileConverter.patch
index c7bd0f7e..b2978b2f 100644
--- a/nms-patches/NameReferencingFileConverter.patch
+++ b/nms-patches/NameReferencingFileConverter.patch
@@ -1,6 +1,6 @@
--- a/net/minecraft/server/NameReferencingFileConverter.java
+++ b/net/minecraft/server/NameReferencingFileConverter.java
-@@ -88,8 +88,9 @@
+@@ -83,8 +83,9 @@
if (gameprofilebanlist.c().exists()) {
try {
gameprofilebanlist.load();
@@ -12,7 +12,7 @@
}
}
-@@ -146,8 +147,9 @@
+@@ -141,8 +142,9 @@
if (ipbanlist.c().exists()) {
try {
ipbanlist.load();
@@ -24,7 +24,7 @@
}
}
-@@ -187,8 +189,9 @@
+@@ -182,8 +184,9 @@
if (oplist.c().exists()) {
try {
oplist.load();
@@ -36,7 +36,7 @@
}
}
-@@ -231,8 +234,9 @@
+@@ -226,8 +229,9 @@
if (whitelist.c().exists()) {
try {
whitelist.load();
@@ -48,7 +48,7 @@
}
}
-@@ -350,6 +354,30 @@
+@@ -345,6 +349,30 @@
File file1 = new File(file2, s + ".dat");
File file3 = new File(file, s1 + ".dat");
@@ -79,7 +79,7 @@
NameReferencingFileConverter.b(file);
if (!file1.renameTo(file3)) {
throw new NameReferencingFileConverter.FileConversionException("Could not convert file for " + s, null);
-@@ -358,7 +386,7 @@
+@@ -353,7 +381,7 @@
private String a(GameProfile gameprofile) {
String s = null;
@@ -88,7 +88,7 @@
int i = astring.length;
for (int j = 0; j < i; ++j) {
-@@ -471,7 +499,7 @@
+@@ -466,7 +494,7 @@
private static File d(PropertyManager propertymanager) {
String s = propertymanager.getString("level-name", "world");
diff --git a/nms-patches/NetworkManager.patch b/nms-patches/NetworkManager.patch
index 6e69467c..5caf383c 100644
--- a/nms-patches/NetworkManager.patch
+++ b/nms-patches/NetworkManager.patch
@@ -1,15 +1,24 @@
--- a/net/minecraft/server/NetworkManager.java
+++ b/net/minecraft/server/NetworkManager.java
-@@ -114,7 +114,7 @@
- protected void a(ChannelHandlerContext channelhandlercontext, Packet<?> packet) throws Exception {
- if (this.channel.isOpen()) {
- try {
-- packet.a(this.m);
-+ ((Packet) packet).a(this.m); // CraftBukkit - decompile error
- } catch (CancelledPacketHandleException cancelledpackethandleexception) {
- ;
- }
-@@ -236,7 +236,7 @@
+@@ -103,7 +103,7 @@
+ if (flag) {
+ NetworkManager.g.debug("Failed to sent packet", throwable);
+ this.sendPacket(new PacketPlayOutKickDisconnect(chatmessage), (future) -> {
+- this.close(ichatbasecomponent);
++ this.close(chatmessage); // CraftBukkit - decompile error
+ });
+ this.stopReading();
+ } else {
+@@ -130,7 +130,7 @@
+ }
+
+ private static <T extends PacketListener> void a(Packet<T> packet, PacketListener packetlistener) {
+- packet.a(packetlistener);
++ packet.a((T) packetlistener); // CraftBukkit - decompile error
+ }
+
+ public void setPacketListener(PacketListener packetlistener) {
+@@ -241,7 +241,7 @@
public void close(IChatBaseComponent ichatbasecomponent) {
if (this.channel.isOpen()) {
@@ -18,7 +27,7 @@
this.n = ichatbasecomponent;
}
-@@ -313,7 +313,7 @@
+@@ -319,7 +319,7 @@
}
}
diff --git a/nms-patches/PacketDataSerializer.patch b/nms-patches/PacketDataSerializer.patch
index 4348da94..acfca3b0 100644
--- a/nms-patches/PacketDataSerializer.patch
+++ b/nms-patches/PacketDataSerializer.patch
@@ -35,9 +35,9 @@
+ if (itemstack.isEmpty() || itemstack.getItem() == null) { // CraftBukkit - NPE fix itemstack.getItem()
this.writeShort(-1);
} else {
- this.writeShort(Item.getId(itemstack.getItem()));
+ Item item = itemstack.getItem();
@@ -263,6 +265,11 @@
- ItemStack itemstack = new ItemStack(Item.getById(short0), b0, short1);
+ ItemStack itemstack = new ItemStack(Item.getById(short0), b0);
itemstack.setTag(this.j());
+ // CraftBukkit start
diff --git a/nms-patches/PacketStatusListener.patch b/nms-patches/PacketStatusListener.patch
index c8a9a902..4d53d146 100644
--- a/nms-patches/PacketStatusListener.patch
+++ b/nms-patches/PacketStatusListener.patch
@@ -16,7 +16,7 @@
+
public class PacketStatusListener implements PacketStatusInListener {
- private static final IChatBaseComponent a = new ChatComponentText("Status request has been handled.");
+ private static final IChatBaseComponent a = new ChatMessage("multiplayer.status.request_handled", new Object[0]);
@@ -19,8 +30,96 @@
this.networkManager.close(PacketStatusListener.a);
} else {
diff --git a/nms-patches/PathfinderGoalBreakDoor.patch b/nms-patches/PathfinderGoalBreakDoor.patch
index e51d1569..9f16c309 100644
--- a/nms-patches/PathfinderGoalBreakDoor.patch
+++ b/nms-patches/PathfinderGoalBreakDoor.patch
@@ -1,9 +1,9 @@
--- a/net/minecraft/server/PathfinderGoalBreakDoor.java
+++ b/net/minecraft/server/PathfinderGoalBreakDoor.java
-@@ -63,6 +63,12 @@
+@@ -44,6 +44,12 @@
}
- if (this.g == 240 && this.a.world.getDifficulty() == EnumDifficulty.HARD) {
+ if (this.d == 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();
@@ -12,4 +12,4 @@
+ // CraftBukkit end
this.a.world.setAir(this.b);
this.a.world.triggerEffect(1021, this.b, 0);
- this.a.world.triggerEffect(2001, this.b, Block.getId(this.c));
+ this.a.world.triggerEffect(2001, this.b, Block.getCombinedId(this.a.world.getType(this.b)));
diff --git a/nms-patches/PathfinderGoalBreed.patch b/nms-patches/PathfinderGoalBreed.patch
index 2c169110..1504f5e3 100644
--- a/nms-patches/PathfinderGoalBreed.patch
+++ b/nms-patches/PathfinderGoalBreed.patch
@@ -24,24 +24,24 @@
+ // CraftBukkit end
if (entityplayer != null) {
- entityplayer.b(StatisticList.C);
+ entityplayer.a(StatisticList.ANIMALS_BRED);
@@ -92,7 +105,7 @@
this.partner.resetLove();
entityageable.setAgeRaw(-24000);
entityageable.setPositionRotation(this.animal.locX, this.animal.locY, this.animal.locZ, 0.0F, 0.0F);
-- this.a.addEntity(entityageable);
-+ this.a.addEntity(entityageable, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.BREEDING); // CraftBukkit - added SpawnReason
+- this.b.addEntity(entityageable);
++ this.b.addEntity(entityageable, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.BREEDING); // CraftBukkit - added SpawnReason
Random random = this.animal.getRandom();
for (int i = 0; i < 7; ++i) {
@@ -107,7 +120,11 @@
}
- if (this.a.getGameRules().getBoolean("doMobLoot")) {
-- this.a.addEntity(new EntityExperienceOrb(this.a, this.animal.locX, this.animal.locY, this.animal.locZ, random.nextInt(7) + 1));
+ if (this.b.getGameRules().getBoolean("doMobLoot")) {
+- this.b.addEntity(new EntityExperienceOrb(this.b, this.animal.locX, this.animal.locY, this.animal.locZ, random.nextInt(7) + 1));
+ // CraftBukkit start - use event experience
+ if (experience > 0) {
-+ this.a.addEntity(new EntityExperienceOrb(this.a, this.animal.locX, this.animal.locY, this.animal.locZ, experience));
++ this.b.addEntity(new EntityExperienceOrb(this.b, this.animal.locX, this.animal.locY, this.animal.locZ, experience));
+ }
+ // CraftBukkit end
}
diff --git a/nms-patches/PathfinderGoalEatTile.patch b/nms-patches/PathfinderGoalEatTile.patch
index f3d98e5c..ecefdb18 100644
--- a/nms-patches/PathfinderGoalEatTile.patch
+++ b/nms-patches/PathfinderGoalEatTile.patch
@@ -1,34 +1,33 @@
--- a/net/minecraft/server/PathfinderGoalEatTile.java
+++ b/net/minecraft/server/PathfinderGoalEatTile.java
-@@ -3,6 +3,11 @@
- import com.google.common.base.Predicate;
- import com.google.common.base.Predicates;
+@@ -2,6 +2,10 @@
+
+ import java.util.function.Predicate;
+// CraftBukkit start
+import org.bukkit.craftbukkit.event.CraftEventFactory;
-+import org.bukkit.Material;
+// CraftBukkit end
+
public class PathfinderGoalEatTile extends PathfinderGoal {
- private static final Predicate<IBlockData> b = BlockStatePredicate.a((Block) Blocks.TALLGRASS).a(BlockLongGrass.TYPE, Predicates.equalTo(BlockLongGrass.EnumTallGrassType.GRASS));
-@@ -50,7 +55,8 @@
- BlockPosition blockposition = new BlockPosition(this.c.locX, this.c.locY, this.c.locZ);
+ private static final Predicate<IBlockData> a = BlockStatePredicate.a(Blocks.GRASS);
+@@ -49,7 +53,8 @@
+ BlockPosition blockposition = new BlockPosition(this.b.locX, this.b.locY, this.b.locZ);
- if (PathfinderGoalEatTile.b.apply(this.d.getType(blockposition))) {
-- if (this.d.getGameRules().getBoolean("mobGriefing")) {
+ if (PathfinderGoalEatTile.a.test(this.c.getType(blockposition))) {
+- if (this.c.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);
++ if (!CraftEventFactory.callEntityChangeBlockEvent(this.b, blockposition, Blocks.AIR.getBlockData(), !this.c.getGameRules().getBoolean("mobGriefing")).isCancelled()) {
+ this.c.setAir(blockposition, false);
}
-@@ -59,7 +65,8 @@
+@@ -58,7 +63,8 @@
BlockPosition blockposition1 = blockposition.down();
- if (this.d.getType(blockposition1).getBlock() == Blocks.GRASS) {
-- if (this.d.getGameRules().getBoolean("mobGriefing")) {
+ if (this.c.getType(blockposition1).getBlock() == Blocks.GRASS_BLOCK) {
+- if (this.c.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.triggerEffect(2001, blockposition1, Block.getId(Blocks.GRASS));
- this.d.setTypeAndData(blockposition1, Blocks.DIRT.getBlockData(), 2);
++ if (!CraftEventFactory.callEntityChangeBlockEvent(this.b, blockposition, Blocks.AIR.getBlockData(), !this.c.getGameRules().getBoolean("mobGriefing")).isCancelled()) {
+ this.c.triggerEffect(2001, blockposition1, Block.getCombinedId(Blocks.GRASS_BLOCK.getBlockData()));
+ this.c.setTypeAndData(blockposition1, Blocks.DIRT.getBlockData(), 2);
}
diff --git a/nms-patches/PathfinderGoalFollowOwner.patch b/nms-patches/PathfinderGoalFollowOwner.patch
index 039f15a9..df21289c 100644
--- a/nms-patches/PathfinderGoalFollowOwner.patch
+++ b/nms-patches/PathfinderGoalFollowOwner.patch
@@ -11,24 +11,24 @@
+
public class PathfinderGoalFollowOwner extends PathfinderGoal {
- private final EntityTameableAnimal d;
+ private final EntityTameableAnimal b;
@@ -73,7 +79,18 @@
for (int l = 0; l <= 4; ++l) {
for (int i1 = 0; i1 <= 4; ++i1) {
if ((l < 1 || i1 < 1 || l > 3 || i1 > 3) && this.a(i, j, k, l, i1)) {
-- this.d.setPositionRotation((double) ((float) (i + l) + 0.5F), (double) k, (double) ((float) (j + i1) + 0.5F), this.d.yaw, this.d.pitch);
+- this.b.setPositionRotation((double) ((float) (i + l) + 0.5F), (double) k, (double) ((float) (j + i1) + 0.5F), this.b.yaw, this.b.pitch);
+ // CraftBukkit start
-+ CraftEntity entity = this.d.getBukkitEntity();
-+ Location to = new Location(entity.getWorld(), (double) ((float) (i + l) + 0.5F), (double) k, (double) ((float) (j + i1) + 0.5F), this.d.yaw, this.d.pitch);
++ CraftEntity entity = this.b.getBukkitEntity();
++ Location to = new Location(entity.getWorld(), (double) ((float) (i + l) + 0.5F), (double) k, (double) ((float) (j + i1) + 0.5F), this.b.yaw, this.b.pitch);
+ EntityTeleportEvent event = new EntityTeleportEvent(entity, entity.getLocation(), to);
-+ this.d.world.getServer().getPluginManager().callEvent(event);
++ this.b.world.getServer().getPluginManager().callEvent(event);
+ if (event.isCancelled()) {
+ return;
+ }
+ to = event.getTo();
+
-+ this.d.setPositionRotation(to.getX(), to.getY(), to.getZ(), to.getYaw(), to.getPitch());
++ this.b.setPositionRotation(to.getX(), to.getY(), to.getZ(), to.getYaw(), to.getPitch());
+ // CraftBukkit end
- this.g.p();
+ this.e.r();
return;
}
diff --git a/nms-patches/PathfinderGoalHorseTrap.patch b/nms-patches/PathfinderGoalHorseTrap.patch
index 0aa10ae0..47730fe0 100644
--- a/nms-patches/PathfinderGoalHorseTrap.patch
+++ b/nms-patches/PathfinderGoalHorseTrap.patch
@@ -18,7 +18,7 @@
}
@@ -42,7 +43,7 @@
- entityhorseskeleton.cW();
+ entityhorseskeleton.di();
entityhorseskeleton.setTamed(true);
entityhorseskeleton.setAgeRaw(0);
- entityhorseskeleton.world.addEntity(entityhorseskeleton);
diff --git a/nms-patches/PathfinderGoalHurtByTarget.patch b/nms-patches/PathfinderGoalHurtByTarget.patch
index bd1581bb..37d9cc80 100644
--- a/nms-patches/PathfinderGoalHurtByTarget.patch
+++ b/nms-patches/PathfinderGoalHurtByTarget.patch
@@ -7,7 +7,7 @@
- this.e.setGoalTarget(this.e.getLastDamager());
+ this.e.setGoalTarget(this.e.getLastDamager(), org.bukkit.event.entity.EntityTargetEvent.TargetReason.TARGET_ATTACKED_ENTITY, true); // CraftBukkit - reason
this.g = this.e.getGoalTarget();
- this.b = this.e.bT();
+ this.b = this.e.cf();
this.h = 300;
@@ -66,6 +66,6 @@
}
diff --git a/nms-patches/PathfinderGoalMakeLove.patch b/nms-patches/PathfinderGoalMakeLove.patch
index d7269cd0..4ef924b9 100644
--- a/nms-patches/PathfinderGoalMakeLove.patch
+++ b/nms-patches/PathfinderGoalMakeLove.patch
@@ -3,21 +3,21 @@
@@ -80,6 +80,11 @@
private void i() {
- EntityVillager entityvillager = this.b.b((EntityAgeable) this.c);
+ EntityVillager entityvillager = this.a.b((EntityAgeable) this.b);
+ // CraftBukkit start - call EntityBreedEvent
-+ if (org.bukkit.craftbukkit.event.CraftEventFactory.callEntityBreedEvent(entityvillager, this.b, this.c, null, null, 0).isCancelled()) {
++ if (org.bukkit.craftbukkit.event.CraftEventFactory.callEntityBreedEvent(entityvillager, this.a, this.b, null, null, 0).isCancelled()) {
+ return;
+ }
+ // CraftBukkit end
- this.c.setAgeRaw(6000);
this.b.setAgeRaw(6000);
+ this.a.setAgeRaw(6000);
@@ -87,7 +92,7 @@
- this.b.s(false);
+ this.a.v(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);
+ entityvillager.setPositionRotation(this.a.locX, this.a.locY, this.a.locZ, 0.0F, 0.0F);
+- this.c.addEntity(entityvillager);
++ this.c.addEntity(entityvillager, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.BREEDING); // CraftBukkit - added SpawnReason
+ this.c.broadcastEntityEffect(entityvillager, (byte) 12);
}
}
diff --git a/nms-patches/PathfinderGoalNearestAttackableTarget.patch b/nms-patches/PathfinderGoalNearestAttackableTarget.patch
index d1ceb69a..7ca3e982 100644
--- a/nms-patches/PathfinderGoalNearestAttackableTarget.patch
+++ b/nms-patches/PathfinderGoalNearestAttackableTarget.patch
@@ -1,15 +1,6 @@
--- a/net/minecraft/server/PathfinderGoalNearestAttackableTarget.java
+++ b/net/minecraft/server/PathfinderGoalNearestAttackableTarget.java
-@@ -35,7 +35,7 @@
- }
-
- public boolean apply(@Nullable Object object) {
-- return this.a((EntityLiving) object);
-+ return this.a((T) object); // CraftBukkit - fix decompile error
- }
- };
- }
-@@ -50,11 +50,11 @@
+@@ -44,11 +44,11 @@
return false;
} else {
Collections.sort(list, this.b);
@@ -23,7 +14,7 @@
@Nullable
public Double a(@Nullable EntityHuman entityhuman) {
ItemStack itemstack = entityhuman.getEquipment(EnumItemSlot.HEAD);
-@@ -74,10 +74,10 @@
+@@ -57,10 +57,10 @@
}
@Nullable
@@ -36,7 +27,7 @@
return this.d != null;
}
}
-@@ -87,7 +87,7 @@
+@@ -70,7 +70,7 @@
}
public void c() {
@@ -45,7 +36,7 @@
super.c();
}
-@@ -106,7 +106,7 @@
+@@ -89,7 +89,7 @@
return d0 < d1 ? -1 : (d0 > d1 ? 1 : 0);
}
diff --git a/nms-patches/PathfinderGoalNearestAttackableTargetInsentient.patch b/nms-patches/PathfinderGoalNearestAttackableTargetInsentient.patch
index 9dad5d79..dcb68d54 100644
--- a/nms-patches/PathfinderGoalNearestAttackableTargetInsentient.patch
+++ b/nms-patches/PathfinderGoalNearestAttackableTargetInsentient.patch
@@ -1,6 +1,6 @@
--- a/net/minecraft/server/PathfinderGoalNearestAttackableTargetInsentient.java
+++ b/net/minecraft/server/PathfinderGoalNearestAttackableTargetInsentient.java
-@@ -69,7 +69,7 @@
+@@ -62,7 +62,7 @@
}
public void c() {
diff --git a/nms-patches/PathfinderGoalPanic.patch b/nms-patches/PathfinderGoalPanic.patch
index f5990487..f7030cd7 100644
--- a/nms-patches/PathfinderGoalPanic.patch
+++ b/nms-patches/PathfinderGoalPanic.patch
@@ -10,6 +10,6 @@
+ return false;
+ }
+ // CraftBukkit end
- return !this.a.getNavigation().o();
+ return !this.a.getNavigation().q();
}
diff --git a/nms-patches/PathfinderGoalSit.patch b/nms-patches/PathfinderGoalSit.patch
index 80597cfe..403a27af 100644
--- a/nms-patches/PathfinderGoalSit.patch
+++ b/nms-patches/PathfinderGoalSit.patch
@@ -6,6 +6,6 @@
if (!this.entity.isTamed()) {
- return false;
+ return this.willSit && this.entity.getGoalTarget() == null; // CraftBukkit - Allow sitting for wild animals
- } else if (this.entity.isInWater()) {
+ } else if (this.entity.aq()) {
return false;
} else if (!this.entity.onGround) {
diff --git a/nms-patches/PathfinderGoalTargetNearestPlayer.patch b/nms-patches/PathfinderGoalTargetNearestPlayer.patch
index 0b3f5342..560d9330 100644
--- a/nms-patches/PathfinderGoalTargetNearestPlayer.patch
+++ b/nms-patches/PathfinderGoalTargetNearestPlayer.patch
@@ -1,6 +1,6 @@
--- a/net/minecraft/server/PathfinderGoalTargetNearestPlayer.java
+++ b/net/minecraft/server/PathfinderGoalTargetNearestPlayer.java
-@@ -92,7 +92,7 @@
+@@ -85,7 +85,7 @@
}
public void c() {
diff --git a/nms-patches/PathfinderGoalTempt.patch b/nms-patches/PathfinderGoalTempt.patch
index ec9ecd26..06dfabbc 100644
--- a/nms-patches/PathfinderGoalTempt.patch
+++ b/nms-patches/PathfinderGoalTempt.patch
@@ -1,19 +1,19 @@
--- a/net/minecraft/server/PathfinderGoalTempt.java
+++ b/net/minecraft/server/PathfinderGoalTempt.java
-@@ -2,6 +2,12 @@
+@@ -1,5 +1,12 @@
+ package net.minecraft.server;
- import com.google.common.collect.Sets;
- import java.util.Set;
+// CraftBukkit start
+import org.bukkit.craftbukkit.entity.CraftLivingEntity;
+import org.bukkit.craftbukkit.event.CraftEventFactory;
+import org.bukkit.event.entity.EntityTargetEvent;
+import org.bukkit.event.entity.EntityTargetLivingEntityEvent;
+// CraftBukkit end
-
++
public class PathfinderGoalTempt extends PathfinderGoal {
-@@ -12,7 +18,7 @@
+ private final EntityCreature a;
+@@ -9,7 +16,7 @@
private double e;
private double f;
private double g;
@@ -21,8 +21,8 @@
+ private EntityLiving target; // CraftBukkit
private int i;
private boolean j;
- private final Set<Item> k;
-@@ -39,7 +45,17 @@
+ private final RecipeItemStack k;
+@@ -36,7 +43,17 @@
return false;
} else {
this.target = this.a.world.findNearbyPlayer(this.a, 10.0D);
diff --git a/nms-patches/PathfinderGoalVillagerFarm.patch b/nms-patches/PathfinderGoalVillagerFarm.patch
index 2600cea0..19116f1a 100644
--- a/nms-patches/PathfinderGoalVillagerFarm.patch
+++ b/nms-patches/PathfinderGoalVillagerFarm.patch
@@ -3,15 +3,15 @@
@@ -40,7 +40,11 @@
Block block = iblockdata.getBlock();
- if (this.f == 0 && block instanceof BlockCrops && ((BlockCrops) block).z(iblockdata)) {
+ if (this.i == 0 && block instanceof BlockCrops && ((BlockCrops) block).w(iblockdata)) {
- world.setAir(blockposition, true);
+ // CraftBukkit start
-+ if (!org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(this.c, blockposition, Blocks.AIR, 0).isCancelled()) {
++ if (!org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(this.f, blockposition, Blocks.AIR.getBlockData()).isCancelled()) {
+ world.setAir(blockposition, true);
+ }
+ // CraftBukkit end
- } else if (this.f == 1 && iblockdata.getMaterial() == Material.AIR) {
- InventorySubcontainer inventorysubcontainer = this.c.dq();
+ } else if (this.i == 1 && iblockdata.isAir()) {
+ InventorySubcontainer inventorysubcontainer = this.f.dD();
@@ -49,19 +53,28 @@
boolean flag = false;
@@ -32,12 +32,12 @@
+ planted = Blocks.CARROTS;
flag = true;
} else if (itemstack.getItem() == Items.BEETROOT_SEEDS) {
-- world.setTypeAndData(blockposition, Blocks.BEETROOT.getBlockData(), 3);
-+ planted = Blocks.BEETROOT;
+- world.setTypeAndData(blockposition, Blocks.BEETROOTS.getBlockData(), 3);
++ planted = Blocks.BEETROOTS;
flag = true;
}
+
-+ if (planted != null && !org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(this.c, blockposition, planted, 0).isCancelled()) {
++ if (planted != null && !org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(this.f, blockposition, planted.getBlockData()).isCancelled()) {
+ world.setTypeAndData(blockposition, planted.getBlockData(), 3);
+ } else {
+ flag = false;
diff --git a/nms-patches/PlayerChunk.patch b/nms-patches/PlayerChunk.patch
index 2dc88641..e9e5e79c 100644
--- a/nms-patches/PlayerChunk.patch
+++ b/nms-patches/PlayerChunk.patch
@@ -1,6 +1,6 @@
--- a/net/minecraft/server/PlayerChunk.java
+++ b/net/minecraft/server/PlayerChunk.java
-@@ -8,32 +8,48 @@
+@@ -7,21 +7,36 @@
import javax.annotation.Nullable;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
@@ -25,6 +25,8 @@
private boolean done;
+ // CraftBukkit start - add fields
++ // You know the drill, https://hub.spigotmc.org/stash/projects/SPIGOT/repos/craftbukkit/browse
++ // All may seem good at first, but there's deeper issues if you play for a bit
+ private boolean loadInProgress = false;
+ private Runnable loadedRunnable = new Runnable() {
+ public void run() {
@@ -37,71 +39,3 @@
public PlayerChunk(PlayerChunkMap playerchunkmap, int i, int j) {
this.playerChunkMap = playerchunkmap;
this.location = new ChunkCoordIntPair(i, j);
-- this.chunk = playerchunkmap.getWorld().getChunkProviderServer().getOrLoadChunkAt(i, j);
-+ // CraftBukkit start
-+ loadInProgress = true;
-+ this.chunk = playerchunkmap.getWorld().getChunkProviderServer().getChunkAt(i, j, loadedRunnable, false);
-+ // CraftBukkit end
- }
-
- public ChunkCoordIntPair a() {
- return this.location;
- }
-
-- public void a(EntityPlayer entityplayer) {
-+ public void a(final EntityPlayer entityplayer) { // CraftBukkit - added final to argument
- if (this.c.contains(entityplayer)) {
- PlayerChunk.a.debug("Failed to add player. {} already is in chunk {}, {}", entityplayer, Integer.valueOf(this.location.x), Integer.valueOf(this.location.z));
- } else {
-@@ -42,15 +58,32 @@
- }
-
- this.c.add(entityplayer);
-+ // CraftBukkit start - use async chunk io
-+ // if (this.done) {
-+ // this.sendChunk(entityplayer);
-+ // }
- if (this.done) {
- this.sendChunk(entityplayer);
- }
-+ // CraftBukkit end
-
- }
- }
-
- public void b(EntityPlayer entityplayer) {
- if (this.c.contains(entityplayer)) {
-+ // CraftBukkit start - If we haven't loaded yet don't load the chunk just so we can clean it up
-+ if (!this.done) {
-+ this.c.remove(entityplayer);
-+
-+ if (this.c.isEmpty()) {
-+ ChunkIOExecutor.dropQueuedChunkLoad(this.playerChunkMap.getWorld(), this.location.x, this.location.z, this.loadedRunnable);
-+ this.playerChunkMap.b(this);
-+ }
-+
-+ return;
-+ }
-+ // CraftBukkit end
- if (this.done) {
- entityplayer.playerConnection.sendPacket(new PacketPlayOutUnloadChunk(this.location.x, this.location.z));
- }
-@@ -67,11 +100,18 @@
- if (this.chunk != null) {
- return true;
- } else {
-+ /* CraftBukkit start
- if (flag) {
- this.chunk = this.playerChunkMap.getWorld().getChunkProviderServer().getChunkAt(this.location.x, this.location.z);
- } else {
- this.chunk = this.playerChunkMap.getWorld().getChunkProviderServer().getOrLoadChunkAt(this.location.x, this.location.z);
- }
-+ */
-+ if (!loadInProgress) {
-+ loadInProgress = true;
-+ this.chunk = playerChunkMap.getWorld().getChunkProviderServer().getChunkAt(this.location.x, this.location.z, loadedRunnable, flag);
-+ }
-+ // CraftBukkit end
-
- return this.chunk != null;
- }
diff --git a/nms-patches/PlayerChunkMap.patch b/nms-patches/PlayerChunkMap.patch
index 37c4c474..40a1805e 100644
--- a/nms-patches/PlayerChunkMap.patch
+++ b/nms-patches/PlayerChunkMap.patch
@@ -1,7 +1,7 @@
--- a/net/minecraft/server/PlayerChunkMap.java
+++ b/net/minecraft/server/PlayerChunkMap.java
@@ -15,6 +15,10 @@
- import java.util.Set;
+ import java.util.function.Predicate;
import javax.annotation.Nullable;
+// CraftBukkit start
@@ -10,8 +10,8 @@
+
public class PlayerChunkMap {
- private static final Predicate<EntityPlayer> a = new Predicate() {
-@@ -46,6 +50,7 @@
+ private static final Predicate<EntityPlayer> a = (entityplayer) -> {
+@@ -34,6 +38,7 @@
private long k;
private boolean l = true;
private boolean m = true;
@@ -19,7 +19,30 @@
public PlayerChunkMap(WorldServer worldserver) {
this.world = worldserver;
-@@ -169,7 +174,11 @@
+@@ -107,16 +112,18 @@
+
+ if (this.l && i % 4L == 0L) {
+ this.l = false;
+- Collections.sort(this.h, (playerchunk, playerchunk1) -> {
+- return ComparisonChain.start().compare(playerchunk.g(), playerchunk1.g()).result();
++ // CraftBukkit start
++ Collections.sort(this.h, (playerchunkx, playerchunk1x) -> {
++ return ComparisonChain.start().compare(playerchunkx.g(), playerchunk1x.g()).result();
+ });
+ }
+
+ if (this.m && i % 4L == 2L) {
+ this.m = false;
+- Collections.sort(this.g, (playerchunk, playerchunk1) -> {
+- return ComparisonChain.start().compare(playerchunk.g(), playerchunk1.g()).result();
++ Collections.sort(this.g, (playerchunkx, playerchunk1x) -> {
++ return ComparisonChain.start().compare(playerchunkx.g(), playerchunk1x.g()).result();
+ });
++ // CraftBukkit end
+ }
+
+ if (!this.h.isEmpty()) {
+@@ -141,7 +148,11 @@
break;
}
}
@@ -31,7 +54,7 @@
}
}
-@@ -231,6 +240,16 @@
+@@ -203,6 +214,16 @@
return playerchunk;
}
@@ -48,7 +71,7 @@
public void flagDirty(BlockPosition blockposition) {
int i = blockposition.getX() >> 4;
int j = blockposition.getZ() >> 4;
-@@ -249,12 +268,22 @@
+@@ -221,12 +242,22 @@
entityplayer.d = entityplayer.locX;
entityplayer.e = entityplayer.locZ;
@@ -72,7 +95,7 @@
this.managedPlayers.add(entityplayer);
this.e();
}
-@@ -298,11 +327,14 @@
+@@ -270,11 +301,14 @@
int j1 = i - k;
int k1 = j - l;
@@ -88,7 +111,7 @@
}
if (!this.a(l1 - j1, i2 - k1, i, j, i1)) {
-@@ -318,6 +350,13 @@
+@@ -290,6 +324,13 @@
entityplayer.d = entityplayer.locX;
entityplayer.e = entityplayer.locZ;
this.e();
@@ -102,7 +125,7 @@
}
}
}
-@@ -402,4 +441,47 @@
+@@ -374,4 +415,47 @@
}
}
diff --git a/nms-patches/PlayerConnection.patch b/nms-patches/PlayerConnection.patch
index e67b4538..f5611f32 100644
--- a/nms-patches/PlayerConnection.patch
+++ b/nms-patches/PlayerConnection.patch
@@ -1,6 +1,6 @@
--- a/net/minecraft/server/PlayerConnection.java
+++ b/net/minecraft/server/PlayerConnection.java
-@@ -15,6 +15,49 @@
+@@ -15,6 +15,50 @@
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
@@ -14,6 +14,7 @@
+import org.bukkit.craftbukkit.inventory.CraftInventoryView;
+import org.bukkit.craftbukkit.inventory.CraftItemStack;
+import org.bukkit.craftbukkit.util.CraftChatMessage;
++import org.bukkit.craftbukkit.util.CraftMagicNumbers;
+import org.bukkit.craftbukkit.util.LazyPlayerSet;
+import org.bukkit.craftbukkit.util.Waitable;
+import org.bukkit.entity.Player;
@@ -50,7 +51,7 @@
public class PlayerConnection implements PacketListenerPlayIn, ITickable {
private static final Logger LOGGER = LogManager.getLogger();
-@@ -25,7 +68,10 @@
+@@ -25,7 +69,10 @@
private long f;
private boolean g;
private long h;
@@ -62,7 +63,7 @@
private int j;
private final IntHashMap<Short> k = new IntHashMap();
private double l;
-@@ -58,7 +104,34 @@
+@@ -57,7 +104,33 @@
networkmanager.setPacketListener(this);
this.player = entityplayer;
entityplayer.playerConnection = this;
@@ -92,24 +93,23 @@
+ 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, 55, 59, 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 e() {
+ public void X_() {
this.syncPosition();
-@@ -104,7 +177,7 @@
+@@ -103,7 +176,7 @@
this.minecraftServer.methodProfiler.a("keepAlive");
- long i = this.d();
+ long i = SystemUtils.b();
- if (i - this.f >= 15000L) {
+ if (i - this.f >= 25000L) { // CraftBukkit
if (this.g) {
this.disconnect(new ChatMessage("disconnect.timeout", new Object[0]));
} else {
-@@ -116,15 +189,21 @@
+@@ -115,15 +188,21 @@
}
- this.minecraftServer.methodProfiler.b();
+ this.minecraftServer.methodProfiler.e();
+ // CraftBukkit start
+ for (int spam; (spam = this.chatThrottle) > 0 && !chatSpamField.compareAndSet(this, spam, spam - 1); ) ;
+ /* Use thread-safe field access instead
@@ -123,22 +123,18 @@
--this.j;
}
- if (this.player.J() > 0L && this.minecraftServer.getIdleTimeout() > 0 && MinecraftServer.aw() - this.player.J() > (long) (this.minecraftServer.getIdleTimeout() * 1000 * 60)) {
+ if (this.player.F() > 0L && this.minecraftServer.getIdleTimeout() > 0 && SystemUtils.b() - this.player.F() > (long) (this.minecraftServer.getIdleTimeout() * 1000 * 60)) {
+ this.player.resetIdleTimer(); // CraftBukkit - SPIGOT-854
this.disconnect(new ChatMessage("multiplayer.disconnect.idling", new Object[0]));
}
-@@ -143,18 +222,48 @@
+@@ -142,16 +221,46 @@
return this.networkManager;
}
-- public void disconnect(final IChatBaseComponent ichatbasecomponent) {
-- this.networkManager.sendPacket(new PacketPlayOutKickDisconnect(ichatbasecomponent), new GenericFutureListener() {
-- public void operationComplete(Future<? super Void> future) throws Exception {
-- PlayerConnection.this.networkManager.close(ichatbasecomponent);
+ // CraftBukkit start
+ @Deprecated
-+ public void disconnect(IChatBaseComponent ichatbasecomponent) {
+ public void disconnect(IChatBaseComponent ichatbasecomponent) {
+ disconnect(CraftChatMessage.fromComponent(ichatbasecomponent, EnumChatFormat.WHITE));
+ }
+ // CraftBukkit end
@@ -163,31 +159,28 @@
+ // Send the possibly modified leave message
+ s = event.getReason();
+ // CraftBukkit end
-+ final ChatComponentText chatcomponenttext = new ChatComponentText(s);
++ final ChatComponentText ichatbasecomponent = new ChatComponentText(s);
+
-+ this.networkManager.sendPacket(new PacketPlayOutKickDisconnect(chatcomponenttext), new GenericFutureListener() {
-+ public void operationComplete(Future future) throws Exception { // CraftBukkit - decompile error
-+ PlayerConnection.this.networkManager.close(chatcomponenttext);
- }
- }, new GenericFutureListener[0]);
-+ this.a(chatcomponenttext); // CraftBukkit - fire quit instantly
+ this.networkManager.sendPacket(new PacketPlayOutKickDisconnect(ichatbasecomponent), (future) -> {
+ this.networkManager.close(ichatbasecomponent);
+ });
++ this.a(ichatbasecomponent); // CraftBukkit - fire quit instantly
this.networkManager.stopReading();
-- Futures.getUnchecked(this.minecraftServer.postToMainThread(new Runnable() {
+ MinecraftServer minecraftserver = this.minecraftServer;
+ NetworkManager networkmanager = this.networkManager;
+
+ this.networkManager.getClass();
+- Futures.getUnchecked(minecraftserver.postToMainThread(networkmanager::handleDisconnection));
+ // CraftBukkit - Don't wait
-+ this.minecraftServer.postToMainThread(new Runnable() {
- public void run() {
- PlayerConnection.this.networkManager.handleDisconnection();
- }
-- }));
-+ });
++ minecraftserver.postToMainThread(networkmanager::handleDisconnection);
}
public void a(PacketPlayInSteerVehicle packetplayinsteervehicle) {
-@@ -193,7 +302,34 @@
+@@ -190,7 +299,34 @@
double d9 = entity.motX * entity.motX + entity.motY * entity.motY + entity.motZ * entity.motZ;
double d10 = d6 * d6 + d7 * d7 + d8 * d8;
-- if (d10 - d9 > 100.0D && (!this.minecraftServer.R() || !this.minecraftServer.Q().equals(entity.getName()))) {
+- if (d10 - d9 > 100.0D && (!this.minecraftServer.J() || !this.minecraftServer.I().equals(entity.getDisplayName().getString()))) {
+
+ // CraftBukkit start - handle custom speeds and skipped ticks
+ this.allowedPlayerTicks += (System.currentTimeMillis() / 50) - this.lastTick;
@@ -206,7 +199,7 @@
+ } else {
+ allowedPlayerTicks = 20;
+ }
-+ float speed;
++ double speed;
+ if (player.abilities.isFlying) {
+ speed = player.abilities.flySpeed * 20f;
+ } else {
@@ -214,12 +207,12 @@
+ }
+ speed *= 2f; // TODO: Get the speed of the vehicle instead of the player
+
-+ if (d10 - d9 > Math.max(100.0D, Math.pow((double) (10.0F * (float) i * speed), 2)) && (!this.minecraftServer.R() || !this.minecraftServer.Q().equals(entity.getName()))) {
++ if (d10 - d9 > Math.max(100.0D, Math.pow((double) (10.0F * (float) i * speed), 2)) && (!this.minecraftServer.J() || !this.minecraftServer.I().equals(entity.getDisplayName().getString()))) {
+ // CraftBukkit end
- PlayerConnection.LOGGER.warn("{} (vehicle of {}) moved too quickly! {},{},{}", entity.getName(), this.player.getName(), Double.valueOf(d6), Double.valueOf(d7), Double.valueOf(d8));
+ PlayerConnection.LOGGER.warn("{} (vehicle of {}) moved too quickly! {},{},{}", entity.getDisplayName().getString(), this.player.getDisplayName().getString(), Double.valueOf(d6), Double.valueOf(d7), Double.valueOf(d8));
this.networkManager.sendPacket(new PacketPlayOutVehicleMove(entity));
return;
-@@ -231,6 +367,62 @@
+@@ -228,6 +364,62 @@
return;
}
@@ -281,17 +274,62 @@
+
this.minecraftServer.getPlayerList().d(this.player);
this.player.checkMovement(this.player.locX - d0, this.player.locY - d1, this.player.locZ - d2);
- this.D = d11 >= -0.03125D && !this.minecraftServer.getAllowFlight() && !worldserver.c(entity.getBoundingBox().g(0.0625D).b(0.0D, -0.55D, 0.0D));
-@@ -244,7 +436,7 @@
+ this.D = d11 >= -0.03125D && !this.minecraftServer.getAllowFlight() && !worldserver.a(entity.getBoundingBox().g(0.0625D).b(0.0D, -0.55D, 0.0D));
+@@ -241,7 +433,7 @@
public void a(PacketPlayInTeleportAccept packetplayinteleportaccept) {
- PlayerConnectionUtils.ensureMainThread(packetplayinteleportaccept, this, this.player.x());
-- if (packetplayinteleportaccept.a() == this.teleportAwait) {
-+ if (packetplayinteleportaccept.a() == this.teleportAwait && this.teleportPos != null) { // CraftBukkit
+ PlayerConnectionUtils.ensureMainThread(packetplayinteleportaccept, this, this.player.getWorldServer());
+- if (packetplayinteleportaccept.b() == this.teleportAwait) {
++ if (packetplayinteleportaccept.b() == this.teleportAwait && this.teleportPos != null) { // CraftBukkit
this.player.setLocation(this.teleportPos.x, this.teleportPos.y, this.teleportPos.z, this.player.yaw, this.player.pitch);
- if (this.player.L()) {
+ if (this.player.H()) {
this.o = this.teleportPos.x;
-@@ -289,7 +481,7 @@
+@@ -287,10 +479,16 @@
+
+ public void a(PacketPlayInTabComplete packetplayintabcomplete) {
+ PlayerConnectionUtils.ensureMainThread(packetplayintabcomplete, this, this.player.getWorldServer());
++ // CraftBukkit start
++ if (chatSpamField.addAndGet(this, 5) > 500 && !this.minecraftServer.getPlayerList().isOp(this.player.getProfile())) {
++ this.disconnect(new ChatMessage("disconnect.spam", new Object[0]));
++ return;
++ }
++ // CraftBukkit end
+ ParseResults parseresults = this.minecraftServer.getCommandDispatcher().a().parse(packetplayintabcomplete.c(), this.player.getCommandListener());
+
+ this.minecraftServer.getCommandDispatcher().a().getCompletionSuggestions(parseresults).thenAccept((suggestions) -> {
+- this.networkManager.sendPacket(new PacketPlayOutTabComplete(packetplayintabcomplete.b(), suggestions));
++ this.networkManager.sendPacket(new PacketPlayOutTabComplete(packetplayintabcomplete.b(), (Suggestions) suggestions)); // CraftBukkit - decompile error
+ });
+ }
+
+@@ -484,6 +682,14 @@
+ }
+
+ public void a(PacketPlayInBEdit packetplayinbedit) {
++ // CraftBukkit start
++ PlayerConnectionUtils.ensureMainThread(packetplayinbedit, this, this.player.getWorldServer());
++ if (this.lastBookTick + 20 > MinecraftServer.currentTick) {
++ this.disconnect("Book edited too quickly!");
++ return;
++ }
++ this.lastBookTick = MinecraftServer.currentTick;
++ // CraftBukkit end
+ ItemStack itemstack = packetplayinbedit.b();
+
+ if (!itemstack.isEmpty()) {
+@@ -508,9 +714,10 @@
+ }
+
+ itemstack2.a("pages", (NBTBase) nbttaglist);
+- this.player.setSlot(EnumItemSlot.MAINHAND, itemstack2);
++ CraftEventFactory.handleEditBookEvent(player, itemstack2); // CraftBukkit
+ } else {
+ itemstack1.a("pages", (NBTBase) itemstack.getTag().getList("pages", 8));
++ CraftEventFactory.handleEditBookEvent(player, itemstack1); // CraftBukkit
+ }
+ }
+
+@@ -550,7 +757,7 @@
} else {
WorldServer worldserver = this.minecraftServer.getWorldServer(this.player.dimension);
@@ -300,7 +338,7 @@
if (this.e == 0) {
this.syncPosition();
}
-@@ -299,13 +491,21 @@
+@@ -560,13 +767,21 @@
this.A = this.e;
this.a(this.teleportPos.x, this.teleportPos.y, this.teleportPos.z, this.player.yaw, this.player.pitch);
}
@@ -323,7 +361,7 @@
double d0 = this.player.locX;
double d1 = this.player.locY;
double d2 = this.player.locZ;
-@@ -330,15 +530,33 @@
+@@ -591,15 +806,33 @@
++this.receivedMovePackets;
int i = this.receivedMovePackets - this.processedMovePackets;
@@ -334,7 +372,7 @@
+ this.lastTick = (int) (System.currentTimeMillis() / 50);
+
+ if (i > Math.max(this.allowedPlayerTicks, 5)) {
- PlayerConnection.LOGGER.debug("{} is sending move packets too frequently ({} packets since last tick)", this.player.getName(), Integer.valueOf(i));
+ PlayerConnection.LOGGER.debug("{} is sending move packets too frequently ({} packets since last tick)", this.player.getDisplayName().getString(), Integer.valueOf(i));
i = 1;
}
@@ -343,23 +381,23 @@
+ } else {
+ allowedPlayerTicks = 20;
+ }
-+ float speed;
++ double speed;
+ if (player.abilities.isFlying) {
+ speed = player.abilities.flySpeed * 20f;
+ } else {
+ speed = player.abilities.walkSpeed * 10f;
+ }
+
- if (!this.player.L() && (!this.player.x().getGameRules().getBoolean("disableElytraMovementCheck") || !this.player.cP())) {
- float f2 = this.player.cP() ? 300.0F : 100.0F;
+ if (!this.player.H() && (!this.player.getWorldServer().getGameRules().getBoolean("disableElytraMovementCheck") || !this.player.db())) {
+ float f2 = this.player.db() ? 300.0F : 100.0F;
-- if (d11 - d10 > (double) (f2 * (float) i) && (!this.minecraftServer.R() || !this.minecraftServer.Q().equals(this.player.getName()))) {
-+ if (d11 - d10 > Math.max(f2, Math.pow((double) (10.0F * (float) i * speed), 2)) && (!this.minecraftServer.R() || !this.minecraftServer.Q().equals(this.player.getName()))) {
+- if (d11 - d10 > (double) (f2 * (float) i) && (!this.minecraftServer.J() || !this.minecraftServer.I().equals(this.player.getProfile().getName()))) {
++ if (d11 - d10 > Math.max(f2, Math.pow((double) (10.0F * (float) i * speed), 2)) && (!this.minecraftServer.J() || !this.minecraftServer.I().equals(this.player.getProfile().getName()))) {
+ // CraftBukkit end
- PlayerConnection.LOGGER.warn("{} moved too quickly! {},{},{}", this.player.getName(), Double.valueOf(d7), Double.valueOf(d8), Double.valueOf(d9));
+ PlayerConnection.LOGGER.warn("{} moved too quickly! {},{},{}", this.player.getDisplayName().getString(), Double.valueOf(d7), Double.valueOf(d8), Double.valueOf(d9));
this.a(this.player.locX, this.player.locY, this.player.locZ, this.player.yaw, this.player.pitch);
return;
-@@ -384,6 +602,69 @@
+@@ -645,6 +878,69 @@
}
}
@@ -428,8 +466,8 @@
+
this.B = d12 >= -0.03125D;
this.B &= !this.minecraftServer.getAllowFlight() && !this.player.abilities.canFly;
- this.B &= !this.player.hasEffect(MobEffects.LEVITATION) && !this.player.cP() && !worldserver.c(this.player.getBoundingBox().g(0.0625D).b(0.0D, -0.55D, 0.0D));
-@@ -401,10 +682,76 @@
+ this.B &= !this.player.hasEffect(MobEffects.LEVITATION) && !this.player.db() && !worldserver.a(this.player.getBoundingBox().g(0.0625D).b(0.0D, -0.55D, 0.0D));
+@@ -662,10 +958,76 @@
}
public void a(double d0, double d1, double d2, float f, float f1) {
@@ -507,8 +545,8 @@
double d3 = set.contains(PacketPlayOutPosition.EnumPlayerTeleportFlags.X) ? this.player.locX : 0.0D;
double d4 = set.contains(PacketPlayOutPosition.EnumPlayerTeleportFlags.Y) ? this.player.locY : 0.0D;
double d5 = set.contains(PacketPlayOutPosition.EnumPlayerTeleportFlags.Z) ? this.player.locZ : 0.0D;
-@@ -421,6 +768,14 @@
- f3 = f1 + this.player.pitch;
+@@ -677,6 +1039,14 @@
+ this.teleportAwait = 0;
}
+ // CraftBukkit start - update last location
@@ -519,35 +557,45 @@
+ this.lastPitch = f3;
+ // CraftBukkit end
+
- if (++this.teleportAwait == Integer.MAX_VALUE) {
- this.teleportAwait = 0;
- }
-@@ -432,6 +787,7 @@
+ this.A = this.e;
+ this.player.setLocation(d0, d1, d2, f, f1);
+ this.player.playerConnection.sendPacket(new PacketPlayOutPosition(d0 - d3, d1 - d4, d2 - d5, f - f2, f1 - f3, set, this.teleportAwait));
+@@ -684,6 +1054,7 @@
public void a(PacketPlayInBlockDig packetplayinblockdig) {
- PlayerConnectionUtils.ensureMainThread(packetplayinblockdig, this, this.player.x());
+ PlayerConnectionUtils.ensureMainThread(packetplayinblockdig, this, this.player.getWorldServer());
+ if (this.player.isFrozen()) return; // CraftBukkit
WorldServer worldserver = this.minecraftServer.getWorldServer(this.player.dimension);
- BlockPosition blockposition = packetplayinblockdig.a();
+ BlockPosition blockposition = packetplayinblockdig.b();
-@@ -441,7 +797,15 @@
+@@ -693,14 +1064,46 @@
if (!this.player.isSpectator()) {
ItemStack itemstack = this.player.b(EnumHand.OFF_HAND);
- this.player.a(EnumHand.OFF_HAND, this.player.b(EnumHand.MAIN_HAND));
-+ // CraftBukkit start
-+ PlayerSwapHandItemsEvent swapItemsEvent = new PlayerSwapHandItemsEvent(getPlayer(), CraftItemStack.asBukkitCopy(itemstack), CraftItemStack.asBukkitCopy(this.player.b(EnumHand.MAIN_HAND)));
+- this.player.a(EnumHand.MAIN_HAND, itemstack);
++ // CraftBukkit start - inspiration taken from DispenserRegistry (See SpigotCraft#394)
++ CraftItemStack mainHand = CraftItemStack.asCraftMirror(itemstack);
++ CraftItemStack offHand = CraftItemStack.asCraftMirror(this.player.b(EnumHand.MAIN_HAND));
++ PlayerSwapHandItemsEvent swapItemsEvent = new PlayerSwapHandItemsEvent(getPlayer(), mainHand.clone(), offHand.clone());
+ this.server.getPluginManager().callEvent(swapItemsEvent);
+ if (swapItemsEvent.isCancelled()) {
+ return;
+ }
-+ itemstack = CraftItemStack.asNMSCopy(swapItemsEvent.getMainHandItem());
-+ this.player.a(EnumHand.OFF_HAND, CraftItemStack.asNMSCopy(swapItemsEvent.getOffHandItem()));
++ if (swapItemsEvent.getOffHandItem().equals(offHand)) {
++ this.player.a(EnumHand.OFF_HAND, this.player.b(EnumHand.MAIN_HAND));
++ } else {
++ this.player.a(EnumHand.OFF_HAND, CraftItemStack.asNMSCopy(swapItemsEvent.getOffHandItem()));
++ }
++ if (swapItemsEvent.getMainHandItem().equals(mainHand)) {
++ this.player.a(EnumHand.MAIN_HAND, itemstack);
++ } else {
++ this.player.a(EnumHand.MAIN_HAND, CraftItemStack.asNMSCopy(swapItemsEvent.getMainHandItem()));
++ }
+ // CraftBukkit end
- this.player.a(EnumHand.MAIN_HAND, itemstack);
}
-@@ -449,6 +813,21 @@
+ return;
case DROP_ITEM:
if (!this.player.isSpectator()) {
@@ -569,12 +617,12 @@
this.player.a(false);
}
-@@ -482,7 +861,15 @@
+@@ -734,7 +1137,15 @@
if (!this.minecraftServer.a(worldserver, blockposition, this.player) && worldserver.getWorldBorder().a(blockposition)) {
- this.player.playerInteractManager.a(blockposition, packetplayinblockdig.b());
+ this.player.playerInteractManager.a(blockposition, packetplayinblockdig.c());
} else {
+ // CraftBukkit start - fire PlayerInteractEvent
-+ CraftEventFactory.callPlayerInteractEvent(this.player, Action.LEFT_CLICK_BLOCK, blockposition, packetplayinblockdig.b(), this.player.inventory.getItemInHand(), EnumHand.MAIN_HAND);
++ CraftEventFactory.callPlayerInteractEvent(this.player, Action.LEFT_CLICK_BLOCK, blockposition, packetplayinblockdig.c(), this.player.inventory.getItemInHand(), EnumHand.MAIN_HAND);
this.player.playerConnection.sendPacket(new PacketPlayOutBlockChange(worldserver, blockposition));
+ // Update any tile entity data for this block
+ TileEntity tileentity = worldserver.getTileEntity(blockposition);
@@ -584,8 +632,8 @@
+ // CraftBukkit end
}
} else {
- if (packetplayinblockdig.c() == PacketPlayInBlockDig.EnumPlayerDigType.STOP_DESTROY_BLOCK) {
-@@ -502,10 +889,12 @@
+ if (packetplayinblockdig.d() == PacketPlayInBlockDig.EnumPlayerDigType.STOP_DESTROY_BLOCK) {
+@@ -754,10 +1165,12 @@
default:
throw new IllegalArgumentException("Invalid player action");
}
@@ -593,14 +641,14 @@
}
public void a(PacketPlayInUseItem packetplayinuseitem) {
- PlayerConnectionUtils.ensureMainThread(packetplayinuseitem, this, this.player.x());
+ PlayerConnectionUtils.ensureMainThread(packetplayinuseitem, this, this.player.getWorldServer());
+ if (this.player.isFrozen()) return; // CraftBukkit
WorldServer worldserver = this.minecraftServer.getWorldServer(this.player.dimension);
- EnumHand enumhand = packetplayinuseitem.c();
+ EnumHand enumhand = packetplayinuseitem.d();
ItemStack itemstack = this.player.b(enumhand);
-@@ -519,6 +908,13 @@
- chatmessage.getChatModifier().setColor(EnumChatFormat.RED);
- this.player.playerConnection.sendPacket(new PacketPlayOutChat(chatmessage, ChatMessageType.GAME_INFO));
+@@ -770,6 +1183,13 @@
+
+ this.player.playerConnection.sendPacket(new PacketPlayOutChat(ichatbasecomponent, ChatMessageType.GAME_INFO));
} else if (this.teleportPos == null && this.player.d((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.getWorldBorder().a(blockposition)) {
+ // CraftBukkit start - Check if we can actually do something over this large a distance
+ Location eyeLoc = this.getPlayer().getEyeLocation();
@@ -609,16 +657,16 @@
+ return;
+ }
+ // CraftBukkit end
- this.player.playerInteractManager.a(this.player, worldserver, itemstack, enumhand, blockposition, enumdirection, packetplayinuseitem.d(), packetplayinuseitem.e(), packetplayinuseitem.f());
+ this.player.playerInteractManager.a(this.player, worldserver, itemstack, enumhand, blockposition, enumdirection, packetplayinuseitem.e(), packetplayinuseitem.f(), packetplayinuseitem.g());
}
-@@ -528,13 +924,52 @@
+@@ -779,13 +1199,52 @@
public void a(PacketPlayInBlockPlace packetplayinblockplace) {
- PlayerConnectionUtils.ensureMainThread(packetplayinblockplace, this, this.player.x());
+ PlayerConnectionUtils.ensureMainThread(packetplayinblockplace, this, this.player.getWorldServer());
+ if (this.player.isFrozen()) return; // CraftBukkit
WorldServer worldserver = this.minecraftServer.getWorldServer(this.player.dimension);
- EnumHand enumhand = packetplayinblockplace.a();
+ EnumHand enumhand = packetplayinblockplace.b();
ItemStack itemstack = this.player.b(enumhand);
this.player.resetIdleTimer();
@@ -641,7 +689,7 @@
+ float f8 = f3 * f5;
+ double d3 = player.playerInteractManager.getGameMode()== EnumGamemode.CREATIVE ? 5.0D : 4.5D;
+ Vec3D vec3d1 = vec3d.add((double) f7 * d3, (double) f6 * d3, (double) f8 * d3);
-+ MovingObjectPosition movingobjectposition = this.player.world.rayTrace(vec3d, vec3d1, false);
++ MovingObjectPosition movingobjectposition = this.player.world.rayTrace(vec3d, vec3d1);
+
+ boolean cancelled;
+ if (movingobjectposition == null || movingobjectposition.type != MovingObjectPosition.EnumMovingObjectType.BLOCK) {
@@ -666,7 +714,7 @@
}
}
-@@ -545,8 +980,8 @@
+@@ -796,8 +1255,8 @@
WorldServer[] aworldserver = this.minecraftServer.worldServer;
int i = aworldserver.length;
@@ -677,38 +725,16 @@
if (worldserver != null) {
entity = packetplayinspectate.a(worldserver);
-@@ -559,6 +994,8 @@
+@@ -808,7 +1267,7 @@
+ }
+
if (entity != null) {
- this.player.setSpectatorTarget(this.player);
- this.player.stopRiding();
-+
-+ /* CraftBukkit start - replace with bukkit handling for multi-world
- if (entity.world == this.player.world) {
- this.player.enderTeleportTo(entity.locX, entity.locY, entity.locZ);
- } else {
-@@ -584,12 +1021,20 @@
- this.minecraftServer.getPlayerList().b(this.player, worldserver2);
- this.minecraftServer.getPlayerList().updateClient(this.player);
- }
-+ */
-+ this.player.getBukkitEntity().teleport(entity.getBukkitEntity(), PlayerTeleportEvent.TeleportCause.SPECTATE);
-+ // CraftBukkit end
+- this.player.a((WorldServer) entity.world, entity.locX, entity.locY, entity.locZ, entity.yaw, entity.pitch);
++ this.player.a((WorldServer) entity.world, entity.locX, entity.locY, entity.locZ, entity.yaw, entity.pitch, org.bukkit.event.player.PlayerTeleportEvent.TeleportCause.SPECTATE); // CraftBukkit
}
}
- }
-
-- public void a(PacketPlayInResourcePackStatus packetplayinresourcepackstatus) {}
-+ // CraftBukkit start
-+ public void a(PacketPlayInResourcePackStatus packetplayinresourcepackstatus) {
-+ PlayerConnectionUtils.ensureMainThread(packetplayinresourcepackstatus, this, this.player.x());
-+ this.server.getPluginManager().callEvent(new PlayerResourcePackStatusEvent(getPlayer(), PlayerResourcePackStatusEvent.Status.values()[packetplayinresourcepackstatus.status.ordinal()]));
-+ }
-+ // CraftBukkit end
-
- public void a(PacketPlayInBoatMove packetplayinboatmove) {
- PlayerConnectionUtils.ensureMainThread(packetplayinboatmove, this, this.player.x());
-@@ -602,14 +1047,29 @@
+@@ -827,11 +1286,26 @@
}
public void a(IChatBaseComponent ichatbasecomponent) {
@@ -719,27 +745,24 @@
+ this.processedDisconnect = true;
+ }
+ // CraftBukkit end
- PlayerConnection.LOGGER.info("{} lost connection: {}", this.player.getName(), ichatbasecomponent.toPlainText());
+ PlayerConnection.LOGGER.info("{} lost connection: {}", this.player.getDisplayName().getString(), ichatbasecomponent.getString());
+ // CraftBukkit start - Replace vanilla quit message handling with our own.
+ /*
- this.minecraftServer.aD();
- ChatMessage chatmessage = new ChatMessage("multiplayer.player.left", new Object[] { this.player.getScoreboardDisplayName()});
-
- chatmessage.getChatModifier().setColor(EnumChatFormat.YELLOW);
- this.minecraftServer.getPlayerList().sendMessage(chatmessage);
+ this.minecraftServer.av();
+ this.minecraftServer.getPlayerList().sendMessage((new ChatMessage("multiplayer.player.left", new Object[] { this.player.getScoreboardDisplayName()})).a(EnumChatFormat.YELLOW));
+ */
+
- this.player.s();
+ this.player.n();
- 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.R() && this.player.getName().equals(this.minecraftServer.Q())) {
+ if (this.minecraftServer.J() && this.player.getDisplayName().getString().equals(this.minecraftServer.I())) {
PlayerConnection.LOGGER.info("Stopping singleplayer server as player logged out");
this.minecraftServer.safeShutdown();
-@@ -631,6 +1091,15 @@
+@@ -857,6 +1331,15 @@
}
}
@@ -753,15 +776,15 @@
+ // CraftBukkit end
+
try {
- this.networkManager.sendPacket(packet);
+ this.networkManager.sendPacket(packet, genericfuturelistener);
} catch (Throwable throwable) {
-@@ -652,17 +1121,37 @@
+@@ -872,17 +1355,37 @@
public void a(PacketPlayInHeldItemSlot packetplayinhelditemslot) {
- PlayerConnectionUtils.ensureMainThread(packetplayinhelditemslot, this, this.player.x());
+ PlayerConnectionUtils.ensureMainThread(packetplayinhelditemslot, this, this.player.getWorldServer());
+ if (this.player.isFrozen()) return; // CraftBukkit
- if (packetplayinhelditemslot.a() >= 0 && packetplayinhelditemslot.a() < PlayerInventory.getHotbarSize()) {
-+ PlayerItemHeldEvent event = new PlayerItemHeldEvent(this.getPlayer(), this.player.inventory.itemInHandIndex, packetplayinhelditemslot.a());
+ if (packetplayinhelditemslot.b() >= 0 && packetplayinhelditemslot.b() < PlayerInventory.getHotbarSize()) {
++ PlayerItemHeldEvent event = new PlayerItemHeldEvent(this.getPlayer(), this.player.inventory.itemInHandIndex, packetplayinhelditemslot.b());
+ this.server.getPluginManager().callEvent(event);
+ if (event.isCancelled()) {
+ this.sendPacket(new PacketPlayOutHeldItemSlot(this.player.inventory.itemInHandIndex));
@@ -769,16 +792,16 @@
+ return;
+ }
+ // CraftBukkit end
- this.player.inventory.itemInHandIndex = packetplayinhelditemslot.a();
+ this.player.inventory.itemInHandIndex = packetplayinhelditemslot.b();
this.player.resetIdleTimer();
} else {
- PlayerConnection.LOGGER.warn("{} tried to set an invalid carried item", this.player.getName());
+ PlayerConnection.LOGGER.warn("{} tried to set an invalid carried item", this.player.getDisplayName().getString());
+ this.disconnect("Nope!"); // CraftBukkit
}
}
public void a(PacketPlayInChat packetplayinchat) {
-- PlayerConnectionUtils.ensureMainThread(packetplayinchat, this, this.player.x());
+- PlayerConnectionUtils.ensureMainThread(packetplayinchat, this, this.player.getWorldServer());
- if (this.player.getChatFlags() == EntityHuman.EnumChatVisibility.HIDDEN) {
+ // CraftBukkit start - async chat
+ // SPIGOT-3638
@@ -786,16 +809,16 @@
+ return;
+ }
+
-+ boolean isSync = packetplayinchat.a().startsWith("/");
-+ if (packetplayinchat.a().startsWith("/")) {
-+ PlayerConnectionUtils.ensureMainThread(packetplayinchat, this, this.player.x());
++ boolean isSync = packetplayinchat.b().startsWith("/");
++ if (packetplayinchat.b().startsWith("/")) {
++ PlayerConnectionUtils.ensureMainThread(packetplayinchat, this, this.player.getWorldServer());
+ }
+ // CraftBukkit end
+ if (this.player.dead || this.player.getChatFlags() == EntityHuman.EnumChatVisibility.HIDDEN) { // CraftBukkit - dead men tell no tales
- ChatMessage chatmessage = new ChatMessage("chat.cannotSend", new Object[0]);
-
- chatmessage.getChatModifier().setColor(EnumChatFormat.RED);
-@@ -675,39 +1164,249 @@
+ this.sendPacket(new PacketPlayOutChat((new ChatMessage("chat.cannotSend", new Object[0])).a(EnumChatFormat.RED)));
+ } else {
+ this.player.resetIdleTimer();
+@@ -892,39 +1395,249 @@
for (int i = 0; i < s.length(); ++i) {
if (!SharedConstants.isAllowedChatCharacter(s.charAt(i))) {
@@ -850,9 +873,9 @@
+ 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});
+ ChatMessage chatmessage = new ChatMessage("chat.type.text", new Object[] { this.player.getScoreboardDisplayName(), s});
- this.minecraftServer.getPlayerList().sendMessage(chatmessage1, false);
+ this.minecraftServer.getPlayerList().sendMessage(chatmessage, false);
}
- this.chatThrottle += 20;
@@ -963,8 +986,8 @@
+ // CraftBukkit end
+
private void handleCommand(String s) {
-- this.minecraftServer.getCommandHandler().a(this.player, s);
-+ // CraftBukkit start - whole method
+- this.minecraftServer.getCommandDispatcher().a(this.player.getCommandListener(), s);
++ // CraftBukkit start - whole method
+ this.LOGGER.info(this.player.getName() + " issued server command: " + s);
+
+ CraftPlayer player = this.getPlayer();
@@ -985,12 +1008,12 @@
+ java.util.logging.Logger.getLogger(PlayerConnection.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
+ return;
+ }
-+ // this.minecraftServer.getCommandHandler().a(this.player, s);
++ // this.minecraftServer.getCommandDispatcher().a(this.player.getCommandListener(), s);
+ // CraftBukkit end
}
public void a(PacketPlayInArmAnimation packetplayinarmanimation) {
- PlayerConnectionUtils.ensureMainThread(packetplayinarmanimation, this, this.player.x());
+ PlayerConnectionUtils.ensureMainThread(packetplayinarmanimation, this, this.player.getWorldServer());
+ if (this.player.isFrozen()) return; // CraftBukkit
this.player.resetIdleTimer();
+ // CraftBukkit start - Raytrace to look for 'rogue armswings'
@@ -1009,7 +1032,7 @@
+ float f8 = f3 * f5;
+ double d3 = player.playerInteractManager.getGameMode()== EnumGamemode.CREATIVE ? 5.0D : 4.5D;
+ Vec3D vec3d1 = vec3d.add((double) f7 * d3, (double) f6 * d3, (double) f8 * d3);
-+ MovingObjectPosition movingobjectposition = this.player.world.rayTrace(vec3d, vec3d1, false);
++ MovingObjectPosition movingobjectposition = this.player.world.rayTrace(vec3d, vec3d1);
+
+ if (movingobjectposition == null || movingobjectposition.type != MovingObjectPosition.EnumMovingObjectType.BLOCK) {
+ CraftEventFactory.callPlayerInteractEvent(this.player, Action.LEFT_CLICK_AIR, this.player.inventory.getItemInHand(), EnumHand.MAIN_HAND);
@@ -1021,17 +1044,17 @@
+
+ if (event.isCancelled()) return;
+ // CraftBukkit end
- this.player.a(packetplayinarmanimation.a());
+ this.player.a(packetplayinarmanimation.b());
}
public void a(PacketPlayInEntityAction packetplayinentityaction) {
- PlayerConnectionUtils.ensureMainThread(packetplayinentityaction, this, this.player.x());
+ PlayerConnectionUtils.ensureMainThread(packetplayinentityaction, this, this.player.getWorldServer());
+ // CraftBukkit start
+ if (this.player.dead) return;
-+ switch (packetplayinentityaction.b()) {
++ switch (packetplayinentityaction.c()) {
+ case START_SNEAKING:
+ case STOP_SNEAKING:
-+ PlayerToggleSneakEvent event = new PlayerToggleSneakEvent(this.getPlayer(), packetplayinentityaction.b() == PacketPlayInEntityAction.EnumPlayerAction.START_SNEAKING);
++ PlayerToggleSneakEvent event = new PlayerToggleSneakEvent(this.getPlayer(), packetplayinentityaction.c() == PacketPlayInEntityAction.EnumPlayerAction.START_SNEAKING);
+ this.server.getPluginManager().callEvent(event);
+
+ if (event.isCancelled()) {
@@ -1040,7 +1063,7 @@
+ break;
+ case START_SPRINTING:
+ case STOP_SPRINTING:
-+ PlayerToggleSprintEvent e2 = new PlayerToggleSprintEvent(this.getPlayer(), packetplayinentityaction.b() == PacketPlayInEntityAction.EnumPlayerAction.START_SPRINTING);
++ PlayerToggleSprintEvent e2 = new PlayerToggleSprintEvent(this.getPlayer(), packetplayinentityaction.c() == PacketPlayInEntityAction.EnumPlayerAction.START_SPRINTING);
+ this.server.getPluginManager().callEvent(e2);
+
+ if (e2.isCancelled()) {
@@ -1052,31 +1075,31 @@
this.player.resetIdleTimer();
IJumpable ijumpable;
-@@ -779,6 +1478,7 @@
+@@ -996,6 +1709,7 @@
public void a(PacketPlayInUseEntity packetplayinuseentity) {
- PlayerConnectionUtils.ensureMainThread(packetplayinuseentity, this, this.player.x());
+ PlayerConnectionUtils.ensureMainThread(packetplayinuseentity, this, this.player.getWorldServer());
+ if (this.player.isFrozen()) return; // CraftBukkit
WorldServer worldserver = this.minecraftServer.getWorldServer(this.player.dimension);
Entity entity = packetplayinuseentity.a((World) worldserver);
-@@ -794,20 +1494,68 @@
+@@ -1011,20 +1725,68 @@
if (this.player.h(entity) < d0) {
EnumHand enumhand;
-+ ItemStack itemInHand = this.player.b(packetplayinuseentity.b() == null ? EnumHand.MAIN_HAND : packetplayinuseentity.b()); // CraftBukkit
++ ItemStack itemInHand = this.player.b(packetplayinuseentity.c() == null ? EnumHand.MAIN_HAND : packetplayinuseentity.c()); // CraftBukkit
+
-+ if (packetplayinuseentity.a() == PacketPlayInUseEntity.EnumEntityUseAction.INTERACT
-+ || packetplayinuseentity.a() == PacketPlayInUseEntity.EnumEntityUseAction.INTERACT_AT) {
++ if (packetplayinuseentity.b() == PacketPlayInUseEntity.EnumEntityUseAction.INTERACT
++ || packetplayinuseentity.b() == PacketPlayInUseEntity.EnumEntityUseAction.INTERACT_AT) {
+ // CraftBukkit start
+ boolean triggerLeashUpdate = itemInHand != null && itemInHand.getItem() == Items.LEAD && entity instanceof EntityInsentient;
+ Item origItem = this.player.inventory.getItemInHand() == null ? null : this.player.inventory.getItemInHand().getItem();
+ PlayerInteractEntityEvent event;
-+ if (packetplayinuseentity.a() == PacketPlayInUseEntity.EnumEntityUseAction.INTERACT) {
-+ event = new PlayerInteractEntityEvent((Player) this.getPlayer(), entity.getBukkitEntity(), (packetplayinuseentity.b() == EnumHand.OFF_HAND) ? EquipmentSlot.OFF_HAND : EquipmentSlot.HAND);
++ if (packetplayinuseentity.b() == PacketPlayInUseEntity.EnumEntityUseAction.INTERACT) {
++ event = new PlayerInteractEntityEvent((Player) this.getPlayer(), entity.getBukkitEntity(), (packetplayinuseentity.c() == EnumHand.OFF_HAND) ? EquipmentSlot.OFF_HAND : EquipmentSlot.HAND);
+ } else {
-+ Vec3D target = packetplayinuseentity.c();
-+ event = new PlayerInteractAtEntityEvent((Player) this.getPlayer(), entity.getBukkitEntity(), new org.bukkit.util.Vector(target.x, target.y, target.z), (packetplayinuseentity.b() == EnumHand.OFF_HAND) ? EquipmentSlot.OFF_HAND : EquipmentSlot.HAND);
++ Vec3D target = packetplayinuseentity.d();
++ event = new PlayerInteractAtEntityEvent((Player) this.getPlayer(), entity.getBukkitEntity(), new org.bukkit.util.Vector(target.x, target.y, target.z), (packetplayinuseentity.c() == EnumHand.OFF_HAND) ? EquipmentSlot.OFF_HAND : EquipmentSlot.HAND);
+ }
+ this.server.getPluginManager().callEvent(event);
+
@@ -1096,27 +1119,27 @@
+ // CraftBukkit end
+ }
+
- if (packetplayinuseentity.a() == PacketPlayInUseEntity.EnumEntityUseAction.INTERACT) {
- enumhand = packetplayinuseentity.b();
+ if (packetplayinuseentity.b() == PacketPlayInUseEntity.EnumEntityUseAction.INTERACT) {
+ enumhand = packetplayinuseentity.c();
this.player.a(entity, enumhand);
+ // CraftBukkit start
+ if (!itemInHand.isEmpty() && itemInHand.getCount() <= -1) {
+ this.player.updateInventory(this.player.activeContainer);
+ }
+ // CraftBukkit end
- } else if (packetplayinuseentity.a() == PacketPlayInUseEntity.EnumEntityUseAction.INTERACT_AT) {
- enumhand = packetplayinuseentity.b();
- entity.a(this.player, packetplayinuseentity.c(), enumhand);
+ } else if (packetplayinuseentity.b() == PacketPlayInUseEntity.EnumEntityUseAction.INTERACT_AT) {
+ enumhand = packetplayinuseentity.c();
+ entity.a(this.player, packetplayinuseentity.d(), enumhand);
+ // CraftBukkit start
+ if (!itemInHand.isEmpty() && itemInHand.getCount() <= -1) {
+ this.player.updateInventory(this.player.activeContainer);
+ }
+ // CraftBukkit end
- } else if (packetplayinuseentity.a() == PacketPlayInUseEntity.EnumEntityUseAction.ATTACK) {
+ } else if (packetplayinuseentity.b() == PacketPlayInUseEntity.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.isSpectator())) { // CraftBukkit
this.disconnect(new ChatMessage("multiplayer.disconnect.invalid_entity_attacked", new Object[0]));
- this.minecraftServer.warning("Player " + this.player.getName() + " tried to attack an invalid entity");
+ this.minecraftServer.warning("Player " + this.player.getDisplayName().getString() + " tried to attack an invalid entity");
return;
}
@@ -1130,49 +1153,49 @@
}
}
}
-@@ -823,7 +1571,8 @@
+@@ -1040,7 +1802,8 @@
case PERFORM_RESPAWN:
if (this.player.viewingCredits) {
this.player.viewingCredits = false;
- 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
- CriterionTriggers.u.a(this.player, DimensionManager.THE_END, DimensionManager.OVERWORLD);
+ CriterionTriggers.v.a(this.player, DimensionManager.THE_END, DimensionManager.OVERWORLD);
} else {
if (this.player.getHealth() > 0.0F) {
-@@ -846,14 +1595,20 @@
+@@ -1063,14 +1826,20 @@
public void a(PacketPlayInCloseWindow packetplayinclosewindow) {
- PlayerConnectionUtils.ensureMainThread(packetplayinclosewindow, this, this.player.x());
+ PlayerConnectionUtils.ensureMainThread(packetplayinclosewindow, this, this.player.getWorldServer());
+
+ if (this.player.isFrozen()) return; // CraftBukkit
+ CraftEventFactory.handleInventoryCloseEvent(this.player); // CraftBukkit
+
- this.player.r();
+ this.player.m();
}
public void a(PacketPlayInWindowClick packetplayinwindowclick) {
- PlayerConnectionUtils.ensureMainThread(packetplayinwindowclick, this, this.player.x());
+ PlayerConnectionUtils.ensureMainThread(packetplayinwindowclick, this, this.player.getWorldServer());
+ if (this.player.isFrozen()) return; // CraftBukkit
this.player.resetIdleTimer();
-- if (this.player.activeContainer.windowId == packetplayinwindowclick.a() && this.player.activeContainer.c(this.player)) {
+- if (this.player.activeContainer.windowId == packetplayinwindowclick.b() && this.player.activeContainer.c(this.player)) {
- if (this.player.isSpectator()) {
-+ if (this.player.activeContainer.windowId == packetplayinwindowclick.a() && this.player.activeContainer.c(this.player) && this.player.activeContainer.canUse(this.player)) { // CraftBukkit
++ if (this.player.activeContainer.windowId == packetplayinwindowclick.b() && this.player.activeContainer.c(this.player) && this.player.activeContainer.canUse(this.player)) { // CraftBukkit
+ boolean cancelled = this.player.isSpectator(); // CraftBukkit - see below if
+ if (false/*this.player.isSpectator()*/) { // CraftBukkit
NonNullList nonnulllist = NonNullList.a();
for (int i = 0; i < this.player.activeContainer.slots.size(); ++i) {
-@@ -862,8 +1617,274 @@
+@@ -1079,8 +1848,274 @@
this.player.a(this.player.activeContainer, nonnulllist);
} else {
-- ItemStack itemstack = this.player.activeContainer.a(packetplayinwindowclick.b(), packetplayinwindowclick.c(), packetplayinwindowclick.f(), this.player);
+- ItemStack itemstack = this.player.activeContainer.a(packetplayinwindowclick.c(), packetplayinwindowclick.d(), packetplayinwindowclick.g(), this.player);
+ // CraftBukkit start - Call InventoryClickEvent
-+ if (packetplayinwindowclick.b() < -1 && packetplayinwindowclick.b() != -999) {
++ if (packetplayinwindowclick.c() < -1 && packetplayinwindowclick.c() != -999) {
+ return;
+ }
-+
+
+ InventoryView inventory = this.player.activeContainer.getBukkitView();
+ SlotType type = CraftInventoryView.getSlotType(inventory, packetplayinwindowclick.b());
+
@@ -1182,36 +1205,36 @@
+
+ ItemStack itemstack = ItemStack.a;
+
-+ switch (packetplayinwindowclick.f()) {
++ switch (packetplayinwindowclick.g()) {
+ case PICKUP:
-+ if (packetplayinwindowclick.c() == 0) {
++ if (packetplayinwindowclick.d() == 0) {
+ click = ClickType.LEFT;
-+ } else if (packetplayinwindowclick.c() == 1) {
++ } else if (packetplayinwindowclick.d() == 1) {
+ click = ClickType.RIGHT;
+ }
-+ if (packetplayinwindowclick.c() == 0 || packetplayinwindowclick.c() == 1) {
++ if (packetplayinwindowclick.d() == 0 || packetplayinwindowclick.d() == 1) {
+ action = InventoryAction.NOTHING; // Don't want to repeat ourselves
-+ if (packetplayinwindowclick.b() == -999) {
++ if (packetplayinwindowclick.c() == -999) {
+ if (!player.inventory.getCarried().isEmpty()) {
-+ action = packetplayinwindowclick.c() == 0 ? InventoryAction.DROP_ALL_CURSOR : InventoryAction.DROP_ONE_CURSOR;
++ action = packetplayinwindowclick.d() == 0 ? InventoryAction.DROP_ALL_CURSOR : InventoryAction.DROP_ONE_CURSOR;
+ }
-+ } else if (packetplayinwindowclick.b() < 0) {
++ } else if (packetplayinwindowclick.c() < 0) {
+ action = InventoryAction.NOTHING;
+ } else {
-+ Slot slot = this.player.activeContainer.getSlot(packetplayinwindowclick.b());
++ Slot slot = this.player.activeContainer.getSlot(packetplayinwindowclick.c());
+ if (slot != null) {
+ ItemStack clickedItem = slot.getItem();
+ ItemStack cursor = player.inventory.getCarried();
+ if (clickedItem.isEmpty()) {
+ if (!cursor.isEmpty()) {
-+ action = packetplayinwindowclick.c() == 0 ? InventoryAction.PLACE_ALL : InventoryAction.PLACE_ONE;
++ action = packetplayinwindowclick.d() == 0 ? InventoryAction.PLACE_ALL : InventoryAction.PLACE_ONE;
+ }
+ } else if (slot.isAllowed(player)) {
+ if (cursor.isEmpty()) {
-+ action = packetplayinwindowclick.c() == 0 ? InventoryAction.PICKUP_ALL : InventoryAction.PICKUP_HALF;
++ action = packetplayinwindowclick.d() == 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.getCount() : 1;
++ int toPlace = packetplayinwindowclick.d() == 0 ? cursor.getCount() : 1;
+ toPlace = Math.min(toPlace, clickedItem.getMaxStackSize() - clickedItem.getCount());
+ toPlace = Math.min(toPlace, slot.inventory.getMaxStackSize() - clickedItem.getCount());
+ if (toPlace == 1) {
@@ -1226,7 +1249,7 @@
+ } else if (cursor.getCount() <= slot.getMaxStackSize()) {
+ action = InventoryAction.SWAP_WITH_CURSOR;
+ }
-+ } else if (cursor.getItem() == clickedItem.getItem() && (!cursor.usesData() || cursor.getData() == clickedItem.getData()) && ItemStack.equals(cursor, clickedItem)) {
++ } else if (cursor.getItem() == clickedItem.getItem() && ItemStack.equals(cursor, clickedItem)) {
+ if (clickedItem.getCount() >= 0) {
+ if (clickedItem.getCount() + cursor.getCount() <= cursor.getMaxStackSize()) {
+ // As of 1.5, this is result slots only
@@ -1241,16 +1264,16 @@
+ break;
+ // TODO check on updates
+ case QUICK_MOVE:
-+ if (packetplayinwindowclick.c() == 0) {
++ if (packetplayinwindowclick.d() == 0) {
+ click = ClickType.SHIFT_LEFT;
-+ } else if (packetplayinwindowclick.c() == 1) {
++ } else if (packetplayinwindowclick.d() == 1) {
+ click = ClickType.SHIFT_RIGHT;
+ }
-+ if (packetplayinwindowclick.c() == 0 || packetplayinwindowclick.c() == 1) {
-+ if (packetplayinwindowclick.b() < 0) {
++ if (packetplayinwindowclick.d() == 0 || packetplayinwindowclick.d() == 1) {
++ if (packetplayinwindowclick.c() < 0) {
+ action = InventoryAction.NOTHING;
+ } else {
-+ Slot slot = this.player.activeContainer.getSlot(packetplayinwindowclick.b());
++ Slot slot = this.player.activeContainer.getSlot(packetplayinwindowclick.c());
+ if (slot != null && slot.isAllowed(this.player) && slot.hasItem()) {
+ action = InventoryAction.MOVE_TO_OTHER_INVENTORY;
+ } else {
@@ -1260,11 +1283,11 @@
+ }
+ break;
+ case SWAP:
-+ if (packetplayinwindowclick.c() >= 0 && packetplayinwindowclick.c() < 9) {
++ if (packetplayinwindowclick.d() >= 0 && packetplayinwindowclick.d() < 9) {
+ click = ClickType.NUMBER_KEY;
-+ Slot clickedSlot = this.player.activeContainer.getSlot(packetplayinwindowclick.b());
++ Slot clickedSlot = this.player.activeContainer.getSlot(packetplayinwindowclick.c());
+ if (clickedSlot.isAllowed(player)) {
-+ ItemStack hotbar = this.player.inventory.getItem(packetplayinwindowclick.c());
++ ItemStack hotbar = this.player.inventory.getItem(packetplayinwindowclick.d());
+ boolean canCleanSwap = hotbar.isEmpty() || (clickedSlot.inventory == player.inventory && clickedSlot.isAllowed(hotbar)); // the slot will accept the hotbar item
+ if (clickedSlot.hasItem()) {
+ if (canCleanSwap) {
@@ -1283,12 +1306,12 @@
+ }
+ break;
+ case CLONE:
-+ if (packetplayinwindowclick.c() == 2) {
++ if (packetplayinwindowclick.d() == 2) {
+ click = ClickType.MIDDLE;
-+ if (packetplayinwindowclick.b() == -999) {
++ if (packetplayinwindowclick.c() == -999) {
+ action = InventoryAction.NOTHING;
+ } else {
-+ Slot slot = this.player.activeContainer.getSlot(packetplayinwindowclick.b());
++ Slot slot = this.player.activeContainer.getSlot(packetplayinwindowclick.c());
+ if (slot != null && slot.hasItem() && player.abilities.canInstantlyBuild && player.inventory.getCarried().isEmpty()) {
+ action = InventoryAction.CLONE_STACK;
+ } else {
@@ -1301,18 +1324,18 @@
+ }
+ break;
+ case THROW:
-+ if (packetplayinwindowclick.b() >= 0) {
-+ if (packetplayinwindowclick.c() == 0) {
++ if (packetplayinwindowclick.c() >= 0) {
++ if (packetplayinwindowclick.d() == 0) {
+ click = ClickType.DROP;
-+ Slot slot = this.player.activeContainer.getSlot(packetplayinwindowclick.b());
++ Slot slot = this.player.activeContainer.getSlot(packetplayinwindowclick.c());
+ if (slot != null && slot.hasItem() && slot.isAllowed(player) && !slot.getItem().isEmpty() && slot.getItem().getItem() != Item.getItemOf(Blocks.AIR)) {
+ action = InventoryAction.DROP_ONE_SLOT;
+ } else {
+ action = InventoryAction.NOTHING;
+ }
-+ } else if (packetplayinwindowclick.c() == 1) {
++ } else if (packetplayinwindowclick.d() == 1) {
+ click = ClickType.CONTROL_DROP;
-+ Slot slot = this.player.activeContainer.getSlot(packetplayinwindowclick.b());
++ Slot slot = this.player.activeContainer.getSlot(packetplayinwindowclick.c());
+ if (slot != null && slot.hasItem() && slot.isAllowed(player) && !slot.getItem().isEmpty() && slot.getItem().getItem() != Item.getItemOf(Blocks.AIR)) {
+ action = InventoryAction.DROP_ALL_SLOT;
+ } else {
@@ -1322,23 +1345,23 @@
+ } else {
+ // Sane default (because this happens when they are holding nothing. Don't ask why.)
+ click = ClickType.LEFT;
-+ if (packetplayinwindowclick.c() == 1) {
++ if (packetplayinwindowclick.d() == 1) {
+ click = ClickType.RIGHT;
+ }
+ action = InventoryAction.NOTHING;
+ }
+ break;
+ case QUICK_CRAFT:
-+ itemstack = this.player.activeContainer.a(packetplayinwindowclick.b(), packetplayinwindowclick.c(), packetplayinwindowclick.f(), this.player);
++ itemstack = this.player.activeContainer.a(packetplayinwindowclick.c(), packetplayinwindowclick.d(), packetplayinwindowclick.g(), this.player);
+ break;
+ case PICKUP_ALL:
+ click = ClickType.DOUBLE_CLICK;
+ action = InventoryAction.NOTHING;
-+ if (packetplayinwindowclick.b() >= 0 && !this.player.inventory.getCarried().isEmpty()) {
++ if (packetplayinwindowclick.c() >= 0 && !this.player.inventory.getCarried().isEmpty()) {
+ 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())))) {
++ if (inventory.getTopInventory().contains(CraftMagicNumbers.getMaterial(cursor.getItem())) || inventory.getBottomInventory().contains(CraftMagicNumbers.getMaterial(cursor.getItem()))) {
+ action = InventoryAction.COLLECT_TO_CURSOR;
+ }
+ }
@@ -1346,22 +1369,22 @@
+ default:
+ break;
+ }
-
-+ if (packetplayinwindowclick.f() != InventoryClickType.QUICK_CRAFT) {
++
++ if (packetplayinwindowclick.g() != InventoryClickType.QUICK_CRAFT) {
+ if (click == ClickType.NUMBER_KEY) {
-+ event = new InventoryClickEvent(inventory, type, packetplayinwindowclick.b(), click, action, packetplayinwindowclick.c());
++ event = new InventoryClickEvent(inventory, type, packetplayinwindowclick.c(), click, action, packetplayinwindowclick.d());
+ } else {
-+ event = new InventoryClickEvent(inventory, type, packetplayinwindowclick.b(), click, action);
++ event = new InventoryClickEvent(inventory, type, packetplayinwindowclick.c(), click, action);
+ }
+
+ org.bukkit.inventory.Inventory top = inventory.getTopInventory();
-+ if (packetplayinwindowclick.b() == 0 && top instanceof CraftingInventory) {
++ if (packetplayinwindowclick.c() == 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());
++ event = new CraftItemEvent(recipe, inventory, type, packetplayinwindowclick.c(), click, action, packetplayinwindowclick.d());
+ } else {
-+ event = new CraftItemEvent(recipe, inventory, type, packetplayinwindowclick.b(), click, action);
++ event = new CraftItemEvent(recipe, inventory, type, packetplayinwindowclick.c(), click, action);
+ }
+ }
+ }
@@ -1376,7 +1399,7 @@
+ switch (event.getResult()) {
+ case ALLOW:
+ case DEFAULT:
-+ itemstack = this.player.activeContainer.a(packetplayinwindowclick.b(), packetplayinwindowclick.c(), packetplayinwindowclick.f(), this.player);
++ itemstack = this.player.activeContainer.a(packetplayinwindowclick.c(), packetplayinwindowclick.d(), packetplayinwindowclick.g(), this.player);
+ break;
+ case DENY:
+ /* Needs enum constructor in InventoryAction
@@ -1436,25 +1459,22 @@
+ }
+ }
+ // CraftBukkit end
- if (ItemStack.matches(packetplayinwindowclick.e(), itemstack)) {
- this.player.playerConnection.sendPacket(new PacketPlayOutTransaction(packetplayinwindowclick.a(), packetplayinwindowclick.d(), true));
+ if (ItemStack.matches(packetplayinwindowclick.f(), itemstack)) {
+ this.player.playerConnection.sendPacket(new PacketPlayOutTransaction(packetplayinwindowclick.b(), packetplayinwindowclick.e(), true));
this.player.f = true;
-@@ -900,6 +1921,7 @@
+@@ -1123,6 +2158,7 @@
public void a(PacketPlayInEnchantItem packetplayinenchantitem) {
- PlayerConnectionUtils.ensureMainThread(packetplayinenchantitem, this, this.player.x());
+ PlayerConnectionUtils.ensureMainThread(packetplayinenchantitem, this, this.player.getWorldServer());
+ if (this.player.isFrozen()) return; // CraftBukkit
this.player.resetIdleTimer();
- if (this.player.activeContainer.windowId == packetplayinenchantitem.a() && this.player.activeContainer.c(this.player) && !this.player.isSpectator()) {
- this.player.activeContainer.a(this.player, packetplayinenchantitem.b());
-@@ -933,7 +1955,45 @@
- }
+ if (this.player.activeContainer.windowId == packetplayinenchantitem.b() && this.player.activeContainer.c(this.player) && !this.player.isSpectator()) {
+ this.player.activeContainer.a(this.player, packetplayinenchantitem.c());
+@@ -1154,6 +2190,43 @@
- boolean flag1 = packetplayinsetcreativeslot.a() >= 1 && packetplayinsetcreativeslot.a() <= 45;
-- boolean flag2 = itemstack.isEmpty() || itemstack.getData() >= 0 && itemstack.getCount() <= 64 && !itemstack.isEmpty();
-+ // CraftBukkit - Add invalidItems check
-+ boolean flag2 = itemstack.isEmpty() || itemstack.getData() >= 0 && itemstack.getCount() <= 64 && !itemstack.isEmpty() && !invalidItems.contains(Item.getId(itemstack.getItem()));
-+ if (flag || (flag1 && !ItemStack.matches(this.player.defaultContainer.getSlot(packetplayinsetcreativeslot.a()).getItem(), packetplayinsetcreativeslot.getItemStack()))) { // Insist on valid slot
+ boolean flag1 = packetplayinsetcreativeslot.b() >= 1 && packetplayinsetcreativeslot.b() <= 45;
+ boolean flag2 = itemstack.isEmpty() || itemstack.getDamage() >= 0 && itemstack.getCount() <= 64 && !itemstack.isEmpty();
++ if (flag || (flag1 && !ItemStack.matches(this.player.defaultContainer.getSlot(packetplayinsetcreativeslot.b()).getItem(), packetplayinsetcreativeslot.getItemStack()))) { // Insist on valid slot
+ // CraftBukkit start - Call click event
+ InventoryView inventory = this.player.defaultContainer.getBukkitView();
+ org.bukkit.inventory.ItemStack item = CraftItemStack.asBukkitCopy(packetplayinsetcreativeslot.getItemStack());
@@ -1462,14 +1482,14 @@
+ SlotType type = SlotType.QUICKBAR;
+ if (flag) {
+ type = SlotType.OUTSIDE;
-+ } else if (packetplayinsetcreativeslot.a() < 36) {
-+ if (packetplayinsetcreativeslot.a() >= 5 && packetplayinsetcreativeslot.a() < 9) {
++ } else if (packetplayinsetcreativeslot.b() < 36) {
++ if (packetplayinsetcreativeslot.b() >= 5 && packetplayinsetcreativeslot.b() < 9) {
+ type = SlotType.ARMOR;
+ } else {
+ type = SlotType.CONTAINER;
+ }
+ }
-+ InventoryCreativeEvent event = new InventoryCreativeEvent(inventory, type, flag ? -999 : packetplayinsetcreativeslot.a(), item);
++ InventoryCreativeEvent event = new InventoryCreativeEvent(inventory, type, flag ? -999 : packetplayinsetcreativeslot.b(), item);
+ server.getPluginManager().callEvent(event);
+
+ itemstack = CraftItemStack.asNMSCopy(event.getCursor());
@@ -1483,8 +1503,8 @@
+ 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()));
++ if (packetplayinsetcreativeslot.b() >= 0) {
++ this.player.playerConnection.sendPacket(new PacketPlayOutSetSlot(this.player.defaultContainer.windowId, packetplayinsetcreativeslot.b(), this.player.defaultContainer.getSlot(packetplayinsetcreativeslot.b()).getItem()));
+ this.player.playerConnection.sendPacket(new PacketPlayOutSetSlot(-1, -1, ItemStack.a));
+ }
+ return;
@@ -1494,42 +1514,42 @@
if (flag1 && flag2) {
if (itemstack.isEmpty()) {
-@@ -957,6 +2017,7 @@
+@@ -1177,6 +2250,7 @@
public void a(PacketPlayInTransaction packetplayintransaction) {
- PlayerConnectionUtils.ensureMainThread(packetplayintransaction, this, this.player.x());
+ PlayerConnectionUtils.ensureMainThread(packetplayintransaction, this, this.player.getWorldServer());
+ if (this.player.isFrozen()) return; // CraftBukkit
Short oshort = (Short) this.k.get(this.player.activeContainer.windowId);
- if (oshort != null && packetplayintransaction.b() == oshort.shortValue() && this.player.activeContainer.windowId == packetplayintransaction.a() && !this.player.activeContainer.c(this.player) && !this.player.isSpectator()) {
-@@ -967,6 +2028,7 @@
+ if (oshort != null && packetplayintransaction.c() == oshort.shortValue() && this.player.activeContainer.windowId == packetplayintransaction.b() && !this.player.activeContainer.c(this.player) && !this.player.isSpectator()) {
+@@ -1187,6 +2261,7 @@
public void a(PacketPlayInUpdateSign packetplayinupdatesign) {
- PlayerConnectionUtils.ensureMainThread(packetplayinupdatesign, this, this.player.x());
+ PlayerConnectionUtils.ensureMainThread(packetplayinupdatesign, this, this.player.getWorldServer());
+ if (this.player.isFrozen()) return; // CraftBukkit
this.player.resetIdleTimer();
WorldServer worldserver = this.minecraftServer.getWorldServer(this.player.dimension);
- BlockPosition blockposition = packetplayinupdatesign.a();
-@@ -983,14 +2045,30 @@
+ BlockPosition blockposition = packetplayinupdatesign.b();
+@@ -1203,14 +2278,30 @@
- if (!tileentitysign.a() || tileentitysign.e() != this.player) {
- this.minecraftServer.warning("Player " + this.player.getName() + " just tried to change non-editable sign");
+ if (!tileentitysign.d() || tileentitysign.e() != this.player) {
+ this.minecraftServer.warning("Player " + this.player.getDisplayName().getString() + " just tried to change non-editable sign");
+ this.sendPacket(tileentity.getUpdatePacket()); // CraftBukkit
return;
}
- String[] astring = packetplayinupdatesign.b();
+ String[] astring = packetplayinupdatesign.c();
+ // CraftBukkit start
+ Player player = this.server.getPlayer(this.player);
-+ int x = packetplayinupdatesign.a().getX();
-+ int y = packetplayinupdatesign.a().getY();
-+ int z = packetplayinupdatesign.a().getZ();
++ int x = packetplayinupdatesign.b().getX();
++ int y = packetplayinupdatesign.b().getY();
++ int z = packetplayinupdatesign.b().getZ();
+ String[] lines = new String[4];
+
for (int i = 0; i < astring.length; ++i) {
-- tileentitysign.lines[i] = new ChatComponentText(EnumChatFormat.a(astring[i]));
-+ lines[i] = EnumChatFormat.a(new ChatComponentText(EnumChatFormat.a(astring[i])).toPlainText());
+- tileentitysign.lines[i] = new ChatComponentText(EnumChatFormat.b(astring[i]));
++ lines[i] = EnumChatFormat.b(new ChatComponentText(EnumChatFormat.b(astring[i])).getString());
}
+ SignChangeEvent event = new SignChangeEvent((org.bukkit.craftbukkit.block.CraftBlock) player.getWorld().getBlockAt(x, y, z), this.server.getPlayer(this.player), lines);
+ this.server.getPluginManager().callEvent(event);
@@ -1542,18 +1562,18 @@
tileentitysign.update();
worldserver.notify(blockposition, iblockdata, iblockdata, 3);
-@@ -999,6 +2077,7 @@
+@@ -1219,6 +2310,7 @@
}
public void a(PacketPlayInKeepAlive packetplayinkeepalive) {
-+ PlayerConnectionUtils.ensureMainThread(packetplayinkeepalive, this, this.player.x()); // CraftBukkit
- if (this.g && packetplayinkeepalive.a() == this.h) {
- int i = (int) (this.d() - this.f);
++ PlayerConnectionUtils.ensureMainThread(packetplayinkeepalive, this, this.player.getWorldServer()); // CraftBukkit
+ if (this.g && packetplayinkeepalive.b() == this.h) {
+ int i = (int) (SystemUtils.b() - this.f);
-@@ -1016,11 +2095,27 @@
+@@ -1232,7 +2324,17 @@
public void a(PacketPlayInAbilities packetplayinabilities) {
- PlayerConnectionUtils.ensureMainThread(packetplayinabilities, this, this.player.x());
+ PlayerConnectionUtils.ensureMainThread(packetplayinabilities, this, this.player.getWorldServer());
- this.player.abilities.isFlying = packetplayinabilities.isFlying() && this.player.abilities.canFly;
+ // CraftBukkit start
+ if (this.player.abilities.canFly && this.player.abilities.isFlying != packetplayinabilities.isFlying()) {
@@ -1568,155 +1588,53 @@
+ // CraftBukkit end
}
- public void a(PacketPlayInTabComplete packetplayintabcomplete) {
- PlayerConnectionUtils.ensureMainThread(packetplayintabcomplete, this, this.player.x());
-+ // CraftBukkit start
-+ if (chatSpamField.addAndGet(this, 10) > 500 && !this.minecraftServer.getPlayerList().isOp(this.player.getProfile())) {
-+ this.disconnect(new ChatMessage("disconnect.spam", new Object[0]));
-+ return;
-+ }
-+ // CraftBukkit end
- ArrayList arraylist = Lists.newArrayList();
- Iterator iterator = this.minecraftServer.tabCompleteCommand(this.player, packetplayintabcomplete.a(), packetplayintabcomplete.b(), packetplayintabcomplete.c()).iterator();
-
-@@ -1046,6 +2141,13 @@
- ItemStack itemstack1;
+ public void a(PacketPlayInSettings packetplayinsettings) {
+@@ -1240,5 +2342,47 @@
+ this.player.a(packetplayinsettings);
+ }
- if ("MC|BEdit".equals(s)) {
-+ // CraftBukkit start
-+ if (this.lastBookTick + 20 > MinecraftServer.currentTick) {
-+ this.disconnect("Book edited too quickly!");
-+ return;
+- public void a(PacketPlayInCustomPayload packetplayincustompayload) {}
++ // CraftBukkit start
++ private static final MinecraftKey CUSTOM_REGISTER = new MinecraftKey("register");
++ private static final MinecraftKey CUSTOM_UNREGISTER = new MinecraftKey("unregister");
++
++ public void a(PacketPlayInCustomPayload packetplayincustompayload) {
++ PlayerConnectionUtils.ensureMainThread(packetplayincustompayload, this, this.player.getWorldServer());
++ if (packetplayincustompayload.tag.equals(CUSTOM_REGISTER)) {
++ try {
++ String channels = packetplayincustompayload.data.toString(com.google.common.base.Charsets.UTF_8);
++ for (String channel : channels.split("\0")) {
++ getPlayer().addChannel(channel);
++ }
++ } catch (Exception ex) {
++ PlayerConnection.LOGGER.error("Couldn\'t register custom payload", ex);
++ this.disconnect("Invalid payload REGISTER!");
+ }
-+ this.lastBookTick = MinecraftServer.currentTick;
-+ // CraftBukkit end
- packetdataserializer = packetplayincustompayload.b();
-
- try {
-@@ -1065,14 +2167,23 @@
-
- if (itemstack.getItem() == Items.WRITABLE_BOOK && itemstack.getItem() == itemstack1.getItem()) {
- itemstack1.a("pages", (NBTBase) itemstack.getTag().getList("pages", 8));
-+ CraftEventFactory.handleEditBookEvent(player, itemstack1); // CraftBukkit
- }
- } catch (Exception exception) {
- PlayerConnection.LOGGER.error("Couldn\'t handle book info", exception);
-+ this.disconnect("Invalid book data!"); // CraftBukkit
- }
- } else {
- String s1;
-
- if ("MC|BSign".equals(s)) {
-+ // CraftBukkit start
-+ if (this.lastBookTick + 20 > MinecraftServer.currentTick) {
-+ this.disconnect("Book edited too quickly!");
-+ return;
++ } else if (packetplayincustompayload.tag.equals(CUSTOM_UNREGISTER)) {
++ try {
++ String channels = packetplayincustompayload.data.toString(com.google.common.base.Charsets.UTF_8);
++ for (String channel : channels.split("\0")) {
++ getPlayer().removeChannel(channel);
+ }
-+ this.lastBookTick = MinecraftServer.currentTick;
-+ // CraftBukkit end
- packetdataserializer = packetplayincustompayload.b();
-
- try {
-@@ -1106,10 +2217,11 @@
- }
-
- itemstack2.a("pages", (NBTBase) nbttaglist);
-- this.player.setSlot(EnumItemSlot.MAINHAND, itemstack2);
-+ CraftEventFactory.handleEditBookEvent(player, itemstack2); // CraftBukkit
- }
- } catch (Exception exception1) {
- PlayerConnection.LOGGER.error("Couldn\'t sign book", exception1);
-+ this.disconnect("Invalid book data!"); // CraftBukkit
- }
- } else if ("MC|TrSel".equals(s)) {
- try {
-@@ -1121,6 +2233,7 @@
- }
- } catch (Exception exception2) {
- PlayerConnection.LOGGER.error("Couldn\'t select trade", exception2);
-+ this.disconnect("Invalid trade data!"); // CraftBukkit
- }
- } else {
- TileEntity tileentity;
-@@ -1170,6 +2283,7 @@
- }
- } catch (Exception exception3) {
- PlayerConnection.LOGGER.error("Couldn\'t set command block", exception3);
-+ this.disconnect("Invalid command data!"); // CraftBukkit
- }
- } else if ("MC|AutoCmd".equals(s)) {
- if (!this.minecraftServer.getEnableCommandBlock()) {
-@@ -1237,6 +2351,7 @@
- }
- } catch (Exception exception4) {
- PlayerConnection.LOGGER.error("Couldn\'t set command block", exception4);
-+ this.disconnect("Invalid command data!"); // CraftBukkit
- }
- } else {
- int k;
-@@ -1260,6 +2375,7 @@
- }
- } catch (Exception exception5) {
- PlayerConnection.LOGGER.error("Couldn\'t set beacon", exception5);
-+ this.disconnect("Invalid beacon data!"); // CraftBukkit
- }
- }
- } else if ("MC|ItemName".equals(s)) {
-@@ -1346,6 +2462,7 @@
- }
- } catch (Exception exception6) {
- PlayerConnection.LOGGER.error("Couldn\'t set structure block", exception6);
-+ this.disconnect("Invalid structure data!"); // CraftBukkit
- }
- } else if ("MC|PickItem".equals(s)) {
- packetdataserializer = packetplayincustompayload.b();
-@@ -1358,11 +2475,49 @@
- this.player.playerConnection.sendPacket(new PacketPlayOutHeldItemSlot(this.player.inventory.itemInHandIndex));
- } catch (Exception exception7) {
- PlayerConnection.LOGGER.error("Couldn\'t pick item", exception7);
-+ this.disconnect("Invalid pick item!"); // CraftBukkit
- }
- }
-+ // CraftBukkit start
-+ else if (packetplayincustompayload.a().equals("REGISTER")) {
-+ try {
-+ String channels = packetplayincustompayload.b().toString(com.google.common.base.Charsets.UTF_8);
-+ for (String channel : channels.split("\0")) {
-+ getPlayer().addChannel(channel);
-+ }
-+ } catch (Exception ex) {
-+ PlayerConnection.LOGGER.error("Couldn\'t register custom payload", ex);
-+ this.disconnect("Invalid payload REGISTER!");
-+ }
-+ } else if (packetplayincustompayload.a().equals("UNREGISTER")) {
-+ try {
-+ String channels = packetplayincustompayload.b().toString(com.google.common.base.Charsets.UTF_8);
-+ for (String channel : channels.split("\0")) {
-+ getPlayer().removeChannel(channel);
-+ }
-+ } catch (Exception ex) {
-+ PlayerConnection.LOGGER.error("Couldn\'t unregister custom payload", ex);
-+ this.disconnect("Invalid payload UNREGISTER!");
-+ }
-+ } else {
-+ try {
-+ byte[] data = new byte[packetplayincustompayload.b().readableBytes()];
-+ packetplayincustompayload.b().readBytes(data);
-+ server.getMessenger().dispatchIncomingMessage(player.getBukkitEntity(), packetplayincustompayload.a(), data);
-+ } catch (Exception ex) {
-+ PlayerConnection.LOGGER.error("Couldn\'t dispatch custom payload", ex);
-+ this.disconnect("Invalid custom payload!");
-+ }
-+ }
-+ // CraftBukkit end
- }
- }
- }
-
- }
++ } catch (Exception ex) {
++ PlayerConnection.LOGGER.error("Couldn\'t unregister custom payload", ex);
++ this.disconnect("Invalid payload UNREGISTER!");
++ }
++ } else {
++ try {
++ byte[] data = new byte[packetplayincustompayload.data.readableBytes()];
++ packetplayincustompayload.data.readBytes(data);
++ server.getMessenger().dispatchIncomingMessage(player.getBukkitEntity(), packetplayincustompayload.tag.toString(), data);
++ } catch (Exception ex) {
++ PlayerConnection.LOGGER.error("Couldn\'t dispatch custom payload", ex);
++ this.disconnect("Invalid custom payload!");
++ }
++ }
++
++ }
+
-+ // CraftBukkit start - Add "isDisconnected" method
+ public final boolean isDisconnected() {
+ return !this.player.joining && !this.networkManager.isConnected();
+ }
++ // CraftBukkit end
}
diff --git a/nms-patches/PlayerInteractManager.patch b/nms-patches/PlayerInteractManager.patch
index 319bef8d..eccbf574 100644
--- a/nms-patches/PlayerInteractManager.patch
+++ b/nms-patches/PlayerInteractManager.patch
@@ -53,7 +53,7 @@
if (this.isCreative()) {
if (!this.world.douseFire((EntityHuman) null, blockposition, enumdirection)) {
this.breakBlock(blockposition);
-@@ -123,14 +145,48 @@
+@@ -122,15 +144,49 @@
}
}
@@ -61,23 +61,24 @@
+ // this.world.douseFire((EntityHuman) null, blockposition, enumdirection); // CraftBukkit - Moved down
this.lastDigTick = this.currentTick;
float f = 1.0F;
+ IBlockData iblockdata = this.world.getType(blockposition);
-- if (iblockdata.getMaterial() != Material.AIR) {
+- if (!iblockdata.isAir()) {
+ // 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) {
++ if (data.getBlock() instanceof BlockDoor) {
+ // For some reason *BOTH* the bottom/top part have to be marked updated.
-+ boolean bottom = data.get(BlockDoor.HALF) == BlockDoor.EnumDoorHalf.LOWER;
++ boolean bottom = data.get(BlockDoor.HALF) == BlockPropertyDoubleBlockHalf.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) {
++ } else if (data.getBlock() instanceof BlockTrapdoor) {
+ ((EntityPlayer) this.player).playerConnection.sendPacket(new PacketPlayOutBlockChange(this.world, blockposition));
+ }
-+ } else if (iblockdata.getMaterial() != Material.AIR) {
- block.attack(this.world, blockposition, this.player);
- f = iblockdata.a((EntityHuman) this.player, this.player.world, blockposition);
++ } else if (!iblockdata.isAir()) {
+ iblockdata.attack(this.world, blockposition, this.player);
+ f = iblockdata.getDamage(this.player, this.player.world, blockposition);
+ // Allow fire punching to be blocked
+ this.world.douseFire((EntityHuman) null, blockposition, enumdirection);
+ }
@@ -102,9 +103,9 @@
}
+ // CraftBukkit end
- if (iblockdata.getMaterial() != Material.AIR && f >= 1.0F) {
+ if (!iblockdata.isAir() && f >= 1.0F) {
this.breakBlock(blockposition);
-@@ -148,6 +204,7 @@
+@@ -149,6 +205,7 @@
public void a(BlockPosition blockposition) {
if (blockposition.equals(this.f)) {
@@ -112,7 +113,7 @@
int i = this.currentTick - this.lastDigTick;
IBlockData iblockdata = this.world.getType(blockposition);
-@@ -165,6 +222,10 @@
+@@ -166,6 +223,10 @@
this.j = this.lastDigTick;
}
}
@@ -123,11 +124,10 @@
}
}
-@@ -188,13 +249,86 @@
- }
+@@ -190,13 +251,88 @@
public boolean breakBlock(BlockPosition blockposition) {
-- if (this.gamemode.isCreative() && !this.player.getItemInMainHand().isEmpty() && this.player.getItemInMainHand().getItem() instanceof ItemSword) {
+ IBlockData iblockdata = this.world.getType(blockposition);
+ // CraftBukkit start - fire BlockBreakEvent
+ BlockBreakEvent event = null;
+
@@ -135,7 +135,7 @@
+ org.bukkit.block.Block block = this.world.getWorld().getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ());
+
+ // Sword + Creative mode pre-cancel
-+ boolean isSwordNoBreak = this.gamemode.isCreative() && !this.player.getItemInMainHand().isEmpty() && this.player.getItemInMainHand().getItem() instanceof ItemSword;
++ boolean isSwordNoBreak = !this.player.getItemInMainHand().getItem().a(iblockdata, this.world, blockposition, (EntityHuman) this.player);
+
+ // 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!
@@ -159,13 +159,14 @@
+ if (nmsBlock != null && !event.isCancelled() && !this.isCreative() && this.player.hasBlock(nmsBlock.getBlockData())) {
+ // Copied from block.a(World world, EntityHuman entityhuman, BlockPosition blockposition, IBlockData iblockdata, @Nullable TileEntity tileentity, ItemStack itemstack)
+ // PAIL: checkme each update
-+ if (!(nmsBlock.o() && EnchantmentManager.getEnchantmentLevel(Enchantments.SILK_TOUCH, itemstack) > 0)) {
++ if (!(nmsBlock.k() && EnchantmentManager.getEnchantmentLevel(Enchantments.SILK_TOUCH, itemstack) > 0)) {
+ int bonusLevel = EnchantmentManager.getEnchantmentLevel(Enchantments.LOOT_BONUS_BLOCKS, itemstack);
+
-+ event.setExpToDrop(nmsBlock.getExpDrop(this.world, nmsData, bonusLevel));
++ event.setExpToDrop(nmsBlock.getExpDrop(nmsData, this.world, blockposition, bonusLevel));
+ }
+ }
-+
+
+- if (!this.player.getItemInMainHand().getItem().a(iblockdata, this.world, blockposition, (EntityHuman) this.player)) {
+ this.world.getServer().getPluginManager().callEvent(event);
+
+ if (event.isCancelled()) {
@@ -176,7 +177,7 @@
+ ((EntityPlayer) this.player).playerConnection.sendPacket(new PacketPlayOutBlockChange(this.world, blockposition));
+ // Send other half of the door
+ if (nmsBlock instanceof BlockDoor) {
-+ boolean bottom = nmsData.get(BlockDoor.HALF) == BlockDoor.EnumDoorHalf.LOWER;
++ boolean bottom = nmsData.get(BlockDoor.HALF) == BlockPropertyDoubleBlockHalf.LOWER;
+ ((EntityPlayer) this.player).playerConnection.sendPacket(new PacketPlayOutBlockChange(world, bottom ? blockposition.up() : blockposition.down()));
+ }
+ // Update any tile entity data for this block
@@ -187,23 +188,25 @@
+ return false;
+ }
+ }
-+ if (false && this.gamemode.isCreative() && !this.player.getItemInMainHand().isEmpty() && this.player.getItemInMainHand().getItem() instanceof ItemSword) { // CraftBukkit - false
++ // CraftBukkit end
++
++ if (false && !this.player.getItemInMainHand().getItem().a(iblockdata, this.world, blockposition, (EntityHuman) this.player)) { // CraftBukkit - false
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
++ iblockdata = this.world.getType(blockposition); // CraftBukkit - update state from plugins
++ if (iblockdata.isAir()) return false; // CraftBukkit - A plugin set block to air without cancelling
TileEntity tileentity = this.world.getTileEntity(blockposition);
Block block = iblockdata.getBlock();
+ // CraftBukkit start - Special case skulls, their item data comes from a tile entity (Also check if block should drop items)
-+ if (iblockdata.getBlock() == Blocks.SKULL && !this.isCreative() && event.isDropItems()) {
-+ iblockdata.getBlock().dropNaturally(world, blockposition, iblockdata, 1.0F, 0);
++ if (iblockdata.getBlock() instanceof BlockSkull && !this.isCreative() && event.isDropItems()) {
++ iblockdata.getBlock().dropNaturally(iblockdata, world, blockposition, 1.0F, 0);
+ return this.c(blockposition);
+ }
+
+ // And shulker boxes too for duplication on cancel reasons (Also check if block should drop items)
+ if (iblockdata.getBlock() instanceof BlockShulkerBox && event.isDropItems()) {
-+ iblockdata.getBlock().dropNaturally(world, blockposition, iblockdata, 1.0F, 0);
++ iblockdata.getBlock().dropNaturally(iblockdata, world, blockposition, 1.0F, 0);
+ return this.c(blockposition);
+ }
+ // CraftBukkit end
@@ -211,10 +214,10 @@
if ((block instanceof BlockCommand || block instanceof BlockStructure) && !this.player.isCreativeAndOp()) {
this.world.notify(blockposition, iblockdata, iblockdata, 3);
return false;
-@@ -218,7 +352,16 @@
+@@ -221,19 +357,36 @@
+ }
}
- this.world.a(this.player, 2001, blockposition, Block.getCombinedId(iblockdata));
+ // CraftBukkit start
+ world.captureDrops = new ArrayList<>();
boolean flag = this.c(blockposition);
@@ -226,30 +229,30 @@
+ world.captureDrops = null;
+ // CraftBukkit end
- if (this.isCreative()) {
- this.player.playerConnection.sendPacket(new PacketPlayOutBlockChange(this.world, blockposition));
-@@ -231,11 +374,19 @@
- itemstack1.a(this.world, iblockdata, blockposition, this.player);
- }
+ if (!this.isCreative()) {
+ ItemStack itemstack1 = this.player.getItemInMainHand();
+ boolean flag1 = this.player.hasBlock(iblockdata);
+ itemstack1.a(this.world, iblockdata, blockposition, this.player);
- if (flag && flag1) {
+ // CraftBukkit start - Check if block should drop items
+ if (flag && flag1 && event.isDropItems()) {
+ ItemStack itemstack2 = itemstack1.isEmpty() ? ItemStack.a : itemstack1.cloneItemStack();
+
iblockdata.getBlock().a(this.world, this.player, blockposition, iblockdata, tileentity, itemstack2);
}
+ // CraftBukkit end
- }
-
++ }
++
+ // CraftBukkit start - Drop event experience
+ if (flag && event != null) {
+ iblockdata.getBlock().dropExperience(this.world, blockposition, event.getExpToDrop());
-+ }
+ }
+ // CraftBukkit end
-+
+
return flag;
}
- }
-@@ -278,63 +429,90 @@
+@@ -277,11 +430,40 @@
}
}
@@ -257,116 +260,67 @@
+ public boolean interactResult = false;
+ public boolean firedInteract = false;
public EnumInteractionResult a(EntityHuman entityhuman, World world, ItemStack itemstack, EnumHand enumhand, BlockPosition blockposition, EnumDirection enumdirection, float f, float f1, float f2) {
-- if (this.gamemode == EnumGamemode.SPECTATOR) {
-- TileEntity tileentity = world.getTileEntity(blockposition);
-+ IBlockData blockdata = world.getType(blockposition);
+ IBlockData iblockdata = world.getType(blockposition);
+ EnumInteractionResult enuminteractionresult = EnumInteractionResult.FAIL;
-+ 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);
-+ }
-
-- if (tileentity instanceof ITileInventory) {
-- Block block = world.getType(blockposition).getBlock();
-- ITileInventory itileinventory = (ITileInventory) tileentity;
-+ if (entityhuman.getCooldownTracker().a(itemstack.getItem())) {
-+ cancelledBlock = true;
-+ }
++ if (iblockdata.isAir()) return enuminteractionresult;
++ boolean cancelledBlock = false;
-- if (itileinventory instanceof TileEntityChest && block instanceof BlockChest) {
-- itileinventory = ((BlockChest) block).getInventory(world, blockposition);
-- }
-+ if (itemstack.getItem() instanceof ItemBlock && !entityhuman.isCreativeAndOp()) {
-+ Block block1 = ((ItemBlock) itemstack.getItem()).getBlock();
-
-- if (itileinventory != null) {
-- entityhuman.openContainer(itileinventory);
-- return EnumInteractionResult.SUCCESS;
-+ if (block1 instanceof BlockCommand || block1 instanceof BlockStructure) {
-+ cancelledBlock = true;
- }
-- } else if (tileentity instanceof IInventory) {
-- entityhuman.openContainer((IInventory) tileentity);
-- return EnumInteractionResult.SUCCESS;
- }
-
-- return EnumInteractionResult.PASS;
-- } else {
-- if (!entityhuman.isSneaking() || entityhuman.getItemInMainHand().isEmpty() && entityhuman.getItemInOffHand().isEmpty()) {
-- IBlockData iblockdata = world.getType(blockposition);
-+ PlayerInteractEvent event = CraftEventFactory.callPlayerInteractEvent(entityhuman, Action.RIGHT_CLICK_BLOCK, blockposition, enumdirection, itemstack, cancelledBlock, enumhand);
-+ firedInteract = true;
-+ interactResult = event.useItemInHand() == Event.Result.DENY;
+ if (this.gamemode == EnumGamemode.SPECTATOR) {
+ TileEntity tileentity = world.getTileEntity(blockposition);
++ cancelledBlock = !(tileentity instanceof ITileInventory || tileentity instanceof IInventory);
++ }
+
-+ 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) == BlockDoor.EnumDoorHalf.LOWER;
-+ ((EntityPlayer) entityhuman).playerConnection.sendPacket(new PacketPlayOutBlockChange(world, bottom ? blockposition.up() : blockposition.down()));
-+ } else if (blockdata.getBlock() instanceof BlockCake) {
-+ ((EntityPlayer) entityhuman).getBukkitEntity().sendHealthUpdate(); // SPIGOT-1341 - reset health for cake
-+ }
-+ ((EntityPlayer) entityhuman).getBukkitEntity().updateInventory(); // SPIGOT-2867
-+ enuminteractionresult = (event.useItemInHand() != Event.Result.ALLOW) ? EnumInteractionResult.SUCCESS : EnumInteractionResult.PASS;
-+ } else if (this.gamemode == EnumGamemode.SPECTATOR) {
-+ TileEntity tileentity = world.getTileEntity(blockposition);
-
-- if (iblockdata.getBlock().interact(world, blockposition, iblockdata, entityhuman, enumhand, enumdirection, f, f1, f2)) {
-+ if (tileentity instanceof ITileInventory) {
-+ Block block = world.getType(blockposition).getBlock();
-+ ITileInventory itileinventory = (ITileInventory) tileentity;
++ if (entityhuman.getCooldownTracker().a(itemstack.getItem())) {
++ cancelledBlock = true;
++ }
+
-+ if (itileinventory instanceof TileEntityChest && block instanceof BlockChest) {
-+ itileinventory = ((BlockChest) block).getInventory(world, blockposition);
-+ }
++ PlayerInteractEvent event = CraftEventFactory.callPlayerInteractEvent(entityhuman, Action.RIGHT_CLICK_BLOCK, blockposition, enumdirection, itemstack, cancelledBlock, enumhand);
++ firedInteract = true;
++ interactResult = event.useItemInHand() == Event.Result.DENY;
+
-+ if (itileinventory != null) {
-+ entityhuman.openContainer(itileinventory);
-+ return EnumInteractionResult.SUCCESS;
-+ }
-+ } else if (tileentity instanceof IInventory) {
-+ entityhuman.openContainer((IInventory) tileentity);
- return EnumInteractionResult.SUCCESS;
- }
-- }
++ 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 (iblockdata.getBlock() instanceof BlockDoor) {
++ boolean bottom = iblockdata.get(BlockDoor.HALF) == BlockPropertyDoubleBlockHalf.LOWER;
++ ((EntityPlayer) entityhuman).playerConnection.sendPacket(new PacketPlayOutBlockChange(world, bottom ? blockposition.up() : blockposition.down()));
++ } else if (iblockdata.getBlock() instanceof BlockCake) {
++ ((EntityPlayer) entityhuman).getBukkitEntity().sendHealthUpdate(); // SPIGOT-1341 - reset health for cake
++ }
++ ((EntityPlayer) entityhuman).getBukkitEntity().updateInventory(); // SPIGOT-2867
++ enuminteractionresult = (event.useItemInHand() != Event.Result.ALLOW) ? EnumInteractionResult.SUCCESS : EnumInteractionResult.PASS;
++ } else if (this.gamemode == EnumGamemode.SPECTATOR) {
++ TileEntity tileentity = world.getTileEntity(blockposition);
-- if (itemstack.isEmpty()) {
+ if (tileentity instanceof ITileInventory) {
+ Block block = iblockdata.getBlock();
+@@ -304,26 +486,26 @@
+ } else {
+ boolean flag = entityhuman.getItemInMainHand().isEmpty();
+
+- if ((!entityhuman.isSneaking() || flag && entityhuman.getItemInOffHand().isEmpty()) && iblockdata.interact(world, blockposition, entityhuman, enumhand, enumdirection, f, f1, f2)) {
+- return EnumInteractionResult.SUCCESS;
+- } else if (flag) {
- return EnumInteractionResult.PASS;
- } else if (entityhuman.getCooldownTracker().a(itemstack.getItem())) {
- return EnumInteractionResult.PASS;
- } else {
-- if (itemstack.getItem() instanceof ItemBlock && !entityhuman.isCreativeAndOp()) {
-- Block block1 = ((ItemBlock) itemstack.getItem()).getBlock();
-+ if (!entityhuman.isSneaking() || entityhuman.getItemInMainHand().isEmpty() && entityhuman.getItemInOffHand().isEmpty()) {
-+ IBlockData iblockdata = world.getType(blockposition);
-
-- if (block1 instanceof BlockCommand || block1 instanceof BlockStructure) {
-- return EnumInteractionResult.FAIL;
-- }
-+ enuminteractionresult = iblockdata.getBlock().interact(world, blockposition, iblockdata, entityhuman, enumhand, enumdirection, f, f1, f2) ? EnumInteractionResult.SUCCESS : EnumInteractionResult.PASS;
- }
+- return EnumInteractionResult.PASS;
+- } else {
++ if ((!entityhuman.isSneaking() || flag && entityhuman.getItemInOffHand().isEmpty())) {
++ enuminteractionresult = iblockdata.interact(world, blockposition, entityhuman, enumhand, enumdirection, f, f1, f2) ? EnumInteractionResult.SUCCESS : EnumInteractionResult.FAIL;
+ }
-
-- if (this.isCreative()) {
-- int i = itemstack.getData();
-- int j = itemstack.getCount();
-- EnumInteractionResult enuminteractionresult = itemstack.placeItem(entityhuman, world, blockposition, enumhand, enumdirection, f, f1, f2);
-+ if (!itemstack.isEmpty() && enuminteractionresult != EnumInteractionResult.SUCCESS && !interactResult) { // add !interactResult SPIGOT-764
-+ int i = itemstack.getData();
-+ int j = itemstack.getCount();
+
-+ enuminteractionresult = itemstack.placeItem(entityhuman, world, blockposition, enumhand, enumdirection, f, f1, f2);
++ if (!itemstack.isEmpty() && !flag && enuminteractionresult != EnumInteractionResult.SUCCESS && !interactResult) { // add !interactResult SPIGOT-764 // MC-133478 - add isEmpty
+ ItemActionContext itemactioncontext = new ItemActionContext(entityhuman, entityhuman.b(enumhand), blockposition, enumdirection, f, f1, f2);
+
+ if (this.isCreative()) {
+ int i = itemstack.getCount();
+- EnumInteractionResult enuminteractionresult = itemstack.placeItem(itemactioncontext);
++ enuminteractionresult = itemstack.placeItem(itemactioncontext, enumhand);
-+ // The item count should not decrement in Creative mode.
-+ if (this.isCreative()) {
- itemstack.setData(i);
- itemstack.setCount(j);
-- return enuminteractionresult;
-- } else {
-- return itemstack.placeItem(entityhuman, world, blockposition, enumhand, enumdirection, f, f1, f2);
+ itemstack.setCount(i);
+ return enuminteractionresult;
+ } else {
+- return itemstack.placeItem(itemactioncontext);
++ return itemstack.placeItem(itemactioncontext, enumhand);
}
}
}
diff --git a/nms-patches/PlayerInventory.patch b/nms-patches/PlayerInventory.patch
index 2b4f94a0..9058f988 100644
--- a/nms-patches/PlayerInventory.patch
+++ b/nms-patches/PlayerInventory.patch
@@ -1,7 +1,7 @@
--- a/net/minecraft/server/PlayerInventory.java
+++ b/net/minecraft/server/PlayerInventory.java
-@@ -5,6 +5,15 @@
- import java.util.List;
+@@ -6,6 +6,15 @@
+ import java.util.function.Predicate;
import javax.annotation.Nullable;
+// CraftBukkit start
@@ -16,7 +16,7 @@
public class PlayerInventory implements IInventory {
public final NonNullList<ItemStack> items;
-@@ -16,6 +25,49 @@
+@@ -17,6 +26,49 @@
private ItemStack carried;
private int h;
@@ -66,8 +66,8 @@
public PlayerInventory(EntityHuman entityhuman) {
this.items = NonNullList.a(36, ItemStack.a);
this.armor = NonNullList.a(4, ItemStack.a);
-@@ -41,6 +93,23 @@
- return itemstack.getItem() == itemstack1.getItem() && (!itemstack.usesData() || itemstack.getData() == itemstack1.getData()) && ItemStack.equals(itemstack, itemstack1);
+@@ -42,6 +94,23 @@
+ return itemstack.getItem() == itemstack1.getItem() && ItemStack.equals(itemstack, itemstack1);
}
+ // CraftBukkit start - Watch method above! :D
@@ -78,7 +78,7 @@
+ if (itemstack1.isEmpty()) return itemstack.getCount();
+
+ // Taken from firstPartial(ItemStack)
-+ if (!itemstack1.isEmpty() && itemstack1.getItem() == itemstack.getItem() && itemstack1.isStackable() && itemstack1.getCount() < itemstack1.getMaxStackSize() && itemstack1.getCount() < this.getMaxStackSize() && (!itemstack1.usesData() || itemstack1.getData() == itemstack.getData()) && ItemStack.equals(itemstack1, itemstack)) {
++ if (!this.a(itemstack, itemstack1)) {
+ remains -= (itemstack1.getMaxStackSize() < this.getMaxStackSize() ? itemstack1.getMaxStackSize() : this.getMaxStackSize()) - itemstack1.getCount();
+ }
+ if (remains <= 0) return itemstack.getCount();
@@ -90,7 +90,7 @@
public int getFirstEmptySlotIndex() {
for (int i = 0; i < this.items.size(); ++i) {
if (((ItemStack) this.items.get(i)).isEmpty()) {
-@@ -524,7 +593,7 @@
+@@ -502,7 +571,7 @@
}
public int getMaxStackSize() {
@@ -99,7 +99,7 @@
}
public boolean b(IBlockData iblockdata) {
-@@ -580,6 +649,11 @@
+@@ -552,6 +621,11 @@
}
public ItemStack getCarried() {
diff --git a/nms-patches/PlayerList.patch b/nms-patches/PlayerList.patch
index b50031bc..29ed2522 100644
--- a/nms-patches/PlayerList.patch
+++ b/nms-patches/PlayerList.patch
@@ -74,8 +74,8 @@
+ // this.p = Maps.newHashMap();
+ // CraftBukkit end
this.server = minecraftserver;
- this.k.a(false);
- this.l.a(false);
+ this.getProfileBans().a(true);
+ this.getIPBans().a(true);
@@ -65,6 +100,12 @@
usercache.a(gameprofile);
@@ -93,9 +93,9 @@
s1 = networkmanager.getSocketAddress().toString();
}
-- PlayerList.f.info("{}[{}] logged in with entity id {} at ({}, {}, {})", entityplayer.getName(), s1, Integer.valueOf(entityplayer.getId()), Double.valueOf(entityplayer.locX), Double.valueOf(entityplayer.locY), Double.valueOf(entityplayer.locZ));
+- PlayerList.f.info("{}[{}] logged in with entity id {} at ({}, {}, {})", entityplayer.getDisplayName().getString(), s1, Integer.valueOf(entityplayer.getId()), Double.valueOf(entityplayer.locX), Double.valueOf(entityplayer.locY), Double.valueOf(entityplayer.locZ));
+ // CraftBukkit - Moved message to after join
-+ // PlayerList.f.info("{}[{}] logged in with entity id {} at ({}, {}, {})", entityplayer.getName(), s1, Integer.valueOf(entityplayer.getId()), Double.valueOf(entityplayer.locX), Double.valueOf(entityplayer.locY), Double.valueOf(entityplayer.locZ));
++ // PlayerList.f.info("{}[{}] logged in with entity id {} at ({}, {}, {})", entityplayer.getDisplayName().getString(), s1, Integer.valueOf(entityplayer.getId()), Double.valueOf(entityplayer.locX), Double.valueOf(entityplayer.locY), Double.valueOf(entityplayer.locZ));
WorldServer worldserver = this.server.getWorldServer(entityplayer.dimension);
WorldData worlddata = worldserver.getWorldData();
@@ -104,49 +104,32 @@
playerconnection.sendPacket(new PacketPlayOutLogin(entityplayer.getId(), entityplayer.playerInteractManager.getGameMode(), worlddata.isHardcore(), worldserver.worldProvider.getDimensionManager().getDimensionID(), 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 PacketPlayOutCustomPayload(PacketPlayOutCustomPayload.b, (new PacketDataSerializer(Unpooled.buffer())).a(this.getServer().getServerModName())));
playerconnection.sendPacket(new PacketPlayOutServerDifficulty(worlddata.getDifficulty(), worlddata.isDifficultyLocked()));
playerconnection.sendPacket(new PacketPlayOutAbilities(entityplayer.abilities));
-@@ -91,17 +134,23 @@
- entityplayer.F().a(entityplayer);
- this.sendScoreboard((ScoreboardServer) worldserver.getScoreboard(), entityplayer);
- this.server.aD();
-- ChatMessage chatmessage;
-+ // CraftBukkit start - login message is handled in the event
-+ // ChatMessage chatmessage;
-
-+ String joinMessage;
- if (entityplayer.getName().equalsIgnoreCase(s)) {
-- chatmessage = new ChatMessage("multiplayer.player.joined", new Object[] { entityplayer.getScoreboardDisplayName()});
-+ // chatmessage = new ChatMessage("multiplayer.player.joined", new Object[] { entityplayer.getScoreboardDisplayName()});
-+ joinMessage = "\u00A7e" + LocaleI18n.a("multiplayer.player.joined", entityplayer.getName());
- } else {
-- chatmessage = new ChatMessage("multiplayer.player.joined.renamed", new Object[] { entityplayer.getScoreboardDisplayName(), s});
-+ // chatmessage = new ChatMessage("multiplayer.player.joined.renamed", new Object[] { entityplayer.getScoreboardDisplayName(), s});
-+ joinMessage = "\u00A7e" + LocaleI18n.a("multiplayer.player.joined.renamed", entityplayer.getName(), s);
+@@ -101,8 +144,10 @@
+ chatmessage = new ChatMessage("multiplayer.player.joined.renamed", new Object[] { entityplayer.getScoreboardDisplayName(), s});
}
-- chatmessage.getChatModifier().setColor(EnumChatFormat.YELLOW);
-- this.sendMessage(chatmessage);
+- this.sendMessage(chatmessage.a(EnumChatFormat.YELLOW));
- this.onPlayerJoin(entityplayer);
-+ // chatmessage.getChatModifier().setColor(EnumChatFormat.YELLOW);
-+ // this.sendMessage(chatmessage);
-+ this.onPlayerJoin(entityplayer, joinMessage);
++ chatmessage.a(EnumChatFormat.YELLOW);
++ this.onPlayerJoin(entityplayer, CraftChatMessage.fromComponent(chatmessage));
+ // CraftBukkit end
+ 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().isEmpty()) {
-@@ -153,6 +202,8 @@
+@@ -154,6 +199,8 @@
}
entityplayer.syncInventory();
+ // CraftBukkit - Moved from above, added world
-+ PlayerList.f.info(entityplayer.getName() + "[" + s1 + "] logged in with entity id " + entityplayer.getId() + " at ([" + entityplayer.world.worldData.getName() + "]" + entityplayer.locX + ", " + entityplayer.locY + ", " + entityplayer.locZ + ")");
++ PlayerList.f.info("{}[{}] logged in with entity id {} at ([{}]{}, {}, {})", entityplayer.getDisplayName().getString(), s1, Integer.valueOf(entityplayer.getId()), entityplayer.world.worldData.getName(), Double.valueOf(entityplayer.locX), Double.valueOf(entityplayer.locY), Double.valueOf(entityplayer.locZ));
}
public void sendScoreboard(ScoreboardServer scoreboardserver, EntityPlayer entityplayer) {
-@@ -185,26 +236,27 @@
+@@ -186,26 +233,27 @@
}
public void setPlayerFileData(WorldServer[] aworldserver) {
@@ -179,7 +162,7 @@
}
public void b(WorldBorder worldborder, double d0) {}
-@@ -237,7 +289,7 @@
+@@ -238,7 +286,7 @@
@Nullable
public NBTTagCompound a(EntityPlayer entityplayer) {
@@ -187,8 +170,8 @@
+ NBTTagCompound nbttagcompound = this.server.worlds.get(0).getWorldData().h(); // CraftBukkit
NBTTagCompound nbttagcompound1;
- if (entityplayer.getName().equals(this.server.Q()) && nbttagcompound != null) {
-@@ -253,13 +305,13 @@
+ if (entityplayer.getDisplayName().getString().equals(this.server.I()) && nbttagcompound != null) {
+@@ -254,13 +302,13 @@
protected void savePlayerFile(EntityPlayer entityplayer) {
this.playerFileData.save(entityplayer);
@@ -196,7 +179,7 @@
+ ServerStatisticManager serverstatisticmanager = (ServerStatisticManager) entityplayer.getStatisticManager(); // CraftBukkit
if (serverstatisticmanager != null) {
- serverstatisticmanager.b();
+ serverstatisticmanager.a();
}
- AdvancementDataPlayer advancementdataplayer = (AdvancementDataPlayer) this.p.get(entityplayer.getUniqueID());
@@ -204,7 +187,7 @@
if (advancementdataplayer != null) {
advancementdataplayer.c();
-@@ -267,28 +319,79 @@
+@@ -268,29 +316,80 @@
}
@@ -259,23 +242,25 @@
- worldserver.addEntity(entityplayer);
- this.a(entityplayer, (WorldServer) null);
+- this.server.aR().a(entityplayer);
+ // 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);
++ this.server.aR().a(entityplayer);
+ }
+ // CraftBukkit end
}
public void d(EntityPlayer entityplayer) {
- entityplayer.x().getPlayerChunkMap().movePlayer(entityplayer);
+ entityplayer.getWorldServer().getPlayerChunkMap().movePlayer(entityplayer);
}
- public void disconnect(EntityPlayer entityplayer) {
+ public String disconnect(EntityPlayer entityplayer) { // CraftBukkit - return string
- WorldServer worldserver = entityplayer.x();
+ WorldServer worldserver = entityplayer.getWorldServer();
- entityplayer.b(StatisticList.f);
+ entityplayer.a(StatisticList.LEAVE_GAME);
+
+ // 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);
@@ -289,8 +274,8 @@
+
this.savePlayerFile(entityplayer);
if (entityplayer.isPassenger()) {
- Entity entity = entityplayer.getVehicle();
-@@ -318,17 +421,67 @@
+ Entity entity = entityplayer.getRootVehicle();
+@@ -321,18 +420,68 @@
if (entityplayer1 == entityplayer) {
this.j.remove(uuid);
@@ -324,9 +309,13 @@
+ return playerQuitEvent.getQuitMessage(); // CraftBukkit
}
-- public String attemptLogin(SocketAddress socketaddress, GameProfile gameprofile) {
+- @Nullable
+- public IChatBaseComponent 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) {
+ ChatMessage chatmessage;
+
+- if (this.k.isBanned(gameprofile)) {
+ // Moved from processLogin
+ UUID uuid = EntityHuman.a(gameprofile);
+ ArrayList arraylist = Lists.newArrayList();
@@ -353,52 +342,50 @@
+ // depending on the outcome.
+ SocketAddress socketaddress = loginlistener.networkManager.getSocketAddress();
+
-+ EntityPlayer entity = new EntityPlayer(server, server.getWorldServer(0), gameprofile, new PlayerInteractManager(server.getWorldServer(0)));
++ EntityPlayer entity = new EntityPlayer(this.server, this.server.a(DimensionManager.OVERWORLD), gameprofile, new PlayerInteractManager(this.server.a(DimensionManager.OVERWORLD)));
+ 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();
-@@ -336,10 +489,12 @@
- s = s + "\nYour ban will be removed on " + PlayerList.g.format(gameprofilebanentry.getExpires());
+ chatmessage = new ChatMessage("multiplayer.disconnect.banned.reason", new Object[] { gameprofilebanentry.getReason()});
+@@ -340,10 +489,12 @@
+ chatmessage.addSibling(new ChatMessage("multiplayer.disconnect.banned.expiration", new Object[] { PlayerList.g.format(gameprofilebanentry.getExpires())}));
}
-- return s;
-+ // return s;
-+ event.disallow(PlayerLoginEvent.Result.KICK_BANNED, s);
+- return chatmessage;
++ // return chatmessage;
++ event.disallow(PlayerLoginEvent.Result.KICK_BANNED, CraftChatMessage.fromComponent(chatmessage));
} else if (!this.isWhitelisted(gameprofile)) {
-- return "You are not white-listed on this server!";
+- return new ChatMessage("multiplayer.disconnect.not_whitelisted", new Object[0]);
- } 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!");
++ chatmessage = new ChatMessage("multiplayer.disconnect.not_whitelisted", new Object[0]);
++ event.disallow(PlayerLoginEvent.Result.KICK_WHITELIST, CraftChatMessage.fromComponent(chatmessage));
+ } 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();
-@@ -347,13 +502,25 @@
- s = s + "\nYour ban will be removed on " + PlayerList.g.format(ipbanentry.getExpires());
+ chatmessage = new ChatMessage("multiplayer.disconnect.banned_ip.reason", new Object[] { ipbanentry.getReason()});
+@@ -351,13 +502,25 @@
+ chatmessage.addSibling(new ChatMessage("multiplayer.disconnect.banned_ip.expiration", new Object[] { PlayerList.g.format(ipbanentry.getExpires())}));
}
-- return s;
-+ // return s;
-+ event.disallow(PlayerLoginEvent.Result.KICK_BANNED, s);
+- return chatmessage;
++ // return chatmessage;
++ event.disallow(PlayerLoginEvent.Result.KICK_BANNED, CraftChatMessage.fromComponent(chatmessage));
} else {
-- return this.players.size() >= this.maxPlayers && !this.f(gameprofile) ? "The server is full!" : null;
-+ // return this.players.size() >= this.maxPlayers && !this.f(gameprofile) ? "The server is full!" : null;
+- return this.players.size() >= this.maxPlayers && !this.f(gameprofile) ? new ChatMessage("multiplayer.disconnect.server_full", new Object[0]) : null;
++ // return this.players.size() >= this.maxPlayers && !this.f(gameprofile) ? new ChatMessage("multiplayer.disconnect.server_full", new Object[0]) : null;
+ if (this.players.size() >= this.maxPlayers && !this.f(gameprofile)) {
+ 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;
}
@@ -408,10 +395,10 @@
UUID uuid = EntityHuman.a(gameprofile);
ArrayList arraylist = Lists.newArrayList();
-@@ -388,17 +555,27 @@
+@@ -392,17 +555,27 @@
}
- return new EntityPlayer(this.server, this.server.getWorldServer(0), gameprofile, (PlayerInteractManager) object);
+ return new EntityPlayer(this.server, this.server.a(DimensionManager.OVERWORLD), gameprofile, (PlayerInteractManager) object);
+ */
+ return player;
+ // CraftBukkit end
@@ -424,10 +411,10 @@
+
+ public EntityPlayer moveToWorld(EntityPlayer entityplayer, int i, boolean flag, Location location, boolean avoidSuffocation) {
+ entityplayer.stopRiding(); // CraftBukkit
- entityplayer.x().getTracker().untrackPlayer(entityplayer);
-- entityplayer.x().getTracker().untrackEntity(entityplayer);
-+ // entityplayer.x().getTracker().untrackEntity(entityplayer); // CraftBukkit
- entityplayer.x().getPlayerChunkMap().removePlayer(entityplayer);
+ entityplayer.getWorldServer().getTracker().untrackPlayer(entityplayer);
+- entityplayer.getWorldServer().getTracker().untrackEntity(entityplayer);
++ // entityplayer.getWorldServer().getTracker().untrackEntity(entityplayer); // CraftBukkit
+ entityplayer.getWorldServer().getPlayerChunkMap().removePlayer(entityplayer);
this.players.remove(entityplayer);
this.server.getWorldServer(entityplayer.dimension).removeEntity(entityplayer);
BlockPosition blockposition = entityplayer.getBed();
@@ -437,7 +424,7 @@
entityplayer.dimension = i;
Object object;
-@@ -409,6 +586,11 @@
+@@ -413,6 +586,11 @@
}
EntityPlayer entityplayer1 = new EntityPlayer(this.server, this.server.getWorldServer(entityplayer.dimension), entityplayer.getProfile(), (PlayerInteractManager) object);
@@ -449,7 +436,7 @@
entityplayer1.playerConnection = entityplayer.playerConnection;
entityplayer1.copyFrom(entityplayer, flag);
-@@ -423,43 +605,166 @@
+@@ -426,43 +604,166 @@
entityplayer1.addScoreboardTag(s);
}
@@ -484,7 +471,7 @@
+
+ if (location == null) {
+ cworld = (CraftWorld) this.server.server.getWorlds().get(0);
-+ blockposition = entityplayer1.getSpawnPoint(this.server, cworld.getHandle());
++ blockposition = entityplayer1.getSpawnPoint(cworld.getHandle());
+ location = new Location(cworld, (double) ((float) blockposition.getX() + 0.5F), (double) ((float) blockposition.getY() + 0.1F), (double) ((float) blockposition.getZ() + 0.5F));
}
+
@@ -503,8 +490,8 @@
worldserver.getChunkProviderServer().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) {
+- while (!worldserver.getCubes(entityplayer1, entityplayer1.getBoundingBox()) && entityplayer1.locY < 256.0D) {
++ while (avoidSuffocation && !worldserver.getCubes(entityplayer1, entityplayer1.getBoundingBox()) && entityplayer1.locY < 256.0D) {
entityplayer1.setPosition(entityplayer1.locX, entityplayer1.locY + 1.0D, entityplayer1.locZ);
}
+ // CraftBukkit start
@@ -549,9 +536,9 @@
+ }
+
+ // Fire advancement trigger
-+ CriterionTriggers.u.a(entityplayer, ((CraftWorld) fromWorld).getHandle().worldProvider.getDimensionManager(), worldserver.worldProvider.getDimensionManager());
-+ if (((CraftWorld) fromWorld).getHandle().worldProvider.getDimensionManager() == DimensionManager.NETHER && worldserver.worldProvider.getDimensionManager() == DimensionManager.OVERWORLD && entityplayer.Q() != null) {
-+ CriterionTriggers.B.a(entityplayer, entityplayer.Q());
++ CriterionTriggers.v.a(entityplayer, ((CraftWorld) fromWorld).getHandle().worldProvider.getDimensionManager(), worldserver.worldProvider.getDimensionManager());
++ if (((CraftWorld) fromWorld).getHandle().worldProvider.getDimensionManager() == DimensionManager.NETHER && worldserver.worldProvider.getDimensionManager() == DimensionManager.OVERWORLD && entityplayer.M() != null) {
++ CriterionTriggers.C.a(entityplayer, entityplayer.M());
+ }
+
+ // Don't fire on respawn
@@ -588,7 +575,7 @@
+ // 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) {
-+ BlockPosition randomSpawn = entityplayer.getSpawnPoint(server, exitWorld);
++ BlockPosition randomSpawn = entityplayer.getSpawnPoint(exitWorld);
+ exit = new Location(exitWorld.getWorld(), randomSpawn.getX(), randomSpawn.getY(), randomSpawn.getZ());
+ } else {
+ exit = exit.add(0.5F, 0.1F, 0.5F); // SPIGOT-3879
@@ -633,7 +620,16 @@
public void f(EntityPlayer entityplayer) {
GameProfile gameprofile = entityplayer.getProfile();
int i = this.isOp(gameprofile) ? this.operators.a(gameprofile) : 0;
-@@ -498,12 +803,111 @@
+@@ -470,7 +771,7 @@
+ boolean flag1 = flag && this.server.I().equalsIgnoreCase(entityplayer.getProfile().getName());
+ int j = flag1 ? 4 : 2;
+
+- i = flag && this.server.worldServer[0].getWorldData().u() ? j : i;
++ i = flag && this.server.worlds.get(0).getWorldData().u() ? j : i; // CraftBukkit
+ i = this.u ? j : i;
+ this.b(entityplayer, i);
+ }
+@@ -504,12 +805,111 @@
}
public void changeWorld(Entity entity, int i, WorldServer worldserver, WorldServer worldserver1) {
@@ -655,13 +651,13 @@
+ double d1 = enter.getZ();
+ double d2 = 8.0D;
+ /*
-+ double d0 = entity.locX;
-+ double d1 = entity.locZ;
-+ double d2 = 8.0D;
-+ float f = entity.yaw;
+ double d0 = entity.locX;
+ double d1 = entity.locZ;
+ double d2 = 8.0D;
+ float f = entity.yaw;
+ */
-+
-+ worldserver.methodProfiler.a("moving");
+
+ worldserver.methodProfiler.a("moving");
+ if (worldserver1.dimension == -1) {
+ d0 = MathHelper.a(d0 / d2, worldserver1.getWorldBorder().b()+ 16.0D, worldserver1.getWorldBorder().d() - 16.0D);
+ d1 = MathHelper.a(d1 / d2, worldserver1.getWorldBorder().c() + 16.0D, worldserver1.getWorldBorder().e() - 16.0D);
@@ -730,13 +726,13 @@
+ int i = worldserver.dimension;
+
+ /*
- double d0 = entity.locX;
- double d1 = entity.locZ;
- double d2 = 8.0D;
- float f = entity.yaw;
++ double d0 = entity.locX;
++ double d1 = entity.locZ;
++ double d2 = 8.0D;
++ float f = entity.yaw;
+ */
-
- worldserver.methodProfiler.a("moving");
++
++ worldserver.methodProfiler.a("moving");
+ entity.setPositionRotation(exit.getX(), exit.getY(), exit.getZ(), exit.getYaw(), exit.getPitch());
+ if (entity.isAlive()) {
+ worldserver.entityJoinedWorld(entity, false);
@@ -745,7 +741,7 @@
if (entity.dimension == -1) {
d0 = MathHelper.a(d0 / 8.0D, worldserver1.getWorldBorder().b() + 16.0D, worldserver1.getWorldBorder().d() - 16.0D);
d1 = MathHelper.a(d1 / 8.0D, worldserver1.getWorldBorder().c() + 16.0D, worldserver1.getWorldBorder().e() - 16.0D);
-@@ -522,6 +926,8 @@
+@@ -528,6 +928,8 @@
BlockPosition blockposition;
if (i == 1) {
@@ -754,13 +750,13 @@
blockposition = worldserver1.getSpawn();
} else {
blockposition = worldserver1.getDimensionSpawn();
-@@ -535,16 +941,27 @@
+@@ -541,16 +943,27 @@
worldserver.entityJoinedWorld(entity, false);
}
}
+ */
- worldserver.methodProfiler.b();
+ worldserver.methodProfiler.e();
if (i != 1) {
worldserver.methodProfiler.a("placing");
+ /*
@@ -785,7 +781,7 @@
worldserver1.entityJoinedWorld(entity, false);
}
-@@ -552,11 +969,23 @@
+@@ -558,11 +971,23 @@
}
entity.spawnIn(worldserver1);
@@ -810,7 +806,7 @@
this.v = 0;
}
-@@ -569,6 +998,25 @@
+@@ -575,6 +1000,25 @@
}
@@ -836,40 +832,24 @@
public void a(Packet<?> packet, int i) {
for (int j = 0; j < this.players.size(); ++j) {
EntityPlayer entityplayer = (EntityPlayer) this.players.get(j);
-@@ -667,11 +1115,23 @@
-
- this.operators.add(new OpListEntry(gameprofile, this.server.q(), this.operators.b(gameprofile)));
- this.b(this.a(gameprofile.getId()), i);
-+ // CraftBukkit start
-+ Player player = server.server.getPlayer(gameprofile.getId());
-+ if (player != null) {
-+ player.recalculatePermissions();
-+ }
-+ // CraftBukkit end
- }
+@@ -677,6 +1121,7 @@
+ entityplayer.playerConnection.sendPacket(new PacketPlayOutEntityStatus(entityplayer, b0));
+ }
- public void removeOp(GameProfile gameprofile) {
- this.operators.remove(gameprofile);
- this.b(this.a(gameprofile.getId()), 0);
-+ // CraftBukkit start
-+ Player player = server.server.getPlayer(gameprofile.getId());
-+ if (player != null) {
-+ player.recalculatePermissions();
-+ }
-+ // CraftBukkit end
++ entityplayer.getBukkitEntity().recalculatePermissions(); // CraftBukkit
+ this.server.getCommandDispatcher().a(entityplayer);
}
- private void b(EntityPlayer entityplayer, int i) {
-@@ -696,7 +1156,7 @@
+@@ -685,7 +1130,7 @@
}
public boolean isOp(GameProfile gameprofile) {
-- return this.operators.d(gameprofile) || this.server.R() && this.server.worldServer[0].getWorldData().u() && this.server.Q().equalsIgnoreCase(gameprofile.getName()) || this.u;
-+ return this.operators.d(gameprofile) || this.server.R() && this.server.worlds.get(0).getWorldData().u() && this.server.Q().equalsIgnoreCase(gameprofile.getName()) || this.u; // CraftBukkit
+- return this.operators.d(gameprofile) || this.server.J() && this.server.worldServer[0].getWorldData().u() && this.server.I().equalsIgnoreCase(gameprofile.getName()) || this.u;
++ return this.operators.d(gameprofile) || this.server.J() && this.server.worlds.get(0).getWorldData().u() && this.server.I().equalsIgnoreCase(gameprofile.getName()) || this.u; // CraftBukkit
}
@Nullable
-@@ -720,6 +1180,12 @@
+@@ -709,6 +1154,12 @@
for (int j = 0; j < this.players.size(); ++j) {
EntityPlayer entityplayer = (EntityPlayer) this.players.get(j);
@@ -882,7 +862,7 @@
if (entityplayer != entityhuman && entityplayer.dimension == i) {
double d4 = d0 - entityplayer.locX;
double d5 = d1 - entityplayer.locY;
-@@ -767,7 +1233,7 @@
+@@ -748,7 +1199,7 @@
public void reloadWhitelist() {}
public void b(EntityPlayer entityplayer, WorldServer worldserver) {
@@ -891,17 +871,17 @@
entityplayer.playerConnection.sendPacket(new PacketPlayOutWorldBorder(worldborder, PacketPlayOutWorldBorder.EnumWorldBorderAction.INITIALIZE));
entityplayer.playerConnection.sendPacket(new PacketPlayOutUpdateTime(worldserver.getTime(), worldserver.getDayTime(), worldserver.getGameRules().getBoolean("doDaylightCycle")));
-@@ -775,16 +1241,21 @@
+@@ -756,16 +1207,21 @@
entityplayer.playerConnection.sendPacket(new PacketPlayOutSpawnPosition(blockposition));
if (worldserver.isRaining()) {
- 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.playerConnection.sendPacket(new PacketPlayOutGameStateChange(7, worldserver.i(1.0F)));
+- entityplayer.playerConnection.sendPacket(new PacketPlayOutGameStateChange(8, worldserver.g(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.playerConnection.sendPacket(new PacketPlayOutGameStateChange(7, worldserver.i(1.0F)));
++ // entityplayer.playerConnection.sendPacket(new PacketPlayOutGameStateChange(8, worldserver.g(1.0F)));
+ entityplayer.setPlayerWeather(org.bukkit.WeatherType.DOWNFALL, false);
+ entityplayer.updateWeather(-worldserver.o, worldserver.o, -worldserver.q, worldserver.q);
+ // CraftBukkit end
@@ -917,7 +897,7 @@
entityplayer.playerConnection.sendPacket(new PacketPlayOutHeldItemSlot(entityplayer.inventory.itemInHandIndex));
}
-@@ -797,7 +1268,7 @@
+@@ -778,7 +1234,7 @@
}
public String[] getSeenPlayers() {
@@ -926,7 +906,7 @@
}
public boolean getHasWhitelist() {
-@@ -846,26 +1317,39 @@
+@@ -827,26 +1283,39 @@
}
public void u() {
@@ -970,17 +950,17 @@
+ // CraftBukkit end
if (serverstatisticmanager == null) {
- File file = new File(this.server.getWorldServer(0).getDataManager().getDirectory(), "stats");
-@@ -881,7 +1365,7 @@
+ File file = new File(this.server.a(DimensionManager.OVERWORLD).getDataManager().getDirectory(), "stats");
+@@ -861,7 +1330,7 @@
+ }
serverstatisticmanager = new ServerStatisticManager(this.server, file1);
- serverstatisticmanager.a();
- this.o.put(uuid, serverstatisticmanager);
+ // this.o.put(uuid, serverstatisticmanager); // CraftBukkit
}
return serverstatisticmanager;
-@@ -889,14 +1373,14 @@
+@@ -869,14 +1338,14 @@
public AdvancementDataPlayer h(EntityPlayer entityplayer) {
UUID uuid = entityplayer.getUniqueID();
@@ -988,7 +968,7 @@
+ AdvancementDataPlayer advancementdataplayer = (AdvancementDataPlayer) entityplayer.getAdvancementData(); // CraftBukkit
if (advancementdataplayer == null) {
- File file = new File(this.server.getWorldServer(0).getDataManager().getDirectory(), "advancements");
+ File file = new File(this.server.a(DimensionManager.OVERWORLD).getDataManager().getDirectory(), "advancements");
File file1 = new File(file, uuid + ".json");
advancementdataplayer = new AdvancementDataPlayer(this.server, file1, entityplayer);
@@ -997,7 +977,7 @@
}
advancementdataplayer.a(entityplayer);
-@@ -909,8 +1393,10 @@
+@@ -889,8 +1358,10 @@
WorldServer[] aworldserver = this.server.worldServer;
int j = aworldserver.length;
@@ -1010,7 +990,7 @@
if (worldserver != null) {
worldserver.getPlayerChunkMap().a(i);
-@@ -934,13 +1420,20 @@
+@@ -915,13 +1386,20 @@
}
public void reload() {
@@ -1030,5 +1010,5 @@
}
+ // CraftBukkit end
- }
- }
+ this.sendAll(new PacketPlayOutTags(this.server.getTagRegistry()));
+ PacketPlayOutRecipeUpdate packetplayoutrecipeupdate = new PacketPlayOutRecipeUpdate(this.server.getCraftingManager().b());
diff --git a/nms-patches/PortalTravelAgent.patch b/nms-patches/PortalTravelAgent.patch
index 0c1c4e78..fd81d2dc 100644
--- a/nms-patches/PortalTravelAgent.patch
+++ b/nms-patches/PortalTravelAgent.patch
@@ -12,7 +12,7 @@
public class PortalTravelAgent {
-@@ -26,8 +31,21 @@
+@@ -27,8 +32,21 @@
int i = MathHelper.floor(entity.locX);
int j = MathHelper.floor(entity.locY) - 1;
int k = MathHelper.floor(entity.locZ);
@@ -36,7 +36,7 @@
for (int l = -2; l <= 2; ++l) {
for (int i1 = -2; i1 <= 2; ++i1) {
-@@ -42,18 +60,63 @@
+@@ -43,18 +61,63 @@
}
}
@@ -94,7 +94,7 @@
+
+ public BlockPosition findPortal(double x, double y, double z, int radius) {
+ if (this.world.getWorld().getEnvironment() == org.bukkit.World.Environment.THE_END) {
-+ return this.findEndPortal(this.world.worldProvider.h());
++ return this.findEndPortal(this.world.worldProvider.d());
+ }
+ // CraftBukkit end
double d0 = -1.0D;
@@ -107,7 +107,7 @@
boolean flag1 = true;
Object object = BlockPosition.ZERO;
long k = ChunkCoordIntPair.a(i, j);
-@@ -66,12 +129,12 @@
+@@ -67,12 +130,12 @@
portaltravelagent_chunkcoordinatesportal.b = this.world.getTime();
flag1 = false;
} else {
@@ -120,12 +120,12 @@
- for (int i1 = -128; i1 <= 128; ++i1) {
+ for (int i1 = -radius; i1 <= radius; ++i1) {
- for (BlockPosition blockposition2 = blockposition.a(l, this.world.ab() - 1 - blockposition.getY(), i1); blockposition2.getY() >= 0; blockposition2 = blockposition1) {
+ for (BlockPosition blockposition2 = blockposition.a(l, this.world.aa() - 1 - blockposition.getY(), i1); blockposition2.getY() >= 0; blockposition2 = blockposition1) {
blockposition1 = blockposition2.down();
- if (this.world.getType(blockposition2).getBlock() == Blocks.PORTAL) {
-@@ -95,6 +158,29 @@
+ if (this.world.getType(blockposition2).getBlock() == PortalTravelAgent.a) {
+@@ -96,6 +159,29 @@
if (flag1) {
- this.c.put(k, new PortalTravelAgent.ChunkCoordinatesPortal((BlockPosition) object, this.world.getTime()));
+ this.d.put(k, new PortalTravelAgent.ChunkCoordinatesPortal((BlockPosition) object, this.world.getTime()));
}
+ // CraftBukkit start - Move entity teleportation logic into exit
+ return (BlockPosition) object;
@@ -153,7 +153,7 @@
double d2 = (double) ((BlockPosition) object).getX() + 0.5D;
double d3 = (double) ((BlockPosition) object).getZ() + 0.5D;
-@@ -132,30 +218,59 @@
+@@ -133,31 +219,59 @@
f4 = 1.0F;
}
@@ -165,6 +165,7 @@
- entity.yaw = f - (float) (entity.getPortalDirection().opposite().get2DRotationValue() * 90) + (float) (shapedetector_shapedetectorcollection.getFacing().get2DRotationValue() * 90);
- if (entity instanceof EntityPlayer) {
- ((EntityPlayer) entity).playerConnection.a(d2, d5, d3, entity.yaw, entity.pitch);
+- ((EntityPlayer) entity).playerConnection.syncPosition();
- } else {
- entity.setPositionRotation(d2, d5, d3, entity.yaw, entity.pitch);
- }
@@ -231,7 +232,7 @@
int l = i;
int i1 = j;
int j1 = k;
-@@ -180,10 +295,10 @@
+@@ -182,10 +296,10 @@
double d4;
for (i2 = i - 16; i2 <= i + 16; ++i2) {
@@ -242,9 +243,9 @@
- d2 = (double) j2 + 0.5D - entity.locZ;
+ d2 = (double) j2 + 0.5D - z; // CraftBukkit
- label271:
- for (k2 = this.world.ab() - 1; k2 >= 0; --k2) {
-@@ -215,7 +330,7 @@
+ label257:
+ for (k2 = this.world.aa() - 1; k2 >= 0; --k2) {
+@@ -217,7 +331,7 @@
}
}
@@ -253,7 +254,7 @@
d4 = d1 * d1 + d3 * d3 + d2 * d2;
if (d0 < 0.0D || d4 < d0) {
d0 = d4;
-@@ -232,10 +347,10 @@
+@@ -234,10 +348,10 @@
if (d0 < 0.0D) {
for (i2 = i - 16; i2 <= i + 16; ++i2) {
@@ -264,9 +265,9 @@
- d2 = (double) j2 + 0.5D - entity.locZ;
+ d2 = (double) j2 + 0.5D - z; // CraftBukkit
- label219:
- for (k2 = this.world.ab() - 1; k2 >= 0; --k2) {
-@@ -260,7 +375,7 @@
+ label205:
+ for (k2 = this.world.aa() - 1; k2 >= 0; --k2) {
+@@ -262,7 +376,7 @@
}
}
@@ -275,7 +276,7 @@
d4 = d1 * d1 + d3 * d3 + d2 * d2;
if (d0 < 0.0D || d4 < d0) {
d0 = d4;
-@@ -359,5 +474,10 @@
+@@ -354,5 +468,10 @@
super(blockposition.getX(), blockposition.getY(), blockposition.getZ());
this.b = i;
}
diff --git a/nms-patches/RecipeArmorDye.patch b/nms-patches/RecipeArmorDye.patch
index 02407e68..6a4959d5 100644
--- a/nms-patches/RecipeArmorDye.patch
+++ b/nms-patches/RecipeArmorDye.patch
@@ -1,18 +1,18 @@
--- a/net/minecraft/server/RecipeArmorDye.java
+++ b/net/minecraft/server/RecipeArmorDye.java
-@@ -3,9 +3,13 @@
+@@ -3,11 +3,13 @@
import com.google.common.collect.Lists;
import java.util.ArrayList;
--public class RecipeArmorDye implements IRecipe {
+-public class RecipeArmorDye extends IRecipeComplex {
+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), NonNullList.a(RecipeItemStack.a, RecipeItemStack.a(Items.DYE)));
-+ }
+ public RecipeArmorDye(MinecraftKey minecraftkey) {
+- super(minecraftkey);
++ super(minecraftkey, "", new ItemStack(Items.LEATHER_HELMET, 0), NonNullList.a(RecipeItemStack.a, RecipeItemStack.a(Items.BONE_MEAL)));
+ }
+ // CraftBukkit end
- public boolean a(InventoryCrafting inventorycrafting, World world) {
- ItemStack itemstack = ItemStack.a;
+ public boolean a(IInventory iinventory, World world) {
+ if (!(iinventory instanceof InventoryCrafting)) {
diff --git a/nms-patches/RecipeBannerAdd.patch b/nms-patches/RecipeBannerAdd.patch
new file mode 100644
index 00000000..37205198
--- /dev/null
+++ b/nms-patches/RecipeBannerAdd.patch
@@ -0,0 +1,18 @@
+--- a/net/minecraft/server/RecipeBannerAdd.java
++++ b/net/minecraft/server/RecipeBannerAdd.java
+@@ -2,11 +2,13 @@
+
+ import javax.annotation.Nullable;
+
+-public class RecipeBannerAdd extends IRecipeComplex {
++public class RecipeBannerAdd extends ShapelessRecipes implements IRecipe { // CraftBukkit - added extends
+
++ // CraftBukkit start - Delegate to new parent class with bogus info
+ public RecipeBannerAdd(MinecraftKey minecraftkey) {
+- super(minecraftkey);
++ super(minecraftkey, "", new ItemStack(Items.WHITE_BANNER, 0), NonNullList.a(RecipeItemStack.a, RecipeItemStack.a(Items.WHITE_BANNER)));
+ }
++ // CraftBukkit end
+
+ public boolean a(IInventory iinventory, World world) {
+ if (!(iinventory instanceof InventoryCrafting)) {
diff --git a/nms-patches/RecipeBannerDuplicate.patch b/nms-patches/RecipeBannerDuplicate.patch
new file mode 100644
index 00000000..f4020aca
--- /dev/null
+++ b/nms-patches/RecipeBannerDuplicate.patch
@@ -0,0 +1,17 @@
+--- a/net/minecraft/server/RecipeBannerDuplicate.java
++++ b/net/minecraft/server/RecipeBannerDuplicate.java
+@@ -1,10 +1,12 @@
+ package net.minecraft.server;
+
+-public class RecipeBannerDuplicate extends IRecipeComplex {
++public class RecipeBannerDuplicate extends ShapelessRecipes implements IRecipe { // CraftBukkit - added extends
+
++ // CraftBukkit start - Delegate to new parent class with bogus info
+ public RecipeBannerDuplicate(MinecraftKey minecraftkey) {
+- super(minecraftkey);
++ super(minecraftkey, "", new ItemStack(Items.WHITE_BANNER, 0), NonNullList.a(RecipeItemStack.a, RecipeItemStack.a(Items.WHITE_BANNER)));
+ }
++ // CraftBukkit end
+
+ public boolean a(IInventory iinventory, World world) {
+ if (!(iinventory instanceof InventoryCrafting)) {
diff --git a/nms-patches/RecipeBookClone.patch b/nms-patches/RecipeBookClone.patch
index d5417aa5..3db88546 100644
--- a/nms-patches/RecipeBookClone.patch
+++ b/nms-patches/RecipeBookClone.patch
@@ -1,16 +1,17 @@
--- a/net/minecraft/server/RecipeBookClone.java
+++ b/net/minecraft/server/RecipeBookClone.java
-@@ -1,8 +1,11 @@
+@@ -1,10 +1,12 @@
package net.minecraft.server;
--public class RecipeBookClone implements IRecipe {
+-public class RecipeBookClone extends IRecipeComplex {
+public class RecipeBookClone extends ShapelessRecipes implements IRecipe { // CraftBukkit - added extends
-- public RecipeBookClone() {}
-+ public RecipeBookClone() {
-+ super("", new ItemStack(Items.WRITTEN_BOOK, 0, -1), NonNullList.a(RecipeItemStack.a, RecipeItemStack.a(Items.WRITABLE_BOOK)));
-+ }
++ // CraftBukkit start - Delegate to new parent class with bogus info
+ public RecipeBookClone(MinecraftKey minecraftkey) {
+- super(minecraftkey);
++ super(minecraftkey, "", new ItemStack(Items.WRITTEN_BOOK, 0), NonNullList.a(RecipeItemStack.a, RecipeItemStack.a(Items.WRITABLE_BOOK)));
+ }
+ // CraftBukkit end
- public boolean a(InventoryCrafting inventorycrafting, World world) {
- int i = 0;
+ public boolean a(IInventory iinventory, World world) {
+ if (!(iinventory instanceof InventoryCrafting)) {
diff --git a/nms-patches/RecipeFireworks.patch b/nms-patches/RecipeFireworks.patch
index 43478e02..22a7a3b8 100644
--- a/nms-patches/RecipeFireworks.patch
+++ b/nms-patches/RecipeFireworks.patch
@@ -1,20 +1,21 @@
--- a/net/minecraft/server/RecipeFireworks.java
+++ b/net/minecraft/server/RecipeFireworks.java
-@@ -3,13 +3,16 @@
- import com.google.common.collect.Lists;
- import java.util.ArrayList;
+@@ -1,14 +1,16 @@
+ package net.minecraft.server;
--public class RecipeFireworks implements IRecipe {
+-public class RecipeFireworks extends IRecipeComplex {
+public class RecipeFireworks extends ShapelessRecipes implements IRecipe { // CraftBukkit - added extends
- private ItemStack a;
+ private static final RecipeItemStack a = RecipeItemStack.a(new IMaterial[] { Items.PAPER});
+ private static final RecipeItemStack b = RecipeItemStack.a(new IMaterial[] { Items.GUNPOWDER});
+ private static final RecipeItemStack c = RecipeItemStack.a(new IMaterial[] { Items.FIREWORK_STAR});
+ // CraftBukkit start - Delegate to new parent class with bogus info
- public RecipeFireworks() {
-+ super("", new ItemStack(Items.FIREWORKS, 0, 0), NonNullList.a(RecipeItemStack.a, RecipeItemStack.a(Items.GUNPOWDER)));
- this.a = ItemStack.a;
+ public RecipeFireworks(MinecraftKey minecraftkey) {
+- super(minecraftkey);
++ super(minecraftkey, "", new ItemStack(Items.FIREWORK_ROCKET, 0), NonNullList.a(RecipeItemStack.a, RecipeItemStack.a(Items.GUNPOWDER)));
}
+ // CraftBukkit end
- public boolean a(InventoryCrafting inventorycrafting, World world) {
- this.a = ItemStack.a;
+ public boolean a(IInventory iinventory, World world) {
+ if (!(iinventory instanceof InventoryCrafting)) {
diff --git a/nms-patches/RecipeFireworksFade.patch b/nms-patches/RecipeFireworksFade.patch
new file mode 100644
index 00000000..31b863eb
--- /dev/null
+++ b/nms-patches/RecipeFireworksFade.patch
@@ -0,0 +1,20 @@
+--- a/net/minecraft/server/RecipeFireworksFade.java
++++ b/net/minecraft/server/RecipeFireworksFade.java
+@@ -4,13 +4,15 @@
+ import java.util.ArrayList;
+ import java.util.List;
+
+-public class RecipeFireworksFade extends IRecipeComplex {
++public class RecipeFireworksFade extends ShapelessRecipes implements IRecipe { // CraftBukkit - added extends
+
+ private static final RecipeItemStack a = RecipeItemStack.a(new IMaterial[] { Items.FIREWORK_STAR});
+
++ // CraftBukkit start - Delegate to new parent class with bogus info
+ public RecipeFireworksFade(MinecraftKey minecraftkey) {
+- super(minecraftkey);
++ super(minecraftkey, "", new ItemStack(Items.FIREWORK_STAR, 0), NonNullList.a(RecipeItemStack.a, RecipeItemStack.a(Items.FIREWORK_STAR, Items.BONE_MEAL)));
+ }
++ // CraftBukkit end
+
+ public boolean a(IInventory iinventory, World world) {
+ if (!(iinventory instanceof InventoryCrafting)) {
diff --git a/nms-patches/RecipeFireworksStar.patch b/nms-patches/RecipeFireworksStar.patch
new file mode 100644
index 00000000..e4900565
--- /dev/null
+++ b/nms-patches/RecipeFireworksStar.patch
@@ -0,0 +1,30 @@
+--- a/net/minecraft/server/RecipeFireworksStar.java
++++ b/net/minecraft/server/RecipeFireworksStar.java
+@@ -8,12 +8,12 @@
+ import java.util.Map;
+ import java.util.function.Consumer;
+
+-public class RecipeFireworksStar extends IRecipeComplex {
++public class RecipeFireworksStar extends ShapelessRecipes implements IRecipe { // CraftBukkit - added extends
+
+ private static final RecipeItemStack a = RecipeItemStack.a(new IMaterial[] { Items.FIRE_CHARGE, Items.FEATHER, Items.GOLD_NUGGET, Items.SKELETON_SKULL, Items.WITHER_SKELETON_SKULL, Items.CREEPER_HEAD, Items.PLAYER_HEAD, Items.DRAGON_HEAD, Items.ZOMBIE_HEAD});
+ private static final RecipeItemStack b = RecipeItemStack.a(new IMaterial[] { Items.DIAMOND});
+ private static final RecipeItemStack c = RecipeItemStack.a(new IMaterial[] { Items.GLOWSTONE_DUST});
+- private static final Map<Item, ItemFireworks.EffectType> d = (Map) SystemUtils.a((Object) Maps.newHashMap(), (hashmap) -> {
++ private static final Map<Item, ItemFireworks.EffectType> d = (Map) SystemUtils.a(Maps.newHashMap(), (hashmap) -> { // CraftBukkit - decompile error
+ hashmap.put(Items.FIRE_CHARGE, ItemFireworks.EffectType.LARGE_BALL);
+ hashmap.put(Items.FEATHER, ItemFireworks.EffectType.BURST);
+ hashmap.put(Items.GOLD_NUGGET, ItemFireworks.EffectType.STAR);
+@@ -26,9 +26,11 @@
+ });
+ private static final RecipeItemStack e = RecipeItemStack.a(new IMaterial[] { Items.GUNPOWDER});
+
++ // CraftBukkit start - Delegate to new parent class with bogus info
+ public RecipeFireworksStar(MinecraftKey minecraftkey) {
+- super(minecraftkey);
++ super(minecraftkey, "", new ItemStack(Items.FIREWORK_STAR, 0), NonNullList.a(RecipeItemStack.a, RecipeItemStack.a(Items.GUNPOWDER)));
+ }
++ // CraftBukkit end
+
+ public boolean a(IInventory iinventory, World world) {
+ if (!(iinventory instanceof InventoryCrafting)) {
diff --git a/nms-patches/RecipeMapClone.patch b/nms-patches/RecipeMapClone.patch
index 04057272..b8016765 100644
--- a/nms-patches/RecipeMapClone.patch
+++ b/nms-patches/RecipeMapClone.patch
@@ -1,17 +1,17 @@
--- a/net/minecraft/server/RecipeMapClone.java
+++ b/net/minecraft/server/RecipeMapClone.java
-@@ -1,8 +1,12 @@
+@@ -1,10 +1,12 @@
package net.minecraft.server;
--public class RecipeMapClone implements IRecipe {
+-public class RecipeMapClone extends IRecipeComplex {
+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), NonNullList.a(RecipeItemStack.a, RecipeItemStack.a(Items.MAP)));
-+ }
+ public RecipeMapClone(MinecraftKey minecraftkey) {
+- super(minecraftkey);
++ super(minecraftkey, "", new ItemStack(Items.MAP, 0), NonNullList.a(RecipeItemStack.a, RecipeItemStack.a(Items.MAP)));
+ }
+ // CraftBukkit end
- public boolean a(InventoryCrafting inventorycrafting, World world) {
- int i = 0;
+ public boolean a(IInventory iinventory, World world) {
+ if (!(iinventory instanceof InventoryCrafting)) {
diff --git a/nms-patches/RecipeRepair.patch b/nms-patches/RecipeRepair.patch
index 7deebd5c..388dbc10 100644
--- a/nms-patches/RecipeRepair.patch
+++ b/nms-patches/RecipeRepair.patch
@@ -1,38 +1,38 @@
--- a/net/minecraft/server/RecipeRepair.java
+++ b/net/minecraft/server/RecipeRepair.java
-@@ -3,9 +3,13 @@
+@@ -2,12 +2,15 @@
+
import com.google.common.collect.Lists;
import java.util.ArrayList;
++import java.util.stream.Stream;
--public class RecipeRepair implements IRecipe {
+-public class RecipeRepair extends IRecipeComplex {
+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), NonNullList.a(RecipeItemStack.a, RecipeItemStack.a(Items.LEATHER_HELMET)));
-+ }
+ public RecipeRepair(MinecraftKey minecraftkey) {
+- super(minecraftkey);
++ super(minecraftkey, "", new ItemStack(Items.LEATHER_HELMET), NonNullList.a(RecipeItemStack.a, RecipeItemStack.a(Items.LEATHER_HELMET)));
+ }
+ // CraftBukkit end
- public boolean a(InventoryCrafting inventorycrafting, World world) {
- ArrayList arraylist = Lists.newArrayList();
-@@ -62,7 +66,18 @@
- i1 = 0;
- }
+ public boolean a(IInventory iinventory, World world) {
+ if (!(iinventory instanceof InventoryCrafting)) {
+@@ -71,6 +74,17 @@
+ ItemStack itemstack3 = new ItemStack(itemstack2.getItem());
-- return new ItemStack(itemstack2.getItem(), 1, i1);
+ itemstack3.setDamage(i1);
+ // CraftBukkit start - Construct a dummy repair recipe
-+ ItemStack result = new ItemStack(itemstack.getItem(), 1, i1);
-+ NonNullList<RecipeItemStack> ingredients = NonNullList.a();
-+ ingredients.add(RecipeItemStack.a(new ItemStack[]{itemstack2.cloneItemStack()}));
-+ ingredients.add(RecipeItemStack.a(new ItemStack[]{itemstack.cloneItemStack()}));
-+ ShapelessRecipes recipe = new ShapelessRecipes("", result.cloneItemStack(), ingredients);
-+ recipe.key = new MinecraftKey("repairitem");
-+ inventorycrafting.currentRecipe = recipe;
-+ result = org.bukkit.craftbukkit.event.CraftEventFactory.callPreCraftEvent(inventorycrafting, result, inventorycrafting.container.getBukkitView(), true);
-+ return result;
-+ // return new ItemStack(itemstack2.getItem(), 1, i1);
++ if (iinventory instanceof InventoryCrafting) {
++ InventoryCrafting inventorycrafting = (InventoryCrafting) iinventory;
++ NonNullList<RecipeItemStack> ingredients = NonNullList.a();
++ ingredients.add(new RecipeItemStack(Stream.of(new RecipeItemStack.StackProvider(itemstack2.cloneItemStack()))));
++ ingredients.add(new RecipeItemStack(Stream.of(new RecipeItemStack.StackProvider(itemstack.cloneItemStack()))));
++ ShapelessRecipes recipe = new ShapelessRecipes(new MinecraftKey("repairitem"), "", itemstack3.cloneItemStack(), ingredients);
++ inventorycrafting.setCurrentRecipe(recipe);
++ itemstack3 = org.bukkit.craftbukkit.event.CraftEventFactory.callPreCraftEvent(inventorycrafting, inventorycrafting.resultInventory, itemstack3, inventorycrafting.container.getBukkitView(), true);
++ }
+ // CraftBukkit end
+ return itemstack3;
}
}
-
diff --git a/nms-patches/RecipeShulkerBox.patch b/nms-patches/RecipeShulkerBox.patch
index f3eab88b..65eefa1e 100644
--- a/nms-patches/RecipeShulkerBox.patch
+++ b/nms-patches/RecipeShulkerBox.patch
@@ -1,20 +1,17 @@
--- a/net/minecraft/server/RecipeShulkerBox.java
+++ b/net/minecraft/server/RecipeShulkerBox.java
-@@ -1,8 +1,15 @@
+@@ -1,10 +1,12 @@
package net.minecraft.server;
--public class RecipeShulkerBox { public static class Dye implements IRecipe {
-+// CraftBukkit - decompile weirdness
-+public class RecipeShulkerBox {
+-public class RecipeShulkerBox extends IRecipeComplex {
++public class RecipeShulkerBox extends ShapelessRecipes implements IRecipe { // CraftBukkit - added extends
-- public Dye() {}
-+ public static class Dye extends ShapelessRecipes implements IRecipe { // CraftBukkit - added extends
-+
-+ // CraftBukkit start - Delegate to new parent class with bogus info
-+ public Dye() {
-+ super("", new ItemStack(Blocks.WHITE_SHULKER_BOX, 0, 0), NonNullList.a(RecipeItemStack.a, RecipeItemStack.a(Items.DYE)));
-+ }
-+ // CraftBukkit end
++ // CraftBukkit start - Delegate to new parent class with bogus info
+ public RecipeShulkerBox(MinecraftKey minecraftkey) {
+- super(minecraftkey);
++ super(minecraftkey, "", new ItemStack(Blocks.WHITE_SHULKER_BOX, 0), NonNullList.a(RecipeItemStack.a, RecipeItemStack.a(Items.BONE_MEAL)));
+ }
++ // CraftBukkit end
- public boolean a(InventoryCrafting inventorycrafting, World world) {
- int i = 0;
+ public boolean a(IInventory iinventory, World world) {
+ if (!(iinventory instanceof InventoryCrafting)) {
diff --git a/nms-patches/RecipeTippedArrow.patch b/nms-patches/RecipeTippedArrow.patch
index 04840d4f..2e2e84ca 100644
--- a/nms-patches/RecipeTippedArrow.patch
+++ b/nms-patches/RecipeTippedArrow.patch
@@ -1,22 +1,22 @@
--- a/net/minecraft/server/RecipeTippedArrow.java
+++ b/net/minecraft/server/RecipeTippedArrow.java
-@@ -2,9 +2,17 @@
+@@ -2,11 +2,17 @@
import java.util.Collection;
--public class RecipeTippedArrow implements IRecipe {
+-public class RecipeTippedArrow extends IRecipeComplex {
+public class RecipeTippedArrow extends ShapedRecipes implements IRecipe { // CraftBukkit
-- public RecipeTippedArrow() {}
+ // CraftBukkit start
-+ public RecipeTippedArrow() {
-+ super("", 3, 3, NonNullList.a(RecipeItemStack.a,
+ public RecipeTippedArrow(MinecraftKey minecraftkey) {
+- super(minecraftkey);
++ super(minecraftkey, "", 3, 3, NonNullList.a(RecipeItemStack.a,
+ RecipeItemStack.a(Items.ARROW), RecipeItemStack.a(Items.ARROW), RecipeItemStack.a(Items.ARROW),
+ RecipeItemStack.a(Items.ARROW), RecipeItemStack.a(Items.LINGERING_POTION), RecipeItemStack.a(Items.ARROW),
+ RecipeItemStack.a(Items.ARROW), RecipeItemStack.a(Items.ARROW), RecipeItemStack.a(Items.ARROW)),
+ new ItemStack(Items.TIPPED_ARROW, 8));
-+ }
+ }
+ // CraftBukkit end
- public boolean a(InventoryCrafting inventorycrafting, World world) {
- if (inventorycrafting.j() == 3 && inventorycrafting.i() == 3) {
+ public boolean a(IInventory iinventory, World world) {
+ if (iinventory.U_() == 3 && iinventory.n() == 3) {
diff --git a/nms-patches/RecipesBanner.patch b/nms-patches/RecipesBanner.patch
deleted file mode 100644
index 293911af..00000000
--- a/nms-patches/RecipesBanner.patch
+++ /dev/null
@@ -1,37 +0,0 @@
---- a/net/minecraft/server/RecipesBanner.java
-+++ b/net/minecraft/server/RecipesBanner.java
-@@ -2,9 +2,16 @@
-
- import javax.annotation.Nullable;
-
--public class RecipesBanner { public static class AddRecipe implements IRecipe {
-+// CraftBukkit - decompile weirdness
-+public class RecipesBanner {
-
-- public AddRecipe() {}
-+ public static class AddRecipe extends ShapelessRecipes implements IRecipe { // CraftBukkit - added extends
-+
-+ // CraftBukkit start - Delegate to new parent class with bogus info
-+ public AddRecipe() {
-+ super("", new ItemStack(Items.BANNER, 0, 0), NonNullList.a(RecipeItemStack.a, RecipeItemStack.a(Items.BANNER)));
-+ }
-+ // CraftBukkit end
-
- public boolean a(InventoryCrafting inventorycrafting, World world) {
- boolean flag = false;
-@@ -186,9 +193,13 @@
- }
- }
-
-- public static class DuplicateRecipe implements IRecipe {
-+ public static class DuplicateRecipe extends ShapelessRecipes implements IRecipe { // CraftBukkit - added extends
-
-- public DuplicateRecipe() {}
-+ // CraftBukkit start - Delegate to new parent class with bogus info
-+ public DuplicateRecipe() {
-+ super("", new ItemStack(Items.BANNER, 0, 0), NonNullList.a(RecipeItemStack.a, RecipeItemStack.a(Items.DYE)));
-+ }
-+ // CraftBukkit end
-
- public boolean a(InventoryCrafting inventorycrafting, World world) {
- ItemStack itemstack = ItemStack.a;
diff --git a/nms-patches/RecipesFurnace.patch b/nms-patches/RecipesFurnace.patch
deleted file mode 100644
index ccc7b333..00000000
--- a/nms-patches/RecipesFurnace.patch
+++ /dev/null
@@ -1,80 +0,0 @@
---- a/net/minecraft/server/RecipesFurnace.java
-+++ b/net/minecraft/server/RecipesFurnace.java
-@@ -8,8 +8,10 @@
- public class RecipesFurnace {
-
- private static final RecipesFurnace a = new RecipesFurnace();
-- public final Map<ItemStack, ItemStack> recipes = Maps.newHashMap();
-+ public Map<ItemStack, ItemStack> recipes = Maps.newHashMap();
- private final Map<ItemStack, Float> experience = Maps.newHashMap();
-+ public Map<ItemStack,ItemStack> customRecipes = Maps.newHashMap(); // CraftBukkit - add field
-+ public Map<ItemStack,Float> customExperience = Maps.newHashMap(); // CraftBukkit - add field
-
- public static RecipesFurnace getInstance() {
- return RecipesFurnace.a;
-@@ -94,6 +96,13 @@
- this.a(new ItemStack(Blocks.STAINED_HARDENED_CLAY, 1, EnumColor.BLACK.getColorIndex()), new ItemStack(Blocks.dQ), 0.1F);
- }
-
-+ // CraftBukkit start - add method
-+ public void registerRecipe(ItemStack itemstack, ItemStack itemstack1, float f) {
-+ this.customRecipes.put(itemstack, itemstack1);
-+ this.customExperience.put(itemstack, f);
-+ }
-+ // CraftBukkit end
-+
- public void registerRecipe(Block block, ItemStack itemstack, float f) {
- this.a(Item.getItemOf(block), itemstack, f);
- }
-@@ -108,13 +117,23 @@
- }
-
- public ItemStack getResult(ItemStack itemstack) {
-- Iterator iterator = this.recipes.entrySet().iterator();
-+ // CraftBukkit start - initialize to customRecipes
-+ boolean vanilla = false;
-+ Iterator<Entry<ItemStack, ItemStack>> iterator = this.customRecipes.entrySet().iterator();
-+ // CraftBukkit end
-
- Entry entry;
-
- do {
- if (!iterator.hasNext()) {
-- return ItemStack.a;
-+ // CraftBukkit start - fall back to vanilla recipes
-+ if (!vanilla && !this.recipes.isEmpty()) {
-+ iterator = this.recipes.entrySet().iterator();
-+ vanilla = true;
-+ } else {
-+ return ItemStack.a;
-+ }
-+ // CraftBukkit end
- }
-
- entry = (Entry) iterator.next();
-@@ -132,13 +151,23 @@
- }
-
- public float b(ItemStack itemstack) {
-- Iterator iterator = this.experience.entrySet().iterator();
-+ // CraftBukkit start - initialize to customRecipes
-+ boolean vanilla = false;
-+ Iterator<Entry<ItemStack, Float>> iterator = this.customExperience.entrySet().iterator();
-+ // CraftBukkit end
-
- Entry entry;
-
- do {
- if (!iterator.hasNext()) {
-- return 0.0F;
-+ // CraftBukkit start - fall back to vanilla recipes
-+ if (!vanilla && !this.experience.isEmpty()) {
-+ iterator = this.experience.entrySet().iterator();
-+ vanilla = true;
-+ } else {
-+ return 0.0F;
-+ }
-+ // CraftBukkit end
- }
-
- entry = (Entry) iterator.next();
diff --git a/nms-patches/RecipiesShield.patch b/nms-patches/RecipiesShield.patch
index bfdd5ea2..39ab5d66 100644
--- a/nms-patches/RecipiesShield.patch
+++ b/nms-patches/RecipiesShield.patch
@@ -1,20 +1,17 @@
--- a/net/minecraft/server/RecipiesShield.java
+++ b/net/minecraft/server/RecipiesShield.java
-@@ -1,8 +1,15 @@
+@@ -1,10 +1,12 @@
package net.minecraft.server;
--public class RecipiesShield { public static class Decoration implements IRecipe {
-+// CraftBukkit - decompile weirdness
-+public class RecipiesShield {
+-public class RecipiesShield extends IRecipeComplex {
++public class RecipiesShield extends ShapelessRecipes implements IRecipe { // CraftBukkit - added extends
-- public Decoration() {}
-+ public static class Decoration extends ShapelessRecipes implements IRecipe { // CraftBukkit - added extends
-+
-+ // CraftBukkit start - Delegate to new parent class with bogus info
-+ public Decoration() {
-+ super("", new ItemStack(Items.SHIELD, 0, 0), NonNullList.a(RecipeItemStack.a, RecipeItemStack.a(Items.BANNER)));
-+ }
-+ // CraftBukkit end
++ // CraftBukkit start - Delegate to new parent class with bogus info
+ public RecipiesShield(MinecraftKey minecraftkey) {
+- super(minecraftkey);
++ super(minecraftkey, "", new ItemStack(Items.SHIELD, 0), NonNullList.a(RecipeItemStack.a, RecipeItemStack.a(Items.WHITE_BANNER)));
+ }
++ // CraftBukkit end
- public boolean a(InventoryCrafting inventorycrafting, World world) {
- ItemStack itemstack = ItemStack.a;
+ public boolean a(IInventory iinventory, World world) {
+ if (!(iinventory instanceof InventoryCrafting)) {
diff --git a/nms-patches/RegionFileCache.patch b/nms-patches/RegionFileCache.patch
index 84697d79..c91a0f60 100644
--- a/nms-patches/RegionFileCache.patch
+++ b/nms-patches/RegionFileCache.patch
@@ -1,9 +1,9 @@
--- a/net/minecraft/server/RegionFileCache.java
+++ b/net/minecraft/server/RegionFileCache.java
-@@ -74,17 +74,27 @@
- RegionFileCache.a.clear();
+@@ -76,18 +76,28 @@
}
+ @Nullable
- public static DataInputStream d(File file, int i, int j) {
+ // CraftBukkit start - call sites hoisted for synchronization
+ public static synchronized NBTTagCompound d(File file, int i, int j) throws IOException {
@@ -19,6 +19,7 @@
+ return NBTCompressedStreamTools.a(datainputstream);
}
+ @Nullable
- public static DataOutputStream e(File file, int i, int j) {
+ public static synchronized void e(File file, int i, int j, NBTTagCompound nbttagcompound) throws IOException {
RegionFile regionfile = a(file, i, j);
diff --git a/nms-patches/RegionLimitedWorldAccess.patch b/nms-patches/RegionLimitedWorldAccess.patch
new file mode 100644
index 00000000..7e68d926
--- /dev/null
+++ b/nms-patches/RegionLimitedWorldAccess.patch
@@ -0,0 +1,30 @@
+--- a/net/minecraft/server/RegionLimitedWorldAccess.java
++++ b/net/minecraft/server/RegionLimitedWorldAccess.java
+@@ -25,10 +25,10 @@
+ private final Random k;
+ private final WorldProvider l;
+ private final GeneratorSettings m;
+- private final TickList<Block> n = new TickListWorldGen((blockposition) -> {
++ private final TickList<Block> n = new TickListWorldGen<>((blockposition) -> { // CraftBukkit - decompile error
+ return this.y(blockposition).k();
+ });
+- private final TickList<FluidType> o = new TickListWorldGen((blockposition) -> {
++ private final TickList<FluidType> o = new TickListWorldGen<>((blockposition) -> { // CraftBukkit - decompile error
+ return this.y(blockposition).l();
+ });
+
+@@ -204,7 +204,14 @@
+ this.y(blockposition).e(blockposition);
+ }
+
++ // CraftBukkit start
+ public boolean addEntity(Entity entity) {
++ return addEntity(entity, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.DEFAULT);
++ }
++
++ @Override
++ public boolean addEntity(Entity entity, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason reason) {
++ // CraftBukkit end
+ int i = MathHelper.floor(entity.locX / 16.0D);
+ int j = MathHelper.floor(entity.locZ / 16.0D);
+
diff --git a/nms-patches/RemoteControlCommandListener.patch b/nms-patches/RemoteControlCommandListener.patch
index 22369f89..def02f17 100644
--- a/nms-patches/RemoteControlCommandListener.patch
+++ b/nms-patches/RemoteControlCommandListener.patch
@@ -1,15 +1,20 @@
--- a/net/minecraft/server/RemoteControlCommandListener.java
+++ b/net/minecraft/server/RemoteControlCommandListener.java
-@@ -21,6 +21,12 @@
- return "Rcon";
+@@ -23,6 +23,17 @@
+ return new CommandListenerWrapper(this, new Vec3D(worldserver.getSpawn()), Vec2F.a, worldserver, 4, "Recon", new ChatComponentText("Rcon"), this.b, (Entity) null);
}
+ // CraftBukkit start - Send a String
+ public void sendMessage(String message) {
+ this.a.append(message);
+ }
++
++ @Override
++ public org.bukkit.command.CommandSender getBukkitSender(CommandListenerWrapper wrapper) {
++ return b.remoteConsole;
++ }
+ // CraftBukkit end
+
public void sendMessage(IChatBaseComponent ichatbasecomponent) {
- this.a.append(ichatbasecomponent.toPlainText());
+ this.a.append(ichatbasecomponent.getString());
}
diff --git a/nms-patches/ScoreboardServer.patch b/nms-patches/ScoreboardServer.patch
index 36e6f5ec..d4418990 100644
--- a/nms-patches/ScoreboardServer.patch
+++ b/nms-patches/ScoreboardServer.patch
@@ -1,31 +1,32 @@
--- a/net/minecraft/server/ScoreboardServer.java
+++ b/net/minecraft/server/ScoreboardServer.java
-@@ -21,7 +21,7 @@
+@@ -22,7 +22,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));
+- this.a.getPlayerList().sendAll(new PacketPlayOutScoreboardScore(ScoreboardServer.Action.CHANGE, scoreboardscore.getObjective().getName(), scoreboardscore.getPlayerName(), scoreboardscore.getScore()));
++ this.sendAll(new PacketPlayOutScoreboardScore(ScoreboardServer.Action.CHANGE, scoreboardscore.getObjective().getName(), scoreboardscore.getPlayerName(), scoreboardscore.getScore()));
}
this.b();
-@@ -29,13 +29,13 @@
+@@ -30,14 +30,14 @@
public void handlePlayerRemoved(String s) {
super.handlePlayerRemoved(s);
-- this.a.getPlayerList().sendAll(new PacketPlayOutScoreboardScore(s));
-+ this.sendAll(new PacketPlayOutScoreboardScore(s));
+- this.a.getPlayerList().sendAll(new PacketPlayOutScoreboardScore(ScoreboardServer.Action.REMOVE, (String) null, s, 0));
++ this.sendAll(new PacketPlayOutScoreboardScore(ScoreboardServer.Action.REMOVE, (String) null, s, 0));
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));
- this.b();
- }
+ if (this.b.contains(scoreboardobjective)) {
+- this.a.getPlayerList().sendAll(new PacketPlayOutScoreboardScore(ScoreboardServer.Action.REMOVE, scoreboardobjective.getName(), s, 0));
++ this.sendAll(new PacketPlayOutScoreboardScore(ScoreboardServer.Action.REMOVE, scoreboardobjective.getName(), s, 0));
+ }
-@@ -45,7 +45,7 @@
+ this.b();
+@@ -49,7 +49,7 @@
super.setDisplaySlot(i, scoreboardobjective);
if (scoreboardobjective1 != scoreboardobjective && scoreboardobjective1 != null) {
if (this.h(scoreboardobjective1) > 0) {
@@ -34,7 +35,7 @@
} else {
this.g(scoreboardobjective1);
}
-@@ -53,7 +53,7 @@
+@@ -57,7 +57,7 @@
if (scoreboardobjective != null) {
if (this.b.contains(scoreboardobjective)) {
@@ -43,16 +44,16 @@
} else {
this.e(scoreboardobjective);
}
-@@ -66,7 +66,7 @@
- if (super.addPlayerToTeam(s, s1)) {
- ScoreboardTeam scoreboardteam = this.getTeam(s1);
+@@ -68,7 +68,7 @@
+ public boolean addPlayerToTeam(String s, ScoreboardTeam scoreboardteam) {
+ if (super.addPlayerToTeam(s, scoreboardteam)) {
- this.a.getPlayerList().sendAll(new PacketPlayOutScoreboardTeam(scoreboardteam, Arrays.asList(new String[] { s}), 3));
+ this.sendAll(new PacketPlayOutScoreboardTeam(scoreboardteam, Arrays.asList(new String[] { s}), 3));
this.b();
return true;
} else {
-@@ -76,7 +76,7 @@
+@@ -78,7 +78,7 @@
public void removePlayerFromTeam(String s, ScoreboardTeam scoreboardteam) {
super.removePlayerFromTeam(s, scoreboardteam);
@@ -61,7 +62,7 @@
this.b();
}
-@@ -88,7 +88,7 @@
+@@ -90,7 +90,7 @@
public void handleObjectiveChanged(ScoreboardObjective scoreboardobjective) {
super.handleObjectiveChanged(scoreboardobjective);
if (this.b.contains(scoreboardobjective)) {
@@ -70,7 +71,7 @@
}
this.b();
-@@ -105,19 +105,19 @@
+@@ -107,19 +107,19 @@
public void handleTeamAdded(ScoreboardTeam scoreboardteam) {
super.handleTeamAdded(scoreboardteam);
@@ -93,7 +94,7 @@
this.b();
}
-@@ -166,6 +166,7 @@
+@@ -168,6 +168,7 @@
while (iterator.hasNext()) {
EntityPlayer entityplayer = (EntityPlayer) iterator.next();
@@ -101,7 +102,7 @@
Iterator iterator1 = list.iterator();
while (iterator1.hasNext()) {
-@@ -198,6 +199,7 @@
+@@ -200,6 +201,7 @@
while (iterator.hasNext()) {
EntityPlayer entityplayer = (EntityPlayer) iterator.next();
@@ -109,11 +110,10 @@
Iterator iterator1 = list.iterator();
while (iterator1.hasNext()) {
-@@ -221,4 +223,14 @@
-
+@@ -224,6 +226,16 @@
return i;
}
-+
+
+ // CraftBukkit start - Send to players
+ private void sendAll(Packet packet) {
+ for (EntityPlayer entityplayer : (List<EntityPlayer>) this.a.getPlayerList().players) {
@@ -123,4 +123,7 @@
+ }
+ }
+ // CraftBukkit end
- }
++
+ public static enum Action {
+
+ CHANGE, REMOVE;
diff --git a/nms-patches/ScoreboardTeam.patch b/nms-patches/ScoreboardTeam.patch
new file mode 100644
index 00000000..7e9da9c2
--- /dev/null
+++ b/nms-patches/ScoreboardTeam.patch
@@ -0,0 +1,47 @@
+--- a/net/minecraft/server/ScoreboardTeam.java
++++ b/net/minecraft/server/ScoreboardTeam.java
+@@ -36,7 +36,7 @@
+ }
+
+ public String getDisplayName() {
+- return this.d;
++ return this.prefix + this.d + this.suffix; // CraftBukkit
+ }
+
+ public IChatBaseComponent d() {
+@@ -165,4 +165,35 @@
+ public EnumChatFormat getColor() {
+ return this.k;
+ }
++
++ // CraftBukkit start
++ private String prefix;
++ private String suffix;
++
++ public String getPrefix() {
++ return prefix;
++ }
++
++ public void setPrefix(String prefix) {
++ if (prefix == null) {
++ throw new IllegalArgumentException("Prefix cannot be null");
++ }
++
++ this.prefix = prefix;
++ this.a.handleTeamChanged(this);
++ }
++
++ public String getSuffix() {
++ return suffix;
++ }
++
++ public void setSuffix(String suffix) {
++ if (prefix == null) {
++ throw new IllegalArgumentException("Suffix cannot be null");
++ }
++
++ this.suffix = suffix;
++ this.a.handleTeamChanged(this);
++ }
++ // CraftBukkit end
+ }
diff --git a/nms-patches/SecondaryWorldServer.patch b/nms-patches/SecondaryWorldServer.patch
index f05e64bb..f92f9531 100644
--- a/nms-patches/SecondaryWorldServer.patch
+++ b/nms-patches/SecondaryWorldServer.patch
@@ -1,6 +1,6 @@
--- a/net/minecraft/server/SecondaryWorldServer.java
+++ b/net/minecraft/server/SecondaryWorldServer.java
-@@ -4,9 +4,12 @@
+@@ -6,9 +6,12 @@
private final WorldServer a;
@@ -15,7 +15,7 @@
worldserver.getWorldBorder().a(new IWorldBorderListener() {
public void a(WorldBorder worldborder, double d0) {
SecondaryWorldServer.this.getWorldBorder().setSize(d0);
-@@ -36,9 +39,10 @@
+@@ -38,9 +41,10 @@
SecondaryWorldServer.this.getWorldBorder().setDamageBuffer(d0);
}
});
@@ -25,9 +25,9 @@
- protected void a() {}
+ // protected void a() {} // CraftBukkit
- public World b() {
- this.worldMaps = this.a.Z();
-@@ -56,7 +60,7 @@
+ public GeneratorAccess b() {
+ this.worldMaps = this.a.s_();
+@@ -55,7 +59,7 @@
this.villages.a((World) this);
}
@@ -35,4 +35,4 @@
+ return super.b(); // CraftBukkit
}
- public void c() {
+ public void t_() {
diff --git a/nms-patches/ShapedRecipes.patch b/nms-patches/ShapedRecipes.patch
index e5c8474d..b68788a1 100644
--- a/nms-patches/ShapedRecipes.patch
+++ b/nms-patches/ShapedRecipes.patch
@@ -1,9 +1,9 @@
--- a/net/minecraft/server/ShapedRecipes.java
+++ b/net/minecraft/server/ShapedRecipes.java
-@@ -14,6 +14,10 @@
+@@ -13,6 +13,10 @@
+ import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
- import javax.annotation.Nullable;
+// CraftBukkit start
+import org.bukkit.craftbukkit.inventory.CraftItemStack;
+import org.bukkit.craftbukkit.inventory.CraftShapedRecipe;
@@ -11,22 +11,7 @@
public class ShapedRecipes implements IRecipe {
-@@ -22,6 +26,14 @@
- private final NonNullList<RecipeItemStack> items;
- private final ItemStack result;
- private final String e;
-+ // CraftBukkit start
-+ public MinecraftKey key;
-+
-+ @Override
-+ public void setKey(MinecraftKey key) {
-+ this.key = key;
-+ }
-+ // CraftBukkit end
-
- public ShapedRecipes(String s, int i, int j, NonNullList<RecipeItemStack> nonnulllist, ItemStack itemstack) {
- this.e = s;
-@@ -31,6 +43,63 @@
+@@ -32,6 +36,64 @@
this.result = itemstack;
}
@@ -77,9 +62,10 @@
+ }
+ char c = 'a';
+ for (RecipeItemStack list : this.items) {
-+ if (list != null && list.choices.length > 0) {
++ list.buildChoices();
++ if (list.choices.length > 0) {
+ net.minecraft.server.ItemStack stack = list.choices[0];
-+ recipe.setIngredient(c, org.bukkit.craftbukkit.util.CraftMagicNumbers.getMaterial(stack.getItem()), (list.choices.length) > 1 ? 32767 : stack.getData());
++ recipe.setIngredient(c, org.bukkit.craftbukkit.util.CraftMagicNumbers.getMaterial(stack.getItem()), (list.choices.length) > 1 ? 32767 : 0);
+ }
+ c++;
+ }
@@ -87,6 +73,20 @@
+ }
+ // CraftBukkit end
+
- public ItemStack b() {
- return this.result;
+ public MinecraftKey getKey() {
+ return this.e;
+ }
+@@ -302,11 +364,11 @@
+ packetdataserializer.a(shapedrecipes.result);
+ }
+
+- public IRecipe a(MinecraftKey minecraftkey, PacketDataSerializer packetdataserializer) {
++ public ShapedRecipes a(MinecraftKey minecraftkey, PacketDataSerializer packetdataserializer) { // CraftBukkit - decompile error
+ return this.b(minecraftkey, packetdataserializer);
+ }
+
+- public IRecipe a(MinecraftKey minecraftkey, JsonObject jsonobject) {
++ public ShapedRecipes a(MinecraftKey minecraftkey, JsonObject jsonobject) { // CraftBukkit - decompile error
+ return this.b(minecraftkey, jsonobject);
+ }
}
diff --git a/nms-patches/ShapelessRecipes.patch b/nms-patches/ShapelessRecipes.patch
index d91e17c7..9f214f4c 100644
--- a/nms-patches/ShapelessRecipes.patch
+++ b/nms-patches/ShapelessRecipes.patch
@@ -1,8 +1,8 @@
--- a/net/minecraft/server/ShapelessRecipes.java
+++ b/net/minecraft/server/ShapelessRecipes.java
-@@ -6,12 +6,24 @@
+@@ -5,6 +5,10 @@
import com.google.gson.JsonParseException;
- import java.util.ArrayList;
+ import it.unimi.dsi.fastutil.ints.IntList;
import java.util.Iterator;
+// CraftBukkit start
+import org.bukkit.craftbukkit.inventory.CraftItemStack;
@@ -11,21 +11,7 @@
public class ShapelessRecipes implements IRecipe {
- private final ItemStack result;
- private final NonNullList<RecipeItemStack> ingredients;
- private final String c;
-+ // CraftBukkit start
-+ public MinecraftKey key;
-+
-+ @Override
-+ public void setKey(MinecraftKey key) {
-+ this.key = key;
-+ }
-+ // CraftBukkit end
-
- public ShapelessRecipes(String s, ItemStack itemstack, NonNullList<RecipeItemStack> nonnulllist) {
- this.c = s;
-@@ -19,6 +31,21 @@
+@@ -20,6 +24,20 @@
this.ingredients = nonnulllist;
}
@@ -35,15 +21,28 @@
+ CraftItemStack result = CraftItemStack.asCraftMirror(this.result);
+ CraftShapelessRecipe recipe = new CraftShapelessRecipe(result, this);
+ for (RecipeItemStack list : this.ingredients) {
-+ if (list != null) {
-+ net.minecraft.server.ItemStack stack = list.choices[0];
-+ recipe.addIngredient(org.bukkit.craftbukkit.util.CraftMagicNumbers.getMaterial(stack.getItem()), (list.choices.length) > 1 ? 32767 : stack.getData());
-+ }
++ list.buildChoices();
++ net.minecraft.server.ItemStack stack = list.choices[0];
++ recipe.addIngredient(org.bukkit.craftbukkit.util.CraftMagicNumbers.getMaterial(stack.getItem()), (list.choices.length) > 1 ? 32767 : 0);
+ }
+ return recipe;
+ }
+ // CraftBukkit end
+
- public ItemStack b() {
- return this.result;
+ public MinecraftKey getKey() {
+ return this.a;
+ }
+@@ -127,11 +145,11 @@
+ packetdataserializer.a(shapelessrecipes.result);
+ }
+
+- public IRecipe a(MinecraftKey minecraftkey, PacketDataSerializer packetdataserializer) {
++ public ShapelessRecipes a(MinecraftKey minecraftkey, PacketDataSerializer packetdataserializer) { // CraftBukkit - decompile error
+ return this.b(minecraftkey, packetdataserializer);
+ }
+
+- public IRecipe a(MinecraftKey minecraftkey, JsonObject jsonobject) {
++ public ShapelessRecipes a(MinecraftKey minecraftkey, JsonObject jsonobject) { // CraftBukkit - decompile error
+ return this.b(minecraftkey, jsonobject);
+ }
}
diff --git a/nms-patches/SlotFurnaceResult.patch b/nms-patches/SlotFurnaceResult.patch
index bcc110d7..eee722f9 100644
--- a/nms-patches/SlotFurnaceResult.patch
+++ b/nms-patches/SlotFurnaceResult.patch
@@ -1,32 +1,32 @@
--- a/net/minecraft/server/SlotFurnaceResult.java
+++ b/net/minecraft/server/SlotFurnaceResult.java
-@@ -1,5 +1,10 @@
- package net.minecraft.server;
+@@ -2,6 +2,10 @@
+ import java.util.Iterator;
+ import java.util.Map.Entry;
+// CraftBukkit start
+import org.bukkit.entity.Player;
+import org.bukkit.event.inventory.FurnaceExtractEvent;
+// CraftBukkit end
-+
+
public class SlotFurnaceResult extends Slot {
- private final EntityHuman a;
-@@ -51,6 +56,18 @@
- i = j;
- }
+@@ -66,6 +70,18 @@
+ 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());
++ // 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());
+
-+ if (b != 0) {
-+ FurnaceExtractEvent event = new FurnaceExtractEvent(player, block, org.bukkit.craftbukkit.util.CraftMagicNumbers.getMaterial(itemstack.getItem()), b, i);
-+ a.world.getServer().getPluginManager().callEvent(event);
-+ i = event.getExpToDrop();
-+ }
-+ // CraftBukkit end
++ if (b != 0) {
++ FurnaceExtractEvent event = new FurnaceExtractEvent(player, block, org.bukkit.craftbukkit.util.CraftMagicNumbers.getMaterial(itemstack.getItem()), b, i);
++ a.world.getServer().getPluginManager().callEvent(event);
++ i = event.getExpToDrop();
++ }
++ // CraftBukkit end
+
- while (i > 0) {
- j = EntityExperienceOrb.getOrbValue(i);
- i -= j;
+ while (i > 0) {
+ j = EntityExperienceOrb.getOrbValue(i);
+ i -= j;
diff --git a/nms-patches/SpawnerCreature.patch b/nms-patches/SpawnerCreature.patch
index ce90948f..0bfac793 100644
--- a/nms-patches/SpawnerCreature.patch
+++ b/nms-patches/SpawnerCreature.patch
@@ -1,8 +1,8 @@
--- a/net/minecraft/server/SpawnerCreature.java
+++ b/net/minecraft/server/SpawnerCreature.java
-@@ -6,10 +6,16 @@
- import java.util.Random;
- import java.util.Set;
+@@ -9,11 +9,17 @@
+ import org.apache.logging.log4j.LogManager;
+ import org.apache.logging.log4j.Logger;
+// CraftBukkit start
+import org.bukkit.craftbukkit.util.LongHash;
@@ -12,32 +12,33 @@
+
public final class SpawnerCreature {
- private static final int a = (int) Math.pow(17.0D, 2.0D);
-- private final Set<ChunkCoordIntPair> b = Sets.newHashSet();
-+ private final LongHashSet b = new LongHashSet(); // CraftBukkit
+ private static final Logger a = LogManager.getLogger();
+ private static final int b = (int) Math.pow(17.0D, 2.0D);
+- private final Set<ChunkCoordIntPair> c = Sets.newHashSet();
++ private final LongHashSet c = new LongHashSet(); // CraftBukkit
public SpawnerCreature() {}
-@@ -38,13 +44,16 @@
+@@ -42,13 +48,16 @@
boolean flag4 = i1 == -8 || i1 == 8 || k == -8 || k == 8;
ChunkCoordIntPair chunkcoordintpair = new ChunkCoordIntPair(i1 + l, k + j);
-- if (!this.b.contains(chunkcoordintpair)) {
+- if (!this.c.contains(chunkcoordintpair)) {
+ // CraftBukkit start - use LongHash and LongHashSet
+ long chunkCoords = LongHash.toLong(chunkcoordintpair.x, chunkcoordintpair.z);
-+ if (!this.b.contains(chunkCoords)) {
++ if (!this.c.contains(chunkCoords)) {
++i;
if (!flag4 && worldserver.getWorldBorder().isInBounds(chunkcoordintpair)) {
PlayerChunk playerchunk = worldserver.getPlayerChunkMap().getChunk(chunkcoordintpair.x, chunkcoordintpair.z);
if (playerchunk != null && playerchunk.e()) {
-- this.b.add(chunkcoordintpair);
-+ this.b.add(chunkCoords);
+- this.c.add(chunkcoordintpair);
++ this.c.add(chunkCoords);
+ // CraftBukkit end
}
}
}
-@@ -62,9 +71,31 @@
+@@ -66,9 +75,31 @@
for (int k1 = 0; k1 < j; ++k1) {
EnumCreatureType enumcreaturetype = aenumcreaturetype[k1];
@@ -63,16 +64,16 @@
+ }
+ // CraftBukkit end
+
- if ((!enumcreaturetype.d() || flag1) && (enumcreaturetype.d() || flag) && (!enumcreaturetype.e() || flag2)) {
+ if ((!enumcreaturetype.c() || flag1) && (enumcreaturetype.c() || flag) && (!enumcreaturetype.d() || flag2)) {
k = worldserver.a(enumcreaturetype.a());
-- int l1 = enumcreaturetype.b() * i / SpawnerCreature.a;
-+ int l1 = limit * i / a; // CraftBukkit - use per-world limits
+- int l1 = enumcreaturetype.b() * i / SpawnerCreature.b;
++ int l1 = limit * i / b; // CraftBukkit - use per-world limits
if (k <= l1) {
BlockPosition.MutableBlockPosition blockposition_mutableblockposition = new BlockPosition.MutableBlockPosition();
-@@ -72,8 +103,10 @@
+@@ -76,8 +107,10 @@
- label120:
+ label128:
while (iterator1.hasNext()) {
- ChunkCoordIntPair chunkcoordintpair1 = (ChunkCoordIntPair) iterator1.next();
- BlockPosition blockposition1 = getRandomPosition(worldserver, chunkcoordintpair1.x, chunkcoordintpair1.z);
@@ -83,29 +84,28 @@
int i2 = blockposition1.getX();
int j2 = blockposition1.getY();
int k2 = blockposition1.getZ();
-@@ -125,8 +158,11 @@
- if (entityinsentient.P() && entityinsentient.canSpawn()) {
- groupdataentity = entityinsentient.prepare(worldserver.D(new BlockPosition(entityinsentient)), groupdataentity);
- if (entityinsentient.canSpawn()) {
-- ++l2;
-- worldserver.addEntity(entityinsentient);
-+ // CraftBukkit start
-+ if (worldserver.addEntity(entityinsentient, SpawnReason.NATURAL)) {
-+ ++l2;
-+ }
-+ // CraftBukkit end
- } else {
- entityinsentient.die();
- }
-@@ -226,8 +262,10 @@
+@@ -136,9 +169,12 @@
+ if (entityinsentient.M() && entityinsentient.a((IWorldReader) worldserver)) {
+ groupdataentity = entityinsentient.prepare(worldserver.getDamageScaler(new BlockPosition(entityinsentient)), groupdataentity, (NBTTagCompound) null);
+ if (entityinsentient.a((IWorldReader) worldserver)) {
+- ++l2;
+- ++j4;
+- worldserver.addEntity(entityinsentient);
++ // CraftBukkit start
++ if (worldserver.addEntity(entityinsentient, SpawnReason.NATURAL)) {
++ ++l2;
++ ++j4;
++ }
++ // CraftBukkit end
+ } else {
+ entityinsentient.die();
+ }
+@@ -255,7 +291,7 @@
+ entityinsentient.setPositionRotation((double) f, (double) blockposition.getY(), (double) f1, random.nextFloat() * 360.0F, 0.0F);
+ if (entityinsentient.a(generatoraccess) && entityinsentient.a((IWorldReader) generatoraccess)) {
+ groupdataentity = entityinsentient.prepare(generatoraccess.getDamageScaler(new BlockPosition(entityinsentient)), groupdataentity, (NBTTagCompound) null);
+- generatoraccess.addEntity(entityinsentient);
++ generatoraccess.addEntity(entityinsentient, SpawnReason.CHUNK_GEN); // CraftBukkit
+ flag = true;
}
-
- 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.D(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
index 93e6895a..1d6c4129 100644
--- a/nms-patches/StatisticManager.patch
+++ b/nms-patches/StatisticManager.patch
@@ -1,9 +1,9 @@
--- a/net/minecraft/server/StatisticManager.java
+++ b/net/minecraft/server/StatisticManager.java
-@@ -10,6 +10,12 @@
- public StatisticManager() {}
+@@ -13,6 +13,12 @@
+ }
- public void b(EntityHuman entityhuman, Statistic statistic, int i) {
+ public void b(EntityHuman entityhuman, Statistic<?> statistic, int i) {
+ // 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()) {
diff --git a/nms-patches/TickListServer.patch b/nms-patches/TickListServer.patch
new file mode 100644
index 00000000..50a952e3
--- /dev/null
+++ b/nms-patches/TickListServer.patch
@@ -0,0 +1,111 @@
+--- a/net/minecraft/server/TickListServer.java
++++ b/net/minecraft/server/TickListServer.java
+@@ -11,14 +11,15 @@
+ import java.util.function.Consumer;
+ import java.util.function.Function;
+ import java.util.function.Predicate;
++import org.bukkit.craftbukkit.util.HashTreeSet; // CraftBukkit
+
+ public class TickListServer<T> implements TickList<T> {
+
+ protected final Predicate<T> a;
+ protected final Function<T, MinecraftKey> b;
+ protected final Function<MinecraftKey, T> c;
+- protected final Set<NextTickListEntry<T>> nextTickListHash = Sets.newHashSet();
+- protected final TreeSet<NextTickListEntry<T>> nextTickList = new TreeSet();
++ // protected final Set<NextTickListEntry<T>> nextTickListHash = Sets.newHashSet();
++ protected final HashTreeSet<NextTickListEntry> nextTickList = new HashTreeSet<>(); // CraftBukkit - HashTreeSet
+ private final WorldServer f;
+ private final List<NextTickListEntry<T>> g = Lists.newArrayList();
+ private final Consumer<NextTickListEntry<T>> h;
+@@ -34,16 +35,22 @@
+ public void a() {
+ int i = this.nextTickList.size();
+
+- if (i != this.nextTickListHash.size()) {
++ if (false) { // CraftBukkit
+ throw new IllegalStateException("TickNextTick list out of synch");
+ } else {
+ if (i > 65536) {
+- i = 65536;
++ // CraftBukkit start - If the server has too much to process over time, try to alleviate that
++ if (i > 20 * 65536) {
++ i = i / 20;
++ } else {
++ i = 65536;
++ }
++ // CraftBukkit end
+ }
+
+ this.f.methodProfiler.a("cleaning");
+
+- NextTickListEntry nextticklistentry;
++ NextTickListEntry<T> nextticklistentry; // CraftBukkit - decompile error
+
+ for (int j = 0; j < i; ++j) {
+ nextticklistentry = (NextTickListEntry) this.nextTickList.first();
+@@ -52,7 +59,7 @@
+ }
+
+ this.nextTickList.remove(nextticklistentry);
+- this.nextTickListHash.remove(nextticklistentry);
++ // this.nextTickListHash.remove(nextticklistentry); // CraftBukkit - use nextTickList
+ this.g.add(nextticklistentry);
+ }
+
+@@ -118,7 +125,7 @@
+ if (blockposition.getX() >= structureboundingbox.a && blockposition.getX() < structureboundingbox.d && blockposition.getZ() >= structureboundingbox.c && blockposition.getZ() < structureboundingbox.f) {
+ if (flag) {
+ if (i == 0) {
+- this.nextTickListHash.remove(nextticklistentry);
++ // this.nextTickListHash.remove(nextticklistentry); // CraftBukkit - removed
+ }
+
+ iterator.remove();
+@@ -141,7 +148,7 @@
+ Iterator iterator = list.iterator();
+
+ while (iterator.hasNext()) {
+- NextTickListEntry nextticklistentry = (NextTickListEntry) iterator.next();
++ NextTickListEntry<T> nextticklistentry = (NextTickListEntry) iterator.next(); // CraftBukkit - decompile error
+
+ if (structureboundingbox.b((BaseBlockPosition) nextticklistentry.a)) {
+ BlockPosition blockposition1 = nextticklistentry.a.a((BaseBlockPosition) blockposition);
+@@ -159,7 +166,7 @@
+ Iterator iterator = list.iterator();
+
+ while (iterator.hasNext()) {
+- NextTickListEntry nextticklistentry = (NextTickListEntry) iterator.next();
++ NextTickListEntry<T> nextticklistentry = (NextTickListEntry) iterator.next(); // CraftBukkit - decompile error
+ NBTTagCompound nbttagcompound = new NBTTagCompound();
+
+ nbttagcompound.setString("i", ((MinecraftKey) this.b.apply(nextticklistentry.a())).toString());
+@@ -177,7 +184,7 @@
+ public void a(NBTTagList nbttaglist) {
+ for (int i = 0; i < nbttaglist.size(); ++i) {
+ NBTTagCompound nbttagcompound = nbttaglist.getCompound(i);
+- Object object = this.c.apply(new MinecraftKey(nbttagcompound.getString("i")));
++ T object = this.c.apply(new MinecraftKey(nbttagcompound.getString("i"))); // CraftBukkit - decompile error
+
+ if (object != null) {
+ this.b(new BlockPosition(nbttagcompound.getInt("x"), nbttagcompound.getInt("y"), nbttagcompound.getInt("z")), object, nbttagcompound.getInt("t"), TickListPriority.a(nbttagcompound.getInt("p")));
+@@ -187,7 +194,7 @@
+ }
+
+ public boolean a(BlockPosition blockposition, T t0) {
+- return this.nextTickListHash.contains(new NextTickListEntry(blockposition, t0));
++ return this.nextTickList.contains(new NextTickListEntry(blockposition, t0)); // CraftBukkit
+ }
+
+ public void a(BlockPosition blockposition, T t0, int i, TickListPriority ticklistpriority) {
+@@ -209,8 +216,8 @@
+ private void c(BlockPosition blockposition, T t0, int i, TickListPriority ticklistpriority) {
+ NextTickListEntry nextticklistentry = new NextTickListEntry(blockposition, t0, (long) i + this.f.getTime(), ticklistpriority);
+
+- if (!this.nextTickListHash.contains(nextticklistentry)) {
+- this.nextTickListHash.add(nextticklistentry);
++ // CraftBukkit - use nextTickList
++ if (!this.nextTickList.contains(nextticklistentry)) {
+ this.nextTickList.add(nextticklistentry);
+ }
+
diff --git a/nms-patches/TileEntity.patch b/nms-patches/TileEntity.patch
index 6ebe08e9..b0dbdfbc 100644
--- a/nms-patches/TileEntity.patch
+++ b/nms-patches/TileEntity.patch
@@ -9,9 +9,33 @@
public abstract class TileEntity {
private static final Logger a = LogManager.getLogger();
-@@ -251,4 +253,13 @@
- a("shulker_box", TileEntityShulkerBox.class);
- a("bed", TileEntityBed.class);
+@@ -54,8 +56,15 @@
+ }
+ }
+
++ // CraftBukkit start
+ @Nullable
+ public static TileEntity create(NBTTagCompound nbttagcompound) {
++ return create(nbttagcompound, null);
++ }
++
++ @Nullable
++ public static TileEntity create(NBTTagCompound nbttagcompound, @Nullable World world) {
++ // CraftBukkit end
+ TileEntity tileentity = null;
+ String s = nbttagcompound.getString("id");
+
+@@ -67,6 +76,7 @@
+
+ if (tileentity != null) {
+ try {
++ tileentity.setWorld(world); // CraftBukkit
+ tileentity.load(nbttagcompound);
+ } catch (Throwable throwable1) {
+ TileEntity.a.error("Failed to load data for block entity {}", s, throwable1);
+@@ -156,4 +166,13 @@
+ public TileEntityTypes<?> C() {
+ return this.e;
}
+
+ // CraftBukkit start - add method
diff --git a/nms-patches/TileEntityBanner.patch b/nms-patches/TileEntityBanner.patch
index c9294ee0..4f501b82 100644
--- a/nms-patches/TileEntityBanner.patch
+++ b/nms-patches/TileEntityBanner.patch
@@ -1,9 +1,9 @@
--- a/net/minecraft/server/TileEntityBanner.java
+++ b/net/minecraft/server/TileEntityBanner.java
-@@ -23,6 +23,11 @@
+@@ -30,6 +30,11 @@
if (nbttagcompound != null && nbttagcompound.hasKeyOfType("Patterns", 9)) {
- this.patterns = nbttagcompound.getList("Patterns", 10).d();
+ this.patterns = nbttagcompound.getList("Patterns", 10).c();
+ // CraftBukkit start
+ while (this.patterns.size() > 20) {
+ this.patterns.remove(20);
@@ -11,16 +11,16 @@
+ // CraftBukkit end
}
- this.color = flag ? d(itemstack) : ItemBanner.c(itemstack);
-@@ -67,6 +72,11 @@
+ this.color = enumcolor;
+@@ -79,6 +84,11 @@
+ }
- this.color = EnumColor.fromInvColorIndex(nbttagcompound.getInt("Base"));
this.patterns = nbttagcompound.getList("Patterns", 10);
+ // CraftBukkit start
+ while (this.patterns.size() > 20) {
+ this.patterns.remove(20);
+ }
+ // CraftBukkit end
+ this.h = null;
this.i = null;
this.j = null;
- this.k = null;
diff --git a/nms-patches/TileEntityBeacon.patch b/nms-patches/TileEntityBeacon.patch
index 477bd68e..84fcb11f 100644
--- a/nms-patches/TileEntityBeacon.patch
+++ b/nms-patches/TileEntityBeacon.patch
@@ -1,7 +1,7 @@
--- a/net/minecraft/server/TileEntityBeacon.java
+++ b/net/minecraft/server/TileEntityBeacon.java
@@ -9,6 +9,13 @@
- import java.util.Set;
+ import java.util.stream.Collectors;
import javax.annotation.Nullable;
+// CraftBukkit start
@@ -11,13 +11,13 @@
+import org.bukkit.potion.PotionEffect;
+// CraftBukkit end
+
- public class TileEntityBeacon extends TileEntityContainer implements ITickable, IWorldInventory {
+ public class TileEntityBeacon extends TileEntityContainer implements IWorldInventory, ITickable {
public static final MobEffectList[][] a = new MobEffectList[][] { { MobEffects.FASTER_MOVEMENT, MobEffects.FASTER_DIG}, { MobEffects.RESISTANCE, MobEffects.JUMP}, { MobEffects.INCREASE_DAMAGE}, { MobEffects.REGENERATION}};
-@@ -22,6 +29,38 @@
+@@ -23,6 +30,38 @@
public MobEffectList secondaryEffect;
private ItemStack inventorySlot;
- private String o;
+ private IChatBaseComponent o;
+ // CraftBukkit start - add fields and methods
+ public List<HumanEntity> transaction = new java.util.ArrayList<HumanEntity>();
+ private int maxStack = MAX_STACK;
@@ -52,13 +52,13 @@
+ // CraftBukkit end
public TileEntityBeacon() {
- this.inventorySlot = ItemStack.a;
-@@ -42,41 +81,79 @@
-
+ super(TileEntityTypes.o);
+@@ -56,41 +95,79 @@
+ this.world.a((EntityHuman) null, this.position, soundeffect, SoundCategory.BLOCKS, 1.0F, 1.0F);
}
-- private void E() {
-- if (this.j && this.levels > 0 && !this.world.isClientSide && this.primaryEffect != null) {
+- private void D() {
+- if (this.i && this.levels > 0 && !this.world.isClientSide && this.primaryEffect != null) {
- double d0 = (double) (this.levels * 10 + 10);
+ // CraftBukkit start - split into components
+ private byte getAmplification() {
@@ -123,8 +123,8 @@
+ }
+ }
+
-+ private void E() {
-+ if (this.j && this.levels > 0 && !this.world.isClientSide && this.primaryEffect != null) {
++ private void D() {
++ if (this.i && this.levels > 0 && !this.world.isClientSide && this.primaryEffect != null) {
+ byte b0 = getAmplification();
+
+ int i = getLevel();
@@ -140,14 +140,14 @@
}
+ // CraftBukkit end
- private void F() {
+ private void E() {
int i = this.position.getX();
-@@ -195,8 +272,10 @@
+@@ -210,8 +287,10 @@
public void load(NBTTagCompound nbttagcompound) {
super.load(nbttagcompound);
-- this.primaryEffect = f(nbttagcompound.getInt("Primary"));
-- this.secondaryEffect = f(nbttagcompound.getInt("Secondary"));
+- this.primaryEffect = e(nbttagcompound.getInt("Primary"));
+- this.secondaryEffect = e(nbttagcompound.getInt("Secondary"));
+ // Craftbukkit start - persist manually set non-default beacon effects (SPIGOT-3598)
+ this.primaryEffect = MobEffectList.fromId(nbttagcompound.getInt("Primary"));
+ this.secondaryEffect = MobEffectList.fromId(nbttagcompound.getInt("Secondary"));
diff --git a/nms-patches/TileEntityBrewingStand.patch b/nms-patches/TileEntityBrewingStand.patch
index fe3d21e3..bafd46ee 100644
--- a/nms-patches/TileEntityBrewingStand.patch
+++ b/nms-patches/TileEntityBrewingStand.patch
@@ -1,8 +1,8 @@
--- a/net/minecraft/server/TileEntityBrewingStand.java
+++ b/net/minecraft/server/TileEntityBrewingStand.java
-@@ -3,6 +3,16 @@
- import java.util.Arrays;
+@@ -4,6 +4,16 @@
import java.util.Iterator;
+ import javax.annotation.Nullable;
+// CraftBukkit start
+import java.util.List;
@@ -14,12 +14,12 @@
+import org.bukkit.inventory.InventoryHolder;
+// CraftBukkit end
+
- public class TileEntityBrewingStand extends TileEntityContainer implements ITickable, IWorldInventory {
+ public class TileEntityBrewingStand extends TileEntityContainer implements IWorldInventory, ITickable {
private static final int[] a = new int[] { 3};
-@@ -14,6 +24,31 @@
- private Item k;
- private String l;
+@@ -15,6 +25,31 @@
+ private Item j;
+ private IChatBaseComponent k;
private int fuelLevel;
+ // CraftBukkit start - add fields and methods
+ private int lastTick = MinecraftServer.currentTick;
@@ -48,8 +48,8 @@
+ // CraftBukkit end
public TileEntityBrewingStand() {
- this.items = NonNullList.a(5, ItemStack.a);
-@@ -55,8 +90,19 @@
+ super(TileEntityTypes.l);
+@@ -62,8 +97,19 @@
ItemStack itemstack = (ItemStack) this.items.get(4);
if (this.fuelLevel <= 0 && itemstack.getItem() == Items.BLAZE_POWDER) {
@@ -71,7 +71,7 @@
this.update();
}
-@@ -64,9 +110,14 @@
+@@ -71,9 +117,14 @@
boolean flag1 = this.brewTime > 0;
ItemStack itemstack1 = (ItemStack) this.items.get(3);
@@ -87,10 +87,10 @@
+ // CraftBukkit end
if (flag2 && flag) {
- this.p();
-@@ -140,6 +191,16 @@
+ this.r();
+@@ -147,6 +198,16 @@
- private void p() {
+ private void r() {
ItemStack itemstack = (ItemStack) this.items.get(3);
+ // CraftBukkit start
+ InventoryHolder owner = this.getOwner();
@@ -105,7 +105,7 @@
for (int i = 0; i < 3; ++i) {
this.items.set(i, PotionBrewer.d(itemstack, (ItemStack) this.items.get(i)));
-@@ -210,7 +271,7 @@
+@@ -213,7 +274,7 @@
}
public int getMaxStackSize() {
diff --git a/nms-patches/TileEntityChest.patch b/nms-patches/TileEntityChest.patch
index c302cf64..80ec4086 100644
--- a/nms-patches/TileEntityChest.patch
+++ b/nms-patches/TileEntityChest.patch
@@ -1,9 +1,9 @@
--- a/net/minecraft/server/TileEntityChest.java
+++ b/net/minecraft/server/TileEntityChest.java
-@@ -3,6 +3,10 @@
+@@ -2,6 +2,10 @@
+
import java.util.Iterator;
import java.util.List;
- import javax.annotation.Nullable;
+// CraftBukkit start
+import org.bukkit.craftbukkit.entity.CraftHumanEntity;
+import org.bukkit.entity.HumanEntity;
@@ -11,9 +11,9 @@
public class TileEntityChest extends TileEntityLootable implements ITickable {
-@@ -18,6 +22,31 @@
- private int q;
- private BlockChest.Type r;
+@@ -11,6 +15,31 @@
+ protected int f;
+ private int k;
+ // CraftBukkit start - add fields and methods
+ public List<HumanEntity> transaction = new java.util.ArrayList<HumanEntity>();
@@ -40,10 +40,10 @@
+ }
+ // CraftBukkit end
+
- public TileEntityChest() {
+ protected TileEntityChest(TileEntityTypes<?> tileentitytypes) {
+ super(tileentitytypes);
this.items = NonNullList.a(27, ItemStack.a);
- }
-@@ -82,7 +111,7 @@
+@@ -75,7 +104,7 @@
}
public int getMaxStackSize() {
@@ -51,54 +51,50 @@
+ return maxStack; // CraftBukkit
}
- public void invalidateBlockCache() {
-@@ -258,9 +287,21 @@
- if (this.l < 0) {
- this.l = 0;
+ public void X_() {
+@@ -170,8 +199,20 @@
+ if (this.f < 0) {
+ this.f = 0;
}
-+ int oldPower = Math.max(0, Math.min(15, this.l)); // CraftBukkit - Get power before new viewer is added
++ int oldPower = Math.max(0, Math.min(15, this.f)); // CraftBukkit - Get power before new viewer is added
- ++this.l;
+ ++this.f;
+ if (this.world == null) return; // CraftBukkit
- this.world.playBlockAction(this.position, this.getBlock(), 1, this.l);
+
+ // CraftBukkit start - Call redstone event
+ if (this.getBlock() == Blocks.TRAPPED_CHEST) {
-+ int newPower = Math.max(0, Math.min(15, this.l));
++ int newPower = Math.max(0, Math.min(15, this.f));
+
+ if (oldPower != newPower) {
-+ org.bukkit.craftbukkit.event.CraftEventFactory.callRedstoneChange(world, position.getX(), position.getY(), position.getZ(), oldPower, newPower);
++ org.bukkit.craftbukkit.event.CraftEventFactory.callRedstoneChange(world, position, oldPower, newPower);
+ }
+ }
+ // CraftBukkit end
- this.world.applyPhysics(this.position, this.getBlock(), false);
- if (this.p() == BlockChest.Type.TRAP) {
- this.world.applyPhysics(this.position.down(), this.getBlock(), false);
-@@ -271,12 +312,21 @@
+ this.p();
+ }
+
+@@ -179,7 +220,18 @@
public void closeContainer(EntityHuman entityhuman) {
- if (!entityhuman.isSpectator() && this.getBlock() instanceof BlockChest) {
-+ int oldPower = Math.max(0, Math.min(15, this.l)); // CraftBukkit - Get power before new viewer is added
- --this.l;
- this.world.playBlockAction(this.position, this.getBlock(), 1, this.l);
- this.world.applyPhysics(this.position, this.getBlock(), false);
+ if (!entityhuman.isSpectator()) {
++ int oldPower = Math.max(0, Math.min(15, this.f)); // CraftBukkit - Get power before new viewer is added
+ --this.f;
+
+ // CraftBukkit start - Call redstone event
- if (this.p() == BlockChest.Type.TRAP) {
-+ int newPower = Math.max(0, Math.min(15, this.l));
++ if (this.getBlock() == Blocks.TRAPPED_CHEST) {
++ int newPower = Math.max(0, Math.min(15, this.f));
+
+ if (oldPower != newPower) {
-+ org.bukkit.craftbukkit.event.CraftEventFactory.callRedstoneChange(world, position.getX(), position.getY(), position.getZ(), oldPower, newPower);
++ org.bukkit.craftbukkit.event.CraftEventFactory.callRedstoneChange(world, position, oldPower, newPower);
+ }
- this.world.applyPhysics(this.position.down(), this.getBlock(), false);
- }
++ }
+ // CraftBukkit end
+ this.p();
}
- }
-@@ -311,4 +361,11 @@
- protected NonNullList<ItemStack> q() {
- return this.items;
+@@ -232,4 +284,11 @@
+ tileentitychest.a(tileentitychest1.q());
+ tileentitychest1.a(nonnulllist);
}
+
+ // CraftBukkit start
diff --git a/nms-patches/TileEntityCommand.patch b/nms-patches/TileEntityCommand.patch
index c31a6b81..b23a8e4c 100644
--- a/nms-patches/TileEntityCommand.patch
+++ b/nms-patches/TileEntityCommand.patch
@@ -1,12 +1,16 @@
--- a/net/minecraft/server/TileEntityCommand.java
+++ b/net/minecraft/server/TileEntityCommand.java
-@@ -9,6 +9,9 @@
+@@ -9,6 +9,13 @@
+ private boolean f;
private boolean g;
- private boolean h;
- private final CommandBlockListenerAbstract i = new CommandBlockListenerAbstract() {
-+ {
-+ sender = new org.bukkit.craftbukkit.command.CraftBlockCommandSender(this); // CraftBukkit - add sender
+ private final CommandBlockListenerAbstract h = new CommandBlockListenerAbstract() {
++ // CraftBukkit start
++ @Override
++ public org.bukkit.command.CommandSender getBukkitSender(CommandListenerWrapper wrapper) {
++ return new org.bukkit.craftbukkit.command.CraftBlockCommandSender(wrapper);
+ }
- public BlockPosition getChunkCoordinates() {
- return TileEntityCommand.this.position;
- }
++ // CraftBukkit end
++
+ public void setCommand(String s) {
+ super.setCommand(s);
+ TileEntityCommand.this.update();
diff --git a/nms-patches/TileEntityContainer.patch b/nms-patches/TileEntityContainer.patch
index e49e2ca9..b01f8025 100644
--- a/nms-patches/TileEntityContainer.patch
+++ b/nms-patches/TileEntityContainer.patch
@@ -1,8 +1,8 @@
--- a/net/minecraft/server/TileEntityContainer.java
+++ b/net/minecraft/server/TileEntityContainer.java
-@@ -37,4 +37,12 @@
- public IChatBaseComponent getScoreboardDisplayName() {
- return (IChatBaseComponent) (this.hasCustomName() ? new ChatComponentText(this.getName()) : new ChatMessage(this.getName(), new Object[0]));
+@@ -34,4 +34,12 @@
+ public void setLock(ChestLock chestlock) {
+ this.a = chestlock;
}
+
+ // CraftBukkit start
diff --git a/nms-patches/TileEntityDispenser.patch b/nms-patches/TileEntityDispenser.patch
index 3414c8aa..54a13254 100644
--- a/nms-patches/TileEntityDispenser.patch
+++ b/nms-patches/TileEntityDispenser.patch
@@ -41,10 +41,10 @@
+ }
+ // CraftBukkit end
+
- public TileEntityDispenser() {
+ protected TileEntityDispenser(TileEntityTypes<?> tileentitytypes) {
+ super(tileentitytypes);
this.items = NonNullList.a(9, ItemStack.a);
- }
-@@ -92,7 +123,7 @@
+@@ -97,7 +128,7 @@
}
public int getMaxStackSize() {
diff --git a/nms-patches/TileEntityEndGateway.patch b/nms-patches/TileEntityEndGateway.patch
index 7fc375f1..585f0f16 100644
--- a/nms-patches/TileEntityEndGateway.patch
+++ b/nms-patches/TileEntityEndGateway.patch
@@ -13,9 +13,9 @@
public class TileEntityEndGateway extends TileEntityEnderPortal implements ITickable {
-@@ -111,6 +117,26 @@
+@@ -113,6 +119,26 @@
if (this.exitPortal != null) {
- BlockPosition blockposition = this.exactTeleport ? this.exitPortal : this.j();
+ BlockPosition blockposition = this.exactTeleport ? this.exitPortal : this.i();
+ // CraftBukkit start - Fire PlayerTeleportEvent
+ if (entity instanceof EntityPlayer) {
@@ -31,7 +31,7 @@
+ }
+
+ ((EntityPlayer) entity).playerConnection.teleport(teleEvent.getTo());
-+ this.h(); // CraftBukkit - call at end of method
++ this.f(); // CraftBukkit - call at end of method
+ return;
+
+ }
diff --git a/nms-patches/TileEntityFurnace.patch b/nms-patches/TileEntityFurnace.patch
index c3e32116..e5861798 100644
--- a/nms-patches/TileEntityFurnace.patch
+++ b/nms-patches/TileEntityFurnace.patch
@@ -1,9 +1,9 @@
--- a/net/minecraft/server/TileEntityFurnace.java
+++ b/net/minecraft/server/TileEntityFurnace.java
-@@ -1,6 +1,15 @@
- package net.minecraft.server;
-
- import java.util.Iterator;
+@@ -9,6 +9,15 @@
+ import java.util.Map;
+ import java.util.Map.Entry;
+ import javax.annotation.Nullable;
+// CraftBukkit start
+import java.util.List;
+
@@ -14,11 +14,11 @@
+import org.bukkit.craftbukkit.entity.CraftHumanEntity;
+// CraftBukkit end
- public class TileEntityFurnace extends TileEntityContainer implements ITickable, IWorldInventory {
+ public class TileEntityFurnace extends TileEntityContainer implements IWorldInventory, RecipeHolder, AutoRecipeOutput, ITickable {
-@@ -14,6 +23,32 @@
- private int cookTimeTotal;
- private String m;
+@@ -98,6 +107,32 @@
+ return linkedhashmap;
+ }
+ // CraftBukkit start - add fields and methods
+ private int lastTick = MinecraftServer.currentTick;
@@ -47,14 +47,14 @@
+ // CraftBukkit end
+
public TileEntityFurnace() {
+ super(TileEntityTypes.b);
this.items = NonNullList.a(3, ItemStack.a);
- }
-@@ -119,11 +154,29 @@
+@@ -225,11 +260,30 @@
}
- public void e() {
+ public void X_() {
- boolean flag = this.isBurning();
-+ boolean flag = (this.getBlock() == Blocks.LIT_FURNACE); // CraftBukkit - SPIGOT-844 - Check if furnace block is lit using the block instead of burn time
++ boolean flag = this.getBlock().get(BlockFurnace.LIT); // CraftBukkit - SPIGOT-844 - Check if furnace block is lit using the block instead of burn time
boolean flag1 = false;
+ // CraftBukkit start - Use wall time instead of ticks for cooking
@@ -62,12 +62,13 @@
+ this.lastTick = MinecraftServer.currentTick;
+
+ // CraftBukkit - moved from below - edited for wall time
-+ if (this.isBurning() && this.canBurn()) {
++ IRecipe irecipe = this.world.D().b(this, this.world);
++ if (this.isBurning() && this.canBurn(irecipe)) {
+ this.cookTime += elapsedTicks;
+ if (this.cookTime >= this.cookTimeTotal) {
+ this.cookTime = 0;
-+ this.cookTimeTotal = this.a((ItemStack) this.items.get(0));
-+ this.burn();
++ this.cookTimeTotal = this.s();
++ this.burn(irecipe);
+ flag1 = true;
+ }
+ } else {
@@ -81,21 +82,22 @@
}
if (!this.world.isClientSide) {
-@@ -134,10 +187,21 @@
+@@ -240,12 +294,21 @@
this.cookTime = MathHelper.clamp(this.cookTime - 2, 0, this.cookTimeTotal);
}
} else {
-- if (!this.isBurning() && this.canBurn()) {
-- this.burnTime = fuelTime(itemstack);
-- this.ticksForCurrentFuel = this.burnTime;
-- if (this.isBurning()) {
+- IRecipe irecipe = this.world.D().b(this, this.world);
+ // CraftBukkit start - Handle multiple elapsed ticks
-+ if (this.burnTime <= 0 && this.canBurn()) { // CraftBukkit - == to <=
++ if (this.burnTime <= 0 && this.canBurn(irecipe)) { // CraftBukkit - == to <=
+ CraftItemStack fuel = CraftItemStack.asCraftMirror(itemstack);
+
+ FurnaceBurnEvent furnaceBurnEvent = new FurnaceBurnEvent(this.world.getWorld().getBlockAt(position.getX(), position.getY(), position.getZ()), fuel, fuelTime(itemstack));
+ this.world.getServer().getPluginManager().callEvent(furnaceBurnEvent);
-+
+
+- if (!this.isBurning() && this.canBurn(irecipe)) {
+- this.burnTime = fuelTime(itemstack);
+- this.ticksForCurrentFuel = this.burnTime;
+- if (this.isBurning()) {
+ if (furnaceBurnEvent.isCancelled()) {
+ return;
+ }
@@ -107,15 +109,15 @@
flag1 = true;
if (!itemstack.isEmpty()) {
Item item = itemstack.getItem();
-@@ -152,6 +216,7 @@
+@@ -260,6 +323,7 @@
}
}
+ /* CraftBukkit start - Moved up
- if (this.isBurning() && this.canBurn()) {
+ if (this.isBurning() && this.canBurn(irecipe)) {
++this.cookTime;
if (this.cookTime == this.cookTimeTotal) {
-@@ -163,11 +228,13 @@
+@@ -271,11 +335,13 @@
} else {
this.cookTime = 0;
}
@@ -124,12 +126,12 @@
if (flag != this.isBurning()) {
flag1 = true;
- BlockFurnace.a(this.isBurning(), this.world, this.position);
-+ this.invalidateBlockCache(); // CraftBukkit - Invalidate tile entity's cached block type
+ this.world.setTypeAndData(this.position, (IBlockData) this.world.getType(this.position).set(BlockFurnace.LIT, Boolean.valueOf(this.isBurning())), 3);
++ this.invalidateBlockCache(); // CraftBukkit - Invalidate tile entity's cached block type
}
}
-@@ -192,7 +259,8 @@
+@@ -300,7 +366,8 @@
} else {
ItemStack itemstack1 = (ItemStack) this.items.get(2);
@@ -137,10 +139,10 @@
+ // CraftBukkit - consider resultant count instead of current count
+ return itemstack1.isEmpty() ? true : (!itemstack1.doMaterialsMatch(itemstack) ? false : (itemstack1.getCount() + itemstack.getCount() <= this.getMaxStackSize() && itemstack1.getCount() + itemstack.getCount() < itemstack1.getMaxStackSize() ? true : itemstack1.getCount() + itemstack.getCount() <= itemstack.getMaxStackSize()));
}
- }
- }
-@@ -203,11 +271,38 @@
- ItemStack itemstack1 = RecipesFurnace.getInstance().getResult(itemstack);
+ } else {
+ return false;
+@@ -313,11 +380,38 @@
+ ItemStack itemstack1 = irecipe.d();
ItemStack itemstack2 = (ItemStack) this.items.get(2);
+ // CraftBukkit start - fire FurnaceSmeltEvent
@@ -176,5 +178,5 @@
+ */
+ // CraftBukkit end
- if (itemstack.getItem() == Item.getItemOf(Blocks.SPONGE) && itemstack.getData() == 1 && !((ItemStack) this.items.get(1)).isEmpty() && ((ItemStack) this.items.get(1)).getItem() == Items.BUCKET) {
- this.items.set(1, new ItemStack(Items.WATER_BUCKET));
+ if (!this.world.isClientSide) {
+ this.a(this.world, (EntityPlayer) null, irecipe);
diff --git a/nms-patches/TileEntityHopper.patch b/nms-patches/TileEntityHopper.patch
index 17005f2a..467d842d 100644
--- a/nms-patches/TileEntityHopper.patch
+++ b/nms-patches/TileEntityHopper.patch
@@ -1,7 +1,7 @@
--- a/net/minecraft/server/TileEntityHopper.java
+++ b/net/minecraft/server/TileEntityHopper.java
-@@ -4,12 +4,46 @@
- import java.util.List;
+@@ -7,12 +7,46 @@
+ import java.util.stream.Collectors;
import javax.annotation.Nullable;
+// CraftBukkit start
@@ -17,7 +17,7 @@
private NonNullList<ItemStack> items;
private int f;
- private long g;
+ private long j;
+ // CraftBukkit start - add fields and methods
+ public List<HumanEntity> transaction = new java.util.ArrayList<HumanEntity>();
@@ -45,8 +45,8 @@
+ // CraftBukkit end
+
public TileEntityHopper() {
+ super(TileEntityTypes.r);
this.items = NonNullList.a(5, ItemStack.a);
- this.f = -1;
@@ -72,7 +106,7 @@
}
@@ -55,8 +55,8 @@
+ return maxStack; // CraftBukkit
}
- public void e() {
-@@ -163,10 +197,35 @@
+ public void X_() {
+@@ -165,10 +199,35 @@
for (int i = 0; i < this.getSize(); ++i) {
if (!this.getItem(i).isEmpty()) {
ItemStack itemstack = this.getItem(i).cloneItemStack();
@@ -94,7 +94,7 @@
return true;
}
-@@ -288,10 +347,41 @@
+@@ -290,10 +349,41 @@
if (!itemstack.isEmpty() && b(iinventory, itemstack, i, enumdirection)) {
ItemStack itemstack1 = itemstack.cloneItemStack();
@@ -138,17 +138,17 @@
return true;
}
-@@ -307,6 +397,13 @@
- if (entityitem == null) {
- return false;
- } else {
-+ // CraftBukkit start
-+ InventoryPickupItemEvent event = new InventoryPickupItemEvent(iinventory1.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, iinventory1, itemstack, (EnumDirection) null);
+@@ -305,6 +395,13 @@
+
+ public static boolean a(IInventory iinventory, EntityItem entityitem) {
+ boolean flag = false;
++ // 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) null, iinventory, itemstack, (EnumDirection) null);
diff --git a/nms-patches/TileEntityJukeBox.patch b/nms-patches/TileEntityJukeBox.patch
new file mode 100644
index 00000000..2fb37145
--- /dev/null
+++ b/nms-patches/TileEntityJukeBox.patch
@@ -0,0 +1,14 @@
+--- a/net/minecraft/server/TileEntityJukeBox.java
++++ b/net/minecraft/server/TileEntityJukeBox.java
+@@ -31,6 +31,11 @@
+ }
+
+ public void setRecord(ItemStack itemstack) {
++ // CraftBukkit start - There can only be one
++ if (!itemstack.isEmpty()) {
++ itemstack.setCount(1);
++ }
++ // CraftBukkit end
+ this.a = itemstack;
+ this.update();
+ }
diff --git a/nms-patches/TileEntityNote.patch b/nms-patches/TileEntityNote.patch
deleted file mode 100644
index e0498c39..00000000
--- a/nms-patches/TileEntityNote.patch
+++ /dev/null
@@ -1,16 +0,0 @@
---- a/net/minecraft/server/TileEntityNote.java
-+++ b/net/minecraft/server/TileEntityNote.java
-@@ -70,7 +70,12 @@
- b0 = 9;
- }
-
-- 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/TileEntityShulkerBox.patch b/nms-patches/TileEntityShulkerBox.patch
index 6af5516b..1f77fc49 100644
--- a/nms-patches/TileEntityShulkerBox.patch
+++ b/nms-patches/TileEntityShulkerBox.patch
@@ -1,18 +1,18 @@
--- a/net/minecraft/server/TileEntityShulkerBox.java
+++ b/net/minecraft/server/TileEntityShulkerBox.java
-@@ -3,6 +3,10 @@
- import java.util.Iterator;
+@@ -4,6 +4,10 @@
import java.util.List;
+ import java.util.stream.IntStream;
import javax.annotation.Nullable;
+// CraftBukkit start
+import org.bukkit.craftbukkit.entity.CraftHumanEntity;
+import org.bukkit.entity.HumanEntity;
+// CraftBukkit end
- public class TileEntityShulkerBox extends TileEntityLootable implements ITickable, IWorldInventory {
+ public class TileEntityShulkerBox extends TileEntityLootable implements IWorldInventory, ITickable {
-@@ -16,6 +20,31 @@
- private EnumColor l;
+@@ -18,6 +22,31 @@
+ private boolean o;
private boolean p;
+ // CraftBukkit start - add fields and methods
@@ -20,7 +20,7 @@
+ private int maxStack = MAX_STACK;
+
+ public List<ItemStack> getContents() {
-+ return this.f;
++ return this.e;
+ }
+
+ public void onOpen(CraftHumanEntity who) {
@@ -40,10 +40,10 @@
+ }
+ // CraftBukkit end
+
- public TileEntityShulkerBox() {
- this((EnumColor) null);
- }
-@@ -144,7 +173,7 @@
+ public TileEntityShulkerBox(@Nullable EnumColor enumcolor) {
+ super(TileEntityTypes.x);
+ this.e = NonNullList.a(27, ItemStack.a);
+@@ -148,7 +177,7 @@
}
public int getMaxStackSize() {
diff --git a/nms-patches/TileEntitySign.patch b/nms-patches/TileEntitySign.patch
index 88ab4306..d25d0893 100644
--- a/nms-patches/TileEntitySign.patch
+++ b/nms-patches/TileEntitySign.patch
@@ -1,6 +1,6 @@
--- a/net/minecraft/server/TileEntitySign.java
+++ b/net/minecraft/server/TileEntitySign.java
-@@ -21,6 +21,12 @@
+@@ -23,6 +23,12 @@
nbttagcompound.setString("Text" + (i + 1), s);
}
@@ -10,12 +10,12 @@
+ }
+ // CraftBukkit end
+
- this.i.b(nbttagcompound);
return nbttagcompound;
}
-@@ -58,14 +64,34 @@
- }
- };
+
+@@ -30,18 +36,38 @@
+ this.isEditable = false;
+ super.load(nbttagcompound);
+ // CraftBukkit start - Add an option to convert signs correctly
+ // This is done with a flag instead of all the time because
@@ -30,10 +30,11 @@
+ s = "\"\"";
+ }
- try {
-- this.lines[i] = ChatComponentUtils.filterForDisplay(icommandlistener, ichatbasecomponent, (Entity) null);
-- } catch (CommandException commandexception) {
-- this.lines[i] = ichatbasecomponent;
+- if (this.world instanceof WorldServer) {
+- try {
+- this.lines[i] = ChatComponentUtils.filterForDisplay(this.a((EntityPlayer) null), ichatbasecomponent, (Entity) null);
+- } catch (CommandSyntaxException commandsyntaxexception) {
++ try {
+ IChatBaseComponent ichatbasecomponent = IChatBaseComponent.ChatSerializer.a(s);
+
+ if (oldSign) {
@@ -42,29 +43,33 @@
+ }
+ // CraftBukkit end
+
-+ try {
-+ this.lines[i] = ChatComponentUtils.filterForDisplay(icommandlistener, ichatbasecomponent, (Entity) null);
-+ } catch (CommandException commandexception) {
-+ this.lines[i] = ichatbasecomponent;
-+ }
++ if (this.world instanceof WorldServer) {
++ try {
++ this.lines[i] = ChatComponentUtils.filterForDisplay(this.a((EntityPlayer) null), ichatbasecomponent, (Entity) null);
++ } catch (CommandSyntaxException commandsyntaxexception) {
++ this.lines[i] = ichatbasecomponent;
++ }
++ } else {
+ this.lines[i] = ichatbasecomponent;
+ }
+- } else {
+- this.lines[i] = ichatbasecomponent;
+ } catch (com.google.gson.JsonParseException jsonparseexception) {
+ this.lines[i] = new ChatComponentText(s);
}
}
-@@ -155,7 +181,14 @@
- ChatClickable chatclickable = chatmodifier.h();
+@@ -94,6 +120,13 @@
- if (chatclickable.a() == ChatClickable.EnumClickAction.RUN_COMMAND) {
-- entityhuman.C_().getCommandHandler().a(icommandlistener, chatclickable.b());
-+ // CraftBukkit start
-+ // entityhuman.C_().getCommandHandler().a(icommandlistener, chatclickable.b());
-+ CommandBlockListenerAbstract.executeSafely(icommandlistener, new org.bukkit.craftbukkit.command.ProxiedNativeCommandSender(
-+ icommandlistener,
-+ new org.bukkit.craftbukkit.command.CraftBlockCommandSender(icommandlistener),
-+ entityhuman.getBukkitEntity()
-+ ), chatclickable.b());
-+ // CraftBukkit end
- }
- }
- }
+ public void sendMessage(IChatBaseComponent ichatbasecomponent) {}
+
++ // CraftBukkit start
++ @Override
++ public org.bukkit.command.CommandSender getBukkitSender(CommandListenerWrapper wrapper) {
++ return wrapper.f() != null ? wrapper.f().getBukkitSender(wrapper) : new org.bukkit.craftbukkit.command.CraftBlockCommandSender(wrapper);
++ }
++ // CraftBukkit end
++
+ public CommandListenerWrapper a(@Nullable EntityPlayer entityplayer) {
+ String s = entityplayer == null ? "Sign" : entityplayer.getDisplayName().getString();
+ Object object = entityplayer == null ? new ChatComponentText("Sign") : entityplayer.getScoreboardDisplayName();
diff --git a/nms-patches/TileEntitySkull.patch b/nms-patches/TileEntitySkull.patch
new file mode 100644
index 00000000..e7425b53
--- /dev/null
+++ b/nms-patches/TileEntitySkull.patch
@@ -0,0 +1,23 @@
+--- a/net/minecraft/server/TileEntitySkull.java
++++ b/net/minecraft/server/TileEntitySkull.java
+@@ -119,13 +119,19 @@
+ }
+ }
+
++ // CraftBukkit start
+ public static void a(IBlockAccess iblockaccess, BlockPosition blockposition) {
++ setShouldDrop(iblockaccess, blockposition, false);
++ }
++
++ public static void setShouldDrop(IBlockAccess iblockaccess, BlockPosition blockposition, boolean flag) {
++ // CraftBukkit end
+ TileEntity tileentity = iblockaccess.getTileEntity(blockposition);
+
+ if (tileentity instanceof TileEntitySkull) {
+ TileEntitySkull tileentityskull = (TileEntitySkull) tileentity;
+
+- tileentityskull.drop = false;
++ tileentityskull.drop = flag; // CraftBukkit
+ }
+
+ }
diff --git a/nms-patches/TileEntityStructure.patch b/nms-patches/TileEntityStructure.patch
deleted file mode 100644
index f7f05e4c..00000000
--- a/nms-patches/TileEntityStructure.patch
+++ /dev/null
@@ -1,36 +0,0 @@
---- a/net/minecraft/server/TileEntityStructure.java
-+++ b/net/minecraft/server/TileEntityStructure.java
-@@ -10,20 +10,20 @@
-
- public class TileEntityStructure extends TileEntity {
-
-- private String a = "";
-- private String f = "";
-- private String g = "";
-- private BlockPosition h = new BlockPosition(0, 1, 0);
-- private BlockPosition i;
-- private EnumBlockMirror j;
-- private EnumBlockRotation k;
-- private TileEntityStructure.UsageMode l;
-- private boolean m;
-+ private String a = ""; // PAIL: rename name
-+ public String f = ""; // PAIL: private -> public
-+ public String g = ""; // PAIL: private -> public
-+ public BlockPosition h = new BlockPosition(0, 1, 0); // PAIL: private -> public
-+ public BlockPosition i; // PAIL: private -> public
-+ public EnumBlockMirror j; // PAIL: private -> public
-+ public EnumBlockRotation k; // PAIL: private -> public
-+ private TileEntityStructure.UsageMode l; // PAIL: rename
-+ public boolean m; // PAIL: private -> public
- private boolean n;
-- private boolean o;
-- private boolean p;
-- private float q;
-- private long r;
-+ public boolean o; // PAIL: private -> public
-+ public boolean p; // PAIL: private -> public
-+ public float q; // PAIL: private -> public
-+ public long r; // PAIL: private -> public
-
- public TileEntityStructure() {
- this.i = BlockPosition.ZERO;
diff --git a/nms-patches/UserCache.patch b/nms-patches/UserCache.patch
index d04921fc..a91279c6 100644
--- a/nms-patches/UserCache.patch
+++ b/nms-patches/UserCache.patch
@@ -9,7 +9,7 @@
private final GameProfileRepository g;
protected final Gson b;
private final File h;
-@@ -337,11 +337,11 @@
+@@ -330,11 +330,11 @@
}
}
diff --git a/nms-patches/Village.patch b/nms-patches/Village.patch
index a142c50a..ea50abc5 100644
--- a/nms-patches/Village.patch
+++ b/nms-patches/Village.patch
@@ -1,11 +1,11 @@
--- a/net/minecraft/server/Village.java
+++ b/net/minecraft/server/Village.java
-@@ -64,7 +64,7 @@
- EntityIronGolem entityirongolem = new EntityIronGolem(this.a);
+@@ -73,7 +73,7 @@
+ BlockPosition blockposition1 = blockposition.a(this.a.random.nextInt(16) - 8, this.a.random.nextInt(6) - 3, this.a.random.nextInt(16) - 8);
- entityirongolem.setPosition(vec3d.x, vec3d.y, vec3d.z);
-- this.a.addEntity(entityirongolem);
-+ this.a.addEntity(entityirongolem, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.VILLAGE_DEFENSE); // CraftBukkit
- ++this.l;
- }
- }
+ if (this.a(blockposition1)) {
+- EntityIronGolem entityirongolem = (EntityIronGolem) EntityTypes.IRON_GOLEM.b(this.a, (NBTTagCompound) null, (IChatBaseComponent) null, (EntityHuman) null, blockposition1, false, false);
++ EntityIronGolem entityirongolem = (EntityIronGolem) EntityTypes.IRON_GOLEM.spawnCreature(this.a, (NBTTagCompound) null, (IChatBaseComponent) null, (EntityHuman) null, blockposition1, false, false, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.VILLAGE_DEFENSE); // CraftBukkit
+
+ if (entityirongolem != null) {
+ if (entityirongolem.M() && entityirongolem.a((IWorldReader) this.a)) {
diff --git a/nms-patches/World.patch b/nms-patches/World.patch
index e4f6e071..93eaaad1 100644
--- a/nms-patches/World.patch
+++ b/nms-patches/World.patch
@@ -1,8 +1,8 @@
--- a/net/minecraft/server/World.java
+++ b/net/minecraft/server/World.java
-@@ -14,6 +14,21 @@
- import java.util.function.Supplier;
- import javax.annotation.Nullable;
+@@ -15,6 +15,23 @@
+ import org.apache.logging.log4j.LogManager;
+ import org.apache.logging.log4j.Logger;
+// CraftBukkit start
+import com.google.common.collect.Maps;
@@ -11,6 +11,8 @@
+import org.bukkit.block.BlockState;
+import org.bukkit.craftbukkit.CraftServer;
+import org.bukkit.craftbukkit.CraftWorld;
++import org.bukkit.craftbukkit.block.CraftBlockState;
++import org.bukkit.craftbukkit.block.data.CraftBlockData;
+import org.bukkit.craftbukkit.event.CraftEventFactory;
+import org.bukkit.craftbukkit.util.CraftMagicNumbers;
+import org.bukkit.event.block.BlockCanBuildEvent;
@@ -19,12 +21,12 @@
+import org.bukkit.generator.ChunkGenerator;
+// CraftBukkit end
+
- public abstract class World implements IBlockAccess {
+ public abstract class World implements GeneratorAccess, IIBlockAccess, AutoCloseable {
- private int a = 63;
-@@ -59,7 +74,52 @@
- private final WorldBorder P;
- int[] J;
+ protected static final Logger e = LogManager.getLogger();
+@@ -55,7 +72,52 @@
+ private final WorldBorder K;
+ int[] F;
- protected World(IDataManager idatamanager, WorldData worlddata, WorldProvider worldprovider, MethodProfiler methodprofiler, boolean flag) {
+ // CraftBukkit start Added the following
@@ -35,18 +37,18 @@
+
+ public boolean captureBlockStates = false;
+ public boolean captureTreeGeneration = false;
-+ public ArrayList<BlockState> capturedBlockStates= new ArrayList<BlockState>(){
++ public ArrayList<CraftBlockState> capturedBlockStates = new ArrayList<CraftBlockState>() {
+ @Override
-+ public boolean add( BlockState blockState ) {
-+ Iterator<BlockState> blockStateIterator = this.iterator();
-+ while( blockStateIterator.hasNext() ) {
++ public boolean add(CraftBlockState blockState) {
++ Iterator<CraftBlockState> blockStateIterator = this.iterator();
++ while (blockStateIterator.hasNext()) {
+ BlockState blockState1 = blockStateIterator.next();
-+ if ( blockState1.getLocation().equals( blockState.getLocation() ) ) {
++ if (blockState1.getLocation().equals(blockState.getLocation())) {
+ return false;
+ }
+ }
+
-+ return super.add( blockState );
++ return super.add(blockState);
+ }
+ };
+ public List<EntityItem> captureDrops;
@@ -73,13 +75,13 @@
+ this.ticksPerAnimalSpawns = this.getServer().getTicksPerAnimalSpawns(); // CraftBukkit
+ this.ticksPerMonsterSpawns = this.getServer().getTicksPerMonsterSpawns(); // CraftBukkit
+ // CraftBukkit end
- this.u = Lists.newArrayList(new IWorldAccess[] { this.t});
- this.N = Calendar.getInstance();
- this.scoreboard = new Scoreboard();
-@@ -72,6 +132,36 @@
+ this.v = Lists.newArrayList(new IWorldAccess[] { this.u});
+ this.allowMonsters = true;
+ this.allowAnimals = true;
+@@ -66,6 +128,36 @@
this.worldProvider = worldprovider;
this.isClientSide = flag;
- this.P = worldprovider.getWorldBorder();
+ this.K = worldprovider.getWorldBorder();
+ // CraftBukkit start
+ getWorldBorder().world = (WorldServer) this;
+ // From PlayerList.setPlayerFileData
@@ -112,17 +114,17 @@
+ // CraftBukkit end
}
- public World b() {
-@@ -209,6 +299,27 @@
+ public GeneratorAccess b() {
+@@ -138,6 +230,26 @@
}
public boolean setTypeAndData(BlockPosition blockposition, IBlockData iblockdata, int i) {
+ // CraftBukkit start - tree generation
+ if (this.captureTreeGeneration) {
-+ BlockState blockstate = null;
-+ Iterator<BlockState> it = capturedBlockStates.iterator();
++ CraftBlockState blockstate = null;
++ Iterator<CraftBlockState> it = capturedBlockStates.iterator();
+ while (it.hasNext()) {
-+ BlockState previous = it.next();
++ CraftBlockState previous = it.next();
+ if (previous.getX() == blockposition.getX() && previous.getY() == blockposition.getY() && previous.getZ() == blockposition.getZ()) {
+ blockstate = previous;
+ it.remove();
@@ -130,31 +132,30 @@
+ }
+ }
+ if (blockstate == null) {
-+ blockstate = org.bukkit.craftbukkit.block.CraftBlockState.getBlockState(this, blockposition.getX(), blockposition.getY(), blockposition.getZ(), i);
++ blockstate = org.bukkit.craftbukkit.block.CraftBlockState.getBlockState(this, blockposition, i);
+ }
-+ blockstate.setTypeId(CraftMagicNumbers.getId(iblockdata.getBlock()));
-+ blockstate.setRawData((byte) iblockdata.getBlock().toLegacyData(iblockdata));
++ blockstate.setData(iblockdata);
+ this.capturedBlockStates.add(blockstate);
+ return true;
+ }
+ // CraftBukkit end
- if (this.E(blockposition)) {
+ if (k(blockposition)) {
return false;
} else if (!this.isClientSide && this.worldData.getType() == WorldType.DEBUG_ALL_BLOCK_STATES) {
-@@ -216,9 +327,23 @@
+@@ -145,9 +257,23 @@
} else {
Chunk chunk = this.getChunkAtWorldCoords(blockposition);
Block block = iblockdata.getBlock();
+
+ // CraftBukkit start - capture blockstates
-+ BlockState blockstate = null;
++ CraftBlockState blockstate = null;
+ if (this.captureBlockStates) {
-+ blockstate = org.bukkit.craftbukkit.block.CraftBlockState.getBlockState(this, blockposition.getX(), blockposition.getY(), blockposition.getZ(), i);
++ blockstate = org.bukkit.craftbukkit.block.CraftBlockState.getBlockState(this, blockposition, i);
+ this.capturedBlockStates.add(blockstate);
+ }
+ // CraftBukkit end
+
- IBlockData iblockdata1 = chunk.a(blockposition, iblockdata);
+ IBlockData iblockdata1 = chunk.a(blockposition, iblockdata, (i & 64) != 0);
if (iblockdata1 == null) {
+ // CraftBukkit start - remove blockstate if failed
@@ -164,25 +165,25 @@
+ // CraftBukkit end
return false;
} else {
- if (iblockdata.c() != iblockdata1.c() || iblockdata.d() != iblockdata1.d()) {
-@@ -227,6 +352,7 @@
- this.methodProfiler.b();
+ IBlockData iblockdata2 = this.getType(blockposition);
+@@ -158,6 +284,7 @@
+ this.methodProfiler.e();
}
+ /*
- if ((i & 2) != 0 && (!this.isClientSide || (i & 4) == 0) && chunk.isReady()) {
- this.notify(blockposition, iblockdata1, iblockdata, i);
- }
-@@ -239,12 +365,37 @@
- } else if (!this.isClientSide && (i & 16) == 0) {
- this.c(blockposition, block);
+ if (iblockdata2 == iblockdata) {
+ if (iblockdata1 != iblockdata2) {
+ this.a(blockposition, blockposition);
+@@ -182,12 +309,52 @@
+ iblockdata.b(this, blockposition, j);
+ }
}
+ */
+
+ // CraftBukkit start
+ if (!this.captureBlockStates) { // Don't notify clients or update physics while capturing blockstates
+ // Modularize client and physic updates
-+ notifyAndUpdatePhysics(blockposition, chunk, iblockdata1, iblockdata, i);
++ notifyAndUpdatePhysics(blockposition, chunk, iblockdata1, iblockdata, iblockdata2, i);
+ }
+ // CraftBukkit end
@@ -192,45 +193,60 @@
}
+ // CraftBukkit start - Split off from above in order to directly send client and physic updates
-+ public void notifyAndUpdatePhysics(BlockPosition blockposition, Chunk chunk, IBlockData oldBlock, IBlockData newBlock, int i) {
-+ if ((i & 2) != 0 && (!this.isClientSide || (i & 4) == 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, oldBlock, newBlock, i);
-+ }
++ public void notifyAndUpdatePhysics(BlockPosition blockposition, Chunk chunk, IBlockData oldBlock, IBlockData newBlock, IBlockData actualBlock, int i) {
++ IBlockData iblockdata = newBlock;
++ IBlockData iblockdata1 = oldBlock;
++ IBlockData iblockdata2 = actualBlock;
++ if (iblockdata2 == iblockdata) {
++ if (iblockdata1 != iblockdata2) {
++ this.a(blockposition, blockposition);
++ }
+
-+ if (!this.isClientSide && (i & 1) != 0) {
-+ this.update(blockposition, oldBlock.getBlock(), true);
-+ if (newBlock.n()) {
-+ this.updateAdjacentComparators(blockposition, newBlock.getBlock());
++ if ((i & 2) != 0 && (!this.isClientSide || (i & 4) == 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, iblockdata1, iblockdata, i);
++ }
++
++ if (!this.isClientSide && (i & 1) != 0) {
++ this.update(blockposition, iblockdata1.getBlock());
++ if (iblockdata.isComplexRedstone()) {
++ this.updateAdjacentComparators(blockposition, newBlock.getBlock());
++ }
++ }
++
++ if ((i & 16) == 0) {
++ int j = i & -2;
++
++ iblockdata1.b(this, blockposition, j);
++ iblockdata.a((GeneratorAccess) this, blockposition, j);
++ iblockdata.b(this, blockposition, j);
+ }
-+ } else if (!this.isClientSide && (i & 16) == 0) {
-+ this.c(blockposition, newBlock.getBlock());
+ }
+ }
+ // CraftBukkit end
+
public boolean setAir(BlockPosition blockposition) {
- return this.setTypeAndData(blockposition, Blocks.AIR.getBlockData(), 3);
- }
-@@ -278,6 +429,11 @@
+ Fluid fluid = this.b(blockposition);
+
+@@ -224,6 +391,11 @@
- public void update(BlockPosition blockposition, Block block, boolean flag) {
+ 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, flag);
+ this.applyPhysics(blockposition, block);
}
-@@ -366,6 +522,17 @@
+@@ -299,6 +471,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));
++ BlockPhysicsEvent event = new BlockPhysicsEvent(world.getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ()), CraftBlockData.fromData(iblockdata));
+ this.getServer().getPluginManager().callEvent(event);
+
+ if (event.isCancelled()) {
@@ -241,25 +257,34 @@
iblockdata.doPhysics(this, blockposition, block, blockposition1);
} catch (Throwable throwable) {
CrashReport crashreport = CrashReport.a(throwable, "Exception while updating neighbours");
-@@ -583,6 +750,17 @@
+@@ -307,7 +490,7 @@
+ crashreportsystemdetails.a("Source block type", () -> {
+ try {
+ return String.format("ID #%s (%s // %s)", new Object[] { Block.REGISTRY.b(block), block.m(), block.getClass().getCanonicalName()});
+- } catch (Throwable throwable) {
++ } catch (Throwable throwablex) { // CraftBukkit - decompile error
+ return "ID #" + Block.REGISTRY.b(block);
+ }
+ });
+@@ -393,6 +576,17 @@
}
public IBlockData getType(BlockPosition blockposition) {
+ // CraftBukkit start - tree generation
+ if (captureTreeGeneration) {
-+ Iterator<BlockState> it = capturedBlockStates.iterator();
++ Iterator<CraftBlockState> it = capturedBlockStates.iterator();
+ while (it.hasNext()) {
-+ BlockState previous = it.next();
++ CraftBlockState previous = it.next();
+ if (previous.getX() == blockposition.getX() && previous.getY() == blockposition.getY() && previous.getZ() == blockposition.getZ()) {
-+ return CraftMagicNumbers.getBlock(previous.getTypeId()).fromLegacyData(previous.getRawData());
++ return previous.getHandle();
+ }
+ }
+ }
+ // CraftBukkit end
- if (this.E(blockposition)) {
- return Blocks.AIR.getBlockData();
+ if (k(blockposition)) {
+ return Blocks.VOID_AIR.getBlockData();
} else {
-@@ -788,6 +966,42 @@
+@@ -639,6 +833,42 @@
}
public boolean addEntity(Entity entity) {
@@ -302,23 +327,23 @@
int i = MathHelper.floor(entity.locX / 16.0D);
int j = MathHelper.floor(entity.locZ / 16.0D);
boolean flag = entity.attachedToPlayer;
-@@ -818,6 +1032,7 @@
- ((IWorldAccess) this.u.get(i)).a(entity);
+@@ -669,6 +899,7 @@
+ ((IWorldAccess) this.v.get(i)).a(entity);
}
+ entity.valid = true; // CraftBukkit
}
protected void c(Entity entity) {
-@@ -825,6 +1040,7 @@
- ((IWorldAccess) this.u.get(i)).b(entity);
+@@ -676,6 +907,7 @@
+ ((IWorldAccess) this.v.get(i)).b(entity);
}
+ entity.valid = false; // CraftBukkit
}
public void kill(Entity entity) {
-@@ -860,7 +1076,15 @@
+@@ -711,7 +943,15 @@
this.getChunkAt(i, j).b(entity);
}
@@ -335,19 +360,10 @@
this.c(entity);
}
-@@ -977,7 +1201,7 @@
- }
+@@ -746,6 +986,11 @@
- public boolean a(AxisAlignedBB axisalignedbb) {
-- return this.a((Entity) null, axisalignedbb, true, Lists.newArrayList());
-+ return this.a((Entity) null, axisalignedbb, true, Lists.<AxisAlignedBB>newArrayList()); // CraftBukkit - decompile error
- }
-
- public int a(float f) {
-@@ -1047,6 +1271,11 @@
-
- for (i = 0; i < this.j.size(); ++i) {
- entity = (Entity) this.j.get(i);
+ for (i = 0; i < this.k.size(); ++i) {
+ entity = (Entity) this.k.get(i);
+ // CraftBukkit start - Fixed an NPE
+ if (entity == null) {
+ continue;
@@ -356,7 +372,7 @@
try {
++entity.ticksLived;
-@@ -1095,8 +1324,10 @@
+@@ -794,8 +1039,10 @@
CrashReportSystemDetails crashreportsystemdetails1;
CrashReport crashreport1;
@@ -366,10 +382,10 @@
+ for (this.tickPosition = 0; this.tickPosition < this.entityList.size(); ++this.tickPosition) {
+ entity = (Entity) this.entityList.get(this.tickPosition);
+ // CraftBukkit end
- Entity entity1 = entity.bJ();
+ Entity entity1 = entity.getVehicle();
if (entity1 != null) {
-@@ -1129,7 +1360,7 @@
+@@ -828,7 +1075,7 @@
this.getChunkAt(j, l).b(entity);
}
@@ -378,10 +394,10 @@
this.c(entity);
}
-@@ -1184,9 +1415,11 @@
- TileEntity tileentity1 = (TileEntity) this.b.get(i1);
+@@ -883,9 +1130,11 @@
+ TileEntity tileentity1 = (TileEntity) this.c.get(i1);
- if (!tileentity1.y()) {
+ if (!tileentity1.x()) {
+ /* CraftBukkit start - Order matters, moved down
if (!this.tileEntityList.contains(tileentity1)) {
this.a(tileentity1);
@@ -390,7 +406,7 @@
if (this.isLoaded(tileentity1.getPosition())) {
Chunk chunk = this.getChunkAtWorldCoords(tileentity1.getPosition());
-@@ -1194,6 +1427,12 @@
+@@ -893,6 +1142,12 @@
chunk.a(tileentity1.getPosition(), tileentity1);
this.notify(tileentity1.getPosition(), iblockdata, iblockdata, 3);
@@ -403,7 +419,7 @@
}
}
}
-@@ -1247,15 +1486,13 @@
+@@ -946,15 +1201,13 @@
int i;
int j;
@@ -423,24 +439,24 @@
}
+ // CraftBukkit end
- entity.M = entity.locX;
- entity.N = entity.locY;
-@@ -1268,6 +1505,7 @@
- entity.aE();
+ entity.N = entity.locX;
+ entity.O = entity.locY;
+@@ -967,6 +1220,7 @@
+ entity.aH();
} else {
- entity.B_();
+ entity.tick();
+ entity.postTick(); // CraftBukkit
}
}
-@@ -1559,11 +1797,18 @@
+@@ -1296,11 +1550,18 @@
}
}
+ public Map<BlockPosition, TileEntity> capturedTileEntities = Maps.newHashMap();
@Nullable
public TileEntity getTileEntity(BlockPosition blockposition) {
- if (this.E(blockposition)) {
+ if (k(blockposition)) {
return null;
} else {
+ // CraftBukkit start
@@ -451,26 +467,26 @@
+
TileEntity tileentity = null;
- if (this.O) {
-@@ -1598,6 +1843,14 @@
+ if (this.J) {
+@@ -1335,6 +1596,14 @@
public void setTileEntity(BlockPosition blockposition, @Nullable TileEntity tileentity) {
- if (!this.E(blockposition)) {
- if (tileentity != null && !tileentity.y()) {
-+ // CraftBukkit start
-+ if (captureBlockStates) {
-+ tileentity.a(this);
-+ tileentity.setPosition(blockposition);
-+ capturedTileEntities.put(blockposition, tileentity);
-+ return;
-+ }
-+ // CraftBukkit end
- if (this.O) {
+ if (!k(blockposition)) {
+ if (tileentity != null && !tileentity.x()) {
++ // CraftBukkit start
++ if (captureBlockStates) {
++ tileentity.setWorld(this);
++ tileentity.setPosition(blockposition);
++ capturedTileEntities.put(blockposition, tileentity);
++ return;
++ }
++ // CraftBukkit end
+ if (this.J) {
tileentity.setPosition(blockposition);
- Iterator iterator = this.b.iterator();
-@@ -1757,6 +2010,14 @@
+ Iterator iterator = this.c.iterator();
+@@ -1494,6 +1763,14 @@
}
- this.o = MathHelper.a(this.o, 0.0F, 1.0F);
+ this.p = MathHelper.a(this.p, 0.0F, 1.0F);
+
+ // CraftBukkit start
+ for (int idx = 0; idx < this.players.size(); ++idx) {
@@ -482,7 +498,7 @@
}
}
}
-@@ -1894,7 +2155,10 @@
+@@ -1579,7 +1856,10 @@
}
public boolean c(EnumSkyBlock enumskyblock, BlockPosition blockposition) {
@@ -494,25 +510,25 @@
return false;
} else {
int i = 0;
-@@ -2061,7 +2325,7 @@
+@@ -1750,7 +2030,7 @@
while (iterator.hasNext()) {
Entity entity = (Entity) iterator.next();
-- if (oclass.isAssignableFrom(entity.getClass()) && predicate.apply(entity)) {
-+ if (oclass.isAssignableFrom(entity.getClass()) && predicate.apply((T) entity)) {
+- if (oclass.isAssignableFrom(entity.getClass()) && predicate.test(entity)) {
++ if (oclass.isAssignableFrom(entity.getClass()) && predicate.test((T) entity)) {
arraylist.add(entity);
}
}
-@@ -2076,7 +2340,7 @@
+@@ -1765,7 +2045,7 @@
while (iterator.hasNext()) {
Entity entity = (Entity) iterator.next();
-- if (oclass.isAssignableFrom(entity.getClass()) && predicate.apply(entity)) {
-+ if (oclass.isAssignableFrom(entity.getClass()) && predicate.apply((T) entity)) { // CraftBukkit - fix decompile error
+- if (oclass.isAssignableFrom(entity.getClass()) && predicate.test(entity)) {
++ if (oclass.isAssignableFrom(entity.getClass()) && predicate.test((T) entity)) { // CraftBukkit - fix decompile error
arraylist.add(entity);
}
}
-@@ -2125,7 +2389,7 @@
+@@ -1814,7 +2094,7 @@
}
}
@@ -521,7 +537,7 @@
}
@Nullable
-@@ -2146,8 +2410,17 @@
+@@ -1835,8 +2115,17 @@
while (iterator.hasNext()) {
Entity entity = (Entity) iterator.next();
@@ -540,7 +556,7 @@
++i;
}
}
-@@ -2156,12 +2429,18 @@
+@@ -1845,12 +2134,18 @@
}
public void a(Collection<Entity> collection) {
@@ -560,22 +576,7 @@
this.b(entity);
}
-@@ -2175,7 +2454,13 @@
- IBlockData iblockdata = this.getType(blockposition);
- AxisAlignedBB axisalignedbb = flag ? null : block.getBlockData().d(this, blockposition);
-
-- return axisalignedbb != Block.k && !this.a(axisalignedbb.a(blockposition), entity) ? false : (iblockdata.getMaterial() == Material.ORIENTABLE && block == Blocks.ANVIL ? true : iblockdata.getMaterial().isReplaceable() && block.canPlace(this, blockposition, enumdirection));
-+ // CraftBukkit start - store default return
-+ boolean defaultReturn = axisalignedbb != Block.k && !this.a(axisalignedbb.a(blockposition), entity) ? false : (iblockdata.getMaterial() == Material.ORIENTABLE && block == Blocks.ANVIL ? true : iblockdata.getMaterial().isReplaceable() && block.canPlace(this, blockposition, enumdirection));
-+ 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 getSeaLevel() {
-@@ -2285,6 +2570,11 @@
+@@ -1954,6 +2249,11 @@
for (int i = 0; i < this.players.size(); ++i) {
EntityHuman entityhuman1 = (EntityHuman) this.players.get(i);
@@ -585,9 +586,9 @@
+ }
+ // CraftBukkit end
- if (predicate.apply(entityhuman1)) {
+ if (predicate.test(entityhuman1)) {
double d5 = entityhuman1.d(d0, d1, d2);
-@@ -2453,6 +2743,16 @@
+@@ -2122,6 +2422,16 @@
public void everyoneSleeping() {}
@@ -601,10 +602,10 @@
+ }
+ // CraftBukkit end
+
- public float h(float f) {
- return (this.p + (this.q - this.p) * f) * this.j(f);
+ public float g(float f) {
+ return (this.q + (this.r - this.q) * f) * this.i(f);
}
-@@ -2670,7 +2970,7 @@
+@@ -2296,7 +2606,7 @@
int l = j * 16 + 8 - blockposition.getZ();
boolean flag = true;
diff --git a/nms-patches/WorldData.patch b/nms-patches/WorldData.patch
index d81876aa..568e11a8 100644
--- a/nms-patches/WorldData.patch
+++ b/nms-patches/WorldData.patch
@@ -1,7 +1,7 @@
--- a/net/minecraft/server/WorldData.java
+++ b/net/minecraft/server/WorldData.java
-@@ -5,6 +5,11 @@
- import java.util.Map;
+@@ -11,6 +11,11 @@
+ import java.util.Set;
import java.util.Map.Entry;
import javax.annotation.Nullable;
+// CraftBukkit start
@@ -12,15 +12,23 @@
public class WorldData {
-@@ -49,6 +54,7 @@
- private int M;
- private final Map<DimensionManager, NBTTagCompound> N;
- private GameRules O;
+@@ -62,6 +67,7 @@
+ private final Map<DimensionManager, NBTTagCompound> S;
+ private NBTTagCompound T;
+ private final GameRules U;
+ public WorldServer world; // CraftBukkit
protected WorldData() {
this.f = WorldType.NORMAL;
-@@ -437,6 +443,16 @@
+@@ -296,6 +302,7 @@
+ nbttagcompound2.setBoolean("Snapshot", true);
+ nbttagcompound.set("Version", nbttagcompound2);
+ nbttagcompound.setInt("DataVersion", 1513);
++ if (org.bukkit.craftbukkit.util.CraftMagicNumbers.DATA_VERSION != 1513) throw new AssertionError(); // CraftBukkit - sentinel
+ nbttagcompound.setLong("RandomSeed", this.e);
+ nbttagcompound.setString("generatorName", this.f.name());
+ nbttagcompound.setInt("generatorVersion", this.f.getVersion());
+@@ -466,6 +473,16 @@
}
public void setThundering(boolean flag) {
@@ -34,10 +42,10 @@
+ }
+ }
+ // CraftBukkit end
- this.v = flag;
+ this.y = flag;
}
-@@ -453,6 +469,16 @@
+@@ -482,6 +499,16 @@
}
public void setStorm(boolean flag) {
@@ -51,13 +59,13 @@
+ }
+ }
+ // CraftBukkit end
- this.t = flag;
+ this.w = flag;
}
-@@ -598,6 +624,12 @@
+@@ -631,6 +658,12 @@
public void setDifficulty(EnumDifficulty enumdifficulty) {
- this.C = enumdifficulty;
+ this.F = enumdifficulty;
+ // CraftBukkit start
+ PacketPlayOutServerDifficulty packet = new PacketPlayOutServerDifficulty(this.getDifficulty(), this.isDifficultyLocked());
+ for (EntityPlayer player : (java.util.List<EntityPlayer>) (java.util.List) world.players) {
@@ -67,9 +75,9 @@
}
public boolean isDifficultyLocked() {
-@@ -716,4 +748,12 @@
- public void a(DimensionManager dimensionmanager, NBTTagCompound nbttagcompound) {
- this.N.put(dimensionmanager, nbttagcompound);
+@@ -712,4 +745,12 @@
+ public void c(@Nullable NBTTagCompound nbttagcompound) {
+ this.T = nbttagcompound;
}
+
+ // CraftBukkit start - Check if the name stored in NBT is the correct one
diff --git a/nms-patches/WorldGenGroundBush.patch b/nms-patches/WorldGenGroundBush.patch
index bbd0306b..4afb31ce 100644
--- a/nms-patches/WorldGenGroundBush.patch
+++ b/nms-patches/WorldGenGroundBush.patch
@@ -1,6 +1,6 @@
--- a/net/minecraft/server/WorldGenGroundBush.java
+++ b/net/minecraft/server/WorldGenGroundBush.java
-@@ -45,7 +45,12 @@
+@@ -46,7 +46,12 @@
}
}
}
diff --git a/nms-patches/WorldGenMegaTreeAbstract.patch b/nms-patches/WorldGenMegaTreeAbstract.patch
deleted file mode 100644
index 99dd51eb..00000000
--- a/nms-patches/WorldGenMegaTreeAbstract.patch
+++ /dev/null
@@ -1,11 +0,0 @@
---- a/net/minecraft/server/WorldGenMegaTreeAbstract.java
-+++ b/net/minecraft/server/WorldGenMegaTreeAbstract.java
-@@ -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/WorldGenRegistration.patch b/nms-patches/WorldGenRegistration.patch
deleted file mode 100644
index 63364bcb..00000000
--- a/nms-patches/WorldGenRegistration.patch
+++ /dev/null
@@ -1,11 +0,0 @@
---- a/net/minecraft/server/WorldGenRegistration.java
-+++ b/net/minecraft/server/WorldGenRegistration.java
-@@ -157,7 +157,7 @@
- entitywitch.cW();
- entitywitch.setPositionRotation((double) i + 0.5D, (double) j, (double) k + 0.5D, 0.0F, 0.0F);
- entitywitch.prepare(world.D(new BlockPosition(i, j, k)), (GroupDataEntity) null);
-- world.addEntity(entitywitch);
-+ world.addEntity(entitywitch, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.CHUNK_GEN); // CraftBukkit - add SpawnReason
- }
- }
-
diff --git a/nms-patches/WorldGenTreeProvider.patch b/nms-patches/WorldGenTreeProvider.patch
new file mode 100644
index 00000000..c8da90ac
--- /dev/null
+++ b/nms-patches/WorldGenTreeProvider.patch
@@ -0,0 +1,40 @@
+--- a/net/minecraft/server/WorldGenTreeProvider.java
++++ b/net/minecraft/server/WorldGenTreeProvider.java
+@@ -2,6 +2,7 @@
+
+ import java.util.Random;
+ import javax.annotation.Nullable;
++import org.bukkit.TreeType; // CraftBukkit
+
+ public abstract class WorldGenTreeProvider {
+
+@@ -16,6 +17,29 @@
+ if (worldgentreeabstract == null) {
+ return false;
+ } else {
++ // CraftBukkit start
++ if (worldgentreeabstract instanceof WorldGenAcaciaTree) {
++ BlockSapling.treeType = TreeType.ACACIA;
++ } else if (worldgentreeabstract instanceof WorldGenBigTree) {
++ BlockSapling.treeType = TreeType.BIG_TREE;
++ } else if (worldgentreeabstract instanceof WorldGenForest) {
++ BlockSapling.treeType = TreeType.BIRCH;
++ } else if (worldgentreeabstract instanceof WorldGenForestTree) {
++ BlockSapling.treeType = TreeType.DARK_OAK;
++ } else if (worldgentreeabstract instanceof WorldGenJungleTree) {
++ BlockSapling.treeType = TreeType.JUNGLE;
++ } else if (worldgentreeabstract instanceof WorldGenMegaTree) {
++ BlockSapling.treeType = TreeType.MEGA_REDWOOD;
++ } else if (worldgentreeabstract instanceof WorldGenTaiga1) {
++ BlockSapling.treeType = TreeType.REDWOOD;
++ } else if (worldgentreeabstract instanceof WorldGenTaiga2) {
++ BlockSapling.treeType = TreeType.REDWOOD;
++ } else if (worldgentreeabstract instanceof WorldGenTrees) {
++ BlockSapling.treeType = TreeType.TREE;
++ } else {
++ throw new IllegalArgumentException("Unknown tree generator " + worldgentreeabstract);
++ }
++ // CraftBukkit end
+ generatoraccess.setTypeAndData(blockposition, Blocks.AIR.getBlockData(), 4);
+ if (worldgentreeabstract.generate(generatoraccess, generatoraccess.getChunkProvider().getChunkGenerator(), random, blockposition, WorldGenFeatureConfiguration.e)) {
+ return true;
diff --git a/nms-patches/WorldGenVillagePieces.patch b/nms-patches/WorldGenVillagePieces.patch
index ca0efd5f..e55f15ce 100644
--- a/nms-patches/WorldGenVillagePieces.patch
+++ b/nms-patches/WorldGenVillagePieces.patch
@@ -1,45 +1,19 @@
--- a/net/minecraft/server/WorldGenVillagePieces.java
+++ b/net/minecraft/server/WorldGenVillagePieces.java
-@@ -238,10 +238,10 @@
-
- protected void a(NBTTagCompound nbttagcompound) {
- super.a(nbttagcompound);
-- nbttagcompound.setInt("CA", Block.REGISTRY.a((Object) this.a));
-- nbttagcompound.setInt("CB", Block.REGISTRY.a((Object) this.b));
-- nbttagcompound.setInt("CC", Block.REGISTRY.a((Object) this.c));
-- nbttagcompound.setInt("CD", Block.REGISTRY.a((Object) this.d));
-+ nbttagcompound.setInt("CA", Block.REGISTRY.a(this.a));
-+ nbttagcompound.setInt("CB", Block.REGISTRY.a(this.b));
-+ nbttagcompound.setInt("CC", Block.REGISTRY.a(this.c));
-+ nbttagcompound.setInt("CD", Block.REGISTRY.a(this.d));
- }
-
- protected void a(NBTTagCompound nbttagcompound, DefinedStructureManager definedstructuremanager) {
-@@ -371,8 +371,8 @@
-
- protected void a(NBTTagCompound nbttagcompound) {
- super.a(nbttagcompound);
-- nbttagcompound.setInt("CA", Block.REGISTRY.a((Object) this.a));
-- nbttagcompound.setInt("CB", Block.REGISTRY.a((Object) this.b));
-+ nbttagcompound.setInt("CA", Block.REGISTRY.a(this.a));
-+ nbttagcompound.setInt("CB", Block.REGISTRY.a(this.b));
- }
-
- protected void a(NBTTagCompound nbttagcompound, DefinedStructureManager definedstructuremanager) {
-@@ -1672,14 +1672,14 @@
- entityzombievillager.prepare(world.D(new BlockPosition(entityzombievillager)), (GroupDataEntity) null);
+@@ -1662,14 +1662,14 @@
+ entityzombievillager.prepare(generatoraccess.getDamageScaler(new BlockPosition(entityzombievillager)), (GroupDataEntity) null, (NBTTagCompound) null);
entityzombievillager.setProfession(this.c(i1, 0));
- entityzombievillager.cW();
-- world.addEntity(entityzombievillager);
-+ world.addEntity(entityzombievillager, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.CHUNK_GEN); // CraftBukkit - add SpawnReason
+ entityzombievillager.di();
+- generatoraccess.addEntity(entityzombievillager);
++ generatoraccess.addEntity(entityzombievillager, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.CHUNK_GEN); // CraftBukkit - add SpawnReason
} else {
- EntityVillager entityvillager = new EntityVillager(world);
+ EntityVillager entityvillager = new EntityVillager(generatoraccess.getMinecraftWorld());
entityvillager.setPositionRotation((double) j1 + 0.5D, (double) k1, (double) l1 + 0.5D, 0.0F, 0.0F);
- entityvillager.setProfession(this.c(i1, world.random.nextInt(6)));
- entityvillager.a(world.D(new BlockPosition(entityvillager)), (GroupDataEntity) null, false);
-- world.addEntity(entityvillager);
-+ world.addEntity(entityvillager, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.CHUNK_GEN); // CraftBukkit - add SpawnReason
+ entityvillager.setProfession(this.c(i1, generatoraccess.m().nextInt(6)));
+ entityvillager.a(generatoraccess.getDamageScaler(new BlockPosition(entityvillager)), (GroupDataEntity) null, (NBTTagCompound) null, false);
+- generatoraccess.addEntity(entityvillager);
++ generatoraccess.addEntity(entityvillager, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.CHUNK_GEN); // CraftBukkit - add SpawnReason
}
}
diff --git a/nms-patches/WorldGenWitchHut.patch b/nms-patches/WorldGenWitchHut.patch
new file mode 100644
index 00000000..70c91680
--- /dev/null
+++ b/nms-patches/WorldGenWitchHut.patch
@@ -0,0 +1,11 @@
+--- a/net/minecraft/server/WorldGenWitchHut.java
++++ b/net/minecraft/server/WorldGenWitchHut.java
+@@ -86,7 +86,7 @@
+ entitywitch.di();
+ entitywitch.setPositionRotation((double) i + 0.5D, (double) j, (double) k + 0.5D, 0.0F, 0.0F);
+ entitywitch.prepare(generatoraccess.getDamageScaler(new BlockPosition(i, j, k)), (GroupDataEntity) null, (NBTTagCompound) null);
+- generatoraccess.addEntity(entitywitch);
++ generatoraccess.addEntity(entitywitch, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.CHUNK_GEN); // CraftBukkit - add SpawnReason
+ }
+ }
+
diff --git a/nms-patches/WorldMap.patch b/nms-patches/WorldMap.patch
index 5c8d8157..622228b6 100644
--- a/nms-patches/WorldMap.patch
+++ b/nms-patches/WorldMap.patch
@@ -1,6 +1,6 @@
--- a/net/minecraft/server/WorldMap.java
+++ b/net/minecraft/server/WorldMap.java
-@@ -7,6 +7,14 @@
+@@ -7,6 +7,15 @@
import java.util.Map;
import javax.annotation.Nullable;
@@ -10,13 +10,14 @@
+import org.bukkit.craftbukkit.CraftServer;
+import org.bukkit.craftbukkit.CraftWorld;
+import org.bukkit.craftbukkit.map.CraftMapView;
++import org.bukkit.craftbukkit.util.CraftChatMessage;
+// CraftBukkit end
+
public class WorldMap extends PersistentBase {
public int centerX;
-@@ -20,8 +28,18 @@
- private final Map<EntityHuman, WorldMap.WorldMapHumanTracker> k = Maps.newHashMap();
+@@ -21,8 +30,18 @@
+ private final Map<String, MapIconBanner> k = Maps.newHashMap();
public Map<String, MapIcon> decorations = Maps.newLinkedHashMap();
+ // CraftBukkit start
@@ -33,8 +34,8 @@
+ // CraftBukkit end
}
- public void a(double d0, double d1, int i) {
-@@ -34,7 +52,30 @@
+ public void a(int i, int j, int k, boolean flag, boolean flag1, int l) {
+@@ -44,7 +63,30 @@
}
public void a(NBTTagCompound nbttagcompound) {
@@ -65,8 +66,8 @@
+ // CraftBukkit end
this.centerX = nbttagcompound.getInt("xCenter");
this.centerZ = nbttagcompound.getInt("zCenter");
- this.scale = nbttagcompound.getByte("scale");
-@@ -76,6 +117,25 @@
+ this.scale = (byte) MathHelper.clamp(nbttagcompound.getByte("scale"), 0, 4);
+@@ -67,6 +109,25 @@
}
public NBTTagCompound b(NBTTagCompound nbttagcompound) {
@@ -92,7 +93,7 @@
nbttagcompound.setByte("dimension", this.map);
nbttagcompound.setInt("xCenter", this.centerX);
nbttagcompound.setInt("zCenter", this.centerZ);
-@@ -265,12 +325,26 @@
+@@ -315,12 +376,25 @@
@Nullable
public Packet<?> a(ItemStack itemstack) {
@@ -104,18 +105,17 @@
+ for ( org.bukkit.map.MapCursor cursor : render.cursors) {
+
+ if (cursor.isVisible()) {
-+ icons.add(new MapIcon(MapIcon.Type.a(cursor.getRawType()), cursor.getX(), cursor.getY(), cursor.getDirection()));
++ icons.add(new MapIcon(MapIcon.Type.a(cursor.getRawType()), cursor.getX(), cursor.getY(), cursor.getDirection(), CraftChatMessage.fromStringOrNull(cursor.getCaption())));
+ }
+ }
+
if (this.d) {
this.d = false;
-- return new PacketPlayOutMap(itemstack.getData(), WorldMap.this.scale, WorldMap.this.track, WorldMap.this.decorations.values(), WorldMap.this.colors, this.e, this.f, this.g + 1 - this.e, this.h + 1 - this.f);
-+ // PAIL: this.e
-+ return new PacketPlayOutMap(itemstack.getData(), WorldMap.this.scale, WorldMap.this.track, icons, render.buffer, this.e, this.f, this.g + 1 - this.e, this.h + 1 - this.f);
+- return new PacketPlayOutMap(ItemWorldMap.e(itemstack), WorldMap.this.scale, WorldMap.this.track, WorldMap.this.decorations.values(), WorldMap.this.colors, this.e, this.f, this.g + 1 - this.e, this.h + 1 - this.f);
++ return new PacketPlayOutMap(ItemWorldMap.e(itemstack), WorldMap.this.scale, WorldMap.this.track, 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(), WorldMap.this.scale, WorldMap.this.track, WorldMap.this.decorations.values(), WorldMap.this.colors, 0, 0, 0, 0) : null;
-+ return this.i++ % 5 == 0 ? new PacketPlayOutMap(itemstack.getData(), WorldMap.this.scale, WorldMap.this.track, icons, render.buffer, 0, 0, 0, 0) : null;
+- return this.i++ % 5 == 0 ? new PacketPlayOutMap(ItemWorldMap.e(itemstack), WorldMap.this.scale, WorldMap.this.track, WorldMap.this.decorations.values(), WorldMap.this.colors, 0, 0, 0, 0) : null;
++ return this.i++ % 5 == 0 ? new PacketPlayOutMap(ItemWorldMap.e(itemstack), WorldMap.this.scale, WorldMap.this.track, icons, render.buffer, 0, 0, 0, 0) : null;
}
+ // CraftBukkit end
}
diff --git a/nms-patches/WorldNBTStorage.patch b/nms-patches/WorldNBTStorage.patch
index c39f4ef7..675a06b5 100644
--- a/nms-patches/WorldNBTStorage.patch
+++ b/nms-patches/WorldNBTStorage.patch
@@ -1,6 +1,6 @@
--- a/net/minecraft/server/WorldNBTStorage.java
+++ b/net/minecraft/server/WorldNBTStorage.java
-@@ -12,6 +12,11 @@
+@@ -14,6 +14,11 @@
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
@@ -12,15 +12,15 @@
public class WorldNBTStorage implements IDataManager, IPlayerFileData {
private static final Logger b = LogManager.getLogger();
-@@ -22,6 +27,7 @@
+@@ -24,6 +29,7 @@
private final String g;
private final DefinedStructureManager h;
- protected final DataConverterManager a;
+ protected final DataFixer a;
+ private UUID uuid = null; // CraftBukkit
- public WorldNBTStorage(File file, String s, boolean flag, DataConverterManager dataconvertermanager) {
- this.a = dataconvertermanager;
-@@ -168,12 +174,38 @@
+ public WorldNBTStorage(File file, String s, @Nullable MinecraftServer minecraftserver, DataFixer datafixer) {
+ this.a = datafixer;
+@@ -170,6 +176,16 @@
}
if (nbttagcompound != null) {
@@ -34,9 +34,10 @@
+ }
+ }
+ // CraftBukkit end
- entityhuman.f(this.a.a((DataConverterType) DataConverterTypes.PLAYER, nbttagcompound));
- }
+ int i = nbttagcompound.hasKeyOfType("DataVersion", 3) ? nbttagcompound.getInt("DataVersion") : -1;
+ entityhuman.f(GameProfileSerializer.a(this.a, DataFixTypes.PLAYER, nbttagcompound, i));
+@@ -178,6 +194,22 @@
return nbttagcompound;
}
@@ -59,9 +60,9 @@
public IPlayerFileData getPlayerFileData() {
return this;
}
-@@ -203,4 +235,50 @@
- public DefinedStructureManager h() {
- return this.h;
+@@ -211,4 +243,50 @@
+ public DataFixer i() {
+ return this.a;
}
+
+ // CraftBukkit start
diff --git a/nms-patches/WorldProviderHell.patch b/nms-patches/WorldProviderHell.patch
index 3b43b316..f3660cd7 100644
--- a/nms-patches/WorldProviderHell.patch
+++ b/nms-patches/WorldProviderHell.patch
@@ -1,6 +1,6 @@
--- a/net/minecraft/server/WorldProviderHell.java
+++ b/net/minecraft/server/WorldProviderHell.java
-@@ -44,11 +44,11 @@
+@@ -56,11 +56,11 @@
public WorldBorder getWorldBorder() {
return new WorldBorder() {
public double getCenterX() {
diff --git a/nms-patches/WorldServer.patch b/nms-patches/WorldServer.patch
index 682421ef..6c1c381e 100644
--- a/nms-patches/WorldServer.patch
+++ b/nms-patches/WorldServer.patch
@@ -1,6 +1,6 @@
--- a/net/minecraft/server/WorldServer.java
+++ b/net/minecraft/server/WorldServer.java
-@@ -20,14 +20,26 @@
+@@ -20,6 +20,18 @@
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
@@ -19,22 +19,13 @@
public class WorldServer extends World implements IAsyncTaskHandler {
private static final Logger a = LogManager.getLogger();
- private final MinecraftServer server;
- public EntityTracker tracker;
- private final PlayerChunkMap manager;
-- private final Set<NextTickListEntry> nextTickListHash = Sets.newHashSet();
-- private final TreeSet<NextTickListEntry> nextTickList = new TreeSet();
-+ // private final Set<NextTickListEntry> nextTickListHash = Sets.newHashSet();
-+ private final HashTreeSet<NextTickListEntry> nextTickList = new HashTreeSet<NextTickListEntry>(); // CraftBukkit - HashTreeSet
- private final Map<UUID, Entity> entitiesByUUID = Maps.newHashMap();
- public boolean savingDisabled;
+@@ -38,28 +50,36 @@
+ ObjectLinkedOpenHashSet<BlockActionData> d;
private boolean Q;
-@@ -39,14 +51,22 @@
- private int V;
- private final List<NextTickListEntry> W = Lists.newArrayList();
- public WorldServer(MinecraftServer minecraftserver, IDataManager idatamanager, WorldData worlddata, int i, MethodProfiler methodprofiler) {
- super(idatamanager, worlddata, DimensionManager.a(i).d(), methodprofiler, false);
+- Predicate predicate = (block) -> {
+ // CraftBukkit start
+ public final int dimension;
+
@@ -45,52 +36,60 @@
+ this.pvpMode = minecraftserver.getPVP();
+ worlddata.world = this;
+ // CraftBukkit end
++ Predicate<Block> predicate = (block) -> { // CraftBukkit - decompile error
+ return block == null || block.getBlockData().isAir();
+ };
+ RegistryBlocks registryblocks = Block.REGISTRY;
+
+ Block.REGISTRY.getClass();
+ Function function = registryblocks::b;
+- RegistryBlocks registryblocks1 = Block.REGISTRY;
++ RegistryBlocks<MinecraftKey, Block> registryblocks1 = Block.REGISTRY; // CraftBukkit - decompile error
+
+ Block.REGISTRY.getClass();
+- this.nextTickListBlock = new TickListServer(this, predicate, function, registryblocks1::get, this::b);
+- predicate = (fluidtype) -> {
++ this.nextTickListBlock = new TickListServer<>(this, predicate, function, registryblocks1::get, this::b); // CraftBukkit - decompile error
++ Predicate<FluidType> predicate2 = (fluidtype) -> {
+ return fluidtype == null || fluidtype == FluidTypes.a;
+ };
+ registryblocks = FluidType.c;
+ FluidType.c.getClass();
+ function = registryblocks::b;
+- registryblocks1 = FluidType.c;
++ RegistryBlocks<MinecraftKey, FluidType> registryblocks2 = FluidType.c; // CraftBukkit - decompile error
+ FluidType.c.getClass();
+- this.nextTickListFluid = new TickListServer(this, predicate, function, registryblocks1::get, this::a);
++ this.nextTickListFluid = new TickListServer<>(this, predicate2, function, registryblocks2::get, this::a); // CraftBukkit - decompile error
+ this.siegeManager = new VillageSiege(this);
+ this.d = new ObjectLinkedOpenHashSet();
this.server = minecraftserver;
- this.tracker = new EntityTracker(this);
+@@ -67,7 +87,7 @@
this.manager = new PlayerChunkMap(this);
this.worldProvider.a((World) this);
- this.chunkProvider = this.n();
+ this.chunkProvider = this.q();
- this.portalTravelAgent = new PortalTravelAgent(this);
+ this.portalTravelAgent = new org.bukkit.craftbukkit.CraftTravelAgent(this); // CraftBukkit
- this.J();
- this.K();
- this.getWorldBorder().a(minecraftserver.aE());
-@@ -65,6 +85,7 @@
+ this.O();
+ this.P();
+ this.getWorldBorder().a(minecraftserver.aw());
+@@ -86,6 +106,7 @@
this.villages.a((World) this);
}
+ if (getServer().getScoreboardManager() == null) { // CraftBukkit
- this.scoreboard = new ScoreboardServer(this.server);
- PersistentScoreboard persistentscoreboard = (PersistentScoreboard) this.worldMaps.get(PersistentScoreboard.class, "scoreboard");
+ PersistentScoreboard persistentscoreboard = (PersistentScoreboard) this.worldMaps.get(PersistentScoreboard::new, "scoreboard");
-@@ -75,9 +96,24 @@
+ if (persistentscoreboard == null) {
+@@ -95,6 +116,7 @@
- persistentscoreboard.a(this.scoreboard);
- ((ScoreboardServer) this.scoreboard).a((Runnable) (new RunnableSaveScoreboard(persistentscoreboard)));
-+ // CraftBukkit start
-+ } else {
-+ this.scoreboard = getServer().getScoreboardManager().getMainScoreboard().getHandle();
-+ }
-+ // CraftBukkit end
-+
- this.B = new LootTableRegistry(new File(new File(this.dataManager.getDirectory(), "data"), "loot_tables"));
-- this.C = new AdvancementDataWorld(new File(new File(this.dataManager.getDirectory(), "data"), "advancements"));
-- this.D = new CustomFunctionData(new File(new File(this.dataManager.getDirectory(), "data"), "functions"), this.server);
-+ // CraftBukkit start
-+ if (this.dimension != 0) { // SPIGOT-3899 multiple worlds of advancements not supported
-+ this.C = this.server.getAdvancementData();
-+ }
-+ if (this.C == null) {
-+ this.C = new AdvancementDataWorld(new File(new File(this.dataManager.getDirectory(), "data"), "advancements"));
-+ }
-+ if (this.D == null) {
-+ this.D = new CustomFunctionData(new File(new File(this.dataManager.getDirectory(), "data"), "functions"), this.server);
-+ }
-+ // CraftBukkit end
+ persistentscoreboard.a((Scoreboard) this.server.getScoreboard());
+ this.server.getScoreboard().a((Runnable) (new RunnableSaveScoreboard(persistentscoreboard)));
++ } // CraftBukkit
this.getWorldBorder().setCenter(this.worldData.B(), this.worldData.C());
this.getWorldBorder().setDamageAmount(this.worldData.H());
this.getWorldBorder().setDamageBuffer(this.worldData.G());
-@@ -89,9 +125,146 @@
+@@ -106,9 +128,130 @@
this.getWorldBorder().setSize(this.worldData.D());
}
@@ -126,18 +125,14 @@
+ result = fixTileEntity(pos, type, result);
+ }
+ } else if (type == Blocks.JUKEBOX) {
-+ if (!(result instanceof BlockJukeBox.TileEntityRecordPlayer)) {
-+ result = fixTileEntity(pos, type, result);
-+ }
-+ } else if (type == Blocks.NOTEBLOCK) {
-+ if (!(result instanceof TileEntityNote)) {
++ if (!(result instanceof TileEntityJukeBox)) {
+ result = fixTileEntity(pos, type, result);
+ }
-+ } else if (type == Blocks.MOB_SPAWNER) {
++ } else if (type == Blocks.SPAWNER) {
+ if (!(result instanceof TileEntityMobSpawner)) {
+ result = fixTileEntity(pos, type, result);
+ }
-+ } else if ((type == Blocks.STANDING_SIGN) || (type == Blocks.WALL_SIGN)) {
++ } else if ((type == Blocks.SIGN) || (type == Blocks.WALL_SIGN)) {
+ if (!(result instanceof TileEntitySign)) {
+ result = fixTileEntity(pos, type, result);
+ }
@@ -165,23 +160,19 @@
+ if (!(result instanceof TileEntityEnderPortal)) {
+ result = fixTileEntity(pos, type, result);
+ }
-+ } else if (type == Blocks.SKULL) {
++ } else if (type instanceof BlockSkullAbstract) {
+ if (!(result instanceof TileEntitySkull)) {
+ result = fixTileEntity(pos, type, result);
+ }
-+ } else if (type == Blocks.DAYLIGHT_DETECTOR || type == Blocks.DAYLIGHT_DETECTOR_INVERTED) {
++ } else if (type == Blocks.DAYLIGHT_DETECTOR) {
+ if (!(result instanceof TileEntityLightDetector)) {
+ result = fixTileEntity(pos, type, result);
+ }
-+ } else if (type == Blocks.POWERED_COMPARATOR || type == Blocks.UNPOWERED_COMPARATOR) {
++ } else if (type == Blocks.COMPARATOR) {
+ if (!(result instanceof TileEntityComparator)) {
+ result = fixTileEntity(pos, type, result);
+ }
-+ } else if (type == Blocks.FLOWER_POT) {
-+ if (!(result instanceof TileEntityFlowerPot)) {
-+ result = fixTileEntity(pos, type, result);
-+ }
-+ } else if (type == Blocks.STANDING_BANNER || type == Blocks.WALL_BANNER) {
++ }else if (type instanceof BlockBannerAbstract) {
+ if (!(result instanceof TileEntityBanner)) {
+ result = fixTileEntity(pos, type, result);
+ }
@@ -201,7 +192,7 @@
+ if (!(result instanceof TileEntityStructure)) {
+ result = fixTileEntity(pos, type, result);
+ }
-+ } else if (type == Blocks.BED) {
++ } else if (type instanceof BlockBed) {
+ if (!(result instanceof TileEntityBed)) {
+ result = fixTileEntity(pos, type, result);
+ }
@@ -212,10 +203,10 @@
+
+ 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});
++ + "Bukkit will attempt to fix this, but there may be additional damage that we cannot recover.", new Object[]{pos.getX(), pos.getY(), pos.getZ(), type, found});
+
+ if (type instanceof ITileEntity) {
-+ TileEntity replacement = ((ITileEntity) type).a(this, type.toLegacyData(this.getType(pos)));
++ TileEntity replacement = ((ITileEntity) type).a(this);
+ replacement.world = this;
+ this.setTileEntity(pos, replacement);
+ return replacement;
@@ -224,43 +215,37 @@
+ 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() {
+ this.Q = true;
super.doTick();
- if (this.getWorldData().isHardcore() && this.getDifficulty() != EnumDifficulty.HARD) {
-@@ -110,8 +283,11 @@
+@@ -128,9 +271,12 @@
}
- this.methodProfiler.a("mobSpawner");
+ this.methodProfiler.a("spawner");
- if (this.getGameRules().getBoolean("doMobSpawning") && this.worldData.getType() != WorldType.DEBUG_ALL_BLOCK_STATES) {
- this.spawnerCreature.a(this, this.allowMonsters, this.allowAnimals, this.worldData.getTime() % 400L == 0L);
+- this.getChunkProviderServer().a(this, this.allowMonsters, this.allowAnimals);
+ // 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.spawnerCreature.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);
++ this.getChunkProviderServer().a(this, this.allowMonsters && (this.ticksPerMonsterSpawns != 0 && time % this.ticksPerMonsterSpawns == 0L), this.allowAnimals && (this.ticksPerAnimalSpawns != 0 && time % this.ticksPerAnimalSpawns == 0L));
+ // CraftBukkit end
}
this.methodProfiler.c("chunkSource");
-@@ -140,6 +316,8 @@
- this.portalTravelAgent.a(this.getTime());
- this.methodProfiler.b();
- this.aq();
+@@ -160,6 +306,8 @@
+ this.methodProfiler.e();
+ this.am();
+ this.Q = false;
+
+ this.getWorld().processChunkGC(); // CraftBukkit
}
- @Nullable
-@@ -167,7 +345,7 @@
+ public boolean j_() {
+@@ -191,7 +339,7 @@
if (entityhuman.isSpectator()) {
++i;
@@ -269,14 +254,14 @@
++j;
}
}
-@@ -195,25 +373,46 @@
+@@ -223,25 +371,46 @@
}
- private void c() {
+ private void ai() {
- this.worldData.setWeatherDuration(0);
++ // CraftBukkit start
this.worldData.setStorm(false);
- this.worldData.setThunderDuration(0);
-+ // CraftBukkit start
+ // If we stop due to everyone sleeping we should reset the weather duration to some other random value.
+ // Not that everyone ever manages to get the whole server to sleep at the same time....
+ if (!this.worldData.hasStorm()) {
@@ -294,7 +279,7 @@
}
public boolean everyoneDeeplySleeping() {
- if (this.Q && !this.isClientSide) {
+ if (this.K && !this.isClientSide) {
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
@@ -320,8 +305,8 @@
return false;
} else {
-@@ -283,7 +482,7 @@
- entityhorseskeleton.p(true);
+@@ -315,7 +484,7 @@
+ entityhorseskeleton.s(true);
entityhorseskeleton.setAgeRaw(0);
entityhorseskeleton.setPosition((double) blockposition.getX(), (double) blockposition.getY(), (double) blockposition.getZ());
- this.addEntity(entityhorseskeleton);
@@ -329,51 +314,30 @@
this.strikeLightning(new EntityLightning(this, (double) blockposition.getX(), (double) blockposition.getY(), (double) blockposition.getZ(), true));
} else {
this.strikeLightning(new EntityLightning(this, (double) blockposition.getX(), (double) blockposition.getY(), (double) blockposition.getZ(), false));
-@@ -299,11 +498,11 @@
- BlockPosition blockposition1 = blockposition.down();
+@@ -332,11 +501,11 @@
+ BiomeBase biomebase = this.getBiome(blockposition);
- if (this.v(blockposition1)) {
+ if (biomebase.a((IWorldReader) this, blockposition1)) {
- this.setTypeUpdate(blockposition1, Blocks.ICE.getBlockData());
+ org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockFormEvent(this, blockposition1, Blocks.ICE.getBlockData(), null); // CraftBukkit
}
- if (flag && this.f(blockposition, true)) {
-- this.setTypeUpdate(blockposition, Blocks.SNOW_LAYER.getBlockData());
-+ org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockFormEvent(this, blockposition, Blocks.SNOW_LAYER.getBlockData(), null); // CraftBukkit
+ if (flag && biomebase.b(this, blockposition)) {
+- this.setTypeUpdate(blockposition, Blocks.SNOW.getBlockData());
++ org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockFormEvent(this, blockposition1, Blocks.ICE.getBlockData(), null); // CraftBukkit
}
- if (flag && this.getBiome(blockposition1).d()) {
-@@ -378,7 +577,7 @@
- public boolean b(BlockPosition blockposition, Block block) {
- NextTickListEntry nextticklistentry = new NextTickListEntry(blockposition, block);
-
-- return this.nextTickListHash.contains(nextticklistentry);
-+ return this.nextTickList.contains(nextticklistentry); // CraftBukkit
- }
-
- public void a(BlockPosition blockposition, Block block, int i) {
-@@ -412,8 +611,8 @@
- nextticklistentry.a(j);
- }
-
-- if (!this.nextTickListHash.contains(nextticklistentry)) {
-- this.nextTickListHash.add(nextticklistentry);
-+ // CraftBukkit - use nextTickList
-+ if (!this.nextTickList.contains(nextticklistentry)) {
- this.nextTickList.add(nextticklistentry);
- }
- }
-@@ -430,15 +629,15 @@
- nextticklistentry.a((long) i + this.worldData.getTime());
- }
-
-- if (!this.nextTickListHash.contains(nextticklistentry)) {
-- this.nextTickListHash.add(nextticklistentry);
-+ // CraftBukkit - use nextTickList
-+ if (!this.nextTickList.contains(nextticklistentry)) {
- this.nextTickList.add(nextticklistentry);
- }
-
+ if (flag && this.getBiome(blockposition1).c() == BiomeBase.Precipitation.RAIN) {
+@@ -385,7 +554,7 @@
+ protected BlockPosition a(BlockPosition blockposition) {
+ BlockPosition blockposition1 = this.getHighestBlockYAt(HeightMap.Type.MOTION_BLOCKING, blockposition);
+ AxisAlignedBB axisalignedbb = (new AxisAlignedBB(blockposition1, new BlockPosition(blockposition1.getX(), this.getHeight(), blockposition1.getZ()))).g(3.0D);
+- List list = this.a(EntityLiving.class, axisalignedbb, (entityliving) -> {
++ List list = this.a(EntityLiving.class, axisalignedbb, (Predicate<EntityLiving>) (entityliving) -> { // CraftBukkit - decompile error
+ return entityliving != null && entityliving.isAlive() && this.e(entityliving.getChunkCoordinates());
+ });
+
+@@ -401,7 +570,7 @@
}
public void tickEntities() {
@@ -382,55 +346,15 @@
if (this.emptyTime++ >= 300) {
return;
}
-@@ -508,11 +707,17 @@
- } else {
- int i = this.nextTickList.size();
-
-- if (i != this.nextTickListHash.size()) {
-+ if (false) { // CraftBukkit
- throw new IllegalStateException("TickNextTick list out of synch");
- } else {
- if (i > 65536) {
-- i = 65536;
-+ // CraftBukkit start - If the server has too much to process over time, try to alleviate that
-+ if (i > 20 * 65536) {
-+ i = i / 20;
-+ } else {
-+ i = 65536;
-+ }
-+ // CraftBukkit end
- }
-
- this.methodProfiler.a("cleaning");
-@@ -525,8 +730,9 @@
- break;
- }
+@@ -490,6 +659,7 @@
-+ // CraftBukkit - use nextTickList
- this.nextTickList.remove(nextticklistentry);
-- this.nextTickListHash.remove(nextticklistentry);
-+ // this.nextTickListHash.remove(nextticklistentry);
- this.W.add(nextticklistentry);
- }
-
-@@ -596,7 +802,7 @@
- if (blockposition.getX() >= structureboundingbox.a && blockposition.getX() < structureboundingbox.d && blockposition.getZ() >= structureboundingbox.c && blockposition.getZ() < structureboundingbox.f) {
- if (flag) {
- if (i == 0) {
-- this.nextTickListHash.remove(nextticklistentry);
-+ // this.nextTickListHash.remove(nextticklistentry); // CraftBukkit - removed
- }
-
- iterator.remove();
-@@ -614,6 +820,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();
-@@ -625,6 +832,7 @@
+@@ -501,6 +671,7 @@
super.entityJoinedWorld(entity, flag);
}
@@ -438,11 +362,11 @@
private boolean getSpawnNPCs() {
return this.server.getSpawnNPCs();
-@@ -637,7 +845,54 @@
- protected IChunkProvider n() {
+@@ -513,7 +684,21 @@
+ protected IChunkProvider q() {
IChunkLoader ichunkloader = this.dataManager.createChunkLoader(this.worldProvider);
-- return new ChunkProviderServer(this, ichunkloader, this.worldProvider.getChunkGenerator());
+- return new ChunkProviderServer(this, ichunkloader, this.worldProvider.getChunkGenerator(), this.server);
+ // CraftBukkit start
+ org.bukkit.craftbukkit.generator.InternalChunkGenerator gen;
+
@@ -456,47 +380,14 @@
+ gen = new org.bukkit.craftbukkit.generator.NormalChunkGenerator(this, this.getSeed());
+ }
+
-+ return new ChunkProviderServer(this, ichunkloader, gen);
-+ // CraftBukkit end
-+ }
-+
-+ public List<TileEntity> 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.tileEntityList.size(); ++k1) {
-+ TileEntity tileentity = (TileEntity) this.tileEntityList.get(k1);
-+ BlockPosition blockposition = tileentity.getPosition();
-+
-+ if (blockposition.getX() >= i && blockposition.getY() >= j && blockposition.getZ() >= k && blockposition.getX() < l && blockposition.getY() < i1 && blockposition.getZ() < j1) {
-+ arraylist.add(tileentity);
-+ }
-+ }
-+ */
++ return new ChunkProviderServer(this, ichunkloader, gen, this.server);
+ // CraftBukkit end
-+
-+ return arraylist;
}
public boolean a(EntityHuman entityhuman, BlockPosition blockposition) {
-@@ -699,6 +954,23 @@
- int j = this.worldProvider.getSeaLevel();
- int k = 8;
+@@ -572,6 +757,22 @@
+ BlockPosition blockposition = worldchunkmanager.a(0, 0, 256, list, random);
+ ChunkCoordIntPair chunkcoordintpair = blockposition == null ? new ChunkCoordIntPair(0, 0) : new ChunkCoordIntPair(blockposition);
+ // CraftBukkit start
+ if (this.generator != null) {
@@ -508,34 +399,24 @@
+ 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();
- k = blockposition.getZ();
-@@ -708,7 +980,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;
-@@ -750,6 +1022,7 @@
+ if (blockposition == null) {
+ WorldServer.a.warn("Unable to find spawn biome");
+ }
+@@ -647,6 +848,7 @@
ChunkProviderServer chunkproviderserver = this.getChunkProviderServer();
if (chunkproviderserver.e()) {
+ org.bukkit.Bukkit.getPluginManager().callEvent(new org.bukkit.event.world.WorldSaveEvent(getWorld())); // CraftBukkit
if (iprogressupdate != null) {
- iprogressupdate.a("Saving level");
+ iprogressupdate.a(new ChatMessage("menu.savingLevel", new Object[0]));
}
-@@ -760,7 +1033,8 @@
+@@ -657,7 +859,8 @@
}
chunkproviderserver.a(flag);
@@ -545,20 +426,20 @@
Iterator iterator = arraylist.iterator();
while (iterator.hasNext()) {
-@@ -795,6 +1069,12 @@
+@@ -692,6 +895,12 @@
}
}
+ // CraftBukkit start - Save secondary data for nether/end
+ if (this instanceof SecondaryWorldServer) {
-+ ((SecondaryWorldServer) this).c();
++ ((SecondaryWorldServer) this).c(); // As above
+ }
+ // CraftBukkit end
+
this.worldData.a(this.getWorldBorder().getSize());
this.worldData.d(this.getWorldBorder().getCenterX());
this.worldData.c(this.getWorldBorder().getCenterZ());
-@@ -808,9 +1088,13 @@
+@@ -706,9 +915,13 @@
this.worldMaps.a();
}
@@ -574,25 +455,25 @@
public void a(Collection<Entity> collection) {
ArrayList arraylist = Lists.newArrayList(collection);
-@@ -829,7 +1113,7 @@
+@@ -727,7 +940,7 @@
private boolean j(Entity entity) {
if (entity.dead) {
-- WorldServer.a.warn("Tried to add entity {} but it was marked as removed already", EntityTypes.a(entity));
-+ // WorldServer.a.warn("Tried to add entity {} but it was marked as removed already", EntityTypes.a(entity)); // CraftBukkit
+- WorldServer.a.warn("Tried to add entity {} but it was marked as removed already", EntityTypes.getName(entity.P()));
++ // WorldServer.a.warn("Tried to add entity {} but it was marked as removed already", EntityTypes.getName(entity.P())); // CraftBukkit
return false;
} else {
UUID uuid = entity.getUniqueID();
-@@ -841,7 +1125,7 @@
- this.f.remove(entity1);
+@@ -739,7 +952,7 @@
+ this.g.remove(entity1);
} else {
if (!(entity instanceof EntityHuman)) {
-- WorldServer.a.warn("Keeping entity {} that already exists with UUID {}", EntityTypes.a(entity1), uuid.toString());
-+ // WorldServer.a.warn("Keeping entity {} that already exists with UUID {}", EntityTypes.a(entity1), uuid.toString()); // CraftBukkit
+- WorldServer.a.warn("Keeping entity {} that already exists with UUID {}", EntityTypes.getName(entity1.P()), uuid.toString());
++ // WorldServer.a.warn("Keeping entity {} that already exists with UUID {}", EntityTypes.getName(entity1.P()), uuid.toString()); // CraftBukkit
return false;
}
-@@ -894,8 +1178,16 @@
+@@ -792,8 +1005,16 @@
}
public boolean strikeLightning(Entity entity) {
@@ -610,12 +491,12 @@
return true;
} else {
return false;
-@@ -911,10 +1203,20 @@
+@@ -809,6 +1030,14 @@
}
- public Explosion createExplosion(@Nullable Entity entity, double d0, double d1, double d2, float f, boolean flag, boolean flag1) {
+ public Explosion createExplosion(@Nullable Entity entity, DamageSource damagesource, 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);
++ Explosion explosion = super.createExplosion(entity, damagesource, d0, d1, d2, f, flag, flag1);
+
+ if (explosion.wasCanceled) {
+ return explosion;
@@ -624,6 +505,9 @@
+ /* Remove
Explosion explosion = new Explosion(this, entity, d0, d1, d2, f, flag, flag1);
+ if (damagesource != null) {
+@@ -817,6 +1046,8 @@
+
explosion.a();
explosion.a(false);
+ */
@@ -631,27 +515,27 @@
if (!flag1) {
explosion.clearBlocks();
}
-@@ -960,7 +1262,8 @@
- BlockActionData blockactiondata = (BlockActionData) iterator.next();
+@@ -843,7 +1074,8 @@
+ BlockActionData blockactiondata = (BlockActionData) this.d.removeFirst();
- if (this.a(blockactiondata)) {
-- this.server.getPlayerList().sendPacketNearby((EntityHuman) null, (double) blockactiondata.a().getX(), (double) blockactiondata.a().getY(), (double) blockactiondata.a().getZ(), 64.0D, this.worldProvider.getDimensionManager().getDimensionID(), new PacketPlayOutBlockAction(blockactiondata.a(), blockactiondata.d(), blockactiondata.b(), blockactiondata.c()));
-+ // CraftBukkit - this.worldProvider.dimension -> this.dimension
-+ this.server.getPlayerList().sendPacketNearby((EntityHuman) null, (double) blockactiondata.a().getX(), (double) blockactiondata.a().getY(), (double) blockactiondata.a().getZ(), 64.0D, dimension, new PacketPlayOutBlockAction(blockactiondata.a(), blockactiondata.d(), blockactiondata.b(), blockactiondata.c()));
- }
+ if (this.a(blockactiondata)) {
+- this.server.getPlayerList().sendPacketNearby((EntityHuman) null, (double) blockactiondata.a().getX(), (double) blockactiondata.a().getY(), (double) blockactiondata.a().getZ(), 64.0D, this.worldProvider.getDimensionManager().getDimensionID(), new PacketPlayOutBlockAction(blockactiondata.a(), blockactiondata.b(), blockactiondata.c(), blockactiondata.d()));
++ // CraftBukkit - this.worldProvider.dimension -> this.dimension
++ this.server.getPlayerList().sendPacketNearby((EntityHuman) null, (double) blockactiondata.a().getX(), (double) blockactiondata.a().getY(), (double) blockactiondata.a().getZ(), 64.0D, dimension, new PacketPlayOutBlockAction(blockactiondata.a(), blockactiondata.b(), blockactiondata.c(), blockactiondata.d()));
}
+ }
-@@ -983,6 +1286,7 @@
+@@ -864,6 +1096,7 @@
boolean flag = this.isRaining();
- super.t();
+ super.v();
+ /* CraftBukkit start
- if (this.n != this.o) {
- this.server.getPlayerList().a((Packet) (new PacketPlayOutGameStateChange(7, this.o)), this.worldProvider.getDimensionManager().getDimensionID());
+ if (this.o != this.p) {
+ this.server.getPlayerList().a((Packet) (new PacketPlayOutGameStateChange(7, this.p)), this.worldProvider.getDimensionManager().getDimensionID());
}
-@@ -1001,6 +1305,21 @@
- this.server.getPlayerList().sendAll(new PacketPlayOutGameStateChange(7, this.o));
- this.server.getPlayerList().sendAll(new PacketPlayOutGameStateChange(8, this.q));
+@@ -882,6 +1115,21 @@
+ this.server.getPlayerList().sendAll(new PacketPlayOutGameStateChange(7, this.p));
+ this.server.getPlayerList().sendAll(new PacketPlayOutGameStateChange(8, this.r));
}
+ // */
+ if (flag != this.isRaining()) {
@@ -664,31 +548,29 @@
+ }
+ for (int i = 0; i < this.players.size(); ++i) {
+ if (((EntityPlayer) this.players.get(i)).world == this) {
-+ ((EntityPlayer) this.players.get(i)).updateWeather(this.n, this.o, this.p, this.q);
++ ((EntityPlayer) this.players.get(i)).updateWeather(this.o, this.p, this.q, this.r);
+ }
+ }
+ // CraftBukkit end
}
-@@ -1030,10 +1349,20 @@
+@@ -915,11 +1163,18 @@
}
- 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) {
+ public <T extends ParticleParam> int a(T t0, double d0, double d1, double d2, int i, double d3, double d4, double d5, double d6) {
+ // CraftBukkit - visibility api support
-+ sendParticles(null, enumparticle, flag, d0, d1, d2, i, d3, d4, d5, d6, aint);
++ return sendParticles(null, t0, d0, d1, d2, i, d3, d4, d5, d6);
+ }
+
-+ 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) {
++ public <T extends ParticleParam> int sendParticles(EntityPlayer sender, T t0, double d0, double d1, double d2, int i, double d3, double d4, double d5, double d6) {
+ // CraftBukkit end
- PacketPlayOutWorldParticles packetplayoutworldparticles = new PacketPlayOutWorldParticles(enumparticle, flag, (float) d0, (float) d1, (float) d2, (float) d3, (float) d4, (float) d5, (float) d6, i, aint);
+ PacketPlayOutWorldParticles packetplayoutworldparticles = new PacketPlayOutWorldParticles(t0, false, (float) d0, (float) d1, (float) d2, (float) d3, (float) d4, (float) d5, (float) d6, i);
+ int j = 0;
- for (int j = 0; j < this.players.size(); ++j) {
- EntityPlayer entityplayer = (EntityPlayer) this.players.get(j);
+ for (int k = 0; k < this.players.size(); ++k) {
+ EntityPlayer entityplayer = (EntityPlayer) this.players.get(k);
+ if (sender != null && !entityplayer.getBukkitEntity().canSee(sender.getBukkitEntity())) continue; // CraftBukkit
-+ BlockPosition blockposition = entityplayer.getChunkCoordinates();
-+ double d7 = blockposition.distanceSquared(d0, d1, d2);
-+
- this.a(entityplayer, flag, d0, d1, d2, packetplayoutworldparticles);
- }
+ if (this.a(entityplayer, false, d0, d1, d2, packetplayoutworldparticles)) {
+ ++j;
diff --git a/pom.xml b/pom.xml
index 2cf28b13..9d8810cc 100644
--- a/pom.xml
+++ b/pom.xml
@@ -4,15 +4,15 @@
<groupId>org.bukkit</groupId>
<artifactId>craftbukkit</artifactId>
<packaging>jar</packaging>
- <version>1.12.2-R0.1-SNAPSHOT</version>
+ <version>1.13-pre7-R0.1-SNAPSHOT</version>
<name>CraftBukkit</name>
<url>http://www.bukkit.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<api.version>unknown</api.version>
- <minecraft.version>1.12.2</minecraft.version>
- <minecraft_version>1_12_R1</minecraft_version>
+ <minecraft.version>1.13-pre7</minecraft.version>
+ <minecraft_version>1_13_R1</minecraft_version>
<buildtag.prefix>git-Bukkit-</buildtag.prefix>
<buildtag.suffix></buildtag.suffix>
<maven.build.timestamp.format>yyyyMMdd-HHmm</maven.build.timestamp.format>
@@ -21,13 +21,6 @@
</properties>
<dependencies>
- <!-- bugfixes (netty#6607) -->
- <dependency>
- <groupId>io.netty</groupId>
- <artifactId>netty-all</artifactId>
- <version>4.1.24.Final</version>
- <scope>compile</scope>
- </dependency>
<dependency>
<groupId>org.bukkit</groupId>
<artifactId>bukkit</artifactId>
@@ -41,27 +34,27 @@
<scope>compile</scope>
</dependency>
<dependency>
- <groupId>net.sf.jopt-simple</groupId>
- <artifactId>jopt-simple</artifactId>
- <version>5.0.4</version>
- <scope>compile</scope>
- </dependency>
- <dependency>
<groupId>jline</groupId>
<artifactId>jline</artifactId>
<version>2.12.1</version>
<scope>compile</scope>
</dependency>
<dependency>
+ <groupId>org.ow2.asm</groupId>
+ <artifactId>asm</artifactId>
+ <version>6.2</version>
+ <scope>compile</scope>
+ </dependency>
+ <dependency>
<groupId>org.xerial</groupId>
<artifactId>sqlite-jdbc</artifactId>
- <version>3.21.0.1</version>
+ <version>3.23.1</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
- <version>5.1.45</version>
+ <version>5.1.46</version>
<scope>runtime</scope>
</dependency>
<!-- testing -->
@@ -115,7 +108,7 @@
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
- <version>3.0.2</version>
+ <version>2.4</version>
<configuration>
<archive>
<manifestEntries>
@@ -153,7 +146,7 @@
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
- <version>3.1.0</version>
+ <version>3.1.1</version>
<executions>
<execution>
<phase>package</phase>
@@ -215,8 +208,7 @@
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
- <!-- BUILDTOOLS-362 / SUREFIRE-1444 - newer version fails in Docker -->
- <version>2.20</version>
+ <version>2.12.4</version>
<configuration>
<workingDirectory>${basedir}/target/test-server</workingDirectory>
<excludes>
@@ -235,7 +227,7 @@
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>animal-sniffer-maven-plugin</artifactId>
- <version>1.16</version>
+ <version>1.17</version>
<executions>
<execution>
<phase>process-classes</phase>
diff --git a/src/main/java/com/mojang/brigadier/tree/CommandNode.java b/src/main/java/com/mojang/brigadier/tree/CommandNode.java
new file mode 100644
index 00000000..1196df6b
--- /dev/null
+++ b/src/main/java/com/mojang/brigadier/tree/CommandNode.java
@@ -0,0 +1,200 @@
+package com.mojang.brigadier.tree;
+
+import com.google.common.collect.ComparisonChain;
+import com.google.common.collect.Maps;
+import com.google.common.collect.Sets;
+import com.mojang.brigadier.AmbiguityConsumer;
+import com.mojang.brigadier.Command;
+import com.mojang.brigadier.RedirectModifier;
+import com.mojang.brigadier.StringReader;
+import com.mojang.brigadier.builder.ArgumentBuilder;
+import com.mojang.brigadier.context.CommandContext;
+import com.mojang.brigadier.context.CommandContextBuilder;
+import com.mojang.brigadier.exceptions.CommandSyntaxException;
+import com.mojang.brigadier.suggestion.Suggestions;
+import com.mojang.brigadier.suggestion.SuggestionsBuilder;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.LinkedHashMap;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.CompletableFuture;
+import java.util.function.Predicate;
+import java.util.stream.Collectors;
+
+import net.minecraft.server.CommandListenerWrapper; // CraftBukkit
+
+public abstract class CommandNode<S> implements Comparable<CommandNode<S>> {
+ private Map<String, CommandNode<S>> children = Maps.newLinkedHashMap();
+ private Map<String, LiteralCommandNode<S>> literals = Maps.newLinkedHashMap();
+ private Map<String, ArgumentCommandNode<S, ?>> arguments = Maps.newLinkedHashMap();
+ private final Predicate<S> requirement;
+ private final CommandNode<S> redirect;
+ private final RedirectModifier<S> modifier;
+ private final boolean forks;
+ private Command<S> command;
+
+ protected CommandNode(final Command<S> command, final Predicate<S> requirement, final CommandNode<S> redirect, final RedirectModifier<S> modifier, final boolean forks) {
+ this.command = command;
+ this.requirement = requirement;
+ this.redirect = redirect;
+ this.modifier = modifier;
+ this.forks = forks;
+ }
+
+ public Command<S> getCommand() {
+ return command;
+ }
+
+ public Collection<CommandNode<S>> getChildren() {
+ return children.values();
+ }
+
+ public CommandNode<S> getChild(final String name) {
+ return children.get(name);
+ }
+
+ public CommandNode<S> getRedirect() {
+ return redirect;
+ }
+
+ public RedirectModifier<S> getRedirectModifier() {
+ return modifier;
+ }
+
+ public boolean canUse(final S source) {
+ // CraftBukkit start
+ if (source instanceof CommandListenerWrapper) {
+ try {
+ ((CommandListenerWrapper) source).currentCommand = this;
+ return requirement.test(source);
+ } finally {
+ ((CommandListenerWrapper) source).currentCommand = null;
+ }
+ }
+ // CraftBukkit end
+ return requirement.test(source);
+ }
+
+ public void addChild(final CommandNode<S> node) {
+ if (node instanceof RootCommandNode) {
+ throw new UnsupportedOperationException("Cannot add a RootCommandNode as a child to any other CommandNode");
+ }
+
+ final CommandNode<S> child = children.get(node.getName());
+ if (child != null) {
+ // We've found something to merge onto
+ if (node.getCommand() != null) {
+ child.command = node.getCommand();
+ }
+ for (final CommandNode<S> grandchild : node.getChildren()) {
+ child.addChild(grandchild);
+ }
+ } else {
+ children.put(node.getName(), node);
+ if (node instanceof LiteralCommandNode) {
+ literals.put(node.getName(), (LiteralCommandNode<S>) node);
+ } else if (node instanceof ArgumentCommandNode) {
+ arguments.put(node.getName(), (ArgumentCommandNode<S, ?>) node);
+ }
+ }
+
+ children = children.entrySet().stream().sorted(Map.Entry.comparingByValue()).collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (e1, e2) -> e1, LinkedHashMap::new));
+ }
+
+ public void findAmbiguities(final AmbiguityConsumer<S> consumer) {
+ Set<String> matches = Sets.newHashSet();
+
+ for (final CommandNode<S> child : children.values()) {
+ for (final CommandNode<S> sibling : children.values()) {
+ if (child == sibling) {
+ continue;
+ }
+
+ for (final String input : child.getExamples()) {
+ if (sibling.isValidInput(input)) {
+ matches.add(input);
+ }
+ }
+
+ if (matches.size() > 0) {
+ consumer.ambiguous(this, child, sibling, matches);
+ matches = Sets.newHashSet();
+ }
+ }
+
+ child.findAmbiguities(consumer);
+ }
+ }
+
+ protected abstract boolean isValidInput(final String input);
+
+ @Override
+ public boolean equals(final Object o) {
+ if (this == o) return true;
+ if (!(o instanceof CommandNode)) return false;
+
+ final CommandNode<S> that = (CommandNode<S>) o;
+
+ if (!children.equals(that.children)) return false;
+ if (command != null ? !command.equals(that.command) : that.command != null) return false;
+
+ return true;
+ }
+
+ @Override
+ public int hashCode() {
+ return 31 * children.hashCode() + (command != null ? command.hashCode() : 0);
+ }
+
+ public Predicate<S> getRequirement() {
+ return requirement;
+ }
+
+ public abstract String getName();
+
+ public abstract String getUsageText();
+
+ public abstract void parse(StringReader reader, CommandContextBuilder<S> contextBuilder) throws CommandSyntaxException;
+
+ public abstract CompletableFuture<Suggestions> listSuggestions(CommandContext<S> context, SuggestionsBuilder builder) throws CommandSyntaxException;
+
+ public abstract ArgumentBuilder<S, ?> createBuilder();
+
+ protected abstract String getSortedKey();
+
+ public Collection<? extends CommandNode<S>> getRelevantNodes(final StringReader input) {
+ if (literals.size() > 0) {
+ final int cursor = input.getCursor();
+ while (input.canRead() && input.peek() != ' ') {
+ input.skip();
+ }
+ final String text = input.getString().substring(cursor, input.getCursor());
+ input.setCursor(cursor);
+ final LiteralCommandNode<S> literal = literals.get(text);
+ if (literal != null) {
+ return Collections.singleton(literal);
+ } else {
+ return arguments.values();
+ }
+ } else {
+ return arguments.values();
+ }
+ }
+
+ @Override
+ public int compareTo(final CommandNode<S> o) {
+ return ComparisonChain
+ .start()
+ .compareTrueFirst(this instanceof LiteralCommandNode, o instanceof LiteralCommandNode)
+ .compare(getSortedKey(), o.getSortedKey())
+ .result();
+ }
+
+ public boolean isFork() {
+ return forks;
+ }
+
+ public abstract Collection<String> getExamples();
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/CraftArt.java b/src/main/java/org/bukkit/craftbukkit/CraftArt.java
index 6f94348d..1b17fd2b 100644
--- a/src/main/java/org/bukkit/craftbukkit/CraftArt.java
+++ b/src/main/java/org/bukkit/craftbukkit/CraftArt.java
@@ -1,74 +1,33 @@
package org.bukkit.craftbukkit;
-import net.minecraft.server.EntityPainting.EnumArt;
+import com.google.common.base.Preconditions;
+import com.google.common.collect.BiMap;
+import com.google.common.collect.ImmutableBiMap;
+import net.minecraft.server.MinecraftKey;
+import net.minecraft.server.Paintings;
import org.bukkit.Art;
-// Safety class, will break if either side changes
public class CraftArt {
+ private static final BiMap<Paintings, Art> artwork;
- public static Art NotchToBukkit(EnumArt art) {
- switch (art) {
- case KEBAB: return Art.KEBAB;
- case AZTEC: return Art.AZTEC;
- case ALBAN: return Art.ALBAN;
- case AZTEC_2: return Art.AZTEC2;
- case BOMB: return Art.BOMB;
- case PLANT: return Art.PLANT;
- case WASTELAND: return Art.WASTELAND;
- case POOL: return Art.POOL;
- case COURBET: return Art.COURBET;
- case SEA: return Art.SEA;
- case SUNSET: return Art.SUNSET;
- case CREEBET: return Art.CREEBET;
- case WANDERER: return Art.WANDERER;
- case GRAHAM: return Art.GRAHAM;
- case MATCH: return Art.MATCH;
- case BUST: return Art.BUST;
- case STAGE: return Art.STAGE;
- case VOID: return Art.VOID;
- case SKULL_AND_ROSES: return Art.SKULL_AND_ROSES;
- case FIGHTERS: return Art.FIGHTERS;
- case POINTER: return Art.POINTER;
- case PIGSCENE: return Art.PIGSCENE;
- case BURNING_SKULL: return Art.BURNINGSKULL;
- case SKELETON: return Art.SKELETON;
- case DONKEY_KONG: return Art.DONKEYKONG;
- case WITHER: return Art.WITHER;
- default:
- throw new AssertionError(art);
+ static {
+ ImmutableBiMap.Builder<Paintings, Art> artworkBuilder = ImmutableBiMap.builder();
+ for (MinecraftKey key : Paintings.a.keySet()) {
+ artworkBuilder.put(Paintings.a.get(key), Art.getByName(key.getKey()));
}
+
+ artwork = artworkBuilder.build();
}
- public static EnumArt BukkitToNotch(Art art) {
- switch (art) {
- case KEBAB: return EnumArt.KEBAB;
- case AZTEC: return EnumArt.AZTEC;
- case ALBAN: return EnumArt.ALBAN;
- case AZTEC2: return EnumArt.AZTEC_2;
- case BOMB: return EnumArt.BOMB;
- case PLANT: return EnumArt.PLANT;
- case WASTELAND: return EnumArt.WASTELAND;
- case POOL: return EnumArt.POOL;
- case COURBET: return EnumArt.COURBET;
- case SEA: return EnumArt.SEA;
- case SUNSET: return EnumArt.SUNSET;
- case CREEBET: return EnumArt.CREEBET;
- case WANDERER: return EnumArt.WANDERER;
- case GRAHAM: return EnumArt.GRAHAM;
- case MATCH: return EnumArt.MATCH;
- case BUST: return EnumArt.BUST;
- case STAGE: return EnumArt.STAGE;
- case VOID: return EnumArt.VOID;
- case SKULL_AND_ROSES: return EnumArt.SKULL_AND_ROSES;
- case FIGHTERS: return EnumArt.FIGHTERS;
- case POINTER: return EnumArt.POINTER;
- case PIGSCENE: return EnumArt.PIGSCENE;
- case BURNINGSKULL: return EnumArt.BURNING_SKULL;
- case SKELETON: return EnumArt.SKELETON;
- case DONKEYKONG: return EnumArt.DONKEY_KONG;
- case WITHER: return EnumArt.WITHER;
- default:
- throw new AssertionError(art);
- }
+ public static Art NotchToBukkit(Paintings art) {
+ Art bukkit = artwork.get(art);
+ Preconditions.checkArgument(bukkit != null);
+ return bukkit;
+ }
+
+ public static Paintings BukkitToNotch(Art art) {
+ Paintings nms = artwork.inverse().get(art);
+ Preconditions.checkArgument(nms != null);
+ return nms;
}
}
diff --git a/src/main/java/org/bukkit/craftbukkit/CraftChunk.java b/src/main/java/org/bukkit/craftbukkit/CraftChunk.java
index 0cc838cc..b0297c64 100644
--- a/src/main/java/org/bukkit/craftbukkit/CraftChunk.java
+++ b/src/main/java/org/bukkit/craftbukkit/CraftChunk.java
@@ -20,7 +20,7 @@ public class CraftChunk implements Chunk {
private final int x;
private final int z;
private static final byte[] emptyData = new byte[2048];
- private static final short[] emptyBlockIDs = new short[4096];
+ private static final DataPaletteBlock<IBlockData> emptyBlockIDs = new ChunkSection(0, false).getBlocks();
private static final byte[] emptySkyLight = new byte[2048];
public CraftChunk(net.minecraft.server.Chunk chunk) {
@@ -69,7 +69,7 @@ public class CraftChunk implements Chunk {
}
public Block getBlock(int x, int y, int z) {
- return new CraftBlock(this, (getX() << 4) | (x & 0xF), y, (getZ() << 4) | (z & 0xF));
+ return new CraftBlock(worldServer, new BlockPosition((this.x << 4) | x, y, (this.z << 4) | z));
}
public Entity[] getEntities() {
@@ -133,7 +133,7 @@ public class CraftChunk implements Chunk {
@Override
public boolean isSlimeChunk() {
// 987234911L is deterimined in EntitySlime when seeing if a slime can spawn in a chunk
- return getHandle().a(987234911L).nextInt(10) == 0;
+ return SeededRandom.a(getX(), getZ(), getWorld().getSeed(), 987234911L).nextInt(10) == 0;
}
public boolean unload(boolean save) {
@@ -152,8 +152,7 @@ public class CraftChunk implements Chunk {
net.minecraft.server.Chunk chunk = getHandle();
ChunkSection[] cs = chunk.getSections();
- short[][] sectionBlockIDs = new short[cs.length][];
- byte[][] sectionBlockData = new byte[cs.length][];
+ DataPaletteBlock[] sectionBlockIDs = new DataPaletteBlock[cs.length];
byte[][] sectionSkyLights = new byte[cs.length][];
byte[][] sectionEmitLights = new byte[cs.length][];
boolean[] sectionEmpty = new boolean[cs.length];
@@ -161,28 +160,20 @@ public class CraftChunk implements Chunk {
for (int i = 0; i < cs.length; i++) {
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
- short[] blockids = new short[4096];
+ NBTTagCompound data = new NBTTagCompound();
+ cs[i].getBlocks().b(data, "Spigot", "Magic");
- byte[] rawIds = new byte[4096];
- NibbleArray data = new NibbleArray();
- cs[i].getBlocks().exportData(rawIds, data);
-
- byte[] dataValues = sectionBlockData[i] = data.asBytes();
-
- // Copy base IDs
- for (int j = 0; j < 4096; j++) {
- blockids[j] = (short) (rawIds[j] & 0xFF);
- }
+ DataPaletteBlock blockids = new DataPaletteBlock<>(ChunkSection.GLOBAL_PALETTE, net.minecraft.server.Block.REGISTRY_ID, GameProfileSerializer::d, GameProfileSerializer::a, Blocks.AIR.getBlockData()); // TODO: snapshot whole ChunkSection
+ blockids.a(data, "Spigot", "Magic");
sectionBlockIDs[i] = blockids;
if (cs[i].getSkyLightArray() == null) {
- sectionSkyLights[i] = emptyData;
+ sectionSkyLights[i] = emptySkyLight;
} else {
sectionSkyLights[i] = new byte[2048];
System.arraycopy(cs[i].getSkyLightArray().asBytes(), 0, sectionSkyLights[i], 0, 2048);
@@ -192,57 +183,46 @@ public class CraftChunk implements Chunk {
}
}
- int[] hmap = null;
+ HeightMap hmap = null;
if (includeMaxBlockY) {
- hmap = new int[256]; // Get copy of height map
- System.arraycopy(chunk.heightMap, 0, hmap, 0, 256);
+ hmap = new HeightMap(null, HeightMap.Type.LIGHT_BLOCKING);
+ hmap.a(chunk.heightMap.get(HeightMap.Type.LIGHT_BLOCKING).b());
}
BiomeBase[] biome = null;
double[] biomeTemp = null;
- double[] biomeRain = null;
if (includeBiome || includeBiomeTempRain) {
- WorldChunkManager wcm = chunk.world.getWorldChunkManager();
+ WorldChunkManager wcm = worldServer.getChunkProvider().getChunkGenerator().getWorldChunkManager();
if (includeBiome) {
biome = new BiomeBase[256];
for (int i = 0; i < 256; i++) {
- biome[i] = chunk.getBiome(new BlockPosition(i & 0xF, 0, i >> 4), wcm);
+ biome[i] = chunk.getBiome(new BlockPosition(i & 0xF, 0, i >> 4));
}
}
if (includeBiomeTempRain) {
biomeTemp = new double[256];
- biomeRain = new double[256];
float[] dat = getTemperatures(wcm, getX() << 4, getZ() << 4);
for (int i = 0; i < 256; i++) {
biomeTemp[i] = dat[i];
}
-
- /* Removed 15w46a
- dat = wcm.getWetness(null, getX() << 4, getZ() << 4, 16, 16);
-
- for (int i = 0; i < 256; i++) {
- biomeRain[i] = dat[i];
- }
- */
}
}
World world = getWorld();
- return new CraftChunkSnapshot(getX(), getZ(), world.getName(), world.getFullTime(), sectionBlockIDs, sectionBlockData, sectionSkyLights, sectionEmitLights, sectionEmpty, hmap, biome, biomeTemp, biomeRain);
+ return new CraftChunkSnapshot(getX(), getZ(), world.getName(), world.getFullTime(), sectionBlockIDs, sectionSkyLights, sectionEmitLights, sectionEmpty, hmap, biome, biomeTemp);
}
public static ChunkSnapshot getEmptyChunkSnapshot(int x, int z, CraftWorld world, boolean includeBiome, boolean includeBiomeTempRain) {
BiomeBase[] biome = null;
double[] biomeTemp = null;
- double[] biomeRain = null;
if (includeBiome || includeBiomeTempRain) {
- WorldChunkManager wcm = world.getHandle().getWorldChunkManager();
+ WorldChunkManager wcm = world.getHandle().getChunkProvider().getChunkGenerator().getWorldChunkManager();
if (includeBiome) {
biome = new BiomeBase[256];
@@ -253,44 +233,33 @@ public class CraftChunk implements Chunk {
if (includeBiomeTempRain) {
biomeTemp = new double[256];
- biomeRain = new double[256];
float[] dat = getTemperatures(wcm, x << 4, z << 4);
for (int i = 0; i < 256; i++) {
biomeTemp[i] = dat[i];
}
-
- /* Removed 15w46a
- dat = wcm.getWetness(null, x << 4, z << 4, 16, 16);
-
- for (int i = 0; i < 256; i++) {
- biomeRain[i] = dat[i];
- }
- */
}
}
/* Fill with empty data */
int hSection = world.getMaxHeight() >> 4;
- short[][] blockIDs = new short[hSection][];
+ DataPaletteBlock[] blockIDs = new DataPaletteBlock[hSection];
byte[][] skyLight = new byte[hSection][];
byte[][] emitLight = new byte[hSection][];
- byte[][] blockData = new byte[hSection][];
boolean[] empty = new boolean[hSection];
for (int i = 0; i < hSection; i++) {
blockIDs[i] = emptyBlockIDs;
skyLight[i] = emptySkyLight;
emitLight[i] = emptyData;
- blockData[i] = emptyData;
empty[i] = true;
}
- return new CraftChunkSnapshot(x, z, world.getName(), world.getFullTime(), blockIDs, blockData, skyLight, emitLight, empty, new int[256], biome, biomeTemp, biomeRain);
+ return new CraftChunkSnapshot(x, z, world.getName(), world.getFullTime(), blockIDs, skyLight, emitLight, empty, new HeightMap(null, HeightMap.Type.LIGHT_BLOCKING), biome, biomeTemp);
}
private static float[] getTemperatures(WorldChunkManager chunkmanager, int chunkX, int chunkZ) {
- BiomeBase[] biomes = chunkmanager.getBiomes(null, chunkX, chunkZ, 16, 16);
+ BiomeBase[] biomes = chunkmanager.getBiomes(chunkX, chunkZ, 16, 16);
float[] temps = new float[biomes.length];
for (int i = 0; i < biomes.length; i++) {
diff --git a/src/main/java/org/bukkit/craftbukkit/CraftChunkSnapshot.java b/src/main/java/org/bukkit/craftbukkit/CraftChunkSnapshot.java
index c0fb34b9..8032f358 100644
--- a/src/main/java/org/bukkit/craftbukkit/CraftChunkSnapshot.java
+++ b/src/main/java/org/bukkit/craftbukkit/CraftChunkSnapshot.java
@@ -3,9 +3,15 @@ package org.bukkit.craftbukkit;
import org.bukkit.ChunkSnapshot;
import org.bukkit.Material;
import org.bukkit.block.Biome;
+import org.bukkit.block.data.BlockData;
import org.bukkit.craftbukkit.block.CraftBlock;
+import org.bukkit.craftbukkit.block.data.CraftBlockData;
+import org.bukkit.craftbukkit.util.CraftMagicNumbers;
import net.minecraft.server.BiomeBase;
+import net.minecraft.server.DataPaletteBlock;
+import net.minecraft.server.HeightMap;
+import net.minecraft.server.IBlockData;
/**
* Represents a static, thread-safe snapshot of chunk of blocks
@@ -14,31 +20,27 @@ import net.minecraft.server.BiomeBase;
public class CraftChunkSnapshot implements ChunkSnapshot {
private final int x, z;
private final String worldname;
- private final short[][] blockids; /* Block IDs, by section */
- private final byte[][] blockdata;
+ private final DataPaletteBlock<IBlockData>[] blockids;
private final byte[][] skylight;
private final byte[][] emitlight;
private final boolean[] empty;
- private final int[] hmap; // Height map
+ private final HeightMap hmap; // Height map
private final long captureFulltime;
private final BiomeBase[] biome;
private final double[] biomeTemp;
- private final double[] biomeRain;
- CraftChunkSnapshot(int x, int z, String wname, long wtime, short[][] sectionBlockIDs, byte[][] sectionBlockData, byte[][] sectionSkyLights, byte[][] sectionEmitLights, boolean[] sectionEmpty, int[] hmap, BiomeBase[] biome, double[] biomeTemp, double[] biomeRain) {
+ CraftChunkSnapshot(int x, int z, String wname, long wtime, DataPaletteBlock<IBlockData>[] sectionBlockIDs, byte[][] sectionSkyLights, byte[][] sectionEmitLights, boolean[] sectionEmpty, HeightMap hmap, BiomeBase[] biome, double[] biomeTemp) {
this.x = x;
this.z = z;
this.worldname = wname;
this.captureFulltime = wtime;
this.blockids = sectionBlockIDs;
- this.blockdata = sectionBlockData;
this.skylight = sectionSkyLights;
this.emitlight = sectionEmitLights;
this.empty = sectionEmpty;
this.hmap = hmap;
this.biome = biome;
this.biomeTemp = biomeTemp;
- this.biomeRain = biomeRain;
}
public int getX() {
@@ -55,16 +57,17 @@ public class CraftChunkSnapshot implements ChunkSnapshot {
@Override
public Material getBlockType(int x, int y, int z) {
- return Material.getMaterial(getBlockTypeId(x, y, z));
+ return CraftMagicNumbers.getMaterial(blockids[y >> 4].a(x, y & 0xF, z).getBlock());
}
- public final int getBlockTypeId(int x, int y, int z) {
- return blockids[y >> 4][((y & 0xF) << 8) | (z << 4) | x];
+ @Override
+ public final BlockData getBlockData(int x, int y, int z) {
+ return CraftBlockData.fromData(blockids[y >> 4].a(x, y & 0xF, z));
}
- public final int getBlockData(int x, int y, int z) {
- int off = ((y & 0xF) << 7) | (z << 3) | (x >> 1);
- return (blockdata[y >> 4][off] >> ((x & 1) << 2)) & 0xF;
+ @Override
+ public final int getData(int x, int y, int z) {
+ return CraftMagicNumbers.toLegacyData(blockids[y >> 4].a(x, y & 0xF, z));
}
public final int getBlockSkyLight(int x, int y, int z) {
@@ -78,7 +81,7 @@ public class CraftChunkSnapshot implements ChunkSnapshot {
}
public final int getHighestBlockYAt(int x, int z) {
- return hmap[z << 4 | x];
+ return hmap.a(x, z);
}
public final Biome getBiome(int x, int z) {
@@ -89,10 +92,6 @@ public class CraftChunkSnapshot implements ChunkSnapshot {
return biomeTemp[z << 4 | x];
}
- public final double getRawBiomeRainfall(int x, int z) {
- return biomeRain[z << 4 | x];
- }
-
public final long getCaptureFullTime() {
return captureFulltime;
}
diff --git a/src/main/java/org/bukkit/craftbukkit/CraftCrashReport.java b/src/main/java/org/bukkit/craftbukkit/CraftCrashReport.java
index 67f28566..921a57f5 100644
--- a/src/main/java/org/bukkit/craftbukkit/CraftCrashReport.java
+++ b/src/main/java/org/bukkit/craftbukkit/CraftCrashReport.java
@@ -12,6 +12,7 @@ import org.bukkit.plugin.Plugin;
import org.bukkit.plugin.PluginDescriptionFile;
import net.minecraft.server.MinecraftServer;
+import org.bukkit.craftbukkit.util.CraftMagicNumbers;
public class CraftCrashReport implements CrashReportCallable<Object> {
@@ -22,7 +23,8 @@ public class CraftCrashReport implements CrashReportCallable<Object> {
value.append("\n Plugins: {");
for (Plugin plugin : Bukkit.getPluginManager().getPlugins()) {
PluginDescriptionFile description = plugin.getDescription();
- value.append(' ').append(description.getFullName()).append(' ').append(description.getMain()).append(' ').append(Arrays.toString(description.getAuthors().toArray())).append(',');
+ boolean legacy = CraftMagicNumbers.isLegacy(description);
+ value.append(' ').append(description.getFullName()).append(legacy ? "*" : "").append(' ').append(description.getMain()).append(' ').append(Arrays.toString(description.getAuthors().toArray())).append(',');
}
value.append("}\n Warnings: ").append(Bukkit.getWarningState().name());
value.append("\n Reload Count: ").append(String.valueOf(MinecraftServer.getServer().server.reloadCount));
diff --git a/src/main/java/org/bukkit/craftbukkit/CraftEffect.java b/src/main/java/org/bukkit/craftbukkit/CraftEffect.java
index 16721835..c6edd7a5 100644
--- a/src/main/java/org/bukkit/craftbukkit/CraftEffect.java
+++ b/src/main/java/org/bukkit/craftbukkit/CraftEffect.java
@@ -1,9 +1,12 @@
package org.bukkit.craftbukkit;
+import net.minecraft.server.Block;
+import net.minecraft.server.Item;
import org.apache.commons.lang.Validate;
import org.bukkit.Effect;
import org.bukkit.Material;
import org.bukkit.block.BlockFace;
+import org.bukkit.craftbukkit.util.CraftMagicNumbers;
import org.bukkit.potion.Potion;
public class CraftEffect {
@@ -18,7 +21,7 @@ public class CraftEffect {
break;
case RECORD_PLAY:
Validate.isTrue(((Material) data).isRecord(), "Invalid record type!");
- datavalue = ((Material) data).getId();
+ datavalue = Item.getId(CraftMagicNumbers.getItem((Material) data));
break;
case SMOKE:
switch((BlockFace) data) { // TODO: Verify (Where did these values come from...?)
@@ -56,7 +59,7 @@ public class CraftEffect {
break;
case STEP_SOUND:
Validate.isTrue(((Material) data).isBlock(), "Material is not a block!");
- datavalue = ((Material) data).getId();
+ datavalue = Block.getCombinedId(CraftMagicNumbers.getBlock((Material) data).getBlockData());
break;
default:
datavalue = 0;
diff --git a/src/main/java/org/bukkit/craftbukkit/CraftOfflinePlayer.java b/src/main/java/org/bukkit/craftbukkit/CraftOfflinePlayer.java
index 45217866..7b49f673 100644
--- a/src/main/java/org/bukkit/craftbukkit/CraftOfflinePlayer.java
+++ b/src/main/java/org/bukkit/craftbukkit/CraftOfflinePlayer.java
@@ -9,6 +9,7 @@ import java.util.UUID;
import net.minecraft.server.EntityPlayer;
import net.minecraft.server.NBTTagCompound;
+import net.minecraft.server.WhiteListEntry;
import net.minecraft.server.WorldNBTStorage;
import org.bukkit.BanList;
@@ -115,9 +116,9 @@ public class CraftOfflinePlayer implements OfflinePlayer, ConfigurationSerializa
public void setWhitelisted(boolean value) {
if (value) {
- server.getHandle().addWhitelist(profile);
+ server.getHandle().getWhitelist().add(new WhiteListEntry(profile));
} else {
- server.getHandle().removeWhitelist(profile);
+ server.getHandle().getWhitelist().remove(profile);
}
}
diff --git a/src/main/java/org/bukkit/craftbukkit/CraftParticle.java b/src/main/java/org/bukkit/craftbukkit/CraftParticle.java
index 4128e838..291f46fe 100644
--- a/src/main/java/org/bukkit/craftbukkit/CraftParticle.java
+++ b/src/main/java/org/bukkit/craftbukkit/CraftParticle.java
@@ -1,41 +1,151 @@
package org.bukkit.craftbukkit;
-import net.minecraft.server.Block;
-import net.minecraft.server.EnumParticle;
-import net.minecraft.server.IBlockData;
+import com.google.common.base.Preconditions;
+import com.google.common.collect.BiMap;
+import com.google.common.collect.HashBiMap;
+import java.util.HashMap;
+import java.util.Map;
+import net.minecraft.server.MinecraftKey;
+import net.minecraft.server.ParticleParam;
+import net.minecraft.server.ParticleParamBlock;
+import net.minecraft.server.ParticleParamItem;
+import net.minecraft.server.ParticleParamRedstone;
+import net.minecraft.server.ParticleType;
+import org.bukkit.Color;
import org.bukkit.Particle;
+import org.bukkit.block.data.BlockData;
+import org.bukkit.craftbukkit.block.data.CraftBlockData;
+import org.bukkit.craftbukkit.inventory.CraftItemStack;
import org.bukkit.craftbukkit.util.CraftMagicNumbers;
import org.bukkit.inventory.ItemStack;
import org.bukkit.material.MaterialData;
-public class CraftParticle {
+public enum CraftParticle {
- public static EnumParticle toNMS(Particle bukkit) {
- return EnumParticle.valueOf(bukkit.name());
+ EXPLOSION_NORMAL("poof"),
+ EXPLOSION_LARGE("explosion"),
+ EXPLOSION_HUGE("explosion_emitter"),
+ FIREWORKS_SPARK("firework"),
+ WATER_BUBBLE("bubble"),
+ WATER_SPLASH("splash"),
+ WATER_WAKE("fishing"),
+ SUSPENDED("underwater"),
+ SUSPENDED_DEPTH("underwater"),
+ CRIT("crit"),
+ CRIT_MAGIC("enchanted_hit"),
+ SMOKE_NORMAL("smoke"),
+ SMOKE_LARGE("large_smoke"),
+ SPELL("effect"),
+ SPELL_INSTANT("instant_effect"),
+ SPELL_MOB("entity_effect"),
+ SPELL_MOB_AMBIENT("ambient_entity_effect"),
+ SPELL_WITCH("witch"),
+ DRIP_WATER("dripping_water"),
+ DRIP_LAVA("dripping_lava"),
+ VILLAGER_ANGRY("angry_villager"),
+ VILLAGER_HAPPY("happy_villager"),
+ TOWN_AURA("mycelium"),
+ NOTE("note"),
+ PORTAL("portal"),
+ ENCHANTMENT_TABLE("enchant"),
+ FLAME("flame"),
+ LAVA("lava"),
+ CLOUD("cloud"),
+ REDSTONE("dust"),
+ SNOWBALL("item_snowball"),
+ SNOW_SHOVEL("item_snowball"),
+ SLIME("item_slime"),
+ HEART("heart"),
+ BARRIER("barrier"),
+ ITEM_CRACK("item"),
+ BLOCK_CRACK("block"),
+ BLOCK_DUST("block"),
+ WATER_DROP("rain"),
+ MOB_APPEARANCE("elder_guardian"),
+ DRAGON_BREATH("dragon_breath"),
+ END_ROD("end_rod"),
+ DAMAGE_INDICATOR("damage_indicator"),
+ SWEEP_ATTACK("sweep_attack"),
+ FALLING_DUST("falling_dust"),
+ TOTEM("totem_of_undying"),
+ SPIT("spit"),
+ SQUID_INK("squid_ink"),
+ BUBBLE_POP("bubble_pop"),
+ CURRENT_DOWN("current_down"),
+ BUBBLE_COLUMN_UP("bubble_column_up"),
+ NAUTILUS("nautilus"),
+ DOLPHIN("dolphin"),
+ // ----- Legacy Separator -----
+ LEGACY_BLOCK_CRACK("block"),
+ LEGACY_BLOCK_DUST("block"),
+ LEGACY_FALLING_DUST("falling_dust");
+ private final MinecraftKey minecraftKey;
+ private final Particle bukkit;
+ private static final BiMap<Particle, MinecraftKey> particles;
+ private static final Map<Particle, Particle> aliases;
+
+ static {
+ particles = HashBiMap.create();
+ aliases = new HashMap<>();
+
+ for (CraftParticle particle : CraftParticle.values()) {
+ if (particles.containsValue(particle.minecraftKey)) {
+ aliases.put(particle.bukkit, particles.inverse().get(particle.minecraftKey));
+ } else {
+ particles.put(particle.bukkit, particle.minecraftKey);
+ }
+ }
}
- public static Particle toBukkit(EnumParticle nms) {
- return Particle.valueOf(nms.name());
+ private CraftParticle(String minecraftKey) {
+ this.minecraftKey = new MinecraftKey(minecraftKey);
+
+ this.bukkit = Particle.valueOf(this.name());
+ Preconditions.checkState(bukkit != null, "Bukkit particle %s does not exist", this.name());
}
- public static int[] toData(Particle particle, Object obj) {
+ public static ParticleParam toNMS(Particle bukkit) {
+ return toNMS(bukkit, null);
+ }
+
+ public static <T> ParticleParam toNMS(Particle particle, T obj) {
+ Particle canonical = particle;
+ if (aliases.containsKey(particle)) {
+ canonical = aliases.get(particle);
+ }
+
+ net.minecraft.server.Particle nms = net.minecraft.server.Particle.REGISTRY.get(particles.get(canonical));
+ Preconditions.checkArgument(nms != null, "No NMS particle %s", particle);
+
if (particle.getDataType().equals(Void.class)) {
- return new int[0];
+ return (ParticleType) nms;
}
+ Preconditions.checkArgument(obj != null, "Particle %s requires data, null provided", particle);
if (particle.getDataType().equals(ItemStack.class)) {
- if (obj == null) {
- return new int[]{0, 0};
- }
ItemStack itemStack = (ItemStack) obj;
- return new int[]{itemStack.getType().getId(), itemStack.getDurability()};
+ return new ParticleParamItem((net.minecraft.server.Particle<ParticleParamItem>) nms, CraftItemStack.asNMSCopy(itemStack));
}
- if (particle.getDataType().equals(MaterialData.class)) {
- if (obj == null) {
- return new int[]{0};
- }
+ if (particle.getDataType() == MaterialData.class) {
MaterialData data = (MaterialData) obj;
- return new int[]{data.getItemTypeId() + ((int)(data.getData()) << 12)};
+ return new ParticleParamBlock((net.minecraft.server.Particle<ParticleParamBlock>) nms, CraftMagicNumbers.getBlock(data));
+ }
+ if (particle.getDataType() == BlockData.class) {
+ BlockData data = (BlockData) obj;
+ return new ParticleParamBlock((net.minecraft.server.Particle<ParticleParamBlock>) nms, ((CraftBlockData) data).getState());
+ }
+ if (particle.getDataType() == Particle.DustOptions.class) {
+ Particle.DustOptions data = (Particle.DustOptions) obj;
+ Color color = data.getColor();
+ return new ParticleParamRedstone(color.getRed(), color.getGreen(), color.getBlue(), data.getSize());
}
throw new IllegalArgumentException(particle.getDataType().toString());
}
+
+ public static Particle toBukkit(net.minecraft.server.ParticleParam nms) {
+ return toBukkit(nms.b());
+ }
+
+ public static Particle toBukkit(net.minecraft.server.Particle nms) {
+ return particles.inverse().get(nms.d());
+ }
}
diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
index 0eaf9dab..db82051c 100644
--- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java
+++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
@@ -8,6 +8,7 @@ import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
+import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.Iterator;
@@ -17,6 +18,7 @@ import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.UUID;
+import java.util.function.Consumer;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.regex.Pattern;
@@ -52,7 +54,6 @@ import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.configuration.serialization.ConfigurationSerialization;
import org.bukkit.conversations.Conversable;
import org.bukkit.craftbukkit.boss.CraftBossBar;
-import org.bukkit.craftbukkit.command.VanillaCommandWrapper;
import org.bukkit.craftbukkit.entity.CraftPlayer;
import org.bukkit.craftbukkit.generator.CraftChunkData;
import org.bukkit.craftbukkit.help.SimpleHelpMap;
@@ -122,14 +123,28 @@ import com.google.common.collect.ImmutableList;
import com.google.common.collect.Iterators;
import com.google.common.collect.Lists;
import com.google.common.collect.MapMaker;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonParser;
import com.mojang.authlib.GameProfile;
+import com.mojang.brigadier.builder.LiteralArgumentBuilder;
+import com.mojang.brigadier.tree.CommandNode;
+import com.mojang.brigadier.tree.LiteralCommandNode;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.ByteBufOutputStream;
import io.netty.buffer.Unpooled;
import io.netty.handler.codec.base64.Base64;
+import java.util.HashMap;
import jline.console.ConsoleReader;
+import org.bukkit.Keyed;
import org.bukkit.NamespacedKey;
+import org.bukkit.block.data.BlockData;
+import org.bukkit.craftbukkit.block.data.CraftBlockData;
+import org.bukkit.craftbukkit.command.BukkitCommandWrapper;
+import org.bukkit.craftbukkit.command.CraftCommandMap;
+import org.bukkit.craftbukkit.command.VanillaCommandWrapper;
+import org.bukkit.craftbukkit.tag.CraftBlockTag;
+import org.bukkit.craftbukkit.tag.CraftItemTag;
import org.bukkit.craftbukkit.util.CraftNamespacedKey;
import org.bukkit.event.server.TabCompleteEvent;
@@ -140,7 +155,7 @@ public final class CraftServer implements Server {
private final Logger logger = Logger.getLogger("Minecraft");
private final ServicesManager servicesManager = new SimpleServicesManager();
private final CraftScheduler scheduler = new CraftScheduler();
- private final SimpleCommandMap commandMap = new SimpleCommandMap(this);
+ private final CraftCommandMap commandMap = new CraftCommandMap(this);
private final SimpleHelpMap helpMap = new SimpleHelpMap(this);
private final StandardMessenger messenger = new StandardMessenger();
private final SimplePluginManager pluginManager = new SimplePluginManager(this, commandMap);
@@ -168,7 +183,6 @@ public final class CraftServer implements Server {
private boolean printSaveWarning;
private CraftIconCache icon;
private boolean overrideAllCommandBlockCommands = false;
- private boolean unrestrictedAdvancements;
private final List<CraftPlayer> playerView;
public int reloadCount;
@@ -245,7 +259,6 @@ public final class CraftServer implements Server {
saveCommandsConfig();
overrideAllCommandBlockCommands = commandsConfiguration.getStringList("command-block-overrides").contains("*");
- unrestrictedAdvancements = commandsConfiguration.getBoolean("unrestricted-advancements");
pluginManager.useTimings(configuration.getBoolean("settings.plugin-profiling"));
monsterSpawn = configuration.getInt("spawn-limits.monsters");
animalSpawn = configuration.getInt("spawn-limits.animals");
@@ -258,14 +271,6 @@ public final class CraftServer implements Server {
loadIcon();
}
- public boolean getPermissionOverride(ICommandListener listener) {
- while (listener instanceof CommandListenerWrapper) {
- listener = ((CommandListenerWrapper) listener).base;
- }
-
- return unrestrictedAdvancements && listener instanceof AdvancementRewards.AdvancementCommandListener;
- }
-
public boolean getCommandBlockOverride(String command) {
return overrideAllCommandBlockCommands || commandsConfiguration.getStringList("command-block-overrides").contains(command);
}
@@ -337,6 +342,7 @@ public final class CraftServer implements Server {
DefaultPermissions.registerCorePermissions();
CraftDefaultPermissions.registerCorePermissions();
helpMap.initializeCommands();
+ syncCommands();
}
}
@@ -345,9 +351,43 @@ public final class CraftServer implements Server {
}
private void setVanillaCommands() {
- Map<String, ICommand> commands = new CommandDispatcher(console).getCommands();
- for (ICommand cmd : commands.values()) {
- commandMap.register("minecraft", new VanillaCommandWrapper((CommandAbstract) cmd, LocaleI18n.get(cmd.getUsage(null))));
+ CommandDispatcher dispatcher = console.getCommandDispatcher();
+
+ // Build a list of all Vanilla commands and create wrappers
+ for (CommandNode<CommandListenerWrapper> cmd : dispatcher.a().getRoot().getChildren()) {
+ commandMap.register("minecraft", new VanillaCommandWrapper(dispatcher, cmd));
+ }
+ }
+
+ private void syncCommands() {
+ // Clear existing commands
+ CommandDispatcher dispatcher = console.commandDispatcher = new CommandDispatcher();
+
+ // Register all commands, vanilla ones will be using the old dispatcher references
+ for (Map.Entry<String, Command> entry : commandMap.getKnownCommands().entrySet()) {
+ String label = entry.getKey();
+ Command command = entry.getValue();
+
+ if (command instanceof VanillaCommandWrapper) {
+ LiteralCommandNode<CommandListenerWrapper> node = (LiteralCommandNode<CommandListenerWrapper>) ((VanillaCommandWrapper) command).vanillaCommand;
+ if (!node.getLiteral().equals(label)) {
+ LiteralCommandNode<CommandListenerWrapper> clone = new LiteralCommandNode(label, node.getCommand(), node.getRequirement(), node.getRedirect(), node.getRedirectModifier(), node.isFork());
+
+ for (CommandNode<CommandListenerWrapper> child : node.getChildren()) {
+ clone.addChild(child);
+ }
+ node = clone;
+ }
+
+ dispatcher.a().getRoot().addChild(node);
+ } else {
+ new BukkitCommandWrapper(this, entry.getValue()).register(dispatcher.a(), label);
+ }
+ }
+
+ // Refresh commands
+ for (EntityPlayer player : getHandle().players) {
+ dispatcher.a(player);
}
}
@@ -837,23 +877,23 @@ public final class CraftServer implements Server {
generator = getGenerator(name);
}
- Convertable converter = new WorldLoaderServer(getWorldContainer(), getHandle().getServer().dataConverterManager);
+ Convertable converter = new WorldLoaderServer(getWorldContainer().toPath(), getWorldContainer().toPath().resolveSibling("../backups"), getHandle().getServer().dataConverterManager);
if (converter.isConvertable(name)) {
getLogger().info("Converting world '" + name + "'");
converter.convert(name, new IProgressUpdate() {
private long b = System.currentTimeMillis();
- public void a(String s) {}
+ public void a(IChatBaseComponent ichatbasecomponent) {}
public void a(int i) {
if (System.currentTimeMillis() - this.b >= 1000L) {
this.b = System.currentTimeMillis();
- MinecraftServer.LOGGER.info("Converting... " + i + "%");
+ MinecraftServer.LOGGER.info("Converting... {}%", Integer.valueOf(i));
}
}
- public void c(String s) {}
+ public void c(IChatBaseComponent ichatbasecomponent) {}
});
}
@@ -870,12 +910,15 @@ public final class CraftServer implements Server {
} while(used);
boolean hardcore = false;
- IDataManager sdm = new ServerNBTManager(getWorldContainer(), name, true, getHandle().getServer().dataConverterManager);
+ IDataManager sdm = new ServerNBTManager(getWorldContainer(), name, getServer(), getHandle().getServer().dataConverterManager);
WorldData worlddata = sdm.getWorldData();
WorldSettings worldSettings = null;
if (worlddata == null) {
worldSettings = new WorldSettings(creator.seed(), EnumGamemode.getById(getDefaultGameMode().getValue()), generateStructures, hardcore, type);
- worldSettings.setGeneratorSettings(creator.generatorSettings());
+ JsonElement parsedSettings = new JsonParser().parse(creator.generatorSettings());
+ if (parsedSettings.isJsonObject()) {
+ worldSettings.setGeneratorSettings(parsedSettings.getAsJsonObject());
+ }
worlddata = new WorldData(worldSettings, name);
}
worlddata.checkName(name); // CraftBukkit - Migration did not rewrite the level.dat; This forces 1.8 to take the last loaded world as respawn (in this case the end)
@@ -888,7 +931,6 @@ public final class CraftServer implements Server {
if (worldSettings != null) {
internal.a(worldSettings);
}
- internal.scoreboard = getScoreboardManager().getMainScoreboard().getHandle();
internal.tracker = new EntityTracker(internal);
internal.addIWorldAccess(new WorldManager(console, internal));
@@ -962,7 +1004,7 @@ public final class CraftServer implements Server {
if (save) {
try {
handle.save(true, null);
- handle.saveLevel();
+ handle.close();
} catch (ExceptionWorldConflict ex) {
getLogger().log(Level.SEVERE, null, ex);
}
@@ -1075,19 +1117,12 @@ public final class CraftServer implements Server {
@Override
public void clearRecipes() {
- CraftingManager.recipes = new RegistryMaterials();
- RecipesFurnace.getInstance().recipes.clear();
- RecipesFurnace.getInstance().customRecipes.clear();
- RecipesFurnace.getInstance().customExperience.clear();
+ console.getCraftingManager().recipes.clear();
}
@Override
public void resetRecipes() {
- CraftingManager.recipes = new RegistryMaterials();
- CraftingManager.init();
- RecipesFurnace.getInstance().recipes = new RecipesFurnace().recipes;
- RecipesFurnace.getInstance().customRecipes.clear();
- RecipesFurnace.getInstance().customExperience.clear();
+ console.getCraftingManager().a(console.getResourceManager());
}
@Override
@@ -1192,7 +1227,7 @@ public final class CraftServer implements Server {
@Deprecated
public CraftMapView getMap(short id) {
PersistentCollection collection = console.worlds.get(0).worldMaps;
- WorldMap worldmap = (WorldMap) collection.get(WorldMap.class, "map_" + id);
+ WorldMap worldmap = (WorldMap) collection.get(WorldMap::new, "map_" + id);
if (worldmap == null) {
return null;
}
@@ -1203,8 +1238,8 @@ public final class CraftServer implements Server {
public CraftMapView createMap(World world) {
Validate.notNull(world, "World cannot be null");
- net.minecraft.server.ItemStack stack = new net.minecraft.server.ItemStack(Items.MAP, 1, -1);
- WorldMap worldmap = Items.FILLED_MAP.getSavedMap(stack, ((CraftWorld) world).getHandle());
+ net.minecraft.server.ItemStack stack = new net.minecraft.server.ItemStack(Items.MAP, 1);
+ WorldMap worldmap = ItemWorldMap.getSavedMap(stack, ((CraftWorld) world).getHandle());
return worldmap.mapView;
}
@@ -1522,15 +1557,15 @@ public final class CraftServer implements Server {
return warningState;
}
- public List<String> tabComplete(net.minecraft.server.ICommandListener sender, String message, BlockPosition pos, boolean forceCommand) {
- if (!(sender instanceof EntityPlayer)) {
+ public List<String> tabComplete(CommandSender sender, String message, WorldServer world, Vec3D pos, boolean forceCommand) {
+ if (!(sender instanceof Player)) {
return ImmutableList.of();
}
List<String> offers;
- Player player = ((EntityPlayer) sender).getBukkitEntity();
+ Player player = (Player) sender;
if (message.startsWith("/") || forceCommand) {
- offers = tabCompleteCommand(player, message, pos);
+ offers = tabCompleteCommand(player, message, world, pos);
} else {
offers = tabCompleteChat(player, message);
}
@@ -1541,7 +1576,7 @@ public final class CraftServer implements Server {
return tabEvent.isCancelled() ? Collections.EMPTY_LIST : tabEvent.getCompletions();
}
- public List<String> tabCompleteCommand(Player player, String message, BlockPosition pos) {
+ public List<String> tabCompleteCommand(Player player, String message, WorldServer world, Vec3D pos) {
List<String> completions = null;
try {
if (message.startsWith("/")) {
@@ -1551,7 +1586,7 @@ public final class CraftServer implements Server {
if (pos == null) {
completions = getCommandMap().tabComplete(player, message);
} else {
- completions = getCommandMap().tabComplete(player, message, new Location(player.getWorld(), pos.getX(), pos.getY(), pos.getZ()));
+ completions = getCommandMap().tabComplete(player, message, new Location(world.getWorld(), pos.x, pos.y, pos.z));
}
} catch (CommandException ex) {
player.sendMessage(ChatColor.RED + "An internal error occurred while attempting to tab-complete this command");
@@ -1660,8 +1695,15 @@ public final class CraftServer implements Server {
@Override
public Entity getEntity(UUID uuid) {
Validate.notNull(uuid, "UUID cannot be null");
- net.minecraft.server.Entity entity = console.a(uuid); // PAIL: getEntity
- return entity == null ? null : entity.getBukkitEntity();
+
+ for (WorldServer world : getServer().worlds) {
+ net.minecraft.server.Entity entity = world.getEntity(uuid);
+ if (entity != null) {
+ return entity.getBukkitEntity();
+ }
+ }
+
+ return null;
}
@Override
@@ -1674,7 +1716,7 @@ public final class CraftServer implements Server {
@Override
public Iterator<org.bukkit.advancement.Advancement> advancementIterator() {
- return Iterators.unmodifiableIterator(Iterators.transform(console.getAdvancementData().c().iterator(), new Function<Advancement, org.bukkit.advancement.Advancement>() { // PAIL: rename
+ return Iterators.unmodifiableIterator(Iterators.transform(console.getAdvancementData().b().iterator(), new Function<Advancement, org.bukkit.advancement.Advancement>() { // PAIL: rename
@Override
public org.bukkit.advancement.Advancement apply(Advancement advancement) {
return advancement.bukkit;
@@ -1682,6 +1724,55 @@ public final class CraftServer implements Server {
}));
}
+ @Override
+ public BlockData createBlockData(org.bukkit.Material material) {
+ Validate.isTrue(material != null, "Must provide material");
+
+ return createBlockData(material, (String) null);
+ }
+
+ @Override
+ public BlockData createBlockData(org.bukkit.Material material, Consumer<BlockData> consumer) {
+ BlockData data = createBlockData(material);
+
+ if (consumer != null) {
+ consumer.accept(data);
+ }
+
+ return data;
+ }
+
+ @Override
+ public BlockData createBlockData(String data) throws IllegalArgumentException {
+ Validate.isTrue(data != null, "Must provide data");
+
+ return createBlockData(null, data);
+ }
+
+ @Override
+ public BlockData createBlockData(org.bukkit.Material material, String data) {
+ Validate.isTrue(material != null || data != null, "Must provide one of material or data");
+
+ return CraftBlockData.newData(material, data);
+ }
+
+ @Override
+ @SuppressWarnings("unchecked")
+ public <T extends Keyed> org.bukkit.Tag<T> getTag(String registry, NamespacedKey tag, Class<T> clazz) {
+ switch (registry) {
+ case org.bukkit.Tag.REGISTRY_BLOCKS:
+ Preconditions.checkArgument(clazz == org.bukkit.Material.class, "Block namespace must have material type");
+
+ return (org.bukkit.Tag<T>) new CraftBlockTag(console.getTagRegistry().a().b(CraftNamespacedKey.toMinecraft(tag)));
+ case org.bukkit.Tag.REGISTRY_ITEMS:
+ Preconditions.checkArgument(clazz == org.bukkit.Material.class, "Item namespace must have material type");
+
+ return (org.bukkit.Tag<T>) new CraftItemTag(console.getTagRegistry().b().b(CraftNamespacedKey.toMinecraft(tag)));
+ default:
+ throw new IllegalArgumentException();
+ }
+ }
+
@Deprecated
@Override
public UnsafeValues getUnsafe() {
diff --git a/src/main/java/org/bukkit/craftbukkit/CraftSound.java b/src/main/java/org/bukkit/craftbukkit/CraftSound.java
index 8871c6f3..1181701e 100644
--- a/src/main/java/org/bukkit/craftbukkit/CraftSound.java
+++ b/src/main/java/org/bukkit/craftbukkit/CraftSound.java
@@ -10,6 +10,12 @@ import org.bukkit.Sound;
public enum CraftSound {
AMBIENT_CAVE("ambient.cave"),
+ AMBIENT_UNDERWATER_ENTER("ambient.underwater.enter"),
+ AMBIENT_UNDERWATER_EXIT("ambient.underwater.exit"),
+ AMBIENT_UNDERWATER_LOOP("ambient.underwater.loop"),
+ AMBIENT_UNDERWATER_LOOP_ADDITIONS("ambient.underwater.loop.additions"),
+ AMBIENT_UNDERWATER_LOOP_ADDITIONS_RARE("ambient.underwater.loop.additions.rare"),
+ AMBIENT_UNDERWATER_LOOP_ADDITIONS_ULTRA_RARE("ambient.underwater.loop.additions.ultra_rare"),
BLOCK_ANVIL_BREAK("block.anvil.break"),
BLOCK_ANVIL_DESTROY("block.anvil.destroy"),
BLOCK_ANVIL_FALL("block.anvil.fall"),
@@ -18,24 +24,38 @@ public enum CraftSound {
BLOCK_ANVIL_PLACE("block.anvil.place"),
BLOCK_ANVIL_STEP("block.anvil.step"),
BLOCK_ANVIL_USE("block.anvil.use"),
+ BLOCK_BEACON_ACTIVATE("block.beacon.activate"),
+ BLOCK_BEACON_AMBIENT("block.beacon.ambient"),
+ BLOCK_BEACON_DEACTIVATE("block.beacon.deactivate"),
+ BLOCK_BEACON_POWER_SELECT("block.beacon.power_select"),
BLOCK_BREWING_STAND_BREW("block.brewing_stand.brew"),
+ BLOCK_BUBBLE_COLUMN_BUBBLE_POP("block.bubble_column.bubble_pop"),
+ BLOCK_BUBBLE_COLUMN_UPWARDS_AMBIENT("block.bubble_column.upwards_ambient"),
+ BLOCK_BUBBLE_COLUMN_UPWARDS_INSIDE("block.bubble_column.upwards_inside"),
+ BLOCK_BUBBLE_COLUMN_WHIRLPOOL_AMBIENT("block.bubble_column.whirlpool_ambient"),
+ BLOCK_BUBBLE_COLUMN_WHIRLPOOL_INSIDE("block.bubble_column.whirlpool_inside"),
BLOCK_CHEST_CLOSE("block.chest.close"),
BLOCK_CHEST_LOCKED("block.chest.locked"),
BLOCK_CHEST_OPEN("block.chest.open"),
BLOCK_CHORUS_FLOWER_DEATH("block.chorus_flower.death"),
BLOCK_CHORUS_FLOWER_GROW("block.chorus_flower.grow"),
- BLOCK_CLOTH_BREAK("block.cloth.break"),
- BLOCK_CLOTH_FALL("block.cloth.fall"),
- BLOCK_CLOTH_HIT("block.cloth.hit"),
- BLOCK_CLOTH_PLACE("block.cloth.place"),
- BLOCK_CLOTH_STEP("block.cloth.step"),
BLOCK_COMPARATOR_CLICK("block.comparator.click"),
+ BLOCK_CONDUIT_ACTIVATE("block.conduit.activate"),
+ BLOCK_CONDUIT_AMBIENT("block.conduit.ambient"),
+ BLOCK_CONDUIT_AMBIENT_SHORT("block.conduit.ambient.short"),
+ BLOCK_CONDUIT_ATTACK_TARGET("block.conduit.attack.target"),
+ BLOCK_CONDUIT_DEACTIVATE("block.conduit.deactivate"),
+ BLOCK_CORAL_BLOCK_BREAK("block.coral_block.break"),
+ BLOCK_CORAL_BLOCK_FALL("block.coral_block.fall"),
+ BLOCK_CORAL_BLOCK_HIT("block.coral_block.hit"),
+ BLOCK_CORAL_BLOCK_PLACE("block.coral_block.place"),
+ BLOCK_CORAL_BLOCK_STEP("block.coral_block.step"),
BLOCK_DISPENSER_DISPENSE("block.dispenser.dispense"),
BLOCK_DISPENSER_FAIL("block.dispenser.fail"),
BLOCK_DISPENSER_LAUNCH("block.dispenser.launch"),
BLOCK_ENCHANTMENT_TABLE_USE("block.enchantment_table.use"),
- BLOCK_ENDERCHEST_CLOSE("block.enderchest.close"),
- BLOCK_ENDERCHEST_OPEN("block.enderchest.open"),
+ BLOCK_ENDER_CHEST_CLOSE("block.ender_chest.close"),
+ BLOCK_ENDER_CHEST_OPEN("block.ender_chest.open"),
BLOCK_END_GATEWAY_SPAWN("block.end_gateway.spawn"),
BLOCK_END_PORTAL_FRAME_FILL("block.end_portal_frame.fill"),
BLOCK_END_PORTAL_SPAWN("block.end_portal.spawn"),
@@ -72,29 +92,31 @@ public enum CraftSound {
BLOCK_LAVA_EXTINGUISH("block.lava.extinguish"),
BLOCK_LAVA_POP("block.lava.pop"),
BLOCK_LEVER_CLICK("block.lever.click"),
+ BLOCK_LILY_PAD_PLACE("block.lily_pad.place"),
BLOCK_METAL_BREAK("block.metal.break"),
BLOCK_METAL_FALL("block.metal.fall"),
BLOCK_METAL_HIT("block.metal.hit"),
BLOCK_METAL_PLACE("block.metal.place"),
- BLOCK_METAL_PRESSUREPLATE_CLICK_OFF("block.metal_pressureplate.click_off"),
- BLOCK_METAL_PRESSUREPLATE_CLICK_ON("block.metal_pressureplate.click_on"),
+ BLOCK_METAL_PRESSURE_PLATE_CLICK_OFF("block.metal_pressure_plate.click_off"),
+ BLOCK_METAL_PRESSURE_PLATE_CLICK_ON("block.metal_pressure_plate.click_on"),
BLOCK_METAL_STEP("block.metal.step"),
- BLOCK_NOTE_BASEDRUM("block.note.basedrum"),
- BLOCK_NOTE_BASS("block.note.bass"),
- BLOCK_NOTE_BELL("block.note.bell"),
- BLOCK_NOTE_CHIME("block.note.chime"),
- BLOCK_NOTE_FLUTE("block.note.flute"),
- BLOCK_NOTE_GUITAR("block.note.guitar"),
- BLOCK_NOTE_HARP("block.note.harp"),
- BLOCK_NOTE_HAT("block.note.hat"),
- BLOCK_NOTE_PLING("block.note.pling"),
- BLOCK_NOTE_SNARE("block.note.snare"),
- BLOCK_NOTE_XYLOPHONE("block.note.xylophone"),
+ BLOCK_NOTE_BLOCK_BASEDRUM("block.note_block.basedrum"),
+ BLOCK_NOTE_BLOCK_BASS("block.note_block.bass"),
+ BLOCK_NOTE_BLOCK_BELL("block.note_block.bell"),
+ BLOCK_NOTE_BLOCK_CHIME("block.note_block.chime"),
+ BLOCK_NOTE_BLOCK_FLUTE("block.note_block.flute"),
+ BLOCK_NOTE_BLOCK_GUITAR("block.note_block.guitar"),
+ BLOCK_NOTE_BLOCK_HARP("block.note_block.harp"),
+ BLOCK_NOTE_BLOCK_HAT("block.note_block.hat"),
+ BLOCK_NOTE_BLOCK_PLING("block.note_block.pling"),
+ BLOCK_NOTE_BLOCK_SNARE("block.note_block.snare"),
+ BLOCK_NOTE_BLOCK_XYLOPHONE("block.note_block.xylophone"),
BLOCK_PISTON_CONTRACT("block.piston.contract"),
BLOCK_PISTON_EXTEND("block.piston.extend"),
BLOCK_PORTAL_AMBIENT("block.portal.ambient"),
BLOCK_PORTAL_TRAVEL("block.portal.travel"),
BLOCK_PORTAL_TRIGGER("block.portal.trigger"),
+ BLOCK_PUMPKIN_CARVE("block.pumpkin.carve"),
BLOCK_REDSTONE_TORCH_BURNOUT("block.redstone_torch.burnout"),
BLOCK_SAND_BREAK("block.sand.break"),
BLOCK_SAND_FALL("block.sand.fall"),
@@ -103,11 +125,11 @@ public enum CraftSound {
BLOCK_SAND_STEP("block.sand.step"),
BLOCK_SHULKER_BOX_CLOSE("block.shulker_box.close"),
BLOCK_SHULKER_BOX_OPEN("block.shulker_box.open"),
- BLOCK_SLIME_BREAK("block.slime.break"),
- BLOCK_SLIME_FALL("block.slime.fall"),
- BLOCK_SLIME_HIT("block.slime.hit"),
- BLOCK_SLIME_PLACE("block.slime.place"),
- BLOCK_SLIME_STEP("block.slime.step"),
+ BLOCK_SLIME_BLOCK_BREAK("block.slime_block.break"),
+ BLOCK_SLIME_BLOCK_FALL("block.slime_block.fall"),
+ BLOCK_SLIME_BLOCK_HIT("block.slime_block.hit"),
+ BLOCK_SLIME_BLOCK_PLACE("block.slime_block.place"),
+ BLOCK_SLIME_BLOCK_STEP("block.slime_block.step"),
BLOCK_SNOW_BREAK("block.snow.break"),
BLOCK_SNOW_FALL("block.snow.fall"),
BLOCK_SNOW_HIT("block.snow.hit"),
@@ -119,33 +141,42 @@ public enum CraftSound {
BLOCK_STONE_FALL("block.stone.fall"),
BLOCK_STONE_HIT("block.stone.hit"),
BLOCK_STONE_PLACE("block.stone.place"),
- BLOCK_STONE_PRESSUREPLATE_CLICK_OFF("block.stone_pressureplate.click_off"),
- BLOCK_STONE_PRESSUREPLATE_CLICK_ON("block.stone_pressureplate.click_on"),
+ BLOCK_STONE_PRESSURE_PLATE_CLICK_OFF("block.stone_pressure_plate.click_off"),
+ BLOCK_STONE_PRESSURE_PLATE_CLICK_ON("block.stone_pressure_plate.click_on"),
BLOCK_STONE_STEP("block.stone.step"),
BLOCK_TRIPWIRE_ATTACH("block.tripwire.attach"),
BLOCK_TRIPWIRE_CLICK_OFF("block.tripwire.click_off"),
BLOCK_TRIPWIRE_CLICK_ON("block.tripwire.click_on"),
BLOCK_TRIPWIRE_DETACH("block.tripwire.detach"),
- BLOCK_WATERLILY_PLACE("block.waterlily.place"),
BLOCK_WATER_AMBIENT("block.water.ambient"),
+ BLOCK_WET_GRASS_BREAK("block.wet_grass.break"),
+ BLOCK_WET_GRASS_FALL("block.wet_grass.fall"),
+ BLOCK_WET_GRASS_HIT("block.wet_grass.hit"),
+ BLOCK_WET_GRASS_PLACE("block.wet_grass.place"),
+ BLOCK_WET_GRASS_STEP("block.wet_grass.step"),
+ BLOCK_WOODEN_BUTTON_CLICK_OFF("block.wooden_button.click_off"),
+ BLOCK_WOODEN_BUTTON_CLICK_ON("block.wooden_button.click_on"),
BLOCK_WOODEN_DOOR_CLOSE("block.wooden_door.close"),
BLOCK_WOODEN_DOOR_OPEN("block.wooden_door.open"),
+ BLOCK_WOODEN_PRESSURE_PLATE_CLICK_OFF("block.wooden_pressure_plate.click_off"),
+ BLOCK_WOODEN_PRESSURE_PLATE_CLICK_ON("block.wooden_pressure_plate.click_on"),
BLOCK_WOODEN_TRAPDOOR_CLOSE("block.wooden_trapdoor.close"),
BLOCK_WOODEN_TRAPDOOR_OPEN("block.wooden_trapdoor.open"),
BLOCK_WOOD_BREAK("block.wood.break"),
- BLOCK_WOOD_BUTTON_CLICK_OFF("block.wood_button.click_off"),
- BLOCK_WOOD_BUTTON_CLICK_ON("block.wood_button.click_on"),
BLOCK_WOOD_FALL("block.wood.fall"),
BLOCK_WOOD_HIT("block.wood.hit"),
BLOCK_WOOD_PLACE("block.wood.place"),
- BLOCK_WOOD_PRESSUREPLATE_CLICK_OFF("block.wood_pressureplate.click_off"),
- BLOCK_WOOD_PRESSUREPLATE_CLICK_ON("block.wood_pressureplate.click_on"),
BLOCK_WOOD_STEP("block.wood.step"),
+ BLOCK_WOOL_BREAK("block.wool.break"),
+ BLOCK_WOOL_FALL("block.wool.fall"),
+ BLOCK_WOOL_HIT("block.wool.hit"),
+ BLOCK_WOOL_PLACE("block.wool.place"),
+ BLOCK_WOOL_STEP("block.wool.step"),
ENCHANT_THORNS_HIT("enchant.thorns.hit"),
- ENTITY_ARMORSTAND_BREAK("entity.armorstand.break"),
- ENTITY_ARMORSTAND_FALL("entity.armorstand.fall"),
- ENTITY_ARMORSTAND_HIT("entity.armorstand.hit"),
- ENTITY_ARMORSTAND_PLACE("entity.armorstand.place"),
+ ENTITY_ARMOR_STAND_BREAK("entity.armor_stand.break"),
+ ENTITY_ARMOR_STAND_FALL("entity.armor_stand.fall"),
+ ENTITY_ARMOR_STAND_HIT("entity.armor_stand.hit"),
+ ENTITY_ARMOR_STAND_PLACE("entity.armor_stand.place"),
ENTITY_ARROW_HIT("entity.arrow.hit"),
ENTITY_ARROW_HIT_PLAYER("entity.arrow.hit_player"),
ENTITY_ARROW_SHOOT("entity.arrow.shoot"),
@@ -161,9 +192,6 @@ public enum CraftSound {
ENTITY_BLAZE_SHOOT("entity.blaze.shoot"),
ENTITY_BOAT_PADDLE_LAND("entity.boat.paddle_land"),
ENTITY_BOAT_PADDLE_WATER("entity.boat.paddle_water"),
- ENTITY_BOBBER_RETRIEVE("entity.bobber.retrieve"),
- ENTITY_BOBBER_SPLASH("entity.bobber.splash"),
- ENTITY_BOBBER_THROW("entity.bobber.throw"),
ENTITY_CAT_AMBIENT("entity.cat.ambient"),
ENTITY_CAT_DEATH("entity.cat.death"),
ENTITY_CAT_HISS("entity.cat.hiss"),
@@ -175,6 +203,10 @@ public enum CraftSound {
ENTITY_CHICKEN_EGG("entity.chicken.egg"),
ENTITY_CHICKEN_HURT("entity.chicken.hurt"),
ENTITY_CHICKEN_STEP("entity.chicken.step"),
+ ENTITY_COD_AMBIENT("entity.cod.ambient"),
+ ENTITY_COD_DEATH("entity.cod.death"),
+ ENTITY_COD_FLOP("entity.cod.flop"),
+ ENTITY_COD_HURT("entity.cod.hurt"),
ENTITY_COW_AMBIENT("entity.cow.ambient"),
ENTITY_COW_DEATH("entity.cow.death"),
ENTITY_COW_HURT("entity.cow.hurt"),
@@ -183,11 +215,31 @@ public enum CraftSound {
ENTITY_CREEPER_DEATH("entity.creeper.death"),
ENTITY_CREEPER_HURT("entity.creeper.hurt"),
ENTITY_CREEPER_PRIMED("entity.creeper.primed"),
+ ENTITY_DOLPHIN_AMBIENT("entity.dolphin.ambient"),
+ ENTITY_DOLPHIN_AMBIENT_WATER("entity.dolphin.ambient_water"),
+ ENTITY_DOLPHIN_ATTACK("entity.dolphin.attack"),
+ ENTITY_DOLPHIN_DEATH("entity.dolphin.death"),
+ ENTITY_DOLPHIN_EAT("entity.dolphin.eat"),
+ ENTITY_DOLPHIN_HURT("entity.dolphin.hurt"),
+ ENTITY_DOLPHIN_JUMP("entity.dolphin.jump"),
+ ENTITY_DOLPHIN_PLAY("entity.dolphin.play"),
+ ENTITY_DOLPHIN_SPLASH("entity.dolphin.splash"),
+ ENTITY_DOLPHIN_SWIM("entity.dolphin.swim"),
ENTITY_DONKEY_AMBIENT("entity.donkey.ambient"),
ENTITY_DONKEY_ANGRY("entity.donkey.angry"),
ENTITY_DONKEY_CHEST("entity.donkey.chest"),
ENTITY_DONKEY_DEATH("entity.donkey.death"),
ENTITY_DONKEY_HURT("entity.donkey.hurt"),
+ ENTITY_DRAGON_FIREBALL_EXPLODE("entity.dragon_fireball.explode"),
+ ENTITY_DROWNED_AMBIENT("entity.drowned.ambient"),
+ ENTITY_DROWNED_AMBIENT_WATER("entity.drowned.ambient_water"),
+ ENTITY_DROWNED_DEATH("entity.drowned.death"),
+ ENTITY_DROWNED_DEATH_WATER("entity.drowned.death_water"),
+ ENTITY_DROWNED_HURT("entity.drowned.hurt"),
+ ENTITY_DROWNED_HURT_WATER("entity.drowned.hurt_water"),
+ ENTITY_DROWNED_SHOOT("entity.drowned.shoot"),
+ ENTITY_DROWNED_STEP("entity.drowned.step"),
+ ENTITY_DROWNED_SWIM("entity.drowned.swim"),
ENTITY_EGG_THROW("entity.egg.throw"),
ENTITY_ELDER_GUARDIAN_AMBIENT("entity.elder_guardian.ambient"),
ENTITY_ELDER_GUARDIAN_AMBIENT_LAND("entity.elder_guardian.ambient_land"),
@@ -197,44 +249,47 @@ public enum CraftSound {
ENTITY_ELDER_GUARDIAN_FLOP("entity.elder_guardian.flop"),
ENTITY_ELDER_GUARDIAN_HURT("entity.elder_guardian.hurt"),
ENTITY_ELDER_GUARDIAN_HURT_LAND("entity.elder_guardian.hurt_land"),
- ENTITY_ENDERDRAGON_AMBIENT("entity.enderdragon.ambient"),
- ENTITY_ENDERDRAGON_DEATH("entity.enderdragon.death"),
- ENTITY_ENDERDRAGON_FIREBALL_EXPLODE("entity.enderdragon_fireball.explode"),
- ENTITY_ENDERDRAGON_FLAP("entity.enderdragon.flap"),
- ENTITY_ENDERDRAGON_GROWL("entity.enderdragon.growl"),
- ENTITY_ENDERDRAGON_HURT("entity.enderdragon.hurt"),
- ENTITY_ENDERDRAGON_SHOOT("entity.enderdragon.shoot"),
- ENTITY_ENDEREYE_DEATH("entity.endereye.death"),
- ENTITY_ENDEREYE_LAUNCH("entity.endereye.launch"),
- ENTITY_ENDERMEN_AMBIENT("entity.endermen.ambient"),
- ENTITY_ENDERMEN_DEATH("entity.endermen.death"),
- ENTITY_ENDERMEN_HURT("entity.endermen.hurt"),
- ENTITY_ENDERMEN_SCREAM("entity.endermen.scream"),
- ENTITY_ENDERMEN_STARE("entity.endermen.stare"),
- ENTITY_ENDERMEN_TELEPORT("entity.endermen.teleport"),
+ ENTITY_ENDERMAN_AMBIENT("entity.enderman.ambient"),
+ ENTITY_ENDERMAN_DEATH("entity.enderman.death"),
+ ENTITY_ENDERMAN_HURT("entity.enderman.hurt"),
+ ENTITY_ENDERMAN_SCREAM("entity.enderman.scream"),
+ ENTITY_ENDERMAN_STARE("entity.enderman.stare"),
+ ENTITY_ENDERMAN_TELEPORT("entity.enderman.teleport"),
ENTITY_ENDERMITE_AMBIENT("entity.endermite.ambient"),
ENTITY_ENDERMITE_DEATH("entity.endermite.death"),
ENTITY_ENDERMITE_HURT("entity.endermite.hurt"),
ENTITY_ENDERMITE_STEP("entity.endermite.step"),
- ENTITY_ENDERPEARL_THROW("entity.enderpearl.throw"),
- ENTITY_EVOCATION_FANGS_ATTACK("entity.evocation_fangs.attack"),
- ENTITY_EVOCATION_ILLAGER_AMBIENT("entity.evocation_illager.ambient"),
- ENTITY_EVOCATION_ILLAGER_CAST_SPELL("entity.evocation_illager.cast_spell"),
- ENTITY_EVOCATION_ILLAGER_DEATH("entity.evocation_illager.death"),
- ENTITY_EVOCATION_ILLAGER_HURT("entity.evocation_illager.hurt"),
- ENTITY_EVOCATION_ILLAGER_PREPARE_ATTACK("entity.evocation_illager.prepare_attack"),
- ENTITY_EVOCATION_ILLAGER_PREPARE_SUMMON("entity.evocation_illager.prepare_summon"),
- ENTITY_EVOCATION_ILLAGER_PREPARE_WOLOLO("entity.evocation_illager.prepare_wololo"),
+ ENTITY_ENDER_DRAGON_AMBIENT("entity.ender_dragon.ambient"),
+ ENTITY_ENDER_DRAGON_DEATH("entity.ender_dragon.death"),
+ ENTITY_ENDER_DRAGON_FLAP("entity.ender_dragon.flap"),
+ ENTITY_ENDER_DRAGON_GROWL("entity.ender_dragon.growl"),
+ ENTITY_ENDER_DRAGON_HURT("entity.ender_dragon.hurt"),
+ ENTITY_ENDER_DRAGON_SHOOT("entity.ender_dragon.shoot"),
+ ENTITY_ENDER_EYE_DEATH("entity.ender_eye.death"),
+ ENTITY_ENDER_EYE_LAUNCH("entity.ender_eye.launch"),
+ ENTITY_ENDER_PEARL_THROW("entity.ender_pearl.throw"),
+ ENTITY_EVOKER_AMBIENT("entity.evoker.ambient"),
+ ENTITY_EVOKER_CAST_SPELL("entity.evoker.cast_spell"),
+ ENTITY_EVOKER_DEATH("entity.evoker.death"),
+ ENTITY_EVOKER_FANGS_ATTACK("entity.evoker_fangs.attack"),
+ ENTITY_EVOKER_HURT("entity.evoker.hurt"),
+ ENTITY_EVOKER_PREPARE_ATTACK("entity.evoker.prepare_attack"),
+ ENTITY_EVOKER_PREPARE_SUMMON("entity.evoker.prepare_summon"),
+ ENTITY_EVOKER_PREPARE_WOLOLO("entity.evoker.prepare_wololo"),
ENTITY_EXPERIENCE_BOTTLE_THROW("entity.experience_bottle.throw"),
ENTITY_EXPERIENCE_ORB_PICKUP("entity.experience_orb.pickup"),
- ENTITY_FIREWORK_BLAST("entity.firework.blast"),
- ENTITY_FIREWORK_BLAST_FAR("entity.firework.blast_far"),
- ENTITY_FIREWORK_LARGE_BLAST("entity.firework.large_blast"),
- ENTITY_FIREWORK_LARGE_BLAST_FAR("entity.firework.large_blast_far"),
- ENTITY_FIREWORK_LAUNCH("entity.firework.launch"),
- ENTITY_FIREWORK_SHOOT("entity.firework.shoot"),
- ENTITY_FIREWORK_TWINKLE("entity.firework.twinkle"),
- ENTITY_FIREWORK_TWINKLE_FAR("entity.firework.twinkle_far"),
+ ENTITY_FIREWORK_ROCKET_BLAST("entity.firework_rocket.blast"),
+ ENTITY_FIREWORK_ROCKET_BLAST_FAR("entity.firework_rocket.blast_far"),
+ ENTITY_FIREWORK_ROCKET_LARGE_BLAST("entity.firework_rocket.large_blast"),
+ ENTITY_FIREWORK_ROCKET_LARGE_BLAST_FAR("entity.firework_rocket.large_blast_far"),
+ ENTITY_FIREWORK_ROCKET_LAUNCH("entity.firework_rocket.launch"),
+ ENTITY_FIREWORK_ROCKET_SHOOT("entity.firework_rocket.shoot"),
+ ENTITY_FIREWORK_ROCKET_TWINKLE("entity.firework_rocket.twinkle"),
+ ENTITY_FIREWORK_ROCKET_TWINKLE_FAR("entity.firework_rocket.twinkle_far"),
+ ENTITY_FISHING_BOBBER_RETRIEVE("entity.fishing_bobber.retrieve"),
+ ENTITY_FISHING_BOBBER_SPLASH("entity.fishing_bobber.splash"),
+ ENTITY_FISHING_BOBBER_THROW("entity.fishing_bobber.throw"),
+ ENTITY_FISH_SWIM("entity.fish.swim"),
ENTITY_GENERIC_BIG_FALL("entity.generic.big_fall"),
ENTITY_GENERIC_BURN("entity.generic.burn"),
ENTITY_GENERIC_DEATH("entity.generic.death"),
@@ -280,32 +335,33 @@ public enum CraftSound {
ENTITY_HOSTILE_SPLASH("entity.hostile.splash"),
ENTITY_HOSTILE_SWIM("entity.hostile.swim"),
ENTITY_HUSK_AMBIENT("entity.husk.ambient"),
+ ENTITY_HUSK_CONVERTED_TO_ZOMBIE("entity.husk.converted_to_zombie"),
ENTITY_HUSK_DEATH("entity.husk.death"),
ENTITY_HUSK_HURT("entity.husk.hurt"),
ENTITY_HUSK_STEP("entity.husk.step"),
- ENTITY_ILLUSION_ILLAGER_AMBIENT("entity.illusion_illager.ambient"),
- ENTITY_ILLUSION_ILLAGER_CAST_SPELL("entity.illusion_illager.cast_spell"),
- ENTITY_ILLUSION_ILLAGER_DEATH("entity.illusion_illager.death"),
- ENTITY_ILLUSION_ILLAGER_HURT("entity.illusion_illager.hurt"),
- ENTITY_ILLUSION_ILLAGER_MIRROR_MOVE("entity.illusion_illager.mirror_move"),
- ENTITY_ILLUSION_ILLAGER_PREPARE_BLINDNESS("entity.illusion_illager.prepare_blindness"),
- ENTITY_ILLUSION_ILLAGER_PREPARE_MIRROR("entity.illusion_illager.prepare_mirror"),
- ENTITY_IRONGOLEM_ATTACK("entity.irongolem.attack"),
- ENTITY_IRONGOLEM_DEATH("entity.irongolem.death"),
- ENTITY_IRONGOLEM_HURT("entity.irongolem.hurt"),
- ENTITY_IRONGOLEM_STEP("entity.irongolem.step"),
- ENTITY_ITEMFRAME_ADD_ITEM("entity.itemframe.add_item"),
- ENTITY_ITEMFRAME_BREAK("entity.itemframe.break"),
- ENTITY_ITEMFRAME_PLACE("entity.itemframe.place"),
- ENTITY_ITEMFRAME_REMOVE_ITEM("entity.itemframe.remove_item"),
- ENTITY_ITEMFRAME_ROTATE_ITEM("entity.itemframe.rotate_item"),
+ ENTITY_ILLUSIONER_AMBIENT("entity.illusioner.ambient"),
+ ENTITY_ILLUSIONER_CAST_SPELL("entity.illusioner.cast_spell"),
+ ENTITY_ILLUSIONER_DEATH("entity.illusioner.death"),
+ ENTITY_ILLUSIONER_HURT("entity.illusioner.hurt"),
+ ENTITY_ILLUSIONER_MIRROR_MOVE("entity.illusioner.mirror_move"),
+ ENTITY_ILLUSIONER_PREPARE_BLINDNESS("entity.illusioner.prepare_blindness"),
+ ENTITY_ILLUSIONER_PREPARE_MIRROR("entity.illusioner.prepare_mirror"),
+ ENTITY_IRON_GOLEM_ATTACK("entity.iron_golem.attack"),
+ ENTITY_IRON_GOLEM_DEATH("entity.iron_golem.death"),
+ ENTITY_IRON_GOLEM_HURT("entity.iron_golem.hurt"),
+ ENTITY_IRON_GOLEM_STEP("entity.iron_golem.step"),
ENTITY_ITEM_BREAK("entity.item.break"),
+ ENTITY_ITEM_FRAME_ADD_ITEM("entity.item_frame.add_item"),
+ ENTITY_ITEM_FRAME_BREAK("entity.item_frame.break"),
+ ENTITY_ITEM_FRAME_PLACE("entity.item_frame.place"),
+ ENTITY_ITEM_FRAME_REMOVE_ITEM("entity.item_frame.remove_item"),
+ ENTITY_ITEM_FRAME_ROTATE_ITEM("entity.item_frame.rotate_item"),
ENTITY_ITEM_PICKUP("entity.item.pickup"),
- ENTITY_LEASHKNOT_BREAK("entity.leashknot.break"),
- ENTITY_LEASHKNOT_PLACE("entity.leashknot.place"),
- ENTITY_LIGHTNING_IMPACT("entity.lightning.impact"),
- ENTITY_LIGHTNING_THUNDER("entity.lightning.thunder"),
- ENTITY_LINGERINGPOTION_THROW("entity.lingeringpotion.throw"),
+ ENTITY_LEASH_KNOT_BREAK("entity.leash_knot.break"),
+ ENTITY_LEASH_KNOT_PLACE("entity.leash_knot.place"),
+ ENTITY_LIGHTNING_BOLT_IMPACT("entity.lightning_bolt.impact"),
+ ENTITY_LIGHTNING_BOLT_THUNDER("entity.lightning_bolt.thunder"),
+ ENTITY_LINGERING_POTION_THROW("entity.lingering_potion.throw"),
ENTITY_LLAMA_AMBIENT("entity.llama.ambient"),
ENTITY_LLAMA_ANGRY("entity.llama.angry"),
ENTITY_LLAMA_CHEST("entity.llama.chest"),
@@ -315,10 +371,13 @@ public enum CraftSound {
ENTITY_LLAMA_SPIT("entity.llama.spit"),
ENTITY_LLAMA_STEP("entity.llama.step"),
ENTITY_LLAMA_SWAG("entity.llama.swag"),
- ENTITY_MAGMACUBE_DEATH("entity.magmacube.death"),
- ENTITY_MAGMACUBE_HURT("entity.magmacube.hurt"),
- ENTITY_MAGMACUBE_JUMP("entity.magmacube.jump"),
- ENTITY_MAGMACUBE_SQUISH("entity.magmacube.squish"),
+ ENTITY_MAGMA_CUBE_DEATH("entity.magma_cube.death"),
+ ENTITY_MAGMA_CUBE_DEATH_SMALL("entity.magma_cube.death_small"),
+ ENTITY_MAGMA_CUBE_HURT("entity.magma_cube.hurt"),
+ ENTITY_MAGMA_CUBE_HURT_SMALL("entity.magma_cube.hurt_small"),
+ ENTITY_MAGMA_CUBE_JUMP("entity.magma_cube.jump"),
+ ENTITY_MAGMA_CUBE_SQUISH("entity.magma_cube.squish"),
+ ENTITY_MAGMA_CUBE_SQUISH_SMALL("entity.magma_cube.squish_small"),
ENTITY_MINECART_INSIDE("entity.minecart.inside"),
ENTITY_MINECART_RIDING("entity.minecart.riding"),
ENTITY_MOOSHROOM_SHEAR("entity.mooshroom.shear"),
@@ -335,15 +394,17 @@ public enum CraftSound {
ENTITY_PARROT_HURT("entity.parrot.hurt"),
ENTITY_PARROT_IMITATE_BLAZE("entity.parrot.imitate.blaze"),
ENTITY_PARROT_IMITATE_CREEPER("entity.parrot.imitate.creeper"),
+ ENTITY_PARROT_IMITATE_DROWNED("entity.parrot.imitate.drowned"),
ENTITY_PARROT_IMITATE_ELDER_GUARDIAN("entity.parrot.imitate.elder_guardian"),
- ENTITY_PARROT_IMITATE_ENDERDRAGON("entity.parrot.imitate.enderdragon"),
ENTITY_PARROT_IMITATE_ENDERMAN("entity.parrot.imitate.enderman"),
ENTITY_PARROT_IMITATE_ENDERMITE("entity.parrot.imitate.endermite"),
- ENTITY_PARROT_IMITATE_EVOCATION_ILLAGER("entity.parrot.imitate.evocation_illager"),
+ ENTITY_PARROT_IMITATE_ENDER_DRAGON("entity.parrot.imitate.ender_dragon"),
+ ENTITY_PARROT_IMITATE_EVOKER("entity.parrot.imitate.evoker"),
ENTITY_PARROT_IMITATE_GHAST("entity.parrot.imitate.ghast"),
ENTITY_PARROT_IMITATE_HUSK("entity.parrot.imitate.husk"),
- ENTITY_PARROT_IMITATE_ILLUSION_ILLAGER("entity.parrot.imitate.illusion_illager"),
- ENTITY_PARROT_IMITATE_MAGMACUBE("entity.parrot.imitate.magmacube"),
+ ENTITY_PARROT_IMITATE_ILLUSIONER("entity.parrot.imitate.illusioner"),
+ ENTITY_PARROT_IMITATE_MAGMA_CUBE("entity.parrot.imitate.magma_cube"),
+ ENTITY_PARROT_IMITATE_PHANTOM("entity.parrot.imitate.phantom"),
ENTITY_PARROT_IMITATE_POLAR_BEAR("entity.parrot.imitate.polar_bear"),
ENTITY_PARROT_IMITATE_SHULKER("entity.parrot.imitate.shulker"),
ENTITY_PARROT_IMITATE_SILVERFISH("entity.parrot.imitate.silverfish"),
@@ -352,7 +413,7 @@ public enum CraftSound {
ENTITY_PARROT_IMITATE_SPIDER("entity.parrot.imitate.spider"),
ENTITY_PARROT_IMITATE_STRAY("entity.parrot.imitate.stray"),
ENTITY_PARROT_IMITATE_VEX("entity.parrot.imitate.vex"),
- ENTITY_PARROT_IMITATE_VINDICATION_ILLAGER("entity.parrot.imitate.vindication_illager"),
+ ENTITY_PARROT_IMITATE_VINDICATOR("entity.parrot.imitate.vindicator"),
ENTITY_PARROT_IMITATE_WITCH("entity.parrot.imitate.witch"),
ENTITY_PARROT_IMITATE_WITHER("entity.parrot.imitate.wither"),
ENTITY_PARROT_IMITATE_WITHER_SKELETON("entity.parrot.imitate.wither_skeleton"),
@@ -361,6 +422,12 @@ public enum CraftSound {
ENTITY_PARROT_IMITATE_ZOMBIE_PIGMAN("entity.parrot.imitate.zombie_pigman"),
ENTITY_PARROT_IMITATE_ZOMBIE_VILLAGER("entity.parrot.imitate.zombie_villager"),
ENTITY_PARROT_STEP("entity.parrot.step"),
+ ENTITY_PHANTOM_AMBIENT("entity.phantom.ambient"),
+ ENTITY_PHANTOM_BITE("entity.phantom.bite"),
+ ENTITY_PHANTOM_DEATH("entity.phantom.death"),
+ ENTITY_PHANTOM_FLAP("entity.phantom.flap"),
+ ENTITY_PHANTOM_HURT("entity.phantom.hurt"),
+ ENTITY_PHANTOM_SWOOP("entity.phantom.swoop"),
ENTITY_PIG_AMBIENT("entity.pig.ambient"),
ENTITY_PIG_DEATH("entity.pig.death"),
ENTITY_PIG_HURT("entity.pig.hurt"),
@@ -382,18 +449,30 @@ public enum CraftSound {
ENTITY_PLAYER_LEVELUP("entity.player.levelup"),
ENTITY_PLAYER_SMALL_FALL("entity.player.small_fall"),
ENTITY_PLAYER_SPLASH("entity.player.splash"),
+ ENTITY_PLAYER_SPLASH_HIGH_SPEED("entity.player.splash.high_speed"),
ENTITY_PLAYER_SWIM("entity.player.swim"),
ENTITY_POLAR_BEAR_AMBIENT("entity.polar_bear.ambient"),
- ENTITY_POLAR_BEAR_BABY_AMBIENT("entity.polar_bear.baby_ambient"),
+ ENTITY_POLAR_BEAR_AMBIENT_BABY("entity.polar_bear.ambient_baby"),
ENTITY_POLAR_BEAR_DEATH("entity.polar_bear.death"),
ENTITY_POLAR_BEAR_HURT("entity.polar_bear.hurt"),
ENTITY_POLAR_BEAR_STEP("entity.polar_bear.step"),
ENTITY_POLAR_BEAR_WARNING("entity.polar_bear.warning"),
+ ENTITY_PUFFER_FISH_AMBIENT("entity.puffer_fish.ambient"),
+ ENTITY_PUFFER_FISH_BLOW_OUT("entity.puffer_fish.blow_out"),
+ ENTITY_PUFFER_FISH_BLOW_UP("entity.puffer_fish.blow_up"),
+ ENTITY_PUFFER_FISH_DEATH("entity.puffer_fish.death"),
+ ENTITY_PUFFER_FISH_FLOP("entity.puffer_fish.flop"),
+ ENTITY_PUFFER_FISH_HURT("entity.puffer_fish.hurt"),
+ ENTITY_PUFFER_FISH_STING("entity.puffer_fish.sting"),
ENTITY_RABBIT_AMBIENT("entity.rabbit.ambient"),
ENTITY_RABBIT_ATTACK("entity.rabbit.attack"),
ENTITY_RABBIT_DEATH("entity.rabbit.death"),
ENTITY_RABBIT_HURT("entity.rabbit.hurt"),
ENTITY_RABBIT_JUMP("entity.rabbit.jump"),
+ ENTITY_SALMON_AMBIENT("entity.salmon.ambient"),
+ ENTITY_SALMON_DEATH("entity.salmon.death"),
+ ENTITY_SALMON_FLOP("entity.salmon.flop"),
+ ENTITY_SALMON_HURT("entity.salmon.hurt"),
ENTITY_SHEEP_AMBIENT("entity.sheep.ambient"),
ENTITY_SHEEP_DEATH("entity.sheep.death"),
ENTITY_SHEEP_HURT("entity.sheep.hurt"),
@@ -416,28 +495,30 @@ public enum CraftSound {
ENTITY_SKELETON_AMBIENT("entity.skeleton.ambient"),
ENTITY_SKELETON_DEATH("entity.skeleton.death"),
ENTITY_SKELETON_HORSE_AMBIENT("entity.skeleton_horse.ambient"),
+ ENTITY_SKELETON_HORSE_AMBIENT_WATER("entity.skeleton_horse.ambient_water"),
ENTITY_SKELETON_HORSE_DEATH("entity.skeleton_horse.death"),
+ ENTITY_SKELETON_HORSE_GALLOP_WATER("entity.skeleton_horse.gallop_water"),
ENTITY_SKELETON_HORSE_HURT("entity.skeleton_horse.hurt"),
+ ENTITY_SKELETON_HORSE_JUMP_WATER("entity.skeleton_horse.jump_water"),
+ ENTITY_SKELETON_HORSE_STEP_WATER("entity.skeleton_horse.step_water"),
+ ENTITY_SKELETON_HORSE_SWIM("entity.skeleton_horse.swim"),
ENTITY_SKELETON_HURT("entity.skeleton.hurt"),
ENTITY_SKELETON_SHOOT("entity.skeleton.shoot"),
ENTITY_SKELETON_STEP("entity.skeleton.step"),
ENTITY_SLIME_ATTACK("entity.slime.attack"),
ENTITY_SLIME_DEATH("entity.slime.death"),
+ ENTITY_SLIME_DEATH_SMALL("entity.slime.death_small"),
ENTITY_SLIME_HURT("entity.slime.hurt"),
+ ENTITY_SLIME_HURT_SMALL("entity.slime.hurt_small"),
ENTITY_SLIME_JUMP("entity.slime.jump"),
+ ENTITY_SLIME_JUMP_SMALL("entity.slime.jump_small"),
ENTITY_SLIME_SQUISH("entity.slime.squish"),
- ENTITY_SMALL_MAGMACUBE_DEATH("entity.small_magmacube.death"),
- ENTITY_SMALL_MAGMACUBE_HURT("entity.small_magmacube.hurt"),
- ENTITY_SMALL_MAGMACUBE_SQUISH("entity.small_magmacube.squish"),
- ENTITY_SMALL_SLIME_DEATH("entity.small_slime.death"),
- ENTITY_SMALL_SLIME_HURT("entity.small_slime.hurt"),
- ENTITY_SMALL_SLIME_JUMP("entity.small_slime.jump"),
- ENTITY_SMALL_SLIME_SQUISH("entity.small_slime.squish"),
+ ENTITY_SLIME_SQUISH_SMALL("entity.slime.squish_small"),
ENTITY_SNOWBALL_THROW("entity.snowball.throw"),
- ENTITY_SNOWMAN_AMBIENT("entity.snowman.ambient"),
- ENTITY_SNOWMAN_DEATH("entity.snowman.death"),
- ENTITY_SNOWMAN_HURT("entity.snowman.hurt"),
- ENTITY_SNOWMAN_SHOOT("entity.snowman.shoot"),
+ ENTITY_SNOW_GOLEM_AMBIENT("entity.snow_golem.ambient"),
+ ENTITY_SNOW_GOLEM_DEATH("entity.snow_golem.death"),
+ ENTITY_SNOW_GOLEM_HURT("entity.snow_golem.hurt"),
+ ENTITY_SNOW_GOLEM_SHOOT("entity.snow_golem.shoot"),
ENTITY_SPIDER_AMBIENT("entity.spider.ambient"),
ENTITY_SPIDER_DEATH("entity.spider.death"),
ENTITY_SPIDER_HURT("entity.spider.hurt"),
@@ -447,11 +528,28 @@ public enum CraftSound {
ENTITY_SQUID_AMBIENT("entity.squid.ambient"),
ENTITY_SQUID_DEATH("entity.squid.death"),
ENTITY_SQUID_HURT("entity.squid.hurt"),
+ ENTITY_SQUID_SQUIRT("entity.squid.squirt"),
ENTITY_STRAY_AMBIENT("entity.stray.ambient"),
ENTITY_STRAY_DEATH("entity.stray.death"),
ENTITY_STRAY_HURT("entity.stray.hurt"),
ENTITY_STRAY_STEP("entity.stray.step"),
ENTITY_TNT_PRIMED("entity.tnt.primed"),
+ ENTITY_TROPICAL_FISH_AMBIENT("entity.tropical_fish.ambient"),
+ ENTITY_TROPICAL_FISH_DEATH("entity.tropical_fish.death"),
+ ENTITY_TROPICAL_FISH_FLOP("entity.tropical_fish.flop"),
+ ENTITY_TROPICAL_FISH_HURT("entity.tropical_fish.hurt"),
+ ENTITY_TURTLE_AMBIENT_LAND("entity.turtle.ambient_land"),
+ ENTITY_TURTLE_DEATH("entity.turtle.death"),
+ ENTITY_TURTLE_DEATH_BABY("entity.turtle.death_baby"),
+ ENTITY_TURTLE_EGG_BREAK("entity.turtle.egg_break"),
+ ENTITY_TURTLE_EGG_CRACK("entity.turtle.egg_crack"),
+ ENTITY_TURTLE_EGG_HATCH("entity.turtle.egg_hatch"),
+ ENTITY_TURTLE_HURT("entity.turtle.hurt"),
+ ENTITY_TURTLE_HURT_BABY("entity.turtle.hurt_baby"),
+ ENTITY_TURTLE_LAY_EGG("entity.turtle.lay_egg"),
+ ENTITY_TURTLE_SHAMBLE("entity.turtle.shamble"),
+ ENTITY_TURTLE_SHAMBLE_BABY("entity.turtle.shamble_baby"),
+ ENTITY_TURTLE_SWIM("entity.turtle.swim"),
ENTITY_VEX_AMBIENT("entity.vex.ambient"),
ENTITY_VEX_CHARGE("entity.vex.charge"),
ENTITY_VEX_DEATH("entity.vex.death"),
@@ -460,11 +558,11 @@ public enum CraftSound {
ENTITY_VILLAGER_DEATH("entity.villager.death"),
ENTITY_VILLAGER_HURT("entity.villager.hurt"),
ENTITY_VILLAGER_NO("entity.villager.no"),
- ENTITY_VILLAGER_TRADING("entity.villager.trading"),
+ ENTITY_VILLAGER_TRADE("entity.villager.trade"),
ENTITY_VILLAGER_YES("entity.villager.yes"),
- ENTITY_VINDICATION_ILLAGER_AMBIENT("entity.vindication_illager.ambient"),
- ENTITY_VINDICATION_ILLAGER_DEATH("entity.vindication_illager.death"),
- ENTITY_VINDICATION_ILLAGER_HURT("entity.vindication_illager.hurt"),
+ ENTITY_VINDICATOR_AMBIENT("entity.vindicator.ambient"),
+ ENTITY_VINDICATOR_DEATH("entity.vindicator.death"),
+ ENTITY_VINDICATOR_HURT("entity.vindicator.hurt"),
ENTITY_WITCH_AMBIENT("entity.witch.ambient"),
ENTITY_WITCH_DEATH("entity.witch.death"),
ENTITY_WITCH_DRINK("entity.witch.drink"),
@@ -490,19 +588,21 @@ public enum CraftSound {
ENTITY_WOLF_STEP("entity.wolf.step"),
ENTITY_WOLF_WHINE("entity.wolf.whine"),
ENTITY_ZOMBIE_AMBIENT("entity.zombie.ambient"),
- ENTITY_ZOMBIE_ATTACK_DOOR_WOOD("entity.zombie.attack_door_wood"),
ENTITY_ZOMBIE_ATTACK_IRON_DOOR("entity.zombie.attack_iron_door"),
- ENTITY_ZOMBIE_BREAK_DOOR_WOOD("entity.zombie.break_door_wood"),
+ ENTITY_ZOMBIE_ATTACK_WOODEN_DOOR("entity.zombie.attack_wooden_door"),
+ ENTITY_ZOMBIE_BREAK_WOODEN_DOOR("entity.zombie.break_wooden_door"),
+ ENTITY_ZOMBIE_CONVERTED_TO_DROWNED("entity.zombie.converted_to_drowned"),
ENTITY_ZOMBIE_DEATH("entity.zombie.death"),
+ ENTITY_ZOMBIE_DESTROY_EGG("entity.zombie.destroy_egg"),
ENTITY_ZOMBIE_HORSE_AMBIENT("entity.zombie_horse.ambient"),
ENTITY_ZOMBIE_HORSE_DEATH("entity.zombie_horse.death"),
ENTITY_ZOMBIE_HORSE_HURT("entity.zombie_horse.hurt"),
ENTITY_ZOMBIE_HURT("entity.zombie.hurt"),
ENTITY_ZOMBIE_INFECT("entity.zombie.infect"),
- ENTITY_ZOMBIE_PIG_AMBIENT("entity.zombie_pig.ambient"),
- ENTITY_ZOMBIE_PIG_ANGRY("entity.zombie_pig.angry"),
- ENTITY_ZOMBIE_PIG_DEATH("entity.zombie_pig.death"),
- ENTITY_ZOMBIE_PIG_HURT("entity.zombie_pig.hurt"),
+ ENTITY_ZOMBIE_PIGMAN_AMBIENT("entity.zombie_pigman.ambient"),
+ ENTITY_ZOMBIE_PIGMAN_ANGRY("entity.zombie_pigman.angry"),
+ ENTITY_ZOMBIE_PIGMAN_DEATH("entity.zombie_pigman.death"),
+ ENTITY_ZOMBIE_PIGMAN_HURT("entity.zombie_pigman.hurt"),
ENTITY_ZOMBIE_STEP("entity.zombie.step"),
ENTITY_ZOMBIE_VILLAGER_AMBIENT("entity.zombie_villager.ambient"),
ENTITY_ZOMBIE_VILLAGER_CONVERTED("entity.zombie_villager.converted"),
@@ -517,12 +617,16 @@ public enum CraftSound {
ITEM_ARMOR_EQUIP_GOLD("item.armor.equip_gold"),
ITEM_ARMOR_EQUIP_IRON("item.armor.equip_iron"),
ITEM_ARMOR_EQUIP_LEATHER("item.armor.equip_leather"),
+ ITEM_ARMOR_EQUIP_TURTLE("item.armor.equip_turtle"),
+ ITEM_AXE_STRIP("item.axe.strip"),
ITEM_BOTTLE_EMPTY("item.bottle.empty"),
ITEM_BOTTLE_FILL("item.bottle.fill"),
ITEM_BOTTLE_FILL_DRAGONBREATH("item.bottle.fill_dragonbreath"),
ITEM_BUCKET_EMPTY("item.bucket.empty"),
+ ITEM_BUCKET_EMPTY_FISH("item.bucket.empty_fish"),
ITEM_BUCKET_EMPTY_LAVA("item.bucket.empty_lava"),
ITEM_BUCKET_FILL("item.bucket.fill"),
+ ITEM_BUCKET_FILL_FISH("item.bucket.fill_fish"),
ITEM_BUCKET_FILL_LAVA("item.bucket.fill_lava"),
ITEM_CHORUS_FRUIT_TELEPORT("item.chorus_fruit.teleport"),
ITEM_ELYTRA_FLYING("item.elytra.flying"),
@@ -533,25 +637,34 @@ public enum CraftSound {
ITEM_SHIELD_BREAK("item.shield.break"),
ITEM_SHOVEL_FLATTEN("item.shovel.flatten"),
ITEM_TOTEM_USE("item.totem.use"),
+ ITEM_TRIDENT_HIT("item.trident.hit"),
+ ITEM_TRIDENT_HIT_GROUND("item.trident.hit_ground"),
+ ITEM_TRIDENT_RETURN("item.trident.return"),
+ ITEM_TRIDENT_RIPTIDE_1("item.trident.riptide_1"),
+ ITEM_TRIDENT_RIPTIDE_2("item.trident.riptide_2"),
+ ITEM_TRIDENT_RIPTIDE_3("item.trident.riptide_3"),
+ ITEM_TRIDENT_THROW("item.trident.throw"),
+ ITEM_TRIDENT_THUNDER("item.trident.thunder"),
MUSIC_CREATIVE("music.creative"),
MUSIC_CREDITS("music.credits"),
+ MUSIC_DISC_11("music_disc.11"),
+ MUSIC_DISC_13("music_disc.13"),
+ MUSIC_DISC_BLOCKS("music_disc.blocks"),
+ MUSIC_DISC_CAT("music_disc.cat"),
+ MUSIC_DISC_CHIRP("music_disc.chirp"),
+ MUSIC_DISC_FAR("music_disc.far"),
+ MUSIC_DISC_MALL("music_disc.mall"),
+ MUSIC_DISC_MELLOHI("music_disc.mellohi"),
+ MUSIC_DISC_STAL("music_disc.stal"),
+ MUSIC_DISC_STRAD("music_disc.strad"),
+ MUSIC_DISC_WAIT("music_disc.wait"),
+ MUSIC_DISC_WARD("music_disc.ward"),
MUSIC_DRAGON("music.dragon"),
MUSIC_END("music.end"),
MUSIC_GAME("music.game"),
MUSIC_MENU("music.menu"),
MUSIC_NETHER("music.nether"),
- RECORD_11("record.11"),
- RECORD_13("record.13"),
- RECORD_BLOCKS("record.blocks"),
- RECORD_CAT("record.cat"),
- RECORD_CHIRP("record.chirp"),
- RECORD_FAR("record.far"),
- RECORD_MALL("record.mall"),
- RECORD_MELLOHI("record.mellohi"),
- RECORD_STAL("record.stal"),
- RECORD_STRAD("record.strad"),
- RECORD_WAIT("record.wait"),
- RECORD_WARD("record.ward"),
+ MUSIC_UNDER_WATER("music.under_water"),
UI_BUTTON_CLICK("ui.button.click"),
UI_TOAST_CHALLENGE_COMPLETE("ui.toast.challenge_complete"),
UI_TOAST_IN("ui.toast.in"),
diff --git a/src/main/java/org/bukkit/craftbukkit/CraftStatistic.java b/src/main/java/org/bukkit/craftbukkit/CraftStatistic.java
index 5c069586..b07b3680 100644
--- a/src/main/java/org/bukkit/craftbukkit/CraftStatistic.java
+++ b/src/main/java/org/bukkit/craftbukkit/CraftStatistic.java
@@ -1,94 +1,141 @@
package org.bukkit.craftbukkit;
-import net.minecraft.server.EntityTypes;
-import net.minecraft.server.EntityTypes.MonsterEggInfo;
import net.minecraft.server.StatisticList;
import org.bukkit.Statistic;
import org.bukkit.Material;
import org.bukkit.entity.EntityType;
-import com.google.common.base.CaseFormat;
+import com.google.common.base.Preconditions;
import com.google.common.collect.BiMap;
import com.google.common.collect.ImmutableBiMap;
import net.minecraft.server.Block;
+import net.minecraft.server.EntityTypes;
import net.minecraft.server.Item;
import net.minecraft.server.MinecraftKey;
+import net.minecraft.server.RegistryMaterials;
import org.bukkit.craftbukkit.util.CraftMagicNumbers;
-public class CraftStatistic {
- private static final BiMap<String, org.bukkit.Statistic> statistics;
+public enum CraftStatistic {
+ DAMAGE_DEALT("damage_dealt"),
+ DAMAGE_TAKEN("damage_taken"),
+ DEATHS("deaths"),
+ MOB_KILLS("mob_kills"),
+ PLAYER_KILLS("player_kills"),
+ FISH_CAUGHT("fish_caught"),
+ ANIMALS_BRED("animals_bred"),
+ LEAVE_GAME("leave_game"),
+ JUMP("jump"),
+ DROP_COUNT("drop"),
+ DROP("dropped"),
+ PICKUP("picked_up"),
+ PLAY_ONE_MINUTE("play_one_minute"),
+ WALK_ONE_CM("walk_one_cm"),
+ WALK_ON_WATER_ONE_CM("walk_on_water_one_cm"),
+ FALL_ONE_CM("fall_one_cm"),
+ SNEAK_TIME("sneak_time"),
+ CLIMB_ONE_CM("climb_one_cm"),
+ FLY_ONE_CM("fly_one_cm"),
+ WALK_UNDER_WATER_ONE_CM("walk_under_water_one_cm"),
+ MINECART_ONE_CM("minecart_one_cm"),
+ BOAT_ONE_CM("boat_one_cm"),
+ PIG_ONE_CM("pig_one_cm"),
+ HORSE_ONE_CM("horse_one_cm"),
+ SPRINT_ONE_CM("sprint_one_cm"),
+ CROUCH_ONE_CM("crouch_one_cm"),
+ AVIATE_ONE_CM("aviate_one_cm"),
+ MINE_BLOCK("mined"),
+ USE_ITEM("used"),
+ BREAK_ITEM("broken"),
+ CRAFT_ITEM("crafted"),
+ KILL_ENTITY("killed"),
+ ENTITY_KILLED_BY("killed_by"),
+ TIME_SINCE_DEATH("time_since_death"),
+ TALKED_TO_VILLAGER("talked_to_villager"),
+ TRADED_WITH_VILLAGER("traded_with_villager"),
+ CAKE_SLICES_EATEN("eat_cake_slice"),
+ CAULDRON_FILLED("fill_cauldron"),
+ CAULDRON_USED("use_cauldron"),
+ ARMOR_CLEANED("clean_armor"),
+ BANNER_CLEANED("clean_banner"),
+ BREWINGSTAND_INTERACTION("interact_with_brewingstand"),
+ BEACON_INTERACTION("interact_with_beacon"),
+ DROPPER_INSPECTED("inspect_dropper"),
+ HOPPER_INSPECTED("inspect_hopper"),
+ DISPENSER_INSPECTED("inspect_dispenser"),
+ NOTEBLOCK_PLAYED("play_noteblock"),
+ NOTEBLOCK_TUNED("tune_noteblock"),
+ FLOWER_POTTED("pot_flower"),
+ TRAPPED_CHEST_TRIGGERED("trigger_trapped_chest"),
+ ENDERCHEST_OPENED("open_enderchest"),
+ ITEM_ENCHANTED("enchant_item"),
+ RECORD_PLAYED("play_record"),
+ FURNACE_INTERACTION("interact_with_furnace"),
+ CRAFTING_TABLE_INTERACTION("interact_with_crafting_table"),
+ CHEST_OPENED("open_chest"),
+ SLEEP_IN_BED("sleep_in_bed"),
+ SHULKER_BOX_OPENED("open_shulker_box"),
+ TIME_SINCE_REST("time_since_rest"),
+ SWIM_ONE_CM("swim_one_cm");
+ private final MinecraftKey minecraftKey;
+ private final org.bukkit.Statistic bukkit;
+ private static final BiMap<MinecraftKey, org.bukkit.Statistic> statistics;
static {
- ImmutableBiMap.Builder<String, org.bukkit.Statistic> statisticBuilder = ImmutableBiMap.<String, org.bukkit.Statistic>builder();
- for (Statistic statistic : Statistic.values()) {
- if (statistic == Statistic.PLAY_ONE_TICK) {
- statisticBuilder.put("stat.playOneMinute", statistic);
- } else {
- statisticBuilder.put("stat." + CaseFormat.UPPER_UNDERSCORE.to(CaseFormat.LOWER_CAMEL, statistic.name()), statistic);
- }
+ ImmutableBiMap.Builder<MinecraftKey, org.bukkit.Statistic> statisticBuilder = ImmutableBiMap.builder();
+ for (CraftStatistic statistic : CraftStatistic.values()) {
+ statisticBuilder.put(statistic.minecraftKey, statistic.bukkit);
}
statistics = statisticBuilder.build();
}
- private CraftStatistic() {}
+ private CraftStatistic(String minecraftKey) {
+ this.minecraftKey = new MinecraftKey(minecraftKey);
- public static org.bukkit.Statistic getBukkitStatistic(net.minecraft.server.Statistic statistic) {
- return getBukkitStatisticByName(statistic.name);
+ this.bukkit = org.bukkit.Statistic.valueOf(this.name());
+ Preconditions.checkState(bukkit != null, "Bukkit statistic %s does not exist", this.name());
}
- public static org.bukkit.Statistic getBukkitStatisticByName(String name) {
- if (name.startsWith("stat.killEntity.")) {
- name = "stat.killEntity";
- }
- if (name.startsWith("stat.entityKilledBy.")) {
- name = "stat.entityKilledBy";
- }
- if (name.startsWith("stat.breakItem.")) {
- name = "stat.breakItem";
- }
- if (name.startsWith("stat.useItem.")) {
- name = "stat.useItem";
- }
- if (name.startsWith("stat.mineBlock.")) {
- name = "stat.mineBlock";
- }
- if (name.startsWith("stat.craftItem.")) {
- name = "stat.craftItem";
- }
- if (name.startsWith("stat.drop.")) {
- name = "stat.drop";
- }
- if (name.startsWith("stat.pickup.")) {
- name = "stat.pickup";
+ public static org.bukkit.Statistic getBukkitStatistic(net.minecraft.server.Statistic<?> statistic) {
+ RegistryMaterials statRegistry = statistic.a().a();
+ MinecraftKey nmsKey = StatisticList.REGISTRY.b(statistic.a());
+
+ if (statRegistry == StatisticList.REGISTRY_CUSTOM) {
+ nmsKey = (MinecraftKey) statistic.b();
}
- return statistics.get(name);
+
+ return statistics.get(nmsKey);
}
- public static net.minecraft.server.Statistic getNMSStatistic(org.bukkit.Statistic statistic) {
- return StatisticList.getStatistic(statistics.inverse().get(statistic));
+ public static net.minecraft.server.Statistic getNMSStatistic(org.bukkit.Statistic bukkit) {
+ Preconditions.checkArgument(bukkit.getType() == Statistic.Type.UNTYPED, "This method only accepts untyped statistics");
+
+ net.minecraft.server.Statistic<MinecraftKey> nms = StatisticList.CUSTOM.b(statistics.inverse().get(bukkit));
+ Preconditions.checkArgument(nms != null, "NMS Statistic %s does not exist", bukkit);
+
+ return nms;
}
public static net.minecraft.server.Statistic getMaterialStatistic(org.bukkit.Statistic stat, Material material) {
try {
if (stat == Statistic.MINE_BLOCK) {
- return StatisticList.a(CraftMagicNumbers.getBlock(material)); // PAIL: getMineBlockStatistic
+ return StatisticList.BLOCK_MINED.b(CraftMagicNumbers.getBlock(material));
}
if (stat == Statistic.CRAFT_ITEM) {
- return StatisticList.a(CraftMagicNumbers.getItem(material)); // PAIL: getCraftItemStatistic
+ return StatisticList.ITEM_CRAFTED.b(CraftMagicNumbers.getItem(material));
}
if (stat == Statistic.USE_ITEM) {
- return StatisticList.b(CraftMagicNumbers.getItem(material)); // PAIL: getUseItemStatistic
+ return StatisticList.ITEM_USED.b(CraftMagicNumbers.getItem(material));
}
if (stat == Statistic.BREAK_ITEM) {
- return StatisticList.c(CraftMagicNumbers.getItem(material)); // PAIL: getBreakItemStatistic
+ return StatisticList.ITEM_BROKEN.b(CraftMagicNumbers.getItem(material));
}
if (stat == Statistic.PICKUP) {
- return StatisticList.d(CraftMagicNumbers.getItem(material)); // PAIL: getPickupStatistic
+ return StatisticList.ITEM_PICKED_UP.b(CraftMagicNumbers.getItem(material));
}
if (stat == Statistic.DROP) {
- return StatisticList.e(CraftMagicNumbers.getItem(material)); // PAIL: getDropItemStatistic
+ return StatisticList.ITEM_DROPPED.b(CraftMagicNumbers.getItem(material));
}
} catch (ArrayIndexOutOfBoundsException e) {
return null;
@@ -97,39 +144,31 @@ public class CraftStatistic {
}
public static net.minecraft.server.Statistic getEntityStatistic(org.bukkit.Statistic stat, EntityType entity) {
- MonsterEggInfo monsteregginfo = (MonsterEggInfo) EntityTypes.eggInfo.get(new MinecraftKey(entity.getName()));
+ if (entity.getName() != null) {
+ EntityTypes<?> nmsEntity = EntityTypes.REGISTRY.get(new MinecraftKey(entity.getName()));
- if (monsteregginfo != null) {
if (stat == org.bukkit.Statistic.KILL_ENTITY) {
- return monsteregginfo.killEntityStatistic;
+ return net.minecraft.server.StatisticList.ENTITY_KILLED.b(nmsEntity);
}
if (stat == org.bukkit.Statistic.ENTITY_KILLED_BY) {
- return monsteregginfo.killedByEntityStatistic;
+ return net.minecraft.server.StatisticList.ENTITY_KILLED_BY.b(nmsEntity);
}
}
return null;
}
- public static EntityType getEntityTypeFromStatistic(net.minecraft.server.Statistic statistic) {
- String statisticString = statistic.name;
- return EntityType.fromName(statisticString.substring(statisticString.lastIndexOf(".") + 1));
+ public static EntityType getEntityTypeFromStatistic(net.minecraft.server.Statistic<EntityTypes<?>> statistic) {
+ MinecraftKey name = EntityTypes.getName(statistic.b());
+ return EntityType.fromName(name.getKey());
}
- public static Material getMaterialFromStatistic(net.minecraft.server.Statistic statistic) {
- String statisticString = statistic.name;
- 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));
+ public static Material getMaterialFromStatistic(net.minecraft.server.Statistic<?> statistic) {
+ if (statistic.b() instanceof Item) {
+ return CraftMagicNumbers.getMaterial((Item) statistic.b());
}
- Block block = (Block) Block.REGISTRY.get(new MinecraftKey(val));
- if (block != null) {
- return Material.getMaterial(Block.getId(block));
- }
- try {
- return Material.getMaterial(Integer.parseInt(val));
- } catch (NumberFormatException e) {
- return null;
+ if (statistic.b() instanceof Block) {
+ return CraftMagicNumbers.getMaterial((Block) statistic.b());
}
+ return null;
}
}
diff --git a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java
index 8f6653f7..162c79e8 100644
--- a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java
+++ b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java
@@ -1,6 +1,7 @@
package org.bukkit.craftbukkit;
import com.google.common.base.Preconditions;
+import com.google.common.util.concurrent.Futures;
import java.io.File;
import java.util.ArrayList;
import java.util.Collection;
@@ -31,8 +32,10 @@ import org.bukkit.block.Biome;
import org.bukkit.block.Block;
import org.bukkit.block.BlockFace;
import org.bukkit.block.BlockState;
+import org.bukkit.block.data.BlockData;
import org.bukkit.craftbukkit.block.CraftBlock;
import org.bukkit.craftbukkit.block.CraftBlockState;
+import org.bukkit.craftbukkit.block.data.CraftBlockData;
import org.bukkit.craftbukkit.entity.*;
import org.bukkit.craftbukkit.inventory.CraftItemStack;
import org.bukkit.craftbukkit.metadata.BlockMetadataStore;
@@ -92,11 +95,7 @@ public class CraftWorld implements World {
}
public Block getBlockAt(int x, int y, int z) {
- return getChunkAt(x >> 4, z >> 4).getBlock(x & 0xF, y, z & 0xF);
- }
-
- public int getBlockTypeIdAt(int x, int y, int z) {
- return CraftMagicNumbers.getId(world.getType(new BlockPosition(x, y, z)).getBlock());
+ return CraftBlock.at(world, new BlockPosition(x, y, z));
}
public int getHighestBlockYAt(int x, int z) {
@@ -104,7 +103,7 @@ public class CraftWorld implements World {
loadChunk(x >> 4, z >> 4);
}
- return world.getHighestBlockYAt(new BlockPosition(x, 0, z)).getY();
+ return world.getHighestBlockYAt(HeightMap.Type.LIGHT_BLOCKING, new BlockPosition(x, 0, z)).getY();
}
public Location getSpawnLocation() {
@@ -219,7 +218,7 @@ public class CraftWorld implements World {
net.minecraft.server.Chunk chunk = null;
- chunk = world.getChunkProviderServer().chunkGenerator.getOrCreateChunk(x, z);
+ chunk = Futures.getUnchecked(world.getChunkProviderServer().generateChunk(x, z));
PlayerChunk playerChunk = world.getPlayerChunkMap().getChunk(x, z);
if (playerChunk != null) {
playerChunk.chunk = chunk;
@@ -229,7 +228,6 @@ public class CraftWorld implements World {
world.getChunkProviderServer().chunks.put(chunkKey, chunk);
chunk.addEntities();
- chunk.loadNearby(world.getChunkProviderServer(), world.getChunkProviderServer().chunkGenerator, true);
refreshChunk(x, z);
}
@@ -286,7 +284,6 @@ public class CraftWorld implements World {
public org.bukkit.entity.Item dropItem(Location loc, ItemStack item) {
Validate.notNull(item, "Cannot drop a Null item.");
- Validate.isTrue(item.getTypeId() != 0, "Cannot drop AIR.");
EntityItem entity = new EntityItem(world, loc.getX(), loc.getY(), loc.getZ(), CraftItemStack.asNMSCopy(item));
entity.pickupDelay = 10;
world.addEntity(entity, SpawnReason.CUSTOM);
@@ -346,6 +343,8 @@ public class CraftWorld implements World {
((EntityTippedArrow) arrow).setType(CraftPotionUtil.fromBukkit(new PotionData(PotionType.WATER, false, false)));
} else if (SpectralArrow.class.isAssignableFrom(clazz)) {
arrow = new EntitySpectralArrow(world);
+ } else if (Trident.class.isAssignableFrom(clazz)){
+ arrow = new EntityThrownTrident(world);
} else {
arrow = new EntityTippedArrow(world);
}
@@ -390,30 +389,22 @@ public class CraftWorld implements World {
gen = new WorldGenTaiga1();
break;
case JUNGLE:
- IBlockData iblockdata1 = Blocks.LOG.getBlockData().set(BlockLog1.VARIANT, BlockWood.EnumLogVariant.JUNGLE);
- IBlockData iblockdata2 = Blocks.LEAVES.getBlockData().set(BlockLeaves1.VARIANT, BlockWood.EnumLogVariant.JUNGLE).set(BlockLeaves.CHECK_DECAY, Boolean.valueOf(false));
- gen = new WorldGenJungleTree(true, 10, 20, iblockdata1, iblockdata2); // Magic values as in BlockSapling
+ gen = new WorldGenJungleTree(true, 10, 20, Blocks.JUNGLE_LOG.getBlockData(), Blocks.JUNGLE_LEAVES.getBlockData());
break;
case SMALL_JUNGLE:
- iblockdata1 = Blocks.LOG.getBlockData().set(BlockLog1.VARIANT, BlockWood.EnumLogVariant.JUNGLE);
- iblockdata2 = Blocks.LEAVES.getBlockData().set(BlockLeaves1.VARIANT, BlockWood.EnumLogVariant.JUNGLE).set(BlockLeaves.CHECK_DECAY, Boolean.valueOf(false));
- gen = new WorldGenTrees(true, 4 + rand.nextInt(7), iblockdata1, iblockdata2, false);
+ gen = new WorldGenTrees(true, 4 + rand.nextInt(7), Blocks.JUNGLE_LOG.getBlockData(), Blocks.JUNGLE_LEAVES.getBlockData(), false);
break;
case COCOA_TREE:
- iblockdata1 = Blocks.LOG.getBlockData().set(BlockLog1.VARIANT, BlockWood.EnumLogVariant.JUNGLE);
- iblockdata2 = Blocks.LEAVES.getBlockData().set(BlockLeaves1.VARIANT, BlockWood.EnumLogVariant.JUNGLE).set(BlockLeaves.CHECK_DECAY, Boolean.valueOf(false));
- gen = new WorldGenTrees(true, 4 + rand.nextInt(7), iblockdata1, iblockdata2, true);
+ gen = new WorldGenJungleTree(true, 10, 20, Blocks.JUNGLE_LOG.getBlockData(), Blocks.JUNGLE_LEAVES.getBlockData());
break;
case JUNGLE_BUSH:
- iblockdata1 = Blocks.LOG.getBlockData().set(BlockLog1.VARIANT, BlockWood.EnumLogVariant.JUNGLE);
- iblockdata2 = Blocks.LEAVES.getBlockData().set(BlockLeaves1.VARIANT, BlockWood.EnumLogVariant.OAK).set(BlockLeaves.CHECK_DECAY, Boolean.valueOf(false));
- gen = new WorldGenGroundBush(iblockdata1, iblockdata2);
+ gen = new WorldGenGroundBush(Blocks.JUNGLE_LOG.getBlockData(), Blocks.OAK_LEAVES.getBlockData());
break;
case RED_MUSHROOM:
- gen = new WorldGenHugeMushroom(Blocks.RED_MUSHROOM_BLOCK);
+ gen = new WorldGenHugeMushroomRed();
break;
case BROWN_MUSHROOM:
- gen = new WorldGenHugeMushroom(Blocks.BROWN_MUSHROOM_BLOCK);
+ gen = new WorldGenHugeMushroomBrown();
break;
case SWAMP:
gen = new WorldGenSwampTree();
@@ -431,7 +422,7 @@ public class CraftWorld implements World {
gen = new WorldGenForest(true, true);
break;
case CHORUS_PLANT:
- BlockChorusFlower.a(world, pos, rand, 8);
+ ((BlockChorusFlower) Blocks.CHORUS_FLOWER).a(world, pos, rand, 8);
return true;
case TREE:
default:
@@ -439,7 +430,7 @@ public class CraftWorld implements World {
break;
}
- return gen.generate(world, rand, pos);
+ return gen.generate(world, world.worldProvider.getChunkGenerator(), rand, pos, new WorldGenFeatureEmptyConfiguration());
}
public boolean generateTree(Location loc, TreeType type, BlockChangeDelegate delegate) {
@@ -455,12 +446,10 @@ public class CraftWorld implements World {
int z = blockstate.getZ();
BlockPosition position = new BlockPosition(x, y, z);
net.minecraft.server.IBlockData oldBlock = world.getType(position);
- int typeId = blockstate.getTypeId();
- int data = blockstate.getRawData();
- int flag = ((CraftBlockState)blockstate).getFlag();
- delegate.setTypeIdAndData(x, y, z, typeId, data);
+ int flag = ((CraftBlockState) blockstate).getFlag();
+ delegate.setBlockData(x, y, z, blockstate.getBlockData());
net.minecraft.server.IBlockData newBlock = world.getType(position);
- world.notifyAndUpdatePhysics(position, null, oldBlock, newBlock, flag);
+ world.notifyAndUpdatePhysics(position, null, oldBlock, newBlock, newBlock, flag);
}
world.capturedBlockStates.clear();
return true;
@@ -565,10 +554,6 @@ public class CraftWorld implements World {
return getBlockAt(location.getBlockX(), location.getBlockY(), location.getBlockZ());
}
- public int getBlockTypeIdAt(Location location) {
- return getBlockTypeIdAt(location.getBlockX(), location.getBlockY(), location.getBlockZ());
- }
-
public int getHighestBlockYAt(Location location) {
return getHighestBlockYAt(location.getBlockX(), location.getBlockZ());
}
@@ -603,8 +588,8 @@ public class CraftWorld implements World {
net.minecraft.server.Chunk chunk = this.world.getChunkAtWorldCoords(new BlockPosition(x, 0, z));
if (chunk != null) {
- byte[] biomevals = chunk.getBiomeIndex();
- biomevals[((z & 0xF) << 4) | (x & 0xF)] = (byte) BiomeBase.REGISTRY_ID.a(bb);
+ BiomeBase[] biomevals = chunk.getBiomeIndex();
+ biomevals[((z & 0xF) << 4) | (x & 0xF)] = bb;
chunk.markDirty(); // SPIGOT-2890
}
@@ -881,15 +866,23 @@ public class CraftWorld implements World {
Validate.notNull(material, "Material cannot be null");
Validate.isTrue(material.isBlock(), "Material must be a block");
- EntityFallingBlock entity = new EntityFallingBlock(world, location.getX(), location.getY(), location.getZ(), CraftMagicNumbers.getBlock(material).fromLegacyData(data));
+ EntityFallingBlock entity = new EntityFallingBlock(world, location.getX(), location.getY(), location.getZ(), CraftMagicNumbers.getBlock(material).getBlockData());
entity.ticksLived = 1;
world.addEntity(entity, SpawnReason.CUSTOM);
return (FallingBlock) entity.getBukkitEntity();
}
- public FallingBlock spawnFallingBlock(Location location, int blockId, byte blockData) throws IllegalArgumentException {
- return spawnFallingBlock(location, org.bukkit.Material.getMaterial(blockId), blockData);
+ @Override
+ public FallingBlock spawnFallingBlock(Location location, BlockData data) throws IllegalArgumentException {
+ Validate.notNull(location, "Location cannot be null");
+ Validate.notNull(data, "Material cannot be null");
+
+ EntityFallingBlock entity = new EntityFallingBlock(world, location.getX(), location.getY(), location.getZ(), ((CraftBlockData) data).getState());
+ entity.ticksLived = 1;
+
+ world.addEntity(entity, SpawnReason.CUSTOM);
+ return (FallingBlock) entity.getBukkitEntity();
}
@SuppressWarnings("unchecked")
@@ -923,6 +916,8 @@ public class CraftWorld implements World {
((EntityTippedArrow) entity).setType(CraftPotionUtil.fromBukkit(new PotionData(PotionType.WATER, false, false)));
} else if (SpectralArrow.class.isAssignableFrom(clazz)) {
entity = new EntitySpectralArrow(world);
+ } else if (Trident.class.isAssignableFrom(clazz)) {
+ entity = new EntityThrownTrident(world);
} else {
entity = new EntityTippedArrow(world);
}
@@ -1060,6 +1055,8 @@ public class CraftWorld implements World {
entity = new EntityZombieHusk(world);
} else if (ZombieVillager.class.isAssignableFrom(clazz)) {
entity = new EntityZombieVillager(world);
+ } else if (Drowned.class.isAssignableFrom(clazz)) {
+ entity = new EntityDrowned(world);
} else {
entity = new EntityZombie(world);
}
@@ -1111,6 +1108,22 @@ public class CraftWorld implements World {
} else if (Vindicator.class.isAssignableFrom(clazz)) {
entity = new EntityVindicator(world);
}
+ } else if (Turtle.class.isAssignableFrom(clazz)) {
+ entity = new EntityTurtle(world);
+ } else if (Phantom.class.isAssignableFrom(clazz)) {
+ entity = new EntityPhantom(world);
+ } else if (Fish.class.isAssignableFrom(clazz)) {
+ if (Cod.class.isAssignableFrom(clazz)) {
+ entity = new EntityCod(world);
+ } else if (PufferFish.class.isAssignableFrom(clazz)) {
+ entity = new EntityPufferFish(world);
+ } else if (Salmon.class.isAssignableFrom(clazz)) {
+ entity = new EntitySalmon(world);
+ } else if (TropicalFish.class.isAssignableFrom(clazz)) {
+ entity = new EntityTropicalFish(world);
+ }
+ } else if (Dolphin.class.isAssignableFrom(clazz)) {
+ entity = new EntityDolphin(world);
}
if (entity != null) {
@@ -1118,7 +1131,6 @@ public class CraftWorld implements World {
entity.setHeadRotation(yaw); // SPIGOT-3587
}
} else if (Hanging.class.isAssignableFrom(clazz)) {
- Block block = getBlockAt(location);
BlockFace face = BlockFace.SELF;
int width = 16; // 1 full block, also painting smallest size.
@@ -1135,8 +1147,8 @@ public class CraftWorld implements World {
BlockFace[] faces = new BlockFace[]{BlockFace.EAST, BlockFace.NORTH, BlockFace.WEST, BlockFace.SOUTH};
final BlockPosition pos = new BlockPosition((int) x, (int) y, (int) z);
for (BlockFace dir : faces) {
- net.minecraft.server.Block nmsBlock = CraftMagicNumbers.getBlock(block.getRelative(dir));
- if (nmsBlock.getBlockData().getMaterial().isBuildable() || BlockDiodeAbstract.isDiode(nmsBlock.getBlockData())) {
+ IBlockData nmsBlock = world.getType(pos.shift(CraftBlock.blockFaceToNotch(dir)));
+ if (nmsBlock.getMaterial().isBuildable() || BlockDiodeAbstract.isDiode(nmsBlock)) {
boolean taken = false;
AxisAlignedBB bb = EntityHanging.calculateBoundingBox(null, pos, CraftBlock.blockFaceToNotch(dir).opposite(), width, height);
List<net.minecraft.server.Entity> list = (List<net.minecraft.server.Entity>) world.getEntities(null, bb);
@@ -1207,7 +1219,7 @@ public class CraftWorld implements World {
Preconditions.checkArgument(entity != null, "Cannot spawn null entity");
if (entity instanceof EntityInsentient) {
- ((EntityInsentient) entity).prepare(getHandle().D(new BlockPosition(entity)), (GroupDataEntity) null);
+ ((EntityInsentient) entity).prepare(getHandle().getDamageScaler(new BlockPosition(entity)), (GroupDataEntity) null, null);
}
if (function != null) {
@@ -1428,12 +1440,18 @@ public class CraftWorld implements World {
double y = loc.getY();
double z = loc.getZ();
- PacketPlayOutCustomSoundEffect packet = new PacketPlayOutCustomSoundEffect(sound, SoundCategory.valueOf(category.name()), x, y, z, volume, pitch);
+ PacketPlayOutCustomSoundEffect packet = new PacketPlayOutCustomSoundEffect(new MinecraftKey(sound), SoundCategory.valueOf(category.name()), new Vec3D(x, y, z), volume, pitch);
world.getMinecraftServer().getPlayerList().sendPacketNearby(null, x, y, z, volume > 1.0F ? 16.0F * volume : 16.0D, this.world.dimension, packet);
}
public String getGameRuleValue(String rule) {
- return getHandle().getGameRules().get(rule);
+ // In method contract for some reason
+ if (rule == null) {
+ return null;
+ }
+
+ GameRules.GameRuleValue value = getHandle().getGameRules().get(rule);
+ return value != null ? value.a() : "";
}
public boolean setGameRuleValue(String rule, String value) {
@@ -1442,16 +1460,16 @@ public class CraftWorld implements World {
if (!isGameRule(rule)) return false;
- getHandle().getGameRules().set(rule, value);
+ getHandle().getGameRules().set(rule, value, getHandle().getMinecraftServer());
return true;
}
public String[] getGameRules() {
- return getHandle().getGameRules().getGameRules();
+ return GameRules.getGameRules().keySet().toArray(new String[GameRules.getGameRules().size()]);
}
public boolean isGameRule(String rule) {
- return getHandle().getGameRules().contains(rule);
+ return GameRules.getGameRules().containsKey(rule);
}
@Override
@@ -1525,14 +1543,11 @@ public class CraftWorld implements World {
}
getHandle().sendParticles(
null, // Sender
- CraftParticle.toNMS(particle), // Particle
- true, // Extended range
+ CraftParticle.toNMS(particle, data), // Particle
x, y, z, // Position
count, // Count
offsetX, offsetY, offsetZ, // Random offset
- extra, // Speed?
- CraftParticle.toData(particle, data)
-
+ extra // Speed?
);
}
diff --git a/src/main/java/org/bukkit/craftbukkit/Main.java b/src/main/java/org/bukkit/craftbukkit/Main.java
index f4e1ca79..e8bf55e8 100644
--- a/src/main/java/org/bukkit/craftbukkit/Main.java
+++ b/src/main/java/org/bukkit/craftbukkit/Main.java
@@ -145,6 +145,12 @@ public class Main {
return;
}
+ float javaVersion = Float.parseFloat(System.getProperty("java.class.version"));
+ if (javaVersion > 55.0) {
+ System.err.println("Unsupported Java detected (" + javaVersion + "). Only up to Java 11 is supported.");
+ return;
+ }
+
try {
// This trick bypasses Maven Shade's clever rewriting of our getProperty call when using String literals
String jline_UnsupportedTerminal = new String(new char[] {'j','l','i','n','e','.','U','n','s','u','p','p','o','r','t','e','d','T','e','r','m','i','n','a','l'});
@@ -169,11 +175,11 @@ public class Main {
useConsole = false;
}
- if (false && Main.class.getPackage().getImplementationVendor() != null && System.getProperty("IReallyKnowWhatIAmDoingISwear") == null) {
+ if (Main.class.getPackage().getImplementationVendor() != null && System.getProperty("IReallyKnowWhatIAmDoingISwear") == null) {
Date buildDate = new SimpleDateFormat("yyyyMMdd-HHmm").parse(Main.class.getPackage().getImplementationVendor());
Calendar deadline = Calendar.getInstance();
- deadline.add(Calendar.DAY_OF_YEAR, -14);
+ deadline.add(Calendar.DAY_OF_YEAR, -3);
if (buildDate.before(deadline.getTime())) {
System.err.println("*** Error, this build is outdated ***");
System.err.println("*** Please download a new build as per instructions from https://www.spigotmc.org/ ***");
@@ -182,6 +188,8 @@ public class Main {
}
}
+ System.err.println("*** WARNING: This is a development build. It is not meant for production server usage! Please keep backups and update frequently.");
+
System.out.println("Loading libraries, please wait...");
MinecraftServer.main(options);
} catch (Throwable t) {
diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftBanner.java b/src/main/java/org/bukkit/craftbukkit/block/CraftBanner.java
index e2c9a9b7..6672e804 100644
--- a/src/main/java/org/bukkit/craftbukkit/block/CraftBanner.java
+++ b/src/main/java/org/bukkit/craftbukkit/block/CraftBanner.java
@@ -30,7 +30,7 @@ public class CraftBanner extends CraftBlockEntityState<TileEntityBanner> impleme
public void load(TileEntityBanner banner) {
super.load(banner);
- base = DyeColor.getByDyeData((byte) banner.color.getInvColorIndex());
+ base = DyeColor.getByWoolData((byte) banner.color.getColorIndex());
patterns = new ArrayList<Pattern>();
if (banner.patterns != null) {
@@ -90,7 +90,7 @@ public class CraftBanner extends CraftBlockEntityState<TileEntityBanner> impleme
public void applyTo(TileEntityBanner banner) {
super.applyTo(banner);
- banner.color = EnumColor.fromInvColorIndex(base.getDyeData());
+ banner.color = EnumColor.fromColorIndex(base.getWoolData());
NBTTagList newPatterns = new NBTTagList();
diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftBeacon.java b/src/main/java/org/bukkit/craftbukkit/block/CraftBeacon.java
index afec900c..5b908d3b 100644
--- a/src/main/java/org/bukkit/craftbukkit/block/CraftBeacon.java
+++ b/src/main/java/org/bukkit/craftbukkit/block/CraftBeacon.java
@@ -10,6 +10,7 @@ import org.bukkit.Material;
import org.bukkit.block.Beacon;
import org.bukkit.block.Block;
import org.bukkit.craftbukkit.inventory.CraftInventoryBeacon;
+import org.bukkit.craftbukkit.util.CraftChatMessage;
import org.bukkit.entity.LivingEntity;
import org.bukkit.inventory.BeaconInventory;
import org.bukkit.potion.PotionEffect;
@@ -87,11 +88,11 @@ public class CraftBeacon extends CraftContainer<TileEntityBeacon> implements Bea
@Override
public String getCustomName() {
TileEntityBeacon beacon = this.getSnapshot();
- return beacon.hasCustomName() ? beacon.getName() : null;
+ return beacon.hasCustomName() ? CraftChatMessage.fromComponent(beacon.getCustomName()) : null;
}
@Override
public void setCustomName(String name) {
- this.getSnapshot().setCustomName(name);
+ this.getSnapshot().setCustomName(CraftChatMessage.fromStringOrNull(name));
}
}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftBed.java b/src/main/java/org/bukkit/craftbukkit/block/CraftBed.java
index 27756d85..e91497d8 100644
--- a/src/main/java/org/bukkit/craftbukkit/block/CraftBed.java
+++ b/src/main/java/org/bukkit/craftbukkit/block/CraftBed.java
@@ -10,8 +10,6 @@ import org.bukkit.block.Block;
public class CraftBed extends CraftBlockEntityState<TileEntityBed> implements Bed {
- private DyeColor color;
-
public CraftBed(Block block) {
super(block, TileEntityBed.class);
}
@@ -21,28 +19,47 @@ public class CraftBed extends CraftBlockEntityState<TileEntityBed> implements Be
}
@Override
- public void load(TileEntityBed bed) {
- super.load(bed);
-
- color = DyeColor.getByWoolData((byte) bed.a().getColorIndex());
- }
-
- @Override
public DyeColor getColor() {
- return color;
+ switch (getType()) {
+ case BLACK_BED:
+ return DyeColor.BLACK;
+ case BLUE_BED:
+ return DyeColor.BLUE;
+ case BROWN_BED:
+ return DyeColor.BROWN;
+ case CYAN_BED:
+ return DyeColor.CYAN;
+ case GRAY_BED:
+ return DyeColor.GRAY;
+ case GREEN_BED:
+ return DyeColor.GREEN;
+ case LIGHT_BLUE_BED:
+ return DyeColor.LIGHT_BLUE;
+ case LIGHT_GRAY_BED:
+ return DyeColor.SILVER;
+ case LIME_BED:
+ return DyeColor.LIME;
+ case MAGENTA_BED:
+ return DyeColor.MAGENTA;
+ case ORANGE_BED:
+ return DyeColor.ORANGE;
+ case PINK_BED:
+ return DyeColor.PINK;
+ case PURPLE_BED:
+ return DyeColor.PURPLE;
+ case RED_BED:
+ return DyeColor.RED;
+ case WHITE_BED:
+ return DyeColor.WHITE;
+ case YELLOW_BED:
+ return DyeColor.YELLOW;
+ default:
+ throw new IllegalArgumentException("Unknown DyeColor for " + getType());
+ }
}
@Override
public void setColor(DyeColor color) {
- Preconditions.checkArgument(color != null, "color");
-
- this.color = color;
- }
-
- @Override
- public void applyTo(TileEntityBed bed) {
- super.applyTo(bed);
-
- bed.a(EnumColor.fromColorIndex(color.getWoolData()));
+ throw new UnsupportedOperationException("Must set block type to appropriate bed colour");
}
}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftBlock.java b/src/main/java/org/bukkit/craftbukkit/block/CraftBlock.java
index 46670c34..bfed2d98 100644
--- a/src/main/java/org/bukkit/craftbukkit/block/CraftBlock.java
+++ b/src/main/java/org/bukkit/craftbukkit/block/CraftBlock.java
@@ -1,5 +1,6 @@
package org.bukkit.craftbukkit.block;
+import com.google.common.base.Preconditions;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
@@ -16,7 +17,10 @@ import org.bukkit.block.Block;
import org.bukkit.block.BlockFace;
import org.bukkit.block.BlockState;
import org.bukkit.block.PistonMoveReaction;
+import org.bukkit.block.data.BlockData;
import org.bukkit.craftbukkit.CraftChunk;
+import org.bukkit.craftbukkit.CraftWorld;
+import org.bukkit.craftbukkit.block.data.CraftBlockData;
import org.bukkit.craftbukkit.inventory.CraftItemStack;
import org.bukkit.craftbukkit.util.CraftMagicNumbers;
import org.bukkit.inventory.ItemStack;
@@ -25,40 +29,44 @@ import org.bukkit.plugin.Plugin;
import org.bukkit.util.BlockVector;
public class CraftBlock implements Block {
- private final CraftChunk chunk;
- private final int x;
- private final int y;
- private final int z;
+ private final net.minecraft.server.GeneratorAccess world;
+ private final BlockPosition position;
- public CraftBlock(CraftChunk chunk, int x, int y, int z) {
- this.x = x;
- this.y = y;
- this.z = z;
- this.chunk = chunk;
+ public CraftBlock(GeneratorAccess world, BlockPosition position) {
+ this.world = world;
+ this.position = position;
+ }
+
+ public static CraftBlock at(GeneratorAccess world, BlockPosition position) {
+ return new CraftBlock(world, position);
}
private net.minecraft.server.Block getNMSBlock() {
- return CraftMagicNumbers.getBlock(this); // TODO: UPDATE THIS
+ return getNMS().getBlock();
}
- private static net.minecraft.server.Block getNMSBlock(int type) {
- return CraftMagicNumbers.getBlock(type);
+ protected net.minecraft.server.IBlockData getNMS() {
+ return world.getType(position);
}
public World getWorld() {
- return chunk.getWorld();
+ return world.getMinecraftWorld().getWorld();
+ }
+
+ public CraftWorld getCraftWorld() {
+ return (CraftWorld) getWorld();
}
public Location getLocation() {
- return new Location(getWorld(), x, y, z);
+ return new Location(getWorld(), position.getX(), position.getY(), position.getZ());
}
public Location getLocation(Location loc) {
if (loc != null) {
loc.setWorld(getWorld());
- loc.setX(x);
- loc.setY(y);
- loc.setZ(z);
+ loc.setX(position.getX());
+ loc.setY(position.getY());
+ loc.setZ(position.getZ());
loc.setYaw(0);
loc.setPitch(0);
}
@@ -67,23 +75,23 @@ public class CraftBlock implements Block {
}
public BlockVector getVector() {
- return new BlockVector(x, y, z);
+ return new BlockVector(getX(), getY(), getZ());
}
public int getX() {
- return x;
+ return position.getX();
}
public int getY() {
- return y;
+ return position.getY();
}
public int getZ() {
- return z;
+ return position.getZ();
}
public Chunk getChunk() {
- return chunk;
+ return getWorld().getChunkAt(this);
}
public void setData(final byte data) {
@@ -99,19 +107,21 @@ public class CraftBlock implements Block {
}
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);
+ world.setTypeAndData(position, CraftMagicNumbers.getBlock(getType(), data), flag);
}
private IBlockData getData0() {
- return chunk.getHandle().getBlockData(new BlockPosition(x, y, z));
+ return world.getType(position);
}
public byte getData() {
- IBlockData blockData = chunk.getHandle().getBlockData(new BlockPosition(x, y, z));
- return (byte) blockData.getBlock().toLegacyData(blockData);
+ IBlockData blockData = world.getType(position);
+ return CraftMagicNumbers.toLegacyData(blockData);
+ }
+
+ @Override
+ public BlockData getBlockData() {
+ return CraftBlockData.fromData(getData0());
}
public void setType(final Material type) {
@@ -120,34 +130,36 @@ public class CraftBlock implements Block {
@Override
public void setType(Material type, boolean applyPhysics) {
- setTypeId(type.getId(), applyPhysics);
+ setTypeAndData(type, (byte) 0, applyPhysics);
}
- public boolean setTypeId(final int type) {
- return setTypeId(type, true);
+ @Override
+ public void setBlockData(BlockData data) {
+ setBlockData(data, true);
}
- public boolean setTypeId(final int type, final boolean applyPhysics) {
- net.minecraft.server.Block block = getNMSBlock(type);
- return setTypeIdAndData(type, (byte) block.toLegacyData(block.getBlockData()), applyPhysics);
+ @Override
+ public void setBlockData(BlockData data, boolean applyPhysics) {
+ setTypeAndData(((CraftBlockData) data).getState(), applyPhysics);
}
- 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);
+ public boolean setTypeAndData(final Material type, final byte data, final boolean applyPhysics) {
+ return setTypeAndData(CraftMagicNumbers.getBlock(type, data), applyPhysics);
+ }
+ public boolean setTypeAndData(final IBlockData blockData, final boolean applyPhysics) {
// SPIGOT-611: need to do this to prevent glitchiness. Easier to handle this here (like /setblock) than to fix weirdness in tile entity cleanup
- if (type != 0 && blockData.getBlock() instanceof BlockTileEntity && type != getTypeId()) {
- chunk.getHandle().getWorld().setTypeAndData(position, Blocks.AIR.getBlockData(), 0);
+ if (!blockData.isAir() && blockData.getBlock() instanceof BlockTileEntity && blockData.getBlock() != getNMSBlock()) {
+ world.setTypeAndData(position, Blocks.AIR.getBlockData(), 0);
}
if (applyPhysics) {
- return chunk.getHandle().getWorld().setTypeAndData(position, blockData, 3);
+ return world.setTypeAndData(position, blockData, 3);
} else {
- IBlockData old = chunk.getHandle().getBlockData(position);
- boolean success = chunk.getHandle().getWorld().setTypeAndData(position, blockData, 18); // NOTIFY | NO_OBSERVER
+ IBlockData old = world.getType(position);
+ boolean success = world.setTypeAndData(position, blockData, 18); // NOTIFY | NO_OBSERVER
if (success) {
- chunk.getHandle().getWorld().notify(
+ world.getMinecraftWorld().notify(
position,
old,
blockData,
@@ -159,25 +171,19 @@ public class CraftBlock implements Block {
}
public Material getType() {
- return Material.getMaterial(getTypeId());
- }
-
- @Deprecated
- @Override
- public int getTypeId() {
- return CraftMagicNumbers.getId(chunk.getHandle().getBlockData(new BlockPosition(this.x, this.y, this.z)).getBlock());
+ return CraftMagicNumbers.getMaterial(world.getType(position).getBlock());
}
public byte getLightLevel() {
- return (byte) chunk.getHandle().getWorld().getLightLevel(new BlockPosition(this.x, this.y, this.z));
+ return (byte) world.getMinecraftWorld().getLightLevel(position);
}
public byte getLightFromSky() {
- return (byte) chunk.getHandle().getWorld().getBrightness(EnumSkyBlock.SKY, new BlockPosition(this.x, this.y, this.z));
+ return (byte) world.getBrightness(EnumSkyBlock.SKY, position);
}
public byte getLightFromBlocks() {
- return (byte) chunk.getHandle().getWorld().getBrightness(EnumSkyBlock.BLOCK, new BlockPosition(this.x, this.y, this.z));
+ return (byte) world.getBrightness(EnumSkyBlock.BLOCK, position);
}
@@ -218,7 +224,7 @@ public class CraftBlock implements Block {
@Override
public String toString() {
- return "CraftBlock{" + "chunk=" + chunk + ",x=" + x + ",y=" + y + ",z=" + z + ",type=" + getType() + ",data=" + getData() + '}';
+ return "CraftBlock{pos=" + position + ",type=" + getType() + ",data=" + getData() + '}';
}
public static BlockFace notchToBlockFace(EnumDirection notch) {
@@ -265,13 +271,11 @@ public class CraftBlock implements Block {
switch (material) {
case SIGN:
- case SIGN_POST:
case WALL_SIGN:
return new CraftSign(this);
case CHEST:
case TRAPPED_CHEST:
return new CraftChest(this);
- case BURNING_FURNACE:
case FURNACE:
return new CraftFurnace(this);
case DISPENSER:
@@ -282,28 +286,65 @@ public class CraftBlock implements Block {
return new CraftEndGateway(this);
case HOPPER:
return new CraftHopper(this);
- case MOB_SPAWNER:
+ case SPAWNER:
return new CraftCreatureSpawner(this);
- case NOTE_BLOCK:
- return new CraftNoteBlock(this);
case JUKEBOX:
return new CraftJukebox(this);
case BREWING_STAND:
return new CraftBrewingStand(this);
- case SKULL:
+ case CREEPER_HEAD:
+ case CREEPER_WALL_HEAD:
+ case DRAGON_HEAD:
+ case DRAGON_WALL_HEAD:
+ case PISTON_HEAD:
+ case PLAYER_HEAD:
+ case PLAYER_WALL_HEAD:
+ case SKELETON_SKULL:
+ case SKELETON_WALL_SKULL:
+ case WITHER_SKELETON_SKULL:
+ case WITHER_SKELETON_WALL_SKULL:
+ case ZOMBIE_HEAD:
+ case ZOMBIE_WALL_HEAD:
return new CraftSkull(this);
- case COMMAND:
- case COMMAND_CHAIN:
- case COMMAND_REPEATING:
+ case COMMAND_BLOCK:
+ case CHAIN_COMMAND_BLOCK:
+ case REPEATING_COMMAND_BLOCK:
return new CraftCommandBlock(this);
case BEACON:
return new CraftBeacon(this);
- case BANNER:
- case WALL_BANNER:
- case STANDING_BANNER:
+ case BLACK_BANNER:
+ case BLACK_WALL_BANNER:
+ case BLUE_BANNER:
+ case BLUE_WALL_BANNER:
+ case BROWN_BANNER:
+ case BROWN_WALL_BANNER:
+ case CYAN_BANNER:
+ case CYAN_WALL_BANNER:
+ case GRAY_BANNER:
+ case GRAY_WALL_BANNER:
+ case GREEN_BANNER:
+ case GREEN_WALL_BANNER:
+ case LIGHT_BLUE_BANNER:
+ case LIGHT_BLUE_WALL_BANNER:
+ case LIGHT_GRAY_BANNER:
+ case LIGHT_GRAY_WALL_BANNER:
+ case LIME_BANNER:
+ case LIME_WALL_BANNER:
+ case MAGENTA_BANNER:
+ case MAGENTA_WALL_BANNER:
+ case ORANGE_BANNER:
+ case ORANGE_WALL_BANNER:
+ case PINK_BANNER:
+ case PINK_WALL_BANNER:
+ case PURPLE_BANNER:
+ case PURPLE_WALL_BANNER:
+ case RED_BANNER:
+ case RED_WALL_BANNER:
+ case WHITE_BANNER:
+ case WHITE_WALL_BANNER:
+ case YELLOW_BANNER:
+ case YELLOW_WALL_BANNER:
return new CraftBanner(this);
- case FLOWER_POT:
- return new CraftFlowerPot(this);
case STRUCTURE_BLOCK:
return new CraftStructureBlock(this);
case WHITE_SHULKER_BOX:
@@ -314,7 +355,7 @@ public class CraftBlock implements Block {
case LIME_SHULKER_BOX:
case PINK_SHULKER_BOX:
case GRAY_SHULKER_BOX:
- case SILVER_SHULKER_BOX:
+ case LIGHT_GRAY_SHULKER_BOX:
case CYAN_SHULKER_BOX:
case PURPLE_SHULKER_BOX:
case BLUE_SHULKER_BOX:
@@ -323,20 +364,35 @@ public class CraftBlock implements Block {
case RED_SHULKER_BOX:
case BLACK_SHULKER_BOX:
return new CraftShulkerBox(this);
- case ENCHANTMENT_TABLE:
+ case ENCHANTING_TABLE:
return new CraftEnchantingTable(this);
case ENDER_CHEST:
return new CraftEnderChest(this);
case DAYLIGHT_DETECTOR:
- case DAYLIGHT_DETECTOR_INVERTED:
return new CraftDaylightDetector(this);
- case REDSTONE_COMPARATOR_OFF:
- case REDSTONE_COMPARATOR_ON:
+ case COMPARATOR:
return new CraftComparator(this);
- case BED_BLOCK:
+ case BLACK_BED:
+ case BLUE_BED:
+ case BROWN_BED:
+ case CYAN_BED:
+ case GRAY_BED:
+ case GREEN_BED:
+ case LIGHT_BLUE_BED:
+ case LIGHT_GRAY_BED:
+ case LIME_BED:
+ case MAGENTA_BED:
+ case ORANGE_BED:
+ case PINK_BED:
+ case PURPLE_BED:
+ case RED_BED:
+ case WHITE_BED:
+ case YELLOW_BED:
return new CraftBed(this);
+ case CONDUIT:
+ return new CraftConduit(this);
default:
- TileEntity tileEntity = chunk.getCraftWorld().getTileEntityAt(x, y, z);
+ TileEntity tileEntity = world.getTileEntity(position);
if (tileEntity != null) {
// block with unhandled TileEntity:
return new CraftBlockEntityState<TileEntity>(this, (Class<TileEntity>) tileEntity.getClass());
@@ -348,11 +404,11 @@ public class CraftBlock implements Block {
}
public Biome getBiome() {
- return getWorld().getBiome(x, z);
+ return getWorld().getBiome(getX(), getZ());
}
public void setBiome(Biome bio) {
- getWorld().setBiome(x, z, bio);
+ getWorld().setBiome(getX(), getZ(), bio);
}
public static Biome biomeBaseToBiome(BiomeBase base) {
@@ -372,19 +428,19 @@ public class CraftBlock implements Block {
}
public double getTemperature() {
- return getWorld().getTemperature(x, z);
+ return getWorld().getTemperature(getX(), getZ());
}
public double getHumidity() {
- return getWorld().getHumidity(x, z);
+ return getWorld().getHumidity(getX(), getZ());
}
public boolean isBlockPowered() {
- return chunk.getHandle().getWorld().getBlockPower(new BlockPosition(x, y, z)) > 0;
+ return world.getMinecraftWorld().getBlockPower(position) > 0;
}
public boolean isBlockIndirectlyPowered() {
- return chunk.getHandle().getWorld().isBlockIndirectlyPowered(new BlockPosition(x, y, z));
+ return world.getMinecraftWorld().isBlockIndirectlyPowered(position);
}
@Override
@@ -393,20 +449,20 @@ public class CraftBlock implements Block {
if (!(o instanceof CraftBlock)) return false;
CraftBlock other = (CraftBlock) o;
- return this.x == other.x && this.y == other.y && this.z == other.z && this.getWorld().equals(other.getWorld());
+ return this.position.equals(other.position) && this.getWorld().equals(other.getWorld());
}
@Override
public int hashCode() {
- return this.y << 24 ^ this.x ^ this.z ^ this.getWorld().hashCode();
+ return this.position.hashCode() ^ this.getWorld().hashCode();
}
public boolean isBlockFacePowered(BlockFace face) {
- return chunk.getHandle().getWorld().isBlockFacePowered(new BlockPosition(x, y, z), blockFaceToNotch(face));
+ return world.getMinecraftWorld().isBlockFacePowered(position, blockFaceToNotch(face));
}
public boolean isBlockFaceIndirectlyPowered(BlockFace face) {
- int power = chunk.getHandle().getWorld().getBlockFacePower(new BlockPosition(x, y, z), blockFaceToNotch(face));
+ int power = world.getMinecraftWorld().getBlockFacePower(position, blockFaceToNotch(face));
Block relative = getRelative(face);
if (relative.getType() == Material.REDSTONE_WIRE) {
@@ -418,8 +474,11 @@ 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().getWorld();
+ BlockRedstoneWire wire = (BlockRedstoneWire) Blocks.REDSTONE_WIRE;
+ net.minecraft.server.World world = this.world.getMinecraftWorld();
+ int x = getX();
+ int y = getY();
+ int z = getZ();
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);
@@ -438,31 +497,30 @@ public class CraftBlock implements Block {
}
public boolean isLiquid() {
- return (getType() == Material.WATER) || (getType() == Material.STATIONARY_WATER) || (getType() == Material.LAVA) || (getType() == Material.STATIONARY_LAVA);
+ return (getType() == Material.WATER) || (getType() == Material.LAVA);
}
public PistonMoveReaction getPistonMoveReaction() {
- return PistonMoveReaction.getById(getNMSBlock().h(getNMSBlock().fromLegacyData(getData())).ordinal());
+ return PistonMoveReaction.getById(getNMS().getPushReaction().ordinal());
}
private boolean itemCausesDrops(ItemStack item) {
net.minecraft.server.Block block = this.getNMSBlock();
- net.minecraft.server.Item itemType = item != null ? net.minecraft.server.Item.getById(item.getTypeId()) : null;
+ net.minecraft.server.Item itemType = CraftMagicNumbers.getItem(item.getType());
return block != null && (block.getBlockData().getMaterial().isAlwaysDestroyable() || (itemType != null && itemType.canDestroySpecialBlock(block.getBlockData())));
}
public boolean breakNaturally() {
// Order matters here, need to drop before setting to air so skulls can get their data
net.minecraft.server.Block block = this.getNMSBlock();
- byte data = getData();
boolean result = false;
if (block != null && block != Blocks.AIR) {
- block.dropNaturally(chunk.getHandle().getWorld(), new BlockPosition(x, y, z), block.fromLegacyData(data), 1.0F, 0);
+ block.dropNaturally(getNMS(), world.getMinecraftWorld(), position, 1.0F, 0);
result = true;
}
- setTypeId(Material.AIR.getId());
+ setType(Material.AIR);
return result;
}
@@ -470,7 +528,7 @@ public class CraftBlock implements Block {
if (itemCausesDrops(item)) {
return breakNaturally();
} else {
- return setTypeId(Material.AIR.getId());
+ return setTypeAndData(Material.AIR, (byte) 0, true);
}
}
@@ -481,21 +539,20 @@ public class CraftBlock implements Block {
if (block != Blocks.AIR) {
IBlockData data = getData0();
// based on nms.Block.dropNaturally
- int count = block.getDropCount(0, chunk.getHandle().getWorld().random);
+ int count = block.getDropCount(data, 0, world.getMinecraftWorld(), position, world.getMinecraftWorld().random);
for (int i = 0; i < count; ++i) {
- Item item = block.getDropType(data, chunk.getHandle().getWorld().random, 0);
- if (item != Items.a) {
+ Item item = block.getDropType(data, world.getMinecraftWorld(), position, 0).getItem();
+ if (item != Items.AIR) {
// 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(data));
- TileEntitySkull tileentityskull = (TileEntitySkull) chunk.getHandle().getWorld().getTileEntity(new BlockPosition(x, y, z));
+ if (block instanceof BlockSkullAbstract) {
+ net.minecraft.server.ItemStack nmsStack = block.a((IBlockAccess) world, position, data);
+ TileEntitySkull tileentityskull = (TileEntitySkull) world.getTileEntity(position);
- if (tileentityskull.getSkullType() == 3 && tileentityskull.getGameProfile() != null) {
- nmsStack.setTag(new NBTTagCompound());
+ if ((block == Blocks.PLAYER_HEAD || block == Blocks.PLAYER_WALL_HEAD) && tileentityskull.getGameProfile() != null) {
NBTTagCompound nbttagcompound = new NBTTagCompound();
GameProfileSerializer.serialize(nbttagcompound, tileentityskull.getGameProfile());
- nmsStack.getTag().set("SkullOwner", nbttagcompound);
+ nmsStack.getOrCreateTag().set("SkullOwner", nbttagcompound);
}
drops.add(CraftItemStack.asBukkitCopy(nmsStack));
@@ -504,10 +561,10 @@ public class CraftBlock implements Block {
int age = (Integer) 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));
+ drops.add(new ItemStack(Material.COCOA_BEANS, 1));
}
} 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));
}
}
}
@@ -524,18 +581,18 @@ public class CraftBlock implements Block {
}
public void setMetadata(String metadataKey, MetadataValue newMetadataValue) {
- chunk.getCraftWorld().getBlockMetadata().setMetadata(this, metadataKey, newMetadataValue);
+ getCraftWorld().getBlockMetadata().setMetadata(this, metadataKey, newMetadataValue);
}
public List<MetadataValue> getMetadata(String metadataKey) {
- return chunk.getCraftWorld().getBlockMetadata().getMetadata(this, metadataKey);
+ return getCraftWorld().getBlockMetadata().getMetadata(this, metadataKey);
}
public boolean hasMetadata(String metadataKey) {
- return chunk.getCraftWorld().getBlockMetadata().hasMetadata(this, metadataKey);
+ return getCraftWorld().getBlockMetadata().hasMetadata(this, metadataKey);
}
public void removeMetadata(String metadataKey, Plugin owningPlugin) {
- chunk.getCraftWorld().getBlockMetadata().removeMetadata(this, metadataKey, owningPlugin);
+ getCraftWorld().getBlockMetadata().removeMetadata(this, metadataKey, owningPlugin);
}
}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftBlockEntityState.java b/src/main/java/org/bukkit/craftbukkit/block/CraftBlockEntityState.java
index 8328ed00..ac9b4297 100644
--- a/src/main/java/org/bukkit/craftbukkit/block/CraftBlockEntityState.java
+++ b/src/main/java/org/bukkit/craftbukkit/block/CraftBlockEntityState.java
@@ -3,6 +3,7 @@ package org.bukkit.craftbukkit.block;
import net.minecraft.server.BlockPosition;
import net.minecraft.server.NBTTagCompound;
import net.minecraft.server.TileEntity;
+import net.minecraft.server.World;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.craftbukkit.CraftWorld;
@@ -23,7 +24,7 @@ public class CraftBlockEntityState<T extends TileEntity> extends CraftBlockState
this.tileEntity = tileEntityClass.cast(world.getTileEntityAt(this.getX(), this.getY(), this.getZ()));
// copy tile entity data:
- this.snapshot = this.createSnapshot(tileEntity);
+ this.snapshot = this.createSnapshot(tileEntity, world.getHandle());
this.load(snapshot);
}
@@ -34,17 +35,17 @@ public class CraftBlockEntityState<T extends TileEntity> extends CraftBlockState
this.tileEntity = tileEntity;
// copy tile entity data:
- this.snapshot = this.createSnapshot(tileEntity);
+ this.snapshot = this.createSnapshot(tileEntity, null);
this.load(snapshot);
}
- private T createSnapshot(T tileEntity) {
+ private T createSnapshot(T tileEntity, World world) {
if (tileEntity == null) {
return null;
}
NBTTagCompound nbtTagCompound = tileEntity.save(new NBTTagCompound());
- T snapshot = (T) TileEntity.create(null, nbtTagCompound);
+ T snapshot = (T) TileEntity.create(nbtTagCompound, world);
return snapshot;
}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftBlockState.java b/src/main/java/org/bukkit/craftbukkit/block/CraftBlockState.java
index 2a1b731c..08f73c8f 100644
--- a/src/main/java/org/bukkit/craftbukkit/block/CraftBlockState.java
+++ b/src/main/java/org/bukkit/craftbukkit/block/CraftBlockState.java
@@ -7,8 +7,10 @@ import org.bukkit.Chunk;
import org.bukkit.Material;
import org.bukkit.World;
import org.bukkit.block.BlockState;
+import org.bukkit.block.data.BlockData;
import org.bukkit.craftbukkit.CraftChunk;
import org.bukkit.craftbukkit.CraftWorld;
+import org.bukkit.craftbukkit.block.data.CraftBlockData;
import org.bukkit.craftbukkit.util.CraftMagicNumbers;
import org.bukkit.material.Attachable;
import org.bukkit.material.MaterialData;
@@ -16,6 +18,7 @@ import org.bukkit.metadata.MetadataValue;
import org.bukkit.plugin.Plugin;
import java.util.List;
+import net.minecraft.server.GeneratorAccess;
import net.minecraft.server.IBlockData;
public class CraftBlockState implements BlockState {
@@ -24,8 +27,7 @@ public class CraftBlockState implements BlockState {
private final int x;
private final int y;
private final int z;
- protected int type;
- protected MaterialData data;
+ protected IBlockData data;
protected int flag;
public CraftBlockState(final Block block) {
@@ -33,11 +35,9 @@ public class CraftBlockState implements BlockState {
this.x = block.getX();
this.y = block.getY();
this.z = block.getZ();
- this.type = block.getTypeId();
+ this.data = ((CraftBlock) block).getNMS();
this.chunk = (CraftChunk) block.getChunk();
this.flag = 3;
-
- createData(block.getData());
}
public CraftBlockState(final Block block, int flag) {
@@ -47,17 +47,17 @@ public class CraftBlockState implements BlockState {
public CraftBlockState(Material material) {
world = null;
- type = material.getId();
+ data = CraftMagicNumbers.getBlock(material).getBlockData();
chunk = null;
x = y = z = 0;
}
- public static CraftBlockState getBlockState(net.minecraft.server.World world, int x, int y, int z) {
- return new CraftBlockState(world.getWorld().getBlockAt(x, y, z));
+ public static CraftBlockState getBlockState(GeneratorAccess world, net.minecraft.server.BlockPosition pos) {
+ return new CraftBlockState(CraftBlock.at(world, pos));
}
- public static CraftBlockState getBlockState(net.minecraft.server.World world, int x, int y, int z, int flag) {
- return new CraftBlockState(world.getWorld().getBlockAt(x, y, z), flag);
+ public static CraftBlockState getBlockState(net.minecraft.server.World world, net.minecraft.server.BlockPosition pos, int flag) {
+ return new CraftBlockState(world.getWorld().getBlockAt(pos.getX(), pos.getY(), pos.getZ()), flag);
}
public World getWorld() {
@@ -82,14 +82,32 @@ public class CraftBlockState implements BlockState {
return chunk;
}
+ public void setData(IBlockData data) {
+ this.data = data;
+ }
+
+ public IBlockData getHandle() {
+ return this.data;
+ }
+
+ @Override
+ public BlockData getBlockData() {
+ return CraftBlockData.fromData(data);
+ }
+
+ @Override
+ public void setBlockData(BlockData data) {
+ this.data = ((CraftBlockData) data).getState();
+ }
+
public void setData(final MaterialData data) {
Material mat = getType();
if ((mat == null) || (mat.getData() == null)) {
- this.data = data;
+ this.data = CraftMagicNumbers.getBlock(data);
} else {
if ((data.getClass() == mat.getData()) || (data.getClass() == MaterialData.class)) {
- this.data = data;
+ this.data = CraftMagicNumbers.getBlock(data);
} else {
throw new IllegalArgumentException("Provided data is not of type "
+ mat.getData().getName() + ", found " + data.getClass().getName());
@@ -98,24 +116,17 @@ public class CraftBlockState implements BlockState {
}
public MaterialData getData() {
- return data;
+ return CraftMagicNumbers.getMaterial(data);
}
public void setType(final Material type) {
- setTypeId(type.getId());
- }
-
- public boolean setTypeId(final int type) {
- if (this.type != type) {
- this.type = type;
-
- createData((byte) 0);
+ if (this.getType() != type) {
+ this.data = CraftMagicNumbers.getBlock(type).getBlockData();
}
- return true;
}
public Material getType() {
- return Material.getMaterial(getTypeId());
+ return CraftMagicNumbers.getMaterial(data.getBlock());
}
public void setFlag(int flag) {
@@ -126,17 +137,13 @@ public class CraftBlockState implements BlockState {
return flag;
}
- public int getTypeId() {
- return type;
- }
-
public byte getLightLevel() {
return getBlock().getLightLevel();
}
- public Block getBlock() {
+ public CraftBlock getBlock() {
requirePlaced();
- return world.getBlockAt(x, y, z);
+ return (CraftBlock) world.getBlockAt(x, y, z);
}
public boolean update() {
@@ -151,7 +158,7 @@ public class CraftBlockState implements BlockState {
if (!isPlaced()) {
return true;
}
- Block block = getBlock();
+ CraftBlock block = getBlock();
if (block.getType() != getType()) {
if (!force) {
@@ -160,34 +167,25 @@ public class CraftBlockState implements BlockState {
}
BlockPosition pos = new BlockPosition(x, y, z);
- IBlockData newBlock = CraftMagicNumbers.getBlock(getType()).fromLegacyData(getRawData());
- block.setTypeIdAndData(getTypeId(), getRawData(), applyPhysics);
+ IBlockData newBlock = this.data;
+ block.setTypeAndData(newBlock, applyPhysics);
world.getHandle().notify(
pos,
- CraftMagicNumbers.getBlock(block).fromLegacyData(block.getData()),
+ block.getNMS(),
newBlock,
3
);
// Update levers etc
if (applyPhysics && getData() instanceof Attachable) {
- world.getHandle().applyPhysics(pos.shift(CraftBlock.blockFaceToNotch(((Attachable) getData()).getAttachedFace())), newBlock.getBlock(), false);
+ world.getHandle().applyPhysics(pos.shift(CraftBlock.blockFaceToNotch(((Attachable) getData()).getAttachedFace())), newBlock.getBlock());
}
return true;
}
- private void createData(final byte data) {
- Material mat = getType();
- if (mat == null || mat.getData() == null) {
- this.data = new MaterialData(type, data);
- } else {
- this.data = mat.getNewData(data);
- }
- }
-
public byte getRawData() {
- return data.getData();
+ return CraftMagicNumbers.toLegacyData(data);
}
public Location getLocation() {
@@ -208,7 +206,7 @@ public class CraftBlockState implements BlockState {
}
public void setRawData(byte data) {
- this.data.setData(data);
+ this.data = CraftMagicNumbers.getBlock(getType(), data);
}
@Override
@@ -232,9 +230,6 @@ public class CraftBlockState implements BlockState {
if (this.z != other.z) {
return false;
}
- if (this.type != other.type) {
- return false;
- }
if (this.data != other.data && (this.data == null || !this.data.equals(other.data))) {
return false;
}
@@ -248,7 +243,6 @@ public class CraftBlockState implements BlockState {
hash = 73 * hash + this.x;
hash = 73 * hash + this.y;
hash = 73 * hash + this.z;
- hash = 73 * hash + this.type;
hash = 73 * hash + (this.data != null ? this.data.hashCode() : 0);
return hash;
}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftBrewingStand.java b/src/main/java/org/bukkit/craftbukkit/block/CraftBrewingStand.java
index 9c336e64..dafaa6fb 100644
--- a/src/main/java/org/bukkit/craftbukkit/block/CraftBrewingStand.java
+++ b/src/main/java/org/bukkit/craftbukkit/block/CraftBrewingStand.java
@@ -5,6 +5,7 @@ import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.block.BrewingStand;
import org.bukkit.craftbukkit.inventory.CraftInventoryBrewer;
+import org.bukkit.craftbukkit.util.CraftChatMessage;
import org.bukkit.inventory.BrewerInventory;
public class CraftBrewingStand extends CraftContainer<TileEntityBrewingStand> implements BrewingStand {
@@ -54,12 +55,12 @@ public class CraftBrewingStand extends CraftContainer<TileEntityBrewingStand> im
@Override
public String getCustomName() {
TileEntityBrewingStand brewingStand = this.getSnapshot();
- return brewingStand.hasCustomName() ? brewingStand.getName() : null;
+ return brewingStand.hasCustomName() ? CraftChatMessage.fromComponent(brewingStand.getCustomName()) : null;
}
@Override
public void setCustomName(String name) {
- this.getSnapshot().setCustomName(name);
+ this.getSnapshot().setCustomName(CraftChatMessage.fromStringOrNull(name));
}
@Override
diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftChest.java b/src/main/java/org/bukkit/craftbukkit/block/CraftChest.java
index 85f3bb27..6a54f2a1 100644
--- a/src/main/java/org/bukkit/craftbukkit/block/CraftChest.java
+++ b/src/main/java/org/bukkit/craftbukkit/block/CraftChest.java
@@ -1,6 +1,10 @@
package org.bukkit.craftbukkit.block;
+import net.minecraft.server.BlockChest;
import net.minecraft.server.BlockPosition;
+import net.minecraft.server.Blocks;
+import net.minecraft.server.ITileInventory;
+import net.minecraft.server.InventoryLargeChest;
import net.minecraft.server.TileEntityChest;
import org.bukkit.Material;
@@ -48,30 +52,10 @@ public class CraftChest extends CraftLootable<TileEntityChest> implements Chest
int z = this.getZ();
CraftWorld world = (CraftWorld) this.getWorld();
- int id;
- if (world.getBlockTypeIdAt(x, y, z) == Material.CHEST.getId()) {
- id = Material.CHEST.getId();
- } else if (world.getBlockTypeIdAt(x, y, z) == Material.TRAPPED_CHEST.getId()) {
- id = Material.TRAPPED_CHEST.getId();
- } else {
- throw new IllegalStateException("CraftChest is not a chest but is instead " + world.getBlockAt(x, y, z));
- }
+ ITileInventory nms = ((BlockChest) Blocks.CHEST).getInventory(data, world.getHandle(), new BlockPosition(x, y, z), true);
- if (world.getBlockTypeIdAt(x - 1, y, z) == id) {
- 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(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(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(new BlockPosition(x, y, z + 1)));
- inventory = new CraftInventoryDoubleChest(inventory, right);
+ if (nms instanceof InventoryLargeChest) {
+ inventory = new CraftInventoryDoubleChest((InventoryLargeChest) nms);
}
return inventory;
}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftCommandBlock.java b/src/main/java/org/bukkit/craftbukkit/block/CraftCommandBlock.java
index dd5b83cf..5c9bfe95 100644
--- a/src/main/java/org/bukkit/craftbukkit/block/CraftCommandBlock.java
+++ b/src/main/java/org/bukkit/craftbukkit/block/CraftCommandBlock.java
@@ -4,6 +4,7 @@ import net.minecraft.server.TileEntityCommand;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.block.CommandBlock;
+import org.bukkit.craftbukkit.util.CraftChatMessage;
public class CraftCommandBlock extends CraftBlockEntityState<TileEntityCommand> implements CommandBlock {
@@ -23,7 +24,7 @@ public class CraftCommandBlock extends CraftBlockEntityState<TileEntityCommand>
super.load(commandBlock);
command = commandBlock.getCommandBlock().getCommand();
- name = commandBlock.getCommandBlock().getName();
+ name = CraftChatMessage.fromComponent(commandBlock.getCommandBlock().getName());
}
@Override
@@ -51,6 +52,6 @@ public class CraftCommandBlock extends CraftBlockEntityState<TileEntityCommand>
super.applyTo(commandBlock);
commandBlock.getCommandBlock().setCommand(command);
- commandBlock.getCommandBlock().setName(name);
+ commandBlock.getCommandBlock().setName(CraftChatMessage.fromStringOrNull(name));
}
}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftConduit.java b/src/main/java/org/bukkit/craftbukkit/block/CraftConduit.java
new file mode 100644
index 00000000..5116a376
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/block/CraftConduit.java
@@ -0,0 +1,17 @@
+package org.bukkit.craftbukkit.block;
+
+import net.minecraft.server.TileEntityConduit;
+import org.bukkit.Material;
+import org.bukkit.block.Block;
+import org.bukkit.block.Conduit;
+
+public class CraftConduit extends CraftBlockEntityState<TileEntityConduit> implements Conduit {
+
+ public CraftConduit(Block block) {
+ super(block, TileEntityConduit.class);
+ }
+
+ public CraftConduit(Material material, TileEntityConduit te) {
+ super(material, te);
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftCreatureSpawner.java b/src/main/java/org/bukkit/craftbukkit/block/CraftCreatureSpawner.java
index 2ec70843..aa63b854 100644
--- a/src/main/java/org/bukkit/craftbukkit/block/CraftCreatureSpawner.java
+++ b/src/main/java/org/bukkit/craftbukkit/block/CraftCreatureSpawner.java
@@ -1,6 +1,7 @@
package org.bukkit.craftbukkit.block;
import com.google.common.base.Preconditions;
+import net.minecraft.server.EntityTypes;
import net.minecraft.server.MinecraftKey;
import net.minecraft.server.TileEntityMobSpawner;
import org.bukkit.Material;
@@ -31,7 +32,7 @@ public class CraftCreatureSpawner extends CraftBlockEntityState<TileEntityMobSpa
throw new IllegalArgumentException("Can't spawn EntityType " + entityType + " from mobspawners!");
}
- this.getSnapshot().getSpawner().setMobName(new MinecraftKey(entityType.getName()));
+ this.getSnapshot().getSpawner().setMobName(EntityTypes.a(entityType.getName()));
}
@Override
diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftEnchantingTable.java b/src/main/java/org/bukkit/craftbukkit/block/CraftEnchantingTable.java
index f9239e55..3a782294 100644
--- a/src/main/java/org/bukkit/craftbukkit/block/CraftEnchantingTable.java
+++ b/src/main/java/org/bukkit/craftbukkit/block/CraftEnchantingTable.java
@@ -4,6 +4,7 @@ import net.minecraft.server.TileEntityEnchantTable;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.block.EnchantingTable;
+import org.bukkit.craftbukkit.util.CraftChatMessage;
public class CraftEnchantingTable extends CraftBlockEntityState<TileEntityEnchantTable> implements EnchantingTable {
@@ -18,12 +19,12 @@ public class CraftEnchantingTable extends CraftBlockEntityState<TileEntityEnchan
@Override
public String getCustomName() {
TileEntityEnchantTable enchant = this.getSnapshot();
- return enchant.hasCustomName() ? enchant.getName() : null;
+ return enchant.hasCustomName() ? CraftChatMessage.fromComponent(enchant.getCustomName()) : null;
}
@Override
public void setCustomName(String name) {
- this.getSnapshot().setCustomName(name);
+ this.getSnapshot().setCustomName(CraftChatMessage.fromStringOrNull(name));
}
@Override
diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftFlowerPot.java b/src/main/java/org/bukkit/craftbukkit/block/CraftFlowerPot.java
deleted file mode 100644
index c9097ac8..00000000
--- a/src/main/java/org/bukkit/craftbukkit/block/CraftFlowerPot.java
+++ /dev/null
@@ -1,46 +0,0 @@
-package org.bukkit.craftbukkit.block;
-
-import net.minecraft.server.ItemStack;
-import net.minecraft.server.TileEntityFlowerPot;
-import org.bukkit.Material;
-import org.bukkit.block.Block;
-import org.bukkit.block.FlowerPot;
-import org.bukkit.craftbukkit.inventory.CraftItemStack;
-import org.bukkit.material.MaterialData;
-
-public class CraftFlowerPot extends CraftBlockEntityState<TileEntityFlowerPot> implements FlowerPot {
-
- private MaterialData contents;
-
- public CraftFlowerPot(Block block) {
- super(block, TileEntityFlowerPot.class);
- }
-
- public CraftFlowerPot(Material material, TileEntityFlowerPot te) {
- super(material, te);
- }
-
- @Override
- public void load(TileEntityFlowerPot pot) {
- super.load(pot);
-
- contents = (pot.getItem() == null) ? null : CraftItemStack.asBukkitCopy(pot.getContents()).getData();
- }
-
- @Override
- public MaterialData getContents() {
- return contents;
- }
-
- @Override
- public void setContents(MaterialData item) {
- contents = item;
- }
-
- @Override
- public void applyTo(TileEntityFlowerPot pot) {
- super.applyTo(pot);
-
- pot.setContents(contents == null ? ItemStack.a : CraftItemStack.asNMSCopy(contents.toItemStack(1)));
- }
-}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftFurnace.java b/src/main/java/org/bukkit/craftbukkit/block/CraftFurnace.java
index 047dbe2e..469dc4ff 100644
--- a/src/main/java/org/bukkit/craftbukkit/block/CraftFurnace.java
+++ b/src/main/java/org/bukkit/craftbukkit/block/CraftFurnace.java
@@ -5,6 +5,7 @@ import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.block.Furnace;
import org.bukkit.craftbukkit.inventory.CraftInventoryFurnace;
+import org.bukkit.craftbukkit.util.CraftChatMessage;
import org.bukkit.inventory.FurnaceInventory;
public class CraftFurnace extends CraftContainer<TileEntityFurnace> implements Furnace {
@@ -54,12 +55,12 @@ public class CraftFurnace extends CraftContainer<TileEntityFurnace> implements F
@Override
public String getCustomName() {
TileEntityFurnace furnace = this.getSnapshot();
- return furnace.hasCustomName() ? furnace.getName() : null;
+ return furnace.hasCustomName() ? CraftChatMessage.fromComponent(furnace.getCustomName()) : null;
}
@Override
public void setCustomName(String name) {
- this.getSnapshot().setCustomName(name);
+ this.getSnapshot().setCustomName(CraftChatMessage.fromStringOrNull(name));
}
@Override
diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftJukebox.java b/src/main/java/org/bukkit/craftbukkit/block/CraftJukebox.java
index d259cfb8..57160a94 100644
--- a/src/main/java/org/bukkit/craftbukkit/block/CraftJukebox.java
+++ b/src/main/java/org/bukkit/craftbukkit/block/CraftJukebox.java
@@ -1,11 +1,12 @@
package org.bukkit.craftbukkit.block;
import net.minecraft.server.BlockJukeBox;
-import net.minecraft.server.BlockJukeBox.TileEntityRecordPlayer;
import net.minecraft.server.BlockPosition;
import net.minecraft.server.Blocks;
+import net.minecraft.server.Item;
import net.minecraft.server.ItemStack;
import net.minecraft.server.TileEntity;
+import net.minecraft.server.TileEntityJukeBox;
import org.bukkit.Effect;
import org.bukkit.Material;
import org.bukkit.block.Block;
@@ -13,13 +14,13 @@ import org.bukkit.block.Jukebox;
import org.bukkit.craftbukkit.CraftWorld;
import org.bukkit.craftbukkit.util.CraftMagicNumbers;
-public class CraftJukebox extends CraftBlockEntityState<TileEntityRecordPlayer> implements Jukebox {
+public class CraftJukebox extends CraftBlockEntityState<TileEntityJukeBox> implements Jukebox {
public CraftJukebox(final Block block) {
- super(block, TileEntityRecordPlayer.class);
+ super(block, TileEntityJukeBox.class);
}
- public CraftJukebox(final Material material, TileEntityRecordPlayer te) {
+ public CraftJukebox(final Material material, TileEntityJukeBox te) {
super(material, te);
}
@@ -39,7 +40,7 @@ public class CraftJukebox extends CraftBlockEntityState<TileEntityRecordPlayer>
Blocks.JUKEBOX.getBlockData()
.set(BlockJukeBox.HAS_RECORD, true), 3);
}
- world.playEffect(this.getLocation(), Effect.RECORD_PLAY, record.getId());
+ world.playEffect(this.getLocation(), Effect.RECORD_PLAY, Item.getId(CraftMagicNumbers.getItem((Material) record)));
}
return result;
@@ -77,12 +78,12 @@ public class CraftJukebox extends CraftBlockEntityState<TileEntityRecordPlayer>
public boolean eject() {
requirePlaced();
TileEntity tileEntity = this.getTileEntityFromWorld();
- if (!(tileEntity instanceof TileEntityRecordPlayer)) return false;
+ if (!(tileEntity instanceof TileEntityJukeBox)) return false;
- TileEntityRecordPlayer jukebox = (TileEntityRecordPlayer) tileEntity;
+ TileEntityJukeBox jukebox = (TileEntityJukeBox) tileEntity;
boolean result = !jukebox.getRecord().isEmpty();
CraftWorld world = (CraftWorld) this.getWorld();
- ((BlockJukeBox) Blocks.JUKEBOX).dropRecord(world.getHandle(), new BlockPosition(getX(), getY(), getZ()), null);
+ ((BlockJukeBox) Blocks.JUKEBOX).dropRecord(world.getHandle(), new BlockPosition(getX(), getY(), getZ()));
return result;
}
}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftLootable.java b/src/main/java/org/bukkit/craftbukkit/block/CraftLootable.java
index e2af111d..d7677192 100644
--- a/src/main/java/org/bukkit/craftbukkit/block/CraftLootable.java
+++ b/src/main/java/org/bukkit/craftbukkit/block/CraftLootable.java
@@ -4,6 +4,7 @@ import net.minecraft.server.TileEntityLootable;
import org.bukkit.Material;
import org.bukkit.Nameable;
import org.bukkit.block.Block;
+import org.bukkit.craftbukkit.util.CraftChatMessage;
public abstract class CraftLootable<T extends TileEntityLootable> extends CraftContainer<T> implements Nameable {
@@ -18,12 +19,12 @@ public abstract class CraftLootable<T extends TileEntityLootable> extends CraftC
@Override
public String getCustomName() {
T lootable = this.getSnapshot();
- return lootable.hasCustomName() ? lootable.getName() : null;
+ return lootable.hasCustomName() ? CraftChatMessage.fromComponent(lootable.getCustomName()) : null;
}
@Override
public void setCustomName(String name) {
- this.getSnapshot().setCustomName(name);
+ this.getSnapshot().setCustomName(CraftChatMessage.fromStringOrNull(name));
}
@Override
diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftNoteBlock.java b/src/main/java/org/bukkit/craftbukkit/block/CraftNoteBlock.java
deleted file mode 100644
index 880831d4..00000000
--- a/src/main/java/org/bukkit/craftbukkit/block/CraftNoteBlock.java
+++ /dev/null
@@ -1,83 +0,0 @@
-package org.bukkit.craftbukkit.block;
-
-import net.minecraft.server.BlockPosition;
-import net.minecraft.server.TileEntityNote;
-
-import org.bukkit.Instrument;
-import org.bukkit.Material;
-import org.bukkit.Note;
-import org.bukkit.block.Block;
-import org.bukkit.block.NoteBlock;
-import org.bukkit.craftbukkit.CraftWorld;
-import org.bukkit.craftbukkit.util.CraftMagicNumbers;
-
-public class CraftNoteBlock extends CraftBlockEntityState<TileEntityNote> implements NoteBlock {
-
- public CraftNoteBlock(final Block block) {
- super(block, TileEntityNote.class);
- }
-
- public CraftNoteBlock(final Material material, final TileEntityNote te) {
- super(material, te);
- }
-
- @Override
- public Note getNote() {
- return new Note(this.getSnapshot().note);
- }
-
- @Override
- public byte getRawNote() {
- return this.getSnapshot().note;
- }
-
- @Override
- public void setNote(Note note) {
- this.getSnapshot().note = note.getId();
- }
-
- @Override
- public void setRawNote(byte note) {
- this.getSnapshot().note = note;
- }
-
- @Override
- public boolean play() {
- Block block = getBlock();
-
- if (block.getType() == Material.NOTE_BLOCK) {
- TileEntityNote note = (TileEntityNote) this.getTileEntityFromWorld();
- CraftWorld world = (CraftWorld) this.getWorld();
- note.play(world.getHandle(), new BlockPosition(getX(), getY(), getZ()));
- return true;
- } else {
- return false;
- }
- }
-
- @Override
- public boolean play(byte instrument, byte note) {
- Block block = getBlock();
-
- if (block.getType() == Material.NOTE_BLOCK) {
- CraftWorld world = (CraftWorld) this.getWorld();
- world.getHandle().playBlockAction(new BlockPosition(getX(), getY(), getZ()), CraftMagicNumbers.getBlock(block), instrument, note);
- return true;
- } else {
- return false;
- }
- }
-
- @Override
- public boolean play(Instrument instrument, Note note) {
- Block block = getBlock();
-
- if (block.getType() == Material.NOTE_BLOCK) {
- CraftWorld world = (CraftWorld) this.getWorld();
- 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/CraftSkull.java b/src/main/java/org/bukkit/craftbukkit/block/CraftSkull.java
index f2865688..f113da71 100644
--- a/src/main/java/org/bukkit/craftbukkit/block/CraftSkull.java
+++ b/src/main/java/org/bukkit/craftbukkit/block/CraftSkull.java
@@ -12,13 +12,12 @@ import org.bukkit.SkullType;
import org.bukkit.block.Block;
import org.bukkit.block.BlockFace;
import org.bukkit.block.Skull;
+import org.bukkit.block.data.Rotatable;
public class CraftSkull extends CraftBlockEntityState<TileEntitySkull> implements Skull {
private static final int MAX_OWNER_LENGTH = 16;
private GameProfile profile;
- private SkullType skullType;
- private byte rotation;
public CraftSkull(final Block block) {
super(block, TileEntitySkull.class);
@@ -33,26 +32,6 @@ public class CraftSkull extends CraftBlockEntityState<TileEntitySkull> implement
super.load(skull);
profile = skull.getGameProfile();
- skullType = getSkullType(skull.getSkullType());
- rotation = (byte) skull.rotation;
- }
-
- static SkullType getSkullType(int id) {
- switch (id) {
- default:
- case 0:
- return SkullType.SKELETON;
- case 1:
- return SkullType.WITHER;
- case 2:
- return SkullType.ZOMBIE;
- case 3:
- return SkullType.PLAYER;
- case 4:
- return SkullType.CREEPER;
- case 5:
- return SkullType.DRAGON;
- }
}
static int getSkullType(SkullType type) {
@@ -73,84 +52,6 @@ public class CraftSkull extends CraftBlockEntityState<TileEntitySkull> implement
}
}
- static byte getBlockFace(BlockFace rotation) {
- switch (rotation) {
- case NORTH:
- return 0;
- case NORTH_NORTH_EAST:
- return 1;
- case NORTH_EAST:
- return 2;
- case EAST_NORTH_EAST:
- return 3;
- case EAST:
- return 4;
- case EAST_SOUTH_EAST:
- return 5;
- case SOUTH_EAST:
- return 6;
- case SOUTH_SOUTH_EAST:
- return 7;
- case SOUTH:
- return 8;
- case SOUTH_SOUTH_WEST:
- return 9;
- case SOUTH_WEST:
- return 10;
- case WEST_SOUTH_WEST:
- return 11;
- case WEST:
- return 12;
- case WEST_NORTH_WEST:
- return 13;
- case NORTH_WEST:
- return 14;
- case NORTH_NORTH_WEST:
- return 15;
- default:
- throw new IllegalArgumentException("Invalid BlockFace rotation: " + rotation);
- }
- }
-
- static BlockFace getBlockFace(byte rotation) {
- switch (rotation) {
- case 0:
- return BlockFace.NORTH;
- case 1:
- return BlockFace.NORTH_NORTH_EAST;
- case 2:
- return BlockFace.NORTH_EAST;
- case 3:
- return BlockFace.EAST_NORTH_EAST;
- case 4:
- return BlockFace.EAST;
- case 5:
- return BlockFace.EAST_SOUTH_EAST;
- case 6:
- return BlockFace.SOUTH_EAST;
- case 7:
- return BlockFace.SOUTH_SOUTH_EAST;
- case 8:
- return BlockFace.SOUTH;
- case 9:
- return BlockFace.SOUTH_SOUTH_WEST;
- case 10:
- return BlockFace.SOUTH_WEST;
- case 11:
- return BlockFace.WEST_SOUTH_WEST;
- case 12:
- return BlockFace.WEST;
- case 13:
- return BlockFace.WEST_NORTH_WEST;
- case 14:
- return BlockFace.NORTH_WEST;
- case 15:
- return BlockFace.NORTH_NORTH_WEST;
- default:
- throw new AssertionError(rotation);
- }
- }
-
@Override
public boolean hasOwner() {
return profile != null;
@@ -172,10 +73,6 @@ public class CraftSkull extends CraftBlockEntityState<TileEntitySkull> implement
return false;
}
- if (skullType != SkullType.PLAYER) {
- skullType = SkullType.PLAYER;
- }
-
this.profile = profile;
return true;
}
@@ -199,47 +96,58 @@ public class CraftSkull extends CraftBlockEntityState<TileEntitySkull> implement
public void setOwningPlayer(OfflinePlayer player) {
Preconditions.checkNotNull(player, "player");
- if (skullType != SkullType.PLAYER) {
- skullType = SkullType.PLAYER;
- }
-
this.profile = new GameProfile(player.getUniqueId(), player.getName());
}
@Override
public BlockFace getRotation() {
- return getBlockFace(rotation);
+ return ((Rotatable) getBlockData()).getRotation();
}
@Override
public void setRotation(BlockFace rotation) {
- this.rotation = getBlockFace(rotation);
+ Rotatable blockData = (Rotatable) getBlockData();
+ blockData.setRotation(rotation);
+ setBlockData(blockData);
}
@Override
public SkullType getSkullType() {
- return skullType;
+ switch (getType()) {
+ case SKELETON_SKULL:
+ case SKELETON_WALL_SKULL:
+ return SkullType.SKELETON;
+ case WITHER_SKELETON_SKULL:
+ case WITHER_SKELETON_WALL_SKULL:
+ return SkullType.WITHER;
+ case ZOMBIE_HEAD:
+ case ZOMBIE_WALL_HEAD:
+ return SkullType.ZOMBIE;
+ case PLAYER_HEAD:
+ case PLAYER_WALL_HEAD:
+ return SkullType.PLAYER;
+ case CREEPER_HEAD:
+ case CREEPER_WALL_HEAD:
+ return SkullType.CREEPER;
+ case DRAGON_HEAD:
+ case DRAGON_WALL_HEAD:
+ return SkullType.DRAGON;
+ default:
+ throw new IllegalArgumentException("Unknown SkullType for " + getType());
+ }
}
@Override
public void setSkullType(SkullType skullType) {
- this.skullType = skullType;
-
- if (skullType != SkullType.PLAYER) {
- profile = null;
- }
+ throw new UnsupportedOperationException("Must change block type");
}
@Override
public void applyTo(TileEntitySkull skull) {
super.applyTo(skull);
- if (skullType == SkullType.PLAYER) {
+ if (getSkullType() == SkullType.PLAYER) {
skull.setGameProfile(profile);
- } else {
- skull.setSkullType(getSkullType(skullType));
}
-
- skull.setRotation(rotation);
}
}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftStructureBlock.java b/src/main/java/org/bukkit/craftbukkit/block/CraftStructureBlock.java
index 2fadc703..86095fbe 100644
--- a/src/main/java/org/bukkit/craftbukkit/block/CraftStructureBlock.java
+++ b/src/main/java/org/bukkit/craftbukkit/block/CraftStructureBlock.java
@@ -2,6 +2,7 @@ package org.bukkit.craftbukkit.block;
import com.google.common.base.Preconditions;
import net.minecraft.server.BlockPosition;
+import net.minecraft.server.BlockPropertyStructureMode;
import net.minecraft.server.EnumBlockMirror;
import net.minecraft.server.EnumBlockRotation;
import net.minecraft.server.TileEntityStructure;
@@ -30,35 +31,35 @@ public class CraftStructureBlock extends CraftBlockEntityState<TileEntityStructu
@Override
public String getStructureName() {
- return getSnapshot().a(); // PAIL: rename getStructureName
+ return getSnapshot().getStructureName();
}
@Override
public void setStructureName(String name) {
Preconditions.checkArgument(name != null, "Structure Name cannot be null");
- getSnapshot().a(name); // PAIL: rename setStructureName
+ getSnapshot().setStructureName(name);
}
@Override
public String getAuthor() {
- return getSnapshot().f;
+ return getSnapshot().author;
}
@Override
public void setAuthor(String author) {
Preconditions.checkArgument(author != null && !author.isEmpty(), "Author name cannot be null nor empty");
- getSnapshot().f = author; // PAIL: rename author
+ getSnapshot().author = author;
}
@Override
public void setAuthor(LivingEntity entity) {
Preconditions.checkArgument(entity != null, "Structure Block author entity cannot be null");
- getSnapshot().a(((CraftLivingEntity) entity).getHandle()); // PAIL: rename setAuthor
+ getSnapshot().setAuthor(((CraftLivingEntity) entity).getHandle());
}
@Override
public BlockVector getRelativePosition() {
- return new BlockVector(getSnapshot().h.getX(), getSnapshot().h.getY(), getSnapshot().h.getZ()); // PAIL: rename relativePosition
+ return new BlockVector(getSnapshot().relativePosition.getX(), getSnapshot().relativePosition.getY(), getSnapshot().relativePosition.getZ());
}
@Override
@@ -66,12 +67,12 @@ public class CraftStructureBlock extends CraftBlockEntityState<TileEntityStructu
Validate.isTrue(isBetween(vector.getBlockX(), -MAX_SIZE, MAX_SIZE), "Structure Size (X) must be between -" + MAX_SIZE + " and " + MAX_SIZE);
Validate.isTrue(isBetween(vector.getBlockY(), -MAX_SIZE, MAX_SIZE), "Structure Size (Y) must be between -" + MAX_SIZE + " and " + MAX_SIZE);
Validate.isTrue(isBetween(vector.getBlockZ(), -MAX_SIZE, MAX_SIZE), "Structure Size (Z) must be between -" + MAX_SIZE + " and " + MAX_SIZE);
- getSnapshot().h = new BlockPosition(vector.getBlockX(), vector.getBlockY(), vector.getBlockZ()); // PAIL: rename relativePosition
+ getSnapshot().relativePosition = new BlockPosition(vector.getBlockX(), vector.getBlockY(), vector.getBlockZ());
}
@Override
public BlockVector getStructureSize() {
- return new BlockVector(getSnapshot().i.getX(), getSnapshot().i.getY(), getSnapshot().i.getZ()); // PAIL: rename size
+ return new BlockVector(getSnapshot().size.getX(), getSnapshot().size.getY(), getSnapshot().size.getZ());
}
@Override
@@ -79,101 +80,101 @@ public class CraftStructureBlock extends CraftBlockEntityState<TileEntityStructu
Validate.isTrue(isBetween(vector.getBlockX(), 0, MAX_SIZE), "Structure Size (X) must be between 0 and " + MAX_SIZE);
Validate.isTrue(isBetween(vector.getBlockY(), 0, MAX_SIZE), "Structure Size (Y) must be between 0 and " + MAX_SIZE);
Validate.isTrue(isBetween(vector.getBlockZ(), 0, MAX_SIZE), "Structure Size (Z) must be between 0 and " + MAX_SIZE);
- getSnapshot().i = new BlockPosition(vector.getBlockX(), vector.getBlockY(), vector.getBlockZ()); // PAIL: rename size
+ getSnapshot().size = new BlockPosition(vector.getBlockX(), vector.getBlockY(), vector.getBlockZ());
}
@Override
public void setMirror(Mirror mirror) {
- getSnapshot().j = EnumBlockMirror.valueOf(mirror.name()); // PAIL: rename mirror
+ getSnapshot().mirror = EnumBlockMirror.valueOf(mirror.name());
}
@Override
public Mirror getMirror() {
- return Mirror.valueOf(getSnapshot().j.name()); // PAIL: rename mirror
+ return Mirror.valueOf(getSnapshot().mirror.name());
}
@Override
public void setRotation(StructureRotation rotation) {
- getSnapshot().k = EnumBlockRotation.valueOf(rotation.name()); // PAIL: rename rotation
+ getSnapshot().rotation = EnumBlockRotation.valueOf(rotation.name());
}
@Override
public StructureRotation getRotation() {
- return StructureRotation.valueOf(getSnapshot().k.name()); // PAIL: rename rotation
+ return StructureRotation.valueOf(getSnapshot().rotation.name());
}
@Override
public void setUsageMode(UsageMode mode) {
- getSnapshot().a(TileEntityStructure.UsageMode.valueOf(mode.name())); // PAIL: rename setUsageMode
+ getSnapshot().setUsageMode(BlockPropertyStructureMode.valueOf(mode.name()));
}
@Override
public UsageMode getUsageMode() {
- return UsageMode.valueOf(getSnapshot().k().name()); // PAIL rename getUsageMode
+ return UsageMode.valueOf(getSnapshot().getUsageMode().name());
}
@Override
public void setIgnoreEntities(boolean flag) {
- getSnapshot().m = flag; // PAIL: rename ignoreEntities
+ getSnapshot().ignoreEntities = flag;
}
@Override
public boolean isIgnoreEntities() {
- return getSnapshot().m; // PAIL: rename ignoreEntities
+ return getSnapshot().ignoreEntities;
}
@Override
public void setShowAir(boolean showAir) {
- getSnapshot().o = showAir; // PAIL rename showAir
+ getSnapshot().showAir = showAir;
}
@Override
public boolean isShowAir() {
- return getSnapshot().o; // PAIL: rename showAir
+ return getSnapshot().showAir;
}
@Override
public void setBoundingBoxVisible(boolean showBoundingBox) {
- getSnapshot().p = showBoundingBox; // PAIL: rename boundingBoxVisible
+ getSnapshot().showBoundingBox = showBoundingBox;
}
@Override
public boolean isBoundingBoxVisible() {
- return getSnapshot().p; // PAIL: rename boundingBoxVisible
+ return getSnapshot().showBoundingBox;
}
@Override
public void setIntegrity(float integrity) {
Validate.isTrue(isBetween(integrity, 0.0f, 1.0f), "Integrity must be between 0.0f and 1.0f");
- getSnapshot().q = integrity; // PAIL: rename integrity
+ getSnapshot().integrity = integrity;
}
@Override
public float getIntegrity() {
- return getSnapshot().q; // PAIL: rename integrity
+ return getSnapshot().integrity;
}
@Override
public void setSeed(long seed) {
- getSnapshot().r = seed; // PAIL: rename seed
+ getSnapshot().seed = seed;
}
@Override
public long getSeed() {
- return getSnapshot().r; // PAIL: rename seed
+ return getSnapshot().seed;
}
@Override
public void setMetadata(String metadata) {
Validate.notNull(metadata, "Structure metadata cannot be null");
if (getUsageMode() == UsageMode.DATA) {
- getSnapshot().g = metadata; // PAIL: rename metadata
+ getSnapshot().metadata = metadata;
}
}
@Override
public String getMetadata() {
- return getSnapshot().g; // PAIL: rename metadata
+ return getSnapshot().metadata;
}
private static boolean isBetween(int num, int min, int max) {
diff --git a/src/main/java/org/bukkit/craftbukkit/block/data/CraftAgeable.java b/src/main/java/org/bukkit/craftbukkit/block/data/CraftAgeable.java
new file mode 100644
index 00000000..e311e66b
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/block/data/CraftAgeable.java
@@ -0,0 +1,23 @@
+package org.bukkit.craftbukkit.block.data;
+
+import org.bukkit.block.data.Ageable;
+
+public abstract class CraftAgeable extends CraftBlockData implements Ageable {
+
+ private static final net.minecraft.server.BlockStateInteger AGE = getInteger("age");
+
+ @Override
+ public int getAge() {
+ return get(AGE);
+ }
+
+ @Override
+ public void setAge(int age) {
+ set(AGE, age);
+ }
+
+ @Override
+ public int getMaximumAge() {
+ return getMax(AGE);
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/data/CraftAnaloguePowerable.java b/src/main/java/org/bukkit/craftbukkit/block/data/CraftAnaloguePowerable.java
new file mode 100644
index 00000000..60a247ce
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/block/data/CraftAnaloguePowerable.java
@@ -0,0 +1,23 @@
+package org.bukkit.craftbukkit.block.data;
+
+import org.bukkit.block.data.AnaloguePowerable;
+
+public abstract class CraftAnaloguePowerable extends CraftBlockData implements AnaloguePowerable {
+
+ private static final net.minecraft.server.BlockStateInteger POWER = getInteger("power");
+
+ @Override
+ public int getPower() {
+ return get(POWER);
+ }
+
+ @Override
+ public void setPower(int power) {
+ set(POWER, power);
+ }
+
+ @Override
+ public int getMaximumPower() {
+ return getMax(POWER);
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/data/CraftAttachable.java b/src/main/java/org/bukkit/craftbukkit/block/data/CraftAttachable.java
new file mode 100644
index 00000000..657cf073
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/block/data/CraftAttachable.java
@@ -0,0 +1,18 @@
+package org.bukkit.craftbukkit.block.data;
+
+import org.bukkit.block.data.Attachable;
+
+public abstract class CraftAttachable extends CraftBlockData implements Attachable {
+
+ private static final net.minecraft.server.BlockStateBoolean ATTACHED = getBoolean("attached");
+
+ @Override
+ public boolean isAttached() {
+ return get(ATTACHED);
+ }
+
+ @Override
+ public void setAttached(boolean attached) {
+ set(ATTACHED, attached);
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/data/CraftBisected.java b/src/main/java/org/bukkit/craftbukkit/block/data/CraftBisected.java
new file mode 100644
index 00000000..969b670e
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/block/data/CraftBisected.java
@@ -0,0 +1,18 @@
+package org.bukkit.craftbukkit.block.data;
+
+import org.bukkit.block.data.Bisected;
+
+public class CraftBisected extends CraftBlockData implements Bisected {
+
+ private static final net.minecraft.server.BlockStateEnum<?> HALF = getEnum("half");
+
+ @Override
+ public Half getHalf() {
+ return get(HALF, Half.class);
+ }
+
+ @Override
+ public void setHalf(Half half) {
+ set(HALF, half);
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/data/CraftBlockData.java b/src/main/java/org/bukkit/craftbukkit/block/data/CraftBlockData.java
new file mode 100644
index 00000000..78cec61b
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/block/data/CraftBlockData.java
@@ -0,0 +1,356 @@
+package org.bukkit.craftbukkit.block.data;
+
+import com.google.common.base.Preconditions;
+import com.google.common.collect.BiMap;
+import com.google.common.collect.HashBiMap;
+import com.google.common.collect.ImmutableSet;
+import com.mojang.brigadier.StringReader;
+import com.mojang.brigadier.exceptions.CommandSyntaxException;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+import net.minecraft.server.ArgumentBlock;
+import net.minecraft.server.Block;
+import net.minecraft.server.BlockStateBoolean;
+import net.minecraft.server.BlockStateEnum;
+import net.minecraft.server.BlockStateInteger;
+import net.minecraft.server.EnumDirection;
+import net.minecraft.server.IBlockData;
+import net.minecraft.server.IBlockState;
+import net.minecraft.server.INamable;
+import org.bukkit.Material;
+import org.bukkit.block.BlockFace;
+import org.bukkit.block.data.BlockData;
+import org.bukkit.craftbukkit.block.CraftBlock;
+import org.bukkit.craftbukkit.util.CraftMagicNumbers;
+
+public class CraftBlockData implements BlockData {
+
+ private IBlockData state;
+
+ protected CraftBlockData() {
+ throw new AssertionError("Template Constructor");
+ }
+
+ protected CraftBlockData(IBlockData state) {
+ this.state = state;
+ }
+
+ @Override
+ public Material getMaterial() {
+ return CraftMagicNumbers.getMaterial(state.getBlock());
+ }
+
+ public IBlockData getState() {
+ return state;
+ }
+
+ protected <B extends Enum<B>> B get(BlockStateEnum<?> nms, Class<B> bukkit) {
+ return toBukkit(state.get(nms), bukkit);
+ }
+
+ @SuppressWarnings("unchecked")
+ protected <B extends Enum<B>> Set<B> getValues(BlockStateEnum<?> nms, Class<B> bukkit) {
+ ImmutableSet.Builder<B> values = ImmutableSet.builder();
+
+ for (Enum<?> e : nms.d()) {
+ values.add(toBukkit(e, bukkit));
+ }
+
+ return values.build();
+ }
+
+ protected <B extends Enum<B>, N extends Enum<N> & INamable> void set(BlockStateEnum<N> nms, Enum<B> bukkit) {
+ this.state = this.state.set(nms, toNMS(bukkit, nms.b()));
+ }
+
+ private static final BiMap<Enum<?>, Enum<?>> nmsToBukkit = HashBiMap.create();
+
+ @SuppressWarnings("unchecked")
+ private static <B extends Enum<B>> B toBukkit(Enum<?> nms, Class<B> bukkit) {
+ Enum<?> converted = nmsToBukkit.get(nms);
+ if (converted != null) {
+ return (B) converted;
+ }
+
+ if (nms instanceof EnumDirection) {
+ converted = CraftBlock.notchToBlockFace((EnumDirection) nms);
+ } else {
+ converted = bukkit.getEnumConstants()[nms.ordinal()];
+ }
+
+ Preconditions.checkState(converted != null, "Could not convert enum %s->%s", nms, bukkit);
+ nmsToBukkit.put(nms, converted);
+
+ return (B) converted;
+ }
+
+ @SuppressWarnings("unchecked")
+ private static <N extends Enum<N> & INamable> N toNMS(Enum<?> bukkit, Class<N> nms) {
+ Enum<?> converted = nmsToBukkit.inverse().get(bukkit);
+ if (converted != null) {
+ return (N) converted;
+ }
+
+ if (bukkit instanceof BlockFace) {
+ converted = CraftBlock.blockFaceToNotch((BlockFace) bukkit);
+ } else {
+ converted = nms.getEnumConstants()[bukkit.ordinal()];
+ }
+
+ Preconditions.checkState(converted != null, "Could not convert enum %s->%s", nms, bukkit);
+ nmsToBukkit.put(converted, bukkit);
+
+ return (N) converted;
+ }
+
+ protected <T extends Comparable<T>> T get(IBlockState<T> ibs) {
+ // Straight integer or boolean getter
+ return this.state.get(ibs);
+ }
+
+ public <T extends Comparable<T>, V extends T> void set(IBlockState<T> ibs, V v) {
+ // Straight integer or boolean setter
+ this.state = this.state.set(ibs, v);
+ }
+
+ @Override
+ public String getAsString() {
+ return state.toString();
+ }
+
+ @Override
+ public BlockData clone() {
+ try {
+ return (BlockData) super.clone();
+ } catch (CloneNotSupportedException ex) {
+ throw new AssertionError("Clone not supported", ex);
+ }
+ }
+
+ @Override
+ public String toString() {
+ return "CraftBlockData{" + state.toString() + "}";
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ return obj instanceof CraftBlockData && state.equals(((CraftBlockData) obj).state);
+ }
+
+ @Override
+ public int hashCode() {
+ return state.hashCode();
+ }
+
+ protected static BlockStateBoolean getBoolean(String name) {
+ throw new AssertionError("Template Method");
+ }
+
+ protected static BlockStateBoolean getBoolean(String name, boolean optional) {
+ throw new AssertionError("Template Method");
+ }
+
+ protected static BlockStateEnum<?> getEnum(String name) {
+ throw new AssertionError("Template Method");
+ }
+
+ protected static BlockStateInteger getInteger(String name) {
+ throw new AssertionError("Template Method");
+ }
+
+ protected static BlockStateBoolean getBoolean(Class<? extends Block> block, String name) {
+ return (BlockStateBoolean) getState(block, name, false);
+ }
+
+ protected static BlockStateBoolean getBoolean(Class<? extends Block> block, String name, boolean optional) {
+ return (BlockStateBoolean) getState(block, name, optional);
+ }
+
+ protected static BlockStateEnum<?> getEnum(Class<? extends Block> block, String name) {
+ return (BlockStateEnum<?>) getState(block, name, false);
+ }
+
+ protected static BlockStateInteger getInteger(Class<? extends Block> block, String name) {
+ return (BlockStateInteger) getState(block, name, false);
+ }
+
+ private static IBlockState<?> getState(Class<? extends Block> block, String name, boolean optional) {
+ IBlockState<?> state = null;
+
+ for (Block instance : (Iterable<Block>) Block.REGISTRY) { // Eclipse fail
+ if (instance.getClass() == block) {
+ if (state == null) {
+ state = instance.getStates().a(name);
+ } else {
+ IBlockState<?> newState = instance.getStates().a(name);
+
+ Preconditions.checkState(state == newState, "State mistmatch %s,%s", state, newState);
+ }
+ }
+ }
+
+ Preconditions.checkState(optional || state != null, "Null state for %s,%s", block, name);
+
+ return state;
+ }
+
+ protected static int getMin(BlockStateInteger state) {
+ return state.min;
+ }
+
+ protected static int getMax(BlockStateInteger state) {
+ return state.max;
+ }
+
+ //
+ private static final Map<Class<? extends Block>, Class<? extends CraftBlockData>> MAP = new HashMap<>();
+
+ static {
+ register(net.minecraft.server.BlockAnvil.class, org.bukkit.craftbukkit.block.impl.CraftAnvil.class);
+ register(net.minecraft.server.BlockBanner.class, org.bukkit.craftbukkit.block.impl.CraftBanner.class);
+ register(net.minecraft.server.BlockBannerWall.class, org.bukkit.craftbukkit.block.impl.CraftBannerWall.class);
+ register(net.minecraft.server.BlockBed.class, org.bukkit.craftbukkit.block.impl.CraftBed.class);
+ register(net.minecraft.server.BlockBeetroot.class, org.bukkit.craftbukkit.block.impl.CraftBeetroot.class);
+ register(net.minecraft.server.BlockBrewingStand.class, org.bukkit.craftbukkit.block.impl.CraftBrewingStand.class);
+ register(net.minecraft.server.BlockBubbleColumn.class, org.bukkit.craftbukkit.block.impl.CraftBubbleColumn.class);
+ register(net.minecraft.server.BlockCactus.class, org.bukkit.craftbukkit.block.impl.CraftCactus.class);
+ register(net.minecraft.server.BlockCake.class, org.bukkit.craftbukkit.block.impl.CraftCake.class);
+ register(net.minecraft.server.BlockCarrots.class, org.bukkit.craftbukkit.block.impl.CraftCarrots.class);
+ register(net.minecraft.server.BlockCauldron.class, org.bukkit.craftbukkit.block.impl.CraftCauldron.class);
+ register(net.minecraft.server.BlockChest.class, org.bukkit.craftbukkit.block.impl.CraftChest.class);
+ register(net.minecraft.server.BlockChestTrapped.class, org.bukkit.craftbukkit.block.impl.CraftChestTrapped.class);
+ register(net.minecraft.server.BlockChorusFlower.class, org.bukkit.craftbukkit.block.impl.CraftChorusFlower.class);
+ register(net.minecraft.server.BlockChorusFruit.class, org.bukkit.craftbukkit.block.impl.CraftChorusFruit.class);
+ register(net.minecraft.server.BlockCobbleWall.class, org.bukkit.craftbukkit.block.impl.CraftCobbleWall.class);
+ register(net.minecraft.server.BlockCocoa.class, org.bukkit.craftbukkit.block.impl.CraftCocoa.class);
+ register(net.minecraft.server.BlockCommand.class, org.bukkit.craftbukkit.block.impl.CraftCommand.class);
+ register(net.minecraft.server.BlockCoralFan.class, org.bukkit.craftbukkit.block.impl.CraftCoralFan.class);
+ register(net.minecraft.server.BlockCrops.class, org.bukkit.craftbukkit.block.impl.CraftCrops.class);
+ register(net.minecraft.server.BlockDaylightDetector.class, org.bukkit.craftbukkit.block.impl.CraftDaylightDetector.class);
+ register(net.minecraft.server.BlockDirtSnow.class, org.bukkit.craftbukkit.block.impl.CraftDirtSnow.class);
+ register(net.minecraft.server.BlockDispenser.class, org.bukkit.craftbukkit.block.impl.CraftDispenser.class);
+ register(net.minecraft.server.BlockDoor.class, org.bukkit.craftbukkit.block.impl.CraftDoor.class);
+ register(net.minecraft.server.BlockDropper.class, org.bukkit.craftbukkit.block.impl.CraftDropper.class);
+ register(net.minecraft.server.BlockEndRod.class, org.bukkit.craftbukkit.block.impl.CraftEndRod.class);
+ register(net.minecraft.server.BlockEnderChest.class, org.bukkit.craftbukkit.block.impl.CraftEnderChest.class);
+ register(net.minecraft.server.BlockEnderPortalFrame.class, org.bukkit.craftbukkit.block.impl.CraftEnderPortalFrame.class);
+ register(net.minecraft.server.BlockFence.class, org.bukkit.craftbukkit.block.impl.CraftFence.class);
+ register(net.minecraft.server.BlockFenceGate.class, org.bukkit.craftbukkit.block.impl.CraftFenceGate.class);
+ register(net.minecraft.server.BlockFire.class, org.bukkit.craftbukkit.block.impl.CraftFire.class);
+ register(net.minecraft.server.BlockFloorSign.class, org.bukkit.craftbukkit.block.impl.CraftFloorSign.class);
+ register(net.minecraft.server.BlockFluids.class, org.bukkit.craftbukkit.block.impl.CraftFluids.class);
+ register(net.minecraft.server.BlockFurnace.class, org.bukkit.craftbukkit.block.impl.CraftFurnace.class);
+ register(net.minecraft.server.BlockGlassPane.class, org.bukkit.craftbukkit.block.impl.CraftGlassPane.class);
+ register(net.minecraft.server.BlockGlazedTerracotta.class, org.bukkit.craftbukkit.block.impl.CraftGlazedTerracotta.class);
+ register(net.minecraft.server.BlockGrass.class, org.bukkit.craftbukkit.block.impl.CraftGrass.class);
+ register(net.minecraft.server.BlockHay.class, org.bukkit.craftbukkit.block.impl.CraftHay.class);
+ register(net.minecraft.server.BlockHopper.class, org.bukkit.craftbukkit.block.impl.CraftHopper.class);
+ register(net.minecraft.server.BlockHugeMushroom.class, org.bukkit.craftbukkit.block.impl.CraftHugeMushroom.class);
+ register(net.minecraft.server.BlockIceFrost.class, org.bukkit.craftbukkit.block.impl.CraftIceFrost.class);
+ register(net.minecraft.server.BlockIronBars.class, org.bukkit.craftbukkit.block.impl.CraftIronBars.class);
+ register(net.minecraft.server.BlockJukeBox.class, org.bukkit.craftbukkit.block.impl.CraftJukeBox.class);
+ register(net.minecraft.server.BlockKelp.class, org.bukkit.craftbukkit.block.impl.CraftKelp.class);
+ register(net.minecraft.server.BlockLadder.class, org.bukkit.craftbukkit.block.impl.CraftLadder.class);
+ register(net.minecraft.server.BlockLeaves.class, org.bukkit.craftbukkit.block.impl.CraftLeaves.class);
+ register(net.minecraft.server.BlockLever.class, org.bukkit.craftbukkit.block.impl.CraftLever.class);
+ register(net.minecraft.server.BlockLogAbstract.class, org.bukkit.craftbukkit.block.impl.CraftLogAbstract.class);
+ register(net.minecraft.server.BlockMinecartDetector.class, org.bukkit.craftbukkit.block.impl.CraftMinecartDetector.class);
+ register(net.minecraft.server.BlockMinecartTrack.class, org.bukkit.craftbukkit.block.impl.CraftMinecartTrack.class);
+ register(net.minecraft.server.BlockMycel.class, org.bukkit.craftbukkit.block.impl.CraftMycel.class);
+ register(net.minecraft.server.BlockNetherWart.class, org.bukkit.craftbukkit.block.impl.CraftNetherWart.class);
+ register(net.minecraft.server.BlockNote.class, org.bukkit.craftbukkit.block.impl.CraftNote.class);
+ register(net.minecraft.server.BlockObserver.class, org.bukkit.craftbukkit.block.impl.CraftObserver.class);
+ register(net.minecraft.server.BlockPiston.class, org.bukkit.craftbukkit.block.impl.CraftPiston.class);
+ register(net.minecraft.server.BlockPistonExtension.class, org.bukkit.craftbukkit.block.impl.CraftPistonExtension.class);
+ register(net.minecraft.server.BlockPistonMoving.class, org.bukkit.craftbukkit.block.impl.CraftPistonMoving.class);
+ register(net.minecraft.server.BlockPortal.class, org.bukkit.craftbukkit.block.impl.CraftPortal.class);
+ register(net.minecraft.server.BlockPotatoes.class, org.bukkit.craftbukkit.block.impl.CraftPotatoes.class);
+ register(net.minecraft.server.BlockPoweredRail.class, org.bukkit.craftbukkit.block.impl.CraftPoweredRail.class);
+ register(net.minecraft.server.BlockPressurePlateBinary.class, org.bukkit.craftbukkit.block.impl.CraftPressurePlateBinary.class);
+ register(net.minecraft.server.BlockPressurePlateWeighted.class, org.bukkit.craftbukkit.block.impl.CraftPressurePlateWeighted.class);
+ register(net.minecraft.server.BlockPumpkinCarved.class, org.bukkit.craftbukkit.block.impl.CraftPumpkinCarved.class);
+ register(net.minecraft.server.BlockRedstoneComparator.class, org.bukkit.craftbukkit.block.impl.CraftRedstoneComparator.class);
+ register(net.minecraft.server.BlockRedstoneLamp.class, org.bukkit.craftbukkit.block.impl.CraftRedstoneLamp.class);
+ register(net.minecraft.server.BlockRedstoneOre.class, org.bukkit.craftbukkit.block.impl.CraftRedstoneOre.class);
+ register(net.minecraft.server.BlockRedstoneTorch.class, org.bukkit.craftbukkit.block.impl.CraftRedstoneTorch.class);
+ register(net.minecraft.server.BlockRedstoneTorchWall.class, org.bukkit.craftbukkit.block.impl.CraftRedstoneTorchWall.class);
+ register(net.minecraft.server.BlockRedstoneWire.class, org.bukkit.craftbukkit.block.impl.CraftRedstoneWire.class);
+ register(net.minecraft.server.BlockReed.class, org.bukkit.craftbukkit.block.impl.CraftReed.class);
+ register(net.minecraft.server.BlockRepeater.class, org.bukkit.craftbukkit.block.impl.CraftRepeater.class);
+ register(net.minecraft.server.BlockRotatable.class, org.bukkit.craftbukkit.block.impl.CraftRotatable.class);
+ register(net.minecraft.server.BlockSapling.class, org.bukkit.craftbukkit.block.impl.CraftSapling.class);
+ register(net.minecraft.server.BlockSeaPickle.class, org.bukkit.craftbukkit.block.impl.CraftSeaPickle.class);
+ register(net.minecraft.server.BlockShulkerBox.class, org.bukkit.craftbukkit.block.impl.CraftShulkerBox.class);
+ register(net.minecraft.server.BlockSkull.class, org.bukkit.craftbukkit.block.impl.CraftSkull.class);
+ register(net.minecraft.server.BlockSkullPlayer.class, org.bukkit.craftbukkit.block.impl.CraftSkullPlayer.class);
+ register(net.minecraft.server.BlockSkullPlayerWall.class, org.bukkit.craftbukkit.block.impl.CraftSkullPlayerWall.class);
+ register(net.minecraft.server.BlockSkullWall.class, org.bukkit.craftbukkit.block.impl.CraftSkullWall.class);
+ register(net.minecraft.server.BlockSnow.class, org.bukkit.craftbukkit.block.impl.CraftSnow.class);
+ register(net.minecraft.server.BlockSoil.class, org.bukkit.craftbukkit.block.impl.CraftSoil.class);
+ register(net.minecraft.server.BlockStainedGlassPane.class, org.bukkit.craftbukkit.block.impl.CraftStainedGlassPane.class);
+ register(net.minecraft.server.BlockStairs.class, org.bukkit.craftbukkit.block.impl.CraftStairs.class);
+ register(net.minecraft.server.BlockStem.class, org.bukkit.craftbukkit.block.impl.CraftStem.class);
+ register(net.minecraft.server.BlockStemAttached.class, org.bukkit.craftbukkit.block.impl.CraftStemAttached.class);
+ register(net.minecraft.server.BlockStepAbstract.class, org.bukkit.craftbukkit.block.impl.CraftStepAbstract.class);
+ register(net.minecraft.server.BlockStoneButton.class, org.bukkit.craftbukkit.block.impl.CraftStoneButton.class);
+ register(net.minecraft.server.BlockStructure.class, org.bukkit.craftbukkit.block.impl.CraftStructure.class);
+ register(net.minecraft.server.BlockTallPlantFlower.class, org.bukkit.craftbukkit.block.impl.CraftTallPlantFlower.class);
+ register(net.minecraft.server.BlockTallPlantShearable.class, org.bukkit.craftbukkit.block.impl.CraftTallPlantShearable.class);
+ register(net.minecraft.server.BlockTallSeaGrass.class, org.bukkit.craftbukkit.block.impl.CraftTallSeaGrass.class);
+ register(net.minecraft.server.BlockTorchWall.class, org.bukkit.craftbukkit.block.impl.CraftTorchWall.class);
+ register(net.minecraft.server.BlockTrapdoor.class, org.bukkit.craftbukkit.block.impl.CraftTrapdoor.class);
+ register(net.minecraft.server.BlockTripwire.class, org.bukkit.craftbukkit.block.impl.CraftTripwire.class);
+ register(net.minecraft.server.BlockTripwireHook.class, org.bukkit.craftbukkit.block.impl.CraftTripwireHook.class);
+ register(net.minecraft.server.BlockTurtleEgg.class, org.bukkit.craftbukkit.block.impl.CraftTurtleEgg.class);
+ register(net.minecraft.server.BlockVine.class, org.bukkit.craftbukkit.block.impl.CraftVine.class);
+ register(net.minecraft.server.BlockWallSign.class, org.bukkit.craftbukkit.block.impl.CraftWallSign.class);
+ register(net.minecraft.server.BlockWitherSkull.class, org.bukkit.craftbukkit.block.impl.CraftWitherSkull.class);
+ register(net.minecraft.server.BlockWitherSkullWall.class, org.bukkit.craftbukkit.block.impl.CraftWitherSkullWall.class);
+ register(net.minecraft.server.BlockWoodButton.class, org.bukkit.craftbukkit.block.impl.CraftWoodButton.class);
+ }
+
+ private static void register(Class<? extends Block> nms, Class<? extends CraftBlockData> bukkit) {
+ Preconditions.checkState(MAP.put(nms, bukkit) == null, "Duplicate mapping %s->%s", nms, bukkit);
+ }
+
+ public static CraftBlockData newData(Material material, String data) {
+ IBlockData blockData;
+ Block block = CraftMagicNumbers.getBlock(material);
+
+ // Data provided, use it
+ if (data != null) {
+ try {
+ // Material provided, force that material in
+ if (block != null) {
+ data = Block.REGISTRY.b(block) + data;
+ }
+
+ ArgumentBlock arg = new ArgumentBlock(new StringReader(data), false).a(false);
+ blockData = arg.b();
+ } catch (CommandSyntaxException ex) {
+ throw new IllegalArgumentException("Could not parse data: " + data, ex);
+ }
+ } else {
+ blockData = block.getBlockData();
+ }
+
+ return fromData(blockData);
+ }
+
+ public static CraftBlockData fromData(IBlockData data) {
+ Class<? extends CraftBlockData> craft = MAP.get(data.getBlock().getClass());
+ if (craft == null) {
+ craft = CraftBlockData.class;
+ }
+
+ CraftBlockData ret;
+ try {
+ ret = craft.getDeclaredConstructor(IBlockData.class).newInstance(data);
+ } catch (ReflectiveOperationException ex) {
+ throw new RuntimeException(ex);
+ }
+
+ return ret;
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/data/CraftDirectional.java b/src/main/java/org/bukkit/craftbukkit/block/data/CraftDirectional.java
new file mode 100644
index 00000000..7b3ec881
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/block/data/CraftDirectional.java
@@ -0,0 +1,23 @@
+package org.bukkit.craftbukkit.block.data;
+
+import org.bukkit.block.data.Directional;
+
+public abstract class CraftDirectional extends CraftBlockData implements Directional {
+
+ private static final net.minecraft.server.BlockStateEnum<?> FACING = getEnum("facing");
+
+ @Override
+ public org.bukkit.block.BlockFace getFacing() {
+ return get(FACING, org.bukkit.block.BlockFace.class);
+ }
+
+ @Override
+ public void setFacing(org.bukkit.block.BlockFace facing) {
+ set(FACING, facing);
+ }
+
+ @Override
+ public java.util.Set<org.bukkit.block.BlockFace> getFaces() {
+ return getValues(FACING, org.bukkit.block.BlockFace.class);
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/data/CraftLevelled.java b/src/main/java/org/bukkit/craftbukkit/block/data/CraftLevelled.java
new file mode 100644
index 00000000..3d4afa74
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/block/data/CraftLevelled.java
@@ -0,0 +1,23 @@
+package org.bukkit.craftbukkit.block.data;
+
+import org.bukkit.block.data.Levelled;
+
+public abstract class CraftLevelled extends CraftBlockData implements Levelled {
+
+ private static final net.minecraft.server.BlockStateInteger LEVEL = getInteger("level");
+
+ @Override
+ public int getLevel() {
+ return get(LEVEL);
+ }
+
+ @Override
+ public void setLevel(int level) {
+ set(LEVEL, level);
+ }
+
+ @Override
+ public int getMaximumLevel() {
+ return getMax(LEVEL);
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/data/CraftLightable.java b/src/main/java/org/bukkit/craftbukkit/block/data/CraftLightable.java
new file mode 100644
index 00000000..cfe4b26e
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/block/data/CraftLightable.java
@@ -0,0 +1,18 @@
+package org.bukkit.craftbukkit.block.data;
+
+import org.bukkit.block.data.Lightable;
+
+public abstract class CraftLightable extends CraftBlockData implements Lightable {
+
+ private static final net.minecraft.server.BlockStateBoolean LIT = getBoolean("lit");
+
+ @Override
+ public boolean isLit() {
+ return get(LIT);
+ }
+
+ @Override
+ public void setLit(boolean lit) {
+ set(LIT, lit);
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/data/CraftMultipleFacing.java b/src/main/java/org/bukkit/craftbukkit/block/data/CraftMultipleFacing.java
new file mode 100644
index 00000000..5d2cc2a9
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/block/data/CraftMultipleFacing.java
@@ -0,0 +1,46 @@
+package org.bukkit.craftbukkit.block.data;
+
+import org.bukkit.block.data.MultipleFacing;
+
+public abstract class CraftMultipleFacing extends CraftBlockData implements MultipleFacing {
+
+ private static final net.minecraft.server.BlockStateBoolean[] FACES = new net.minecraft.server.BlockStateBoolean[]{
+ getBoolean("north", true), getBoolean("east", true), getBoolean("south", true), getBoolean("west", true), getBoolean("up", true), getBoolean("down", true)
+ };
+
+ @Override
+ public boolean hasFace(org.bukkit.block.BlockFace face) {
+ return get(FACES[face.ordinal()]);
+ }
+
+ @Override
+ public void setFace(org.bukkit.block.BlockFace face, boolean has) {
+ set(FACES[face.ordinal()], has);
+ }
+
+ @Override
+ public java.util.Set<org.bukkit.block.BlockFace> getFaces() {
+ com.google.common.collect.ImmutableSet.Builder<org.bukkit.block.BlockFace> faces = com.google.common.collect.ImmutableSet.builder();
+
+ for (int i = 0; i < FACES.length; i++) {
+ if (FACES[i] != null && get(FACES[i])) {
+ faces.add(org.bukkit.block.BlockFace.values()[i]);
+ }
+ }
+
+ return faces.build();
+ }
+
+ @Override
+ public java.util.Set<org.bukkit.block.BlockFace> getAllowedFaces() {
+ com.google.common.collect.ImmutableSet.Builder<org.bukkit.block.BlockFace> faces = com.google.common.collect.ImmutableSet.builder();
+
+ for (int i = 0; i < FACES.length; i++) {
+ if (FACES[i] != null) {
+ faces.add(org.bukkit.block.BlockFace.values()[i]);
+ }
+ }
+
+ return faces.build();
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/data/CraftOpenable.java b/src/main/java/org/bukkit/craftbukkit/block/data/CraftOpenable.java
new file mode 100644
index 00000000..31abd411
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/block/data/CraftOpenable.java
@@ -0,0 +1,18 @@
+package org.bukkit.craftbukkit.block.data;
+
+import org.bukkit.block.data.Openable;
+
+public abstract class CraftOpenable extends CraftBlockData implements Openable {
+
+ private static final net.minecraft.server.BlockStateBoolean OPEN = getBoolean("open");
+
+ @Override
+ public boolean isOpen() {
+ return get(OPEN);
+ }
+
+ @Override
+ public void setOpen(boolean open) {
+ set(OPEN, open);
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/data/CraftOrientable.java b/src/main/java/org/bukkit/craftbukkit/block/data/CraftOrientable.java
new file mode 100644
index 00000000..72cc0aa9
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/block/data/CraftOrientable.java
@@ -0,0 +1,23 @@
+package org.bukkit.craftbukkit.block.data;
+
+import org.bukkit.block.data.Orientable;
+
+public class CraftOrientable extends CraftBlockData implements Orientable {
+
+ private static final net.minecraft.server.BlockStateEnum<?> AXIS = getEnum("axis");
+
+ @Override
+ public org.bukkit.Axis getAxis() {
+ return get(AXIS, org.bukkit.Axis.class);
+ }
+
+ @Override
+ public void setAxis(org.bukkit.Axis axis) {
+ set(AXIS, axis);
+ }
+
+ @Override
+ public java.util.Set<org.bukkit.Axis> getAxes() {
+ return getValues(AXIS, org.bukkit.Axis.class);
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/data/CraftPowerable.java b/src/main/java/org/bukkit/craftbukkit/block/data/CraftPowerable.java
new file mode 100644
index 00000000..f932cf17
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/block/data/CraftPowerable.java
@@ -0,0 +1,18 @@
+package org.bukkit.craftbukkit.block.data;
+
+import org.bukkit.block.data.Powerable;
+
+public abstract class CraftPowerable extends CraftBlockData implements Powerable {
+
+ private static final net.minecraft.server.BlockStateBoolean POWERED = getBoolean("powered");
+
+ @Override
+ public boolean isPowered() {
+ return get(POWERED);
+ }
+
+ @Override
+ public void setPowered(boolean powered) {
+ set(POWERED, powered);
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/data/CraftRail.java b/src/main/java/org/bukkit/craftbukkit/block/data/CraftRail.java
new file mode 100644
index 00000000..5ee64559
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/block/data/CraftRail.java
@@ -0,0 +1,23 @@
+package org.bukkit.craftbukkit.block.data;
+
+import org.bukkit.block.data.Rail;
+
+public abstract class CraftRail extends CraftBlockData implements Rail {
+
+ private static final net.minecraft.server.BlockStateEnum<?> SHAPE = getEnum("shape");
+
+ @Override
+ public Shape getShape() {
+ return get(SHAPE, Shape.class);
+ }
+
+ @Override
+ public void setShape(Shape shape) {
+ set(SHAPE, shape);
+ }
+
+ @Override
+ public java.util.Set<Shape> getShapes() {
+ return getValues(SHAPE, Shape.class);
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/data/CraftRotatable.java b/src/main/java/org/bukkit/craftbukkit/block/data/CraftRotatable.java
new file mode 100644
index 00000000..78668da5
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/block/data/CraftRotatable.java
@@ -0,0 +1,107 @@
+package org.bukkit.craftbukkit.block.data;
+
+import org.bukkit.block.data.Rotatable;
+
+public abstract class CraftRotatable extends CraftBlockData implements Rotatable {
+
+ private static final net.minecraft.server.BlockStateInteger ROTATION = getInteger("rotation");
+
+ @Override
+ public org.bukkit.block.BlockFace getRotation() {
+ int data = get(ROTATION);
+ switch (data) {
+ case 0x0:
+ return org.bukkit.block.BlockFace.SOUTH;
+ case 0x1:
+ return org.bukkit.block.BlockFace.SOUTH_SOUTH_WEST;
+ case 0x2:
+ return org.bukkit.block.BlockFace.SOUTH_WEST;
+ case 0x3:
+ return org.bukkit.block.BlockFace.WEST_SOUTH_WEST;
+ case 0x4:
+ return org.bukkit.block.BlockFace.WEST;
+ case 0x5:
+ return org.bukkit.block.BlockFace.WEST_NORTH_WEST;
+ case 0x6:
+ return org.bukkit.block.BlockFace.NORTH_WEST;
+ case 0x7:
+ return org.bukkit.block.BlockFace.NORTH_NORTH_WEST;
+ case 0x8:
+ return org.bukkit.block.BlockFace.NORTH;
+ case 0x9:
+ return org.bukkit.block.BlockFace.NORTH_NORTH_EAST;
+ case 0xA:
+ return org.bukkit.block.BlockFace.NORTH_EAST;
+ case 0xB:
+ return org.bukkit.block.BlockFace.EAST_NORTH_EAST;
+ case 0xC:
+ return org.bukkit.block.BlockFace.EAST;
+ case 0xD:
+ return org.bukkit.block.BlockFace.EAST_SOUTH_EAST;
+ case 0xE:
+ return org.bukkit.block.BlockFace.SOUTH_EAST;
+ case 0xF:
+ return org.bukkit.block.BlockFace.SOUTH_SOUTH_EAST;
+ default:
+ throw new IllegalArgumentException("Unknown rotation " + data);
+ }
+ }
+
+ @Override
+ public void setRotation(org.bukkit.block.BlockFace rotation) {
+ int val;
+ switch (rotation) {
+ case SOUTH:
+ val = 0x0;
+ break;
+ case SOUTH_SOUTH_WEST:
+ val = 0x1;
+ break;
+ case SOUTH_WEST:
+ val = 0x2;
+ break;
+ case WEST_SOUTH_WEST:
+ val = 0x3;
+ break;
+ case WEST:
+ val = 0x4;
+ break;
+ case WEST_NORTH_WEST:
+ val = 0x5;
+ break;
+ case NORTH_WEST:
+ val = 0x6;
+ break;
+ case NORTH_NORTH_WEST:
+ val = 0x7;
+ break;
+ case NORTH:
+ val = 0x8;
+ break;
+ case NORTH_NORTH_EAST:
+ val = 0x9;
+ break;
+ case NORTH_EAST:
+ val = 0xA;
+ break;
+ case EAST_NORTH_EAST:
+ val = 0xB;
+ break;
+ case EAST:
+ val = 0xC;
+ break;
+ case EAST_SOUTH_EAST:
+ val = 0xD;
+ break;
+ case SOUTH_EAST:
+ val = 0xE;
+ break;
+ case SOUTH_SOUTH_EAST:
+ val = 0xF;
+ break;
+ default:
+ throw new IllegalArgumentException("Illegal rotation " + rotation);
+ }
+ set(ROTATION, val);
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/data/CraftSnowable.java b/src/main/java/org/bukkit/craftbukkit/block/data/CraftSnowable.java
new file mode 100644
index 00000000..e59c3d23
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/block/data/CraftSnowable.java
@@ -0,0 +1,18 @@
+package org.bukkit.craftbukkit.block.data;
+
+import org.bukkit.block.data.Snowable;
+
+public abstract class CraftSnowable extends CraftBlockData implements Snowable {
+
+ private static final net.minecraft.server.BlockStateBoolean SNOWY = getBoolean("snowy");
+
+ @Override
+ public boolean isSnowy() {
+ return get(SNOWY);
+ }
+
+ @Override
+ public void setSnowy(boolean snowy) {
+ set(SNOWY, snowy);
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/data/CraftWaterlogged.java b/src/main/java/org/bukkit/craftbukkit/block/data/CraftWaterlogged.java
new file mode 100644
index 00000000..011c9aea
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/block/data/CraftWaterlogged.java
@@ -0,0 +1,19 @@
+package org.bukkit.craftbukkit.block.data;
+
+import org.bukkit.block.data.Waterlogged;
+import org.bukkit.craftbukkit.block.data.CraftBlockData;
+
+public abstract class CraftWaterlogged extends CraftBlockData implements Waterlogged {
+
+ private static final net.minecraft.server.BlockStateBoolean WATERLOGGED = getBoolean("waterlogged");
+
+ @Override
+ public boolean isWaterlogged() {
+ return get(WATERLOGGED);
+ }
+
+ @Override
+ public void setWaterlogged(boolean waterlogged) {
+ set(WATERLOGGED, waterlogged);
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftBed.java b/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftBed.java
new file mode 100644
index 00000000..f86ed259
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftBed.java
@@ -0,0 +1,25 @@
+package org.bukkit.craftbukkit.block.data.type;
+
+import org.bukkit.block.data.type.Bed;
+import org.bukkit.craftbukkit.block.data.CraftBlockData;
+
+public abstract class CraftBed extends CraftBlockData implements Bed {
+
+ private static final net.minecraft.server.BlockStateEnum<?> PART = getEnum("part");
+ private static final net.minecraft.server.BlockStateBoolean OCCUPIED = getBoolean("occupied");
+
+ @Override
+ public Part getPart() {
+ return get(PART, Part.class);
+ }
+
+ @Override
+ public void setPart(Part part) {
+ set(PART, part);
+ }
+
+ @Override
+ public boolean isOccupied() {
+ return get(OCCUPIED);
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftBrewingStand.java b/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftBrewingStand.java
new file mode 100644
index 00000000..9349e02f
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftBrewingStand.java
@@ -0,0 +1,39 @@
+package org.bukkit.craftbukkit.block.data.type;
+
+import org.bukkit.block.data.type.BrewingStand;
+import org.bukkit.craftbukkit.block.data.CraftBlockData;
+
+public abstract class CraftBrewingStand extends CraftBlockData implements BrewingStand {
+
+ private static final net.minecraft.server.BlockStateBoolean[] HAS_BOTTLE = new net.minecraft.server.BlockStateBoolean[]{
+ getBoolean("has_bottle_0"), getBoolean("has_bottle_1"), getBoolean("has_bottle_2")
+ };
+
+ @Override
+ public boolean hasBottle(int bottle) {
+ return get(HAS_BOTTLE[bottle]);
+ }
+
+ @Override
+ public void setBottle(int bottle, boolean has) {
+ set(HAS_BOTTLE[bottle], has);
+ }
+
+ @Override
+ public java.util.Set<Integer> getBottles() {
+ com.google.common.collect.ImmutableSet.Builder<Integer> bottles = com.google.common.collect.ImmutableSet.builder();
+
+ for (int index = 0; index < getMaximumBottles(); index++) {
+ if (hasBottle(index)) {
+ bottles.add(index);
+ }
+ }
+
+ return bottles.build();
+ }
+
+ @Override
+ public int getMaximumBottles() {
+ return HAS_BOTTLE.length;
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftBubbleColumn.java b/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftBubbleColumn.java
new file mode 100644
index 00000000..eedb5102
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftBubbleColumn.java
@@ -0,0 +1,19 @@
+package org.bukkit.craftbukkit.block.data.type;
+
+import org.bukkit.block.data.type.BubbleColumn;
+import org.bukkit.craftbukkit.block.data.CraftBlockData;
+
+public abstract class CraftBubbleColumn extends CraftBlockData implements BubbleColumn {
+
+ private static final net.minecraft.server.BlockStateBoolean DRAG = getBoolean("drag");
+
+ @Override
+ public boolean isDrag() {
+ return get(DRAG);
+ }
+
+ @Override
+ public void setDrag(boolean drag) {
+ set(DRAG, drag);
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftCake.java b/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftCake.java
new file mode 100644
index 00000000..aae60937
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftCake.java
@@ -0,0 +1,24 @@
+package org.bukkit.craftbukkit.block.data.type;
+
+import org.bukkit.block.data.type.Cake;
+import org.bukkit.craftbukkit.block.data.CraftBlockData;
+
+public abstract class CraftCake extends CraftBlockData implements Cake {
+
+ private static final net.minecraft.server.BlockStateInteger BITES = getInteger("bites");
+
+ @Override
+ public int getBites() {
+ return get(BITES);
+ }
+
+ @Override
+ public void setBites(int bites) {
+ set(BITES, bites);
+ }
+
+ @Override
+ public int getMaximumBites() {
+ return getMax(BITES);
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftChest.java b/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftChest.java
new file mode 100644
index 00000000..70473ef4
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftChest.java
@@ -0,0 +1,19 @@
+package org.bukkit.craftbukkit.block.data.type;
+
+import org.bukkit.block.data.type.Chest;
+import org.bukkit.craftbukkit.block.data.CraftBlockData;
+
+public abstract class CraftChest extends CraftBlockData implements Chest {
+
+ private static final net.minecraft.server.BlockStateEnum<?> TYPE = getEnum("type");
+
+ @Override
+ public Type getType() {
+ return get(TYPE, Type.class);
+ }
+
+ @Override
+ public void setType(Type type) {
+ set(TYPE, type);
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftCommandBlock.java b/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftCommandBlock.java
new file mode 100644
index 00000000..ddb9ac5e
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftCommandBlock.java
@@ -0,0 +1,19 @@
+package org.bukkit.craftbukkit.block.data.type;
+
+import org.bukkit.block.data.type.CommandBlock;
+import org.bukkit.craftbukkit.block.data.CraftBlockData;
+
+public abstract class CraftCommandBlock extends CraftBlockData implements CommandBlock {
+
+ private static final net.minecraft.server.BlockStateBoolean CONDITIONAL = getBoolean("conditional");
+
+ @Override
+ public boolean isConditional() {
+ return get(CONDITIONAL);
+ }
+
+ @Override
+ public void setConditional(boolean conditional) {
+ set(CONDITIONAL, conditional);
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftComparator.java b/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftComparator.java
new file mode 100644
index 00000000..4f3130a5
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftComparator.java
@@ -0,0 +1,19 @@
+package org.bukkit.craftbukkit.block.data.type;
+
+import org.bukkit.block.data.type.Comparator;
+import org.bukkit.craftbukkit.block.data.CraftBlockData;
+
+public abstract class CraftComparator extends CraftBlockData implements Comparator {
+
+ private static final net.minecraft.server.BlockStateEnum<?> MODE = getEnum("mode");
+
+ @Override
+ public Mode getMode() {
+ return get(MODE, Mode.class);
+ }
+
+ @Override
+ public void setMode(Mode mode) {
+ set(MODE, mode);
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftDaylightDetector.java b/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftDaylightDetector.java
new file mode 100644
index 00000000..842fe51f
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftDaylightDetector.java
@@ -0,0 +1,19 @@
+package org.bukkit.craftbukkit.block.data.type;
+
+import org.bukkit.block.data.type.DaylightDetector;
+import org.bukkit.craftbukkit.block.data.CraftBlockData;
+
+public abstract class CraftDaylightDetector extends CraftBlockData implements DaylightDetector {
+
+ private static final net.minecraft.server.BlockStateBoolean INVERTED = getBoolean("inverted");
+
+ @Override
+ public boolean isInverted() {
+ return get(INVERTED);
+ }
+
+ @Override
+ public void setInverted(boolean inverted) {
+ set(INVERTED, inverted);
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftDispenser.java b/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftDispenser.java
new file mode 100644
index 00000000..5d43240e
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftDispenser.java
@@ -0,0 +1,19 @@
+package org.bukkit.craftbukkit.block.data.type;
+
+import org.bukkit.block.data.type.Dispenser;
+import org.bukkit.craftbukkit.block.data.CraftBlockData;
+
+public abstract class CraftDispenser extends CraftBlockData implements Dispenser {
+
+ private static final net.minecraft.server.BlockStateBoolean TRIGGERED = getBoolean("triggered");
+
+ @Override
+ public boolean isTriggered() {
+ return get(TRIGGERED);
+ }
+
+ @Override
+ public void setTriggered(boolean triggered) {
+ set(TRIGGERED, triggered);
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftDoor.java b/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftDoor.java
new file mode 100644
index 00000000..3fc75dd2
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftDoor.java
@@ -0,0 +1,19 @@
+package org.bukkit.craftbukkit.block.data.type;
+
+import org.bukkit.block.data.type.Door;
+import org.bukkit.craftbukkit.block.data.CraftBlockData;
+
+public abstract class CraftDoor extends CraftBlockData implements Door {
+
+ private static final net.minecraft.server.BlockStateEnum<?> HINGE = getEnum("hinge");
+
+ @Override
+ public Hinge getHinge() {
+ return get(HINGE, Hinge.class);
+ }
+
+ @Override
+ public void setHinge(Hinge hinge) {
+ set(HINGE, hinge);
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftEndPortalFrame.java b/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftEndPortalFrame.java
new file mode 100644
index 00000000..84cd1d03
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftEndPortalFrame.java
@@ -0,0 +1,19 @@
+package org.bukkit.craftbukkit.block.data.type;
+
+import org.bukkit.block.data.type.EndPortalFrame;
+import org.bukkit.craftbukkit.block.data.CraftBlockData;
+
+public abstract class CraftEndPortalFrame extends CraftBlockData implements EndPortalFrame {
+
+ private static final net.minecraft.server.BlockStateBoolean EYE = getBoolean("eye");
+
+ @Override
+ public boolean hasEye() {
+ return get(EYE);
+ }
+
+ @Override
+ public void setEye(boolean eye) {
+ set(EYE, eye);
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftFarmland.java b/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftFarmland.java
new file mode 100644
index 00000000..515ee588
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftFarmland.java
@@ -0,0 +1,24 @@
+package org.bukkit.craftbukkit.block.data.type;
+
+import org.bukkit.block.data.type.Farmland;
+import org.bukkit.craftbukkit.block.data.CraftBlockData;
+
+public abstract class CraftFarmland extends CraftBlockData implements Farmland {
+
+ private static final net.minecraft.server.BlockStateInteger MOISTURE = getInteger("moisture");
+
+ @Override
+ public int getMoisture() {
+ return get(MOISTURE);
+ }
+
+ @Override
+ public void setMoisture(int moisture) {
+ set(MOISTURE, moisture);
+ }
+
+ @Override
+ public int getMaximumMoisture() {
+ return getMax(MOISTURE);
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftGate.java b/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftGate.java
new file mode 100644
index 00000000..1f6ad5d9
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftGate.java
@@ -0,0 +1,19 @@
+package org.bukkit.craftbukkit.block.data.type;
+
+import org.bukkit.block.data.type.Gate;
+import org.bukkit.craftbukkit.block.data.CraftBlockData;
+
+public abstract class CraftGate extends CraftBlockData implements Gate {
+
+ private static final net.minecraft.server.BlockStateBoolean IN_WALL = getBoolean("in_wall");
+
+ @Override
+ public boolean isInWall() {
+ return get(IN_WALL);
+ }
+
+ @Override
+ public void setInWall(boolean inWall) {
+ set(IN_WALL, inWall);
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftHopper.java b/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftHopper.java
new file mode 100644
index 00000000..055629fd
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftHopper.java
@@ -0,0 +1,19 @@
+package org.bukkit.craftbukkit.block.data.type;
+
+import org.bukkit.block.data.type.Hopper;
+import org.bukkit.craftbukkit.block.data.CraftBlockData;
+
+public abstract class CraftHopper extends CraftBlockData implements Hopper {
+
+ private static final net.minecraft.server.BlockStateBoolean ENABLED = getBoolean("enabled");
+
+ @Override
+ public boolean isEnabled() {
+ return get(ENABLED);
+ }
+
+ @Override
+ public void setEnabled(boolean enabled) {
+ set(ENABLED, enabled);
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftJukebox.java b/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftJukebox.java
new file mode 100644
index 00000000..32eab86d
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftJukebox.java
@@ -0,0 +1,14 @@
+package org.bukkit.craftbukkit.block.data.type;
+
+import org.bukkit.craftbukkit.block.data.CraftBlockData;
+import org.bukkit.block.data.type.Jukebox;
+
+public abstract class CraftJukebox extends CraftBlockData implements Jukebox {
+
+ private static final net.minecraft.server.BlockStateBoolean HAS_RECORD = getBoolean("has_record");
+
+ @Override
+ public boolean hasRecord() {
+ return get(HAS_RECORD);
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftLeaves.java b/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftLeaves.java
new file mode 100644
index 00000000..a233f555
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftLeaves.java
@@ -0,0 +1,30 @@
+package org.bukkit.craftbukkit.block.data.type;
+
+import org.bukkit.block.data.type.Leaves;
+import org.bukkit.craftbukkit.block.data.CraftBlockData;
+
+public class CraftLeaves extends CraftBlockData implements Leaves {
+
+ private static final net.minecraft.server.BlockStateInteger DISTANCE = getInteger("distance");
+ private static final net.minecraft.server.BlockStateBoolean PERSISTENT = getBoolean("persistent");
+
+ @Override
+ public boolean isPersistent() {
+ return get(PERSISTENT);
+ }
+
+ @Override
+ public void setPersistent(boolean persistent) {
+ set(PERSISTENT, persistent);
+ }
+
+ @Override
+ public int getDistance() {
+ return get(DISTANCE);
+ }
+
+ @Override
+ public void setDistance(int distance) {
+ set(DISTANCE, distance);
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftNoteBlock.java b/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftNoteBlock.java
new file mode 100644
index 00000000..51814a49
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftNoteBlock.java
@@ -0,0 +1,30 @@
+package org.bukkit.craftbukkit.block.data.type;
+
+import org.bukkit.block.data.type.NoteBlock;
+import org.bukkit.craftbukkit.block.data.CraftBlockData;
+
+public abstract class CraftNoteBlock extends CraftBlockData implements NoteBlock {
+
+ private static final net.minecraft.server.BlockStateEnum<?> INSTRUMENT = getEnum("instrument");
+ private static final net.minecraft.server.BlockStateInteger NOTE = getInteger("note");
+
+ @Override
+ public org.bukkit.Instrument getInstrument() {
+ return get(INSTRUMENT, org.bukkit.Instrument.class);
+ }
+
+ @Override
+ public void setInstrument(org.bukkit.Instrument instrument) {
+ set(INSTRUMENT, instrument);
+ }
+
+ @Override
+ public org.bukkit.Note getNote() {
+ return new org.bukkit.Note(get(NOTE));
+ }
+
+ @Override
+ public void setNote(org.bukkit.Note note) {
+ set(NOTE, (int) note.getId());
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftPiston.java b/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftPiston.java
new file mode 100644
index 00000000..8cebb751
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftPiston.java
@@ -0,0 +1,19 @@
+package org.bukkit.craftbukkit.block.data.type;
+
+import org.bukkit.block.data.type.Piston;
+import org.bukkit.craftbukkit.block.data.CraftBlockData;
+
+public abstract class CraftPiston extends CraftBlockData implements Piston {
+
+ private static final net.minecraft.server.BlockStateBoolean EXTENDED = getBoolean("extended");
+
+ @Override
+ public boolean isExtended() {
+ return get(EXTENDED);
+ }
+
+ @Override
+ public void setExtended(boolean extended) {
+ set(EXTENDED, extended);
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftPistonHead.java b/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftPistonHead.java
new file mode 100644
index 00000000..3fb24d4b
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftPistonHead.java
@@ -0,0 +1,19 @@
+package org.bukkit.craftbukkit.block.data.type;
+
+import org.bukkit.block.data.type.PistonHead;
+import org.bukkit.craftbukkit.block.data.CraftBlockData;
+
+public abstract class CraftPistonHead extends CraftBlockData implements PistonHead {
+
+ private static final net.minecraft.server.BlockStateBoolean SHORT = getBoolean("short");
+
+ @Override
+ public boolean isShort() {
+ return get(SHORT);
+ }
+
+ @Override
+ public void setShort(boolean _short) {
+ set(SHORT, _short);
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftRedstoneWire.java b/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftRedstoneWire.java
new file mode 100644
index 00000000..34923dad
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftRedstoneWire.java
@@ -0,0 +1,49 @@
+package org.bukkit.craftbukkit.block.data.type;
+
+import org.bukkit.block.data.type.RedstoneWire;
+import org.bukkit.craftbukkit.block.data.CraftBlockData;
+
+public abstract class CraftRedstoneWire extends CraftBlockData implements RedstoneWire {
+
+ private static final net.minecraft.server.BlockStateEnum<?> NORTH = getEnum("north");
+ private static final net.minecraft.server.BlockStateEnum<?> EAST = getEnum("east");
+ private static final net.minecraft.server.BlockStateEnum<?> SOUTH = getEnum("south");
+ private static final net.minecraft.server.BlockStateEnum<?> WEST = getEnum("west");
+
+ @Override
+ public Connection getFace(org.bukkit.block.BlockFace face) {
+ switch (face) {
+ case NORTH:
+ return get(NORTH, Connection.class);
+ case EAST:
+ return get(EAST, Connection.class);
+ case SOUTH:
+ return get(SOUTH, Connection.class);
+ case WEST:
+ return get(WEST, Connection.class);
+ default:
+ throw new IllegalArgumentException("Cannot have face " + face);
+ }
+ }
+
+ @Override
+ public void setFace(org.bukkit.block.BlockFace face, Connection connection) {
+ switch (face) {
+ case NORTH:
+ set(NORTH, connection);
+ case EAST:
+ set(EAST, connection);
+ case SOUTH:
+ set(SOUTH, connection);
+ case WEST:
+ set(WEST, connection);
+ default:
+ throw new IllegalArgumentException("Cannot have face " + face);
+ }
+ }
+
+ @Override
+ public java.util.Set<org.bukkit.block.BlockFace> getAllowedFaces() {
+ return com.google.common.collect.ImmutableSet.of(org.bukkit.block.BlockFace.NORTH, org.bukkit.block.BlockFace.EAST, org.bukkit.block.BlockFace.SOUTH, org.bukkit.block.BlockFace.WEST);
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftRepeater.java b/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftRepeater.java
new file mode 100644
index 00000000..482a4ed7
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftRepeater.java
@@ -0,0 +1,40 @@
+package org.bukkit.craftbukkit.block.data.type;
+
+import org.bukkit.block.data.type.Repeater;
+import org.bukkit.craftbukkit.block.data.CraftBlockData;
+
+public abstract class CraftRepeater extends CraftBlockData implements Repeater {
+
+ private static final net.minecraft.server.BlockStateInteger DELAY = getInteger("delay");
+ private static final net.minecraft.server.BlockStateBoolean LOCKED = getBoolean("locked");
+
+ @Override
+ public int getDelay() {
+ return get(DELAY);
+ }
+
+ @Override
+ public void setDelay(int delay) {
+ set(DELAY, delay);
+ }
+
+ @Override
+ public int getMinimumDelay() {
+ return getMin(DELAY);
+ }
+
+ @Override
+ public int getMaximumDelay() {
+ return getMax(DELAY);
+ }
+
+ @Override
+ public boolean isLocked() {
+ return get(LOCKED);
+ }
+
+ @Override
+ public void setLocked(boolean locked) {
+ set(LOCKED, locked);
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftSapling.java b/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftSapling.java
new file mode 100644
index 00000000..dd96acff
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftSapling.java
@@ -0,0 +1,24 @@
+package org.bukkit.craftbukkit.block.data.type;
+
+import org.bukkit.block.data.type.Sapling;
+import org.bukkit.craftbukkit.block.data.CraftBlockData;
+
+public abstract class CraftSapling extends CraftBlockData implements Sapling {
+
+ private static final net.minecraft.server.BlockStateInteger STAGE = getInteger("stage");
+
+ @Override
+ public int getStage() {
+ return get(STAGE);
+ }
+
+ @Override
+ public void setStage(int stage) {
+ set(STAGE, stage);
+ }
+
+ @Override
+ public int getMaximumStage() {
+ return getMax(STAGE);
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftSeaPickle.java b/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftSeaPickle.java
new file mode 100644
index 00000000..dc138d9c
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftSeaPickle.java
@@ -0,0 +1,29 @@
+package org.bukkit.craftbukkit.block.data.type;
+
+import org.bukkit.block.data.type.SeaPickle;
+import org.bukkit.craftbukkit.block.data.CraftBlockData;
+
+public abstract class CraftSeaPickle extends CraftBlockData implements SeaPickle {
+
+ private static final net.minecraft.server.BlockStateInteger PICKLES = getInteger("pickles");
+
+ @Override
+ public int getPickles() {
+ return get(PICKLES);
+ }
+
+ @Override
+ public void setPickles(int pickles) {
+ set(PICKLES, pickles);
+ }
+
+ @Override
+ public int getMinimumPickles() {
+ return getMin(PICKLES);
+ }
+
+ @Override
+ public int getMaximumPickles() {
+ return getMax(PICKLES);
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftSlab.java b/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftSlab.java
new file mode 100644
index 00000000..1fde489e
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftSlab.java
@@ -0,0 +1,19 @@
+package org.bukkit.craftbukkit.block.data.type;
+
+import org.bukkit.block.data.type.Slab;
+import org.bukkit.craftbukkit.block.data.CraftBlockData;
+
+public abstract class CraftSlab extends CraftBlockData implements Slab {
+
+ private static final net.minecraft.server.BlockStateEnum<?> TYPE = getEnum("type");
+
+ @Override
+ public Type getType() {
+ return get(TYPE, Type.class);
+ }
+
+ @Override
+ public void setType(Type type) {
+ set(TYPE, type);
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftSnow.java b/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftSnow.java
new file mode 100644
index 00000000..879a5d67
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftSnow.java
@@ -0,0 +1,29 @@
+package org.bukkit.craftbukkit.block.data.type;
+
+import org.bukkit.block.data.type.Snow;
+import org.bukkit.craftbukkit.block.data.CraftBlockData;
+
+public class CraftSnow extends CraftBlockData implements Snow {
+
+ private static final net.minecraft.server.BlockStateInteger LAYERS = getInteger("layers");
+
+ @Override
+ public int getLayers() {
+ return get(LAYERS);
+ }
+
+ @Override
+ public void setLayers(int layers) {
+ set(LAYERS, layers);
+ }
+
+ @Override
+ public int getMinimumLayers() {
+ return getMin(LAYERS);
+ }
+
+ @Override
+ public int getMaximumLayers() {
+ return getMax(LAYERS);
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftStairs.java b/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftStairs.java
new file mode 100644
index 00000000..c6ccd382
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftStairs.java
@@ -0,0 +1,19 @@
+package org.bukkit.craftbukkit.block.data.type;
+
+import org.bukkit.block.data.type.Stairs;
+import org.bukkit.craftbukkit.block.data.CraftBlockData;
+
+public abstract class CraftStairs extends CraftBlockData implements Stairs {
+
+ private static final net.minecraft.server.BlockStateEnum<?> SHAPE = getEnum("shape");
+
+ @Override
+ public Shape getShape() {
+ return get(SHAPE, Shape.class);
+ }
+
+ @Override
+ public void setShape(Shape shape) {
+ set(SHAPE, shape);
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftStructureBlock.java b/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftStructureBlock.java
new file mode 100644
index 00000000..8b8a82bd
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftStructureBlock.java
@@ -0,0 +1,19 @@
+package org.bukkit.craftbukkit.block.data.type;
+
+import org.bukkit.block.data.type.StructureBlock;
+import org.bukkit.craftbukkit.block.data.CraftBlockData;
+
+public abstract class CraftStructureBlock extends CraftBlockData implements StructureBlock {
+
+ private static final net.minecraft.server.BlockStateEnum<?> MODE = getEnum("mode");
+
+ @Override
+ public Mode getMode() {
+ return get(MODE, Mode.class);
+ }
+
+ @Override
+ public void setMode(Mode mode) {
+ set(MODE, mode);
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftSwitch.java b/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftSwitch.java
new file mode 100644
index 00000000..2761b371
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftSwitch.java
@@ -0,0 +1,19 @@
+package org.bukkit.craftbukkit.block.data.type;
+
+import org.bukkit.block.data.type.Switch;
+import org.bukkit.craftbukkit.block.data.CraftBlockData;
+
+public abstract class CraftSwitch extends CraftBlockData implements Switch {
+
+ private static final net.minecraft.server.BlockStateEnum<?> FACE = getEnum("face");
+
+ @Override
+ public Face getFace() {
+ return get(FACE, Face.class);
+ }
+
+ @Override
+ public void setFace(Face face) {
+ set(FACE, face);
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftTechnicalPiston.java b/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftTechnicalPiston.java
new file mode 100644
index 00000000..e42fe0d6
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftTechnicalPiston.java
@@ -0,0 +1,19 @@
+package org.bukkit.craftbukkit.block.data.type;
+
+import org.bukkit.block.data.type.TechnicalPiston;
+import org.bukkit.craftbukkit.block.data.CraftBlockData;
+
+public abstract class CraftTechnicalPiston extends CraftBlockData implements TechnicalPiston {
+
+ private static final net.minecraft.server.BlockStateEnum<?> TYPE = getEnum("type");
+
+ @Override
+ public Type getType() {
+ return get(TYPE, Type.class);
+ }
+
+ @Override
+ public void setType(Type type) {
+ set(TYPE, type);
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftTripwire.java b/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftTripwire.java
new file mode 100644
index 00000000..55bacd2e
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftTripwire.java
@@ -0,0 +1,19 @@
+package org.bukkit.craftbukkit.block.data.type;
+
+import org.bukkit.block.data.type.Tripwire;
+import org.bukkit.craftbukkit.block.data.CraftBlockData;
+
+public abstract class CraftTripwire extends CraftBlockData implements Tripwire {
+
+ private static final net.minecraft.server.BlockStateBoolean DISARMED = getBoolean("disarmed");
+
+ @Override
+ public boolean isDisarmed() {
+ return get(DISARMED);
+ }
+
+ @Override
+ public void setDisarmed(boolean disarmed) {
+ set(DISARMED, disarmed);
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftTurtleEgg.java b/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftTurtleEgg.java
new file mode 100644
index 00000000..dca37886
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftTurtleEgg.java
@@ -0,0 +1,45 @@
+package org.bukkit.craftbukkit.block.data.type;
+
+import org.bukkit.block.data.type.TurtleEgg;
+import org.bukkit.craftbukkit.block.data.CraftBlockData;
+
+public abstract class CraftTurtleEgg extends CraftBlockData implements TurtleEgg {
+
+ private static final net.minecraft.server.BlockStateInteger EGGS = getInteger("eggs");
+ private static final net.minecraft.server.BlockStateInteger HATCH = getInteger("hatch");
+
+ @Override
+ public int getEggs() {
+ return get(EGGS);
+ }
+
+ @Override
+ public void setEggs(int eggs) {
+ set(EGGS, eggs);
+ }
+
+ @Override
+ public int getMinimumEggs() {
+ return getMin(EGGS);
+ }
+
+ @Override
+ public int getMaximumEggs() {
+ return getMax(EGGS);
+ }
+
+ @Override
+ public int getHatch() {
+ return get(HATCH);
+ }
+
+ @Override
+ public void setHatch(int hatch) {
+ set(HATCH, hatch);
+ }
+
+ @Override
+ public int getMaximumHatch() {
+ return getMax(HATCH);
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftAnvil.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftAnvil.java
new file mode 100644
index 00000000..3010e8fe
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftAnvil.java
@@ -0,0 +1,34 @@
+/**
+ * Automatically generated file, changes will be lost.
+ */
+package org.bukkit.craftbukkit.block.impl;
+
+public final class CraftAnvil extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.Directional {
+
+ public CraftAnvil() {
+ super();
+ }
+
+ public CraftAnvil(net.minecraft.server.IBlockData state) {
+ super(state);
+ }
+
+ // org.bukkit.craftbukkit.block.data.CraftDirectional
+
+ private static final net.minecraft.server.BlockStateEnum<?> FACING = getEnum(net.minecraft.server.BlockAnvil.class, "facing");
+
+ @Override
+ public org.bukkit.block.BlockFace getFacing() {
+ return get(FACING, org.bukkit.block.BlockFace.class);
+ }
+
+ @Override
+ public void setFacing(org.bukkit.block.BlockFace facing) {
+ set(FACING, facing);
+ }
+
+ @Override
+ public java.util.Set<org.bukkit.block.BlockFace> getFaces() {
+ return getValues(FACING, org.bukkit.block.BlockFace.class);
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftBanner.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftBanner.java
new file mode 100644
index 00000000..d95c548b
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftBanner.java
@@ -0,0 +1,118 @@
+/**
+ * Automatically generated file, changes will be lost.
+ */
+package org.bukkit.craftbukkit.block.impl;
+
+public final class CraftBanner extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.Rotatable {
+
+ public CraftBanner() {
+ super();
+ }
+
+ public CraftBanner(net.minecraft.server.IBlockData state) {
+ super(state);
+ }
+
+ // org.bukkit.craftbukkit.block.data.CraftRotatable
+
+ private static final net.minecraft.server.BlockStateInteger ROTATION = getInteger(net.minecraft.server.BlockBanner.class, "rotation");
+
+ @Override
+ public org.bukkit.block.BlockFace getRotation() {
+ int data = get(ROTATION);
+ switch (data) {
+ case 0x0:
+ return org.bukkit.block.BlockFace.SOUTH;
+ case 0x1:
+ return org.bukkit.block.BlockFace.SOUTH_SOUTH_WEST;
+ case 0x2:
+ return org.bukkit.block.BlockFace.SOUTH_WEST;
+ case 0x3:
+ return org.bukkit.block.BlockFace.WEST_SOUTH_WEST;
+ case 0x4:
+ return org.bukkit.block.BlockFace.WEST;
+ case 0x5:
+ return org.bukkit.block.BlockFace.WEST_NORTH_WEST;
+ case 0x6:
+ return org.bukkit.block.BlockFace.NORTH_WEST;
+ case 0x7:
+ return org.bukkit.block.BlockFace.NORTH_NORTH_WEST;
+ case 0x8:
+ return org.bukkit.block.BlockFace.NORTH;
+ case 0x9:
+ return org.bukkit.block.BlockFace.NORTH_NORTH_EAST;
+ case 0xA:
+ return org.bukkit.block.BlockFace.NORTH_EAST;
+ case 0xB:
+ return org.bukkit.block.BlockFace.EAST_NORTH_EAST;
+ case 0xC:
+ return org.bukkit.block.BlockFace.EAST;
+ case 0xD:
+ return org.bukkit.block.BlockFace.EAST_SOUTH_EAST;
+ case 0xE:
+ return org.bukkit.block.BlockFace.SOUTH_EAST;
+ case 0xF:
+ return org.bukkit.block.BlockFace.SOUTH_SOUTH_EAST;
+ default:
+ throw new IllegalArgumentException("Unknown rotation " + data);
+ }
+ }
+
+ @Override
+ public void setRotation(org.bukkit.block.BlockFace rotation) {
+ int val;
+ switch (rotation) {
+ case SOUTH:
+ val = 0x0;
+ break;
+ case SOUTH_SOUTH_WEST:
+ val = 0x1;
+ break;
+ case SOUTH_WEST:
+ val = 0x2;
+ break;
+ case WEST_SOUTH_WEST:
+ val = 0x3;
+ break;
+ case WEST:
+ val = 0x4;
+ break;
+ case WEST_NORTH_WEST:
+ val = 0x5;
+ break;
+ case NORTH_WEST:
+ val = 0x6;
+ break;
+ case NORTH_NORTH_WEST:
+ val = 0x7;
+ break;
+ case NORTH:
+ val = 0x8;
+ break;
+ case NORTH_NORTH_EAST:
+ val = 0x9;
+ break;
+ case NORTH_EAST:
+ val = 0xA;
+ break;
+ case EAST_NORTH_EAST:
+ val = 0xB;
+ break;
+ case EAST:
+ val = 0xC;
+ break;
+ case EAST_SOUTH_EAST:
+ val = 0xD;
+ break;
+ case SOUTH_EAST:
+ val = 0xE;
+ break;
+ case SOUTH_SOUTH_EAST:
+ val = 0xF;
+ break;
+ default:
+ throw new IllegalArgumentException("Illegal rotation " + rotation);
+ }
+ set(ROTATION, val);
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftBannerWall.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftBannerWall.java
new file mode 100644
index 00000000..48215035
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftBannerWall.java
@@ -0,0 +1,34 @@
+/**
+ * Automatically generated file, changes will be lost.
+ */
+package org.bukkit.craftbukkit.block.impl;
+
+public final class CraftBannerWall extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.Directional {
+
+ public CraftBannerWall() {
+ super();
+ }
+
+ public CraftBannerWall(net.minecraft.server.IBlockData state) {
+ super(state);
+ }
+
+ // org.bukkit.craftbukkit.block.data.CraftDirectional
+
+ private static final net.minecraft.server.BlockStateEnum<?> FACING = getEnum(net.minecraft.server.BlockBannerWall.class, "facing");
+
+ @Override
+ public org.bukkit.block.BlockFace getFacing() {
+ return get(FACING, org.bukkit.block.BlockFace.class);
+ }
+
+ @Override
+ public void setFacing(org.bukkit.block.BlockFace facing) {
+ set(FACING, facing);
+ }
+
+ @Override
+ public java.util.Set<org.bukkit.block.BlockFace> getFaces() {
+ return getValues(FACING, org.bukkit.block.BlockFace.class);
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftBed.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftBed.java
new file mode 100644
index 00000000..c625c964
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftBed.java
@@ -0,0 +1,54 @@
+/**
+ * Automatically generated file, changes will be lost.
+ */
+package org.bukkit.craftbukkit.block.impl;
+
+public final class CraftBed extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.type.Bed, org.bukkit.block.data.Directional {
+
+ public CraftBed() {
+ super();
+ }
+
+ public CraftBed(net.minecraft.server.IBlockData state) {
+ super(state);
+ }
+
+ // org.bukkit.craftbukkit.block.data.type.CraftBed
+
+ private static final net.minecraft.server.BlockStateEnum<?> PART = getEnum(net.minecraft.server.BlockBed.class, "part");
+ private static final net.minecraft.server.BlockStateBoolean OCCUPIED = getBoolean(net.minecraft.server.BlockBed.class, "occupied");
+
+ @Override
+ public Part getPart() {
+ return get(PART, Part.class);
+ }
+
+ @Override
+ public void setPart(Part part) {
+ set(PART, part);
+ }
+
+ @Override
+ public boolean isOccupied() {
+ return get(OCCUPIED);
+ }
+
+ // org.bukkit.craftbukkit.block.data.CraftDirectional
+
+ private static final net.minecraft.server.BlockStateEnum<?> FACING = getEnum(net.minecraft.server.BlockBed.class, "facing");
+
+ @Override
+ public org.bukkit.block.BlockFace getFacing() {
+ return get(FACING, org.bukkit.block.BlockFace.class);
+ }
+
+ @Override
+ public void setFacing(org.bukkit.block.BlockFace facing) {
+ set(FACING, facing);
+ }
+
+ @Override
+ public java.util.Set<org.bukkit.block.BlockFace> getFaces() {
+ return getValues(FACING, org.bukkit.block.BlockFace.class);
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftBeetroot.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftBeetroot.java
new file mode 100644
index 00000000..4e9a27f4
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftBeetroot.java
@@ -0,0 +1,34 @@
+/**
+ * Automatically generated file, changes will be lost.
+ */
+package org.bukkit.craftbukkit.block.impl;
+
+public final class CraftBeetroot extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.Ageable {
+
+ public CraftBeetroot() {
+ super();
+ }
+
+ public CraftBeetroot(net.minecraft.server.IBlockData state) {
+ super(state);
+ }
+
+ // org.bukkit.craftbukkit.block.data.CraftAgeable
+
+ private static final net.minecraft.server.BlockStateInteger AGE = getInteger(net.minecraft.server.BlockBeetroot.class, "age");
+
+ @Override
+ public int getAge() {
+ return get(AGE);
+ }
+
+ @Override
+ public void setAge(int age) {
+ set(AGE, age);
+ }
+
+ @Override
+ public int getMaximumAge() {
+ return getMax(AGE);
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftBrewingStand.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftBrewingStand.java
new file mode 100644
index 00000000..fe0e7dec
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftBrewingStand.java
@@ -0,0 +1,49 @@
+/**
+ * Automatically generated file, changes will be lost.
+ */
+package org.bukkit.craftbukkit.block.impl;
+
+public final class CraftBrewingStand extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.type.BrewingStand {
+
+ public CraftBrewingStand() {
+ super();
+ }
+
+ public CraftBrewingStand(net.minecraft.server.IBlockData state) {
+ super(state);
+ }
+
+ // org.bukkit.craftbukkit.block.data.type.CraftBrewingStand
+
+ private static final net.minecraft.server.BlockStateBoolean[] HAS_BOTTLE = new net.minecraft.server.BlockStateBoolean[]{
+ getBoolean(net.minecraft.server.BlockBrewingStand.class, "has_bottle_0"), getBoolean(net.minecraft.server.BlockBrewingStand.class, "has_bottle_1"), getBoolean(net.minecraft.server.BlockBrewingStand.class, "has_bottle_2")
+ };
+
+ @Override
+ public boolean hasBottle(int bottle) {
+ return get(HAS_BOTTLE[bottle]);
+ }
+
+ @Override
+ public void setBottle(int bottle, boolean has) {
+ set(HAS_BOTTLE[bottle], has);
+ }
+
+ @Override
+ public java.util.Set<Integer> getBottles() {
+ com.google.common.collect.ImmutableSet.Builder<Integer> bottles = com.google.common.collect.ImmutableSet.builder();
+
+ for (int index = 0; index < getMaximumBottles(); index++) {
+ if (hasBottle(index)) {
+ bottles.add(index);
+ }
+ }
+
+ return bottles.build();
+ }
+
+ @Override
+ public int getMaximumBottles() {
+ return HAS_BOTTLE.length;
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftBubbleColumn.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftBubbleColumn.java
new file mode 100644
index 00000000..574a5b9a
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftBubbleColumn.java
@@ -0,0 +1,29 @@
+/**
+ * Automatically generated file, changes will be lost.
+ */
+package org.bukkit.craftbukkit.block.impl;
+
+public final class CraftBubbleColumn extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.type.BubbleColumn {
+
+ public CraftBubbleColumn() {
+ super();
+ }
+
+ public CraftBubbleColumn(net.minecraft.server.IBlockData state) {
+ super(state);
+ }
+
+ // org.bukkit.craftbukkit.block.data.type.CraftBubbleColumn
+
+ private static final net.minecraft.server.BlockStateBoolean DRAG = getBoolean(net.minecraft.server.BlockBubbleColumn.class, "drag");
+
+ @Override
+ public boolean isDrag() {
+ return get(DRAG);
+ }
+
+ @Override
+ public void setDrag(boolean drag) {
+ set(DRAG, drag);
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftCactus.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftCactus.java
new file mode 100644
index 00000000..e62f4dd1
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftCactus.java
@@ -0,0 +1,34 @@
+/**
+ * Automatically generated file, changes will be lost.
+ */
+package org.bukkit.craftbukkit.block.impl;
+
+public final class CraftCactus extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.Ageable {
+
+ public CraftCactus() {
+ super();
+ }
+
+ public CraftCactus(net.minecraft.server.IBlockData state) {
+ super(state);
+ }
+
+ // org.bukkit.craftbukkit.block.data.CraftAgeable
+
+ private static final net.minecraft.server.BlockStateInteger AGE = getInteger(net.minecraft.server.BlockCactus.class, "age");
+
+ @Override
+ public int getAge() {
+ return get(AGE);
+ }
+
+ @Override
+ public void setAge(int age) {
+ set(AGE, age);
+ }
+
+ @Override
+ public int getMaximumAge() {
+ return getMax(AGE);
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftCake.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftCake.java
new file mode 100644
index 00000000..fee523ab
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftCake.java
@@ -0,0 +1,34 @@
+/**
+ * Automatically generated file, changes will be lost.
+ */
+package org.bukkit.craftbukkit.block.impl;
+
+public final class CraftCake extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.type.Cake {
+
+ public CraftCake() {
+ super();
+ }
+
+ public CraftCake(net.minecraft.server.IBlockData state) {
+ super(state);
+ }
+
+ // org.bukkit.craftbukkit.block.data.type.CraftCake
+
+ private static final net.minecraft.server.BlockStateInteger BITES = getInteger(net.minecraft.server.BlockCake.class, "bites");
+
+ @Override
+ public int getBites() {
+ return get(BITES);
+ }
+
+ @Override
+ public void setBites(int bites) {
+ set(BITES, bites);
+ }
+
+ @Override
+ public int getMaximumBites() {
+ return getMax(BITES);
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftCarrots.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftCarrots.java
new file mode 100644
index 00000000..9ab29636
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftCarrots.java
@@ -0,0 +1,34 @@
+/**
+ * Automatically generated file, changes will be lost.
+ */
+package org.bukkit.craftbukkit.block.impl;
+
+public final class CraftCarrots extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.Ageable {
+
+ public CraftCarrots() {
+ super();
+ }
+
+ public CraftCarrots(net.minecraft.server.IBlockData state) {
+ super(state);
+ }
+
+ // org.bukkit.craftbukkit.block.data.CraftAgeable
+
+ private static final net.minecraft.server.BlockStateInteger AGE = getInteger(net.minecraft.server.BlockCarrots.class, "age");
+
+ @Override
+ public int getAge() {
+ return get(AGE);
+ }
+
+ @Override
+ public void setAge(int age) {
+ set(AGE, age);
+ }
+
+ @Override
+ public int getMaximumAge() {
+ return getMax(AGE);
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftCauldron.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftCauldron.java
new file mode 100644
index 00000000..5ddeb715
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftCauldron.java
@@ -0,0 +1,34 @@
+/**
+ * Automatically generated file, changes will be lost.
+ */
+package org.bukkit.craftbukkit.block.impl;
+
+public final class CraftCauldron extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.Levelled {
+
+ public CraftCauldron() {
+ super();
+ }
+
+ public CraftCauldron(net.minecraft.server.IBlockData state) {
+ super(state);
+ }
+
+ // org.bukkit.craftbukkit.block.data.CraftLevelled
+
+ private static final net.minecraft.server.BlockStateInteger LEVEL = getInteger(net.minecraft.server.BlockCauldron.class, "level");
+
+ @Override
+ public int getLevel() {
+ return get(LEVEL);
+ }
+
+ @Override
+ public void setLevel(int level) {
+ set(LEVEL, level);
+ }
+
+ @Override
+ public int getMaximumLevel() {
+ return getMax(LEVEL);
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftChest.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftChest.java
new file mode 100644
index 00000000..44f3a532
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftChest.java
@@ -0,0 +1,62 @@
+/**
+ * Automatically generated file, changes will be lost.
+ */
+package org.bukkit.craftbukkit.block.impl;
+
+public final class CraftChest extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.type.Chest, org.bukkit.block.data.Directional, org.bukkit.block.data.Waterlogged {
+
+ public CraftChest() {
+ super();
+ }
+
+ public CraftChest(net.minecraft.server.IBlockData state) {
+ super(state);
+ }
+
+ // org.bukkit.craftbukkit.block.data.type.CraftChest
+
+ private static final net.minecraft.server.BlockStateEnum<?> TYPE = getEnum(net.minecraft.server.BlockChest.class, "type");
+
+ @Override
+ public Type getType() {
+ return get(TYPE, Type.class);
+ }
+
+ @Override
+ public void setType(Type type) {
+ set(TYPE, type);
+ }
+
+ // org.bukkit.craftbukkit.block.data.CraftDirectional
+
+ private static final net.minecraft.server.BlockStateEnum<?> FACING = getEnum(net.minecraft.server.BlockChest.class, "facing");
+
+ @Override
+ public org.bukkit.block.BlockFace getFacing() {
+ return get(FACING, org.bukkit.block.BlockFace.class);
+ }
+
+ @Override
+ public void setFacing(org.bukkit.block.BlockFace facing) {
+ set(FACING, facing);
+ }
+
+ @Override
+ public java.util.Set<org.bukkit.block.BlockFace> getFaces() {
+ return getValues(FACING, org.bukkit.block.BlockFace.class);
+ }
+
+ // org.bukkit.craftbukkit.block.data.CraftWaterlogged
+
+ private static final net.minecraft.server.BlockStateBoolean WATERLOGGED = getBoolean(net.minecraft.server.BlockChest.class, "waterlogged");
+
+ @Override
+ public boolean isWaterlogged() {
+ return get(WATERLOGGED);
+ }
+
+ @Override
+ public void setWaterlogged(boolean waterlogged) {
+ set(WATERLOGGED, waterlogged);
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftChestTrapped.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftChestTrapped.java
new file mode 100644
index 00000000..cc8f88ba
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftChestTrapped.java
@@ -0,0 +1,62 @@
+/**
+ * Automatically generated file, changes will be lost.
+ */
+package org.bukkit.craftbukkit.block.impl;
+
+public final class CraftChestTrapped extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.type.Chest, org.bukkit.block.data.Directional, org.bukkit.block.data.Waterlogged {
+
+ public CraftChestTrapped() {
+ super();
+ }
+
+ public CraftChestTrapped(net.minecraft.server.IBlockData state) {
+ super(state);
+ }
+
+ // org.bukkit.craftbukkit.block.data.type.CraftChest
+
+ private static final net.minecraft.server.BlockStateEnum<?> TYPE = getEnum(net.minecraft.server.BlockChestTrapped.class, "type");
+
+ @Override
+ public Type getType() {
+ return get(TYPE, Type.class);
+ }
+
+ @Override
+ public void setType(Type type) {
+ set(TYPE, type);
+ }
+
+ // org.bukkit.craftbukkit.block.data.CraftDirectional
+
+ private static final net.minecraft.server.BlockStateEnum<?> FACING = getEnum(net.minecraft.server.BlockChestTrapped.class, "facing");
+
+ @Override
+ public org.bukkit.block.BlockFace getFacing() {
+ return get(FACING, org.bukkit.block.BlockFace.class);
+ }
+
+ @Override
+ public void setFacing(org.bukkit.block.BlockFace facing) {
+ set(FACING, facing);
+ }
+
+ @Override
+ public java.util.Set<org.bukkit.block.BlockFace> getFaces() {
+ return getValues(FACING, org.bukkit.block.BlockFace.class);
+ }
+
+ // org.bukkit.craftbukkit.block.data.CraftWaterlogged
+
+ private static final net.minecraft.server.BlockStateBoolean WATERLOGGED = getBoolean(net.minecraft.server.BlockChestTrapped.class, "waterlogged");
+
+ @Override
+ public boolean isWaterlogged() {
+ return get(WATERLOGGED);
+ }
+
+ @Override
+ public void setWaterlogged(boolean waterlogged) {
+ set(WATERLOGGED, waterlogged);
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftChorusFlower.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftChorusFlower.java
new file mode 100644
index 00000000..af1e85bc
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftChorusFlower.java
@@ -0,0 +1,34 @@
+/**
+ * Automatically generated file, changes will be lost.
+ */
+package org.bukkit.craftbukkit.block.impl;
+
+public final class CraftChorusFlower extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.Ageable {
+
+ public CraftChorusFlower() {
+ super();
+ }
+
+ public CraftChorusFlower(net.minecraft.server.IBlockData state) {
+ super(state);
+ }
+
+ // org.bukkit.craftbukkit.block.data.CraftAgeable
+
+ private static final net.minecraft.server.BlockStateInteger AGE = getInteger(net.minecraft.server.BlockChorusFlower.class, "age");
+
+ @Override
+ public int getAge() {
+ return get(AGE);
+ }
+
+ @Override
+ public void setAge(int age) {
+ set(AGE, age);
+ }
+
+ @Override
+ public int getMaximumAge() {
+ return getMax(AGE);
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftChorusFruit.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftChorusFruit.java
new file mode 100644
index 00000000..27ae41a9
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftChorusFruit.java
@@ -0,0 +1,57 @@
+/**
+ * Automatically generated file, changes will be lost.
+ */
+package org.bukkit.craftbukkit.block.impl;
+
+public final class CraftChorusFruit extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.MultipleFacing {
+
+ public CraftChorusFruit() {
+ super();
+ }
+
+ public CraftChorusFruit(net.minecraft.server.IBlockData state) {
+ super(state);
+ }
+
+ // org.bukkit.craftbukkit.block.data.CraftMultipleFacing
+
+ private static final net.minecraft.server.BlockStateBoolean[] FACES = new net.minecraft.server.BlockStateBoolean[]{
+ getBoolean(net.minecraft.server.BlockChorusFruit.class, "north", true), getBoolean(net.minecraft.server.BlockChorusFruit.class, "east", true), getBoolean(net.minecraft.server.BlockChorusFruit.class, "south", true), getBoolean(net.minecraft.server.BlockChorusFruit.class, "west", true), getBoolean(net.minecraft.server.BlockChorusFruit.class, "up", true), getBoolean(net.minecraft.server.BlockChorusFruit.class, "down", true)
+ };
+
+ @Override
+ public boolean hasFace(org.bukkit.block.BlockFace face) {
+ return get(FACES[face.ordinal()]);
+ }
+
+ @Override
+ public void setFace(org.bukkit.block.BlockFace face, boolean has) {
+ set(FACES[face.ordinal()], has);
+ }
+
+ @Override
+ public java.util.Set<org.bukkit.block.BlockFace> getFaces() {
+ com.google.common.collect.ImmutableSet.Builder<org.bukkit.block.BlockFace> faces = com.google.common.collect.ImmutableSet.builder();
+
+ for (int i = 0; i < FACES.length; i++) {
+ if (FACES[i] != null && get(FACES[i])) {
+ faces.add(org.bukkit.block.BlockFace.values()[i]);
+ }
+ }
+
+ return faces.build();
+ }
+
+ @Override
+ public java.util.Set<org.bukkit.block.BlockFace> getAllowedFaces() {
+ com.google.common.collect.ImmutableSet.Builder<org.bukkit.block.BlockFace> faces = com.google.common.collect.ImmutableSet.builder();
+
+ for (int i = 0; i < FACES.length; i++) {
+ if (FACES[i] != null) {
+ faces.add(org.bukkit.block.BlockFace.values()[i]);
+ }
+ }
+
+ return faces.build();
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftCobbleWall.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftCobbleWall.java
new file mode 100644
index 00000000..b1acc7c4
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftCobbleWall.java
@@ -0,0 +1,71 @@
+/**
+ * Automatically generated file, changes will be lost.
+ */
+package org.bukkit.craftbukkit.block.impl;
+
+public final class CraftCobbleWall extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.type.Fence, org.bukkit.block.data.MultipleFacing, org.bukkit.block.data.Waterlogged {
+
+ public CraftCobbleWall() {
+ super();
+ }
+
+ public CraftCobbleWall(net.minecraft.server.IBlockData state) {
+ super(state);
+ }
+
+ // org.bukkit.craftbukkit.block.data.CraftMultipleFacing
+
+ private static final net.minecraft.server.BlockStateBoolean[] FACES = new net.minecraft.server.BlockStateBoolean[]{
+ getBoolean(net.minecraft.server.BlockCobbleWall.class, "north", true), getBoolean(net.minecraft.server.BlockCobbleWall.class, "east", true), getBoolean(net.minecraft.server.BlockCobbleWall.class, "south", true), getBoolean(net.minecraft.server.BlockCobbleWall.class, "west", true), getBoolean(net.minecraft.server.BlockCobbleWall.class, "up", true), getBoolean(net.minecraft.server.BlockCobbleWall.class, "down", true)
+ };
+
+ @Override
+ public boolean hasFace(org.bukkit.block.BlockFace face) {
+ return get(FACES[face.ordinal()]);
+ }
+
+ @Override
+ public void setFace(org.bukkit.block.BlockFace face, boolean has) {
+ set(FACES[face.ordinal()], has);
+ }
+
+ @Override
+ public java.util.Set<org.bukkit.block.BlockFace> getFaces() {
+ com.google.common.collect.ImmutableSet.Builder<org.bukkit.block.BlockFace> faces = com.google.common.collect.ImmutableSet.builder();
+
+ for (int i = 0; i < FACES.length; i++) {
+ if (FACES[i] != null && get(FACES[i])) {
+ faces.add(org.bukkit.block.BlockFace.values()[i]);
+ }
+ }
+
+ return faces.build();
+ }
+
+ @Override
+ public java.util.Set<org.bukkit.block.BlockFace> getAllowedFaces() {
+ com.google.common.collect.ImmutableSet.Builder<org.bukkit.block.BlockFace> faces = com.google.common.collect.ImmutableSet.builder();
+
+ for (int i = 0; i < FACES.length; i++) {
+ if (FACES[i] != null) {
+ faces.add(org.bukkit.block.BlockFace.values()[i]);
+ }
+ }
+
+ return faces.build();
+ }
+
+ // org.bukkit.craftbukkit.block.data.CraftWaterlogged
+
+ private static final net.minecraft.server.BlockStateBoolean WATERLOGGED = getBoolean(net.minecraft.server.BlockCobbleWall.class, "waterlogged");
+
+ @Override
+ public boolean isWaterlogged() {
+ return get(WATERLOGGED);
+ }
+
+ @Override
+ public void setWaterlogged(boolean waterlogged) {
+ set(WATERLOGGED, waterlogged);
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftCocoa.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftCocoa.java
new file mode 100644
index 00000000..79b2b52c
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftCocoa.java
@@ -0,0 +1,53 @@
+/**
+ * Automatically generated file, changes will be lost.
+ */
+package org.bukkit.craftbukkit.block.impl;
+
+public final class CraftCocoa extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.type.Cocoa, org.bukkit.block.data.Ageable, org.bukkit.block.data.Directional {
+
+ public CraftCocoa() {
+ super();
+ }
+
+ public CraftCocoa(net.minecraft.server.IBlockData state) {
+ super(state);
+ }
+
+ // org.bukkit.craftbukkit.block.data.CraftAgeable
+
+ private static final net.minecraft.server.BlockStateInteger AGE = getInteger(net.minecraft.server.BlockCocoa.class, "age");
+
+ @Override
+ public int getAge() {
+ return get(AGE);
+ }
+
+ @Override
+ public void setAge(int age) {
+ set(AGE, age);
+ }
+
+ @Override
+ public int getMaximumAge() {
+ return getMax(AGE);
+ }
+
+ // org.bukkit.craftbukkit.block.data.CraftDirectional
+
+ private static final net.minecraft.server.BlockStateEnum<?> FACING = getEnum(net.minecraft.server.BlockCocoa.class, "facing");
+
+ @Override
+ public org.bukkit.block.BlockFace getFacing() {
+ return get(FACING, org.bukkit.block.BlockFace.class);
+ }
+
+ @Override
+ public void setFacing(org.bukkit.block.BlockFace facing) {
+ set(FACING, facing);
+ }
+
+ @Override
+ public java.util.Set<org.bukkit.block.BlockFace> getFaces() {
+ return getValues(FACING, org.bukkit.block.BlockFace.class);
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftCommand.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftCommand.java
new file mode 100644
index 00000000..ed1684a6
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftCommand.java
@@ -0,0 +1,48 @@
+/**
+ * Automatically generated file, changes will be lost.
+ */
+package org.bukkit.craftbukkit.block.impl;
+
+public final class CraftCommand extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.type.CommandBlock, org.bukkit.block.data.Directional {
+
+ public CraftCommand() {
+ super();
+ }
+
+ public CraftCommand(net.minecraft.server.IBlockData state) {
+ super(state);
+ }
+
+ // org.bukkit.craftbukkit.block.data.type.CraftCommandBlock
+
+ private static final net.minecraft.server.BlockStateBoolean CONDITIONAL = getBoolean(net.minecraft.server.BlockCommand.class, "conditional");
+
+ @Override
+ public boolean isConditional() {
+ return get(CONDITIONAL);
+ }
+
+ @Override
+ public void setConditional(boolean conditional) {
+ set(CONDITIONAL, conditional);
+ }
+
+ // org.bukkit.craftbukkit.block.data.CraftDirectional
+
+ private static final net.minecraft.server.BlockStateEnum<?> FACING = getEnum(net.minecraft.server.BlockCommand.class, "facing");
+
+ @Override
+ public org.bukkit.block.BlockFace getFacing() {
+ return get(FACING, org.bukkit.block.BlockFace.class);
+ }
+
+ @Override
+ public void setFacing(org.bukkit.block.BlockFace facing) {
+ set(FACING, facing);
+ }
+
+ @Override
+ public java.util.Set<org.bukkit.block.BlockFace> getFaces() {
+ return getValues(FACING, org.bukkit.block.BlockFace.class);
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftCoralFan.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftCoralFan.java
new file mode 100644
index 00000000..3385af14
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftCoralFan.java
@@ -0,0 +1,34 @@
+/**
+ * Automatically generated file, changes will be lost.
+ */
+package org.bukkit.craftbukkit.block.impl;
+
+public final class CraftCoralFan extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.Directional {
+
+ public CraftCoralFan() {
+ super();
+ }
+
+ public CraftCoralFan(net.minecraft.server.IBlockData state) {
+ super(state);
+ }
+
+ // org.bukkit.craftbukkit.block.data.CraftDirectional
+
+ private static final net.minecraft.server.BlockStateEnum<?> FACING = getEnum(net.minecraft.server.BlockCoralFan.class, "facing");
+
+ @Override
+ public org.bukkit.block.BlockFace getFacing() {
+ return get(FACING, org.bukkit.block.BlockFace.class);
+ }
+
+ @Override
+ public void setFacing(org.bukkit.block.BlockFace facing) {
+ set(FACING, facing);
+ }
+
+ @Override
+ public java.util.Set<org.bukkit.block.BlockFace> getFaces() {
+ return getValues(FACING, org.bukkit.block.BlockFace.class);
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftCrops.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftCrops.java
new file mode 100644
index 00000000..61921a2a
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftCrops.java
@@ -0,0 +1,34 @@
+/**
+ * Automatically generated file, changes will be lost.
+ */
+package org.bukkit.craftbukkit.block.impl;
+
+public final class CraftCrops extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.Ageable {
+
+ public CraftCrops() {
+ super();
+ }
+
+ public CraftCrops(net.minecraft.server.IBlockData state) {
+ super(state);
+ }
+
+ // org.bukkit.craftbukkit.block.data.CraftAgeable
+
+ private static final net.minecraft.server.BlockStateInteger AGE = getInteger(net.minecraft.server.BlockCrops.class, "age");
+
+ @Override
+ public int getAge() {
+ return get(AGE);
+ }
+
+ @Override
+ public void setAge(int age) {
+ set(AGE, age);
+ }
+
+ @Override
+ public int getMaximumAge() {
+ return getMax(AGE);
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftDaylightDetector.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftDaylightDetector.java
new file mode 100644
index 00000000..ffed5c9a
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftDaylightDetector.java
@@ -0,0 +1,48 @@
+/**
+ * Automatically generated file, changes will be lost.
+ */
+package org.bukkit.craftbukkit.block.impl;
+
+public final class CraftDaylightDetector extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.type.DaylightDetector, org.bukkit.block.data.AnaloguePowerable {
+
+ public CraftDaylightDetector() {
+ super();
+ }
+
+ public CraftDaylightDetector(net.minecraft.server.IBlockData state) {
+ super(state);
+ }
+
+ // org.bukkit.craftbukkit.block.data.type.CraftDaylightDetector
+
+ private static final net.minecraft.server.BlockStateBoolean INVERTED = getBoolean(net.minecraft.server.BlockDaylightDetector.class, "inverted");
+
+ @Override
+ public boolean isInverted() {
+ return get(INVERTED);
+ }
+
+ @Override
+ public void setInverted(boolean inverted) {
+ set(INVERTED, inverted);
+ }
+
+ // org.bukkit.craftbukkit.block.data.CraftAnaloguePowerable
+
+ private static final net.minecraft.server.BlockStateInteger POWER = getInteger(net.minecraft.server.BlockDaylightDetector.class, "power");
+
+ @Override
+ public int getPower() {
+ return get(POWER);
+ }
+
+ @Override
+ public void setPower(int power) {
+ set(POWER, power);
+ }
+
+ @Override
+ public int getMaximumPower() {
+ return getMax(POWER);
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftDirtSnow.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftDirtSnow.java
new file mode 100644
index 00000000..7c3857e9
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftDirtSnow.java
@@ -0,0 +1,29 @@
+/**
+ * Automatically generated file, changes will be lost.
+ */
+package org.bukkit.craftbukkit.block.impl;
+
+public final class CraftDirtSnow extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.Snowable {
+
+ public CraftDirtSnow() {
+ super();
+ }
+
+ public CraftDirtSnow(net.minecraft.server.IBlockData state) {
+ super(state);
+ }
+
+ // org.bukkit.craftbukkit.block.data.CraftSnowable
+
+ private static final net.minecraft.server.BlockStateBoolean SNOWY = getBoolean(net.minecraft.server.BlockDirtSnow.class, "snowy");
+
+ @Override
+ public boolean isSnowy() {
+ return get(SNOWY);
+ }
+
+ @Override
+ public void setSnowy(boolean snowy) {
+ set(SNOWY, snowy);
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftDispenser.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftDispenser.java
new file mode 100644
index 00000000..cea8f941
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftDispenser.java
@@ -0,0 +1,48 @@
+/**
+ * Automatically generated file, changes will be lost.
+ */
+package org.bukkit.craftbukkit.block.impl;
+
+public final class CraftDispenser extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.type.Dispenser, org.bukkit.block.data.Directional {
+
+ public CraftDispenser() {
+ super();
+ }
+
+ public CraftDispenser(net.minecraft.server.IBlockData state) {
+ super(state);
+ }
+
+ // org.bukkit.craftbukkit.block.data.type.CraftDispenser
+
+ private static final net.minecraft.server.BlockStateBoolean TRIGGERED = getBoolean(net.minecraft.server.BlockDispenser.class, "triggered");
+
+ @Override
+ public boolean isTriggered() {
+ return get(TRIGGERED);
+ }
+
+ @Override
+ public void setTriggered(boolean triggered) {
+ set(TRIGGERED, triggered);
+ }
+
+ // org.bukkit.craftbukkit.block.data.CraftDirectional
+
+ private static final net.minecraft.server.BlockStateEnum<?> FACING = getEnum(net.minecraft.server.BlockDispenser.class, "facing");
+
+ @Override
+ public org.bukkit.block.BlockFace getFacing() {
+ return get(FACING, org.bukkit.block.BlockFace.class);
+ }
+
+ @Override
+ public void setFacing(org.bukkit.block.BlockFace facing) {
+ set(FACING, facing);
+ }
+
+ @Override
+ public java.util.Set<org.bukkit.block.BlockFace> getFaces() {
+ return getValues(FACING, org.bukkit.block.BlockFace.class);
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftDoor.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftDoor.java
new file mode 100644
index 00000000..ec8639bf
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftDoor.java
@@ -0,0 +1,90 @@
+/**
+ * Automatically generated file, changes will be lost.
+ */
+package org.bukkit.craftbukkit.block.impl;
+
+public final class CraftDoor extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.type.Door, org.bukkit.block.data.Bisected, org.bukkit.block.data.Directional, org.bukkit.block.data.Openable, org.bukkit.block.data.Powerable {
+
+ public CraftDoor() {
+ super();
+ }
+
+ public CraftDoor(net.minecraft.server.IBlockData state) {
+ super(state);
+ }
+
+ // org.bukkit.craftbukkit.block.data.type.CraftDoor
+
+ private static final net.minecraft.server.BlockStateEnum<?> HINGE = getEnum(net.minecraft.server.BlockDoor.class, "hinge");
+
+ @Override
+ public Hinge getHinge() {
+ return get(HINGE, Hinge.class);
+ }
+
+ @Override
+ public void setHinge(Hinge hinge) {
+ set(HINGE, hinge);
+ }
+
+ // org.bukkit.craftbukkit.block.data.CraftBisected
+
+ private static final net.minecraft.server.BlockStateEnum<?> HALF = getEnum(net.minecraft.server.BlockDoor.class, "half");
+
+ @Override
+ public Half getHalf() {
+ return get(HALF, Half.class);
+ }
+
+ @Override
+ public void setHalf(Half half) {
+ set(HALF, half);
+ }
+
+ // org.bukkit.craftbukkit.block.data.CraftDirectional
+
+ private static final net.minecraft.server.BlockStateEnum<?> FACING = getEnum(net.minecraft.server.BlockDoor.class, "facing");
+
+ @Override
+ public org.bukkit.block.BlockFace getFacing() {
+ return get(FACING, org.bukkit.block.BlockFace.class);
+ }
+
+ @Override
+ public void setFacing(org.bukkit.block.BlockFace facing) {
+ set(FACING, facing);
+ }
+
+ @Override
+ public java.util.Set<org.bukkit.block.BlockFace> getFaces() {
+ return getValues(FACING, org.bukkit.block.BlockFace.class);
+ }
+
+ // org.bukkit.craftbukkit.block.data.CraftOpenable
+
+ private static final net.minecraft.server.BlockStateBoolean OPEN = getBoolean(net.minecraft.server.BlockDoor.class, "open");
+
+ @Override
+ public boolean isOpen() {
+ return get(OPEN);
+ }
+
+ @Override
+ public void setOpen(boolean open) {
+ set(OPEN, open);
+ }
+
+ // org.bukkit.craftbukkit.block.data.CraftPowerable
+
+ private static final net.minecraft.server.BlockStateBoolean POWERED = getBoolean(net.minecraft.server.BlockDoor.class, "powered");
+
+ @Override
+ public boolean isPowered() {
+ return get(POWERED);
+ }
+
+ @Override
+ public void setPowered(boolean powered) {
+ set(POWERED, powered);
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftDropper.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftDropper.java
new file mode 100644
index 00000000..82486f1b
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftDropper.java
@@ -0,0 +1,48 @@
+/**
+ * Automatically generated file, changes will be lost.
+ */
+package org.bukkit.craftbukkit.block.impl;
+
+public final class CraftDropper extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.type.Dispenser, org.bukkit.block.data.Directional {
+
+ public CraftDropper() {
+ super();
+ }
+
+ public CraftDropper(net.minecraft.server.IBlockData state) {
+ super(state);
+ }
+
+ // org.bukkit.craftbukkit.block.data.type.CraftDispenser
+
+ private static final net.minecraft.server.BlockStateBoolean TRIGGERED = getBoolean(net.minecraft.server.BlockDropper.class, "triggered");
+
+ @Override
+ public boolean isTriggered() {
+ return get(TRIGGERED);
+ }
+
+ @Override
+ public void setTriggered(boolean triggered) {
+ set(TRIGGERED, triggered);
+ }
+
+ // org.bukkit.craftbukkit.block.data.CraftDirectional
+
+ private static final net.minecraft.server.BlockStateEnum<?> FACING = getEnum(net.minecraft.server.BlockDropper.class, "facing");
+
+ @Override
+ public org.bukkit.block.BlockFace getFacing() {
+ return get(FACING, org.bukkit.block.BlockFace.class);
+ }
+
+ @Override
+ public void setFacing(org.bukkit.block.BlockFace facing) {
+ set(FACING, facing);
+ }
+
+ @Override
+ public java.util.Set<org.bukkit.block.BlockFace> getFaces() {
+ return getValues(FACING, org.bukkit.block.BlockFace.class);
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftEndRod.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftEndRod.java
new file mode 100644
index 00000000..d72c9d05
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftEndRod.java
@@ -0,0 +1,34 @@
+/**
+ * Automatically generated file, changes will be lost.
+ */
+package org.bukkit.craftbukkit.block.impl;
+
+public final class CraftEndRod extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.Directional {
+
+ public CraftEndRod() {
+ super();
+ }
+
+ public CraftEndRod(net.minecraft.server.IBlockData state) {
+ super(state);
+ }
+
+ // org.bukkit.craftbukkit.block.data.CraftDirectional
+
+ private static final net.minecraft.server.BlockStateEnum<?> FACING = getEnum(net.minecraft.server.BlockEndRod.class, "facing");
+
+ @Override
+ public org.bukkit.block.BlockFace getFacing() {
+ return get(FACING, org.bukkit.block.BlockFace.class);
+ }
+
+ @Override
+ public void setFacing(org.bukkit.block.BlockFace facing) {
+ set(FACING, facing);
+ }
+
+ @Override
+ public java.util.Set<org.bukkit.block.BlockFace> getFaces() {
+ return getValues(FACING, org.bukkit.block.BlockFace.class);
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftEnderChest.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftEnderChest.java
new file mode 100644
index 00000000..2f838080
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftEnderChest.java
@@ -0,0 +1,48 @@
+/**
+ * Automatically generated file, changes will be lost.
+ */
+package org.bukkit.craftbukkit.block.impl;
+
+public final class CraftEnderChest extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.type.EnderChest, org.bukkit.block.data.Directional, org.bukkit.block.data.Waterlogged {
+
+ public CraftEnderChest() {
+ super();
+ }
+
+ public CraftEnderChest(net.minecraft.server.IBlockData state) {
+ super(state);
+ }
+
+ // org.bukkit.craftbukkit.block.data.CraftDirectional
+
+ private static final net.minecraft.server.BlockStateEnum<?> FACING = getEnum(net.minecraft.server.BlockEnderChest.class, "facing");
+
+ @Override
+ public org.bukkit.block.BlockFace getFacing() {
+ return get(FACING, org.bukkit.block.BlockFace.class);
+ }
+
+ @Override
+ public void setFacing(org.bukkit.block.BlockFace facing) {
+ set(FACING, facing);
+ }
+
+ @Override
+ public java.util.Set<org.bukkit.block.BlockFace> getFaces() {
+ return getValues(FACING, org.bukkit.block.BlockFace.class);
+ }
+
+ // org.bukkit.craftbukkit.block.data.CraftWaterlogged
+
+ private static final net.minecraft.server.BlockStateBoolean WATERLOGGED = getBoolean(net.minecraft.server.BlockEnderChest.class, "waterlogged");
+
+ @Override
+ public boolean isWaterlogged() {
+ return get(WATERLOGGED);
+ }
+
+ @Override
+ public void setWaterlogged(boolean waterlogged) {
+ set(WATERLOGGED, waterlogged);
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftEnderPortalFrame.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftEnderPortalFrame.java
new file mode 100644
index 00000000..f57cbbec
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftEnderPortalFrame.java
@@ -0,0 +1,48 @@
+/**
+ * Automatically generated file, changes will be lost.
+ */
+package org.bukkit.craftbukkit.block.impl;
+
+public final class CraftEnderPortalFrame extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.type.EndPortalFrame, org.bukkit.block.data.Directional {
+
+ public CraftEnderPortalFrame() {
+ super();
+ }
+
+ public CraftEnderPortalFrame(net.minecraft.server.IBlockData state) {
+ super(state);
+ }
+
+ // org.bukkit.craftbukkit.block.data.type.CraftEndPortalFrame
+
+ private static final net.minecraft.server.BlockStateBoolean EYE = getBoolean(net.minecraft.server.BlockEnderPortalFrame.class, "eye");
+
+ @Override
+ public boolean hasEye() {
+ return get(EYE);
+ }
+
+ @Override
+ public void setEye(boolean eye) {
+ set(EYE, eye);
+ }
+
+ // org.bukkit.craftbukkit.block.data.CraftDirectional
+
+ private static final net.minecraft.server.BlockStateEnum<?> FACING = getEnum(net.minecraft.server.BlockEnderPortalFrame.class, "facing");
+
+ @Override
+ public org.bukkit.block.BlockFace getFacing() {
+ return get(FACING, org.bukkit.block.BlockFace.class);
+ }
+
+ @Override
+ public void setFacing(org.bukkit.block.BlockFace facing) {
+ set(FACING, facing);
+ }
+
+ @Override
+ public java.util.Set<org.bukkit.block.BlockFace> getFaces() {
+ return getValues(FACING, org.bukkit.block.BlockFace.class);
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftFence.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftFence.java
new file mode 100644
index 00000000..1333b997
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftFence.java
@@ -0,0 +1,71 @@
+/**
+ * Automatically generated file, changes will be lost.
+ */
+package org.bukkit.craftbukkit.block.impl;
+
+public final class CraftFence extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.type.Fence, org.bukkit.block.data.MultipleFacing, org.bukkit.block.data.Waterlogged {
+
+ public CraftFence() {
+ super();
+ }
+
+ public CraftFence(net.minecraft.server.IBlockData state) {
+ super(state);
+ }
+
+ // org.bukkit.craftbukkit.block.data.CraftMultipleFacing
+
+ private static final net.minecraft.server.BlockStateBoolean[] FACES = new net.minecraft.server.BlockStateBoolean[]{
+ getBoolean(net.minecraft.server.BlockFence.class, "north", true), getBoolean(net.minecraft.server.BlockFence.class, "east", true), getBoolean(net.minecraft.server.BlockFence.class, "south", true), getBoolean(net.minecraft.server.BlockFence.class, "west", true), getBoolean(net.minecraft.server.BlockFence.class, "up", true), getBoolean(net.minecraft.server.BlockFence.class, "down", true)
+ };
+
+ @Override
+ public boolean hasFace(org.bukkit.block.BlockFace face) {
+ return get(FACES[face.ordinal()]);
+ }
+
+ @Override
+ public void setFace(org.bukkit.block.BlockFace face, boolean has) {
+ set(FACES[face.ordinal()], has);
+ }
+
+ @Override
+ public java.util.Set<org.bukkit.block.BlockFace> getFaces() {
+ com.google.common.collect.ImmutableSet.Builder<org.bukkit.block.BlockFace> faces = com.google.common.collect.ImmutableSet.builder();
+
+ for (int i = 0; i < FACES.length; i++) {
+ if (FACES[i] != null && get(FACES[i])) {
+ faces.add(org.bukkit.block.BlockFace.values()[i]);
+ }
+ }
+
+ return faces.build();
+ }
+
+ @Override
+ public java.util.Set<org.bukkit.block.BlockFace> getAllowedFaces() {
+ com.google.common.collect.ImmutableSet.Builder<org.bukkit.block.BlockFace> faces = com.google.common.collect.ImmutableSet.builder();
+
+ for (int i = 0; i < FACES.length; i++) {
+ if (FACES[i] != null) {
+ faces.add(org.bukkit.block.BlockFace.values()[i]);
+ }
+ }
+
+ return faces.build();
+ }
+
+ // org.bukkit.craftbukkit.block.data.CraftWaterlogged
+
+ private static final net.minecraft.server.BlockStateBoolean WATERLOGGED = getBoolean(net.minecraft.server.BlockFence.class, "waterlogged");
+
+ @Override
+ public boolean isWaterlogged() {
+ return get(WATERLOGGED);
+ }
+
+ @Override
+ public void setWaterlogged(boolean waterlogged) {
+ set(WATERLOGGED, waterlogged);
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftFenceGate.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftFenceGate.java
new file mode 100644
index 00000000..4fc29445
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftFenceGate.java
@@ -0,0 +1,76 @@
+/**
+ * Automatically generated file, changes will be lost.
+ */
+package org.bukkit.craftbukkit.block.impl;
+
+public final class CraftFenceGate extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.type.Gate, org.bukkit.block.data.Directional, org.bukkit.block.data.Openable, org.bukkit.block.data.Powerable {
+
+ public CraftFenceGate() {
+ super();
+ }
+
+ public CraftFenceGate(net.minecraft.server.IBlockData state) {
+ super(state);
+ }
+
+ // org.bukkit.craftbukkit.block.data.type.CraftGate
+
+ private static final net.minecraft.server.BlockStateBoolean IN_WALL = getBoolean(net.minecraft.server.BlockFenceGate.class, "in_wall");
+
+ @Override
+ public boolean isInWall() {
+ return get(IN_WALL);
+ }
+
+ @Override
+ public void setInWall(boolean inWall) {
+ set(IN_WALL, inWall);
+ }
+
+ // org.bukkit.craftbukkit.block.data.CraftDirectional
+
+ private static final net.minecraft.server.BlockStateEnum<?> FACING = getEnum(net.minecraft.server.BlockFenceGate.class, "facing");
+
+ @Override
+ public org.bukkit.block.BlockFace getFacing() {
+ return get(FACING, org.bukkit.block.BlockFace.class);
+ }
+
+ @Override
+ public void setFacing(org.bukkit.block.BlockFace facing) {
+ set(FACING, facing);
+ }
+
+ @Override
+ public java.util.Set<org.bukkit.block.BlockFace> getFaces() {
+ return getValues(FACING, org.bukkit.block.BlockFace.class);
+ }
+
+ // org.bukkit.craftbukkit.block.data.CraftOpenable
+
+ private static final net.minecraft.server.BlockStateBoolean OPEN = getBoolean(net.minecraft.server.BlockFenceGate.class, "open");
+
+ @Override
+ public boolean isOpen() {
+ return get(OPEN);
+ }
+
+ @Override
+ public void setOpen(boolean open) {
+ set(OPEN, open);
+ }
+
+ // org.bukkit.craftbukkit.block.data.CraftPowerable
+
+ private static final net.minecraft.server.BlockStateBoolean POWERED = getBoolean(net.minecraft.server.BlockFenceGate.class, "powered");
+
+ @Override
+ public boolean isPowered() {
+ return get(POWERED);
+ }
+
+ @Override
+ public void setPowered(boolean powered) {
+ set(POWERED, powered);
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftFire.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftFire.java
new file mode 100644
index 00000000..a5809355
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftFire.java
@@ -0,0 +1,76 @@
+/**
+ * Automatically generated file, changes will be lost.
+ */
+package org.bukkit.craftbukkit.block.impl;
+
+public final class CraftFire extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.type.Fire, org.bukkit.block.data.Ageable, org.bukkit.block.data.MultipleFacing {
+
+ public CraftFire() {
+ super();
+ }
+
+ public CraftFire(net.minecraft.server.IBlockData state) {
+ super(state);
+ }
+
+ // org.bukkit.craftbukkit.block.data.CraftAgeable
+
+ private static final net.minecraft.server.BlockStateInteger AGE = getInteger(net.minecraft.server.BlockFire.class, "age");
+
+ @Override
+ public int getAge() {
+ return get(AGE);
+ }
+
+ @Override
+ public void setAge(int age) {
+ set(AGE, age);
+ }
+
+ @Override
+ public int getMaximumAge() {
+ return getMax(AGE);
+ }
+
+ // org.bukkit.craftbukkit.block.data.CraftMultipleFacing
+
+ private static final net.minecraft.server.BlockStateBoolean[] FACES = new net.minecraft.server.BlockStateBoolean[]{
+ getBoolean(net.minecraft.server.BlockFire.class, "north", true), getBoolean(net.minecraft.server.BlockFire.class, "east", true), getBoolean(net.minecraft.server.BlockFire.class, "south", true), getBoolean(net.minecraft.server.BlockFire.class, "west", true), getBoolean(net.minecraft.server.BlockFire.class, "up", true), getBoolean(net.minecraft.server.BlockFire.class, "down", true)
+ };
+
+ @Override
+ public boolean hasFace(org.bukkit.block.BlockFace face) {
+ return get(FACES[face.ordinal()]);
+ }
+
+ @Override
+ public void setFace(org.bukkit.block.BlockFace face, boolean has) {
+ set(FACES[face.ordinal()], has);
+ }
+
+ @Override
+ public java.util.Set<org.bukkit.block.BlockFace> getFaces() {
+ com.google.common.collect.ImmutableSet.Builder<org.bukkit.block.BlockFace> faces = com.google.common.collect.ImmutableSet.builder();
+
+ for (int i = 0; i < FACES.length; i++) {
+ if (FACES[i] != null && get(FACES[i])) {
+ faces.add(org.bukkit.block.BlockFace.values()[i]);
+ }
+ }
+
+ return faces.build();
+ }
+
+ @Override
+ public java.util.Set<org.bukkit.block.BlockFace> getAllowedFaces() {
+ com.google.common.collect.ImmutableSet.Builder<org.bukkit.block.BlockFace> faces = com.google.common.collect.ImmutableSet.builder();
+
+ for (int i = 0; i < FACES.length; i++) {
+ if (FACES[i] != null) {
+ faces.add(org.bukkit.block.BlockFace.values()[i]);
+ }
+ }
+
+ return faces.build();
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftFloorSign.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftFloorSign.java
new file mode 100644
index 00000000..aa52ec77
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftFloorSign.java
@@ -0,0 +1,132 @@
+/**
+ * Automatically generated file, changes will be lost.
+ */
+package org.bukkit.craftbukkit.block.impl;
+
+public final class CraftFloorSign extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.type.Sign, org.bukkit.block.data.Rotatable, org.bukkit.block.data.Waterlogged {
+
+ public CraftFloorSign() {
+ super();
+ }
+
+ public CraftFloorSign(net.minecraft.server.IBlockData state) {
+ super(state);
+ }
+
+ // org.bukkit.craftbukkit.block.data.CraftRotatable
+
+ private static final net.minecraft.server.BlockStateInteger ROTATION = getInteger(net.minecraft.server.BlockFloorSign.class, "rotation");
+
+ @Override
+ public org.bukkit.block.BlockFace getRotation() {
+ int data = get(ROTATION);
+ switch (data) {
+ case 0x0:
+ return org.bukkit.block.BlockFace.SOUTH;
+ case 0x1:
+ return org.bukkit.block.BlockFace.SOUTH_SOUTH_WEST;
+ case 0x2:
+ return org.bukkit.block.BlockFace.SOUTH_WEST;
+ case 0x3:
+ return org.bukkit.block.BlockFace.WEST_SOUTH_WEST;
+ case 0x4:
+ return org.bukkit.block.BlockFace.WEST;
+ case 0x5:
+ return org.bukkit.block.BlockFace.WEST_NORTH_WEST;
+ case 0x6:
+ return org.bukkit.block.BlockFace.NORTH_WEST;
+ case 0x7:
+ return org.bukkit.block.BlockFace.NORTH_NORTH_WEST;
+ case 0x8:
+ return org.bukkit.block.BlockFace.NORTH;
+ case 0x9:
+ return org.bukkit.block.BlockFace.NORTH_NORTH_EAST;
+ case 0xA:
+ return org.bukkit.block.BlockFace.NORTH_EAST;
+ case 0xB:
+ return org.bukkit.block.BlockFace.EAST_NORTH_EAST;
+ case 0xC:
+ return org.bukkit.block.BlockFace.EAST;
+ case 0xD:
+ return org.bukkit.block.BlockFace.EAST_SOUTH_EAST;
+ case 0xE:
+ return org.bukkit.block.BlockFace.SOUTH_EAST;
+ case 0xF:
+ return org.bukkit.block.BlockFace.SOUTH_SOUTH_EAST;
+ default:
+ throw new IllegalArgumentException("Unknown rotation " + data);
+ }
+ }
+
+ @Override
+ public void setRotation(org.bukkit.block.BlockFace rotation) {
+ int val;
+ switch (rotation) {
+ case SOUTH:
+ val = 0x0;
+ break;
+ case SOUTH_SOUTH_WEST:
+ val = 0x1;
+ break;
+ case SOUTH_WEST:
+ val = 0x2;
+ break;
+ case WEST_SOUTH_WEST:
+ val = 0x3;
+ break;
+ case WEST:
+ val = 0x4;
+ break;
+ case WEST_NORTH_WEST:
+ val = 0x5;
+ break;
+ case NORTH_WEST:
+ val = 0x6;
+ break;
+ case NORTH_NORTH_WEST:
+ val = 0x7;
+ break;
+ case NORTH:
+ val = 0x8;
+ break;
+ case NORTH_NORTH_EAST:
+ val = 0x9;
+ break;
+ case NORTH_EAST:
+ val = 0xA;
+ break;
+ case EAST_NORTH_EAST:
+ val = 0xB;
+ break;
+ case EAST:
+ val = 0xC;
+ break;
+ case EAST_SOUTH_EAST:
+ val = 0xD;
+ break;
+ case SOUTH_EAST:
+ val = 0xE;
+ break;
+ case SOUTH_SOUTH_EAST:
+ val = 0xF;
+ break;
+ default:
+ throw new IllegalArgumentException("Illegal rotation " + rotation);
+ }
+ set(ROTATION, val);
+ }
+
+ // org.bukkit.craftbukkit.block.data.CraftWaterlogged
+
+ private static final net.minecraft.server.BlockStateBoolean WATERLOGGED = getBoolean(net.minecraft.server.BlockFloorSign.class, "waterlogged");
+
+ @Override
+ public boolean isWaterlogged() {
+ return get(WATERLOGGED);
+ }
+
+ @Override
+ public void setWaterlogged(boolean waterlogged) {
+ set(WATERLOGGED, waterlogged);
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftFluids.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftFluids.java
new file mode 100644
index 00000000..21c30c7c
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftFluids.java
@@ -0,0 +1,34 @@
+/**
+ * Automatically generated file, changes will be lost.
+ */
+package org.bukkit.craftbukkit.block.impl;
+
+public final class CraftFluids extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.Levelled {
+
+ public CraftFluids() {
+ super();
+ }
+
+ public CraftFluids(net.minecraft.server.IBlockData state) {
+ super(state);
+ }
+
+ // org.bukkit.craftbukkit.block.data.CraftLevelled
+
+ private static final net.minecraft.server.BlockStateInteger LEVEL = getInteger(net.minecraft.server.BlockFluids.class, "level");
+
+ @Override
+ public int getLevel() {
+ return get(LEVEL);
+ }
+
+ @Override
+ public void setLevel(int level) {
+ set(LEVEL, level);
+ }
+
+ @Override
+ public int getMaximumLevel() {
+ return getMax(LEVEL);
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftFurnace.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftFurnace.java
new file mode 100644
index 00000000..1ca1a9c7
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftFurnace.java
@@ -0,0 +1,48 @@
+/**
+ * Automatically generated file, changes will be lost.
+ */
+package org.bukkit.craftbukkit.block.impl;
+
+public final class CraftFurnace extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.type.Furnace, org.bukkit.block.data.Directional, org.bukkit.block.data.Lightable {
+
+ public CraftFurnace() {
+ super();
+ }
+
+ public CraftFurnace(net.minecraft.server.IBlockData state) {
+ super(state);
+ }
+
+ // org.bukkit.craftbukkit.block.data.CraftDirectional
+
+ private static final net.minecraft.server.BlockStateEnum<?> FACING = getEnum(net.minecraft.server.BlockFurnace.class, "facing");
+
+ @Override
+ public org.bukkit.block.BlockFace getFacing() {
+ return get(FACING, org.bukkit.block.BlockFace.class);
+ }
+
+ @Override
+ public void setFacing(org.bukkit.block.BlockFace facing) {
+ set(FACING, facing);
+ }
+
+ @Override
+ public java.util.Set<org.bukkit.block.BlockFace> getFaces() {
+ return getValues(FACING, org.bukkit.block.BlockFace.class);
+ }
+
+ // org.bukkit.craftbukkit.block.data.CraftLightable
+
+ private static final net.minecraft.server.BlockStateBoolean LIT = getBoolean(net.minecraft.server.BlockFurnace.class, "lit");
+
+ @Override
+ public boolean isLit() {
+ return get(LIT);
+ }
+
+ @Override
+ public void setLit(boolean lit) {
+ set(LIT, lit);
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftGlassPane.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftGlassPane.java
new file mode 100644
index 00000000..4c8bfcb7
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftGlassPane.java
@@ -0,0 +1,71 @@
+/**
+ * Automatically generated file, changes will be lost.
+ */
+package org.bukkit.craftbukkit.block.impl;
+
+public final class CraftGlassPane extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.type.GlassPane, org.bukkit.block.data.MultipleFacing, org.bukkit.block.data.Waterlogged {
+
+ public CraftGlassPane() {
+ super();
+ }
+
+ public CraftGlassPane(net.minecraft.server.IBlockData state) {
+ super(state);
+ }
+
+ // org.bukkit.craftbukkit.block.data.CraftMultipleFacing
+
+ private static final net.minecraft.server.BlockStateBoolean[] FACES = new net.minecraft.server.BlockStateBoolean[]{
+ getBoolean(net.minecraft.server.BlockGlassPane.class, "north", true), getBoolean(net.minecraft.server.BlockGlassPane.class, "east", true), getBoolean(net.minecraft.server.BlockGlassPane.class, "south", true), getBoolean(net.minecraft.server.BlockGlassPane.class, "west", true), getBoolean(net.minecraft.server.BlockGlassPane.class, "up", true), getBoolean(net.minecraft.server.BlockGlassPane.class, "down", true)
+ };
+
+ @Override
+ public boolean hasFace(org.bukkit.block.BlockFace face) {
+ return get(FACES[face.ordinal()]);
+ }
+
+ @Override
+ public void setFace(org.bukkit.block.BlockFace face, boolean has) {
+ set(FACES[face.ordinal()], has);
+ }
+
+ @Override
+ public java.util.Set<org.bukkit.block.BlockFace> getFaces() {
+ com.google.common.collect.ImmutableSet.Builder<org.bukkit.block.BlockFace> faces = com.google.common.collect.ImmutableSet.builder();
+
+ for (int i = 0; i < FACES.length; i++) {
+ if (FACES[i] != null && get(FACES[i])) {
+ faces.add(org.bukkit.block.BlockFace.values()[i]);
+ }
+ }
+
+ return faces.build();
+ }
+
+ @Override
+ public java.util.Set<org.bukkit.block.BlockFace> getAllowedFaces() {
+ com.google.common.collect.ImmutableSet.Builder<org.bukkit.block.BlockFace> faces = com.google.common.collect.ImmutableSet.builder();
+
+ for (int i = 0; i < FACES.length; i++) {
+ if (FACES[i] != null) {
+ faces.add(org.bukkit.block.BlockFace.values()[i]);
+ }
+ }
+
+ return faces.build();
+ }
+
+ // org.bukkit.craftbukkit.block.data.CraftWaterlogged
+
+ private static final net.minecraft.server.BlockStateBoolean WATERLOGGED = getBoolean(net.minecraft.server.BlockGlassPane.class, "waterlogged");
+
+ @Override
+ public boolean isWaterlogged() {
+ return get(WATERLOGGED);
+ }
+
+ @Override
+ public void setWaterlogged(boolean waterlogged) {
+ set(WATERLOGGED, waterlogged);
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftGlazedTerracotta.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftGlazedTerracotta.java
new file mode 100644
index 00000000..89cc7f95
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftGlazedTerracotta.java
@@ -0,0 +1,34 @@
+/**
+ * Automatically generated file, changes will be lost.
+ */
+package org.bukkit.craftbukkit.block.impl;
+
+public final class CraftGlazedTerracotta extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.Directional {
+
+ public CraftGlazedTerracotta() {
+ super();
+ }
+
+ public CraftGlazedTerracotta(net.minecraft.server.IBlockData state) {
+ super(state);
+ }
+
+ // org.bukkit.craftbukkit.block.data.CraftDirectional
+
+ private static final net.minecraft.server.BlockStateEnum<?> FACING = getEnum(net.minecraft.server.BlockGlazedTerracotta.class, "facing");
+
+ @Override
+ public org.bukkit.block.BlockFace getFacing() {
+ return get(FACING, org.bukkit.block.BlockFace.class);
+ }
+
+ @Override
+ public void setFacing(org.bukkit.block.BlockFace facing) {
+ set(FACING, facing);
+ }
+
+ @Override
+ public java.util.Set<org.bukkit.block.BlockFace> getFaces() {
+ return getValues(FACING, org.bukkit.block.BlockFace.class);
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftGrass.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftGrass.java
new file mode 100644
index 00000000..08fcfb0b
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftGrass.java
@@ -0,0 +1,29 @@
+/**
+ * Automatically generated file, changes will be lost.
+ */
+package org.bukkit.craftbukkit.block.impl;
+
+public final class CraftGrass extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.Snowable {
+
+ public CraftGrass() {
+ super();
+ }
+
+ public CraftGrass(net.minecraft.server.IBlockData state) {
+ super(state);
+ }
+
+ // org.bukkit.craftbukkit.block.data.CraftSnowable
+
+ private static final net.minecraft.server.BlockStateBoolean SNOWY = getBoolean(net.minecraft.server.BlockGrass.class, "snowy");
+
+ @Override
+ public boolean isSnowy() {
+ return get(SNOWY);
+ }
+
+ @Override
+ public void setSnowy(boolean snowy) {
+ set(SNOWY, snowy);
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftHay.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftHay.java
new file mode 100644
index 00000000..db7d61ad
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftHay.java
@@ -0,0 +1,34 @@
+/**
+ * Automatically generated file, changes will be lost.
+ */
+package org.bukkit.craftbukkit.block.impl;
+
+public final class CraftHay extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.Orientable {
+
+ public CraftHay() {
+ super();
+ }
+
+ public CraftHay(net.minecraft.server.IBlockData state) {
+ super(state);
+ }
+
+ // org.bukkit.craftbukkit.block.data.CraftOrientable
+
+ private static final net.minecraft.server.BlockStateEnum<?> AXIS = getEnum(net.minecraft.server.BlockHay.class, "axis");
+
+ @Override
+ public org.bukkit.Axis getAxis() {
+ return get(AXIS, org.bukkit.Axis.class);
+ }
+
+ @Override
+ public void setAxis(org.bukkit.Axis axis) {
+ set(AXIS, axis);
+ }
+
+ @Override
+ public java.util.Set<org.bukkit.Axis> getAxes() {
+ return getValues(AXIS, org.bukkit.Axis.class);
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftHopper.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftHopper.java
new file mode 100644
index 00000000..f1311517
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftHopper.java
@@ -0,0 +1,48 @@
+/**
+ * Automatically generated file, changes will be lost.
+ */
+package org.bukkit.craftbukkit.block.impl;
+
+public final class CraftHopper extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.type.Hopper, org.bukkit.block.data.Directional {
+
+ public CraftHopper() {
+ super();
+ }
+
+ public CraftHopper(net.minecraft.server.IBlockData state) {
+ super(state);
+ }
+
+ // org.bukkit.craftbukkit.block.data.type.CraftHopper
+
+ private static final net.minecraft.server.BlockStateBoolean ENABLED = getBoolean(net.minecraft.server.BlockHopper.class, "enabled");
+
+ @Override
+ public boolean isEnabled() {
+ return get(ENABLED);
+ }
+
+ @Override
+ public void setEnabled(boolean enabled) {
+ set(ENABLED, enabled);
+ }
+
+ // org.bukkit.craftbukkit.block.data.CraftDirectional
+
+ private static final net.minecraft.server.BlockStateEnum<?> FACING = getEnum(net.minecraft.server.BlockHopper.class, "facing");
+
+ @Override
+ public org.bukkit.block.BlockFace getFacing() {
+ return get(FACING, org.bukkit.block.BlockFace.class);
+ }
+
+ @Override
+ public void setFacing(org.bukkit.block.BlockFace facing) {
+ set(FACING, facing);
+ }
+
+ @Override
+ public java.util.Set<org.bukkit.block.BlockFace> getFaces() {
+ return getValues(FACING, org.bukkit.block.BlockFace.class);
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftHugeMushroom.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftHugeMushroom.java
new file mode 100644
index 00000000..fb6e2050
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftHugeMushroom.java
@@ -0,0 +1,57 @@
+/**
+ * Automatically generated file, changes will be lost.
+ */
+package org.bukkit.craftbukkit.block.impl;
+
+public final class CraftHugeMushroom extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.MultipleFacing {
+
+ public CraftHugeMushroom() {
+ super();
+ }
+
+ public CraftHugeMushroom(net.minecraft.server.IBlockData state) {
+ super(state);
+ }
+
+ // org.bukkit.craftbukkit.block.data.CraftMultipleFacing
+
+ private static final net.minecraft.server.BlockStateBoolean[] FACES = new net.minecraft.server.BlockStateBoolean[]{
+ getBoolean(net.minecraft.server.BlockHugeMushroom.class, "north", true), getBoolean(net.minecraft.server.BlockHugeMushroom.class, "east", true), getBoolean(net.minecraft.server.BlockHugeMushroom.class, "south", true), getBoolean(net.minecraft.server.BlockHugeMushroom.class, "west", true), getBoolean(net.minecraft.server.BlockHugeMushroom.class, "up", true), getBoolean(net.minecraft.server.BlockHugeMushroom.class, "down", true)
+ };
+
+ @Override
+ public boolean hasFace(org.bukkit.block.BlockFace face) {
+ return get(FACES[face.ordinal()]);
+ }
+
+ @Override
+ public void setFace(org.bukkit.block.BlockFace face, boolean has) {
+ set(FACES[face.ordinal()], has);
+ }
+
+ @Override
+ public java.util.Set<org.bukkit.block.BlockFace> getFaces() {
+ com.google.common.collect.ImmutableSet.Builder<org.bukkit.block.BlockFace> faces = com.google.common.collect.ImmutableSet.builder();
+
+ for (int i = 0; i < FACES.length; i++) {
+ if (FACES[i] != null && get(FACES[i])) {
+ faces.add(org.bukkit.block.BlockFace.values()[i]);
+ }
+ }
+
+ return faces.build();
+ }
+
+ @Override
+ public java.util.Set<org.bukkit.block.BlockFace> getAllowedFaces() {
+ com.google.common.collect.ImmutableSet.Builder<org.bukkit.block.BlockFace> faces = com.google.common.collect.ImmutableSet.builder();
+
+ for (int i = 0; i < FACES.length; i++) {
+ if (FACES[i] != null) {
+ faces.add(org.bukkit.block.BlockFace.values()[i]);
+ }
+ }
+
+ return faces.build();
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftIceFrost.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftIceFrost.java
new file mode 100644
index 00000000..7b297dc2
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftIceFrost.java
@@ -0,0 +1,34 @@
+/**
+ * Automatically generated file, changes will be lost.
+ */
+package org.bukkit.craftbukkit.block.impl;
+
+public final class CraftIceFrost extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.Ageable {
+
+ public CraftIceFrost() {
+ super();
+ }
+
+ public CraftIceFrost(net.minecraft.server.IBlockData state) {
+ super(state);
+ }
+
+ // org.bukkit.craftbukkit.block.data.CraftAgeable
+
+ private static final net.minecraft.server.BlockStateInteger AGE = getInteger(net.minecraft.server.BlockIceFrost.class, "age");
+
+ @Override
+ public int getAge() {
+ return get(AGE);
+ }
+
+ @Override
+ public void setAge(int age) {
+ set(AGE, age);
+ }
+
+ @Override
+ public int getMaximumAge() {
+ return getMax(AGE);
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftIronBars.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftIronBars.java
new file mode 100644
index 00000000..cf6da2df
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftIronBars.java
@@ -0,0 +1,71 @@
+/**
+ * Automatically generated file, changes will be lost.
+ */
+package org.bukkit.craftbukkit.block.impl;
+
+public final class CraftIronBars extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.type.Fence, org.bukkit.block.data.MultipleFacing, org.bukkit.block.data.Waterlogged {
+
+ public CraftIronBars() {
+ super();
+ }
+
+ public CraftIronBars(net.minecraft.server.IBlockData state) {
+ super(state);
+ }
+
+ // org.bukkit.craftbukkit.block.data.CraftMultipleFacing
+
+ private static final net.minecraft.server.BlockStateBoolean[] FACES = new net.minecraft.server.BlockStateBoolean[]{
+ getBoolean(net.minecraft.server.BlockIronBars.class, "north", true), getBoolean(net.minecraft.server.BlockIronBars.class, "east", true), getBoolean(net.minecraft.server.BlockIronBars.class, "south", true), getBoolean(net.minecraft.server.BlockIronBars.class, "west", true), getBoolean(net.minecraft.server.BlockIronBars.class, "up", true), getBoolean(net.minecraft.server.BlockIronBars.class, "down", true)
+ };
+
+ @Override
+ public boolean hasFace(org.bukkit.block.BlockFace face) {
+ return get(FACES[face.ordinal()]);
+ }
+
+ @Override
+ public void setFace(org.bukkit.block.BlockFace face, boolean has) {
+ set(FACES[face.ordinal()], has);
+ }
+
+ @Override
+ public java.util.Set<org.bukkit.block.BlockFace> getFaces() {
+ com.google.common.collect.ImmutableSet.Builder<org.bukkit.block.BlockFace> faces = com.google.common.collect.ImmutableSet.builder();
+
+ for (int i = 0; i < FACES.length; i++) {
+ if (FACES[i] != null && get(FACES[i])) {
+ faces.add(org.bukkit.block.BlockFace.values()[i]);
+ }
+ }
+
+ return faces.build();
+ }
+
+ @Override
+ public java.util.Set<org.bukkit.block.BlockFace> getAllowedFaces() {
+ com.google.common.collect.ImmutableSet.Builder<org.bukkit.block.BlockFace> faces = com.google.common.collect.ImmutableSet.builder();
+
+ for (int i = 0; i < FACES.length; i++) {
+ if (FACES[i] != null) {
+ faces.add(org.bukkit.block.BlockFace.values()[i]);
+ }
+ }
+
+ return faces.build();
+ }
+
+ // org.bukkit.craftbukkit.block.data.CraftWaterlogged
+
+ private static final net.minecraft.server.BlockStateBoolean WATERLOGGED = getBoolean(net.minecraft.server.BlockIronBars.class, "waterlogged");
+
+ @Override
+ public boolean isWaterlogged() {
+ return get(WATERLOGGED);
+ }
+
+ @Override
+ public void setWaterlogged(boolean waterlogged) {
+ set(WATERLOGGED, waterlogged);
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftJukeBox.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftJukeBox.java
new file mode 100644
index 00000000..b87801f3
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftJukeBox.java
@@ -0,0 +1,24 @@
+/**
+ * Automatically generated file, changes will be lost.
+ */
+package org.bukkit.craftbukkit.block.impl;
+
+public final class CraftJukeBox extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.type.Jukebox {
+
+ public CraftJukeBox() {
+ super();
+ }
+
+ public CraftJukeBox(net.minecraft.server.IBlockData state) {
+ super(state);
+ }
+
+ // org.bukkit.craftbukkit.block.data.type.CraftJukebox
+
+ private static final net.minecraft.server.BlockStateBoolean HAS_RECORD = getBoolean(net.minecraft.server.BlockJukeBox.class, "has_record");
+
+ @Override
+ public boolean hasRecord() {
+ return get(HAS_RECORD);
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftKelp.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftKelp.java
new file mode 100644
index 00000000..e9ba8ade
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftKelp.java
@@ -0,0 +1,34 @@
+/**
+ * Automatically generated file, changes will be lost.
+ */
+package org.bukkit.craftbukkit.block.impl;
+
+public final class CraftKelp extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.Ageable {
+
+ public CraftKelp() {
+ super();
+ }
+
+ public CraftKelp(net.minecraft.server.IBlockData state) {
+ super(state);
+ }
+
+ // org.bukkit.craftbukkit.block.data.CraftAgeable
+
+ private static final net.minecraft.server.BlockStateInteger AGE = getInteger(net.minecraft.server.BlockKelp.class, "age");
+
+ @Override
+ public int getAge() {
+ return get(AGE);
+ }
+
+ @Override
+ public void setAge(int age) {
+ set(AGE, age);
+ }
+
+ @Override
+ public int getMaximumAge() {
+ return getMax(AGE);
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftLadder.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftLadder.java
new file mode 100644
index 00000000..2c7f396f
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftLadder.java
@@ -0,0 +1,48 @@
+/**
+ * Automatically generated file, changes will be lost.
+ */
+package org.bukkit.craftbukkit.block.impl;
+
+public final class CraftLadder extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.type.Ladder, org.bukkit.block.data.Directional, org.bukkit.block.data.Waterlogged {
+
+ public CraftLadder() {
+ super();
+ }
+
+ public CraftLadder(net.minecraft.server.IBlockData state) {
+ super(state);
+ }
+
+ // org.bukkit.craftbukkit.block.data.CraftDirectional
+
+ private static final net.minecraft.server.BlockStateEnum<?> FACING = getEnum(net.minecraft.server.BlockLadder.class, "facing");
+
+ @Override
+ public org.bukkit.block.BlockFace getFacing() {
+ return get(FACING, org.bukkit.block.BlockFace.class);
+ }
+
+ @Override
+ public void setFacing(org.bukkit.block.BlockFace facing) {
+ set(FACING, facing);
+ }
+
+ @Override
+ public java.util.Set<org.bukkit.block.BlockFace> getFaces() {
+ return getValues(FACING, org.bukkit.block.BlockFace.class);
+ }
+
+ // org.bukkit.craftbukkit.block.data.CraftWaterlogged
+
+ private static final net.minecraft.server.BlockStateBoolean WATERLOGGED = getBoolean(net.minecraft.server.BlockLadder.class, "waterlogged");
+
+ @Override
+ public boolean isWaterlogged() {
+ return get(WATERLOGGED);
+ }
+
+ @Override
+ public void setWaterlogged(boolean waterlogged) {
+ set(WATERLOGGED, waterlogged);
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftLeaves.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftLeaves.java
new file mode 100644
index 00000000..2e2f091b
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftLeaves.java
@@ -0,0 +1,40 @@
+/**
+ * Automatically generated file, changes will be lost.
+ */
+package org.bukkit.craftbukkit.block.impl;
+
+public final class CraftLeaves extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.type.Leaves {
+
+ public CraftLeaves() {
+ super();
+ }
+
+ public CraftLeaves(net.minecraft.server.IBlockData state) {
+ super(state);
+ }
+
+ // org.bukkit.craftbukkit.block.data.type.CraftLeaves
+
+ private static final net.minecraft.server.BlockStateInteger DISTANCE = getInteger(net.minecraft.server.BlockLeaves.class, "distance");
+ private static final net.minecraft.server.BlockStateBoolean PERSISTENT = getBoolean(net.minecraft.server.BlockLeaves.class, "persistent");
+
+ @Override
+ public boolean isPersistent() {
+ return get(PERSISTENT);
+ }
+
+ @Override
+ public void setPersistent(boolean persistent) {
+ set(PERSISTENT, persistent);
+ }
+
+ @Override
+ public int getDistance() {
+ return get(DISTANCE);
+ }
+
+ @Override
+ public void setDistance(int distance) {
+ set(DISTANCE, distance);
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftLever.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftLever.java
new file mode 100644
index 00000000..a8b030f2
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftLever.java
@@ -0,0 +1,62 @@
+/**
+ * Automatically generated file, changes will be lost.
+ */
+package org.bukkit.craftbukkit.block.impl;
+
+public final class CraftLever extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.type.Switch, org.bukkit.block.data.Directional, org.bukkit.block.data.Powerable {
+
+ public CraftLever() {
+ super();
+ }
+
+ public CraftLever(net.minecraft.server.IBlockData state) {
+ super(state);
+ }
+
+ // org.bukkit.craftbukkit.block.data.type.CraftSwitch
+
+ private static final net.minecraft.server.BlockStateEnum<?> FACE = getEnum(net.minecraft.server.BlockLever.class, "face");
+
+ @Override
+ public Face getFace() {
+ return get(FACE, Face.class);
+ }
+
+ @Override
+ public void setFace(Face face) {
+ set(FACE, face);
+ }
+
+ // org.bukkit.craftbukkit.block.data.CraftDirectional
+
+ private static final net.minecraft.server.BlockStateEnum<?> FACING = getEnum(net.minecraft.server.BlockLever.class, "facing");
+
+ @Override
+ public org.bukkit.block.BlockFace getFacing() {
+ return get(FACING, org.bukkit.block.BlockFace.class);
+ }
+
+ @Override
+ public void setFacing(org.bukkit.block.BlockFace facing) {
+ set(FACING, facing);
+ }
+
+ @Override
+ public java.util.Set<org.bukkit.block.BlockFace> getFaces() {
+ return getValues(FACING, org.bukkit.block.BlockFace.class);
+ }
+
+ // org.bukkit.craftbukkit.block.data.CraftPowerable
+
+ private static final net.minecraft.server.BlockStateBoolean POWERED = getBoolean(net.minecraft.server.BlockLever.class, "powered");
+
+ @Override
+ public boolean isPowered() {
+ return get(POWERED);
+ }
+
+ @Override
+ public void setPowered(boolean powered) {
+ set(POWERED, powered);
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftLogAbstract.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftLogAbstract.java
new file mode 100644
index 00000000..efa40490
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftLogAbstract.java
@@ -0,0 +1,34 @@
+/**
+ * Automatically generated file, changes will be lost.
+ */
+package org.bukkit.craftbukkit.block.impl;
+
+public final class CraftLogAbstract extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.Orientable {
+
+ public CraftLogAbstract() {
+ super();
+ }
+
+ public CraftLogAbstract(net.minecraft.server.IBlockData state) {
+ super(state);
+ }
+
+ // org.bukkit.craftbukkit.block.data.CraftOrientable
+
+ private static final net.minecraft.server.BlockStateEnum<?> AXIS = getEnum(net.minecraft.server.BlockLogAbstract.class, "axis");
+
+ @Override
+ public org.bukkit.Axis getAxis() {
+ return get(AXIS, org.bukkit.Axis.class);
+ }
+
+ @Override
+ public void setAxis(org.bukkit.Axis axis) {
+ set(AXIS, axis);
+ }
+
+ @Override
+ public java.util.Set<org.bukkit.Axis> getAxes() {
+ return getValues(AXIS, org.bukkit.Axis.class);
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftMinecartDetector.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftMinecartDetector.java
new file mode 100644
index 00000000..9ad25f9f
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftMinecartDetector.java
@@ -0,0 +1,48 @@
+/**
+ * Automatically generated file, changes will be lost.
+ */
+package org.bukkit.craftbukkit.block.impl;
+
+public final class CraftMinecartDetector extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.type.RedstoneRail, org.bukkit.block.data.Powerable, org.bukkit.block.data.Rail {
+
+ public CraftMinecartDetector() {
+ super();
+ }
+
+ public CraftMinecartDetector(net.minecraft.server.IBlockData state) {
+ super(state);
+ }
+
+ // org.bukkit.craftbukkit.block.data.CraftPowerable
+
+ private static final net.minecraft.server.BlockStateBoolean POWERED = getBoolean(net.minecraft.server.BlockMinecartDetector.class, "powered");
+
+ @Override
+ public boolean isPowered() {
+ return get(POWERED);
+ }
+
+ @Override
+ public void setPowered(boolean powered) {
+ set(POWERED, powered);
+ }
+
+ // org.bukkit.craftbukkit.block.data.CraftRail
+
+ private static final net.minecraft.server.BlockStateEnum<?> SHAPE = getEnum(net.minecraft.server.BlockMinecartDetector.class, "shape");
+
+ @Override
+ public Shape getShape() {
+ return get(SHAPE, Shape.class);
+ }
+
+ @Override
+ public void setShape(Shape shape) {
+ set(SHAPE, shape);
+ }
+
+ @Override
+ public java.util.Set<Shape> getShapes() {
+ return getValues(SHAPE, Shape.class);
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftMinecartTrack.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftMinecartTrack.java
new file mode 100644
index 00000000..127681a6
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftMinecartTrack.java
@@ -0,0 +1,34 @@
+/**
+ * Automatically generated file, changes will be lost.
+ */
+package org.bukkit.craftbukkit.block.impl;
+
+public final class CraftMinecartTrack extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.Rail {
+
+ public CraftMinecartTrack() {
+ super();
+ }
+
+ public CraftMinecartTrack(net.minecraft.server.IBlockData state) {
+ super(state);
+ }
+
+ // org.bukkit.craftbukkit.block.data.CraftRail
+
+ private static final net.minecraft.server.BlockStateEnum<?> SHAPE = getEnum(net.minecraft.server.BlockMinecartTrack.class, "shape");
+
+ @Override
+ public Shape getShape() {
+ return get(SHAPE, Shape.class);
+ }
+
+ @Override
+ public void setShape(Shape shape) {
+ set(SHAPE, shape);
+ }
+
+ @Override
+ public java.util.Set<Shape> getShapes() {
+ return getValues(SHAPE, Shape.class);
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftMycel.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftMycel.java
new file mode 100644
index 00000000..ca9d60f3
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftMycel.java
@@ -0,0 +1,29 @@
+/**
+ * Automatically generated file, changes will be lost.
+ */
+package org.bukkit.craftbukkit.block.impl;
+
+public final class CraftMycel extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.Snowable {
+
+ public CraftMycel() {
+ super();
+ }
+
+ public CraftMycel(net.minecraft.server.IBlockData state) {
+ super(state);
+ }
+
+ // org.bukkit.craftbukkit.block.data.CraftSnowable
+
+ private static final net.minecraft.server.BlockStateBoolean SNOWY = getBoolean(net.minecraft.server.BlockMycel.class, "snowy");
+
+ @Override
+ public boolean isSnowy() {
+ return get(SNOWY);
+ }
+
+ @Override
+ public void setSnowy(boolean snowy) {
+ set(SNOWY, snowy);
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftNetherWart.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftNetherWart.java
new file mode 100644
index 00000000..449d0f6f
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftNetherWart.java
@@ -0,0 +1,34 @@
+/**
+ * Automatically generated file, changes will be lost.
+ */
+package org.bukkit.craftbukkit.block.impl;
+
+public final class CraftNetherWart extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.Ageable {
+
+ public CraftNetherWart() {
+ super();
+ }
+
+ public CraftNetherWart(net.minecraft.server.IBlockData state) {
+ super(state);
+ }
+
+ // org.bukkit.craftbukkit.block.data.CraftAgeable
+
+ private static final net.minecraft.server.BlockStateInteger AGE = getInteger(net.minecraft.server.BlockNetherWart.class, "age");
+
+ @Override
+ public int getAge() {
+ return get(AGE);
+ }
+
+ @Override
+ public void setAge(int age) {
+ set(AGE, age);
+ }
+
+ @Override
+ public int getMaximumAge() {
+ return getMax(AGE);
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftNote.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftNote.java
new file mode 100644
index 00000000..03a736bd
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftNote.java
@@ -0,0 +1,54 @@
+/**
+ * Automatically generated file, changes will be lost.
+ */
+package org.bukkit.craftbukkit.block.impl;
+
+public final class CraftNote extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.type.NoteBlock, org.bukkit.block.data.Powerable {
+
+ public CraftNote() {
+ super();
+ }
+
+ public CraftNote(net.minecraft.server.IBlockData state) {
+ super(state);
+ }
+
+ // org.bukkit.craftbukkit.block.data.type.CraftNoteBlock
+
+ private static final net.minecraft.server.BlockStateEnum<?> INSTRUMENT = getEnum(net.minecraft.server.BlockNote.class, "instrument");
+ private static final net.minecraft.server.BlockStateInteger NOTE = getInteger(net.minecraft.server.BlockNote.class, "note");
+
+ @Override
+ public org.bukkit.Instrument getInstrument() {
+ return get(INSTRUMENT, org.bukkit.Instrument.class);
+ }
+
+ @Override
+ public void setInstrument(org.bukkit.Instrument instrument) {
+ set(INSTRUMENT, instrument);
+ }
+
+ @Override
+ public org.bukkit.Note getNote() {
+ return new org.bukkit.Note(get(NOTE));
+ }
+
+ @Override
+ public void setNote(org.bukkit.Note note) {
+ set(NOTE, (int) note.getId());
+ }
+
+ // org.bukkit.craftbukkit.block.data.CraftPowerable
+
+ private static final net.minecraft.server.BlockStateBoolean POWERED = getBoolean(net.minecraft.server.BlockNote.class, "powered");
+
+ @Override
+ public boolean isPowered() {
+ return get(POWERED);
+ }
+
+ @Override
+ public void setPowered(boolean powered) {
+ set(POWERED, powered);
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftObserver.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftObserver.java
new file mode 100644
index 00000000..ba3a4f07
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftObserver.java
@@ -0,0 +1,48 @@
+/**
+ * Automatically generated file, changes will be lost.
+ */
+package org.bukkit.craftbukkit.block.impl;
+
+public final class CraftObserver extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.type.Observer, org.bukkit.block.data.Directional, org.bukkit.block.data.Powerable {
+
+ public CraftObserver() {
+ super();
+ }
+
+ public CraftObserver(net.minecraft.server.IBlockData state) {
+ super(state);
+ }
+
+ // org.bukkit.craftbukkit.block.data.CraftDirectional
+
+ private static final net.minecraft.server.BlockStateEnum<?> FACING = getEnum(net.minecraft.server.BlockObserver.class, "facing");
+
+ @Override
+ public org.bukkit.block.BlockFace getFacing() {
+ return get(FACING, org.bukkit.block.BlockFace.class);
+ }
+
+ @Override
+ public void setFacing(org.bukkit.block.BlockFace facing) {
+ set(FACING, facing);
+ }
+
+ @Override
+ public java.util.Set<org.bukkit.block.BlockFace> getFaces() {
+ return getValues(FACING, org.bukkit.block.BlockFace.class);
+ }
+
+ // org.bukkit.craftbukkit.block.data.CraftPowerable
+
+ private static final net.minecraft.server.BlockStateBoolean POWERED = getBoolean(net.minecraft.server.BlockObserver.class, "powered");
+
+ @Override
+ public boolean isPowered() {
+ return get(POWERED);
+ }
+
+ @Override
+ public void setPowered(boolean powered) {
+ set(POWERED, powered);
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftPiston.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftPiston.java
new file mode 100644
index 00000000..f16404f4
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftPiston.java
@@ -0,0 +1,48 @@
+/**
+ * Automatically generated file, changes will be lost.
+ */
+package org.bukkit.craftbukkit.block.impl;
+
+public final class CraftPiston extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.type.Piston, org.bukkit.block.data.Directional {
+
+ public CraftPiston() {
+ super();
+ }
+
+ public CraftPiston(net.minecraft.server.IBlockData state) {
+ super(state);
+ }
+
+ // org.bukkit.craftbukkit.block.data.type.CraftPiston
+
+ private static final net.minecraft.server.BlockStateBoolean EXTENDED = getBoolean(net.minecraft.server.BlockPiston.class, "extended");
+
+ @Override
+ public boolean isExtended() {
+ return get(EXTENDED);
+ }
+
+ @Override
+ public void setExtended(boolean extended) {
+ set(EXTENDED, extended);
+ }
+
+ // org.bukkit.craftbukkit.block.data.CraftDirectional
+
+ private static final net.minecraft.server.BlockStateEnum<?> FACING = getEnum(net.minecraft.server.BlockPiston.class, "facing");
+
+ @Override
+ public org.bukkit.block.BlockFace getFacing() {
+ return get(FACING, org.bukkit.block.BlockFace.class);
+ }
+
+ @Override
+ public void setFacing(org.bukkit.block.BlockFace facing) {
+ set(FACING, facing);
+ }
+
+ @Override
+ public java.util.Set<org.bukkit.block.BlockFace> getFaces() {
+ return getValues(FACING, org.bukkit.block.BlockFace.class);
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftPistonExtension.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftPistonExtension.java
new file mode 100644
index 00000000..038e5843
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftPistonExtension.java
@@ -0,0 +1,62 @@
+/**
+ * Automatically generated file, changes will be lost.
+ */
+package org.bukkit.craftbukkit.block.impl;
+
+public final class CraftPistonExtension extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.type.PistonHead, org.bukkit.block.data.type.TechnicalPiston, org.bukkit.block.data.Directional {
+
+ public CraftPistonExtension() {
+ super();
+ }
+
+ public CraftPistonExtension(net.minecraft.server.IBlockData state) {
+ super(state);
+ }
+
+ // org.bukkit.craftbukkit.block.data.type.CraftPistonHead
+
+ private static final net.minecraft.server.BlockStateBoolean SHORT = getBoolean(net.minecraft.server.BlockPistonExtension.class, "short");
+
+ @Override
+ public boolean isShort() {
+ return get(SHORT);
+ }
+
+ @Override
+ public void setShort(boolean _short) {
+ set(SHORT, _short);
+ }
+
+ // org.bukkit.craftbukkit.block.data.type.CraftTechnicalPiston
+
+ private static final net.minecraft.server.BlockStateEnum<?> TYPE = getEnum(net.minecraft.server.BlockPistonExtension.class, "type");
+
+ @Override
+ public Type getType() {
+ return get(TYPE, Type.class);
+ }
+
+ @Override
+ public void setType(Type type) {
+ set(TYPE, type);
+ }
+
+ // org.bukkit.craftbukkit.block.data.CraftDirectional
+
+ private static final net.minecraft.server.BlockStateEnum<?> FACING = getEnum(net.minecraft.server.BlockPistonExtension.class, "facing");
+
+ @Override
+ public org.bukkit.block.BlockFace getFacing() {
+ return get(FACING, org.bukkit.block.BlockFace.class);
+ }
+
+ @Override
+ public void setFacing(org.bukkit.block.BlockFace facing) {
+ set(FACING, facing);
+ }
+
+ @Override
+ public java.util.Set<org.bukkit.block.BlockFace> getFaces() {
+ return getValues(FACING, org.bukkit.block.BlockFace.class);
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftPistonMoving.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftPistonMoving.java
new file mode 100644
index 00000000..38b098e0
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftPistonMoving.java
@@ -0,0 +1,48 @@
+/**
+ * Automatically generated file, changes will be lost.
+ */
+package org.bukkit.craftbukkit.block.impl;
+
+public final class CraftPistonMoving extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.type.TechnicalPiston, org.bukkit.block.data.Directional {
+
+ public CraftPistonMoving() {
+ super();
+ }
+
+ public CraftPistonMoving(net.minecraft.server.IBlockData state) {
+ super(state);
+ }
+
+ // org.bukkit.craftbukkit.block.data.type.CraftTechnicalPiston
+
+ private static final net.minecraft.server.BlockStateEnum<?> TYPE = getEnum(net.minecraft.server.BlockPistonMoving.class, "type");
+
+ @Override
+ public Type getType() {
+ return get(TYPE, Type.class);
+ }
+
+ @Override
+ public void setType(Type type) {
+ set(TYPE, type);
+ }
+
+ // org.bukkit.craftbukkit.block.data.CraftDirectional
+
+ private static final net.minecraft.server.BlockStateEnum<?> FACING = getEnum(net.minecraft.server.BlockPistonMoving.class, "facing");
+
+ @Override
+ public org.bukkit.block.BlockFace getFacing() {
+ return get(FACING, org.bukkit.block.BlockFace.class);
+ }
+
+ @Override
+ public void setFacing(org.bukkit.block.BlockFace facing) {
+ set(FACING, facing);
+ }
+
+ @Override
+ public java.util.Set<org.bukkit.block.BlockFace> getFaces() {
+ return getValues(FACING, org.bukkit.block.BlockFace.class);
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftPortal.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftPortal.java
new file mode 100644
index 00000000..7701ca85
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftPortal.java
@@ -0,0 +1,34 @@
+/**
+ * Automatically generated file, changes will be lost.
+ */
+package org.bukkit.craftbukkit.block.impl;
+
+public final class CraftPortal extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.Orientable {
+
+ public CraftPortal() {
+ super();
+ }
+
+ public CraftPortal(net.minecraft.server.IBlockData state) {
+ super(state);
+ }
+
+ // org.bukkit.craftbukkit.block.data.CraftOrientable
+
+ private static final net.minecraft.server.BlockStateEnum<?> AXIS = getEnum(net.minecraft.server.BlockPortal.class, "axis");
+
+ @Override
+ public org.bukkit.Axis getAxis() {
+ return get(AXIS, org.bukkit.Axis.class);
+ }
+
+ @Override
+ public void setAxis(org.bukkit.Axis axis) {
+ set(AXIS, axis);
+ }
+
+ @Override
+ public java.util.Set<org.bukkit.Axis> getAxes() {
+ return getValues(AXIS, org.bukkit.Axis.class);
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftPotatoes.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftPotatoes.java
new file mode 100644
index 00000000..c09a9c78
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftPotatoes.java
@@ -0,0 +1,34 @@
+/**
+ * Automatically generated file, changes will be lost.
+ */
+package org.bukkit.craftbukkit.block.impl;
+
+public final class CraftPotatoes extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.Ageable {
+
+ public CraftPotatoes() {
+ super();
+ }
+
+ public CraftPotatoes(net.minecraft.server.IBlockData state) {
+ super(state);
+ }
+
+ // org.bukkit.craftbukkit.block.data.CraftAgeable
+
+ private static final net.minecraft.server.BlockStateInteger AGE = getInteger(net.minecraft.server.BlockPotatoes.class, "age");
+
+ @Override
+ public int getAge() {
+ return get(AGE);
+ }
+
+ @Override
+ public void setAge(int age) {
+ set(AGE, age);
+ }
+
+ @Override
+ public int getMaximumAge() {
+ return getMax(AGE);
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftPoweredRail.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftPoweredRail.java
new file mode 100644
index 00000000..ea904ef0
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftPoweredRail.java
@@ -0,0 +1,48 @@
+/**
+ * Automatically generated file, changes will be lost.
+ */
+package org.bukkit.craftbukkit.block.impl;
+
+public final class CraftPoweredRail extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.type.RedstoneRail, org.bukkit.block.data.Powerable, org.bukkit.block.data.Rail {
+
+ public CraftPoweredRail() {
+ super();
+ }
+
+ public CraftPoweredRail(net.minecraft.server.IBlockData state) {
+ super(state);
+ }
+
+ // org.bukkit.craftbukkit.block.data.CraftPowerable
+
+ private static final net.minecraft.server.BlockStateBoolean POWERED = getBoolean(net.minecraft.server.BlockPoweredRail.class, "powered");
+
+ @Override
+ public boolean isPowered() {
+ return get(POWERED);
+ }
+
+ @Override
+ public void setPowered(boolean powered) {
+ set(POWERED, powered);
+ }
+
+ // org.bukkit.craftbukkit.block.data.CraftRail
+
+ private static final net.minecraft.server.BlockStateEnum<?> SHAPE = getEnum(net.minecraft.server.BlockPoweredRail.class, "shape");
+
+ @Override
+ public Shape getShape() {
+ return get(SHAPE, Shape.class);
+ }
+
+ @Override
+ public void setShape(Shape shape) {
+ set(SHAPE, shape);
+ }
+
+ @Override
+ public java.util.Set<Shape> getShapes() {
+ return getValues(SHAPE, Shape.class);
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftPressurePlateBinary.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftPressurePlateBinary.java
new file mode 100644
index 00000000..806ad256
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftPressurePlateBinary.java
@@ -0,0 +1,29 @@
+/**
+ * Automatically generated file, changes will be lost.
+ */
+package org.bukkit.craftbukkit.block.impl;
+
+public final class CraftPressurePlateBinary extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.Powerable {
+
+ public CraftPressurePlateBinary() {
+ super();
+ }
+
+ public CraftPressurePlateBinary(net.minecraft.server.IBlockData state) {
+ super(state);
+ }
+
+ // org.bukkit.craftbukkit.block.data.CraftPowerable
+
+ private static final net.minecraft.server.BlockStateBoolean POWERED = getBoolean(net.minecraft.server.BlockPressurePlateBinary.class, "powered");
+
+ @Override
+ public boolean isPowered() {
+ return get(POWERED);
+ }
+
+ @Override
+ public void setPowered(boolean powered) {
+ set(POWERED, powered);
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftPressurePlateWeighted.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftPressurePlateWeighted.java
new file mode 100644
index 00000000..84050664
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftPressurePlateWeighted.java
@@ -0,0 +1,34 @@
+/**
+ * Automatically generated file, changes will be lost.
+ */
+package org.bukkit.craftbukkit.block.impl;
+
+public final class CraftPressurePlateWeighted extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.AnaloguePowerable {
+
+ public CraftPressurePlateWeighted() {
+ super();
+ }
+
+ public CraftPressurePlateWeighted(net.minecraft.server.IBlockData state) {
+ super(state);
+ }
+
+ // org.bukkit.craftbukkit.block.data.CraftAnaloguePowerable
+
+ private static final net.minecraft.server.BlockStateInteger POWER = getInteger(net.minecraft.server.BlockPressurePlateWeighted.class, "power");
+
+ @Override
+ public int getPower() {
+ return get(POWER);
+ }
+
+ @Override
+ public void setPower(int power) {
+ set(POWER, power);
+ }
+
+ @Override
+ public int getMaximumPower() {
+ return getMax(POWER);
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftPumpkinCarved.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftPumpkinCarved.java
new file mode 100644
index 00000000..b258e744
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftPumpkinCarved.java
@@ -0,0 +1,34 @@
+/**
+ * Automatically generated file, changes will be lost.
+ */
+package org.bukkit.craftbukkit.block.impl;
+
+public final class CraftPumpkinCarved extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.Directional {
+
+ public CraftPumpkinCarved() {
+ super();
+ }
+
+ public CraftPumpkinCarved(net.minecraft.server.IBlockData state) {
+ super(state);
+ }
+
+ // org.bukkit.craftbukkit.block.data.CraftDirectional
+
+ private static final net.minecraft.server.BlockStateEnum<?> FACING = getEnum(net.minecraft.server.BlockPumpkinCarved.class, "facing");
+
+ @Override
+ public org.bukkit.block.BlockFace getFacing() {
+ return get(FACING, org.bukkit.block.BlockFace.class);
+ }
+
+ @Override
+ public void setFacing(org.bukkit.block.BlockFace facing) {
+ set(FACING, facing);
+ }
+
+ @Override
+ public java.util.Set<org.bukkit.block.BlockFace> getFaces() {
+ return getValues(FACING, org.bukkit.block.BlockFace.class);
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftRedstoneComparator.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftRedstoneComparator.java
new file mode 100644
index 00000000..2456e307
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftRedstoneComparator.java
@@ -0,0 +1,62 @@
+/**
+ * Automatically generated file, changes will be lost.
+ */
+package org.bukkit.craftbukkit.block.impl;
+
+public final class CraftRedstoneComparator extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.type.Comparator, org.bukkit.block.data.Directional, org.bukkit.block.data.Powerable {
+
+ public CraftRedstoneComparator() {
+ super();
+ }
+
+ public CraftRedstoneComparator(net.minecraft.server.IBlockData state) {
+ super(state);
+ }
+
+ // org.bukkit.craftbukkit.block.data.type.CraftComparator
+
+ private static final net.minecraft.server.BlockStateEnum<?> MODE = getEnum(net.minecraft.server.BlockRedstoneComparator.class, "mode");
+
+ @Override
+ public Mode getMode() {
+ return get(MODE, Mode.class);
+ }
+
+ @Override
+ public void setMode(Mode mode) {
+ set(MODE, mode);
+ }
+
+ // org.bukkit.craftbukkit.block.data.CraftDirectional
+
+ private static final net.minecraft.server.BlockStateEnum<?> FACING = getEnum(net.minecraft.server.BlockRedstoneComparator.class, "facing");
+
+ @Override
+ public org.bukkit.block.BlockFace getFacing() {
+ return get(FACING, org.bukkit.block.BlockFace.class);
+ }
+
+ @Override
+ public void setFacing(org.bukkit.block.BlockFace facing) {
+ set(FACING, facing);
+ }
+
+ @Override
+ public java.util.Set<org.bukkit.block.BlockFace> getFaces() {
+ return getValues(FACING, org.bukkit.block.BlockFace.class);
+ }
+
+ // org.bukkit.craftbukkit.block.data.CraftPowerable
+
+ private static final net.minecraft.server.BlockStateBoolean POWERED = getBoolean(net.minecraft.server.BlockRedstoneComparator.class, "powered");
+
+ @Override
+ public boolean isPowered() {
+ return get(POWERED);
+ }
+
+ @Override
+ public void setPowered(boolean powered) {
+ set(POWERED, powered);
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftRedstoneLamp.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftRedstoneLamp.java
new file mode 100644
index 00000000..7769c93c
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftRedstoneLamp.java
@@ -0,0 +1,29 @@
+/**
+ * Automatically generated file, changes will be lost.
+ */
+package org.bukkit.craftbukkit.block.impl;
+
+public final class CraftRedstoneLamp extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.Lightable {
+
+ public CraftRedstoneLamp() {
+ super();
+ }
+
+ public CraftRedstoneLamp(net.minecraft.server.IBlockData state) {
+ super(state);
+ }
+
+ // org.bukkit.craftbukkit.block.data.CraftLightable
+
+ private static final net.minecraft.server.BlockStateBoolean LIT = getBoolean(net.minecraft.server.BlockRedstoneLamp.class, "lit");
+
+ @Override
+ public boolean isLit() {
+ return get(LIT);
+ }
+
+ @Override
+ public void setLit(boolean lit) {
+ set(LIT, lit);
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftRedstoneOre.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftRedstoneOre.java
new file mode 100644
index 00000000..effe08ea
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftRedstoneOre.java
@@ -0,0 +1,29 @@
+/**
+ * Automatically generated file, changes will be lost.
+ */
+package org.bukkit.craftbukkit.block.impl;
+
+public final class CraftRedstoneOre extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.Lightable {
+
+ public CraftRedstoneOre() {
+ super();
+ }
+
+ public CraftRedstoneOre(net.minecraft.server.IBlockData state) {
+ super(state);
+ }
+
+ // org.bukkit.craftbukkit.block.data.CraftLightable
+
+ private static final net.minecraft.server.BlockStateBoolean LIT = getBoolean(net.minecraft.server.BlockRedstoneOre.class, "lit");
+
+ @Override
+ public boolean isLit() {
+ return get(LIT);
+ }
+
+ @Override
+ public void setLit(boolean lit) {
+ set(LIT, lit);
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftRedstoneTorch.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftRedstoneTorch.java
new file mode 100644
index 00000000..d9d14201
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftRedstoneTorch.java
@@ -0,0 +1,29 @@
+/**
+ * Automatically generated file, changes will be lost.
+ */
+package org.bukkit.craftbukkit.block.impl;
+
+public final class CraftRedstoneTorch extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.Lightable {
+
+ public CraftRedstoneTorch() {
+ super();
+ }
+
+ public CraftRedstoneTorch(net.minecraft.server.IBlockData state) {
+ super(state);
+ }
+
+ // org.bukkit.craftbukkit.block.data.CraftLightable
+
+ private static final net.minecraft.server.BlockStateBoolean LIT = getBoolean(net.minecraft.server.BlockRedstoneTorch.class, "lit");
+
+ @Override
+ public boolean isLit() {
+ return get(LIT);
+ }
+
+ @Override
+ public void setLit(boolean lit) {
+ set(LIT, lit);
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftRedstoneTorchWall.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftRedstoneTorchWall.java
new file mode 100644
index 00000000..8125b400
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftRedstoneTorchWall.java
@@ -0,0 +1,48 @@
+/**
+ * Automatically generated file, changes will be lost.
+ */
+package org.bukkit.craftbukkit.block.impl;
+
+public final class CraftRedstoneTorchWall extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.type.RedstoneWallTorch, org.bukkit.block.data.Directional, org.bukkit.block.data.Lightable {
+
+ public CraftRedstoneTorchWall() {
+ super();
+ }
+
+ public CraftRedstoneTorchWall(net.minecraft.server.IBlockData state) {
+ super(state);
+ }
+
+ // org.bukkit.craftbukkit.block.data.CraftDirectional
+
+ private static final net.minecraft.server.BlockStateEnum<?> FACING = getEnum(net.minecraft.server.BlockRedstoneTorchWall.class, "facing");
+
+ @Override
+ public org.bukkit.block.BlockFace getFacing() {
+ return get(FACING, org.bukkit.block.BlockFace.class);
+ }
+
+ @Override
+ public void setFacing(org.bukkit.block.BlockFace facing) {
+ set(FACING, facing);
+ }
+
+ @Override
+ public java.util.Set<org.bukkit.block.BlockFace> getFaces() {
+ return getValues(FACING, org.bukkit.block.BlockFace.class);
+ }
+
+ // org.bukkit.craftbukkit.block.data.CraftLightable
+
+ private static final net.minecraft.server.BlockStateBoolean LIT = getBoolean(net.minecraft.server.BlockRedstoneTorchWall.class, "lit");
+
+ @Override
+ public boolean isLit() {
+ return get(LIT);
+ }
+
+ @Override
+ public void setLit(boolean lit) {
+ set(LIT, lit);
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftRedstoneWire.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftRedstoneWire.java
new file mode 100644
index 00000000..f5b0e84d
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftRedstoneWire.java
@@ -0,0 +1,78 @@
+/**
+ * Automatically generated file, changes will be lost.
+ */
+package org.bukkit.craftbukkit.block.impl;
+
+public final class CraftRedstoneWire extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.type.RedstoneWire, org.bukkit.block.data.AnaloguePowerable {
+
+ public CraftRedstoneWire() {
+ super();
+ }
+
+ public CraftRedstoneWire(net.minecraft.server.IBlockData state) {
+ super(state);
+ }
+
+ // org.bukkit.craftbukkit.block.data.type.CraftRedstoneWire
+
+ private static final net.minecraft.server.BlockStateEnum<?> NORTH = getEnum(net.minecraft.server.BlockRedstoneWire.class, "north");
+ private static final net.minecraft.server.BlockStateEnum<?> EAST = getEnum(net.minecraft.server.BlockRedstoneWire.class, "east");
+ private static final net.minecraft.server.BlockStateEnum<?> SOUTH = getEnum(net.minecraft.server.BlockRedstoneWire.class, "south");
+ private static final net.minecraft.server.BlockStateEnum<?> WEST = getEnum(net.minecraft.server.BlockRedstoneWire.class, "west");
+
+ @Override
+ public Connection getFace(org.bukkit.block.BlockFace face) {
+ switch (face) {
+ case NORTH:
+ return get(NORTH, Connection.class);
+ case EAST:
+ return get(EAST, Connection.class);
+ case SOUTH:
+ return get(SOUTH, Connection.class);
+ case WEST:
+ return get(WEST, Connection.class);
+ default:
+ throw new IllegalArgumentException("Cannot have face " + face);
+ }
+ }
+
+ @Override
+ public void setFace(org.bukkit.block.BlockFace face, Connection connection) {
+ switch (face) {
+ case NORTH:
+ set(NORTH, connection);
+ case EAST:
+ set(EAST, connection);
+ case SOUTH:
+ set(SOUTH, connection);
+ case WEST:
+ set(WEST, connection);
+ default:
+ throw new IllegalArgumentException("Cannot have face " + face);
+ }
+ }
+
+ @Override
+ public java.util.Set<org.bukkit.block.BlockFace> getAllowedFaces() {
+ return com.google.common.collect.ImmutableSet.of(org.bukkit.block.BlockFace.NORTH, org.bukkit.block.BlockFace.EAST, org.bukkit.block.BlockFace.SOUTH, org.bukkit.block.BlockFace.WEST);
+ }
+
+ // org.bukkit.craftbukkit.block.data.CraftAnaloguePowerable
+
+ private static final net.minecraft.server.BlockStateInteger POWER = getInteger(net.minecraft.server.BlockRedstoneWire.class, "power");
+
+ @Override
+ public int getPower() {
+ return get(POWER);
+ }
+
+ @Override
+ public void setPower(int power) {
+ set(POWER, power);
+ }
+
+ @Override
+ public int getMaximumPower() {
+ return getMax(POWER);
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftReed.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftReed.java
new file mode 100644
index 00000000..138b8701
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftReed.java
@@ -0,0 +1,34 @@
+/**
+ * Automatically generated file, changes will be lost.
+ */
+package org.bukkit.craftbukkit.block.impl;
+
+public final class CraftReed extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.Ageable {
+
+ public CraftReed() {
+ super();
+ }
+
+ public CraftReed(net.minecraft.server.IBlockData state) {
+ super(state);
+ }
+
+ // org.bukkit.craftbukkit.block.data.CraftAgeable
+
+ private static final net.minecraft.server.BlockStateInteger AGE = getInteger(net.minecraft.server.BlockReed.class, "age");
+
+ @Override
+ public int getAge() {
+ return get(AGE);
+ }
+
+ @Override
+ public void setAge(int age) {
+ set(AGE, age);
+ }
+
+ @Override
+ public int getMaximumAge() {
+ return getMax(AGE);
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftRepeater.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftRepeater.java
new file mode 100644
index 00000000..97724f68
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftRepeater.java
@@ -0,0 +1,83 @@
+/**
+ * Automatically generated file, changes will be lost.
+ */
+package org.bukkit.craftbukkit.block.impl;
+
+public final class CraftRepeater extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.type.Repeater, org.bukkit.block.data.Directional, org.bukkit.block.data.Powerable {
+
+ public CraftRepeater() {
+ super();
+ }
+
+ public CraftRepeater(net.minecraft.server.IBlockData state) {
+ super(state);
+ }
+
+ // org.bukkit.craftbukkit.block.data.type.CraftRepeater
+
+ private static final net.minecraft.server.BlockStateInteger DELAY = getInteger(net.minecraft.server.BlockRepeater.class, "delay");
+ private static final net.minecraft.server.BlockStateBoolean LOCKED = getBoolean(net.minecraft.server.BlockRepeater.class, "locked");
+
+ @Override
+ public int getDelay() {
+ return get(DELAY);
+ }
+
+ @Override
+ public void setDelay(int delay) {
+ set(DELAY, delay);
+ }
+
+ @Override
+ public int getMinimumDelay() {
+ return getMin(DELAY);
+ }
+
+ @Override
+ public int getMaximumDelay() {
+ return getMax(DELAY);
+ }
+
+ @Override
+ public boolean isLocked() {
+ return get(LOCKED);
+ }
+
+ @Override
+ public void setLocked(boolean locked) {
+ set(LOCKED, locked);
+ }
+
+ // org.bukkit.craftbukkit.block.data.CraftDirectional
+
+ private static final net.minecraft.server.BlockStateEnum<?> FACING = getEnum(net.minecraft.server.BlockRepeater.class, "facing");
+
+ @Override
+ public org.bukkit.block.BlockFace getFacing() {
+ return get(FACING, org.bukkit.block.BlockFace.class);
+ }
+
+ @Override
+ public void setFacing(org.bukkit.block.BlockFace facing) {
+ set(FACING, facing);
+ }
+
+ @Override
+ public java.util.Set<org.bukkit.block.BlockFace> getFaces() {
+ return getValues(FACING, org.bukkit.block.BlockFace.class);
+ }
+
+ // org.bukkit.craftbukkit.block.data.CraftPowerable
+
+ private static final net.minecraft.server.BlockStateBoolean POWERED = getBoolean(net.minecraft.server.BlockRepeater.class, "powered");
+
+ @Override
+ public boolean isPowered() {
+ return get(POWERED);
+ }
+
+ @Override
+ public void setPowered(boolean powered) {
+ set(POWERED, powered);
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftRotatable.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftRotatable.java
new file mode 100644
index 00000000..c44f23e6
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftRotatable.java
@@ -0,0 +1,34 @@
+/**
+ * Automatically generated file, changes will be lost.
+ */
+package org.bukkit.craftbukkit.block.impl;
+
+public final class CraftRotatable extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.Orientable {
+
+ public CraftRotatable() {
+ super();
+ }
+
+ public CraftRotatable(net.minecraft.server.IBlockData state) {
+ super(state);
+ }
+
+ // org.bukkit.craftbukkit.block.data.CraftOrientable
+
+ private static final net.minecraft.server.BlockStateEnum<?> AXIS = getEnum(net.minecraft.server.BlockRotatable.class, "axis");
+
+ @Override
+ public org.bukkit.Axis getAxis() {
+ return get(AXIS, org.bukkit.Axis.class);
+ }
+
+ @Override
+ public void setAxis(org.bukkit.Axis axis) {
+ set(AXIS, axis);
+ }
+
+ @Override
+ public java.util.Set<org.bukkit.Axis> getAxes() {
+ return getValues(AXIS, org.bukkit.Axis.class);
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftSapling.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftSapling.java
new file mode 100644
index 00000000..0654c9e7
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftSapling.java
@@ -0,0 +1,34 @@
+/**
+ * Automatically generated file, changes will be lost.
+ */
+package org.bukkit.craftbukkit.block.impl;
+
+public final class CraftSapling extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.type.Sapling {
+
+ public CraftSapling() {
+ super();
+ }
+
+ public CraftSapling(net.minecraft.server.IBlockData state) {
+ super(state);
+ }
+
+ // org.bukkit.craftbukkit.block.data.type.CraftSapling
+
+ private static final net.minecraft.server.BlockStateInteger STAGE = getInteger(net.minecraft.server.BlockSapling.class, "stage");
+
+ @Override
+ public int getStage() {
+ return get(STAGE);
+ }
+
+ @Override
+ public void setStage(int stage) {
+ set(STAGE, stage);
+ }
+
+ @Override
+ public int getMaximumStage() {
+ return getMax(STAGE);
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftSeaPickle.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftSeaPickle.java
new file mode 100644
index 00000000..a0078bd8
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftSeaPickle.java
@@ -0,0 +1,53 @@
+/**
+ * Automatically generated file, changes will be lost.
+ */
+package org.bukkit.craftbukkit.block.impl;
+
+public final class CraftSeaPickle extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.type.SeaPickle, org.bukkit.block.data.Waterlogged {
+
+ public CraftSeaPickle() {
+ super();
+ }
+
+ public CraftSeaPickle(net.minecraft.server.IBlockData state) {
+ super(state);
+ }
+
+ // org.bukkit.craftbukkit.block.data.type.CraftSeaPickle
+
+ private static final net.minecraft.server.BlockStateInteger PICKLES = getInteger(net.minecraft.server.BlockSeaPickle.class, "pickles");
+
+ @Override
+ public int getPickles() {
+ return get(PICKLES);
+ }
+
+ @Override
+ public void setPickles(int pickles) {
+ set(PICKLES, pickles);
+ }
+
+ @Override
+ public int getMinimumPickles() {
+ return getMin(PICKLES);
+ }
+
+ @Override
+ public int getMaximumPickles() {
+ return getMax(PICKLES);
+ }
+
+ // org.bukkit.craftbukkit.block.data.CraftWaterlogged
+
+ private static final net.minecraft.server.BlockStateBoolean WATERLOGGED = getBoolean(net.minecraft.server.BlockSeaPickle.class, "waterlogged");
+
+ @Override
+ public boolean isWaterlogged() {
+ return get(WATERLOGGED);
+ }
+
+ @Override
+ public void setWaterlogged(boolean waterlogged) {
+ set(WATERLOGGED, waterlogged);
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftShulkerBox.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftShulkerBox.java
new file mode 100644
index 00000000..631f5cff
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftShulkerBox.java
@@ -0,0 +1,34 @@
+/**
+ * Automatically generated file, changes will be lost.
+ */
+package org.bukkit.craftbukkit.block.impl;
+
+public final class CraftShulkerBox extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.Directional {
+
+ public CraftShulkerBox() {
+ super();
+ }
+
+ public CraftShulkerBox(net.minecraft.server.IBlockData state) {
+ super(state);
+ }
+
+ // org.bukkit.craftbukkit.block.data.CraftDirectional
+
+ private static final net.minecraft.server.BlockStateEnum<?> FACING = getEnum(net.minecraft.server.BlockShulkerBox.class, "facing");
+
+ @Override
+ public org.bukkit.block.BlockFace getFacing() {
+ return get(FACING, org.bukkit.block.BlockFace.class);
+ }
+
+ @Override
+ public void setFacing(org.bukkit.block.BlockFace facing) {
+ set(FACING, facing);
+ }
+
+ @Override
+ public java.util.Set<org.bukkit.block.BlockFace> getFaces() {
+ return getValues(FACING, org.bukkit.block.BlockFace.class);
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftSkull.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftSkull.java
new file mode 100644
index 00000000..5677a9f0
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftSkull.java
@@ -0,0 +1,118 @@
+/**
+ * Automatically generated file, changes will be lost.
+ */
+package org.bukkit.craftbukkit.block.impl;
+
+public final class CraftSkull extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.Rotatable {
+
+ public CraftSkull() {
+ super();
+ }
+
+ public CraftSkull(net.minecraft.server.IBlockData state) {
+ super(state);
+ }
+
+ // org.bukkit.craftbukkit.block.data.CraftRotatable
+
+ private static final net.minecraft.server.BlockStateInteger ROTATION = getInteger(net.minecraft.server.BlockSkull.class, "rotation");
+
+ @Override
+ public org.bukkit.block.BlockFace getRotation() {
+ int data = get(ROTATION);
+ switch (data) {
+ case 0x0:
+ return org.bukkit.block.BlockFace.SOUTH;
+ case 0x1:
+ return org.bukkit.block.BlockFace.SOUTH_SOUTH_WEST;
+ case 0x2:
+ return org.bukkit.block.BlockFace.SOUTH_WEST;
+ case 0x3:
+ return org.bukkit.block.BlockFace.WEST_SOUTH_WEST;
+ case 0x4:
+ return org.bukkit.block.BlockFace.WEST;
+ case 0x5:
+ return org.bukkit.block.BlockFace.WEST_NORTH_WEST;
+ case 0x6:
+ return org.bukkit.block.BlockFace.NORTH_WEST;
+ case 0x7:
+ return org.bukkit.block.BlockFace.NORTH_NORTH_WEST;
+ case 0x8:
+ return org.bukkit.block.BlockFace.NORTH;
+ case 0x9:
+ return org.bukkit.block.BlockFace.NORTH_NORTH_EAST;
+ case 0xA:
+ return org.bukkit.block.BlockFace.NORTH_EAST;
+ case 0xB:
+ return org.bukkit.block.BlockFace.EAST_NORTH_EAST;
+ case 0xC:
+ return org.bukkit.block.BlockFace.EAST;
+ case 0xD:
+ return org.bukkit.block.BlockFace.EAST_SOUTH_EAST;
+ case 0xE:
+ return org.bukkit.block.BlockFace.SOUTH_EAST;
+ case 0xF:
+ return org.bukkit.block.BlockFace.SOUTH_SOUTH_EAST;
+ default:
+ throw new IllegalArgumentException("Unknown rotation " + data);
+ }
+ }
+
+ @Override
+ public void setRotation(org.bukkit.block.BlockFace rotation) {
+ int val;
+ switch (rotation) {
+ case SOUTH:
+ val = 0x0;
+ break;
+ case SOUTH_SOUTH_WEST:
+ val = 0x1;
+ break;
+ case SOUTH_WEST:
+ val = 0x2;
+ break;
+ case WEST_SOUTH_WEST:
+ val = 0x3;
+ break;
+ case WEST:
+ val = 0x4;
+ break;
+ case WEST_NORTH_WEST:
+ val = 0x5;
+ break;
+ case NORTH_WEST:
+ val = 0x6;
+ break;
+ case NORTH_NORTH_WEST:
+ val = 0x7;
+ break;
+ case NORTH:
+ val = 0x8;
+ break;
+ case NORTH_NORTH_EAST:
+ val = 0x9;
+ break;
+ case NORTH_EAST:
+ val = 0xA;
+ break;
+ case EAST_NORTH_EAST:
+ val = 0xB;
+ break;
+ case EAST:
+ val = 0xC;
+ break;
+ case EAST_SOUTH_EAST:
+ val = 0xD;
+ break;
+ case SOUTH_EAST:
+ val = 0xE;
+ break;
+ case SOUTH_SOUTH_EAST:
+ val = 0xF;
+ break;
+ default:
+ throw new IllegalArgumentException("Illegal rotation " + rotation);
+ }
+ set(ROTATION, val);
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftSkullPlayer.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftSkullPlayer.java
new file mode 100644
index 00000000..6e6e0033
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftSkullPlayer.java
@@ -0,0 +1,118 @@
+/**
+ * Automatically generated file, changes will be lost.
+ */
+package org.bukkit.craftbukkit.block.impl;
+
+public final class CraftSkullPlayer extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.Rotatable {
+
+ public CraftSkullPlayer() {
+ super();
+ }
+
+ public CraftSkullPlayer(net.minecraft.server.IBlockData state) {
+ super(state);
+ }
+
+ // org.bukkit.craftbukkit.block.data.CraftRotatable
+
+ private static final net.minecraft.server.BlockStateInteger ROTATION = getInteger(net.minecraft.server.BlockSkullPlayer.class, "rotation");
+
+ @Override
+ public org.bukkit.block.BlockFace getRotation() {
+ int data = get(ROTATION);
+ switch (data) {
+ case 0x0:
+ return org.bukkit.block.BlockFace.SOUTH;
+ case 0x1:
+ return org.bukkit.block.BlockFace.SOUTH_SOUTH_WEST;
+ case 0x2:
+ return org.bukkit.block.BlockFace.SOUTH_WEST;
+ case 0x3:
+ return org.bukkit.block.BlockFace.WEST_SOUTH_WEST;
+ case 0x4:
+ return org.bukkit.block.BlockFace.WEST;
+ case 0x5:
+ return org.bukkit.block.BlockFace.WEST_NORTH_WEST;
+ case 0x6:
+ return org.bukkit.block.BlockFace.NORTH_WEST;
+ case 0x7:
+ return org.bukkit.block.BlockFace.NORTH_NORTH_WEST;
+ case 0x8:
+ return org.bukkit.block.BlockFace.NORTH;
+ case 0x9:
+ return org.bukkit.block.BlockFace.NORTH_NORTH_EAST;
+ case 0xA:
+ return org.bukkit.block.BlockFace.NORTH_EAST;
+ case 0xB:
+ return org.bukkit.block.BlockFace.EAST_NORTH_EAST;
+ case 0xC:
+ return org.bukkit.block.BlockFace.EAST;
+ case 0xD:
+ return org.bukkit.block.BlockFace.EAST_SOUTH_EAST;
+ case 0xE:
+ return org.bukkit.block.BlockFace.SOUTH_EAST;
+ case 0xF:
+ return org.bukkit.block.BlockFace.SOUTH_SOUTH_EAST;
+ default:
+ throw new IllegalArgumentException("Unknown rotation " + data);
+ }
+ }
+
+ @Override
+ public void setRotation(org.bukkit.block.BlockFace rotation) {
+ int val;
+ switch (rotation) {
+ case SOUTH:
+ val = 0x0;
+ break;
+ case SOUTH_SOUTH_WEST:
+ val = 0x1;
+ break;
+ case SOUTH_WEST:
+ val = 0x2;
+ break;
+ case WEST_SOUTH_WEST:
+ val = 0x3;
+ break;
+ case WEST:
+ val = 0x4;
+ break;
+ case WEST_NORTH_WEST:
+ val = 0x5;
+ break;
+ case NORTH_WEST:
+ val = 0x6;
+ break;
+ case NORTH_NORTH_WEST:
+ val = 0x7;
+ break;
+ case NORTH:
+ val = 0x8;
+ break;
+ case NORTH_NORTH_EAST:
+ val = 0x9;
+ break;
+ case NORTH_EAST:
+ val = 0xA;
+ break;
+ case EAST_NORTH_EAST:
+ val = 0xB;
+ break;
+ case EAST:
+ val = 0xC;
+ break;
+ case EAST_SOUTH_EAST:
+ val = 0xD;
+ break;
+ case SOUTH_EAST:
+ val = 0xE;
+ break;
+ case SOUTH_SOUTH_EAST:
+ val = 0xF;
+ break;
+ default:
+ throw new IllegalArgumentException("Illegal rotation " + rotation);
+ }
+ set(ROTATION, val);
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftSkullPlayerWall.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftSkullPlayerWall.java
new file mode 100644
index 00000000..d2b3ce93
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftSkullPlayerWall.java
@@ -0,0 +1,34 @@
+/**
+ * Automatically generated file, changes will be lost.
+ */
+package org.bukkit.craftbukkit.block.impl;
+
+public final class CraftSkullPlayerWall extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.Directional {
+
+ public CraftSkullPlayerWall() {
+ super();
+ }
+
+ public CraftSkullPlayerWall(net.minecraft.server.IBlockData state) {
+ super(state);
+ }
+
+ // org.bukkit.craftbukkit.block.data.CraftDirectional
+
+ private static final net.minecraft.server.BlockStateEnum<?> FACING = getEnum(net.minecraft.server.BlockSkullPlayerWall.class, "facing");
+
+ @Override
+ public org.bukkit.block.BlockFace getFacing() {
+ return get(FACING, org.bukkit.block.BlockFace.class);
+ }
+
+ @Override
+ public void setFacing(org.bukkit.block.BlockFace facing) {
+ set(FACING, facing);
+ }
+
+ @Override
+ public java.util.Set<org.bukkit.block.BlockFace> getFaces() {
+ return getValues(FACING, org.bukkit.block.BlockFace.class);
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftSkullWall.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftSkullWall.java
new file mode 100644
index 00000000..020e5b71
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftSkullWall.java
@@ -0,0 +1,34 @@
+/**
+ * Automatically generated file, changes will be lost.
+ */
+package org.bukkit.craftbukkit.block.impl;
+
+public final class CraftSkullWall extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.Directional {
+
+ public CraftSkullWall() {
+ super();
+ }
+
+ public CraftSkullWall(net.minecraft.server.IBlockData state) {
+ super(state);
+ }
+
+ // org.bukkit.craftbukkit.block.data.CraftDirectional
+
+ private static final net.minecraft.server.BlockStateEnum<?> FACING = getEnum(net.minecraft.server.BlockSkullWall.class, "facing");
+
+ @Override
+ public org.bukkit.block.BlockFace getFacing() {
+ return get(FACING, org.bukkit.block.BlockFace.class);
+ }
+
+ @Override
+ public void setFacing(org.bukkit.block.BlockFace facing) {
+ set(FACING, facing);
+ }
+
+ @Override
+ public java.util.Set<org.bukkit.block.BlockFace> getFaces() {
+ return getValues(FACING, org.bukkit.block.BlockFace.class);
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftSnow.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftSnow.java
new file mode 100644
index 00000000..d4f0bfa8
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftSnow.java
@@ -0,0 +1,39 @@
+/**
+ * Automatically generated file, changes will be lost.
+ */
+package org.bukkit.craftbukkit.block.impl;
+
+public final class CraftSnow extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.type.Snow {
+
+ public CraftSnow() {
+ super();
+ }
+
+ public CraftSnow(net.minecraft.server.IBlockData state) {
+ super(state);
+ }
+
+ // org.bukkit.craftbukkit.block.data.type.CraftSnow
+
+ private static final net.minecraft.server.BlockStateInteger LAYERS = getInteger(net.minecraft.server.BlockSnow.class, "layers");
+
+ @Override
+ public int getLayers() {
+ return get(LAYERS);
+ }
+
+ @Override
+ public void setLayers(int layers) {
+ set(LAYERS, layers);
+ }
+
+ @Override
+ public int getMinimumLayers() {
+ return getMin(LAYERS);
+ }
+
+ @Override
+ public int getMaximumLayers() {
+ return getMax(LAYERS);
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftSoil.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftSoil.java
new file mode 100644
index 00000000..09cfa467
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftSoil.java
@@ -0,0 +1,34 @@
+/**
+ * Automatically generated file, changes will be lost.
+ */
+package org.bukkit.craftbukkit.block.impl;
+
+public final class CraftSoil extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.type.Farmland {
+
+ public CraftSoil() {
+ super();
+ }
+
+ public CraftSoil(net.minecraft.server.IBlockData state) {
+ super(state);
+ }
+
+ // org.bukkit.craftbukkit.block.data.type.CraftFarmland
+
+ private static final net.minecraft.server.BlockStateInteger MOISTURE = getInteger(net.minecraft.server.BlockSoil.class, "moisture");
+
+ @Override
+ public int getMoisture() {
+ return get(MOISTURE);
+ }
+
+ @Override
+ public void setMoisture(int moisture) {
+ set(MOISTURE, moisture);
+ }
+
+ @Override
+ public int getMaximumMoisture() {
+ return getMax(MOISTURE);
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftStainedGlassPane.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftStainedGlassPane.java
new file mode 100644
index 00000000..0eb5c660
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftStainedGlassPane.java
@@ -0,0 +1,71 @@
+/**
+ * Automatically generated file, changes will be lost.
+ */
+package org.bukkit.craftbukkit.block.impl;
+
+public final class CraftStainedGlassPane extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.type.GlassPane, org.bukkit.block.data.MultipleFacing, org.bukkit.block.data.Waterlogged {
+
+ public CraftStainedGlassPane() {
+ super();
+ }
+
+ public CraftStainedGlassPane(net.minecraft.server.IBlockData state) {
+ super(state);
+ }
+
+ // org.bukkit.craftbukkit.block.data.CraftMultipleFacing
+
+ private static final net.minecraft.server.BlockStateBoolean[] FACES = new net.minecraft.server.BlockStateBoolean[]{
+ getBoolean(net.minecraft.server.BlockStainedGlassPane.class, "north", true), getBoolean(net.minecraft.server.BlockStainedGlassPane.class, "east", true), getBoolean(net.minecraft.server.BlockStainedGlassPane.class, "south", true), getBoolean(net.minecraft.server.BlockStainedGlassPane.class, "west", true), getBoolean(net.minecraft.server.BlockStainedGlassPane.class, "up", true), getBoolean(net.minecraft.server.BlockStainedGlassPane.class, "down", true)
+ };
+
+ @Override
+ public boolean hasFace(org.bukkit.block.BlockFace face) {
+ return get(FACES[face.ordinal()]);
+ }
+
+ @Override
+ public void setFace(org.bukkit.block.BlockFace face, boolean has) {
+ set(FACES[face.ordinal()], has);
+ }
+
+ @Override
+ public java.util.Set<org.bukkit.block.BlockFace> getFaces() {
+ com.google.common.collect.ImmutableSet.Builder<org.bukkit.block.BlockFace> faces = com.google.common.collect.ImmutableSet.builder();
+
+ for (int i = 0; i < FACES.length; i++) {
+ if (FACES[i] != null && get(FACES[i])) {
+ faces.add(org.bukkit.block.BlockFace.values()[i]);
+ }
+ }
+
+ return faces.build();
+ }
+
+ @Override
+ public java.util.Set<org.bukkit.block.BlockFace> getAllowedFaces() {
+ com.google.common.collect.ImmutableSet.Builder<org.bukkit.block.BlockFace> faces = com.google.common.collect.ImmutableSet.builder();
+
+ for (int i = 0; i < FACES.length; i++) {
+ if (FACES[i] != null) {
+ faces.add(org.bukkit.block.BlockFace.values()[i]);
+ }
+ }
+
+ return faces.build();
+ }
+
+ // org.bukkit.craftbukkit.block.data.CraftWaterlogged
+
+ private static final net.minecraft.server.BlockStateBoolean WATERLOGGED = getBoolean(net.minecraft.server.BlockStainedGlassPane.class, "waterlogged");
+
+ @Override
+ public boolean isWaterlogged() {
+ return get(WATERLOGGED);
+ }
+
+ @Override
+ public void setWaterlogged(boolean waterlogged) {
+ set(WATERLOGGED, waterlogged);
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftStairs.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftStairs.java
new file mode 100644
index 00000000..804a90f2
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftStairs.java
@@ -0,0 +1,76 @@
+/**
+ * Automatically generated file, changes will be lost.
+ */
+package org.bukkit.craftbukkit.block.impl;
+
+public final class CraftStairs extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.type.Stairs, org.bukkit.block.data.Bisected, org.bukkit.block.data.Directional, org.bukkit.block.data.Waterlogged {
+
+ public CraftStairs() {
+ super();
+ }
+
+ public CraftStairs(net.minecraft.server.IBlockData state) {
+ super(state);
+ }
+
+ // org.bukkit.craftbukkit.block.data.type.CraftStairs
+
+ private static final net.minecraft.server.BlockStateEnum<?> SHAPE = getEnum(net.minecraft.server.BlockStairs.class, "shape");
+
+ @Override
+ public Shape getShape() {
+ return get(SHAPE, Shape.class);
+ }
+
+ @Override
+ public void setShape(Shape shape) {
+ set(SHAPE, shape);
+ }
+
+ // org.bukkit.craftbukkit.block.data.CraftBisected
+
+ private static final net.minecraft.server.BlockStateEnum<?> HALF = getEnum(net.minecraft.server.BlockStairs.class, "half");
+
+ @Override
+ public Half getHalf() {
+ return get(HALF, Half.class);
+ }
+
+ @Override
+ public void setHalf(Half half) {
+ set(HALF, half);
+ }
+
+ // org.bukkit.craftbukkit.block.data.CraftDirectional
+
+ private static final net.minecraft.server.BlockStateEnum<?> FACING = getEnum(net.minecraft.server.BlockStairs.class, "facing");
+
+ @Override
+ public org.bukkit.block.BlockFace getFacing() {
+ return get(FACING, org.bukkit.block.BlockFace.class);
+ }
+
+ @Override
+ public void setFacing(org.bukkit.block.BlockFace facing) {
+ set(FACING, facing);
+ }
+
+ @Override
+ public java.util.Set<org.bukkit.block.BlockFace> getFaces() {
+ return getValues(FACING, org.bukkit.block.BlockFace.class);
+ }
+
+ // org.bukkit.craftbukkit.block.data.CraftWaterlogged
+
+ private static final net.minecraft.server.BlockStateBoolean WATERLOGGED = getBoolean(net.minecraft.server.BlockStairs.class, "waterlogged");
+
+ @Override
+ public boolean isWaterlogged() {
+ return get(WATERLOGGED);
+ }
+
+ @Override
+ public void setWaterlogged(boolean waterlogged) {
+ set(WATERLOGGED, waterlogged);
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftStem.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftStem.java
new file mode 100644
index 00000000..2a91e958
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftStem.java
@@ -0,0 +1,34 @@
+/**
+ * Automatically generated file, changes will be lost.
+ */
+package org.bukkit.craftbukkit.block.impl;
+
+public final class CraftStem extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.Ageable {
+
+ public CraftStem() {
+ super();
+ }
+
+ public CraftStem(net.minecraft.server.IBlockData state) {
+ super(state);
+ }
+
+ // org.bukkit.craftbukkit.block.data.CraftAgeable
+
+ private static final net.minecraft.server.BlockStateInteger AGE = getInteger(net.minecraft.server.BlockStem.class, "age");
+
+ @Override
+ public int getAge() {
+ return get(AGE);
+ }
+
+ @Override
+ public void setAge(int age) {
+ set(AGE, age);
+ }
+
+ @Override
+ public int getMaximumAge() {
+ return getMax(AGE);
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftStemAttached.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftStemAttached.java
new file mode 100644
index 00000000..c6d9223d
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftStemAttached.java
@@ -0,0 +1,34 @@
+/**
+ * Automatically generated file, changes will be lost.
+ */
+package org.bukkit.craftbukkit.block.impl;
+
+public final class CraftStemAttached extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.Directional {
+
+ public CraftStemAttached() {
+ super();
+ }
+
+ public CraftStemAttached(net.minecraft.server.IBlockData state) {
+ super(state);
+ }
+
+ // org.bukkit.craftbukkit.block.data.CraftDirectional
+
+ private static final net.minecraft.server.BlockStateEnum<?> FACING = getEnum(net.minecraft.server.BlockStemAttached.class, "facing");
+
+ @Override
+ public org.bukkit.block.BlockFace getFacing() {
+ return get(FACING, org.bukkit.block.BlockFace.class);
+ }
+
+ @Override
+ public void setFacing(org.bukkit.block.BlockFace facing) {
+ set(FACING, facing);
+ }
+
+ @Override
+ public java.util.Set<org.bukkit.block.BlockFace> getFaces() {
+ return getValues(FACING, org.bukkit.block.BlockFace.class);
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftStepAbstract.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftStepAbstract.java
new file mode 100644
index 00000000..922d41b1
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftStepAbstract.java
@@ -0,0 +1,43 @@
+/**
+ * Automatically generated file, changes will be lost.
+ */
+package org.bukkit.craftbukkit.block.impl;
+
+public final class CraftStepAbstract extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.type.Slab, org.bukkit.block.data.Waterlogged {
+
+ public CraftStepAbstract() {
+ super();
+ }
+
+ public CraftStepAbstract(net.minecraft.server.IBlockData state) {
+ super(state);
+ }
+
+ // org.bukkit.craftbukkit.block.data.type.CraftSlab
+
+ private static final net.minecraft.server.BlockStateEnum<?> TYPE = getEnum(net.minecraft.server.BlockStepAbstract.class, "type");
+
+ @Override
+ public Type getType() {
+ return get(TYPE, Type.class);
+ }
+
+ @Override
+ public void setType(Type type) {
+ set(TYPE, type);
+ }
+
+ // org.bukkit.craftbukkit.block.data.CraftWaterlogged
+
+ private static final net.minecraft.server.BlockStateBoolean WATERLOGGED = getBoolean(net.minecraft.server.BlockStepAbstract.class, "waterlogged");
+
+ @Override
+ public boolean isWaterlogged() {
+ return get(WATERLOGGED);
+ }
+
+ @Override
+ public void setWaterlogged(boolean waterlogged) {
+ set(WATERLOGGED, waterlogged);
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftStoneButton.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftStoneButton.java
new file mode 100644
index 00000000..84097d5e
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftStoneButton.java
@@ -0,0 +1,62 @@
+/**
+ * Automatically generated file, changes will be lost.
+ */
+package org.bukkit.craftbukkit.block.impl;
+
+public final class CraftStoneButton extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.type.Switch, org.bukkit.block.data.Directional, org.bukkit.block.data.Powerable {
+
+ public CraftStoneButton() {
+ super();
+ }
+
+ public CraftStoneButton(net.minecraft.server.IBlockData state) {
+ super(state);
+ }
+
+ // org.bukkit.craftbukkit.block.data.type.CraftSwitch
+
+ private static final net.minecraft.server.BlockStateEnum<?> FACE = getEnum(net.minecraft.server.BlockStoneButton.class, "face");
+
+ @Override
+ public Face getFace() {
+ return get(FACE, Face.class);
+ }
+
+ @Override
+ public void setFace(Face face) {
+ set(FACE, face);
+ }
+
+ // org.bukkit.craftbukkit.block.data.CraftDirectional
+
+ private static final net.minecraft.server.BlockStateEnum<?> FACING = getEnum(net.minecraft.server.BlockStoneButton.class, "facing");
+
+ @Override
+ public org.bukkit.block.BlockFace getFacing() {
+ return get(FACING, org.bukkit.block.BlockFace.class);
+ }
+
+ @Override
+ public void setFacing(org.bukkit.block.BlockFace facing) {
+ set(FACING, facing);
+ }
+
+ @Override
+ public java.util.Set<org.bukkit.block.BlockFace> getFaces() {
+ return getValues(FACING, org.bukkit.block.BlockFace.class);
+ }
+
+ // org.bukkit.craftbukkit.block.data.CraftPowerable
+
+ private static final net.minecraft.server.BlockStateBoolean POWERED = getBoolean(net.minecraft.server.BlockStoneButton.class, "powered");
+
+ @Override
+ public boolean isPowered() {
+ return get(POWERED);
+ }
+
+ @Override
+ public void setPowered(boolean powered) {
+ set(POWERED, powered);
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftStructure.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftStructure.java
new file mode 100644
index 00000000..f2435d34
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftStructure.java
@@ -0,0 +1,29 @@
+/**
+ * Automatically generated file, changes will be lost.
+ */
+package org.bukkit.craftbukkit.block.impl;
+
+public final class CraftStructure extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.type.StructureBlock {
+
+ public CraftStructure() {
+ super();
+ }
+
+ public CraftStructure(net.minecraft.server.IBlockData state) {
+ super(state);
+ }
+
+ // org.bukkit.craftbukkit.block.data.type.CraftStructureBlock
+
+ private static final net.minecraft.server.BlockStateEnum<?> MODE = getEnum(net.minecraft.server.BlockStructure.class, "mode");
+
+ @Override
+ public Mode getMode() {
+ return get(MODE, Mode.class);
+ }
+
+ @Override
+ public void setMode(Mode mode) {
+ set(MODE, mode);
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftTallPlantFlower.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftTallPlantFlower.java
new file mode 100644
index 00000000..3ae8201c
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftTallPlantFlower.java
@@ -0,0 +1,29 @@
+/**
+ * Automatically generated file, changes will be lost.
+ */
+package org.bukkit.craftbukkit.block.impl;
+
+public final class CraftTallPlantFlower extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.Bisected {
+
+ public CraftTallPlantFlower() {
+ super();
+ }
+
+ public CraftTallPlantFlower(net.minecraft.server.IBlockData state) {
+ super(state);
+ }
+
+ // org.bukkit.craftbukkit.block.data.CraftBisected
+
+ private static final net.minecraft.server.BlockStateEnum<?> HALF = getEnum(net.minecraft.server.BlockTallPlantFlower.class, "half");
+
+ @Override
+ public Half getHalf() {
+ return get(HALF, Half.class);
+ }
+
+ @Override
+ public void setHalf(Half half) {
+ set(HALF, half);
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftTallPlantShearable.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftTallPlantShearable.java
new file mode 100644
index 00000000..c98414b3
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftTallPlantShearable.java
@@ -0,0 +1,29 @@
+/**
+ * Automatically generated file, changes will be lost.
+ */
+package org.bukkit.craftbukkit.block.impl;
+
+public final class CraftTallPlantShearable extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.Bisected {
+
+ public CraftTallPlantShearable() {
+ super();
+ }
+
+ public CraftTallPlantShearable(net.minecraft.server.IBlockData state) {
+ super(state);
+ }
+
+ // org.bukkit.craftbukkit.block.data.CraftBisected
+
+ private static final net.minecraft.server.BlockStateEnum<?> HALF = getEnum(net.minecraft.server.BlockTallPlantShearable.class, "half");
+
+ @Override
+ public Half getHalf() {
+ return get(HALF, Half.class);
+ }
+
+ @Override
+ public void setHalf(Half half) {
+ set(HALF, half);
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftTallSeaGrass.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftTallSeaGrass.java
new file mode 100644
index 00000000..d51e3ec4
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftTallSeaGrass.java
@@ -0,0 +1,29 @@
+/**
+ * Automatically generated file, changes will be lost.
+ */
+package org.bukkit.craftbukkit.block.impl;
+
+public final class CraftTallSeaGrass extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.Bisected {
+
+ public CraftTallSeaGrass() {
+ super();
+ }
+
+ public CraftTallSeaGrass(net.minecraft.server.IBlockData state) {
+ super(state);
+ }
+
+ // org.bukkit.craftbukkit.block.data.CraftBisected
+
+ private static final net.minecraft.server.BlockStateEnum<?> HALF = getEnum(net.minecraft.server.BlockTallSeaGrass.class, "half");
+
+ @Override
+ public Half getHalf() {
+ return get(HALF, Half.class);
+ }
+
+ @Override
+ public void setHalf(Half half) {
+ set(HALF, half);
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftTorchWall.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftTorchWall.java
new file mode 100644
index 00000000..d98f21aa
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftTorchWall.java
@@ -0,0 +1,34 @@
+/**
+ * Automatically generated file, changes will be lost.
+ */
+package org.bukkit.craftbukkit.block.impl;
+
+public final class CraftTorchWall extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.Directional {
+
+ public CraftTorchWall() {
+ super();
+ }
+
+ public CraftTorchWall(net.minecraft.server.IBlockData state) {
+ super(state);
+ }
+
+ // org.bukkit.craftbukkit.block.data.CraftDirectional
+
+ private static final net.minecraft.server.BlockStateEnum<?> FACING = getEnum(net.minecraft.server.BlockTorchWall.class, "facing");
+
+ @Override
+ public org.bukkit.block.BlockFace getFacing() {
+ return get(FACING, org.bukkit.block.BlockFace.class);
+ }
+
+ @Override
+ public void setFacing(org.bukkit.block.BlockFace facing) {
+ set(FACING, facing);
+ }
+
+ @Override
+ public java.util.Set<org.bukkit.block.BlockFace> getFaces() {
+ return getValues(FACING, org.bukkit.block.BlockFace.class);
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftTrapdoor.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftTrapdoor.java
new file mode 100644
index 00000000..2ec18b29
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftTrapdoor.java
@@ -0,0 +1,90 @@
+/**
+ * Automatically generated file, changes will be lost.
+ */
+package org.bukkit.craftbukkit.block.impl;
+
+public final class CraftTrapdoor extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.type.TrapDoor, org.bukkit.block.data.Bisected, org.bukkit.block.data.Directional, org.bukkit.block.data.Openable, org.bukkit.block.data.Powerable, org.bukkit.block.data.Waterlogged {
+
+ public CraftTrapdoor() {
+ super();
+ }
+
+ public CraftTrapdoor(net.minecraft.server.IBlockData state) {
+ super(state);
+ }
+
+ // org.bukkit.craftbukkit.block.data.CraftBisected
+
+ private static final net.minecraft.server.BlockStateEnum<?> HALF = getEnum(net.minecraft.server.BlockTrapdoor.class, "half");
+
+ @Override
+ public Half getHalf() {
+ return get(HALF, Half.class);
+ }
+
+ @Override
+ public void setHalf(Half half) {
+ set(HALF, half);
+ }
+
+ // org.bukkit.craftbukkit.block.data.CraftDirectional
+
+ private static final net.minecraft.server.BlockStateEnum<?> FACING = getEnum(net.minecraft.server.BlockTrapdoor.class, "facing");
+
+ @Override
+ public org.bukkit.block.BlockFace getFacing() {
+ return get(FACING, org.bukkit.block.BlockFace.class);
+ }
+
+ @Override
+ public void setFacing(org.bukkit.block.BlockFace facing) {
+ set(FACING, facing);
+ }
+
+ @Override
+ public java.util.Set<org.bukkit.block.BlockFace> getFaces() {
+ return getValues(FACING, org.bukkit.block.BlockFace.class);
+ }
+
+ // org.bukkit.craftbukkit.block.data.CraftOpenable
+
+ private static final net.minecraft.server.BlockStateBoolean OPEN = getBoolean(net.minecraft.server.BlockTrapdoor.class, "open");
+
+ @Override
+ public boolean isOpen() {
+ return get(OPEN);
+ }
+
+ @Override
+ public void setOpen(boolean open) {
+ set(OPEN, open);
+ }
+
+ // org.bukkit.craftbukkit.block.data.CraftPowerable
+
+ private static final net.minecraft.server.BlockStateBoolean POWERED = getBoolean(net.minecraft.server.BlockTrapdoor.class, "powered");
+
+ @Override
+ public boolean isPowered() {
+ return get(POWERED);
+ }
+
+ @Override
+ public void setPowered(boolean powered) {
+ set(POWERED, powered);
+ }
+
+ // org.bukkit.craftbukkit.block.data.CraftWaterlogged
+
+ private static final net.minecraft.server.BlockStateBoolean WATERLOGGED = getBoolean(net.minecraft.server.BlockTrapdoor.class, "waterlogged");
+
+ @Override
+ public boolean isWaterlogged() {
+ return get(WATERLOGGED);
+ }
+
+ @Override
+ public void setWaterlogged(boolean waterlogged) {
+ set(WATERLOGGED, waterlogged);
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftTripwire.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftTripwire.java
new file mode 100644
index 00000000..e39e79c4
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftTripwire.java
@@ -0,0 +1,99 @@
+/**
+ * Automatically generated file, changes will be lost.
+ */
+package org.bukkit.craftbukkit.block.impl;
+
+public final class CraftTripwire extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.type.Tripwire, org.bukkit.block.data.Attachable, org.bukkit.block.data.MultipleFacing, org.bukkit.block.data.Powerable {
+
+ public CraftTripwire() {
+ super();
+ }
+
+ public CraftTripwire(net.minecraft.server.IBlockData state) {
+ super(state);
+ }
+
+ // org.bukkit.craftbukkit.block.data.type.CraftTripwire
+
+ private static final net.minecraft.server.BlockStateBoolean DISARMED = getBoolean(net.minecraft.server.BlockTripwire.class, "disarmed");
+
+ @Override
+ public boolean isDisarmed() {
+ return get(DISARMED);
+ }
+
+ @Override
+ public void setDisarmed(boolean disarmed) {
+ set(DISARMED, disarmed);
+ }
+
+ // org.bukkit.craftbukkit.block.data.CraftAttachable
+
+ private static final net.minecraft.server.BlockStateBoolean ATTACHED = getBoolean(net.minecraft.server.BlockTripwire.class, "attached");
+
+ @Override
+ public boolean isAttached() {
+ return get(ATTACHED);
+ }
+
+ @Override
+ public void setAttached(boolean attached) {
+ set(ATTACHED, attached);
+ }
+
+ // org.bukkit.craftbukkit.block.data.CraftMultipleFacing
+
+ private static final net.minecraft.server.BlockStateBoolean[] FACES = new net.minecraft.server.BlockStateBoolean[]{
+ getBoolean(net.minecraft.server.BlockTripwire.class, "north", true), getBoolean(net.minecraft.server.BlockTripwire.class, "east", true), getBoolean(net.minecraft.server.BlockTripwire.class, "south", true), getBoolean(net.minecraft.server.BlockTripwire.class, "west", true), getBoolean(net.minecraft.server.BlockTripwire.class, "up", true), getBoolean(net.minecraft.server.BlockTripwire.class, "down", true)
+ };
+
+ @Override
+ public boolean hasFace(org.bukkit.block.BlockFace face) {
+ return get(FACES[face.ordinal()]);
+ }
+
+ @Override
+ public void setFace(org.bukkit.block.BlockFace face, boolean has) {
+ set(FACES[face.ordinal()], has);
+ }
+
+ @Override
+ public java.util.Set<org.bukkit.block.BlockFace> getFaces() {
+ com.google.common.collect.ImmutableSet.Builder<org.bukkit.block.BlockFace> faces = com.google.common.collect.ImmutableSet.builder();
+
+ for (int i = 0; i < FACES.length; i++) {
+ if (FACES[i] != null && get(FACES[i])) {
+ faces.add(org.bukkit.block.BlockFace.values()[i]);
+ }
+ }
+
+ return faces.build();
+ }
+
+ @Override
+ public java.util.Set<org.bukkit.block.BlockFace> getAllowedFaces() {
+ com.google.common.collect.ImmutableSet.Builder<org.bukkit.block.BlockFace> faces = com.google.common.collect.ImmutableSet.builder();
+
+ for (int i = 0; i < FACES.length; i++) {
+ if (FACES[i] != null) {
+ faces.add(org.bukkit.block.BlockFace.values()[i]);
+ }
+ }
+
+ return faces.build();
+ }
+
+ // org.bukkit.craftbukkit.block.data.CraftPowerable
+
+ private static final net.minecraft.server.BlockStateBoolean POWERED = getBoolean(net.minecraft.server.BlockTripwire.class, "powered");
+
+ @Override
+ public boolean isPowered() {
+ return get(POWERED);
+ }
+
+ @Override
+ public void setPowered(boolean powered) {
+ set(POWERED, powered);
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftTripwireHook.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftTripwireHook.java
new file mode 100644
index 00000000..bd7b43ad
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftTripwireHook.java
@@ -0,0 +1,62 @@
+/**
+ * Automatically generated file, changes will be lost.
+ */
+package org.bukkit.craftbukkit.block.impl;
+
+public final class CraftTripwireHook extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.type.TripwireHook, org.bukkit.block.data.Attachable, org.bukkit.block.data.Directional, org.bukkit.block.data.Powerable {
+
+ public CraftTripwireHook() {
+ super();
+ }
+
+ public CraftTripwireHook(net.minecraft.server.IBlockData state) {
+ super(state);
+ }
+
+ // org.bukkit.craftbukkit.block.data.CraftAttachable
+
+ private static final net.minecraft.server.BlockStateBoolean ATTACHED = getBoolean(net.minecraft.server.BlockTripwireHook.class, "attached");
+
+ @Override
+ public boolean isAttached() {
+ return get(ATTACHED);
+ }
+
+ @Override
+ public void setAttached(boolean attached) {
+ set(ATTACHED, attached);
+ }
+
+ // org.bukkit.craftbukkit.block.data.CraftDirectional
+
+ private static final net.minecraft.server.BlockStateEnum<?> FACING = getEnum(net.minecraft.server.BlockTripwireHook.class, "facing");
+
+ @Override
+ public org.bukkit.block.BlockFace getFacing() {
+ return get(FACING, org.bukkit.block.BlockFace.class);
+ }
+
+ @Override
+ public void setFacing(org.bukkit.block.BlockFace facing) {
+ set(FACING, facing);
+ }
+
+ @Override
+ public java.util.Set<org.bukkit.block.BlockFace> getFaces() {
+ return getValues(FACING, org.bukkit.block.BlockFace.class);
+ }
+
+ // org.bukkit.craftbukkit.block.data.CraftPowerable
+
+ private static final net.minecraft.server.BlockStateBoolean POWERED = getBoolean(net.minecraft.server.BlockTripwireHook.class, "powered");
+
+ @Override
+ public boolean isPowered() {
+ return get(POWERED);
+ }
+
+ @Override
+ public void setPowered(boolean powered) {
+ set(POWERED, powered);
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftTurtleEgg.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftTurtleEgg.java
new file mode 100644
index 00000000..64812ad1
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftTurtleEgg.java
@@ -0,0 +1,55 @@
+/**
+ * Automatically generated file, changes will be lost.
+ */
+package org.bukkit.craftbukkit.block.impl;
+
+public final class CraftTurtleEgg extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.type.TurtleEgg {
+
+ public CraftTurtleEgg() {
+ super();
+ }
+
+ public CraftTurtleEgg(net.minecraft.server.IBlockData state) {
+ super(state);
+ }
+
+ // org.bukkit.craftbukkit.block.data.type.CraftTurtleEgg
+
+ private static final net.minecraft.server.BlockStateInteger EGGS = getInteger(net.minecraft.server.BlockTurtleEgg.class, "eggs");
+ private static final net.minecraft.server.BlockStateInteger HATCH = getInteger(net.minecraft.server.BlockTurtleEgg.class, "hatch");
+
+ @Override
+ public int getEggs() {
+ return get(EGGS);
+ }
+
+ @Override
+ public void setEggs(int eggs) {
+ set(EGGS, eggs);
+ }
+
+ @Override
+ public int getMinimumEggs() {
+ return getMin(EGGS);
+ }
+
+ @Override
+ public int getMaximumEggs() {
+ return getMax(EGGS);
+ }
+
+ @Override
+ public int getHatch() {
+ return get(HATCH);
+ }
+
+ @Override
+ public void setHatch(int hatch) {
+ set(HATCH, hatch);
+ }
+
+ @Override
+ public int getMaximumHatch() {
+ return getMax(HATCH);
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftVine.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftVine.java
new file mode 100644
index 00000000..90e025ce
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftVine.java
@@ -0,0 +1,57 @@
+/**
+ * Automatically generated file, changes will be lost.
+ */
+package org.bukkit.craftbukkit.block.impl;
+
+public final class CraftVine extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.MultipleFacing {
+
+ public CraftVine() {
+ super();
+ }
+
+ public CraftVine(net.minecraft.server.IBlockData state) {
+ super(state);
+ }
+
+ // org.bukkit.craftbukkit.block.data.CraftMultipleFacing
+
+ private static final net.minecraft.server.BlockStateBoolean[] FACES = new net.minecraft.server.BlockStateBoolean[]{
+ getBoolean(net.minecraft.server.BlockVine.class, "north", true), getBoolean(net.minecraft.server.BlockVine.class, "east", true), getBoolean(net.minecraft.server.BlockVine.class, "south", true), getBoolean(net.minecraft.server.BlockVine.class, "west", true), getBoolean(net.minecraft.server.BlockVine.class, "up", true), getBoolean(net.minecraft.server.BlockVine.class, "down", true)
+ };
+
+ @Override
+ public boolean hasFace(org.bukkit.block.BlockFace face) {
+ return get(FACES[face.ordinal()]);
+ }
+
+ @Override
+ public void setFace(org.bukkit.block.BlockFace face, boolean has) {
+ set(FACES[face.ordinal()], has);
+ }
+
+ @Override
+ public java.util.Set<org.bukkit.block.BlockFace> getFaces() {
+ com.google.common.collect.ImmutableSet.Builder<org.bukkit.block.BlockFace> faces = com.google.common.collect.ImmutableSet.builder();
+
+ for (int i = 0; i < FACES.length; i++) {
+ if (FACES[i] != null && get(FACES[i])) {
+ faces.add(org.bukkit.block.BlockFace.values()[i]);
+ }
+ }
+
+ return faces.build();
+ }
+
+ @Override
+ public java.util.Set<org.bukkit.block.BlockFace> getAllowedFaces() {
+ com.google.common.collect.ImmutableSet.Builder<org.bukkit.block.BlockFace> faces = com.google.common.collect.ImmutableSet.builder();
+
+ for (int i = 0; i < FACES.length; i++) {
+ if (FACES[i] != null) {
+ faces.add(org.bukkit.block.BlockFace.values()[i]);
+ }
+ }
+
+ return faces.build();
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftWallSign.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftWallSign.java
new file mode 100644
index 00000000..ffa7e3c4
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftWallSign.java
@@ -0,0 +1,48 @@
+/**
+ * Automatically generated file, changes will be lost.
+ */
+package org.bukkit.craftbukkit.block.impl;
+
+public final class CraftWallSign extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.type.WallSign, org.bukkit.block.data.Directional, org.bukkit.block.data.Waterlogged {
+
+ public CraftWallSign() {
+ super();
+ }
+
+ public CraftWallSign(net.minecraft.server.IBlockData state) {
+ super(state);
+ }
+
+ // org.bukkit.craftbukkit.block.data.CraftDirectional
+
+ private static final net.minecraft.server.BlockStateEnum<?> FACING = getEnum(net.minecraft.server.BlockWallSign.class, "facing");
+
+ @Override
+ public org.bukkit.block.BlockFace getFacing() {
+ return get(FACING, org.bukkit.block.BlockFace.class);
+ }
+
+ @Override
+ public void setFacing(org.bukkit.block.BlockFace facing) {
+ set(FACING, facing);
+ }
+
+ @Override
+ public java.util.Set<org.bukkit.block.BlockFace> getFaces() {
+ return getValues(FACING, org.bukkit.block.BlockFace.class);
+ }
+
+ // org.bukkit.craftbukkit.block.data.CraftWaterlogged
+
+ private static final net.minecraft.server.BlockStateBoolean WATERLOGGED = getBoolean(net.minecraft.server.BlockWallSign.class, "waterlogged");
+
+ @Override
+ public boolean isWaterlogged() {
+ return get(WATERLOGGED);
+ }
+
+ @Override
+ public void setWaterlogged(boolean waterlogged) {
+ set(WATERLOGGED, waterlogged);
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftWitherSkull.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftWitherSkull.java
new file mode 100644
index 00000000..0aec1dbe
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftWitherSkull.java
@@ -0,0 +1,118 @@
+/**
+ * Automatically generated file, changes will be lost.
+ */
+package org.bukkit.craftbukkit.block.impl;
+
+public final class CraftWitherSkull extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.Rotatable {
+
+ public CraftWitherSkull() {
+ super();
+ }
+
+ public CraftWitherSkull(net.minecraft.server.IBlockData state) {
+ super(state);
+ }
+
+ // org.bukkit.craftbukkit.block.data.CraftRotatable
+
+ private static final net.minecraft.server.BlockStateInteger ROTATION = getInteger(net.minecraft.server.BlockWitherSkull.class, "rotation");
+
+ @Override
+ public org.bukkit.block.BlockFace getRotation() {
+ int data = get(ROTATION);
+ switch (data) {
+ case 0x0:
+ return org.bukkit.block.BlockFace.SOUTH;
+ case 0x1:
+ return org.bukkit.block.BlockFace.SOUTH_SOUTH_WEST;
+ case 0x2:
+ return org.bukkit.block.BlockFace.SOUTH_WEST;
+ case 0x3:
+ return org.bukkit.block.BlockFace.WEST_SOUTH_WEST;
+ case 0x4:
+ return org.bukkit.block.BlockFace.WEST;
+ case 0x5:
+ return org.bukkit.block.BlockFace.WEST_NORTH_WEST;
+ case 0x6:
+ return org.bukkit.block.BlockFace.NORTH_WEST;
+ case 0x7:
+ return org.bukkit.block.BlockFace.NORTH_NORTH_WEST;
+ case 0x8:
+ return org.bukkit.block.BlockFace.NORTH;
+ case 0x9:
+ return org.bukkit.block.BlockFace.NORTH_NORTH_EAST;
+ case 0xA:
+ return org.bukkit.block.BlockFace.NORTH_EAST;
+ case 0xB:
+ return org.bukkit.block.BlockFace.EAST_NORTH_EAST;
+ case 0xC:
+ return org.bukkit.block.BlockFace.EAST;
+ case 0xD:
+ return org.bukkit.block.BlockFace.EAST_SOUTH_EAST;
+ case 0xE:
+ return org.bukkit.block.BlockFace.SOUTH_EAST;
+ case 0xF:
+ return org.bukkit.block.BlockFace.SOUTH_SOUTH_EAST;
+ default:
+ throw new IllegalArgumentException("Unknown rotation " + data);
+ }
+ }
+
+ @Override
+ public void setRotation(org.bukkit.block.BlockFace rotation) {
+ int val;
+ switch (rotation) {
+ case SOUTH:
+ val = 0x0;
+ break;
+ case SOUTH_SOUTH_WEST:
+ val = 0x1;
+ break;
+ case SOUTH_WEST:
+ val = 0x2;
+ break;
+ case WEST_SOUTH_WEST:
+ val = 0x3;
+ break;
+ case WEST:
+ val = 0x4;
+ break;
+ case WEST_NORTH_WEST:
+ val = 0x5;
+ break;
+ case NORTH_WEST:
+ val = 0x6;
+ break;
+ case NORTH_NORTH_WEST:
+ val = 0x7;
+ break;
+ case NORTH:
+ val = 0x8;
+ break;
+ case NORTH_NORTH_EAST:
+ val = 0x9;
+ break;
+ case NORTH_EAST:
+ val = 0xA;
+ break;
+ case EAST_NORTH_EAST:
+ val = 0xB;
+ break;
+ case EAST:
+ val = 0xC;
+ break;
+ case EAST_SOUTH_EAST:
+ val = 0xD;
+ break;
+ case SOUTH_EAST:
+ val = 0xE;
+ break;
+ case SOUTH_SOUTH_EAST:
+ val = 0xF;
+ break;
+ default:
+ throw new IllegalArgumentException("Illegal rotation " + rotation);
+ }
+ set(ROTATION, val);
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftWitherSkullWall.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftWitherSkullWall.java
new file mode 100644
index 00000000..fa9597da
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftWitherSkullWall.java
@@ -0,0 +1,34 @@
+/**
+ * Automatically generated file, changes will be lost.
+ */
+package org.bukkit.craftbukkit.block.impl;
+
+public final class CraftWitherSkullWall extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.Directional {
+
+ public CraftWitherSkullWall() {
+ super();
+ }
+
+ public CraftWitherSkullWall(net.minecraft.server.IBlockData state) {
+ super(state);
+ }
+
+ // org.bukkit.craftbukkit.block.data.CraftDirectional
+
+ private static final net.minecraft.server.BlockStateEnum<?> FACING = getEnum(net.minecraft.server.BlockWitherSkullWall.class, "facing");
+
+ @Override
+ public org.bukkit.block.BlockFace getFacing() {
+ return get(FACING, org.bukkit.block.BlockFace.class);
+ }
+
+ @Override
+ public void setFacing(org.bukkit.block.BlockFace facing) {
+ set(FACING, facing);
+ }
+
+ @Override
+ public java.util.Set<org.bukkit.block.BlockFace> getFaces() {
+ return getValues(FACING, org.bukkit.block.BlockFace.class);
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftWoodButton.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftWoodButton.java
new file mode 100644
index 00000000..79971417
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftWoodButton.java
@@ -0,0 +1,62 @@
+/**
+ * Automatically generated file, changes will be lost.
+ */
+package org.bukkit.craftbukkit.block.impl;
+
+public final class CraftWoodButton extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.type.Switch, org.bukkit.block.data.Directional, org.bukkit.block.data.Powerable {
+
+ public CraftWoodButton() {
+ super();
+ }
+
+ public CraftWoodButton(net.minecraft.server.IBlockData state) {
+ super(state);
+ }
+
+ // org.bukkit.craftbukkit.block.data.type.CraftSwitch
+
+ private static final net.minecraft.server.BlockStateEnum<?> FACE = getEnum(net.minecraft.server.BlockWoodButton.class, "face");
+
+ @Override
+ public Face getFace() {
+ return get(FACE, Face.class);
+ }
+
+ @Override
+ public void setFace(Face face) {
+ set(FACE, face);
+ }
+
+ // org.bukkit.craftbukkit.block.data.CraftDirectional
+
+ private static final net.minecraft.server.BlockStateEnum<?> FACING = getEnum(net.minecraft.server.BlockWoodButton.class, "facing");
+
+ @Override
+ public org.bukkit.block.BlockFace getFacing() {
+ return get(FACING, org.bukkit.block.BlockFace.class);
+ }
+
+ @Override
+ public void setFacing(org.bukkit.block.BlockFace facing) {
+ set(FACING, facing);
+ }
+
+ @Override
+ public java.util.Set<org.bukkit.block.BlockFace> getFaces() {
+ return getValues(FACING, org.bukkit.block.BlockFace.class);
+ }
+
+ // org.bukkit.craftbukkit.block.data.CraftPowerable
+
+ private static final net.minecraft.server.BlockStateBoolean POWERED = getBoolean(net.minecraft.server.BlockWoodButton.class, "powered");
+
+ @Override
+ public boolean isPowered() {
+ return get(POWERED);
+ }
+
+ @Override
+ public void setPowered(boolean powered) {
+ set(POWERED, powered);
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/boss/CraftBossBar.java b/src/main/java/org/bukkit/craftbukkit/boss/CraftBossBar.java
index 9696fe5d..d9e54331 100644
--- a/src/main/java/org/bukkit/craftbukkit/boss/CraftBossBar.java
+++ b/src/main/java/org/bukkit/craftbukkit/boss/CraftBossBar.java
@@ -68,7 +68,7 @@ public class CraftBossBar implements BossBar {
@Override
public String getTitle() {
- return CraftChatMessage.fromComponent(handle.e());
+ return CraftChatMessage.fromComponent(handle.title);
}
@Override
diff --git a/src/main/java/org/bukkit/craftbukkit/chunkio/ChunkIOProvider.java b/src/main/java/org/bukkit/craftbukkit/chunkio/ChunkIOProvider.java
index f1c1dc49..413dd35f 100644
--- a/src/main/java/org/bukkit/craftbukkit/chunkio/ChunkIOProvider.java
+++ b/src/main/java/org/bukkit/craftbukkit/chunkio/ChunkIOProvider.java
@@ -18,7 +18,7 @@ class ChunkIOProvider implements AsynchronousExecutor.CallBackProvider<QueuedChu
public Chunk callStage1(QueuedChunk queuedChunk) throws RuntimeException {
try {
ChunkRegionLoader loader = queuedChunk.loader;
- Object[] data = loader.loadChunk(queuedChunk.world, queuedChunk.x, queuedChunk.z);
+ Object[] data = loader.loadChunk(queuedChunk.world, queuedChunk.x, queuedChunk.z, (chunk) -> {});
if (data != null) {
queuedChunk.compound = (NBTTagCompound) data[1];
@@ -35,20 +35,14 @@ class ChunkIOProvider implements AsynchronousExecutor.CallBackProvider<QueuedChu
public void callStage2(QueuedChunk queuedChunk, Chunk chunk) throws RuntimeException {
if (chunk == null) {
// If the chunk loading failed just do it synchronously (may generate)
- queuedChunk.provider.originalGetChunkAt(queuedChunk.x, queuedChunk.z);
+ // queuedChunk.provider.originalGetChunkAt(queuedChunk.x, queuedChunk.z);
return;
}
- queuedChunk.loader.loadEntities(chunk, queuedChunk.compound.getCompound("Level"), queuedChunk.world);
+ queuedChunk.loader.loadEntities(queuedChunk.compound.getCompound("Level"), chunk);
chunk.setLastSaved(queuedChunk.provider.world.getTime());
queuedChunk.provider.chunks.put(ChunkCoordIntPair.a(queuedChunk.x, queuedChunk.z), chunk);
chunk.addEntities();
-
- if (queuedChunk.provider.chunkGenerator != null) {
- queuedChunk.provider.chunkGenerator.recreateStructures(chunk, queuedChunk.x, queuedChunk.z);
- }
-
- chunk.loadNearby(queuedChunk.provider, queuedChunk.provider.chunkGenerator, false);
}
public void callStage3(QueuedChunk queuedChunk, Chunk chunk, Runnable runnable) throws RuntimeException {
diff --git a/src/main/java/org/bukkit/craftbukkit/command/BukkitCommandWrapper.java b/src/main/java/org/bukkit/craftbukkit/command/BukkitCommandWrapper.java
new file mode 100644
index 00000000..d69855ed
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/command/BukkitCommandWrapper.java
@@ -0,0 +1,56 @@
+package org.bukkit.craftbukkit.command;
+
+import com.mojang.brigadier.CommandDispatcher;
+import com.mojang.brigadier.arguments.StringArgumentType;
+import com.mojang.brigadier.builder.LiteralArgumentBuilder;
+import com.mojang.brigadier.builder.RequiredArgumentBuilder;
+import com.mojang.brigadier.context.CommandContext;
+import com.mojang.brigadier.exceptions.CommandSyntaxException;
+import com.mojang.brigadier.suggestion.SuggestionProvider;
+import com.mojang.brigadier.suggestion.Suggestions;
+import com.mojang.brigadier.suggestion.SuggestionsBuilder;
+import com.mojang.brigadier.tree.LiteralCommandNode;
+import java.util.List;
+import java.util.concurrent.CompletableFuture;
+import java.util.function.Predicate;
+import net.minecraft.server.CommandListenerWrapper;
+import org.bukkit.command.Command;
+import org.bukkit.craftbukkit.CraftServer;
+
+public class BukkitCommandWrapper implements com.mojang.brigadier.Command<CommandListenerWrapper>, Predicate<CommandListenerWrapper>, SuggestionProvider<CommandListenerWrapper> {
+
+ private final CraftServer server;
+ private final Command command;
+
+ public BukkitCommandWrapper(CraftServer server, Command command) {
+ this.server = server;
+ this.command = command;
+ }
+
+ public LiteralCommandNode<CommandListenerWrapper> register(CommandDispatcher<CommandListenerWrapper> dispatcher, String label) {
+ return dispatcher.register(
+ LiteralArgumentBuilder.<CommandListenerWrapper>literal(label).requires(this).executes(this)
+ .then(RequiredArgumentBuilder.<CommandListenerWrapper, String>argument("args", StringArgumentType.greedyString()).suggests(this).executes(this))
+ );
+ }
+
+ @Override
+ public boolean test(CommandListenerWrapper wrapper) {
+ return command.testPermissionSilent(wrapper.getBukkitSender());
+ }
+
+ @Override
+ public int run(CommandContext<CommandListenerWrapper> context) throws CommandSyntaxException {
+ return server.dispatchCommand(context.getSource().getBukkitSender(), context.getInput()) ? 1 : 0;
+ }
+
+ @Override
+ public CompletableFuture<Suggestions> getSuggestions(CommandContext<CommandListenerWrapper> context, SuggestionsBuilder builder) throws CommandSyntaxException {
+ List<String> results = server.tabComplete(context.getSource().getBukkitSender(), builder.getInput(), context.getSource().getWorld(), context.getSource().getPosition(), true);
+ for (String s : results) {
+ builder.suggest(s);
+ }
+
+ return builder.buildFuture();
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/command/CraftBlockCommandSender.java b/src/main/java/org/bukkit/craftbukkit/command/CraftBlockCommandSender.java
index 251ea5e0..3ad7dfdb 100644
--- a/src/main/java/org/bukkit/craftbukkit/command/CraftBlockCommandSender.java
+++ b/src/main/java/org/bukkit/craftbukkit/command/CraftBlockCommandSender.java
@@ -1,7 +1,10 @@
package org.bukkit.craftbukkit.command;
+import net.minecraft.server.CommandBlockListenerAbstract;
+import net.minecraft.server.CommandListenerWrapper;
import net.minecraft.server.ICommandListener;
import net.minecraft.server.IChatBaseComponent;
+import net.minecraft.server.Vec3D;
import org.bukkit.block.Block;
import org.bukkit.command.BlockCommandSender;
@@ -11,20 +14,21 @@ import org.bukkit.craftbukkit.util.CraftChatMessage;
* Represents input from a command block
*/
public class CraftBlockCommandSender extends ServerCommandSender implements BlockCommandSender {
- private final ICommandListener block;
+ private final CommandListenerWrapper block;
- public CraftBlockCommandSender(ICommandListener commandBlockListenerAbstract) {
+ public CraftBlockCommandSender(CommandListenerWrapper commandBlockListenerAbstract) {
super();
this.block = commandBlockListenerAbstract;
}
public Block getBlock() {
- return block.getWorld().getWorld().getBlockAt(block.getChunkCoordinates().getX(), block.getChunkCoordinates().getY(), block.getChunkCoordinates().getZ());
+ Vec3D pos = block.getPosition();
+ return block.getWorld().getWorld().getBlockAt((int) pos.x, (int) pos.y, (int) pos.z);
}
public void sendMessage(String message) {
for (IChatBaseComponent component : CraftChatMessage.fromString(message)) {
- block.sendMessage(component);
+ block.base.sendMessage(component);
}
}
@@ -46,7 +50,7 @@ public class CraftBlockCommandSender extends ServerCommandSender implements Bloc
throw new UnsupportedOperationException("Cannot change operator status of a block");
}
- public ICommandListener getTileEntity() {
+ public CommandListenerWrapper getWrapper() {
return block;
}
}
diff --git a/src/main/java/org/bukkit/craftbukkit/command/CraftCommandMap.java b/src/main/java/org/bukkit/craftbukkit/command/CraftCommandMap.java
new file mode 100644
index 00000000..2fd69c0f
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/command/CraftCommandMap.java
@@ -0,0 +1,17 @@
+package org.bukkit.craftbukkit.command;
+
+import java.util.Map;
+import org.bukkit.Server;
+import org.bukkit.command.Command;
+import org.bukkit.command.SimpleCommandMap;
+
+public class CraftCommandMap extends SimpleCommandMap {
+
+ public CraftCommandMap(Server server) {
+ super(server);
+ }
+
+ public Map<String, Command> getKnownCommands() {
+ return knownCommands;
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/command/CraftFunctionCommandSender.java b/src/main/java/org/bukkit/craftbukkit/command/CraftFunctionCommandSender.java
deleted file mode 100644
index 6bb69bb4..00000000
--- a/src/main/java/org/bukkit/craftbukkit/command/CraftFunctionCommandSender.java
+++ /dev/null
@@ -1,47 +0,0 @@
-package org.bukkit.craftbukkit.command;
-
-import net.minecraft.server.IChatBaseComponent;
-import net.minecraft.server.ICommandListener;
-import org.bukkit.craftbukkit.util.CraftChatMessage;
-
-public class CraftFunctionCommandSender extends ServerCommandSender {
-
- private final ICommandListener handle;
-
- public CraftFunctionCommandSender(ICommandListener handle) {
- this.handle = handle;
- }
-
- @Override
- public void sendMessage(String message) {
- for (IChatBaseComponent component : CraftChatMessage.fromString(message)) {
- handle.sendMessage(component);
- }
- }
-
- @Override
- public void sendMessage(String[] messages) {
- for (String message : messages) {
- sendMessage(message);
- }
- }
-
- @Override
- public String getName() {
- return handle.getName();
- }
-
- @Override
- public boolean isOp() {
- return true;
- }
-
- @Override
- public void setOp(boolean value) {
- throw new UnsupportedOperationException("Cannot change operator status of server function sender");
- }
-
- public ICommandListener getHandle() {
- return handle;
- }
-}
diff --git a/src/main/java/org/bukkit/craftbukkit/command/ProxiedNativeCommandSender.java b/src/main/java/org/bukkit/craftbukkit/command/ProxiedNativeCommandSender.java
index 9acd92c3..07c34cb2 100644
--- a/src/main/java/org/bukkit/craftbukkit/command/ProxiedNativeCommandSender.java
+++ b/src/main/java/org/bukkit/craftbukkit/command/ProxiedNativeCommandSender.java
@@ -2,7 +2,7 @@
package org.bukkit.craftbukkit.command;
import java.util.Set;
-import net.minecraft.server.ICommandListener;
+import net.minecraft.server.CommandListenerWrapper;
import org.bukkit.Server;
import org.bukkit.command.CommandSender;
@@ -14,17 +14,17 @@ import org.bukkit.plugin.Plugin;
public class ProxiedNativeCommandSender implements ProxiedCommandSender {
- private final ICommandListener orig;
+ private final CommandListenerWrapper orig;
private final CommandSender caller;
private final CommandSender callee;
- public ProxiedNativeCommandSender(ICommandListener orig, CommandSender caller, CommandSender callee) {
+ public ProxiedNativeCommandSender(CommandListenerWrapper orig, CommandSender caller, CommandSender callee) {
this.orig = orig;
this.caller = caller;
this.callee = callee;
}
- public ICommandListener getHandle() {
+ public CommandListenerWrapper getHandle() {
return orig;
}
diff --git a/src/main/java/org/bukkit/craftbukkit/command/VanillaCommandWrapper.java b/src/main/java/org/bukkit/craftbukkit/command/VanillaCommandWrapper.java
index 6247bbda..5de49fe0 100644
--- a/src/main/java/org/bukkit/craftbukkit/command/VanillaCommandWrapper.java
+++ b/src/main/java/org/bukkit/craftbukkit/command/VanillaCommandWrapper.java
@@ -1,12 +1,18 @@
package org.bukkit.craftbukkit.command;
-import java.util.Iterator;
+import com.google.common.base.Joiner;
+import com.mojang.brigadier.ParseResults;
+import com.mojang.brigadier.suggestion.Suggestion;
+import com.mojang.brigadier.tree.CommandNode;
+import java.util.ArrayList;
+import java.util.Collections;
import java.util.List;
-
-import net.minecraft.server.*;
-
+import net.minecraft.server.CommandDispatcher;
+import net.minecraft.server.CommandListenerWrapper;
+import net.minecraft.server.DedicatedServer;
+import net.minecraft.server.EntityMinecartCommandBlock;
+import net.minecraft.server.MinecraftServer;
import org.apache.commons.lang.Validate;
-import org.apache.logging.log4j.Level;
import org.bukkit.Location;
import org.bukkit.command.BlockCommandSender;
import org.bukkit.command.CommandSender;
@@ -21,27 +27,23 @@ import org.bukkit.entity.Player;
import org.bukkit.entity.minecart.CommandMinecart;
public final class VanillaCommandWrapper extends BukkitCommand {
- protected final CommandAbstract vanillaCommand;
- public VanillaCommandWrapper(CommandAbstract vanillaCommand, String usage) {
- super(vanillaCommand.getCommand(), "A Mojang provided command.", usage, vanillaCommand.getAliases());
+ private final CommandDispatcher dispatcher;
+ public final CommandNode<CommandListenerWrapper> vanillaCommand;
+
+ public VanillaCommandWrapper(CommandDispatcher dispatcher, CommandNode<CommandListenerWrapper> vanillaCommand) {
+ super(vanillaCommand.getName(), "A Mojang provided command.", vanillaCommand.getUsageText(), Collections.EMPTY_LIST);
+ this.dispatcher = dispatcher;
this.vanillaCommand = vanillaCommand;
- this.setPermission("minecraft.command." + vanillaCommand.getCommand());
+ this.setPermission(getPermission(vanillaCommand));
}
@Override
public boolean execute(CommandSender sender, String commandLabel, String[] args) {
if (!testPermission(sender)) return true;
- ICommandListener icommandlistener = getListener(sender);
- try {
- dispatchVanillaCommand(sender, icommandlistener, args);
- } catch (CommandException commandexception) {
- // Taken from CommandHandler
- ChatMessage chatmessage = new ChatMessage(commandexception.getMessage(), commandexception.getArgs());
- chatmessage.getChatModifier().setColor(EnumChatFormat.RED);
- icommandlistener.sendMessage(chatmessage);
- }
+ CommandListenerWrapper icommandlistener = getListener(sender);
+ dispatcher.a(icommandlistener, toDispatcher(args));
return true;
}
@@ -50,135 +52,46 @@ public final class VanillaCommandWrapper extends BukkitCommand {
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(MinecraftServer.getServer(), getListener(sender), args, (location) == null ? null : new BlockPosition(location.getX(), location.getY(), location.getZ()));
- }
-
- public static CommandSender lastSender = null; // Nasty :(
-
- public final int dispatchVanillaCommand(CommandSender bSender, ICommandListener icommandlistener, String[] as) throws CommandException {
- // Copied from net.minecraft.server.CommandHandler
- int i = getPlayerListSize(as);
- int j = 0;
- // Some commands use the worldserver variable but we leave it full of null values,
- // so we must temporarily populate it with the world of the commandsender
- WorldServer[] prev = MinecraftServer.getServer().worldServer;
- MinecraftServer server = MinecraftServer.getServer();
- server.worldServer = new WorldServer[server.worlds.size()];
- server.worldServer[0] = (WorldServer) icommandlistener.getWorld();
- int bpos = 0;
- for (int pos = 1; pos < server.worldServer.length; pos++) {
- WorldServer world = server.worlds.get(bpos++);
- if (server.worldServer[0] == world) {
- pos--;
- continue;
- }
- server.worldServer[pos] = world;
- }
- try {
- if (vanillaCommand.canUse(server, icommandlistener)) {
- if (i > -1) {
- List<Entity> list = ((List<Entity>)PlayerSelector.getPlayers(icommandlistener, as[i], Entity.class));
- String s2 = as[i];
+ CommandListenerWrapper icommandlistener = getListener(sender);
+ ParseResults<CommandListenerWrapper> parsed = dispatcher.a().parse(toDispatcher(args), icommandlistener);
- icommandlistener.a(CommandObjectiveExecutor.EnumCommandResult.AFFECTED_ENTITIES, list.size());
- Iterator<Entity> iterator = list.iterator();
+ List<String> results = new ArrayList<>();
+ dispatcher.a().getCompletionSuggestions(parsed).thenAccept((suggestions) -> {
+ suggestions.getList().forEach((s) -> results.add(s.getText()));
+ });
- while (iterator.hasNext()) {
- Entity entity = iterator.next();
-
- CommandSender oldSender = lastSender;
- lastSender = bSender;
- try {
- as[i] = entity.getUniqueID().toString();
- vanillaCommand.execute(server, icommandlistener, as);
- j++;
- } 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) {
- CommandAbstract.a(icommandlistener, vanillaCommand, 0, commandexception.getMessage(), commandexception.getArgs());
- } finally {
- lastSender = oldSender;
- }
- }
- as[i] = s2;
- } else {
- icommandlistener.a(CommandObjectiveExecutor.EnumCommandResult.AFFECTED_ENTITIES, 1);
- vanillaCommand.execute(server, icommandlistener, as);
- j++;
- }
- } else {
- ChatMessage chatmessage = new ChatMessage("commands.generic.permission", new Object[0]);
- chatmessage.getChatModifier().setColor(EnumChatFormat.RED);
- icommandlistener.sendMessage(chatmessage);
- }
- } catch (ExceptionUsage exceptionusage) {
- ChatMessage chatmessage1 = new ChatMessage("commands.generic.usage", new Object[] { new ChatMessage(exceptionusage.getMessage(), exceptionusage.getArgs()) });
- chatmessage1.getChatModifier().setColor(EnumChatFormat.RED);
- icommandlistener.sendMessage(chatmessage1);
- } catch (CommandException commandexception) {
- CommandAbstract.a(icommandlistener, vanillaCommand, 0, commandexception.getMessage(), commandexception.getArgs());
- } catch (Throwable throwable) {
- ChatMessage chatmessage3 = new ChatMessage("commands.generic.exception", new Object[0]);
- chatmessage3.getChatModifier().setColor(EnumChatFormat.RED);
- icommandlistener.sendMessage(chatmessage3);
- if (icommandlistener.f() instanceof EntityMinecartCommandBlock) {
- MinecraftServer.LOGGER.log(Level.WARN, String.format("MinecartCommandBlock at (%d,%d,%d) failed to handle command", icommandlistener.getChunkCoordinates().getX(), icommandlistener.getChunkCoordinates().getY(), icommandlistener.getChunkCoordinates().getZ()), throwable);
- } else if(icommandlistener instanceof CommandBlockListenerAbstract) {
- CommandBlockListenerAbstract listener = (CommandBlockListenerAbstract) icommandlistener;
- MinecraftServer.LOGGER.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 {
- MinecraftServer.LOGGER.log(Level.WARN, String.format("Unknown CommandBlock failed to handle command"), throwable);
- }
- } finally {
- icommandlistener.a(CommandObjectiveExecutor.EnumCommandResult.SUCCESS_COUNT, j);
- MinecraftServer.getServer().worldServer = prev;
- }
- return j;
+ return results;
}
- private ICommandListener getListener(CommandSender sender) {
+ private CommandListenerWrapper getListener(CommandSender sender) {
if (sender instanceof Player) {
- return ((CraftPlayer) sender).getHandle();
+ return ((CraftPlayer) sender).getHandle().getCommandListener();
}
if (sender instanceof BlockCommandSender) {
- return ((CraftBlockCommandSender) sender).getTileEntity();
+ return ((CraftBlockCommandSender) sender).getWrapper();
}
if (sender instanceof CommandMinecart) {
- return ((EntityMinecartCommandBlock) ((CraftMinecartCommand) sender).getHandle()).getCommandBlock();
+ return ((EntityMinecartCommandBlock) ((CraftMinecartCommand) sender).getHandle()).getCommandBlock().getWrapper();
}
if (sender instanceof RemoteConsoleCommandSender) {
- return ((DedicatedServer)MinecraftServer.getServer()).remoteControlCommandListener;
+ return ((DedicatedServer) MinecraftServer.getServer()).remoteControlCommandListener.f();
}
if (sender instanceof ConsoleCommandSender) {
- return ((CraftServer) sender.getServer()).getServer();
+ return ((CraftServer) sender.getServer()).getServer().getServerCommandListener();
}
if (sender instanceof ProxiedCommandSender) {
return ((ProxiedNativeCommandSender) sender).getHandle();
}
- if (sender instanceof CraftFunctionCommandSender) {
- return ((CraftFunctionCommandSender) sender).getHandle();
- }
+
throw new IllegalArgumentException("Cannot make " + sender + " a vanilla command listener");
}
- private int getPlayerListSize(String as[]) throws CommandException {
- for (int i = 0; i < as.length; i++) {
- if (vanillaCommand.isListStart(as, i) && PlayerSelector.isList(as[i])) {
- return i;
- }
- }
- return -1;
+ public static String getPermission(CommandNode<CommandListenerWrapper> vanillaCommand) {
+ return "minecraft.command." + ((vanillaCommand.getRedirect() == null) ? vanillaCommand.getName() : vanillaCommand.getRedirect().getName());
}
- public static String[] dropFirstArgument(String as[]) {
- String as1[] = new String[as.length - 1];
- for (int i = 1; i < as.length; i++) {
- as1[i - 1] = as[i];
- }
-
- return as1;
+ private String toDispatcher(String[] args) {
+ return getName() + ((args.length > 0) ? " " + Joiner.on(' ').join(args) : "");
}
}
diff --git a/src/main/java/org/bukkit/craftbukkit/enchantments/CraftEnchantment.java b/src/main/java/org/bukkit/craftbukkit/enchantments/CraftEnchantment.java
index f98e3e9a..4ce44495 100644
--- a/src/main/java/org/bukkit/craftbukkit/enchantments/CraftEnchantment.java
+++ b/src/main/java/org/bukkit/craftbukkit/enchantments/CraftEnchantment.java
@@ -1,6 +1,9 @@
package org.bukkit.craftbukkit.enchantments;
+import net.minecraft.server.EnchantmentBinding;
+import net.minecraft.server.EnchantmentVanishing;
import org.bukkit.craftbukkit.inventory.CraftItemStack;
+import org.bukkit.craftbukkit.util.CraftNamespacedKey;
import org.bukkit.enchantments.Enchantment;
import org.bukkit.enchantments.EnchantmentTarget;
import org.bukkit.enchantments.EnchantmentWrapper;
@@ -10,7 +13,7 @@ public class CraftEnchantment extends Enchantment {
private final net.minecraft.server.Enchantment target;
public CraftEnchantment(net.minecraft.server.Enchantment target) {
- super(net.minecraft.server.Enchantment.getId(target));
+ super(CraftNamespacedKey.fromMinecraft(net.minecraft.server.Enchantment.enchantments.b(target)));
this.target = target;
}
@@ -51,6 +54,8 @@ public class CraftEnchantment extends Enchantment {
return EnchantmentTarget.BREAKABLE;
case WEARABLE:
return EnchantmentTarget.WEARABLE;
+ case TRIDENT:
+ return EnchantmentTarget.TRIDENT;
default:
return null;
}
@@ -63,7 +68,7 @@ public class CraftEnchantment extends Enchantment {
@Override
public boolean isCursed() {
- return target.isCursed();
+ return target instanceof EnchantmentBinding || target instanceof EnchantmentVanishing;
}
@Override
@@ -73,7 +78,8 @@ public class CraftEnchantment extends Enchantment {
@Override
public String getName() {
- switch (getId()) {
+ // PAIL: migration paths
+ switch (net.minecraft.server.Enchantment.enchantments.a(target)) {
case 0:
return "PROTECTION_ENVIRONMENTAL";
case 1:
@@ -96,46 +102,54 @@ public class CraftEnchantment extends Enchantment {
return "FROST_WALKER";
case 10:
return "BINDING_CURSE";
- case 16:
+ case 11:
return "DAMAGE_ALL";
- case 17:
+ case 12:
return "DAMAGE_UNDEAD";
- case 18:
+ case 13:
return "DAMAGE_ARTHROPODS";
- case 19:
+ case 14:
return "KNOCKBACK";
- case 20:
+ case 15:
return "FIRE_ASPECT";
- case 21:
+ case 16:
return "LOOT_BONUS_MOBS";
- case 22:
+ case 17:
return "SWEEPING_EDGE";
- case 32:
+ case 18:
return "DIG_SPEED";
- case 33:
+ case 19:
return "SILK_TOUCH";
- case 34:
+ case 20:
return "DURABILITY";
- case 35:
+ case 21:
return "LOOT_BONUS_BLOCKS";
- case 48:
+ case 22:
return "ARROW_DAMAGE";
- case 49:
+ case 23:
return "ARROW_KNOCKBACK";
- case 50:
+ case 24:
return "ARROW_FIRE";
- case 51:
+ case 25:
return "ARROW_INFINITE";
- case 61:
+ case 26:
return "LUCK";
- case 62:
+ case 27:
return "LURE";
- case 70:
+ case 28:
+ return "LOYALTY";
+ case 29:
+ return "IMPALING";
+ case 30:
+ return "RIPTIDE";
+ case 31:
+ return "CHANNELING";
+ case 32:
return "MENDING";
- case 71:
+ case 33:
return "VANISHING_CURSE";
default:
- return "UNKNOWN_ENCHANT_" + getId();
+ return "UNKNOWN_ENCHANT_" + getName();
}
}
@@ -160,7 +174,7 @@ public class CraftEnchantment extends Enchantment {
return false;
}
CraftEnchantment ench = (CraftEnchantment) other;
- return !target.c(ench.target);
+ return !target.b(ench.target);
}
public net.minecraft.server.Enchantment getHandle() {
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftArrow.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftArrow.java
index 99425767..e47080db 100644
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftArrow.java
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftArrow.java
@@ -59,7 +59,7 @@ public class CraftArrow extends AbstractProjectile implements Arrow {
}
EntityArrow handle = getHandle();
- return getWorld().getBlockAt(handle.h, handle.at, handle.au); // PAIL: rename tileX, tileY, tileZ
+ return getWorld().getBlockAt(handle.tileX, handle.tileY, handle.tileZ);
}
@Override
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftCod.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftCod.java
new file mode 100644
index 00000000..9cda680c
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftCod.java
@@ -0,0 +1,28 @@
+package org.bukkit.craftbukkit.entity;
+
+import net.minecraft.server.EntityCod;
+import org.bukkit.craftbukkit.CraftServer;
+import org.bukkit.entity.Cod;
+import org.bukkit.entity.EntityType;
+
+public class CraftCod extends CraftFish implements Cod {
+
+ public CraftCod(CraftServer server, EntityCod entity) {
+ super(server, entity);
+ }
+
+ @Override
+ public EntityCod getHandle() {
+ return (EntityCod) super.getHandle();
+ }
+
+ @Override
+ public String toString() {
+ return "CraftCod";
+ }
+
+ @Override
+ public EntityType getType() {
+ return EntityType.COD;
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftDolphin.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftDolphin.java
new file mode 100644
index 00000000..7a838f38
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftDolphin.java
@@ -0,0 +1,28 @@
+package org.bukkit.craftbukkit.entity;
+
+import net.minecraft.server.EntityDolphin;
+import org.bukkit.craftbukkit.CraftServer;
+import org.bukkit.entity.Dolphin;
+import org.bukkit.entity.EntityType;
+
+public class CraftDolphin extends CraftCreature implements Dolphin {
+
+ public CraftDolphin(CraftServer server, EntityDolphin entity) {
+ super(server, entity);
+ }
+
+ @Override
+ public EntityDolphin getHandle() {
+ return (EntityDolphin) super.getHandle();
+ }
+
+ @Override
+ public String toString() {
+ return "CraftDolphin";
+ }
+
+ @Override
+ public EntityType getType() {
+ return EntityType.DOLPHIN;
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftDrowned.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftDrowned.java
new file mode 100644
index 00000000..6e41dfd9
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftDrowned.java
@@ -0,0 +1,28 @@
+package org.bukkit.craftbukkit.entity;
+
+import net.minecraft.server.EntityDrowned;
+import org.bukkit.craftbukkit.CraftServer;
+import org.bukkit.entity.Drowned;
+import org.bukkit.entity.EntityType;
+
+public class CraftDrowned extends CraftZombie implements Drowned {
+
+ public CraftDrowned(CraftServer server, EntityDrowned entity) {
+ super(server, entity);
+ }
+
+ @Override
+ public EntityDrowned getHandle() {
+ return (EntityDrowned) entity;
+ }
+
+ @Override
+ public String toString() {
+ return "CraftDrowned";
+ }
+
+ @Override
+ public EntityType getType() {
+ return EntityType.DROWNED;
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftEnderSignal.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftEnderSignal.java
index aaa624ae..d771fdc6 100644
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftEnderSignal.java
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftEnderSignal.java
@@ -30,7 +30,7 @@ public class CraftEnderSignal extends CraftEntity implements EnderSignal {
@Override
public Location getTargetLocation() {
- return new Location(getWorld(), getHandle().a, getHandle().b, getHandle().c, getHandle().yaw, getHandle().pitch); // PAIL rename targetX, targetY, targetZ
+ return new Location(getWorld(), getHandle().targetX, getHandle().targetY, getHandle().targetZ, getHandle().yaw, getHandle().pitch);
}
@Override
@@ -41,21 +41,21 @@ public class CraftEnderSignal extends CraftEntity implements EnderSignal {
@Override
public boolean getDropItem() {
- return getHandle().e; // PAIL rename getDropItem
+ return getHandle().shouldDropItem;
}
@Override
public void setDropItem(boolean shouldDropItem) {
- getHandle().e = shouldDropItem; // PAIL rename getDropItem
+ getHandle().shouldDropItem = shouldDropItem;
}
@Override
public int getDespawnTimer() {
- return getHandle().d; // PAIL rename despawnTimer
+ return getHandle().despawnTimer;
}
@Override
public void setDespawnTimer(int time) {
- getHandle().d = time; // PAIL rename despawnTimer
+ getHandle().despawnTimer = time;
}
}
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftEnderman.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftEnderman.java
index f602c231..5998530a 100644
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftEnderman.java
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftEnderman.java
@@ -3,8 +3,9 @@ package org.bukkit.craftbukkit.entity;
import net.minecraft.server.EntityEnderman;
import net.minecraft.server.IBlockData;
-import org.bukkit.Material;
+import org.bukkit.block.data.BlockData;
import org.bukkit.craftbukkit.CraftServer;
+import org.bukkit.craftbukkit.block.data.CraftBlockData;
import org.bukkit.craftbukkit.util.CraftMagicNumbers;
import org.bukkit.entity.Enderman;
import org.bukkit.entity.EntityType;
@@ -17,11 +18,22 @@ public class CraftEnderman extends CraftMonster implements Enderman {
public MaterialData getCarriedMaterial() {
IBlockData blockData = getHandle().getCarried();
- return (blockData == null) ? Material.AIR.getNewData((byte) 0) : CraftMagicNumbers.getMaterial(blockData.getBlock()).getNewData((byte) blockData.getBlock().toLegacyData(blockData));
+ return CraftMagicNumbers.getMaterial(blockData);
+ }
+
+ @Override
+ public BlockData getCarriedBlock() {
+ IBlockData blockData = getHandle().getCarried();
+ return CraftBlockData.fromData(blockData);
}
public void setCarriedMaterial(MaterialData data) {
- getHandle().setCarried(CraftMagicNumbers.getBlock(data.getItemTypeId()).fromLegacyData(data.getData()));
+ getHandle().setCarried(CraftMagicNumbers.getBlock(data));
+ }
+
+ @Override
+ public void setCarriedBlock(BlockData blockData) {
+ getHandle().setCarried(((CraftBlockData) blockData).getState());
}
@Override
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java
index 961cf24c..f0a52de5 100644
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java
@@ -16,6 +16,7 @@ import org.bukkit.World;
import org.bukkit.block.PistonMoveReaction;
import org.bukkit.craftbukkit.CraftServer;
import org.bukkit.craftbukkit.CraftWorld;
+import org.bukkit.craftbukkit.util.CraftChatMessage;
import org.bukkit.event.entity.EntityDamageEvent;
import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause;
import org.bukkit.metadata.MetadataValue;
@@ -52,6 +53,14 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity {
// Water Animals
else if (entity instanceof EntityWaterAnimal) {
if (entity instanceof EntitySquid) { return new CraftSquid(server, (EntitySquid) entity); }
+ else if (entity instanceof EntityFish) {
+ if (entity instanceof EntityCod) { return new CraftCod(server, (EntityCod) entity); }
+ else if (entity instanceof EntityPufferFish) { return new CraftPufferFish(server, (EntityPufferFish) entity); }
+ else if (entity instanceof EntitySalmon) { return new CraftSalmon(server, (EntitySalmon) entity); }
+ else if (entity instanceof EntityTropicalFish) { return new CraftTropicalFish(server, (EntityTropicalFish) entity); }
+ else { return new CraftFish(server, (EntityFish) entity); }
+ }
+ else if (entity instanceof EntityDolphin) { return new CraftDolphin(server, (EntityDolphin) entity); }
else { return new CraftWaterMob(server, (EntityWaterAnimal) entity); }
}
else if (entity instanceof EntityCreature) {
@@ -80,6 +89,7 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity {
}
else if (entity instanceof EntityRabbit) { return new CraftRabbit(server, (EntityRabbit) entity); }
else if (entity instanceof EntityPolarBear) { return new CraftPolarBear(server, (EntityPolarBear) entity); }
+ else if (entity instanceof EntityTurtle) { return new CraftTurtle(server, (EntityTurtle) entity); }
else { return new CraftAnimals(server, (EntityAnimal) entity); }
}
// Monsters
@@ -88,6 +98,7 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity {
if (entity instanceof EntityPigZombie) { return new CraftPigZombie(server, (EntityPigZombie) entity); }
else if (entity instanceof EntityZombieHusk) { return new CraftHusk(server, (EntityZombieHusk) entity); }
else if (entity instanceof EntityZombieVillager) { return new CraftVillagerZombie(server, (EntityZombieVillager) entity); }
+ else if (entity instanceof EntityDrowned) { return new CraftDrowned(server, (EntityDrowned) entity); }
else { return new CraftZombie(server, (EntityZombie) entity); }
}
else if (entity instanceof EntityCreeper) { return new CraftCreeper(server, (EntityCreeper) entity); }
@@ -140,6 +151,7 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity {
// Flying
else if (entity instanceof EntityFlying) {
if (entity instanceof EntityGhast) { return new CraftGhast(server, (EntityGhast) entity); }
+ else if (entity instanceof EntityPhantom) { return new CraftPhantom(server, (EntityPhantom) entity); }
else { return new CraftFlying(server, (EntityFlying) entity); }
}
else if (entity instanceof EntityEnderDragon) {
@@ -164,7 +176,10 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity {
else { return new CraftArrow(server, (EntityArrow) entity); }
}
else if (entity instanceof EntitySpectralArrow) { return new CraftSpectralArrow(server, (EntitySpectralArrow) entity); }
- else if (entity instanceof EntityArrow) { return new CraftArrow(server, (EntityArrow) entity); }
+ else if (entity instanceof EntityArrow) {
+ if (entity instanceof EntityThrownTrident) { return new CraftTrident(server, (EntityThrownTrident) entity); }
+ else { return new CraftArrow(server, (EntityArrow) entity); }
+ }
else if (entity instanceof EntityBoat) { return new CraftBoat(server, (EntityBoat) entity); }
else if (entity instanceof EntityProjectile) {
if (entity instanceof EntityEgg) { return new CraftEgg(server, (EntityEgg) entity); }
@@ -186,7 +201,7 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity {
}
else if (entity instanceof EntityEnderSignal) { return new CraftEnderSignal(server, (EntityEnderSignal) entity); }
else if (entity instanceof EntityEnderCrystal) { return new CraftEnderCrystal(server, (EntityEnderCrystal) entity); }
- else if (entity instanceof EntityFishingHook) { return new CraftFish(server, (EntityFishingHook) entity); }
+ else if (entity instanceof EntityFishingHook) { return new CraftFishHook(server, (EntityFishingHook) entity); }
else if (entity instanceof EntityItem) { return new CraftItem(server, (EntityItem) entity); }
else if (entity instanceof EntityWeather) {
if (entity instanceof EntityLightning) { return new CraftLightningStrike(server, (EntityLightning) entity); }
@@ -507,7 +522,7 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity {
return null;
}
- return getHandle().bJ().getBukkitEntity(); // PAIL: rename getVehicle() -> getRootVehicle(), bJ() -> getVehicle()
+ return getHandle().getVehicle().getBukkitEntity();
}
@Override
@@ -516,18 +531,23 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity {
name = "";
}
- getHandle().setCustomName(name);
+ // sane limit for name length
+ if (name.length() > 256) {
+ name = name.substring(0, 256);
+ }
+
+ getHandle().setCustomName(CraftChatMessage.fromStringOrNull(name));
}
@Override
public String getCustomName() {
- String name = getHandle().getCustomName();
+ IChatBaseComponent name = getHandle().getCustomName();
- if (name == null || name.length() == 0) {
+ if (name == null) {
return null;
}
- return name;
+ return CraftChatMessage.fromComponent(name);
}
@Override
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftFallingBlock.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftFallingBlock.java
index b0a7f639..b4322dff 100644
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftFallingBlock.java
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftFallingBlock.java
@@ -3,7 +3,9 @@ package org.bukkit.craftbukkit.entity;
import net.minecraft.server.EntityFallingBlock;
import org.bukkit.Material;
+import org.bukkit.block.data.BlockData;
import org.bukkit.craftbukkit.CraftServer;
+import org.bukkit.craftbukkit.block.data.CraftBlockData;
import org.bukkit.craftbukkit.util.CraftMagicNumbers;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.FallingBlock;
@@ -29,15 +31,11 @@ public class CraftFallingBlock extends CraftEntity implements FallingBlock {
}
public Material getMaterial() {
- return Material.getMaterial(getBlockId());
+ return CraftMagicNumbers.getMaterial(getHandle().getBlock()).getItemType();
}
- public int getBlockId() {
- return CraftMagicNumbers.getId(getHandle().getBlock().getBlock());
- }
-
- public byte getBlockData() {
- return (byte) getHandle().getBlock().getBlock().toLegacyData(getHandle().getBlock());
+ public BlockData getBlockData() {
+ return CraftBlockData.fromData(getHandle().getBlock());
}
public boolean getDropItem() {
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftFirework.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftFirework.java
index 99746b3c..7b3b2068 100644
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftFirework.java
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftFirework.java
@@ -24,15 +24,15 @@ public class CraftFirework extends CraftEntity implements Firework {
ItemStack item = getHandle().getDataWatcher().get(EntityFireworks.FIREWORK_ITEM);
if (item.isEmpty()) {
- item = new ItemStack(Items.FIREWORKS);
+ item = new ItemStack(Items.FIREWORK_ROCKET);
getHandle().getDataWatcher().set(EntityFireworks.FIREWORK_ITEM, item);
}
this.item = CraftItemStack.asCraftMirror(item);
// Ensure the item is a firework...
- if (this.item.getType() != Material.FIREWORK) {
- this.item.setType(Material.FIREWORK);
+ if (this.item.getType() != Material.FIREWORK_ROCKET) {
+ this.item.setType(Material.FIREWORK_ROCKET);
}
}
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftFish.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftFish.java
index d555597d..aaa6bed3 100644
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftFish.java
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftFish.java
@@ -1,65 +1,22 @@
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;
-
-import org.apache.commons.lang.Validate;
+import net.minecraft.server.EntityFish;
import org.bukkit.craftbukkit.CraftServer;
-import org.bukkit.entity.EntityType;
import org.bukkit.entity.Fish;
-import org.bukkit.projectiles.ProjectileSource;
-public class CraftFish extends AbstractProjectile implements Fish {
- private double biteChance = -1;
+public class CraftFish extends CraftCreature implements Fish {
- public CraftFish(CraftServer server, EntityFishingHook entity) {
+ public CraftFish(CraftServer server, EntityFish entity) {
super(server, entity);
}
- public ProjectileSource getShooter() {
- if (getHandle().owner != null) {
- return getHandle().owner.getBukkitEntity();
- }
-
- return null;
- }
-
- public void setShooter(ProjectileSource shooter) {
- if (shooter instanceof CraftHumanEntity) {
- getHandle().owner = (EntityHuman) ((CraftHumanEntity) shooter).entity;
- }
- }
-
@Override
- public EntityFishingHook getHandle() {
- return (EntityFishingHook) entity;
+ public EntityFish getHandle() {
+ return (EntityFish) entity;
}
@Override
public String toString() {
return "CraftFish";
}
-
- public EntityType getType() {
- return EntityType.FISHING_HOOK;
- }
-
- public double getBiteChance() {
- EntityFishingHook hook = getHandle();
-
- if (this.biteChance == -1) {
- 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;
- }
- return this.biteChance;
- }
-
- public void setBiteChance(double chance) {
- Validate.isTrue(chance >= 0 && chance <= 1, "The bite chance must be between 0 and 1.");
- this.biteChance = chance;
- }
}
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftFishHook.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftFishHook.java
new file mode 100644
index 00000000..8392b16b
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftFishHook.java
@@ -0,0 +1,65 @@
+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;
+
+import org.apache.commons.lang.Validate;
+import org.bukkit.craftbukkit.CraftServer;
+import org.bukkit.entity.EntityType;
+import org.bukkit.entity.FishHook;
+import org.bukkit.projectiles.ProjectileSource;
+
+public class CraftFishHook extends AbstractProjectile implements FishHook {
+ private double biteChance = -1;
+
+ public CraftFishHook(CraftServer server, EntityFishingHook entity) {
+ super(server, entity);
+ }
+
+ public ProjectileSource getShooter() {
+ if (getHandle().owner != null) {
+ return getHandle().owner.getBukkitEntity();
+ }
+
+ return null;
+ }
+
+ public void setShooter(ProjectileSource shooter) {
+ if (shooter instanceof CraftHumanEntity) {
+ getHandle().owner = (EntityHuman) ((CraftHumanEntity) shooter).entity;
+ }
+ }
+
+ @Override
+ public EntityFishingHook getHandle() {
+ return (EntityFishingHook) entity;
+ }
+
+ @Override
+ public String toString() {
+ return "CraftFishingHook";
+ }
+
+ public EntityType getType() {
+ return EntityType.FISHING_HOOK;
+ }
+
+ public double getBiteChance() {
+ EntityFishingHook hook = getHandle();
+
+ if (this.biteChance == -1) {
+ 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;
+ }
+ return this.biteChance;
+ }
+
+ public void setBiteChance(double chance) {
+ Validate.isTrue(chance >= 0 && chance <= 1, "The bite chance must be between 0 and 1.");
+ this.biteChance = chance;
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftHumanEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftHumanEntity.java
index a54548f0..269bbd8e 100644
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftHumanEntity.java
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftHumanEntity.java
@@ -48,10 +48,6 @@ public class CraftHumanEntity extends CraftLivingEntity implements HumanEntity {
enderChest = new CraftInventory(entity.getEnderChest());
}
- public String getName() {
- return getHandle().getName();
- }
-
public PlayerInventory getInventory() {
return inventory;
}
@@ -295,7 +291,7 @@ public class CraftHumanEntity extends CraftLivingEntity implements HumanEntity {
public InventoryView openWorkbench(Location location, boolean force) {
if (!force) {
Block block = location.getBlock();
- if (block.getType() != Material.WORKBENCH) {
+ if (block.getType() != Material.CRAFTING_TABLE) {
return null;
}
}
@@ -312,7 +308,7 @@ public class CraftHumanEntity extends CraftLivingEntity implements HumanEntity {
public InventoryView openEnchanting(Location location, boolean force) {
if (!force) {
Block block = location.getBlock();
- if (block.getType() != Material.ENCHANTMENT_TABLE) {
+ if (block.getType() != Material.ENCHANTING_TABLE) {
return null;
}
}
@@ -325,7 +321,7 @@ public class CraftHumanEntity extends CraftLivingEntity implements HumanEntity {
TileEntity container = getHandle().world.getTileEntity(pos);
if (container == null && force) {
container = new TileEntityEnchantTable();
- container.a(getHandle().world);
+ container.setWorld(getHandle().world);
container.setPosition(pos);
}
getHandle().openTileEntity((ITileEntityContainer) container);
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java
index bf4428e1..0b12ed81 100644
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java
@@ -27,6 +27,7 @@ import net.minecraft.server.EntitySnowball;
import net.minecraft.server.EntityThrownExpBottle;
import net.minecraft.server.EntityTippedArrow;
import net.minecraft.server.EntitySpectralArrow;
+import net.minecraft.server.EntityThrownTrident;
import net.minecraft.server.EntityWither;
import net.minecraft.server.EntityWitherSkull;
import net.minecraft.server.GenericAttributes;
@@ -65,6 +66,7 @@ import org.bukkit.entity.SpectralArrow;
import org.bukkit.entity.ThrownExpBottle;
import org.bukkit.entity.ThrownPotion;
import org.bukkit.entity.TippedArrow;
+import org.bukkit.entity.Trident;
import org.bukkit.entity.WitherSkull;
import org.bukkit.event.player.PlayerTeleportEvent;
import org.bukkit.inventory.EntityEquipment;
@@ -318,6 +320,8 @@ public class CraftLivingEntity extends CraftEntity implements LivingEntity {
((EntityTippedArrow) launch).setType(CraftPotionUtil.fromBukkit(new PotionData(PotionType.WATER, false, false)));
} else if (SpectralArrow.class.isAssignableFrom(projectile)) {
launch = new EntitySpectralArrow(world, getHandle());
+ } else if (Trident.class.isAssignableFrom(projectile)) {
+ launch = new EntityThrownTrident(world, getHandle(), net.minecraft.server.ItemStack.a);
} else {
launch = new EntityTippedArrow(world, getHandle());
}
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftMinecart.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftMinecart.java
index 48599877..7d319812 100644
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftMinecart.java
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftMinecart.java
@@ -4,7 +4,9 @@ import net.minecraft.server.Blocks;
import net.minecraft.server.EntityMinecartAbstract;
import net.minecraft.server.IBlockData;
+import org.bukkit.block.data.BlockData;
import org.bukkit.craftbukkit.CraftServer;
+import org.bukkit.craftbukkit.block.data.CraftBlockData;
import org.bukkit.craftbukkit.util.CraftMagicNumbers;
import org.bukkit.entity.Minecart;
import org.bukkit.material.MaterialData;
@@ -64,7 +66,19 @@ public abstract class CraftMinecart extends CraftVehicle implements Minecart {
public void setDisplayBlock(MaterialData material) {
if(material != null) {
- IBlockData block = CraftMagicNumbers.getBlock(material.getItemTypeId()).fromLegacyData(material.getData());
+ IBlockData block = CraftMagicNumbers.getBlock(material);
+ this.getHandle().setDisplayBlock(block);
+ } else {
+ // Set block to air (default) and set the flag to not have a display block.
+ this.getHandle().setDisplayBlock(Blocks.AIR.getBlockData());
+ this.getHandle().a(false);
+ }
+ }
+
+ @Override
+ public void setDisplayBlockData(BlockData blockData) {
+ if (blockData != null) {
+ IBlockData block = ((CraftBlockData) blockData).getState();
this.getHandle().setDisplayBlock(block);
} else {
// Set block to air (default) and set the flag to not have a display block.
@@ -75,7 +89,13 @@ public abstract class CraftMinecart extends CraftVehicle implements Minecart {
public MaterialData getDisplayBlock() {
IBlockData blockData = getHandle().getDisplayBlock();
- return CraftMagicNumbers.getMaterial(blockData.getBlock()).getNewData((byte) blockData.getBlock().toLegacyData(blockData));
+ return CraftMagicNumbers.getMaterial(blockData);
+ }
+
+ @Override
+ public BlockData getDisplayBlockData() {
+ IBlockData blockData = getHandle().getDisplayBlock();
+ return CraftBlockData.fromData(blockData);
}
public void setDisplayBlockOffset(int offset) {
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftMinecartCommand.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftMinecartCommand.java
index 58f3cf78..b178acd4 100644
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftMinecartCommand.java
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftMinecartCommand.java
@@ -7,6 +7,7 @@ import net.minecraft.server.EntityMinecartCommandBlock;
import org.bukkit.Bukkit;
import org.bukkit.Server;
import org.bukkit.craftbukkit.CraftServer;
+import org.bukkit.craftbukkit.util.CraftChatMessage;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.minecart.CommandMinecart;
import org.bukkit.permissions.PermissibleBase;
@@ -40,7 +41,7 @@ public class CraftMinecartCommand extends CraftMinecart implements CommandMineca
@Override
public void setName(String name) {
- getHandle().getCommandBlock().setName(name != null ? name : "@");
+ getHandle().getCommandBlock().setName(CraftChatMessage.fromStringOrNull(name));
}
@Override
@@ -63,7 +64,7 @@ public class CraftMinecartCommand extends CraftMinecart implements CommandMineca
@Override
public String getName() {
- return getHandle().getCommandBlock().getName();
+ return CraftChatMessage.fromComponent(getHandle().getCommandBlock().getName());
}
@Override
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPainting.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPainting.java
index 3e9448a9..9c29a56d 100644
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPainting.java
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPainting.java
@@ -1,7 +1,7 @@
package org.bukkit.craftbukkit.entity;
import net.minecraft.server.EntityPainting;
-import net.minecraft.server.EntityPainting.EnumArt;
+import net.minecraft.server.Paintings;
import net.minecraft.server.WorldServer;
import org.bukkit.Art;
@@ -19,7 +19,7 @@ public class CraftPainting extends CraftHanging implements Painting {
}
public Art getArt() {
- EnumArt art = getHandle().art;
+ Paintings art = getHandle().art;
return CraftArt.NotchToBukkit(art);
}
@@ -29,7 +29,7 @@ public class CraftPainting extends CraftHanging implements Painting {
public boolean setArt(Art art, boolean force) {
EntityPainting painting = this.getHandle();
- EnumArt oldArt = painting.art;
+ Paintings oldArt = painting.art;
painting.art = CraftArt.BukkitToNotch(art);
painting.setDirection(painting.direction);
if (!force && !painting.survives()) {
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPhantom.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPhantom.java
new file mode 100644
index 00000000..9f9ee923
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPhantom.java
@@ -0,0 +1,38 @@
+package org.bukkit.craftbukkit.entity;
+
+import net.minecraft.server.EntityPhantom;
+import org.bukkit.craftbukkit.CraftServer;
+import org.bukkit.entity.EntityType;
+import org.bukkit.entity.Phantom;
+
+public class CraftPhantom extends CraftFlying implements Phantom {
+
+ public CraftPhantom(CraftServer server, EntityPhantom entity) {
+ super(server, entity);
+ }
+
+ @Override
+ public EntityPhantom getHandle() {
+ return (EntityPhantom) super.getHandle();
+ }
+
+ @Override
+ public int getSize() {
+ return getHandle().getSize();
+ }
+
+ @Override
+ public void setSize(int sz) {
+ getHandle().setSize(sz);
+ }
+
+ @Override
+ public String toString() {
+ return "CraftPhantom";
+ }
+
+ @Override
+ public EntityType getType() {
+ return EntityType.PHANTOM;
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
index 4c44a198..042287e4 100644
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
@@ -24,8 +24,46 @@ import java.util.WeakHashMap;
import java.util.logging.Level;
import java.util.logging.Logger;
-import net.minecraft.server.*;
-import net.minecraft.server.PacketPlayOutTitle.EnumTitleAction;
+import net.minecraft.server.AdvancementDataPlayer;
+import net.minecraft.server.AdvancementProgress;
+import net.minecraft.server.AttributeInstance;
+import net.minecraft.server.AttributeMapServer;
+import net.minecraft.server.AttributeModifiable;
+import net.minecraft.server.AttributeRanged;
+import net.minecraft.server.BlockPosition;
+import net.minecraft.server.Container;
+import net.minecraft.server.Entity;
+import net.minecraft.server.EntityHuman;
+import net.minecraft.server.EntityLiving;
+import net.minecraft.server.EntityPlayer;
+import net.minecraft.server.EntityTracker;
+import net.minecraft.server.EntityTrackerEntry;
+import net.minecraft.server.EnumChatFormat;
+import net.minecraft.server.EnumGamemode;
+import net.minecraft.server.IChatBaseComponent;
+import net.minecraft.server.MapIcon;
+import net.minecraft.server.MinecraftKey;
+import net.minecraft.server.NBTTagCompound;
+import net.minecraft.server.PacketDataSerializer;
+import net.minecraft.server.PacketPlayOutBlockChange;
+import net.minecraft.server.PacketPlayOutChat;
+import net.minecraft.server.PacketPlayOutCustomPayload;
+import net.minecraft.server.PacketPlayOutCustomSoundEffect;
+import net.minecraft.server.PacketPlayOutMap;
+import net.minecraft.server.PacketPlayOutNamedSoundEffect;
+import net.minecraft.server.PacketPlayOutPlayerInfo;
+import net.minecraft.server.PacketPlayOutSpawnPosition;
+import net.minecraft.server.PacketPlayOutStopSound;
+import net.minecraft.server.PacketPlayOutTitle;
+import net.minecraft.server.PacketPlayOutUpdateAttributes;
+import net.minecraft.server.PacketPlayOutUpdateHealth;
+import net.minecraft.server.PacketPlayOutWorldEvent;
+import net.minecraft.server.PacketPlayOutWorldParticles;
+import net.minecraft.server.PlayerConnection;
+import net.minecraft.server.TileEntitySign;
+import net.minecraft.server.Vec3D;
+import net.minecraft.server.WhiteListEntry;
+import net.minecraft.server.WorldServer;
import org.apache.commons.lang.Validate;
import org.apache.commons.lang.NotImplementedException;
@@ -36,12 +74,14 @@ import org.bukkit.Statistic;
import org.bukkit.Material;
import org.bukkit.Statistic.Type;
import org.bukkit.World;
+import org.bukkit.block.data.BlockData;
import org.bukkit.configuration.serialization.DelegateDeserialization;
import org.bukkit.conversations.Conversation;
import org.bukkit.conversations.ConversationAbandonedEvent;
import org.bukkit.conversations.ManuallyAbandonedConversationCanceller;
import org.bukkit.craftbukkit.CraftParticle;
import org.bukkit.craftbukkit.block.CraftSign;
+import org.bukkit.craftbukkit.block.data.CraftBlockData;
import org.bukkit.craftbukkit.conversations.ConversationTracker;
import org.bukkit.craftbukkit.CraftEffect;
import org.bukkit.craftbukkit.CraftOfflinePlayer;
@@ -58,7 +98,6 @@ import org.bukkit.craftbukkit.util.CraftChatMessage;
import org.bukkit.craftbukkit.util.CraftMagicNumbers;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.Player;
-import org.bukkit.event.player.PlayerGameModeChangeEvent;
import org.bukkit.event.player.PlayerRegisterChannelEvent;
import org.bukkit.event.player.PlayerTeleportEvent;
import org.bukkit.event.player.PlayerUnregisterChannelEvent;
@@ -66,7 +105,6 @@ 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.IllegalPluginAccessException;
import org.bukkit.plugin.Plugin;
import org.bukkit.plugin.messaging.StandardMessenger;
import org.bukkit.scoreboard.Scoreboard;
@@ -182,7 +220,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
if (name == null) {
name = getName();
}
- getHandle().listName = name.equals(getName()) ? null : CraftChatMessage.fromString(name)[0];
+ getHandle().listName = name.equals(getName()) ? null : CraftChatMessage.fromStringOrNull(name);
for (EntityPlayer player : (List<EntityPlayer>)server.getHandle().players) {
if (player.getBukkitEntity().canSee(this)) {
player.playerConnection.sendPacket(new PacketPlayOutPlayerInfo(PacketPlayOutPlayerInfo.EnumPlayerInfoAction.UPDATE_DISPLAY_NAME, getHandle()));
@@ -347,7 +385,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
public void playSound(Location loc, String sound, org.bukkit.SoundCategory category, float volume, float pitch) {
if (loc == null || sound == null || category == null || getHandle().playerConnection == null) return;
- PacketPlayOutCustomSoundEffect packet = new PacketPlayOutCustomSoundEffect(sound, net.minecraft.server.SoundCategory.valueOf(category.name()), loc.getX(), loc.getY(), loc.getZ(), volume, pitch);
+ PacketPlayOutCustomSoundEffect packet = new PacketPlayOutCustomSoundEffect(new MinecraftKey(sound), net.minecraft.server.SoundCategory.valueOf(category.name()), new Vec3D(loc.getX(), loc.getY(), loc.getZ()), volume, pitch);
getHandle().playerConnection.sendPacket(packet);
}
@@ -369,11 +407,8 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
@Override
public void stopSound(String sound, org.bukkit.SoundCategory category) {
if (getHandle().playerConnection == null) return;
- PacketDataSerializer packetdataserializer = new PacketDataSerializer(Unpooled.buffer());
- packetdataserializer.a(category == null ? "" : net.minecraft.server.SoundCategory.valueOf(category.name()).a());
- packetdataserializer.a(sound);
- getHandle().playerConnection.sendPacket(new PacketPlayOutCustomPayload("MC|StopSound", packetdataserializer));
+ getHandle().playerConnection.sendPacket(new PacketPlayOutStopSound(new MinecraftKey(sound), category == null ? net.minecraft.server.SoundCategory.MASTER : net.minecraft.server.SoundCategory.valueOf(category.name())));
}
@Override
@@ -399,16 +434,21 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
@Override
public void sendBlockChange(Location loc, Material material, byte data) {
- sendBlockChange(loc, material.getId(), data);
+ if (getHandle().playerConnection == null) return;
+
+ PacketPlayOutBlockChange packet = new PacketPlayOutBlockChange(((CraftWorld) loc.getWorld()).getHandle(), new BlockPosition(loc.getBlockX(), loc.getBlockY(), loc.getBlockZ()));
+
+ packet.block = CraftMagicNumbers.getBlock(material, data);
+ getHandle().playerConnection.sendPacket(packet);
}
@Override
- public void sendBlockChange(Location loc, int material, byte data) {
+ public void sendBlockChange(Location loc, BlockData block) {
if (getHandle().playerConnection == null) return;
PacketPlayOutBlockChange packet = new PacketPlayOutBlockChange(((CraftWorld) loc.getWorld()).getHandle(), new BlockPosition(loc.getBlockX(), loc.getBlockY(), loc.getBlockZ()));
- packet.block = CraftMagicNumbers.getBlock(material).fromLegacyData(data);
+ packet.block = ((CraftBlockData) block).getState();
getHandle().playerConnection.sendPacket(packet);
}
@@ -477,7 +517,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
Collection<MapIcon> icons = new ArrayList<MapIcon>();
for (MapCursor cursor : data.cursors) {
if (cursor.isVisible()) {
- icons.add(new MapIcon(MapIcon.Type.a(cursor.getRawType()), cursor.getX(), cursor.getY(), cursor.getDirection()));
+ icons.add(new MapIcon(MapIcon.Type.a(cursor.getRawType()), cursor.getX(), cursor.getY(), cursor.getDirection(), CraftChatMessage.fromStringOrNull(cursor.getCaption())));
}
}
@@ -783,9 +823,9 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
@Override
public void setWhitelisted(boolean value) {
if (value) {
- server.getHandle().addWhitelist(getProfile());
+ server.getHandle().getWhitelist().add(new WhiteListEntry(getProfile()));
} else {
- server.getHandle().removeWhitelist(getProfile());
+ server.getHandle().getWhitelist().remove(getProfile());
}
}
@@ -1129,7 +1169,8 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
if (getHandle().playerConnection == null) return;
if (channels.contains(channel)) {
- PacketPlayOutCustomPayload packet = new PacketPlayOutCustomPayload(channel, new PacketDataSerializer(Unpooled.wrappedBuffer(message)));
+ channel = StandardMessenger.validateAndCorrectChannel(channel);
+ PacketPlayOutCustomPayload packet = new PacketPlayOutCustomPayload(new MinecraftKey(channel), new PacketDataSerializer(Unpooled.wrappedBuffer(message)));
getHandle().playerConnection.sendPacket(packet);
}
}
@@ -1156,12 +1197,14 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
}
public void addChannel(String channel) {
+ channel = StandardMessenger.validateAndCorrectChannel(channel);
if (channels.add(channel)) {
server.getPluginManager().callEvent(new PlayerRegisterChannelEvent(this, channel));
}
}
public void removeChannel(String channel) {
+ channel = StandardMessenger.validateAndCorrectChannel(channel);
if (channels.remove(channel)) {
server.getPluginManager().callEvent(new PlayerUnregisterChannelEvent(this, channel));
}
@@ -1188,7 +1231,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
}
}
- getHandle().playerConnection.sendPacket(new PacketPlayOutCustomPayload("REGISTER", new PacketDataSerializer(Unpooled.wrappedBuffer(stream.toByteArray()))));
+ getHandle().playerConnection.sendPacket(new PacketPlayOutCustomPayload(new MinecraftKey("register"), new PacketDataSerializer(Unpooled.wrappedBuffer(stream.toByteArray()))));
}
}
@@ -1290,7 +1333,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
@Override
public float getFlySpeed() {
- return getHandle().abilities.flySpeed * 2f;
+ return (float) getHandle().abilities.flySpeed * 2f;
}
@Override
@@ -1436,19 +1479,19 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
getHandle().playerConnection.sendPacket(times);
if (title != null) {
- PacketPlayOutTitle packetTitle = new PacketPlayOutTitle(EnumTitleAction.TITLE, CraftChatMessage.fromString(title)[0]);
+ PacketPlayOutTitle packetTitle = new PacketPlayOutTitle(PacketPlayOutTitle.EnumTitleAction.TITLE, CraftChatMessage.fromStringOrNull(title));
getHandle().playerConnection.sendPacket(packetTitle);
}
if (subtitle != null) {
- PacketPlayOutTitle packetSubtitle = new PacketPlayOutTitle(EnumTitleAction.SUBTITLE, CraftChatMessage.fromString(subtitle)[0]);
+ PacketPlayOutTitle packetSubtitle = new PacketPlayOutTitle(PacketPlayOutTitle.EnumTitleAction.SUBTITLE, CraftChatMessage.fromStringOrNull(subtitle));
getHandle().playerConnection.sendPacket(packetSubtitle);
}
}
@Override
public void resetTitle() {
- PacketPlayOutTitle packetReset = new PacketPlayOutTitle(EnumTitleAction.RESET, null);
+ PacketPlayOutTitle packetReset = new PacketPlayOutTitle(PacketPlayOutTitle.EnumTitleAction.RESET, null);
getHandle().playerConnection.sendPacket(packetReset);
}
@@ -1512,7 +1555,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
if (data != null && !particle.getDataType().isInstance(data)) {
throw new IllegalArgumentException("data should be " + particle.getDataType() + " got " + data.getClass());
}
- PacketPlayOutWorldParticles packetplayoutworldparticles = new PacketPlayOutWorldParticles(CraftParticle.toNMS(particle), true, (float) x, (float) y, (float) z, (float) offsetX, (float) offsetY, (float) offsetZ, (float) extra, count, CraftParticle.toData(particle, data));
+ PacketPlayOutWorldParticles packetplayoutworldparticles = new PacketPlayOutWorldParticles(CraftParticle.toNMS(particle, data), true, (float) x, (float) y, (float) z, (float) offsetX, (float) offsetY, (float) offsetZ, (float) extra, count);
getHandle().playerConnection.sendPacket(packetplayoutworldparticles);
}
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftProjectile.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftProjectile.java
index 6cf74ce8..335acc24 100644
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftProjectile.java
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftProjectile.java
@@ -19,12 +19,10 @@ public abstract class CraftProjectile extends AbstractProjectile implements Proj
public void setShooter(ProjectileSource shooter) {
if (shooter instanceof CraftLivingEntity) {
getHandle().shooter = (EntityLiving) ((CraftLivingEntity) shooter).entity;
- if (shooter instanceof CraftHumanEntity) {
- getHandle().shooterName = ((CraftHumanEntity) shooter).getName();
- }
+ getHandle().shooterId = ((CraftLivingEntity) shooter).getUniqueId();
} else {
getHandle().shooter = null;
- getHandle().shooterName = null;
+ getHandle().shooterId = null;
}
getHandle().projectileSource = shooter;
}
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPufferFish.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPufferFish.java
new file mode 100644
index 00000000..2701de75
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPufferFish.java
@@ -0,0 +1,38 @@
+package org.bukkit.craftbukkit.entity;
+
+import net.minecraft.server.EntityPufferFish;
+import org.bukkit.craftbukkit.CraftServer;
+import org.bukkit.entity.PufferFish;
+import org.bukkit.entity.EntityType;
+
+public class CraftPufferFish extends CraftFish implements PufferFish {
+
+ public CraftPufferFish(CraftServer server, EntityPufferFish entity) {
+ super(server, entity);
+ }
+
+ @Override
+ public EntityPufferFish getHandle() {
+ return (EntityPufferFish) super.getHandle();
+ }
+
+ @Override
+ public int getPuffState() {
+ return getHandle().getPuffState();
+ }
+
+ @Override
+ public void setPuffState(int state) {
+ getHandle().setPuffState(state);
+ }
+
+ @Override
+ public String toString() {
+ return "CraftPufferFish";
+ }
+
+ @Override
+ public EntityType getType() {
+ return EntityType.PUFFERFISH;
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftSalmon.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftSalmon.java
new file mode 100644
index 00000000..4d91f576
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftSalmon.java
@@ -0,0 +1,28 @@
+package org.bukkit.craftbukkit.entity;
+
+import net.minecraft.server.EntitySalmon;
+import org.bukkit.craftbukkit.CraftServer;
+import org.bukkit.entity.Salmon;
+import org.bukkit.entity.EntityType;
+
+public class CraftSalmon extends CraftFish implements Salmon {
+
+ public CraftSalmon(CraftServer server, EntitySalmon entity) {
+ super(server, entity);
+ }
+
+ @Override
+ public EntitySalmon getHandle() {
+ return (EntitySalmon) super.getHandle();
+ }
+
+ @Override
+ public String toString() {
+ return "CraftSalmon";
+ }
+
+ @Override
+ public EntityType getType() {
+ return EntityType.SALMON;
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftTrident.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftTrident.java
new file mode 100644
index 00000000..0518e6c6
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftTrident.java
@@ -0,0 +1,28 @@
+package org.bukkit.craftbukkit.entity;
+
+import net.minecraft.server.EntityThrownTrident;
+import org.bukkit.craftbukkit.CraftServer;
+import org.bukkit.entity.EntityType;
+import org.bukkit.entity.Trident;
+
+public class CraftTrident extends CraftArrow implements Trident {
+
+ public CraftTrident(CraftServer server, EntityThrownTrident entity) {
+ super(server, entity);
+ }
+
+ @Override
+ public EntityThrownTrident getHandle() {
+ return (EntityThrownTrident) super.getHandle();
+ }
+
+ @Override
+ public String toString() {
+ return "CraftTrident";
+ }
+
+ @Override
+ public EntityType getType() {
+ return EntityType.TRIDENT;
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftTropicalFish.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftTropicalFish.java
new file mode 100644
index 00000000..42d1d4de
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftTropicalFish.java
@@ -0,0 +1,111 @@
+package org.bukkit.craftbukkit.entity;
+
+import java.util.HashMap;
+import java.util.Map;
+import net.minecraft.server.EntityTropicalFish;
+import org.bukkit.DyeColor;
+import org.bukkit.craftbukkit.CraftServer;
+import org.bukkit.entity.TropicalFish;
+
+public class CraftTropicalFish extends CraftFish implements TropicalFish {
+
+ public CraftTropicalFish(CraftServer server, EntityTropicalFish entity) {
+ super(server, entity);
+ }
+
+ @Override
+ public EntityTropicalFish getHandle() {
+ return (EntityTropicalFish) entity;
+ }
+
+ @Override
+ public String toString() {
+ return "CraftTropicalFish";
+ }
+
+ @Override
+ public DyeColor getPatternColor() {
+ return getPatternColor(getHandle().getVariant());
+ }
+
+ @Override
+ public void setPatternColor(DyeColor color) {
+ getHandle().setVariant(getData(color, getBodyColor(), getPattern()));
+ }
+
+ @Override
+ public DyeColor getBodyColor() {
+ return getBodyColor(getHandle().getVariant());
+ }
+
+ @Override
+ public void setBodyColor(DyeColor color) {
+ getHandle().setVariant(getData(getPatternColor(), color, getPattern()));
+ }
+
+ @Override
+ public Pattern getPattern() {
+ return getPattern(getHandle().getVariant());
+ }
+
+ @Override
+ public void setPattern(Pattern pattern) {
+ getHandle().setVariant(getData(getPatternColor(), getBodyColor(), pattern));
+ }
+
+ public static enum CraftPattern {
+ KOB(0, false),
+ SUNSTREAK(1, false),
+ SNOOPER(2, false),
+ DASHER(3, false),
+ BRINELY(4, false),
+ SPOTTY(5, false),
+ FLOPPER(0, true),
+ STRIPEY(1, true),
+ GLITTER(2, true),
+ BLOCKFISH(3, true),
+ BETTY(4, true),
+ CLAYFISH(5, true);
+
+ private final int variant;
+ private final boolean large;
+
+ //
+ private static final Map<Integer, Pattern> BY_DATA = new HashMap<>();
+
+ static {
+ for (CraftPattern type : values()) {
+ BY_DATA.put(type.getDataValue(), Pattern.values()[type.ordinal()]);
+ }
+ }
+
+ public static Pattern fromData(int data) {
+ return BY_DATA.get(data);
+ }
+
+ private CraftPattern(int variant, boolean large) {
+ this.variant = variant;
+ this.large = large;
+ }
+
+ public int getDataValue() {
+ return variant << 8 | ((large) ? 1 : 0);
+ }
+ }
+
+ public static int getData(DyeColor patternColor, DyeColor bodyColor, Pattern type) {
+ return patternColor.getWoolData() << 24 | bodyColor.getWoolData() << 16 | CraftPattern.values()[type.ordinal()].getDataValue();
+ }
+
+ public static DyeColor getPatternColor(int data) {
+ return DyeColor.getByWoolData((byte) ((data >> 24) & 0xFF));
+ }
+
+ public static DyeColor getBodyColor(int data) {
+ return DyeColor.getByWoolData((byte) ((data >> 16) & 0xFF));
+ }
+
+ public static Pattern getPattern(int data) {
+ return CraftPattern.fromData(data & 0xFFFF);
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftTurtle.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftTurtle.java
new file mode 100644
index 00000000..123a2c75
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftTurtle.java
@@ -0,0 +1,28 @@
+package org.bukkit.craftbukkit.entity;
+
+import net.minecraft.server.EntityTurtle;
+import org.bukkit.craftbukkit.CraftServer;
+import org.bukkit.entity.EntityType;
+import org.bukkit.entity.Turtle;
+
+public class CraftTurtle extends CraftAnimals implements Turtle {
+
+ public CraftTurtle(CraftServer server, EntityTurtle entity) {
+ super(server, entity);
+ }
+
+ @Override
+ public EntityTurtle getHandle() {
+ return (EntityTurtle) super.getHandle();
+ }
+
+ @Override
+ public String toString() {
+ return "CraftTurtle";
+ }
+
+ @Override
+ public EntityType getType() {
+ return EntityType.TURTLE;
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftVillager.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftVillager.java
index 503bd066..a6ee01ca 100644
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftVillager.java
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftVillager.java
@@ -51,7 +51,7 @@ public class CraftVillager extends CraftAgeable implements Villager, InventoryHo
@Override
public Career getCareer() {
- return getCareer(getProfession(), getHandle().bK);
+ return getCareer(getProfession(), getHandle().careerId);
}
@Override
@@ -62,15 +62,15 @@ public class CraftVillager extends CraftAgeable implements Villager, InventoryHo
@Override
public void setCareer(Career career, boolean resetTrades) {
if (career == null) {
- getHandle().bK = 0; // reset career
+ getHandle().careerId = 0; // reset career
} else {
Validate.isTrue(career.getProfession() == getProfession(), "Career assignment mismatch. Found (" + getProfession() + ") Required (" + career.getProfession() + ")");
- getHandle().bK = getCareerID(career);
+ getHandle().careerId = getCareerID(career);
}
if (resetTrades) {
getHandle().trades = null;
- getHandle().dx();
+ getHandle().populateTrades();
}
}
diff --git a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java
index c4bc628b..527af08c 100644
--- a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java
+++ b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java
@@ -361,21 +361,24 @@ public class CraftEventFactory {
/**
* BlockFadeEvent
*/
- public static BlockFadeEvent callBlockFadeEvent(Block block, net.minecraft.server.Block type) {
- BlockState state = block.getState();
- state.setTypeId(net.minecraft.server.Block.getId(type));
+ public static BlockFadeEvent callBlockFadeEvent(GeneratorAccess world, BlockPosition pos, IBlockData newBlock) {
+ CraftBlockState state = CraftBlockState.getBlockState(world, pos);
+ state.setData(newBlock);
- BlockFadeEvent event = new BlockFadeEvent(block, state);
+ BlockFadeEvent event = new BlockFadeEvent(state.getBlock(), state);
Bukkit.getPluginManager().callEvent(event);
return event;
}
- public static boolean handleBlockSpreadEvent(Block block, Block source, net.minecraft.server.Block type, int data) {
- BlockState state = block.getState();
- state.setTypeId(net.minecraft.server.Block.getId(type));
- state.setRawData((byte) data);
+ public static boolean handleBlockSpreadEvent(World world, BlockPosition source, BlockPosition target, IBlockData block) {
+ return handleBlockSpreadEvent(world, source, target, block, 2);
+ }
+
+ public static boolean handleBlockSpreadEvent(World world, BlockPosition source, BlockPosition target, IBlockData block, int flag) {
+ CraftBlockState state = CraftBlockState.getBlockState(world, target, flag);
+ state.setData(block);
- BlockSpreadEvent event = new BlockSpreadEvent(block, source, state);
+ BlockSpreadEvent event = new BlockSpreadEvent(world.getWorld().getBlockAt(target.getX(), target.getY(), target.getZ()), world.getWorld().getBlockAt(source.getX(), source.getY(), source.getZ()), state);
Bukkit.getPluginManager().callEvent(event);
if (!event.isCancelled()) {
@@ -558,6 +561,8 @@ public class CraftEventFactory {
cause = DamageCause.FLY_INTO_WALL;
} else if (source == DamageSource.CRAMMING) {
cause = DamageCause.CRAMMING;
+ } else if (source == DamageSource.DRYOUT) {
+ cause = DamageCause.DRYOUT;
} else if (source == DamageSource.GENERIC) {
cause = DamageCause.CUSTOM;
}
@@ -656,11 +661,14 @@ public class CraftEventFactory {
return event;
}
- public static boolean handleBlockGrowEvent(World world, int x, int y, int z, net.minecraft.server.Block type, int data) {
- Block block = world.getWorld().getBlockAt(x, y, z);
+ public static boolean handleBlockGrowEvent(World world, BlockPosition pos, IBlockData block) {
+ return handleBlockGrowEvent(world, pos, block, 3);
+ }
+
+ public static boolean handleBlockGrowEvent(World world, BlockPosition pos, IBlockData newData, int flag) {
+ Block block = world.getWorld().getBlockAt(pos.getX(), pos.getY(), pos.getZ());
CraftBlockState state = (CraftBlockState) block.getState();
- state.setTypeId(net.minecraft.server.Block.getId(type));
- state.setRawData((byte) data);
+ state.setData(newData);
BlockGrowEvent event = new BlockGrowEvent(block, state);
Bukkit.getPluginManager().callEvent(event);
@@ -690,33 +698,17 @@ public class CraftEventFactory {
return event;
}
- public static EntityChangeBlockEvent callEntityChangeBlockEvent(org.bukkit.entity.Entity entity, Block block, Material material) {
- return callEntityChangeBlockEvent(entity, block, material, 0);
- }
-
- public static EntityChangeBlockEvent callEntityChangeBlockEvent(Entity entity, Block block, Material material) {
- return callEntityChangeBlockEvent(entity.getBukkitEntity(), block, material, 0);
- }
-
- public static EntityChangeBlockEvent callEntityChangeBlockEvent(Entity entity, Block block, Material material, boolean cancelled) {
- return callEntityChangeBlockEvent(entity.getBukkitEntity(), block, material, 0, cancelled);
+ public static EntityChangeBlockEvent callEntityChangeBlockEvent(Entity entity, BlockPosition position, IBlockData newBlock) {
+ return callEntityChangeBlockEvent(entity, position, newBlock, false);
}
- public static EntityChangeBlockEvent callEntityChangeBlockEvent(Entity entity, BlockPosition position, net.minecraft.server.Block type, int data) {
+ public static EntityChangeBlockEvent callEntityChangeBlockEvent(Entity entity, BlockPosition position, IBlockData newBlock, boolean cancelled) {
Block block = entity.world.getWorld().getBlockAt(position.getX(), position.getY(), position.getZ());
- Material material = CraftMagicNumbers.getMaterial(type);
-
- return callEntityChangeBlockEvent(entity.getBukkitEntity(), block, material, data);
- }
+ Material material = CraftMagicNumbers.getMaterial(newBlock).getItemType();
- public static EntityChangeBlockEvent callEntityChangeBlockEvent(org.bukkit.entity.Entity entity, Block block, Material material, int data) {
- return callEntityChangeBlockEvent(entity, block, material, data, false);
- }
-
- public static EntityChangeBlockEvent callEntityChangeBlockEvent(org.bukkit.entity.Entity entity, Block block, Material material, int data, boolean cancelled) {
- EntityChangeBlockEvent event = new EntityChangeBlockEvent(entity, block, material, (byte) data);
+ EntityChangeBlockEvent event = new EntityChangeBlockEvent(entity.getBukkitEntity(), block, material, (byte) 0);
event.setCancelled(cancelled);
- entity.getServer().getPluginManager().callEvent(event);
+ event.getEntity().getServer().getPluginManager().callEvent(event);
return event;
}
@@ -773,8 +765,8 @@ public class CraftEventFactory {
return container;
}
- public static ItemStack callPreCraftEvent(InventoryCrafting matrix, ItemStack result, InventoryView lastCraftView, boolean isRepair) {
- CraftInventoryCrafting inventory = new CraftInventoryCrafting(matrix, matrix.resultInventory);
+ public static ItemStack callPreCraftEvent(IInventory matrix, IInventory resultInventory, ItemStack result, InventoryView lastCraftView, boolean isRepair) {
+ CraftInventoryCrafting inventory = new CraftInventoryCrafting(matrix, resultInventory);
inventory.setResult(CraftItemStack.asCraftMirror(result));
PrepareItemCraftEvent event = new PrepareItemCraftEvent(inventory, lastCraftView, isRepair);
@@ -811,14 +803,14 @@ public class CraftEventFactory {
return event;
}
- public static BlockRedstoneEvent callRedstoneChange(World world, int x, int y, int z, int oldCurrent, int newCurrent) {
- BlockRedstoneEvent event = new BlockRedstoneEvent(world.getWorld().getBlockAt(x, y, z), oldCurrent, newCurrent);
+ public static BlockRedstoneEvent callRedstoneChange(World world, BlockPosition pos, int oldCurrent, int newCurrent) {
+ BlockRedstoneEvent event = new BlockRedstoneEvent(world.getWorld().getBlockAt(pos.getX(), pos.getY(), pos.getZ()), oldCurrent, newCurrent);
world.getServer().getPluginManager().callEvent(event);
return event;
}
- public static NotePlayEvent callNotePlayEvent(World world, int x, int y, int z, byte instrument, byte note) {
- NotePlayEvent event = new NotePlayEvent(world.getWorld().getBlockAt(x, y, z), org.bukkit.Instrument.getByType(instrument), new org.bukkit.Note(note));
+ public static NotePlayEvent callNotePlayEvent(World world, BlockPosition pos, BlockPropertyInstrument instrument, int note) {
+ NotePlayEvent event = new NotePlayEvent(world.getWorld().getBlockAt(pos.getX(), pos.getY(), pos.getZ()), org.bukkit.Instrument.getByType((byte) instrument.ordinal()), new org.bukkit.Note(note));
world.getServer().getPluginManager().callEvent(event);
return event;
}
@@ -829,13 +821,12 @@ public class CraftEventFactory {
Bukkit.getPluginManager().callEvent(event);
}
- public static BlockIgniteEvent callBlockIgniteEvent(World world, int x, int y, int z, int igniterX, int igniterY, int igniterZ) {
+ public static BlockIgniteEvent callBlockIgniteEvent(World world, BlockPosition block, BlockPosition source) {
org.bukkit.World bukkitWorld = world.getWorld();
- Block igniter = bukkitWorld.getBlockAt(igniterX, igniterY, igniterZ);
+ Block igniter = bukkitWorld.getBlockAt(source.getX(), source.getY(), source.getZ());
IgniteCause cause;
switch (igniter.getType()) {
case LAVA:
- case STATIONARY_LAVA:
cause = IgniteCause.LAVA;
break;
case DISPENSER:
@@ -846,12 +837,12 @@ public class CraftEventFactory {
cause = IgniteCause.SPREAD;
}
- BlockIgniteEvent event = new BlockIgniteEvent(bukkitWorld.getBlockAt(x, y, z), cause, igniter);
+ BlockIgniteEvent event = new BlockIgniteEvent(bukkitWorld.getBlockAt(block.getX(), block.getY(), block.getZ()), cause, igniter);
world.getServer().getPluginManager().callEvent(event);
return event;
}
- public static BlockIgniteEvent callBlockIgniteEvent(World world, int x, int y, int z, Entity igniter) {
+ public static BlockIgniteEvent callBlockIgniteEvent(World world, BlockPosition pos, Entity igniter) {
org.bukkit.World bukkitWorld = world.getWorld();
org.bukkit.entity.Entity bukkitIgniter = igniter.getBukkitEntity();
IgniteCause cause;
@@ -870,7 +861,7 @@ public class CraftEventFactory {
cause = IgniteCause.FLINT_AND_STEEL;
}
- BlockIgniteEvent event = new BlockIgniteEvent(bukkitWorld.getBlockAt(x, y, z), cause, bukkitIgniter);
+ BlockIgniteEvent event = new BlockIgniteEvent(bukkitWorld.getBlockAt(pos.getX(), pos.getY(), pos.getZ()), cause, bukkitIgniter);
world.getServer().getPluginManager().callEvent(event);
return event;
}
@@ -884,8 +875,8 @@ public class CraftEventFactory {
return event;
}
- public static BlockIgniteEvent callBlockIgniteEvent(World world, int x, int y, int z, IgniteCause cause, Entity igniter) {
- BlockIgniteEvent event = new BlockIgniteEvent(world.getWorld().getBlockAt(x, y, z), cause, igniter.getBukkitEntity());
+ public static BlockIgniteEvent callBlockIgniteEvent(World world, BlockPosition pos, IgniteCause cause, Entity igniter) {
+ BlockIgniteEvent event = new BlockIgniteEvent(world.getWorld().getBlockAt(pos.getX(), pos.getY(), pos.getZ()), cause, igniter.getBukkitEntity());
world.getServer().getPluginManager().callEvent(event);
return event;
}
@@ -932,7 +923,7 @@ public class CraftEventFactory {
c.setChatModifier(modi);
if (c instanceof ChatMessage) {
ChatMessage cm = (ChatMessage) c;
- Object[] oo = cm.j();
+ Object[] oo = cm.i();
for (int i = 0; i < oo.length; i++) {
Object o = oo[i];
if (o instanceof IChatBaseComponent) {
@@ -961,7 +952,7 @@ public class CraftEventFactory {
return event;
}
- public static Cancellable handleStatisticsIncrease(EntityHuman entityHuman, net.minecraft.server.Statistic statistic, int current, int incrementation) {
+ public static Cancellable handleStatisticsIncrease(EntityHuman entityHuman, net.minecraft.server.Statistic<?> statistic, int current, int incrementation) {
Player player = ((EntityPlayer) entityHuman).getBukkitEntity();
Event event;
if (true) {
@@ -974,12 +965,13 @@ public class CraftEventFactory {
case FALL_ONE_CM:
case BOAT_ONE_CM:
case CLIMB_ONE_CM:
- case DIVE_ONE_CM:
+ case WALK_ON_WATER_ONE_CM:
+ case WALK_UNDER_WATER_ONE_CM:
case FLY_ONE_CM:
case HORSE_ONE_CM:
case MINECART_ONE_CM:
case PIG_ONE_CM:
- case PLAY_ONE_TICK:
+ case PLAY_ONE_MINUTE:
case SWIM_ONE_CM:
case WALK_ONE_CM:
case SPRINT_ONE_CM:
@@ -993,7 +985,7 @@ public class CraftEventFactory {
if (stat.getType() == Type.UNTYPED) {
event = new PlayerStatisticIncrementEvent(player, stat, current, current + incrementation);
} else if (stat.getType() == Type.ENTITY) {
- EntityType entityType = CraftStatistic.getEntityTypeFromStatistic(statistic);
+ EntityType entityType = CraftStatistic.getEntityTypeFromStatistic((net.minecraft.server.Statistic<EntityTypes<?>>) statistic);
event = new PlayerStatisticIncrementEvent(player, stat, current, current + incrementation, entityType);
} else {
Material material = CraftStatistic.getMaterialFromStatistic(statistic);
@@ -1045,17 +1037,28 @@ public class CraftEventFactory {
return event;
}
- public static BlockPhysicsEvent callBlockPhysicsEvent(World world, BlockPosition blockposition) {
- org.bukkit.block.Block block = world.getWorld().getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ());
- BlockPhysicsEvent event = new BlockPhysicsEvent(block, block.getTypeId());
- world.getServer().getPluginManager().callEvent(event);
+ public static BlockPhysicsEvent callBlockPhysicsEvent(GeneratorAccess world, BlockPosition blockposition) {
+ org.bukkit.block.Block block = CraftBlock.at(world, blockposition);
+ BlockPhysicsEvent event = new BlockPhysicsEvent(block, block.getBlockData());
+ world.getMinecraftWorld().getMinecraftServer().server.getPluginManager().callEvent(event);
return event;
}
+ public static boolean handleBlockFormEvent(World world, BlockPosition pos, IBlockData block) {
+ return handleBlockFormEvent(world, pos, block, 3);
+ }
+
public static boolean handleBlockFormEvent(World world, BlockPosition pos, IBlockData block, @Nullable Entity entity) {
- BlockState blockState = world.getWorld().getBlockAt(pos.getX(), pos.getY(), pos.getZ()).getState();
- blockState.setType(CraftMagicNumbers.getMaterial(block.getBlock()));
- blockState.setRawData((byte) block.getBlock().toLegacyData(block));
+ return handleBlockFormEvent(world, pos, block, 3, entity);
+ }
+
+ public static boolean handleBlockFormEvent(World world, BlockPosition pos, IBlockData block, int flag) {
+ return handleBlockFormEvent(world, pos, block, flag, null);
+ }
+
+ public static boolean handleBlockFormEvent(World world, BlockPosition pos, IBlockData block, int flag, @Nullable Entity entity) {
+ CraftBlockState blockState = CraftBlockState.getBlockState(world, pos, flag);
+ blockState.setData(block);
BlockFormEvent event = (entity == null) ? new BlockFormEvent(blockState.getBlock(), blockState) : new EntityBlockFormEvent(entity.getBukkitEntity(), blockState.getBlock(), blockState);
world.getServer().getPluginManager().callEvent(event);
diff --git a/src/main/java/org/bukkit/craftbukkit/generator/CraftChunkData.java b/src/main/java/org/bukkit/craftbukkit/generator/CraftChunkData.java
index 01264a7e..a0fda929 100644
--- a/src/main/java/org/bukkit/craftbukkit/generator/CraftChunkData.java
+++ b/src/main/java/org/bukkit/craftbukkit/generator/CraftChunkData.java
@@ -1,12 +1,13 @@
-/*
- * To change this template, choose Tools | Templates
- * and open the template in the editor.
- */
package org.bukkit.craftbukkit.generator;
-import java.util.Arrays;
+import net.minecraft.server.Blocks;
+import net.minecraft.server.ChunkSection;
+import net.minecraft.server.IBlockData;
import org.bukkit.Material;
import org.bukkit.World;
+import org.bukkit.block.data.BlockData;
+import org.bukkit.craftbukkit.block.data.CraftBlockData;
+import org.bukkit.craftbukkit.util.CraftMagicNumbers;
import org.bukkit.generator.ChunkGenerator;
import org.bukkit.material.MaterialData;
@@ -15,7 +16,7 @@ import org.bukkit.material.MaterialData;
*/
public final class CraftChunkData implements ChunkGenerator.ChunkData {
private final int maxHeight;
- private final char[][] sections;
+ private final ChunkSection[] sections;
public CraftChunkData(World world) {
this(world.getMaxHeight());
@@ -26,8 +27,7 @@ public final class CraftChunkData implements ChunkGenerator.ChunkData {
throw new IllegalArgumentException("World height exceeded max chunk height");
}
this.maxHeight = maxHeight;
- // Minecraft hardcodes this to 16 chunk sections.
- sections = new char[16][];
+ sections = new ChunkSection[maxHeight >> 4];
}
@Override
@@ -37,41 +37,50 @@ public final class CraftChunkData implements ChunkGenerator.ChunkData {
@Override
public void setBlock(int x, int y, int z, Material material) {
- setBlock(x, y, z, material.getId());
+ setBlock(x, y, z, CraftMagicNumbers.getBlock(material, (byte) 0));
}
@Override
public void setBlock(int x, int y, int z, MaterialData material) {
- setBlock(x, y, z, material.getItemTypeId(), material.getData());
+ setBlock(x, y, z, CraftMagicNumbers.getBlock(material));
+ }
+
+ @Override
+ public void setBlock(int x, int y, int z, BlockData blockData) {
+ setBlock(x, y, z, ((CraftBlockData) blockData).getState());
}
@Override
public void setRegion(int xMin, int yMin, int zMin, int xMax, int yMax, int zMax, Material material) {
- setRegion(xMin, yMin, zMin, xMax, yMax, zMax, material.getId());
+ setRegion(xMin, yMin, zMin, xMax, yMax, zMax, CraftMagicNumbers.getBlock(material, (byte) 0));
}
@Override
public void setRegion(int xMin, int yMin, int zMin, int xMax, int yMax, int zMax, MaterialData material) {
- setRegion(xMin, yMin, zMin, xMax, yMax, zMax, material.getItemTypeId(), material.getData());
+ setRegion(xMin, yMin, zMin, xMax, yMax, zMax, CraftMagicNumbers.getBlock(material));
+ }
+
+ @Override
+ public void setRegion(int xMin, int yMin, int zMin, int xMax, int yMax, int zMax, BlockData blockData) {
+ setRegion(xMin, yMin, zMin, xMax, yMax, zMax, ((CraftBlockData) blockData).getState());
}
@Override
public Material getType(int x, int y, int z) {
- return Material.getMaterial(getTypeId(x, y, z));
+ return getTypeAndData(x, y, z).getItemType();
}
@Override
public MaterialData getTypeAndData(int x, int y, int z) {
- return getType(x, y, z).getNewData(getData(x, y, z));
+ return CraftMagicNumbers.getMaterial(getTypeId(x, y, z));
}
@Override
- public void setRegion(int xMin, int yMin, int zMin, int xMax, int yMax, int zMax, int blockId) {
- setRegion(xMin, yMin, zMin, xMax, yMax, zMax, blockId, (byte) 0);
+ public BlockData getBlockData(int x, int y, int z) {
+ return CraftBlockData.fromData(getTypeId(x, y, z));
}
- @Override
- public void setRegion(int xMin, int yMin, int zMin, int xMax, int yMax, int zMax, int blockId, int data) {
+ public void setRegion(int xMin, int yMin, int zMin, int xMax, int yMax, int zMax, IBlockData type) {
// Clamp to sane values.
if (xMin > 0xf || yMin >= maxHeight || zMin > 0xf) {
return;
@@ -97,103 +106,51 @@ public final class CraftChunkData implements ChunkGenerator.ChunkData {
if (xMin >= xMax || yMin >= yMax || zMin >= zMax) {
return;
}
- char typeChar = (char) ((blockId << 4) | data);
- if (xMin == 0 && xMax == 0x10) {
- if (zMin == 0 && zMax == 0x10) {
- for (int y = yMin & 0xf0; y < yMax; y += 0x10) {
- char[] section = getChunkSection(y, true);
- if (y <= yMin) {
- if (y + 0x10 > yMax) {
- // First and last chunk section
- Arrays.fill(section, (yMin & 0xf) << 8, (yMax & 0xf) << 8, typeChar);
- } else {
- // First chunk section
- Arrays.fill(section, (yMin & 0xf) << 8, 0x1000, typeChar);
- }
- } else if (y + 0x10 > yMax) {
- // Last chunk section
- Arrays.fill(section, 0, (yMax & 0xf) << 8, typeChar);
- } else {
- // Full chunk section
- Arrays.fill(section, 0, 0x1000, typeChar);
- }
- }
- } else {
- for (int y = yMin; y < yMax; y++) {
- char[] section = getChunkSection(y, true);
- int offsetBase = (y & 0xf) << 8;
- int min = offsetBase | (zMin << 4);
- // Need to add zMax as it can be 16, which overlaps the y coordinate bits
- int max = offsetBase + (zMax << 4);
- Arrays.fill(section, min, max, typeChar);
- }
- }
- } else {
- for (int y = yMin; y < yMax; y++) {
- char[] section = getChunkSection(y, true);
- int offsetBase = (y & 0xf) << 8;
+ for (int y = yMin; y < yMax; y++) {
+ ChunkSection section = getChunkSection(y, true);
+ int offsetBase = y & 0xf;
+ for (int x = xMin; x < xMax; x++) {
for (int z = zMin; z < zMax; z++) {
- int offset = offsetBase | (z << 4);
- // Need to add xMax as it can be 16, which overlaps the z coordinate bits
- Arrays.fill(section, offset | xMin, offset + xMax, typeChar);
+ section.setType(x, offsetBase, z, type);
}
}
}
}
- @Override
- public void setBlock(int x, int y, int z, int blockId) {
- setBlock(x, y, z, blockId, (byte) 0);
- }
-
- @Override
- public void setBlock(int x, int y, int z, int blockId, byte data) {
- setBlock(x, y, z, (char) (blockId << 4 | data));
- }
-
- @Override
- public int getTypeId(int x, int y, int z) {
+ public IBlockData getTypeId(int x, int y, int z) {
if (x != (x & 0xf) || y < 0 || y >= maxHeight || z != (z & 0xf)) {
- return 0;
+ return Blocks.AIR.getBlockData();
}
- char[] section = getChunkSection(y, false);
+ ChunkSection section = getChunkSection(y, false);
if (section == null) {
- return 0;
+ return Blocks.AIR.getBlockData();
} else {
- return section[(y & 0xf) << 8 | z << 4 | x] >> 4;
+ return section.getType(x, y & 0xf, z);
}
}
@Override
public byte getData(int x, int y, int z) {
- if (x != (x & 0xf) || y < 0 || y >= maxHeight || z != (z & 0xf)) {
- return (byte) 0;
- }
- char[] section = getChunkSection(y, false);
- if (section == null) {
- return (byte) 0;
- } else {
- return (byte) (section[(y & 0xf) << 8 | z << 4 | x] & 0xf);
- }
+ return CraftMagicNumbers.toLegacyData(getTypeId(x, y, z));
}
- private void setBlock(int x, int y, int z, char type) {
+ private void setBlock(int x, int y, int z, IBlockData type) {
if (x != (x & 0xf) || y < 0 || y >= maxHeight || z != (z & 0xf)) {
return;
}
- char[] section = getChunkSection(y, true);
- section[(y & 0xf) << 8 | z << 4 | x] = type;
+ ChunkSection section = getChunkSection(y, true);
+ section.setType(x, y & 0xf, z, type);
}
- private char[] getChunkSection(int y, boolean create) {
- char[] section = sections[y >> 4];
+ private ChunkSection getChunkSection(int y, boolean create) {
+ ChunkSection section = sections[y >> 4];
if (create && section == null) {
- sections[y >> 4] = section = new char[0x1000];
+ sections[y >> 4] = section = new ChunkSection(y, create);
}
return section;
}
- char[][] getRawChunkData() {
+ ChunkSection[] getRawChunkData() {
return sections;
}
}
diff --git a/src/main/java/org/bukkit/craftbukkit/generator/CustomChunkGenerator.java b/src/main/java/org/bukkit/craftbukkit/generator/CustomChunkGenerator.java
index 9942f0c7..4280be5a 100644
--- a/src/main/java/org/bukkit/craftbukkit/generator/CustomChunkGenerator.java
+++ b/src/main/java/org/bukkit/craftbukkit/generator/CustomChunkGenerator.java
@@ -1,6 +1,11 @@
package org.bukkit.craftbukkit.generator;
+import com.google.common.collect.Maps;
+import it.unimi.dsi.fastutil.longs.Long2ObjectMap;
+import it.unimi.dsi.fastutil.longs.Long2ObjectMaps;
+import it.unimi.dsi.fastutil.longs.LongSet;
import java.util.List;
+import java.util.Map;
import java.util.Random;
import net.minecraft.server.*;
@@ -10,11 +15,14 @@ import org.bukkit.generator.BlockPopulator;
import org.bukkit.generator.ChunkGenerator;
import org.bukkit.craftbukkit.block.CraftBlock;
-public class CustomChunkGenerator extends InternalChunkGenerator {
+public class CustomChunkGenerator extends InternalChunkGenerator<GeneratorSettingsDefault> {
private final ChunkGenerator generator;
private final WorldServer world;
+ private final long seed;
private final Random random;
+ private final WorldChunkManager chunkManager;
private final WorldGenStronghold strongholdGen = new WorldGenStronghold();
+ private final GeneratorSettingsDefault settings = new GeneratorSettingsDefault();
private static class CustomBiomeGrid implements BiomeGrid {
BiomeBase[] biome;
@@ -26,215 +34,145 @@ public class CustomChunkGenerator extends InternalChunkGenerator {
@Override
public void setBiome(int x, int z, Biome bio) {
- biome[(z << 4) | x] = CraftBlock.biomeToBiomeBase(bio);
+ biome[(z << 4) | x] = CraftBlock.biomeToBiomeBase(bio);
}
}
public CustomChunkGenerator(World world, long seed, ChunkGenerator generator) {
this.world = (WorldServer) world;
this.generator = generator;
+ this.seed = seed;
this.random = new Random(seed);
+ this.chunkManager = world.worldProvider.getChunkGenerator().getWorldChunkManager();
}
@Override
- public Chunk getOrCreateChunk(int x, int z) {
+ public void createChunk(IChunkAccess ichunkaccess) {
+ int x = ichunkaccess.getPos().x;
+ int z = ichunkaccess.getPos().z;
random.setSeed((long) x * 341873128712L + (long) z * 132897987541L);
- Chunk chunk;
-
// Get default biome data for chunk
CustomBiomeGrid biomegrid = new CustomBiomeGrid();
- biomegrid.biome = new BiomeBase[256];
- world.getWorldChunkManager().getBiomeBlock(biomegrid.biome, x << 4, z << 4, 16, 16);
+ biomegrid.biome = chunkManager.getBiomeBlock(x << 4, z << 4, 16, 16);
- // Try ChunkData method (1.8+)
CraftChunkData data = (CraftChunkData) generator.generateChunkData(this.world.getWorld(), random, x, z, biomegrid);
- if (data != null) {
- char[][] sections = data.getRawChunkData();
- chunk = new Chunk(this.world, x, z);
-
- ChunkSection[] csect = chunk.getSections();
- int scnt = Math.min(csect.length, sections.length);
-
- // Loop through returned sections
- for (int sec = 0; sec < scnt; sec++) {
- if(sections[sec] == null) {
- continue;
- }
- char[] section = sections[sec];
- char emptyTest = 0;
- for (int i = 0; i < 4096; i++) {
- // Filter invalid block id & data values.
- if (Block.REGISTRY_ID.fromId(section[i]) == null) {
- section[i] = 0;
- }
- emptyTest |= section[i];
- }
- // Build chunk section
- if (emptyTest != 0) {
- csect[sec] = new ChunkSection(sec << 4, true, section);
- }
- }
- }
- else {
- // Try extended block method (1.2+)
- short[][] xbtypes = generator.generateExtBlockSections(this.world.getWorld(), this.random, x, z, biomegrid);
- if (xbtypes != null) {
- chunk = new Chunk(this.world, x, z);
-
- ChunkSection[] csect = chunk.getSections();
- int scnt = Math.min(csect.length, xbtypes.length);
-
- // Loop through returned sections
- for (int sec = 0; sec < scnt; sec++) {
- if (xbtypes[sec] == null) {
- continue;
- }
- char[] secBlkID = new char[4096]; // Allocate blk ID bytes
- short[] bdata = xbtypes[sec];
- for (int i = 0; i < bdata.length; i++) {
- Block b = Block.getById(bdata[i]);
- secBlkID[i] = (char) Block.REGISTRY_ID.getId(b.getBlockData());
- }
- // Build chunk section
- csect[sec] = new ChunkSection(sec << 4, true, secBlkID);
- }
- }
- else { // Else check for byte-per-block section data
- byte[][] btypes = generator.generateBlockSections(this.world.getWorld(), this.random, x, z, biomegrid);
-
- if (btypes != null) {
- chunk = new Chunk(this.world, x, z);
-
- ChunkSection[] csect = chunk.getSections();
- int scnt = Math.min(csect.length, btypes.length);
-
- for (int sec = 0; sec < scnt; sec++) {
- if (btypes[sec] == null) {
- continue;
- }
-
- char[] secBlkID = new char[4096]; // Allocate block ID bytes
- for (int i = 0; i < secBlkID.length; i++) {
- Block b = Block.getById(btypes[sec][i] & 0xFF);
- secBlkID[i] = (char) Block.REGISTRY_ID.getId(b.getBlockData());
- }
- csect[sec] = new ChunkSection(sec << 4, true, secBlkID);
- }
- }
- else { // Else, fall back to pre 1.2 method
- @SuppressWarnings("deprecation")
- byte[] types = generator.generate(this.world.getWorld(), this.random, x, z);
- int ydim = types.length / 256;
- int scnt = ydim / 16;
-
- chunk = new Chunk(this.world, x, z); // Create empty chunk
-
- ChunkSection[] csect = chunk.getSections();
-
- scnt = Math.min(scnt, csect.length);
- // Loop through sections
- for (int sec = 0; sec < scnt; sec++) {
- char[] csbytes = null; // Add sections when needed
-
- for (int cy = 0; cy < 16; cy++) {
- int cyoff = cy | (sec << 4);
-
- for (int cx = 0; cx < 16; cx++) {
- int cxyoff = (cx * ydim * 16) + cyoff;
-
- for (int cz = 0; cz < 16; cz++) {
- byte blk = types[cxyoff + (cz * ydim)];
-
- if (blk != 0) { // If non-empty
- if (csbytes == null) { // If no section yet, get one
- csbytes = new char[16*16*16];
- }
-
- Block b = Block.getById(blk & 0xFF);
- csbytes[(cy << 8) | (cz << 4) | cx] = (char) Block.REGISTRY_ID.getId(b.getBlockData());
- }
- }
- }
- }
- // If section built, finish prepping its state
- if (csbytes != null) {
- ChunkSection cs = csect[sec] = new ChunkSection(sec << 4, true, csbytes);
- cs.recalcBlockCounts();
- }
- }
- }
+ ChunkSection[] sections = data.getRawChunkData();
+
+ ChunkSection[] csect = ichunkaccess.getSections();
+ int scnt = Math.min(csect.length, sections.length);
+
+ // Loop through returned sections
+ for (int sec = 0; sec < scnt; sec++) {
+ if (sections[sec] == null) {
+ continue;
}
+ ChunkSection section = sections[sec];
+
+ csect[sec] = section;
}
+
// Set biome grid
- byte[] biomeIndex = chunk.getBiomeIndex();
- for (int i = 0; i < biomeIndex.length; i++) {
- biomeIndex[i] = (byte) (BiomeBase.REGISTRY_ID.a(biomegrid.biome[i]) & 0xFF); // PAIL : rename
- }
- // Initialize lighting
- chunk.initLighting();
+ ichunkaccess.a(biomegrid.biome);
+ }
- return chunk;
+ @Override
+ public ChunkData generateChunkData(org.bukkit.World world, Random random, int x, int z, BiomeGrid biome) {
+ return generator.generateChunkData(world, random, x, z, biome);
}
@Override
- public boolean a(Chunk chunk, int i, int i1) {
- return false;
+ public boolean canSpawn(org.bukkit.World world, int x, int z) {
+ return generator.canSpawn(world, x, z);
}
- @SuppressWarnings("deprecation")
@Override
- public byte[] generate(org.bukkit.World world, Random random, int x, int z) {
- return generator.generate(world, random, x, z);
+ public List<BlockPopulator> getDefaultPopulators(org.bukkit.World world) {
+ return generator.getDefaultPopulators(world);
}
@Override
- public byte[][] generateBlockSections(org.bukkit.World world, Random random, int x, int z, BiomeGrid biomes) {
- return generator.generateBlockSections(world, random, x, z, biomes);
+ public List<BiomeBase.BiomeMeta> getMobsFor(EnumCreatureType type, BlockPosition position) {
+ BiomeBase biomebase = world.getBiome(position);
+
+ return biomebase == null ? null : biomebase.getMobs(type);
}
@Override
- public short[][] generateExtBlockSections(org.bukkit.World world, Random random, int x, int z, BiomeGrid biomes) {
- return generator.generateExtBlockSections(world, random, x, z, biomes);
+ public void addFeatures(RegionLimitedWorldAccess regionlimitedworldaccess, WorldGenStage.Features worldgenstage_features) {
}
- public Chunk getChunkAt(int x, int z) {
- return getOrCreateChunk(x, z);
+ @Override
+ public void addDecorations(RegionLimitedWorldAccess regionlimitedworldaccess) {
}
@Override
- public boolean canSpawn(org.bukkit.World world, int x, int z) {
- return generator.canSpawn(world, x, z);
+ public void addMobs(RegionLimitedWorldAccess regionlimitedworldaccess) {
}
@Override
- public List<BlockPopulator> getDefaultPopulators(org.bukkit.World world) {
- return generator.getDefaultPopulators(world);
+ public BlockPosition findNearestMapFeature(World world, String type, BlockPosition position, int i) {
+ return "Stronghold".equals(type) && this.strongholdGen != null ? this.strongholdGen.getNearestGeneratedFeature(world, this, position, i) : null;
}
@Override
- public List<BiomeBase.BiomeMeta> getMobsFor(EnumCreatureType type, BlockPosition position) {
- BiomeBase biomebase = world.getBiome(position);
+ public GeneratorSettingsDefault getSettings() {
+ return settings;
+ }
- return biomebase == null ? null : biomebase.getMobs(type);
+ @Override
+ public int a(World world, boolean flag, boolean flag1) {
+ return 0;
+ }
+
+ @Override
+ public boolean canSpawnStructure(BiomeBase biomebase, StructureGenerator<? extends WorldGenFeatureConfiguration> structuregenerator) {
+ return biomebase.a(structuregenerator);
+ }
+
+ @Override
+ public WorldGenFeatureConfiguration getFeatureConfiguration(BiomeBase biomebase, StructureGenerator<? extends WorldGenFeatureConfiguration> structuregenerator) {
+ return biomebase.b(structuregenerator);
}
+ // Taken from ChunkGeneratorAbstract
+ private final Map<StructureGenerator<? extends WorldGenFeatureConfiguration>, Long2ObjectMap<StructureStart>> structureStartCache = Maps.newHashMap();
+
@Override
- public boolean a(World world, String type, BlockPosition position) {
- return "Stronghold".equals(type) && this.strongholdGen != null ? this.strongholdGen.b(position) : false;
+ public Long2ObjectMap<StructureStart> getStructureStartCache(StructureGenerator<? extends WorldGenFeatureConfiguration> structuregenerator) {
+ return (Long2ObjectMap) this.structureStartCache.computeIfAbsent(structuregenerator, (s) -> {
+ return Long2ObjectMaps.synchronize(new ExpiringMap(8192, 10000));
+ });
}
+ // Taken from ChunkGeneratorAbstract
+ private final Map<StructureGenerator<? extends WorldGenFeatureConfiguration>, Long2ObjectMap<LongSet>> structureCache = Maps.newHashMap();
+
@Override
- public BlockPosition findNearestMapFeature(World world, String type, BlockPosition position, boolean flag) {
- return "Stronghold".equals(type) && this.strongholdGen != null ? this.strongholdGen.getNearestGeneratedFeature(world, position, flag) : null;
+ public Long2ObjectMap<LongSet> getStructureCache(StructureGenerator<? extends WorldGenFeatureConfiguration> structuregenerator) {
+ return (Long2ObjectMap) this.structureCache.computeIfAbsent(structuregenerator, (s) -> {
+ return Long2ObjectMaps.synchronize(new ExpiringMap(8192, 10000));
+ });
}
@Override
- public void recreateStructures(int i, int j) {}
+ public WorldChunkManager getWorldChunkManager() {
+ return chunkManager;
+ }
+
+ @Override
+ public long getSeed() {
+ return seed;
+ }
+
+ @Override
+ public int getSpawnHeight() {
+ return world.getSeaLevel() + 1;
+ }
@Override
- public void recreateStructures(Chunk chunk, int i, int j) {
- strongholdGen.a(this.world, i, j, (ChunkSnapshot) null);
+ public int e() {
+ return world.getHeight();
}
}
diff --git a/src/main/java/org/bukkit/craftbukkit/generator/InternalChunkGenerator.java b/src/main/java/org/bukkit/craftbukkit/generator/InternalChunkGenerator.java
index d2e71b87..b0710cd8 100644
--- a/src/main/java/org/bukkit/craftbukkit/generator/InternalChunkGenerator.java
+++ b/src/main/java/org/bukkit/craftbukkit/generator/InternalChunkGenerator.java
@@ -1,8 +1,8 @@
package org.bukkit.craftbukkit.generator;
-import net.minecraft.server.IChunkProvider;
+import net.minecraft.server.GeneratorSettings;
import org.bukkit.generator.ChunkGenerator;
// Do not implement functions to this class, add to NormalChunkGenerator
-public abstract class InternalChunkGenerator extends ChunkGenerator implements net.minecraft.server.ChunkGenerator {
+public abstract class InternalChunkGenerator<C extends GeneratorSettings> extends ChunkGenerator implements net.minecraft.server.ChunkGenerator<C> {
}
diff --git a/src/main/java/org/bukkit/craftbukkit/generator/NormalChunkGenerator.java b/src/main/java/org/bukkit/craftbukkit/generator/NormalChunkGenerator.java
index be07fb8e..4356d2bf 100644
--- a/src/main/java/org/bukkit/craftbukkit/generator/NormalChunkGenerator.java
+++ b/src/main/java/org/bukkit/craftbukkit/generator/NormalChunkGenerator.java
@@ -1,29 +1,30 @@
package org.bukkit.craftbukkit.generator;
+import it.unimi.dsi.fastutil.longs.Long2ObjectMap;
+import it.unimi.dsi.fastutil.longs.LongSet;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import net.minecraft.server.*;
-import org.bukkit.craftbukkit.CraftWorld;
import org.bukkit.generator.BlockPopulator;
-public class NormalChunkGenerator extends InternalChunkGenerator {
- private final ChunkGenerator generator;
+public class NormalChunkGenerator<C extends GeneratorSettings> extends InternalChunkGenerator<C> {
+ private final ChunkGenerator<?> generator;
public NormalChunkGenerator(World world, long seed) {
generator = world.worldProvider.getChunkGenerator();
}
@Override
- public byte[] generate(org.bukkit.World world, Random random, int x, int z) {
+ public ChunkData generateChunkData(org.bukkit.World world, Random random, int x, int z, BiomeGrid biome) {
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);
+ return true; // PAIL
}
@Override
@@ -32,37 +33,82 @@ public class NormalChunkGenerator extends InternalChunkGenerator {
}
@Override
- public Chunk getOrCreateChunk(int i, int i1) {
- return generator.getOrCreateChunk(i, i1);
+ public List<BiomeBase.BiomeMeta> getMobsFor(EnumCreatureType enumCreatureType, BlockPosition blockPosition) {
+ return generator.getMobsFor(enumCreatureType, blockPosition);
}
@Override
- public void recreateStructures(int i, int i1) {
- generator.recreateStructures(i, i1);
+ public BlockPosition findNearestMapFeature(World world, String s, BlockPosition blockPosition, int i) {
+ return generator.findNearestMapFeature(world, s, blockPosition, i);
}
@Override
- public boolean a(Chunk chunk, int i, int i1) {
- return generator.a(chunk, i, i1);
+ public void createChunk(IChunkAccess ichunkaccess) {
+ generator.createChunk(ichunkaccess);
}
@Override
- public List<BiomeBase.BiomeMeta> getMobsFor(EnumCreatureType enumCreatureType, BlockPosition blockPosition) {
- return generator.getMobsFor(enumCreatureType, blockPosition);
+ public void addFeatures(RegionLimitedWorldAccess regionlimitedworldaccess, WorldGenStage.Features worldgenstage_features) {
+ generator.addFeatures(regionlimitedworldaccess, worldgenstage_features);
+ }
+
+ @Override
+ public void addDecorations(RegionLimitedWorldAccess regionlimitedworldaccess) {
+ generator.addDecorations(regionlimitedworldaccess);
+ }
+
+ @Override
+ public void addMobs(RegionLimitedWorldAccess regionlimitedworldaccess) {
+ generator.addMobs(regionlimitedworldaccess);
+ }
+
+ @Override
+ public C getSettings() {
+ return (C) generator.getSettings();
+ }
+
+ @Override
+ public int a(World world, boolean flag, boolean flag1) {
+ return generator.a(world, flag, flag1);
+ }
+
+ @Override
+ public boolean canSpawnStructure(BiomeBase biomebase, StructureGenerator<? extends WorldGenFeatureConfiguration> structuregenerator) {
+ return generator.canSpawnStructure(biomebase, structuregenerator);
+ }
+
+ @Override
+ public WorldGenFeatureConfiguration getFeatureConfiguration(BiomeBase biomebase, StructureGenerator<? extends WorldGenFeatureConfiguration> structuregenerator) {
+ return generator.getFeatureConfiguration(biomebase, structuregenerator);
+ }
+
+ @Override
+ public Long2ObjectMap<StructureStart> getStructureStartCache(StructureGenerator<? extends WorldGenFeatureConfiguration> structuregenerator) {
+ return generator.getStructureStartCache(structuregenerator);
+ }
+
+ @Override
+ public Long2ObjectMap<LongSet> getStructureCache(StructureGenerator<? extends WorldGenFeatureConfiguration> structuregenerator) {
+ return generator.getStructureCache(structuregenerator);
+ }
+
+ @Override
+ public WorldChunkManager getWorldChunkManager() {
+ return generator.getWorldChunkManager();
}
@Override
- public BlockPosition findNearestMapFeature(World world, String s, BlockPosition blockPosition, boolean flag) {
- return generator.findNearestMapFeature(world, s, blockPosition, flag);
+ public long getSeed() {
+ return generator.getSeed();
}
@Override
- public void recreateStructures(Chunk chunk, int i, int i1) {
- generator.recreateStructures(chunk, i, i1);
+ public int getSpawnHeight() {
+ return generator.getSpawnHeight();
}
@Override
- public boolean a(World world, String string, BlockPosition bp) {
- return generator.a(world, string, bp);
+ public int e() {
+ return generator.e(); // PAIL: Gen depth
}
}
diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftFurnaceRecipe.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftFurnaceRecipe.java
index ef3b8045..b513f8d2 100644
--- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftFurnaceRecipe.java
+++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftFurnaceRecipe.java
@@ -1,26 +1,31 @@
package org.bukkit.craftbukkit.inventory;
-import net.minecraft.server.RecipesFurnace;
+import java.util.stream.Stream;
+import net.minecraft.server.MinecraftServer;
+import net.minecraft.server.RecipeItemStack;
+import org.bukkit.NamespacedKey;
+import org.bukkit.craftbukkit.util.CraftNamespacedKey;
import org.bukkit.inventory.FurnaceRecipe;
import org.bukkit.inventory.ItemStack;
public class CraftFurnaceRecipe extends FurnaceRecipe implements CraftRecipe {
- public CraftFurnaceRecipe(ItemStack result, ItemStack source) {
- super(result, source.getType(), source.getDurability());
+ public CraftFurnaceRecipe(NamespacedKey key, ItemStack result, ItemStack source, float experience, int cookingTime) {
+ super(key, result, source.getType(), source.getDurability(), experience, cookingTime);
}
public static CraftFurnaceRecipe fromBukkitRecipe(FurnaceRecipe recipe) {
if (recipe instanceof CraftFurnaceRecipe) {
return (CraftFurnaceRecipe) recipe;
}
- return new CraftFurnaceRecipe(recipe.getResult(), recipe.getInput());
+ return new CraftFurnaceRecipe(recipe.getKey(), recipe.getResult(), recipe.getInput(), recipe.getExperience(), recipe.getCookingTime());
}
@Override
public void addToCraftingManager() {
ItemStack result = this.getResult();
- ItemStack input = this.getInput();
- RecipesFurnace.getInstance().registerRecipe(CraftItemStack.asNMSCopy(input), CraftItemStack.asNMSCopy(result), getExperience());
+ RecipeItemStack input = new RecipeItemStack(Stream.of(new RecipeItemStack.StackProvider(CraftItemStack.asNMSCopy(this.getInput()))));
+
+ MinecraftServer.getServer().getCraftingManager().a(new net.minecraft.server.FurnaceRecipe(CraftNamespacedKey.toMinecraft(this.getKey()), "", input, CraftItemStack.asNMSCopy(result), getExperience(), getCookingTime()));
}
}
diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventory.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventory.java
index 4866d1ae..94afb704 100644
--- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventory.java
+++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventory.java
@@ -25,6 +25,7 @@ import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.InventoryHolder;
import org.bukkit.inventory.ItemStack;
import org.bukkit.Material;
+import org.bukkit.craftbukkit.util.CraftChatMessage;
public class CraftInventory implements Inventory {
protected final IInventory inventory;
@@ -42,7 +43,7 @@ public class CraftInventory implements Inventory {
}
public String getName() {
- return getInventory().getName();
+ return CraftChatMessage.fromComponent(getInventory().getDisplayName());
}
public ItemStack getItem(int index) {
@@ -96,20 +97,16 @@ public class CraftInventory implements Inventory {
getInventory().setItem(index, CraftItemStack.asNMSCopy(item));
}
- public boolean contains(int materialId) {
+ public boolean contains(Material material) {
+ Validate.notNull(material, "Material cannot be null");
for (ItemStack item : getStorageContents()) {
- if (item != null && item.getTypeId() == materialId) {
+ if (item != null && item.getType() == material) {
return true;
}
}
return false;
}
- public boolean contains(Material material) {
- Validate.notNull(material, "Material cannot be null");
- return contains(material.getId());
- }
-
public boolean contains(ItemStack item) {
if (item == null) {
return false;
@@ -122,12 +119,13 @@ public class CraftInventory implements Inventory {
return false;
}
- public boolean contains(int materialId, int amount) {
+ public boolean contains(Material material, int amount) {
+ Validate.notNull(material, "Material cannot be null");
if (amount <= 0) {
return true;
}
for (ItemStack item : getStorageContents()) {
- if (item != null && item.getTypeId() == materialId) {
+ if (item != null && item.getType()== material) {
if ((amount -= item.getAmount()) <= 0) {
return true;
}
@@ -136,11 +134,6 @@ public class CraftInventory implements Inventory {
return false;
}
- public boolean contains(Material material, int amount) {
- Validate.notNull(material, "Material cannot be null");
- return contains(material.getId(), amount);
- }
-
public boolean contains(ItemStack item, int amount) {
if (item == null) {
return false;
@@ -171,24 +164,20 @@ public class CraftInventory implements Inventory {
return false;
}
- public HashMap<Integer, ItemStack> all(int materialId) {
+ public HashMap<Integer, ItemStack> all(Material material) {
+ Validate.notNull(material, "Material cannot be null");
HashMap<Integer, ItemStack> slots = new HashMap<Integer, ItemStack>();
ItemStack[] inventory = getStorageContents();
for (int i = 0; i < inventory.length; i++) {
ItemStack item = inventory[i];
- if (item != null && item.getTypeId() == materialId) {
+ if (item != null && item.getType()== material) {
slots.put(i, item);
}
}
return slots;
}
- public HashMap<Integer, ItemStack> all(Material material) {
- Validate.notNull(material, "Material cannot be null");
- return all(material.getId());
- }
-
public HashMap<Integer, ItemStack> all(ItemStack item) {
HashMap<Integer, ItemStack> slots = new HashMap<Integer, ItemStack>();
if (item != null) {
@@ -202,22 +191,18 @@ public class CraftInventory implements Inventory {
return slots;
}
- public int first(int materialId) {
- ItemStack[] inventory = getStorageContents();
+ public int first(Material material) {
+ Validate.notNull(material, "Material cannot be null");
+ ItemStack[] inventory = getStorageContents();
for (int i = 0; i < inventory.length; i++) {
ItemStack item = inventory[i];
- if (item != null && item.getTypeId() == materialId) {
+ if (item != null && item.getType()== material) {
return i;
}
}
return -1;
}
- public int first(Material material) {
- Validate.notNull(material, "Material cannot be null");
- return first(material.getId());
- }
-
public int first(ItemStack item) {
return first(item, true);
}
@@ -247,22 +232,18 @@ public class CraftInventory implements Inventory {
return -1;
}
- public int firstPartial(int materialId) {
+ public int firstPartial(Material material) {
+ Validate.notNull(material, "Material cannot be null");
ItemStack[] inventory = getStorageContents();
for (int i = 0; i < inventory.length; i++) {
ItemStack item = inventory[i];
- if (item != null && item.getTypeId() == materialId && item.getAmount() < item.getMaxStackSize()) {
+ if (item != null && item.getType()== material && item.getAmount() < item.getMaxStackSize()) {
return i;
}
}
return -1;
}
- public int firstPartial(Material material) {
- Validate.notNull(material, "Material cannot be null");
- return firstPartial(material.getId());
- }
-
private int firstPartial(ItemStack item) {
ItemStack[] inventory = getStorageContents();
ItemStack filteredItem = CraftItemStack.asCraftCopy(item);
@@ -390,20 +371,16 @@ public class CraftInventory implements Inventory {
return getInventory().getMaxStackSize();
}
- public void remove(int materialId) {
+ public void remove(Material material) {
+ Validate.notNull(material, "Material cannot be null");
ItemStack[] items = getStorageContents();
for (int i = 0; i < items.length; i++) {
- if (items[i] != null && items[i].getTypeId() == materialId) {
+ if (items[i] != null && items[i].getType()== material) {
clear(i);
}
}
}
- public void remove(Material material) {
- Validate.notNull(material, "Material cannot be null");
- remove(material.getId());
- }
-
public void remove(ItemStack item) {
ItemStack[] items = getStorageContents();
for (int i = 0; i < items.length; i++) {
@@ -439,7 +416,7 @@ public class CraftInventory implements Inventory {
}
public String getTitle() {
- return inventory.getName();
+ return getName();
}
public InventoryType getType() {
diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventoryCrafting.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventoryCrafting.java
index 0f0dd199..3a375e77 100644
--- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventoryCrafting.java
+++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventoryCrafting.java
@@ -5,7 +5,6 @@ import java.util.List;
import net.minecraft.server.IRecipe;
import net.minecraft.server.IInventory;
-import net.minecraft.server.InventoryCrafting;
import org.bukkit.inventory.CraftingInventory;
import org.bukkit.inventory.ItemStack;
@@ -14,7 +13,7 @@ import org.bukkit.inventory.Recipe;
public class CraftInventoryCrafting extends CraftInventory implements CraftingInventory {
private final IInventory resultInventory;
- public CraftInventoryCrafting(InventoryCrafting inventory, IInventory resultInventory) {
+ public CraftInventoryCrafting(IInventory inventory, IInventory resultInventory) {
super(inventory);
this.resultInventory = resultInventory;
}
@@ -116,7 +115,7 @@ public class CraftInventoryCrafting extends CraftInventory implements CraftingIn
}
public Recipe getRecipe() {
- IRecipe recipe = ((InventoryCrafting)getInventory()).currentRecipe;
+ IRecipe recipe = getInventory().getCurrentRecipe();
return recipe == null ? null : recipe.toBukkitRecipe();
}
}
diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventoryCustom.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventoryCustom.java
index a1a0ab7d..2212e09c 100644
--- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventoryCustom.java
+++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventoryCustom.java
@@ -17,6 +17,7 @@ import net.minecraft.server.EntityHuman;
import net.minecraft.server.IInventory;
import net.minecraft.server.ItemStack;
import net.minecraft.server.NonNullList;
+import org.bukkit.craftbukkit.util.CraftChatMessage;
public class CraftInventoryCustom extends CraftInventory {
public CraftInventoryCustom(InventoryHolder owner, InventoryType type) {
@@ -39,7 +40,7 @@ public class CraftInventoryCustom extends CraftInventory {
private final NonNullList<ItemStack> items;
private int maxStack = MAX_STACK;
private final List<HumanEntity> viewers;
- private final String title;
+ private final IChatBaseComponent title;
private InventoryType type;
private final InventoryHolder owner;
@@ -60,7 +61,7 @@ public class CraftInventoryCustom extends CraftInventory {
public MinecraftInventory(InventoryHolder owner, int size, String title) {
Validate.notNull(title, "Title cannot be null");
this.items = NonNullList.a(size, ItemStack.a);
- this.title = title;
+ this.title = CraftChatMessage.fromStringOrNull(title);
this.viewers = new ArrayList<HumanEntity>();
this.owner = owner;
this.type = InventoryType.CHEST;
@@ -182,7 +183,12 @@ public class CraftInventoryCustom extends CraftInventory {
}
@Override
- public String getName() {
+ public IChatBaseComponent getDisplayName() {
+ return title;
+ }
+
+ @Override
+ public IChatBaseComponent getCustomName() {
return title;
}
@@ -193,7 +199,7 @@ public class CraftInventoryCustom extends CraftInventory {
@Override
public IChatBaseComponent getScoreboardDisplayName() {
- return new ChatComponentText(title);
+ return title;
}
@Override
@@ -202,7 +208,7 @@ public class CraftInventoryCustom extends CraftInventory {
}
@Override
- public boolean x_() {
+ public boolean P_() {
Iterator iterator = this.items.iterator();
ItemStack itemstack;
diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventoryDoubleChest.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventoryDoubleChest.java
index f028b339..799f8ea5 100644
--- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventoryDoubleChest.java
+++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventoryDoubleChest.java
@@ -1,5 +1,6 @@
package org.bukkit.craftbukkit.inventory;
+import net.minecraft.server.ChatMessage;
import net.minecraft.server.ITileInventory;
import org.bukkit.block.DoubleChest;
import org.bukkit.inventory.DoubleChestInventory;
@@ -14,7 +15,7 @@ public class CraftInventoryDoubleChest extends CraftInventory implements DoubleC
private final CraftInventory right;
public CraftInventoryDoubleChest(CraftInventory left, CraftInventory right) {
- super(new InventoryLargeChest("Large chest", (ITileInventory) left.getInventory(), (ITileInventory) right.getInventory()));
+ super(new InventoryLargeChest(new ChatMessage("container.chestDouble"), (ITileInventory) left.getInventory(), (ITileInventory) right.getInventory()));
this.left = left;
this.right = right;
}
diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventoryPlayer.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventoryPlayer.java
index 67c54899..6cbe0695 100644
--- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventoryPlayer.java
+++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventoryPlayer.java
@@ -184,23 +184,6 @@ public class CraftInventoryPlayer extends CraftInventory implements org.bukkit.i
setSlots(items, getInventory().items.size() + getInventory().armor.size(), getInventory().extraSlots.size());
}
- public int clear(int id, int data) {
- int count = 0;
- ItemStack[] items = getContents();
-
- for (int i = 0; i < items.length; i++) {
- ItemStack item = items[i];
- if (item == null) continue;
- if (id > -1 && item.getTypeId() != id) continue;
- if (data > -1 && item.getData().getData() != data) continue;
-
- count += item.getAmount();
- setItem(i, null);
- }
-
- return count;
- }
-
@Override
public HumanEntity getHolder() {
return (HumanEntity) inventory.getOwner();
diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftItemFactory.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftItemFactory.java
index 49ebad22..e305d663 100644
--- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftItemFactory.java
+++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftItemFactory.java
@@ -6,6 +6,7 @@ import org.apache.commons.lang.Validate;
import org.bukkit.Color;
import org.bukkit.Material;
import org.bukkit.configuration.serialization.ConfigurationSerialization;
+import org.bukkit.craftbukkit.util.CraftLegacy;
import org.bukkit.inventory.ItemFactory;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
@@ -47,6 +48,7 @@ public final class CraftItemFactory implements ItemFactory {
}
public boolean isApplicable(ItemMeta meta, Material type) {
+ type = CraftLegacy.fromLegacy(type); // This may be called from legacy item stacks, try to get the right material
if (type == null || meta == null) {
return false;
}
@@ -63,14 +65,27 @@ public final class CraftItemFactory implements ItemFactory {
}
private ItemMeta getItemMeta(Material material, CraftMetaItem meta) {
+ material = CraftLegacy.fromLegacy(material); // This may be called from legacy item stacks, try to get the right material
switch (material) {
case AIR:
return null;
case WRITTEN_BOOK:
return meta instanceof CraftMetaBookSigned ? meta : new CraftMetaBookSigned(meta);
- case BOOK_AND_QUILL:
+ case WRITABLE_BOOK:
return meta != null && meta.getClass().equals(CraftMetaBook.class) ? meta : new CraftMetaBook(meta);
- case SKULL_ITEM:
+ case CREEPER_HEAD:
+ case CREEPER_WALL_HEAD:
+ case DRAGON_HEAD:
+ case DRAGON_WALL_HEAD:
+ case PISTON_HEAD:
+ case PLAYER_HEAD:
+ case PLAYER_WALL_HEAD:
+ case SKELETON_SKULL:
+ case SKELETON_WALL_SKULL:
+ case WITHER_SKELETON_SKULL:
+ case WITHER_SKELETON_WALL_SKULL:
+ case ZOMBIE_HEAD:
+ case ZOMBIE_WALL_HEAD:
return meta instanceof CraftMetaSkull ? meta : new CraftMetaSkull(meta);
case LEATHER_HELMET:
case LEATHER_CHESTPLATE:
@@ -82,17 +97,90 @@ public final class CraftItemFactory implements ItemFactory {
case LINGERING_POTION:
case TIPPED_ARROW:
return meta instanceof CraftMetaPotion ? meta : new CraftMetaPotion(meta);
- case MAP:
+ case FILLED_MAP:
return meta instanceof CraftMetaMap ? meta : new CraftMetaMap(meta);
- case FIREWORK:
+ case FIREWORK_ROCKET:
return meta instanceof CraftMetaFirework ? meta : new CraftMetaFirework(meta);
- case FIREWORK_CHARGE:
+ case FIREWORK_STAR:
return meta instanceof CraftMetaCharge ? meta : new CraftMetaCharge(meta);
case ENCHANTED_BOOK:
return meta instanceof CraftMetaEnchantedBook ? meta : new CraftMetaEnchantedBook(meta);
- case BANNER:
+ case BLACK_BANNER:
+ case BLACK_WALL_BANNER:
+ case BLUE_BANNER:
+ case BLUE_WALL_BANNER:
+ case BROWN_BANNER:
+ case BROWN_WALL_BANNER:
+ case CYAN_BANNER:
+ case CYAN_WALL_BANNER:
+ case GRAY_BANNER:
+ case GRAY_WALL_BANNER:
+ case GREEN_BANNER:
+ case GREEN_WALL_BANNER:
+ case LIGHT_BLUE_BANNER:
+ case LIGHT_BLUE_WALL_BANNER:
+ case LIGHT_GRAY_BANNER:
+ case LIGHT_GRAY_WALL_BANNER:
+ case LIME_BANNER:
+ case LIME_WALL_BANNER:
+ case MAGENTA_BANNER:
+ case MAGENTA_WALL_BANNER:
+ case ORANGE_BANNER:
+ case ORANGE_WALL_BANNER:
+ case PINK_BANNER:
+ case PINK_WALL_BANNER:
+ case PURPLE_BANNER:
+ case PURPLE_WALL_BANNER:
+ case RED_BANNER:
+ case RED_WALL_BANNER:
+ case WHITE_BANNER:
+ case WHITE_WALL_BANNER:
+ case YELLOW_BANNER:
+ case YELLOW_WALL_BANNER:
return meta instanceof CraftMetaBanner ? meta : new CraftMetaBanner(meta);
- case MONSTER_EGG:
+ case BAT_SPAWN_EGG:
+ case BLAZE_SPAWN_EGG:
+ case CAVE_SPIDER_SPAWN_EGG:
+ case CHICKEN_SPAWN_EGG:
+ case COW_SPAWN_EGG:
+ case CREEPER_SPAWN_EGG:
+ case DONKEY_SPAWN_EGG:
+ case ELDER_GUARDIAN_SPAWN_EGG:
+ case ENDERMAN_SPAWN_EGG:
+ case ENDERMITE_SPAWN_EGG:
+ case EVOKER_SPAWN_EGG:
+ case GHAST_SPAWN_EGG:
+ case GUARDIAN_SPAWN_EGG:
+ case HORSE_SPAWN_EGG:
+ case HUSK_SPAWN_EGG:
+ case LLAMA_SPAWN_EGG:
+ case MAGMA_CUBE_SPAWN_EGG:
+ case MOOSHROOM_SPAWN_EGG:
+ case MULE_SPAWN_EGG:
+ case OCELOT_SPAWN_EGG:
+ case PARROT_SPAWN_EGG:
+ case PIG_SPAWN_EGG:
+ case POLAR_BEAR_SPAWN_EGG:
+ case RABBIT_SPAWN_EGG:
+ case SHEEP_SPAWN_EGG:
+ case SHULKER_SPAWN_EGG:
+ case SILVERFISH_SPAWN_EGG:
+ case SKELETON_HORSE_SPAWN_EGG:
+ case SKELETON_SPAWN_EGG:
+ case SLIME_SPAWN_EGG:
+ case SPIDER_SPAWN_EGG:
+ case SQUID_SPAWN_EGG:
+ case STRAY_SPAWN_EGG:
+ case VEX_SPAWN_EGG:
+ case VILLAGER_SPAWN_EGG:
+ case VINDICATOR_SPAWN_EGG:
+ case WITCH_SPAWN_EGG:
+ case WITHER_SKELETON_SPAWN_EGG:
+ case WOLF_SPAWN_EGG:
+ case ZOMBIE_HORSE_SPAWN_EGG:
+ case ZOMBIE_PIGMAN_SPAWN_EGG:
+ case ZOMBIE_SPAWN_EGG:
+ case ZOMBIE_VILLAGER_SPAWN_EGG:
return meta instanceof CraftMetaSpawnEgg ? meta : new CraftMetaSpawnEgg(meta);
case KNOWLEDGE_BOOK:
return meta instanceof CraftMetaKnowledgeBook ? meta : new CraftMetaKnowledgeBook(meta);
@@ -103,19 +191,17 @@ public final class CraftItemFactory implements ItemFactory {
case DISPENSER:
case DROPPER:
case SIGN:
- case MOB_SPAWNER:
+ case SPAWNER:
case NOTE_BLOCK:
- case BREWING_STAND_ITEM:
- case ENCHANTMENT_TABLE:
- case COMMAND:
- case COMMAND_REPEATING:
- case COMMAND_CHAIN:
+ case BREWING_STAND:
+ case ENCHANTING_TABLE:
+ case COMMAND_BLOCK:
+ case REPEATING_COMMAND_BLOCK:
+ case CHAIN_COMMAND_BLOCK:
case BEACON:
case DAYLIGHT_DETECTOR:
- case DAYLIGHT_DETECTOR_INVERTED:
case HOPPER:
- case REDSTONE_COMPARATOR:
- case FLOWER_POT_ITEM:
+ case COMPARATOR:
case SHIELD:
case STRUCTURE_BLOCK:
case WHITE_SHULKER_BOX:
@@ -126,7 +212,7 @@ public final class CraftItemFactory implements ItemFactory {
case LIME_SHULKER_BOX:
case PINK_SHULKER_BOX:
case GRAY_SHULKER_BOX:
- case SILVER_SHULKER_BOX:
+ case LIGHT_GRAY_SHULKER_BOX:
case CYAN_SHULKER_BOX:
case PURPLE_SHULKER_BOX:
case BLUE_SHULKER_BOX:
@@ -136,6 +222,8 @@ public final class CraftItemFactory implements ItemFactory {
case BLACK_SHULKER_BOX:
case ENDER_CHEST:
return new CraftMetaBlockState(meta, material);
+ case TROPICAL_FISH_BUCKET:
+ return meta instanceof CraftMetaTropicalFishBucket ? meta : new CraftMetaTropicalFishBucket(meta);
default:
return new CraftMetaItem(meta);
}
@@ -194,4 +282,9 @@ public final class CraftItemFactory implements ItemFactory {
public Color getDefaultLeatherColor() {
return DEFAULT_LEATHER_COLOR;
}
+
+ @Override
+ public Material updateMaterial(ItemMeta meta, Material material) throws IllegalArgumentException {
+ return ((CraftMetaItem) meta).updateMaterial(material);
+ }
}
diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftItemStack.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftItemStack.java
index fb1dc542..4c4f0455 100644
--- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftItemStack.java
+++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftItemStack.java
@@ -18,9 +18,11 @@ import org.bukkit.craftbukkit.util.CraftMagicNumbers;
import org.bukkit.enchantments.Enchantment;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
+import org.bukkit.material.MaterialData;
import com.google.common.collect.ImmutableMap;
import org.bukkit.craftbukkit.enchantments.CraftEnchantment;
+import org.bukkit.craftbukkit.util.CraftNamespacedKey;
@DelegateDeserialization(ItemStack.class)
public final class CraftItemStack extends ItemStack {
@@ -30,17 +32,17 @@ public final class CraftItemStack extends ItemStack {
CraftItemStack stack = (CraftItemStack) original;
return stack.handle == null ? net.minecraft.server.ItemStack.a : stack.handle.cloneItemStack();
}
- if (original == null || original.getTypeId() <= 0) {
+ if (original == null || original.getType() == Material.AIR) {
return net.minecraft.server.ItemStack.a;
}
- Item item = CraftMagicNumbers.getItem(original.getType());
+ Item item = CraftMagicNumbers.getItem(original.getType(), original.getDurability());
if (item == null) {
return net.minecraft.server.ItemStack.a;
}
- net.minecraft.server.ItemStack stack = new net.minecraft.server.ItemStack(item, original.getAmount(), original.getDurability(), false);
+ net.minecraft.server.ItemStack stack = new net.minecraft.server.ItemStack(item, original.getAmount());
if (original.hasItemMeta()) {
setItemMeta(stack, original.getItemMeta());
} else {
@@ -63,7 +65,7 @@ public final class CraftItemStack extends ItemStack {
if (original.isEmpty()) {
return new ItemStack(Material.AIR);
}
- ItemStack stack = new ItemStack(CraftMagicNumbers.getMaterial(original.getItem()), original.getCount(), (short) original.getData());
+ ItemStack stack = new ItemStack(CraftMagicNumbers.getMaterial(original.getItem()), original.getCount());
if (hasItemMeta(original)) {
stack.setItemMeta(getItemMeta(original));
}
@@ -100,7 +102,7 @@ public final class CraftItemStack extends ItemStack {
}
private CraftItemStack(ItemStack item) {
- this(item.getTypeId(), item.getAmount(), item.getDurability(), item.hasItemMeta() ? item.getItemMeta() : null);
+ this(item.getType(), item.getAmount(), item.getDurability(), item.hasItemMeta() ? item.getItemMeta() : null);
}
private CraftItemStack(Material type, int amount, short durability, ItemMeta itemMeta) {
@@ -110,26 +112,26 @@ public final class CraftItemStack extends ItemStack {
setItemMeta(itemMeta);
}
- private CraftItemStack(int typeId, int amount, short durability, ItemMeta itemMeta) {
- this(Material.getMaterial(typeId), amount, durability, itemMeta);
-
+ @Override
+ public MaterialData getData() {
+ return handle != null ? CraftMagicNumbers.getMaterialData(handle.getItem()) : super.getData();
}
@Override
- public int getTypeId() {
- return handle != null ? CraftMagicNumbers.getId(handle.getItem()) : 0;
+ public Material getType() {
+ return handle != null ? CraftMagicNumbers.getMaterial(handle.getItem()) : Material.AIR;
}
@Override
- public void setTypeId(int type) {
- if (getTypeId() == type) {
+ public void setType(Material type) {
+ if (getType() == type) {
return;
- } else if (type == 0) {
+ } else if (type == Material.AIR) {
handle = null;
} else if (CraftMagicNumbers.getItem(type) == null) { // :(
handle = null;
} else if (handle == null) {
- handle = new net.minecraft.server.ItemStack(CraftMagicNumbers.getItem(type), 1, 0);
+ handle = new net.minecraft.server.ItemStack(CraftMagicNumbers.getItem(type), 1);
} else {
handle.setItem(CraftMagicNumbers.getItem(type));
if (hasItemMeta()) {
@@ -161,14 +163,14 @@ public final class CraftItemStack extends ItemStack {
public void setDurability(final short durability) {
// Ignore damage if item is null
if (handle != null) {
- handle.setData(durability);
+ handle.setDamage(durability);
}
}
@Override
public short getDurability() {
if (handle != null) {
- return (short) handle.getData();
+ return (short) handle.getDamage();
} else {
return -1;
}
@@ -195,14 +197,14 @@ public final class CraftItemStack extends ItemStack {
for (int i = 0; i < size; i++) {
NBTTagCompound tag = (NBTTagCompound) list.get(i);
- short id = tag.getShort(ENCHANTMENTS_ID.NBT);
- if (id == ench.getId()) {
+ String id = tag.getString(ENCHANTMENTS_ID.NBT);
+ if (id.equals(ench.getKey().toString())) {
tag.setShort(ENCHANTMENTS_LVL.NBT, (short) level);
return;
}
}
NBTTagCompound tag = new NBTTagCompound();
- tag.setShort(ENCHANTMENTS_ID.NBT, (short) ench.getId());
+ tag.setString(ENCHANTMENTS_ID.NBT, ench.getKey().toString());
tag.setShort(ENCHANTMENTS_LVL.NBT, (short) level);
list.add(tag);
}
@@ -247,8 +249,8 @@ public final class CraftItemStack extends ItemStack {
for (int i = 0; i < size; i++) {
NBTTagCompound enchantment = (NBTTagCompound) list.get(i);
- int id = 0xffff & enchantment.getShort(ENCHANTMENTS_ID.NBT);
- if (id == ench.getId()) {
+ String id = enchantment.getString(ENCHANTMENTS_ID.NBT);
+ if (id.equals(ench.getKey().toString())) {
index = i;
level = 0xffff & enchantment.getShort(ENCHANTMENTS_LVL.NBT);
break;
@@ -293,10 +295,10 @@ public final class CraftItemStack extends ItemStack {
ImmutableMap.Builder<Enchantment, Integer> result = ImmutableMap.builder();
for (int i = 0; i < list.size(); i++) {
- int id = 0xffff & ((NBTTagCompound) list.get(i)).getShort(ENCHANTMENTS_ID.NBT);
+ String id = ((NBTTagCompound) list.get(i)).getString(ENCHANTMENTS_ID.NBT);
int level = 0xffff & ((NBTTagCompound) list.get(i)).getShort(ENCHANTMENTS_LVL.NBT);
- result.put(Enchantment.getById(id), level);
+ result.put(Enchantment.getByKey(CraftNamespacedKey.fromString(id)), level);
}
return result.build();
@@ -327,9 +329,21 @@ public final class CraftItemStack extends ItemStack {
switch (getType(item)) {
case WRITTEN_BOOK:
return new CraftMetaBookSigned(item.getTag());
- case BOOK_AND_QUILL:
+ case WRITABLE_BOOK:
return new CraftMetaBook(item.getTag());
- case SKULL_ITEM:
+ case CREEPER_HEAD:
+ case CREEPER_WALL_HEAD:
+ case DRAGON_HEAD:
+ case DRAGON_WALL_HEAD:
+ case PISTON_HEAD:
+ case PLAYER_HEAD:
+ case PLAYER_WALL_HEAD:
+ case SKELETON_SKULL:
+ case SKELETON_WALL_SKULL:
+ case WITHER_SKELETON_SKULL:
+ case WITHER_SKELETON_WALL_SKULL:
+ case ZOMBIE_HEAD:
+ case ZOMBIE_WALL_HEAD:
return new CraftMetaSkull(item.getTag());
case LEATHER_HELMET:
case LEATHER_CHESTPLATE:
@@ -341,17 +355,90 @@ public final class CraftItemStack extends ItemStack {
case LINGERING_POTION:
case TIPPED_ARROW:
return new CraftMetaPotion(item.getTag());
- case MAP:
+ case FILLED_MAP:
return new CraftMetaMap(item.getTag());
- case FIREWORK:
+ case FIREWORK_ROCKET:
return new CraftMetaFirework(item.getTag());
- case FIREWORK_CHARGE:
+ case FIREWORK_STAR:
return new CraftMetaCharge(item.getTag());
case ENCHANTED_BOOK:
return new CraftMetaEnchantedBook(item.getTag());
- case BANNER:
+ case BLACK_BANNER:
+ case BLACK_WALL_BANNER:
+ case BLUE_BANNER:
+ case BLUE_WALL_BANNER:
+ case BROWN_BANNER:
+ case BROWN_WALL_BANNER:
+ case CYAN_BANNER:
+ case CYAN_WALL_BANNER:
+ case GRAY_BANNER:
+ case GRAY_WALL_BANNER:
+ case GREEN_BANNER:
+ case GREEN_WALL_BANNER:
+ case LIGHT_BLUE_BANNER:
+ case LIGHT_BLUE_WALL_BANNER:
+ case LIGHT_GRAY_BANNER:
+ case LIGHT_GRAY_WALL_BANNER:
+ case LIME_BANNER:
+ case LIME_WALL_BANNER:
+ case MAGENTA_BANNER:
+ case MAGENTA_WALL_BANNER:
+ case ORANGE_BANNER:
+ case ORANGE_WALL_BANNER:
+ case PINK_BANNER:
+ case PINK_WALL_BANNER:
+ case PURPLE_BANNER:
+ case PURPLE_WALL_BANNER:
+ case RED_BANNER:
+ case RED_WALL_BANNER:
+ case WHITE_BANNER:
+ case WHITE_WALL_BANNER:
+ case YELLOW_BANNER:
+ case YELLOW_WALL_BANNER:
return new CraftMetaBanner(item.getTag());
- case MONSTER_EGG:
+ case BAT_SPAWN_EGG:
+ case BLAZE_SPAWN_EGG:
+ case CAVE_SPIDER_SPAWN_EGG:
+ case CHICKEN_SPAWN_EGG:
+ case COW_SPAWN_EGG:
+ case CREEPER_SPAWN_EGG:
+ case DONKEY_SPAWN_EGG:
+ case ELDER_GUARDIAN_SPAWN_EGG:
+ case ENDERMAN_SPAWN_EGG:
+ case ENDERMITE_SPAWN_EGG:
+ case EVOKER_SPAWN_EGG:
+ case GHAST_SPAWN_EGG:
+ case GUARDIAN_SPAWN_EGG:
+ case HORSE_SPAWN_EGG:
+ case HUSK_SPAWN_EGG:
+ case LLAMA_SPAWN_EGG:
+ case MAGMA_CUBE_SPAWN_EGG:
+ case MOOSHROOM_SPAWN_EGG:
+ case MULE_SPAWN_EGG:
+ case OCELOT_SPAWN_EGG:
+ case PARROT_SPAWN_EGG:
+ case PIG_SPAWN_EGG:
+ case POLAR_BEAR_SPAWN_EGG:
+ case RABBIT_SPAWN_EGG:
+ case SHEEP_SPAWN_EGG:
+ case SHULKER_SPAWN_EGG:
+ case SILVERFISH_SPAWN_EGG:
+ case SKELETON_HORSE_SPAWN_EGG:
+ case SKELETON_SPAWN_EGG:
+ case SLIME_SPAWN_EGG:
+ case SPIDER_SPAWN_EGG:
+ case SQUID_SPAWN_EGG:
+ case STRAY_SPAWN_EGG:
+ case VEX_SPAWN_EGG:
+ case VILLAGER_SPAWN_EGG:
+ case VINDICATOR_SPAWN_EGG:
+ case WITCH_SPAWN_EGG:
+ case WITHER_SKELETON_SPAWN_EGG:
+ case WOLF_SPAWN_EGG:
+ case ZOMBIE_HORSE_SPAWN_EGG:
+ case ZOMBIE_PIGMAN_SPAWN_EGG:
+ case ZOMBIE_SPAWN_EGG:
+ case ZOMBIE_VILLAGER_SPAWN_EGG:
return new CraftMetaSpawnEgg(item.getTag());
case KNOWLEDGE_BOOK:
return new CraftMetaKnowledgeBook(item.getTag());
@@ -362,19 +449,17 @@ public final class CraftItemStack extends ItemStack {
case DISPENSER:
case DROPPER:
case SIGN:
- case MOB_SPAWNER:
+ case SPAWNER:
case NOTE_BLOCK:
- case BREWING_STAND_ITEM:
- case ENCHANTMENT_TABLE:
- case COMMAND:
- case COMMAND_REPEATING:
- case COMMAND_CHAIN:
+ case BREWING_STAND:
+ case ENCHANTING_TABLE:
+ case COMMAND_BLOCK:
+ case REPEATING_COMMAND_BLOCK:
+ case CHAIN_COMMAND_BLOCK:
case BEACON:
case DAYLIGHT_DETECTOR:
- case DAYLIGHT_DETECTOR_INVERTED:
case HOPPER:
- case REDSTONE_COMPARATOR:
- case FLOWER_POT_ITEM:
+ case COMPARATOR:
case SHIELD:
case STRUCTURE_BLOCK:
case WHITE_SHULKER_BOX:
@@ -385,7 +470,7 @@ public final class CraftItemStack extends ItemStack {
case LIME_SHULKER_BOX:
case PINK_SHULKER_BOX:
case GRAY_SHULKER_BOX:
- case SILVER_SHULKER_BOX:
+ case LIGHT_GRAY_SHULKER_BOX:
case CYAN_SHULKER_BOX:
case PURPLE_SHULKER_BOX:
case BLUE_SHULKER_BOX:
@@ -395,14 +480,15 @@ public final class CraftItemStack extends ItemStack {
case BLACK_SHULKER_BOX:
case ENDER_CHEST:
return new CraftMetaBlockState(item.getTag(), CraftMagicNumbers.getMaterial(item.getItem()));
+ case TROPICAL_FISH_BUCKET:
+ return new CraftMetaTropicalFishBucket(item.getTag());
default:
return new CraftMetaItem(item.getTag());
}
}
static Material getType(net.minecraft.server.ItemStack item) {
- Material material = Material.getMaterial(item == null ? 0 : CraftMagicNumbers.getId(item.getItem()));
- return material == null ? Material.AIR : material;
+ return item == null ? Material.AIR : CraftMagicNumbers.getMaterial(item.getItem());
}
@Override
@@ -425,6 +511,12 @@ public final class CraftItemStack extends ItemStack {
itemMeta = CraftItemFactory.instance().asMetaFor(itemMeta, getType(item));
if (itemMeta == null) return true;
+ Item oldItem = item.getItem();
+ Item newItem = CraftMagicNumbers.getItem(CraftItemFactory.instance().updateMaterial(itemMeta, CraftMagicNumbers.getMaterial(oldItem)));
+ if (oldItem != newItem) {
+ item.setItem(newItem);
+ }
+
NBTTagCompound tag = new NBTTagCompound();
item.setTag(tag);
@@ -453,7 +545,7 @@ public final class CraftItemStack extends ItemStack {
if (handle == null || that.handle == null) {
return false;
}
- if (!(that.getTypeId() == getTypeId() && getDurability() == that.getDurability())) {
+ if (!(that.getType() == getType() && getDurability() == that.getDurability())) {
return false;
}
return hasItemMeta() ? that.hasItemMeta() && handle.getTag().equals(that.handle.getTag()) : !that.hasItemMeta();
diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMerchantCustom.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMerchantCustom.java
index 527e7ba9..bc898d69 100644
--- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMerchantCustom.java
+++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMerchantCustom.java
@@ -62,12 +62,12 @@ public class CraftMerchantCustom extends CraftMerchant {
}
@Override
- public World u_() {
+ public World getWorld() {
return null;
}
@Override
- public BlockPosition v_() {
+ public BlockPosition getPosition() {
return null;
}
}
diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaBanner.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaBanner.java
index 7b356789..4d1cc88a 100644
--- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaBanner.java
+++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaBanner.java
@@ -52,7 +52,7 @@ public class CraftMetaBanner extends CraftMetaItem implements BannerMeta {
if (entityTag.hasKey(PATTERNS.NBT)) {
NBTTagList patterns = entityTag.getList(PATTERNS.NBT, CraftMagicNumbers.NBT.TAG_COMPOUND);
for (int i = 0; i < Math.min(patterns.size(), 20); i++) {
- NBTTagCompound p = patterns.get(i);
+ NBTTagCompound p = patterns.getCompound(i);
this.patterns.add(new Pattern(DyeColor.getByDyeData((byte) p.getInt(COLOR.NBT)), PatternType.getByIdentifier(p.getString(PATTERN.NBT))));
}
}
@@ -198,7 +198,43 @@ public class CraftMetaBanner extends CraftMetaItem implements BannerMeta {
@Override
boolean applicableTo(Material type) {
- return type == Material.BANNER;
+ switch (type) {
+ case BLACK_BANNER:
+ case BLACK_WALL_BANNER:
+ case BLUE_BANNER:
+ case BLUE_WALL_BANNER:
+ case BROWN_BANNER:
+ case BROWN_WALL_BANNER:
+ case CYAN_BANNER:
+ case CYAN_WALL_BANNER:
+ case GRAY_BANNER:
+ case GRAY_WALL_BANNER:
+ case GREEN_BANNER:
+ case GREEN_WALL_BANNER:
+ case LIGHT_BLUE_BANNER:
+ case LIGHT_BLUE_WALL_BANNER:
+ case LIGHT_GRAY_BANNER:
+ case LIGHT_GRAY_WALL_BANNER:
+ case LIME_BANNER:
+ case LIME_WALL_BANNER:
+ case MAGENTA_BANNER:
+ case MAGENTA_WALL_BANNER:
+ case ORANGE_BANNER:
+ case ORANGE_WALL_BANNER:
+ case PINK_BANNER:
+ case PINK_WALL_BANNER:
+ case PURPLE_BANNER:
+ case PURPLE_WALL_BANNER:
+ case RED_BANNER:
+ case RED_WALL_BANNER:
+ case WHITE_BANNER:
+ case WHITE_WALL_BANNER:
+ case YELLOW_BANNER:
+ case YELLOW_WALL_BANNER:
+ return true;
+ default:
+ return false;
+ }
}
@Override
diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaBlockState.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaBlockState.java
index 3bd9ee47..2e44d133 100644
--- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaBlockState.java
+++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaBlockState.java
@@ -18,12 +18,11 @@ import net.minecraft.server.TileEntityDropper;
import net.minecraft.server.TileEntityEnchantTable;
import net.minecraft.server.TileEntityEndGateway;
import net.minecraft.server.TileEntityEnderChest;
-import net.minecraft.server.TileEntityFlowerPot;
import net.minecraft.server.TileEntityFurnace;
import net.minecraft.server.TileEntityHopper;
+import net.minecraft.server.TileEntityJukeBox;
import net.minecraft.server.TileEntityLightDetector;
import net.minecraft.server.TileEntityMobSpawner;
-import net.minecraft.server.TileEntityNote;
import net.minecraft.server.TileEntityShulkerBox;
import net.minecraft.server.TileEntitySign;
import net.minecraft.server.TileEntitySkull;
@@ -46,11 +45,9 @@ import org.bukkit.craftbukkit.block.CraftDropper;
import org.bukkit.craftbukkit.block.CraftEnchantingTable;
import org.bukkit.craftbukkit.block.CraftEndGateway;
import org.bukkit.craftbukkit.block.CraftEnderChest;
-import org.bukkit.craftbukkit.block.CraftFlowerPot;
import org.bukkit.craftbukkit.block.CraftFurnace;
import org.bukkit.craftbukkit.block.CraftHopper;
import org.bukkit.craftbukkit.block.CraftJukebox;
-import org.bukkit.craftbukkit.block.CraftNoteBlock;
import org.bukkit.craftbukkit.block.CraftShulkerBox;
import org.bukkit.craftbukkit.block.CraftSign;
import org.bukkit.craftbukkit.block.CraftSkull;
@@ -176,19 +173,17 @@ public class CraftMetaBlockState extends CraftMetaItem implements BlockStateMeta
case DISPENSER:
case DROPPER:
case SIGN:
- case MOB_SPAWNER:
+ case SPAWNER:
case NOTE_BLOCK:
- case BREWING_STAND_ITEM:
- case ENCHANTMENT_TABLE:
- case COMMAND:
- case COMMAND_REPEATING:
- case COMMAND_CHAIN:
+ case BREWING_STAND:
+ case ENCHANTING_TABLE:
+ case COMMAND_BLOCK:
+ case REPEATING_COMMAND_BLOCK:
+ case CHAIN_COMMAND_BLOCK:
case BEACON:
case DAYLIGHT_DETECTOR:
- case DAYLIGHT_DETECTOR_INVERTED:
case HOPPER:
- case REDSTONE_COMPARATOR:
- case FLOWER_POT_ITEM:
+ case COMPARATOR:
case SHIELD:
case STRUCTURE_BLOCK:
case WHITE_SHULKER_BOX:
@@ -199,7 +194,7 @@ public class CraftMetaBlockState extends CraftMetaItem implements BlockStateMeta
case LIME_SHULKER_BOX:
case PINK_SHULKER_BOX:
case GRAY_SHULKER_BOX:
- case SILVER_SHULKER_BOX:
+ case LIGHT_GRAY_SHULKER_BOX:
case CYAN_SHULKER_BOX:
case PURPLE_SHULKER_BOX:
case BLUE_SHULKER_BOX:
@@ -217,7 +212,7 @@ public class CraftMetaBlockState extends CraftMetaItem implements BlockStateMeta
public CraftMetaBlockState clone() {
CraftMetaBlockState meta = (CraftMetaBlockState) super.clone();
if (blockEntityTag != null) {
- meta.blockEntityTag = blockEntityTag.g();
+ meta.blockEntityTag = blockEntityTag.clone();
}
return meta;
}
@@ -242,7 +237,7 @@ public class CraftMetaBlockState extends CraftMetaItem implements BlockStateMeta
case LIME_SHULKER_BOX:
case PINK_SHULKER_BOX:
case GRAY_SHULKER_BOX:
- case SILVER_SHULKER_BOX:
+ case LIGHT_GRAY_SHULKER_BOX:
case CYAN_SHULKER_BOX:
case PURPLE_SHULKER_BOX:
case BLUE_SHULKER_BOX:
@@ -254,11 +249,10 @@ public class CraftMetaBlockState extends CraftMetaItem implements BlockStateMeta
break;
}
}
- TileEntity te = (blockEntityTag == null) ? null : TileEntity.create(null, blockEntityTag);
+ TileEntity te = (blockEntityTag == null) ? null : TileEntity.create(blockEntityTag);
switch (material) {
case SIGN:
- case SIGN_POST:
case WALL_SIGN:
if (te == null) {
te = new TileEntitySign();
@@ -270,7 +264,6 @@ public class CraftMetaBlockState extends CraftMetaItem implements BlockStateMeta
te = new TileEntityChest();
}
return new CraftChest(material, (TileEntityChest) te);
- case BURNING_FURNACE:
case FURNACE:
if (te == null) {
te = new TileEntityFurnace();
@@ -296,34 +289,41 @@ public class CraftMetaBlockState extends CraftMetaItem implements BlockStateMeta
te = new TileEntityHopper();
}
return new CraftHopper(material, (TileEntityHopper) te);
- case MOB_SPAWNER:
+ case SPAWNER:
if (te == null) {
te = new TileEntityMobSpawner();
}
return new CraftCreatureSpawner(material, (TileEntityMobSpawner) te);
- case NOTE_BLOCK:
- if (te == null) {
- te = new TileEntityNote();
- }
- return new CraftNoteBlock(material, (TileEntityNote) te);
case JUKEBOX:
if (te == null) {
- te = new BlockJukeBox.TileEntityRecordPlayer();
+ te = new TileEntityJukeBox();
}
- return new CraftJukebox(material, (BlockJukeBox.TileEntityRecordPlayer) te);
- case BREWING_STAND_ITEM:
+ return new CraftJukebox(material, (TileEntityJukeBox) te);
+ case BREWING_STAND:
if (te == null) {
te = new TileEntityBrewingStand();
}
return new CraftBrewingStand(material, (TileEntityBrewingStand) te);
- case SKULL:
+ case CREEPER_HEAD:
+ case CREEPER_WALL_HEAD:
+ case DRAGON_HEAD:
+ case DRAGON_WALL_HEAD:
+ case PISTON_HEAD:
+ case PLAYER_HEAD:
+ case PLAYER_WALL_HEAD:
+ case SKELETON_SKULL:
+ case SKELETON_WALL_SKULL:
+ case WITHER_SKELETON_SKULL:
+ case WITHER_SKELETON_WALL_SKULL:
+ case ZOMBIE_HEAD:
+ case ZOMBIE_WALL_HEAD:
if (te == null) {
te = new TileEntitySkull();
}
return new CraftSkull(material, (TileEntitySkull) te);
- case COMMAND:
- case COMMAND_REPEATING:
- case COMMAND_CHAIN:
+ case COMMAND_BLOCK:
+ case REPEATING_COMMAND_BLOCK:
+ case CHAIN_COMMAND_BLOCK:
if (te == null) {
te = new TileEntityCommand();
}
@@ -334,18 +334,42 @@ public class CraftMetaBlockState extends CraftMetaItem implements BlockStateMeta
}
return new CraftBeacon(material, (TileEntityBeacon) te);
case SHIELD:
- case BANNER:
- case WALL_BANNER:
- case STANDING_BANNER:
+ case BLACK_BANNER:
+ case BLACK_WALL_BANNER:
+ case BLUE_BANNER:
+ case BLUE_WALL_BANNER:
+ case BROWN_BANNER:
+ case BROWN_WALL_BANNER:
+ case CYAN_BANNER:
+ case CYAN_WALL_BANNER:
+ case GRAY_BANNER:
+ case GRAY_WALL_BANNER:
+ case GREEN_BANNER:
+ case GREEN_WALL_BANNER:
+ case LIGHT_BLUE_BANNER:
+ case LIGHT_BLUE_WALL_BANNER:
+ case LIGHT_GRAY_BANNER:
+ case LIGHT_GRAY_WALL_BANNER:
+ case LIME_BANNER:
+ case LIME_WALL_BANNER:
+ case MAGENTA_BANNER:
+ case MAGENTA_WALL_BANNER:
+ case ORANGE_BANNER:
+ case ORANGE_WALL_BANNER:
+ case PINK_BANNER:
+ case PINK_WALL_BANNER:
+ case PURPLE_BANNER:
+ case PURPLE_WALL_BANNER:
+ case RED_BANNER:
+ case RED_WALL_BANNER:
+ case WHITE_BANNER:
+ case WHITE_WALL_BANNER:
+ case YELLOW_BANNER:
+ case YELLOW_WALL_BANNER:
if (te == null) {
te = new TileEntityBanner();
}
return new CraftBanner(material, (TileEntityBanner) te);
- case FLOWER_POT_ITEM:
- if (te == null) {
- te = new TileEntityFlowerPot();
- }
- return new CraftFlowerPot(material, (TileEntityFlowerPot) te);
case STRUCTURE_BLOCK:
if (te == null) {
te = new TileEntityStructure();
@@ -359,7 +383,7 @@ public class CraftMetaBlockState extends CraftMetaItem implements BlockStateMeta
case LIME_SHULKER_BOX:
case PINK_SHULKER_BOX:
case GRAY_SHULKER_BOX:
- case SILVER_SHULKER_BOX:
+ case LIGHT_GRAY_SHULKER_BOX:
case CYAN_SHULKER_BOX:
case PURPLE_SHULKER_BOX:
case BLUE_SHULKER_BOX:
@@ -371,7 +395,7 @@ public class CraftMetaBlockState extends CraftMetaItem implements BlockStateMeta
te = new TileEntityShulkerBox();
}
return new CraftShulkerBox(material, (TileEntityShulkerBox) te);
- case ENCHANTMENT_TABLE:
+ case ENCHANTING_TABLE:
if (te == null) {
te = new TileEntityEnchantTable();
}
@@ -382,17 +406,15 @@ public class CraftMetaBlockState extends CraftMetaItem implements BlockStateMeta
}
return new CraftEnderChest(material, (TileEntityEnderChest) te);
case DAYLIGHT_DETECTOR:
- case DAYLIGHT_DETECTOR_INVERTED:
if (te == null){
te = new TileEntityLightDetector();
}
return new CraftDaylightDetector(material, (TileEntityLightDetector) te);
- case REDSTONE_COMPARATOR:
+ case COMPARATOR:
if (te == null){
te = new TileEntityComparator();
}
return new CraftComparator(material, (TileEntityComparator) te);
- case PISTON_BASE:
default:
throw new IllegalStateException("Missing blockState for " + material);
}
@@ -405,7 +427,6 @@ public class CraftMetaBlockState extends CraftMetaItem implements BlockStateMeta
boolean valid;
switch (material) {
case SIGN:
- case SIGN_POST:
case WALL_SIGN:
valid = blockState instanceof CraftSign;
break;
@@ -413,7 +434,6 @@ public class CraftMetaBlockState extends CraftMetaItem implements BlockStateMeta
case TRAPPED_CHEST:
valid = blockState instanceof CraftChest;
break;
- case BURNING_FURNACE:
case FURNACE:
valid = blockState instanceof CraftFurnace;
break;
@@ -429,38 +449,73 @@ public class CraftMetaBlockState extends CraftMetaItem implements BlockStateMeta
case HOPPER:
valid = blockState instanceof CraftHopper;
break;
- case MOB_SPAWNER:
+ case SPAWNER:
valid = blockState instanceof CraftCreatureSpawner;
break;
- case NOTE_BLOCK:
- valid = blockState instanceof CraftNoteBlock;
- break;
case JUKEBOX:
valid = blockState instanceof CraftJukebox;
break;
- case BREWING_STAND_ITEM:
+ case BREWING_STAND:
valid = blockState instanceof CraftBrewingStand;
break;
- case SKULL:
+ case CREEPER_HEAD:
+ case CREEPER_WALL_HEAD:
+ case DRAGON_HEAD:
+ case DRAGON_WALL_HEAD:
+ case PISTON_HEAD:
+ case PLAYER_HEAD:
+ case PLAYER_WALL_HEAD:
+ case SKELETON_SKULL:
+ case SKELETON_WALL_SKULL:
+ case WITHER_SKELETON_SKULL:
+ case WITHER_SKELETON_WALL_SKULL:
+ case ZOMBIE_HEAD:
+ case ZOMBIE_WALL_HEAD:
valid = blockState instanceof CraftSkull;
break;
- case COMMAND:
- case COMMAND_REPEATING:
- case COMMAND_CHAIN:
+ case COMMAND_BLOCK:
+ case REPEATING_COMMAND_BLOCK:
+ case CHAIN_COMMAND_BLOCK:
valid = blockState instanceof CraftCommandBlock;
break;
case BEACON:
valid = blockState instanceof CraftBeacon;
break;
case SHIELD:
- case BANNER:
- case WALL_BANNER:
- case STANDING_BANNER:
+ case BLACK_BANNER:
+ case BLACK_WALL_BANNER:
+ case BLUE_BANNER:
+ case BLUE_WALL_BANNER:
+ case BROWN_BANNER:
+ case BROWN_WALL_BANNER:
+ case CYAN_BANNER:
+ case CYAN_WALL_BANNER:
+ case GRAY_BANNER:
+ case GRAY_WALL_BANNER:
+ case GREEN_BANNER:
+ case GREEN_WALL_BANNER:
+ case LIGHT_BLUE_BANNER:
+ case LIGHT_BLUE_WALL_BANNER:
+ case LIGHT_GRAY_BANNER:
+ case LIGHT_GRAY_WALL_BANNER:
+ case LIME_BANNER:
+ case LIME_WALL_BANNER:
+ case MAGENTA_BANNER:
+ case MAGENTA_WALL_BANNER:
+ case ORANGE_BANNER:
+ case ORANGE_WALL_BANNER:
+ case PINK_BANNER:
+ case PINK_WALL_BANNER:
+ case PURPLE_BANNER:
+ case PURPLE_WALL_BANNER:
+ case RED_BANNER:
+ case RED_WALL_BANNER:
+ case WHITE_BANNER:
+ case WHITE_WALL_BANNER:
+ case YELLOW_BANNER:
+ case YELLOW_WALL_BANNER:
valid = blockState instanceof CraftBanner;
break;
- case FLOWER_POT_ITEM:
- valid = blockState instanceof CraftFlowerPot;
- break;
case STRUCTURE_BLOCK:
valid = blockState instanceof CraftStructureBlock;
break;
@@ -472,7 +527,7 @@ public class CraftMetaBlockState extends CraftMetaItem implements BlockStateMeta
case LIME_SHULKER_BOX:
case PINK_SHULKER_BOX:
case GRAY_SHULKER_BOX:
- case SILVER_SHULKER_BOX:
+ case LIGHT_GRAY_SHULKER_BOX:
case CYAN_SHULKER_BOX:
case PURPLE_SHULKER_BOX:
case BLUE_SHULKER_BOX:
@@ -482,17 +537,16 @@ public class CraftMetaBlockState extends CraftMetaItem implements BlockStateMeta
case BLACK_SHULKER_BOX:
valid = blockState instanceof CraftShulkerBox;
break;
- case ENCHANTMENT_TABLE:
+ case ENCHANTING_TABLE:
valid = blockState instanceof CraftEnchantingTable;
break;
case ENDER_CHEST:
valid = blockState instanceof CraftEnderChest;
break;
case DAYLIGHT_DETECTOR:
- case DAYLIGHT_DETECTOR_INVERTED:
valid = blockState instanceof CraftDaylightDetector;
break;
- case REDSTONE_COMPARATOR:
+ case COMPARATOR:
valid = blockState instanceof CraftComparator;
break;
default:
diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaBook.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaBook.java
index 9c9ef295..c8654c68 100644
--- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaBook.java
+++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaBook.java
@@ -158,7 +158,7 @@ public class CraftMetaBook extends CraftMetaItem implements BookMeta {
boolean applicableTo(Material type) {
switch (type) {
case WRITTEN_BOOK:
- case BOOK_AND_QUILL:
+ case WRITABLE_BOOK:
return true;
default:
return false;
diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaBookSigned.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaBookSigned.java
index bffbe901..5050b609 100644
--- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaBookSigned.java
+++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaBookSigned.java
@@ -96,7 +96,7 @@ class CraftMetaBookSigned extends CraftMetaBook implements BookMeta {
boolean applicableTo(Material type) {
switch (type) {
case WRITTEN_BOOK:
- case BOOK_AND_QUILL:
+ case WRITABLE_BOOK:
return true;
default:
return false;
diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaCharge.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaCharge.java
index 6c6fde73..267581ec 100644
--- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaCharge.java
+++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaCharge.java
@@ -67,7 +67,7 @@ class CraftMetaCharge extends CraftMetaItem implements FireworkEffectMeta {
@Override
boolean applicableTo(Material type) {
switch (type) {
- case FIREWORK_CHARGE:
+ case FIREWORK_STAR:
return true;
default:
return false;
diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaFirework.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaFirework.java
index 682c2287..b82e2fdf 100644
--- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaFirework.java
+++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaFirework.java
@@ -253,7 +253,7 @@ class CraftMetaFirework extends CraftMetaItem implements FireworkMeta {
@Override
boolean applicableTo(Material type) {
switch(type) {
- case FIREWORK:
+ case FIREWORK_ROCKET:
return true;
default:
return false;
diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaItem.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaItem.java
index 8d82c4dc..dfd6e66b 100644
--- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaItem.java
+++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaItem.java
@@ -13,6 +13,7 @@ import java.util.List;
import java.util.Map;
import java.util.NoSuchElementException;
+import net.minecraft.server.IChatBaseComponent;
import net.minecraft.server.NBTBase;
import net.minecraft.server.NBTTagCompound;
import net.minecraft.server.NBTTagList;
@@ -25,9 +26,12 @@ import org.bukkit.configuration.serialization.DelegateDeserialization;
import org.bukkit.configuration.serialization.SerializableAs;
import org.bukkit.craftbukkit.Overridden;
import org.bukkit.craftbukkit.inventory.CraftMetaItem.ItemMetaKey.Specific;
+import org.bukkit.craftbukkit.util.CraftChatMessage;
import org.bukkit.craftbukkit.util.CraftMagicNumbers;
+import org.bukkit.craftbukkit.util.CraftNamespacedKey;
import org.bukkit.enchantments.Enchantment;
import org.bukkit.inventory.ItemFlag;
+import org.bukkit.inventory.meta.Damageable;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.inventory.meta.Repairable;
@@ -70,7 +74,7 @@ import org.apache.commons.codec.binary.Base64;
* <li> SerializableMeta.Deserializers deserializer()
*/
@DelegateDeserialization(CraftMetaItem.SerializableMeta.class)
-class CraftMetaItem implements ItemMeta, Repairable {
+class CraftMetaItem implements ItemMeta, Damageable, Repairable {
static class ItemMetaKey {
@@ -120,6 +124,7 @@ class CraftMetaItem implements ItemMeta, Repairable {
.put(CraftMetaFirework.class, "FIREWORK")
.put(CraftMetaCharge.class, "FIREWORK_EFFECT")
.put(CraftMetaKnowledgeBook.class, "KNOWLEDGE_BOOK")
+ .put(CraftMetaTropicalFishBucket.class, "TROPICAL_FISH_BUCKET")
.put(CraftMetaItem.class, "UNSPECIFIC")
.build();
@@ -192,7 +197,7 @@ class CraftMetaItem implements ItemMeta, Repairable {
@Specific(Specific.To.NBT)
static final ItemMetaKey DISPLAY = new ItemMetaKey("display");
static final ItemMetaKey LORE = new ItemMetaKey("Lore", "lore");
- static final ItemMetaKey ENCHANTMENTS = new ItemMetaKey("ench", "enchants");
+ static final ItemMetaKey ENCHANTMENTS = new ItemMetaKey("Enchantments", "enchants");
@Specific(Specific.To.NBT)
static final ItemMetaKey ENCHANTMENTS_ID = new ItemMetaKey("id");
@Specific(Specific.To.NBT)
@@ -216,14 +221,17 @@ class CraftMetaItem implements ItemMeta, Repairable {
static final ItemMetaKey HIDEFLAGS = new ItemMetaKey("HideFlags", "ItemFlags");
@Specific(Specific.To.NBT)
static final ItemMetaKey UNBREAKABLE = new ItemMetaKey("Unbreakable");
+ @Specific(Specific.To.NBT)
+ static final ItemMetaKey DAMAGE = new ItemMetaKey("Damage");
- private String displayName;
- private String locName;
+ private IChatBaseComponent displayName;
+ private IChatBaseComponent locName;
private List<String> lore;
private Map<Enchantment, Integer> enchantments;
private int repairCost;
private int hideFlag;
private boolean unbreakable;
+ private int damage;
private static final Set<String> HANDLED_TAGS = Sets.newHashSet();
@@ -249,6 +257,7 @@ class CraftMetaItem implements ItemMeta, Repairable {
this.repairCost = meta.repairCost;
this.hideFlag = meta.hideFlag;
this.unbreakable = meta.unbreakable;
+ this.damage = meta.damage;
this.unhandledTags.putAll(meta.unhandledTags);
this.internalTag = meta.internalTag;
@@ -262,11 +271,11 @@ class CraftMetaItem implements ItemMeta, Repairable {
NBTTagCompound display = tag.getCompound(DISPLAY.NBT);
if (display.hasKey(NAME.NBT)) {
- displayName = display.getString(NAME.NBT);
+ displayName = IChatBaseComponent.ChatSerializer.a(display.getString(NAME.NBT));
}
if (display.hasKey(LOCNAME.NBT)) {
- locName = display.getString(LOCNAME.NBT);
+ locName = IChatBaseComponent.ChatSerializer.a(display.getString(LOCNAME.NBT));
}
if (display.hasKey(LORE.NBT)) {
@@ -292,6 +301,9 @@ class CraftMetaItem implements ItemMeta, Repairable {
if (tag.hasKey(UNBREAKABLE.NBT)) {
unbreakable = tag.getBoolean(UNBREAKABLE.NBT);
}
+ if (tag.hasKey(DAMAGE.NBT)) {
+ damage = tag.getInt(DAMAGE.NBT);
+ }
if (tag.get(ATTRIBUTES.NBT) instanceof NBTTagList) {
NBTTagList save = null;
@@ -339,7 +351,7 @@ class CraftMetaItem implements ItemMeta, Repairable {
unhandledTags.put(ATTRIBUTES.NBT, save);
}
- Set<String> keys = tag.c();
+ Set<String> keys = tag.getKeys();
for (String key : keys) {
if (!getHandledTags().contains(key)) {
unhandledTags.put(key, tag.get(key));
@@ -356,10 +368,10 @@ class CraftMetaItem implements ItemMeta, Repairable {
Map<Enchantment, Integer> enchantments = new HashMap<Enchantment, Integer>(ench.size());
for (int i = 0; i < ench.size(); i++) {
- int id = 0xffff & ((NBTTagCompound) ench.get(i)).getShort(ENCHANTMENTS_ID.NBT);
+ String id = ((NBTTagCompound) ench.get(i)).getString(ENCHANTMENTS_ID.NBT);
int level = 0xffff & ((NBTTagCompound) ench.get(i)).getShort(ENCHANTMENTS_LVL.NBT);
- Enchantment enchant = Enchantment.getById(id);
+ Enchantment enchant = Enchantment.getByKey(CraftNamespacedKey.fromString(id));
if (enchant != null) {
enchantments.put(enchant, level);
}
@@ -402,13 +414,18 @@ class CraftMetaItem implements ItemMeta, Repairable {
setUnbreakable(unbreakable);
}
+ Integer damage = SerializableMeta.getObject(Integer.class, map, DAMAGE.BUKKIT, true);
+ if (damage != null) {
+ setDamage(damage);
+ }
+
String internal = SerializableMeta.getString(map, "internal", true);
if (internal != null) {
ByteArrayInputStream buf = new ByteArrayInputStream(Base64.decodeBase64(internal));
try {
internalTag = NBTCompressedStreamTools.a(buf);
deserializeInternal(internalTag);
- Set<String> keys = internalTag.c();
+ Set<String> keys = internalTag.getKeys();
for (String key : keys) {
if (!getHandledTags().contains(key)) {
unhandledTags.put(key, internalTag.get(key));
@@ -449,10 +466,10 @@ class CraftMetaItem implements ItemMeta, Repairable {
@Overridden
void applyToItem(NBTTagCompound itemTag) {
if (hasDisplayName()) {
- setDisplayTag(itemTag, NAME.NBT, new NBTTagString(displayName));
+ setDisplayTag(itemTag, NAME.NBT, new NBTTagString(CraftChatMessage.toJSON(displayName)));
}
if (hasLocalizedName()){
- setDisplayTag(itemTag, LOCNAME.NBT, new NBTTagString(locName));
+ setDisplayTag(itemTag, LOCNAME.NBT, new NBTTagString(CraftChatMessage.toJSON(locName)));
}
if (hasLore()) {
@@ -473,6 +490,10 @@ class CraftMetaItem implements ItemMeta, Repairable {
itemTag.setBoolean(UNBREAKABLE.NBT, unbreakable);
}
+ if (hasDamage()) {
+ itemTag.setInt(DAMAGE.NBT, damage);
+ }
+
for (Map.Entry<String, NBTBase> e : unhandledTags.entrySet()) {
itemTag.set(e.getKey(), e.getValue());
}
@@ -501,7 +522,7 @@ class CraftMetaItem implements ItemMeta, Repairable {
for (Map.Entry<Enchantment, Integer> entry : enchantments.entrySet()) {
NBTTagCompound subtag = new NBTTagCompound();
- subtag.setShort(ENCHANTMENTS_ID.NBT, (short) entry.getKey().getId());
+ subtag.setString(ENCHANTMENTS_ID.NBT, entry.getKey().getKey().toString());
subtag.setShort(ENCHANTMENTS_LVL.NBT, entry.getValue().shortValue());
list.add(subtag);
@@ -527,34 +548,34 @@ class CraftMetaItem implements ItemMeta, Repairable {
@Overridden
boolean isEmpty() {
- return !(hasDisplayName() || hasLocalizedName() || hasEnchants() || hasLore() || hasRepairCost() || !unhandledTags.isEmpty() || hideFlag != 0 || isUnbreakable());
+ return !(hasDisplayName() || hasLocalizedName() || hasEnchants() || hasLore() || hasRepairCost() || !unhandledTags.isEmpty() || hideFlag != 0 || isUnbreakable() || hasDamage());
}
public String getDisplayName() {
- return displayName;
+ return CraftChatMessage.fromComponent(displayName);
}
public final void setDisplayName(String name) {
- this.displayName = name;
+ this.displayName = CraftChatMessage.fromStringOrNull(name);
}
public boolean hasDisplayName() {
- return !Strings.isNullOrEmpty(displayName);
+ return displayName != null;
}
@Override
public String getLocalizedName() {
- return locName;
+ return CraftChatMessage.fromComponent(locName);
}
@Override
public void setLocalizedName(String name) {
- this.locName = name;
+ this.locName = CraftChatMessage.fromStringOrNull(name);
}
@Override
public boolean hasLocalizedName() {
- return !Strings.isNullOrEmpty(locName);
+ return locName != null;
}
public boolean hasLore() {
@@ -682,6 +703,21 @@ class CraftMetaItem implements ItemMeta, Repairable {
}
@Override
+ public boolean hasDamage() {
+ return damage > 0;
+ }
+
+ @Override
+ public int getDamage() {
+ return damage;
+ }
+
+ @Override
+ public void setDamage(int damage) {
+ this.damage = damage;
+ }
+
+ @Override
public final boolean equals(Object object) {
if (object == null) {
return false;
@@ -709,7 +745,8 @@ class CraftMetaItem implements ItemMeta, Repairable {
&& (this.hasRepairCost() ? that.hasRepairCost() && this.repairCost == that.repairCost : !that.hasRepairCost())
&& (this.unhandledTags.equals(that.unhandledTags))
&& (this.hideFlag == that.hideFlag)
- && (this.isUnbreakable() == that.isUnbreakable());
+ && (this.isUnbreakable() == that.isUnbreakable())
+ && (this.hasDamage() ? that.hasDamage() && this.damage == that.damage : !that.hasDamage());
}
/**
@@ -738,6 +775,7 @@ class CraftMetaItem implements ItemMeta, Repairable {
hash = 61 * hash + unhandledTags.hashCode();
hash = 61 * hash + hideFlag;
hash = 61 * hash + (isUnbreakable() ? 1231 : 1237);
+ hash = 61 * hash + (hasDamage() ? this.damage : 0);
return hash;
}
@@ -754,6 +792,7 @@ class CraftMetaItem implements ItemMeta, Repairable {
}
clone.hideFlag = this.hideFlag;
clone.unbreakable = this.unbreakable;
+ clone.damage = this.damage;
return clone;
} catch (CloneNotSupportedException e) {
throw new Error(e);
@@ -770,10 +809,10 @@ class CraftMetaItem implements ItemMeta, Repairable {
@Overridden
ImmutableMap.Builder<String, Object> serialize(ImmutableMap.Builder<String, Object> builder) {
if (hasDisplayName()) {
- builder.put(NAME.BUKKIT, displayName);
+ builder.put(NAME.BUKKIT, CraftChatMessage.fromComponent(displayName));
}
if (hasLocalizedName()) {
- builder.put(LOCNAME.BUKKIT, locName);
+ builder.put(LOCNAME.BUKKIT, CraftChatMessage.fromComponent(locName));
}
if (hasLore()) {
@@ -798,6 +837,10 @@ class CraftMetaItem implements ItemMeta, Repairable {
builder.put(UNBREAKABLE.BUKKIT, unbreakable);
}
+ if (hasDamage()) {
+ builder.put(DAMAGE.BUKKIT, damage);
+ }
+
final Map<String, NBTBase> internalTags = new HashMap<String, NBTBase>(unhandledTags);
serializeInternal(internalTags);
if (!internalTags.isEmpty()) {
@@ -820,6 +863,10 @@ class CraftMetaItem implements ItemMeta, Repairable {
void serializeInternal(final Map<String, NBTBase> unhandledTags) {
}
+ Material updateMaterial(Material material) {
+ return material;
+ }
+
static void serializeEnchantments(Map<Enchantment, Integer> enchantments, ImmutableMap.Builder<String, Object> builder, ItemMetaKey key) {
if (enchantments == null || enchantments.isEmpty()) {
return;
@@ -885,6 +932,7 @@ class CraftMetaItem implements ItemMeta, Repairable {
ENCHANTMENTS.NBT,
HIDEFLAGS.NBT,
UNBREAKABLE.NBT,
+ DAMAGE.NBT,
CraftMetaMap.MAP_SCALING.NBT,
CraftMetaPotion.POTION_EFFECTS.NBT,
CraftMetaPotion.DEFAULT_POTION.NBT,
@@ -901,7 +949,8 @@ class CraftMetaItem implements ItemMeta, Repairable {
CraftMetaEnchantedBook.STORED_ENCHANTMENTS.NBT,
CraftMetaCharge.EXPLOSION.NBT,
CraftMetaBlockState.BLOCK_ENTITY_TAG.NBT,
- CraftMetaKnowledgeBook.BOOK_RECIPES.NBT
+ CraftMetaKnowledgeBook.BOOK_RECIPES.NBT,
+ CraftMetaTropicalFishBucket.VARIANT.NBT
));
}
return HANDLED_TAGS;
diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaMap.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaMap.java
index de695e4e..d35c5b03 100644
--- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaMap.java
+++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaMap.java
@@ -99,7 +99,7 @@ class CraftMetaMap extends CraftMetaItem implements MapMeta {
@Override
boolean applicableTo(Material type) {
switch (type) {
- case MAP:
+ case FILLED_MAP:
return true;
default:
return false;
diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaPotion.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaPotion.java
index 4fec1676..6a58ab56 100644
--- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaPotion.java
+++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaPotion.java
@@ -69,7 +69,7 @@ class CraftMetaPotion extends CraftMetaItem implements PotionMeta {
customEffects = new ArrayList<PotionEffect>(length);
for (int i = 0; i < length; i++) {
- NBTTagCompound effect = list.get(i);
+ NBTTagCompound effect = list.getCompound(i);
PotionEffectType type = PotionEffectType.getById(effect.getByte(ID.NBT));
int amp = effect.getByte(AMPLIFIER.NBT);
int duration = effect.getInt(DURATION.NBT);
diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaSkull.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaSkull.java
index 8c5d3eff..e3951103 100644
--- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaSkull.java
+++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaSkull.java
@@ -96,8 +96,20 @@ class CraftMetaSkull extends CraftMetaItem implements SkullMeta {
@Override
boolean applicableTo(Material type) {
- switch(type) {
- case SKULL_ITEM:
+ switch (type) {
+ case CREEPER_HEAD:
+ case CREEPER_WALL_HEAD:
+ case DRAGON_HEAD:
+ case DRAGON_WALL_HEAD:
+ case PISTON_HEAD:
+ case PLAYER_HEAD:
+ case PLAYER_WALL_HEAD:
+ case SKELETON_SKULL:
+ case SKELETON_WALL_SKULL:
+ case WITHER_SKELETON_SKULL:
+ case WITHER_SKELETON_WALL_SKULL:
+ case ZOMBIE_HEAD:
+ case ZOMBIE_WALL_HEAD:
return true;
default:
return false;
diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaSpawnEgg.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaSpawnEgg.java
index 70616a2f..892cc10a 100644
--- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaSpawnEgg.java
+++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaSpawnEgg.java
@@ -1,17 +1,21 @@
package org.bukkit.craftbukkit.inventory;
-import com.google.common.base.Preconditions;
import com.google.common.collect.ImmutableMap.Builder;
+import com.mojang.datafixers.Dynamic;
import java.util.Map;
import net.minecraft.server.DataConverterTypes;
+import net.minecraft.server.DynamicOpsNBT;
import net.minecraft.server.MinecraftKey;
import net.minecraft.server.MinecraftServer;
import net.minecraft.server.NBTBase;
import net.minecraft.server.NBTTagCompound;
import org.bukkit.Material;
import org.bukkit.configuration.serialization.DelegateDeserialization;
+import org.bukkit.craftbukkit.util.CraftLegacy;
+import org.bukkit.craftbukkit.util.CraftMagicNumbers;
import org.bukkit.entity.EntityType;
import org.bukkit.inventory.meta.SpawnEggMeta;
+import org.bukkit.material.MaterialData;
@DelegateDeserialization(CraftMetaItem.SerializableMeta.class)
public class CraftMetaSpawnEgg extends CraftMetaItem implements SpawnEggMeta {
@@ -32,6 +36,8 @@ public class CraftMetaSpawnEgg extends CraftMetaItem implements SpawnEggMeta {
CraftMetaSpawnEgg egg = (CraftMetaSpawnEgg) meta;
this.spawnedType = egg.spawnedType;
+
+ updateMaterial(null); // Trigger type population
}
CraftMetaSpawnEgg(NBTTagCompound tag) {
@@ -39,10 +45,6 @@ public class CraftMetaSpawnEgg extends CraftMetaItem implements SpawnEggMeta {
if (tag.hasKey(ENTITY_TAG.NBT)) {
entityTag = tag.getCompound(ENTITY_TAG.NBT);
-
- if (entityTag.hasKey(ENTITY_ID.NBT)) {
- this.spawnedType = EntityType.fromName(new MinecraftKey(entityTag.getString(ENTITY_ID.NBT)).getKey());
- }
}
}
@@ -50,7 +52,9 @@ public class CraftMetaSpawnEgg extends CraftMetaItem implements SpawnEggMeta {
super(map);
String entityType = SerializableMeta.getString(map, ENTITY_ID.BUKKIT, true);
- setSpawnedType(EntityType.fromName(entityType));
+ if (entityType != null) {
+ this.spawnedType = EntityType.fromName(entityType);
+ }
}
@Override
@@ -59,7 +63,7 @@ public class CraftMetaSpawnEgg extends CraftMetaItem implements SpawnEggMeta {
if (tag.hasKey(ENTITY_TAG.NBT)) {
entityTag = tag.getCompound(ENTITY_TAG.NBT);
- MinecraftServer.getServer().dataConverterManager.a(DataConverterTypes.ENTITY, entityTag); // PAIL: convert
+ MinecraftServer.getServer().dataConverterManager.update(DataConverterTypes.ENTITY, new Dynamic(DynamicOpsNBT.a, entityTag), -1, CraftMagicNumbers.DATA_VERSION);
if (entityTag.hasKey(ENTITY_ID.NBT)) {
this.spawnedType = EntityType.fromName(new MinecraftKey(entityTag.getString(ENTITY_ID.NBT)).getKey());
@@ -82,10 +86,6 @@ public class CraftMetaSpawnEgg extends CraftMetaItem implements SpawnEggMeta {
entityTag = new NBTTagCompound();
}
- if (hasSpawnedType()) {
- entityTag.setString(ENTITY_ID.NBT, new MinecraftKey(spawnedType.getName()).toString());
- }
-
if (entityTag != null) {
tag.set(ENTITY_TAG.NBT, entityTag);
}
@@ -94,7 +94,49 @@ public class CraftMetaSpawnEgg extends CraftMetaItem implements SpawnEggMeta {
@Override
boolean applicableTo(Material type) {
switch (type) {
- case MONSTER_EGG:
+ case BAT_SPAWN_EGG:
+ case BLAZE_SPAWN_EGG:
+ case CAVE_SPIDER_SPAWN_EGG:
+ case CHICKEN_SPAWN_EGG:
+ case COW_SPAWN_EGG:
+ case CREEPER_SPAWN_EGG:
+ case DONKEY_SPAWN_EGG:
+ case ELDER_GUARDIAN_SPAWN_EGG:
+ case ENDERMAN_SPAWN_EGG:
+ case ENDERMITE_SPAWN_EGG:
+ case EVOKER_SPAWN_EGG:
+ case GHAST_SPAWN_EGG:
+ case GUARDIAN_SPAWN_EGG:
+ case HORSE_SPAWN_EGG:
+ case HUSK_SPAWN_EGG:
+ case LLAMA_SPAWN_EGG:
+ case MAGMA_CUBE_SPAWN_EGG:
+ case MOOSHROOM_SPAWN_EGG:
+ case MULE_SPAWN_EGG:
+ case OCELOT_SPAWN_EGG:
+ case PARROT_SPAWN_EGG:
+ case PIG_SPAWN_EGG:
+ case POLAR_BEAR_SPAWN_EGG:
+ case RABBIT_SPAWN_EGG:
+ case SHEEP_SPAWN_EGG:
+ case SHULKER_SPAWN_EGG:
+ case SILVERFISH_SPAWN_EGG:
+ case SKELETON_HORSE_SPAWN_EGG:
+ case SKELETON_SPAWN_EGG:
+ case SLIME_SPAWN_EGG:
+ case SPIDER_SPAWN_EGG:
+ case SQUID_SPAWN_EGG:
+ case STRAY_SPAWN_EGG:
+ case VEX_SPAWN_EGG:
+ case VILLAGER_SPAWN_EGG:
+ case VINDICATOR_SPAWN_EGG:
+ case WITCH_SPAWN_EGG:
+ case WITHER_SKELETON_SPAWN_EGG:
+ case WOLF_SPAWN_EGG:
+ case ZOMBIE_HORSE_SPAWN_EGG:
+ case ZOMBIE_PIGMAN_SPAWN_EGG:
+ case ZOMBIE_SPAWN_EGG:
+ case ZOMBIE_VILLAGER_SPAWN_EGG:
return true;
default:
return false;
@@ -116,14 +158,12 @@ public class CraftMetaSpawnEgg extends CraftMetaItem implements SpawnEggMeta {
@Override
public EntityType getSpawnedType() {
- return spawnedType;
+ throw new UnsupportedOperationException("Must check item type to get spawned type");
}
@Override
public void setSpawnedType(EntityType type) {
- Preconditions.checkArgument(type == null || type.getName() != null, "Spawn egg type must have name (%s)", type);
-
- this.spawnedType = type;
+ throw new UnsupportedOperationException("Must change item type to set spawned type");
}
@Override
@@ -164,10 +204,6 @@ public class CraftMetaSpawnEgg extends CraftMetaItem implements SpawnEggMeta {
Builder<String, Object> serialize(Builder<String, Object> builder) {
super.serialize(builder);
- if (hasSpawnedType()) {
- builder.put(ENTITY_ID.BUKKIT, spawnedType.getName());
- }
-
return builder;
}
@@ -177,9 +213,23 @@ public class CraftMetaSpawnEgg extends CraftMetaItem implements SpawnEggMeta {
clone.spawnedType = spawnedType;
if (entityTag != null) {
- clone.entityTag = entityTag.g();
+ clone.entityTag = entityTag.clone();
}
return clone;
}
+
+ @Override
+ final Material updateMaterial(Material material) {
+ if (spawnedType == null) {
+ spawnedType = EntityType.fromId(getDamage());
+ setDamage(0);
+ }
+
+ if (spawnedType != null) {
+ return CraftLegacy.fromLegacy(new MaterialData(Material.LEGACY_MONSTER_EGG, (byte) spawnedType.getTypeId()));
+ }
+
+ return super.updateMaterial(material);
+ }
}
diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaTropicalFishBucket.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaTropicalFishBucket.java
new file mode 100644
index 00000000..f27df320
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaTropicalFishBucket.java
@@ -0,0 +1,168 @@
+package org.bukkit.craftbukkit.inventory;
+
+import java.util.Map;
+
+import net.minecraft.server.NBTTagCompound;
+import org.bukkit.Material;
+import org.bukkit.configuration.serialization.DelegateDeserialization;
+import org.bukkit.craftbukkit.inventory.CraftMetaItem.SerializableMeta;
+
+import com.google.common.collect.ImmutableMap;
+import org.bukkit.DyeColor;
+import org.bukkit.craftbukkit.entity.CraftTropicalFish;
+import org.bukkit.craftbukkit.util.CraftMagicNumbers;
+import org.bukkit.entity.TropicalFish;
+import org.bukkit.inventory.meta.TropicalFishBucketMeta;
+
+@DelegateDeserialization(SerializableMeta.class)
+class CraftMetaTropicalFishBucket extends CraftMetaItem implements TropicalFishBucketMeta {
+ static final ItemMetaKey VARIANT = new ItemMetaKey("BucketVariantTag", "fish-variant");
+
+ private Integer variant;
+
+ CraftMetaTropicalFishBucket(CraftMetaItem meta) {
+ super(meta);
+
+ if (!(meta instanceof CraftMetaTropicalFishBucket)) {
+ return;
+ }
+
+ CraftMetaTropicalFishBucket bucket = (CraftMetaTropicalFishBucket) meta;
+ this.variant = bucket.variant;
+ }
+
+ CraftMetaTropicalFishBucket(NBTTagCompound tag) {
+ super(tag);
+
+ if (tag.hasKeyOfType(VARIANT.NBT, CraftMagicNumbers.NBT.TAG_INT)) {
+ this.variant = tag.getInt(VARIANT.NBT);
+ }
+ }
+
+ CraftMetaTropicalFishBucket(Map<String, Object> map) {
+ super(map);
+
+ Integer variant = SerializableMeta.getObject(Integer.class, map, VARIANT.BUKKIT, true);
+ if (variant != null) {
+ this.variant = variant;
+ }
+ }
+
+ @Override
+ void applyToItem(NBTTagCompound tag) {
+ super.applyToItem(tag);
+
+ if (hasVariant()) {
+ tag.setInt(VARIANT.NBT, variant);
+ }
+ }
+
+ @Override
+ boolean applicableTo(Material type) {
+ switch (type) {
+ case TROPICAL_FISH_BUCKET:
+ return true;
+ default:
+ return false;
+ }
+ }
+
+ @Override
+ boolean isEmpty() {
+ return super.isEmpty() && isBucketEmpty();
+ }
+
+ boolean isBucketEmpty() {
+ return !(hasVariant());
+ }
+
+ @Override
+ public DyeColor getPatternColor() {
+ return CraftTropicalFish.getPatternColor(variant);
+ }
+
+ @Override
+ public void setPatternColor(DyeColor color) {
+ if (variant == null) {
+ variant = 0;
+ }
+ variant = CraftTropicalFish.getData(color, getPatternColor(), getPattern());
+ }
+
+ @Override
+ public DyeColor getBodyColor() {
+ return CraftTropicalFish.getBodyColor(variant);
+ }
+
+ @Override
+ public void setBodyColor(DyeColor color) {
+ if (variant == null) {
+ variant = 0;
+ }
+ variant = CraftTropicalFish.getData(getPatternColor(), color, getPattern());
+ }
+
+ @Override
+ public TropicalFish.Pattern getPattern() {
+ return CraftTropicalFish.getPattern(variant);
+ }
+
+ @Override
+ public void setPattern(TropicalFish.Pattern pattern) {
+ if (variant == null) {
+ variant = 0;
+ }
+ variant = CraftTropicalFish.getData(getPatternColor(), getBodyColor(), pattern);
+ }
+
+ @Override
+ public boolean hasVariant() {
+ return variant != null;
+ }
+
+ @Override
+ boolean equalsCommon(CraftMetaItem meta) {
+ if (!super.equalsCommon(meta)) {
+ return false;
+ }
+ if (meta instanceof CraftMetaTropicalFishBucket) {
+ CraftMetaTropicalFishBucket that = (CraftMetaTropicalFishBucket) meta;
+
+ return (hasVariant() ? that.hasVariant() && this.variant.equals(that.variant) : !that.hasVariant());
+ }
+ return true;
+ }
+
+ @Override
+ boolean notUncommon(CraftMetaItem meta) {
+ return super.notUncommon(meta) && (meta instanceof CraftMetaTropicalFishBucket || isBucketEmpty());
+ }
+
+ @Override
+ int applyHash() {
+ final int original;
+ int hash = original = super.applyHash();
+
+ if (hasVariant()) {
+ hash = 61 * hash + variant;
+ }
+
+ return original != hash ? CraftMetaTropicalFishBucket.class.hashCode() ^ hash : hash;
+ }
+
+
+ public CraftMetaTropicalFishBucket clone() {
+ return (CraftMetaTropicalFishBucket) super.clone();
+ }
+
+ @Override
+ ImmutableMap.Builder<String, Object> serialize(ImmutableMap.Builder<String, Object> builder) {
+ super.serialize(builder);
+
+ if (hasVariant()) {
+ builder.put(VARIANT.BUKKIT, variant);
+ }
+
+ return builder;
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftShapedRecipe.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftShapedRecipe.java
index 44df9301..efd0e76a 100644
--- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftShapedRecipe.java
+++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftShapedRecipe.java
@@ -1,8 +1,9 @@
package org.bukkit.craftbukkit.inventory;
import java.util.Map;
+import java.util.stream.Stream;
-import net.minecraft.server.CraftingManager;
+import net.minecraft.server.MinecraftServer;
import net.minecraft.server.NonNullList;
import net.minecraft.server.RecipeItemStack;
import net.minecraft.server.ShapedRecipes;
@@ -21,7 +22,7 @@ public class CraftShapedRecipe extends ShapedRecipe implements CraftRecipe {
}
public CraftShapedRecipe(ItemStack result, ShapedRecipes recipe) {
- this(CraftNamespacedKey.fromMinecraft(recipe.key), result);
+ this(CraftNamespacedKey.fromMinecraft(recipe.getKey()), result);
this.recipe = recipe;
}
@@ -51,10 +52,10 @@ public class CraftShapedRecipe extends ShapedRecipe implements CraftRecipe {
for (int i = 0; i < shape.length; i++) {
String row = shape[i];
for (int j = 0; j < row.length(); j++) {
- data.set(i * width + j, RecipeItemStack.a(new net.minecraft.server.ItemStack[]{CraftItemStack.asNMSCopy(ingred.get(row.charAt(j)))}));
+ data.set(i * width + j, new RecipeItemStack(Stream.of(new RecipeItemStack.StackProvider(CraftItemStack.asNMSCopy(ingred.get(row.charAt(j)))))));
}
}
- CraftingManager.a(CraftNamespacedKey.toMinecraft(this.getKey()), new ShapedRecipes("", width, shape.length, data, CraftItemStack.asNMSCopy(this.getResult())));
+ MinecraftServer.getServer().getCraftingManager().a(new ShapedRecipes(CraftNamespacedKey.toMinecraft(this.getKey()), "", width, shape.length, data, CraftItemStack.asNMSCopy(this.getResult())));
}
}
diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftShapelessRecipe.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftShapelessRecipe.java
index 211898c5..dbbcb679 100644
--- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftShapelessRecipe.java
+++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftShapelessRecipe.java
@@ -1,8 +1,9 @@
package org.bukkit.craftbukkit.inventory;
import java.util.List;
+import java.util.stream.Stream;
-import net.minecraft.server.CraftingManager;
+import net.minecraft.server.MinecraftServer;
import net.minecraft.server.NonNullList;
import net.minecraft.server.RecipeItemStack;
import net.minecraft.server.ShapelessRecipes;
@@ -21,7 +22,7 @@ public class CraftShapelessRecipe extends ShapelessRecipe implements CraftRecipe
}
public CraftShapelessRecipe(ItemStack result, ShapelessRecipes recipe) {
- this(CraftNamespacedKey.fromMinecraft(recipe.key), result);
+ this(CraftNamespacedKey.fromMinecraft(recipe.getKey()), result);
this.recipe = recipe;
}
@@ -40,9 +41,9 @@ public class CraftShapelessRecipe extends ShapelessRecipe implements CraftRecipe
List<ItemStack> ingred = this.getIngredientList();
NonNullList<RecipeItemStack> data = NonNullList.a(ingred.size(), RecipeItemStack.a);
for (int i = 0; i < ingred.size(); i++) {
- data.set(i, RecipeItemStack.a(new net.minecraft.server.ItemStack[]{CraftItemStack.asNMSCopy(ingred.get(i))}));
+ data.set(i, new RecipeItemStack(Stream.of(new RecipeItemStack.StackProvider(CraftItemStack.asNMSCopy(ingred.get(i))))));
}
- CraftingManager.a(CraftNamespacedKey.toMinecraft(this.getKey()), new ShapelessRecipes("", CraftItemStack.asNMSCopy(this.getResult()), data));
+ MinecraftServer.getServer().getCraftingManager().a(new ShapelessRecipes(CraftNamespacedKey.toMinecraft(this.getKey()), "", CraftItemStack.asNMSCopy(this.getResult()), data));
}
}
diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/InventoryWrapper.java b/src/main/java/org/bukkit/craftbukkit/inventory/InventoryWrapper.java
index 6cbcc9d3..9c5ec924 100644
--- a/src/main/java/org/bukkit/craftbukkit/inventory/InventoryWrapper.java
+++ b/src/main/java/org/bukkit/craftbukkit/inventory/InventoryWrapper.java
@@ -160,18 +160,23 @@ public class InventoryWrapper implements IInventory {
}
@Override
- public String getName() {
- return inventory.getName();
+ public IChatBaseComponent getDisplayName() {
+ return CraftChatMessage.fromStringOrNull(inventory.getName());
+ }
+
+ @Override
+ public IChatBaseComponent getCustomName() {
+ return getDisplayName();
}
@Override
public boolean hasCustomName() {
- return getName() != null;
+ return inventory.getName() != null;
}
@Override
public IChatBaseComponent getScoreboardDisplayName() {
- return CraftChatMessage.fromString(getName())[0];
+ return getDisplayName();
}
@Override
@@ -180,7 +185,7 @@ public class InventoryWrapper implements IInventory {
}
@Override
- public boolean x_() {
+ public boolean P_() {
return Iterables.any(inventory, Predicates.notNull());
}
}
diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/RecipeIterator.java b/src/main/java/org/bukkit/craftbukkit/inventory/RecipeIterator.java
index f03f8baa..165225e7 100644
--- a/src/main/java/org/bukkit/craftbukkit/inventory/RecipeIterator.java
+++ b/src/main/java/org/bukkit/craftbukkit/inventory/RecipeIterator.java
@@ -4,50 +4,25 @@ import java.util.Iterator;
import org.bukkit.inventory.Recipe;
-import net.minecraft.server.CraftingManager;
import net.minecraft.server.IRecipe;
-import net.minecraft.server.RecipesFurnace;
+import net.minecraft.server.MinecraftServer;
public class RecipeIterator implements Iterator<Recipe> {
private final Iterator<IRecipe> recipes;
- private final Iterator<net.minecraft.server.ItemStack> smeltingCustom;
- private final Iterator<net.minecraft.server.ItemStack> smeltingVanilla;
- private Iterator<?> removeFrom = null;
public RecipeIterator() {
- this.recipes = CraftingManager.recipes.iterator();
- this.smeltingCustom = RecipesFurnace.getInstance().customRecipes.keySet().iterator();
- this.smeltingVanilla = RecipesFurnace.getInstance().recipes.keySet().iterator();
+ this.recipes = MinecraftServer.getServer().getCraftingManager().recipes.values().iterator();
}
public boolean hasNext() {
- return recipes.hasNext() || smeltingCustom.hasNext() || smeltingVanilla.hasNext();
+ return recipes.hasNext();
}
public Recipe next() {
- if (recipes.hasNext()) {
- removeFrom = recipes;
- return recipes.next().toBukkitRecipe();
- } else {
- net.minecraft.server.ItemStack item;
- if (smeltingCustom.hasNext()) {
- removeFrom = smeltingCustom;
- item = smeltingCustom.next();
- } else {
- removeFrom = smeltingVanilla;
- item = smeltingVanilla.next();
- }
-
- CraftItemStack stack = CraftItemStack.asCraftMirror(RecipesFurnace.getInstance().getResult(item));
-
- return new CraftFurnaceRecipe(stack, CraftItemStack.asCraftMirror(item));
- }
+ return recipes.next().toBukkitRecipe();
}
public void remove() {
- if (removeFrom == null) {
- throw new IllegalStateException();
- }
- removeFrom.remove();
+ recipes.remove();
}
}
diff --git a/src/main/java/org/bukkit/craftbukkit/map/CraftMapRenderer.java b/src/main/java/org/bukkit/craftbukkit/map/CraftMapRenderer.java
index a55915a4..0a3eb3b5 100644
--- a/src/main/java/org/bukkit/craftbukkit/map/CraftMapRenderer.java
+++ b/src/main/java/org/bukkit/craftbukkit/map/CraftMapRenderer.java
@@ -42,7 +42,7 @@ public class CraftMapRenderer extends MapRenderer {
}
MapIcon decoration = (MapIcon) worldMap.decorations.get(key);
- cursors.addCursor(decoration.getX(), decoration.getY(), (byte) (decoration.getRotation() & 15), decoration.getType());
+ cursors.addCursor(decoration.getX(), decoration.getY(), (byte) (decoration.getRotation() & 15), decoration.b().a());
}
}
diff --git a/src/main/java/org/bukkit/craftbukkit/map/CraftMapView.java b/src/main/java/org/bukkit/craftbukkit/map/CraftMapView.java
index b951bfda..4d5eb2c1 100644
--- a/src/main/java/org/bukkit/craftbukkit/map/CraftMapView.java
+++ b/src/main/java/org/bukkit/craftbukkit/map/CraftMapView.java
@@ -29,7 +29,7 @@ public final class CraftMapView implements MapView {
}
public short getId() {
- String text = worldMap.id;
+ String text = worldMap.getId();
if (text.startsWith("map_")) {
try {
return Short.parseShort(text.substring("map_".length()));
diff --git a/src/main/java/org/bukkit/craftbukkit/potion/CraftPotionEffectType.java b/src/main/java/org/bukkit/craftbukkit/potion/CraftPotionEffectType.java
index b06fddf7..09f44ed6 100644
--- a/src/main/java/org/bukkit/craftbukkit/potion/CraftPotionEffectType.java
+++ b/src/main/java/org/bukkit/craftbukkit/potion/CraftPotionEffectType.java
@@ -79,6 +79,10 @@ public class CraftPotionEffectType extends PotionEffectType {
return "LUCK";
case 27:
return "UNLUCK";
+ case 28:
+ return "SLOW_FALLING";
+ case 29:
+ return "CONDUIT_POWER";
default:
return "UNKNOWN_EFFECT_TYPE_" + getId();
}
diff --git a/src/main/java/org/bukkit/craftbukkit/potion/CraftPotionUtil.java b/src/main/java/org/bukkit/craftbukkit/potion/CraftPotionUtil.java
index 8483cd85..2392b457 100644
--- a/src/main/java/org/bukkit/craftbukkit/potion/CraftPotionUtil.java
+++ b/src/main/java/org/bukkit/craftbukkit/potion/CraftPotionUtil.java
@@ -34,6 +34,8 @@ public class CraftPotionUtil {
.put(PotionType.STRENGTH, "strength")
.put(PotionType.WEAKNESS, "weakness")
.put(PotionType.LUCK, "luck")
+ .put(PotionType.TURTLE_MASTER, "turtle_master")
+ .put(PotionType.SLOW_FALLING, "slow_falling")
.build();
private static final BiMap<PotionType, String> upgradeable = ImmutableBiMap.<PotionType, String>builder()
.put(PotionType.JUMP, "strong_leaping")
@@ -43,6 +45,8 @@ public class CraftPotionUtil {
.put(PotionType.POISON, "strong_poison")
.put(PotionType.REGEN, "strong_regeneration")
.put(PotionType.STRENGTH, "strong_strength")
+ .put(PotionType.SLOWNESS, "strong_slowness")
+ .put(PotionType.TURTLE_MASTER, "strong_turtle_master")
.build();
private static final BiMap<PotionType, String> extendable = ImmutableBiMap.<PotionType, String>builder()
.put(PotionType.NIGHT_VISION, "long_night_vision")
@@ -56,6 +60,8 @@ public class CraftPotionUtil {
.put(PotionType.REGEN, "long_regeneration")
.put(PotionType.STRENGTH, "long_strength")
.put(PotionType.WEAKNESS, "long_weakness")
+ .put(PotionType.TURTLE_MASTER, "long_turtle_master")
+ .put(PotionType.SLOW_FALLING, "long_slow_falling")
.build();
public static String fromBukkit(PotionData data) {
diff --git a/src/main/java/org/bukkit/craftbukkit/scoreboard/CraftObjective.java b/src/main/java/org/bukkit/craftbukkit/scoreboard/CraftObjective.java
index 239ceca0..822600fe 100644
--- a/src/main/java/org/bukkit/craftbukkit/scoreboard/CraftObjective.java
+++ b/src/main/java/org/bukkit/craftbukkit/scoreboard/CraftObjective.java
@@ -2,6 +2,7 @@ package org.bukkit.craftbukkit.scoreboard;
import net.minecraft.server.Scoreboard;
import net.minecraft.server.ScoreboardObjective;
+import net.minecraft.server.ScoreboardServer;
import org.apache.commons.lang.Validate;
import org.bukkit.OfflinePlayer;
@@ -40,7 +41,8 @@ final class CraftObjective extends CraftScoreboardComponent implements Objective
Validate.isTrue(displayName.length() <= 32, "Display name '" + displayName + "' is longer than the limit of 32 characters");
CraftScoreboard scoreboard = checkState();
- objective.setDisplayName(displayName);
+ objective.displayName = displayName;
+ ((ScoreboardServer) scoreboard.board).handleObjectiveChanged(objective);
}
public String getCriteria() throws IllegalStateException {
diff --git a/src/main/java/org/bukkit/craftbukkit/scoreboard/CraftScoreboard.java b/src/main/java/org/bukkit/craftbukkit/scoreboard/CraftScoreboard.java
index 00b30f8c..573b9cd1 100644
--- a/src/main/java/org/bukkit/craftbukkit/scoreboard/CraftScoreboard.java
+++ b/src/main/java/org/bukkit/craftbukkit/scoreboard/CraftScoreboard.java
@@ -24,14 +24,22 @@ public final class CraftScoreboard implements org.bukkit.scoreboard.Scoreboard {
this.board = board;
}
+ @Override
public CraftObjective registerNewObjective(String name, String criteria) throws IllegalArgumentException {
+ return registerNewObjective(name, criteria, name);
+ }
+
+ @Override
+ public CraftObjective registerNewObjective(String name, String criteria, String displayName) throws IllegalArgumentException {
Validate.notNull(name, "Objective name cannot be null");
Validate.notNull(criteria, "Criteria cannot be null");
+ Validate.notNull(displayName, "Display name cannot be null");
Validate.isTrue(name.length() <= 16, "The name '" + name + "' is longer than the limit of 16 characters");
+ Validate.isTrue(displayName.length() <= 32, "The display name '" + displayName + "' is longer than the limit of 32 characters");
Validate.isTrue(board.getObjective(name) == null, "An objective of name '" + name + "' already exists");
CraftCriteria craftCriteria = CraftCriteria.getFromBukkit(criteria);
- ScoreboardObjective objective = board.registerObjective(name, craftCriteria.criteria);
+ ScoreboardObjective objective = board.registerObjective(name, craftCriteria.criteria, displayName);
return new CraftObjective(this, objective);
}
diff --git a/src/main/java/org/bukkit/craftbukkit/scoreboard/CraftScoreboardManager.java b/src/main/java/org/bukkit/craftbukkit/scoreboard/CraftScoreboardManager.java
index 69fcb108..cac87d30 100644
--- a/src/main/java/org/bukkit/craftbukkit/scoreboard/CraftScoreboardManager.java
+++ b/src/main/java/org/bukkit/craftbukkit/scoreboard/CraftScoreboardManager.java
@@ -7,6 +7,7 @@ import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
+import java.util.function.Consumer;
import net.minecraft.server.EntityPlayer;
import net.minecraft.server.IScoreboardCriteria;
@@ -99,13 +100,10 @@ public final class CraftScoreboardManager implements ScoreboardManager {
}
// CraftBukkit method
- public Collection<ScoreboardScore> getScoreboardScores(IScoreboardCriteria criteria, String name, Collection<ScoreboardScore> collection) {
+ public void getScoreboardScores(IScoreboardCriteria criteria, String name, Consumer<ScoreboardScore> consumer) {
for (CraftScoreboard scoreboard : scoreboards) {
Scoreboard board = scoreboard.board;
- for (ScoreboardObjective objective : (Iterable<ScoreboardObjective>) board.getObjectivesForCriteria(criteria)) {
- collection.add(board.getPlayerScoreForObjective(name, objective));
- }
+ board.getObjectivesForCriteria(criteria, name, (score) -> consumer.accept(score));
}
- return collection;
}
}
diff --git a/src/main/java/org/bukkit/craftbukkit/scoreboard/CraftTeam.java b/src/main/java/org/bukkit/craftbukkit/scoreboard/CraftTeam.java
index 18616fc8..17865e65 100644
--- a/src/main/java/org/bukkit/craftbukkit/scoreboard/CraftTeam.java
+++ b/src/main/java/org/bukkit/craftbukkit/scoreboard/CraftTeam.java
@@ -160,7 +160,7 @@ final class CraftTeam extends CraftScoreboardComponent implements Team {
Validate.notNull(entry, "Entry cannot be null");
CraftScoreboard scoreboard = checkState();
- scoreboard.board.addPlayerToTeam(entry, team.getName());
+ scoreboard.board.addPlayerToTeam(entry, team);
}
public boolean removePlayer(OfflinePlayer player) throws IllegalStateException, IllegalArgumentException {
diff --git a/src/main/java/org/bukkit/craftbukkit/tag/CraftBlockTag.java b/src/main/java/org/bukkit/craftbukkit/tag/CraftBlockTag.java
new file mode 100644
index 00000000..4b3ac51a
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/tag/CraftBlockTag.java
@@ -0,0 +1,28 @@
+package org.bukkit.craftbukkit.tag;
+
+import java.util.Collections;
+import java.util.Set;
+import java.util.stream.Collectors;
+import net.minecraft.server.Block;
+import org.bukkit.Material;
+import org.bukkit.Tag;
+import org.bukkit.craftbukkit.util.CraftMagicNumbers;
+
+public class CraftBlockTag implements Tag<Material> {
+
+ private final net.minecraft.server.Tag<Block> handle;
+
+ public CraftBlockTag(net.minecraft.server.Tag<Block> handle) {
+ this.handle = handle;
+ }
+
+ @Override
+ public boolean isTagged(Material item) {
+ return handle.isTagged(CraftMagicNumbers.getBlock(item));
+ }
+
+ @Override
+ public Set<Material> getValues() {
+ return Collections.unmodifiableSet(handle.a().stream().map((block) -> CraftMagicNumbers.getMaterial(block)).collect(Collectors.toSet()));
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/tag/CraftItemTag.java b/src/main/java/org/bukkit/craftbukkit/tag/CraftItemTag.java
new file mode 100644
index 00000000..b6b90e3e
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/tag/CraftItemTag.java
@@ -0,0 +1,28 @@
+package org.bukkit.craftbukkit.tag;
+
+import java.util.Collections;
+import java.util.Set;
+import java.util.stream.Collectors;
+import net.minecraft.server.Item;
+import org.bukkit.Material;
+import org.bukkit.Tag;
+import org.bukkit.craftbukkit.util.CraftMagicNumbers;
+
+public class CraftItemTag implements Tag<Material> {
+
+ private final net.minecraft.server.Tag<Item> handle;
+
+ public CraftItemTag(net.minecraft.server.Tag<Item> handle) {
+ this.handle = handle;
+ }
+
+ @Override
+ public boolean isTagged(Material item) {
+ return handle.isTagged(CraftMagicNumbers.getItem(item));
+ }
+
+ @Override
+ public Set<Material> getValues() {
+ return Collections.unmodifiableSet(handle.a().stream().map((item) -> CraftMagicNumbers.getMaterial(item)).collect(Collectors.toSet()));
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/util/BlockStateListPopulator.java b/src/main/java/org/bukkit/craftbukkit/util/BlockStateListPopulator.java
index 2dbedd2d..3db85a3b 100644
--- a/src/main/java/org/bukkit/craftbukkit/util/BlockStateListPopulator.java
+++ b/src/main/java/org/bukkit/craftbukkit/util/BlockStateListPopulator.java
@@ -3,50 +3,35 @@ package org.bukkit.craftbukkit.util;
import java.util.ArrayList;
import java.util.List;
-import net.minecraft.server.Block;
import net.minecraft.server.BlockPosition;
import net.minecraft.server.IBlockData;
+import net.minecraft.server.World;
-import org.bukkit.World;
import org.bukkit.block.BlockState;
+import org.bukkit.craftbukkit.block.CraftBlockState;
public class BlockStateListPopulator {
private final World world;
- private final List<BlockState> list;
+ private final List<CraftBlockState> list;
public BlockStateListPopulator(World world) {
- this(world, new ArrayList<BlockState>());
+ this(world, new ArrayList<CraftBlockState>());
}
- public BlockStateListPopulator(World world, List<BlockState> list) {
+ public BlockStateListPopulator(World world, List<CraftBlockState> list) {
this.world = world;
this.list = list;
}
- public void setTypeAndData(int x, int y, int z, Block block, int data, int light) {
- BlockState state = world.getBlockAt(x, y, z).getState();
- state.setTypeId(Block.getId(block));
- state.setRawData((byte) data);
+ public void setTypeUpdate(BlockPosition position, IBlockData data) {
+ CraftBlockState state = CraftBlockState.getBlockState(world, position);
+ state.setData(data);
list.add(state);
}
- public void setTypeId(int x, int y, int z, int type) {
- BlockState state = world.getBlockAt(x, y, z).getState();
- state.setTypeId(type);
- list.add(state);
- }
-
- 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) {
- BlockState state = world.getBlockAt(x, y, z).getState();
- state.setTypeId(Block.getId(block));
+ public void setTypeAndData(BlockPosition position, IBlockData data, int flag) {
+ CraftBlockState state = CraftBlockState.getBlockState(world, position, flag);
+ state.setData(data);
list.add(state);
}
@@ -56,7 +41,7 @@ public class BlockStateListPopulator {
}
}
- public List<BlockState> getList() {
+ public List<CraftBlockState> getList() {
return list;
}
diff --git a/src/main/java/org/bukkit/craftbukkit/util/Commodore.java b/src/main/java/org/bukkit/craftbukkit/util/Commodore.java
new file mode 100644
index 00000000..aefba149
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/util/Commodore.java
@@ -0,0 +1,268 @@
+package org.bukkit.craftbukkit.util;
+
+import com.google.common.io.ByteStreams;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.InputStream;
+import java.util.Arrays;
+import java.util.Enumeration;
+import java.util.HashSet;
+import java.util.Set;
+import java.util.jar.JarEntry;
+import java.util.jar.JarFile;
+import java.util.jar.JarOutputStream;
+import java.util.zip.ZipEntry;
+import joptsimple.OptionParser;
+import joptsimple.OptionSet;
+import joptsimple.OptionSpec;
+import org.bukkit.Material;
+import org.bukkit.plugin.AuthorNagException;
+import org.objectweb.asm.ClassReader;
+import org.objectweb.asm.ClassVisitor;
+import org.objectweb.asm.ClassWriter;
+import org.objectweb.asm.MethodVisitor;
+import org.objectweb.asm.Opcodes;
+import org.objectweb.asm.Type;
+
+/**
+ * This file is imported from Commodore.
+ *
+ * @author md_5
+ */
+public class Commodore
+{
+
+ private static final Set<String> EVIL = new HashSet<>( Arrays.asList(
+ "org/bukkit/World (III)I getBlockTypeIdAt",
+ "org/bukkit/World (Lorg/bukkit/Location;)I getBlockTypeIdAt",
+ "org/bukkit/block/Block ()I getTypeId",
+ "org/bukkit/block/Block (I)Z setTypeId",
+ "org/bukkit/block/Block (IZ)Z setTypeId",
+ "org/bukkit/block/Block (IBZ)Z setTypeIdAndData",
+ "org/bukkit/inventory/ItemStack ()I getTypeId",
+ "org/bukkit/inventory/ItemStack (I)V setTypeId"
+ ) );
+
+ public static void main(String[] args)
+ {
+ OptionParser parser = new OptionParser();
+ OptionSpec<File> inputFlag = parser.acceptsAll( Arrays.asList( "i", "input" ) ).withRequiredArg().ofType( File.class ).required();
+ OptionSpec<File> outputFlag = parser.acceptsAll( Arrays.asList( "o", "output" ) ).withRequiredArg().ofType( File.class ).required();
+
+ OptionSet options = parser.parse( args );
+
+ File input = options.valueOf( inputFlag );
+ File output = options.valueOf( outputFlag );
+
+ if ( input.isDirectory() )
+ {
+ if ( !output.isDirectory() )
+ {
+ System.err.println( "If input directory specified, output directory required too" );
+ return;
+ }
+
+ for ( File in : input.listFiles() )
+ {
+ if ( in.getName().endsWith( ".jar" ) )
+ {
+ convert( in, new File( output, in.getName() ) );
+ }
+ }
+ } else
+ {
+ convert( input, output );
+ }
+ }
+
+ private static void convert(File in, File out)
+ {
+ System.out.println( "Attempting to convert " + in + " to " + out );
+
+ try
+ {
+ try ( JarFile inJar = new JarFile( in, false ) )
+ {
+ JarEntry entry = inJar.getJarEntry( ".commodore" );
+ if ( entry != null )
+ {
+ return;
+ }
+
+ try ( JarOutputStream outJar = new JarOutputStream( new FileOutputStream( out ) ) )
+ {
+ for ( Enumeration<JarEntry> entries = inJar.entries(); entries.hasMoreElements(); )
+ {
+ entry = entries.nextElement();
+
+ try ( InputStream is = inJar.getInputStream( entry ) )
+ {
+ byte[] b = ByteStreams.toByteArray( is );
+
+ if ( entry.getName().endsWith( ".class" ) )
+ {
+ b = convert( b, false );
+ entry = new JarEntry( entry.getName() );
+ }
+
+ outJar.putNextEntry( entry );
+ outJar.write( b );
+ }
+ }
+
+ outJar.putNextEntry( new ZipEntry( ".commodore" ) );
+ }
+ }
+ } catch ( Exception ex )
+ {
+ System.err.println( "Fatal error trying to convert " + in );
+ ex.printStackTrace();
+ }
+ }
+
+ public static byte[] convert(byte[] b, final boolean modern)
+ {
+ ClassReader cr = new ClassReader( b );
+ ClassWriter cw = new ClassWriter( cr, 0 );
+
+ cr.accept( new ClassVisitor( Opcodes.ASM6, cw )
+ {
+ @Override
+ public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions)
+ {
+ return new MethodVisitor( api, super.visitMethod( access, name, desc, signature, exceptions ) )
+ {
+
+ @Override
+ public void visitFieldInsn(int opcode, String owner, String name, String desc)
+ {
+ if ( modern )
+ {
+ super.visitFieldInsn( opcode, owner, name, desc );
+ return;
+ }
+
+ if ( owner.equals( "org/bukkit/Material" ) )
+ {
+ try
+ {
+ Material.valueOf( "LEGACY_" + name );
+ } catch ( IllegalArgumentException ex )
+ {
+ throw new AuthorNagException( "No legacy enum constant for " + name + ". Did you forget to define api-version: 1.13 in your plugin.yml?" );
+ }
+
+ super.visitFieldInsn( opcode, owner, "LEGACY_" + name, desc );
+ return;
+ }
+
+ if ( owner.equals( "org/bukkit/Art" ) )
+ {
+ switch ( name )
+ {
+ case "BURNINGSKULL":
+ super.visitFieldInsn( opcode, owner, "BURNING_SKULL", desc );
+ return;
+ case "DONKEYKONG":
+ super.visitFieldInsn( opcode, owner, "DONKEY_KONG", desc );
+ return;
+ }
+ }
+
+ if ( owner.equals( "org/bukkit/Particle" ) )
+ {
+ switch ( name )
+ {
+ case "BLOCK_CRACK":
+ case "BLOCK_DUST":
+ case "FALLING_DUST":
+ super.visitFieldInsn( opcode, owner, "LEGACY_" + name, desc );
+ return;
+ }
+ }
+
+ super.visitFieldInsn( opcode, owner, name, desc );
+ }
+
+ @Override
+ public void visitMethodInsn(int opcode, String owner, String name, String desc, boolean itf)
+ {
+ if ( modern )
+ {
+ if ( owner.equals( "org/bukkit/Material" ) )
+ {
+ switch ( name )
+ {
+ case "values":
+ super.visitMethodInsn( opcode, "org/bukkit/craftbukkit/util/CraftLegacy", "modern_" + name, desc, itf );
+ return;
+ }
+ }
+
+ super.visitMethodInsn( opcode, owner, name, desc, itf );
+ return;
+ }
+
+ if ( owner.equals( "org/bukkit/ChunkSnapshot" ) && name.equals( "getBlockData" ) && desc.equals( "(III)I" ) )
+ {
+ super.visitMethodInsn( opcode, owner, "getData", desc, itf );
+ return;
+ }
+
+ Type retType = Type.getReturnType( desc );
+
+ if ( EVIL.contains( owner + " " + desc + " " + name )
+ || ( owner.startsWith( "org/bukkit/block/" ) && ( desc + " " + name ).equals( "()I getTypeId" ) )
+ || ( owner.startsWith( "org/bukkit/block/" ) && ( desc + " " + name ).equals( "(I)Z setTypeId" ) ) )
+ {
+ Type[] args = Type.getArgumentTypes( desc );
+ Type[] newArgs = new Type[ args.length + 1 ];
+ newArgs[0] = Type.getObjectType( owner );
+ System.arraycopy( args, 0, newArgs, 1, args.length );
+
+ super.visitMethodInsn( Opcodes.INVOKESTATIC, "org/bukkit/craftbukkit/util/CraftEvil", name, Type.getMethodDescriptor( retType, newArgs ), false );
+ return;
+ }
+
+ if ( owner.equals( "org/bukkit/Material" ) )
+ {
+ if ( name.equals( "getMaterial" ) && desc.equals( "(I)Lorg/bukkit/Material;" ) )
+ {
+ super.visitMethodInsn( opcode, "org/bukkit/craftbukkit/util/CraftEvil", name, desc, itf );
+ return;
+ }
+
+ switch ( name )
+ {
+ case "values":
+ case "valueOf":
+ case "getMaterial":
+ case "matchMaterial":
+ super.visitMethodInsn( opcode, "org/bukkit/craftbukkit/util/CraftLegacy", name, desc, itf );
+ return;
+ case "ordinal":
+ super.visitMethodInsn( Opcodes.INVOKESTATIC, "org/bukkit/craftbukkit/util/CraftLegacy", "ordinal", "(Lorg/bukkit/Material;)I", false );
+ return;
+ case "name":
+ case "toString":
+ super.visitMethodInsn( Opcodes.INVOKESTATIC, "org/bukkit/craftbukkit/util/CraftLegacy", name, "(Lorg/bukkit/Material;)Ljava/lang/String;", false );
+ return;
+ }
+ }
+
+ if ( retType.getSort() == Type.OBJECT && retType.getInternalName().equals( "org/bukkit/Material" ) && owner.startsWith( "org/bukkit" ) )
+ {
+ super.visitMethodInsn( opcode, owner, name, desc, itf );
+ super.visitMethodInsn( Opcodes.INVOKESTATIC, "org/bukkit/craftbukkit/util/CraftLegacy", "toLegacy", "(Lorg/bukkit/Material;)Lorg/bukkit/Material;", false );
+ return;
+ }
+
+ super.visitMethodInsn( opcode, owner, name, desc, itf );
+ }
+ };
+ }
+ }, 0 );
+
+ return cw.toByteArray();
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/util/CraftChatMessage.java b/src/main/java/org/bukkit/craftbukkit/util/CraftChatMessage.java
index dbbed1be..da2d070e 100644
--- a/src/main/java/org/bukkit/craftbukkit/util/CraftChatMessage.java
+++ b/src/main/java/org/bukkit/craftbukkit/util/CraftChatMessage.java
@@ -138,22 +138,30 @@ public final class CraftChatMessage {
}
}
+ public static IChatBaseComponent fromStringOrNull(String message) {
+ return (message == null) ? null : fromString(message)[0];
+ }
+
public static IChatBaseComponent[] fromString(String message) {
return fromString(message, false);
}
-
+
public static IChatBaseComponent[] fromString(String message, boolean keepNewlines) {
return new StringMessage(message, keepNewlines).getOutput();
}
-
+
public static String fromComponent(IChatBaseComponent component) {
return fromComponent(component, EnumChatFormat.BLACK);
}
+ public static String toJSON(IChatBaseComponent component) {
+ return IChatBaseComponent.ChatSerializer.a(component);
+ }
+
public static String fromComponent(IChatBaseComponent component, EnumChatFormat defaultColor) {
if (component == null) return "";
StringBuilder out = new StringBuilder();
-
+
for (IChatBaseComponent c : (Iterable<IChatBaseComponent>) component) {
ChatModifier modi = c.getChatModifier();
out.append(modi.getColor() == null ? defaultColor : modi.getColor());
@@ -185,7 +193,7 @@ public final class CraftChatMessage {
private static IChatBaseComponent fixComponent(IChatBaseComponent component, Matcher matcher) {
if (component instanceof ChatComponentText) {
ChatComponentText text = ((ChatComponentText) component);
- String msg = text.g();
+ String msg = text.f();
if (matcher.reset(msg).find()) {
matcher.reset();
@@ -236,7 +244,7 @@ public final class CraftChatMessage {
}
if (component instanceof ChatMessage) {
- Object[] subs = ((ChatMessage) component).j();
+ Object[] subs = ((ChatMessage) component).i();
for (int i = 0; i < subs.length; i++) {
Object comp = subs[i];
if (comp instanceof IChatBaseComponent) {
diff --git a/src/main/java/org/bukkit/craftbukkit/util/CraftEvil.java b/src/main/java/org/bukkit/craftbukkit/util/CraftEvil.java
new file mode 100644
index 00000000..14fef6f4
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/util/CraftEvil.java
@@ -0,0 +1,80 @@
+package org.bukkit.craftbukkit.util;
+
+import com.google.common.base.Preconditions;
+import it.unimi.dsi.fastutil.ints.Int2ObjectLinkedOpenHashMap;
+import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
+import org.bukkit.Location;
+import org.bukkit.Material;
+import org.bukkit.World;
+import org.bukkit.block.Block;
+import org.bukkit.block.BlockState;
+import org.bukkit.inventory.ItemStack;
+
+/**
+ * @deprecated do not use for any reason
+ */
+@Deprecated
+public class CraftEvil {
+
+ private static final Int2ObjectMap<Material> byId = new Int2ObjectLinkedOpenHashMap<>();
+
+ static {
+ for (Material material : Material.values()) {
+ Preconditions.checkState(!byId.containsKey(material.getId()), "Duplicate material ID for", material);
+ byId.put(material.getId(), material);
+ }
+ }
+
+ public static int getBlockTypeIdAt(World world, int x, int y, int z) {
+ return getId(world.getBlockAt(x, y, z).getType());
+ }
+
+ public static int getBlockTypeIdAt(World world, Location location) {
+ return getId(world.getBlockAt(location).getType());
+ }
+
+ public static int getTypeId(Block block) {
+ return getId(block.getType());
+ }
+
+ public static boolean setTypeId(Block block, int type) {
+ block.setType(getMaterial(type));
+ return true;
+ }
+
+ public static boolean setTypeId(Block block, int type, boolean applyPhysics) {
+ block.setType(getMaterial(type), applyPhysics);
+ return true;
+ }
+
+ public static boolean setTypeIdAndData(Block block, int type, byte data, boolean applyPhysics) {
+ block.setType(getMaterial(type), applyPhysics);
+ block.setData(data);
+ return true;
+ }
+
+ public static int getTypeId(BlockState state) {
+ return getId(state.getType());
+ }
+
+ public static boolean setTypeId(BlockState state, int type) {
+ state.setType(getMaterial(type));
+ return true;
+ }
+
+ public static int getTypeId(ItemStack stack) {
+ return getId(stack.getType());
+ }
+
+ public static void setTypeId(ItemStack stack, int type) {
+ stack.setType(getMaterial(type));
+ }
+
+ public static Material getMaterial(int id) {
+ return byId.get(id);
+ }
+
+ public static int getId(Material material) {
+ return CraftLegacy.toLegacy(material).getId();
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/util/CraftLegacy.java b/src/main/java/org/bukkit/craftbukkit/util/CraftLegacy.java
new file mode 100644
index 00000000..5965e82c
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/util/CraftLegacy.java
@@ -0,0 +1,366 @@
+package org.bukkit.craftbukkit.util;
+
+import com.google.common.base.Preconditions;
+import com.mojang.datafixers.Dynamic;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Optional;
+import java.util.Set;
+import net.minecraft.server.Block;
+import net.minecraft.server.BlockStateList;
+import net.minecraft.server.Blocks;
+import net.minecraft.server.DataConverterFlattenData;
+import net.minecraft.server.DataConverterMaterialId;
+import net.minecraft.server.DataConverterRegistry;
+import net.minecraft.server.DataConverterTypes;
+import net.minecraft.server.DispenserRegistry;
+import net.minecraft.server.DynamicOpsNBT;
+import net.minecraft.server.IBlockData;
+import net.minecraft.server.IBlockState;
+import net.minecraft.server.Item;
+import net.minecraft.server.MinecraftKey;
+import net.minecraft.server.NBTBase;
+import net.minecraft.server.NBTTagCompound;
+import org.bukkit.Material;
+import org.bukkit.entity.EntityType;
+import org.bukkit.material.MaterialData;
+
+/**
+ * This class may seem unnecessarily slow and complicated/repetitive however it
+ * is able to handle a lot more edge cases and invertible transformations (many
+ * of which are not immediately obvious) than any other alternative. If you do
+ * make changes to this class please make sure to contribute them back
+ * https://hub.spigotmc.org/stash/projects/SPIGOT/repos/craftbukkit/browse so
+ * that all may benefit.
+ *
+ * @deprecated legacy use only
+ */
+@Deprecated
+public class CraftLegacy {
+
+ private static final Map<EntityType, Material> SPAWN_EGGS = new HashMap<>();
+ private static final Set<String> whitelistedStates = new HashSet<>(Arrays.asList("explode", "check_decay", "decayable"));
+ private static final Map<MaterialData, Item> materialToItem = new HashMap<>();
+ private static final Map<Item, MaterialData> itemToMaterial = new HashMap<>();
+ private static final Map<MaterialData, IBlockData> materialToData = new HashMap<>();
+ private static final Map<IBlockData, MaterialData> dataToMaterial = new HashMap<>();
+ private static final Map<MaterialData, Block> materialToBlock = new HashMap<>();
+ private static final Map<Block, MaterialData> blockToMaterial = new HashMap<>();
+
+ public static Material toLegacy(Material material) {
+ if (material == null || material.isLegacy()) {
+ return material;
+ }
+
+ return toLegacyData(material).getItemType();
+ }
+
+ public static MaterialData toLegacyData(Material material) {
+ Preconditions.checkArgument(!material.isLegacy(), "toLegacy on legacy Material");
+ MaterialData mappedData;
+
+ if (material.isBlock()) {
+ Block block = CraftMagicNumbers.getBlock(material);
+ IBlockData blockData = block.getBlockData();
+
+ // Try exact match first
+ mappedData = dataToMaterial.get(blockData);
+ // Fallback to any block
+ if (mappedData == null) {
+ mappedData = blockToMaterial.get(block);
+ // Fallback to matching item
+ if (mappedData == null) {
+ mappedData = itemToMaterial.get(block.getItem());
+ }
+ }
+ } else {
+ Item item = CraftMagicNumbers.getItem(material);
+ mappedData = itemToMaterial.get(item);
+ }
+
+ return (mappedData == null) ? new MaterialData(Material.LEGACY_AIR) : mappedData;
+ }
+
+ public static IBlockData fromLegacyData(Material material, Block block, byte data) {
+ Preconditions.checkArgument(material.isLegacy(), "fromLegacyData on modern Material");
+
+ MaterialData materialData = new MaterialData(material, data);
+
+ // Try exact match first
+ IBlockData converted = materialToData.get(materialData);
+ if (converted != null) {
+ return converted;
+ }
+
+ // Fallback to any block
+ Block convertedBlock = materialToBlock.get(materialData);
+ if (convertedBlock != null) {
+ return convertedBlock.getBlockData();
+ }
+
+ // Return existing block
+ return block.getBlockData();
+ }
+
+ public static Item fromLegacyData(Material material, Item item, short data) {
+ Preconditions.checkArgument(material.isLegacy(), "fromLegacyData on modern Material. Did you forget to define api-version: 1.13 in your plugin.yml?");
+
+ MaterialData materialData = new MaterialData(material, (byte) data);
+
+ if (material.isBlock()) {
+ // Try exact match first
+ IBlockData converted = materialToData.get(materialData);
+ if (converted != null) {
+ return converted.getBlock().getItem();
+ }
+
+ // Fallback to any block
+ Block convertedBlock = materialToBlock.get(materialData);
+ if (convertedBlock != null) {
+ return convertedBlock.getItem();
+ }
+ }
+
+ // Fallback to matching item
+ Item convertedItem = materialToItem.get(materialData);
+ if (convertedItem != null) {
+ return convertedItem;
+ }
+
+ // Return existing item
+ return item;
+ }
+
+ public static byte toLegacyData(IBlockData blockData) {
+ MaterialData mappedData;
+
+ // Try exact match first
+ mappedData = dataToMaterial.get(blockData);
+ // Fallback to any block
+ if (mappedData == null) {
+ mappedData = blockToMaterial.get(blockData.getBlock());
+ }
+
+ return (mappedData == null) ? 0 : mappedData.getData();
+ }
+
+ public static Material fromLegacy(Material material) {
+ return fromLegacy(new MaterialData(material));
+ }
+
+ public static Material fromLegacy(MaterialData materialData) {
+ Material material = materialData.getItemType();
+ if (material == null || !material.isLegacy()) {
+ return material;
+ }
+
+ Material mappedData = null;
+
+ if (material.isBlock()) {
+ // Try exact match first
+ IBlockData iblock = materialToData.get(materialData);
+ if (iblock != null) {
+ mappedData = CraftMagicNumbers.getMaterial(iblock.getBlock());
+ }
+
+ // Fallback to any block
+ if (mappedData == null) {
+ Block block = materialToBlock.get(materialData);
+ if (block != null) {
+ mappedData = CraftMagicNumbers.getMaterial(block);
+ }
+ }
+ }
+
+ // Fallback to matching item
+ if (mappedData == null) {
+ Item item = materialToItem.get(materialData);
+ if (item != null) {
+ mappedData = CraftMagicNumbers.getMaterial(item);
+ }
+ }
+
+ return (mappedData == null) ? Material.AIR : mappedData;
+ }
+
+ public static Material[] values() {
+ Material[] values = Material.values();
+ return Arrays.copyOfRange(values, Material.LEGACY_AIR.ordinal(), values.length);
+ }
+
+ public static Material valueOf(String name) {
+ return (name.startsWith(Material.LEGACY_PREFIX)) ? Material.valueOf(name) : Material.valueOf(Material.LEGACY_PREFIX + name);
+ }
+
+ public static Material getMaterial(String name) {
+ return (name.startsWith(Material.LEGACY_PREFIX)) ? Material.getMaterial(name) : Material.getMaterial(Material.LEGACY_PREFIX + name);
+ }
+
+ public static Material matchMaterial(String name) {
+ return (name.startsWith(Material.LEGACY_PREFIX)) ? Material.matchMaterial(name) : Material.matchMaterial(Material.LEGACY_PREFIX + name);
+ }
+
+ public static int ordinal(Material material) {
+ Preconditions.checkArgument(material.isLegacy(), "ordinal on modern Material");
+
+ return material.ordinal() - Material.LEGACY_AIR.ordinal();
+ }
+
+ public static String name(Material material) {
+ return material.name().substring(Material.LEGACY_PREFIX.length());
+ }
+
+ public static String toString(Material material) {
+ return name(material);
+ }
+
+ public static Material[] modern_values() {
+ Material[] values = Material.values();
+ return Arrays.copyOfRange(values, 0, Material.LEGACY_AIR.ordinal());
+ }
+
+ static {
+ SPAWN_EGGS.put(EntityType.BAT, Material.BAT_SPAWN_EGG);
+ SPAWN_EGGS.put(EntityType.BLAZE, Material.BLAZE_SPAWN_EGG);
+ SPAWN_EGGS.put(EntityType.CAVE_SPIDER, Material.CAVE_SPIDER_SPAWN_EGG);
+ SPAWN_EGGS.put(EntityType.CHICKEN, Material.CHICKEN_SPAWN_EGG);
+ SPAWN_EGGS.put(EntityType.COW, Material.COW_SPAWN_EGG);
+ SPAWN_EGGS.put(EntityType.CREEPER, Material.CREEPER_SPAWN_EGG);
+ SPAWN_EGGS.put(EntityType.ENDERMAN, Material.ENDERMAN_SPAWN_EGG);
+ SPAWN_EGGS.put(EntityType.ENDERMITE, Material.ENDERMITE_SPAWN_EGG);
+ SPAWN_EGGS.put(EntityType.GHAST, Material.GHAST_SPAWN_EGG);
+ SPAWN_EGGS.put(EntityType.GUARDIAN, Material.GUARDIAN_SPAWN_EGG);
+ SPAWN_EGGS.put(EntityType.HORSE, Material.HORSE_SPAWN_EGG);
+ SPAWN_EGGS.put(EntityType.MAGMA_CUBE, Material.MAGMA_CUBE_SPAWN_EGG);
+ SPAWN_EGGS.put(EntityType.MUSHROOM_COW, Material.MOOSHROOM_SPAWN_EGG);
+ SPAWN_EGGS.put(EntityType.OCELOT, Material.OCELOT_SPAWN_EGG);
+ SPAWN_EGGS.put(EntityType.PIG, Material.PIG_SPAWN_EGG);
+ SPAWN_EGGS.put(EntityType.RABBIT, Material.RABBIT_SPAWN_EGG);
+ SPAWN_EGGS.put(EntityType.SHEEP, Material.SHEEP_SPAWN_EGG);
+ SPAWN_EGGS.put(EntityType.SHULKER, Material.SHULKER_SPAWN_EGG);
+ SPAWN_EGGS.put(EntityType.SILVERFISH, Material.SILVERFISH_SPAWN_EGG);
+ SPAWN_EGGS.put(EntityType.SKELETON, Material.SKELETON_SPAWN_EGG);
+ SPAWN_EGGS.put(EntityType.SLIME, Material.SLIME_SPAWN_EGG);
+ SPAWN_EGGS.put(EntityType.SPIDER, Material.SPIDER_SPAWN_EGG);
+ SPAWN_EGGS.put(EntityType.SQUID, Material.SQUID_SPAWN_EGG);
+ SPAWN_EGGS.put(EntityType.VILLAGER, Material.VILLAGER_SPAWN_EGG);
+ SPAWN_EGGS.put(EntityType.WITCH, Material.WITCH_SPAWN_EGG);
+ SPAWN_EGGS.put(EntityType.WOLF, Material.WOLF_SPAWN_EGG);
+ SPAWN_EGGS.put(EntityType.PIG_ZOMBIE, Material.ZOMBIE_PIGMAN_SPAWN_EGG);
+ SPAWN_EGGS.put(EntityType.ZOMBIE, Material.ZOMBIE_SPAWN_EGG);
+
+ DispenserRegistry.c();
+
+ for (Material material : Material.values()) {
+ if (!material.isLegacy()) {
+ continue;
+ }
+
+ // Handle blocks
+ if (material.isBlock()) {
+ for (byte data = 0; data < 16; data++) {
+ MaterialData matData = new MaterialData(material, data);
+ Dynamic blockTag = DataConverterFlattenData.b(material.getId() << 4 | data);
+ // TODO: better skull conversion, chests
+ if (blockTag.getString("Name").contains("%%FILTER_ME%%")) {
+ continue;
+ }
+
+ String name = blockTag.getString("Name");
+ // TODO: need to fix
+ if (name.equals("minecraft:portal")) {
+ name = "minecraft:nether_portal";
+ }
+
+ Block block = Block.REGISTRY.get(new MinecraftKey(name));
+ IBlockData blockData = block.getBlockData();
+ BlockStateList states = block.getStates();
+
+ Optional<Dynamic> propMap = blockTag.get("Properties");
+ if (propMap.isPresent()) {
+ NBTTagCompound properties = (NBTTagCompound) propMap.get().getValue();
+ for (String dataKey : properties.getKeys()) {
+ IBlockState state = states.a(dataKey);
+
+ if (state == null) {
+ if (whitelistedStates.contains(dataKey)) {
+ continue;
+ }
+ throw new IllegalStateException("No state for " + dataKey);
+ }
+
+ Preconditions.checkState(!properties.getString(dataKey).isEmpty(), "Empty data string");
+ Optional opt = state.b(properties.getString(dataKey));
+
+ blockData = blockData.set(state, (Comparable) opt.get());
+ }
+ }
+
+ if (block == Blocks.AIR) {
+ continue;
+ }
+
+ materialToData.put(matData, blockData);
+ if (!dataToMaterial.containsKey(blockData)) {
+ dataToMaterial.put(blockData, matData);
+ }
+
+ materialToBlock.put(matData, block);
+ if (!blockToMaterial.containsKey(block)) {
+ blockToMaterial.put(block, matData);
+ }
+ }
+ }
+
+ // Handle items (and second fallback for blocks)
+ int maxData = material.getMaxDurability() == 0 ? 16 : 1;
+ // Manually do oldold spawn eggs
+ if (material == Material.LEGACY_MONSTER_EGG) {
+ maxData = 121; // Vilager + 1
+ }
+
+ for (byte data = 0; data < maxData; data++) {
+ // Manually skip invalid oldold spawn
+ if (material == Material.LEGACY_MONSTER_EGG /*&& data != 0 && EntityType.fromId(data) == null*/) { // Mojang broke 18w19b
+ continue;
+ }
+ // Skip non item stacks for now (18w19b)
+ if (DataConverterMaterialId.a(material.getId()) == null) {
+ continue;
+ }
+
+ MaterialData matData = new MaterialData(material, data);
+
+ NBTTagCompound stack = new NBTTagCompound();
+ stack.setInt("id", material.getId());
+ stack.setShort("Damage", data);
+
+ Dynamic<NBTBase> converted = DataConverterRegistry.a().update(DataConverterTypes.ITEM_STACK, new Dynamic<NBTBase>(DynamicOpsNBT.a, stack), -1, CraftMagicNumbers.DATA_VERSION);
+
+ String newId = converted.getString("id");
+ // Recover spawn eggs with invalid data
+ if (newId.equals("minecraft:spawn_egg")) {
+ newId = "minecraft:pig_spawn_egg";
+ }
+
+ // Preconditions.checkState(newId.contains("minecraft:"), "Unknown new material for " + matData);
+ Item newMaterial = Item.REGISTRY.get(new MinecraftKey(newId));
+
+ materialToItem.put(matData, newMaterial);
+ if (!itemToMaterial.containsKey(newMaterial)) {
+ itemToMaterial.put(newMaterial, matData);
+ }
+ }
+
+ for (Map.Entry<EntityType, Material> entry : SPAWN_EGGS.entrySet()) {
+ MaterialData matData = new MaterialData(Material.LEGACY_MONSTER_EGG, (byte) entry.getKey().getTypeId());
+ Item newMaterial = CraftMagicNumbers.getItem(entry.getValue());
+
+ materialToItem.put(matData, newMaterial);
+ itemToMaterial.put(newMaterial, matData);
+ }
+ }
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java b/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java
index a1be7ec4..fbdfdc47 100644
--- a/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java
+++ b/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java
@@ -1,43 +1,41 @@
package org.bukkit.craftbukkit.util;
import com.google.common.base.Charsets;
-import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.google.common.io.Files;
+import com.mojang.brigadier.exceptions.CommandSyntaxException;
import java.io.File;
import java.io.IOException;
-import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Set;
+import java.util.Locale;
+import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
-import net.minecraft.server.AdvancementDataWorld;
+import net.minecraft.server.AdvancementDataWorld;
import net.minecraft.server.Block;
-import net.minecraft.server.Blocks;
import net.minecraft.server.ChatDeserializer;
+import net.minecraft.server.IBlockData;
import net.minecraft.server.Item;
import net.minecraft.server.MinecraftKey;
import net.minecraft.server.MinecraftServer;
-import net.minecraft.server.MojangsonParseException;
import net.minecraft.server.MojangsonParser;
import net.minecraft.server.NBTTagCompound;
-import net.minecraft.server.StatisticList;
-import org.bukkit.Achievement;
import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.NamespacedKey;
-import org.bukkit.Statistic;
import org.bukkit.UnsafeValues;
import org.bukkit.advancement.Advancement;
-import org.bukkit.craftbukkit.CraftStatistic;
+import org.bukkit.block.data.BlockData;
+import org.bukkit.craftbukkit.block.data.CraftBlockData;
import org.bukkit.craftbukkit.inventory.CraftItemStack;
import org.bukkit.inventory.ItemStack;
-import org.bukkit.util.StringUtil;
+import org.bukkit.material.MaterialData;
+import org.bukkit.plugin.PluginAwareness;
+import org.bukkit.plugin.PluginDescriptionFile;
+import org.bukkit.plugin.UnknownDependencyException;
@SuppressWarnings("deprecation")
public final class CraftMagicNumbers implements UnsafeValues {
@@ -45,81 +43,106 @@ public final class CraftMagicNumbers implements UnsafeValues {
private CraftMagicNumbers() {}
- public static Block getBlock(org.bukkit.block.Block block) {
- return getBlock(block.getType());
+ public static IBlockData getBlock(MaterialData material) {
+ return getBlock(material.getItemType(), material.getData());
}
- @Deprecated
- // A bad method for bad magic.
- public static Block getBlock(int id) {
- return getBlock(Material.getMaterial(id));
+ public static IBlockData getBlock(Material material, byte data) {
+ return CraftLegacy.fromLegacyData(CraftLegacy.toLegacy(material), getBlock(material), data);
}
- @Deprecated
- // A bad method for bad magic.
- public static int getId(Block block) {
- return Block.getId(block);
+ public static MaterialData getMaterial(IBlockData data) {
+ return CraftLegacy.toLegacy(getMaterial(data.getBlock())).getNewData(toLegacyData(data));
}
- public static Material getMaterial(Block block) {
- return Material.getMaterial(Block.getId(block));
+ public static Item getItem(Material material, short data) {
+ if (material.isLegacy()) {
+ return CraftLegacy.fromLegacyData(CraftLegacy.toLegacy(material), getItem(material), data);
+ }
+
+ return getItem(material);
}
- public static Item getItem(Material material) {
- // TODO: Don't use ID
- Item item = Item.getById(material.getId());
- return item;
+ public static MaterialData getMaterialData(Item item) {
+ return CraftLegacy.toLegacyData(getMaterial(item));
}
- @Deprecated
- // A bad method for bad magic.
- public static Item getItem(int id) {
- return Item.getById(id);
+ // ========================================================================
+ private static final Map<Block, Material> BLOCK_MATERIAL = new HashMap<>();
+ private static final Map<Item, Material> ITEM_MATERIAL = new HashMap<>();
+ private static final Map<Material, Item> MATERIAL_ITEM = new HashMap<>();
+ private static final Map<Material, Block> MATERIAL_BLOCK = new HashMap<>();
+
+ static {
+ for (Block block : (Iterable<Block>) Block.REGISTRY) { // Eclipse fail
+ BLOCK_MATERIAL.put(block, Material.getMaterial(Block.REGISTRY.b(block).getKey().toUpperCase(Locale.ROOT)));
+ }
+
+ for (Item item : (Iterable<Item>) Item.REGISTRY) { // Eclipse fail
+ ITEM_MATERIAL.put(item, Material.getMaterial(Item.REGISTRY.b(item).getKey().toUpperCase(Locale.ROOT)));
+ }
+
+ for (Material material : Material.values()) {
+ MinecraftKey key = key(material);
+ MATERIAL_ITEM.put(material, Item.REGISTRY.get(key));
+ MATERIAL_BLOCK.put(material, Block.REGISTRY.get(key));
+ }
}
- @Deprecated
- // A bad method for bad magic.
- public static int getId(Item item) {
- return Item.getId(item);
+ public static Material getMaterial(Block block) {
+ return BLOCK_MATERIAL.get(block);
}
public static Material getMaterial(Item item) {
- // TODO: Don't use ID
- Material material = Material.getMaterial(Item.getId(item));
-
- if (material == null) {
- return Material.AIR;
- }
+ return ITEM_MATERIAL.getOrDefault(item, Material.AIR);
+ }
- return material;
+ public static Item getItem(Material material) {
+ return MATERIAL_ITEM.get(material);
}
public static Block getBlock(Material material) {
- if (material == null) {
- return null;
- }
- // TODO: Don't use ID
- Block block = Block.getById(material.getId());
+ return MATERIAL_BLOCK.get(material);
+ }
- if (block == null) {
- return Blocks.AIR;
+ public static MinecraftKey key(Material mat) {
+ if (mat.isLegacy()) {
+ mat = CraftLegacy.fromLegacy(mat);
}
- return block;
+ return CraftNamespacedKey.toMinecraft(mat.getKey());
+ }
+ // ========================================================================
+
+ public static byte toLegacyData(IBlockData data) {
+ return CraftLegacy.toLegacyData(data);
}
@Override
- public Material getMaterialFromInternalName(String name) {
- return getMaterial((Item) Item.REGISTRY.get(new MinecraftKey(name)));
+ public Material toLegacy(Material material) {
+ return CraftLegacy.toLegacy(material);
}
@Override
- public List<String> tabCompleteInternalMaterialName(String token, List<String> completions) {
- ArrayList<String> results = Lists.newArrayList();
- for (MinecraftKey key : (Set<MinecraftKey>)Item.REGISTRY.keySet()) {
- results.add(key.toString());
- }
- return StringUtil.copyPartialMatches(token, results, completions);
+ public Material fromLegacy(Material material) {
+ return CraftLegacy.fromLegacy(material);
+ }
+
+ @Override
+ public Material fromLegacy(MaterialData material) {
+ return CraftLegacy.fromLegacy(material);
+ }
+
+ @Override
+ public BlockData fromLegacy(Material material, byte data) {
+ return CraftBlockData.fromData(getBlock(material, data));
+ }
+
+ public static final int DATA_VERSION = 1513;
+
+ @Override
+ public int getDataVersion() {
+ return DATA_VERSION;
}
@Override
@@ -128,7 +151,7 @@ public final class CraftMagicNumbers implements UnsafeValues {
try {
nmsStack.setTag((NBTTagCompound) MojangsonParser.parse(arguments));
- } catch (MojangsonParseException ex) {
+ } catch (CommandSyntaxException ex) {
Logger.getLogger(CraftMagicNumbers.class.getName()).log(Level.SEVERE, null, ex);
}
@@ -138,29 +161,6 @@ public final class CraftMagicNumbers implements UnsafeValues {
}
@Override
- public Statistic getStatisticFromInternalName(String name) {
- return CraftStatistic.getBukkitStatisticByName(name);
- }
-
- @Override
- public Achievement getAchievementFromInternalName(String name) {
- throw new UnsupportedOperationException("Not supported in this Minecraft version.");
- }
-
- @Override
- public List<String> tabCompleteInternalStatisticOrAchievementName(String token, List<String> completions) {
- List<String> matches = new ArrayList<String>();
- Iterator iterator = StatisticList.stats.iterator();
- while (iterator.hasNext()) {
- String statistic = ((net.minecraft.server.Statistic) iterator.next()).name;
- if (statistic.startsWith(token)) {
- matches.add(statistic);
- }
- }
- return matches;
- }
-
- @Override
public Advancement loadAdvancement(NamespacedKey key, String advancement) {
if (Bukkit.getAdvancement(key) != null) {
throw new IllegalArgumentException("Advancement " + key + " already exists.");
@@ -172,7 +172,7 @@ public final class CraftMagicNumbers implements UnsafeValues {
Advancement bukkit = Bukkit.getAdvancement(key);
if (bukkit != null) {
- File file = new File(MinecraftServer.getServer().getAdvancementData().folder, key.getNamespace() + File.separator + key.getKey() + ".json");
+ File file = new File(MinecraftServer.getServer().bukkitDataPackFolder, "data" + File.separator + key.getNamespace() + File.separator + "advancements" + File.separator + key.getKey() + ".json");
file.getParentFile().mkdirs();
try {
@@ -192,10 +192,34 @@ public final class CraftMagicNumbers implements UnsafeValues {
@Override
public boolean removeAdvancement(NamespacedKey key) {
- File file = new File(MinecraftServer.getServer().getAdvancementData().folder, key.getNamespace() + File.separator + key.getKey() + ".json");
+ File file = new File(MinecraftServer.getServer().bukkitDataPackFolder, "data" + File.separator + key.getNamespace() + File.separator + "advancements" + File.separator + key.getKey() + ".json");
return file.delete();
}
+ @Override
+ public void checkSupported(PluginDescriptionFile pdf) {
+ if (pdf.getAPIVersion() != null) {
+ if (!pdf.getAPIVersion().equals("1.13")) {
+ throw new UnknownDependencyException("Unsupported API version " + pdf.getAPIVersion());
+ }
+ }
+ }
+
+ public static boolean isLegacy(PluginDescriptionFile pdf) {
+ return pdf.getAPIVersion() == null;
+ }
+
+ @Override
+ public byte[] processClass(PluginDescriptionFile pdf, byte[] clazz) {
+ try {
+ clazz = Commodore.convert(clazz, !isLegacy(pdf));
+ } catch (Exception ex) {
+ Bukkit.getLogger().log(Level.SEVERE, "Fatal error trying to convert " + pdf.getFullName(), ex);
+ }
+
+ return clazz;
+ }
+
/**
* This helper class represents the different NBT Tags.
* <p>
diff --git a/src/main/java/org/bukkit/craftbukkit/util/DummyGeneratorAccess.java b/src/main/java/org/bukkit/craftbukkit/util/DummyGeneratorAccess.java
new file mode 100644
index 00000000..1833ee72
--- /dev/null
+++ b/src/main/java/org/bukkit/craftbukkit/util/DummyGeneratorAccess.java
@@ -0,0 +1,254 @@
+package org.bukkit.craftbukkit.util;
+
+import java.util.List;
+import java.util.Random;
+import java.util.function.Function;
+import java.util.function.Predicate;
+import net.minecraft.server.AxisAlignedBB;
+import net.minecraft.server.BiomeBase;
+import net.minecraft.server.Block;
+import net.minecraft.server.BlockPosition;
+import net.minecraft.server.DifficultyDamageScaler;
+import net.minecraft.server.Entity;
+import net.minecraft.server.EntityHuman;
+import net.minecraft.server.EnumDirection;
+import net.minecraft.server.EnumSkyBlock;
+import net.minecraft.server.Fluid;
+import net.minecraft.server.FluidType;
+import net.minecraft.server.GeneratorAccess;
+import net.minecraft.server.HeightMap;
+import net.minecraft.server.IBlockData;
+import net.minecraft.server.IChunkAccess;
+import net.minecraft.server.IChunkProvider;
+import net.minecraft.server.IDataManager;
+import net.minecraft.server.ParticleParam;
+import net.minecraft.server.PersistentBase;
+import net.minecraft.server.PersistentCollection;
+import net.minecraft.server.SoundCategory;
+import net.minecraft.server.SoundEffect;
+import net.minecraft.server.TickList;
+import net.minecraft.server.TileEntity;
+import net.minecraft.server.VoxelShape;
+import net.minecraft.server.World;
+import net.minecraft.server.WorldBorder;
+import net.minecraft.server.WorldData;
+import net.minecraft.server.WorldProvider;
+import org.bukkit.event.entity.CreatureSpawnEvent;
+
+public class DummyGeneratorAccess implements GeneratorAccess {
+
+ public static final GeneratorAccess INSTANCE = new DummyGeneratorAccess();
+
+ private DummyGeneratorAccess() {
+ }
+
+ @Override
+ public long getSeed() {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ @Override
+ public TickList<Block> I() {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ @Override
+ public TickList<FluidType> H() {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ @Override
+ public IChunkAccess c(int i, int i1) {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ @Override
+ public World getMinecraftWorld() {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ @Override
+ public WorldData getWorldData() {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ @Override
+ public DifficultyDamageScaler getDamageScaler(BlockPosition bp) {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ @Override
+ public <T extends PersistentBase> T a(Function<String, T> fnctn, String string) {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ @Override
+ public PersistentCollection s_() {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ @Override
+ public void a(String string, PersistentBase pb) {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ @Override
+ public IChunkProvider getChunkProvider() {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ @Override
+ public IDataManager getDataManager() {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ @Override
+ public Random m() {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ @Override
+ public void update(BlockPosition bp, Block block) {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ @Override
+ public BlockPosition getSpawn() {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ @Override
+ public void a(EntityHuman eh, BlockPosition bp, SoundEffect se, SoundCategory sc, float f, float f1) {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ @Override
+ public void addParticle(ParticleParam pp, double d, double d1, double d2, double d3, double d4, double d5) {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ @Override
+ public boolean isEmpty(BlockPosition bp) {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ @Override
+ public BiomeBase getBiome(BlockPosition bp) {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ @Override
+ public int getBrightness(EnumSkyBlock esb, BlockPosition bp) {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ @Override
+ public int getLightLevel(BlockPosition bp, int i) {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ @Override
+ public boolean isChunkLoaded(int i, int i1, boolean bln) {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ @Override
+ public boolean e(BlockPosition bp) {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ @Override
+ public int a(HeightMap.Type type, int i, int i1) {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ @Override
+ public EntityHuman a(double d, double d1, double d2, double d3, Predicate<Entity> prdct) {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ @Override
+ public int c() {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ @Override
+ public WorldBorder getWorldBorder() {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ @Override
+ public boolean a(Entity entity, VoxelShape vs) {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ @Override
+ public List<Entity> getEntities(Entity entity, AxisAlignedBB aabb) {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ @Override
+ public int a(BlockPosition bp, EnumDirection ed) {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ @Override
+ public boolean e() {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ @Override
+ public int getSeaLevel() {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ @Override
+ public WorldProvider o() {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ @Override
+ public TileEntity getTileEntity(BlockPosition bp) {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ @Override
+ public IBlockData getType(BlockPosition bp) {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ @Override
+ public Fluid b(BlockPosition bp) {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ @Override
+ public boolean setTypeAndData(BlockPosition blockposition, IBlockData iblockdata, int i) {
+ return false;
+ }
+
+ @Override
+ public boolean addEntity(Entity entity) {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ @Override
+ public boolean addEntity(Entity entity, CreatureSpawnEvent.SpawnReason reason) {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ @Override
+ public boolean setAir(BlockPosition blockposition) {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ @Override
+ public void a(EnumSkyBlock enumskyblock, BlockPosition blockposition, int i) {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+
+ @Override
+ public boolean setAir(BlockPosition blockposition, boolean flag) {
+ throw new UnsupportedOperationException("Not supported yet.");
+ }
+}
diff --git a/src/main/java/org/bukkit/craftbukkit/util/StructureGrowDelegate.java b/src/main/java/org/bukkit/craftbukkit/util/StructureGrowDelegate.java
deleted file mode 100644
index f9cc7d6f..00000000
--- a/src/main/java/org/bukkit/craftbukkit/util/StructureGrowDelegate.java
+++ /dev/null
@@ -1,70 +0,0 @@
-package org.bukkit.craftbukkit.util;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import net.minecraft.server.Block;
-import net.minecraft.server.Blocks;
-import net.minecraft.server.World;
-
-import org.bukkit.BlockChangeDelegate;
-import org.bukkit.block.BlockState;
-import org.bukkit.craftbukkit.CraftWorld;
-import org.bukkit.material.MaterialData;
-
-public class StructureGrowDelegate implements BlockChangeDelegate {
- private final CraftWorld world;
- private final List<BlockState> blocks = new ArrayList<BlockState>();
-
- public StructureGrowDelegate(World world) {
- this.world = world.getWorld();
- }
-
- public boolean setRawTypeId(int x, int y, int z, int type) {
- return setRawTypeIdAndData(x, y, z, type, 0);
- }
-
- public boolean setRawTypeIdAndData(int x, int y, int z, int type, int data) {
- BlockState state = world.getBlockAt(x, y, z).getState();
- state.setTypeId(type);
- state.setData(new MaterialData(type, (byte) data));
- blocks.add(state);
- return true;
- }
-
- public boolean setTypeId(int x, int y, int z, int typeId) {
- return setRawTypeId(x, y, z, typeId);
- }
-
- public boolean setTypeIdAndData(int x, int y, int z, int typeId, int data) {
- return setRawTypeIdAndData(x, y, z, typeId, data);
- }
-
- public int getTypeId(int x, int y, int z) {
- for (BlockState state : blocks) {
- if (state.getX() == x && state.getY() == y && state.getZ() == z) {
- return state.getTypeId();
- }
- }
-
- return world.getBlockTypeIdAt(x, y, z);
- }
-
- public int getHeight() {
- return world.getMaxHeight();
- }
-
- public List<BlockState> getBlocks() {
- return blocks;
- }
-
- public boolean isEmpty(int x, int y, int z) {
- for (BlockState state : blocks) {
- if (state.getX() == x && state.getY() == y && state.getZ() == z) {
- return Block.getById(state.getTypeId()) == Blocks.AIR;
- }
- }
-
- return world.getBlockAt(x, y, z).isEmpty();
- }
-}
diff --git a/src/main/java/org/bukkit/craftbukkit/util/permissions/CommandPermissions.java b/src/main/java/org/bukkit/craftbukkit/util/permissions/CommandPermissions.java
index 39ef2ef9..c928c2b6 100644
--- a/src/main/java/org/bukkit/craftbukkit/util/permissions/CommandPermissions.java
+++ b/src/main/java/org/bukkit/craftbukkit/util/permissions/CommandPermissions.java
@@ -15,7 +15,7 @@ public final class CommandPermissions {
DefaultPermissions.registerPermission(PREFIX + "kill", "Allows the user to commit suicide", PermissionDefault.OP, commands);
DefaultPermissions.registerPermission(PREFIX + "me", "Allows the user to perform a chat action", PermissionDefault.TRUE, commands);
- DefaultPermissions.registerPermission(PREFIX + "tell", "Allows the user to privately message another player", PermissionDefault.TRUE, commands);
+ DefaultPermissions.registerPermission(PREFIX + "msg", "Allows the user to privately message another player", PermissionDefault.TRUE, commands);
DefaultPermissions.registerPermission(PREFIX + "say", "Allows the user to talk as the console", PermissionDefault.OP, commands);
DefaultPermissions.registerPermission(PREFIX + "give", "Allows the user to give items to players", PermissionDefault.OP, commands);
DefaultPermissions.registerPermission(PREFIX + "teleport", "Allows the user to teleport players", PermissionDefault.OP, commands);
diff --git a/src/test/java/org/bukkit/ArtTest.java b/src/test/java/org/bukkit/ArtTest.java
index 7f402889..29d14d4b 100644
--- a/src/test/java/org/bukkit/ArtTest.java
+++ b/src/test/java/org/bukkit/ArtTest.java
@@ -5,10 +5,12 @@ import static org.hamcrest.Matchers.*;
import java.util.Collections;
import java.util.EnumMap;
+import java.util.HashMap;
import java.util.List;
import java.util.Map;
-import net.minecraft.server.EntityPainting.EnumArt;
+import net.minecraft.server.MinecraftKey;
+import net.minecraft.server.Paintings;
import org.bukkit.craftbukkit.CraftArt;
import org.junit.Test;
@@ -22,15 +24,15 @@ public class ArtTest {
public void verifyMapping() {
List<Art> arts = Lists.newArrayList(Art.values());
- for (EnumArt enumArt : EnumArt.values()) {
- int id = enumArt.ordinal();
- String name = enumArt.B;
- int width = enumArt.C / UNIT_MULTIPLIER;
- int height = enumArt.D / UNIT_MULTIPLIER;
+ for (MinecraftKey key : Paintings.a.keySet()) {
+ Paintings enumArt = Paintings.a.get(key);
+ String name = key.getKey();
+ int width = enumArt.b() / UNIT_MULTIPLIER;
+ int height = enumArt.c() / UNIT_MULTIPLIER;
- Art subject = Art.getById(id);
+ Art subject = CraftArt.NotchToBukkit(enumArt);
- String message = String.format("org.bukkit.Art is missing id: %d named: '%s'", id, name);
+ String message = String.format("org.bukkit.Art is missing '%s'", name);
assertNotNull(message, subject);
assertThat(Art.getByName(name), is(subject));
@@ -45,9 +47,9 @@ public class ArtTest {
@Test
public void testCraftArtToNotch() {
- Map<EnumArt, Art> cache = new EnumMap(EnumArt.class);
+ Map<Paintings, Art> cache = new HashMap<>();
for (Art art : Art.values()) {
- EnumArt enumArt = CraftArt.BukkitToNotch(art);
+ Paintings enumArt = CraftArt.BukkitToNotch(art);
assertNotNull(art.name(), enumArt);
assertThat(art.name(), cache.put(enumArt, art), is(nullValue()));
}
@@ -55,11 +57,11 @@ public class ArtTest {
@Test
public void testCraftArtToBukkit() {
- Map<Art, EnumArt> cache = new EnumMap(Art.class);
- for (EnumArt enumArt : EnumArt.values()) {
+ Map<Art, Paintings> cache = new EnumMap(Art.class);
+ for (Paintings enumArt : (Iterable<Paintings>) Paintings.a) { // Eclipse fail
Art art = CraftArt.NotchToBukkit(enumArt);
- assertNotNull(enumArt.name(), art);
- assertThat(enumArt.name(), cache.put(art, enumArt), is(nullValue()));
+ assertNotNull("Could not CraftArt.NotchToBukkit " + enumArt, art);
+ assertThat("Duplicate artwork " + enumArt, cache.put(art, enumArt), is(nullValue()));
}
}
}
diff --git a/src/test/java/org/bukkit/BlockDataTest.java b/src/test/java/org/bukkit/BlockDataTest.java
new file mode 100644
index 00000000..a5cea50b
--- /dev/null
+++ b/src/test/java/org/bukkit/BlockDataTest.java
@@ -0,0 +1,58 @@
+package org.bukkit;
+
+import net.minecraft.server.BlockCake;
+import net.minecraft.server.Blocks;
+import org.bukkit.block.data.BlockData;
+import org.bukkit.block.data.type.Cake;
+import org.bukkit.craftbukkit.block.data.CraftBlockData;
+import org.bukkit.support.AbstractTestingBase;
+import static org.hamcrest.Matchers.*;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class BlockDataTest extends AbstractTestingBase {
+
+ @Test
+ public void testParsing() {
+ BlockData cakeTest = CraftBlockData.fromData(Blocks.CAKE.getBlockData().set(BlockCake.BITES, 3));
+
+ BlockData materialString = CraftBlockData.newData(Material.CAKE, "[bites=3]");
+ Assert.assertThat(materialString, is(cakeTest));
+
+ BlockData combined = CraftBlockData.newData(null, "cake[bites=3]");
+ Assert.assertThat(combined, is(cakeTest));
+
+ BlockData combinedMinecraft = CraftBlockData.newData(null, "minecraft:cake[bites=3]");
+ Assert.assertThat(combinedMinecraft, is(cakeTest));
+
+ BlockData inverted = CraftBlockData.newData(null, cakeTest.getAsString());
+ Assert.assertThat(inverted, is(cakeTest));
+ }
+
+ @Test(expected = IllegalArgumentException.class)
+ public void testBadMaterial() {
+ CraftBlockData.newData(null, "invalid");
+ }
+
+ @Test(expected = IllegalArgumentException.class)
+ public void testBadSyntax() {
+ CraftBlockData.newData(null, "minecraft:cake[bites=3");
+ }
+
+ @Test(expected = IllegalArgumentException.class)
+ public void testDoubleMaterial() {
+ CraftBlockData.newData(Material.CAKE, "minecraft:cake[bites=3]");
+ }
+
+ @Test
+ public void testClone() {
+ Cake cakeTest = (Cake) CraftBlockData.fromData(Blocks.CAKE.getBlockData().set(BlockCake.BITES, 3));
+ Cake clone = (Cake) cakeTest.clone();
+
+ Assert.assertFalse("Clone did not return new object", cakeTest == clone);
+ Assert.assertThat("Clone is not equal", clone, is(cakeTest));
+
+ clone.setBites(1);
+ Assert.assertThat("Clone is not actually clone", clone, is(not(cakeTest)));
+ }
+}
diff --git a/src/test/java/org/bukkit/DyeColorsTest.java b/src/test/java/org/bukkit/DyeColorsTest.java
index 020714da..45a5caed 100644
--- a/src/test/java/org/bukkit/DyeColorsTest.java
+++ b/src/test/java/org/bukkit/DyeColorsTest.java
@@ -7,7 +7,6 @@ import java.util.ArrayList;
import java.util.List;
import net.minecraft.server.EnumColor;
-import net.minecraft.server.ItemDye;
import org.bukkit.support.AbstractTestingBase;
import org.junit.Test;
@@ -33,7 +32,7 @@ public class DyeColorsTest extends AbstractTestingBase {
@Test
public void checkColor() {
Color color = dye.getColor();
- float[] nmsColorArray = EnumColor.fromColorIndex(dye.getWoolData()).f();
+ float[] nmsColorArray = EnumColor.fromColorIndex(dye.getWoolData()).d();
Color nmsColor = Color.fromRGB((int) (nmsColorArray[0] * 255), (int) (nmsColorArray[1] * 255), (int) (nmsColorArray[2] * 255));
assertThat(color, is(nmsColor));
}
@@ -41,7 +40,7 @@ public class DyeColorsTest extends AbstractTestingBase {
@Test
public void checkFireworkColor() {
Color color = dye.getFireworkColor();
- int nmsColor = ItemDye.a[dye.getDyeData()];
+ int nmsColor = EnumColor.fromColorIndex(dye.getWoolData()).f();
assertThat(color, is(Color.fromRGB(nmsColor)));
}
}
diff --git a/src/test/java/org/bukkit/EnchantmentTest.java b/src/test/java/org/bukkit/EnchantmentTest.java
new file mode 100644
index 00000000..86bfbb45
--- /dev/null
+++ b/src/test/java/org/bukkit/EnchantmentTest.java
@@ -0,0 +1,24 @@
+package org.bukkit;
+
+import net.minecraft.server.MinecraftKey;
+import org.bukkit.craftbukkit.util.CraftNamespacedKey;
+import org.bukkit.enchantments.Enchantment;
+import org.bukkit.support.AbstractTestingBase;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class EnchantmentTest extends AbstractTestingBase {
+
+ @Test
+ public void verifyMapping() {
+ for (MinecraftKey key : net.minecraft.server.Enchantment.enchantments.keySet()) {
+ net.minecraft.server.Enchantment nms = net.minecraft.server.Enchantment.enchantments.get(key);
+
+ Enchantment bukkitById = Enchantment.getByKey(CraftNamespacedKey.fromMinecraft(key));
+
+ Assert.assertFalse("Unknown enchant name for " + key, bukkitById.getName().startsWith("UNKNOWN"));
+
+ Assert.assertNotNull("Unknown target for " + key, bukkitById.getItemTarget());
+ }
+ }
+}
diff --git a/src/test/java/org/bukkit/LegacyTest.java b/src/test/java/org/bukkit/LegacyTest.java
new file mode 100644
index 00000000..543e7581
--- /dev/null
+++ b/src/test/java/org/bukkit/LegacyTest.java
@@ -0,0 +1,89 @@
+package org.bukkit;
+
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Set;
+import org.bukkit.craftbukkit.util.CraftLegacy;
+import org.bukkit.material.MaterialData;
+import org.bukkit.support.AbstractTestingBase;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class LegacyTest extends AbstractTestingBase {
+
+ private final Set<Material> INVALIDATED_MATERIALS = new HashSet<>(Arrays.asList(Material.ACACIA_BUTTON, Material.ACACIA_PRESSURE_PLATE, Material.ACACIA_TRAPDOOR, Material.AIR, Material.ATTACHED_MELON_STEM, Material.ATTACHED_PUMPKIN_STEM,
+ Material.BIRCH_BUTTON, Material.BIRCH_PRESSURE_PLATE, Material.BIRCH_TRAPDOOR, Material.BLACK_WALL_BANNER, Material.BLUE_WALL_BANNER, Material.BROWN_WALL_BANNER, Material.BUBBLE_COLUMN, Material.CAVE_AIR, Material.CREEPER_WALL_HEAD,
+ Material.CYAN_WALL_BANNER, Material.DARK_OAK_BUTTON, Material.DARK_OAK_PRESSURE_PLATE, Material.DARK_OAK_TRAPDOOR, Material.DARK_PRISMARINE_SLAB, Material.DARK_PRISMARINE_STAIRS, Material.DEBUG_STICK, Material.DONKEY_SPAWN_EGG,
+ Material.DRAGON_WALL_HEAD, Material.DRIED_KELP, Material.DRIED_KELP_BLOCK, Material.ELDER_GUARDIAN_SPAWN_EGG, Material.EVOKER_SPAWN_EGG, Material.GRAY_WALL_BANNER, Material.GREEN_WALL_BANNER, Material.HUSK_SPAWN_EGG,
+ Material.JUNGLE_BUTTON, Material.JUNGLE_PRESSURE_PLATE, Material.JUNGLE_TRAPDOOR, Material.KELP, Material.KELP_PLANT, Material.LIGHT_BLUE_WALL_BANNER, Material.LIGHT_GRAY_WALL_BANNER, Material.LIME_WALL_BANNER, Material.LLAMA_SPAWN_EGG,
+ Material.MAGENTA_WALL_BANNER, Material.MULE_SPAWN_EGG, Material.ORANGE_WALL_BANNER, Material.PARROT_SPAWN_EGG, Material.PHANTOM_SPAWN_EGG, Material.PINK_WALL_BANNER, Material.PLAYER_WALL_HEAD, Material.POLAR_BEAR_SPAWN_EGG,
+ Material.POTTED_ACACIA_SAPLING, Material.POTTED_ALLIUM, Material.POTTED_AZURE_BLUET, Material.POTTED_BIRCH_SAPLING, Material.POTTED_BLUE_ORCHID, Material.POTTED_BROWN_MUSHROOM, Material.POTTED_DANDELION, Material.POTTED_DARK_OAK_SAPLING,
+ Material.POTTED_DEAD_BUSH, Material.POTTED_FERN, Material.POTTED_JUNGLE_SAPLING, Material.POTTED_OAK_SAPLING, Material.POTTED_ORANGE_TULIP, Material.POTTED_OXEYE_DAISY, Material.POTTED_PINK_TULIP, Material.POTTED_POPPY,
+ Material.POTTED_RED_MUSHROOM, Material.POTTED_RED_TULIP, Material.POTTED_SPRUCE_SAPLING, Material.POTTED_WHITE_TULIP, Material.PRISMARINE_BRICK_SLAB, Material.PRISMARINE_BRICK_STAIRS, Material.PRISMARINE_SLAB, Material.PRISMARINE_STAIRS,
+ Material.PUMPKIN, Material.PURPLE_WALL_BANNER, Material.RED_WALL_BANNER, Material.SEAGRASS, Material.SKELETON_HORSE_SPAWN_EGG, Material.SKELETON_WALL_SKULL, Material.SPRUCE_BUTTON, Material.SPRUCE_PRESSURE_PLATE, Material.SPRUCE_TRAPDOOR,
+ Material.STRAY_SPAWN_EGG, Material.STRIPPED_ACACIA_LOG, Material.STRIPPED_BIRCH_LOG, Material.STRIPPED_DARK_OAK_LOG, Material.STRIPPED_JUNGLE_LOG, Material.STRIPPED_OAK_LOG, Material.STRIPPED_SPRUCE_LOG, Material.TALL_SEAGRASS,
+ Material.TRIDENT, Material.TURTLE_EGG, Material.TURTLE_HELMET, Material.SCUTE, Material.TURTLE_SPAWN_EGG, Material.VEX_SPAWN_EGG, Material.VINDICATOR_SPAWN_EGG, Material.VOID_AIR, Material.WHITE_BED,
+ Material.WITHER_SKELETON_SPAWN_EGG, Material.WITHER_SKELETON_WALL_SKULL, Material.YELLOW_WALL_BANNER, Material.ZOMBIE_HORSE_SPAWN_EGG, Material.ZOMBIE_VILLAGER_SPAWN_EGG, Material.ZOMBIE_WALL_HEAD,
+ Material.COD_BUCKET, Material.COD_SPAWN_EGG, Material.PUFFERFISH_BUCKET, Material.PUFFERFISH_SPAWN_EGG, Material.SALMON_BUCKET, Material.SALMON_SPAWN_EGG,
+ Material.TROPICAL_FISH_BUCKET, Material.DROWNED_SPAWN_EGG, Material.SHULKER_BOX, Material.TROPICAL_FISH_SPAWN_EGG,
+ Material.BLUE_ICE, Material.BRAIN_CORAL, Material.BRAIN_CORAL_BLOCK, Material.BRAIN_CORAL_FAN, Material.BUBBLE_CORAL, Material.BUBBLE_CORAL_BLOCK, Material.BUBBLE_CORAL_FAN, Material.CONDUIT, Material.DEAD_BRAIN_CORAL_BLOCK,
+ Material.DEAD_BUBBLE_CORAL_BLOCK, Material.DEAD_FIRE_CORAL_BLOCK, Material.DEAD_HORN_CORAL_BLOCK, Material.DEAD_TUBE_CORAL_BLOCK, Material.DOLPHIN_SPAWN_EGG, Material.FIRE_CORAL, Material.FIRE_CORAL_BLOCK, Material.FIRE_CORAL_FAN,
+ Material.HEART_OF_THE_SEA, Material.HORN_CORAL, Material.HORN_CORAL_BLOCK, Material.HORN_CORAL_FAN, Material.NAUTILUS_SHELL, Material.PHANTOM_MEMBRANE, Material.SEA_PICKLE, Material.TUBE_CORAL, Material.TUBE_CORAL_BLOCK,
+ Material.TUBE_CORAL_FAN, Material.STRIPPED_ACACIA_WOOD, Material.STRIPPED_BIRCH_WOOD, Material.STRIPPED_DARK_OAK_WOOD, Material.STRIPPED_JUNGLE_WOOD, Material.STRIPPED_OAK_WOOD, Material.STRIPPED_SPRUCE_WOOD,
+ Material.ACACIA_WOOD, Material.BIRCH_WOOD, Material.DARK_OAK_WOOD, Material.JUNGLE_WOOD, Material.OAK_WOOD, Material.SPRUCE_WOOD,
+ //
+ Material.LEGACY_AIR, Material.LEGACY_DEAD_BUSH, Material.LEGACY_BURNING_FURNACE, Material.LEGACY_WALL_SIGN, Material.LEGACY_REDSTONE_TORCH_OFF, Material.LEGACY_SKULL, Material.LEGACY_REDSTONE_COMPARATOR_ON, Material.LEGACY_WALL_BANNER, Material.LEGACY_MONSTER_EGG));
+
+ private final Set<Material> INVERSION_FAILS = new HashSet<>(Arrays.asList(Material.LEGACY_DOUBLE_STEP, Material.LEGACY_GLOWING_REDSTONE_ORE, Material.LEGACY_DIODE_BLOCK_ON, Material.LEGACY_REDSTONE_LAMP_ON, Material.LEGACY_WOOD_DOUBLE_STEP,
+ Material.LEGACY_DAYLIGHT_DETECTOR_INVERTED, Material.LEGACY_DOUBLE_STONE_SLAB2, Material.LEGACY_PURPUR_DOUBLE_SLAB, Material.LEGACY_WHEAT, Material.LEGACY_SIGN, Material.LEGACY_WOOD_DOOR, Material.LEGACY_IRON_DOOR, Material.LEGACY_SUGAR_CANE,
+ Material.LEGACY_CAKE, Material.LEGACY_BED, Material.LEGACY_DIODE, Material.LEGACY_NETHER_STALK, Material.LEGACY_BREWING_STAND_ITEM, Material.LEGACY_CAULDRON_ITEM, Material.LEGACY_REDSTONE_COMPARATOR, Material.LEGACY_SPRUCE_DOOR_ITEM,
+ Material.LEGACY_BIRCH_DOOR_ITEM, Material.LEGACY_JUNGLE_DOOR_ITEM, Material.LEGACY_ACACIA_DOOR_ITEM, Material.LEGACY_DARK_OAK_DOOR_ITEM, Material.LEGACY_STATIONARY_LAVA, Material.LEGACY_STATIONARY_WATER));
+
+ @Test
+ public void toLegacyMaterial() {
+ for (Material material : Material.values()) {
+ if (!INVALIDATED_MATERIALS.contains(material) && !material.isLegacy()) {
+ MaterialData converted = CraftLegacy.toLegacyData(material);
+
+ Assert.assertNotEquals("Could not toLegacy " + material, Material.LEGACY_AIR, converted.getItemType());
+
+ if (!INVALIDATED_MATERIALS.contains(converted.getItemType())) {
+ Assert.assertNotEquals("Could not fromLegacy(toLegacy) " + converted + "(" + material + ")", Material.AIR, CraftLegacy.fromLegacy(converted));
+ }
+ if (!INVERSION_FAILS.contains(material)) {
+ Assert.assertEquals("Could not fromLegacy(toLegacy) " + converted + "(" + material + ")", material, CraftLegacy.fromLegacy(converted));
+ }
+ }
+ }
+
+ Assert.assertEquals("Could not toLegacy Air", Material.LEGACY_AIR, CraftLegacy.toLegacy(Material.AIR));
+ }
+
+ @Test
+ public void fromLegacyMaterial() {
+ for (Material material : Material.values()) {
+ if (!INVALIDATED_MATERIALS.contains(material) && material.isLegacy()) {
+ Material converted = CraftLegacy.fromLegacy(material);
+ Assert.assertNotEquals("Could not fromLegacy " + material, Material.AIR, converted);
+
+ Assert.assertNotEquals("Could not toLegacy(fromLegacy) " + converted + "(" + material + ")", Material.AIR, CraftLegacy.toLegacy(converted));
+ if (!INVERSION_FAILS.contains(material)) {
+ Assert.assertEquals("Could not toLegacy(fromLegacy) " + converted + "(" + material + ")", material, CraftLegacy.toLegacy(converted));
+ }
+ }
+ }
+
+ Assert.assertEquals("Could not fromLegacy Air", Material.AIR, CraftLegacy.fromLegacy(Material.LEGACY_AIR));
+ }
+
+ @Test
+ public void testRestricted() {
+ for (Material material : CraftLegacy.values()) {
+ Assert.assertTrue("Must iterate only legacy materials", material.isLegacy());
+ }
+
+ for (Material material : CraftLegacy.modern_values()) {
+ Assert.assertFalse("Must iterate only modern materials", material.isLegacy());
+ }
+ }
+}
diff --git a/src/test/java/org/bukkit/MaterialTest.java b/src/test/java/org/bukkit/MaterialTest.java
index a9b4e525..be0690f3 100644
--- a/src/test/java/org/bukkit/MaterialTest.java
+++ b/src/test/java/org/bukkit/MaterialTest.java
@@ -7,6 +7,7 @@ import java.util.Collections;
import java.util.Map;
import net.minecraft.server.Item;
+import net.minecraft.server.MinecraftKey;
import org.bukkit.support.AbstractTestingBase;
import org.junit.Test;
@@ -19,13 +20,13 @@ public class MaterialTest extends AbstractTestingBase {
@Test
public void verifyMapping() {
- Map<Integer, Material> materials = Maps.newHashMap();
+ Map<MinecraftKey, Material> materials = Maps.newHashMap();
for (Material material : Material.values()) {
if (INVALIDATED_MATERIALS.contains(material)) {
continue;
}
- materials.put(material.getId(), material);
+ materials.put(CraftMagicNumbers.key(material), material);
}
Iterator<Item> items = Item.REGISTRY.iterator();
@@ -34,12 +35,13 @@ public class MaterialTest extends AbstractTestingBase {
Item item = items.next();
if (item == null) continue;
- int id = CraftMagicNumbers.getId(item);
+ MinecraftKey id = Item.REGISTRY.b(item);
String name = item.getName();
Material material = materials.remove(id);
assertThat("Missing " + name + "(" + id + ")", material, is(not(nullValue())));
+ assertNotNull("No item mapping for " + name, CraftMagicNumbers.getMaterial(item));
}
assertThat(materials, is(Collections.EMPTY_MAP));
diff --git a/src/test/java/org/bukkit/ParticleTest.java b/src/test/java/org/bukkit/ParticleTest.java
index c00869ba..c0cb4a1e 100644
--- a/src/test/java/org/bukkit/ParticleTest.java
+++ b/src/test/java/org/bukkit/ParticleTest.java
@@ -1,19 +1,34 @@
package org.bukkit;
-import net.minecraft.server.EnumParticle;
+import org.bukkit.block.data.BlockData;
import org.bukkit.craftbukkit.CraftParticle;
+import org.bukkit.craftbukkit.block.data.CraftBlockData;
+import org.bukkit.inventory.ItemStack;
+import org.bukkit.material.MaterialData;
+import org.bukkit.support.AbstractTestingBase;
import org.junit.Assert;
import org.junit.Test;
-public class ParticleTest {
+public class ParticleTest extends AbstractTestingBase {
@Test
public void verifyMapping() {
for (Particle bukkit : Particle.values()) {
- Assert.assertNotNull("Missing Bukkit->NMS particle mapping", CraftParticle.toNMS(bukkit));
+ Object data = null;
+ if (bukkit.getDataType().equals(ItemStack.class)) {
+ data = new ItemStack(Material.STONE);
+ } else if (bukkit.getDataType() == MaterialData.class) {
+ data = new MaterialData(Material.LEGACY_STONE);
+ } else if (bukkit.getDataType() == Particle.DustOptions.class) {
+ data = new Particle.DustOptions(Color.BLACK, 0);
+ } else if (bukkit.getDataType() == BlockData.class) {
+ data = CraftBlockData.newData(Material.STONE, "");
+ }
+
+ Assert.assertNotNull("Missing Bukkit->NMS particle mapping for " + bukkit, CraftParticle.toNMS(bukkit, data));
}
- for (EnumParticle nms : EnumParticle.values()) {
- Assert.assertNotNull("Missing NMS->Bukkit particle mapping", CraftParticle.toBukkit(nms));
+ for (net.minecraft.server.Particle nms : (Iterable<net.minecraft.server.Particle<?>>) net.minecraft.server.Particle.REGISTRY) { // Eclipse fail
+ Assert.assertNotNull("Missing NMS->Bukkit particle mapping for " + nms, CraftParticle.toBukkit(nms));
}
}
}
diff --git a/src/test/java/org/bukkit/PerMaterialTest.java b/src/test/java/org/bukkit/PerMaterialTest.java
index ed5242a9..dfa24769 100644
--- a/src/test/java/org/bukkit/PerMaterialTest.java
+++ b/src/test/java/org/bukkit/PerMaterialTest.java
@@ -43,7 +43,9 @@ public class PerMaterialTest extends AbstractTestingBase {
public static List<Object[]> data() {
List<Object[]> list = Lists.newArrayList();
for (Material material : Material.values()) {
- list.add(new Object[] {material});
+ if (!material.isLegacy()) {
+ list.add(new Object[] {material});
+ }
}
return list;
}
@@ -51,6 +53,13 @@ public class PerMaterialTest extends AbstractTestingBase {
@Parameter public Material material;
@Test
+ public void isBlock() {
+ if (material != Material.AIR && material != Material.CAVE_AIR && material != Material.VOID_AIR) {
+ assertThat(material.isBlock(), is(not(CraftMagicNumbers.getBlock(material).getBlockData().isAir())));
+ }
+ }
+
+ @Test
public void isSolid() {
if (material == Material.AIR) {
assertFalse(material.isSolid());
@@ -106,7 +115,7 @@ public class PerMaterialTest extends AbstractTestingBase {
if (material == Material.AIR) {
assertTrue(material.isTransparent());
} else if (material.isBlock()) {
- assertThat(material.isTransparent(), is(not(CraftMagicNumbers.getBlock(material).getBlockData().getMaterial().blocksLight())));
+ // assertThat(material.isTransparent(), is(not(CraftMagicNumbers.getBlock(material).getBlockData().getMaterial().blocksLight()))); // PAIL: not unit testable anymore (17w50a)
} else {
assertFalse(material.isTransparent());
}
@@ -164,6 +173,15 @@ public class PerMaterialTest extends AbstractTestingBase {
}
@Test
+ public void testDurability() {
+ if (!material.isBlock()) {
+ assertThat(material.getMaxDurability(), is((short) CraftMagicNumbers.getItem(material).getMaxDurability()));
+ } else {
+ assertThat(material.getMaxDurability(), is((short) 0));
+ }
+ }
+
+ @Test
public void testBlock() {
if (material == Material.AIR) {
assertTrue(material.isBlock());
diff --git a/src/test/java/org/bukkit/StatisticsAndAchievementsTest.java b/src/test/java/org/bukkit/StatisticsAndAchievementsTest.java
index e05e7330..055bc426 100644
--- a/src/test/java/org/bukkit/StatisticsAndAchievementsTest.java
+++ b/src/test/java/org/bukkit/StatisticsAndAchievementsTest.java
@@ -3,10 +3,13 @@ package org.bukkit;
import static org.junit.Assert.*;
import static org.hamcrest.Matchers.*;
-import java.util.List;
-
+import net.minecraft.server.Block;
+import net.minecraft.server.EntityTypes;
+import net.minecraft.server.Item;
import net.minecraft.server.StatisticList;
+import net.minecraft.server.StatisticWrapper;
+import org.bukkit.entity.EntityType;
import org.bukkit.craftbukkit.CraftStatistic;
import org.bukkit.support.AbstractTestingBase;
import org.junit.Test;
@@ -17,17 +20,38 @@ public class StatisticsAndAchievementsTest extends AbstractTestingBase {
@Test
@SuppressWarnings("unchecked")
+ public void verifyEntityMapping() throws Throwable {
+ for (Statistic statistic : Statistic.values()) {
+ if (statistic.getType() == Statistic.Type.ENTITY) {
+ for (EntityType entity : EntityType.values()) {
+ if (entity.getName() != null) {
+ assertNotNull(statistic + " missing for " + entity, CraftStatistic.getEntityStatistic(statistic, entity));
+ }
+ }
+ }
+ }
+ }
+
+ @Test
+ @SuppressWarnings("unchecked")
public void verifyStatisticMapping() throws Throwable {
HashMultiset<Statistic> statistics = HashMultiset.create();
- for (net.minecraft.server.Statistic statistic : (List<net.minecraft.server.Statistic>) StatisticList.stats) {
- String name = statistic.name;
-
- String message = String.format("org.bukkit.Statistic is missing: '%s'", name);
-
- Statistic subject = CraftStatistic.getBukkitStatistic(statistic);
- assertThat(message, subject, is(not(nullValue())));
-
- statistics.add(subject);
+ for (StatisticWrapper wrapper : (Iterable<StatisticWrapper<?>>) StatisticList.REGISTRY) { // Eclipse fail
+ for (Object child : wrapper.a()) {
+ net.minecraft.server.Statistic<?> statistic = wrapper.b(child);
+ String message = String.format("org.bukkit.Statistic is missing: '%s'", statistic);
+
+ Statistic subject = CraftStatistic.getBukkitStatistic(statistic);
+ assertThat(message, subject, is(not(nullValue())));
+
+ if (wrapper.a() == Block.REGISTRY || wrapper.a() == Item.REGISTRY) {
+ assertNotNull("Material type map missing for " + child, CraftStatistic.getMaterialFromStatistic(statistic));
+ } else if (wrapper.a() == EntityTypes.REGISTRY) {
+ assertNotNull("Entity type map missing for " + EntityTypes.getName((EntityTypes<?>) child), CraftStatistic.getEntityTypeFromStatistic((net.minecraft.server.Statistic<EntityTypes<?>>) statistic));
+ }
+
+ statistics.add(subject);
+ }
}
for (Statistic statistic : Statistic.values()) {
diff --git a/src/test/java/org/bukkit/craftbukkit/generator/ChunkDataTest.java b/src/test/java/org/bukkit/craftbukkit/generator/ChunkDataTest.java
index 225df40a..792e1fc6 100644
--- a/src/test/java/org/bukkit/craftbukkit/generator/ChunkDataTest.java
+++ b/src/test/java/org/bukkit/craftbukkit/generator/ChunkDataTest.java
@@ -1,32 +1,31 @@
package org.bukkit.craftbukkit.generator;
-import org.bukkit.DyeColor;
import org.bukkit.Material;
-import org.bukkit.material.MaterialData;
-import org.bukkit.material.Wool;
+import org.bukkit.block.data.BlockData;
+import org.bukkit.support.AbstractTestingBase;
import org.junit.Test;
import static org.junit.Assert.*;
-public class ChunkDataTest {
+public class ChunkDataTest extends AbstractTestingBase {
- private static final MaterialData RED_WOOL = new Wool(DyeColor.RED);
- private static final MaterialData AIR = new MaterialData(Material.AIR);
+ private static final BlockData RED_WOOL = Material.RED_WOOL.createBlockData();
+ private static final BlockData AIR = Material.AIR.createBlockData();
- private boolean testSetBlock(CraftChunkData data, int x, int y, int z, MaterialData type, MaterialData expected) {
+ private boolean testSetBlock(CraftChunkData data, int x, int y, int z, BlockData type, BlockData expected) {
data.setBlock(x, y, z, type);
- return expected.equals(data.getTypeAndData(x, y, z));
+ return expected.equals(data.getBlockData(x, y, z));
}
- private void testSetRegion(CraftChunkData data, int minx, int miny, int minz, int maxx, int maxy, int maxz, MaterialData type) {
+ private void testSetRegion(CraftChunkData data, int minx, int miny, int minz, int maxx, int maxy, int maxz, BlockData type) {
data.setRegion(minx, miny, minz, maxx, maxy, maxz, type);
for (int y = 0; y < data.getMaxHeight(); y++) {
for (int z = 0; z < 16; z++) {
for (int x = 0; x < 16; x++) {
boolean inRegion = miny <= y && y < maxy && minx <= x && x < maxx && minz <= z && z < maxz;
- if (inRegion != type.equals(data.getTypeAndData(x, y, z))) {
+ if (inRegion != type.equals(data.getBlockData(x, y, z))) {
throw new IllegalStateException(
"setRegion(" + minx + ", " + miny + ", " + minz + ", " + maxx + ", " + maxy + ", " + maxz + ", " + type + ")"
- + "-> block at " + x + ", " + y + ", " + z + " is " + data.getTypeAndData(x, y, z));
+ + "-> block at " + x + ", " + y + ", " + z + " is " + data.getBlockData(x, y, z));
}
}
}
diff --git a/src/test/java/org/bukkit/craftbukkit/inventory/CompositeSerialization.java b/src/test/java/org/bukkit/craftbukkit/inventory/CompositeSerialization.java
index 1349a7f1..2a0791bb 100644
--- a/src/test/java/org/bukkit/craftbukkit/inventory/CompositeSerialization.java
+++ b/src/test/java/org/bukkit/craftbukkit/inventory/CompositeSerialization.java
@@ -6,6 +6,7 @@ import static org.hamcrest.Matchers.*;
import java.util.ArrayList;
import java.util.List;
+import org.bukkit.Material;
import org.bukkit.configuration.InvalidConfigurationException;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.enchantments.Enchantment;
@@ -25,23 +26,23 @@ public class CompositeSerialization extends AbstractTestingBase {
YamlConfiguration out = getConfig();
List<ItemStack> stacks = new ArrayList<ItemStack>();
- stacks.add(new ItemStack(1));
- stacks.add(new ItemStack(2));
- stacks.add(new ItemStack(3));
- stacks.add(new ItemStack(4, 17));
- stacks.add(new ItemStack(5, 63));
- stacks.add(new ItemStack(6, 1, (short) 1));
- stacks.add(new ItemStack(18, 32, (short) 2));
-
- ItemStack item7 = new ItemStack(256);
- item7.addUnsafeEnchantment(Enchantment.getById(1), 1);
+ stacks.add(new ItemStack(Material.STONE));
+ stacks.add(new ItemStack(Material.GRASS));
+ stacks.add(new ItemStack(Material.DIRT));
+ stacks.add(new ItemStack(Material.COBBLESTONE, 17));
+ stacks.add(new ItemStack(Material.OAK_PLANKS, 63));
+ stacks.add(new ItemStack(Material.OAK_SAPLING, 1, (short) 1));
+ stacks.add(new ItemStack(Material.OAK_LEAVES, 32, (short) 2));
+
+ ItemStack item7 = new ItemStack(Material.IRON_SHOVEL);
+ item7.addUnsafeEnchantment(Enchantment.PROTECTION_FIRE, 1);
stacks.add(item7);
- ItemStack item8 = new ItemStack(257);
- item8.addUnsafeEnchantment(Enchantment.getById(2), 2);
- item8.addUnsafeEnchantment(Enchantment.getById(3), 1);
- item8.addUnsafeEnchantment(Enchantment.getById(4), 5);
- item8.addUnsafeEnchantment(Enchantment.getById(5), 4);
+ ItemStack item8 = new ItemStack(Material.IRON_PICKAXE);
+ item8.addUnsafeEnchantment(Enchantment.PROTECTION_FALL, 2);
+ item8.addUnsafeEnchantment(Enchantment.PROTECTION_EXPLOSIONS, 1);
+ item8.addUnsafeEnchantment(Enchantment.PROTECTION_PROJECTILE, 5);
+ item8.addUnsafeEnchantment(Enchantment.OXYGEN, 4);
stacks.add(item8);
out.set("composite-list.abc.def", stacks);
diff --git a/src/test/java/org/bukkit/craftbukkit/inventory/ItemFactoryTest.java b/src/test/java/org/bukkit/craftbukkit/inventory/ItemFactoryTest.java
index f5bcbdbe..18f3e1ff 100644
--- a/src/test/java/org/bukkit/craftbukkit/inventory/ItemFactoryTest.java
+++ b/src/test/java/org/bukkit/craftbukkit/inventory/ItemFactoryTest.java
@@ -10,7 +10,7 @@ import java.util.HashSet;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
-import net.minecraft.server.CommandAbstract;
+import net.minecraft.server.IAnimal;
import net.minecraft.server.IAttribute;
import org.bukkit.support.AbstractTestingBase;
@@ -20,7 +20,7 @@ public class ItemFactoryTest extends AbstractTestingBase {
@Test
public void testKnownAttributes() throws Throwable {
- final ZipInputStream nmsZipStream = new ZipInputStream(CommandAbstract.class/* Magic class that isn't imported! */.getProtectionDomain().getCodeSource().getLocation().openStream());
+ final ZipInputStream nmsZipStream = new ZipInputStream(IAnimal.class/* Magic class that isn't imported! */.getProtectionDomain().getCodeSource().getLocation().openStream());
final Collection<String> names = new HashSet<String>();
for (ZipEntry clazzEntry; (clazzEntry = nmsZipStream.getNextEntry()) != null; ) {
final String entryName = clazzEntry.getName();
diff --git a/src/test/java/org/bukkit/craftbukkit/inventory/ItemMetaTest.java b/src/test/java/org/bukkit/craftbukkit/inventory/ItemMetaTest.java
index 1f537d58..74e37cd9 100644
--- a/src/test/java/org/bukkit/craftbukkit/inventory/ItemMetaTest.java
+++ b/src/test/java/org/bukkit/craftbukkit/inventory/ItemMetaTest.java
@@ -3,13 +3,14 @@ package org.bukkit.craftbukkit.inventory;
import static org.junit.Assert.*;
import static org.hamcrest.Matchers.*;
+import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import net.minecraft.server.Block;
import net.minecraft.server.ITileEntity;
import net.minecraft.server.Item;
import net.minecraft.server.ItemBlock;
-import net.minecraft.server.ItemReed;
+import net.minecraft.server.ItemBlockWallable;
import org.bukkit.Bukkit;
import org.bukkit.Color;
@@ -26,6 +27,7 @@ import org.bukkit.craftbukkit.inventory.ItemStackTest.BukkitWrapper;
import org.bukkit.craftbukkit.inventory.ItemStackTest.CraftWrapper;
import org.bukkit.enchantments.Enchantment;
import org.bukkit.entity.EntityType;
+import org.bukkit.entity.TropicalFish;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.BannerMeta;
import org.bukkit.inventory.meta.BlockStateMeta;
@@ -39,6 +41,7 @@ import org.bukkit.inventory.meta.LeatherArmorMeta;
import org.bukkit.inventory.meta.MapMeta;
import org.bukkit.inventory.meta.PotionMeta;
import org.bukkit.inventory.meta.SpawnEggMeta;
+import org.bukkit.inventory.meta.TropicalFishBucketMeta;
import org.bukkit.potion.PotionEffectType;
import org.bukkit.potion.PotionData;
import org.bukkit.potion.PotionType;
@@ -125,12 +128,12 @@ public class ItemMetaTest extends AbstractTestingBase {
}
private static FireworkMeta newFireworkMeta() {
- return ((FireworkMeta) Bukkit.getItemFactory().getItemMeta(Material.FIREWORK));
+ return ((FireworkMeta) Bukkit.getItemFactory().getItemMeta(Material.FIREWORK_ROCKET));
}
@Test
public void testCrazyEquality() {
- CraftItemStack craft = CraftItemStack.asCraftCopy(new ItemStack(1));
+ CraftItemStack craft = CraftItemStack.asCraftCopy(new ItemStack(Material.STONE));
craft.setItemMeta(craft.getItemMeta());
ItemStack bukkit = new ItemStack(craft);
assertThat(craft, is(bukkit));
@@ -139,21 +142,24 @@ public class ItemMetaTest extends AbstractTestingBase {
@Test
public void testBlockStateMeta() {
- for (Item item : (Iterable<Item>) Item.REGISTRY) {
- Block block = null;
+ List<Block> queue = new ArrayList<>();
+ for (Item item : (Iterable<Item>) Item.REGISTRY) { // Eclipse fail
if (item instanceof ItemBlock) {
- block = ((ItemBlock) item).getBlock();
- } else if (item instanceof ItemReed) {
- block = ((ItemReed) item).a;
+ queue.add(((ItemBlock) item).getBlock());
}
+ if (item instanceof ItemBlockWallable) {
+ queue.add(((ItemBlockWallable) item).wallBlock);
+ }
+ }
+ for (Block block : queue) {
if (block != null) {
if (block instanceof ITileEntity) {
ItemStack stack = CraftItemStack.asNewCraftStack(Item.getItemOf(block));
// Command blocks aren't unit testable atm
- if (stack.getType() == Material.AIR || stack.getType() == Material.COMMAND || stack.getType() == Material.COMMAND_CHAIN || stack.getType() == Material.COMMAND_REPEATING) {
+ if (stack.getType() == Material.COMMAND_BLOCK || stack.getType() == Material.CHAIN_COMMAND_BLOCK || stack.getType() == Material.REPEATING_COMMAND_BLOCK) {
return;
}
@@ -172,7 +178,7 @@ public class ItemMetaTest extends AbstractTestingBase {
@Test
public void testEachExtraData() {
final List<StackProvider> providers = Arrays.asList(
- new StackProvider(Material.BOOK_AND_QUILL) {
+ new StackProvider(Material.WRITABLE_BOOK) {
@Override ItemStack operate(final ItemStack cleanStack) {
final BookMeta meta = (BookMeta) cleanStack.getItemMeta();
meta.setAuthor("Some author");
@@ -202,7 +208,7 @@ public class ItemMetaTest extends AbstractTestingBase {
}
},
*/
- new StackProvider(Material.MAP) {
+ new StackProvider(Material.FILLED_MAP) {
@Override ItemStack operate(final ItemStack cleanStack) {
final MapMeta meta = (MapMeta) cleanStack.getItemMeta();
meta.setScaling(true);
@@ -227,7 +233,7 @@ public class ItemMetaTest extends AbstractTestingBase {
return cleanStack;
}
},
- new StackProvider(Material.FIREWORK) {
+ new StackProvider(Material.FIREWORK_ROCKET) {
@Override ItemStack operate(final ItemStack cleanStack) {
final FireworkMeta meta = (FireworkMeta) cleanStack.getItemMeta();
meta.addEffect(FireworkEffect.builder().withColor(Color.GREEN).withFade(Color.OLIVE).with(Type.BALL_LARGE).build());
@@ -243,7 +249,7 @@ public class ItemMetaTest extends AbstractTestingBase {
return cleanStack;
}
},
- new StackProvider(Material.FIREWORK_CHARGE) {
+ new StackProvider(Material.FIREWORK_STAR) {
@Override ItemStack operate(final ItemStack cleanStack) {
final FireworkEffectMeta meta = (FireworkEffectMeta) cleanStack.getItemMeta();
meta.setEffect(FireworkEffect.builder().withColor(Color.MAROON, Color.BLACK).with(Type.CREEPER).withFlicker().build());
@@ -251,7 +257,7 @@ public class ItemMetaTest extends AbstractTestingBase {
return cleanStack;
}
},
- new StackProvider(Material.BANNER) {
+ new StackProvider(Material.WHITE_BANNER) {
@Override ItemStack operate(ItemStack cleanStack) {
final BannerMeta meta = (BannerMeta) cleanStack.getItemMeta();
meta.setBaseColor(DyeColor.CYAN);
@@ -259,26 +265,38 @@ public class ItemMetaTest extends AbstractTestingBase {
cleanStack.setItemMeta(meta);
return cleanStack;
}
- },
- new StackProvider(Material.MONSTER_EGG) {
+ },
+ /* No distinguishing features, add back with virtual entity API
+ new StackProvider(Material.ZOMBIE_SPAWN_EGG) {
@Override ItemStack operate(ItemStack cleanStack) {
final SpawnEggMeta meta = (SpawnEggMeta) cleanStack.getItemMeta();
meta.setSpawnedType(EntityType.ZOMBIE);
cleanStack.setItemMeta(meta);
return cleanStack;
- }
- },
- new StackProvider(Material.KNOWLEDGE_BOOK) {
+ }
+ },
+ */
+ new StackProvider(Material.KNOWLEDGE_BOOK) {
@Override ItemStack operate(ItemStack cleanStack) {
final KnowledgeBookMeta meta = (KnowledgeBookMeta) cleanStack.getItemMeta();
meta.addRecipe(new NamespacedKey("minecraft", "test"), new NamespacedKey("plugin", "test"));
cleanStack.setItemMeta(meta);
return cleanStack;
}
+ },
+ new StackProvider(Material.TROPICAL_FISH_BUCKET) {
+ @Override ItemStack operate(ItemStack cleanStack) {
+ final TropicalFishBucketMeta meta = (TropicalFishBucketMeta) cleanStack.getItemMeta();
+ meta.setBodyColor(DyeColor.ORANGE);
+ meta.setPatternColor(DyeColor.BLACK);
+ meta.setPattern(TropicalFish.Pattern.DASHER);
+ cleanStack.setItemMeta(meta);
+ return cleanStack;
+ }
}
);
- assertThat("Forgotten test?", providers, hasSize(ItemStackTest.COMPOUND_MATERIALS.length - 3/* Normal item meta, skulls and tile entities */));
+ assertThat("Forgotten test?", providers, hasSize(ItemStackTest.COMPOUND_MATERIALS.length - 4/* Normal item meta, skulls, eggs and tile entities */));
for (final StackProvider provider : providers) {
downCastTest(new BukkitWrapper(provider));
@@ -288,7 +306,7 @@ public class ItemMetaTest extends AbstractTestingBase {
private void downCastTest(final StackWrapper provider) {
final String name = provider.toString();
- final ItemStack blank = new ItemStack(1);
+ final ItemStack blank = new ItemStack(Material.STONE);
final ItemStack craftBlank = CraftItemStack.asCraftCopy(blank);
downCastTest(name, provider.stack(), blank);
@@ -304,7 +322,7 @@ public class ItemMetaTest extends AbstractTestingBase {
assertThat(name, stack, is(not(blank)));
assertThat(name, stack.getItemMeta(), is(not(blank.getItemMeta())));
- stack.setTypeId(1);
+ stack.setType(Material.STONE);
assertThat(name, stack, is(blank));
}
diff --git a/src/test/java/org/bukkit/craftbukkit/inventory/ItemStackBookTest.java b/src/test/java/org/bukkit/craftbukkit/inventory/ItemStackBookTest.java
index a7edc048..c16c5611 100644
--- a/src/test/java/org/bukkit/craftbukkit/inventory/ItemStackBookTest.java
+++ b/src/test/java/org/bukkit/craftbukkit/inventory/ItemStackBookTest.java
@@ -17,7 +17,7 @@ public class ItemStackBookTest extends ItemStackTest {
@Parameters(name="[{index}]:{" + NAME_PARAMETER + "}")
public static List<Object[]> data() {
- return StackProvider.compound(operators(), "%s %s", NAME_PARAMETER, Material.WRITTEN_BOOK, Material.BOOK_AND_QUILL);
+ return StackProvider.compound(operators(), "%s %s", NAME_PARAMETER, Material.WRITTEN_BOOK, Material.WRITABLE_BOOK);
}
@SuppressWarnings("unchecked")
diff --git a/src/test/java/org/bukkit/craftbukkit/inventory/ItemStackFireworkChargeTest.java b/src/test/java/org/bukkit/craftbukkit/inventory/ItemStackFireworkChargeTest.java
index cb38cd27..fbfce58c 100644
--- a/src/test/java/org/bukkit/craftbukkit/inventory/ItemStackFireworkChargeTest.java
+++ b/src/test/java/org/bukkit/craftbukkit/inventory/ItemStackFireworkChargeTest.java
@@ -20,7 +20,7 @@ public class ItemStackFireworkChargeTest extends ItemStackTest {
@Parameters(name="[{index}]:{" + NAME_PARAMETER + "}")
public static List<Object[]> data() {
- return StackProvider.compound(operators(), "%s %s", NAME_PARAMETER, Material.FIREWORK_CHARGE);
+ return StackProvider.compound(operators(), "%s %s", NAME_PARAMETER, Material.FIREWORK_STAR);
}
@SuppressWarnings("unchecked")
diff --git a/src/test/java/org/bukkit/craftbukkit/inventory/ItemStackFireworkTest.java b/src/test/java/org/bukkit/craftbukkit/inventory/ItemStackFireworkTest.java
index 40b1d19d..55e6629b 100644
--- a/src/test/java/org/bukkit/craftbukkit/inventory/ItemStackFireworkTest.java
+++ b/src/test/java/org/bukkit/craftbukkit/inventory/ItemStackFireworkTest.java
@@ -20,7 +20,7 @@ public class ItemStackFireworkTest extends ItemStackTest {
@Parameters(name="[{index}]:{" + NAME_PARAMETER + "}")
public static List<Object[]> data() {
- return StackProvider.compound(operators(), "%s %s", NAME_PARAMETER, Material.FIREWORK);
+ return StackProvider.compound(operators(), "%s %s", NAME_PARAMETER, Material.FIREWORK_ROCKET);
}
@SuppressWarnings("unchecked")
diff --git a/src/test/java/org/bukkit/craftbukkit/inventory/ItemStackMapTest.java b/src/test/java/org/bukkit/craftbukkit/inventory/ItemStackMapTest.java
index 9c499858..c13f6d57 100644
--- a/src/test/java/org/bukkit/craftbukkit/inventory/ItemStackMapTest.java
+++ b/src/test/java/org/bukkit/craftbukkit/inventory/ItemStackMapTest.java
@@ -17,7 +17,7 @@ public class ItemStackMapTest extends ItemStackTest {
@Parameters(name="[{index}]:{" + NAME_PARAMETER + "}")
public static List<Object[]> data() {
- return StackProvider.compound(operators(), "%s %s", NAME_PARAMETER, Material.MAP);
+ return StackProvider.compound(operators(), "%s %s", NAME_PARAMETER, Material.FILLED_MAP);
}
@SuppressWarnings("unchecked")
diff --git a/src/test/java/org/bukkit/craftbukkit/inventory/ItemStackSkullTest.java b/src/test/java/org/bukkit/craftbukkit/inventory/ItemStackSkullTest.java
index a79d443e..1561bf88 100644
--- a/src/test/java/org/bukkit/craftbukkit/inventory/ItemStackSkullTest.java
+++ b/src/test/java/org/bukkit/craftbukkit/inventory/ItemStackSkullTest.java
@@ -17,7 +17,7 @@ public class ItemStackSkullTest extends ItemStackTest {
@Parameters(name="[{index}]:{" + NAME_PARAMETER + "}")
public static List<Object[]> data() {
- return StackProvider.compound(operators(), "%s %s", NAME_PARAMETER, Material.SKULL_ITEM);
+ return StackProvider.compound(operators(), "%s %s", NAME_PARAMETER, Material.PLAYER_HEAD);
}
@SuppressWarnings("unchecked")
diff --git a/src/test/java/org/bukkit/craftbukkit/inventory/NMSCraftItemStackTest.java b/src/test/java/org/bukkit/craftbukkit/inventory/NMSCraftItemStackTest.java
index 1f5a6a32..5a43fd86 100644
--- a/src/test/java/org/bukkit/craftbukkit/inventory/NMSCraftItemStackTest.java
+++ b/src/test/java/org/bukkit/craftbukkit/inventory/NMSCraftItemStackTest.java
@@ -21,7 +21,6 @@ public class NMSCraftItemStackTest extends AbstractTestingBase {
assertThat(clone.getAmount(), is(itemStack.getAmount()));
assertThat(clone.getDurability(), is(itemStack.getDurability()));
assertThat(clone.getEnchantments(), is(itemStack.getEnchantments()));
- assertThat(clone.getTypeId(), is(itemStack.getTypeId()));
assertThat(clone.getData(), is(itemStack.getData()));
assertThat(clone, is(itemStack));
}
diff --git a/src/test/java/org/bukkit/entity/EntityTypesTest.java b/src/test/java/org/bukkit/entity/EntityTypesTest.java
new file mode 100644
index 00000000..d8c3b013
--- /dev/null
+++ b/src/test/java/org/bukkit/entity/EntityTypesTest.java
@@ -0,0 +1,29 @@
+package org.bukkit.entity;
+
+import java.util.Arrays;
+import java.util.Set;
+import java.util.stream.Collectors;
+import net.minecraft.server.EntityTypes;
+import net.minecraft.server.MinecraftKey;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class EntityTypesTest {
+
+ @Test
+ public void testMaps() {
+ Set<EntityType> allBukkit = Arrays.stream(EntityType.values()).filter((b) -> b.getName() != null).collect(Collectors.toSet());
+
+ for (Object o : EntityTypes.REGISTRY) {
+ EntityTypes<?> nms = (EntityTypes<?>) o; // Eclipse fail
+ MinecraftKey key = EntityTypes.getName(nms);
+
+ EntityType bukkit = EntityType.fromName(key.getKey());
+ Assert.assertNotNull("Missing nms->bukkit " + key, bukkit);
+
+ Assert.assertTrue("Duplicate entity nms->" + bukkit, allBukkit.remove(bukkit));
+ }
+
+ Assert.assertTrue("Unmapped bukkit entities " + allBukkit, allBukkit.isEmpty());
+ }
+}
diff --git a/src/test/java/org/bukkit/entity/TropicalFishTest.java b/src/test/java/org/bukkit/entity/TropicalFishTest.java
new file mode 100644
index 00000000..63ddb467
--- /dev/null
+++ b/src/test/java/org/bukkit/entity/TropicalFishTest.java
@@ -0,0 +1,45 @@
+package org.bukkit.entity;
+
+import static org.junit.Assert.*;
+import static org.hamcrest.Matchers.*;
+import org.bukkit.DyeColor;
+import org.bukkit.craftbukkit.entity.CraftTropicalFish;
+import org.bukkit.entity.TropicalFish.Pattern;
+
+import org.junit.Test;
+
+public class TropicalFishTest {
+
+ @Test
+ public void testVariants() {
+ testVariant(65536, DyeColor.ORANGE, DyeColor.WHITE, Pattern.KOB);
+ testVariant(917504, DyeColor.RED, DyeColor.WHITE, Pattern.KOB);
+ testVariant(918273, DyeColor.RED, DyeColor.WHITE, Pattern.BLOCKFISH);
+ testVariant(918529, DyeColor.RED, DyeColor.WHITE, Pattern.BETTY);
+ testVariant(16778497, DyeColor.WHITE, DyeColor.ORANGE, Pattern.CLAYFISH);
+ testVariant(50660352, DyeColor.LIME, DyeColor.LIGHT_BLUE, Pattern.BRINELY);
+ testVariant(50726144, DyeColor.PINK, DyeColor.LIGHT_BLUE, Pattern.SPOTTY);
+ testVariant(50790656, DyeColor.GRAY, DyeColor.LIGHT_BLUE, Pattern.SUNSTREAK);
+ testVariant(67108865, DyeColor.WHITE, DyeColor.YELLOW, Pattern.FLOPPER);
+ testVariant(67110144, DyeColor.WHITE, DyeColor.YELLOW, Pattern.SPOTTY);
+ testVariant(67371265, DyeColor.YELLOW, DyeColor.YELLOW, Pattern.STRIPEY);
+ testVariant(67764993, DyeColor.PURPLE, DyeColor.YELLOW, Pattern.BLOCKFISH);
+ testVariant(101253888, DyeColor.CYAN, DyeColor.PINK, Pattern.DASHER);
+ testVariant(117441025, DyeColor.WHITE, DyeColor.GRAY, Pattern.GLITTER);
+ testVariant(117441280, DyeColor.WHITE, DyeColor.GRAY, Pattern.DASHER);
+ testVariant(117441536, DyeColor.WHITE, DyeColor.GRAY, Pattern.BRINELY);
+ testVariant(117506305, DyeColor.ORANGE, DyeColor.GRAY, Pattern.STRIPEY);
+ testVariant(117899265, DyeColor.GRAY, DyeColor.GRAY, Pattern.FLOPPER);
+ testVariant(118161664, DyeColor.BLUE, DyeColor.GRAY, Pattern.SUNSTREAK);
+ testVariant(134217984, DyeColor.WHITE, DyeColor.SILVER, Pattern.SUNSTREAK);
+ testVariant(234882305, DyeColor.WHITE, DyeColor.RED, Pattern.CLAYFISH);
+ testVariant(235340288, DyeColor.GRAY, DyeColor.RED, Pattern.SNOOPER);
+ }
+
+ private void testVariant(int variant, DyeColor bodyColor, DyeColor patternColor, Pattern pattern) {
+ assertThat("variant write", CraftTropicalFish.getData(patternColor, bodyColor, pattern), is(variant));
+ assertThat("pattern colour read", CraftTropicalFish.getPatternColor(variant), is(patternColor));
+ assertThat("body colour read", CraftTropicalFish.getBodyColor(variant), is(bodyColor));
+ assertThat("pattern read", CraftTropicalFish.getPattern(variant), is(pattern));
+ }
+}
diff --git a/src/test/java/org/bukkit/map/MapTest.java b/src/test/java/org/bukkit/map/MapTest.java
index f4788a18..2dde26d3 100644
--- a/src/test/java/org/bukkit/map/MapTest.java
+++ b/src/test/java/org/bukkit/map/MapTest.java
@@ -24,7 +24,7 @@ public class MapTest {
if (nmsColors[i] == null) {
break;
}
- int rgb = nmsColors[i].ac;
+ int rgb = nmsColors[i].rgb;
int r = (rgb >> 16) & 0xFF;
int g = (rgb >> 8) & 0xFF;
diff --git a/src/test/java/org/bukkit/potion/PotionTest.java b/src/test/java/org/bukkit/potion/PotionTest.java
index e46429a5..74ed926f 100644
--- a/src/test/java/org/bukkit/potion/PotionTest.java
+++ b/src/test/java/org/bukkit/potion/PotionTest.java
@@ -30,6 +30,6 @@ public class PotionTest extends AbstractTestingBase {
effects.put(enumType, enumType.name());
}
- assertEquals(effects.entrySet().size(), PotionType.values().length - /* PotionTypes with no Effects */ 5);
+ assertEquals(effects.entrySet().size(), PotionType.values().length - /* PotionTypes with no/shared Effects */ 6);
}
}
diff --git a/src/test/java/org/bukkit/support/AbstractTestingBase.java b/src/test/java/org/bukkit/support/AbstractTestingBase.java
index 86c2b971..6266dc32 100644
--- a/src/test/java/org/bukkit/support/AbstractTestingBase.java
+++ b/src/test/java/org/bukkit/support/AbstractTestingBase.java
@@ -1,10 +1,16 @@
package org.bukkit.support;
import com.google.common.collect.ImmutableList;
+import java.util.Collections;
import java.util.List;
import net.minecraft.server.DispenserRegistry;
+import net.minecraft.server.EnumResourcePackType;
+import net.minecraft.server.ResourceManager;
+import net.minecraft.server.ResourcePackVanilla;
+import net.minecraft.server.TagRegistry;
import org.bukkit.Material;
-import org.junit.BeforeClass;
+import org.bukkit.craftbukkit.util.CraftMagicNumbers;
+import org.junit.Assert;
/**
* If you are getting: java.lang.ExceptionInInitializerError
@@ -15,67 +21,28 @@ 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,
- 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,
- Material.PURPUR_DOUBLE_SLAB,
- Material.BEETROOT_BLOCK,
- Material.END_GATEWAY,
- Material.BURNING_FURNACE,
- Material.FROSTED_ICE
- ).build();
+ // Materials that only exist in block form (or are legacy)
+ public static final List<Material> INVALIDATED_MATERIALS;
- @BeforeClass
- public static void setup() {
+ static {
DispenserRegistry.c();
+ // Set up resource manager
+ ResourceManager resourceManager = new ResourceManager(EnumResourcePackType.SERVER_DATA);
+ // add tags for unit tests
+ resourceManager.a(new TagRegistry());
+ // Register vanilla pack
+ resourceManager.a(Collections.singletonList(new ResourcePackVanilla("minecraft")));
+
DummyServer.setup();
DummyEnchantments.setup();
+
+ ImmutableList.Builder<Material> builder = ImmutableList.builder();
+ for (Material m : Material.values()) {
+ if (m.isLegacy() || CraftMagicNumbers.getItem(m) == null) {
+ builder.add(m);
+ }
+ }
+ INVALIDATED_MATERIALS = builder.build();
+ Assert.assertTrue("Expected 533 invalidated materials (got " + INVALIDATED_MATERIALS.size() + ")", INVALIDATED_MATERIALS.size() == 533);
}
-} \ No newline at end of file
+}
diff --git a/src/test/java/org/bukkit/support/DummyServer.java b/src/test/java/org/bukkit/support/DummyServer.java
index e5215bb4..a6e7651a 100644
--- a/src/test/java/org/bukkit/support/DummyServer.java
+++ b/src/test/java/org/bukkit/support/DummyServer.java
@@ -7,8 +7,11 @@ import java.util.HashMap;
import java.util.logging.Logger;
import org.bukkit.Bukkit;
+import org.bukkit.Material;
import org.bukkit.Server;
+import org.bukkit.craftbukkit.block.data.CraftBlockData;
import org.bukkit.craftbukkit.inventory.CraftItemFactory;
+import org.bukkit.craftbukkit.util.CraftMagicNumbers;
import org.bukkit.craftbukkit.util.Versioning;
public class DummyServer implements InvocationHandler {
@@ -59,6 +62,23 @@ public class DummyServer implements InvocationHandler {
}
}
);
+ methods.put(
+ Server.class.getMethod("getUnsafe"),
+ new MethodHandler() {
+ public Object handle(DummyServer server, Object[] args) {
+ return CraftMagicNumbers.INSTANCE;
+ }
+ }
+ );
+ methods.put(
+ Server.class.getMethod("createBlockData", Material.class),
+ new MethodHandler() {
+ final Logger logger = Logger.getLogger(DummyServer.class.getCanonicalName());
+ public Object handle(DummyServer server, Object[] args) {
+ return CraftBlockData.newData((Material) args[0], null);
+ }
+ }
+ );
Bukkit.setServer(Proxy.getProxyClass(Server.class.getClassLoader(), Server.class).asSubclass(Server.class).getConstructor(InvocationHandler.class).newInstance(new DummyServer()));
} catch (Throwable t) {
throw new Error(t);