From ae0c7fbd7955347a566e043ca2773cc30009f195 Mon Sep 17 00:00:00 2001 From: beaness Date: Wed, 22 Jun 2022 21:02:57 +0200 Subject: [PATCH] So many patches --- .../command/defaults/VersionCommand.java | 222 +-- .../nms-patches/BiomeTheEndDecorator.patch | 11 - TacoSpigot-Server/nms-patches/Block.patch | 23 - .../nms-patches/BlockBloodStone.patch | 28 - .../nms-patches/BlockButtonAbstract.patch | 110 -- .../nms-patches/BlockCactus.patch | 33 - TacoSpigot-Server/nms-patches/BlockCake.patch | 22 - .../nms-patches/BlockCocoa.patch | 35 - .../nms-patches/BlockCommand.patch | 33 - .../nms-patches/BlockCrops.patch | 35 - .../nms-patches/BlockDaylightDetector.patch | 10 - .../nms-patches/BlockDiodeAbstract.patch | 30 - .../nms-patches/BlockDispenser.patch | 18 - TacoSpigot-Server/nms-patches/BlockDoor.patch | 44 - .../nms-patches/BlockDragonEgg.patch | 30 - .../nms-patches/BlockDropper.patch | 41 - .../nms-patches/BlockEnderPortal.patch | 22 - TacoSpigot-Server/nms-patches/BlockFire.patch | 136 -- .../nms-patches/BlockFlowing.patch | 74 - .../nms-patches/BlockGrass.patch | 77 - TacoSpigot-Server/nms-patches/BlockIce.patch | 15 - .../nms-patches/BlockJukeBox.patch | 14 - .../nms-patches/BlockLeaves.patch | 26 - .../nms-patches/BlockLever.patch | 32 - .../nms-patches/BlockMinecartDetector.patch | 29 - .../BlockMinecartTrackAbstract.patch | 11 - .../nms-patches/BlockMobSpawner.patch | 22 - .../nms-patches/BlockMonsterEggs.patch | 20 - .../nms-patches/BlockMushroom.patch | 55 - .../nms-patches/BlockMycel.patch | 58 - .../nms-patches/BlockNetherWart.patch | 12 - TacoSpigot-Server/nms-patches/BlockOre.patch | 45 - .../nms-patches/BlockPiston.patch | 102 -- .../nms-patches/BlockPlant.patch | 29 - .../nms-patches/BlockPortal.patch | 144 -- .../nms-patches/BlockPoweredRail.patch | 25 - .../BlockPressurePlateAbstract.patch | 31 - .../BlockPressurePlateBinary.patch | 38 - .../BlockPressurePlateWeighted.patch | 43 - .../nms-patches/BlockPumpkin.patch | 80 - .../nms-patches/BlockRedstoneLamp.patch | 47 - .../nms-patches/BlockRedstoneOre.patch | 101 -- .../nms-patches/BlockRedstoneTorch.patch | 62 - .../nms-patches/BlockRedstoneWire.patch | 27 - TacoSpigot-Server/nms-patches/BlockReed.patch | 16 - .../nms-patches/BlockSapling.patch | 125 -- .../nms-patches/BlockSkull.patch | 120 -- TacoSpigot-Server/nms-patches/BlockSnow.patch | 14 - TacoSpigot-Server/nms-patches/BlockSoil.patch | 64 - .../nms-patches/BlockStationary.patch | 40 - TacoSpigot-Server/nms-patches/BlockStem.patch | 41 - .../nms-patches/BlockTrapdoor.patch | 31 - .../nms-patches/BlockTripwire.patch | 52 - .../nms-patches/BlockTripwireHook.patch | 29 - TacoSpigot-Server/nms-patches/BlockVine.patch | 75 - .../nms-patches/ChatBaseComponent.patch | 11 - .../nms-patches/ChatModifier.patch | 44 - TacoSpigot-Server/nms-patches/Chunk.patch | 153 -- .../nms-patches/ChunkProviderServer.patch | 327 ---- .../nms-patches/ChunkRegionLoader.patch | 127 -- .../nms-patches/ChunkSection.patch | 21 - .../CommandBlockListenerAbstract.patch | 167 -- .../nms-patches/CommandExecute.patch | 58 - .../nms-patches/CommandGamemode.patch | 28 - .../nms-patches/CommandGamerule.patch | 23 - .../nms-patches/CommandSpreadPlayers.patch | 47 - TacoSpigot-Server/nms-patches/CommandTp.patch | 37 - TacoSpigot-Server/nms-patches/Container.patch | 210 --- .../nms-patches/ContainerAnvil.patch | 51 - .../nms-patches/ContainerBeacon.patch | 47 - .../nms-patches/ContainerBrewingStand.patch | 52 - .../nms-patches/ContainerChest.patch | 60 - .../nms-patches/ContainerDispenser.patch | 53 - .../nms-patches/ContainerEnchantTable.patch | 177 -- .../nms-patches/ContainerFurnace.patch | 50 - .../nms-patches/ContainerHopper.patch | 44 - .../nms-patches/ContainerHorse.patch | 36 - .../nms-patches/ContainerMerchant.patch | 37 - .../nms-patches/ContainerPlayer.patch | 104 -- .../nms-patches/ContainerWorkbench.patch | 82 - .../nms-patches/CraftingManager.patch | 53 - .../nms-patches/CrashReport.patch | 10 - .../nms-patches/DedicatedServer.patch | 248 --- .../nms-patches/DispenseBehaviorItem.patch | 76 - .../DispenseBehaviorProjectile.patch | 54 - .../nms-patches/DispenserRegistry.patch | 385 ----- .../nms-patches/Enchantment.patch | 19 - .../nms-patches/EnchantmentThorns.patch | 11 - TacoSpigot-Server/nms-patches/Entity.patch | 617 ------- .../nms-patches/EntityAgeable.patch | 57 - .../nms-patches/EntityAnimal.patch | 20 - .../nms-patches/EntityArmorStand.patch | 71 - .../nms-patches/EntityArrow.patch | 93 - .../nms-patches/EntityBoat.patch | 225 --- .../nms-patches/EntityChicken.patch | 14 - TacoSpigot-Server/nms-patches/EntityCow.patch | 39 - .../nms-patches/EntityCreature.patch | 29 - .../nms-patches/EntityCreeper.patch | 105 -- .../EntityDamageSourceIndirect.patch | 13 - TacoSpigot-Server/nms-patches/EntityEgg.patch | 66 - .../nms-patches/EntityEnderCrystal.patch | 52 - .../nms-patches/EntityEnderDragon.patch | 277 --- .../nms-patches/EntityEnderPearl.patch | 64 - .../nms-patches/EntityEnderman.patch | 62 - .../nms-patches/EntityExperienceOrb.patch | 82 - .../nms-patches/EntityFallingBlock.patch | 52 - .../nms-patches/EntityFireball.patch | 102 -- .../nms-patches/EntityFireworks.patch | 11 - .../nms-patches/EntityFishingHook.patch | 92 - .../nms-patches/EntityGhast.patch | 13 - .../nms-patches/EntityHanging.patch | 182 -- .../nms-patches/EntityHorse.patch | 139 -- .../nms-patches/EntityHuman.patch | 430 ----- .../nms-patches/EntityInsentient.patch | 183 -- .../nms-patches/EntityIronGolem.patch | 20 - .../nms-patches/EntityItem.patch | 135 -- .../nms-patches/EntityItemFrame.patch | 14 - .../nms-patches/EntityLargeFireball.patch | 37 - .../nms-patches/EntityLeash.patch | 61 - .../nms-patches/EntityLightning.patch | 106 -- .../nms-patches/EntityLiving.patch | 546 ------ .../nms-patches/EntityMinecartAbstract.patch | 226 --- .../EntityMinecartCommandBlock.patch | 12 - .../nms-patches/EntityMinecartContainer.patch | 62 - .../nms-patches/EntityMonster.patch | 26 - .../nms-patches/EntityMushroomCow.patch | 25 - .../nms-patches/EntityOcelot.patch | 48 - .../nms-patches/EntityPainting.patch | 10 - TacoSpigot-Server/nms-patches/EntityPig.patch | 33 - .../nms-patches/EntityPlayer.patch | 609 ------- .../nms-patches/EntityPotion.patch | 71 - .../nms-patches/EntityProjectile.patch | 22 - .../nms-patches/EntityRabbit.patch | 25 - .../nms-patches/EntitySheep.patch | 68 - .../nms-patches/EntitySilverfish.patch | 26 - .../nms-patches/EntitySkeleton.patch | 96 - .../nms-patches/EntitySlice.patch | 38 - .../nms-patches/EntitySlime.patch | 40 - .../nms-patches/EntitySmallFireball.patch | 39 - .../nms-patches/EntitySnowman.patch | 42 - .../nms-patches/EntitySpider.patch | 11 - .../nms-patches/EntitySquid.patch | 14 - .../nms-patches/EntityTNTPrimed.patch | 52 - .../nms-patches/EntityThrownExpBottle.patch | 22 - .../nms-patches/EntityTracker.patch | 17 - .../nms-patches/EntityTrackerEntry.patch | 187 -- .../nms-patches/EntityVillager.patch | 19 - .../nms-patches/EntityWither.patch | 78 - .../nms-patches/EntityWitherSkull.patch | 39 - .../nms-patches/EntityWolf.patch | 97 -- .../nms-patches/EntityZombie.patch | 136 -- .../nms-patches/ExpirableListEntry.patch | 42 - TacoSpigot-Server/nms-patches/Explosion.patch | 153 -- .../nms-patches/FoodMetaData.patch | 66 - .../nms-patches/HandshakeListener.patch | 70 - .../nms-patches/IDataManager.patch | 9 - .../nms-patches/IInventory.patch | 31 - TacoSpigot-Server/nms-patches/IRecipe.patch | 9 - .../nms-patches/InventoryCraftResult.patch | 49 - .../nms-patches/InventoryCrafting.patch | 65 - .../nms-patches/InventoryEnderChest.patch | 52 - .../nms-patches/InventoryHorseChest.patch | 63 - .../nms-patches/InventoryLargeChest.patch | 67 - .../nms-patches/InventoryMerchant.patch | 60 - .../nms-patches/InventorySubcontainer.patch | 58 - TacoSpigot-Server/nms-patches/ItemArmor.patch | 59 - TacoSpigot-Server/nms-patches/ItemBoat.patch | 17 - TacoSpigot-Server/nms-patches/ItemBow.patch | 49 - .../nms-patches/ItemBucket.patch | 99 -- TacoSpigot-Server/nms-patches/ItemDye.patch | 28 - .../nms-patches/ItemFireball.patch | 17 - .../nms-patches/ItemFishingRod.patch | 30 - .../nms-patches/ItemFlintAndSteel.patch | 45 - .../nms-patches/ItemHanging.patch | 41 - TacoSpigot-Server/nms-patches/ItemLeash.patch | 35 - .../nms-patches/ItemMapEmpty.patch | 25 - .../nms-patches/ItemMinecart.patch | 74 - .../nms-patches/ItemMonsterEgg.patch | 31 - .../nms-patches/ItemRecord.patch | 17 - TacoSpigot-Server/nms-patches/ItemStack.patch | 251 --- .../nms-patches/ItemWaterLily.patch | 18 - .../nms-patches/ItemWorldMap.patch | 73 - TacoSpigot-Server/nms-patches/JsonList.patch | 47 - .../nms-patches/LoginListener.patch | 125 -- .../nms-patches/MethodProfiler.patch | 145 -- .../nms-patches/MinecraftServer.patch | 678 -------- .../nms-patches/MobEffectList.patch | 73 - .../nms-patches/MobSpawnerAbstract.patch | 50 - .../nms-patches/NBTTagList.patch | 10 - .../NameReferencingFileConverter.patch | 90 - .../nms-patches/NetworkManager.patch | 20 - .../nms-patches/PacketDataSerializer.patch | 67 - .../nms-patches/PacketPlayInBlockPlace.patch | 28 - .../nms-patches/PacketPlayInCloseWindow.patch | 24 - .../PacketPlayInResourcePackStatus.patch | 22 - .../nms-patches/PacketStatusListener.patch | 119 -- TacoSpigot-Server/nms-patches/Path.patch | 11 - .../nms-patches/PathfinderGoalBreakDoor.patch | 15 - .../nms-patches/PathfinderGoalBreed.patch | 23 - .../PathfinderGoalDefendVillage.patch | 11 - .../nms-patches/PathfinderGoalEatTile.patch | 34 - .../PathfinderGoalHurtByTarget.patch | 19 - .../nms-patches/PathfinderGoalMakeLove.patch | 11 - ...athfinderGoalNearestAttackableTarget.patch | 29 - ...oalNearestAttackableTargetInsentient.patch | 11 - .../PathfinderGoalOwnerHurtByTarget.patch | 11 - .../PathfinderGoalOwnerHurtTarget.patch | 11 - .../nms-patches/PathfinderGoalPanic.patch | 15 - .../nms-patches/PathfinderGoalSelector.patch | 30 - .../nms-patches/PathfinderGoalSit.patch | 11 - .../nms-patches/PathfinderGoalTame.patch | 31 - .../PathfinderGoalTargetNearestPlayer.patch | 11 - .../nms-patches/PlayerChunkMap.patch | 271 --- .../nms-patches/PlayerConnection.patch | 1540 ----------------- .../nms-patches/PlayerInteractManager.patch | 298 ---- .../nms-patches/PlayerInventory.patch | 100 -- .../nms-patches/PlayerList.patch | 875 ---------- .../nms-patches/PortalTravelAgent.patch | 262 --- .../nms-patches/PropertyManager.patch | 93 - .../nms-patches/RecipeArmorDye.patch | 18 - .../nms-patches/RecipeBookClone.patch | 17 - .../nms-patches/RecipeFireworks.patch | 20 - .../nms-patches/RecipeMapClone.patch | 17 - .../nms-patches/RecipeRepair.patch | 37 - .../nms-patches/RecipesBanner.patch | 34 - .../nms-patches/RecipesFurnace.patch | 56 - .../nms-patches/RegionFile.patch | 48 - .../RemoteControlCommandListener.patch | 15 - .../nms-patches/ScoreboardServer.patch | 126 -- .../nms-patches/SecondaryWorldServer.patch | 42 - .../nms-patches/ShapedRecipes.patch | 76 - .../nms-patches/ShapelessRecipes.patch | 35 - TacoSpigot-Server/nms-patches/Slot.patch | 12 - .../nms-patches/SlotFurnaceResult.patch | 32 - .../nms-patches/SpawnerCreature.patch | 108 -- .../nms-patches/StatisticManager.patch | 24 - .../nms-patches/TileEntity.patch | 25 - .../nms-patches/TileEntityBanner.patch | 26 - .../nms-patches/TileEntityBeacon.patch | 54 - .../nms-patches/TileEntityBrewingStand.patch | 94 - .../nms-patches/TileEntityChest.patch | 117 -- .../nms-patches/TileEntityCommand.patch | 12 - .../nms-patches/TileEntityDispenser.patch | 64 - .../nms-patches/TileEntityFurnace.patch | 188 -- .../nms-patches/TileEntityHopper.patch | 154 -- .../nms-patches/TileEntityNote.patch | 16 - .../nms-patches/TileEntityPiston.patch | 10 - .../nms-patches/TileEntitySign.patch | 55 - .../nms-patches/TileEntitySkull.patch | 13 - TacoSpigot-Server/nms-patches/UserCache.patch | 25 - TacoSpigot-Server/nms-patches/Village.patch | 11 - .../nms-patches/VillageSiege.patch | 11 - TacoSpigot-Server/nms-patches/World.patch | 654 ------- .../nms-patches/WorldBorder.patch | 39 - TacoSpigot-Server/nms-patches/WorldData.patch | 86 - .../nms-patches/WorldGenGroundBush.patch | 15 - .../WorldGenMegaTreeAbstract.patch | 11 - .../nms-patches/WorldGenRegistration.patch | 11 - .../nms-patches/WorldGenVillagePieces.patch | 11 - .../nms-patches/WorldManager.patch | 54 - TacoSpigot-Server/nms-patches/WorldMap.patch | 122 -- .../nms-patches/WorldNBTStorage.patch | 114 -- .../nms-patches/WorldServer.patch | 620 ------- TacoSpigot-Server/pom.xml | 26 +- .../elevatemc}/spigot/MonkeyFeature.java | 4 +- .../spigot/command/KnockbackCommand.java | 24 +- .../spigot/command/TicksPerSecondCommand.java | 119 ++ .../elevatemc/spigot/eSpigot.java} | 20 +- .../spigot/knockback/KnockbackHandler.java | 28 +- .../spigot/knockback/KnockbackModifier.java | 4 +- .../spigot/knockback/KnockbackProfile.java | 2 +- .../impl/AdvancedKnockbackProfile.java | 6 +- .../elevatemc/spigot/util/CryptException.java | 8 + .../com/elevatemc/spigot/util/DateUtil.java | 74 + .../com/elevatemc/spigot/util/FastRandom.java | 93 + .../spigot/util/SynchronizedIntHashMap.java | 2 +- .../elevatemc}/spigot/util/YamlConfig.java | 2 +- .../util/task/AbstractTaskExecutor.java | 2 +- .../elevatemc}/spigot/util/task/Task.java | 2 +- .../spigot/util/task/TaskExecutor.java | 2 +- .../util/task/impl/ThreadTaskExecutor.java | 6 +- .../spigot/command/TicksPerSecondCommand.java | 86 - .../minecraft/server/BaseBlockPosition.java | 6 +- .../net/minecraft/server/BlockBeacon.java | 89 + .../java/net/minecraft/server/BlockChest.java | 2 +- .../java/net/minecraft/server/BlockCrops.java | 2 +- .../minecraft/server/BlockDiodeAbstract.java | 3 +- .../net/minecraft/server/BlockFluids.java | 2 +- .../net/minecraft/server/BlockPiston.java | 44 +- .../net/minecraft/server/BlockPosition.java | 333 ++-- .../minecraft/server/BlockRedstoneTorch.java | 80 +- .../net/minecraft/server/BlockSnowBlock.java | 30 + .../net/minecraft/server/BlockStationary.java | 1 - .../java/net/minecraft/server/BlockStem.java | 2 +- .../main/java/net/minecraft/server/Chunk.java | 18 +- .../net/minecraft/server/DataWatcher.java | 249 +-- .../java/net/minecraft/server/Entity.java | 32 +- .../minecraft/server/EntityArmorStand.java | 5 + .../minecraft/server/EntityExperienceOrb.java | 2 +- .../minecraft/server/EntityFishingHook.java | 3 + .../net/minecraft/server/EntityHuman.java | 13 +- .../java/net/minecraft/server/EntityItem.java | 2 + .../net/minecraft/server/EntityLiving.java | 12 +- .../net/minecraft/server/EntityMonster.java | 11 +- .../net/minecraft/server/EntityPlayer.java | 7 +- .../net/minecraft/server/EntitySquid.java | 1 - .../net/minecraft/server/EntityTracker.java | 10 +- .../minecraft/server/EntityTrackerEntry.java | 8 +- .../net/minecraft/server/EntityZombie.java | 2 +- .../java/net/minecraft/server/Explosion.java | 4 +- .../net/minecraft/server/LoginListener.java | 93 +- .../net/minecraft/server/MinecraftServer.java | 34 +- .../net/minecraft/server/NBTTagCompound.java | 344 ++++ .../net/minecraft/server/NetworkManager.java | 51 +- .../net/minecraft/server/NibbleArray.java | 35 +- .../minecraft/server/PacketCompressor.java | 103 ++ .../minecraft/server/PacketDecompressor.java | 82 + .../net/minecraft/server/PacketDecrypter.java | 36 + .../net/minecraft/server/PacketEncrypter.java | 37 + .../server/PacketPlayOutUpdateTime.java | 41 + .../net/minecraft/server/PacketSplitter.java | 58 + .../server/PersistentCollection.java | 10 + .../minecraft/server/PlayerConnection.java | 4 +- .../java/net/minecraft/server/PlayerList.java | 4 +- .../minecraft/server/ServerConnection.java | 6 + .../java/net/minecraft/server/Village.java | 8 +- .../main/java/net/minecraft/server/World.java | 114 +- .../java/net/minecraft/server/WorldMap.java | 157 +- .../net/minecraft/server/WorldServer.java | 4 +- .../org/bukkit/craftbukkit/CraftChunk.java | 12 +- .../org/bukkit/craftbukkit/CraftServer.java | 2 +- .../craftbukkit/entity/CraftPlayer.java | 2 +- .../craftbukkit/inventory/CraftMetaSkull.java | 65 +- .../bukkit/craftbukkit/map/RenderData.java | 2 +- .../github/paperspigot/PaperSpigotConfig.java | 5 + pom.xml | 6 +- 336 files changed, 2111 insertions(+), 22750 deletions(-) delete mode 100644 TacoSpigot-Server/nms-patches/BiomeTheEndDecorator.patch delete mode 100644 TacoSpigot-Server/nms-patches/Block.patch delete mode 100644 TacoSpigot-Server/nms-patches/BlockBloodStone.patch delete mode 100644 TacoSpigot-Server/nms-patches/BlockButtonAbstract.patch delete mode 100644 TacoSpigot-Server/nms-patches/BlockCactus.patch delete mode 100644 TacoSpigot-Server/nms-patches/BlockCake.patch delete mode 100644 TacoSpigot-Server/nms-patches/BlockCocoa.patch delete mode 100644 TacoSpigot-Server/nms-patches/BlockCommand.patch delete mode 100644 TacoSpigot-Server/nms-patches/BlockCrops.patch delete mode 100644 TacoSpigot-Server/nms-patches/BlockDaylightDetector.patch delete mode 100644 TacoSpigot-Server/nms-patches/BlockDiodeAbstract.patch delete mode 100644 TacoSpigot-Server/nms-patches/BlockDispenser.patch delete mode 100644 TacoSpigot-Server/nms-patches/BlockDoor.patch delete mode 100644 TacoSpigot-Server/nms-patches/BlockDragonEgg.patch delete mode 100644 TacoSpigot-Server/nms-patches/BlockDropper.patch delete mode 100644 TacoSpigot-Server/nms-patches/BlockEnderPortal.patch delete mode 100644 TacoSpigot-Server/nms-patches/BlockFire.patch delete mode 100644 TacoSpigot-Server/nms-patches/BlockFlowing.patch delete mode 100644 TacoSpigot-Server/nms-patches/BlockGrass.patch delete mode 100644 TacoSpigot-Server/nms-patches/BlockIce.patch delete mode 100644 TacoSpigot-Server/nms-patches/BlockJukeBox.patch delete mode 100644 TacoSpigot-Server/nms-patches/BlockLeaves.patch delete mode 100644 TacoSpigot-Server/nms-patches/BlockLever.patch delete mode 100644 TacoSpigot-Server/nms-patches/BlockMinecartDetector.patch delete mode 100644 TacoSpigot-Server/nms-patches/BlockMinecartTrackAbstract.patch delete mode 100644 TacoSpigot-Server/nms-patches/BlockMobSpawner.patch delete mode 100644 TacoSpigot-Server/nms-patches/BlockMonsterEggs.patch delete mode 100644 TacoSpigot-Server/nms-patches/BlockMushroom.patch delete mode 100644 TacoSpigot-Server/nms-patches/BlockMycel.patch delete mode 100644 TacoSpigot-Server/nms-patches/BlockNetherWart.patch delete mode 100644 TacoSpigot-Server/nms-patches/BlockOre.patch delete mode 100644 TacoSpigot-Server/nms-patches/BlockPiston.patch delete mode 100644 TacoSpigot-Server/nms-patches/BlockPlant.patch delete mode 100644 TacoSpigot-Server/nms-patches/BlockPortal.patch delete mode 100644 TacoSpigot-Server/nms-patches/BlockPoweredRail.patch delete mode 100644 TacoSpigot-Server/nms-patches/BlockPressurePlateAbstract.patch delete mode 100644 TacoSpigot-Server/nms-patches/BlockPressurePlateBinary.patch delete mode 100644 TacoSpigot-Server/nms-patches/BlockPressurePlateWeighted.patch delete mode 100644 TacoSpigot-Server/nms-patches/BlockPumpkin.patch delete mode 100644 TacoSpigot-Server/nms-patches/BlockRedstoneLamp.patch delete mode 100644 TacoSpigot-Server/nms-patches/BlockRedstoneOre.patch delete mode 100644 TacoSpigot-Server/nms-patches/BlockRedstoneTorch.patch delete mode 100644 TacoSpigot-Server/nms-patches/BlockRedstoneWire.patch delete mode 100644 TacoSpigot-Server/nms-patches/BlockReed.patch delete mode 100644 TacoSpigot-Server/nms-patches/BlockSapling.patch delete mode 100644 TacoSpigot-Server/nms-patches/BlockSkull.patch delete mode 100644 TacoSpigot-Server/nms-patches/BlockSnow.patch delete mode 100644 TacoSpigot-Server/nms-patches/BlockSoil.patch delete mode 100644 TacoSpigot-Server/nms-patches/BlockStationary.patch delete mode 100644 TacoSpigot-Server/nms-patches/BlockStem.patch delete mode 100644 TacoSpigot-Server/nms-patches/BlockTrapdoor.patch delete mode 100644 TacoSpigot-Server/nms-patches/BlockTripwire.patch delete mode 100644 TacoSpigot-Server/nms-patches/BlockTripwireHook.patch delete mode 100644 TacoSpigot-Server/nms-patches/BlockVine.patch delete mode 100644 TacoSpigot-Server/nms-patches/ChatBaseComponent.patch delete mode 100644 TacoSpigot-Server/nms-patches/ChatModifier.patch delete mode 100644 TacoSpigot-Server/nms-patches/Chunk.patch delete mode 100644 TacoSpigot-Server/nms-patches/ChunkProviderServer.patch delete mode 100644 TacoSpigot-Server/nms-patches/ChunkRegionLoader.patch delete mode 100644 TacoSpigot-Server/nms-patches/ChunkSection.patch delete mode 100644 TacoSpigot-Server/nms-patches/CommandBlockListenerAbstract.patch delete mode 100644 TacoSpigot-Server/nms-patches/CommandExecute.patch delete mode 100644 TacoSpigot-Server/nms-patches/CommandGamemode.patch delete mode 100644 TacoSpigot-Server/nms-patches/CommandGamerule.patch delete mode 100644 TacoSpigot-Server/nms-patches/CommandSpreadPlayers.patch delete mode 100644 TacoSpigot-Server/nms-patches/CommandTp.patch delete mode 100644 TacoSpigot-Server/nms-patches/Container.patch delete mode 100644 TacoSpigot-Server/nms-patches/ContainerAnvil.patch delete mode 100644 TacoSpigot-Server/nms-patches/ContainerBeacon.patch delete mode 100644 TacoSpigot-Server/nms-patches/ContainerBrewingStand.patch delete mode 100644 TacoSpigot-Server/nms-patches/ContainerChest.patch delete mode 100644 TacoSpigot-Server/nms-patches/ContainerDispenser.patch delete mode 100644 TacoSpigot-Server/nms-patches/ContainerEnchantTable.patch delete mode 100644 TacoSpigot-Server/nms-patches/ContainerFurnace.patch delete mode 100644 TacoSpigot-Server/nms-patches/ContainerHopper.patch delete mode 100644 TacoSpigot-Server/nms-patches/ContainerHorse.patch delete mode 100644 TacoSpigot-Server/nms-patches/ContainerMerchant.patch delete mode 100644 TacoSpigot-Server/nms-patches/ContainerPlayer.patch delete mode 100644 TacoSpigot-Server/nms-patches/ContainerWorkbench.patch delete mode 100644 TacoSpigot-Server/nms-patches/CraftingManager.patch delete mode 100644 TacoSpigot-Server/nms-patches/CrashReport.patch delete mode 100644 TacoSpigot-Server/nms-patches/DedicatedServer.patch delete mode 100644 TacoSpigot-Server/nms-patches/DispenseBehaviorItem.patch delete mode 100644 TacoSpigot-Server/nms-patches/DispenseBehaviorProjectile.patch delete mode 100644 TacoSpigot-Server/nms-patches/DispenserRegistry.patch delete mode 100644 TacoSpigot-Server/nms-patches/Enchantment.patch delete mode 100644 TacoSpigot-Server/nms-patches/EnchantmentThorns.patch delete mode 100644 TacoSpigot-Server/nms-patches/Entity.patch delete mode 100644 TacoSpigot-Server/nms-patches/EntityAgeable.patch delete mode 100644 TacoSpigot-Server/nms-patches/EntityAnimal.patch delete mode 100644 TacoSpigot-Server/nms-patches/EntityArmorStand.patch delete mode 100644 TacoSpigot-Server/nms-patches/EntityArrow.patch delete mode 100644 TacoSpigot-Server/nms-patches/EntityBoat.patch delete mode 100644 TacoSpigot-Server/nms-patches/EntityChicken.patch delete mode 100644 TacoSpigot-Server/nms-patches/EntityCow.patch delete mode 100644 TacoSpigot-Server/nms-patches/EntityCreature.patch delete mode 100644 TacoSpigot-Server/nms-patches/EntityCreeper.patch delete mode 100644 TacoSpigot-Server/nms-patches/EntityDamageSourceIndirect.patch delete mode 100644 TacoSpigot-Server/nms-patches/EntityEgg.patch delete mode 100644 TacoSpigot-Server/nms-patches/EntityEnderCrystal.patch delete mode 100644 TacoSpigot-Server/nms-patches/EntityEnderDragon.patch delete mode 100644 TacoSpigot-Server/nms-patches/EntityEnderPearl.patch delete mode 100644 TacoSpigot-Server/nms-patches/EntityEnderman.patch delete mode 100644 TacoSpigot-Server/nms-patches/EntityExperienceOrb.patch delete mode 100644 TacoSpigot-Server/nms-patches/EntityFallingBlock.patch delete mode 100644 TacoSpigot-Server/nms-patches/EntityFireball.patch delete mode 100644 TacoSpigot-Server/nms-patches/EntityFireworks.patch delete mode 100644 TacoSpigot-Server/nms-patches/EntityFishingHook.patch delete mode 100644 TacoSpigot-Server/nms-patches/EntityGhast.patch delete mode 100644 TacoSpigot-Server/nms-patches/EntityHanging.patch delete mode 100644 TacoSpigot-Server/nms-patches/EntityHorse.patch delete mode 100644 TacoSpigot-Server/nms-patches/EntityHuman.patch delete mode 100644 TacoSpigot-Server/nms-patches/EntityInsentient.patch delete mode 100644 TacoSpigot-Server/nms-patches/EntityIronGolem.patch delete mode 100644 TacoSpigot-Server/nms-patches/EntityItem.patch delete mode 100644 TacoSpigot-Server/nms-patches/EntityItemFrame.patch delete mode 100644 TacoSpigot-Server/nms-patches/EntityLargeFireball.patch delete mode 100644 TacoSpigot-Server/nms-patches/EntityLeash.patch delete mode 100644 TacoSpigot-Server/nms-patches/EntityLightning.patch delete mode 100644 TacoSpigot-Server/nms-patches/EntityLiving.patch delete mode 100644 TacoSpigot-Server/nms-patches/EntityMinecartAbstract.patch delete mode 100644 TacoSpigot-Server/nms-patches/EntityMinecartCommandBlock.patch delete mode 100644 TacoSpigot-Server/nms-patches/EntityMinecartContainer.patch delete mode 100644 TacoSpigot-Server/nms-patches/EntityMonster.patch delete mode 100644 TacoSpigot-Server/nms-patches/EntityMushroomCow.patch delete mode 100644 TacoSpigot-Server/nms-patches/EntityOcelot.patch delete mode 100644 TacoSpigot-Server/nms-patches/EntityPainting.patch delete mode 100644 TacoSpigot-Server/nms-patches/EntityPig.patch delete mode 100644 TacoSpigot-Server/nms-patches/EntityPlayer.patch delete mode 100644 TacoSpigot-Server/nms-patches/EntityPotion.patch delete mode 100644 TacoSpigot-Server/nms-patches/EntityProjectile.patch delete mode 100644 TacoSpigot-Server/nms-patches/EntityRabbit.patch delete mode 100644 TacoSpigot-Server/nms-patches/EntitySheep.patch delete mode 100644 TacoSpigot-Server/nms-patches/EntitySilverfish.patch delete mode 100644 TacoSpigot-Server/nms-patches/EntitySkeleton.patch delete mode 100644 TacoSpigot-Server/nms-patches/EntitySlice.patch delete mode 100644 TacoSpigot-Server/nms-patches/EntitySlime.patch delete mode 100644 TacoSpigot-Server/nms-patches/EntitySmallFireball.patch delete mode 100644 TacoSpigot-Server/nms-patches/EntitySnowman.patch delete mode 100644 TacoSpigot-Server/nms-patches/EntitySpider.patch delete mode 100644 TacoSpigot-Server/nms-patches/EntitySquid.patch delete mode 100644 TacoSpigot-Server/nms-patches/EntityTNTPrimed.patch delete mode 100644 TacoSpigot-Server/nms-patches/EntityThrownExpBottle.patch delete mode 100644 TacoSpigot-Server/nms-patches/EntityTracker.patch delete mode 100644 TacoSpigot-Server/nms-patches/EntityTrackerEntry.patch delete mode 100644 TacoSpigot-Server/nms-patches/EntityVillager.patch delete mode 100644 TacoSpigot-Server/nms-patches/EntityWither.patch delete mode 100644 TacoSpigot-Server/nms-patches/EntityWitherSkull.patch delete mode 100644 TacoSpigot-Server/nms-patches/EntityWolf.patch delete mode 100644 TacoSpigot-Server/nms-patches/EntityZombie.patch delete mode 100644 TacoSpigot-Server/nms-patches/ExpirableListEntry.patch delete mode 100644 TacoSpigot-Server/nms-patches/Explosion.patch delete mode 100644 TacoSpigot-Server/nms-patches/FoodMetaData.patch delete mode 100644 TacoSpigot-Server/nms-patches/HandshakeListener.patch delete mode 100644 TacoSpigot-Server/nms-patches/IDataManager.patch delete mode 100644 TacoSpigot-Server/nms-patches/IInventory.patch delete mode 100644 TacoSpigot-Server/nms-patches/IRecipe.patch delete mode 100644 TacoSpigot-Server/nms-patches/InventoryCraftResult.patch delete mode 100644 TacoSpigot-Server/nms-patches/InventoryCrafting.patch delete mode 100644 TacoSpigot-Server/nms-patches/InventoryEnderChest.patch delete mode 100644 TacoSpigot-Server/nms-patches/InventoryHorseChest.patch delete mode 100644 TacoSpigot-Server/nms-patches/InventoryLargeChest.patch delete mode 100644 TacoSpigot-Server/nms-patches/InventoryMerchant.patch delete mode 100644 TacoSpigot-Server/nms-patches/InventorySubcontainer.patch delete mode 100644 TacoSpigot-Server/nms-patches/ItemArmor.patch delete mode 100644 TacoSpigot-Server/nms-patches/ItemBoat.patch delete mode 100644 TacoSpigot-Server/nms-patches/ItemBow.patch delete mode 100644 TacoSpigot-Server/nms-patches/ItemBucket.patch delete mode 100644 TacoSpigot-Server/nms-patches/ItemDye.patch delete mode 100644 TacoSpigot-Server/nms-patches/ItemFireball.patch delete mode 100644 TacoSpigot-Server/nms-patches/ItemFishingRod.patch delete mode 100644 TacoSpigot-Server/nms-patches/ItemFlintAndSteel.patch delete mode 100644 TacoSpigot-Server/nms-patches/ItemHanging.patch delete mode 100644 TacoSpigot-Server/nms-patches/ItemLeash.patch delete mode 100644 TacoSpigot-Server/nms-patches/ItemMapEmpty.patch delete mode 100644 TacoSpigot-Server/nms-patches/ItemMinecart.patch delete mode 100644 TacoSpigot-Server/nms-patches/ItemMonsterEgg.patch delete mode 100644 TacoSpigot-Server/nms-patches/ItemRecord.patch delete mode 100644 TacoSpigot-Server/nms-patches/ItemStack.patch delete mode 100644 TacoSpigot-Server/nms-patches/ItemWaterLily.patch delete mode 100644 TacoSpigot-Server/nms-patches/ItemWorldMap.patch delete mode 100644 TacoSpigot-Server/nms-patches/JsonList.patch delete mode 100644 TacoSpigot-Server/nms-patches/LoginListener.patch delete mode 100644 TacoSpigot-Server/nms-patches/MethodProfiler.patch delete mode 100644 TacoSpigot-Server/nms-patches/MinecraftServer.patch delete mode 100644 TacoSpigot-Server/nms-patches/MobEffectList.patch delete mode 100644 TacoSpigot-Server/nms-patches/MobSpawnerAbstract.patch delete mode 100644 TacoSpigot-Server/nms-patches/NBTTagList.patch delete mode 100644 TacoSpigot-Server/nms-patches/NameReferencingFileConverter.patch delete mode 100644 TacoSpigot-Server/nms-patches/NetworkManager.patch delete mode 100644 TacoSpigot-Server/nms-patches/PacketDataSerializer.patch delete mode 100644 TacoSpigot-Server/nms-patches/PacketPlayInBlockPlace.patch delete mode 100644 TacoSpigot-Server/nms-patches/PacketPlayInCloseWindow.patch delete mode 100644 TacoSpigot-Server/nms-patches/PacketPlayInResourcePackStatus.patch delete mode 100644 TacoSpigot-Server/nms-patches/PacketStatusListener.patch delete mode 100644 TacoSpigot-Server/nms-patches/Path.patch delete mode 100644 TacoSpigot-Server/nms-patches/PathfinderGoalBreakDoor.patch delete mode 100644 TacoSpigot-Server/nms-patches/PathfinderGoalBreed.patch delete mode 100644 TacoSpigot-Server/nms-patches/PathfinderGoalDefendVillage.patch delete mode 100644 TacoSpigot-Server/nms-patches/PathfinderGoalEatTile.patch delete mode 100644 TacoSpigot-Server/nms-patches/PathfinderGoalHurtByTarget.patch delete mode 100644 TacoSpigot-Server/nms-patches/PathfinderGoalMakeLove.patch delete mode 100644 TacoSpigot-Server/nms-patches/PathfinderGoalNearestAttackableTarget.patch delete mode 100644 TacoSpigot-Server/nms-patches/PathfinderGoalNearestAttackableTargetInsentient.patch delete mode 100644 TacoSpigot-Server/nms-patches/PathfinderGoalOwnerHurtByTarget.patch delete mode 100644 TacoSpigot-Server/nms-patches/PathfinderGoalOwnerHurtTarget.patch delete mode 100644 TacoSpigot-Server/nms-patches/PathfinderGoalPanic.patch delete mode 100644 TacoSpigot-Server/nms-patches/PathfinderGoalSelector.patch delete mode 100644 TacoSpigot-Server/nms-patches/PathfinderGoalSit.patch delete mode 100644 TacoSpigot-Server/nms-patches/PathfinderGoalTame.patch delete mode 100644 TacoSpigot-Server/nms-patches/PathfinderGoalTargetNearestPlayer.patch delete mode 100644 TacoSpigot-Server/nms-patches/PlayerChunkMap.patch delete mode 100644 TacoSpigot-Server/nms-patches/PlayerConnection.patch delete mode 100644 TacoSpigot-Server/nms-patches/PlayerInteractManager.patch delete mode 100644 TacoSpigot-Server/nms-patches/PlayerInventory.patch delete mode 100644 TacoSpigot-Server/nms-patches/PlayerList.patch delete mode 100644 TacoSpigot-Server/nms-patches/PortalTravelAgent.patch delete mode 100644 TacoSpigot-Server/nms-patches/PropertyManager.patch delete mode 100644 TacoSpigot-Server/nms-patches/RecipeArmorDye.patch delete mode 100644 TacoSpigot-Server/nms-patches/RecipeBookClone.patch delete mode 100644 TacoSpigot-Server/nms-patches/RecipeFireworks.patch delete mode 100644 TacoSpigot-Server/nms-patches/RecipeMapClone.patch delete mode 100644 TacoSpigot-Server/nms-patches/RecipeRepair.patch delete mode 100644 TacoSpigot-Server/nms-patches/RecipesBanner.patch delete mode 100644 TacoSpigot-Server/nms-patches/RecipesFurnace.patch delete mode 100644 TacoSpigot-Server/nms-patches/RegionFile.patch delete mode 100644 TacoSpigot-Server/nms-patches/RemoteControlCommandListener.patch delete mode 100644 TacoSpigot-Server/nms-patches/ScoreboardServer.patch delete mode 100644 TacoSpigot-Server/nms-patches/SecondaryWorldServer.patch delete mode 100644 TacoSpigot-Server/nms-patches/ShapedRecipes.patch delete mode 100644 TacoSpigot-Server/nms-patches/ShapelessRecipes.patch delete mode 100644 TacoSpigot-Server/nms-patches/Slot.patch delete mode 100644 TacoSpigot-Server/nms-patches/SlotFurnaceResult.patch delete mode 100644 TacoSpigot-Server/nms-patches/SpawnerCreature.patch delete mode 100644 TacoSpigot-Server/nms-patches/StatisticManager.patch delete mode 100644 TacoSpigot-Server/nms-patches/TileEntity.patch delete mode 100644 TacoSpigot-Server/nms-patches/TileEntityBanner.patch delete mode 100644 TacoSpigot-Server/nms-patches/TileEntityBeacon.patch delete mode 100644 TacoSpigot-Server/nms-patches/TileEntityBrewingStand.patch delete mode 100644 TacoSpigot-Server/nms-patches/TileEntityChest.patch delete mode 100644 TacoSpigot-Server/nms-patches/TileEntityCommand.patch delete mode 100644 TacoSpigot-Server/nms-patches/TileEntityDispenser.patch delete mode 100644 TacoSpigot-Server/nms-patches/TileEntityFurnace.patch delete mode 100644 TacoSpigot-Server/nms-patches/TileEntityHopper.patch delete mode 100644 TacoSpigot-Server/nms-patches/TileEntityNote.patch delete mode 100644 TacoSpigot-Server/nms-patches/TileEntityPiston.patch delete mode 100644 TacoSpigot-Server/nms-patches/TileEntitySign.patch delete mode 100644 TacoSpigot-Server/nms-patches/TileEntitySkull.patch delete mode 100644 TacoSpigot-Server/nms-patches/UserCache.patch delete mode 100644 TacoSpigot-Server/nms-patches/Village.patch delete mode 100644 TacoSpigot-Server/nms-patches/VillageSiege.patch delete mode 100644 TacoSpigot-Server/nms-patches/World.patch delete mode 100644 TacoSpigot-Server/nms-patches/WorldBorder.patch delete mode 100644 TacoSpigot-Server/nms-patches/WorldData.patch delete mode 100644 TacoSpigot-Server/nms-patches/WorldGenGroundBush.patch delete mode 100644 TacoSpigot-Server/nms-patches/WorldGenMegaTreeAbstract.patch delete mode 100644 TacoSpigot-Server/nms-patches/WorldGenRegistration.patch delete mode 100644 TacoSpigot-Server/nms-patches/WorldGenVillagePieces.patch delete mode 100644 TacoSpigot-Server/nms-patches/WorldManager.patch delete mode 100644 TacoSpigot-Server/nms-patches/WorldMap.patch delete mode 100644 TacoSpigot-Server/nms-patches/WorldNBTStorage.patch delete mode 100644 TacoSpigot-Server/nms-patches/WorldServer.patch rename TacoSpigot-Server/src/main/java/{monkey/sindre => com/elevatemc}/spigot/MonkeyFeature.java (92%) rename TacoSpigot-Server/src/main/java/{monkey/sindre => com/elevatemc}/spigot/command/KnockbackCommand.java (96%) create mode 100644 TacoSpigot-Server/src/main/java/com/elevatemc/spigot/command/TicksPerSecondCommand.java rename TacoSpigot-Server/src/main/java/{monkey/sindre/spigot/MonkeySpigot.java => com/elevatemc/spigot/eSpigot.java} (74%) rename TacoSpigot-Server/src/main/java/{monkey/sindre => com/elevatemc}/spigot/knockback/KnockbackHandler.java (80%) rename TacoSpigot-Server/src/main/java/{monkey/sindre => com/elevatemc}/spigot/knockback/KnockbackModifier.java (94%) rename TacoSpigot-Server/src/main/java/{monkey/sindre => com/elevatemc}/spigot/knockback/KnockbackProfile.java (98%) rename TacoSpigot-Server/src/main/java/{monkey/sindre => com/elevatemc}/spigot/knockback/impl/AdvancedKnockbackProfile.java (97%) create mode 100644 TacoSpigot-Server/src/main/java/com/elevatemc/spigot/util/CryptException.java create mode 100644 TacoSpigot-Server/src/main/java/com/elevatemc/spigot/util/DateUtil.java create mode 100644 TacoSpigot-Server/src/main/java/com/elevatemc/spigot/util/FastRandom.java rename TacoSpigot-Server/src/main/java/{monkey/sindre => com/elevatemc}/spigot/util/SynchronizedIntHashMap.java (95%) rename TacoSpigot-Server/src/main/java/{monkey/sindre => com/elevatemc}/spigot/util/YamlConfig.java (98%) rename TacoSpigot-Server/src/main/java/{monkey/sindre => com/elevatemc}/spigot/util/task/AbstractTaskExecutor.java (96%) rename TacoSpigot-Server/src/main/java/{monkey/sindre => com/elevatemc}/spigot/util/task/Task.java (63%) rename TacoSpigot-Server/src/main/java/{monkey/sindre => com/elevatemc}/spigot/util/task/TaskExecutor.java (86%) rename TacoSpigot-Server/src/main/java/{monkey/sindre => com/elevatemc}/spigot/util/task/impl/ThreadTaskExecutor.java (88%) delete mode 100644 TacoSpigot-Server/src/main/java/monkey/sindre/spigot/command/TicksPerSecondCommand.java create mode 100644 TacoSpigot-Server/src/main/java/net/minecraft/server/BlockBeacon.java create mode 100644 TacoSpigot-Server/src/main/java/net/minecraft/server/BlockSnowBlock.java create mode 100644 TacoSpigot-Server/src/main/java/net/minecraft/server/NBTTagCompound.java create mode 100644 TacoSpigot-Server/src/main/java/net/minecraft/server/PacketCompressor.java create mode 100644 TacoSpigot-Server/src/main/java/net/minecraft/server/PacketDecompressor.java create mode 100644 TacoSpigot-Server/src/main/java/net/minecraft/server/PacketDecrypter.java create mode 100644 TacoSpigot-Server/src/main/java/net/minecraft/server/PacketEncrypter.java create mode 100644 TacoSpigot-Server/src/main/java/net/minecraft/server/PacketPlayOutUpdateTime.java create mode 100644 TacoSpigot-Server/src/main/java/net/minecraft/server/PacketSplitter.java diff --git a/TacoSpigot-API/src/main/java/org/bukkit/command/defaults/VersionCommand.java b/TacoSpigot-API/src/main/java/org/bukkit/command/defaults/VersionCommand.java index 42da60a..4cd4a09 100644 --- a/TacoSpigot-API/src/main/java/org/bukkit/command/defaults/VersionCommand.java +++ b/TacoSpigot-API/src/main/java/org/bukkit/command/defaults/VersionCommand.java @@ -1,6 +1,5 @@ package org.bukkit.command.defaults; -import com.google.common.base.Charsets; import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -14,24 +13,6 @@ import org.bukkit.plugin.PluginDescriptionFile; import org.bukkit.util.StringUtil; import com.google.common.collect.ImmutableList; -import com.google.common.io.Resources; -import java.io.BufferedReader; -import java.io.IOException; -import java.net.URL; -import java.net.URLEncoder; -import java.util.HashSet; -import java.util.Set; -import java.util.concurrent.locks.ReentrantLock; -import java.util.logging.Level; -import java.util.logging.Logger; -import org.json.simple.JSONObject; -import org.json.simple.parser.JSONParser; -import org.json.simple.parser.ParseException; - -// TacoSpigot start -import java.io.InputStreamReader; -import java.net.HttpURLConnection; -// TacoSpigot end public class VersionCommand extends BukkitCommand { public VersionCommand(String name) { @@ -45,11 +26,16 @@ public class VersionCommand extends BukkitCommand { @Override public boolean execute(CommandSender sender, String currentAlias, String[] args) { - if (!testPermission(sender)) return true; + if (!testPermission(sender)) { + return true; + } if (args.length == 0) { - sender.sendMessage("This server is running " + Bukkit.getName() + " version " + Bukkit.getVersion() + " (Implementing API version " + Bukkit.getBukkitVersion() + ")"); - sendVersion(sender); + String[] message = new String[] { + "§3This server is running §b§leSpigot§3 by the ElevateMC development team. Version §b§l1.8.8", + }; + + sender.sendMessage(message);; } else { StringBuilder name = new StringBuilder(); @@ -87,21 +73,21 @@ public class VersionCommand extends BukkitCommand { private void describeToSender(Plugin plugin, CommandSender sender) { PluginDescriptionFile desc = plugin.getDescription(); - sender.sendMessage(ChatColor.GREEN + desc.getName() + ChatColor.WHITE + " version " + ChatColor.GREEN + desc.getVersion()); + sender.sendMessage(ChatColor.AQUA + desc.getName() + ChatColor.DARK_AQUA + " version " + ChatColor.AQUA + desc.getVersion()); if (desc.getDescription() != null) { sender.sendMessage(desc.getDescription()); } if (desc.getWebsite() != null) { - sender.sendMessage("Website: " + ChatColor.GREEN + desc.getWebsite()); + sender.sendMessage(ChatColor.DARK_AQUA + "Website: " + ChatColor.AQUA + desc.getWebsite()); } if (!desc.getAuthors().isEmpty()) { if (desc.getAuthors().size() == 1) { - sender.sendMessage("Author: " + getAuthors(desc)); + sender.sendMessage(ChatColor.DARK_AQUA + "Author: " + getAuthors(desc)); } else { - sender.sendMessage("Authors: " + getAuthors(desc)); + sender.sendMessage(ChatColor.DARK_AQUA + "Authors: " + getAuthors(desc)); } } } @@ -112,7 +98,7 @@ public class VersionCommand extends BukkitCommand { for (int i = 0; i < authors.size(); i++) { if (result.length() > 0) { - result.append(ChatColor.WHITE); + result.append(ChatColor.AQUA); if (i < authors.size() - 1) { result.append(", "); @@ -121,7 +107,7 @@ public class VersionCommand extends BukkitCommand { } } - result.append(ChatColor.GREEN); + result.append(ChatColor.AQUA); result.append(authors.get(i)); } @@ -147,182 +133,4 @@ public class VersionCommand extends BukkitCommand { return ImmutableList.of(); } - private final ReentrantLock versionLock = new ReentrantLock(); - private boolean hasVersion = false; - private String versionMessage = null; - private final Set versionWaiters = new HashSet(); - private boolean versionTaskStarted = false; - private long lastCheck = 0; - - private void sendVersion(CommandSender sender) { - if (hasVersion) { - if (System.currentTimeMillis() - lastCheck > 21600000) { - lastCheck = System.currentTimeMillis(); - hasVersion = false; - } else { - sender.sendMessage(versionMessage); - return; - } - } - versionLock.lock(); - try { - if (hasVersion) { - sender.sendMessage(versionMessage); - return; - } - versionWaiters.add(sender); - sender.sendMessage("Checking version, please wait..."); - if (!versionTaskStarted) { - versionTaskStarted = true; - new Thread(new Runnable() { - - @Override - public void run() { - obtainVersion(); - } - }).start(); - } - } finally { - versionLock.unlock(); - } - } - - private void obtainVersion() { - String version = Bukkit.getVersion(); - if (version == null) version = "Custom"; - // TacoSpigot start - if (version.startsWith("git-TacoSpigot-")) { - String[] parts = version.substring("git-Tacospigot-".length()).split("[-\\s]"); - int distance = getDistance("TacoSpigot/TacoSpigot", parts[0]); - switch (distance) { - case -1: - setVersionMessage("Error obtaining version information"); - break; - case 0: - setVersionMessage("You are running the latest version"); - break; - case -2: - setVersionMessage("Unknown version"); - break; - default: - setVersionMessage("You are " + distance + " version(s) behind"); - } - // remove checking for other forks - /* - // PaperSpigot start - if (version.startsWith("git-PaperSpigot-")) { - String[] parts = version.substring("git-PaperSpigot-".length()).split("[-\\s]"); - int paperSpigotVersions = getDistance("paperspigot", parts[0]); - if (paperSpigotVersions == -1) { - setVersionMessage("Error obtaining version information"); - } else { - if (paperSpigotVersions == 0) { - setVersionMessage("You are running the latest version"); - } else { - setVersionMessage("You are " + paperSpigotVersions + " version(s) behind"); - } - } - } else if (version.startsWith("git-Spigot-")) { - // PaperSpigot end - String[] parts = version.substring("git-Spigot-".length()).split("-"); - int cbVersions = getDistance("craftbukkit", parts[1].substring(0, parts[1].indexOf(' '))); - int spigotVersions = getDistance("spigot", parts[0]); - if (cbVersions == -1 || spigotVersions == -1) { - setVersionMessage("Error obtaining version information"); - } else { - if (cbVersions == 0 && spigotVersions == 0) { - setVersionMessage("You are running the latest version"); - } else { - setVersionMessage("You are " + (cbVersions + spigotVersions) + " version(s) behind"); - } - } - - } else if (version.startsWith("git-Bukkit-")) { - version = version.substring("git-Bukkit-".length()); - int cbVersions = getDistance("craftbukkit", version.substring(0, version.indexOf(' '))); - if (cbVersions == -1) { - setVersionMessage("Error obtaining version information"); - } else { - if (cbVersions == 0) { - setVersionMessage("You are running the latest version"); - } else { - setVersionMessage("You are " + cbVersions + " version(s) behind"); - } - } - */ - // TacoSpigot end - } else { - setVersionMessage("Unknown version, custom build?"); - } - } - - private void setVersionMessage(String msg) { - lastCheck = System.currentTimeMillis(); - versionMessage = msg; - versionLock.lock(); - try { - hasVersion = true; - versionTaskStarted = false; - for (CommandSender sender : versionWaiters) { - sender.sendMessage(versionMessage); - } - versionWaiters.clear(); - } finally { - versionLock.unlock(); - } - } - - private static int getDistance(String repo, String currentVerInt) { // PaperSpigot - // TacoSpigot start - currentVerInt = currentVerInt.replace("\"", ""); - return getFromRepo(repo, currentVerInt); - } - - private static final String BRANCH = "version/1.8.8"; - private static int getFromRepo(String repo, String hash) { - try { - /* - BufferedReader reader = Resources.asCharSource( - new URL("https://ci.destroystokyo.com/job/PaperSpigot/lastSuccessfulBuild/buildNumber"), // PaperSpigot - Charsets.UTF_8 - ).openBufferedStream(); - try { - // PaperSpigot start - int newVer = Integer.decode(reader.readLine()); - int currentVer = Integer.decode(currentVerInt); - return newVer - currentVer; - } catch (NumberFormatException ex) { - //ex.printStackTrace(); - // PaperSpigot end - return -1; - } finally { - reader.close(); - } - */ - HttpURLConnection connection = (HttpURLConnection) new URL("https://api.github.com/repos/" + repo + "/compare/" + BRANCH + "..." + hash).openConnection(); - connection.connect(); - if (connection.getResponseCode() == HttpURLConnection.HTTP_NOT_FOUND) return -2; // Unknown commit - try ( - BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream(), Charsets.UTF_8)) - ) { - JSONObject obj = (JSONObject) new JSONParser().parse(reader); - String status = (String) obj.get("status"); - switch (status) { - case "identical": - return 0; - case "behind": - return ((Number) obj.get("behind_by")).intValue(); - default: - return -2; - } - } catch (ParseException | NumberFormatException e) { - e.printStackTrace(); - return -1; - } - // TacoSpigot end - } catch (IOException e) { - e.printStackTrace(); - return -1; - } - } -} +} \ No newline at end of file diff --git a/TacoSpigot-Server/nms-patches/BiomeTheEndDecorator.patch b/TacoSpigot-Server/nms-patches/BiomeTheEndDecorator.patch deleted file mode 100644 index 77ae887..0000000 --- a/TacoSpigot-Server/nms-patches/BiomeTheEndDecorator.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- a/net/minecraft/server/BiomeTheEndDecorator.java -+++ b/net/minecraft/server/BiomeTheEndDecorator.java -@@ -21,7 +21,7 @@ - EntityEnderDragon entityenderdragon = new EntityEnderDragon(this.a); - - entityenderdragon.setPositionRotation(0.0D, 128.0D, 0.0D, this.b.nextFloat() * 360.0F, 0.0F); -- this.a.addEntity(entityenderdragon); -+ this.a.addEntity(entityenderdragon, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.CHUNK_GEN); // CraftBukkit - add SpawnReason - } - - } diff --git a/TacoSpigot-Server/nms-patches/Block.patch b/TacoSpigot-Server/nms-patches/Block.patch deleted file mode 100644 index 360a2c0..0000000 --- a/TacoSpigot-Server/nms-patches/Block.patch +++ /dev/null @@ -1,23 +0,0 @@ ---- a/net/minecraft/server/Block.java -+++ b/net/minecraft/server/Block.java -@@ -336,7 +336,8 @@ - int j = this.getDropCount(i, world.random); - - for (int k = 0; k < j; ++k) { -- if (world.random.nextFloat() <= f) { -+ // CraftBukkit - <= to < to allow for plugins to completely disable block drops from explosions -+ if (world.random.nextFloat() < f) { - Item item = this.getDropType(iblockdata, world.random, i); - - if (item != null) { -@@ -1002,4 +1003,10 @@ - return this.getBreakSound(); - } - } -+ -+ // CraftBukkit start -+ public int getExpDrop(World world, IBlockData data, int enchantmentLevel) { -+ return 0; -+ } -+ // CraftBukkit end - } diff --git a/TacoSpigot-Server/nms-patches/BlockBloodStone.patch b/TacoSpigot-Server/nms-patches/BlockBloodStone.patch deleted file mode 100644 index 250ed8a..0000000 --- a/TacoSpigot-Server/nms-patches/BlockBloodStone.patch +++ /dev/null @@ -1,28 +0,0 @@ ---- a/net/minecraft/server/BlockBloodStone.java -+++ b/net/minecraft/server/BlockBloodStone.java -@@ -1,5 +1,7 @@ - package net.minecraft.server; - -+import org.bukkit.event.block.BlockRedstoneEvent; // CraftBukkit -+ - public class BlockBloodStone extends Block { - - public BlockBloodStone() { -@@ -10,4 +12,17 @@ - public MaterialMapColor g(IBlockData iblockdata) { - return MaterialMapColor.K; - } -+ -+ // CraftBukkit start -+ @Override -+ public void doPhysics(World world, BlockPosition position, IBlockData iblockdata, Block block) { -+ if (block != null && block.isPowerSource()) { -+ org.bukkit.block.Block bl = world.getWorld().getBlockAt(position.getX(), position.getY(), position.getZ()); -+ int power = bl.getBlockPower(); -+ -+ BlockRedstoneEvent event = new BlockRedstoneEvent(bl, power, power); -+ world.getServer().getPluginManager().callEvent(event); -+ } -+ } -+ // CraftBukkit end - } diff --git a/TacoSpigot-Server/nms-patches/BlockButtonAbstract.patch b/TacoSpigot-Server/nms-patches/BlockButtonAbstract.patch deleted file mode 100644 index 408baab..0000000 --- a/TacoSpigot-Server/nms-patches/BlockButtonAbstract.patch +++ /dev/null @@ -1,110 +0,0 @@ ---- a/net/minecraft/server/BlockButtonAbstract.java -+++ b/net/minecraft/server/BlockButtonAbstract.java -@@ -3,6 +3,11 @@ - import java.util.List; - import java.util.Random; - -+// CraftBukkit start -+import org.bukkit.event.block.BlockRedstoneEvent; -+import org.bukkit.event.entity.EntityInteractEvent; -+// CraftBukkit end -+ - public abstract class BlockButtonAbstract extends Block { - - public static final BlockStateDirection FACING = BlockStateDirection.of("facing"); -@@ -124,6 +129,19 @@ - if (((Boolean) iblockdata.get(BlockButtonAbstract.POWERED)).booleanValue()) { - return true; - } else { -+ // CraftBukkit start -+ boolean powered = ((Boolean) iblockdata.get(POWERED)); -+ org.bukkit.block.Block block = world.getWorld().getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ()); -+ int old = (powered) ? 15 : 0; -+ int current = (!powered) ? 15 : 0; -+ -+ BlockRedstoneEvent eventRedstone = new BlockRedstoneEvent(block, old, current); -+ world.getServer().getPluginManager().callEvent(eventRedstone); -+ -+ if ((eventRedstone.getNewCurrent() > 0) != (!powered)) { -+ return true; -+ } -+ // CraftBukkit end - world.setTypeAndData(blockposition, iblockdata.set(BlockButtonAbstract.POWERED, Boolean.valueOf(true)), 3); - world.b(blockposition, blockposition); - world.makeSound((double) blockposition.getX() + 0.5D, (double) blockposition.getY() + 0.5D, (double) blockposition.getZ() + 0.5D, "random.click", 0.3F, 0.6F); -@@ -161,6 +179,16 @@ - if (this.N) { - this.f(world, blockposition, iblockdata); - } else { -+ // CraftBukkit start -+ org.bukkit.block.Block block = world.getWorld().getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ()); -+ -+ BlockRedstoneEvent eventRedstone = new BlockRedstoneEvent(block, 15, 0); -+ world.getServer().getPluginManager().callEvent(eventRedstone); -+ -+ if (eventRedstone.getNewCurrent() > 0) { -+ return; -+ } -+ // CraftBukkit end - world.setTypeUpdate(blockposition, iblockdata.set(BlockButtonAbstract.POWERED, Boolean.valueOf(false))); - this.c(world, blockposition, (EnumDirection) iblockdata.get(BlockButtonAbstract.FACING)); - world.makeSound((double) blockposition.getX() + 0.5D, (double) blockposition.getY() + 0.5D, (double) blockposition.getZ() + 0.5D, "random.click", 0.3F, 0.5F); -@@ -195,7 +223,41 @@ - boolean flag = !list.isEmpty(); - boolean flag1 = ((Boolean) iblockdata.get(BlockButtonAbstract.POWERED)).booleanValue(); - -+ // CraftBukkit start - Call interact event when arrows turn on wooden buttons -+ if (flag1 != flag && flag) { -+ org.bukkit.block.Block block = world.getWorld().getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ()); -+ boolean allowed = false; -+ -+ // If all of the events are cancelled block the button press, else allow -+ for (Object object : list) { -+ if (object != null) { -+ EntityInteractEvent event = new EntityInteractEvent(((Entity) object).getBukkitEntity(), block); -+ world.getServer().getPluginManager().callEvent(event); -+ -+ if (!event.isCancelled()) { -+ allowed = true; -+ break; -+ } -+ } -+ } -+ -+ if (!allowed) { -+ return; -+ } -+ } -+ // CraftBukkit end -+ - if (flag && !flag1) { -+ // CraftBukkit start -+ org.bukkit.block.Block block = world.getWorld().getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ()); -+ -+ BlockRedstoneEvent eventRedstone = new BlockRedstoneEvent(block, 0, 15); -+ world.getServer().getPluginManager().callEvent(eventRedstone); -+ -+ if (eventRedstone.getNewCurrent() <= 0) { -+ return; -+ } -+ // CraftBukkit end - world.setTypeUpdate(blockposition, iblockdata.set(BlockButtonAbstract.POWERED, Boolean.valueOf(true))); - this.c(world, blockposition, (EnumDirection) iblockdata.get(BlockButtonAbstract.FACING)); - world.b(blockposition, blockposition); -@@ -203,6 +265,16 @@ - } - - if (!flag && flag1) { -+ // CraftBukkit start -+ org.bukkit.block.Block block = world.getWorld().getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ()); -+ -+ BlockRedstoneEvent eventRedstone = new BlockRedstoneEvent(block, 15, 0); -+ world.getServer().getPluginManager().callEvent(eventRedstone); -+ -+ if (eventRedstone.getNewCurrent() > 0) { -+ return; -+ } -+ // CraftBukkit end - world.setTypeUpdate(blockposition, iblockdata.set(BlockButtonAbstract.POWERED, Boolean.valueOf(false))); - this.c(world, blockposition, (EnumDirection) iblockdata.get(BlockButtonAbstract.FACING)); - world.b(blockposition, blockposition); diff --git a/TacoSpigot-Server/nms-patches/BlockCactus.patch b/TacoSpigot-Server/nms-patches/BlockCactus.patch deleted file mode 100644 index b8b99b8..0000000 --- a/TacoSpigot-Server/nms-patches/BlockCactus.patch +++ /dev/null @@ -1,33 +0,0 @@ ---- a/net/minecraft/server/BlockCactus.java -+++ b/net/minecraft/server/BlockCactus.java -@@ -3,6 +3,8 @@ - import java.util.Iterator; - import java.util.Random; - -+import org.bukkit.craftbukkit.event.CraftEventFactory; // CraftBukkit -+ - public class BlockCactus extends Block { - - public static final BlockStateInteger AGE = BlockStateInteger.of("age", 0, 15); -@@ -28,9 +30,10 @@ - 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)); - -+ CraftEventFactory.handleBlockGrowEvent(world, blockposition1.getX(), blockposition1.getY(), blockposition1.getZ(), this, 0); // CraftBukkit - world.setTypeAndData(blockposition, iblockdata1, 4); - this.doPhysics(world, blockposition1, iblockdata1, this); - } else { -@@ -83,7 +86,9 @@ - } - - public void a(World world, BlockPosition blockposition, IBlockData iblockdata, Entity entity) { -+ CraftEventFactory.blockDamage = world.getWorld().getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ()); // CraftBukkit - entity.damageEntity(DamageSource.CACTUS, 1.0F); -+ CraftEventFactory.blockDamage = null; // CraftBukkit - } - - public IBlockData fromLegacyData(int i) { diff --git a/TacoSpigot-Server/nms-patches/BlockCake.patch b/TacoSpigot-Server/nms-patches/BlockCake.patch deleted file mode 100644 index 5545918..0000000 --- a/TacoSpigot-Server/nms-patches/BlockCake.patch +++ /dev/null @@ -1,22 +0,0 @@ ---- a/net/minecraft/server/BlockCake.java -+++ b/net/minecraft/server/BlockCake.java -@@ -55,7 +55,18 @@ - private void b(World world, BlockPosition blockposition, IBlockData iblockdata, EntityHuman entityhuman) { - if (entityhuman.j(false)) { - entityhuman.b(StatisticList.H); -- entityhuman.getFoodData().eat(2, 0.1F); -+ // CraftBukkit start -+ // entityhuman.getFoodData().eat(2, 0.1F); -+ int oldFoodLevel = entityhuman.getFoodData().foodLevel; -+ -+ org.bukkit.event.entity.FoodLevelChangeEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callFoodLevelChangeEvent(entityhuman, 2 + oldFoodLevel); -+ -+ if (!event.isCancelled()) { -+ entityhuman.getFoodData().eat(event.getFoodLevel() - oldFoodLevel, 0.1F); -+ } -+ -+ ((EntityPlayer) entityhuman).playerConnection.sendPacket(new PacketPlayOutUpdateHealth(((EntityPlayer) entityhuman).getBukkitEntity().getScaledHealth(), entityhuman.getFoodData().foodLevel, entityhuman.getFoodData().saturationLevel)); -+ // CraftBukkit end - int i = ((Integer) iblockdata.get(BlockCake.BITES)).intValue(); - - if (i < 6) { diff --git a/TacoSpigot-Server/nms-patches/BlockCocoa.patch b/TacoSpigot-Server/nms-patches/BlockCocoa.patch deleted file mode 100644 index d7ba70e..0000000 --- a/TacoSpigot-Server/nms-patches/BlockCocoa.patch +++ /dev/null @@ -1,35 +0,0 @@ ---- a/net/minecraft/server/BlockCocoa.java -+++ b/net/minecraft/server/BlockCocoa.java -@@ -2,6 +2,8 @@ - - import java.util.Random; - -+import org.bukkit.craftbukkit.event.CraftEventFactory; // CraftBukkit -+ - public class BlockCocoa extends BlockDirectional implements IBlockFragilePlantElement { - - public static final BlockStateInteger AGE = BlockStateInteger.of("age", 0, 2); -@@ -19,7 +21,10 @@ - int i = ((Integer) iblockdata.get(BlockCocoa.AGE)).intValue(); - - if (i < 2) { -- world.setTypeAndData(blockposition, iblockdata.set(BlockCocoa.AGE, Integer.valueOf(i + 1)), 2); -+ // CraftBukkit start -+ IBlockData data = iblockdata.set(AGE, Integer.valueOf(i + 1)); -+ CraftEventFactory.handleBlockGrowEvent(world, blockposition.getX(), blockposition.getY(), blockposition.getZ(), this, toLegacyData(data)); -+ // CraftBukkit end - } - } - -@@ -125,7 +130,10 @@ - } - - public void b(World world, Random random, BlockPosition blockposition, IBlockData iblockdata) { -- world.setTypeAndData(blockposition, iblockdata.set(BlockCocoa.AGE, Integer.valueOf(((Integer) iblockdata.get(BlockCocoa.AGE)).intValue() + 1)), 2); -+ // CraftBukkit start -+ IBlockData data = iblockdata.set(AGE, Integer.valueOf(((Integer) iblockdata.get(AGE)).intValue() + 1)); -+ CraftEventFactory.handleBlockGrowEvent(world, blockposition.getX(), blockposition.getY(), blockposition.getZ(), this, toLegacyData(data)); -+ // CraftBukkit end - } - - public IBlockData fromLegacyData(int i) { diff --git a/TacoSpigot-Server/nms-patches/BlockCommand.patch b/TacoSpigot-Server/nms-patches/BlockCommand.patch deleted file mode 100644 index 236e740..0000000 --- a/TacoSpigot-Server/nms-patches/BlockCommand.patch +++ /dev/null @@ -1,33 +0,0 @@ ---- a/net/minecraft/server/BlockCommand.java -+++ b/net/minecraft/server/BlockCommand.java -@@ -2,6 +2,8 @@ - - import java.util.Random; - -+import org.bukkit.event.block.BlockRedstoneEvent; // CraftBukkit -+ - public class BlockCommand extends BlockContainer { - - public static final BlockStateBoolean TRIGGERED = BlockStateBoolean.of("triggered"); -@@ -20,10 +22,19 @@ - boolean flag = world.isBlockIndirectlyPowered(blockposition); - boolean flag1 = ((Boolean) iblockdata.get(BlockCommand.TRIGGERED)).booleanValue(); - -- if (flag && !flag1) { -+ // CraftBukkit start -+ org.bukkit.block.Block bukkitBlock = world.getWorld().getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ()); -+ int old = flag1 ? 15 : 0; -+ int current = flag ? 15 : 0; -+ -+ BlockRedstoneEvent eventRedstone = new BlockRedstoneEvent(bukkitBlock, old, current); -+ world.getServer().getPluginManager().callEvent(eventRedstone); -+ // CraftBukkit end -+ -+ if (eventRedstone.getNewCurrent() > 0 && !(eventRedstone.getOldCurrent() > 0)) { // CraftBukkit - world.setTypeAndData(blockposition, iblockdata.set(BlockCommand.TRIGGERED, Boolean.valueOf(true)), 4); - world.a(blockposition, (Block) this, this.a(world)); -- } else if (!flag && flag1) { -+ } else if (!(eventRedstone.getNewCurrent() > 0) && eventRedstone.getOldCurrent() > 0) { // CraftBukkit - world.setTypeAndData(blockposition, iblockdata.set(BlockCommand.TRIGGERED, Boolean.valueOf(false)), 4); - } - } diff --git a/TacoSpigot-Server/nms-patches/BlockCrops.patch b/TacoSpigot-Server/nms-patches/BlockCrops.patch deleted file mode 100644 index bc89bbd..0000000 --- a/TacoSpigot-Server/nms-patches/BlockCrops.patch +++ /dev/null @@ -1,35 +0,0 @@ ---- a/net/minecraft/server/BlockCrops.java -+++ b/net/minecraft/server/BlockCrops.java -@@ -2,6 +2,8 @@ - - import java.util.Random; - -+import org.bukkit.craftbukkit.event.CraftEventFactory; // CraftBukkit -+ - public class BlockCrops extends BlockPlant implements IBlockFragilePlantElement { - - public static final BlockStateInteger AGE = BlockStateInteger.of("age", 0, 7); -@@ -31,7 +33,10 @@ - float f = a((Block) this, world, blockposition); - - if (random.nextInt((int) (25.0F / f) + 1) == 0) { -- world.setTypeAndData(blockposition, iblockdata.set(BlockCrops.AGE, Integer.valueOf(i + 1)), 2); -+ // CraftBukkit start -+ IBlockData data = iblockdata.set(AGE, Integer.valueOf(i + 1)); -+ CraftEventFactory.handleBlockGrowEvent(world, blockposition.getX(), blockposition.getY(), blockposition.getZ(), this, toLegacyData(data)); -+ // CraftBukkit end - } - } - } -@@ -45,7 +50,10 @@ - i = 7; - } - -- world.setTypeAndData(blockposition, iblockdata.set(BlockCrops.AGE, Integer.valueOf(i)), 2); -+ // CraftBukkit start -+ IBlockData data = iblockdata.set(AGE, Integer.valueOf(i)); -+ CraftEventFactory.handleBlockGrowEvent(world, blockposition.getX(), blockposition.getY(), blockposition.getZ(), this, toLegacyData(data)); -+ // CraftBukkit end - } - - protected static float a(Block block, World world, BlockPosition blockposition) { diff --git a/TacoSpigot-Server/nms-patches/BlockDaylightDetector.patch b/TacoSpigot-Server/nms-patches/BlockDaylightDetector.patch deleted file mode 100644 index ba11108..0000000 --- a/TacoSpigot-Server/nms-patches/BlockDaylightDetector.patch +++ /dev/null @@ -1,10 +0,0 @@ ---- a/net/minecraft/server/BlockDaylightDetector.java -+++ b/net/minecraft/server/BlockDaylightDetector.java -@@ -41,6 +41,7 @@ - } - - if (((Integer) iblockdata.get(BlockDaylightDetector.POWER)).intValue() != i) { -+ i = org.bukkit.craftbukkit.event.CraftEventFactory.callRedstoneChange(world, blockposition.getX(), blockposition.getY(), blockposition.getZ(), ((Integer) iblockdata.get(POWER)), i).getNewCurrent(); // CraftBukkit - Call BlockRedstoneEvent - world.setTypeAndData(blockposition, iblockdata.set(BlockDaylightDetector.POWER, Integer.valueOf(i)), 3); - } - diff --git a/TacoSpigot-Server/nms-patches/BlockDiodeAbstract.patch b/TacoSpigot-Server/nms-patches/BlockDiodeAbstract.patch deleted file mode 100644 index 8144ad4..0000000 --- a/TacoSpigot-Server/nms-patches/BlockDiodeAbstract.patch +++ /dev/null @@ -1,30 +0,0 @@ ---- a/net/minecraft/server/BlockDiodeAbstract.java -+++ b/net/minecraft/server/BlockDiodeAbstract.java -@@ -2,6 +2,8 @@ - - import java.util.Random; - -+import org.bukkit.craftbukkit.event.CraftEventFactory; // CraftBukkit -+ - public abstract class BlockDiodeAbstract extends BlockDirectional { - - protected final boolean N; -@@ -31,8 +33,18 @@ - boolean flag = this.e(world, blockposition, iblockdata); - - if (this.N && !flag) { -+ // CraftBukkit start -+ if (CraftEventFactory.callRedstoneChange(world, blockposition.getX(), blockposition.getY(), blockposition.getZ(), 15, 0).getNewCurrent() != 0) { -+ return; -+ } -+ // CraftBukkit end - world.setTypeAndData(blockposition, this.k(iblockdata), 2); - } else if (!this.N) { -+ // CraftBukkit start -+ if (CraftEventFactory.callRedstoneChange(world, blockposition.getX(), blockposition.getY(), blockposition.getZ(), 0, 15).getNewCurrent() != 15) { -+ return; -+ } -+ // CraftBukkit end - world.setTypeAndData(blockposition, this.e(iblockdata), 2); - if (!flag) { - world.a(blockposition, this.e(iblockdata).getBlock(), this.m(iblockdata), -1); diff --git a/TacoSpigot-Server/nms-patches/BlockDispenser.patch b/TacoSpigot-Server/nms-patches/BlockDispenser.patch deleted file mode 100644 index ff2bdb7..0000000 --- a/TacoSpigot-Server/nms-patches/BlockDispenser.patch +++ /dev/null @@ -1,18 +0,0 @@ ---- a/net/minecraft/server/BlockDispenser.java -+++ b/net/minecraft/server/BlockDispenser.java -@@ -8,6 +8,7 @@ - public static final BlockStateBoolean TRIGGERED = BlockStateBoolean.of("triggered"); - public static final RegistryDefault REGISTRY = new RegistryDefault(new DispenseBehaviorItem()); - protected Random O = new Random(); -+ public static boolean eventFired = false; // CraftBukkit - - protected BlockDispenser() { - super(Material.STONE); -@@ -83,6 +84,7 @@ - - if (idispensebehavior != IDispenseBehavior.NONE) { - ItemStack itemstack1 = idispensebehavior.a(sourceblock, itemstack); -+ eventFired = false; // CraftBukkit - reset event status - - tileentitydispenser.setItem(i, itemstack1.count <= 0 ? null : itemstack1); - } diff --git a/TacoSpigot-Server/nms-patches/BlockDoor.patch b/TacoSpigot-Server/nms-patches/BlockDoor.patch deleted file mode 100644 index 5f6752c..0000000 --- a/TacoSpigot-Server/nms-patches/BlockDoor.patch +++ /dev/null @@ -1,44 +0,0 @@ ---- a/net/minecraft/server/BlockDoor.java -+++ b/net/minecraft/server/BlockDoor.java -@@ -3,6 +3,8 @@ - import com.google.common.base.Predicate; - import java.util.Random; - -+import org.bukkit.event.block.BlockRedstoneEvent; // CraftBukkit -+ - public class BlockDoor extends Block { - - public static final BlockStateDirection FACING = BlockStateDirection.of("facing", (Predicate) EnumDirection.EnumDirectionLimit.HORIZONTAL); -@@ -155,9 +157,22 @@ - this.b(world, blockposition, iblockdata, 0); - } - } else { -- boolean flag1 = world.isBlockIndirectlyPowered(blockposition) || world.isBlockIndirectlyPowered(blockposition2); - -- if ((flag1 || block.isPowerSource()) && block != this && 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(blockposition2.getX(), blockposition2.getY(), blockposition2.getZ()); -+ -+ int power = bukkitBlock.getBlockPower(); -+ int powerTop = blockTop.getBlockPower(); -+ if (powerTop > power) power = powerTop; -+ int oldPower = (Boolean)iblockdata2.get(POWERED) ? 15 : 0; -+ -+ if (oldPower == 0 ^ power == 0) { -+ BlockRedstoneEvent eventRedstone = new BlockRedstoneEvent(bukkitBlock, oldPower, power); -+ world.getServer().getPluginManager().callEvent(eventRedstone); -+ -+ boolean flag1 = eventRedstone.getNewCurrent() > 0; - world.setTypeAndData(blockposition2, iblockdata2.set(BlockDoor.POWERED, Boolean.valueOf(flag1)), 2); - if (flag1 != ((Boolean) iblockdata.get(BlockDoor.OPEN)).booleanValue()) { - world.setTypeAndData(blockposition, iblockdata.set(BlockDoor.OPEN, Boolean.valueOf(flag1)), 2); -@@ -165,6 +180,7 @@ - world.a((EntityHuman) null, flag1 ? 1003 : 1006, blockposition, 0); - } - } -+ // CraftBukkit end - } - } - diff --git a/TacoSpigot-Server/nms-patches/BlockDragonEgg.patch b/TacoSpigot-Server/nms-patches/BlockDragonEgg.patch deleted file mode 100644 index e9860ee..0000000 --- a/TacoSpigot-Server/nms-patches/BlockDragonEgg.patch +++ /dev/null @@ -1,30 +0,0 @@ ---- a/net/minecraft/server/BlockDragonEgg.java -+++ b/net/minecraft/server/BlockDragonEgg.java -@@ -2,6 +2,8 @@ - - import java.util.Random; - -+import org.bukkit.event.block.BlockFromToEvent; // CraftBukkit -+ - public class BlockDragonEgg extends Block { - - public BlockDragonEgg() { -@@ -61,6 +63,18 @@ - BlockPosition blockposition1 = blockposition.a(world.random.nextInt(16) - world.random.nextInt(16), world.random.nextInt(8) - world.random.nextInt(8), world.random.nextInt(16) - world.random.nextInt(16)); - - if (world.getType(blockposition1).getBlock().material == Material.AIR) { -+ // CraftBukkit start -+ org.bukkit.block.Block from = world.getWorld().getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ()); -+ org.bukkit.block.Block to = world.getWorld().getBlockAt(blockposition1.getX(), blockposition1.getY(), blockposition1.getZ()); -+ BlockFromToEvent event = new BlockFromToEvent(from, to); -+ org.bukkit.Bukkit.getPluginManager().callEvent(event); -+ -+ if (event.isCancelled()) { -+ return; -+ } -+ -+ blockposition1 = new BlockPosition(event.getToBlock().getX(), event.getToBlock().getY(), event.getToBlock().getZ()); -+ // CraftBukkit end - if (world.isClientSide) { - for (int j = 0; j < 128; ++j) { - double d0 = world.random.nextDouble(); diff --git a/TacoSpigot-Server/nms-patches/BlockDropper.patch b/TacoSpigot-Server/nms-patches/BlockDropper.patch deleted file mode 100644 index 9f4ff91..0000000 --- a/TacoSpigot-Server/nms-patches/BlockDropper.patch +++ /dev/null @@ -1,41 +0,0 @@ ---- a/net/minecraft/server/BlockDropper.java -+++ b/net/minecraft/server/BlockDropper.java -@@ -1,5 +1,10 @@ - package net.minecraft.server; - -+// CraftBukkit start -+import org.bukkit.craftbukkit.inventory.CraftItemStack; -+import org.bukkit.event.inventory.InventoryMoveItemEvent; -+// CraftBukkit end -+ - public class BlockDropper extends BlockDispenser { - - private final IDispenseBehavior P = new DispenseBehaviorItem(); -@@ -38,8 +43,25 @@ - itemstack1 = null; - } - } else { -- itemstack1 = TileEntityHopper.addItem(iinventory, itemstack.cloneItemStack().cloneAndSubtract(1), enumdirection.opposite()); -- if (itemstack1 == null) { -+ // 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(); -+ } -+ -+ InventoryMoveItemEvent event = new InventoryMoveItemEvent(tileentitydispenser.getOwner().getInventory(), oitemstack.clone(), destinationInventory, true); -+ world.getServer().getPluginManager().callEvent(event); -+ if (event.isCancelled()) { -+ return; -+ } -+ itemstack1 = TileEntityHopper.addItem(iinventory, CraftItemStack.asNMSCopy(event.getItem()), enumdirection.opposite()); -+ if (event.getItem().equals(oitemstack) && itemstack1 == null) { -+ // CraftBukkit end - itemstack1 = itemstack.cloneItemStack(); - if (--itemstack1.count <= 0) { - itemstack1 = null; diff --git a/TacoSpigot-Server/nms-patches/BlockEnderPortal.patch b/TacoSpigot-Server/nms-patches/BlockEnderPortal.patch deleted file mode 100644 index 8f130a9..0000000 --- a/TacoSpigot-Server/nms-patches/BlockEnderPortal.patch +++ /dev/null @@ -1,22 +0,0 @@ ---- a/net/minecraft/server/BlockEnderPortal.java -+++ b/net/minecraft/server/BlockEnderPortal.java -@@ -3,6 +3,8 @@ - import java.util.List; - import java.util.Random; - -+import org.bukkit.event.entity.EntityPortalEnterEvent; // CraftBukkit -+ - public class BlockEnderPortal extends BlockContainer { - - protected BlockEnderPortal(Material material) { -@@ -36,6 +38,10 @@ - - public void a(World world, BlockPosition blockposition, IBlockData iblockdata, Entity entity) { - if (entity.vehicle == null && entity.passenger == null && !world.isClientSide) { -+ // CraftBukkit start - Entity in portal -+ EntityPortalEnterEvent event = new EntityPortalEnterEvent(entity.getBukkitEntity(), new org.bukkit.Location(world.getWorld(), blockposition.getX(), blockposition.getY(), blockposition.getZ())); -+ world.getServer().getPluginManager().callEvent(event); -+ // CraftBukkit end - entity.c(1); - } - diff --git a/TacoSpigot-Server/nms-patches/BlockFire.patch b/TacoSpigot-Server/nms-patches/BlockFire.patch deleted file mode 100644 index db1a8fd..0000000 --- a/TacoSpigot-Server/nms-patches/BlockFire.patch +++ /dev/null @@ -1,136 +0,0 @@ ---- a/net/minecraft/server/BlockFire.java -+++ b/net/minecraft/server/BlockFire.java -@@ -4,6 +4,12 @@ - import java.util.Map; - import java.util.Random; - -+// CraftBukkit start -+import org.bukkit.craftbukkit.event.CraftEventFactory; -+import org.bukkit.event.block.BlockBurnEvent; -+import org.bukkit.event.block.BlockSpreadEvent; -+// CraftBukkit end -+ - public class BlockFire extends Block { - - public static final BlockStateInteger AGE = BlockStateInteger.of("age", 0, 15); -@@ -109,7 +115,7 @@ - public void b(World world, BlockPosition blockposition, IBlockData iblockdata, Random random) { - if (world.getGameRules().getBoolean("doFireTick")) { - if (!this.canPlace(world, blockposition)) { -- world.setAir(blockposition); -+ fireExtinguished(world, blockposition); // CraftBukkit - invalid place location - } - - Block block = world.getType(blockposition.down()).getBlock(); -@@ -120,7 +126,7 @@ - } - - if (!flag && world.S() && this.e(world, blockposition)) { -- world.setAir(blockposition); -+ fireExtinguished(world, blockposition); // CraftBukkit - extinguished by rain - } else { - int i = ((Integer) iblockdata.get(BlockFire.AGE)).intValue(); - -@@ -133,14 +139,14 @@ - if (!flag) { - if (!this.f(world, blockposition)) { - if (!World.a((IBlockAccess) world, blockposition.down()) || i > 3) { -- world.setAir(blockposition); -+ fireExtinguished(world, blockposition); // CraftBukkit - } - - return; - } - - if (!this.e((IBlockAccess) world, blockposition.down()) && i == 15 && random.nextInt(4) == 0) { -- world.setAir(blockposition); -+ fireExtinguished(world, blockposition); // CraftBukkit - return; - } - } -@@ -186,7 +192,26 @@ - l1 = 15; - } - -- world.setTypeAndData(blockposition1, iblockdata.set(BlockFire.AGE, Integer.valueOf(l1)), 3); -+ // CraftBukkit start - Call to stop spread of fire -+ if (world.getType(blockposition1) != Blocks.FIRE) { -+ if (CraftEventFactory.callBlockIgniteEvent(world, blockposition1.getX(), blockposition1.getY(), blockposition1.getZ(), blockposition.getX(), blockposition.getY(), blockposition.getZ()).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); -+ } -+ } -+ // CraftBukkit end - } - } - } -@@ -224,6 +249,17 @@ - if (random.nextInt(i) < k) { - IBlockData iblockdata = world.getType(blockposition); - -+ // CraftBukkit start -+ org.bukkit.block.Block theBlock = world.getWorld().getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ()); -+ -+ BlockBurnEvent event = new BlockBurnEvent(theBlock); -+ world.getServer().getPluginManager().callEvent(event); -+ -+ if (event.isCancelled()) { -+ return; -+ } -+ // CraftBukkit end -+ - if (random.nextInt(j + 10) < 5 && !world.isRainingAt(blockposition)) { - int l = j + random.nextInt(5) / 4; - -@@ -233,7 +269,7 @@ - - world.setTypeAndData(blockposition, this.getBlockData().set(BlockFire.AGE, Integer.valueOf(l)), 3); - } else { -- world.setAir(blockposition); -+ fireExtinguished(world, blockposition); // CraftBukkit - } - - if (iblockdata.getBlock() == Blocks.TNT) { -@@ -290,7 +326,7 @@ - - public void doPhysics(World world, BlockPosition blockposition, IBlockData iblockdata, Block block) { - if (!World.a((IBlockAccess) world, blockposition.down()) && !this.f(world, blockposition)) { -- world.setAir(blockposition); -+ fireExtinguished(world, blockposition); // CraftBukkit - fuel block gone - } - - } -@@ -298,7 +334,7 @@ - public void onPlace(World world, BlockPosition blockposition, IBlockData iblockdata) { - if (world.worldProvider.getDimension() > 0 || !Blocks.PORTAL.e(world, blockposition)) { - if (!World.a((IBlockAccess) world, blockposition.down()) && !this.f(world, blockposition)) { -- world.setAir(blockposition); -+ fireExtinguished(world, blockposition); // CraftBukkit - fuel block broke - } else { - world.a(blockposition, (Block) this, this.a(world) + world.random.nextInt(10)); - } -@@ -320,4 +356,12 @@ - protected BlockStateList getStateList() { - return new BlockStateList(this, new IBlockState[] { BlockFire.AGE, BlockFire.NORTH, BlockFire.EAST, BlockFire.SOUTH, BlockFire.WEST, BlockFire.UPPER, BlockFire.FLIP, BlockFire.ALT}); - } -+ -+ // CraftBukkit start -+ private void fireExtinguished(World world, BlockPosition position) { -+ if (!CraftEventFactory.callBlockFadeEvent(world.getWorld().getBlockAt(position.getX(), position.getY(), position.getZ()), Blocks.AIR).isCancelled()) { -+ world.setAir(position); -+ } -+ } -+ // CraftBukkit end - } diff --git a/TacoSpigot-Server/nms-patches/BlockFlowing.patch b/TacoSpigot-Server/nms-patches/BlockFlowing.patch deleted file mode 100644 index 38caee1..0000000 --- a/TacoSpigot-Server/nms-patches/BlockFlowing.patch +++ /dev/null @@ -1,74 +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; -@@ -18,6 +23,11 @@ - } - - public void b(World world, BlockPosition blockposition, IBlockData iblockdata, Random random) { -+ // CraftBukkit start -+ org.bukkit.World bworld = world.getWorld(); -+ org.bukkit.Server server = world.getServer(); -+ org.bukkit.block.Block source = bworld == null ? null : bworld.getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ()); -+ // CraftBukkit end - int i = ((Integer) iblockdata.get(BlockFlowing.LEVEL)).intValue(); - byte b0 = 1; - -@@ -88,6 +98,12 @@ - IBlockData iblockdata2 = world.getType(blockposition.down()); - - if (this.h(world, blockposition.down(), iblockdata2)) { -+ // CraftBukkit start - Send "down" to the server -+ BlockFromToEvent event = new BlockFromToEvent(source, BlockFace.DOWN); -+ if (server != null) { -+ server.getPluginManager().callEvent(event); -+ } -+ if (!event.isCancelled()) { - if (this.material == Material.LAVA && world.getType(blockposition.down()).getBlock().getMaterial() == Material.WATER) { - world.setTypeUpdate(blockposition.down(), Blocks.STONE.getBlockData()); - this.fizz(world, blockposition.down()); -@@ -99,6 +115,8 @@ - } else { - this.flow(world, blockposition.down(), iblockdata2, i + 8); - } -+ } -+ // CraftBukkit end - } else if (i >= 0 && (i == 0 || this.g(world, blockposition.down(), iblockdata2))) { - Set set = this.f(world, blockposition); - -@@ -116,14 +134,23 @@ - while (iterator1.hasNext()) { - EnumDirection enumdirection1 = (EnumDirection) iterator1.next(); - -- this.flow(world, blockposition.shift(enumdirection1), world.getType(blockposition.shift(enumdirection1)), k); -+ // CraftBukkit start -+ BlockFromToEvent event = new BlockFromToEvent(source, org.bukkit.craftbukkit.block.CraftBlock.notchToBlockFace(enumdirection1)); -+ if (server != null) { -+ server.getPluginManager().callEvent(event); -+ } -+ -+ if (!event.isCancelled()) { -+ this.flow(world, blockposition.shift(enumdirection1), world.getType(blockposition.shift(enumdirection1)), k); -+ } -+ // CraftBukkit end - } - } - - } - - 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.getBlock() != Blocks.AIR) { - if (this.material == Material.LAVA) { - this.fizz(world, blockposition); diff --git a/TacoSpigot-Server/nms-patches/BlockGrass.patch b/TacoSpigot-Server/nms-patches/BlockGrass.patch deleted file mode 100644 index 7014deb..0000000 --- a/TacoSpigot-Server/nms-patches/BlockGrass.patch +++ /dev/null @@ -1,77 +0,0 @@ ---- 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()).getBlock().p() > 2) { -- world.setTypeUpdate(blockposition, Blocks.DIRT.getBlockData()); -+ // CraftBukkit start -+ // world.setTypeUpdate(blockposition, Blocks.DIRT.getBlockData()); -+ org.bukkit.World bworld = world.getWorld(); -+ BlockState blockState = bworld.getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ()).getState(); -+ blockState.setType(CraftMagicNumbers.getMaterial(Blocks.DIRT)); -+ -+ BlockFadeEvent event = new BlockFadeEvent(blockState.getBlock(), blockState); -+ world.getServer().getPluginManager().callEvent(event); -+ -+ if (!event.isCancelled()) { -+ blockState.update(true); -+ } -+ // CraftBukkit end - } else { - if (world.getLightLevel(blockposition.up()) >= 9) { - for (int i = 0; i < 4; ++i) { -@@ -31,7 +51,19 @@ - IBlockData iblockdata1 = world.getType(blockposition1); - - if (iblockdata1.getBlock() == Blocks.DIRT && iblockdata1.get(BlockDirt.VARIANT) == BlockDirt.EnumDirtVariant.DIRT && world.getLightLevel(blockposition1.up()) >= 4 && block.p() <= 2) { -- world.setTypeUpdate(blockposition1, Blocks.GRASS.getBlockData()); -+ // CraftBukkit start -+ // world.setTypeUpdate(blockposition1, Blocks.GRASS.getBlockData()); -+ org.bukkit.World bworld = world.getWorld(); -+ BlockState blockState = bworld.getBlockAt(blockposition1.getX(), blockposition1.getY(), blockposition1.getZ()).getState(); -+ blockState.setType(CraftMagicNumbers.getMaterial(Blocks.GRASS)); -+ -+ BlockSpreadEvent event = new BlockSpreadEvent(blockState.getBlock(), bworld.getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ()), blockState); -+ world.getServer().getPluginManager().callEvent(event); -+ -+ if (!event.isCancelled()) { -+ blockState.update(true); -+ } -+ // CraftBukkit end - } - } - } -@@ -74,13 +106,15 @@ - IBlockData iblockdata1 = blockflowers.getBlockData().set(blockflowers.n(), 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 - } - } else { - IBlockData iblockdata2 = Blocks.TALLGRASS.getBlockData().set(BlockLongGrass.TYPE, BlockLongGrass.EnumTallGrassType.GRASS); - - if (Blocks.TALLGRASS.f(world, blockposition2, iblockdata2)) { -- world.setTypeAndData(blockposition2, iblockdata2, 3); -+ // world.setTypeAndData(blockposition2, iblockdata2, 3); // CraftBukkit -+ CraftEventFactory.handleBlockGrowEvent(world, blockposition2.getX(), blockposition2.getY(), blockposition2.getZ(), iblockdata2.getBlock(), iblockdata2.getBlock().toLegacyData(iblockdata2)); // CraftBukkit - } - } - } diff --git a/TacoSpigot-Server/nms-patches/BlockIce.patch b/TacoSpigot-Server/nms-patches/BlockIce.patch deleted file mode 100644 index 05344a7..0000000 --- a/TacoSpigot-Server/nms-patches/BlockIce.patch +++ /dev/null @@ -1,15 +0,0 @@ ---- a/net/minecraft/server/BlockIce.java -+++ b/net/minecraft/server/BlockIce.java -@@ -44,6 +44,12 @@ - - public void b(World world, BlockPosition blockposition, IBlockData iblockdata, Random random) { - if (world.b(EnumSkyBlock.BLOCK, blockposition) > 11 - this.p()) { -+ // CraftBukkit start -+ if (org.bukkit.craftbukkit.event.CraftEventFactory.callBlockFadeEvent(world.getWorld().getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ()), world.worldProvider.n() ? Blocks.AIR : Blocks.WATER).isCancelled()) { -+ return; -+ } -+ // CraftBukkit end -+ - if (world.worldProvider.n()) { - world.setAir(blockposition); - } else { diff --git a/TacoSpigot-Server/nms-patches/BlockJukeBox.patch b/TacoSpigot-Server/nms-patches/BlockJukeBox.patch deleted file mode 100644 index 080ba7e..0000000 --- a/TacoSpigot-Server/nms-patches/BlockJukeBox.patch +++ /dev/null @@ -1,14 +0,0 @@ ---- a/net/minecraft/server/BlockJukeBox.java -+++ b/net/minecraft/server/BlockJukeBox.java -@@ -136,6 +136,11 @@ - } - - public void setRecord(ItemStack itemstack) { -+ // CraftBukkit start - There can only be one -+ if (itemstack != null) { -+ itemstack.count = 1; -+ } -+ // CraftBukkit end - this.record = itemstack; - this.update(); - } diff --git a/TacoSpigot-Server/nms-patches/BlockLeaves.patch b/TacoSpigot-Server/nms-patches/BlockLeaves.patch deleted file mode 100644 index ffdc77a..0000000 --- a/TacoSpigot-Server/nms-patches/BlockLeaves.patch +++ /dev/null @@ -1,26 +0,0 @@ ---- a/net/minecraft/server/BlockLeaves.java -+++ b/net/minecraft/server/BlockLeaves.java -@@ -2,6 +2,8 @@ - - import java.util.Random; - -+import org.bukkit.event.block.LeavesDecayEvent; // CraftBukkit -+ - public abstract class BlockLeaves extends BlockTransparent { - - public static final BlockStateBoolean DECAYABLE = BlockStateBoolean.of("decayable"); -@@ -130,6 +132,14 @@ - } - - private void e(World world, BlockPosition blockposition) { -+ // CraftBukkit start -+ LeavesDecayEvent event = new LeavesDecayEvent(world.getWorld().getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ())); -+ world.getServer().getPluginManager().callEvent(event); -+ -+ if (event.isCancelled() || world.getType(blockposition).getBlock() != this) { -+ return; -+ } -+ // CraftBukkit end - this.b(world, blockposition, world.getType(blockposition), 0); - world.setAir(blockposition); - } diff --git a/TacoSpigot-Server/nms-patches/BlockLever.patch b/TacoSpigot-Server/nms-patches/BlockLever.patch deleted file mode 100644 index c150122..0000000 --- a/TacoSpigot-Server/nms-patches/BlockLever.patch +++ /dev/null @@ -1,32 +0,0 @@ ---- a/net/minecraft/server/BlockLever.java -+++ b/net/minecraft/server/BlockLever.java -@@ -2,6 +2,8 @@ - - import java.util.Iterator; - -+import org.bukkit.event.block.BlockRedstoneEvent; // CraftBukkit -+ - public class BlockLever extends Block { - - public static final BlockStateEnum FACING = BlockStateEnum.of("facing", BlockLever.EnumLeverPosition.class); -@@ -155,6 +157,20 @@ - if (world.isClientSide) { - return true; - } else { -+ // CraftBukkit start - Interact Lever -+ boolean powered = iblockdata.get(POWERED); -+ org.bukkit.block.Block block = world.getWorld().getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ()); -+ int old = (powered) ? 15 : 0; -+ int current = (!powered) ? 15 : 0; -+ -+ BlockRedstoneEvent eventRedstone = new BlockRedstoneEvent(block, old, current); -+ world.getServer().getPluginManager().callEvent(eventRedstone); -+ -+ if ((eventRedstone.getNewCurrent() > 0) != (!powered)) { -+ return true; -+ } -+ // CraftBukkit end -+ - iblockdata = iblockdata.a(BlockLever.POWERED); - world.setTypeAndData(blockposition, iblockdata, 3); - world.makeSound((double) blockposition.getX() + 0.5D, (double) blockposition.getY() + 0.5D, (double) blockposition.getZ() + 0.5D, "random.click", 0.3F, ((Boolean) iblockdata.get(BlockLever.POWERED)).booleanValue() ? 0.6F : 0.5F); diff --git a/TacoSpigot-Server/nms-patches/BlockMinecartDetector.patch b/TacoSpigot-Server/nms-patches/BlockMinecartDetector.patch deleted file mode 100644 index 625436f..0000000 --- a/TacoSpigot-Server/nms-patches/BlockMinecartDetector.patch +++ /dev/null @@ -1,29 +0,0 @@ ---- a/net/minecraft/server/BlockMinecartDetector.java -+++ b/net/minecraft/server/BlockMinecartDetector.java -@@ -4,6 +4,8 @@ - import java.util.List; - import java.util.Random; - -+import org.bukkit.event.block.BlockRedstoneEvent; // CraftBukkit -+ - public class BlockMinecartDetector extends BlockMinecartTrackAbstract { - - public static final BlockStateEnum SHAPE = BlockStateEnum.a("shape", BlockMinecartTrackAbstract.EnumTrackPosition.class, new Predicate() { -@@ -64,6 +66,17 @@ - flag1 = true; - } - -+ // CraftBukkit start -+ if (flag != flag1) { -+ org.bukkit.block.Block block = world.getWorld().getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ()); -+ -+ BlockRedstoneEvent eventRedstone = new BlockRedstoneEvent(block, flag ? 15 : 0, flag1 ? 15 : 0); -+ world.getServer().getPluginManager().callEvent(eventRedstone); -+ -+ flag1 = eventRedstone.getNewCurrent() > 0; -+ } -+ // CraftBukkit end -+ - if (flag1 && !flag) { - world.setTypeAndData(blockposition, iblockdata.set(BlockMinecartDetector.POWERED, Boolean.valueOf(true)), 3); - world.applyPhysics(blockposition, this); diff --git a/TacoSpigot-Server/nms-patches/BlockMinecartTrackAbstract.patch b/TacoSpigot-Server/nms-patches/BlockMinecartTrackAbstract.patch deleted file mode 100644 index 922347c..0000000 --- a/TacoSpigot-Server/nms-patches/BlockMinecartTrackAbstract.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- a/net/minecraft/server/BlockMinecartTrackAbstract.java -+++ b/net/minecraft/server/BlockMinecartTrackAbstract.java -@@ -87,7 +87,7 @@ - flag = true; - } - -- if (flag) { -+ if (flag && !world.isEmpty(blockposition)) { // CraftBukkit - SPIGOT-424, MC-73474 - this.b(world, blockposition, iblockdata, 0); - world.setAir(blockposition); - } else { diff --git a/TacoSpigot-Server/nms-patches/BlockMobSpawner.patch b/TacoSpigot-Server/nms-patches/BlockMobSpawner.patch deleted file mode 100644 index 870a990..0000000 --- a/TacoSpigot-Server/nms-patches/BlockMobSpawner.patch +++ /dev/null @@ -1,22 +0,0 @@ ---- a/net/minecraft/server/BlockMobSpawner.java -+++ b/net/minecraft/server/BlockMobSpawner.java -@@ -22,9 +22,19 @@ - - public void dropNaturally(World world, BlockPosition blockposition, IBlockData iblockdata, float f, int i) { - super.dropNaturally(world, blockposition, iblockdata, f, i); -+ /* CraftBukkit start - Delegate to getExpDrop - int j = 15 + world.random.nextInt(15) + world.random.nextInt(15); - - this.dropExperience(world, blockposition, j); -+ */ -+ } -+ -+ @Override -+ public int getExpDrop(World world, IBlockData iblockdata, int enchantmentLevel) { -+ int j = 15 + world.random.nextInt(15) + world.random.nextInt(15); -+ -+ return j; -+ // CraftBukkit end - } - - public boolean c() { diff --git a/TacoSpigot-Server/nms-patches/BlockMonsterEggs.patch b/TacoSpigot-Server/nms-patches/BlockMonsterEggs.patch deleted file mode 100644 index 1a4ae34..0000000 --- a/TacoSpigot-Server/nms-patches/BlockMonsterEggs.patch +++ /dev/null @@ -1,20 +0,0 @@ ---- a/net/minecraft/server/BlockMonsterEggs.java -+++ b/net/minecraft/server/BlockMonsterEggs.java -@@ -2,6 +2,8 @@ - - import java.util.Random; - -+import org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason; // CraftBukkit -+ - public class BlockMonsterEggs extends Block { - - public static final BlockStateEnum VARIANT = BlockStateEnum.of("variant", BlockMonsterEggs.EnumMonsterEggVarient.class); -@@ -50,7 +52,7 @@ - EntitySilverfish entitysilverfish = new EntitySilverfish(world); - - entitysilverfish.setPositionRotation((double) blockposition.getX() + 0.5D, (double) blockposition.getY(), (double) blockposition.getZ() + 0.5D, 0.0F, 0.0F); -- world.addEntity(entitysilverfish); -+ world.addEntity(entitysilverfish, SpawnReason.SILVERFISH_BLOCK); // CraftBukkit - add SpawnReason - entitysilverfish.y(); - } - diff --git a/TacoSpigot-Server/nms-patches/BlockMushroom.patch b/TacoSpigot-Server/nms-patches/BlockMushroom.patch deleted file mode 100644 index 20bdf91..0000000 --- a/TacoSpigot-Server/nms-patches/BlockMushroom.patch +++ /dev/null @@ -1,55 +0,0 @@ ---- a/net/minecraft/server/BlockMushroom.java -+++ b/net/minecraft/server/BlockMushroom.java -@@ -3,6 +3,12 @@ - import java.util.Iterator; - import java.util.Random; - -+// CraftBukkit start -+import org.bukkit.TreeType; -+import org.bukkit.block.BlockState; -+import org.bukkit.event.block.BlockSpreadEvent; -+// CraftBukkit end -+ - public class BlockMushroom extends BlockPlant implements IBlockFragilePlantElement { - - protected BlockMushroom() { -@@ -13,6 +19,7 @@ - } - - public void b(World world, BlockPosition blockposition, IBlockData iblockdata, Random random) { -+ final int sourceX = blockposition.getX(), sourceY = blockposition.getY(), sourceZ = blockposition.getZ(); // CraftBukkit - if (random.nextInt(25) == 0) { - int i = 5; - boolean flag = true; -@@ -40,7 +47,19 @@ - } - - 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 - } - } - -@@ -69,8 +88,10 @@ - WorldGenHugeMushroom worldgenhugemushroom = null; - - if (this == Blocks.BROWN_MUSHROOM) { -+ BlockSapling.treeType = TreeType.BROWN_MUSHROOM; // CraftBukkit - worldgenhugemushroom = new WorldGenHugeMushroom(Blocks.BROWN_MUSHROOM_BLOCK); - } else if (this == Blocks.RED_MUSHROOM) { -+ BlockSapling.treeType = TreeType.RED_MUSHROOM; // CraftBukkit - worldgenhugemushroom = new WorldGenHugeMushroom(Blocks.RED_MUSHROOM_BLOCK); - } - diff --git a/TacoSpigot-Server/nms-patches/BlockMycel.patch b/TacoSpigot-Server/nms-patches/BlockMycel.patch deleted file mode 100644 index 472975d..0000000 --- a/TacoSpigot-Server/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()).getBlock().p() > 2) { -- world.setTypeUpdate(blockposition, Blocks.DIRT.getBlockData().set(BlockDirt.VARIANT, BlockDirt.EnumDirtVariant.DIRT)); -+ // CraftBukkit start -+ // world.setTypeUpdate(blockposition, Blocks.DIRT.getBlockData().set(BlockDirt.VARIANT, EnumDirtVariant.DIRT)); -+ org.bukkit.World bworld = world.getWorld(); -+ BlockState blockState = bworld.getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ()).getState(); -+ blockState.setType(CraftMagicNumbers.getMaterial(Blocks.DIRT)); -+ -+ BlockFadeEvent event = new BlockFadeEvent(blockState.getBlock(), blockState); -+ world.getServer().getPluginManager().callEvent(event); -+ -+ if (!event.isCancelled()) { -+ blockState.update(true); -+ } -+ // CraftBukkit end - } else { - if (world.getLightLevel(blockposition.up()) >= 9) { - for (int i = 0; i < 4; ++i) { -@@ -31,7 +50,19 @@ - Block block = world.getType(blockposition1.up()).getBlock(); - - if (iblockdata1.getBlock() == Blocks.DIRT && iblockdata1.get(BlockDirt.VARIANT) == BlockDirt.EnumDirtVariant.DIRT && world.getLightLevel(blockposition1.up()) >= 4 && block.p() <= 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/TacoSpigot-Server/nms-patches/BlockNetherWart.patch b/TacoSpigot-Server/nms-patches/BlockNetherWart.patch deleted file mode 100644 index 79e9888..0000000 --- a/TacoSpigot-Server/nms-patches/BlockNetherWart.patch +++ /dev/null @@ -1,12 +0,0 @@ ---- a/net/minecraft/server/BlockNetherWart.java -+++ b/net/minecraft/server/BlockNetherWart.java -@@ -29,7 +29,8 @@ - - if (i < 3 && random.nextInt(10) == 0) { - iblockdata = iblockdata.set(BlockNetherWart.AGE, Integer.valueOf(i + 1)); -- world.setTypeAndData(blockposition, iblockdata, 2); -+ // world.setTypeAndData(blockposition, iblockdata, 2); // CraftBukkit -+ org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockGrowEvent(world, blockposition.getX(), blockposition.getY(), blockposition.getZ(), this, toLegacyData(iblockdata)); // CraftBukkit - } - - super.b(world, blockposition, iblockdata, random); diff --git a/TacoSpigot-Server/nms-patches/BlockOre.patch b/TacoSpigot-Server/nms-patches/BlockOre.patch deleted file mode 100644 index 4522722..0000000 --- a/TacoSpigot-Server/nms-patches/BlockOre.patch +++ /dev/null @@ -1,45 +0,0 @@ ---- a/net/minecraft/server/BlockOre.java -+++ b/net/minecraft/server/BlockOre.java -@@ -37,6 +37,7 @@ - - public void dropNaturally(World world, BlockPosition blockposition, IBlockData iblockdata, float f, int i) { - super.dropNaturally(world, blockposition, iblockdata, f, i); -+ /* CraftBukkit start - Delegated to getExpDrop - if (this.getDropType(iblockdata, world.random, i) != Item.getItemOf(this)) { - int j = 0; - -@@ -54,9 +55,34 @@ - - this.dropExperience(world, blockposition, j); - } -+ // */ - - } - -+ @Override -+ public int getExpDrop(World world, IBlockData iblockdata, int i) { -+ if (this.getDropType(iblockdata, world.random, i) != Item.getItemOf(this)) { -+ int j = 0; -+ -+ if (this == Blocks.COAL_ORE) { -+ j = MathHelper.nextInt(world.random, 0, 2); -+ } else if (this == Blocks.DIAMOND_ORE) { -+ j = MathHelper.nextInt(world.random, 3, 7); -+ } else if (this == Blocks.EMERALD_ORE) { -+ j = MathHelper.nextInt(world.random, 3, 7); -+ } else if (this == Blocks.LAPIS_ORE) { -+ j = MathHelper.nextInt(world.random, 2, 5); -+ } else if (this == Blocks.QUARTZ_ORE) { -+ j = MathHelper.nextInt(world.random, 2, 5); -+ } -+ -+ return j; -+ } -+ -+ return 0; -+ // CraftBukkit end -+ } -+ - public int getDropData(World world, BlockPosition blockposition) { - return 0; - } diff --git a/TacoSpigot-Server/nms-patches/BlockPiston.patch b/TacoSpigot-Server/nms-patches/BlockPiston.patch deleted file mode 100644 index b19bcf4..0000000 --- a/TacoSpigot-Server/nms-patches/BlockPiston.patch +++ /dev/null @@ -1,102 +0,0 @@ ---- a/net/minecraft/server/BlockPiston.java -+++ b/net/minecraft/server/BlockPiston.java -@@ -2,6 +2,18 @@ - - import java.util.List; - -+// CraftBukkit start -+import java.util.AbstractList; -+import java.util.Collection; -+import java.util.Iterator; -+import java.util.ListIterator; -+ -+import com.google.common.collect.ImmutableList; -+import org.bukkit.craftbukkit.block.CraftBlock; -+import org.bukkit.event.block.BlockPistonRetractEvent; -+import org.bukkit.event.block.BlockPistonExtendEvent; -+// CraftBukkit end -+ - public class BlockPiston extends Block { - - public static final BlockStateDirection FACING = BlockStateDirection.of("facing"); -@@ -56,6 +68,17 @@ - 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.of(), CraftBlock.notchToBlockFace(enumdirection)); -+ world.getServer().getPluginManager().callEvent(event); -+ -+ if (event.isCancelled()) { -+ return; -+ } -+ } -+ // CraftBukkit end - world.setTypeAndData(blockposition, iblockdata.set(BlockPiston.EXTENDED, Boolean.valueOf(false)), 2); - world.playBlockAction(blockposition, this, 1, enumdirection.a()); - } -@@ -146,7 +169,7 @@ - } - } - -- if (!flag1 && block.getMaterial() != Material.AIR && a(block, world, blockposition1, enumdirection.opposite(), false) && (block.k() == 0 || block == Blocks.PISTON || block == Blocks.STICKY_PISTON)) { -+ if (!flag1 && a(block, world, blockposition1, enumdirection.opposite(), false) && (block.k() == 0 || block == Blocks.PISTON || block == Blocks.STICKY_PISTON)) { // CraftBukkit - remove 'block.getMaterial() != Material.AIR' condition - this.a(world, blockposition, enumdirection, false); - } - } else { -@@ -286,10 +309,53 @@ - if (!pistonextendschecker.a()) { - return false; - } else { -+ // CraftBukkit start -+ final org.bukkit.block.Block bblock = world.getWorld().getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ()); -+ -+ final List moved = pistonextendschecker.getMovedBlocks(); -+ final List broken = pistonextendschecker.getBrokenBlocks(); -+ -+ List blocks = new AbstractList() { -+ -+ @Override -+ public int size() { -+ return moved.size() + broken.size(); -+ } -+ -+ @Override -+ public org.bukkit.block.Block get(int index) { -+ if (index >= size() || index < 0) { -+ throw new ArrayIndexOutOfBoundsException(index); -+ } -+ BlockPosition pos = (BlockPosition) (index < moved.size() ? moved.get(index) : broken.get(index - moved.size())); -+ return bblock.getWorld().getBlockAt(pos.getX(), pos.getY(), pos.getZ()); -+ } -+ }; -+ - int i = list.size() + list1.size(); - Block[] ablock = new Block[i]; - EnumDirection enumdirection1 = flag ? enumdirection : enumdirection.opposite(); - -+ org.bukkit.event.block.BlockPistonEvent event; -+ if (flag) { -+ event = new BlockPistonExtendEvent(bblock, blocks, CraftBlock.notchToBlockFace(enumdirection1)); -+ } else { -+ event = new BlockPistonRetractEvent(bblock, blocks, CraftBlock.notchToBlockFace(enumdirection1)); -+ } -+ world.getServer().getPluginManager().callEvent(event); -+ -+ if (event.isCancelled()) { -+ for (BlockPosition b : broken) { -+ world.notify(b); -+ } -+ for (BlockPosition b : moved) { -+ world.notify(b); -+ world.notify(b.shift(enumdirection1)); -+ } -+ return false; -+ } -+ // CraftBukkit end -+ - int j; - BlockPosition blockposition1; - diff --git a/TacoSpigot-Server/nms-patches/BlockPlant.patch b/TacoSpigot-Server/nms-patches/BlockPlant.patch deleted file mode 100644 index 29fb3af..0000000 --- a/TacoSpigot-Server/nms-patches/BlockPlant.patch +++ /dev/null @@ -1,29 +0,0 @@ ---- a/net/minecraft/server/BlockPlant.java -+++ b/net/minecraft/server/BlockPlant.java -@@ -1,6 +1,10 @@ - package net.minecraft.server; - - import java.util.Random; -+// CraftBukkit start -+import org.bukkit.craftbukkit.util.CraftMagicNumbers; -+import org.bukkit.event.block.BlockPhysicsEvent; -+// CraftBukkit end - - public class BlockPlant extends Block { - -@@ -40,6 +44,15 @@ - - protected void e(World world, BlockPosition blockposition, IBlockData iblockdata) { - if (!this.f(world, blockposition, iblockdata)) { -+ // CraftBukkit Start -+ 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); -+ -+ if (event.isCancelled()) { -+ return; -+ } -+ // CraftBukkit end - this.b(world, blockposition, iblockdata, 0); - world.setTypeAndData(blockposition, Blocks.AIR.getBlockData(), 3); - } diff --git a/TacoSpigot-Server/nms-patches/BlockPortal.patch b/TacoSpigot-Server/nms-patches/BlockPortal.patch deleted file mode 100644 index d3d3a65..0000000 --- a/TacoSpigot-Server/nms-patches/BlockPortal.patch +++ /dev/null @@ -1,144 +0,0 @@ ---- a/net/minecraft/server/BlockPortal.java -+++ b/net/minecraft/server/BlockPortal.java -@@ -3,6 +3,9 @@ - import com.google.common.cache.LoadingCache; - import java.util.Random; - -+import org.bukkit.event.entity.EntityPortalEnterEvent; // CraftBukkit -+import org.bukkit.event.world.PortalCreateEvent; // CraftBukkit -+ - public class BlockPortal extends BlockHalfTransparent { - - public static final BlockStateEnum AXIS = BlockStateEnum.of("axis", EnumDirection.EnumAxis.class, new EnumDirection.EnumAxis[] { EnumDirection.EnumAxis.X, EnumDirection.EnumAxis.Z}); -@@ -25,7 +28,8 @@ - } - - if (i > 0 && !world.getType(blockposition1.up()).getBlock().isOccluding()) { -- Entity entity = ItemMonsterEgg.a(world, 57, (double) blockposition1.getX() + 0.5D, (double) blockposition1.getY() + 1.1D, (double) blockposition1.getZ() + 0.5D); -+ // CraftBukkit - set spawn reason to NETHER_PORTAL -+ Entity entity = ItemMonsterEgg.spawnCreature(world, 57, (double) blockposition1.getX() + 0.5D, (double) blockposition1.getY() + 1.1D, (double) blockposition1.getZ() + 0.5D, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.NETHER_PORTAL); - - if (entity != null) { - entity.portalCooldown = entity.aq(); -@@ -67,14 +71,16 @@ - BlockPortal.Shape blockportal_shape = new BlockPortal.Shape(world, blockposition, EnumDirection.EnumAxis.X); - - if (blockportal_shape.d() && blockportal_shape.e == 0) { -- blockportal_shape.createPortal(); -- return true; -+ // CraftBukkit start - return portalcreator -+ return blockportal_shape.createPortal(); -+ // return true; - } 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; - } -@@ -105,6 +111,10 @@ - - public void a(World world, BlockPosition blockposition, IBlockData iblockdata, Entity entity) { - if (entity.vehicle == null && entity.passenger == null) { -+ // CraftBukkit start - Entity in portal -+ EntityPortalEnterEvent event = new EntityPortalEnterEvent(entity.getBukkitEntity(), new org.bukkit.Location(world.getWorld(), blockposition.getX(), blockposition.getY(), blockposition.getZ())); -+ world.getServer().getPluginManager().callEvent(event); -+ // CraftBukkit end - entity.d(blockposition); - } - -@@ -185,6 +195,7 @@ - private BlockPosition position; - private int height; - private int width; -+ java.util.Collection blocks = new java.util.HashSet(); // CraftBukkit - add field - - public Shape(World world, BlockPosition blockposition, EnumDirection.EnumAxis enumdirection_enumaxis) { - this.a = world; -@@ -243,6 +254,10 @@ - } - - protected int c() { -+ // CraftBukkit start -+ this.blocks.clear(); -+ org.bukkit.World bworld = this.a.getWorld(); -+ // CraftBukkit end - int i; - - label56: -@@ -263,11 +278,21 @@ - block = this.a.getType(blockposition.shift(this.d)).getBlock(); - if (block != Blocks.OBSIDIAN) { - break label56; -+ // CraftBukkit start - add the block to our list -+ } else { -+ BlockPosition pos = blockposition.shift(this.d); -+ blocks.add(bworld.getBlockAt(pos.getX(), pos.getY(), pos.getZ())); -+ // CraftBukkit end - } - } else if (i == this.width - 1) { - block = this.a.getType(blockposition.shift(this.c)).getBlock(); - if (block != Blocks.OBSIDIAN) { - break label56; -+ // CraftBukkit start - add the block to our list -+ } else { -+ BlockPosition pos = blockposition.shift(this.c); -+ blocks.add(bworld.getBlockAt(pos.getX(), pos.getY(), pos.getZ())); -+ // CraftBukkit end - } - } - } -@@ -277,6 +302,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())); -+ // CraftBukkit end - } - } - -@@ -298,7 +328,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(); -+ -+ // Copy below for loop -+ for (int i = 0; i < this.width; ++i) { -+ BlockPosition blockposition = this.position.shift(this.c, i); -+ -+ for (int j = 0; j < this.height; ++j) { -+ BlockPosition pos = blockposition.up(j); -+ blocks.add(bworld.getBlockAt(pos.getX(), pos.getY(), pos.getZ())); -+ } -+ } -+ -+ PortalCreateEvent event = new PortalCreateEvent(blocks, bworld, PortalCreateEvent.CreateReason.FIRE); -+ this.a.getServer().getPluginManager().callEvent(event); -+ -+ if (event.isCancelled()) { -+ return false; -+ } -+ // CraftBukkit end - for (int i = 0; i < this.width; ++i) { - BlockPosition blockposition = this.position.shift(this.c, i); - -@@ -307,6 +357,7 @@ - } - } - -+ return true; // CraftBukkit - } - } - } diff --git a/TacoSpigot-Server/nms-patches/BlockPoweredRail.patch b/TacoSpigot-Server/nms-patches/BlockPoweredRail.patch deleted file mode 100644 index 61dcda6..0000000 --- a/TacoSpigot-Server/nms-patches/BlockPoweredRail.patch +++ /dev/null @@ -1,25 +0,0 @@ ---- a/net/minecraft/server/BlockPoweredRail.java -+++ b/net/minecraft/server/BlockPoweredRail.java -@@ -2,6 +2,8 @@ - - import com.google.common.base.Predicate; - -+import org.bukkit.craftbukkit.event.CraftEventFactory; // CraftBukkit -+ - public class BlockPoweredRail extends BlockMinecartTrackAbstract { - - public static final BlockStateEnum SHAPE = BlockStateEnum.a("shape", BlockMinecartTrackAbstract.EnumTrackPosition.class, new Predicate() { -@@ -116,6 +118,13 @@ - boolean flag1 = world.isBlockIndirectlyPowered(blockposition) || this.a(world, blockposition, iblockdata, true, 0) || this.a(world, blockposition, iblockdata, false, 0); - - if (flag1 != flag) { -+ // CraftBukkit start -+ int power = (Boolean)iblockdata.get(POWERED) ? 15 : 0; -+ int newPower = CraftEventFactory.callRedstoneChange(world, blockposition.getX(), blockposition.getY(), blockposition.getZ(), power, 15 - power).getNewCurrent(); -+ if (newPower == power) { -+ return; -+ } -+ // CraftBukkit end - world.setTypeAndData(blockposition, iblockdata.set(BlockPoweredRail.POWERED, Boolean.valueOf(flag1)), 3); - world.applyPhysics(blockposition.down(), this); - if (((BlockMinecartTrackAbstract.EnumTrackPosition) iblockdata.get(BlockPoweredRail.SHAPE)).c()) { diff --git a/TacoSpigot-Server/nms-patches/BlockPressurePlateAbstract.patch b/TacoSpigot-Server/nms-patches/BlockPressurePlateAbstract.patch deleted file mode 100644 index 1260c22..0000000 --- a/TacoSpigot-Server/nms-patches/BlockPressurePlateAbstract.patch +++ /dev/null @@ -1,31 +0,0 @@ ---- a/net/minecraft/server/BlockPressurePlateAbstract.java -+++ b/net/minecraft/server/BlockPressurePlateAbstract.java -@@ -2,6 +2,8 @@ - - import java.util.Random; - -+import org.bukkit.event.block.BlockRedstoneEvent; // CraftBukkit -+ - public abstract class BlockPressurePlateAbstract extends Block { - - protected BlockPressurePlateAbstract(Material material) { -@@ -99,6 +101,19 @@ - boolean flag = i > 0; - boolean flag1 = j > 0; - -+ // CraftBukkit start - Interact Pressure Plate -+ org.bukkit.World bworld = world.getWorld(); -+ org.bukkit.plugin.PluginManager manager = world.getServer().getPluginManager(); -+ -+ if (flag != flag1) { -+ BlockRedstoneEvent eventRedstone = new BlockRedstoneEvent(bworld.getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ()), i, j); -+ manager.callEvent(eventRedstone); -+ -+ flag1 = eventRedstone.getNewCurrent() > 0; -+ j = eventRedstone.getNewCurrent(); -+ } -+ // CraftBukkit end -+ - if (i != j) { - iblockdata = this.a(iblockdata, j); - world.setTypeAndData(blockposition, iblockdata, 2); diff --git a/TacoSpigot-Server/nms-patches/BlockPressurePlateBinary.patch b/TacoSpigot-Server/nms-patches/BlockPressurePlateBinary.patch deleted file mode 100644 index 37a87c1..0000000 --- a/TacoSpigot-Server/nms-patches/BlockPressurePlateBinary.patch +++ /dev/null @@ -1,38 +0,0 @@ ---- a/net/minecraft/server/BlockPressurePlateBinary.java -+++ b/net/minecraft/server/BlockPressurePlateBinary.java -@@ -3,6 +3,8 @@ - import java.util.Iterator; - import java.util.List; - -+import org.bukkit.event.entity.EntityInteractEvent; // CraftBukkit -+ - public class BlockPressurePlateBinary extends BlockPressurePlateAbstract { - - public static final BlockStateBoolean POWERED = BlockStateBoolean.of("powered"); -@@ -45,6 +47,26 @@ - while (iterator.hasNext()) { - Entity entity = (Entity) iterator.next(); - -+ // CraftBukkit start - Call interact event when turning on a pressure plate -+ if (this.e(world.getType(blockposition)) == 0) { -+ org.bukkit.World bworld = world.getWorld(); -+ org.bukkit.plugin.PluginManager manager = world.getServer().getPluginManager(); -+ org.bukkit.event.Cancellable cancellable; -+ -+ if (entity instanceof EntityHuman) { -+ cancellable = org.bukkit.craftbukkit.event.CraftEventFactory.callPlayerInteractEvent((EntityHuman) entity, org.bukkit.event.block.Action.PHYSICAL, blockposition, null, null); -+ } else { -+ cancellable = new EntityInteractEvent(entity.getBukkitEntity(), bworld.getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ())); -+ manager.callEvent((EntityInteractEvent) cancellable); -+ } -+ -+ // We only want to block turning the plate on if all events are cancelled -+ if (cancellable.isCancelled()) { -+ continue; -+ } -+ } -+ // CraftBukkit end -+ - if (!entity.aI()) { - return 15; - } diff --git a/TacoSpigot-Server/nms-patches/BlockPressurePlateWeighted.patch b/TacoSpigot-Server/nms-patches/BlockPressurePlateWeighted.patch deleted file mode 100644 index 4b1f6e2..0000000 --- a/TacoSpigot-Server/nms-patches/BlockPressurePlateWeighted.patch +++ /dev/null @@ -1,43 +0,0 @@ ---- a/net/minecraft/server/BlockPressurePlateWeighted.java -+++ b/net/minecraft/server/BlockPressurePlateWeighted.java -@@ -1,5 +1,7 @@ - package net.minecraft.server; - -+import org.bukkit.event.entity.EntityInteractEvent; // CraftBukkit -+ - public class BlockPressurePlateWeighted extends BlockPressurePlateAbstract { - - public static final BlockStateInteger POWER = BlockStateInteger.of("power", 0, 15); -@@ -16,7 +18,31 @@ - } - - protected int f(World world, BlockPosition blockposition) { -- int i = Math.min(world.a(Entity.class, this.getBoundingBox(blockposition)).size(), this.weight); -+ // CraftBukkit start -+ //int i = Math.min(world.a(Entity.class, this.a(blockposition)).size(), this.b); -+ int i = 0; -+ java.util.Iterator iterator = world.a(Entity.class, this.getBoundingBox(blockposition)).iterator(); -+ -+ while (iterator.hasNext()) { -+ Entity entity = (Entity) iterator.next(); -+ -+ org.bukkit.event.Cancellable cancellable; -+ -+ if (entity instanceof EntityHuman) { -+ cancellable = org.bukkit.craftbukkit.event.CraftEventFactory.callPlayerInteractEvent((EntityHuman) entity, org.bukkit.event.block.Action.PHYSICAL, blockposition, null, null); -+ } else { -+ cancellable = new EntityInteractEvent(entity.getBukkitEntity(), world.getWorld().getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ())); -+ world.getServer().getPluginManager().callEvent((EntityInteractEvent) cancellable); -+ } -+ -+ // We only want to block turning the plate on if all events are cancelled -+ if (!cancellable.isCancelled()) { -+ i++; -+ } -+ } -+ -+ i = Math.min(i, this.weight); -+ // CraftBukkit end - - if (i > 0) { - float f = (float) Math.min(this.weight, i) / (float) this.weight; diff --git a/TacoSpigot-Server/nms-patches/BlockPumpkin.patch b/TacoSpigot-Server/nms-patches/BlockPumpkin.patch deleted file mode 100644 index 224b1e9..0000000 --- a/TacoSpigot-Server/nms-patches/BlockPumpkin.patch +++ /dev/null @@ -1,80 +0,0 @@ ---- a/net/minecraft/server/BlockPumpkin.java -+++ b/net/minecraft/server/BlockPumpkin.java -@@ -2,6 +2,12 @@ - - import com.google.common.base.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 BlockPumpkin extends BlockDirectional { - - private ShapeDetector snowGolemPart; -@@ -40,17 +46,24 @@ - int j; - - if ((shapedetector_shapedetectorcollection = this.getDetectorSnowGolem().a(world, blockposition)) != null) { -+ BlockStateListPopulator blockList = new BlockStateListPopulator(world.getWorld()); // CraftBukkit - Use BlockStateListPopulator - for (i = 0; i < this.getDetectorSnowGolem().b(); ++i) { - ShapeDetectorBlock shapedetectorblock = 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(); - - for (j = 0; j < 120; ++j) { - world.addParticle(EnumParticle.SNOW_SHOVEL, (double) blockposition1.getX() + world.random.nextDouble(), (double) blockposition1.getY() + world.random.nextDouble() * 2.5D, (double) blockposition1.getZ() + world.random.nextDouble(), 0.0D, 0.0D, 0.0D, new int[0]); -@@ -61,10 +74,16 @@ - - world.update(shapedetectorblock1.getPosition(), Blocks.AIR); - } -+ } // CraftBukkit end - } else if ((shapedetector_shapedetectorcollection = this.getDetectorIronGolem().a(world, blockposition)) != null) { -+ BlockStateListPopulator blockList = new BlockStateListPopulator(world.getWorld()); // CraftBukkit - Use BlockStateListPopulator - for (i = 0; i < this.getDetectorIronGolem().c(); ++i) { - for (int k = 0; k < this.getDetectorIronGolem().b(); ++k) { -- world.setTypeAndData(shapedetector_shapedetectorcollection.a(i, k, 0).getPosition(), Blocks.AIR.getBlockData(), 2); -+ // CraftBukkit start -+ // world.setTypeAndData(shapedetectorcollection.a(i, k, 0).d(), Blocks.AIR.getBlockData(), 2); -+ BlockPosition pos = shapedetector_shapedetectorcollection.a(i, k, 0).getPosition(); -+ blockList.setTypeId(pos.getX(), pos.getY(), pos.getZ(), 0); -+ // CraftBukkit end - } - } - -@@ -73,7 +92,10 @@ - - 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(); - - for (j = 0; j < 120; ++j) { - world.addParticle(EnumParticle.SNOWBALL, (double) blockposition2.getX() + world.random.nextDouble(), (double) blockposition2.getY() + world.random.nextDouble() * 3.9D, (double) blockposition2.getZ() + world.random.nextDouble(), 0.0D, 0.0D, 0.0D, new int[0]); -@@ -86,6 +108,7 @@ - world.update(shapedetectorblock2.getPosition(), Blocks.AIR); - } - } -+ } // CraftBukkit end - } - - } diff --git a/TacoSpigot-Server/nms-patches/BlockRedstoneLamp.patch b/TacoSpigot-Server/nms-patches/BlockRedstoneLamp.patch deleted file mode 100644 index 1aec632..0000000 --- a/TacoSpigot-Server/nms-patches/BlockRedstoneLamp.patch +++ /dev/null @@ -1,47 +0,0 @@ ---- a/net/minecraft/server/BlockRedstoneLamp.java -+++ b/net/minecraft/server/BlockRedstoneLamp.java -@@ -2,6 +2,8 @@ - - import java.util.Random; - -+import org.bukkit.craftbukkit.event.CraftEventFactory; // CraftBukkit -+ - public class BlockRedstoneLamp extends Block { - - private final boolean a; -@@ -20,6 +22,11 @@ - if (this.a && !world.isBlockIndirectlyPowered(blockposition)) { - world.setTypeAndData(blockposition, Blocks.REDSTONE_LAMP.getBlockData(), 2); - } else if (!this.a && world.isBlockIndirectlyPowered(blockposition)) { -+ // CraftBukkit start -+ if (CraftEventFactory.callRedstoneChange(world, blockposition.getX(), blockposition.getY(), blockposition.getZ(), 0, 15).getNewCurrent() != 15) { -+ return; -+ } -+ // CraftBukkit end - world.setTypeAndData(blockposition, Blocks.LIT_REDSTONE_LAMP.getBlockData(), 2); - } - -@@ -31,6 +38,11 @@ - if (this.a && !world.isBlockIndirectlyPowered(blockposition)) { - world.a(blockposition, (Block) this, 4); - } else if (!this.a && world.isBlockIndirectlyPowered(blockposition)) { -+ // CraftBukkit start -+ if (CraftEventFactory.callRedstoneChange(world, blockposition.getX(), blockposition.getY(), blockposition.getZ(), 0, 15).getNewCurrent() != 15) { -+ return; -+ } -+ // CraftBukkit end - world.setTypeAndData(blockposition, Blocks.LIT_REDSTONE_LAMP.getBlockData(), 2); - } - -@@ -40,6 +52,11 @@ - public void b(World world, BlockPosition blockposition, IBlockData iblockdata, Random random) { - if (!world.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); - } - diff --git a/TacoSpigot-Server/nms-patches/BlockRedstoneOre.patch b/TacoSpigot-Server/nms-patches/BlockRedstoneOre.patch deleted file mode 100644 index f9614c7..0000000 --- a/TacoSpigot-Server/nms-patches/BlockRedstoneOre.patch +++ /dev/null @@ -1,101 +0,0 @@ ---- a/net/minecraft/server/BlockRedstoneOre.java -+++ b/net/minecraft/server/BlockRedstoneOre.java -@@ -2,6 +2,11 @@ - - import java.util.Random; - -+// CraftBukkit start -+import org.bukkit.craftbukkit.event.CraftEventFactory; -+import org.bukkit.event.entity.EntityInteractEvent; -+// CraftBukkit end -+ - public class BlockRedstoneOre extends Block { - - private final boolean a; -@@ -20,23 +25,44 @@ - } - - public void attack(World world, BlockPosition blockposition, EntityHuman entityhuman) { -- this.e(world, blockposition); -+ this.e(world, blockposition, entityhuman); // CraftBukkit - add entityhuman - super.attack(world, blockposition, entityhuman); - } - - public void a(World world, BlockPosition blockposition, Entity entity) { -- this.e(world, blockposition); -- super.a(world, blockposition, entity); -+ // CraftBukkit start -+ // this.e(world, blockposition); -+ // super.a(world, blockposition, entity); -+ if (entity instanceof EntityHuman) { -+ org.bukkit.event.player.PlayerInteractEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callPlayerInteractEvent((EntityHuman) entity, org.bukkit.event.block.Action.PHYSICAL, blockposition, null, null); -+ if (!event.isCancelled()) { -+ this.e(world, blockposition, entity); // add entity -+ super.a(world, blockposition, entity); -+ } -+ } else { -+ EntityInteractEvent event = new EntityInteractEvent(entity.getBukkitEntity(), world.getWorld().getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ())); -+ world.getServer().getPluginManager().callEvent(event); -+ if (!event.isCancelled()) { -+ this.e(world, blockposition, entity); // add entity -+ super.a(world, blockposition, entity); -+ } -+ } -+ // CraftBukkit end - } - - public boolean interact(World world, BlockPosition blockposition, IBlockData iblockdata, EntityHuman entityhuman, EnumDirection enumdirection, float f, float f1, float f2) { -- this.e(world, blockposition); -+ this.e(world, blockposition, entityhuman); // CraftBukkit - add entityhuman - return super.interact(world, blockposition, iblockdata, entityhuman, enumdirection, f, f1, f2); - } - -- private void e(World world, BlockPosition blockposition) { -+ private void e(World world, BlockPosition blockposition, Entity entity) { // CraftBukkit - add Entity - this.f(world, blockposition); - if (this == Blocks.REDSTONE_ORE) { -+ // CraftBukkit start -+ if (CraftEventFactory.callEntityChangeBlockEvent(entity, blockposition.getX(), blockposition.getY(), blockposition.getZ(), Blocks.LIT_REDSTONE_ORE, 0).isCancelled()) { -+ return; -+ } -+ // CraftBukkit end - world.setTypeUpdate(blockposition, Blocks.LIT_REDSTONE_ORE.getBlockData()); - } - -@@ -44,6 +70,11 @@ - - public void b(World world, BlockPosition blockposition, IBlockData iblockdata, Random random) { - if (this == Blocks.LIT_REDSTONE_ORE) { -+ // CraftBukkit start -+ if (CraftEventFactory.callBlockFadeEvent(world.getWorld().getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ()), Blocks.REDSTONE_ORE).isCancelled()) { -+ return; -+ } -+ // CraftBukkit end - world.setTypeUpdate(blockposition, Blocks.REDSTONE_ORE.getBlockData()); - } - -@@ -63,12 +94,24 @@ - - public void dropNaturally(World world, BlockPosition blockposition, IBlockData iblockdata, float f, int i) { - super.dropNaturally(world, blockposition, iblockdata, f, i); -+ /* CraftBukkit start - Delegated to getExpDrop - if (this.getDropType(iblockdata, world.random, i) != Item.getItemOf(this)) { - int j = 1 + world.random.nextInt(5); - - this.dropExperience(world, blockposition, j); - } -+ // */ -+ } - -+ @Override -+ public int getExpDrop(World world, IBlockData data, int i) { -+ if (this.getDropType(data, world.random, i) != Item.getItemOf(this)) { -+ int j = 1 + world.random.nextInt(5); -+ -+ return j; -+ } -+ return 0; -+ // CraftBukkit end - } - - private void f(World world, BlockPosition blockposition) { diff --git a/TacoSpigot-Server/nms-patches/BlockRedstoneTorch.patch b/TacoSpigot-Server/nms-patches/BlockRedstoneTorch.patch deleted file mode 100644 index 2eea0e7..0000000 --- a/TacoSpigot-Server/nms-patches/BlockRedstoneTorch.patch +++ /dev/null @@ -1,62 +0,0 @@ ---- a/net/minecraft/server/BlockRedstoneTorch.java -+++ b/net/minecraft/server/BlockRedstoneTorch.java -@@ -6,6 +6,8 @@ - import java.util.Map; - import java.util.Random; - -+import org.bukkit.event.block.BlockRedstoneEvent; // CraftBukkit -+ - public class BlockRedstoneTorch extends BlockTorch { - - private static Map> b = Maps.newHashMap(); -@@ -13,7 +15,7 @@ - - private boolean a(World world, BlockPosition blockposition, boolean flag) { - if (!BlockRedstoneTorch.b.containsKey(world)) { -- BlockRedstoneTorch.b.put(world, Lists.newArrayList()); -+ BlockRedstoneTorch.b.put(world, Lists.newArrayList()); // CraftBukkit - fix decompile error - } - - List list = (List) BlockRedstoneTorch.b.get(world); -@@ -96,8 +98,25 @@ - list.remove(0); - } - -+ // CraftBukkit start -+ org.bukkit.plugin.PluginManager manager = world.getServer().getPluginManager(); -+ org.bukkit.block.Block block = world.getWorld().getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ()); -+ int oldCurrent = this.isOn ? 15 : 0; -+ -+ BlockRedstoneEvent event = new BlockRedstoneEvent(block, oldCurrent, oldCurrent); -+ // CraftBukkit end -+ - if (this.isOn) { - if (flag) { -+ // CraftBukkit start -+ if (oldCurrent != 0) { -+ event.setNewCurrent(0); -+ manager.callEvent(event); -+ if (event.getNewCurrent() != 0) { -+ return; -+ } -+ } -+ // CraftBukkit end - world.setTypeAndData(blockposition, Blocks.UNLIT_REDSTONE_TORCH.getBlockData().set(BlockRedstoneTorch.FACING, iblockdata.get(BlockRedstoneTorch.FACING)), 3); - if (this.a(world, blockposition, true)) { - world.makeSound((double) ((float) blockposition.getX() + 0.5F), (double) ((float) blockposition.getY() + 0.5F), (double) ((float) blockposition.getZ() + 0.5F), "random.fizz", 0.5F, 2.6F + (world.random.nextFloat() - world.random.nextFloat()) * 0.8F); -@@ -114,6 +133,15 @@ - } - } - } else if (!flag && !this.a(world, blockposition, false)) { -+ // CraftBukkit start -+ if (oldCurrent != 15) { -+ event.setNewCurrent(15); -+ manager.callEvent(event); -+ if (event.getNewCurrent() != 15) { -+ return; -+ } -+ } -+ // CraftBukkit end - world.setTypeAndData(blockposition, Blocks.REDSTONE_TORCH.getBlockData().set(BlockRedstoneTorch.FACING, iblockdata.get(BlockRedstoneTorch.FACING)), 3); - } - diff --git a/TacoSpigot-Server/nms-patches/BlockRedstoneWire.patch b/TacoSpigot-Server/nms-patches/BlockRedstoneWire.patch deleted file mode 100644 index ffd86e1..0000000 --- a/TacoSpigot-Server/nms-patches/BlockRedstoneWire.patch +++ /dev/null @@ -1,27 +0,0 @@ ---- a/net/minecraft/server/BlockRedstoneWire.java -+++ b/net/minecraft/server/BlockRedstoneWire.java -@@ -8,6 +8,8 @@ - import java.util.Random; - import java.util.Set; - -+import org.bukkit.event.block.BlockRedstoneEvent; // CraftBukkit -+ - public class BlockRedstoneWire extends Block { - - public static final BlockStateEnum NORTH = BlockStateEnum.of("north", BlockRedstoneWire.EnumRedstoneWireConnection.class); -@@ -124,6 +126,15 @@ - j = k; - } - -+ // CraftBukkit start -+ if (i != j) { -+ BlockRedstoneEvent event = new BlockRedstoneEvent(world.getWorld().getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ()), i, j); -+ world.getServer().getPluginManager().callEvent(event); -+ -+ j = event.getNewCurrent(); -+ } -+ // CraftBukkit end -+ - if (i != j) { - iblockdata = iblockdata.set(BlockRedstoneWire.POWER, Integer.valueOf(j)); - if (world.getType(blockposition) == iblockdata1) { diff --git a/TacoSpigot-Server/nms-patches/BlockReed.patch b/TacoSpigot-Server/nms-patches/BlockReed.patch deleted file mode 100644 index 6b9939e..0000000 --- a/TacoSpigot-Server/nms-patches/BlockReed.patch +++ /dev/null @@ -1,16 +0,0 @@ ---- a/net/minecraft/server/BlockReed.java -+++ b/net/minecraft/server/BlockReed.java -@@ -29,8 +29,12 @@ - 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); - } diff --git a/TacoSpigot-Server/nms-patches/BlockSapling.patch b/TacoSpigot-Server/nms-patches/BlockSapling.patch deleted file mode 100644 index bdb4074..0000000 --- a/TacoSpigot-Server/nms-patches/BlockSapling.patch +++ /dev/null @@ -1,125 +0,0 @@ ---- a/net/minecraft/server/BlockSapling.java -+++ b/net/minecraft/server/BlockSapling.java -@@ -2,10 +2,20 @@ - - import java.util.Random; - -+// CraftBukkit start -+import java.util.List; -+ -+import org.bukkit.Location; -+import org.bukkit.TreeType; -+import org.bukkit.block.BlockState; -+import org.bukkit.event.world.StructureGrowEvent; -+// CraftBukkit end -+ - public class BlockSapling extends BlockPlant implements IBlockFragilePlantElement { - - public static final BlockStateEnum TYPE = BlockStateEnum.of("type", BlockWood.EnumLogVariant.class); - public static final BlockStateInteger STAGE = BlockStateInteger.of("stage", 0, 1); -+ public static TreeType treeType; // CraftBukkit - - protected BlockSapling() { - this.j(this.blockStateList.getBlockData().set(BlockSapling.TYPE, BlockWood.EnumLogVariant.OAK).set(BlockSapling.STAGE, Integer.valueOf(0))); -@@ -23,7 +33,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 blocks = (List) world.capturedBlockStates.clone(); -+ world.capturedBlockStates.clear(); -+ StructureGrowEvent event = null; -+ if (treeType != null) { -+ event = new StructureGrowEvent(location, treeType, false, null, blocks); -+ org.bukkit.Bukkit.getPluginManager().callEvent(event); -+ } -+ if (event == null || !event.isCancelled()) { -+ for (BlockState blockstate : blocks) { -+ blockstate.update(true); -+ } -+ } -+ } -+ // CraftBukkit end - } - - } -@@ -39,7 +72,17 @@ - } - - public void e(World world, BlockPosition blockposition, IBlockData iblockdata, Random random) { -- Object object = random.nextInt(10) == 0 ? new WorldGenBigTree(true) : new WorldGenTrees(true); -+ // CraftBukkit start - Turn ternary operator into if statement to set treeType -+ // Object object = random.nextInt(10) == 0 ? new WorldGenBigTree(true) : new WorldGenTrees(true); -+ Object object; -+ if (random.nextInt(10) == 0) { -+ treeType = TreeType.BIG_TREE; -+ object = new WorldGenBigTree(true); -+ } else { -+ treeType = TreeType.TREE; -+ object = new WorldGenTrees(true); -+ } -+ // CraftBukkit end - int i = 0; - int j = 0; - boolean flag = false; -@@ -51,6 +94,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; -@@ -61,11 +105,13 @@ - if (!flag) { - j = 0; - i = 0; -+ treeType = TreeType.REDWOOD; // CraftBukkit - object = new WorldGenTaiga2(true); - } - break; - - case 2: -+ treeType = TreeType.BIRCH; // CraftBukkit - object = new WorldGenForest(true, false); - break; - -@@ -77,6 +123,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; -@@ -87,11 +134,13 @@ - if (!flag) { - j = 0; - i = 0; -+ treeType = TreeType.SMALL_JUNGLE; // CraftBukkit - object = new WorldGenTrees(true, 4 + random.nextInt(7), iblockdata1, iblockdata2, false); - } - break; - - case 4: -+ treeType = TreeType.ACACIA; // CraftBukkit - object = new WorldGenAcaciaTree(true); - break; - -@@ -100,6 +149,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/TacoSpigot-Server/nms-patches/BlockSkull.patch b/TacoSpigot-Server/nms-patches/BlockSkull.patch deleted file mode 100644 index 84c1dc2..0000000 --- a/TacoSpigot-Server/nms-patches/BlockSkull.patch +++ /dev/null @@ -1,120 +0,0 @@ ---- a/net/minecraft/server/BlockSkull.java -+++ b/net/minecraft/server/BlockSkull.java -@@ -4,6 +4,11 @@ - import java.util.Iterator; - import java.util.Random; - -+// CraftBukkit start -+import org.bukkit.craftbukkit.util.BlockStateListPopulator; -+import org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason; -+// CraftBukkit end -+ - public class BlockSkull extends BlockContainer { - - public static final BlockStateDirection FACING = BlockStateDirection.of("facing"); -@@ -81,8 +86,26 @@ - - return tileentity instanceof TileEntitySkull ? ((TileEntitySkull) tileentity).getSkullType() : super.getDropData(world, blockposition); - } -+ -+ // CraftBukkit start - Special case dropping so we can get info from the tile entity -+ @Override -+ public void dropNaturally(World world, BlockPosition blockposition, IBlockData iblockdata, float f, int i) { -+ if (world.random.nextFloat() < f) { -+ ItemStack itemstack = new ItemStack(Items.SKULL, 1, this.getDropData(world, blockposition)); -+ TileEntitySkull tileentityskull = (TileEntitySkull) world.getTileEntity(blockposition); -+ -+ if (tileentityskull.getSkullType() == 3 && tileentityskull.getGameProfile() != null) { -+ itemstack.setTag(new NBTTagCompound()); -+ NBTTagCompound nbttagcompound = new NBTTagCompound(); -+ -+ GameProfileSerializer.serialize(nbttagcompound, tileentityskull.getGameProfile()); -+ itemstack.getTag().set("SkullOwner", nbttagcompound); -+ } - -- public void dropNaturally(World world, BlockPosition blockposition, IBlockData iblockdata, float f, int i) {} -+ a(world, blockposition, itemstack); -+ } -+ } -+ // CraftBukkit end - - public void a(World world, BlockPosition blockposition, IBlockData iblockdata, EntityHuman entityhuman) { - if (entityhuman.abilities.canInstantlyBuild) { -@@ -95,7 +118,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 +153,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.n(); - 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 +195,16 @@ - entitywither.n(); - Iterator iterator = world.a(EntityHuman.class, entitywither.getBoundingBox().grow(50.0D, 50.0D, 50.0D)).iterator(); - -+ // CraftBukkit start -+ if (world.addEntity(entitywither, SpawnReason.BUILD_WITHER)) { -+ blockList.updateList(); -+ - while (iterator.hasNext()) { - EntityHuman entityhuman = (EntityHuman) iterator.next(); - - entityhuman.b((Statistic) AchievementList.I); - } - -- world.addEntity(entitywither); -- - int k; - - for (k = 0; k < 120; ++k) { -@@ -178,6 +218,7 @@ - world.update(shapedetectorblock2.getPosition(), Blocks.AIR); - } - } -+ } // CraftBukkit end - - } - } diff --git a/TacoSpigot-Server/nms-patches/BlockSnow.patch b/TacoSpigot-Server/nms-patches/BlockSnow.patch deleted file mode 100644 index 19b864a..0000000 --- a/TacoSpigot-Server/nms-patches/BlockSnow.patch +++ /dev/null @@ -1,14 +0,0 @@ ---- a/net/minecraft/server/BlockSnow.java -+++ b/net/minecraft/server/BlockSnow.java -@@ -85,6 +85,11 @@ - - public void b(World world, BlockPosition blockposition, IBlockData iblockdata, Random random) { - if (world.b(EnumSkyBlock.BLOCK, blockposition) > 11) { -+ // CraftBukkit start -+ if (org.bukkit.craftbukkit.event.CraftEventFactory.callBlockFadeEvent(world.getWorld().getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ()), Blocks.AIR).isCancelled()) { -+ return; -+ } -+ // CraftBukkit end - this.b(world, blockposition, world.getType(blockposition), 0); - world.setAir(blockposition); - } diff --git a/TacoSpigot-Server/nms-patches/BlockSoil.patch b/TacoSpigot-Server/nms-patches/BlockSoil.patch deleted file mode 100644 index 6490edd..0000000 --- a/TacoSpigot-Server/nms-patches/BlockSoil.patch +++ /dev/null @@ -1,64 +0,0 @@ ---- a/net/minecraft/server/BlockSoil.java -+++ b/net/minecraft/server/BlockSoil.java -@@ -3,6 +3,11 @@ - import java.util.Iterator; - import java.util.Random; - -+// CraftBukkit start -+import org.bukkit.event.entity.EntityInteractEvent; -+import org.bukkit.craftbukkit.event.CraftEventFactory; -+// CraftBukkit end -+ - public class BlockSoil extends Block { - - public static final BlockStateInteger MOISTURE = BlockStateInteger.of("moisture", 0, 7); -@@ -34,6 +39,12 @@ - if (i > 0) { - world.setTypeAndData(blockposition, iblockdata.set(BlockSoil.MOISTURE, Integer.valueOf(i - 1)), 2); - } else if (!this.e(world, blockposition)) { -+ // CraftBukkit start -+ org.bukkit.block.Block block = world.getWorld().getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ()); -+ if (CraftEventFactory.callBlockFadeEvent(block, Blocks.DIRT).isCancelled()) { -+ return; -+ } -+ // CraftBukkit end - world.setTypeUpdate(blockposition, Blocks.DIRT.getBlockData()); - } - } else if (i < 7) { -@@ -43,16 +54,35 @@ - } - - public void fallOn(World world, BlockPosition blockposition, Entity entity, float f) { -+ super.fallOn(world, blockposition, entity, f); // CraftBukkit - moved here as game rules / events shouldn't affect fall damage. - if (entity instanceof EntityLiving) { - if (!world.isClientSide && world.random.nextFloat() < f - 0.5F) { - if (!(entity instanceof EntityHuman) && !world.getGameRules().getBoolean("mobGriefing")) { - return; - } - -+ // CraftBukkit start - Interact soil -+ org.bukkit.event.Cancellable cancellable; -+ if (entity instanceof EntityHuman) { -+ cancellable = CraftEventFactory.callPlayerInteractEvent((EntityHuman) entity, org.bukkit.event.block.Action.PHYSICAL, blockposition, null, null); -+ } else { -+ cancellable = new EntityInteractEvent(entity.getBukkitEntity(), world.getWorld().getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ())); -+ world.getServer().getPluginManager().callEvent((EntityInteractEvent) cancellable); -+ } -+ -+ if (cancellable.isCancelled()) { -+ return; -+ } -+ -+ if (CraftEventFactory.callEntityChangeBlockEvent(entity, blockposition.getX(), blockposition.getY(), blockposition.getZ(), Blocks.DIRT, 0).isCancelled()) { -+ return; -+ } -+ // CraftBukkit end -+ - world.setTypeUpdate(blockposition, Blocks.DIRT.getBlockData()); - } - -- super.fallOn(world, blockposition, entity, f); -+ // super.fallOn(world, blockposition, entity, f); // CraftBukkit - moved up - } - } - diff --git a/TacoSpigot-Server/nms-patches/BlockStationary.patch b/TacoSpigot-Server/nms-patches/BlockStationary.patch deleted file mode 100644 index f58767b..0000000 --- a/TacoSpigot-Server/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) { -@@ -41,6 +43,13 @@ - - if (block.material == Material.AIR) { - if (this.f(world, blockposition1)) { -+ // CraftBukkit start - Prevent lava putting something on fire -+ if (world.getType(blockposition1) != Blocks.FIRE) { -+ if (CraftEventFactory.callBlockIgniteEvent(world, blockposition1.getX(), blockposition1.getY(), blockposition1.getZ(), blockposition.getX(), blockposition.getY(), blockposition.getZ()).isCancelled()) { -+ continue; -+ } -+ } -+ // CraftBukkit end - world.setTypeUpdate(blockposition1, Blocks.FIRE.getBlockData()); - return; - } -@@ -53,6 +62,14 @@ - BlockPosition blockposition2 = blockposition.a(random.nextInt(3) - 1, 0, random.nextInt(3) - 1); - - if (world.isEmpty(blockposition2.up()) && this.m(world, blockposition2)) { -+ // CraftBukkit start - Prevent lava putting something on fire -+ BlockPosition up = blockposition2.up(); -+ if (world.getType(up) != Blocks.FIRE) { -+ if (CraftEventFactory.callBlockIgniteEvent(world, up.getX(), up.getY(), up.getZ(), blockposition.getX(), blockposition.getY(), blockposition.getZ()).isCancelled()) { -+ continue; -+ } -+ } -+ // CraftBukkit end - world.setTypeUpdate(blockposition2.up(), Blocks.FIRE.getBlockData()); - } - } diff --git a/TacoSpigot-Server/nms-patches/BlockStem.patch b/TacoSpigot-Server/nms-patches/BlockStem.patch deleted file mode 100644 index df06ccf..0000000 --- a/TacoSpigot-Server/nms-patches/BlockStem.patch +++ /dev/null @@ -1,41 +0,0 @@ ---- a/net/minecraft/server/BlockStem.java -+++ b/net/minecraft/server/BlockStem.java -@@ -4,6 +4,8 @@ - import java.util.Iterator; - import java.util.Random; - -+import org.bukkit.craftbukkit.event.CraftEventFactory; // CraftBukkit -+ - public class BlockStem extends BlockPlant implements IBlockFragilePlantElement { - - public static final BlockStateInteger AGE = BlockStateInteger.of("age", 0, 7); -@@ -58,7 +60,8 @@ - - if (i < 7) { - iblockdata = iblockdata.set(BlockStem.AGE, Integer.valueOf(i + 1)); -- world.setTypeAndData(blockposition, iblockdata, 2); -+ // world.setTypeAndData(blockposition, iblockdata, 2); // CraftBukkit -+ CraftEventFactory.handleBlockGrowEvent(world, blockposition.getX(), blockposition.getY(), blockposition.getZ(), this, toLegacyData(iblockdata)); // CraftBukkit - } else { - Iterator iterator = EnumDirection.EnumDirectionLimit.HORIZONTAL.iterator(); - -@@ -74,7 +77,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 - } - } - } -@@ -85,7 +89,8 @@ - public void g(World world, BlockPosition blockposition, IBlockData iblockdata) { - int i = ((Integer) iblockdata.get(BlockStem.AGE)).intValue() + MathHelper.nextInt(world.random, 2, 5); - -- world.setTypeAndData(blockposition, iblockdata.set(BlockStem.AGE, Integer.valueOf(Math.min(7, i))), 2); -+ // world.setTypeAndData(blockposition, iblockdata.set(BlockStem.AGE, Integer.valueOf(Math.min(7, i))), 2); -+ CraftEventFactory.handleBlockGrowEvent(world, blockposition.getX(), blockposition.getY(), blockposition.getZ(), this, Math.min(7, i)); // CraftBukkit - } - - public void j() { diff --git a/TacoSpigot-Server/nms-patches/BlockTrapdoor.patch b/TacoSpigot-Server/nms-patches/BlockTrapdoor.patch deleted file mode 100644 index 595644f..0000000 --- a/TacoSpigot-Server/nms-patches/BlockTrapdoor.patch +++ /dev/null @@ -1,31 +0,0 @@ ---- a/net/minecraft/server/BlockTrapdoor.java -+++ b/net/minecraft/server/BlockTrapdoor.java -@@ -2,6 +2,8 @@ - - import com.google.common.base.Predicate; - -+import org.bukkit.event.block.BlockRedstoneEvent; // CraftBukkit -+ - public class BlockTrapdoor extends Block { - - public static final BlockStateDirection FACING = BlockStateDirection.of("facing", (Predicate) EnumDirection.EnumDirectionLimit.HORIZONTAL); -@@ -101,6 +103,19 @@ - boolean flag = world.isBlockIndirectlyPowered(blockposition); - - if (flag || block.isPowerSource()) { -+ // CraftBukkit start -+ org.bukkit.World bworld = world.getWorld(); -+ org.bukkit.block.Block bblock = bworld.getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ()); -+ -+ int power = bblock.getBlockPower(); -+ int oldPower = (Boolean) iblockdata.get(OPEN) ? 15 : 0; -+ -+ if (oldPower == 0 ^ power == 0 || block.isPowerSource()) { -+ BlockRedstoneEvent eventRedstone = new BlockRedstoneEvent(bblock, oldPower, power); -+ world.getServer().getPluginManager().callEvent(eventRedstone); -+ flag = eventRedstone.getNewCurrent() > 0; -+ } -+ // CraftBukkit end - boolean flag1 = ((Boolean) iblockdata.get(BlockTrapdoor.OPEN)).booleanValue(); - - if (flag1 != flag) { diff --git a/TacoSpigot-Server/nms-patches/BlockTripwire.patch b/TacoSpigot-Server/nms-patches/BlockTripwire.patch deleted file mode 100644 index 524e1a7..0000000 --- a/TacoSpigot-Server/nms-patches/BlockTripwire.patch +++ /dev/null @@ -1,52 +0,0 @@ ---- a/net/minecraft/server/BlockTripwire.java -+++ b/net/minecraft/server/BlockTripwire.java -@@ -4,6 +4,8 @@ - import java.util.List; - import java.util.Random; - -+import org.bukkit.event.entity.EntityInteractEvent; // CraftBukkit -+ - public class BlockTripwire extends Block { - - public static final BlockStateBoolean POWERED = BlockStateBoolean.of("powered"); -@@ -155,6 +157,40 @@ - } - } - -+ // CraftBukkit start - Call interact even when triggering connected tripwire -+ if (flag != flag1 && flag1 && (Boolean)iblockdata.get(ATTACHED)) { -+ org.bukkit.World bworld = world.getWorld(); -+ org.bukkit.plugin.PluginManager manager = world.getServer().getPluginManager(); -+ org.bukkit.block.Block block = bworld.getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ()); -+ boolean allowed = false; -+ -+ // If all of the events are cancelled block the tripwire trigger, else allow -+ for (Object object : list) { -+ if (object != null) { -+ org.bukkit.event.Cancellable cancellable; -+ -+ if (object instanceof EntityHuman) { -+ cancellable = org.bukkit.craftbukkit.event.CraftEventFactory.callPlayerInteractEvent((EntityHuman) object, org.bukkit.event.block.Action.PHYSICAL, blockposition, null, null); -+ } else if (object instanceof Entity) { -+ cancellable = new EntityInteractEvent(((Entity) object).getBukkitEntity(), block); -+ manager.callEvent((EntityInteractEvent) cancellable); -+ } else { -+ continue; -+ } -+ -+ if (!cancellable.isCancelled()) { -+ allowed = true; -+ break; -+ } -+ } -+ } -+ -+ if (!allowed) { -+ return; -+ } -+ } -+ // CraftBukkit end -+ - if (flag1 != flag) { - iblockdata = iblockdata.set(BlockTripwire.POWERED, Boolean.valueOf(flag1)); - world.setTypeAndData(blockposition, iblockdata, 3); diff --git a/TacoSpigot-Server/nms-patches/BlockTripwireHook.patch b/TacoSpigot-Server/nms-patches/BlockTripwireHook.patch deleted file mode 100644 index d67644a..0000000 --- a/TacoSpigot-Server/nms-patches/BlockTripwireHook.patch +++ /dev/null @@ -1,29 +0,0 @@ ---- a/net/minecraft/server/BlockTripwireHook.java -+++ b/net/minecraft/server/BlockTripwireHook.java -@@ -5,6 +5,8 @@ - import java.util.Iterator; - import java.util.Random; - -+import org.bukkit.event.block.BlockRedstoneEvent; // CraftBukkit -+ - public class BlockTripwireHook extends Block { - - public static final BlockStateDirection FACING = BlockStateDirection.of("facing", (Predicate) EnumDirection.EnumDirectionLimit.HORIZONTAL); -@@ -141,6 +143,17 @@ - this.a(world, blockposition1, flag5, flag6, flag2, flag3); - } - -+ // CraftBukkit start -+ org.bukkit.block.Block block = world.getWorld().getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ()); -+ -+ BlockRedstoneEvent eventRedstone = new BlockRedstoneEvent(block, 15, 0); -+ world.getServer().getPluginManager().callEvent(eventRedstone); -+ -+ if (eventRedstone.getNewCurrent() > 0) { -+ return; -+ } -+ // CraftBukkit end -+ - this.a(world, blockposition, flag5, flag6, flag2, flag3); - if (!flag) { - world.setTypeAndData(blockposition, iblockdata3.set(BlockTripwireHook.FACING, enumdirection), 3); diff --git a/TacoSpigot-Server/nms-patches/BlockVine.patch b/TacoSpigot-Server/nms-patches/BlockVine.patch deleted file mode 100644 index e377c24..0000000 --- a/TacoSpigot-Server/nms-patches/BlockVine.patch +++ /dev/null @@ -1,75 +0,0 @@ ---- a/net/minecraft/server/BlockVine.java -+++ b/net/minecraft/server/BlockVine.java -@@ -3,6 +3,8 @@ - import java.util.Iterator; - import java.util.Random; - -+import org.bukkit.craftbukkit.event.CraftEventFactory; // CraftBukkit -+ - public class BlockVine extends Block { - - public static final BlockStateBoolean UP = BlockStateBoolean.of("up"); -@@ -200,7 +202,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 - } - - } -@@ -220,17 +228,29 @@ - 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()); -+ - if (flag1 && this.c(world.getType(blockposition3).getBlock())) { -- world.setTypeAndData(blockposition2, this.getBlockData().set(getDirection(enumdirection1), Boolean.valueOf(true)), 2); -+ // world.setTypeAndData(blockposition2, this.getBlockData().set(a(enumdirection1), Boolean.valueOf(true)), 2); -+ CraftEventFactory.handleBlockSpreadEvent(bukkitBlock, source, this, toLegacyData(this.getBlockData().set(getDirection(enumdirection1), Boolean.valueOf(true)))); - } else if (flag2 && this.c(world.getType(blockposition4).getBlock())) { -- world.setTypeAndData(blockposition2, this.getBlockData().set(getDirection(enumdirection2), Boolean.valueOf(true)), 2); -+ // world.setTypeAndData(blockposition2, this.getBlockData().set(a(enumdirection2), Boolean.valueOf(true)), 2); -+ CraftEventFactory.handleBlockSpreadEvent(bukkitBlock, source, this, toLegacyData(this.getBlockData().set(getDirection(enumdirection2), Boolean.valueOf(true)))); - } else if (flag1 && world.isEmpty(blockposition3) && this.c(world.getType(blockposition.shift(enumdirection1)).getBlock())) { -- world.setTypeAndData(blockposition3, this.getBlockData().set(getDirection(enumdirection.opposite()), Boolean.valueOf(true)), 2); -+ // world.setTypeAndData(blockposition3, this.getBlockData().set(a(enumdirection.opposite()), Boolean.valueOf(true)), 2); -+ bukkitBlock = world.getWorld().getBlockAt(blockposition3.getX(), blockposition3.getY(), blockposition3.getZ()); -+ CraftEventFactory.handleBlockSpreadEvent(bukkitBlock, source, this, toLegacyData(this.getBlockData().set(getDirection(enumdirection.opposite()), Boolean.valueOf(true)))); - } else if (flag2 && world.isEmpty(blockposition4) && this.c(world.getType(blockposition.shift(enumdirection2)).getBlock())) { -- world.setTypeAndData(blockposition4, this.getBlockData().set(getDirection(enumdirection.opposite()), Boolean.valueOf(true)), 2); -+ // world.setTypeAndData(blockposition4, this.getBlockData().set(a(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)))); - } else if (this.c(world.getType(blockposition2.up()).getBlock())) { -- world.setTypeAndData(blockposition2, this.getBlockData(), 2); -+ // world.setTypeAndData(blockposition2, this.getBlockData(), 2); -+ CraftEventFactory.handleBlockSpreadEvent(bukkitBlock, source, this, toLegacyData(this.getBlockData())); - } -+ // CraftBukkit end - } else if (block.material.k() && block.d()) { - world.setTypeAndData(blockposition, iblockdata.set(getDirection(enumdirection), Boolean.valueOf(true)), 2); - } -@@ -257,7 +277,12 @@ - } - - if (((Boolean) iblockdata3.get(BlockVine.NORTH)).booleanValue() || ((Boolean) iblockdata3.get(BlockVine.EAST)).booleanValue() || ((Boolean) iblockdata3.get(BlockVine.SOUTH)).booleanValue() || ((Boolean) iblockdata3.get(BlockVine.WEST)).booleanValue()) { -- world.setTypeAndData(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 (block1 == this) { - iblockdata3 = iblockdata2; diff --git a/TacoSpigot-Server/nms-patches/ChatBaseComponent.patch b/TacoSpigot-Server/nms-patches/ChatBaseComponent.patch deleted file mode 100644 index 308ddf9..0000000 --- a/TacoSpigot-Server/nms-patches/ChatBaseComponent.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- a/net/minecraft/server/ChatBaseComponent.java -+++ b/net/minecraft/server/ChatBaseComponent.java -@@ -111,7 +111,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/TacoSpigot-Server/nms-patches/ChatModifier.patch b/TacoSpigot-Server/nms-patches/ChatModifier.patch deleted file mode 100644 index a91ca87..0000000 --- a/TacoSpigot-Server/nms-patches/ChatModifier.patch +++ /dev/null @@ -1,44 +0,0 @@ ---- a/net/minecraft/server/ChatModifier.java -+++ b/net/minecraft/server/ChatModifier.java -@@ -254,16 +254,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; - } - -@@ -429,11 +431,11 @@ - } - } - -- 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); - } - -- 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/TacoSpigot-Server/nms-patches/Chunk.patch b/TacoSpigot-Server/nms-patches/Chunk.patch deleted file mode 100644 index 9ccf30c..0000000 --- a/TacoSpigot-Server/nms-patches/Chunk.patch +++ /dev/null @@ -1,153 +0,0 @@ ---- a/net/minecraft/server/Chunk.java -+++ b/net/minecraft/server/Chunk.java -@@ -14,6 +14,9 @@ - import org.apache.logging.log4j.LogManager; - import org.apache.logging.log4j.Logger; - -+import com.google.common.collect.Lists; // CraftBukkit -+import org.bukkit.Bukkit; // CraftBukkit -+ - public class Chunk { - - private static final Logger c = LogManager.getLogger(); -@@ -40,6 +43,34 @@ - private int v; - private ConcurrentLinkedQueue w; - -+ // CraftBukkit start - Neighbor loaded cache for chunk lighting and entity ticking -+ private int neighbors = 0x1 << 12; -+ -+ public boolean areNeighborsLoaded(final int radius) { -+ switch (radius) { -+ case 2: -+ return this.neighbors == Integer.MAX_VALUE >> 6; -+ case 1: -+ final int mask = -+ // x z offset x z offset x z offset -+ (0x1 << (1 * 5 + 1 + 12)) | (0x1 << (0 * 5 + 1 + 12)) | (0x1 << (-1 * 5 + 1 + 12)) | -+ (0x1 << (1 * 5 + 0 + 12)) | (0x1 << (0 * 5 + 0 + 12)) | (0x1 << (-1 * 5 + 0 + 12)) | -+ (0x1 << (1 * 5 + -1 + 12)) | (0x1 << (0 * 5 + -1 + 12)) | (0x1 << (-1 * 5 + -1 + 12)); -+ return (this.neighbors & mask) == mask; -+ default: -+ throw new UnsupportedOperationException(String.valueOf(radius)); -+ } -+ } -+ -+ public void setNeighborLoaded(final int x, final int z) { -+ this.neighbors |= 0x1 << (x * 5 + 12 + z); -+ } -+ -+ public void setNeighborUnloaded(final int x, final int z) { -+ this.neighbors &= ~(0x1 << (x * 5 + 12 + z)); -+ } -+ // CraftBukkit end -+ - public Chunk(World world, int i, int j) { - this.sections = new ChunkSection[16]; - this.e = new byte[256]; -@@ -60,8 +91,17 @@ - - Arrays.fill(this.f, -999); - Arrays.fill(this.e, (byte) -1); -+ -+ // CraftBukkit start -+ if (!(this instanceof EmptyChunk)) { -+ this.bukkitChunk = new org.bukkit.craftbukkit.CraftChunk(this); -+ } - } - -+ public org.bukkit.Chunk bukkitChunk; -+ public boolean mustSave; -+ // CraftBukkit end -+ - public Chunk(World world, ChunkSnapshot chunksnapshot, int i, int j) { - this(world, i, j); - short short0 = 256; -@@ -529,7 +569,8 @@ - } - } - -- if (!this.world.isClientSide && block1 != block) { -+ // CraftBukkit - Don't place while processing the BlockPlaceEvent, unless it's a BlockContainer. Prevents blocks such as TNT from activating when cancelled. -+ if (!this.world.isClientSide && block1 != block && (!this.world.captureBlockStates || block instanceof BlockContainer)) { - block.onPlace(this.world, blockposition, iblockdata); - } - -@@ -610,7 +651,11 @@ - int j = MathHelper.floor(entity.locZ / 16.0D); - - if (i != this.locX || j != this.locZ) { -- Chunk.c.warn("Wrong location! (" + i + ", " + j + ") should be (" + this.locX + ", " + this.locZ + "), " + entity, new Object[] { entity}); -+ // CraftBukkit start -+ Bukkit.getLogger().warning("Wrong location for " + entity + " in world '" + world.getWorld().getName() + "'!"); -+ // Chunk.c.warn("Wrong location! (" + i + ", " + j + ") should be (" + this.locX + ", " + this.locZ + "), " + entity, new Object[] { entity}); -+ Bukkit.getLogger().warning("Entity is at " + entity.locX + "," + entity.locZ + " (chunk " + i + "," + j + ") but was stored in chunk " + this.locX + "," + this.locZ); -+ // CraftBukkit end - entity.die(); - } - -@@ -662,7 +707,15 @@ - } - - public TileEntity a(BlockPosition blockposition, Chunk.EnumTileEntityState chunk_enumtileentitystate) { -- TileEntity tileentity = (TileEntity) this.tileEntities.get(blockposition); -+ // CraftBukkit start -+ TileEntity tileentity = null; -+ if (world.captureBlockStates) { -+ tileentity = world.capturedTileEntities.get(blockposition); -+ } -+ if (tileentity == null) { -+ tileentity = (TileEntity) this.tileEntities.get(blockposition); -+ } -+ // CraftBukkit end - - if (tileentity == null) { - if (chunk_enumtileentitystate == Chunk.EnumTileEntityState.IMMEDIATE) { -@@ -697,6 +750,13 @@ - - tileentity.D(); - this.tileEntities.put(blockposition, tileentity); -+ // CraftBukkit start -+ } else { -+ System.out.println("Attempted to place a tile entity (" + tileentity + ") at " + tileentity.position.getX() + "," + tileentity.position.getY() + "," + tileentity.position.getZ() -+ + " (" + org.bukkit.craftbukkit.util.CraftMagicNumbers.getMaterial(getType(blockposition)) + ") where there was no entity tile!"); -+ System.out.println("Chunk coordinates: " + (this.locX * 16) + "," + (this.locZ * 16)); -+ new Exception().printStackTrace(); -+ // CraftBukkit end - } - } - -@@ -740,7 +800,21 @@ - } - - for (int i = 0; i < this.entitySlices.length; ++i) { -- this.world.c((Collection) this.entitySlices[i]); -+ // CraftBukkit start -+ List newList = Lists.newArrayList(this.entitySlices[i]); -+ java.util.Iterator iter = newList.iterator(); -+ while (iter.hasNext()) { -+ Entity entity = iter.next(); -+ -+ // Do not pass along players, as doing so can get them stuck outside of time. -+ // (which for example disables inventory icon updates and prevents block breaking) -+ if (entity instanceof EntityPlayer) { -+ iter.remove(); -+ } -+ } -+ -+ this.world.c((Collection) newList); -+ // CraftBukkit end - } - - } -@@ -798,8 +872,8 @@ - while (iterator.hasNext()) { - Entity entity = (Entity) iterator.next(); - -- if (entity.getBoundingBox().b(axisalignedbb) && (predicate == null || predicate.apply(entity))) { -- list.add(entity); -+ if (entity.getBoundingBox().b(axisalignedbb) && (predicate == null || predicate.apply((T) entity))) { // CraftBukkit - fix decompile error -+ list.add((T) entity); // Fix decompile error - } - } - } diff --git a/TacoSpigot-Server/nms-patches/ChunkProviderServer.patch b/TacoSpigot-Server/nms-patches/ChunkProviderServer.patch deleted file mode 100644 index 65c2167..0000000 --- a/TacoSpigot-Server/nms-patches/ChunkProviderServer.patch +++ /dev/null @@ -1,327 +0,0 @@ ---- a/net/minecraft/server/ChunkProviderServer.java -+++ b/net/minecraft/server/ChunkProviderServer.java -@@ -11,16 +11,27 @@ - import org.apache.logging.log4j.LogManager; - import org.apache.logging.log4j.Logger; - -+// CraftBukkit start -+import java.util.Random; -+import java.util.logging.Level; -+ -+import org.bukkit.Server; -+import org.bukkit.craftbukkit.chunkio.ChunkIOExecutor; -+import org.bukkit.craftbukkit.util.LongHash; -+import org.bukkit.craftbukkit.util.LongHashSet; -+import org.bukkit.craftbukkit.util.LongObjectHashMap; -+import org.bukkit.event.world.ChunkUnloadEvent; -+// CraftBukkit end -+ - public class ChunkProviderServer implements IChunkProvider { - - private static final Logger b = LogManager.getLogger(); -- private Set unloadQueue = Collections.newSetFromMap(new ConcurrentHashMap()); -+ public LongHashSet unloadQueue = new LongHashSet(); // CraftBukkit - LongHashSet - public Chunk emptyChunk; - public IChunkProvider chunkProvider; - private IChunkLoader chunkLoader; -- public boolean forceChunkLoad = true; -- private LongHashMap chunks = new LongHashMap(); -- private List chunkList = Lists.newArrayList(); -+ public boolean forceChunkLoad = false; // CraftBukkit - true -> false -+ public LongObjectHashMap chunks = new LongObjectHashMap(); - public WorldServer world; - - public ChunkProviderServer(WorldServer worldserver, IChunkLoader ichunkloader, IChunkProvider ichunkprovider) { -@@ -31,26 +42,43 @@ - } - - public boolean isChunkLoaded(int i, int j) { -- return this.chunks.contains(ChunkCoordIntPair.a(i, j)); -+ return this.chunks.containsKey(LongHash.toLong(i, j)); // CraftBukkit - } - -- public List a() { -- return this.chunkList; -+ // CraftBukkit start - Change return type to Collection and return the values of our chunk map -+ public java.util.Collection a() { -+ // return this.chunkList; -+ return this.chunks.values(); -+ // CraftBukkit end - } - - public void queueUnload(int i, int j) { - if (this.world.worldProvider.e()) { - if (!this.world.c(i, j)) { -- this.unloadQueue.add(Long.valueOf(ChunkCoordIntPair.a(i, j))); -+ // CraftBukkit start -+ this.unloadQueue.add(i, j); -+ -+ Chunk c = chunks.get(LongHash.toLong(i, j)); -+ if (c != null) { -+ c.mustSave = true; -+ } -+ // CraftBukkit end - } - } else { -- this.unloadQueue.add(Long.valueOf(ChunkCoordIntPair.a(i, j))); -+ // CraftBukkit start -+ this.unloadQueue.add(i, j); -+ -+ Chunk c = chunks.get(LongHash.toLong(i, j)); -+ if (c != null) { -+ c.mustSave = true; -+ } -+ // CraftBukkit end - } - - } - - public void b() { -- Iterator iterator = this.chunkList.iterator(); -+ Iterator iterator = this.chunks.values().iterator(); - - while (iterator.hasNext()) { - Chunk chunk = (Chunk) iterator.next(); -@@ -60,11 +88,48 @@ - - } - -+ // CraftBukkit start - Add async variant, provide compatibility -+ public Chunk getChunkIfLoaded(int x, int z) { -+ return chunks.get(LongHash.toLong(x, z)); -+ } -+ - public Chunk getChunkAt(int i, int j) { -- long k = ChunkCoordIntPair.a(i, j); -+ return getChunkAt(i, j, null); -+ } -+ -+ public Chunk getChunkAt(int i, int j, Runnable runnable) { -+ unloadQueue.remove(i, j); -+ Chunk chunk = chunks.get(LongHash.toLong(i, j)); -+ ChunkRegionLoader loader = null; -+ -+ if (this.chunkLoader instanceof ChunkRegionLoader) { -+ loader = (ChunkRegionLoader) this.chunkLoader; - -- this.unloadQueue.remove(Long.valueOf(k)); -- Chunk chunk = (Chunk) this.chunks.getEntry(k); -+ } -+ // We can only use the queue for already generated chunks -+ if (chunk == null && loader != null && loader.chunkExists(world, i, j)) { -+ if (runnable != null) { -+ ChunkIOExecutor.queueChunkLoad(world, loader, this, i, j, runnable); -+ return null; -+ } else { -+ chunk = ChunkIOExecutor.syncChunkLoad(world, loader, this, i, j); -+ } -+ } else if (chunk == null) { -+ chunk = originalGetChunkAt(i, j); -+ } -+ -+ // If we didn't load the chunk async and have a callback run it now -+ if (runnable != null) { -+ runnable.run(); -+ } -+ -+ return chunk; -+ } -+ public Chunk originalGetChunkAt(int i, int j) { -+ this.unloadQueue.remove(i, j); -+ Chunk chunk = (Chunk) this.chunks.get(LongHash.toLong(i, j)); -+ boolean newChunk = false; -+ // CraftBukkit end - - if (chunk == null) { - chunk = this.loadChunk(i, j); -@@ -79,16 +144,44 @@ - CrashReportSystemDetails crashreportsystemdetails = crashreport.a("Chunk to be generated"); - - crashreportsystemdetails.a("Location", (Object) String.format("%d,%d", new Object[] { Integer.valueOf(i), Integer.valueOf(j)})); -- crashreportsystemdetails.a("Position hash", (Object) Long.valueOf(k)); -+ crashreportsystemdetails.a("Position hash", (Object) Long.valueOf(LongHash.toLong(i, j))); // CraftBukkit - Use LongHash - crashreportsystemdetails.a("Generator", (Object) this.chunkProvider.getName()); - throw new ReportedException(crashreport); - } - } -+ newChunk = true; // CraftBukkit - } - -- this.chunks.put(k, chunk); -- this.chunkList.add(chunk); -+ this.chunks.put(LongHash.toLong(i, j), chunk); -+ - chunk.addEntities(); -+ -+ // CraftBukkit start -+ Server server = world.getServer(); -+ if (server != null) { -+ /* -+ * If it's a new world, the first few chunks are generated inside -+ * the World constructor. We can't reliably alter that, so we have -+ * no way of creating a CraftWorld/CraftServer at that point. -+ */ -+ server.getPluginManager().callEvent(new org.bukkit.event.world.ChunkLoadEvent(chunk.bukkitChunk, newChunk)); -+ } -+ -+ // Update neighbor counts -+ for (int x = -2; x < 3; x++) { -+ for (int z = -2; z < 3; z++) { -+ if (x == 0 && z == 0) { -+ continue; -+ } -+ -+ Chunk neighbor = this.getChunkIfLoaded(chunk.locX + x, chunk.locZ + z); -+ if (neighbor != null) { -+ neighbor.setNeighborLoaded(-x, -z); -+ chunk.setNeighborLoaded(x, z); -+ } -+ } -+ } -+ // CraftBukkit end - chunk.loadNearby(this, this, i, j); - } - -@@ -96,9 +189,22 @@ - } - - public Chunk getOrCreateChunk(int i, int j) { -- Chunk chunk = (Chunk) this.chunks.getEntry(ChunkCoordIntPair.a(i, j)); -+ // CraftBukkit start -+ Chunk chunk = (Chunk) this.chunks.get(LongHash.toLong(i, j)); -+ -+ chunk = chunk == null ? (!this.world.ad() && !this.forceChunkLoad ? this.emptyChunk : this.getChunkAt(i, j)) : chunk; -+ -+ if (chunk == emptyChunk) return chunk; -+ if (i != chunk.locX || j != chunk.locZ) { -+ b.error("Chunk (" + chunk.locX + ", " + chunk.locZ + ") stored at (" + i + ", " + j + ") in world '" + world.getWorld().getName() + "'"); -+ b.error(chunk.getClass().getName()); -+ Throwable ex = new Throwable(); -+ ex.fillInStackTrace(); -+ ex.printStackTrace(); -+ } - -- return chunk == null ? (!this.world.ad() && !this.forceChunkLoad ? this.emptyChunk : this.getChunkAt(i, j)) : chunk; -+ return chunk; -+ // CraftBukkit end - } - - public Chunk loadChunk(int i, int j) { -@@ -155,6 +261,30 @@ - chunk.n(); - if (this.chunkProvider != null) { - this.chunkProvider.getChunkAt(ichunkprovider, i, j); -+ -+ // CraftBukkit start -+ BlockSand.instaFall = true; -+ Random random = new Random(); -+ random.setSeed(world.getSeed()); -+ long xRand = random.nextLong() / 2L * 2L + 1L; -+ long zRand = random.nextLong() / 2L * 2L + 1L; -+ random.setSeed((long) i * xRand + (long) j * zRand ^ world.getSeed()); -+ -+ org.bukkit.World world = this.world.getWorld(); -+ if (world != null) { -+ this.world.populating = true; -+ try { -+ for (org.bukkit.generator.BlockPopulator populator : world.getPopulators()) { -+ populator.populate(world, random, chunk.bukkitChunk); -+ } -+ } finally { -+ this.world.populating = false; -+ } -+ } -+ BlockSand.instaFall = false; -+ this.world.getServer().getPluginManager().callEvent(new org.bukkit.event.world.ChunkPopulateEvent(chunk.bukkitChunk)); -+ // CraftBukkit end -+ - chunk.e(); - } - } -@@ -174,10 +304,12 @@ - - public boolean saveChunks(boolean flag, IProgressUpdate iprogressupdate) { - int i = 0; -- ArrayList arraylist = Lists.newArrayList(this.chunkList); - -- 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 - - if (flag) { - this.saveChunkNOP(chunk); -@@ -205,22 +337,43 @@ - - public boolean unloadChunks() { - if (!this.world.savingDisabled) { -- for (int i = 0; i < 100; ++i) { -- if (!this.unloadQueue.isEmpty()) { -- Long olong = (Long) this.unloadQueue.iterator().next(); -- Chunk chunk = (Chunk) this.chunks.getEntry(olong.longValue()); -+ // CraftBukkit start -+ Server server = this.world.getServer(); -+ for (int i = 0; i < 100 && !this.unloadQueue.isEmpty(); ++i) { -+ long chunkcoordinates = this.unloadQueue.popFirst(); -+ Chunk chunk = this.chunks.get(chunkcoordinates); -+ if (chunk == null) continue; -+ -+ ChunkUnloadEvent event = new ChunkUnloadEvent(chunk.bukkitChunk); -+ server.getPluginManager().callEvent(event); -+ if (!event.isCancelled()) { - - if (chunk != null) { - chunk.removeEntities(); - this.saveChunk(chunk); - this.saveChunkNOP(chunk); -- this.chunks.remove(olong.longValue()); -- this.chunkList.remove(chunk); -+ this.chunks.remove(chunkcoordinates); // CraftBukkit - } - -- this.unloadQueue.remove(olong); -+ // this.unloadQueue.remove(olong); -+ -+ // Update neighbor counts -+ for (int x = -2; x < 3; x++) { -+ for (int z = -2; z < 3; z++) { -+ if (x == 0 && z == 0) { -+ continue; -+ } -+ -+ Chunk neighbor = this.getChunkIfLoaded(chunk.locX + x, chunk.locZ + z); -+ if (neighbor != null) { -+ neighbor.setNeighborUnloaded(-x, -z); -+ chunk.setNeighborUnloaded(x, z); -+ } -+ } -+ } - } - } -+ // CraftBukkit end - - if (this.chunkLoader != null) { - this.chunkLoader.a(); -@@ -235,7 +388,8 @@ - } - - public String getName() { -- return "ServerChunkCache: " + this.chunks.count() + " Drop: " + this.unloadQueue.size(); -+ // CraftBukkit - this.chunks.count() -> .size() -+ return "ServerChunkCache: " + this.chunks.size() + " Drop: " + this.unloadQueue.size(); - } - - public List getMobsFor(EnumCreatureType enumcreaturetype, BlockPosition blockposition) { -@@ -247,7 +401,8 @@ - } - - public int getLoadedChunks() { -- return this.chunks.count(); -+ // CraftBukkit - this.chunks.count() -> this.chunks.size() -+ return this.chunks.size(); - } - - public void recreateStructures(Chunk chunk, int i, int j) {} diff --git a/TacoSpigot-Server/nms-patches/ChunkRegionLoader.patch b/TacoSpigot-Server/nms-patches/ChunkRegionLoader.patch deleted file mode 100644 index 47a5014..0000000 --- a/TacoSpigot-Server/nms-patches/ChunkRegionLoader.patch +++ /dev/null @@ -1,127 +0,0 @@ ---- a/net/minecraft/server/ChunkRegionLoader.java -+++ b/net/minecraft/server/ChunkRegionLoader.java -@@ -26,7 +26,35 @@ - this.d = file; - } - -+ // CraftBukkit start -+ public boolean chunkExists(World world, int i, int j) { -+ ChunkCoordIntPair chunkcoordintpair = new ChunkCoordIntPair(i, j); -+ -+ if (this.c.contains(chunkcoordintpair)) { -+ if (this.b.containsKey(chunkcoordintpair)) { -+ return true; -+ } -+ } -+ -+ return RegionFileCache.a(this.d, i, j).chunkExists(i & 31, j & 31); -+ } -+ // CraftBukkit end -+ -+ // CraftBukkit start - Add async variant, provide compatibility - public Chunk a(World world, int i, int j) throws IOException { -+ Object[] data = loadChunk(world, i, j); -+ if (data != null) { -+ Chunk chunk = (Chunk) data[0]; -+ NBTTagCompound nbttagcompound = (NBTTagCompound) data[1]; -+ loadEntities(chunk, nbttagcompound.getCompound("Level"), world); -+ return chunk; -+ } -+ -+ return null; -+ } -+ -+ public Object[] loadChunk(World world, int i, int j) throws IOException { -+ // CraftBukkit end - ChunkCoordIntPair chunkcoordintpair = new ChunkCoordIntPair(i, j); - NBTTagCompound nbttagcompound = (NBTTagCompound) this.b.get(chunkcoordintpair); - -@@ -43,7 +71,7 @@ - return this.a(world, i, j, nbttagcompound); - } - -- protected Chunk a(World world, int i, int j, NBTTagCompound nbttagcompound) { -+ protected Object[] a(World world, int i, int j, NBTTagCompound nbttagcompound) { // CraftBukkit - return Chunk -> Object[] - if (!nbttagcompound.hasKeyOfType("Level", 10)) { - ChunkRegionLoader.a.error("Chunk file at " + i + "," + j + " is missing level data, skipping"); - return null; -@@ -60,10 +88,28 @@ - ChunkRegionLoader.a.error("Chunk file at " + i + "," + j + " is in the wrong location; relocating. (Expected " + i + ", " + j + ", got " + chunk.locX + ", " + 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 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 - } - } - } -@@ -303,7 +349,26 @@ - int k1 = l >> 4 & 15; - int l1 = nibblearray1 != null ? nibblearray1.a(i1, j1, k1) : 0; - -- achar[l] = (char) (l1 << 12 | (abyte[l] & 255) << 4 | nibblearray.a(i1, j1, k1)); -+ // CraftBukkit start - fix broken blocks -+ // achar[l] = (char) (l1 << 12 | (abyte[l] & 255) << 4 | nibblearray.a(i1, j1, k1)); -+ -+ int ex = l1; -+ int id = (abyte[l] & 255); -+ int data = nibblearray.a(i1, j1, k1); -+ int packed = ex << 12 | id << 4 | data; -+ if (Block.d.a(packed) == null) { -+ Block block = Block.getById(ex << 8 | id); -+ if (block != null) { -+ try { -+ data = block.toLegacyData(block.fromLegacyData(data)); -+ } catch (Exception ignored) { -+ data = block.toLegacyData(block.getBlockData()); -+ } -+ packed = ex << 12 | id << 4 | data; -+ } -+ } -+ achar[l] = (char) packed; -+ // CraftBukkit end - } - - chunksection.a(achar); -@@ -321,6 +386,13 @@ - chunk.a(nbttagcompound.getByteArray("Biomes")); - } - -+ // CraftBukkit start - End this method here and split off entity loading to another method -+ return chunk; -+ } -+ -+ public void loadEntities(Chunk chunk, NBTTagCompound nbttagcompound, World world) { -+ // CraftBukkit end -+ - NBTTagList nbttaglist1 = nbttagcompound.getList("Entities", 10); - - if (nbttaglist1 != null) { -@@ -379,6 +451,6 @@ - } - } - -- return chunk; -+ // return chunk; // CraftBukkit - } - } diff --git a/TacoSpigot-Server/nms-patches/ChunkSection.patch b/TacoSpigot-Server/nms-patches/ChunkSection.patch deleted file mode 100644 index 6a96a99..0000000 --- a/TacoSpigot-Server/nms-patches/ChunkSection.patch +++ /dev/null @@ -1,21 +0,0 @@ ---- a/net/minecraft/server/ChunkSection.java -+++ b/net/minecraft/server/ChunkSection.java -@@ -19,6 +19,18 @@ - - } - -+ // CraftBukkit start -+ public ChunkSection(int y, boolean flag, char[] blockIds) { -+ this.yPos = y; -+ this.blockIds = blockIds; -+ this.emittedLight = new NibbleArray(); -+ if (flag) { -+ this.skyLight = new NibbleArray(); -+ } -+ recalcBlockCounts(); -+ } -+ // CraftBukkit end -+ - public IBlockData getType(int i, int j, int k) { - IBlockData iblockdata = (IBlockData) Block.d.a(this.blockIds[j << 8 | k << 4 | i]); - diff --git a/TacoSpigot-Server/nms-patches/CommandBlockListenerAbstract.patch b/TacoSpigot-Server/nms-patches/CommandBlockListenerAbstract.patch deleted file mode 100644 index c7dec98..0000000 --- a/TacoSpigot-Server/nms-patches/CommandBlockListenerAbstract.patch +++ /dev/null @@ -1,167 +0,0 @@ ---- a/net/minecraft/server/CommandBlockListenerAbstract.java -+++ b/net/minecraft/server/CommandBlockListenerAbstract.java -@@ -4,6 +4,13 @@ - import java.util.Date; - import java.util.concurrent.Callable; - -+// CraftBukkit start -+import java.util.ArrayList; -+import org.bukkit.craftbukkit.command.VanillaCommandWrapper; -+import com.google.common.base.Joiner; -+import java.util.logging.Level; -+// CraftBukkit end -+ - public abstract class CommandBlockListenerAbstract implements ICommandListener { - - private static final SimpleDateFormat a = new SimpleDateFormat("HH:mm:ss"); -@@ -13,6 +20,7 @@ - private String e = ""; - private String f = "@"; - private final CommandObjectiveExecutor g = new CommandObjectiveExecutor(); -+ protected org.bukkit.command.CommandSender sender; // CraftBukkit - add sender - - public CommandBlockListenerAbstract() {} - -@@ -79,7 +87,10 @@ - - try { - this.d = null; -- this.b = icommandhandler.a(this, this.e); -+ // this.b = icommandhandler.a(this, this.e); -+ // CraftBukkit start - Handle command block commands using Bukkit dispatcher -+ this.b = executeCommand(this, sender, this.e); -+ // CraftBukkit end - } catch (Throwable throwable) { - CrashReport crashreport = CrashReport.a(throwable, "Executing command block"); - CrashReportSystemDetails crashreportsystemdetails = crashreport.a("Command to be executed"); -@@ -110,6 +121,130 @@ - - } - -+ // CraftBukkit start -+ public static int executeCommand(ICommandListener sender, org.bukkit.command.CommandSender bSender, String command) { -+ org.bukkit.command.SimpleCommandMap commandMap = sender.getWorld().getServer().getCommandMap(); -+ Joiner joiner = Joiner.on(" "); -+ if (command.startsWith("/")) { -+ command = command.substring(1); -+ } -+ String[] args = command.split(" "); -+ ArrayList commands = new ArrayList(); -+ -+ 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; -+ } -+ -+ // If the world has no players don't run -+ if (sender.getWorld().players.isEmpty()) { -+ 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 (!((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 newCommands = new ArrayList(); -+ for (int i = 0; i < args.length; i++) { -+ if (PlayerSelector.isPattern(args[i])) { -+ for (int j = 0; j < commands.size(); j++) { -+ newCommands.addAll(buildCommands(sender, commands.get(j), i)); -+ } -+ ArrayList 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 buildCommands(ICommandListener sender, String[] args, int pos) { -+ ArrayList commands = new ArrayList(); -+ java.util.List players = (java.util.List)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; -+ } -+ // CraftBukkit end -+ - public String getName() { - return this.f; - } diff --git a/TacoSpigot-Server/nms-patches/CommandExecute.patch b/TacoSpigot-Server/nms-patches/CommandExecute.patch deleted file mode 100644 index 9f93796..0000000 --- a/TacoSpigot-Server/nms-patches/CommandExecute.patch +++ /dev/null @@ -1,58 +0,0 @@ ---- a/net/minecraft/server/CommandExecute.java -+++ b/net/minecraft/server/CommandExecute.java -@@ -2,6 +2,10 @@ - - import java.util.Collection; - import java.util.List; -+// CraftBukkit start -+import org.bukkit.craftbukkit.command.ProxiedNativeCommandSender; -+import org.bukkit.craftbukkit.command.VanillaCommandWrapper; -+// CraftBukkit end - - public class CommandExecute extends CommandAbstract { - -@@ -94,12 +98,31 @@ - ICommandHandler icommandhandler = MinecraftServer.getServer().getCommandHandler(); - - try { -- int j = icommandhandler.a(icommandlistener1, s); -+ // CraftBukkit start -+ org.bukkit.command.CommandSender sender = null; -+ if (icommandlistener instanceof DedicatedServer) { -+ sender = MinecraftServer.getServer().server.getConsoleSender(); -+ } else if (icommandlistener instanceof CommandBlockListenerAbstract) { -+ sender = ((CommandBlockListenerAbstract) icommandlistener).sender; -+ } else if (VanillaCommandWrapper.lastSender != null) { -+ sender = VanillaCommandWrapper.lastSender; -+ }else if (icommandlistener.f() != null) { -+ sender = icommandlistener.f().getBukkitEntity(); -+ } else { -+ throw new CommandException("Unhandled executor " + icommandlistener.getClass().getSimpleName(), new Object[0]); -+ } -+ int j = CommandBlockListenerAbstract.executeCommand(icommandlistener1, new ProxiedNativeCommandSender(icommandlistener1, sender, entity.getBukkitEntity()), s); -+ // CraftBukkit end - - if (j < 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()}); - } - } -@@ -112,4 +135,11 @@ - 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/TacoSpigot-Server/nms-patches/CommandGamemode.patch b/TacoSpigot-Server/nms-patches/CommandGamemode.patch deleted file mode 100644 index 6280a4b..0000000 --- a/TacoSpigot-Server/nms-patches/CommandGamemode.patch +++ /dev/null @@ -1,28 +0,0 @@ ---- a/net/minecraft/server/CommandGamemode.java -+++ b/net/minecraft/server/CommandGamemode.java -@@ -26,6 +26,13 @@ - EntityPlayer entityplayer = astring.length >= 2 ? a(icommandlistener, astring[1]) : b(icommandlistener); - - entityplayer.a(worldsettings_enumgamemode); -+ // CraftBukkit start - handle event cancelling the change -+ if (entityplayer.playerInteractManager.getGameMode() != worldsettings_enumgamemode) { -+ icommandlistener.sendMessage(new ChatComponentText("Failed to set the gamemode of '" + entityplayer.getName() + "'")); -+ return; -+ } -+ // CraftBukkit end -+ - entityplayer.fallDistance = 0.0F; - if (icommandlistener.getWorld().getGameRules().getBoolean("sendCommandFeedback")) { - entityplayer.sendMessage(new ChatMessage("gameMode.changed", new Object[0])); -@@ -57,4 +64,11 @@ - 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 - } diff --git a/TacoSpigot-Server/nms-patches/CommandGamerule.patch b/TacoSpigot-Server/nms-patches/CommandGamerule.patch deleted file mode 100644 index c619010..0000000 --- a/TacoSpigot-Server/nms-patches/CommandGamerule.patch +++ /dev/null @@ -1,23 +0,0 @@ ---- a/net/minecraft/server/CommandGamerule.java -+++ b/net/minecraft/server/CommandGamerule.java -@@ -20,7 +20,7 @@ - } - - public void execute(ICommandListener icommandlistener, String[] astring) throws CommandException { -- GameRules gamerules = this.d(); -+ GameRules gamerules = icommandlistener.getWorld().getGameRules(); // CraftBukkit - Use current world - String s = astring.length > 0 ? astring[0] : ""; - String s1 = astring.length > 1 ? a(astring, 1) : ""; - -@@ -85,4 +85,11 @@ - private GameRules d() { - return MinecraftServer.getServer().getWorldServer(0).getGameRules(); - } -+ -+ // CraftBukkit start - fix decompile error -+ @Override -+ public int compareTo(ICommand o) { -+ return a((ICommand) o); -+ } -+ // CraftBukkit end - } diff --git a/TacoSpigot-Server/nms-patches/CommandSpreadPlayers.patch b/TacoSpigot-Server/nms-patches/CommandSpreadPlayers.patch deleted file mode 100644 index 7f7a938..0000000 --- a/TacoSpigot-Server/nms-patches/CommandSpreadPlayers.patch +++ /dev/null @@ -1,47 +0,0 @@ ---- a/net/minecraft/server/CommandSpreadPlayers.java -+++ b/net/minecraft/server/CommandSpreadPlayers.java -@@ -237,6 +237,13 @@ - return astring.length >= 1 && astring.length <= 2 ? b(astring, 0, blockposition) : null; - } - -+ // CraftBukkit start - fix decompile error -+ @Override -+ public int compareTo(ICommand o) { -+ return a(o); -+ } -+ // CraftBukkit end -+ - static class Location2D { - - double a; -@@ -303,7 +310,7 @@ - } - - blockposition = blockposition.down(); -- } while (world.getType(blockposition).getBlock().getMaterial() == Material.AIR); -+ } while (getType(world, blockposition).getBlock().getMaterial() == Material.AIR); // CraftBukkit - - return blockposition.getY() + 1; - } -@@ -319,7 +326,7 @@ - } - - blockposition = blockposition.down(); -- material = world.getType(blockposition).getBlock().getMaterial(); -+ material = getType(world, blockposition).getBlock().getMaterial(); // CraftBukkit - } while (material == Material.AIR); - - return !material.isLiquid() && material != Material.FIRE; -@@ -329,5 +336,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); -+ } -+ // CraftBukkit end - } - } diff --git a/TacoSpigot-Server/nms-patches/CommandTp.patch b/TacoSpigot-Server/nms-patches/CommandTp.patch deleted file mode 100644 index 13912dd..0000000 --- a/TacoSpigot-Server/nms-patches/CommandTp.patch +++ /dev/null @@ -1,37 +0,0 @@ ---- a/net/minecraft/server/CommandTp.java -+++ b/net/minecraft/server/CommandTp.java -@@ -105,17 +105,11 @@ - } else { - Entity entity = b(icommandlistener, astring[astring.length - 1]); - -- if (entity.world != ((Entity) object).world) { -- throw new CommandException("commands.tp.notSameDimension", new Object[0]); -- } else { -- ((Entity) object).mount((Entity) null); -- 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); -- } -- -- a(icommandlistener, this, "commands.tp.success", new Object[] { ((Entity) object).getName(), entity.getName()}); -+ // 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, this, "commands.tp.success", new Object[]{((Entity) object).getName(), entity.getName()}); -+ // CraftBukkit End - } - } - } -@@ -128,4 +122,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/TacoSpigot-Server/nms-patches/Container.patch b/TacoSpigot-Server/nms-patches/Container.patch deleted file mode 100644 index 55fe26c..0000000 --- a/TacoSpigot-Server/nms-patches/Container.patch +++ /dev/null @@ -1,210 +0,0 @@ ---- a/net/minecraft/server/Container.java -+++ b/net/minecraft/server/Container.java -@@ -7,6 +7,17 @@ - import java.util.List; - import java.util.Set; - -+// CraftBukkit start -+import java.util.HashMap; -+import java.util.Map; -+import org.bukkit.craftbukkit.inventory.CraftInventory; -+import org.bukkit.craftbukkit.inventory.CraftItemStack; -+import org.bukkit.event.Event.Result; -+import org.bukkit.event.inventory.InventoryDragEvent; -+import org.bukkit.event.inventory.InventoryType; -+import org.bukkit.inventory.InventoryView; -+// CraftBukkit end -+ - public abstract class Container { - - public List b = Lists.newArrayList(); -@@ -18,12 +29,24 @@ - protected List listeners = Lists.newArrayList(); - private Set i = Sets.newHashSet(); - -+ // CraftBukkit start -+ public boolean checkReachable = true; -+ public abstract InventoryView getBukkitView(); -+ public void transferTo(Container other, org.bukkit.craftbukkit.entity.CraftHumanEntity player) { -+ InventoryView source = this.getBukkitView(), destination = other.getBukkitView(); -+ ((CraftInventory) source.getTopInventory()).getInventory().onClose(player); -+ ((CraftInventory) source.getBottomInventory()).getInventory().onClose(player); -+ ((CraftInventory) destination.getTopInventory()).getInventory().onOpen(player); -+ ((CraftInventory) destination.getBottomInventory()).getInventory().onOpen(player); -+ } -+ // CraftBukkit end -+ - public Container() {} - - protected Slot a(Slot slot) { - slot.rawSlotIndex = this.c.size(); - this.c.add(slot); -- this.b.add((Object) null); -+ this.b.add(null); // CraftBukkit - fix decompile error - return slot; - } - -@@ -124,6 +147,7 @@ - l = playerinventory.getCarried().count; - Iterator iterator = this.h.iterator(); - -+ Map draggedSlots = new HashMap(); // CraftBukkit - Store slots from drag in map (raw slot id -> new stack) - while (iterator.hasNext()) { - Slot slot1 = (Slot) iterator.next(); - -@@ -141,16 +165,48 @@ - } - - l -= itemstack2.count - j1; -- slot1.set(itemstack2); -+ // slot1.set(itemstack2); -+ draggedSlots.put(slot1.rawSlotIndex, itemstack2); // CraftBukkit - Put in map instead of setting - } - } - -- itemstack1.count = l; -- if (itemstack1.count <= 0) { -- itemstack1 = null; -+ // CraftBukkit start - InventoryDragEvent -+ InventoryView view = getBukkitView(); -+ org.bukkit.inventory.ItemStack newcursor = CraftItemStack.asCraftMirror(itemstack1); -+ newcursor.setAmount(l); -+ Map eventmap = new HashMap(); -+ for (Map.Entry ditem : draggedSlots.entrySet()) { -+ eventmap.put(ditem.getKey(), CraftItemStack.asBukkitCopy(ditem.getValue())); -+ } -+ -+ // It's essential that we set the cursor to the new value here to prevent item duplication if a plugin closes the inventory. -+ ItemStack oldCursor = playerinventory.getCarried(); -+ playerinventory.setCarried(CraftItemStack.asNMSCopy(newcursor)); -+ -+ InventoryDragEvent event = new InventoryDragEvent(view, (newcursor.getType() != org.bukkit.Material.AIR ? newcursor : null), CraftItemStack.asBukkitCopy(oldCursor), this.dragType == 1, eventmap); -+ entityhuman.world.getServer().getPluginManager().callEvent(event); -+ -+ // Whether or not a change was made to the inventory that requires an update. -+ boolean needsUpdate = event.getResult() != Result.DEFAULT; -+ -+ if (event.getResult() != Result.DENY) { -+ for (Map.Entry dslot : draggedSlots.entrySet()) { -+ view.setItem(dslot.getKey(), CraftItemStack.asBukkitCopy(dslot.getValue())); -+ } -+ // The only time the carried item will be set to null is if the inventory is closed by the server. -+ // If the inventory is closed by the server, then the cursor items are dropped. This is why we change the cursor early. -+ if (playerinventory.getCarried() != null) { -+ playerinventory.setCarried(CraftItemStack.asNMSCopy(event.getCursor())); -+ needsUpdate = true; -+ } -+ } else { -+ playerinventory.setCarried(oldCursor); - } - -- playerinventory.setCarried(itemstack1); -+ if (needsUpdate && entityhuman instanceof EntityPlayer) { -+ ((EntityPlayer) entityhuman).updateInventory(this); -+ } -+ // CraftBukkit end - } - - this.d(); -@@ -173,8 +229,14 @@ - } - - if (j == 1) { -- entityhuman.drop(playerinventory.getCarried().cloneAndSubtract(1), true); -- if (playerinventory.getCarried().count == 0) { -+ // CraftBukkit start - Store a reference -+ ItemStack itemstack4 = playerinventory.getCarried(); -+ if (itemstack4.count > 0) { -+ entityhuman.drop(itemstack4.cloneAndSubtract(1), true); -+ } -+ -+ if (itemstack4.count == 0) { -+ // CraftBukkit end - playerinventory.setCarried((ItemStack) null); - } - } -@@ -223,7 +285,11 @@ - - if (itemstack4.count == 0) { - playerinventory.setCarried((ItemStack) null); -+ // CraftBukkit start - Update client cursor if we didn't empty it -+ } else if (entityhuman instanceof EntityPlayer) { -+ ((EntityPlayer) entityhuman).playerConnection.sendPacket(new PacketPlayOutSetSlot(-1, -1, entityhuman.inventory.getCarried())); - } -+ // CraftBukkit end - } - } else if (slot2.isAllowed(entityhuman)) { - if (itemstack4 == null) { -@@ -249,7 +315,11 @@ - itemstack4.cloneAndSubtract(k1); - if (itemstack4.count == 0) { - playerinventory.setCarried((ItemStack) null); -+ // CraftBukkit start - Update client cursor if we didn't empty it -+ } else if (entityhuman instanceof EntityPlayer) { -+ ((EntityPlayer) entityhuman).playerConnection.sendPacket(new PacketPlayOutSetSlot(-1, -1, entityhuman.inventory.getCarried())); - } -+ // CraftBukkit end - - itemstack1.count += k1; - } else if (itemstack4.count <= slot2.getMaxStackSize(itemstack4)) { -@@ -258,7 +328,9 @@ - } - } else if (itemstack1.getItem() == itemstack4.getItem() && itemstack4.getMaxStackSize() > 1 && (!itemstack1.usesData() || itemstack1.getData() == itemstack4.getData()) && ItemStack.equals(itemstack1, itemstack4)) { - k1 = itemstack1.count; -- if (k1 > 0 && k1 + itemstack4.count <= itemstack4.getMaxStackSize()) { -+ // CraftBukkit start - itemstack4.getMaxStackSize() -> maxStack -+ int maxStack = Math.min(itemstack4.getMaxStackSize(), slot2.getMaxStackSize()); -+ if (k1 > 0 && k1 + itemstack4.count <= maxStack) { - itemstack4.count += k1; - itemstack1 = slot2.a(k1); - if (itemstack1.count == 0) { -@@ -266,11 +338,24 @@ - } - - slot2.a(entityhuman, playerinventory.getCarried()); -+ // CraftBukkit start - Update client cursor if we didn't empty it -+ } else if (entityhuman instanceof EntityPlayer) { -+ ((EntityPlayer) entityhuman).playerConnection.sendPacket(new PacketPlayOutSetSlot(-1, -1, entityhuman.inventory.getCarried())); - } -+ // CraftBukkit end - } - } - - slot2.f(); -+ // CraftBukkit start - Make sure the client has the right slot contents -+ if (entityhuman instanceof EntityPlayer && slot2.getMaxStackSize() != 64) { -+ ((EntityPlayer) entityhuman).playerConnection.sendPacket(new PacketPlayOutSetSlot(this.windowId, slot2.rawSlotIndex, slot2.getItem())); -+ // Updating a crafting inventory makes the client reset the result slot, have to send it again -+ if (this.getBukkitView().getType() == InventoryType.WORKBENCH || this.getBukkitView().getType() == InventoryType.CRAFTING) { -+ ((EntityPlayer) entityhuman).playerConnection.sendPacket(new PacketPlayOutSetSlot(this.windowId, 0, this.getSlot(0).getItem())); -+ } -+ } -+ // CraftBukkit end - } - } - } else if (k == 2 && j >= 0 && j < 9) { -@@ -411,17 +496,20 @@ - if (itemstack1 != null && itemstack1.getItem() == itemstack.getItem() && (!itemstack.usesData() || itemstack.getData() == itemstack1.getData()) && ItemStack.equals(itemstack, itemstack1)) { - int l = itemstack1.count + itemstack.count; - -- if (l <= itemstack.getMaxStackSize()) { -+ // CraftBukkit start - itemstack.getMaxStackSize() -> maxStack -+ int maxStack = Math.min(itemstack.getMaxStackSize(), slot.getMaxStackSize()); -+ if (l <= maxStack) { - itemstack.count = 0; - itemstack1.count = l; - slot.f(); - flag1 = true; -- } else if (itemstack1.count < itemstack.getMaxStackSize()) { -- itemstack.count -= itemstack.getMaxStackSize() - itemstack1.count; -- itemstack1.count = itemstack.getMaxStackSize(); -+ } else if (itemstack1.count < maxStack) { -+ itemstack.count -= maxStack - itemstack1.count; -+ itemstack1.count = maxStack; - slot.f(); - flag1 = true; - } -+ // CraftBukkit end - } - - if (flag) { diff --git a/TacoSpigot-Server/nms-patches/ContainerAnvil.patch b/TacoSpigot-Server/nms-patches/ContainerAnvil.patch deleted file mode 100644 index 003cc50..0000000 --- a/TacoSpigot-Server/nms-patches/ContainerAnvil.patch +++ /dev/null @@ -1,51 +0,0 @@ ---- a/net/minecraft/server/ContainerAnvil.java -+++ b/net/minecraft/server/ContainerAnvil.java -@@ -6,6 +6,8 @@ - import org.apache.logging.log4j.LogManager; - import org.apache.logging.log4j.Logger; - -+import org.bukkit.craftbukkit.inventory.CraftInventoryView; // CraftBukkit -+ - public class ContainerAnvil extends Container { - - private static final Logger f = LogManager.getLogger(); -@@ -22,8 +24,13 @@ - private int k; - private String l; - private final EntityHuman m; -+ // CraftBukkit start -+ private CraftInventoryView bukkitEntity = null; -+ private PlayerInventory player; -+ // CraftBukkit end - - public ContainerAnvil(PlayerInventory playerinventory, final World world, final BlockPosition blockposition, EntityHuman entityhuman) { -+ this.player = playerinventory; // CraftBukkit - this.j = blockposition; - this.i = world; - this.m = entityhuman; -@@ -317,6 +324,7 @@ - } - - public boolean a(EntityHuman entityhuman) { -+ if (!this.checkReachable) return true; // CraftBukkit - return this.i.getType(this.j).getBlock() != Blocks.ANVIL ? false : entityhuman.e((double) this.j.getX() + 0.5D, (double) this.j.getY() + 0.5D, (double) this.j.getZ() + 0.5D) <= 64.0D; - } - -@@ -372,4 +380,17 @@ - - this.e(); - } -+ -+ // CraftBukkit start -+ @Override -+ public CraftInventoryView getBukkitView() { -+ if (bukkitEntity != null) { -+ return bukkitEntity; -+ } -+ -+ org.bukkit.craftbukkit.inventory.CraftInventory inventory = new org.bukkit.craftbukkit.inventory.CraftInventoryAnvil(this.h, this.g); -+ bukkitEntity = new CraftInventoryView(this.player.player.getBukkitEntity(), inventory, this); -+ return bukkitEntity; -+ } -+ // CraftBukkit end - } diff --git a/TacoSpigot-Server/nms-patches/ContainerBeacon.patch b/TacoSpigot-Server/nms-patches/ContainerBeacon.patch deleted file mode 100644 index 332ab07..0000000 --- a/TacoSpigot-Server/nms-patches/ContainerBeacon.patch +++ /dev/null @@ -1,47 +0,0 @@ ---- a/net/minecraft/server/ContainerBeacon.java -+++ b/net/minecraft/server/ContainerBeacon.java -@@ -1,11 +1,18 @@ - package net.minecraft.server; - -+import org.bukkit.craftbukkit.inventory.CraftInventoryView; // CraftBukkit -+ - public class ContainerBeacon extends Container { - - private IInventory beacon; - private final ContainerBeacon.SlotBeacon f; -+ // CraftBukkit start -+ private CraftInventoryView bukkitEntity = null; -+ private PlayerInventory player; -+ // CraftBukkit end - - public ContainerBeacon(IInventory iinventory, IInventory iinventory1) { -+ player = (PlayerInventory) iinventory; // CraftBukkit - TODO: check this - this.beacon = iinventory1; - this.a((Slot) (this.f = new ContainerBeacon.SlotBeacon(iinventory1, 0, 136, 110))); - byte b0 = 36; -@@ -47,6 +54,7 @@ - } - - public boolean a(EntityHuman entityhuman) { -+ if (!this.checkReachable) return true; // CraftBukkit - return this.beacon.a(entityhuman); - } - -@@ -110,4 +118,17 @@ - return 1; - } - } -+ -+ // CraftBukkit start -+ @Override -+ public CraftInventoryView getBukkitView() { -+ if (bukkitEntity != null) { -+ return bukkitEntity; -+ } -+ -+ org.bukkit.craftbukkit.inventory.CraftInventory inventory = new org.bukkit.craftbukkit.inventory.CraftInventoryBeacon((TileEntityBeacon) this.beacon); // TODO - check this -+ bukkitEntity = new CraftInventoryView(this.player.player.getBukkitEntity(), inventory, this); -+ return bukkitEntity; -+ } -+ // CraftBukkit end - } diff --git a/TacoSpigot-Server/nms-patches/ContainerBrewingStand.patch b/TacoSpigot-Server/nms-patches/ContainerBrewingStand.patch deleted file mode 100644 index 3de4d47..0000000 --- a/TacoSpigot-Server/nms-patches/ContainerBrewingStand.patch +++ /dev/null @@ -1,52 +0,0 @@ ---- a/net/minecraft/server/ContainerBrewingStand.java -+++ b/net/minecraft/server/ContainerBrewingStand.java -@@ -1,12 +1,23 @@ - package net.minecraft.server; - -+// CraftBukkit start -+import org.bukkit.craftbukkit.inventory.CraftInventoryBrewer; -+import org.bukkit.craftbukkit.inventory.CraftInventoryView; -+// CraftBukkit end -+ - public class ContainerBrewingStand extends Container { - - private IInventory brewingStand; - private final Slot f; - private int g; - -+ // CraftBukkit start -+ private CraftInventoryView bukkitEntity = null; -+ private PlayerInventory player; -+ // CraftBukkit end -+ - public ContainerBrewingStand(PlayerInventory playerinventory, IInventory iinventory) { -+ player = playerinventory; // CraftBukkit - this.brewingStand = iinventory; - this.a((Slot) (new ContainerBrewingStand.SlotPotionBottle(playerinventory.player, iinventory, 0, 56, 46))); - this.a((Slot) (new ContainerBrewingStand.SlotPotionBottle(playerinventory.player, iinventory, 1, 79, 53))); -@@ -47,6 +58,7 @@ - } - - public boolean a(EntityHuman entityhuman) { -+ if (!this.checkReachable) return true; // CraftBukkit - return this.brewingStand.a(entityhuman); - } - -@@ -146,4 +158,17 @@ - return itemstack != null && (itemstack.getItem() == Items.POTION || itemstack.getItem() == Items.GLASS_BOTTLE); - } - } -+ -+ // CraftBukkit start -+ @Override -+ public CraftInventoryView getBukkitView() { -+ if (bukkitEntity != null) { -+ return bukkitEntity; -+ } -+ -+ CraftInventoryBrewer inventory = new CraftInventoryBrewer(this.brewingStand); -+ bukkitEntity = new CraftInventoryView(this.player.player.getBukkitEntity(), inventory, this); -+ return bukkitEntity; -+ } -+ // CraftBukkit end - } diff --git a/TacoSpigot-Server/nms-patches/ContainerChest.patch b/TacoSpigot-Server/nms-patches/ContainerChest.patch deleted file mode 100644 index e28d0dc..0000000 --- a/TacoSpigot-Server/nms-patches/ContainerChest.patch +++ /dev/null @@ -1,60 +0,0 @@ ---- a/net/minecraft/server/ContainerChest.java -+++ b/net/minecraft/server/ContainerChest.java -@@ -1,9 +1,37 @@ - package net.minecraft.server; - -+// CraftBukkit start -+import org.bukkit.craftbukkit.inventory.CraftInventory; -+import org.bukkit.craftbukkit.inventory.CraftInventoryView; -+// CraftBukkit end -+ - public class ContainerChest extends Container { - - private IInventory container; - private int f; -+ // CraftBukkit start -+ private CraftInventoryView bukkitEntity = null; -+ private PlayerInventory player; -+ -+ @Override -+ public CraftInventoryView getBukkitView() { -+ if (bukkitEntity != null) { -+ return bukkitEntity; -+ } -+ -+ CraftInventory inventory; -+ if (this.container instanceof PlayerInventory) { -+ inventory = new org.bukkit.craftbukkit.inventory.CraftInventoryPlayer((PlayerInventory) this.container); -+ } else if (this.container instanceof InventoryLargeChest) { -+ inventory = new org.bukkit.craftbukkit.inventory.CraftInventoryDoubleChest((InventoryLargeChest) this.container); -+ } else { -+ inventory = new CraftInventory(this.container); -+ } -+ -+ bukkitEntity = new CraftInventoryView(this.player.player.getBukkitEntity(), inventory, this); -+ return bukkitEntity; -+ } -+ // CraftBukkit end - - public ContainerChest(IInventory iinventory, IInventory iinventory1, EntityHuman entityhuman) { - this.container = iinventory1; -@@ -11,6 +39,11 @@ - iinventory1.startOpen(entityhuman); - int i = (this.f - 4) * 18; - -+ // CraftBukkit start - Save player -+ // TODO: Should we check to make sure it really is an InventoryPlayer? -+ this.player = (PlayerInventory) iinventory; -+ // CraftBukkit end -+ - int j; - int k; - -@@ -33,6 +66,7 @@ - } - - public boolean a(EntityHuman entityhuman) { -+ if (!this.checkReachable) return true; // CraftBukkit - return this.container.a(entityhuman); - } - diff --git a/TacoSpigot-Server/nms-patches/ContainerDispenser.patch b/TacoSpigot-Server/nms-patches/ContainerDispenser.patch deleted file mode 100644 index 44e157e..0000000 --- a/TacoSpigot-Server/nms-patches/ContainerDispenser.patch +++ /dev/null @@ -1,53 +0,0 @@ ---- a/net/minecraft/server/ContainerDispenser.java -+++ b/net/minecraft/server/ContainerDispenser.java -@@ -1,11 +1,24 @@ - package net.minecraft.server; - -+// CraftBukkit start -+import org.bukkit.craftbukkit.inventory.CraftInventory; -+import org.bukkit.craftbukkit.inventory.CraftInventoryView; -+// CraftBukkit end -+ - public class ContainerDispenser extends Container { - - public IInventory items; -+ // CraftBukkit start -+ private CraftInventoryView bukkitEntity = null; -+ private PlayerInventory player; -+ // CraftBukkit end - - public ContainerDispenser(IInventory iinventory, IInventory iinventory1) { - this.items = iinventory1; -+ // CraftBukkit start - Save player -+ // TODO: Should we check to make sure it really is an InventoryPlayer? -+ this.player = (PlayerInventory)iinventory; -+ // CraftBukkit end - - int i; - int j; -@@ -29,6 +42,7 @@ - } - - public boolean a(EntityHuman entityhuman) { -+ if (!this.checkReachable) return true; // CraftBukkit - return this.items.a(entityhuman); - } - -@@ -63,4 +77,17 @@ - - return itemstack; - } -+ -+ // CraftBukkit start -+ @Override -+ public CraftInventoryView getBukkitView() { -+ if (bukkitEntity != null) { -+ return bukkitEntity; -+ } -+ -+ CraftInventory inventory = new CraftInventory(this.items); -+ bukkitEntity = new CraftInventoryView(this.player.player.getBukkitEntity(), inventory, this); -+ return bukkitEntity; -+ } -+ // CraftBukkit end - } diff --git a/TacoSpigot-Server/nms-patches/ContainerEnchantTable.patch b/TacoSpigot-Server/nms-patches/ContainerEnchantTable.patch deleted file mode 100644 index 5e436ed..0000000 --- a/TacoSpigot-Server/nms-patches/ContainerEnchantTable.patch +++ /dev/null @@ -1,177 +0,0 @@ ---- a/net/minecraft/server/ContainerEnchantTable.java -+++ b/net/minecraft/server/ContainerEnchantTable.java -@@ -3,9 +3,21 @@ - import java.util.List; - import java.util.Random; - -+// CraftBukkit start -+import java.util.Map; -+ -+import org.bukkit.craftbukkit.inventory.CraftInventoryEnchanting; -+import org.bukkit.craftbukkit.inventory.CraftInventoryView; -+import org.bukkit.craftbukkit.inventory.CraftItemStack; -+import org.bukkit.event.enchantment.EnchantItemEvent; -+import org.bukkit.event.enchantment.PrepareItemEnchantEvent; -+import org.bukkit.entity.Player; -+// CraftBukkit end -+ - public class ContainerEnchantTable extends Container { - -- public IInventory enchantSlots = new InventorySubcontainer("Enchant", true, 2) { -+ // CraftBukkit - make type specific (changed from IInventory) -+ public InventorySubcontainer enchantSlots = new InventorySubcontainer("Enchant", true, 2) { - public int getMaxStackSize() { - return 64; - } -@@ -21,6 +33,10 @@ - public int f; - public int[] costs = new int[3]; - public int[] h = new int[] { -1, -1, -1}; -+ // CraftBukkit start -+ private CraftInventoryView bukkitEntity = null; -+ private Player player; -+ // CraftBukkit end - - public ContainerEnchantTable(PlayerInventory playerinventory, World world, BlockPosition blockposition) { - this.world = world; -@@ -53,6 +69,9 @@ - this.a(new Slot(playerinventory, i, 8 + i * 18, 142)); - } - -+ // CraftBukkit start -+ player = (Player) playerinventory.player.getBukkitEntity(); -+ // CraftBukkit end - } - - public void addSlotListener(ICrafting icrafting) { -@@ -88,7 +107,7 @@ - ItemStack itemstack = iinventory.getItem(0); - int i; - -- if (itemstack != null && itemstack.v()) { -+ if (itemstack != null) { // CraftBukkit - relax condition - if (!this.world.isClientSide) { - i = 0; - -@@ -136,6 +155,20 @@ - } - } - -+ // CraftBukkit start -+ CraftItemStack item = CraftItemStack.asCraftMirror(itemstack); -+ PrepareItemEnchantEvent event = new PrepareItemEnchantEvent(player, this.getBukkitView(), this.world.getWorld().getBlockAt(position.getX(), position.getY(), position.getZ()), item, this.costs, i); -+ event.setCancelled(!itemstack.v()); -+ this.world.getServer().getPluginManager().callEvent(event); -+ -+ if (event.isCancelled()) { -+ for (i = 0; i < 3; ++i) { -+ this.costs[i] = 0; -+ } -+ return; -+ } -+ // CraftBukkit end -+ - for (j = 0; j < 3; ++j) { - if (this.costs[j] > 0) { - List list = this.a(itemstack, j, this.costs[j]); -@@ -170,24 +203,55 @@ - } else if (this.costs[i] > 0 && itemstack != null && (entityhuman.expLevel >= j && entityhuman.expLevel >= this.costs[i] || entityhuman.abilities.canInstantlyBuild)) { - if (!this.world.isClientSide) { - List list = this.a(itemstack, i, this.costs[i]); -+ // CraftBukkit start - Provide an empty enchantment list -+ if (list == null) { -+ list = new java.util.ArrayList(); -+ } -+ // CraftBukkit end - boolean flag = itemstack.getItem() == Items.BOOK; - - if (list != null) { -- entityhuman.enchantDone(j); -+ // CraftBukkit start -+ Map enchants = new java.util.HashMap(); -+ for (Object obj : list) { -+ WeightedRandomEnchant instance = (WeightedRandomEnchant) obj; -+ enchants.put(org.bukkit.enchantments.Enchantment.getById(instance.enchantment.id), instance.level); -+ } -+ CraftItemStack item = CraftItemStack.asCraftMirror(itemstack); -+ -+ EnchantItemEvent event = new EnchantItemEvent((Player) entityhuman.getBukkitEntity(), this.getBukkitView(), this.world.getWorld().getBlockAt(position.getX(), position.getY(), position.getZ()), item, this.costs[i], enchants, i); -+ this.world.getServer().getPluginManager().callEvent(event); -+ -+ int level = event.getExpLevelCost(); -+ if (event.isCancelled() || (level > entityhuman.expLevel && !entityhuman.abilities.canInstantlyBuild) || event.getEnchantsToAdd().isEmpty()) { -+ return false; -+ } - if (flag) { - itemstack.setItem(Items.ENCHANTED_BOOK); - } - -- for (int k = 0; k < list.size(); ++k) { -- WeightedRandomEnchant weightedrandomenchant = (WeightedRandomEnchant) list.get(k); -+ for (Map.Entry entry : event.getEnchantsToAdd().entrySet()) { -+ try { -+ if (flag) { -+ int enchantId = entry.getKey().getId(); -+ if (Enchantment.getById(enchantId) == null) { -+ continue; -+ } - -- if (flag) { -- Items.ENCHANTED_BOOK.a(itemstack, weightedrandomenchant); -- } else { -- itemstack.addEnchantment(weightedrandomenchant.enchantment, weightedrandomenchant.level); -+ WeightedRandomEnchant enchantment = new WeightedRandomEnchant(Enchantment.getById(enchantId), entry.getValue()); -+ Items.ENCHANTED_BOOK.a(itemstack, enchantment); -+ } else { -+ item.addUnsafeEnchantment(entry.getKey(), entry.getValue()); -+ } -+ } catch (IllegalArgumentException e) { -+ /* Just swallow invalid enchantments */ - } - } - -+ entityhuman.enchantDone(j); -+ // CraftBukkit end -+ -+ // CraftBukkit - TODO: let plugins change this - if (!entityhuman.abilities.canInstantlyBuild) { - itemstack1.count -= j; - if (itemstack1.count <= 0) { -@@ -221,6 +285,11 @@ - - public void b(EntityHuman entityhuman) { - super.b(entityhuman); -+ // CraftBukkit Start - If an enchantable was opened from a null location, set the world to the player's world, preventing a crash -+ if(this.world == null) { -+ this.world = entityhuman.getWorld(); -+ } -+ // CraftBukkit end - if (!this.world.isClientSide) { - for (int i = 0; i < this.enchantSlots.getSize(); ++i) { - ItemStack itemstack = this.enchantSlots.splitWithoutUpdate(i); -@@ -234,6 +303,7 @@ - } - - public boolean a(EntityHuman entityhuman) { -+ if (!this.checkReachable) return true; // CraftBukkit - return this.world.getType(this.position).getBlock() != Blocks.ENCHANTING_TABLE ? false : entityhuman.e((double) this.position.getX() + 0.5D, (double) this.position.getY() + 0.5D, (double) this.position.getZ() + 0.5D) <= 64.0D; - } - -@@ -286,4 +356,17 @@ - - return itemstack; - } -+ -+ // CraftBukkit start -+ @Override -+ public CraftInventoryView getBukkitView() { -+ if (bukkitEntity != null) { -+ return bukkitEntity; -+ } -+ -+ CraftInventoryEnchanting inventory = new CraftInventoryEnchanting(this.enchantSlots); -+ bukkitEntity = new CraftInventoryView(this.player, inventory, this); -+ return bukkitEntity; -+ } -+ // CraftBukkit end - } diff --git a/TacoSpigot-Server/nms-patches/ContainerFurnace.patch b/TacoSpigot-Server/nms-patches/ContainerFurnace.patch deleted file mode 100644 index e64b781..0000000 --- a/TacoSpigot-Server/nms-patches/ContainerFurnace.patch +++ /dev/null @@ -1,50 +0,0 @@ ---- a/net/minecraft/server/ContainerFurnace.java -+++ b/net/minecraft/server/ContainerFurnace.java -@@ -1,5 +1,10 @@ - package net.minecraft.server; - -+// CraftBukkit start -+import org.bukkit.craftbukkit.inventory.CraftInventoryFurnace; -+import org.bukkit.craftbukkit.inventory.CraftInventoryView; -+// CraftBukkit end -+ - public class ContainerFurnace extends Container { - - private final IInventory furnace; -@@ -8,11 +13,28 @@ - private int h; - private int i; - -+ // CraftBukkit start -+ private CraftInventoryView bukkitEntity = null; -+ private PlayerInventory player; -+ -+ @Override -+ public CraftInventoryView getBukkitView() { -+ if (bukkitEntity != null) { -+ return bukkitEntity; -+ } -+ -+ CraftInventoryFurnace inventory = new CraftInventoryFurnace((TileEntityFurnace) this.furnace); -+ bukkitEntity = new CraftInventoryView(this.player.player.getBukkitEntity(), inventory, this); -+ return bukkitEntity; -+ } -+ // CraftBukkit end -+ - public ContainerFurnace(PlayerInventory playerinventory, IInventory iinventory) { - this.furnace = iinventory; - this.a(new Slot(iinventory, 0, 56, 17)); - this.a((Slot) (new SlotFurnaceFuel(iinventory, 1, 56, 53))); - this.a((Slot) (new SlotFurnaceResult(playerinventory.player, iinventory, 2, 116, 35))); -+ this.player = playerinventory; // CraftBukkit - save player - - int i; - -@@ -63,6 +85,7 @@ - } - - public boolean a(EntityHuman entityhuman) { -+ if (!this.checkReachable) return true; // CraftBukkit - return this.furnace.a(entityhuman); - } - diff --git a/TacoSpigot-Server/nms-patches/ContainerHopper.patch b/TacoSpigot-Server/nms-patches/ContainerHopper.patch deleted file mode 100644 index a78872c..0000000 --- a/TacoSpigot-Server/nms-patches/ContainerHopper.patch +++ /dev/null @@ -1,44 +0,0 @@ ---- a/net/minecraft/server/ContainerHopper.java -+++ b/net/minecraft/server/ContainerHopper.java -@@ -1,11 +1,33 @@ - package net.minecraft.server; - -+// CraftBukkit start -+import org.bukkit.craftbukkit.inventory.CraftInventory; -+import org.bukkit.craftbukkit.inventory.CraftInventoryView; -+// CraftBukkit end -+ - public class ContainerHopper extends Container { - - private final IInventory hopper; - -+ // CraftBukkit start -+ private CraftInventoryView bukkitEntity = null; -+ private PlayerInventory player; -+ -+ @Override -+ public CraftInventoryView getBukkitView() { -+ if (bukkitEntity != null) { -+ return bukkitEntity; -+ } -+ -+ CraftInventory inventory = new CraftInventory(this.hopper); -+ bukkitEntity = new CraftInventoryView(this.player.player.getBukkitEntity(), inventory, this); -+ return bukkitEntity; -+ } -+ // CraftBukkit end -+ - public ContainerHopper(PlayerInventory playerinventory, IInventory iinventory, EntityHuman entityhuman) { - this.hopper = iinventory; -+ this.player = playerinventory; // CraftBukkit - save player - iinventory.startOpen(entityhuman); - byte b0 = 51; - -@@ -28,6 +50,7 @@ - } - - public boolean a(EntityHuman entityhuman) { -+ if (!this.checkReachable) return true; // CraftBukkit - return this.hopper.a(entityhuman); - } - diff --git a/TacoSpigot-Server/nms-patches/ContainerHorse.patch b/TacoSpigot-Server/nms-patches/ContainerHorse.patch deleted file mode 100644 index 845da06..0000000 --- a/TacoSpigot-Server/nms-patches/ContainerHorse.patch +++ /dev/null @@ -1,36 +0,0 @@ ---- a/net/minecraft/server/ContainerHorse.java -+++ b/net/minecraft/server/ContainerHorse.java -@@ -1,11 +1,33 @@ - package net.minecraft.server; - -+// CraftBukkit start -+import org.bukkit.craftbukkit.inventory.CraftInventory; -+import org.bukkit.craftbukkit.inventory.CraftInventoryView; -+import org.bukkit.inventory.InventoryView; -+// CraftBukkit end -+ - public class ContainerHorse extends Container { - - private IInventory a; - private EntityHorse f; - -+ // CraftBukkit start -+ org.bukkit.craftbukkit.inventory.CraftInventoryView bukkitEntity; -+ PlayerInventory player; -+ -+ @Override -+ public InventoryView getBukkitView() { -+ if (bukkitEntity != null) { -+ return bukkitEntity; -+ } -+ -+ CraftInventory inventory = new org.bukkit.craftbukkit.inventory.CraftInventoryHorse(this.a); -+ return bukkitEntity = new CraftInventoryView(player.player.getBukkitEntity(), inventory, this); -+ } -+ - public ContainerHorse(IInventory iinventory, final IInventory iinventory1, final EntityHorse entityhorse, EntityHuman entityhuman) { -+ player = (PlayerInventory) iinventory; -+ // CraftBukkit end - this.a = iinventory1; - this.f = entityhorse; - byte b0 = 3; diff --git a/TacoSpigot-Server/nms-patches/ContainerMerchant.patch b/TacoSpigot-Server/nms-patches/ContainerMerchant.patch deleted file mode 100644 index 362f8d7..0000000 --- a/TacoSpigot-Server/nms-patches/ContainerMerchant.patch +++ /dev/null @@ -1,37 +0,0 @@ ---- a/net/minecraft/server/ContainerMerchant.java -+++ b/net/minecraft/server/ContainerMerchant.java -@@ -1,11 +1,26 @@ - package net.minecraft.server; - -+import org.bukkit.craftbukkit.inventory.CraftInventoryView; // CraftBukkit -+ - public class ContainerMerchant extends Container { - - private IMerchant merchant; - private InventoryMerchant f; - private final World g; - -+ // CraftBukkit start -+ private CraftInventoryView bukkitEntity = null; -+ private PlayerInventory player; -+ -+ @Override -+ public CraftInventoryView getBukkitView() { -+ if (bukkitEntity == null) { -+ bukkitEntity = new CraftInventoryView(this.player.player.getBukkitEntity(), new org.bukkit.craftbukkit.inventory.CraftInventoryMerchant((InventoryMerchant) f), this); -+ } -+ return bukkitEntity; -+ } -+ // CraftBukkit end -+ - public ContainerMerchant(PlayerInventory playerinventory, IMerchant imerchant, World world) { - this.merchant = imerchant; - this.g = world; -@@ -13,6 +28,7 @@ - this.a(new Slot(this.f, 0, 36, 53)); - this.a(new Slot(this.f, 1, 62, 53)); - this.a((Slot) (new SlotMerchantResult(playerinventory.player, imerchant, this.f, 2, 120, 53))); -+ this.player = playerinventory; // CraftBukkit - save player - - int i; - diff --git a/TacoSpigot-Server/nms-patches/ContainerPlayer.patch b/TacoSpigot-Server/nms-patches/ContainerPlayer.patch deleted file mode 100644 index 482d838..0000000 --- a/TacoSpigot-Server/nms-patches/ContainerPlayer.patch +++ /dev/null @@ -1,104 +0,0 @@ ---- a/net/minecraft/server/ContainerPlayer.java -+++ b/net/minecraft/server/ContainerPlayer.java -@@ -1,28 +1,42 @@ - package net.minecraft.server; - -+// CraftBukkit start -+import org.bukkit.craftbukkit.inventory.CraftInventoryCrafting; -+import org.bukkit.craftbukkit.inventory.CraftInventoryView; -+// CraftBukkit end -+ - public class ContainerPlayer extends Container { - - public InventoryCrafting craftInventory = new InventoryCrafting(this, 2, 2); - public IInventory resultInventory = new InventoryCraftResult(); - public boolean g; - private final EntityHuman h; -+ // CraftBukkit start -+ private CraftInventoryView bukkitEntity = null; -+ private PlayerInventory player; -+ // CraftBukkit end - - public ContainerPlayer(final PlayerInventory playerinventory, boolean flag, EntityHuman entityhuman) { - this.g = flag; - this.h = entityhuman; -+ this.resultInventory = new InventoryCraftResult(); // CraftBukkit - moved to before InventoryCrafting construction -+ this.craftInventory = new InventoryCrafting(this, 2, 2, playerinventory.player); // CraftBukkit - pass player -+ this.craftInventory.resultInventory = this.resultInventory; // CraftBukkit - let InventoryCrafting know about its result slot -+ this.player = playerinventory; // CraftBukkit - save player - this.a((Slot) (new SlotResult(playerinventory.player, this.craftInventory, this.resultInventory, 0, 144, 36))); - -- final int i; -+ // CraftBukkit - fixed multiple decompiler errors below, good luck - int j; - -- for (i = 0; i < 2; ++i) { -+ for (int i = 0; i < 2; ++i) { - for (j = 0; j < 2; ++j) { - this.a(new Slot(this.craftInventory, j + i * 2, 88 + j * 18, 26 + i * 18)); - } - } - -- for (i = 0; i < 4; ++i) { -- this.a(new Slot(playerinventory, playerinventory.getSize() - 1 - i, 8, 8 + i * 18) { -+ for (int ii = 0; ii < 4; ++ii) { -+ final int i = ii; -+ this.a(new Slot(playerinventory, playerinventory.getSize() - 1 - ii, 8, 8 + ii * 18) { - public int getMaxStackSize() { - return 1; - } -@@ -33,21 +47,32 @@ - }); - } - -- for (i = 0; i < 3; ++i) { -+ for (int i = 0; i < 3; ++i) { - for (j = 0; j < 9; ++j) { - this.a(new Slot(playerinventory, j + (i + 1) * 9, 8 + j * 18, 84 + i * 18)); - } - } - -- for (i = 0; i < 9; ++i) { -+ for (int i = 0; i < 9; ++i) { - this.a(new Slot(playerinventory, i, 8 + i * 18, 142)); - } - -- this.a((IInventory) this.craftInventory); -+ // this.a((IInventory) this.craftInventory); // CraftBukkit - unneeded since it just sets result slot to empty - } - - public void a(IInventory iinventory) { -- this.resultInventory.setItem(0, CraftingManager.getInstance().craft(this.craftInventory, this.h.world)); -+ // this.resultInventory.setItem(0, CraftingManager.getInstance().craft(this.craftInventory, this.h.world)); -+ // CraftBukkit start (Note: the following line would cause an error if called during construction) -+ CraftingManager.getInstance().lastCraftView = getBukkitView(); -+ ItemStack craftResult = CraftingManager.getInstance().craft(this.craftInventory, this.h.world); -+ this.resultInventory.setItem(0, craftResult); -+ if (super.listeners.size() < 1) { -+ return; -+ } -+ -+ EntityPlayer player = (EntityPlayer) super.listeners.get(0); // TODO: Is this _always_ correct? Seems like it. -+ player.playerConnection.sendPacket(new PacketPlayOutSetSlot(player.activeContainer.windowId, 0, craftResult)); -+ // CraftBukkit end - } - - public void b(EntityHuman entityhuman) { -@@ -127,4 +152,17 @@ - public boolean a(ItemStack itemstack, Slot slot) { - return slot.inventory != this.resultInventory && super.a(itemstack, slot); - } -+ -+ // CraftBukkit start -+ @Override -+ public CraftInventoryView getBukkitView() { -+ if (bukkitEntity != null) { -+ return bukkitEntity; -+ } -+ -+ CraftInventoryCrafting inventory = new CraftInventoryCrafting(this.craftInventory, this.resultInventory); -+ bukkitEntity = new CraftInventoryView(this.player.player.getBukkitEntity(), inventory, this); -+ return bukkitEntity; -+ } -+ // CraftBukkit end - } diff --git a/TacoSpigot-Server/nms-patches/ContainerWorkbench.patch b/TacoSpigot-Server/nms-patches/ContainerWorkbench.patch deleted file mode 100644 index 850e440..0000000 --- a/TacoSpigot-Server/nms-patches/ContainerWorkbench.patch +++ /dev/null @@ -1,82 +0,0 @@ ---- a/net/minecraft/server/ContainerWorkbench.java -+++ b/net/minecraft/server/ContainerWorkbench.java -@@ -1,13 +1,28 @@ - package net.minecraft.server; - -+// CraftBukkit start -+import org.bukkit.craftbukkit.inventory.CraftInventoryCrafting; -+import org.bukkit.craftbukkit.inventory.CraftInventoryView; -+// CraftBukkit end -+ - public class ContainerWorkbench extends Container { - -- public InventoryCrafting craftInventory = new InventoryCrafting(this, 3, 3); -- public IInventory resultInventory = new InventoryCraftResult(); -+ public InventoryCrafting craftInventory; // CraftBukkit - move initialization into constructor -+ public IInventory resultInventory; // CraftBukkit - move initialization into constructor - private World g; - private BlockPosition h; -+ // CraftBukkit start -+ private CraftInventoryView bukkitEntity = null; -+ private PlayerInventory player; -+ // CraftBukkit end - - public ContainerWorkbench(PlayerInventory playerinventory, World world, BlockPosition blockposition) { -+ // CraftBukkit start - Switched order of IInventory construction and stored player -+ this.resultInventory = new InventoryCraftResult(); -+ this.craftInventory = new InventoryCrafting(this, 3, 3, playerinventory.player); // CraftBukkit - pass player -+ this.craftInventory.resultInventory = this.resultInventory; -+ this.player = playerinventory; -+ // CraftBukkit end - this.g = world; - this.h = blockposition; - this.a((Slot) (new SlotResult(playerinventory.player, this.craftInventory, this.resultInventory, 0, 124, 35))); -@@ -35,7 +50,21 @@ - } - - public void a(IInventory iinventory) { -- this.resultInventory.setItem(0, CraftingManager.getInstance().craft(this.craftInventory, this.g)); -+ // this.resultInventory.setItem(0, CraftingManager.getInstance().craft(this.craftInventory, this.g)); -+ // CraftBukkit start -+ CraftingManager.getInstance().lastCraftView = getBukkitView(); -+ ItemStack craftResult = CraftingManager.getInstance().craft(this.craftInventory, this.g); -+ this.resultInventory.setItem(0, craftResult); -+ if (super.listeners.size() < 1) { -+ return; -+ } -+ // See CraftBukkit PR #39 -+ if (craftResult != null && craftResult.getItem() == Items.FILLED_MAP) { -+ return; -+ } -+ EntityPlayer player = (EntityPlayer) super.listeners.get(0); // TODO: Is this _always_ correct? Seems like it. -+ player.playerConnection.sendPacket(new PacketPlayOutSetSlot(player.activeContainer.windowId, 0, craftResult)); -+ // CraftBukkit end - } - - public void b(EntityHuman entityhuman) { -@@ -53,6 +82,7 @@ - } - - public boolean a(EntityHuman entityhuman) { -+ if (!this.checkReachable) return true; // CraftBukkit - return this.g.getType(this.h).getBlock() != Blocks.CRAFTING_TABLE ? false : entityhuman.e((double) this.h.getX() + 0.5D, (double) this.h.getY() + 0.5D, (double) this.h.getZ() + 0.5D) <= 64.0D; - } - -@@ -101,4 +131,17 @@ - public boolean a(ItemStack itemstack, Slot slot) { - return slot.inventory != this.resultInventory && super.a(itemstack, slot); - } -+ -+ // CraftBukkit start -+ @Override -+ public CraftInventoryView getBukkitView() { -+ if (bukkitEntity != null) { -+ return bukkitEntity; -+ } -+ -+ CraftInventoryCrafting inventory = new CraftInventoryCrafting(this.craftInventory, this.resultInventory); -+ bukkitEntity = new CraftInventoryView(this.player.player.getBukkitEntity(), inventory, this); -+ return bukkitEntity; -+ } -+ // CraftBukkit end - } diff --git a/TacoSpigot-Server/nms-patches/CraftingManager.patch b/TacoSpigot-Server/nms-patches/CraftingManager.patch deleted file mode 100644 index 3a7c82e..0000000 --- a/TacoSpigot-Server/nms-patches/CraftingManager.patch +++ /dev/null @@ -1,53 +0,0 @@ ---- a/net/minecraft/server/CraftingManager.java -+++ b/net/minecraft/server/CraftingManager.java -@@ -9,10 +9,16 @@ - import java.util.Iterator; - import java.util.List; - -+import org.bukkit.craftbukkit.event.CraftEventFactory; // CraftBukkit -+ - public class CraftingManager { - - private static final CraftingManager a = new CraftingManager(); - public List recipes = Lists.newArrayList(); -+ // CraftBukkit start -+ public IRecipe lastRecipe; -+ public org.bukkit.inventory.InventoryView lastCraftView; -+ // CraftBukkit end - - public static CraftingManager getInstance() { - return CraftingManager.a; -@@ -167,7 +173,12 @@ - this.registerShapedRecipe(new ItemStack(Blocks.DAYLIGHT_DETECTOR), new Object[] { "GGG", "QQQ", "WWW", Character.valueOf('G'), Blocks.GLASS, Character.valueOf('Q'), Items.QUARTZ, Character.valueOf('W'), Blocks.WOODEN_SLAB}); - this.registerShapedRecipe(new ItemStack(Blocks.HOPPER), new Object[] { "I I", "ICI", " I ", Character.valueOf('I'), Items.IRON_INGOT, Character.valueOf('C'), Blocks.CHEST}); - this.registerShapedRecipe(new ItemStack(Items.ARMOR_STAND, 1), new Object[] { "///", " / ", "/_/", Character.valueOf('/'), Items.STICK, Character.valueOf('_'), new ItemStack(Blocks.STONE_SLAB, 1, BlockDoubleStepAbstract.EnumStoneSlabVariant.STONE.a())}); -- Collections.sort(this.recipes, new Comparator() { -+ sort(); -+ } -+ -+ // CraftBukkit start -+ public void sort() { -+ Collections.sort(this.recipes, new Comparator() { - public int a(IRecipe irecipe, IRecipe irecipe1) { - return irecipe instanceof ShapelessRecipes && irecipe1 instanceof ShapedRecipes ? 1 : (irecipe1 instanceof ShapelessRecipes && irecipe instanceof ShapedRecipes ? -1 : (irecipe1.a() < irecipe.a() ? -1 : (irecipe1.a() > irecipe.a() ? 1 : 0))); - } -@@ -274,13 +285,18 @@ - - do { - if (!iterator.hasNext()) { -+ inventorycrafting.currentRecipe = null; // CraftBukkit - Clear recipe when no recipe is found - return null; - } - - irecipe = (IRecipe) iterator.next(); - } while (!irecipe.a(inventorycrafting, world)); - -- return irecipe.craftItem(inventorycrafting); -+ // CraftBukkit start - INVENTORY_PRE_CRAFT event -+ inventorycrafting.currentRecipe = irecipe; -+ ItemStack result = irecipe.craftItem(inventorycrafting); -+ return CraftEventFactory.callPreCraftEvent(inventorycrafting, result, lastCraftView, false); -+ // CraftBukkit end - } - - public ItemStack[] b(InventoryCrafting inventorycrafting, World world) { diff --git a/TacoSpigot-Server/nms-patches/CrashReport.patch b/TacoSpigot-Server/nms-patches/CrashReport.patch deleted file mode 100644 index f0dc064..0000000 --- a/TacoSpigot-Server/nms-patches/CrashReport.patch +++ /dev/null @@ -1,10 +0,0 @@ ---- a/net/minecraft/server/CrashReport.java -+++ b/net/minecraft/server/CrashReport.java -@@ -124,6 +124,7 @@ - return this.a(); - } - }); -+ this.d.a("CraftBukkit Information", (Callable) (new org.bukkit.craftbukkit.CraftCrashReport())); // CraftBukkit - } - - public String a() { diff --git a/TacoSpigot-Server/nms-patches/DedicatedServer.patch b/TacoSpigot-Server/nms-patches/DedicatedServer.patch deleted file mode 100644 index e1210d2..0000000 --- a/TacoSpigot-Server/nms-patches/DedicatedServer.patch +++ /dev/null @@ -1,248 +0,0 @@ ---- a/net/minecraft/server/DedicatedServer.java -+++ b/net/minecraft/server/DedicatedServer.java -@@ -15,10 +15,20 @@ - import org.apache.logging.log4j.LogManager; - import org.apache.logging.log4j.Logger; - -+// CraftBukkit start -+import java.io.PrintStream; -+import org.apache.logging.log4j.Level; -+ -+import org.bukkit.craftbukkit.LoggerOutputStream; -+import org.bukkit.event.server.ServerCommandEvent; -+import org.bukkit.craftbukkit.util.Waitable; -+import org.bukkit.event.server.RemoteServerCommandEvent; -+// CraftBukkit end -+ - public class DedicatedServer extends MinecraftServer implements IMinecraftServer { - - private static final Logger LOGGER = LogManager.getLogger(); -- private final List l = Collections.synchronizedList(Lists.newArrayList()); -+ private final List l = Collections.synchronizedList(Lists.newArrayList()); // CraftBukkit - fix decompile error - private RemoteStatusListener m; - private RemoteControlListener n; - public PropertyManager propertyManager; -@@ -27,8 +37,10 @@ - private WorldSettings.EnumGamemode r; - private boolean s; - -- public DedicatedServer(File file) { -- super(file, Proxy.NO_PROXY, DedicatedServer.a); -+ // CraftBukkit start - Signature changed -+ public DedicatedServer(joptsimple.OptionSet options) { -+ super(options, Proxy.NO_PROXY, DedicatedServer.a); -+ // CraftBukkit end - Thread thread = new Thread("Server Infinisleeper") { - { - this.setDaemon(true); -@@ -50,13 +62,27 @@ - protected boolean init() throws IOException { - Thread thread = new Thread("Server console handler") { - public void run() { -- BufferedReader bufferedreader = new BufferedReader(new InputStreamReader(System.in)); -+ // CraftBukkit start -+ if (!org.bukkit.craftbukkit.Main.useConsole) { -+ return; -+ } -+ // CraftBukkit end - -+ jline.console.ConsoleReader bufferedreader = reader; // CraftBukkit - String s; - - try { -- while (!DedicatedServer.this.isStopped() && DedicatedServer.this.isRunning() && (s = bufferedreader.readLine()) != null) { -- DedicatedServer.this.issueCommand(s, DedicatedServer.this); -+ // CraftBukkit start - JLine disabling compatibility -+ while (!isStopped() && 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); -+ } -+ // CraftBukkit end - } - } catch (IOException ioexception) { - DedicatedServer.LOGGER.error("Exception handling console input", ioexception); -@@ -65,6 +91,27 @@ - } - }; - -+ // CraftBukkit start - TODO: handle command-line logging arguments -+ java.util.logging.Logger global = java.util.logging.Logger.getLogger(""); -+ global.setUseParentHandlers(false); -+ for (java.util.logging.Handler handler : global.getHandlers()) { -+ global.removeHandler(handler); -+ } -+ global.addHandler(new org.bukkit.craftbukkit.util.ForwardLogHandler()); -+ -+ final org.apache.logging.log4j.core.Logger logger = ((org.apache.logging.log4j.core.Logger) LogManager.getRootLogger()); -+ for (org.apache.logging.log4j.core.Appender appender : logger.getAppenders().values()) { -+ if (appender instanceof org.apache.logging.log4j.core.appender.ConsoleAppender) { -+ logger.removeAppender(appender); -+ } -+ } -+ -+ new Thread(new org.bukkit.craftbukkit.util.TerminalConsoleWriterThread(System.out, this.reader)).start(); -+ -+ System.setOut(new PrintStream(new LoggerOutputStream(logger, Level.INFO), true)); -+ System.setErr(new PrintStream(new LoggerOutputStream(logger, Level.WARN), true)); -+ // CraftBukkit end -+ - thread.setDaemon(true); - thread.start(); - DedicatedServer.LOGGER.info("Starting minecraft server version 1.8.8"); -@@ -73,7 +120,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.p = new EULA(new File("eula.txt")); - if (!this.p.a()) { - DedicatedServer.LOGGER.info("You need to agree to the EULA in order to run the server. Go to eula.txt for more info."); -@@ -129,6 +176,8 @@ - return false; - } - -+ this.a((PlayerList) (new DedicatedPlayerList(this))); // CraftBukkit -+ - if (!this.getOnlineMode()) { - DedicatedServer.LOGGER.warn("**** SERVER IS RUNNING IN OFFLINE/INSECURE MODE!"); - DedicatedServer.LOGGER.warn("The server will make no attempt to authenticate usernames. Beware."); -@@ -143,7 +192,7 @@ - if (!NameReferencingFileConverter.a(this.propertyManager)) { - return false; - } else { -- this.a((PlayerList) (new DedicatedPlayerList(this))); -+ this.convertable = new WorldLoaderServer(server.getWorldContainer()); // CraftBukkit - moved from MinecraftServer constructor - long j = System.nanoTime(); - - if (this.U() == null) { -@@ -198,7 +247,18 @@ - DedicatedServer.LOGGER.info("Starting remote control listener"); - this.n = new RemoteControlListener(this); - this.n.a(); -+ this.remoteConsole = new org.bukkit.craftbukkit.command.CraftRemoteConsoleCommandSender(); // CraftBukkit -+ } -+ -+ // CraftBukkit start -+ if (this.server.getBukkitSpawnRadius() > -1) { -+ DedicatedServer.LOGGER.info("'settings.spawn-radius' in bukkit.yml has been moved to 'spawn-protection' in server.properties. I will move your config for you."); -+ this.propertyManager.properties.remove("spawn-protection"); -+ this.propertyManager.getInt("spawn-protection", this.server.getBukkitSpawnRadius()); -+ this.server.removeBukkitSpawnRadius(); -+ this.propertyManager.savePropertiesFile(); - } -+ // CraftBukkit end - - if (this.aS() > 0L) { - Thread thread1 = new Thread(new ThreadWatchdog(this)); -@@ -213,6 +273,12 @@ - } - } - -+ // CraftBukkit start -+ public PropertyManager getPropertyManager() { -+ return this.propertyManager; -+ } -+ // CraftBukkit end -+ - public void setGamemode(WorldSettings.EnumGamemode worldsettings_enumgamemode) { - super.setGamemode(worldsettings_enumgamemode); - this.r = worldsettings_enumgamemode; -@@ -265,7 +331,7 @@ - System.exit(0); - } - -- protected void B() { -+ public void B() { // CraftBukkit - fix decompile error - super.B(); - this.aO(); - } -@@ -296,7 +362,15 @@ - while (!this.l.isEmpty()) { - ServerCommand servercommand = (ServerCommand) this.l.remove(0); - -- this.getCommandHandler().a(servercommand.source, servercommand.command); -+ // CraftBukkit start - ServerCommand for preprocessing -+ ServerCommandEvent event = new ServerCommandEvent(console, servercommand.command); -+ server.getPluginManager().callEvent(event); -+ if (event.isCancelled()) continue; -+ servercommand = new ServerCommand(event.getCommand(), servercommand.source); -+ -+ // this.getCommandHandler().a(servercommand.source, servercommand.command); // Called in dispatchServerCommand -+ server.dispatchServerCommand(console, servercommand); -+ // CraftBukkit end - } - - } -@@ -491,13 +565,60 @@ - } - - public String getPlugins() { -- return ""; -- } -+ // CraftBukkit start - Whole method -+ StringBuilder result = new StringBuilder(); -+ org.bukkit.plugin.Plugin[] plugins = server.getPluginManager().getPlugins(); -+ -+ result.append(server.getName()); -+ result.append(" on Bukkit "); -+ result.append(server.getBukkitVersion()); -+ -+ if (plugins.length > 0 && server.getQueryPlugins()) { -+ result.append(": "); -+ -+ for (int i = 0; i < plugins.length; i++) { -+ if (i > 0) { -+ result.append("; "); -+ } - -- public String executeRemoteCommand(String s) { -- RemoteControlCommandListener.getInstance().i(); -- this.b.a(RemoteControlCommandListener.getInstance(), s); -- return RemoteControlCommandListener.getInstance().j(); -+ result.append(plugins[i].getDescription().getName()); -+ result.append(" "); -+ result.append(plugins[i].getDescription().getVersion().replaceAll(";", ",")); -+ } -+ } -+ -+ return result.toString(); -+ // CraftBukkit end -+ } -+ -+ // CraftBukkit start - fire RemoteServerCommandEvent -+ public String executeRemoteCommand(final String s) { -+ Waitable waitable = new Waitable() { -+ @Override -+ protected String evaluate() { -+ RemoteControlCommandListener.getInstance().i(); -+ // Event changes start -+ RemoteServerCommandEvent event = new RemoteServerCommandEvent(remoteConsole, s); -+ server.getPluginManager().callEvent(event); -+ if (event.isCancelled()) { -+ return ""; -+ } -+ // Event change end -+ ServerCommand serverCommand = new ServerCommand(event.getCommand(), RemoteControlCommandListener.getInstance()); -+ server.dispatchServerCommand(remoteConsole, serverCommand); -+ return RemoteControlCommandListener.getInstance().j(); -+ } -+ }; -+ processQueue.add(waitable); -+ try { -+ return waitable.get(); -+ } catch (java.util.concurrent.ExecutionException e) { -+ throw new RuntimeException("Exception processing rcon command " + s, e.getCause()); -+ } catch (InterruptedException e) { -+ Thread.currentThread().interrupt(); // Maintain interrupted state -+ throw new RuntimeException("Interrupted processing rcon command " + s, e); -+ } -+ // CraftBukkit end - } - - public PlayerList getPlayerList() { diff --git a/TacoSpigot-Server/nms-patches/DispenseBehaviorItem.patch b/TacoSpigot-Server/nms-patches/DispenseBehaviorItem.patch deleted file mode 100644 index 61fe049..0000000 --- a/TacoSpigot-Server/nms-patches/DispenseBehaviorItem.patch +++ /dev/null @@ -1,76 +0,0 @@ ---- a/net/minecraft/server/DispenseBehaviorItem.java -+++ b/net/minecraft/server/DispenseBehaviorItem.java -@@ -1,5 +1,10 @@ - package net.minecraft.server; - -+// CraftBukkit start -+import org.bukkit.craftbukkit.inventory.CraftItemStack; -+import org.bukkit.event.block.BlockDispenseEvent; -+// CraftBukkit end -+ - public class DispenseBehaviorItem implements IDispenseBehavior { - - public DispenseBehaviorItem() {} -@@ -17,11 +22,18 @@ - IPosition iposition = BlockDispenser.a(isourceblock); - ItemStack itemstack1 = itemstack.cloneAndSubtract(1); - -- a(isourceblock.getWorld(), itemstack1, 6, enumdirection, iposition); -+ // CraftBukkit start -+ if (!a(isourceblock.getWorld(), itemstack1, 6, enumdirection, isourceblock)) { -+ itemstack.count++; -+ } -+ // CraftBukkit end - return itemstack; - } - -- public static void a(World world, ItemStack itemstack, int i, EnumDirection enumdirection, IPosition iposition) { -+ // CraftBukkit start - void -> boolean return, IPosition -> ISourceBlock last argument -+ public static boolean a(World world, ItemStack itemstack, int i, EnumDirection enumdirection, ISourceBlock isourceblock) { -+ IPosition iposition = BlockDispenser.a(isourceblock); -+ // CraftBukkit end - double d0 = iposition.getX(); - double d1 = iposition.getY(); - double d2 = iposition.getZ(); -@@ -41,7 +53,41 @@ - entityitem.motX += world.random.nextGaussian() * 0.007499999832361937D * (double) i; - entityitem.motY += world.random.nextGaussian() * 0.007499999832361937D * (double) i; - entityitem.motZ += world.random.nextGaussian() * 0.007499999832361937D * (double) i; -+ -+ // CraftBukkit start -+ org.bukkit.block.Block block = world.getWorld().getBlockAt(isourceblock.getBlockPosition().getX(), isourceblock.getBlockPosition().getY(), isourceblock.getBlockPosition().getZ()); -+ CraftItemStack craftItem = CraftItemStack.asCraftMirror(itemstack); -+ -+ BlockDispenseEvent event = new BlockDispenseEvent(block, craftItem.clone(), new org.bukkit.util.Vector(entityitem.motX, entityitem.motY, entityitem.motZ)); -+ if (!BlockDispenser.eventFired) { -+ world.getServer().getPluginManager().callEvent(event); -+ } -+ -+ if (event.isCancelled()) { -+ return false; -+ } -+ -+ entityitem.setItemStack(CraftItemStack.asNMSCopy(event.getItem())); -+ entityitem.motX = event.getVelocity().getX(); -+ entityitem.motY = event.getVelocity().getY(); -+ entityitem.motZ = event.getVelocity().getZ(); -+ -+ if (!event.getItem().getType().equals(craftItem.getType())) { -+ // 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.getClass() != DispenseBehaviorItem.class) { -+ idispensebehavior.a(isourceblock, eventStack); -+ } else { -+ world.addEntity(entityitem); -+ } -+ return false; -+ } -+ - world.addEntity(entityitem); -+ -+ return true; -+ // CraftBukkit end - } - - protected void a(ISourceBlock isourceblock) { diff --git a/TacoSpigot-Server/nms-patches/DispenseBehaviorProjectile.patch b/TacoSpigot-Server/nms-patches/DispenseBehaviorProjectile.patch deleted file mode 100644 index 5cf558a..0000000 --- a/TacoSpigot-Server/nms-patches/DispenseBehaviorProjectile.patch +++ /dev/null @@ -1,54 +0,0 @@ ---- a/net/minecraft/server/DispenseBehaviorProjectile.java -+++ b/net/minecraft/server/DispenseBehaviorProjectile.java -@@ -1,5 +1,10 @@ - package net.minecraft.server; - -+// CraftBukkit start -+import org.bukkit.craftbukkit.inventory.CraftItemStack; -+import org.bukkit.event.block.BlockDispenseEvent; -+// CraftBukkit end -+ - public abstract class DispenseBehaviorProjectile extends DispenseBehaviorItem { - - public DispenseBehaviorProjectile() {} -@@ -10,9 +15,38 @@ - EnumDirection enumdirection = BlockDispenser.b(isourceblock.f()); - IProjectile iprojectile = this.a(world, iposition); - -- iprojectile.shoot((double) enumdirection.getAdjacentX(), (double) ((float) enumdirection.getAdjacentY() + 0.1F), (double) enumdirection.getAdjacentZ(), this.getPower(), this.a()); -+ // iprojectile.shoot((double) enumdirection.getAdjacentX(), (double) ((float) enumdirection.getAdjacentY() + 0.1F), (double) enumdirection.getAdjacentZ(), this.b(), this.a()); -+ // CraftBukkit start -+ ItemStack itemstack1 = itemstack.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((double) enumdirection.getAdjacentX(), (double) ((float) enumdirection.getAdjacentY() + 0.1F), (double) enumdirection.getAdjacentZ())); -+ if (!BlockDispenser.eventFired) { -+ world.getServer().getPluginManager().callEvent(event); -+ } -+ -+ if (event.isCancelled()) { -+ itemstack.count++; -+ return itemstack; -+ } -+ -+ if (!event.getItem().equals(craftItem)) { -+ itemstack.count++; -+ // Chain to handler for new item -+ ItemStack eventStack = CraftItemStack.asNMSCopy(event.getItem()); -+ IDispenseBehavior idispensebehavior = (IDispenseBehavior) BlockDispenser.REGISTRY.get(eventStack.getItem()); -+ if (idispensebehavior != IDispenseBehavior.NONE && idispensebehavior != this) { -+ idispensebehavior.a(isourceblock, eventStack); -+ return itemstack; -+ } -+ } -+ -+ iprojectile.shoot(event.getVelocity().getX(), event.getVelocity().getY(), event.getVelocity().getZ(), this.getPower(), this.a()); -+ ((Entity) iprojectile).projectileSource = new org.bukkit.craftbukkit.projectiles.CraftBlockProjectileSource((TileEntityDispenser) isourceblock.getTileEntity()); -+ // CraftBukkit end - world.addEntity((Entity) iprojectile); -- itemstack.cloneAndSubtract(1); -+ // itemstack.a(1); // CraftBukkit - Handled during event processing - return itemstack; - } - diff --git a/TacoSpigot-Server/nms-patches/DispenserRegistry.patch b/TacoSpigot-Server/nms-patches/DispenserRegistry.patch deleted file mode 100644 index ba9e6a2..0000000 --- a/TacoSpigot-Server/nms-patches/DispenserRegistry.patch +++ /dev/null @@ -1,385 +0,0 @@ ---- a/net/minecraft/server/DispenserRegistry.java -+++ b/net/minecraft/server/DispenserRegistry.java -@@ -7,6 +7,11 @@ - import org.apache.logging.log4j.LogManager; - import org.apache.logging.log4j.Logger; - -+// CraftBukkit start -+import org.bukkit.craftbukkit.inventory.CraftItemStack; -+import org.bukkit.event.block.BlockDispenseEvent; -+// CraftBukkit end -+ - public class DispenserRegistry { - - private static final PrintStream a = System.out; -@@ -74,13 +79,45 @@ - double d0 = isourceblock.getX() + (double) enumdirection.getAdjacentX(); - double d1 = (double) ((float) isourceblock.getBlockPosition().getY() + 0.2F); - double d2 = isourceblock.getZ() + (double) enumdirection.getAdjacentZ(); -- Entity entity = ItemMonsterEgg.a(isourceblock.getWorld(), itemstack.getData(), d0, d1, d2); -+ // Entity entity = ItemMonsterEgg.a(isourceblock.getWorld(), itemstack.getData(), d0, d1, d2); -+ -+ // 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)); -+ if (!BlockDispenser.eventFired) { -+ world.getServer().getPluginManager().callEvent(event); -+ } -+ -+ if (event.isCancelled()) { -+ itemstack.count++; -+ return itemstack; -+ } -+ -+ if (!event.getItem().equals(craftItem)) { -+ itemstack.count++; -+ // Chain to handler for new item -+ ItemStack eventStack = CraftItemStack.asNMSCopy(event.getItem()); -+ IDispenseBehavior idispensebehavior = (IDispenseBehavior) BlockDispenser.REGISTRY.get(eventStack.getItem()); -+ if (idispensebehavior != IDispenseBehavior.NONE && idispensebehavior != this) { -+ idispensebehavior.a(isourceblock, eventStack); -+ return itemstack; -+ } -+ } -+ -+ itemstack1 = CraftItemStack.asNMSCopy(event.getItem()); -+ -+ Entity entity = ItemMonsterEgg.spawnCreature(isourceblock.getWorld(), itemstack.getData(), event.getVelocity().getX(), event.getVelocity().getY(), event.getVelocity().getZ(), org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.DISPENSE_EGG); - - if (entity instanceof EntityLiving && itemstack.hasName()) { - ((EntityInsentient) entity).setCustomName(itemstack.getName()); - } - -- itemstack.cloneAndSubtract(1); -+ // itemstack.a(1); // Handled during event processing -+ // CraftBukkit end - return itemstack; - } - }); -@@ -90,10 +127,39 @@ - double d0 = isourceblock.getX() + (double) enumdirection.getAdjacentX(); - double d1 = (double) ((float) isourceblock.getBlockPosition().getY() + 0.2F); - double d2 = isourceblock.getZ() + (double) enumdirection.getAdjacentZ(); -- EntityFireworks entityfireworks = new EntityFireworks(isourceblock.getWorld(), d0, d1, d2, itemstack); -+ // 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)); -+ if (!BlockDispenser.eventFired) { -+ world.getServer().getPluginManager().callEvent(event); -+ } -+ -+ if (event.isCancelled()) { -+ itemstack.count++; -+ return itemstack; -+ } -+ -+ if (!event.getItem().equals(craftItem)) { -+ itemstack.count++; -+ // Chain to handler for new item -+ ItemStack eventStack = CraftItemStack.asNMSCopy(event.getItem()); -+ IDispenseBehavior idispensebehavior = (IDispenseBehavior) BlockDispenser.REGISTRY.get(eventStack.getItem()); -+ if (idispensebehavior != IDispenseBehavior.NONE && idispensebehavior != this) { -+ idispensebehavior.a(isourceblock, eventStack); -+ return itemstack; -+ } -+ } -+ -+ itemstack1 = CraftItemStack.asNMSCopy(event.getItem()); -+ EntityFireworks entityfireworks = new EntityFireworks(isourceblock.getWorld(), event.getVelocity().getX(), event.getVelocity().getY(), event.getVelocity().getZ(), itemstack1); - - isourceblock.getWorld().addEntity(entityfireworks); -- itemstack.cloneAndSubtract(1); -+ // itemstack.a(1); // Handled during event processing -+ // CraftBukkit end - return itemstack; - } - -@@ -114,8 +180,38 @@ - double d4 = random.nextGaussian() * 0.05D + (double) enumdirection.getAdjacentY(); - double d5 = random.nextGaussian() * 0.05D + (double) enumdirection.getAdjacentZ(); - -- world.addEntity(new EntitySmallFireball(world, d0, d1, d2, d3, d4, d5)); -- itemstack.cloneAndSubtract(1); -+ // CraftBukkit start -+ 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(d3, d4, d5)); -+ if (!BlockDispenser.eventFired) { -+ world.getServer().getPluginManager().callEvent(event); -+ } -+ -+ if (event.isCancelled()) { -+ itemstack.count++; -+ return itemstack; -+ } -+ -+ if (!event.getItem().equals(craftItem)) { -+ itemstack.count++; -+ // Chain to handler for new item -+ ItemStack eventStack = CraftItemStack.asNMSCopy(event.getItem()); -+ IDispenseBehavior idispensebehavior = (IDispenseBehavior) BlockDispenser.REGISTRY.get(eventStack.getItem()); -+ if (idispensebehavior != IDispenseBehavior.NONE && idispensebehavior != this) { -+ idispensebehavior.a(isourceblock, eventStack); -+ return itemstack; -+ } -+ } -+ -+ EntitySmallFireball entitysmallfireball = new EntitySmallFireball(world, d0, d1, d2, event.getVelocity().getX(), event.getVelocity().getY(), event.getVelocity().getZ()); -+ entitysmallfireball.projectileSource = new org.bukkit.craftbukkit.projectiles.CraftBlockProjectileSource((TileEntityDispenser) isourceblock.getTileEntity()); -+ -+ world.addEntity(entitysmallfireball); -+ // itemstack.a(1); // Handled during event processing -+ // CraftBukkit end - return itemstack; - } - -@@ -146,10 +242,38 @@ - d3 = 0.0D; - } - -- EntityBoat entityboat = new EntityBoat(world, d0, d1 + d3, d2); -+ // EntityBoat entityboat = new EntityBoat(world, d0, d1 + d3, d2); -+ // CraftBukkit start -+ ItemStack itemstack1 = itemstack.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 + d3, d2)); -+ if (!BlockDispenser.eventFired) { -+ world.getServer().getPluginManager().callEvent(event); -+ } -+ -+ if (event.isCancelled()) { -+ itemstack.count++; -+ return itemstack; -+ } -+ -+ if (!event.getItem().equals(craftItem)) { -+ itemstack.count++; -+ // Chain to handler for new item -+ ItemStack eventStack = CraftItemStack.asNMSCopy(event.getItem()); -+ IDispenseBehavior idispensebehavior = (IDispenseBehavior) BlockDispenser.REGISTRY.get(eventStack.getItem()); -+ if (idispensebehavior != IDispenseBehavior.NONE && idispensebehavior != this) { -+ idispensebehavior.a(isourceblock, eventStack); -+ return itemstack; -+ } -+ } -+ -+ EntityBoat entityboat = new EntityBoat(world, event.getVelocity().getX(), event.getVelocity().getY(), event.getVelocity().getZ()); -+ // CraftBukkit end - - world.addEntity(entityboat); -- itemstack.cloneAndSubtract(1); -+ // itemstack.a(1); // CraftBukkit - handled during event processing - return itemstack; - } - -@@ -164,9 +288,48 @@ - ItemBucket itembucket = (ItemBucket) itemstack.getItem(); - BlockPosition blockposition = isourceblock.getBlockPosition().shift(BlockDispenser.b(isourceblock.f())); - -+ // CraftBukkit start -+ World world = isourceblock.getWorld(); -+ int x = blockposition.getX(); -+ int y = blockposition.getY(); -+ int z = blockposition.getZ(); -+ if (world.isEmpty(blockposition) || !world.getType(blockposition).getBlock().getMaterial().isBuildable()) { -+ org.bukkit.block.Block block = world.getWorld().getBlockAt(isourceblock.getBlockPosition().getX(), isourceblock.getBlockPosition().getY(), isourceblock.getBlockPosition().getZ()); -+ CraftItemStack craftItem = CraftItemStack.asCraftMirror(itemstack); -+ -+ BlockDispenseEvent event = new BlockDispenseEvent(block, craftItem.clone(), new org.bukkit.util.Vector(x, y, z)); -+ if (!BlockDispenser.eventFired) { -+ world.getServer().getPluginManager().callEvent(event); -+ } -+ -+ if (event.isCancelled()) { -+ return itemstack; -+ } -+ -+ if (!event.getItem().equals(craftItem)) { -+ // Chain to handler for new item -+ ItemStack eventStack = CraftItemStack.asNMSCopy(event.getItem()); -+ IDispenseBehavior idispensebehavior = (IDispenseBehavior) BlockDispenser.REGISTRY.get(eventStack.getItem()); -+ if (idispensebehavior != IDispenseBehavior.NONE && idispensebehavior != this) { -+ idispensebehavior.a(isourceblock, eventStack); -+ return itemstack; -+ } -+ } -+ -+ itembucket = (ItemBucket) CraftItemStack.asNMSCopy(event.getItem()).getItem(); -+ } -+ // CraftBukkit end -+ - if (itembucket.a(isourceblock.getWorld(), blockposition)) { -- itemstack.setItem(Items.BUCKET); -- itemstack.count = 1; -+ // CraftBukkit start - Handle stacked buckets -+ Item item = Items.BUCKET; -+ if (--itemstack.count == 0) { -+ itemstack.setItem(Items.BUCKET); -+ itemstack.count = 1; -+ } else if (((TileEntityDispenser) isourceblock.getTileEntity()).addItem(new ItemStack(item)) < 0) { -+ this.b.a(isourceblock, new ItemStack(item)); -+ } -+ // CraftBukkit end - return itemstack; - } else { - return this.b.a(isourceblock, itemstack); -@@ -197,6 +360,30 @@ - item = Items.LAVA_BUCKET; - } - -+ // CraftBukkit start -+ org.bukkit.block.Block bukkitBlock = world.getWorld().getBlockAt(isourceblock.getBlockPosition().getX(), isourceblock.getBlockPosition().getY(), isourceblock.getBlockPosition().getZ()); -+ CraftItemStack craftItem = CraftItemStack.asCraftMirror(itemstack); -+ -+ BlockDispenseEvent event = new BlockDispenseEvent(bukkitBlock, craftItem.clone(), new org.bukkit.util.Vector(blockposition.getX(), blockposition.getY(), blockposition.getZ())); -+ if (!BlockDispenser.eventFired) { -+ world.getServer().getPluginManager().callEvent(event); -+ } -+ -+ if (event.isCancelled()) { -+ return itemstack; -+ } -+ -+ if (!event.getItem().equals(craftItem)) { -+ // Chain to handler for new item -+ ItemStack eventStack = CraftItemStack.asNMSCopy(event.getItem()); -+ IDispenseBehavior idispensebehavior = (IDispenseBehavior) BlockDispenser.REGISTRY.get(eventStack.getItem()); -+ if (idispensebehavior != IDispenseBehavior.NONE && idispensebehavior != this) { -+ idispensebehavior.a(isourceblock, eventStack); -+ return itemstack; -+ } -+ } -+ // CraftBukkit end -+ - world.setAir(blockposition); - if (--itemstack.count == 0) { - itemstack.setItem(item); -@@ -215,11 +402,39 @@ - World world = isourceblock.getWorld(); - BlockPosition blockposition = isourceblock.getBlockPosition().shift(BlockDispenser.b(isourceblock.f())); - -+ // CraftBukkit start -+ org.bukkit.block.Block block = world.getWorld().getBlockAt(isourceblock.getBlockPosition().getX(), isourceblock.getBlockPosition().getY(), isourceblock.getBlockPosition().getZ()); -+ CraftItemStack craftItem = CraftItemStack.asCraftMirror(itemstack); -+ -+ BlockDispenseEvent event = new BlockDispenseEvent(block, craftItem.clone(), new org.bukkit.util.Vector(0, 0, 0)); -+ if (!BlockDispenser.eventFired) { -+ world.getServer().getPluginManager().callEvent(event); -+ } -+ -+ if (event.isCancelled()) { -+ return itemstack; -+ } -+ -+ if (!event.getItem().equals(craftItem)) { -+ // Chain to handler for new item -+ ItemStack eventStack = CraftItemStack.asNMSCopy(event.getItem()); -+ IDispenseBehavior idispensebehavior = (IDispenseBehavior) BlockDispenser.REGISTRY.get(eventStack.getItem()); -+ if (idispensebehavior != IDispenseBehavior.NONE && idispensebehavior != this) { -+ idispensebehavior.a(isourceblock, eventStack); -+ return itemstack; -+ } -+ } -+ // CraftBukkit end -+ - if (world.isEmpty(blockposition)) { -- world.setTypeUpdate(blockposition, Blocks.FIRE.getBlockData()); -- if (itemstack.isDamaged(1, world.random)) { -- itemstack.count = 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)) { -+ itemstack.count = 0; -+ } - } -+ // CraftBukkit end - } else if (world.getType(blockposition).getBlock() == Blocks.TNT) { - Blocks.TNT.postBreak(world, blockposition, Blocks.TNT.getBlockData().set(BlockTNT.EXPLODE, Boolean.valueOf(true))); - world.setAir(blockposition); -@@ -247,6 +462,30 @@ - World world = isourceblock.getWorld(); - BlockPosition blockposition = isourceblock.getBlockPosition().shift(BlockDispenser.b(isourceblock.f())); - -+ // CraftBukkit start -+ org.bukkit.block.Block block = world.getWorld().getBlockAt(isourceblock.getBlockPosition().getX(), isourceblock.getBlockPosition().getY(), isourceblock.getBlockPosition().getZ()); -+ CraftItemStack craftItem = CraftItemStack.asNewCraftStack(itemstack.getItem()); -+ -+ BlockDispenseEvent event = new BlockDispenseEvent(block, craftItem.clone(), new org.bukkit.util.Vector(0, 0, 0)); -+ if (!BlockDispenser.eventFired) { -+ world.getServer().getPluginManager().callEvent(event); -+ } -+ -+ if (event.isCancelled()) { -+ return itemstack; -+ } -+ -+ if (!event.getItem().equals(craftItem)) { -+ // Chain to handler for new item -+ ItemStack eventStack = CraftItemStack.asNMSCopy(event.getItem()); -+ IDispenseBehavior idispensebehavior = (IDispenseBehavior) BlockDispenser.REGISTRY.get(eventStack.getItem()); -+ if (idispensebehavior != IDispenseBehavior.NONE && idispensebehavior != this) { -+ idispensebehavior.a(isourceblock, eventStack); -+ return itemstack; -+ } -+ } -+ // CraftBukkit end -+ - if (ItemDye.a(itemstack, world, blockposition)) { - if (!world.isClientSide) { - world.triggerEffect(2005, blockposition, 0); -@@ -274,11 +513,40 @@ - protected ItemStack b(ISourceBlock isourceblock, ItemStack itemstack) { - World world = isourceblock.getWorld(); - BlockPosition blockposition = isourceblock.getBlockPosition().shift(BlockDispenser.b(isourceblock.f())); -- EntityTNTPrimed entitytntprimed = new EntityTNTPrimed(world, (double) blockposition.getX() + 0.5D, (double) blockposition.getY(), (double) blockposition.getZ() + 0.5D, (EntityLiving) null); -+ // EntityTNTPrimed entitytntprimed = new EntityTNTPrimed(world, (double) blockposition.getX() + 0.5D, (double) blockposition.getY(), (double) blockposition.getZ() + 0.5D, (EntityLiving) null); -+ -+ // CraftBukkit start -+ ItemStack itemstack1 = itemstack.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(blockposition.getX() + 0.5, blockposition.getY() + 0.5, blockposition.getZ() + 0.5)); -+ if (!BlockDispenser.eventFired) { -+ world.getServer().getPluginManager().callEvent(event); -+ } -+ -+ if (event.isCancelled()) { -+ itemstack.count++; -+ return itemstack; -+ } -+ -+ if (!event.getItem().equals(craftItem)) { -+ itemstack.count++; -+ // Chain to handler for new item -+ ItemStack eventStack = CraftItemStack.asNMSCopy(event.getItem()); -+ IDispenseBehavior idispensebehavior = (IDispenseBehavior) BlockDispenser.REGISTRY.get(eventStack.getItem()); -+ if (idispensebehavior != IDispenseBehavior.NONE && idispensebehavior != this) { -+ idispensebehavior.a(isourceblock, eventStack); -+ return itemstack; -+ } -+ } -+ -+ EntityTNTPrimed entitytntprimed = new EntityTNTPrimed(world, event.getVelocity().getX(), event.getVelocity().getY(), event.getVelocity().getZ(), (EntityLiving) null); -+ // CraftBukkit end - - world.addEntity(entitytntprimed); - world.makeSound(entitytntprimed, "game.tnt.primed", 1.0F, 1.0F); -- --itemstack.count; -+ // --itemstack.count; // CraftBukkit - handled above - return itemstack; - } - }); diff --git a/TacoSpigot-Server/nms-patches/Enchantment.patch b/TacoSpigot-Server/nms-patches/Enchantment.patch deleted file mode 100644 index 5e419c5..0000000 --- a/TacoSpigot-Server/nms-patches/Enchantment.patch +++ /dev/null @@ -1,19 +0,0 @@ ---- a/net/minecraft/server/Enchantment.java -+++ b/net/minecraft/server/Enchantment.java -@@ -8,6 +8,7 @@ - - public abstract class Enchantment { - -+ // CraftBukkit - update CraftEnchant.getName(i) if this changes - private static final Enchantment[] byId = new Enchantment[256]; - public static final Enchantment[] b; - private static final Map E = Maps.newHashMap(); -@@ -55,6 +56,8 @@ - Enchantment.byId[i] = this; - Enchantment.E.put(minecraftkey, this); - } -+ -+ org.bukkit.enchantments.Enchantment.registerEnchantment(new org.bukkit.craftbukkit.enchantments.CraftEnchantment(this)); // CraftBukkit - } - - public static Enchantment getByName(String s) { diff --git a/TacoSpigot-Server/nms-patches/EnchantmentThorns.patch b/TacoSpigot-Server/nms-patches/EnchantmentThorns.patch deleted file mode 100644 index 1329a10..0000000 --- a/TacoSpigot-Server/nms-patches/EnchantmentThorns.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- a/net/minecraft/server/EnchantmentThorns.java -+++ b/net/minecraft/server/EnchantmentThorns.java -@@ -29,7 +29,7 @@ - Random random = entityliving.bc(); - ItemStack itemstack = EnchantmentManager.a(Enchantment.THORNS, entityliving); - -- if (a(i, random)) { -+ if (entity != null && a(i, random)) { // CraftBukkit - if (entity != null) { - entity.damageEntity(DamageSource.a(entityliving), (float) b(i, random)); - entity.makeSound("damage.thorns", 0.5F, 1.0F); diff --git a/TacoSpigot-Server/nms-patches/Entity.patch b/TacoSpigot-Server/nms-patches/Entity.patch deleted file mode 100644 index 6e7195e..0000000 --- a/TacoSpigot-Server/nms-patches/Entity.patch +++ /dev/null @@ -1,617 +0,0 @@ ---- a/net/minecraft/server/Entity.java -+++ b/net/minecraft/server/Entity.java -@@ -6,8 +6,40 @@ - import java.util.UUID; - import java.util.concurrent.Callable; - -+// CraftBukkit start -+import org.bukkit.Bukkit; -+import org.bukkit.Location; -+import org.bukkit.Server; -+import org.bukkit.TravelAgent; -+import org.bukkit.block.BlockFace; -+import org.bukkit.entity.Hanging; -+import org.bukkit.entity.LivingEntity; -+import org.bukkit.entity.Painting; -+import org.bukkit.entity.Vehicle; -+import org.bukkit.event.entity.EntityCombustByEntityEvent; -+import org.bukkit.event.hanging.HangingBreakByEntityEvent; -+import org.bukkit.event.painting.PaintingBreakByEntityEvent; -+import org.bukkit.event.vehicle.VehicleBlockCollisionEvent; -+import org.bukkit.event.vehicle.VehicleEnterEvent; -+import org.bukkit.event.vehicle.VehicleExitEvent; -+import org.bukkit.craftbukkit.CraftWorld; -+import org.bukkit.craftbukkit.entity.CraftEntity; -+import org.bukkit.craftbukkit.entity.CraftPlayer; -+import org.bukkit.craftbukkit.event.CraftEventFactory; -+import org.bukkit.event.entity.EntityCombustEvent; -+import org.bukkit.event.entity.EntityPortalEvent; -+import org.bukkit.plugin.PluginManager; -+// CraftBukkit end -+ - public abstract class Entity implements ICommandListener { - -+ // CraftBukkit start -+ private static final int CURRENT_LEVEL = 2; -+ static boolean isLevelAtLeast(NBTTagCompound tag, int level) { -+ return tag.hasKey("Bukkit.updateLevel") && tag.getInt("Bukkit.updateLevel") >= level; -+ } -+ // CraftBukikt end -+ - private static final AxisAlignedBB a = new AxisAlignedBB(0.0D, 0.0D, 0.0D, 0.0D, 0.0D, 0.0D); - private static int entityCount; - private int id; -@@ -79,6 +111,9 @@ - private boolean invulnerable; - protected UUID uniqueID; - private final CommandObjectiveExecutor au; -+ public boolean valid; // CraftBukkit -+ public org.bukkit.projectiles.ProjectileSource projectileSource; // CraftBukkit - For projectiles only -+ public boolean forceExplosionKnockback; // CraftBukkit - SPIGOT-949 - - public int getId() { - return this.id; -@@ -152,6 +187,33 @@ - } - - protected void setYawPitch(float f, float f1) { -+ // CraftBukkit start - yaw was sometimes set to NaN, so we need to set it back to 0 -+ if (Float.isNaN(f)) { -+ f = 0; -+ } -+ -+ if (f == Float.POSITIVE_INFINITY || f == Float.NEGATIVE_INFINITY) { -+ if (this instanceof EntityPlayer) { -+ this.world.getServer().getLogger().warning(this.getName() + " was caught trying to crash the server with an invalid yaw"); -+ ((CraftPlayer) this.getBukkitEntity()).kickPlayer("Nope"); -+ } -+ f = 0; -+ } -+ -+ // pitch was sometimes set to NaN, so we need to set it back to 0 -+ if (Float.isNaN(f1)) { -+ f1 = 0; -+ } -+ -+ if (f1 == Float.POSITIVE_INFINITY || f1 == Float.NEGATIVE_INFINITY) { -+ if (this instanceof EntityPlayer) { -+ this.world.getServer().getLogger().warning(this.getName() + " was caught trying to crash the server with an invalid pitch"); -+ ((CraftPlayer) this.getBukkitEntity()).kickPlayer("Nope"); -+ } -+ f1 = 0; -+ } -+ // CraftBukkit end -+ - this.yaw = f % 360.0F; - this.pitch = f1 % 360.0F; - } -@@ -188,7 +250,7 @@ - int i = this.L(); - - if (this.ak) { -- if (minecraftserver.getAllowNether()) { -+ if (true || minecraftserver.getAllowNether()) { // CraftBukkit - if (this.vehicle == null && this.al++ >= i) { - this.al = i; - this.portalCooldown = this.aq(); -@@ -265,6 +327,27 @@ - protected void burnFromLava() { - if (!this.fireProof) { - this.damageEntity(DamageSource.LAVA, 4.0F); -+ -+ // CraftBukkit start - Fallen in lava TODO: this event spams! -+ if (this instanceof EntityLiving) { -+ if (fireTicks <= 0) { -+ // not on fire yet -+ // TODO: shouldn't be sending null for the block -+ org.bukkit.block.Block damager = null; // ((WorldServer) this.l).getWorld().getBlockAt(i, j, k); -+ org.bukkit.entity.Entity damagee = this.getBukkitEntity(); -+ EntityCombustEvent combustEvent = new org.bukkit.event.entity.EntityCombustByBlockEvent(damager, damagee, 15); -+ this.world.getServer().getPluginManager().callEvent(combustEvent); -+ -+ if (!combustEvent.isCancelled()) { -+ this.setOnFire(combustEvent.getDuration()); -+ } -+ } else { -+ // This will be called every single tick the entity is in lava, so don't throw an event -+ this.setOnFire(15); -+ } -+ return; -+ } -+ // CraftBukkit end - we also don't throw an event unless the object in lava is living, to save on some event calls - this.setOnFire(15); - } - } -@@ -302,6 +385,22 @@ - this.a(this.getBoundingBox().c(d0, d1, d2)); - this.recalcPosition(); - } else { -+ // CraftBukkit start - Don't do anything if we aren't moving -+ // We need to do this regardless of whether or not we are moving thanks to portals -+ try { -+ this.checkBlockCollisions(); -+ } catch (Throwable throwable) { -+ CrashReport crashreport = CrashReport.a(throwable, "Checking entity block collision"); -+ CrashReportSystemDetails crashreportsystemdetails = crashreport.a("Entity being checked for collision"); -+ -+ this.appendEntityCrashDetails(crashreportsystemdetails); -+ throw new ReportedException(crashreport); -+ } -+ // Check if we're moving -+ if (d0 == 0 && d1 == 0 && d2 == 0 && this.vehicle == null && this.passenger == null) { -+ return; -+ } -+ // CraftBukkit end - this.world.methodProfiler.a("move"); - double d3 = this.locX; - double d4 = this.locY; -@@ -522,6 +621,26 @@ - block.a(this.world, this); - } - -+ // CraftBukkit start -+ if (positionChanged && getBukkitEntity() instanceof Vehicle) { -+ Vehicle vehicle = (Vehicle) this.getBukkitEntity(); -+ org.bukkit.block.Block bl = this.world.getWorld().getBlockAt(MathHelper.floor(this.locX), MathHelper.floor(this.locY), MathHelper.floor(this.locZ)); -+ -+ if (d6 > d0) { -+ bl = bl.getRelative(BlockFace.EAST); -+ } else if (d6 < d0) { -+ bl = bl.getRelative(BlockFace.WEST); -+ } else if (d8 > d2) { -+ bl = bl.getRelative(BlockFace.SOUTH); -+ } else if (d8 < d2) { -+ bl = bl.getRelative(BlockFace.NORTH); -+ } -+ -+ VehicleBlockCollisionEvent event = new VehicleBlockCollisionEvent(vehicle, bl); -+ world.getServer().getPluginManager().callEvent(event); -+ } -+ // CraftBukkit end -+ - if (this.s_() && !flag && this.vehicle == null) { - double d21 = this.locX - d3; - double d22 = this.locY - d4; -@@ -532,7 +651,7 @@ - } - - if (block != null && this.onGround) { -- block.a(this.world, blockposition, this); -+ // block.a(this.world, blockposition, this); // CraftBukkit moved down - } - - this.M = (float) ((double) this.M + (double) MathHelper.sqrt(d21 * d21 + d23 * d23) * 0.6D); -@@ -550,9 +669,12 @@ - } - - this.a(blockposition, block); -+ block.a(this.world, blockposition, this); // CraftBukkit moved from above - } - } - -+ // CraftBukkit start - Move to the top of the method -+ /* - try { - this.checkBlockCollisions(); - } catch (Throwable throwable) { -@@ -562,6 +684,8 @@ - this.appendEntityCrashDetails(crashreportsystemdetails); - throw new ReportedException(crashreport); - } -+ */ -+ // CraftBukkit end - - boolean flag2 = this.U(); - -@@ -569,7 +693,16 @@ - this.burn(1); - if (!flag2) { - ++this.fireTicks; -- if (this.fireTicks == 0) { -+ // CraftBukkit start - Not on fire yet -+ if (this.fireTicks <= 0) { // Only throw events on the first combust, otherwise it spams -+ EntityCombustEvent event = new EntityCombustEvent(getBukkitEntity(), 8); -+ world.getServer().getPluginManager().callEvent(event); -+ -+ if (!event.isCancelled()) { -+ setOnFire(event.getDuration()); -+ } -+ } else { -+ // CraftBukkit end - this.setOnFire(8); - } - } -@@ -675,7 +808,7 @@ - return null; - } - -- protected void burn(int i) { -+ protected void burn(float i) { // CraftBukkit - int -> float - if (!this.fireProof) { - this.damageEntity(DamageSource.FIRE, (float) i); - } -@@ -818,6 +951,13 @@ - } - - public void spawnIn(World world) { -+ // CraftBukkit start -+ if (world == null) { -+ die(); -+ this.world = ((CraftWorld) Bukkit.getServer().getWorlds().get(0)).getHandle(); -+ return; -+ } -+ // CraftBukkit end - this.world = world; - } - -@@ -1010,6 +1150,18 @@ - try { - nbttagcompound.set("Pos", this.a(new double[] { this.locX, this.locY, this.locZ})); - nbttagcompound.set("Motion", this.a(new double[] { this.motX, this.motY, this.motZ})); -+ -+ // CraftBukkit start - Checking for NaN pitch/yaw and resetting to zero -+ // TODO: make sure this is the best way to address this. -+ if (Float.isNaN(this.yaw)) { -+ this.yaw = 0; -+ } -+ -+ if (Float.isNaN(this.pitch)) { -+ this.pitch = 0; -+ } -+ // CraftBukkit end -+ - nbttagcompound.set("Rotation", this.a(new float[] { this.yaw, this.pitch})); - nbttagcompound.setFloat("FallDistance", this.fallDistance); - nbttagcompound.setShort("Fire", (short) this.fireTicks); -@@ -1020,6 +1172,11 @@ - nbttagcompound.setInt("PortalCooldown", this.portalCooldown); - nbttagcompound.setLong("UUIDMost", this.getUniqueID().getMostSignificantBits()); - nbttagcompound.setLong("UUIDLeast", this.getUniqueID().getLeastSignificantBits()); -+ // CraftBukkit start -+ nbttagcompound.setLong("WorldUUIDLeast", this.world.getDataManager().getUUID().getLeastSignificantBits()); -+ nbttagcompound.setLong("WorldUUIDMost", this.world.getDataManager().getUUID().getMostSignificantBits()); -+ nbttagcompound.setInt("Bukkit.updateLevel", CURRENT_LEVEL); -+ // CraftBukkit end - if (this.getCustomName() != null && this.getCustomName().length() > 0) { - nbttagcompound.setString("CustomName", this.getCustomName()); - nbttagcompound.setBoolean("CustomNameVisible", this.getCustomNameVisible()); -@@ -1057,6 +1214,8 @@ - this.motX = nbttaglist1.d(0); - this.motY = nbttaglist1.d(1); - this.motZ = nbttaglist1.d(2); -+ -+ /* CraftBukkit start - Moved section down - if (Math.abs(this.motX) > 10.0D) { - this.motX = 0.0D; - } -@@ -1068,6 +1227,7 @@ - if (Math.abs(this.motZ) > 10.0D) { - this.motZ = 0.0D; - } -+ // CraftBukkit end */ - - this.lastX = this.P = this.locX = nbttaglist.d(0); - this.lastY = this.Q = this.locY = nbttaglist.d(1); -@@ -1103,6 +1263,58 @@ - this.setPosition(this.locX, this.locY, this.locZ); - } - -+ // CraftBukkit start -+ if (this instanceof EntityLiving) { -+ EntityLiving entity = (EntityLiving) this; -+ -+ // Reset the persistence for tamed animals -+ if (entity instanceof EntityTameableAnimal && !isLevelAtLeast(nbttagcompound, 2) && !nbttagcompound.getBoolean("PersistenceRequired")) { -+ EntityInsentient entityinsentient = (EntityInsentient) entity; -+ entityinsentient.persistent = !entityinsentient.isTypeNotPersistent(); -+ } -+ } -+ // CraftBukkit end -+ -+ // CraftBukkit start - Exempt Vehicles from notch's sanity check -+ if (!(getBukkitEntity() instanceof Vehicle)) { -+ if (Math.abs(this.motX) > 10.0D) { -+ this.motX = 0.0D; -+ } -+ -+ if (Math.abs(this.motY) > 10.0D) { -+ this.motY = 0.0D; -+ } -+ -+ if (Math.abs(this.motZ) > 10.0D) { -+ this.motZ = 0.0D; -+ } -+ } -+ // CraftBukkit end -+ -+ // CraftBukkit start - Reset world -+ if (this instanceof EntityPlayer) { -+ Server server = Bukkit.getServer(); -+ org.bukkit.World bworld = null; -+ -+ // TODO: Remove World related checks, replaced with WorldUID -+ String worldName = nbttagcompound.getString("world"); -+ -+ if (nbttagcompound.hasKey("WorldUUIDMost") && nbttagcompound.hasKey("WorldUUIDLeast")) { -+ UUID uid = new UUID(nbttagcompound.getLong("WorldUUIDMost"), nbttagcompound.getLong("WorldUUIDLeast")); -+ bworld = server.getWorld(uid); -+ } else { -+ bworld = server.getWorld(worldName); -+ } -+ -+ if (bworld == null) { -+ EntityPlayer entityPlayer = (EntityPlayer) this; -+ bworld = ((org.bukkit.craftbukkit.CraftServer) server).getServer().getWorldServer(entityPlayer.dimension).getWorld(); -+ } -+ -+ spawnIn(bworld == null? null : ((CraftWorld) bworld).getHandle()); -+ } -+ // CraftBukkit end -+ - } catch (Throwable throwable) { - CrashReport crashreport = CrashReport.a(throwable, "Loading entity NBT"); - CrashReportSystemDetails crashreportsystemdetails = crashreport.a("Entity being loaded"); -@@ -1164,6 +1376,12 @@ - - public EntityItem a(ItemStack itemstack, float f) { - if (itemstack.count != 0 && itemstack.getItem() != null) { -+ // CraftBukkit start - Capture drops for death event -+ if (this instanceof EntityLiving && ((EntityLiving) this).drops != null) { -+ ((EntityLiving) this).drops.add(org.bukkit.craftbukkit.inventory.CraftItemStack.asBukkitCopy(itemstack)); -+ return null; -+ } -+ // CraftBukkit end - EntityItem entityitem = new EntityItem(this.world, this.locX, this.locY + (double) f, this.locZ, itemstack); - - entityitem.p(); -@@ -1277,17 +1495,70 @@ - return (double) this.length * 0.75D; - } - -+ // CraftBukkit start -+ protected CraftEntity bukkitEntity; -+ -+ public CraftEntity getBukkitEntity() { -+ if (bukkitEntity == null) { -+ bukkitEntity = CraftEntity.getEntity(world.getServer(), this); -+ } -+ return bukkitEntity; -+ } -+ - public void mount(Entity entity) { -+ Entity originalVehicle = this.vehicle; -+ Entity originalPassenger = this.vehicle == null ? null : this.vehicle.passenger; -+ PluginManager pluginManager = Bukkit.getPluginManager(); -+ getBukkitEntity(); // make sure bukkitEntity is initialised -+ // CraftBukkit end - this.ar = 0.0D; - this.as = 0.0D; - if (entity == null) { - if (this.vehicle != null) { -+ // CraftBukkit start -+ if ((this.bukkitEntity instanceof LivingEntity) && (this.vehicle.getBukkitEntity() instanceof Vehicle)) { -+ VehicleExitEvent event = new VehicleExitEvent((Vehicle) this.vehicle.getBukkitEntity(), (LivingEntity) this.bukkitEntity); -+ pluginManager.callEvent(event); -+ -+ if (event.isCancelled() || vehicle != originalVehicle) { -+ return; -+ } -+ } -+ // CraftBukkit end - this.setPositionRotation(this.vehicle.locX, this.vehicle.getBoundingBox().b + (double) this.vehicle.length, this.vehicle.locZ, this.yaw, this.pitch); - this.vehicle.passenger = null; - } - - this.vehicle = null; - } else { -+ // CraftBukkit start -+ if ((this.bukkitEntity instanceof LivingEntity) && (entity.getBukkitEntity() instanceof Vehicle) && entity.world.isChunkLoaded((int) entity.locX >> 4, (int) entity.locZ >> 4, true)) { -+ // It's possible to move from one vehicle to another. We need to check if they're already in a vehicle, and fire an exit event if they are. -+ VehicleExitEvent exitEvent = null; -+ if (this.vehicle != null && this.vehicle.getBukkitEntity() instanceof Vehicle) { -+ exitEvent = new VehicleExitEvent((Vehicle) this.vehicle.getBukkitEntity(), (LivingEntity) this.bukkitEntity); -+ pluginManager.callEvent(exitEvent); -+ -+ if (exitEvent.isCancelled() || this.vehicle != originalVehicle || (this.vehicle != null && this.vehicle.passenger != originalPassenger)) { -+ return; -+ } -+ } -+ -+ VehicleEnterEvent event = new VehicleEnterEvent((Vehicle) entity.getBukkitEntity(), this.bukkitEntity); -+ pluginManager.callEvent(event); -+ -+ // If a plugin messes with the vehicle or the vehicle's passenger -+ if (event.isCancelled() || this.vehicle != originalVehicle || (this.vehicle != null && this.vehicle.passenger != originalPassenger)) { -+ // If we only cancelled the enterevent then we need to put the player in a decent position. -+ if (exitEvent != null && this.vehicle == originalVehicle && this.vehicle != null && this.vehicle.passenger == originalPassenger) { -+ this.setPositionRotation(this.vehicle.locX, this.vehicle.getBoundingBox().b + (double) this.vehicle.length, this.vehicle.locZ, this.yaw, this.pitch); -+ this.vehicle.passenger = null; -+ this.vehicle = null; -+ } -+ return; -+ } -+ } -+ // CraftBukkit end - if (this.vehicle != null) { - this.vehicle.passenger = null; - } -@@ -1406,10 +1677,49 @@ - } - - public void onLightningStrike(EntityLightning entitylightning) { -- this.damageEntity(DamageSource.LIGHTNING, 5.0F); -+ // CraftBukkit start -+ final org.bukkit.entity.Entity thisBukkitEntity = this.getBukkitEntity(); -+ final org.bukkit.entity.Entity stormBukkitEntity = entitylightning.getBukkitEntity(); -+ final PluginManager pluginManager = Bukkit.getPluginManager(); -+ -+ if (thisBukkitEntity instanceof Hanging) { -+ HangingBreakByEntityEvent hangingEvent = new HangingBreakByEntityEvent((Hanging) thisBukkitEntity, stormBukkitEntity); -+ PaintingBreakByEntityEvent paintingEvent = null; -+ -+ if (thisBukkitEntity instanceof Painting) { -+ paintingEvent = new PaintingBreakByEntityEvent((Painting) thisBukkitEntity, stormBukkitEntity); -+ } -+ -+ pluginManager.callEvent(hangingEvent); -+ -+ if (paintingEvent != null) { -+ paintingEvent.setCancelled(hangingEvent.isCancelled()); -+ pluginManager.callEvent(paintingEvent); -+ } -+ -+ if (hangingEvent.isCancelled() || (paintingEvent != null && paintingEvent.isCancelled())) { -+ return; -+ } -+ } -+ -+ if (this.fireProof) { -+ return; -+ } -+ CraftEventFactory.entityDamage = entitylightning; -+ if (!this.damageEntity(DamageSource.LIGHTNING, 5.0F)) { -+ CraftEventFactory.entityDamage = null; -+ return; -+ } -+ // CraftBukkit end - ++this.fireTicks; - if (this.fireTicks == 0) { -- this.setOnFire(8); -+ // CraftBukkit start - Call a combust event when lightning strikes -+ EntityCombustByEntityEvent entityCombustEvent = new EntityCombustByEntityEvent(stormBukkitEntity, thisBukkitEntity, 8); -+ pluginManager.callEvent(entityCombustEvent); -+ if (!entityCombustEvent.isCancelled()) { -+ this.setOnFire(entityCombustEvent.getDuration()); -+ } -+ // CraftBukkit end - } - - } -@@ -1550,32 +1860,83 @@ - if (!this.world.isClientSide && !this.dead) { - this.world.methodProfiler.a("changeDimension"); - MinecraftServer minecraftserver = MinecraftServer.getServer(); -- int j = this.dimension; -- WorldServer worldserver = minecraftserver.getWorldServer(j); -- WorldServer worldserver1 = minecraftserver.getWorldServer(i); -+ // CraftBukkit start - Move logic into new function "teleportToLocation" -+ // int j = this.dimension; -+ // WorldServer worldserver = minecraftserver.getWorldServer(j); -+ // WorldServer worldserver1 = minecraftserver.getWorldServer(i); -+ WorldServer exitWorld = null; -+ if (this.dimension < CraftWorld.CUSTOM_DIMENSION_OFFSET) { // Plugins must specify exit from custom Bukkit worlds -+ // Only target existing worlds (compensate for allow-nether/allow-end as false) -+ for (WorldServer world : minecraftserver.worlds) { -+ if (world.dimension == i) { -+ exitWorld = world; -+ } -+ } -+ } -+ -+ Location enter = this.getBukkitEntity().getLocation(); -+ Location exit = exitWorld != null ? minecraftserver.getPlayerList().calculateTarget(enter, minecraftserver.getWorldServer(i)) : null; -+ boolean useTravelAgent = exitWorld != null && !(this.dimension == 1 && exitWorld.dimension == 1); // don't use agent for custom worlds or return from THE_END -+ -+ TravelAgent agent = exit != null ? (TravelAgent) ((CraftWorld) exit.getWorld()).getHandle().getTravelAgent() : org.bukkit.craftbukkit.CraftTravelAgent.DEFAULT; // return arbitrary TA to compensate for implementation dependent plugins -+ EntityPortalEvent event = new EntityPortalEvent(this.getBukkitEntity(), enter, exit, agent); -+ event.useTravelAgent(useTravelAgent); -+ event.getEntity().getServer().getPluginManager().callEvent(event); -+ if (event.isCancelled() || event.getTo() == null || event.getTo().getWorld() == null || !this.isAlive()) { -+ return; -+ } -+ exit = event.useTravelAgent() ? event.getPortalTravelAgent().findOrCreate(event.getTo()) : event.getTo(); -+ this.teleportTo(exit, true); -+ } -+ } -+ -+ public void teleportTo(Location exit, boolean portal) { -+ if (true) { -+ WorldServer worldserver = ((CraftWorld) getBukkitEntity().getLocation().getWorld()).getHandle(); -+ WorldServer worldserver1 = ((CraftWorld) exit.getWorld()).getHandle(); -+ int i = worldserver1.dimension; -+ // CraftBukkit end - - this.dimension = i; -+ /* CraftBukkit start - TODO: Check if we need this - if (j == 1 && i == 1) { - worldserver1 = minecraftserver.getWorldServer(0); - this.dimension = 0; - } -+ // CraftBukkit end */ - - this.world.kill(this); - this.dead = false; - this.world.methodProfiler.a("reposition"); -- minecraftserver.getPlayerList().changeWorld(this, j, worldserver, worldserver1); -+ // CraftBukkit start - Ensure chunks are loaded in case TravelAgent is not used which would initially cause chunks to load during find/create -+ // minecraftserver.getPlayerList().changeWorld(this, j, worldserver, worldserver1); -+ boolean before = worldserver1.chunkProviderServer.forceChunkLoad; -+ worldserver1.chunkProviderServer.forceChunkLoad = true; -+ worldserver1.getMinecraftServer().getPlayerList().repositionEntity(this, exit, portal); -+ worldserver1.chunkProviderServer.forceChunkLoad = before; -+ // CraftBukkit end - this.world.methodProfiler.c("reloading"); - Entity entity = EntityTypes.createEntityByName(EntityTypes.b(this), worldserver1); - - if (entity != null) { - entity.n(this); -+ /* CraftBukkit start - We need to do this... - if (j == 1 && i == 1) { - BlockPosition blockposition = this.world.r(worldserver1.getSpawn()); - - entity.setPositionRotation(blockposition, entity.yaw, entity.pitch); - } -+ // CraftBukkit end */ - - worldserver1.addEntity(entity); -+ // CraftBukkit start - Forward the CraftEntity to the new entity -+ this.getBukkitEntity().setHandle(entity); -+ entity.bukkitEntity = this.getBukkitEntity(); -+ -+ if (this instanceof EntityInsentient) { -+ ((EntityInsentient)this).unleash(true, false); // Unleash to prevent duping of leads. -+ } -+ // CraftBukkit end - } - - this.dead = true; -@@ -1670,6 +2031,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.watch(2, s); - } - -@@ -1721,7 +2087,26 @@ - } - - public void a(AxisAlignedBB axisalignedbb) { -- this.boundingBox = axisalignedbb; -+ // CraftBukkit start - block invalid bounding boxes -+ double a = axisalignedbb.a, -+ b = axisalignedbb.b, -+ c = axisalignedbb.c, -+ d = axisalignedbb.d, -+ e = axisalignedbb.e, -+ f = axisalignedbb.f; -+ double len = axisalignedbb.d - axisalignedbb.a; -+ if (len < 0) d = a; -+ if (len > 64) d = a + 64.0; -+ -+ len = axisalignedbb.e - axisalignedbb.b; -+ if (len < 0) e = b; -+ if (len > 64) e = b + 64.0; -+ -+ len = axisalignedbb.f - axisalignedbb.c; -+ if (len < 0) f = c; -+ if (len > 64) f = c + 64.0; -+ this.boundingBox = new AxisAlignedBB(a, b, c, d, e, f); -+ // CraftBukkit end - } - - public float getHeadHeight() { diff --git a/TacoSpigot-Server/nms-patches/EntityAgeable.patch b/TacoSpigot-Server/nms-patches/EntityAgeable.patch deleted file mode 100644 index deef0f2..0000000 --- a/TacoSpigot-Server/nms-patches/EntityAgeable.patch +++ /dev/null @@ -1,57 +0,0 @@ ---- a/net/minecraft/server/EntityAgeable.java -+++ b/net/minecraft/server/EntityAgeable.java -@@ -7,6 +7,7 @@ - protected int c; - private float bm = -1.0F; - private float bn; -+ public boolean ageLocked = false; // CraftBukkit - - public EntityAgeable(World world) { - super(world); -@@ -27,14 +28,14 @@ - if (entityageable != null) { - entityageable.setAgeRaw(-24000); - entityageable.setPositionRotation(this.locX, this.locY, this.locZ, 0.0F, 0.0F); -- this.world.addEntity(entityageable); -+ this.world.addEntity(entityageable, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.SPAWNER_EGG); // CraftBukkit - if (itemstack.hasName()) { - entityageable.setCustomName(itemstack.getName()); - } - - if (!entityhuman.abilities.canInstantlyBuild) { - --itemstack.count; -- if (itemstack.count <= 0) { -+ if (itemstack.count == 0) { // CraftBukkit - allow less than 0 stacks as "infinite" - entityhuman.inventory.setItem(entityhuman.inventory.itemInHandIndex, (ItemStack) null); - } - } -@@ -99,17 +100,19 @@ - super.b(nbttagcompound); - nbttagcompound.setInt("Age", this.getAge()); - nbttagcompound.setInt("ForcedAge", this.b); -+ nbttagcompound.setBoolean("AgeLocked", this.ageLocked); // CraftBukkit - } - - public void a(NBTTagCompound nbttagcompound) { - super.a(nbttagcompound); - this.setAgeRaw(nbttagcompound.getInt("Age")); - this.b = nbttagcompound.getInt("ForcedAge"); -+ this.ageLocked = nbttagcompound.getBoolean("AgeLocked"); // CraftBukkit - } - - public void m() { - super.m(); -- if (this.world.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]); -@@ -146,7 +149,7 @@ - this.a(flag ? 0.5F : 1.0F); - } - -- protected final void setSize(float f, float f1) { -+ public final void setSize(float f, float f1) { // CraftBukkit - protected to public - boolean flag = this.bm > 0.0F; - - this.bm = f; diff --git a/TacoSpigot-Server/nms-patches/EntityAnimal.patch b/TacoSpigot-Server/nms-patches/EntityAnimal.patch deleted file mode 100644 index ee03038..0000000 --- a/TacoSpigot-Server/nms-patches/EntityAnimal.patch +++ /dev/null @@ -1,20 +0,0 @@ ---- a/net/minecraft/server/EntityAnimal.java -+++ b/net/minecraft/server/EntityAnimal.java -@@ -38,6 +38,9 @@ - - } - -+ /* CraftBukkit start -+ // Function disabled as it has no special function anymore after -+ // setSitting is disabled. - public boolean damageEntity(DamageSource damagesource, float f) { - if (this.isInvulnerable(damagesource)) { - return false; -@@ -46,6 +49,7 @@ - return super.damageEntity(damagesource, f); - } - } -+ // CraftBukkit end */ - - public float a(BlockPosition blockposition) { - return this.world.getType(blockposition.down()).getBlock() == Blocks.GRASS ? 10.0F : this.world.o(blockposition) - 0.5F; diff --git a/TacoSpigot-Server/nms-patches/EntityArmorStand.patch b/TacoSpigot-Server/nms-patches/EntityArmorStand.patch deleted file mode 100644 index d7b6f74..0000000 --- a/TacoSpigot-Server/nms-patches/EntityArmorStand.patch +++ /dev/null @@ -1,71 +0,0 @@ ---- a/net/minecraft/server/EntityArmorStand.java -+++ b/net/minecraft/server/EntityArmorStand.java -@@ -2,6 +2,15 @@ - - import java.util.List; - -+// CraftBukkit start -+import org.bukkit.inventory.EquipmentSlot; -+import org.bukkit.craftbukkit.CraftEquipmentSlot; -+import org.bukkit.craftbukkit.inventory.CraftItemStack; -+import org.bukkit.entity.ArmorStand; -+import org.bukkit.entity.Player; -+import org.bukkit.event.player.PlayerArmorStandManipulateEvent; -+// CraftBukkit end -+ - public class EntityArmorStand extends EntityLiving { - - private static final Vector3f a = new Vector3f(0.0F, 0.0F, 0.0F); -@@ -332,6 +341,22 @@ - ItemStack itemstack1 = entityhuman.inventory.getItem(j); - ItemStack itemstack2; - -+ // CraftBukkit start -+ org.bukkit.inventory.ItemStack armorStandItem = CraftItemStack.asCraftMirror(itemstack); -+ org.bukkit.inventory.ItemStack playerHeldItem = CraftItemStack.asCraftMirror(itemstack1); -+ -+ Player player = (Player) entityhuman.getBukkitEntity(); -+ ArmorStand self = (ArmorStand) this.getBukkitEntity(); -+ -+ EquipmentSlot slot = CraftEquipmentSlot.getSlot(i); -+ PlayerArmorStandManipulateEvent armorStandManipulateEvent = new PlayerArmorStandManipulateEvent(player,self,playerHeldItem,armorStandItem,slot); -+ this.world.getServer().getPluginManager().callEvent(armorStandManipulateEvent); -+ -+ if (armorStandManipulateEvent.isCancelled()) { -+ return; -+ } -+ // CraftBukkit end -+ - if (entityhuman.abilities.canInstantlyBuild && (itemstack == null || itemstack.getItem() == Item.getItemOf(Blocks.AIR)) && itemstack1 != null) { - itemstack2 = itemstack1.cloneItemStack(); - itemstack2.count = 1; -@@ -352,6 +377,11 @@ - } - - public boolean damageEntity(DamageSource damagesource, float f) { -+ // CraftBukkit start -+ if (org.bukkit.craftbukkit.event.CraftEventFactory.handleNonLivingEntityDamageEvent(this, damagesource, f)) { -+ return false; -+ } -+ // CraftBukkit end - if (this.world.isClientSide) { - return false; - } else if (DamageSource.OUT_OF_WORLD.equals(damagesource)) { -@@ -616,7 +646,8 @@ - return (this.datawatcher.getByte(10) & 8) != 0; - } - -- private void n(boolean flag) { -+ // PAIL -+ public void n(boolean flag) { // CraftBukkit - public - byte b0 = this.datawatcher.getByte(10); - - if (flag) { -@@ -628,6 +659,7 @@ - this.datawatcher.watch(10, Byte.valueOf(b0)); - } - -+ // PAIL - public boolean s() { - return (this.datawatcher.getByte(10) & 16) != 0; - } diff --git a/TacoSpigot-Server/nms-patches/EntityArrow.patch b/TacoSpigot-Server/nms-patches/EntityArrow.patch deleted file mode 100644 index de6af82..0000000 --- a/TacoSpigot-Server/nms-patches/EntityArrow.patch +++ /dev/null @@ -1,93 +0,0 @@ ---- a/net/minecraft/server/EntityArrow.java -+++ b/net/minecraft/server/EntityArrow.java -@@ -2,6 +2,12 @@ - - import java.util.List; - -+// CraftBukkit start -+import org.bukkit.entity.LivingEntity; -+import org.bukkit.event.entity.EntityCombustByEntityEvent; -+import org.bukkit.event.player.PlayerPickupItemEvent; -+// CraftBukkit end -+ - public class EntityArrow extends Entity implements IProjectile { - - private int d = -1; -@@ -35,6 +41,7 @@ - super(world); - this.j = 10.0D; - this.shooter = entityliving; -+ this.projectileSource = (LivingEntity) entityliving.getBukkitEntity(); // CraftBukkit - if (entityliving instanceof EntityHuman) { - this.fromPlayer = 1; - } -@@ -62,6 +69,7 @@ - super(world); - this.j = 10.0D; - this.shooter = entityliving; -+ this.projectileSource = (LivingEntity) entityliving.getBukkitEntity(); // CraftBukkit - if (entityliving instanceof EntityHuman) { - this.fromPlayer = 1; - } -@@ -201,6 +209,7 @@ - float f3; - - if (movingobjectposition != null) { -+ org.bukkit.craftbukkit.event.CraftEventFactory.callProjectileHitEvent(this); // CraftBukkit - Call event - if (movingobjectposition.entity != null) { - f2 = MathHelper.sqrt(this.motX * this.motX + this.motY * this.motY + this.motZ * this.motZ); - int k = MathHelper.f((double) f2 * this.damage); -@@ -217,11 +226,18 @@ - damagesource = DamageSource.arrow(this, this.shooter); - } - -- if (this.isBurning() && !(movingobjectposition.entity instanceof EntityEnderman)) { -- movingobjectposition.entity.setOnFire(5); -+ // CraftBukkit start - Moved damage call -+ if (movingobjectposition.entity.damageEntity(damagesource, (float) k)) { -+ if (this.isBurning() && !(movingobjectposition.entity instanceof EntityEnderman) && (!(movingobjectposition.entity instanceof EntityPlayer) || !(this.shooter instanceof EntityPlayer) || this.world.pvpMode)) { // CraftBukkit - abide by pvp setting if destination is a player -+ EntityCombustByEntityEvent combustEvent = new EntityCombustByEntityEvent(this.getBukkitEntity(), entity.getBukkitEntity(), 5); -+ org.bukkit.Bukkit.getPluginManager().callEvent(combustEvent); -+ if (!combustEvent.isCancelled()) { -+ movingobjectposition.entity.setOnFire(combustEvent.getDuration()); -+ } -+ // CraftBukkit end - } - -- if (movingobjectposition.entity.damageEntity(damagesource, (float) k)) { -+ // if (movingobjectposition.entity.damageEntity(damagesource, (float) k)) { // CraftBukkit - moved up - if (movingobjectposition.entity instanceof EntityLiving) { - EntityLiving entityliving = (EntityLiving) movingobjectposition.entity; - -@@ -383,6 +399,20 @@ - - public void d(EntityHuman entityhuman) { - if (!this.world.isClientSide && this.inGround && this.shake <= 0) { -+ // CraftBukkit start -+ ItemStack itemstack = new ItemStack(Items.ARROW); -+ if (this.fromPlayer == 1 && entityhuman.inventory.canHold(itemstack) > 0) { -+ EntityItem item = new EntityItem(this.world, this.locX, this.locY, this.locZ, itemstack); -+ -+ PlayerPickupItemEvent event = new PlayerPickupItemEvent((org.bukkit.entity.Player) entityhuman.getBukkitEntity(), new org.bukkit.craftbukkit.entity.CraftItem(this.world.getServer(), this, item), 0); -+ // event.setCancelled(!entityhuman.canPickUpLoot); TODO -+ this.world.getServer().getPluginManager().callEvent(event); -+ -+ if (event.isCancelled()) { -+ return; -+ } -+ } -+ // CraftBukkit end - boolean flag = this.fromPlayer == 1 || this.fromPlayer == 2 && entityhuman.abilities.canInstantlyBuild; - - if (this.fromPlayer == 1 && !entityhuman.inventory.pickup(new ItemStack(Items.ARROW, 1))) { -@@ -438,4 +468,10 @@ - - return (b0 & 1) != 0; - } -+ -+ // CraftBukkit start -+ public boolean isInGround() { -+ return inGround; -+ } -+ // CraftBukkit end - } diff --git a/TacoSpigot-Server/nms-patches/EntityBoat.patch b/TacoSpigot-Server/nms-patches/EntityBoat.patch deleted file mode 100644 index 8545c28..0000000 --- a/TacoSpigot-Server/nms-patches/EntityBoat.patch +++ /dev/null @@ -1,225 +0,0 @@ ---- a/net/minecraft/server/EntityBoat.java -+++ b/net/minecraft/server/EntityBoat.java -@@ -2,6 +2,16 @@ - - import java.util.List; - -+// CraftBukkit start -+import org.bukkit.Location; -+import org.bukkit.craftbukkit.event.CraftEventFactory; -+import org.bukkit.entity.Vehicle; -+import org.bukkit.event.vehicle.VehicleDamageEvent; -+import org.bukkit.event.vehicle.VehicleDestroyEvent; -+import org.bukkit.event.vehicle.VehicleEntityCollisionEvent; -+import org.bukkit.event.vehicle.VehicleMoveEvent; -+// CraftBukkit end -+ - public class EntityBoat extends Entity { - - private boolean a; -@@ -13,6 +23,27 @@ - private double g; - private double h; - -+ // CraftBukkit start -+ public double maxSpeed = 0.4D; -+ public double occupiedDeceleration = 0.2D; -+ public double unoccupiedDeceleration = -1; -+ public boolean landBoats = false; -+ -+ @Override -+ public void collide(Entity entity) { -+ org.bukkit.entity.Entity hitEntity = (entity == null) ? null : entity.getBukkitEntity(); -+ -+ VehicleEntityCollisionEvent event = new VehicleEntityCollisionEvent((Vehicle) this.getBukkitEntity(), hitEntity); -+ this.world.getServer().getPluginManager().callEvent(event); -+ -+ if (event.isCancelled()) { -+ return; -+ } -+ -+ super.collide(entity); -+ } -+ // CraftBukkit end -+ - public EntityBoat(World world) { - super(world); - this.a = true; -@@ -52,6 +83,8 @@ - this.lastX = d0; - this.lastY = d1; - this.lastZ = d2; -+ -+ this.world.getServer().getPluginManager().callEvent(new org.bukkit.event.vehicle.VehicleCreateEvent((Vehicle) this.getBukkitEntity())); // CraftBukkit - } - - public double an() { -@@ -65,6 +98,19 @@ - if (this.passenger != null && this.passenger == damagesource.getEntity() && damagesource instanceof EntityDamageSourceIndirect) { - return false; - } else { -+ // CraftBukkit start -+ Vehicle vehicle = (Vehicle) this.getBukkitEntity(); -+ org.bukkit.entity.Entity attacker = (damagesource.getEntity() == null) ? null : damagesource.getEntity().getBukkitEntity(); -+ -+ VehicleDamageEvent event = new VehicleDamageEvent(vehicle, attacker, (double) f); -+ this.world.getServer().getPluginManager().callEvent(event); -+ -+ if (event.isCancelled()) { -+ return true; -+ } -+ // f = event.getDamage(); // TODO Why don't we do this? -+ // CraftBukkit end -+ - this.b(-this.m()); - this.a(10); - this.setDamage(this.j() + f * 10.0F); -@@ -72,6 +118,15 @@ - boolean flag = damagesource.getEntity() instanceof EntityHuman && ((EntityHuman) damagesource.getEntity()).abilities.canInstantlyBuild; - - if (flag || this.j() > 40.0F) { -+ // CraftBukkit start -+ VehicleDestroyEvent destroyEvent = new VehicleDestroyEvent(vehicle, attacker); -+ this.world.getServer().getPluginManager().callEvent(destroyEvent); -+ -+ if (destroyEvent.isCancelled()) { -+ this.setDamage(40F); // Maximize damage so this doesn't get triggered again right away -+ return true; -+ } -+ // CraftBukkit end - if (this.passenger != null) { - this.passenger.mount(this); - } -@@ -95,6 +150,13 @@ - } - - public void t_() { -+ // CraftBukkit start -+ double prevX = this.locX; -+ double prevY = this.locY; -+ double prevZ = this.locZ; -+ float prevYaw = this.yaw; -+ float prevPitch = this.pitch; -+ // CraftBukkit end - super.t_(); - if (this.l() > 0) { - this.a(this.l() - 1); -@@ -196,6 +258,19 @@ - this.motX += -Math.sin((double) (f * 3.1415927F / 180.0F)) * this.b * (double) entityliving.ba * 0.05000000074505806D; - this.motZ += Math.cos((double) (f * 3.1415927F / 180.0F)) * this.b * (double) entityliving.ba * 0.05000000074505806D; - } -+ // CraftBukkit start - Support unoccupied deceleration -+ else if (unoccupiedDeceleration >= 0) { -+ this.motX *= unoccupiedDeceleration; -+ this.motZ *= unoccupiedDeceleration; -+ // Kill lingering speed -+ if (motX <= 0.00001) { -+ motX = 0; -+ } -+ if (motZ <= 0.00001) { -+ motZ = 0; -+ } -+ } -+ // CraftBukkit end - - d4 = Math.sqrt(this.motX * this.motX + this.motZ * this.motZ); - if (d4 > 0.35D) { -@@ -230,16 +305,26 @@ - Block block = this.world.getType(blockposition).getBlock(); - - if (block == Blocks.SNOW_LAYER) { -+ // CraftBukkit start -+ if (CraftEventFactory.callEntityChangeBlockEvent(this, l, j1, j, Blocks.AIR, 0).isCancelled()) { -+ continue; -+ } -+ // CraftBukkit end - this.world.setAir(blockposition); - this.positionChanged = false; - } else if (block == Blocks.WATERLILY) { -+ // CraftBukkit start -+ if (CraftEventFactory.callEntityChangeBlockEvent(this, l, j1, j, Blocks.AIR, 0).isCancelled()) { -+ continue; -+ } -+ // CraftBukkit end - this.world.setAir(blockposition, true); - this.positionChanged = false; - } - } - } - -- if (this.onGround) { -+ if (this.onGround && !this.landBoats) { // CraftBukkit - this.motX *= 0.5D; - this.motY *= 0.5D; - this.motZ *= 0.5D; -@@ -248,6 +333,11 @@ - this.move(this.motX, this.motY, this.motZ); - if (this.positionChanged && d3 > 0.2975D) { - if (!this.world.isClientSide && !this.dead) { -+ // CraftBukkit start -+ Vehicle vehicle = (Vehicle) this.getBukkitEntity(); -+ VehicleDestroyEvent destroyEvent = new VehicleDestroyEvent(vehicle, null); -+ this.world.getServer().getPluginManager().callEvent(destroyEvent); -+ if (!destroyEvent.isCancelled()) { - this.die(); - if (this.world.getGameRules().getBoolean("doEntityDrops")) { - for (k = 0; k < 3; ++k) { -@@ -258,6 +348,7 @@ - this.a(Items.STICK, 1, 0.0F); - } - } -+ } // CraftBukkit end - } - } else { - this.motX *= 0.9900000095367432D; -@@ -285,6 +376,22 @@ - - this.yaw = (float) ((double) this.yaw + d12); - this.setYawPitch(this.yaw, this.pitch); -+ -+ // CraftBukkit start -+ org.bukkit.Server server = this.world.getServer(); -+ org.bukkit.World bworld = this.world.getWorld(); -+ -+ Location from = new Location(bworld, prevX, prevY, prevZ, prevYaw, prevPitch); -+ Location to = new Location(bworld, this.locX, this.locY, this.locZ, this.yaw, this.pitch); -+ Vehicle vehicle = (Vehicle) this.getBukkitEntity(); -+ -+ server.getPluginManager().callEvent(new org.bukkit.event.vehicle.VehicleUpdateEvent(vehicle)); -+ -+ if (!from.equals(to)) { -+ VehicleMoveEvent event = new VehicleMoveEvent(vehicle, from, to); -+ server.getPluginManager().callEvent(event); -+ } -+ // CraftBukkit end - if (!this.world.isClientSide) { - List list = this.world.getEntities(this, this.getBoundingBox().grow(0.20000000298023224D, 0.0D, 0.20000000298023224D)); - -@@ -299,6 +406,7 @@ - } - - if (this.passenger != null && this.passenger.dead) { -+ this.passenger.vehicle = null; // CraftBukkit - this.passenger = null; - } - -@@ -336,6 +444,11 @@ - if (this.fallDistance > 3.0F) { - this.e(this.fallDistance, 1.0F); - if (!this.world.isClientSide && !this.dead) { -+ // CraftBukkit start -+ Vehicle vehicle = (Vehicle) this.getBukkitEntity(); -+ VehicleDestroyEvent destroyEvent = new VehicleDestroyEvent(vehicle, null); -+ this.world.getServer().getPluginManager().callEvent(destroyEvent); -+ if (!destroyEvent.isCancelled()) { - this.die(); - if (this.world.getGameRules().getBoolean("doEntityDrops")) { - int i; -@@ -348,6 +461,7 @@ - this.a(Items.STICK, 1, 0.0F); - } - } -+ } // CraftBukkit end - } - - this.fallDistance = 0.0F; diff --git a/TacoSpigot-Server/nms-patches/EntityChicken.patch b/TacoSpigot-Server/nms-patches/EntityChicken.patch deleted file mode 100644 index 190c725..0000000 --- a/TacoSpigot-Server/nms-patches/EntityChicken.patch +++ /dev/null @@ -1,14 +0,0 @@ ---- a/net/minecraft/server/EntityChicken.java -+++ b/net/minecraft/server/EntityChicken.java -@@ -35,6 +35,11 @@ - } - - public void m() { -+ // CraftBukkit start -+ if (this.isChickenJockey()) { -+ this.persistent = !this.isTypeNotPersistent(); -+ } -+ // CraftBukkit end - super.m(); - this.bq = this.bm; - this.bp = this.bo; diff --git a/TacoSpigot-Server/nms-patches/EntityCow.patch b/TacoSpigot-Server/nms-patches/EntityCow.patch deleted file mode 100644 index af9721a..0000000 --- a/TacoSpigot-Server/nms-patches/EntityCow.patch +++ /dev/null @@ -1,39 +0,0 @@ ---- a/net/minecraft/server/EntityCow.java -+++ b/net/minecraft/server/EntityCow.java -@@ -1,5 +1,10 @@ - package net.minecraft.server; - -+// CraftBukkit start -+import org.bukkit.craftbukkit.event.CraftEventFactory; -+import org.bukkit.craftbukkit.inventory.CraftItemStack; -+// CraftBukkit end -+ - public class EntityCow extends EntityAnimal { - - public EntityCow(World world) { -@@ -71,11 +76,21 @@ - ItemStack itemstack = entityhuman.inventory.getItemInHand(); - - if (itemstack != null && itemstack.getItem() == Items.BUCKET && !entityhuman.abilities.canInstantlyBuild && !this.isBaby()) { -- if (itemstack.count-- == 1) { -- entityhuman.inventory.setItem(entityhuman.inventory.itemInHandIndex, new ItemStack(Items.MILK_BUCKET)); -- } else if (!entityhuman.inventory.pickup(new ItemStack(Items.MILK_BUCKET))) { -- entityhuman.drop(new ItemStack(Items.MILK_BUCKET, 1, 0), false); -+ // CraftBukkit start - Got milk? -+ org.bukkit.Location loc = this.getBukkitEntity().getLocation(); -+ org.bukkit.event.player.PlayerBucketFillEvent event = CraftEventFactory.callPlayerBucketFillEvent(entityhuman, loc.getBlockX(), loc.getBlockY(), loc.getBlockZ(), null, itemstack, Items.MILK_BUCKET); -+ -+ if (event.isCancelled()) { -+ return false; -+ } -+ -+ ItemStack result = CraftItemStack.asNMSCopy(event.getItemStack()); -+ if (--itemstack.count <= 0) { -+ entityhuman.inventory.setItem(entityhuman.inventory.itemInHandIndex, result); -+ } else if (!entityhuman.inventory.pickup(result)) { -+ entityhuman.drop(result, false); - } -+ // CraftBukkit end - - return true; - } else { diff --git a/TacoSpigot-Server/nms-patches/EntityCreature.patch b/TacoSpigot-Server/nms-patches/EntityCreature.patch deleted file mode 100644 index 5101551..0000000 --- a/TacoSpigot-Server/nms-patches/EntityCreature.patch +++ /dev/null @@ -1,29 +0,0 @@ ---- a/net/minecraft/server/EntityCreature.java -+++ b/net/minecraft/server/EntityCreature.java -@@ -2,6 +2,10 @@ - - import java.util.UUID; - -+// CraftBukkit start -+import org.bukkit.event.entity.EntityUnleashEvent; -+// CraftBukkit end -+ - public abstract class EntityCreature extends EntityInsentient { - - public static final UUID bk = UUID.fromString("E199AD21-BA8A-4C53-8D13-6182D5C69D3A"); -@@ -69,6 +73,7 @@ - - if (this instanceof EntityTameableAnimal && ((EntityTameableAnimal) this).isSitting()) { - if (f > 10.0F) { -+ this.world.getServer().getPluginManager().callEvent(new EntityUnleashEvent(this.getBukkitEntity(), EntityUnleashEvent.UnleashReason.DISTANCE)); // CraftBukkit - this.unleash(true, true); - } - -@@ -100,6 +105,7 @@ - } - - if (f > 10.0F) { -+ this.world.getServer().getPluginManager().callEvent(new EntityUnleashEvent(this.getBukkitEntity(), EntityUnleashEvent.UnleashReason.DISTANCE)); // CraftBukkit - this.unleash(true, true); - } - } else if (!this.cc() && this.bm) { diff --git a/TacoSpigot-Server/nms-patches/EntityCreeper.patch b/TacoSpigot-Server/nms-patches/EntityCreeper.patch deleted file mode 100644 index 3b023cb..0000000 --- a/TacoSpigot-Server/nms-patches/EntityCreeper.patch +++ /dev/null @@ -1,105 +0,0 @@ ---- a/net/minecraft/server/EntityCreeper.java -+++ b/net/minecraft/server/EntityCreeper.java -@@ -1,5 +1,10 @@ - package net.minecraft.server; - -+// CraftBukkit start -+import org.bukkit.craftbukkit.event.CraftEventFactory; -+import org.bukkit.event.entity.ExplosionPrimeEvent; -+// CraftBukkit end -+ - public class EntityCreeper extends EntityMonster { - - private int a; -@@ -7,6 +12,7 @@ - private int maxFuseTicks = 30; - private int explosionRadius = 3; - private int bn = 0; -+ private int record = -1; // CraftBukkit - - public EntityCreeper(World world) { - super(world); -@@ -110,19 +116,39 @@ - } - - public void die(DamageSource damagesource) { -- super.die(damagesource); -+ // super.die(damagesource); // CraftBukkit - Moved to end - if (damagesource.getEntity() instanceof EntitySkeleton) { - int i = Item.getId(Items.RECORD_13); - int j = Item.getId(Items.RECORD_WAIT); - int k = i + this.random.nextInt(j - i + 1); - -- this.a(Item.getById(k), 1); -+ // CraftBukkit start - Store record for now, drop in dropDeathLoot -+ // this.a(Item.getById(k), 1); -+ this.record = k; -+ // CraftBukkit end - } else if (damagesource.getEntity() instanceof EntityCreeper && damagesource.getEntity() != this && ((EntityCreeper) damagesource.getEntity()).isPowered() && ((EntityCreeper) damagesource.getEntity()).cp()) { - ((EntityCreeper) damagesource.getEntity()).cq(); -- this.a(new ItemStack(Items.SKULL, 1, 4), 0.0F); -+ // CraftBukkit start -+ // this.a(new ItemStack(Items.SKULL, 1, 4), 0.0F); -+ headDrop = new ItemStack(Items.SKULL, 1, 4); -+ // CraftBukkit end - } -+ -+ super.die(damagesource); // CraftBukkit - Moved from above -+ } -+ -+ // CraftBukkit start - Whole method -+ @Override -+ protected void dropDeathLoot(boolean flag, int i) { -+ super.dropDeathLoot(flag, i); - -+ // Drop a music disc? -+ if (this.record != -1) { -+ this.a(Item.getById(this.record), 1); -+ this.record = -1; -+ } - } -+ // CraftBukkit end - - public boolean r(Entity entity) { - return true; -@@ -146,7 +172,21 @@ - - public void onLightningStrike(EntityLightning entitylightning) { - super.onLightningStrike(entitylightning); -- this.datawatcher.watch(17, Byte.valueOf((byte) 1)); -+ // CraftBukkit start -+ if (CraftEventFactory.callCreeperPowerEvent(this, entitylightning, org.bukkit.event.entity.CreeperPowerEvent.PowerCause.LIGHTNING).isCancelled()) { -+ return; -+ } -+ -+ this.setPowered(true); -+ } -+ -+ public void setPowered(boolean powered) { -+ if (!powered) { -+ this.datawatcher.watch(17, Byte.valueOf((byte) 0)); -+ } else { -+ this.datawatcher.watch(17, Byte.valueOf((byte) 1)); -+ } -+ // CraftBukkit end - } - - protected boolean a(EntityHuman entityhuman) { -@@ -170,8 +210,15 @@ - boolean flag = this.world.getGameRules().getBoolean("mobGriefing"); - float f = this.isPowered() ? 2.0F : 1.0F; - -- this.world.explode(this, this.locX, this.locY, this.locZ, (float) this.explosionRadius * f, flag); -- this.die(); -+ ExplosionPrimeEvent event = new ExplosionPrimeEvent(this.getBukkitEntity(), this.explosionRadius * f, false); -+ this.world.getServer().getPluginManager().callEvent(event); -+ if (!event.isCancelled()) { -+ this.world.createExplosion(this, this.locX, this.locY, this.locZ, event.getRadius(), event.getFire(), flag); -+ this.die(); -+ } else { -+ fuseTicks = 0; -+ } -+ // CraftBukkit end - } - - } diff --git a/TacoSpigot-Server/nms-patches/EntityDamageSourceIndirect.patch b/TacoSpigot-Server/nms-patches/EntityDamageSourceIndirect.patch deleted file mode 100644 index 6896c49..0000000 --- a/TacoSpigot-Server/nms-patches/EntityDamageSourceIndirect.patch +++ /dev/null @@ -1,13 +0,0 @@ ---- a/net/minecraft/server/EntityDamageSourceIndirect.java -+++ b/net/minecraft/server/EntityDamageSourceIndirect.java -@@ -25,4 +25,10 @@ - - return itemstack != null && itemstack.hasName() && LocaleI18n.c(s1) ? new ChatMessage(s1, new Object[] { entityliving.getScoreboardDisplayName(), ichatbasecomponent, itemstack.C()}) : new ChatMessage(s, new Object[] { entityliving.getScoreboardDisplayName(), ichatbasecomponent}); - } -+ -+ // CraftBukkit start -+ public Entity getProximateDamageSource() { -+ return super.getEntity(); -+ } -+ // CraftBukkit end - } diff --git a/TacoSpigot-Server/nms-patches/EntityEgg.patch b/TacoSpigot-Server/nms-patches/EntityEgg.patch deleted file mode 100644 index 9b33c18..0000000 --- a/TacoSpigot-Server/nms-patches/EntityEgg.patch +++ /dev/null @@ -1,66 +0,0 @@ ---- a/net/minecraft/server/EntityEgg.java -+++ b/net/minecraft/server/EntityEgg.java -@@ -1,5 +1,12 @@ - package net.minecraft.server; - -+// CraftBukkit start -+import org.bukkit.entity.Ageable; -+import org.bukkit.entity.EntityType; -+import org.bukkit.entity.Player; -+import org.bukkit.event.player.PlayerEggThrowEvent; -+// CraftBukkit end -+ - public class EntityEgg extends EntityProjectile { - - public EntityEgg(World world) { -@@ -19,21 +26,37 @@ - movingobjectposition.entity.damageEntity(DamageSource.projectile(this, this.getShooter()), 0.0F); - } - -- if (!this.world.isClientSide && this.random.nextInt(8) == 0) { -- byte b0 = 1; -+ // CraftBukkit start - Fire PlayerEggThrowEvent -+ boolean hatching = !this.world.isClientSide && this.random.nextInt(8) == 0; -+ int numHatching = (this.random.nextInt(32) == 0) ? 4 : 1; -+ if (!hatching) { -+ numHatching = 0; -+ } -+ -+ EntityType hatchingType = EntityType.CHICKEN; -+ -+ Entity shooter = this.getShooter(); -+ if (shooter instanceof EntityPlayer) { -+ Player player = (shooter == null) ? null : (Player) shooter.getBukkitEntity(); -+ -+ PlayerEggThrowEvent event = new PlayerEggThrowEvent(player, (org.bukkit.entity.Egg) this.getBukkitEntity(), hatching, (byte) numHatching, hatchingType); -+ this.world.getServer().getPluginManager().callEvent(event); -+ -+ hatching = event.isHatching(); -+ numHatching = event.getNumHatches(); -+ hatchingType = event.getHatchingType(); -+ } - -- if (this.random.nextInt(32) == 0) { -- b0 = 4; -- } -- -- for (int i = 0; i < b0; ++i) { -- EntityChicken entitychicken = new EntityChicken(this.world); -- -- entitychicken.setAgeRaw(-24000); -- entitychicken.setPositionRotation(this.locX, this.locY, this.locZ, this.yaw, 0.0F); -- this.world.addEntity(entitychicken); -- } -+ if (hatching) { -+ for (int k = 0; k < numHatching; k++) { -+ Entity entity = world.getWorld().createEntity(new org.bukkit.Location(world.getWorld(), this.locX, this.locY, this.locZ, this.yaw, 0.0F), hatchingType.getEntityClass()); -+ if (entity.getBukkitEntity() instanceof Ageable) { -+ ((Ageable) entity.getBukkitEntity()).setBaby(); -+ } -+ world.getWorld().addEntity(entity, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.EGG); -+ } - } -+ // CraftBukkit end - - double d0 = 0.08D; - diff --git a/TacoSpigot-Server/nms-patches/EntityEnderCrystal.patch b/TacoSpigot-Server/nms-patches/EntityEnderCrystal.patch deleted file mode 100644 index 3e39d77..0000000 --- a/TacoSpigot-Server/nms-patches/EntityEnderCrystal.patch +++ /dev/null @@ -1,52 +0,0 @@ ---- a/net/minecraft/server/EntityEnderCrystal.java -+++ b/net/minecraft/server/EntityEnderCrystal.java -@@ -1,5 +1,10 @@ - package net.minecraft.server; - -+// CraftBukkit start -+import org.bukkit.craftbukkit.event.CraftEventFactory; -+import org.bukkit.event.entity.ExplosionPrimeEvent; -+// CraftBukkit end -+ - public class EntityEnderCrystal extends Entity { - - public int a; -@@ -32,7 +37,11 @@ - int k = MathHelper.floor(this.locZ); - - if (this.world.worldProvider instanceof WorldProviderTheEnd && this.world.getType(new BlockPosition(i, j, k)).getBlock() != Blocks.FIRE) { -- this.world.setTypeUpdate(new BlockPosition(i, j, k), Blocks.FIRE.getBlockData()); -+ // CraftBukkit start -+ if (!CraftEventFactory.callBlockIgniteEvent(this.world, i, j, k, this).isCancelled()) { -+ this.world.setTypeUpdate(new BlockPosition(i, j, k), Blocks.FIRE.getBlockData()); -+ } -+ // CraftBukkit end - } - - } -@@ -50,11 +59,24 @@ - return false; - } else { - if (!this.dead && !this.world.isClientSide) { -+ // CraftBukkit start - All non-living entities need this -+ if (CraftEventFactory.handleNonLivingEntityDamageEvent(this, damagesource, f)) { -+ return false; -+ } -+ // CraftBukkit end - this.b = 0; - if (this.b <= 0) { - this.die(); - if (!this.world.isClientSide) { -- this.world.explode((Entity) null, this.locX, this.locY, this.locZ, 6.0F, true); -+ // CraftBukkit start -+ ExplosionPrimeEvent event = new ExplosionPrimeEvent(this.getBukkitEntity(), 6.0F, false); -+ this.world.getServer().getPluginManager().callEvent(event); -+ if (event.isCancelled()) { -+ this.dead = false; -+ return false; -+ } -+ this.world.createExplosion(this, this.locX, this.locY, this.locZ, event.getRadius(), event.getFire(), true); -+ // CraftBukkit end - } - } - } diff --git a/TacoSpigot-Server/nms-patches/EntityEnderDragon.patch b/TacoSpigot-Server/nms-patches/EntityEnderDragon.patch deleted file mode 100644 index 9572a00..0000000 --- a/TacoSpigot-Server/nms-patches/EntityEnderDragon.patch +++ /dev/null @@ -1,277 +0,0 @@ ---- a/net/minecraft/server/EntityEnderDragon.java -+++ b/net/minecraft/server/EntityEnderDragon.java -@@ -5,6 +5,17 @@ - import java.util.Iterator; - import java.util.List; - -+// CraftBukkit start -+import org.bukkit.block.BlockState; -+import org.bukkit.craftbukkit.event.CraftEventFactory; -+import org.bukkit.craftbukkit.util.BlockStateListPopulator; -+import org.bukkit.event.entity.EntityCreatePortalEvent; -+import org.bukkit.event.entity.EntityExplodeEvent; -+import org.bukkit.event.entity.EntityRegainHealthEvent; -+import org.bukkit.event.entity.EntityTargetEvent; -+import org.bukkit.Bukkit; -+// CraftBukkit end -+ - public class EntityEnderDragon extends EntityInsentient implements IComplex, IMonster { - - public double a; -@@ -27,6 +38,7 @@ - public Entity target; - public int by; - public EntityEnderCrystal bz; -+ 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); -@@ -294,12 +306,21 @@ - if (this.bz != null) { - if (this.bz.dead) { - if (!this.world.isClientSide) { -+ CraftEventFactory.entityDamage = this.bz; // CraftBukkit - this.a(this.bn, DamageSource.explosion((Explosion) null), 10.0F); -+ CraftEventFactory.entityDamage = null; // CraftBukkit - } - - this.bz = null; - } else if (this.ticksLived % 10 == 0 && this.getHealth() < this.getMaxHealth()) { -- this.setHealth(this.getHealth() + 1.0F); -+ // CraftBukkit start -+ EntityRegainHealthEvent event = new EntityRegainHealthEvent(this.getBukkitEntity(), 1.0D, EntityRegainHealthEvent.RegainReason.ENDER_CRYSTAL); -+ this.world.getServer().getPluginManager().callEvent(event); -+ -+ if (!event.isCancelled()) { -+ this.setHealth((float) (this.getHealth() + event.getAmount())); -+ } -+ // CraftBukkit end - } - } - -@@ -368,7 +389,19 @@ - } - - if (this.random.nextInt(2) == 0 && !arraylist.isEmpty()) { -- this.target = (Entity) arraylist.get(this.random.nextInt(arraylist.size())); -+ // CraftBukkit start -+ Entity target = (Entity) this.world.players.get(this.random.nextInt(this.world.players.size())); -+ EntityTargetEvent event = new EntityTargetEvent(this.getBukkitEntity(), target.getBukkitEntity(), EntityTargetEvent.TargetReason.RANDOM_TARGET); -+ this.world.getServer().getPluginManager().callEvent(event); -+ -+ if (!event.isCancelled()) { -+ if (event.getTarget() == null) { -+ this.target = null; -+ } else { -+ this.target = ((org.bukkit.craftbukkit.entity.CraftEntity) event.getTarget()).getHandle(); -+ } -+ } -+ // CraftBukkit end - } else { - boolean flag; - -@@ -404,6 +437,11 @@ - boolean flag = false; - boolean flag1 = false; - -+ // CraftBukkit start - Create a list to hold all the destroyed blocks -+ List destroyedBlocks = new java.util.ArrayList(); -+ org.bukkit.craftbukkit.CraftWorld craftWorld = this.world.getWorld(); -+ // CraftBukkit end -+ - for (int k1 = i; k1 <= l; ++k1) { - for (int l1 = j; l1 <= i1; ++l1) { - for (int i2 = k; i2 <= j1; ++i2) { -@@ -412,7 +450,11 @@ - - if (block.getMaterial() != Material.AIR) { - if (block != Blocks.BARRIER && block != Blocks.OBSIDIAN && block != Blocks.END_STONE && block != Blocks.BEDROCK && block != Blocks.COMMAND_BLOCK && this.world.getGameRules().getBoolean("mobGriefing")) { -- flag1 = this.world.setAir(blockposition) || flag1; -+ // CraftBukkit start - Add blocks to list rather than destroying them -+ // flag1 = this.world.setAir(new BlockPosition(blockposition)) || flag1; -+ flag1 = true; -+ destroyedBlocks.add(craftWorld.getBlockAt(k1, l1, i2)); -+ // CraftBukkit end - } else { - flag = true; - } -@@ -422,6 +464,40 @@ - } - - if (flag1) { -+ // CraftBukkit start - Set off an EntityExplodeEvent for the dragon exploding all these blocks -+ org.bukkit.entity.Entity bukkitEntity = this.getBukkitEntity(); -+ EntityExplodeEvent event = new EntityExplodeEvent(bukkitEntity, bukkitEntity.getLocation(), destroyedBlocks, 0F); -+ Bukkit.getPluginManager().callEvent(event); -+ if (event.isCancelled()) { -+ // This flag literally means 'Dragon hit something hard' (Obsidian, White Stone or Bedrock) and will cause the dragon to slow down. -+ // We should consider adding an event extension for it, or perhaps returning true if the event is cancelled. -+ return flag; -+ } else if (event.getYield() == 0F) { -+ // Yield zero ==> no drops -+ for (org.bukkit.block.Block block : event.blockList()) { -+ this.world.setAir(new BlockPosition(block.getX(), block.getY(), block.getZ())); -+ } -+ } else { -+ for (org.bukkit.block.Block block : event.blockList()) { -+ org.bukkit.Material blockId = block.getType(); -+ if (blockId == org.bukkit.Material.AIR) { -+ continue; -+ } -+ -+ int blockX = block.getX(); -+ int blockY = block.getY(); -+ int blockZ = block.getZ(); -+ -+ Block nmsBlock = org.bukkit.craftbukkit.util.CraftMagicNumbers.getBlock(blockId); -+ if (nmsBlock.a(explosionSource)) { -+ nmsBlock.dropNaturally(this.world, new BlockPosition(blockX, blockY, blockZ), nmsBlock.fromLegacyData(block.getData()), event.getYield(), 0); -+ } -+ nmsBlock.wasExploded(world, new BlockPosition(blockX, blockY, blockZ), explosionSource); -+ -+ this.world.setAir(new BlockPosition(blockX, blockY, blockZ)); -+ } -+ } -+ // CraftBukkit end - double d0 = axisalignedbb.a + (axisalignedbb.d - axisalignedbb.a) * (double) this.random.nextFloat(); - double d1 = axisalignedbb.b + (axisalignedbb.e - axisalignedbb.b) * (double) this.random.nextFloat(); - double d2 = axisalignedbb.c + (axisalignedbb.f - axisalignedbb.c) * (double) this.random.nextFloat(); -@@ -469,6 +545,7 @@ - } - - protected void aZ() { -+ if (this.dead) return; // CraftBukkit - can't kill what's already dead - ++this.by; - if (this.by >= 180 && this.by <= 200) { - float f = (this.random.nextFloat() - 0.5F) * 8.0F; -@@ -484,7 +561,7 @@ - - if (!this.world.isClientSide) { - if (this.by > 150 && this.by % 5 == 0 && flag) { -- i = 1000; -+ i = this.expToDrop / 12; // CraftBukkit - drop experience as dragon falls from sky. use experience drop from death event. This is now set in getExpReward() - - while (i > 0) { - j = EntityExperienceOrb.getOrbValue(i); -@@ -494,7 +571,23 @@ - } - - if (this.by == 1) { -- this.world.a(1018, new BlockPosition(this), 0); -+ // CraftBukkit start - Use relative location for far away sounds -+ // this.world.a(1018, new BlockPosition(this), 0); -+ int viewDistance = ((WorldServer) this.world).getServer().getViewDistance() * 16; -+ for (EntityPlayer player : (List) MinecraftServer.getServer().getPlayerList().players) { -+ double deltaX = this.locX - player.locX; -+ double deltaZ = this.locZ - player.locZ; -+ double distanceSquared = deltaX * deltaX + deltaZ * deltaZ; -+ if (distanceSquared > viewDistance * viewDistance) { -+ double deltaLength = Math.sqrt(distanceSquared); -+ double relativeX = player.locX + (deltaX / deltaLength) * viewDistance; -+ double relativeZ = player.locZ + (deltaZ / deltaLength) * viewDistance; -+ player.playerConnection.sendPacket(new PacketPlayOutWorldEvent(1018, new BlockPosition((int) relativeX, (int) this.locY, (int) relativeZ), 0, true)); -+ } else { -+ player.playerConnection.sendPacket(new PacketPlayOutWorldEvent(1018, new BlockPosition((int) this.locX, (int) this.locY, (int) this.locZ), 0, true)); -+ } -+ } -+ // CraftBukkit end - } - } - -@@ -502,7 +595,7 @@ - this.aI = this.yaw += 20.0F; - if (this.by == 200 && !this.world.isClientSide) { - if (flag) { -- i = 2000; -+ i = this.expToDrop - (10 * this.expToDrop / 12); // CraftBukkit - drop the remaining experience - - while (i > 0) { - j = EntityExperienceOrb.getOrbValue(i); -@@ -522,6 +615,9 @@ - double d0 = 12.25D; - double d1 = 6.25D; - -+ // CraftBukkit start - Replace any "this.world" in the following with just "world"! -+ BlockStateListPopulator world = new BlockStateListPopulator(this.world.getWorld()); -+ - for (int i = -1; i <= 32; ++i) { - for (int j = -4; j <= 4; ++j) { - for (int k = -4; k <= 4; ++k) { -@@ -532,31 +628,51 @@ - - if (i < 0) { - if (d2 <= 6.25D) { -- this.world.setTypeUpdate(blockposition1, Blocks.BEDROCK.getBlockData()); -+ world.setTypeUpdate(blockposition1, Blocks.BEDROCK.getBlockData()); - } - } else if (i > 0) { -- this.world.setTypeUpdate(blockposition1, Blocks.AIR.getBlockData()); -+ world.setTypeUpdate(blockposition1, Blocks.AIR.getBlockData()); - } else if (d2 > 6.25D) { -- this.world.setTypeUpdate(blockposition1, Blocks.BEDROCK.getBlockData()); -+ world.setTypeUpdate(blockposition1, Blocks.BEDROCK.getBlockData()); - } else { -- this.world.setTypeUpdate(blockposition1, Blocks.END_PORTAL.getBlockData()); -+ world.setTypeUpdate(blockposition1, Blocks.END_PORTAL.getBlockData()); - } - } - } - } - } - -- this.world.setTypeUpdate(blockposition, Blocks.BEDROCK.getBlockData()); -- this.world.setTypeUpdate(blockposition.up(), Blocks.BEDROCK.getBlockData()); -+ world.setTypeUpdate(blockposition, Blocks.BEDROCK.getBlockData()); -+ world.setTypeUpdate(blockposition.up(), Blocks.BEDROCK.getBlockData()); - BlockPosition blockposition2 = blockposition.up(2); - -- this.world.setTypeUpdate(blockposition2, Blocks.BEDROCK.getBlockData()); -- this.world.setTypeUpdate(blockposition2.west(), Blocks.TORCH.getBlockData().set(BlockTorch.FACING, EnumDirection.EAST)); -- this.world.setTypeUpdate(blockposition2.east(), Blocks.TORCH.getBlockData().set(BlockTorch.FACING, EnumDirection.WEST)); -- this.world.setTypeUpdate(blockposition2.north(), Blocks.TORCH.getBlockData().set(BlockTorch.FACING, EnumDirection.SOUTH)); -- this.world.setTypeUpdate(blockposition2.south(), Blocks.TORCH.getBlockData().set(BlockTorch.FACING, EnumDirection.NORTH)); -- this.world.setTypeUpdate(blockposition.up(3), Blocks.BEDROCK.getBlockData()); -- this.world.setTypeUpdate(blockposition.up(4), Blocks.DRAGON_EGG.getBlockData()); -+ world.setTypeUpdate(blockposition2, Blocks.BEDROCK.getBlockData()); -+ world.setTypeUpdate(blockposition2.west(), Blocks.TORCH.getBlockData().set(BlockTorch.FACING, EnumDirection.EAST)); -+ world.setTypeUpdate(blockposition2.east(), Blocks.TORCH.getBlockData().set(BlockTorch.FACING, EnumDirection.WEST)); -+ world.setTypeUpdate(blockposition2.north(), Blocks.TORCH.getBlockData().set(BlockTorch.FACING, EnumDirection.SOUTH)); -+ world.setTypeUpdate(blockposition2.south(), Blocks.TORCH.getBlockData().set(BlockTorch.FACING, EnumDirection.NORTH)); -+ world.setTypeUpdate(blockposition.up(3), Blocks.BEDROCK.getBlockData()); -+ world.setTypeUpdate(blockposition.up(4), Blocks.DRAGON_EGG.getBlockData()); -+ -+ EntityCreatePortalEvent event = new EntityCreatePortalEvent((org.bukkit.entity.LivingEntity) this.getBukkitEntity(), java.util.Collections.unmodifiableList(world.getList()), org.bukkit.PortalType.ENDER); -+ this.world.getServer().getPluginManager().callEvent(event); -+ -+ if (!event.isCancelled()) { -+ for (BlockState state : event.getBlocks()) { -+ state.update(true); -+ } -+ } else { -+ for (BlockState state : event.getBlocks()) { -+ PacketPlayOutBlockChange packet = new PacketPlayOutBlockChange(this.world, new BlockPosition(state.getX(), state.getY(), state.getZ())); -+ for (Iterator it = this.world.players.iterator(); it.hasNext();) { -+ EntityHuman entity = (EntityHuman) it.next(); -+ if (entity instanceof EntityPlayer) { -+ ((EntityPlayer) entity).playerConnection.sendPacket(packet); -+ } -+ } -+ } -+ } -+ // CraftBukkit end - } - - protected void D() {} -@@ -584,4 +700,12 @@ - protected float bB() { - return 5.0F; - } -+ -+ // CraftBukkit start -+ public int getExpReward() { -+ // This value is equal to the amount of experience dropped while falling from the sky (10 * 1000) -+ // plus what is dropped when the dragon hits the ground (2000) -+ return 12000; -+ } -+ // CraftBukkit end - } diff --git a/TacoSpigot-Server/nms-patches/EntityEnderPearl.patch b/TacoSpigot-Server/nms-patches/EntityEnderPearl.patch deleted file mode 100644 index 760fad2..0000000 --- a/TacoSpigot-Server/nms-patches/EntityEnderPearl.patch +++ /dev/null @@ -1,64 +0,0 @@ ---- a/net/minecraft/server/EntityEnderPearl.java -+++ b/net/minecraft/server/EntityEnderPearl.java -@@ -1,5 +1,11 @@ - package net.minecraft.server; - -+// CraftBukkit start -+import org.bukkit.Bukkit; -+import org.bukkit.craftbukkit.event.CraftEventFactory; -+import org.bukkit.event.player.PlayerTeleportEvent; -+// CraftBukkit end -+ - public class EntityEnderPearl extends EntityProjectile { - - private EntityLiving c; -@@ -33,21 +39,35 @@ - EntityPlayer entityplayer = (EntityPlayer) entityliving; - - if (entityplayer.playerConnection.a().g() && entityplayer.world == this.world && !entityplayer.isSleeping()) { -- if (this.random.nextFloat() < 0.05F && this.world.getGameRules().getBoolean("doMobSpawning")) { -- EntityEndermite entityendermite = new EntityEndermite(this.world); -- -- entityendermite.a(true); -- entityendermite.setPositionRotation(entityliving.locX, entityliving.locY, entityliving.locZ, entityliving.yaw, entityliving.pitch); -- this.world.addEntity(entityendermite); -+ // CraftBukkit start - Fire PlayerTeleportEvent -+ org.bukkit.craftbukkit.entity.CraftPlayer player = entityplayer.getBukkitEntity(); -+ org.bukkit.Location location = getBukkitEntity().getLocation(); -+ location.setPitch(player.getLocation().getPitch()); -+ location.setYaw(player.getLocation().getYaw()); -+ -+ PlayerTeleportEvent teleEvent = new PlayerTeleportEvent(player, player.getLocation(), location, PlayerTeleportEvent.TeleportCause.ENDER_PEARL); -+ Bukkit.getPluginManager().callEvent(teleEvent); -+ -+ if (!teleEvent.isCancelled() && !entityplayer.playerConnection.isDisconnected()) { -+ if (this.random.nextFloat() < 0.05F && this.world.getGameRules().getBoolean("doMobSpawning")) { -+ EntityEndermite entityendermite = new EntityEndermite(this.world); -+ -+ entityendermite.a(true); -+ entityendermite.setPositionRotation(entityliving.locX, entityliving.locY, entityliving.locZ, entityliving.yaw, entityliving.pitch); -+ this.world.addEntity(entityendermite); -+ } -+ -+ if (entityliving.au()) { -+ entityliving.mount((Entity) null); -+ } -+ -+ entityplayer.playerConnection.teleport(teleEvent.getTo()); -+ entityliving.fallDistance = 0.0F; -+ CraftEventFactory.entityDamage = this; -+ entityliving.damageEntity(DamageSource.FALL, 5.0F); -+ CraftEventFactory.entityDamage = null; - } -- -- if (entityliving.au()) { -- entityliving.mount((Entity) null); -- } -- -- entityliving.enderTeleportTo(this.locX, this.locY, this.locZ); -- entityliving.fallDistance = 0.0F; -- entityliving.damageEntity(DamageSource.FALL, 5.0F); -+ // CraftBukkit end - } - } else if (entityliving != null) { - entityliving.enderTeleportTo(this.locX, this.locY, this.locZ); diff --git a/TacoSpigot-Server/nms-patches/EntityEnderman.patch b/TacoSpigot-Server/nms-patches/EntityEnderman.patch deleted file mode 100644 index b14daaa..0000000 --- a/TacoSpigot-Server/nms-patches/EntityEnderman.patch +++ /dev/null @@ -1,62 +0,0 @@ ---- a/net/minecraft/server/EntityEnderman.java -+++ b/net/minecraft/server/EntityEnderman.java -@@ -8,6 +8,12 @@ - import java.util.Set; - import java.util.UUID; - -+// CraftBukkit start -+import org.bukkit.Location; -+import org.bukkit.craftbukkit.event.CraftEventFactory; -+import org.bukkit.event.entity.EntityTeleportEvent; -+// CraftBukkit end -+ - public class EntityEnderman extends EntityMonster { - - private static final UUID a = UUID.fromString("020E0DFB-87AE-4653-9556-831010E291A0"); -@@ -177,7 +183,17 @@ - } - - if (flag1) { -- super.enderTeleportTo(this.locX, this.locY, this.locZ); -+ // CraftBukkit start - Teleport event -+ // super.enderTeleportTo(this.locX, this.locY, this.locZ); -+ EntityTeleportEvent teleport = new EntityTeleportEvent(this.getBukkitEntity(), new Location(this.world.getWorld(), d3, d4, d5), new Location(this.world.getWorld(), this.locX, this.locY, this.locZ)); -+ this.world.getServer().getPluginManager().callEvent(teleport); -+ if (teleport.isCancelled()) { -+ return false; -+ } -+ -+ Location to = teleport.getTo(); -+ this.enderTeleportTo(to.getX(), to.getY(), to.getZ()); -+ // CraftBukkit end - if (this.world.getCubes(this, this.getBoundingBox()).isEmpty() && !this.world.containsLiquid(this.getBoundingBox())) { - flag = true; - } -@@ -333,8 +349,12 @@ - Block block = iblockdata.getBlock(); - - if (EntityEnderman.c.contains(block)) { -- this.enderman.setCarried(iblockdata); -- world.setTypeUpdate(blockposition, Blocks.AIR.getBlockData()); -+ // CraftBukkit start - Pickup event -+ if (!org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(this.enderman, this.enderman.world.getWorld().getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ()), org.bukkit.Material.AIR).isCancelled()) { -+ this.enderman.setCarried(iblockdata); -+ world.setTypeUpdate(blockposition, Blocks.AIR.getBlockData()); -+ } -+ // CraftBukkit end - } - - } -@@ -363,8 +383,12 @@ - Block block1 = world.getType(blockposition.down()).getBlock(); - - if (this.a(world, blockposition, this.a.getCarried().getBlock(), block, block1)) { -+ // CraftBukkit start - Place event -+ if (!org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(this.a, blockposition.getX(), blockposition.getY(), blockposition.getZ(), this.a.getCarried().getBlock(), this.a.getCarried().getBlock().toLegacyData(this.a.getCarried())).isCancelled()) { - world.setTypeAndData(blockposition, this.a.getCarried(), 3); - this.a.setCarried(Blocks.AIR.getBlockData()); -+ } -+ // CraftBukkit end - } - - } diff --git a/TacoSpigot-Server/nms-patches/EntityExperienceOrb.patch b/TacoSpigot-Server/nms-patches/EntityExperienceOrb.patch deleted file mode 100644 index b01b0c7..0000000 --- a/TacoSpigot-Server/nms-patches/EntityExperienceOrb.patch +++ /dev/null @@ -1,82 +0,0 @@ ---- a/net/minecraft/server/EntityExperienceOrb.java -+++ b/net/minecraft/server/EntityExperienceOrb.java -@@ -1,5 +1,11 @@ - package net.minecraft.server; - -+// CraftBukkit start -+import org.bukkit.craftbukkit.event.CraftEventFactory; -+import org.bukkit.event.entity.EntityTargetLivingEntityEvent; -+import org.bukkit.event.entity.EntityTargetEvent; -+// CraftBukkit end -+ - public class EntityExperienceOrb extends Entity { - - public int a; -@@ -34,6 +40,7 @@ - - public void t_() { - super.t_(); -+ EntityHuman prevTarget = this.targetPlayer;// CraftBukkit - store old target - if (this.c > 0) { - --this.c; - } -@@ -65,6 +72,16 @@ - } - - if (this.targetPlayer != null) { -+ // CraftBukkit start -+ boolean cancelled = false; -+ if (this.targetPlayer != prevTarget) { -+ EntityTargetLivingEntityEvent event = CraftEventFactory.callEntityTargetLivingEvent(this, targetPlayer, EntityTargetEvent.TargetReason.CLOSEST_PLAYER); -+ EntityLiving target = event.getTarget() == null ? null : ((org.bukkit.craftbukkit.entity.CraftLivingEntity) event.getTarget()).getHandle(); -+ targetPlayer = target instanceof EntityHuman ? (EntityHuman) target : null; -+ cancelled = event.isCancelled(); -+ } -+ -+ if (!cancelled && targetPlayer != null) { - double d1 = (this.targetPlayer.locX - this.locX) / d0; - double d2 = (this.targetPlayer.locY + (double) this.targetPlayer.getHeadHeight() - this.locY) / d0; - double d3 = (this.targetPlayer.locZ - this.locZ) / d0; -@@ -77,6 +94,8 @@ - this.motY += d2 / d4 * d5 * 0.1D; - this.motZ += d3 / d4 * d5 * 0.1D; - } -+ } -+ // CraftBukkit end - } - - this.move(this.motX, this.motY, this.motZ); -@@ -141,7 +160,7 @@ - entityhuman.bp = 2; - this.world.makeSound(entityhuman, "random.orb", 0.1F, 0.5F * ((this.random.nextFloat() - this.random.nextFloat()) * 0.7F + 1.8F)); - entityhuman.receive(this, 1); -- entityhuman.giveExp(this.value); -+ entityhuman.giveExp(CraftEventFactory.callPlayerExpChangeEvent(entityhuman, this.value).getAmount()); // CraftBukkit - this.value -> event.getAmount() - this.die(); - } - -@@ -153,6 +172,24 @@ - } - - public static int getOrbValue(int i) { -+ // CraftBukkit start -+ if (i > 162670129) return i - 100000; -+ if (i > 81335063) return 81335063; -+ if (i > 40667527) return 40667527; -+ if (i > 20333759) return 20333759; -+ if (i > 10166857) return 10166857; -+ if (i > 5083423) return 5083423; -+ if (i > 2541701) return 2541701; -+ if (i > 1270849) return 1270849; -+ if (i > 635413) return 635413; -+ if (i > 317701) return 317701; -+ if (i > 158849) return 158849; -+ if (i > 79423) return 79423; -+ if (i > 39709) return 39709; -+ if (i > 19853) return 19853; -+ if (i > 9923) return 9923; -+ if (i > 4957) return 4957; -+ // CraftBukkit end - return i >= 2477 ? 2477 : (i >= 1237 ? 1237 : (i >= 617 ? 617 : (i >= 307 ? 307 : (i >= 149 ? 149 : (i >= 73 ? 73 : (i >= 37 ? 37 : (i >= 17 ? 17 : (i >= 7 ? 7 : (i >= 3 ? 3 : 1))))))))); - } - diff --git a/TacoSpigot-Server/nms-patches/EntityFallingBlock.patch b/TacoSpigot-Server/nms-patches/EntityFallingBlock.patch deleted file mode 100644 index a0ffb88..0000000 --- a/TacoSpigot-Server/nms-patches/EntityFallingBlock.patch +++ /dev/null @@ -1,52 +0,0 @@ ---- a/net/minecraft/server/EntityFallingBlock.java -+++ b/net/minecraft/server/EntityFallingBlock.java -@@ -4,13 +4,15 @@ - import java.util.ArrayList; - import java.util.Iterator; - -+import org.bukkit.craftbukkit.event.CraftEventFactory; // CraftBukkit -+ - public class EntityFallingBlock extends Entity { - - private IBlockData block; - public int ticksLived; - public boolean dropItem = true; - private boolean e; -- private boolean hurtEntities; -+ public boolean hurtEntities; // PAIL: private -> public - private int fallHurtMax = 40; - private float fallHurtAmount = 2.0F; - public NBTTagCompound tileEntityData; -@@ -56,7 +58,7 @@ - - if (this.ticksLived++ == 0) { - blockposition = new BlockPosition(this); -- if (this.world.getType(blockposition).getBlock() == block) { -+ if (this.world.getType(blockposition).getBlock() == block && !CraftEventFactory.callEntityChangeBlockEvent(this, blockposition.getX(), blockposition.getY(), blockposition.getZ(), Blocks.AIR, 0).isCancelled()) { - this.world.setAir(blockposition); - } else if (!this.world.isClientSide) { - this.die(); -@@ -78,7 +80,12 @@ - if (this.world.getType(blockposition).getBlock() != Blocks.PISTON_EXTENSION) { - this.die(); - if (!this.e) { -- if (this.world.a(block, blockposition, true, EnumDirection.UP, (Entity) null, (ItemStack) null) && !BlockFalling.canFall(this.world, blockposition.down()) && this.world.setTypeAndData(blockposition, this.block, 3)) { -+ if (this.world.a(block, blockposition, true, EnumDirection.UP, (Entity) null, (ItemStack) null) && !BlockFalling.canFall(this.world, blockposition.down()) /* mimic the false conditions of setTypeIdAndData */ && blockposition.getX() >= -30000000 && blockposition.getZ() >= -30000000 && blockposition.getX() < 30000000 && blockposition.getZ() < 30000000 && blockposition.getY() >= 0 && blockposition.getY() < 256 && this.world.getType(blockposition) != this.block) { -+ if (CraftEventFactory.callEntityChangeBlockEvent(this, blockposition.getX(), blockposition.getY(), blockposition.getZ(), this.block.getBlock(), this.block.getBlock().toLegacyData(this.block)).isCancelled()) { -+ return; -+ } -+ this.world.setTypeAndData(blockposition, this.block, 3); -+ // CraftBukkit end - if (block instanceof BlockFalling) { - ((BlockFalling) block).a_(this.world, blockposition); - } -@@ -137,7 +144,9 @@ - while (iterator.hasNext()) { - Entity entity = (Entity) iterator.next(); - -+ CraftEventFactory.entityDamage = this; // CraftBukkit - entity.damageEntity(damagesource, (float) Math.min(MathHelper.d((float) i * this.fallHurtAmount), this.fallHurtMax)); -+ CraftEventFactory.entityDamage = null; // CraftBukkit - } - - if (flag && (double) this.random.nextFloat() < 0.05000000074505806D + (double) i * 0.05D) { diff --git a/TacoSpigot-Server/nms-patches/EntityFireball.patch b/TacoSpigot-Server/nms-patches/EntityFireball.patch deleted file mode 100644 index 416b8eb..0000000 --- a/TacoSpigot-Server/nms-patches/EntityFireball.patch +++ /dev/null @@ -1,102 +0,0 @@ ---- a/net/minecraft/server/EntityFireball.java -+++ b/net/minecraft/server/EntityFireball.java -@@ -2,6 +2,8 @@ - - import java.util.List; - -+import org.bukkit.craftbukkit.event.CraftEventFactory; // CraftBukkit -+ - public abstract class EntityFireball extends Entity { - - private int e = -1; -@@ -15,6 +17,8 @@ - public double dirX; - public double dirY; - public double dirZ; -+ public float bukkitYield = 1; // CraftBukkit -+ public boolean isIncendiary = true; // CraftBukkit - - public EntityFireball(World world) { - super(world); -@@ -38,10 +42,17 @@ - public EntityFireball(World world, EntityLiving entityliving, double d0, double d1, double d2) { - super(world); - this.shooter = entityliving; -+ this.projectileSource = (org.bukkit.entity.LivingEntity) entityliving.getBukkitEntity(); // CraftBukkit - this.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 = this.motY = this.motZ = 0.0D; -+ // CraftBukkit start - Added setDirection method -+ this.setDirection(d0, d1, d2); -+ } -+ -+ public void setDirection(double d0, double d1, double d2) { -+ // CraftBukkit end - d0 += this.random.nextGaussian() * 0.4D; - d1 += this.random.nextGaussian() * 0.4D; - d2 += this.random.nextGaussian() * 0.4D; -@@ -117,6 +128,12 @@ - - if (movingobjectposition != null) { - this.a(movingobjectposition); -+ -+ // CraftBukkit start - Fire ProjectileHitEvent -+ if (this.dead) { -+ CraftEventFactory.callProjectileHitEvent(this); -+ } -+ // CraftBukkit end - } - - this.locX += this.motX; -@@ -181,6 +198,8 @@ - - nbttagcompound.setString("inTile", minecraftkey == null ? "" : minecraftkey.toString()); - nbttagcompound.setByte("inGround", (byte) (this.i ? 1 : 0)); -+ // CraftBukkit - Fix direction being mismapped to invalid variables -+ nbttagcompound.set("power", this.a(new double[] { this.dirX, this.dirY, this.dirZ})); - nbttagcompound.set("direction", this.a(new double[] { this.motX, this.motY, this.motZ})); - } - -@@ -195,12 +214,20 @@ - } - - this.i = nbttagcompound.getByte("inGround") == 1; -- if (nbttagcompound.hasKeyOfType("direction", 9)) { -+ // CraftBukkit start - direction -> power -+ if (nbttagcompound.hasKeyOfType("power", 9)) { -+ NBTTagList nbttaglist = nbttagcompound.getList("power", 6); -+ -+ this.dirX = nbttaglist.d(0); -+ this.dirY = nbttaglist.d(1); -+ this.dirZ = nbttaglist.d(2); -+ } else if (nbttagcompound.hasKeyOfType("direction", 9)) { - NBTTagList nbttaglist = nbttagcompound.getList("direction", 6); - - this.motX = nbttaglist.d(0); - this.motY = nbttaglist.d(1); - this.motZ = nbttaglist.d(2); -+ // CraftBukkit end - } else { - this.die(); - } -@@ -221,6 +248,11 @@ - } else { - this.ac(); - if (damagesource.getEntity() != null) { -+ // CraftBukkit start -+ if (CraftEventFactory.handleNonLivingEntityDamageEvent(this, damagesource, f)) { -+ return false; -+ } -+ // CraftBukkit end - Vec3D vec3d = damagesource.getEntity().ap(); - - if (vec3d != null) { -@@ -234,6 +266,7 @@ - - if (damagesource.getEntity() instanceof EntityLiving) { - this.shooter = (EntityLiving) damagesource.getEntity(); -+ this.projectileSource = (org.bukkit.projectiles.ProjectileSource) this.shooter.getBukkitEntity(); - } - - return true; diff --git a/TacoSpigot-Server/nms-patches/EntityFireworks.patch b/TacoSpigot-Server/nms-patches/EntityFireworks.patch deleted file mode 100644 index 4da644d..0000000 --- a/TacoSpigot-Server/nms-patches/EntityFireworks.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- a/net/minecraft/server/EntityFireworks.java -+++ b/net/minecraft/server/EntityFireworks.java -@@ -78,7 +78,7 @@ - } - - if (!this.world.isClientSide && this.ticksFlown > this.expectedLifespan) { -- this.world.broadcastEntityEffect(this, (byte) 17); -+ if (!org.bukkit.craftbukkit.event.CraftEventFactory.callFireworkExplodeEvent(this).isCancelled()) this.world.broadcastEntityEffect(this, (byte) 17); - this.die(); - } - diff --git a/TacoSpigot-Server/nms-patches/EntityFishingHook.patch b/TacoSpigot-Server/nms-patches/EntityFishingHook.patch deleted file mode 100644 index 899b0f4..0000000 --- a/TacoSpigot-Server/nms-patches/EntityFishingHook.patch +++ /dev/null @@ -1,92 +0,0 @@ ---- a/net/minecraft/server/EntityFishingHook.java -+++ b/net/minecraft/server/EntityFishingHook.java -@@ -3,6 +3,12 @@ - import java.util.Arrays; - import java.util.List; - -+// CraftBukkit start -+import org.bukkit.entity.Player; -+import org.bukkit.entity.Fish; -+import org.bukkit.event.player.PlayerFishEvent; -+// CraftBukkit end -+ - public class EntityFishingHook extends Entity { - - private static final List d = Arrays.asList(new PossibleFishingResult[] { (new PossibleFishingResult(new ItemStack(Items.LEATHER_BOOTS), 10)).a(0.9F), new PossibleFishingResult(new ItemStack(Items.LEATHER), 10), new PossibleFishingResult(new ItemStack(Items.BONE), 10), new PossibleFishingResult(new ItemStack(Items.POTION), 10), new PossibleFishingResult(new ItemStack(Items.STRING), 5), (new PossibleFishingResult(new ItemStack(Items.FISHING_ROD), 2)).a(0.9F), new PossibleFishingResult(new ItemStack(Items.BOWL), 10), new PossibleFishingResult(new ItemStack(Items.STICK), 5), new PossibleFishingResult(new ItemStack(Items.DYE, 10, EnumColor.BLACK.getInvColorIndex()), 1), new PossibleFishingResult(new ItemStack(Blocks.TRIPWIRE_HOOK), 10), new PossibleFishingResult(new ItemStack(Items.ROTTEN_FLESH), 10)}); -@@ -182,6 +188,7 @@ - } - - if (movingobjectposition != null) { -+ org.bukkit.craftbukkit.event.CraftEventFactory.callProjectileHitEvent(this); // Craftbukkit - Call event - if (movingobjectposition.entity != null) { - if (movingobjectposition.entity.damageEntity(DamageSource.projectile(this, this.owner), 0.0F)) { - this.hooked = movingobjectposition.entity; -@@ -381,6 +388,15 @@ - byte b0 = 0; - - if (this.hooked != null) { -+ // CraftBukkit start -+ PlayerFishEvent playerFishEvent = new PlayerFishEvent((Player) this.owner.getBukkitEntity(), this.hooked.getBukkitEntity(), (Fish) this.getBukkitEntity(), PlayerFishEvent.State.CAUGHT_ENTITY); -+ this.world.getServer().getPluginManager().callEvent(playerFishEvent); -+ -+ if (playerFishEvent.isCancelled()) { -+ return 0; -+ } -+ // CraftBukkit end -+ - double d0 = this.owner.locX - this.locX; - double d1 = this.owner.locY - this.locY; - double d2 = this.owner.locZ - this.locZ; -@@ -393,6 +409,15 @@ - b0 = 3; - } else if (this.av > 0) { - EntityItem entityitem = new EntityItem(this.world, this.locX, this.locY, this.locZ, this.m()); -+ // CraftBukkit start -+ PlayerFishEvent playerFishEvent = new PlayerFishEvent((Player) this.owner.getBukkitEntity(), entityitem.getBukkitEntity(), (Fish) this.getBukkitEntity(), PlayerFishEvent.State.CAUGHT_FISH); -+ playerFishEvent.setExpToDrop(this.random.nextInt(6) + 1); -+ this.world.getServer().getPluginManager().callEvent(playerFishEvent); -+ -+ if (playerFishEvent.isCancelled()) { -+ return 0; -+ } -+ // CraftBukkit end - double d5 = this.owner.locX - this.locX; - double d6 = this.owner.locY - this.locY; - double d7 = this.owner.locZ - this.locZ; -@@ -403,14 +428,35 @@ - entityitem.motY = d6 * d9 + (double) MathHelper.sqrt(d8) * 0.08D; - entityitem.motZ = d7 * d9; - this.world.addEntity(entityitem); -- this.owner.world.addEntity(new EntityExperienceOrb(this.owner.world, this.owner.locX, this.owner.locY + 0.5D, this.owner.locZ + 0.5D, this.random.nextInt(6) + 1)); -+ // CraftBukkit start - this.random.nextInt(6) + 1 -> playerFishEvent.getExpToDrop() -+ if (playerFishEvent.getExpToDrop() > 0) { -+ 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 - b0 = 1; - } - - if (this.as) { -+ // CraftBukkit start -+ PlayerFishEvent playerFishEvent = new PlayerFishEvent((Player) this.owner.getBukkitEntity(), null, (Fish) this.getBukkitEntity(), PlayerFishEvent.State.IN_GROUND); -+ this.world.getServer().getPluginManager().callEvent(playerFishEvent); -+ -+ if (playerFishEvent.isCancelled()) { -+ return 0; -+ } -+ // CraftBukkit end - b0 = 2; - } - -+ // CraftBukkit start -+ if (b0 == 0) { -+ PlayerFishEvent playerFishEvent = new PlayerFishEvent((Player) this.owner.getBukkitEntity(), null, (Fish) this.getBukkitEntity(), PlayerFishEvent.State.FAILED_ATTEMPT); -+ this.world.getServer().getPluginManager().callEvent(playerFishEvent); -+ if (playerFishEvent.isCancelled()) { -+ return 0; -+ } -+ } -+ // CraftBukkit end -+ - this.die(); - this.owner.hookedFish = null; - return b0; diff --git a/TacoSpigot-Server/nms-patches/EntityGhast.patch b/TacoSpigot-Server/nms-patches/EntityGhast.patch deleted file mode 100644 index 681d72e..0000000 --- a/TacoSpigot-Server/nms-patches/EntityGhast.patch +++ /dev/null @@ -1,13 +0,0 @@ ---- a/net/minecraft/server/EntityGhast.java -+++ b/net/minecraft/server/EntityGhast.java -@@ -162,7 +162,9 @@ - world.a((EntityHuman) null, 1008, new BlockPosition(this.b), 0); - EntityLargeFireball entitylargefireball = new EntityLargeFireball(world, this.b, d2, d3, d4); - -- entitylargefireball.yield = this.b.cf(); -+ -+ // CraftBukkit - set bukkitYield when setting explosionpower -+ entitylargefireball.bukkitYield = entitylargefireball.yield = this.b.cf(); - entitylargefireball.locX = this.b.locX + vec3d.a * d1; - entitylargefireball.locY = this.b.locY + (double) (this.b.length / 2.0F) + 0.5D; - entitylargefireball.locZ = this.b.locZ + vec3d.c * d1; diff --git a/TacoSpigot-Server/nms-patches/EntityHanging.patch b/TacoSpigot-Server/nms-patches/EntityHanging.patch deleted file mode 100644 index aee058d..0000000 --- a/TacoSpigot-Server/nms-patches/EntityHanging.patch +++ /dev/null @@ -1,182 +0,0 @@ ---- a/net/minecraft/server/EntityHanging.java -+++ b/net/minecraft/server/EntityHanging.java -@@ -4,6 +4,13 @@ - import java.util.List; - import org.apache.commons.lang3.Validate; - -+// CraftBukkit start -+import org.bukkit.entity.Hanging; -+import org.bukkit.entity.Painting; -+import org.bukkit.event.hanging.HangingBreakEvent; -+import org.bukkit.event.painting.PaintingBreakEvent; -+// CraftBukkit end -+ - public abstract class EntityHanging extends Entity { - - private int c; -@@ -30,30 +37,34 @@ - this.updateBoundingBox(); - } - -- private void updateBoundingBox() { -- if (this.direction != null) { -- double d0 = (double) this.blockPosition.getX() + 0.5D; -- double d1 = (double) this.blockPosition.getY() + 0.5D; -- double d2 = (double) this.blockPosition.getZ() + 0.5D; -+ /* CraftBukkit start - bounding box calculation made static (for spawn usage) -+ -+ l is from function l() -+ m is from function m() -+ -+ Placing here as it's more likely to be noticed as something which needs to be updated -+ then something in a CraftBukkit file. -+ */ -+ public static AxisAlignedBB calculateBoundingBox(BlockPosition blockPosition, EnumDirection direction, int width, int height) { -+ double d0 = (double) blockPosition.getX() + 0.5D; -+ double d1 = (double) blockPosition.getY() + 0.5D; -+ double d2 = (double) blockPosition.getZ() + 0.5D; - double d3 = 0.46875D; -- double d4 = this.a(this.l()); -- double d5 = this.a(this.m()); -+ double d4 = width % 32 == 0 ? 0.5D : 0.0D; -+ double d5 = height % 32 == 0 ? 0.5D : 0.0D; - -- d0 -= (double) this.direction.getAdjacentX() * 0.46875D; -- d2 -= (double) this.direction.getAdjacentZ() * 0.46875D; -+ d0 -= (double) direction.getAdjacentX() * 0.46875D; -+ d2 -= (double) direction.getAdjacentZ() * 0.46875D; - d1 += d5; -- EnumDirection enumdirection = this.direction.f(); -+ EnumDirection enumdirection = direction.f(); - - d0 += d4 * (double) enumdirection.getAdjacentX(); - d2 += d4 * (double) enumdirection.getAdjacentZ(); -- this.locX = d0; -- this.locY = d1; -- this.locZ = d2; -- double d6 = (double) this.l(); -- double d7 = (double) this.m(); -- double d8 = (double) this.l(); -+ double d6 = (double) width; -+ double d7 = (double) height; -+ double d8 = (double) width; - -- if (this.direction.k() == EnumDirection.EnumAxis.Z) { -+ if (direction.k() == EnumDirection.EnumAxis.Z) { - d8 = 1.0D; - } else { - d6 = 1.0D; -@@ -62,7 +73,18 @@ - d6 /= 32.0D; - d7 /= 32.0D; - d8 /= 32.0D; -- this.a(new AxisAlignedBB(d0 - d6, d1 - d7, d2 - d8, d0 + d6, d1 + d7, d2 + d8)); -+ return new AxisAlignedBB(d0 - d6, d1 - d7, d2 - d8, d0 + d6, d1 + d7, d2 + d8); -+ } -+ -+ private void updateBoundingBox() { -+ if (this.direction != null) { -+ // CraftBukkit start code moved in to calculateBoundingBox -+ AxisAlignedBB bb = calculateBoundingBox(this.blockPosition, this.direction, this.l(), this.m()); -+ this.locX = (bb.a + bb.d) / 2.0D; -+ this.locY = (bb.b + bb.e) / 2.0D; -+ this.locZ = (bb.c + bb.f) / 2.0D; -+ this.a(bb); -+ // CraftBukkit end - } - } - -@@ -77,6 +99,32 @@ - if (this.c++ == 100 && !this.world.isClientSide) { - this.c = 0; - if (!this.dead && !this.survives()) { -+ // CraftBukkit start - fire break events -+ Material material = this.world.getType(new BlockPosition(this)).getBlock().getMaterial(); -+ HangingBreakEvent.RemoveCause cause; -+ -+ if (!material.equals(Material.AIR)) { -+ // TODO: This feels insufficient to catch 100% of suffocation cases -+ cause = HangingBreakEvent.RemoveCause.OBSTRUCTION; -+ } else { -+ cause = HangingBreakEvent.RemoveCause.PHYSICS; -+ } -+ -+ HangingBreakEvent event = new HangingBreakEvent((Hanging) this.getBukkitEntity(), cause); -+ this.world.getServer().getPluginManager().callEvent(event); -+ -+ PaintingBreakEvent paintingEvent = null; -+ if (this instanceof EntityPainting) { -+ // Fire old painting event until it can be removed -+ paintingEvent = new PaintingBreakEvent((Painting) this.getBukkitEntity(), PaintingBreakEvent.RemoveCause.valueOf(cause.name())); -+ paintingEvent.setCancelled(event.isCancelled()); -+ this.world.getServer().getPluginManager().callEvent(paintingEvent); -+ } -+ -+ if (dead || event.isCancelled() || (paintingEvent != null && paintingEvent.isCancelled())) { -+ return; -+ } -+ // CraftBukkit end - this.die(); - this.b((Entity) null); - } -@@ -138,6 +186,32 @@ - return false; - } else { - if (!this.dead && !this.world.isClientSide) { -+ // CraftBukkit start - fire break events -+ HangingBreakEvent event = new HangingBreakEvent((Hanging) this.getBukkitEntity(), HangingBreakEvent.RemoveCause.DEFAULT); -+ PaintingBreakEvent paintingEvent = null; -+ if (damagesource.getEntity() != null) { -+ event = new org.bukkit.event.hanging.HangingBreakByEntityEvent((Hanging) this.getBukkitEntity(), damagesource.getEntity() == null ? null : damagesource.getEntity().getBukkitEntity()); -+ -+ if (this instanceof EntityPainting) { -+ // Fire old painting event until it can be removed -+ paintingEvent = new org.bukkit.event.painting.PaintingBreakByEntityEvent((Painting) this.getBukkitEntity(), damagesource.getEntity() == null ? null : damagesource.getEntity().getBukkitEntity()); -+ } -+ } else if (damagesource.isExplosion()) { -+ event = new HangingBreakEvent((Hanging) this.getBukkitEntity(), HangingBreakEvent.RemoveCause.EXPLOSION); -+ } -+ -+ this.world.getServer().getPluginManager().callEvent(event); -+ -+ if (paintingEvent != null) { -+ paintingEvent.setCancelled(event.isCancelled()); -+ this.world.getServer().getPluginManager().callEvent(paintingEvent); -+ } -+ -+ if (this.dead || event.isCancelled() || (paintingEvent != null && paintingEvent.isCancelled())) { -+ return true; -+ } -+ // CraftBukkit end -+ - this.die(); - this.ac(); - this.b(damagesource.getEntity()); -@@ -149,6 +223,18 @@ - - public void move(double d0, double d1, double d2) { - if (!this.world.isClientSide && !this.dead && d0 * d0 + d1 * d1 + d2 * d2 > 0.0D) { -+ if (this.dead) return; // CraftBukkit -+ -+ // CraftBukkit start - fire break events -+ // TODO - Does this need its own cause? Seems to only be triggered by pistons -+ HangingBreakEvent event = new HangingBreakEvent((Hanging) this.getBukkitEntity(), HangingBreakEvent.RemoveCause.PHYSICS); -+ this.world.getServer().getPluginManager().callEvent(event); -+ -+ if (this.dead || event.isCancelled()) { -+ return; -+ } -+ // CraftBukkit end -+ - this.die(); - this.b((Entity) null); - } -@@ -156,7 +242,7 @@ - } - - public void g(double d0, double d1, double d2) { -- if (!this.world.isClientSide && !this.dead && d0 * d0 + d1 * d1 + d2 * d2 > 0.0D) { -+ if (false && !this.world.isClientSide && !this.dead && d0 * d0 + d1 * d1 + d2 * d2 > 0.0D) { // CraftBukkit - not needed - this.die(); - this.b((Entity) null); - } diff --git a/TacoSpigot-Server/nms-patches/EntityHorse.patch b/TacoSpigot-Server/nms-patches/EntityHorse.patch deleted file mode 100644 index 06eece5..0000000 --- a/TacoSpigot-Server/nms-patches/EntityHorse.patch +++ /dev/null @@ -1,139 +0,0 @@ ---- a/net/minecraft/server/EntityHorse.java -+++ b/net/minecraft/server/EntityHorse.java -@@ -4,6 +4,8 @@ - import java.util.Iterator; - import java.util.List; - -+import org.bukkit.event.entity.EntityRegainHealthEvent.RegainReason; // CraftBukkit -+ - public class EntityHorse extends EntityAnimal implements IInventoryListener { - - private static final Predicate bs = new Predicate() { -@@ -44,6 +46,7 @@ - private String bO; - private String[] bP = new String[3]; - private boolean bQ = false; -+ public int maxDomestication = 100; // CraftBukkit - store max domestication value - - public EntityHorse(World world) { - super(world); -@@ -320,13 +323,13 @@ - private int cZ() { - int i = this.getType(); - -- return this.hasChest() && (i == 1 || i == 2) ? 17 : 2; -+ return this.hasChest() /* && (i == 1 || i == 2) */ ? 17 : 2; // CraftBukkit - Remove type check - } - - public void loadChest() { - InventoryHorseChest inventoryhorsechest = this.inventoryChest; - -- this.inventoryChest = new InventoryHorseChest("HorseChest", this.cZ()); -+ this.inventoryChest = new InventoryHorseChest("HorseChest", this.cZ(), this); // CraftBukkit - add this horse - this.inventoryChest.a(this.getName()); - if (inventoryhorsechest != null) { - inventoryhorsechest.b(this); -@@ -491,7 +494,7 @@ - } - - public int getMaxDomestication() { -- return 100; -+ return this.maxDomestication; // CraftBukkit - return stored max domestication instead of 100 - } - - protected float bB() { -@@ -591,7 +594,7 @@ - } - - if (this.getHealth() < this.getMaxHealth() && f > 0.0F) { -- this.heal(f); -+ this.heal(f, RegainReason.EATING); // CraftBukkit - flag = true; - } - -@@ -698,11 +701,24 @@ - - public void die(DamageSource damagesource) { - super.die(damagesource); -+ /* CraftBukkit start - Handle chest dropping in dropDeathLoot below - if (!this.world.isClientSide) { - this.dropChest(); - } -+ // CraftBukkit end */ -+ } - -+ // CraftBukkit start - Add method -+ @Override -+ protected void dropDeathLoot(boolean flag, int i) { -+ super.dropDeathLoot(flag, i); -+ -+ // Moved from die method above -+ if (!this.world.isClientSide) { -+ this.dropChest(); -+ } - } -+ // CraftBukkit end - - public void m() { - if (this.random.nextInt(200) == 0) { -@@ -712,7 +728,7 @@ - super.m(); - 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.cy() && this.passenger == null && this.random.nextInt(300) == 0 && this.world.getType(new BlockPosition(MathHelper.floor(this.locX), MathHelper.floor(this.locY) - 1, MathHelper.floor(this.locZ))).getBlock() == Blocks.GRASS) { -@@ -955,6 +971,7 @@ - nbttagcompound.setInt("Temper", this.getTemper()); - nbttagcompound.setBoolean("Tame", this.isTame()); - nbttagcompound.setString("OwnerUUID", this.getOwnerUUID()); -+ nbttagcompound.setInt("Bukkit.MaxDomestication", this.maxDomestication); // CraftBukkit - if (this.hasChest()) { - NBTTagList nbttaglist = new NBTTagList(); - -@@ -1007,6 +1024,12 @@ - this.setOwnerUUID(s); - } - -+ // CraftBukkit start -+ if (nbttagcompound.hasKey("Bukkit.MaxDomestication")) { -+ this.maxDomestication = nbttagcompound.getInt("Bukkit.MaxDomestication"); -+ } -+ // CraftBukkit end -+ - AttributeInstance attributeinstance = this.getAttributeMap().a("Speed"); - - if (attributeinstance != null) { -@@ -1172,18 +1195,25 @@ - - public void v(int i) { - if (this.cG()) { -+ // CraftBukkit start - fire HorseJumpEvent, use event power - if (i < 0) { - i = 0; -- } else { -- this.bG = true; -- this.dh(); - } - -+ float power; - if (i >= 90) { -- this.br = 1.0F; -+ power = 1.0F; - } else { -- this.br = 0.4F + 0.4F * (float) i / 90.0F; -+ power = 0.4F + 0.4F * (float) i / 90.0F; -+ } -+ -+ org.bukkit.event.entity.HorseJumpEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callHorseJumpEvent(this, power); -+ if (!event.isCancelled()) { -+ this.bG = true; -+ this.dh(); -+ this.br = power; - } -+ // CraftBukkit end - } - - } diff --git a/TacoSpigot-Server/nms-patches/EntityHuman.patch b/TacoSpigot-Server/nms-patches/EntityHuman.patch deleted file mode 100644 index fad8853..0000000 --- a/TacoSpigot-Server/nms-patches/EntityHuman.patch +++ /dev/null @@ -1,430 +0,0 @@ ---- a/net/minecraft/server/EntityHuman.java -+++ b/net/minecraft/server/EntityHuman.java -@@ -8,13 +8,27 @@ - import java.util.List; - import java.util.UUID; - -+// CraftBukkit start -+import org.bukkit.craftbukkit.entity.CraftHumanEntity; -+import org.bukkit.craftbukkit.entity.CraftItem; -+import org.bukkit.craftbukkit.inventory.CraftItemStack; -+import org.bukkit.entity.Player; -+import org.bukkit.event.entity.EntityCombustByEntityEvent; -+import org.bukkit.event.player.PlayerBedEnterEvent; -+import org.bukkit.event.player.PlayerBedLeaveEvent; -+import org.bukkit.event.player.PlayerDropItemEvent; -+import org.bukkit.event.player.PlayerItemConsumeEvent; -+import org.bukkit.event.player.PlayerVelocityEvent; -+import org.bukkit.util.Vector; -+// CraftBukkit end -+ - public abstract class EntityHuman extends EntityLiving { - - public PlayerInventory inventory = new PlayerInventory(this); - private InventoryEnderChest enderChest = new InventoryEnderChest(); - public Container defaultContainer; - public Container activeContainer; -- protected FoodMetaData foodData = new FoodMetaData(); -+ protected FoodMetaData foodData = new FoodMetaData(this); // CraftBukkit - add "this" to constructor - protected int bm; - public float bn; - public float bo; -@@ -47,6 +61,17 @@ - private boolean bI = false; - public EntityFishingHook hookedFish; - -+ // CraftBukkit start -+ public boolean fauxSleeping; -+ public String spawnWorld = ""; -+ public int oldLevel = -1; -+ -+ @Override -+ public CraftHumanEntity getBukkitEntity() { -+ return (CraftHumanEntity) super.getBukkitEntity(); -+ } -+ // CraftBukkit end -+ - public EntityHuman(World world, GameProfile gameprofile) { - super(world); - this.uniqueID = a(gameprofile); -@@ -265,6 +290,32 @@ - if (this.g != null) { - this.b(this.g, 16); - int i = this.g.count; -+ -+ // CraftBukkit start - fire PlayerItemConsumeEvent -+ org.bukkit.inventory.ItemStack craftItem = CraftItemStack.asBukkitCopy(this.g); -+ PlayerItemConsumeEvent event = new PlayerItemConsumeEvent((Player) this.getBukkitEntity(), craftItem); -+ world.getServer().getPluginManager().callEvent(event); -+ -+ if (event.isCancelled()) { -+ // Update client -+ if (this instanceof EntityPlayer) { -+ ((EntityPlayer) this).playerConnection.sendPacket(new PacketPlayOutSetSlot((byte) 0, activeContainer.getSlot((IInventory) this.inventory, this.inventory.itemInHandIndex).index, this.g)); -+ } -+ return; -+ } -+ -+ // Plugin modified the item, process it but don't remove it -+ if (!craftItem.equals(event.getItem())) { -+ CraftItemStack.asNMSCopy(event.getItem()).b(this.world, this); -+ -+ // Update client -+ if (this instanceof EntityPlayer) { -+ ((EntityPlayer) this).playerConnection.sendPacket(new PacketPlayOutSetSlot((byte) 0, activeContainer.getSlot((IInventory) this.inventory, this.inventory.itemInHandIndex).index, this.g)); -+ } -+ return; -+ } -+ // CraftBukkit end -+ - ItemStack itemstack = this.g.b(this.world, this); - - if (itemstack != this.g || itemstack != null && itemstack.count != i) { -@@ -324,7 +375,8 @@ - - if (this.world.getDifficulty() == EnumDifficulty.PEACEFUL && this.world.getGameRules().getBoolean("naturalRegeneration")) { - if (this.getHealth() < this.getMaxHealth() && this.ticksLived % 20 == 0) { -- this.heal(1.0F); -+ // CraftBukkit - added regain reason of "REGEN" for filtering purposes. -+ this.heal(1.0F, org.bukkit.event.entity.EntityRegainHealthEvent.RegainReason.REGEN); - } - - if (this.foodData.c() && this.ticksLived % 10 == 0) { -@@ -348,7 +400,7 @@ - - this.k((float) attributeinstance.getValue()); - float f = MathHelper.sqrt(this.motX * this.motX + this.motZ * this.motZ); -- float f1 = (float) (Math.atan(-this.motY * 0.20000000298023224D) * 15.0D); -+ float f1 = (float) ( org.bukkit.craftbukkit.TrigMath.atan(-this.motY * 0.20000000298023224D) * 15.0D); // CraftBukkit - - if (f > 0.1F) { - f = 0.1F; -@@ -438,11 +490,13 @@ - - public void b(Entity entity, int i) { - this.addScore(i); -- Collection collection = this.getScoreboard().getObjectivesForCriteria(IScoreboardCriteria.f); -+ // CraftBukkit - Get our scores instead -+ Collection collection = this.world.getServer().getScoreboardManager().getScoreboardScores(IScoreboardCriteria.f, this.getName(), new java.util.ArrayList()); - - if (entity instanceof EntityHuman) { - this.b(StatisticList.B); -- collection.addAll(this.getScoreboard().getObjectivesForCriteria(IScoreboardCriteria.e)); -+ // CraftBukkit - Get our scores instead -+ this.world.getServer().getScoreboardManager().getScoreboardScores(IScoreboardCriteria.e, this.getName(), collection); - collection.addAll(this.e(entity)); - } else { - this.b(StatisticList.z); -@@ -451,15 +505,14 @@ - Iterator iterator = collection.iterator(); - - while (iterator.hasNext()) { -- ScoreboardObjective scoreboardobjective = (ScoreboardObjective) iterator.next(); -- ScoreboardScore scoreboardscore = this.getScoreboard().getPlayerScoreForObjective(this.getName(), scoreboardobjective); -+ ScoreboardScore scoreboardscore = (ScoreboardScore) iterator.next(); // CraftBukkit - Use our scores instead - - scoreboardscore.incrementScore(); - } - - } - -- private Collection e(Entity entity) { -+ private Collection e(Entity entity) { // CraftBukkit - TODO: Check me? - ScoreboardTeam scoreboardteam = this.getScoreboard().getPlayerTeam(this.getName()); - - if (scoreboardteam != null) { -@@ -491,6 +544,7 @@ - } - - public EntityItem a(boolean flag) { -+ // Called only when dropped by Q or CTRL-Q - return this.a(this.inventory.splitStack(this.inventory.itemInHandIndex, flag && this.inventory.getItemInHand() != null ? this.inventory.getItemInHand().count : 1), false, true); - } - -@@ -533,6 +587,30 @@ - entityitem.motZ += Math.sin((double) f1) * (double) f; - } - -+ // CraftBukkit start - fire PlayerDropItemEvent -+ Player player = (Player) this.getBukkitEntity(); -+ CraftItem drop = new CraftItem(this.world.getServer(), entityitem); -+ -+ PlayerDropItemEvent event = new PlayerDropItemEvent(player, drop); -+ this.world.getServer().getPluginManager().callEvent(event); -+ -+ if (event.isCancelled()) { -+ org.bukkit.inventory.ItemStack cur = player.getInventory().getItemInHand(); -+ if (flag1 && (cur == null || cur.getAmount() == 0)) { -+ // The complete stack was dropped -+ player.getInventory().setItemInHand(drop.getItemStack()); -+ } else if (flag1 && cur.isSimilar(drop.getItemStack()) && drop.getItemStack().getAmount() == 1) { -+ // Only one item is dropped -+ cur.setAmount(cur.getAmount() + 1); -+ player.getInventory().setItemInHand(cur); -+ } else { -+ // Fallback -+ player.getInventory().addItem(drop.getItemStack()); -+ } -+ return null; -+ } -+ // CraftBukkit end -+ - this.a(entityitem); - if (flag1) { - this.b(StatisticList.v); -@@ -624,6 +702,13 @@ - this.a(true, true, false); - } - -+ // CraftBukkit start -+ this.spawnWorld = nbttagcompound.getString("SpawnWorld"); -+ if ("".equals(spawnWorld)) { -+ this.spawnWorld = this.world.getServer().getWorlds().get(0).getName(); -+ } -+ // CraftBukkit end -+ - if (nbttagcompound.hasKeyOfType("SpawnX", 99) && nbttagcompound.hasKeyOfType("SpawnY", 99) && nbttagcompound.hasKeyOfType("SpawnZ", 99)) { - this.c = new BlockPosition(nbttagcompound.getInt("SpawnX"), nbttagcompound.getInt("SpawnY"), nbttagcompound.getInt("SpawnZ")); - this.d = nbttagcompound.getBoolean("SpawnForced"); -@@ -665,6 +750,7 @@ - if (itemstack != null && itemstack.getItem() != null) { - nbttagcompound.set("SelectedItem", itemstack.save(new NBTTagCompound())); - } -+ nbttagcompound.setString("SpawnWorld", spawnWorld); // CraftBukkit - fixes bed spawns for multiworld worlds - - } - -@@ -684,7 +770,7 @@ - - if (damagesource.r()) { - if (this.world.getDifficulty() == EnumDifficulty.PEACEFUL) { -- f = 0.0F; -+ return false; // CraftBukkit - f = 0.0f -> return false - } - - if (this.world.getDifficulty() == EnumDifficulty.EASY) { -@@ -696,7 +782,7 @@ - } - } - -- if (f == 0.0F) { -+ if (false && f == 0.0F) { // CraftBukkit - Don't filter out 0 damage - return false; - } else { - Entity entity = damagesource.getEntity(); -@@ -712,10 +798,29 @@ - } - - public boolean a(EntityHuman entityhuman) { -- ScoreboardTeamBase scoreboardteambase = this.getScoreboardTeam(); -- ScoreboardTeamBase scoreboardteambase1 = entityhuman.getScoreboardTeam(); -+ // CraftBukkit start - Change to check OTHER player's scoreboard team according to API -+ // To summarize this method's logic, it's "Can parameter hurt this" -+ org.bukkit.scoreboard.Team team; -+ if (entityhuman instanceof EntityPlayer) { -+ EntityPlayer thatPlayer = (EntityPlayer) entityhuman; -+ team = thatPlayer.getBukkitEntity().getScoreboard().getPlayerTeam(thatPlayer.getBukkitEntity()); -+ if (team == null || team.allowFriendlyFire()) { -+ return true; -+ } -+ } else { -+ // This should never be called, but is implemented anyway -+ org.bukkit.OfflinePlayer thisPlayer = entityhuman.world.getServer().getOfflinePlayer(entityhuman.getName()); -+ team = entityhuman.world.getServer().getScoreboardManager().getMainScoreboard().getPlayerTeam(thisPlayer); -+ if (team == null || team.allowFriendlyFire()) { -+ return true; -+ } -+ } - -- return scoreboardteambase == null ? true : (!scoreboardteambase.isAlly(scoreboardteambase1) ? true : scoreboardteambase.allowFriendlyFire()); -+ if (this instanceof EntityPlayer) { -+ return !team.hasPlayer(((EntityPlayer) this).getBukkitEntity()); -+ } -+ return !team.hasPlayer(this.world.getServer().getOfflinePlayer(this.getName())); -+ // CraftBukkit end - } - - protected void damageArmor(float f) { -@@ -742,7 +847,12 @@ - return (float) i / (float) this.inventory.armor.length; - } - -- protected void d(DamageSource damagesource, float f) { -+ // CraftBukkit start -+ protected boolean d(DamageSource damagesource, float f) { // void -> boolean -+ if (true) { -+ return super.d(damagesource, f); -+ } -+ // CraftBukkit end - if (!this.isInvulnerable(damagesource)) { - if (!damagesource.ignoresArmor() && this.isBlocking() && f > 0.0F) { - f = (1.0F + f) * 0.5F; -@@ -766,6 +876,7 @@ - - } - } -+ return false; // CraftBukkit - } - - public void openSign(TileEntitySign tileentitysign) {} -@@ -800,7 +911,8 @@ - } - - if (itemstack.a(this, (EntityLiving) entity)) { -- if (itemstack.count <= 0 && !this.abilities.canInstantlyBuild) { -+ // CraftBukkit - bypass infinite items; <= 0 -> == 0 -+ if (itemstack.count == 0 && !this.abilities.canInstantlyBuild) { - this.ca(); - } - -@@ -866,8 +978,15 @@ - int j = EnchantmentManager.getFireAspectEnchantmentLevel(this); - - if (entity instanceof EntityLiving && j > 0 && !entity.isBurning()) { -- flag1 = true; -- entity.setOnFire(1); -+ // CraftBukkit start - Call a combust event when somebody hits with a fire enchanted item -+ EntityCombustByEntityEvent combustEvent = new EntityCombustByEntityEvent(this.getBukkitEntity(), entity.getBukkitEntity(), 1); -+ org.bukkit.Bukkit.getPluginManager().callEvent(combustEvent); -+ -+ if (!combustEvent.isCancelled()) { -+ flag1 = true; -+ entity.setOnFire(combustEvent.getDuration()); -+ } -+ // CraftBukkit end - } - - double d0 = entity.motX; -@@ -884,11 +1003,28 @@ - } - - if (entity instanceof EntityPlayer && entity.velocityChanged) { -- ((EntityPlayer) entity).playerConnection.sendPacket(new PacketPlayOutEntityVelocity(entity)); -- entity.velocityChanged = false; -- entity.motX = d0; -- entity.motY = d1; -- entity.motZ = d2; -+ // CraftBukkit start - Add Velocity Event -+ boolean cancelled = false; -+ Player player = (Player) entity.getBukkitEntity(); -+ org.bukkit.util.Vector velocity = new Vector( d0, d1, d2 ); -+ -+ PlayerVelocityEvent event = new PlayerVelocityEvent(player, velocity.clone()); -+ world.getServer().getPluginManager().callEvent(event); -+ -+ if (event.isCancelled()) { -+ cancelled = true; -+ } else if (!velocity.equals(event.getVelocity())) { -+ player.setVelocity(event.getVelocity()); -+ } -+ -+ if (!cancelled) { -+ ( (EntityPlayer) entity ).playerConnection.sendPacket( new PacketPlayOutEntityVelocity( entity ) ); -+ entity.velocityChanged = false; -+ entity.motX = d0; -+ entity.motY = d1; -+ entity.motZ = d2; -+ } -+ // CraftBukkit end - } - - if (flag) { -@@ -922,7 +1058,8 @@ - - if (itemstack != null && object instanceof EntityLiving) { - itemstack.a((EntityLiving) object, this); -- if (itemstack.count <= 0) { -+ // CraftBukkit - bypass infinite items; <= 0 -> == 0 -+ if (itemstack.count == 0) { - this.ca(); - } - } -@@ -930,7 +1067,14 @@ - if (entity instanceof EntityLiving) { - this.a(StatisticList.w, Math.round(f * 10.0F)); - if (j > 0) { -- entity.setOnFire(j * 4); -+ // CraftBukkit start - Call a combust event when somebody hits with a fire enchanted item -+ EntityCombustByEntityEvent combustEvent = new EntityCombustByEntityEvent(this.getBukkitEntity(), entity.getBukkitEntity(), j * 4); -+ org.bukkit.Bukkit.getPluginManager().callEvent(combustEvent); -+ -+ if (!combustEvent.isCancelled()) { -+ entity.setOnFire(combustEvent.getDuration()); -+ } -+ // CraftBukkit end - } - } - -@@ -996,6 +1140,20 @@ - this.mount((Entity) null); - } - -+ // CraftBukkit start - fire PlayerBedEnterEvent -+ if (this.getBukkitEntity() instanceof Player) { -+ Player player = (Player) this.getBukkitEntity(); -+ org.bukkit.block.Block bed = this.world.getWorld().getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ()); -+ -+ PlayerBedEnterEvent event = new PlayerBedEnterEvent(player, bed); -+ this.world.getServer().getPluginManager().callEvent(event); -+ -+ if (event.isCancelled()) { -+ return EnumBedResult.OTHER_PROBLEM; -+ } -+ } -+ // CraftBukkit end -+ - this.setSize(0.2F, 0.2F); - if (this.world.isLoaded(blockposition)) { - EnumDirection enumdirection = (EnumDirection) this.world.getType(blockposition).get(BlockDirectional.FACING); -@@ -1078,6 +1236,23 @@ - this.world.everyoneSleeping(); - } - -+ // CraftBukkit start - fire PlayerBedLeaveEvent -+ if (this.getBukkitEntity() instanceof Player) { -+ Player player = (Player) this.getBukkitEntity(); -+ -+ org.bukkit.block.Block bed; -+ BlockPosition blockposition = this.bx; -+ if (blockposition != null) { -+ bed = this.world.getWorld().getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ()); -+ } else { -+ bed = this.world.getWorld().getBlockAt(player.getLocation()); -+ } -+ -+ PlayerBedLeaveEvent event = new PlayerBedLeaveEvent(player, bed); -+ this.world.getServer().getPluginManager().callEvent(event); -+ } -+ // CraftBukkit end -+ - this.sleepTicks = flag ? 0 : 100; - if (flag2) { - this.setRespawnPosition(this.bx, false); -@@ -1090,6 +1265,7 @@ - } - - public static BlockPosition getBed(World world, BlockPosition blockposition, boolean flag) { -+ ((ChunkProviderServer) world.chunkProvider).getChunkAt(blockposition.getX() >> 4, blockposition.getZ() >> 4); // CraftBukkit - Block block = world.getType(blockposition).getBlock(); - - if (block != Blocks.BED) { -@@ -1128,9 +1304,11 @@ - if (blockposition != null) { - this.c = blockposition; - this.d = flag; -+ this.spawnWorld = this.world.worldData.getName(); // CraftBukkit - } else { - this.c = null; - this.d = false; -+ this.spawnWorld = ""; // CraftBukkit - } - - } -@@ -1480,6 +1658,7 @@ - } - - public IChatBaseComponent getScoreboardDisplayName() { -+ // CraftBukkit - todo: fun - ChatComponentText chatcomponenttext = new ChatComponentText(ScoreboardTeam.getPlayerDisplayName(this.getScoreboardTeam(), this.getName())); - - chatcomponenttext.getChatModifier().setChatClickable(new ChatClickable(ChatClickable.EnumClickAction.SUGGEST_COMMAND, "/msg " + this.getName() + " ")); diff --git a/TacoSpigot-Server/nms-patches/EntityInsentient.patch b/TacoSpigot-Server/nms-patches/EntityInsentient.patch deleted file mode 100644 index 955ebec..0000000 --- a/TacoSpigot-Server/nms-patches/EntityInsentient.patch +++ /dev/null @@ -1,183 +0,0 @@ ---- a/net/minecraft/server/EntityInsentient.java -+++ b/net/minecraft/server/EntityInsentient.java -@@ -4,6 +4,15 @@ - import java.util.List; - import java.util.UUID; - -+// CraftBukkit start -+import org.bukkit.craftbukkit.event.CraftEventFactory; -+import org.bukkit.craftbukkit.entity.CraftLivingEntity; -+import org.bukkit.event.entity.EntityTargetLivingEntityEvent; -+import org.bukkit.event.entity.EntityTargetEvent; -+import org.bukkit.event.entity.EntityUnleashEvent; -+import org.bukkit.event.entity.EntityUnleashEvent.UnleashReason; -+// CraftBukkit end -+ - public abstract class EntityInsentient extends EntityLiving { - - public int a_; -@@ -40,6 +49,9 @@ - this.dropChances[i] = 0.085F; - } - -+ // CraftBukkit start - default persistance to type's persistance value -+ this.persistent = !isTypeNotPersistent(); -+ // CraftBukkit end - } - - protected void initAttributes() { -@@ -76,7 +88,37 @@ - } - - public void setGoalTarget(EntityLiving entityliving) { -+ // CraftBukkit start - fire event -+ setGoalTarget(entityliving, EntityTargetEvent.TargetReason.UNKNOWN, true); -+ } -+ -+ public void setGoalTarget(EntityLiving entityliving, EntityTargetEvent.TargetReason reason, boolean fireEvent) { -+ if (getGoalTarget() == entityliving) return; -+ if (fireEvent) { -+ if (reason == EntityTargetEvent.TargetReason.UNKNOWN && getGoalTarget() != null && entityliving == null) { -+ reason = getGoalTarget().isAlive() ? EntityTargetEvent.TargetReason.FORGOT_TARGET : EntityTargetEvent.TargetReason.TARGET_DIED; -+ } -+ if (reason == EntityTargetEvent.TargetReason.UNKNOWN) { -+ world.getServer().getLogger().log(java.util.logging.Level.WARNING, "Unknown target reason, please report on the issue tracker", new Exception()); -+ } -+ CraftLivingEntity ctarget = null; -+ if (entityliving != null) { -+ ctarget = (CraftLivingEntity) entityliving.getBukkitEntity(); -+ } -+ EntityTargetLivingEntityEvent event = new EntityTargetLivingEntityEvent(this.getBukkitEntity(), ctarget, reason); -+ world.getServer().getPluginManager().callEvent(event); -+ if (event.isCancelled()) { -+ return; -+ } -+ -+ if (event.getTarget() != null) { -+ entityliving = ((CraftLivingEntity) event.getTarget()).getHandle(); -+ } else { -+ entityliving = null; -+ } -+ } - this.goalTarget = entityliving; -+ // CraftBukkit end - } - - public boolean a(Class oclass) { -@@ -168,6 +210,7 @@ - return null; - } - -+ protected ItemStack headDrop = null; // CraftBukkit - protected void dropDeathLoot(boolean flag, int i) { - Item item = this.getLoot(); - -@@ -183,6 +226,12 @@ - } - } - -+ // CraftBukkit start -+ if (headDrop != null) { -+ this.a(headDrop, 0.0F); -+ headDrop = null; -+ } -+ // CraftBukkit end - } - - public void b(NBTTagCompound nbttagcompound) { -@@ -235,11 +284,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.j(nbttagcompound.getBoolean("CanPickUpLoot")); -+ boolean data = nbttagcompound.getBoolean("CanPickUpLoot"); -+ if (isLevelAtLeast(nbttagcompound, 1) || data) { -+ this.j(data); -+ } - } - -- this.persistent = nbttagcompound.getBoolean("PersistenceRequired"); -+ boolean data = nbttagcompound.getBoolean("PersistenceRequired"); -+ if (isLevelAtLeast(nbttagcompound, 1) || data) { -+ this.persistent = data; -+ } -+ // CraftBukkit end - NBTTagList nbttaglist; - int i; - -@@ -380,11 +438,11 @@ - double d2 = entityhuman.locZ - this.locZ; - double d3 = d0 * d0 + d1 * d1 + d2 * d2; - -- if (this.isTypeNotPersistent() && d3 > 16384.0D) { -+ if (d3 > 16384.0D) { // CraftBukkit - remove isTypeNotPersistent() check - this.die(); - } - -- if (this.ticksFarFromPlayer > 600 && this.random.nextInt(800) == 0 && d3 > 1024.0D && this.isTypeNotPersistent()) { -+ if (this.ticksFarFromPlayer > 600 && this.random.nextInt(800) == 0 && d3 > 1024.0D) { // CraftBukkit - remove isTypeNotPersistent() check - this.die(); - } else if (d3 < 1024.0D) { - this.ticksFarFromPlayer = 0; -@@ -707,6 +765,12 @@ - - public final boolean e(EntityHuman entityhuman) { - if (this.cc() && this.getLeashHolder() == entityhuman) { -+ // CraftBukkit start - fire PlayerUnleashEntityEvent -+ if (CraftEventFactory.callPlayerUnleashEntityEvent(this, entityhuman).isCancelled()) { -+ ((EntityPlayer) entityhuman).playerConnection.sendPacket(new PacketPlayOutAttachEntity(1, this, this.getLeashHolder())); -+ return false; -+ } -+ // CraftBukkit end - this.unleash(true, !entityhuman.abilities.canInstantlyBuild); - return true; - } else { -@@ -714,12 +778,24 @@ - - if (itemstack != null && itemstack.getItem() == Items.LEAD && this.cb()) { - if (!(this instanceof EntityTameableAnimal) || !((EntityTameableAnimal) this).isTamed()) { -+ // CraftBukkit start - fire PlayerLeashEntityEvent -+ if (CraftEventFactory.callPlayerLeashEntityEvent(this, entityhuman, entityhuman).isCancelled()) { -+ ((EntityPlayer) entityhuman).playerConnection.sendPacket(new PacketPlayOutAttachEntity(1, this, this.getLeashHolder())); -+ return false; -+ } -+ // CraftBukkit end - this.setLeashHolder(entityhuman, true); - --itemstack.count; - return true; - } - - if (((EntityTameableAnimal) this).e((EntityLiving) entityhuman)) { -+ // CraftBukkit start - fire PlayerLeashEntityEvent -+ if (CraftEventFactory.callPlayerLeashEntityEvent(this, entityhuman, entityhuman).isCancelled()) { -+ ((EntityPlayer) entityhuman).playerConnection.sendPacket(new PacketPlayOutAttachEntity(1, this, this.getLeashHolder())); -+ return false; -+ } -+ // CraftBukkit end - this.setLeashHolder(entityhuman, true); - --itemstack.count; - return true; -@@ -741,10 +817,12 @@ - - if (this.bo) { - if (!this.isAlive()) { -+ this.world.getServer().getPluginManager().callEvent(new EntityUnleashEvent(this.getBukkitEntity(), UnleashReason.PLAYER_UNLEASH)); // CraftBukkit - this.unleash(true, true); - } - - if (this.bp == null || this.bp.dead) { -+ this.world.getServer().getPluginManager().callEvent(new EntityUnleashEvent(this.getBukkitEntity(), UnleashReason.HOLDER_GONE)); // CraftBukkit - this.unleash(true, true); - } - } -@@ -811,6 +889,7 @@ - - this.bp = entityleash; - } else { -+ this.world.getServer().getPluginManager().callEvent(new EntityUnleashEvent(this.getBukkitEntity(), UnleashReason.UNKNOWN)); // CraftBukkit - this.unleash(false, true); - } - } diff --git a/TacoSpigot-Server/nms-patches/EntityIronGolem.patch b/TacoSpigot-Server/nms-patches/EntityIronGolem.patch deleted file mode 100644 index f05036e..0000000 --- a/TacoSpigot-Server/nms-patches/EntityIronGolem.patch +++ /dev/null @@ -1,20 +0,0 @@ ---- a/net/minecraft/server/EntityIronGolem.java -+++ b/net/minecraft/server/EntityIronGolem.java -@@ -59,7 +59,7 @@ - - protected void s(Entity entity) { - if (entity instanceof IMonster && !(entity instanceof EntityCreeper) && this.bc().nextInt(20) == 0) { -- this.setGoalTarget((EntityLiving) entity); -+ this.setGoalTarget((EntityLiving) entity, org.bukkit.event.entity.EntityTargetLivingEntityEvent.TargetReason.COLLISION, true); // CraftBukkit - set reason - } - - super.s(entity); -@@ -220,7 +220,7 @@ - } - - public boolean apply(Object object) { -- return this.a((EntityLiving) object); -+ return this.a((T) object); // CraftBukkit - fix decompiler error - } - }; - } diff --git a/TacoSpigot-Server/nms-patches/EntityItem.patch b/TacoSpigot-Server/nms-patches/EntityItem.patch deleted file mode 100644 index dc98445..0000000 --- a/TacoSpigot-Server/nms-patches/EntityItem.patch +++ /dev/null @@ -1,135 +0,0 @@ ---- a/net/minecraft/server/EntityItem.java -+++ b/net/minecraft/server/EntityItem.java -@@ -3,6 +3,7 @@ - import java.util.Iterator; - import org.apache.logging.log4j.LogManager; - import org.apache.logging.log4j.Logger; -+import org.bukkit.event.player.PlayerPickupItemEvent; // CraftBukkit - - public class EntityItem extends Entity { - -@@ -13,6 +14,7 @@ - private String f; - private String g; - public float a; -+ private int lastTick = MinecraftServer.currentTick; // CraftBukkit - - public EntityItem(World world, double d0, double d1, double d2) { - super(world); -@@ -28,6 +30,11 @@ - - public EntityItem(World world, double d0, double d1, double d2, ItemStack itemstack) { - this(world, d0, d1, d2); -+ // CraftBukkit start - Can't set null items in the datawatcher -+ if (itemstack == null || itemstack.getItem() == null) { -+ return; -+ } -+ // CraftBukkit end - this.setItemStack(itemstack); - } - -@@ -52,9 +59,12 @@ - this.die(); - } else { - super.t_(); -- if (this.pickupDelay > 0 && this.pickupDelay != 32767) { -- --this.pickupDelay; -- } -+ // CraftBukkit start - Use wall time for pickup and despawn timers -+ int elapsedTicks = MinecraftServer.currentTick - this.lastTick; -+ if (this.pickupDelay != 32767) this.pickupDelay -= elapsedTicks; -+ if (this.age != -32768) this.age += elapsedTicks; -+ this.lastTick = MinecraftServer.currentTick; -+ // CraftBukkit end - - this.lastX = this.locX; - this.lastY = this.locY; -@@ -90,12 +100,21 @@ - this.motY *= -0.5D; - } - -+ /* Craftbukkit start - moved up - if (this.age != -32768) { - ++this.age; - } -+ // Craftbukkit end */ -+ - - this.W(); - if (!this.world.isClientSide && this.age >= 6000) { -+ // CraftBukkit start - fire ItemDespawnEvent -+ if (org.bukkit.craftbukkit.event.CraftEventFactory.callItemDespawnEvent(this).isCancelled()) { -+ this.age = 0; -+ return; -+ } -+ // CraftBukkit end - this.die(); - } - -@@ -137,6 +156,7 @@ - } else if (itemstack1.count + itemstack.count > itemstack1.getMaxStackSize()) { - return false; - } else { -+ if (org.bukkit.craftbukkit.event.CraftEventFactory.callItemMergeEvent(this, entityitem).isCancelled()) return false; // CraftBukkit - itemstack1.count += itemstack.count; - entityitem.pickupDelay = Math.max(entityitem.pickupDelay, this.pickupDelay); - entityitem.age = Math.min(entityitem.age, this.age); -@@ -183,6 +203,11 @@ - } else if (this.getItemStack() != null && this.getItemStack().getItem() == Items.NETHER_STAR && damagesource.isExplosion()) { - return false; - } else { -+ // CraftBukkit start -+ if (org.bukkit.craftbukkit.event.CraftEventFactory.handleNonLivingEntityDamageEvent(this, damagesource, f)) { -+ return false; -+ } -+ // CraftBukkit end - this.ac(); - this.e = (int) ((float) this.e - f); - if (this.e <= 0) { -@@ -228,7 +253,18 @@ - - NBTTagCompound nbttagcompound1 = nbttagcompound.getCompound("Item"); - -- this.setItemStack(ItemStack.createStack(nbttagcompound1)); -+ // CraftBukkit start - Handle missing "Item" compounds -+ if (nbttagcompound1 != null) { -+ ItemStack itemstack = ItemStack.createStack(nbttagcompound1); -+ if (itemstack != null) { -+ this.setItemStack(itemstack); -+ } else { -+ this.die(); -+ } -+ } else { -+ this.die(); -+ } -+ // CraftBukkit end - if (this.getItemStack() == null) { - this.die(); - } -@@ -240,6 +276,26 @@ - ItemStack itemstack = this.getItemStack(); - int i = itemstack.count; - -+ // CraftBukkit start - fire PlayerPickupItemEvent -+ int canHold = entityhuman.inventory.canHold(itemstack); -+ int remaining = itemstack.count - canHold; -+ -+ if (this.pickupDelay <= 0 && canHold > 0) { -+ itemstack.count = canHold; -+ PlayerPickupItemEvent event = new PlayerPickupItemEvent((org.bukkit.entity.Player) entityhuman.getBukkitEntity(), (org.bukkit.entity.Item) this.getBukkitEntity(), remaining); -+ // event.setCancelled(!entityhuman.canPickUpLoot); TODO -+ this.world.getServer().getPluginManager().callEvent(event); -+ itemstack.count = canHold + remaining; -+ -+ if (event.isCancelled()) { -+ return; -+ } -+ -+ // Possibly < 0; fix here so we do not have to modify code below -+ this.pickupDelay = 0; -+ } -+ // CraftBukkit end -+ - if (this.pickupDelay == 0 && (this.g == null || 6000 - this.age <= 200 || this.g.equals(entityhuman.getName())) && entityhuman.inventory.pickup(itemstack)) { - if (itemstack.getItem() == Item.getItemOf(Blocks.LOG)) { - entityhuman.b((Statistic) AchievementList.g); diff --git a/TacoSpigot-Server/nms-patches/EntityItemFrame.patch b/TacoSpigot-Server/nms-patches/EntityItemFrame.patch deleted file mode 100644 index 1859a97..0000000 --- a/TacoSpigot-Server/nms-patches/EntityItemFrame.patch +++ /dev/null @@ -1,14 +0,0 @@ ---- a/net/minecraft/server/EntityItemFrame.java -+++ b/net/minecraft/server/EntityItemFrame.java -@@ -27,6 +27,11 @@ - return false; - } else if (!damagesource.isExplosion() && this.getItem() != null) { - if (!this.world.isClientSide) { -+ // CraftBukkit start - fire EntityDamageEvent -+ if (org.bukkit.craftbukkit.event.CraftEventFactory.handleNonLivingEntityDamageEvent(this, damagesource, f, false) || this.dead) { -+ return true; -+ } -+ // CraftBukkit end - this.a(damagesource.getEntity(), false); - this.setItem((ItemStack) null); - } diff --git a/TacoSpigot-Server/nms-patches/EntityLargeFireball.patch b/TacoSpigot-Server/nms-patches/EntityLargeFireball.patch deleted file mode 100644 index 09d2680..0000000 --- a/TacoSpigot-Server/nms-patches/EntityLargeFireball.patch +++ /dev/null @@ -1,37 +0,0 @@ ---- a/net/minecraft/server/EntityLargeFireball.java -+++ b/net/minecraft/server/EntityLargeFireball.java -@@ -1,5 +1,7 @@ - package net.minecraft.server; - -+import org.bukkit.event.entity.ExplosionPrimeEvent; // CraftBukkit -+ - public class EntityLargeFireball extends EntityFireball { - - public int yield = 1; -@@ -21,7 +23,15 @@ - - boolean flag = this.world.getGameRules().getBoolean("mobGriefing"); - -- this.world.createExplosion((Entity) null, this.locX, this.locY, this.locZ, (float) this.yield, flag, flag); -+ // CraftBukkit start - fire ExplosionPrimeEvent -+ ExplosionPrimeEvent event = new ExplosionPrimeEvent((org.bukkit.entity.Explosive) org.bukkit.craftbukkit.entity.CraftEntity.getEntity(this.world.getServer(), this)); -+ this.world.getServer().getPluginManager().callEvent(event); -+ -+ if (!event.isCancelled()) { -+ // give 'this' instead of (Entity) null so we know what causes the damage -+ this.world.createExplosion(this, this.locX, this.locY, this.locZ, event.getRadius(), event.getFire(), flag); -+ } -+ // CraftBukkit end - this.die(); - } - -@@ -35,7 +45,8 @@ - public void a(NBTTagCompound nbttagcompound) { - super.a(nbttagcompound); - if (nbttagcompound.hasKeyOfType("ExplosionPower", 99)) { -- this.yield = nbttagcompound.getInt("ExplosionPower"); -+ // CraftBukkit - set bukkitYield when setting explosionpower -+ bukkitYield = this.yield = nbttagcompound.getInt("ExplosionPower"); - } - - } diff --git a/TacoSpigot-Server/nms-patches/EntityLeash.patch b/TacoSpigot-Server/nms-patches/EntityLeash.patch deleted file mode 100644 index 0496ad2..0000000 --- a/TacoSpigot-Server/nms-patches/EntityLeash.patch +++ /dev/null @@ -1,61 +0,0 @@ ---- a/net/minecraft/server/EntityLeash.java -+++ b/net/minecraft/server/EntityLeash.java -@@ -3,6 +3,8 @@ - import java.util.Iterator; - import java.util.List; - -+import org.bukkit.craftbukkit.event.CraftEventFactory; // CraftBukkit -+ - public class EntityLeash extends EntityHanging { - - public EntityLeash(World world) { -@@ -63,6 +65,12 @@ - while (iterator.hasNext()) { - entityinsentient = (EntityInsentient) iterator.next(); - if (entityinsentient.cc() && entityinsentient.getLeashHolder() == entityhuman) { -+ // CraftBukkit start -+ if (CraftEventFactory.callPlayerLeashEntityEvent(entityinsentient, this, entityhuman).isCancelled()) { -+ ((EntityPlayer) entityhuman).playerConnection.sendPacket(new PacketPlayOutAttachEntity(1, entityinsentient, entityinsentient.getLeashHolder())); -+ continue; -+ } -+ // CraftBukkit end - entityinsentient.setLeashHolder(this, true); - flag = true; - } -@@ -70,8 +78,11 @@ - } - - if (!this.world.isClientSide && !flag) { -- this.die(); -- if (entityhuman.abilities.canInstantlyBuild) { -+ // CraftBukkit start - Move below -+ // this.die(); -+ boolean die = true; -+ // CraftBukkit end -+ if (true || entityhuman.abilities.canInstantlyBuild) { // CraftBukkit - Process for non-creative as well - d0 = 7.0D; - list = this.world.a(EntityInsentient.class, new AxisAlignedBB(this.locX - d0, this.locY - d0, this.locZ - d0, this.locX + d0, this.locY + d0, this.locZ + d0)); - iterator = list.iterator(); -@@ -79,10 +90,21 @@ - while (iterator.hasNext()) { - entityinsentient = (EntityInsentient) iterator.next(); - if (entityinsentient.cc() && entityinsentient.getLeashHolder() == this) { -- entityinsentient.unleash(true, false); -+ // CraftBukkit start -+ if (CraftEventFactory.callPlayerUnleashEntityEvent(entityinsentient, entityhuman).isCancelled()) { -+ die = false; -+ continue; -+ } -+ entityinsentient.unleash(true, !entityhuman.abilities.canInstantlyBuild); // false -> survival mode boolean -+ // CraftBukkit end - } - } - } -+ // CraftBukkit start -+ if (die) { -+ this.die(); -+ } -+ // CraftBukkit end - } - - return true; diff --git a/TacoSpigot-Server/nms-patches/EntityLightning.patch b/TacoSpigot-Server/nms-patches/EntityLightning.patch deleted file mode 100644 index 61a2854..0000000 --- a/TacoSpigot-Server/nms-patches/EntityLightning.patch +++ /dev/null @@ -1,106 +0,0 @@ ---- a/net/minecraft/server/EntityLightning.java -+++ b/net/minecraft/server/EntityLightning.java -@@ -2,30 +2,53 @@ - - import java.util.List; - -+import org.bukkit.craftbukkit.event.CraftEventFactory; // CraftBukkit -+ - public class EntityLightning extends EntityWeather { - - private int lifeTicks; - public long a; - private int c; - -+ // CraftBukkit start -+ public boolean isEffect = false; -+ - public EntityLightning(World world, double d0, double d1, double d2) { -+ this(world, d0, d1, d2, false); -+ } -+ -+ public EntityLightning(World world, double d0, double d1, double d2, boolean isEffect) { -+ // CraftBukkit end - super(world); -+ -+ // CraftBukkit - Set isEffect -+ this.isEffect = isEffect; -+ - this.setPositionRotation(d0, d1, d2, 0.0F, 0.0F); - this.lifeTicks = 2; - this.a = this.random.nextLong(); - this.c = this.random.nextInt(3) + 1; - BlockPosition blockposition = new BlockPosition(this); - -- if (!world.isClientSide && world.getGameRules().getBoolean("doFireTick") && (world.getDifficulty() == EnumDifficulty.NORMAL || world.getDifficulty() == EnumDifficulty.HARD) && world.areChunksLoaded(blockposition, 10)) { -+ // CraftBukkit - add "!isEffect" -+ if (!isEffect && !world.isClientSide && world.getGameRules().getBoolean("doFireTick") && (world.getDifficulty() == EnumDifficulty.NORMAL || world.getDifficulty() == EnumDifficulty.HARD) && world.areChunksLoaded(blockposition, 10)) { - if (world.getType(blockposition).getBlock().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).getBlock().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 - } - } - } -@@ -35,7 +58,24 @@ - public void t_() { - super.t_(); - if (this.lifeTicks == 2) { -- this.world.makeSound(this.locX, this.locY, this.locZ, "ambient.weather.thunder", 10000.0F, 0.8F + this.random.nextFloat() * 0.2F); -+ // CraftBukkit start - Use relative location for far away sounds -+ //this.world.makeSound(this.locX, this.locY, this.locZ, "ambient.weather.thunder", 10000.0F, 0.8F + this.random.nextFloat() * 0.2F); -+ float pitch = 0.8F + this.random.nextFloat() * 0.2F; -+ int viewDistance = ((WorldServer) this.world).getServer().getViewDistance() * 16; -+ for (EntityPlayer player : (List) (List) this.world.players) { -+ double deltaX = this.locX - player.locX; -+ double deltaZ = this.locZ - player.locZ; -+ double distanceSquared = deltaX * deltaX + deltaZ * deltaZ; -+ if (distanceSquared > viewDistance * viewDistance) { -+ double deltaLength = Math.sqrt(distanceSquared); -+ double relativeX = player.locX + (deltaX / deltaLength) * viewDistance; -+ double relativeZ = player.locZ + (deltaZ / deltaLength) * viewDistance; -+ player.playerConnection.sendPacket(new PacketPlayOutNamedSoundEffect("ambient.weather.thunder", relativeX, this.locY, relativeZ, 10000.0F, pitch)); -+ } else { -+ player.playerConnection.sendPacket(new PacketPlayOutNamedSoundEffect("ambient.weather.thunder", this.locX, this.locY, this.locZ, 10000.0F, pitch)); -+ } -+ } -+ // CraftBukkit end - this.world.makeSound(this.locX, this.locY, this.locZ, "random.explode", 2.0F, 0.5F + this.random.nextFloat() * 0.2F); - } - -@@ -49,13 +89,18 @@ - this.a = this.random.nextLong(); - BlockPosition blockposition = new BlockPosition(this); - -+ // CraftBukkit - add "!isEffect" - if (!this.world.isClientSide && this.world.getGameRules().getBoolean("doFireTick") && this.world.areChunksLoaded(blockposition, 10) && this.world.getType(blockposition).getBlock().getMaterial() == Material.AIR && Blocks.FIRE.canPlace(this.world, blockposition)) { -- this.world.setTypeUpdate(blockposition, Blocks.FIRE.getBlockData()); -+ // CraftBukkit start -+ if (!isEffect && !CraftEventFactory.callBlockIgniteEvent(world, blockposition.getX(), blockposition.getY(), blockposition.getZ(), this).isCancelled()) { -+ this.world.setTypeUpdate(blockposition, Blocks.FIRE.getBlockData()); -+ } -+ // CraftBukkit end - } - } - } - -- if (this.lifeTicks >= 0) { -+ if (this.lifeTicks >= 0 && !this.isEffect) { // CraftBukkit - add !this.isEffect - if (this.world.isClientSide) { - this.world.d(2); - } else { diff --git a/TacoSpigot-Server/nms-patches/EntityLiving.patch b/TacoSpigot-Server/nms-patches/EntityLiving.patch deleted file mode 100644 index c6c9491..0000000 --- a/TacoSpigot-Server/nms-patches/EntityLiving.patch +++ /dev/null @@ -1,546 +0,0 @@ ---- a/net/minecraft/server/EntityLiving.java -+++ b/net/minecraft/server/EntityLiving.java -@@ -10,12 +10,25 @@ - import java.util.Random; - import java.util.UUID; - -+// CraftBukkit start -+import java.util.ArrayList; -+import com.google.common.base.Function; -+import com.google.common.collect.Lists; -+import org.bukkit.craftbukkit.event.CraftEventFactory; -+import org.bukkit.entity.LivingEntity; -+import org.bukkit.entity.Vehicle; -+import org.bukkit.event.entity.EntityDamageEvent; -+import org.bukkit.event.entity.EntityDamageEvent.DamageModifier; -+import org.bukkit.event.entity.EntityRegainHealthEvent; -+import org.bukkit.event.vehicle.VehicleExitEvent; -+// CraftBukkit end -+ - public abstract class EntityLiving extends Entity { - - private static final UUID a = UUID.fromString("662A6B8D-DA3E-4C1C-8813-96EA6097278D"); - private static final AttributeModifier b = (new AttributeModifier(EntityLiving.a, "Sprinting speed boost", 0.30000001192092896D, 2)).a(false); - private AttributeMapBase c; -- public final CombatTracker combatTracker = new CombatTracker(this); -+ public CombatTracker combatTracker = new CombatTracker(this); - public final Map effects = Maps.newHashMap(); - private final ItemStack[] h = new ItemStack[5]; - public boolean ar; -@@ -69,6 +82,11 @@ - private float bm; - private int bn; - private float bo; -+ // CraftBukkit start -+ public int expToDrop; -+ public int maxAirTicks = 300; -+ ArrayList drops = null; -+ // CraftBukkit end - - public void G() { - this.damageEntity(DamageSource.OUT_OF_WORLD, Float.MAX_VALUE); -@@ -77,7 +95,8 @@ - public EntityLiving(World world) { - super(world); - 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.watch(6, (float) this.getAttributeInstance(GenericAttributes.maxHealth).getValue()); - this.k = true; - this.aH = (float) ((Math.random() + 1.0D) * 0.009999999776482582D); - this.setPosition(this.locX, this.locY, this.locZ); -@@ -119,7 +138,13 @@ - - int i = (int) (150.0D * d1); - -- ((WorldServer) this.world).a(EnumParticle.BLOCK_DUST, this.locX, this.locY, this.locZ, i, 0.0D, 0.0D, 0.0D, 0.15000000596046448D, new int[] { Block.getCombinedId(iblockdata)}); -+ // CraftBukkit start - visiblity api -+ if (this instanceof EntityPlayer) { -+ ((WorldServer) this.world).sendParticles((EntityPlayer) this, EnumParticle.BLOCK_DUST, false, this.locX, this.locY, this.locZ, i, 0.0D, 0.0D, 0.0D, 0.15000000596046448D, new int[] { Block.getCombinedId(iblockdata)}); -+ } else { -+ ((WorldServer) this.world).a(EnumParticle.BLOCK_DUST, this.locX, this.locY, this.locZ, i, 0.0D, 0.0D, 0.0D, 0.15000000596046448D, new int[] { Block.getCombinedId(iblockdata)}); -+ } -+ // CraftBukkit end - } - } - -@@ -177,7 +202,11 @@ - this.mount((Entity) null); - } - } else { -- this.setAirTicks(300); -+ // CraftBukkit start - Only set if needed to work around a DataWatcher inefficiency -+ if (this.getAirTicks() != 300) { -+ this.setAirTicks(maxAirTicks); -+ } -+ // CraftBukkit end - } - } - -@@ -225,25 +254,36 @@ - this.world.methodProfiler.b(); - } - -+ // CraftBukkit start -+ public int getExpReward() { -+ int exp = this.getExpValue(this.killer); -+ -+ if (!this.world.isClientSide && (this.lastDamageByPlayerTime > 0 || this.alwaysGivesExp()) && this.ba() && this.world.getGameRules().getBoolean("doMobLoot")) { -+ return exp; -+ } else { -+ return 0; -+ } -+ } -+ // CraftBukkit end -+ - public boolean isBaby() { - return false; - } - - protected void aZ() { - ++this.deathTicks; -- if (this.deathTicks == 20) { -+ if (this.deathTicks >= 20 && !this.dead) { // CraftBukkit - (this.deathTicks == 20) -> (this.deathTicks >= 20 && !this.dead) - int i; - -- if (!this.world.isClientSide && (this.lastDamageByPlayerTime > 0 || this.alwaysGivesExp()) && this.ba() && this.world.getGameRules().getBoolean("doMobLoot")) { -- i = this.getExpValue(this.killer); -- -- while (i > 0) { -- int j = EntityExperienceOrb.getOrbValue(i); -- -- i -= j; -- this.world.addEntity(new EntityExperienceOrb(this.world, this.locX, this.locY, this.locZ, j)); -- } -+ // CraftBukkit start - Update getExpReward() above if the removed if() changes! -+ i = this.expToDrop; -+ while (i > 0) { -+ int j = EntityExperienceOrb.getOrbValue(i); -+ i -= j; -+ this.world.addEntity(new EntityExperienceOrb(this.world, this.locX, this.locY, this.locZ, j)); - } -+ this.expToDrop = 0; -+ // CraftBukkit end - - this.die(); - -@@ -380,6 +420,17 @@ - } - } - -+ // CraftBukkit start -+ if (nbttagcompound.hasKey("Bukkit.MaxHealth")) { -+ NBTBase nbtbase = nbttagcompound.get("Bukkit.MaxHealth"); -+ if (nbtbase.getTypeId() == 5) { -+ this.getAttributeInstance(GenericAttributes.maxHealth).setValue((double) ((NBTTagFloat) nbtbase).c()); -+ } else if (nbtbase.getTypeId() == 3) { -+ this.getAttributeInstance(GenericAttributes.maxHealth).setValue((double) ((NBTTagInt) nbtbase).d()); -+ } -+ } -+ // CraftBukkit end -+ - if (nbttagcompound.hasKeyOfType("HealF", 99)) { - this.setHealth(nbttagcompound.getFloat("HealF")); - } else { -@@ -399,9 +450,15 @@ - this.hurtTimestamp = nbttagcompound.getInt("HurtByTimestamp"); - } - -+ // CraftBukkit start -+ private boolean isTickingEffects = false; -+ private List effectsToProcess = Lists.newArrayList(); -+ // CraftBukkit end -+ - protected void bi() { - Iterator iterator = this.effects.keySet().iterator(); - -+ isTickingEffects = true; // CraftBukkit - while (iterator.hasNext()) { - Integer integer = (Integer) iterator.next(); - MobEffect mobeffect = (MobEffect) this.effects.get(integer); -@@ -415,6 +472,16 @@ - this.a(mobeffect, false); - } - } -+ // CraftBukkit start -+ isTickingEffects = false; -+ for (Object e : effectsToProcess) { -+ if (e instanceof MobEffect) { -+ addEffect((MobEffect) e); -+ } else { -+ removeEffect((Integer) e); -+ } -+ } -+ // CraftBukkit end - - if (this.updateEffects) { - if (!this.world.isClientSide) { -@@ -490,7 +557,8 @@ - } - - public boolean hasEffect(int i) { -- return this.effects.containsKey(Integer.valueOf(i)); -+ // CraftBukkit - Add size check for efficiency -+ return this.effects.size() != 0 && this.effects.containsKey(Integer.valueOf(i)); - } - - public boolean hasEffect(MobEffectList mobeffectlist) { -@@ -502,6 +570,12 @@ - } - - public void addEffect(MobEffect mobeffect) { -+ // CraftBukkit start -+ if (isTickingEffects) { -+ effectsToProcess.add(mobeffect); -+ return; -+ } -+ // CraftBukkit end - if (this.d(mobeffect)) { - if (this.effects.containsKey(Integer.valueOf(mobeffect.getEffectId()))) { - ((MobEffect) this.effects.get(Integer.valueOf(mobeffect.getEffectId()))).a(mobeffect); -@@ -531,6 +605,12 @@ - } - - public void removeEffect(int i) { -+ // CraftBukkit start -+ if (isTickingEffects) { -+ effectsToProcess.add(i); -+ return; -+ } -+ // CraftBukkit end - MobEffect mobeffect = (MobEffect) this.effects.remove(Integer.valueOf(i)); - - if (mobeffect != null) { -@@ -564,20 +644,52 @@ - - } - -+ // CraftBukkit start - Delegate so we can handle providing a reason for health being regained - public void heal(float f) { -+ heal(f, EntityRegainHealthEvent.RegainReason.CUSTOM); -+ } -+ -+ public void heal(float f, EntityRegainHealthEvent.RegainReason regainReason) { - float f1 = this.getHealth(); - - if (f1 > 0.0F) { -- this.setHealth(f1 + f); -+ EntityRegainHealthEvent event = new EntityRegainHealthEvent(this.getBukkitEntity(), f, regainReason); -+ this.world.getServer().getPluginManager().callEvent(event); -+ -+ if (!event.isCancelled()) { -+ this.setHealth((float) (this.getHealth() + event.getAmount())); -+ } -+ // CraftBukkit end - } - - } - - public final float getHealth() { -+ // CraftBukkit start - Use unscaled health -+ if (this instanceof EntityPlayer) { -+ return (float) ((EntityPlayer) this).getBukkitEntity().getHealth(); -+ } -+ // CraftBukkit end - return this.datawatcher.getFloat(6); - } - - public void setHealth(float f) { -+ // CraftBukkit start - Handle scaled health -+ if (this instanceof EntityPlayer) { -+ org.bukkit.craftbukkit.entity.CraftPlayer player = ((EntityPlayer) this).getBukkitEntity(); -+ // Squeeze -+ if (f < 0.0F) { -+ player.setRealHealth(0.0D); -+ } else if (f > player.getMaxHealth()) { -+ player.setRealHealth(player.getMaxHealth()); -+ } else { -+ player.setRealHealth(f); -+ } -+ -+ this.datawatcher.watch(6, Float.valueOf(player.getScaledHealth())); -+ return; -+ } -+ // CraftBukkit end - this.datawatcher.watch(6, Float.valueOf(MathHelper.a(f, 0.0F, this.getMaxHealth()))); - } - -@@ -593,7 +705,8 @@ - } else if (damagesource.o() && this.hasEffect(MobEffectList.FIRE_RESISTANCE)) { - return false; - } else { -- if ((damagesource == DamageSource.ANVIL || damagesource == DamageSource.FALLING_BLOCK) && this.getEquipment(4) != null) { -+ // CraftBukkit - Moved into d(DamageSource, float) -+ if (false && (damagesource == DamageSource.ANVIL || damagesource == DamageSource.FALLING_BLOCK) && this.getEquipment(4) != null) { - this.getEquipment(4).damage((int) (f * 4.0F + this.random.nextFloat() * f * 2.0F), this); - f *= 0.75F; - } -@@ -603,19 +716,38 @@ - - if ((float) this.noDamageTicks > (float) this.maxNoDamageTicks / 2.0F) { - if (f <= this.lastDamage) { -+ this.forceExplosionKnockback = true; // CraftBukkit - SPIGOT-949 - for vanilla consistency, cooldown does not prevent explosion knockback - return false; - } - -- this.d(damagesource, f - this.lastDamage); -+ // CraftBukkit start -+ if (!this.d(damagesource, f - this.lastDamage)) { -+ return false; -+ } -+ // CraftBukkit end - this.lastDamage = f; - flag = false; - } else { -+ // CraftBukkit start -+ float previousHealth = this.getHealth(); -+ if (!this.d(damagesource, f)) { -+ return false; -+ } - this.lastDamage = f; - this.noDamageTicks = this.maxNoDamageTicks; -- this.d(damagesource, f); -+ // CraftBukkit end - this.hurtTicks = this.av = 10; - } - -+ // CraftBukkit start -+ if(this instanceof EntityAnimal){ -+ ((EntityAnimal)this).cq(); -+ if(this instanceof EntityTameableAnimal){ -+ ((EntityTameableAnimal)this).getGoalSit().setSitting(false); -+ } -+ } -+ // CraftBukkit end -+ - this.aw = 0.0F; - Entity entity = damagesource.getEntity(); - -@@ -721,11 +853,19 @@ - } - - if (this.ba() && this.world.getGameRules().getBoolean("doMobLoot")) { -+ this.drops = new ArrayList(); // CraftBukkit - Setup drop capture -+ - this.dropDeathLoot(this.lastDamageByPlayerTime > 0, i); - this.dropEquipment(this.lastDamageByPlayerTime > 0, i); - if (this.lastDamageByPlayerTime > 0 && this.random.nextFloat() < 0.025F + (float) i * 0.01F) { - this.getRareDrop(); - } -+ // CraftBukkit start - Call death event -+ CraftEventFactory.callEntityDeathEvent(this, this.drops); -+ this.drops = null; -+ } else { -+ CraftEventFactory.callEntityDeathEvent(this); -+ // CraftBukkit end - } - } - -@@ -785,8 +925,13 @@ - int i = MathHelper.f((f - 3.0F - f2) * f1); - - if (i > 0) { -+ // CraftBukkit start -+ if (!this.damageEntity(DamageSource.FALL, (float) i)) { -+ return; -+ } -+ // CraftBukkit end - this.makeSound(this.n(i), 1.0F, 1.0F); -- this.damageEntity(DamageSource.FALL, (float) i); -+ // this.damageEntity(DamageSource.FALL, (float) i); // CraftBukkit - moved up - int j = MathHelper.floor(this.locX); - int k = MathHelper.floor(this.locY - 0.20000000298023224D); - int l = MathHelper.floor(this.locZ); -@@ -830,7 +975,7 @@ - int i = 25 - this.br(); - float f1 = f * (float) i; - -- this.damageArmor(f); -+ // this.damageArmor(f); // CraftBukkit - Moved into d(DamageSource, float) - f = f1 / 25.0F; - } - -@@ -844,8 +989,9 @@ - int i; - int j; - float f1; -- -- if (this.hasEffect(MobEffectList.RESISTANCE) && damagesource != DamageSource.OUT_OF_WORLD) { -+ -+ // CraftBukkit - Moved to d(DamageSource, float) -+ if (false && this.hasEffect(MobEffectList.RESISTANCE) && damagesource != DamageSource.OUT_OF_WORLD) { - i = (this.getEffect(MobEffectList.RESISTANCE).getAmplifier() + 1) * 5; - j = 25 - i; - f1 = f * (float) j; -@@ -871,22 +1017,121 @@ - } - } - -- protected void d(DamageSource damagesource, float f) { -- if (!this.isInvulnerable(damagesource)) { -- f = this.applyArmorModifier(damagesource, f); -- f = this.applyMagicModifier(damagesource, f); -- float f1 = f; -+ // CraftBukkit start -+ protected boolean d(final DamageSource damagesource, float f) { // void -> boolean, add final -+ if (!this.isInvulnerable(damagesource)) { -+ final boolean human = this instanceof EntityHuman; -+ float originalDamage = f; -+ Function hardHat = new Function() { -+ @Override -+ public Double apply(Double f) { -+ if ((damagesource == DamageSource.ANVIL || damagesource == DamageSource.FALLING_BLOCK) && EntityLiving.this.getEquipment(4) != null) { -+ return -(f - (f * 0.75F)); -+ } -+ return -0.0; -+ } -+ }; -+ float hardHatModifier = hardHat.apply((double) f).floatValue(); -+ f += hardHatModifier; -+ -+ Function blocking = new Function() { -+ @Override -+ public Double apply(Double f) { -+ if (human) { -+ if (!damagesource.ignoresArmor() && ((EntityHuman) EntityLiving.this).isBlocking() && f > 0.0F) { -+ return -(f - ((1.0F + f) * 0.5F)); -+ } -+ } -+ return -0.0; -+ } -+ }; -+ float blockingModifier = blocking.apply((double) f).floatValue(); -+ f += blockingModifier; -+ -+ Function armor = new Function() { -+ @Override -+ public Double apply(Double f) { -+ return -(f - EntityLiving.this.applyArmorModifier(damagesource, f.floatValue())); -+ } -+ }; -+ float armorModifier = armor.apply((double) f).floatValue(); -+ f += armorModifier; -+ -+ Function resistance = new Function() { -+ @Override -+ public Double apply(Double f) { -+ if (!damagesource.isStarvation() && EntityLiving.this.hasEffect(MobEffectList.RESISTANCE) && damagesource != DamageSource.OUT_OF_WORLD) { -+ int i = (EntityLiving.this.getEffect(MobEffectList.RESISTANCE).getAmplifier() + 1) * 5; -+ int j = 25 - i; -+ float f1 = f.floatValue() * (float) j; -+ return -(f - (f1 / 25.0F)); -+ } -+ return -0.0; -+ } -+ }; -+ float resistanceModifier = resistance.apply((double) f).floatValue(); -+ f += resistanceModifier; -+ -+ Function magic = new Function() { -+ @Override -+ public Double apply(Double f) { -+ return -(f - EntityLiving.this.applyMagicModifier(damagesource, f.floatValue())); -+ } -+ }; -+ float magicModifier = magic.apply((double) f).floatValue(); -+ f += magicModifier; -+ -+ Function absorption = new Function() { -+ @Override -+ public Double apply(Double f) { -+ return -(Math.max(f - Math.max(f - EntityLiving.this.getAbsorptionHearts(), 0.0F), 0.0F)); -+ } -+ }; -+ float absorptionModifier = absorption.apply((double) f).floatValue(); -+ -+ EntityDamageEvent event = CraftEventFactory.handleLivingEntityDamageEvent(this, damagesource, originalDamage, hardHatModifier, blockingModifier, armorModifier, resistanceModifier, magicModifier, absorptionModifier, hardHat, blocking, armor, resistance, magic, absorption); -+ if (event.isCancelled()) { -+ return false; -+ } -+ -+ f = (float) event.getFinalDamage(); -+ -+ // Apply damage to helmet -+ if ((damagesource == DamageSource.ANVIL || damagesource == DamageSource.FALLING_BLOCK) && this.getEquipment(4) != null) { -+ this.getEquipment(4).damage((int) (event.getDamage() * 4.0F + this.random.nextFloat() * event.getDamage() * 2.0F), this); -+ } -+ -+ // Apply damage to armor -+ if (!damagesource.ignoresArmor()) { -+ float armorDamage = (float) (event.getDamage() + event.getDamage(DamageModifier.BLOCKING) + event.getDamage(DamageModifier.HARD_HAT)); -+ this.damageArmor(armorDamage); -+ } - -- f = Math.max(f - this.getAbsorptionHearts(), 0.0F); -- this.setAbsorptionHearts(this.getAbsorptionHearts() - (f1 - f)); -+ absorptionModifier = (float) -event.getDamage(DamageModifier.ABSORPTION); -+ this.setAbsorptionHearts(Math.max(this.getAbsorptionHearts() - absorptionModifier, 0.0F)); - if (f != 0.0F) { -+ if (human) { -+ // 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.x, Math.round(f * 10.0F)); -+ } -+ } -+ // CraftBukkit end - float f2 = this.getHealth(); - - this.setHealth(f2 - f); - this.bs().a(damagesource, f2, f); -+ // CraftBukkit start -+ if (human) { -+ return true; -+ } -+ // CraftBukkit end - this.setAbsorptionHearts(this.getAbsorptionHearts() - f); - } -+ return true; // CraftBukkit - } -+ return false; // CraftBukkit - } - - public CombatTracker bs() { -@@ -1240,7 +1485,8 @@ - if (f > 0.0025000002F) { - f3 = 1.0F; - f2 = (float) Math.sqrt((double) f) * 3.0F; -- f1 = (float) MathHelper.b(d1, d0) * 180.0F / 3.1415927F - 90.0F; -+ // CraftBukkit - Math -> TrigMath -+ f1 = (float) org.bukkit.craftbukkit.TrigMath.atan2(d1, d0) * 180.0F / 3.1415927F - 90.0F; - } - - if (this.az > 0.0F) { -@@ -1413,6 +1659,13 @@ - for (int i = 0; i < list.size(); ++i) { - Entity entity = (Entity) list.get(i); - -+ // TODO better check now? -+ // CraftBukkit start - Only handle mob (non-player) collisions every other tick -+ if (entity instanceof EntityLiving && !(this instanceof EntityPlayer) && this.ticksLived % 2 == 0) { -+ continue; -+ } -+ // CraftBukkit end -+ - this.s(entity); - } - } -@@ -1425,6 +1678,18 @@ - - public void mount(Entity entity) { - if (this.vehicle != null && entity == null) { -+ // CraftBukkit start -+ Entity originalVehicle = this.vehicle; -+ if ((this.bukkitEntity instanceof LivingEntity) && (this.vehicle.getBukkitEntity() instanceof Vehicle)) { -+ VehicleExitEvent event = new VehicleExitEvent((Vehicle) this.vehicle.getBukkitEntity(), (LivingEntity) this.bukkitEntity); -+ getBukkitEntity().getServer().getPluginManager().callEvent(event); -+ -+ if (event.isCancelled() || vehicle != originalVehicle) { -+ return; -+ } -+ } -+ // CraftBukkit end -+ - if (!this.world.isClientSide) { - this.q(this.vehicle); - } diff --git a/TacoSpigot-Server/nms-patches/EntityMinecartAbstract.patch b/TacoSpigot-Server/nms-patches/EntityMinecartAbstract.patch deleted file mode 100644 index 252d080..0000000 --- a/TacoSpigot-Server/nms-patches/EntityMinecartAbstract.patch +++ /dev/null @@ -1,226 +0,0 @@ ---- a/net/minecraft/server/EntityMinecartAbstract.java -+++ b/net/minecraft/server/EntityMinecartAbstract.java -@@ -4,6 +4,15 @@ - import java.util.Iterator; - import java.util.Map; - -+// CraftBukkit start -+import org.bukkit.Location; -+import org.bukkit.entity.Vehicle; -+import org.bukkit.event.vehicle.VehicleDamageEvent; -+import org.bukkit.event.vehicle.VehicleDestroyEvent; -+import org.bukkit.event.vehicle.VehicleEntityCollisionEvent; -+import org.bukkit.util.Vector; -+// CraftBukkit end -+ - public abstract class EntityMinecartAbstract extends Entity implements INamableTileEntity { - - private boolean a; -@@ -16,6 +25,17 @@ - private double h; - private double i; - -+ // CraftBukkit start -+ public boolean slowWhenEmpty = true; -+ private double derailedX = 0.5; -+ private double derailedY = 0.5; -+ private double derailedZ = 0.5; -+ private double flyingX = 0.95; -+ private double flyingY = 0.95; -+ private double flyingZ = 0.95; -+ public double maxSpeed = 0.4D; -+ // CraftBukkit end -+ - public EntityMinecartAbstract(World world) { - super(world); - this.k = true; -@@ -81,6 +101,8 @@ - this.lastX = d0; - this.lastY = d1; - this.lastZ = d2; -+ -+ this.world.getServer().getPluginManager().callEvent(new org.bukkit.event.vehicle.VehicleCreateEvent((Vehicle) this.getBukkitEntity())); // CraftBukkit - } - - public double an() { -@@ -92,6 +114,19 @@ - if (this.isInvulnerable(damagesource)) { - return false; - } else { -+ // CraftBukkit start - fire VehicleDamageEvent -+ Vehicle vehicle = (Vehicle) this.getBukkitEntity(); -+ org.bukkit.entity.Entity passenger = (damagesource.getEntity() == null) ? null : damagesource.getEntity().getBukkitEntity(); -+ -+ VehicleDamageEvent event = new VehicleDamageEvent(vehicle, passenger, f); -+ this.world.getServer().getPluginManager().callEvent(event); -+ -+ if (event.isCancelled()) { -+ return true; -+ } -+ -+ f = (float) event.getDamage(); -+ // CraftBukkit end - this.k(-this.r()); - this.j(10); - this.ac(); -@@ -99,6 +134,15 @@ - boolean flag = damagesource.getEntity() instanceof EntityHuman && ((EntityHuman) damagesource.getEntity()).abilities.canInstantlyBuild; - - if (flag || this.getDamage() > 40.0F) { -+ // CraftBukkit start -+ VehicleDestroyEvent destroyEvent = new VehicleDestroyEvent(vehicle, passenger); -+ this.world.getServer().getPluginManager().callEvent(destroyEvent); -+ -+ if (destroyEvent.isCancelled()) { -+ this.setDamage(40); // Maximize damage so this doesn't get triggered again right away -+ return true; -+ } -+ // CraftBukkit end - if (this.passenger != null) { - this.passenger.mount((Entity) null); - } -@@ -140,6 +184,14 @@ - } - - public void t_() { -+ // CraftBukkit start -+ double prevX = this.locX; -+ double prevY = this.locY; -+ double prevZ = this.locZ; -+ float prevYaw = this.yaw; -+ float prevPitch = this.pitch; -+ // CraftBukkit end -+ - if (this.getType() > 0) { - this.j(this.getType() - 1); - } -@@ -160,7 +212,7 @@ - - i = this.L(); - if (this.ak) { -- if (minecraftserver.getAllowNether()) { -+ if (true || minecraftserver.getAllowNether()) { // CraftBukkit - multi-world should still allow teleport even if default vanilla nether disabled - if (this.vehicle == null && this.al++ >= i) { - this.al = i; - this.portalCooldown = this.aq(); -@@ -257,6 +309,20 @@ - } - - this.setYawPitch(this.yaw, this.pitch); -+ -+ // CraftBukkit start -+ org.bukkit.World bworld = this.world.getWorld(); -+ Location from = new Location(bworld, prevX, prevY, prevZ, prevYaw, prevPitch); -+ Location to = new Location(bworld, this.locX, this.locY, this.locZ, this.yaw, this.pitch); -+ Vehicle vehicle = (Vehicle) this.getBukkitEntity(); -+ -+ this.world.getServer().getPluginManager().callEvent(new org.bukkit.event.vehicle.VehicleUpdateEvent(vehicle)); -+ -+ if (!from.equals(to)) { -+ this.world.getServer().getPluginManager().callEvent(new org.bukkit.event.vehicle.VehicleMoveEvent(vehicle, from, to)); -+ } -+ // CraftBukkit end -+ - Iterator iterator = this.world.getEntities(this, this.getBoundingBox().grow(0.20000000298023224D, 0.0D, 0.20000000298023224D)).iterator(); - - while (iterator.hasNext()) { -@@ -280,7 +346,7 @@ - } - - protected double m() { -- return 0.4D; -+ return this.maxSpeed; // CraftBukkit - } - - public void a(int i, int j, int k, boolean flag) {} -@@ -291,16 +357,20 @@ - this.motX = MathHelper.a(this.motX, -d0, d0); - this.motZ = MathHelper.a(this.motZ, -d0, d0); - if (this.onGround) { -- this.motX *= 0.5D; -- this.motY *= 0.5D; -- this.motZ *= 0.5D; -+ // CraftBukkit start - replace magic numbers with our variables -+ this.motX *= this.derailedX; -+ this.motY *= this.derailedY; -+ this.motZ *= this.derailedZ; -+ // CraftBukkit end - } - - this.move(this.motX, this.motY, this.motZ); - if (!this.onGround) { -- this.motX *= 0.949999988079071D; -- this.motY *= 0.949999988079071D; -- this.motZ *= 0.949999988079071D; -+ // CraftBukkit start - replace magic numbers with our variables -+ this.motX *= this.flyingX; -+ this.motY *= this.flyingY; -+ this.motZ *= this.flyingZ; -+ // CraftBukkit end - } - - } -@@ -488,7 +558,7 @@ - } - - protected void o() { -- if (this.passenger != null) { -+ if (this.passenger != null || !this.slowWhenEmpty) { // CraftBukkit - add !this.slowWhenEmpty - this.motX *= 0.996999979019165D; - this.motY *= 0.0D; - this.motZ *= 0.996999979019165D; -@@ -616,6 +686,17 @@ - if (!this.world.isClientSide) { - if (!entity.noclip && !this.noclip) { - if (entity != this.passenger) { -+ // CraftBukkit start -+ Vehicle vehicle = (Vehicle) this.getBukkitEntity(); -+ org.bukkit.entity.Entity hitEntity = (entity == null) ? null : entity.getBukkitEntity(); -+ -+ VehicleEntityCollisionEvent collisionEvent = new VehicleEntityCollisionEvent(vehicle, hitEntity); -+ this.world.getServer().getPluginManager().callEvent(collisionEvent); -+ -+ if (collisionEvent.isCancelled()) { -+ return; -+ } -+ // CraftBukkit end - if (entity instanceof EntityLiving && !(entity instanceof EntityHuman) && !(entity instanceof EntityIronGolem) && this.s() == EntityMinecartAbstract.EnumMinecartType.RIDEABLE && this.motX * this.motX + this.motZ * this.motZ > 0.01D && this.passenger == null && entity.vehicle == null) { - entity.mount(this); - } -@@ -624,7 +705,8 @@ - double d1 = entity.locZ - this.locZ; - double d2 = d0 * d0 + d1 * d1; - -- if (d2 >= 9.999999747378752E-5D) { -+ // CraftBukkit - collision -+ if (d2 >= 9.999999747378752E-5D && !collisionEvent.isCollisionCancelled()) { - d2 = (double) MathHelper.sqrt(d2); - d0 /= d2; - d1 /= d2; -@@ -891,4 +973,26 @@ - - } - } -+ -+ // CraftBukkit start - Methods for getting and setting flying and derailed velocity modifiers -+ public Vector getFlyingVelocityMod() { -+ return new Vector(flyingX, flyingY, flyingZ); -+ } -+ -+ public void setFlyingVelocityMod(Vector flying) { -+ flyingX = flying.getX(); -+ flyingY = flying.getY(); -+ flyingZ = flying.getZ(); -+ } -+ -+ public Vector getDerailedVelocityMod() { -+ return new Vector(derailedX, derailedY, derailedZ); -+ } -+ -+ public void setDerailedVelocityMod(Vector derailed) { -+ derailedX = derailed.getX(); -+ derailedY = derailed.getY(); -+ derailedZ = derailed.getZ(); -+ } -+ // CraftBukkit end - } diff --git a/TacoSpigot-Server/nms-patches/EntityMinecartCommandBlock.patch b/TacoSpigot-Server/nms-patches/EntityMinecartCommandBlock.patch deleted file mode 100644 index 33aa4bc..0000000 --- a/TacoSpigot-Server/nms-patches/EntityMinecartCommandBlock.patch +++ /dev/null @@ -1,12 +0,0 @@ ---- a/net/minecraft/server/EntityMinecartCommandBlock.java -+++ b/net/minecraft/server/EntityMinecartCommandBlock.java -@@ -3,6 +3,9 @@ - public class EntityMinecartCommandBlock extends EntityMinecartAbstract { - - private final CommandBlockListenerAbstract a = new CommandBlockListenerAbstract() { -+ { -+ this.sender = (org.bukkit.craftbukkit.entity.CraftMinecartCommand) EntityMinecartCommandBlock.this.getBukkitEntity(); // CraftBukkit - Set the sender -+ } - public void h() { - EntityMinecartCommandBlock.this.getDataWatcher().watch(23, this.getCommand()); - EntityMinecartCommandBlock.this.getDataWatcher().watch(24, IChatBaseComponent.ChatSerializer.a(this.k())); diff --git a/TacoSpigot-Server/nms-patches/EntityMinecartContainer.patch b/TacoSpigot-Server/nms-patches/EntityMinecartContainer.patch deleted file mode 100644 index 2356dae..0000000 --- a/TacoSpigot-Server/nms-patches/EntityMinecartContainer.patch +++ /dev/null @@ -1,62 +0,0 @@ ---- a/net/minecraft/server/EntityMinecartContainer.java -+++ b/net/minecraft/server/EntityMinecartContainer.java -@@ -1,10 +1,49 @@ - package net.minecraft.server; - -+// CraftBukkit start -+import java.util.List; -+ -+import org.bukkit.craftbukkit.entity.CraftHumanEntity; -+import org.bukkit.entity.HumanEntity; -+import org.bukkit.inventory.InventoryHolder; -+// CraftBukkit end -+ - public abstract class EntityMinecartContainer extends EntityMinecartAbstract implements ITileInventory { - -- private ItemStack[] items = new ItemStack[36]; -+ private ItemStack[] items = new ItemStack[27]; // CraftBukkit - 36 -> 27 - private boolean b = true; - -+ // CraftBukkit start -+ public List transaction = new java.util.ArrayList(); -+ private int maxStack = MAX_STACK; -+ -+ public ItemStack[] getContents() { -+ return this.items; -+ } -+ -+ public void onOpen(CraftHumanEntity who) { -+ transaction.add(who); -+ } -+ -+ public void onClose(CraftHumanEntity who) { -+ transaction.remove(who); -+ } -+ -+ public List getViewers() { -+ return transaction; -+ } -+ -+ public InventoryHolder getOwner() { -+ org.bukkit.entity.Entity cart = getBukkitEntity(); -+ if(cart instanceof InventoryHolder) return (InventoryHolder) cart; -+ return null; -+ } -+ -+ public void setMaxStackSize(int size) { -+ maxStack = size; -+ } -+ // CraftBukkit end -+ - public EntityMinecartContainer(World world) { - super(world); - } -@@ -84,7 +123,7 @@ - } - - public int getMaxStackSize() { -- return 64; -+ return maxStack; // CraftBukkit - } - - public void c(int i) { diff --git a/TacoSpigot-Server/nms-patches/EntityMonster.patch b/TacoSpigot-Server/nms-patches/EntityMonster.patch deleted file mode 100644 index 239b570..0000000 --- a/TacoSpigot-Server/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) { -@@ -79,7 +81,14 @@ - int j = EnchantmentManager.getFireAspectEnchantmentLevel(this); - - if (j > 0) { -- entity.setOnFire(j * 4); -+ // CraftBukkit start - Call a combust event when somebody hits with a fire enchanted item -+ EntityCombustByEntityEvent combustEvent = new EntityCombustByEntityEvent(this.getBukkitEntity(), entity.getBukkitEntity(), j * 4); -+ org.bukkit.Bukkit.getPluginManager().callEvent(combustEvent); -+ -+ if (!combustEvent.isCancelled()) { -+ entity.setOnFire(combustEvent.getDuration()); -+ } -+ // CraftBukkit end - } - - this.a((EntityLiving) this, entity); diff --git a/TacoSpigot-Server/nms-patches/EntityMushroomCow.patch b/TacoSpigot-Server/nms-patches/EntityMushroomCow.patch deleted file mode 100644 index 7702e6d..0000000 --- a/TacoSpigot-Server/nms-patches/EntityMushroomCow.patch +++ /dev/null @@ -1,25 +0,0 @@ ---- a/net/minecraft/server/EntityMushroomCow.java -+++ b/net/minecraft/server/EntityMushroomCow.java -@@ -1,5 +1,7 @@ - package net.minecraft.server; - -+import org.bukkit.event.player.PlayerShearEntityEvent; // CraftBukkit -+ - public class EntityMushroomCow extends EntityCow { - - public EntityMushroomCow(World world) { -@@ -24,6 +26,14 @@ - } - - if (itemstack != null && itemstack.getItem() == Items.SHEARS && this.getAge() >= 0) { -+ // CraftBukkit start -+ PlayerShearEntityEvent event = new PlayerShearEntityEvent((org.bukkit.entity.Player) entityhuman.getBukkitEntity(), this.getBukkitEntity()); -+ this.world.getServer().getPluginManager().callEvent(event); -+ -+ if (event.isCancelled()) { -+ return false; -+ } -+ // CraftBukkit end - this.die(); - this.world.addParticle(EnumParticle.EXPLOSION_LARGE, this.locX, this.locY + (double) (this.length / 2.0F), this.locZ, 0.0D, 0.0D, 0.0D, new int[0]); - if (!this.world.isClientSide) { diff --git a/TacoSpigot-Server/nms-patches/EntityOcelot.patch b/TacoSpigot-Server/nms-patches/EntityOcelot.patch deleted file mode 100644 index 6f1a161..0000000 --- a/TacoSpigot-Server/nms-patches/EntityOcelot.patch +++ /dev/null @@ -1,48 +0,0 @@ ---- a/net/minecraft/server/EntityOcelot.java -+++ b/net/minecraft/server/EntityOcelot.java -@@ -51,7 +51,7 @@ - } - - protected boolean isTypeNotPersistent() { -- return !this.isTamed() && this.ticksLived > 2400; -+ return !this.isTamed() /*&& this.ticksLived > 2400*/; // CraftBukkit - } - - protected void initAttributes() { -@@ -96,6 +96,9 @@ - return entity.damageEntity(DamageSource.mobAttack(this), 3.0F); - } - -+ /* CraftBukkit start -+ // Function disabled as it has no special function anymore after -+ // setSitting is disabled. - public boolean damageEntity(DamageSource damagesource, float f) { - if (this.isInvulnerable(damagesource)) { - return false; -@@ -104,6 +107,7 @@ - return super.damageEntity(damagesource, f); - } - } -+ // CraftBukkit end */ - - protected void dropDeathLoot(boolean flag, int i) {} - -@@ -124,7 +128,8 @@ - } - - if (!this.world.isClientSide) { -- if (this.random.nextInt(3) == 0) { -+ // CraftBukkit - added event call and isCancelled check -+ if (this.random.nextInt(3) == 0 && !org.bukkit.craftbukkit.event.CraftEventFactory.callEntityTameEvent(this, entityhuman).isCancelled()) { - this.setTamed(true); - this.setCatType(1 + this.world.random.nextInt(3)); - this.setOwnerUUID(entityhuman.getUniqueID().toString()); -@@ -231,7 +236,7 @@ - - entityocelot.setPositionRotation(this.locX, this.locY, this.locZ, this.yaw, 0.0F); - entityocelot.setAgeRaw(-24000); -- this.world.addEntity(entityocelot); -+ this.world.addEntity(entityocelot, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.OCELOT_BABY); // CraftBukkit - add SpawnReason - } - } - diff --git a/TacoSpigot-Server/nms-patches/EntityPainting.patch b/TacoSpigot-Server/nms-patches/EntityPainting.patch deleted file mode 100644 index 2e0e1c0..0000000 --- a/TacoSpigot-Server/nms-patches/EntityPainting.patch +++ /dev/null @@ -1,10 +0,0 @@ ---- a/net/minecraft/server/EntityPainting.java -+++ b/net/minecraft/server/EntityPainting.java -@@ -9,6 +9,7 @@ - - public EntityPainting(World world) { - super(world); -+ this.art = EnumArt.values()[this.random.nextInt(EnumArt.values().length)]; // CraftBukkit - generate a non-null painting - } - - public EntityPainting(World world, BlockPosition blockposition, EnumDirection enumdirection) { diff --git a/TacoSpigot-Server/nms-patches/EntityPig.patch b/TacoSpigot-Server/nms-patches/EntityPig.patch deleted file mode 100644 index 2f7637b..0000000 --- a/TacoSpigot-Server/nms-patches/EntityPig.patch +++ /dev/null @@ -1,33 +0,0 @@ ---- a/net/minecraft/server/EntityPig.java -+++ b/net/minecraft/server/EntityPig.java -@@ -1,5 +1,7 @@ - package net.minecraft.server; - -+import org.bukkit.craftbukkit.event.CraftEventFactory; // CraftBukkit -+ - public class EntityPig extends EntityAnimal { - - private final PathfinderGoalPassengerCarrotStick bm; -@@ -112,6 +114,12 @@ - if (!this.world.isClientSide && !this.dead) { - EntityPigZombie entitypigzombie = new EntityPigZombie(this.world); - -+ // CraftBukkit start -+ if (CraftEventFactory.callPigZapEvent(this, entitylightning, entitypigzombie).isCancelled()) { -+ return; -+ } -+ // CraftBukkit end -+ - entitypigzombie.setEquipment(0, new ItemStack(Items.GOLDEN_SWORD)); - entitypigzombie.setPositionRotation(this.locX, this.locY, this.locZ, this.yaw, this.pitch); - entitypigzombie.k(this.ce()); -@@ -120,7 +128,8 @@ - entitypigzombie.setCustomNameVisible(this.getCustomNameVisible()); - } - -- this.world.addEntity(entitypigzombie); -+ // CraftBukkit - added a reason for spawning this creature -+ this.world.addEntity(entitypigzombie, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.LIGHTNING); - this.die(); - } - } diff --git a/TacoSpigot-Server/nms-patches/EntityPlayer.patch b/TacoSpigot-Server/nms-patches/EntityPlayer.patch deleted file mode 100644 index fe51ea5..0000000 --- a/TacoSpigot-Server/nms-patches/EntityPlayer.patch +++ /dev/null @@ -1,609 +0,0 @@ ---- a/net/minecraft/server/EntityPlayer.java -+++ b/net/minecraft/server/EntityPlayer.java -@@ -13,6 +13,17 @@ - import org.apache.logging.log4j.LogManager; - import org.apache.logging.log4j.Logger; - -+// CraftBukkit start -+import org.bukkit.Bukkit; -+import org.bukkit.WeatherType; -+import org.bukkit.craftbukkit.CraftWorld; -+import org.bukkit.craftbukkit.entity.CraftPlayer; -+import org.bukkit.craftbukkit.event.CraftEventFactory; -+import org.bukkit.craftbukkit.inventory.CraftItemStack; -+import org.bukkit.event.inventory.InventoryType; -+import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause; -+// CraftBukkit end -+ - public class EntityPlayer extends EntityHuman implements ICrafting { - - private static final Logger bH = LogManager.getLogger(); -@@ -40,6 +51,18 @@ - public int ping; - public boolean viewingCredits; - -+ // CraftBukkit start -+ public String displayName; -+ public IChatBaseComponent listName; -+ public org.bukkit.Location compassTarget; -+ public int newExp = 0; -+ public int newLevel = 0; -+ public int newTotalExp = 0; -+ public boolean keepLevel = false; -+ public double maxHealthCache; -+ public boolean joining = true; -+ // CraftBukkit end -+ - public EntityPlayer(MinecraftServer minecraftserver, WorldServer worldserver, GameProfile gameprofile, PlayerInteractManager playerinteractmanager) { - super(worldserver, gameprofile); - playerinteractmanager.player = this; -@@ -70,6 +93,11 @@ - this.setPosition(this.locX, this.locY + 1.0D, this.locZ); - } - -+ // CraftBukkit start -+ this.displayName = this.getName(); -+ // this.canPickUpLoot = true; TODO -+ this.maxHealthCache = this.getMaxHealth(); -+ // CraftBukkit end - } - - public void a(NBTTagCompound nbttagcompound) { -@@ -82,12 +110,40 @@ - } - } - -+ this.getBukkitEntity().readExtraData(nbttagcompound); // CraftBukkit - } - - public void b(NBTTagCompound nbttagcompound) { - super.b(nbttagcompound); - nbttagcompound.setInt("playerGameType", this.playerInteractManager.getGameMode().getId()); -+ -+ this.getBukkitEntity().setExtraData(nbttagcompound); // CraftBukkit -+ } -+ -+ // CraftBukkit start - World fallback code, either respawn location or global spawn -+ public void spawnIn(World world) { -+ super.spawnIn(world); -+ if (world == null) { -+ this.dead = false; -+ BlockPosition position = null; -+ if (this.spawnWorld != null && !this.spawnWorld.equals("")) { -+ CraftWorld cworld = (CraftWorld) Bukkit.getServer().getWorld(this.spawnWorld); -+ if (cworld != null && this.getBed() != null) { -+ world = cworld.getHandle(); -+ position = EntityHuman.getBed(cworld.getHandle(), this.getBed(), false); -+ } -+ } -+ if (world == null || position == null) { -+ world = ((CraftWorld) Bukkit.getServer().getWorlds().get(0)).getHandle(); -+ position = world.getSpawn(); -+ } -+ this.world = world; -+ this.setPosition(position.getX() + 0.5, position.getY(), position.getZ() + 0.5); -+ } -+ this.dimension = ((WorldServer) this.world).dimension; -+ this.playerInteractManager.a((WorldServer) world); - } -+ // CraftBukkit end - - public void levelDown(int i) { - super.levelDown(i); -@@ -114,6 +170,11 @@ - } - - public void t_() { -+ // CraftBukkit start -+ if (this.joining) { -+ this.joining = false; -+ } -+ // CraftBukkit end - this.playerInteractManager.a(); - --this.invulnerableTicks; - if (this.noDamageTicks > 0) { -@@ -155,7 +216,7 @@ - chunk = this.world.getChunkAt(chunkcoordintpair.x, chunkcoordintpair.z); - if (chunk.isReady()) { - arraylist.add(chunk); -- arraylist1.addAll(((WorldServer) this.world).getTileEntities(chunkcoordintpair.x * 16, 0, chunkcoordintpair.z * 16, chunkcoordintpair.x * 16 + 16, 256, chunkcoordintpair.z * 16 + 16)); -+ arraylist1.addAll(chunk.tileEntities.values()); // CraftBukkit - Get tile entities directly from the chunk instead of the world - iterator1.remove(); - } - } -@@ -220,8 +281,9 @@ - } - } - -+ // CraftBukkit - Optionally scale health - if (this.getHealth() != this.bM || this.bN != this.foodData.getFoodLevel() || this.foodData.getSaturationLevel() == 0.0F != this.bO) { -- this.playerConnection.sendPacket(new PacketPlayOutUpdateHealth(this.getHealth(), this.foodData.getFoodLevel(), this.foodData.getSaturationLevel())); -+ this.playerConnection.sendPacket(new PacketPlayOutUpdateHealth(this.getBukkitEntity().getScaledHealth(), this.foodData.getFoodLevel(), this.foodData.getSaturationLevel())); - this.bM = this.getHealth(); - this.bN = this.foodData.getFoodLevel(); - this.bO = this.foodData.getSaturationLevel() == 0.0F; -@@ -237,7 +299,14 @@ - - this.getScoreboard().getPlayerScoreForObjective(this.getName(), scoreboardobjective).updateForList(Arrays.asList(new EntityHuman[] { this})); - } -+ // CraftBukkit - Update ALL the scores! -+ this.world.getServer().getScoreboardManager().updateAllScoresForList(IScoreboardCriteria.g, this.getName(), com.google.common.collect.ImmutableList.of(this)); -+ } -+ // CraftBukkit start - Force max health updates -+ if (this.maxHealthCache != this.getMaxHealth()) { -+ this.getBukkitEntity().updateScaledHealth(); - } -+ // CraftBukkit end - - if (this.expTotal != this.lastSentExp) { - this.lastSentExp = this.expTotal; -@@ -248,6 +317,16 @@ - this.i_(); - } - -+ // CraftBukkit start - initialize oldLevel and fire PlayerLevelChangeEvent -+ if (this.oldLevel == -1) { -+ this.oldLevel = this.expLevel; -+ } -+ -+ if (this.oldLevel != this.expLevel) { -+ CraftEventFactory.callPlayerLevelChangeEvent(this.world.getServer().getPlayer((EntityPlayer) this), this.oldLevel, this.expLevel); -+ this.oldLevel = this.expLevel; -+ } -+ // CraftBukkit end - } catch (Throwable throwable) { - CrashReport crashreport = CrashReport.a(throwable, "Ticking player"); - CrashReportSystemDetails crashreportsystemdetails = crashreport.a("Player being ticked"); -@@ -296,30 +375,63 @@ - } - - public void die(DamageSource damagesource) { -- if (this.world.getGameRules().getBoolean("showDeathMessages")) { -- ScoreboardTeamBase scoreboardteambase = this.getScoreboardTeam(); -+ // CraftBukkit start - fire PlayerDeathEvent -+ if (this.dead) { -+ return; -+ } -+ java.util.List loot = new java.util.ArrayList(); -+ boolean keepInventory = this.world.getGameRules().getBoolean("keepInventory"); -+ -+ if (!keepInventory) { -+ for (int i = 0; i < this.inventory.items.length; ++i) { -+ if (this.inventory.items[i] != null) { -+ loot.add(CraftItemStack.asCraftMirror(this.inventory.items[i])); -+ } -+ } - -- if (scoreboardteambase != null && scoreboardteambase.j() != ScoreboardTeamBase.EnumNameTagVisibility.ALWAYS) { -- if (scoreboardteambase.j() == ScoreboardTeamBase.EnumNameTagVisibility.HIDE_FOR_OTHER_TEAMS) { -- this.server.getPlayerList().a((EntityHuman) this, this.bs().b()); -- } else if (scoreboardteambase.j() == ScoreboardTeamBase.EnumNameTagVisibility.HIDE_FOR_OWN_TEAM) { -- this.server.getPlayerList().b((EntityHuman) this, this.bs().b()); -+ for (int i = 0; i < this.inventory.armor.length; ++i) { -+ if (this.inventory.armor[i] != null) { -+ loot.add(CraftItemStack.asCraftMirror(this.inventory.armor[i])); - } -+ } -+ } -+ -+ IChatBaseComponent chatmessage = this.bs().b(); -+ -+ String deathmessage = chatmessage.c(); -+ org.bukkit.event.entity.PlayerDeathEvent event = CraftEventFactory.callPlayerDeathEvent(this, loot, deathmessage, keepInventory); -+ -+ String deathMessage = event.getDeathMessage(); -+ -+ if (deathMessage != null && deathMessage.length() > 0 && this.world.getGameRules().getBoolean("showDeathMessages")) { // TODO: allow plugins to override? -+ if (deathMessage.equals(deathmessage)) { -+ this.server.getPlayerList().sendMessage(chatmessage); - } else { -- this.server.getPlayerList().sendMessage(this.bs().b()); -+ this.server.getPlayerList().sendMessage(org.bukkit.craftbukkit.util.CraftChatMessage.fromString(deathMessage)); - } - } - -- if (!this.world.getGameRules().getBoolean("keepInventory")) { -- this.inventory.n(); -+ // we clean the player's inventory after the EntityDeathEvent is called so plugins can get the exact state of the inventory. -+ if (!event.getKeepInventory()) { -+ for (int i = 0; i < this.inventory.items.length; ++i) { -+ this.inventory.items[i] = null; -+ } -+ -+ for (int i = 0; i < this.inventory.armor.length; ++i) { -+ this.inventory.armor[i] = null; -+ } - } - -- Collection collection = this.world.getScoreboard().getObjectivesForCriteria(IScoreboardCriteria.d); -+ 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()); - Iterator iterator = collection.iterator(); - - while (iterator.hasNext()) { -- ScoreboardObjective scoreboardobjective = (ScoreboardObjective) iterator.next(); -- ScoreboardScore scoreboardscore = this.getScoreboard().getPlayerScoreForObjective(this.getName(), scoreboardobjective); -+ ScoreboardScore scoreboardscore = (ScoreboardScore) iterator.next(); // CraftBukkit - Use our scores instead - - scoreboardscore.incrementScore(); - } -@@ -376,7 +488,8 @@ - } - - private boolean cr() { -- return this.server.getPVP(); -+ // CraftBukkit - this.server.getPvP() -> this.world.pvpMode -+ return this.world.pvpMode; - } - - public void c(int i) { -@@ -388,6 +501,8 @@ - } else { - if (this.dimension == 0 && i == 1) { - this.b((Statistic) AchievementList.C); -+ // CraftBukkit start - Rely on custom portal management -+ /* - BlockPosition blockposition = this.server.getWorldServer(i).getDimensionSpawn(); - - if (blockposition != null) { -@@ -395,11 +510,16 @@ - } - - i = 1; -+ */ -+ // CraftBukkit end - } else { - this.b((Statistic) AchievementList.y); - } - -- this.server.getPlayerList().changeDimension(this, i); -+ // CraftBukkit start -+ TeleportCause cause = (this.dimension == 1 || i == 1) ? TeleportCause.END_PORTAL : TeleportCause.NETHER_PORTAL; -+ this.server.getPlayerList().changeDimension(this, i, cause); -+ // CraftBukkit end - this.lastSentExp = -1; - this.bM = -1.0F; - this.bN = -1; -@@ -442,6 +562,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.u().getTracker().sendPacketToEntity(this, new PacketPlayOutAnimation(this, 2)); - } -@@ -457,7 +578,7 @@ - Entity entity1 = this.vehicle; - - super.mount(entity); -- if (entity != entity1) { -+ if (this.vehicle != entity1) { // CraftBukkit - this.playerConnection.sendPacket(new PacketPlayOutAttachEntity(0, this, this.vehicle)); - this.playerConnection.a(this.locX, this.locY, this.locZ, this.yaw, this.pitch); - } -@@ -490,19 +611,46 @@ - this.playerConnection.sendPacket(new PacketPlayOutOpenSignEditor(tileentitysign.getPosition())); - } - -- private void nextContainerCounter() { -+ public int nextContainerCounter() { // CraftBukkit - private void -> public int - this.containerCounter = this.containerCounter % 100 + 1; -+ return containerCounter; // CraftBukkit - } - - public void openTileEntity(ITileEntityContainer itileentitycontainer) { -+ // CraftBukkit start - Inventory open hook -+ Container container = CraftEventFactory.callInventoryOpenEvent(this, itileentitycontainer.createContainer(this.inventory, this)); -+ if (container == null) { -+ return; -+ } -+ // CraftBukkit end - this.nextContainerCounter(); - this.playerConnection.sendPacket(new PacketPlayOutOpenWindow(this.containerCounter, itileentitycontainer.getContainerName(), itileentitycontainer.getScoreboardDisplayName())); -- this.activeContainer = itileentitycontainer.createContainer(this.inventory, this); -+ this.activeContainer = container; // CraftBukkit - this.activeContainer.windowId = this.containerCounter; - this.activeContainer.addSlotListener(this); - } - - public void openContainer(IInventory iinventory) { -+ // CraftBukkit start - Inventory open hook -+ // Copied from below -+ boolean cancelled = false; -+ if (iinventory instanceof ITileInventory) { -+ ITileInventory itileinventory = (ITileInventory) iinventory; -+ cancelled = itileinventory.r_() && !this.a(itileinventory.i()) && !this.isSpectator(); -+ } -+ -+ Container container; -+ if (iinventory instanceof ITileEntityContainer) { -+ container = ((ITileEntityContainer)iinventory).createContainer(this.inventory, this); -+ } else { -+ container = new ContainerChest(this.inventory, iinventory, this); -+ } -+ container = CraftEventFactory.callInventoryOpenEvent(this, container, cancelled); -+ if (container == null && !cancelled) { // Let pre-cancelled events fall through -+ iinventory.closeContainer(this); -+ return; -+ } -+ // CraftBukkit end - if (this.activeContainer != this.defaultContainer) { - this.closeInventory(); - } -@@ -510,9 +658,11 @@ - if (iinventory instanceof ITileInventory) { - ITileInventory itileinventory = (ITileInventory) iinventory; - -- if (itileinventory.r_() && !this.a(itileinventory.i()) && !this.isSpectator()) { -+ if (itileinventory.r_() && !this.a(itileinventory.i()) && !this.isSpectator() && container == null) { // CraftBukkit - allow plugins to uncancel the lock - this.playerConnection.sendPacket(new PacketPlayOutChat(new ChatMessage("container.isLocked", new Object[] { iinventory.getScoreboardDisplayName()}), (byte) 2)); - this.playerConnection.sendPacket(new PacketPlayOutNamedSoundEffect("random.door_close", this.locX, this.locY, this.locZ, 1.0F, 1.0F)); -+ -+ iinventory.closeContainer(this); // CraftBukkit - return; - } - } -@@ -520,10 +670,10 @@ - this.nextContainerCounter(); - if (iinventory instanceof ITileEntityContainer) { - this.playerConnection.sendPacket(new PacketPlayOutOpenWindow(this.containerCounter, ((ITileEntityContainer) iinventory).getContainerName(), iinventory.getScoreboardDisplayName(), iinventory.getSize())); -- this.activeContainer = ((ITileEntityContainer) iinventory).createContainer(this.inventory, this); -+ this.activeContainer = container; // CraftBukkit - } else { - this.playerConnection.sendPacket(new PacketPlayOutOpenWindow(this.containerCounter, "minecraft:container", iinventory.getScoreboardDisplayName(), iinventory.getSize())); -- this.activeContainer = new ContainerChest(this.inventory, iinventory, this); -+ this.activeContainer = container; // CraftBukkit - } - - this.activeContainer.windowId = this.containerCounter; -@@ -531,8 +681,14 @@ - } - - public void openTrade(IMerchant imerchant) { -+ // CraftBukkit start - Inventory open hook -+ Container container = CraftEventFactory.callInventoryOpenEvent(this, new ContainerMerchant(this.inventory, imerchant, this.world)); -+ if (container == null) { -+ return; -+ } -+ // CraftBukkit end - this.nextContainerCounter(); -- this.activeContainer = new ContainerMerchant(this.inventory, imerchant, this.world); -+ this.activeContainer = container; // CraftBukkit - this.activeContainer.windowId = this.containerCounter; - this.activeContainer.addSlotListener(this); - InventoryMerchant inventorymerchant = ((ContainerMerchant) this.activeContainer).e(); -@@ -552,13 +708,20 @@ - } - - public void openHorseInventory(EntityHorse entityhorse, IInventory iinventory) { -+ // CraftBukkit start - Inventory open hook -+ Container container = CraftEventFactory.callInventoryOpenEvent(this, new ContainerHorse(this.inventory, iinventory, entityhorse, this)); -+ if (container == null) { -+ iinventory.closeContainer(this); -+ return; -+ } -+ // CraftBukkit end - if (this.activeContainer != this.defaultContainer) { - this.closeInventory(); - } - - this.nextContainerCounter(); - this.playerConnection.sendPacket(new PacketPlayOutOpenWindow(this.containerCounter, "EntityHorse", iinventory.getScoreboardDisplayName(), iinventory.getSize(), entityhorse.getId())); -- this.activeContainer = new ContainerHorse(this.inventory, iinventory, entityhorse, this); -+ this.activeContainer = container; - this.activeContainer.windowId = this.containerCounter; - this.activeContainer.addSlotListener(this); - } -@@ -587,6 +750,11 @@ - public void a(Container container, List list) { - this.playerConnection.sendPacket(new PacketPlayOutWindowItems(container.windowId, list)); - this.playerConnection.sendPacket(new PacketPlayOutSetSlot(-1, -1, this.inventory.getCarried())); -+ // CraftBukkit start - Send a Set Slot to update the crafting result slot -+ if (java.util.EnumSet.of(InventoryType.CRAFTING,InventoryType.WORKBENCH).contains(container.getBukkitView().getType())) { -+ this.playerConnection.sendPacket(new PacketPlayOutSetSlot(container.windowId, 0, container.getSlot(0).getItem())); -+ } -+ // CraftBukkit end - } - - public void setContainerData(Container container, int i, int j) { -@@ -601,6 +769,7 @@ - } - - public void closeInventory() { -+ CraftEventFactory.handleInventoryCloseEvent(this); // CraftBukkit - this.playerConnection.sendPacket(new PacketPlayOutCloseWindow(this.activeContainer.windowId)); - this.p(); - } -@@ -681,8 +850,17 @@ - - public void triggerHealthUpdate() { - this.bM = -1.0E8F; -+ this.lastSentExp = -1; // CraftBukkit - Added to reset - } - -+ // CraftBukkit start - Support multi-line messages -+ public void sendMessage(IChatBaseComponent[] ichatbasecomponent) { -+ for (IChatBaseComponent component : ichatbasecomponent) { -+ this.sendMessage(component); -+ } -+ } -+ // CraftBukkit end -+ - public void b(IChatBaseComponent ichatbasecomponent) { - this.playerConnection.sendPacket(new PacketPlayOutChat(ichatbasecomponent)); - } -@@ -747,6 +925,8 @@ - } - - public void a(WorldSettings.EnumGamemode worldsettings_enumgamemode) { -+ getBukkitEntity().setGameMode(org.bukkit.GameMode.getByValue(worldsettings_enumgamemode.getId())); -+ /* CraftBukkit start - defer to our setGameMode - this.playerInteractManager.setGameMode(worldsettings_enumgamemode); - this.playerConnection.sendPacket(new PacketPlayOutGameStateChange(3, (float) worldsettings_enumgamemode.getId())); - if (worldsettings_enumgamemode == WorldSettings.EnumGamemode.SPECTATOR) { -@@ -757,6 +937,7 @@ - - this.updateAbilities(); - this.bP(); -+ // CraftBukkit end */ - } - - public boolean isSpectator() { -@@ -768,7 +949,8 @@ - } - - public boolean a(int i, String s) { -- if ("seed".equals(s) && !this.server.ae()) { -+ /* CraftBukkit start -+ if ("seed".equals(s) && !this.server.ad()) { - return true; - } else if (!"tell".equals(s) && !"help".equals(s) && !"me".equals(s) && !"trigger".equals(s)) { - if (this.server.getPlayerList().isOp(this.getProfile())) { -@@ -781,6 +963,12 @@ - } else { - return true; - } -+ */ -+ if ("@".equals(s)) { -+ return getBukkitEntity().hasPermission("minecraft.command.selector"); -+ } -+ return true; -+ // CraftBukkit end - } - - public String w() { -@@ -867,6 +1055,129 @@ - } - - public IChatBaseComponent getPlayerListName() { -- return null; -+ return listName; // CraftBukkit -+ } -+ -+ // CraftBukkit start - Add per-player time and weather. -+ public long timeOffset = 0; -+ public boolean relativeTime = true; -+ -+ public long getPlayerTime() { -+ if (this.relativeTime) { -+ // Adds timeOffset to the current server time. -+ return this.world.getDayTime() + this.timeOffset; -+ } else { -+ // Adds timeOffset to the beginning of this day. -+ return this.world.getDayTime() - (this.world.getDayTime() % 24000) + this.timeOffset; -+ } -+ } -+ -+ public WeatherType weather = null; -+ -+ public WeatherType getPlayerWeather() { -+ return this.weather; -+ } -+ -+ public void setPlayerWeather(WeatherType type, boolean plugin) { -+ if (!plugin && this.weather != null) { -+ return; -+ } -+ -+ if (plugin) { -+ this.weather = type; -+ } -+ -+ if (type == WeatherType.DOWNFALL) { -+ this.playerConnection.sendPacket(new PacketPlayOutGameStateChange(2, 0)); -+ } else { -+ this.playerConnection.sendPacket(new PacketPlayOutGameStateChange(1, 0)); -+ } -+ } -+ -+ private float pluginRainPosition; -+ private float pluginRainPositionPrevious; -+ -+ public void updateWeather(float oldRain, float newRain, float oldThunder, float newThunder) { -+ if (this.weather == null) { -+ // Vanilla -+ if (oldRain != newRain) { -+ this.playerConnection.sendPacket(new PacketPlayOutGameStateChange(7, newRain)); -+ } -+ } else { -+ // Plugin -+ if (pluginRainPositionPrevious != pluginRainPosition) { -+ this.playerConnection.sendPacket(new PacketPlayOutGameStateChange(7, pluginRainPosition)); -+ } -+ } -+ -+ if (oldThunder != newThunder) { -+ if (weather == WeatherType.DOWNFALL || weather == null) { -+ this.playerConnection.sendPacket(new PacketPlayOutGameStateChange(8, newThunder)); -+ } else { -+ this.playerConnection.sendPacket(new PacketPlayOutGameStateChange(8, 0)); -+ } -+ } -+ } -+ -+ public void tickWeather() { -+ if (this.weather == null) return; -+ -+ pluginRainPositionPrevious = pluginRainPosition; -+ if (weather == WeatherType.DOWNFALL) { -+ pluginRainPosition += 0.01; -+ } else { -+ pluginRainPosition -= 0.01; -+ } -+ -+ pluginRainPosition = MathHelper.a(pluginRainPosition, 0.0F, 1.0F); -+ } -+ -+ public void resetPlayerWeather() { -+ this.weather = null; -+ this.setPlayerWeather(this.world.getWorldData().hasStorm() ? WeatherType.DOWNFALL : WeatherType.CLEAR, false); -+ } -+ -+ @Override -+ public String toString() { -+ return super.toString() + "(" + this.getName() + " at " + this.locX + "," + this.locY + "," + this.locZ + ")"; -+ } -+ -+ public void reset() { -+ float exp = 0; -+ boolean keepInventory = this.world.getGameRules().getBoolean("keepInventory"); -+ -+ if (this.keepLevel || keepInventory) { -+ exp = this.exp; -+ this.newTotalExp = this.expTotal; -+ this.newLevel = this.expLevel; -+ } -+ -+ this.setHealth(this.getMaxHealth()); -+ this.fireTicks = 0; -+ this.fallDistance = 0; -+ this.foodData = new FoodMetaData(this); -+ this.expLevel = this.newLevel; -+ this.expTotal = this.newTotalExp; -+ this.exp = 0; -+ this.deathTicks = 0; -+ this.removeAllEffects(); -+ this.updateEffects = true; -+ this.activeContainer = this.defaultContainer; -+ this.killer = null; -+ this.lastDamager = null; -+ this.combatTracker = new CombatTracker(this); -+ this.lastSentExp = -1; -+ if (this.keepLevel || keepInventory) { -+ this.exp = exp; -+ } else { -+ this.giveExp(this.newExp); -+ } -+ this.keepLevel = false; -+ } -+ -+ @Override -+ public CraftPlayer getBukkitEntity() { -+ return (CraftPlayer) super.getBukkitEntity(); - } -+ // CraftBukkit end - } diff --git a/TacoSpigot-Server/nms-patches/EntityPotion.patch b/TacoSpigot-Server/nms-patches/EntityPotion.patch deleted file mode 100644 index d16a99c..0000000 --- a/TacoSpigot-Server/nms-patches/EntityPotion.patch +++ /dev/null @@ -1,71 +0,0 @@ ---- a/net/minecraft/server/EntityPotion.java -+++ b/net/minecraft/server/EntityPotion.java -@@ -3,6 +3,13 @@ - import java.util.Iterator; - import java.util.List; - -+// CraftBukkit start -+import java.util.HashMap; -+ -+import org.bukkit.craftbukkit.entity.CraftLivingEntity; -+import org.bukkit.entity.LivingEntity; -+// CraftBukkit end -+ - public class EntityPotion extends EntityProjectile { - - public ItemStack item; -@@ -57,13 +64,16 @@ - if (!this.world.isClientSide) { - List list = Items.POTION.h(this.item); - -- if (list != null && !list.isEmpty()) { -+ if (true || list != null && !list.isEmpty()) { // CraftBukkit - Call event even if no effects to apply - AxisAlignedBB axisalignedbb = this.getBoundingBox().grow(4.0D, 2.0D, 4.0D); - List list1 = this.world.a(EntityLiving.class, axisalignedbb); - -- if (!list1.isEmpty()) { -+ if (true || !list1.isEmpty()) { // CraftBukkit - Run code even if there are no entities around - Iterator iterator = list1.iterator(); - -+ // CraftBukkit -+ HashMap affected = new HashMap(); -+ - while (iterator.hasNext()) { - EntityLiving entityliving = (EntityLiving) iterator.next(); - double d0 = this.h(entityliving); -@@ -75,12 +85,35 @@ - d1 = 1.0D; - } - -+ // CraftBukkit start -+ affected.put((LivingEntity) entityliving.getBukkitEntity(), d1); -+ } -+ } -+ -+ org.bukkit.event.entity.PotionSplashEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callPotionSplashEvent(this, affected); -+ if (!event.isCancelled() && list != null && !list.isEmpty()) { // do not process effects if there are no effects to process -+ for (LivingEntity victim : event.getAffectedEntities()) { -+ if (!(victim instanceof CraftLivingEntity)) { -+ continue; -+ } -+ -+ EntityLiving entityliving = ((CraftLivingEntity) victim).getHandle(); -+ double d1 = event.getIntensity(victim); -+ // CraftBukkit end -+ - Iterator iterator1 = list.iterator(); - - while (iterator1.hasNext()) { - MobEffect mobeffect = (MobEffect) iterator1.next(); - int i = mobeffect.getEffectId(); - -+ // CraftBukkit start - Abide by PVP settings - for players only! -+ if (!this.world.pvpMode && this.getShooter() instanceof EntityPlayer && entityliving instanceof EntityPlayer && entityliving != this.getShooter()) { -+ // Block SLOWER_MOVEMENT, SLOWER_DIG, HARM, BLINDNESS, HUNGER, WEAKNESS and POISON potions -+ if (i == 2 || i == 4 || i == 7 || i == 15 || i == 17 || i == 18 || i == 19) continue; -+ } -+ // CraftBukkit end -+ - if (MobEffectList.byId[i].isInstant()) { - MobEffectList.byId[i].applyInstantEffect(this, this.getShooter(), entityliving, mobeffect.getAmplifier(), d1); - } else { diff --git a/TacoSpigot-Server/nms-patches/EntityProjectile.patch b/TacoSpigot-Server/nms-patches/EntityProjectile.patch deleted file mode 100644 index 460ea55..0000000 --- a/TacoSpigot-Server/nms-patches/EntityProjectile.patch +++ /dev/null @@ -1,22 +0,0 @@ ---- a/net/minecraft/server/EntityProjectile.java -+++ b/net/minecraft/server/EntityProjectile.java -@@ -26,6 +26,7 @@ - public EntityProjectile(World world, EntityLiving entityliving) { - super(world); - this.shooter = entityliving; -+ this.projectileSource = (org.bukkit.entity.LivingEntity) entityliving.getBukkitEntity(); // CraftBukkit - this.setSize(0.25F, 0.25F); - this.setPositionRotation(entityliving.locX, entityliving.locY + (double) entityliving.getHeadHeight(), entityliving.locZ, entityliving.yaw, entityliving.pitch); - this.locX -= (double) (MathHelper.cos(this.yaw / 180.0F * 3.1415927F) * 0.16F); -@@ -151,6 +152,11 @@ - this.d(movingobjectposition.a()); - } else { - this.a(movingobjectposition); -+ // CraftBukkit start -+ if (this.dead) { -+ org.bukkit.craftbukkit.event.CraftEventFactory.callProjectileHitEvent(this); -+ } -+ // CraftBukkit end - } - } - diff --git a/TacoSpigot-Server/nms-patches/EntityRabbit.patch b/TacoSpigot-Server/nms-patches/EntityRabbit.patch deleted file mode 100644 index 37dd626..0000000 --- a/TacoSpigot-Server/nms-patches/EntityRabbit.patch +++ /dev/null @@ -1,25 +0,0 @@ ---- a/net/minecraft/server/EntityRabbit.java -+++ b/net/minecraft/server/EntityRabbit.java -@@ -21,6 +21,12 @@ - this.g = new EntityRabbit.ControllerJumpRabbit(this); - this.moveController = new EntityRabbit.ControllerMoveRabbit(this); - ((Navigation) this.getNavigation()).a(true); -+ this.initializePathFinderGoals(); // CraftBukkit - moved code -+ this.b(0.0D); -+ } -+ -+ // CraftBukkit start - code from constructor -+ public void initializePathFinderGoals(){ - this.navigation.a(2.5F); - this.goalSelector.a(1, new PathfinderGoalFloat(this)); - this.goalSelector.a(1, new EntityRabbit.PathfinderGoalRabbitPanic(this, 1.33D)); -@@ -33,8 +39,8 @@ - this.goalSelector.a(11, new PathfinderGoalLookAtPlayer(this, EntityHuman.class, 10.0F)); - this.bm = new EntityRabbit.PathfinderGoalRabbitAvoidTarget(this, EntityWolf.class, 16.0F, 1.33D, 1.33D); - this.goalSelector.a(4, this.bm); -- this.b(0.0D); - } -+ // CraftBukkit end - - protected float bE() { - return this.moveController.a() && this.moveController.e() > this.locY + 0.5D ? 0.5F : this.bt.b(); diff --git a/TacoSpigot-Server/nms-patches/EntitySheep.patch b/TacoSpigot-Server/nms-patches/EntitySheep.patch deleted file mode 100644 index a64b2a4..0000000 --- a/TacoSpigot-Server/nms-patches/EntitySheep.patch +++ /dev/null @@ -1,68 +0,0 @@ ---- a/net/minecraft/server/EntitySheep.java -+++ b/net/minecraft/server/EntitySheep.java -@@ -4,12 +4,25 @@ - import java.util.Map; - import java.util.Random; - -+// CraftBukkit start -+import org.bukkit.event.entity.SheepRegrowWoolEvent; -+import org.bukkit.event.player.PlayerShearEntityEvent; -+import org.bukkit.inventory.InventoryView; -+// CraftBukkit end -+ - public class EntitySheep extends EntityAnimal { - - private final InventoryCrafting bm = new InventoryCrafting(new Container() { - public boolean a(EntityHuman entityhuman) { - return false; - } -+ -+ // CraftBukkit start -+ @Override -+ public InventoryView getBukkitView() { -+ return null; // TODO: O.O -+ } -+ // CraftBukkit end - }, 2, 1); - private static final Map bo = Maps.newEnumMap(EnumColor.class); - private int bp; -@@ -34,6 +47,7 @@ - this.goalSelector.a(8, new PathfinderGoalRandomLookaround(this)); - this.bm.setItem(0, new ItemStack(Items.DYE, 1, 0)); - this.bm.setItem(1, new ItemStack(Items.DYE, 1, 0)); -+ this.bm.resultInventory = new InventoryCraftResult(); // CraftBukkit - add result slot for event - } - - protected void E() { -@@ -86,6 +100,15 @@ - - if (itemstack != null && itemstack.getItem() == Items.SHEARS && !this.isSheared() && !this.isBaby()) { - if (!this.world.isClientSide) { -+ // CraftBukkit start -+ PlayerShearEntityEvent event = new PlayerShearEntityEvent((org.bukkit.entity.Player) entityhuman.getBukkitEntity(), this.getBukkitEntity()); -+ this.world.getServer().getPluginManager().callEvent(event); -+ -+ if (event.isCancelled()) { -+ return false; -+ } -+ // CraftBukkit end -+ - this.setSheared(true); - int i = 1 + this.random.nextInt(3); - -@@ -173,7 +196,14 @@ - } - - public void v() { -- this.setSheared(false); -+ // CraftBukkit start -+ SheepRegrowWoolEvent event = new SheepRegrowWoolEvent((org.bukkit.entity.Sheep) this.getBukkitEntity()); -+ this.world.getServer().getPluginManager().callEvent(event); -+ -+ if (!event.isCancelled()) { -+ this.setSheared(false); -+ } -+ // CraftBukkit end - if (this.isBaby()) { - this.setAge(60); - } diff --git a/TacoSpigot-Server/nms-patches/EntitySilverfish.patch b/TacoSpigot-Server/nms-patches/EntitySilverfish.patch deleted file mode 100644 index 9ea99cd..0000000 --- a/TacoSpigot-Server/nms-patches/EntitySilverfish.patch +++ /dev/null @@ -1,26 +0,0 @@ ---- a/net/minecraft/server/EntitySilverfish.java -+++ b/net/minecraft/server/EntitySilverfish.java -@@ -144,6 +144,11 @@ - IBlockData iblockdata = world.getType(blockposition); - - if (BlockMonsterEggs.d(iblockdata)) { -+ // CraftBukkit start -+ if (org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(this.silverfish, blockposition.getX(), blockposition.getY(), blockposition.getZ(), Blocks.MONSTER_EGG, Block.getId(BlockMonsterEggs.getById(iblockdata.getBlock().toLegacyData(iblockdata)))).isCancelled()) { -+ return; -+ } -+ // CraftBukkit end - world.setTypeAndData(blockposition, Blocks.MONSTER_EGG.getBlockData().set(BlockMonsterEggs.VARIANT, BlockMonsterEggs.EnumMonsterEggVarient.a(iblockdata)), 3); - this.silverfish.y(); - this.silverfish.die(); -@@ -187,6 +192,11 @@ - IBlockData iblockdata = world.getType(blockposition1); - - if (iblockdata.getBlock() == Blocks.MONSTER_EGG) { -+ // CraftBukkit start -+ if (org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(this.silverfish, blockposition1.getX(), blockposition1.getY(), blockposition1.getZ(), Blocks.AIR, 0).isCancelled()) { -+ continue; -+ } -+ // CraftBukkit end - if (world.getGameRules().getBoolean("mobGriefing")) { - world.setAir(blockposition1, true); - } else { diff --git a/TacoSpigot-Server/nms-patches/EntitySkeleton.patch b/TacoSpigot-Server/nms-patches/EntitySkeleton.patch deleted file mode 100644 index 6da92eb..0000000 --- a/TacoSpigot-Server/nms-patches/EntitySkeleton.patch +++ /dev/null @@ -1,96 +0,0 @@ ---- a/net/minecraft/server/EntitySkeleton.java -+++ b/net/minecraft/server/EntitySkeleton.java -@@ -2,6 +2,8 @@ - - import java.util.Calendar; - -+import org.bukkit.event.entity.EntityCombustEvent; // CraftBukkit -+ - public class EntitySkeleton extends EntityMonster implements IRangedEntity { - - private PathfinderGoalArrowAttack a = new PathfinderGoalArrowAttack(this, 1.0D, 20, 60, 15.0F); -@@ -89,7 +91,14 @@ - } - - if (flag) { -- this.setOnFire(8); -+ // CraftBukkit start -+ EntityCombustEvent event = new EntityCombustEvent(this.getBukkitEntity(), 8); -+ this.world.getServer().getPluginManager().callEvent(event); -+ -+ if (!event.isCancelled()) { -+ this.setOnFire(event.getDuration()); -+ } -+ // CraftBukkit end - } - } - } -@@ -112,7 +121,7 @@ - } - - public void die(DamageSource damagesource) { -- super.die(damagesource); -+ // super.die(damagesource); // CraftBukkit - if (damagesource.i() instanceof EntityArrow && damagesource.getEntity() instanceof EntityHuman) { - EntityHuman entityhuman = (EntityHuman) damagesource.getEntity(); - double d0 = entityhuman.locX - this.locX; -@@ -123,16 +132,25 @@ - } - } else if (damagesource.getEntity() instanceof EntityCreeper && ((EntityCreeper) damagesource.getEntity()).isPowered() && ((EntityCreeper) damagesource.getEntity()).cp()) { - ((EntityCreeper) damagesource.getEntity()).cq(); -- this.a(new ItemStack(Items.SKULL, 1, this.getSkeletonType() == 1 ? 1 : 0), 0.0F); -+ // CraftBukkit start -+ // this.a(new ItemStack(Items.SKULL, 1, this.getSkeletonType() == 1 ? 1 : 0), 0.0F); -+ headDrop = new ItemStack(Items.SKULL, 1, this.getSkeletonType() == 1 ? 1 : 0); -+ // CraftBukkit end -+ - } - -+ super.die(damagesource); // CraftBukkit - moved from above -+ - } - -+ /* CraftBukkit start - protected Item getLoot() { - return Items.ARROW; - } -+ // CraftBukkit end */ - - protected void dropDeathLoot(boolean flag, int i) { -+ super.dropDeathLoot(flag, i); // CraftBukkit - int j; - int k; - -@@ -224,11 +242,30 @@ - } - - if (EnchantmentManager.getEnchantmentLevel(Enchantment.ARROW_FIRE.id, this.bA()) > 0 || this.getSkeletonType() == 1) { -- entityarrow.setOnFire(100); -+ // CraftBukkit start - call EntityCombustEvent -+ EntityCombustEvent event = new EntityCombustEvent(entityarrow.getBukkitEntity(), 100); -+ this.world.getServer().getPluginManager().callEvent(event); -+ -+ if (!event.isCancelled()) { -+ entityarrow.setOnFire(event.getDuration()); -+ } -+ // CraftBukkit end -+ } -+ -+ // CraftBukkit start -+ org.bukkit.event.entity.EntityShootBowEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callEntityShootBowEvent(this, this.bA(), entityarrow, 0.8F); -+ if (event.isCancelled()) { -+ event.getProjectile().remove(); -+ return; -+ } -+ -+ if (event.getProjectile() == entityarrow.getBukkitEntity()) { -+ world.addEntity(entityarrow); - } -+ // CraftBukkit end - - this.makeSound("random.bow", 1.0F, 1.0F / (this.bc().nextFloat() * 0.4F + 0.8F)); -- this.world.addEntity(entityarrow); -+ // this.world.addEntity(entityarrow); // CraftBukkit - moved up - } - - public int getSkeletonType() { diff --git a/TacoSpigot-Server/nms-patches/EntitySlice.patch b/TacoSpigot-Server/nms-patches/EntitySlice.patch deleted file mode 100644 index 3f38104..0000000 --- a/TacoSpigot-Server/nms-patches/EntitySlice.patch +++ /dev/null @@ -1,38 +0,0 @@ ---- a/net/minecraft/server/EntitySlice.java -+++ b/net/minecraft/server/EntitySlice.java -@@ -12,7 +12,7 @@ - - public class EntitySlice extends AbstractSet { - -- private static final Set> a = Sets.newHashSet(); -+ private static final Set> a = Sets.newConcurrentHashSet(); // CraftBukkit - private final Map, List> b = Maps.newHashMap(); - private final Set> c = Sets.newIdentityHashSet(); - private final Class d; -@@ -40,7 +40,7 @@ - Object object = iterator.next(); - - if (oclass.isAssignableFrom(object.getClass())) { -- this.a(object, oclass); -+ this.a((T) object, oclass); - } - } - -@@ -77,7 +77,7 @@ - List list = (List) this.b.get(oclass); - - if (list == null) { -- this.b.put(oclass, Lists.newArrayList(new Object[] { t0})); -+ this.b.put(oclass, Lists.newArrayList(t0)); - } else { - list.add(t0); - } -@@ -125,7 +125,7 @@ - } - - public Iterator iterator() { -- return this.e.isEmpty() ? Iterators.emptyIterator() : Iterators.unmodifiableIterator(this.e.iterator()); -+ return this.e.isEmpty() ? Iterators.emptyIterator() : Iterators.unmodifiableIterator(this.e.iterator()); - } - - public int size() { diff --git a/TacoSpigot-Server/nms-patches/EntitySlime.patch b/TacoSpigot-Server/nms-patches/EntitySlime.patch deleted file mode 100644 index 2e3333d..0000000 --- a/TacoSpigot-Server/nms-patches/EntitySlime.patch +++ /dev/null @@ -1,40 +0,0 @@ ---- a/net/minecraft/server/EntitySlime.java -+++ b/net/minecraft/server/EntitySlime.java -@@ -1,5 +1,9 @@ - package net.minecraft.server; - -+// CraftBukkit start -+import org.bukkit.event.entity.SlimeSplitEvent; -+// CraftBukkit end -+ - public class EntitySlime extends EntityInsentient implements IMonster { - - public float a; -@@ -133,6 +137,18 @@ - if (!this.world.isClientSide && i > 1 && this.getHealth() <= 0.0F) { - int j = 2 + this.random.nextInt(3); - -+ // CraftBukkit start -+ SlimeSplitEvent event = new SlimeSplitEvent((org.bukkit.entity.Slime) this.getBukkitEntity(), j); -+ this.world.getServer().getPluginManager().callEvent(event); -+ -+ if (!event.isCancelled() && event.getCount() > 0) { -+ j = event.getCount(); -+ } else { -+ super.die(); -+ return; -+ } -+ // CraftBukkit end -+ - for (int k = 0; k < j; ++k) { - float f = ((float) (k % 2) - 0.5F) * (float) i / 4.0F; - float f1 = ((float) (k / 2) - 0.5F) * (float) i / 4.0F; -@@ -148,7 +164,7 @@ - - entityslime.setSize(i / 2); - entityslime.setPositionRotation(this.locX + (double) f, this.locY + 0.5D, this.locZ + (double) f1, this.random.nextFloat() * 360.0F, 0.0F); -- this.world.addEntity(entityslime); -+ this.world.addEntity(entityslime, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.SLIME_SPLIT); // CraftBukkit - SpawnReason - } - } - diff --git a/TacoSpigot-Server/nms-patches/EntitySmallFireball.patch b/TacoSpigot-Server/nms-patches/EntitySmallFireball.patch deleted file mode 100644 index be58eb1..0000000 --- a/TacoSpigot-Server/nms-patches/EntitySmallFireball.patch +++ /dev/null @@ -1,39 +0,0 @@ ---- a/net/minecraft/server/EntitySmallFireball.java -+++ b/net/minecraft/server/EntitySmallFireball.java -@@ -1,5 +1,7 @@ - package net.minecraft.server; - -+import org.bukkit.event.entity.EntityCombustByEntityEvent; // CraftBukkit -+ - public class EntitySmallFireball extends EntityFireball { - - public EntitySmallFireball(World world) { -@@ -26,7 +28,14 @@ - if (flag) { - this.a(this.shooter, movingobjectposition.entity); - if (!movingobjectposition.entity.isFireProof()) { -- movingobjectposition.entity.setOnFire(5); -+ // CraftBukkit start - Entity damage by entity event + combust event -+ EntityCombustByEntityEvent event = new EntityCombustByEntityEvent((org.bukkit.entity.Projectile) this.getBukkitEntity(), movingobjectposition.entity.getBukkitEntity(), 5); -+ movingobjectposition.entity.world.getServer().getPluginManager().callEvent(event); -+ -+ if (!event.isCancelled()) { -+ movingobjectposition.entity.setOnFire(event.getDuration()); -+ } -+ // CraftBukkit end - } - } - } else { -@@ -39,7 +48,11 @@ - BlockPosition blockposition = movingobjectposition.a().shift(movingobjectposition.direction); - - if (this.world.isEmpty(blockposition)) { -- this.world.setTypeUpdate(blockposition, Blocks.FIRE.getBlockData()); -+ // CraftBukkit start -+ if (isIncendiary && !org.bukkit.craftbukkit.event.CraftEventFactory.callBlockIgniteEvent(world, blockposition.getX(), blockposition.getY(), blockposition.getZ(), this).isCancelled()) { -+ this.world.setTypeUpdate(blockposition, Blocks.FIRE.getBlockData()); -+ } -+ // CraftBukkit end - } - } - } diff --git a/TacoSpigot-Server/nms-patches/EntitySnowman.patch b/TacoSpigot-Server/nms-patches/EntitySnowman.patch deleted file mode 100644 index fbde5d2..0000000 --- a/TacoSpigot-Server/nms-patches/EntitySnowman.patch +++ /dev/null @@ -1,42 +0,0 @@ ---- a/net/minecraft/server/EntitySnowman.java -+++ b/net/minecraft/server/EntitySnowman.java -@@ -1,5 +1,11 @@ - package net.minecraft.server; - -+// CraftBukkit start -+import org.bukkit.craftbukkit.event.CraftEventFactory; -+import org.bukkit.craftbukkit.util.CraftMagicNumbers; -+import org.bukkit.event.block.EntityBlockFormEvent; -+// CraftBukkit end -+ - public class EntitySnowman extends EntityGolem implements IRangedEntity { - - public EntitySnowman(World world) { -@@ -31,7 +37,7 @@ - } - - if (this.world.getBiome(new BlockPosition(i, 0, k)).a(new BlockPosition(i, j, k)) > 1.0F) { -- this.damageEntity(DamageSource.BURN, 1.0F); -+ this.damageEntity(CraftEventFactory.MELTING, 1.0F); // CraftBukkit - DamageSource.BURN -> CraftEventFactory.MELTING - } - - for (int l = 0; l < 4; ++l) { -@@ -41,7 +47,17 @@ - BlockPosition blockposition = new BlockPosition(i, j, k); - - if (this.world.getType(blockposition).getBlock().getMaterial() == Material.AIR && this.world.getBiome(new BlockPosition(i, 0, k)).a(blockposition) < 0.8F && Blocks.SNOW_LAYER.canPlace(this.world, blockposition)) { -- this.world.setTypeUpdate(blockposition, Blocks.SNOW_LAYER.getBlockData()); -+ // CraftBukkit start -+ org.bukkit.block.BlockState blockState = this.world.getWorld().getBlockAt(i, j, k).getState(); -+ blockState.setType(CraftMagicNumbers.getMaterial(Blocks.SNOW_LAYER)); -+ -+ EntityBlockFormEvent event = new EntityBlockFormEvent(this.getBukkitEntity(), blockState.getBlock(), blockState); -+ this.world.getServer().getPluginManager().callEvent(event); -+ -+ if(!event.isCancelled()) { -+ blockState.update(true); -+ } -+ // CraftBukkit end - } - } - } diff --git a/TacoSpigot-Server/nms-patches/EntitySpider.patch b/TacoSpigot-Server/nms-patches/EntitySpider.patch deleted file mode 100644 index d4e19fd..0000000 --- a/TacoSpigot-Server/nms-patches/EntitySpider.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- a/net/minecraft/server/EntitySpider.java -+++ b/net/minecraft/server/EntitySpider.java -@@ -112,7 +112,7 @@ - - entityskeleton.setPositionRotation(this.locX, this.locY, this.locZ, this.yaw, 0.0F); - entityskeleton.prepare(difficultydamagescaler, (GroupDataEntity) null); -- this.world.addEntity(entityskeleton); -+ this.world.addEntity(entityskeleton, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.JOCKEY); // CraftBukkit - add SpawnReason - entityskeleton.mount(this); - } - diff --git a/TacoSpigot-Server/nms-patches/EntitySquid.patch b/TacoSpigot-Server/nms-patches/EntitySquid.patch deleted file mode 100644 index da17073..0000000 --- a/TacoSpigot-Server/nms-patches/EntitySquid.patch +++ /dev/null @@ -1,14 +0,0 @@ ---- a/net/minecraft/server/EntitySquid.java -+++ b/net/minecraft/server/EntitySquid.java -@@ -67,9 +67,11 @@ - - } - -+ /* CraftBukkit start - Delegate to Entity to use existing inWater value - public boolean V() { - return this.world.a(this.getBoundingBox().grow(0.0D, -0.6000000238418579D, 0.0D), Material.WATER, (Entity) this); - } -+ // CraftBukkit end */ - - public void m() { - super.m(); diff --git a/TacoSpigot-Server/nms-patches/EntityTNTPrimed.patch b/TacoSpigot-Server/nms-patches/EntityTNTPrimed.patch deleted file mode 100644 index f9a1bf2..0000000 --- a/TacoSpigot-Server/nms-patches/EntityTNTPrimed.patch +++ /dev/null @@ -1,52 +0,0 @@ ---- a/net/minecraft/server/EntityTNTPrimed.java -+++ b/net/minecraft/server/EntityTNTPrimed.java -@@ -1,9 +1,13 @@ - package net.minecraft.server; - -+import org.bukkit.event.entity.ExplosionPrimeEvent; // CraftBukkit -+ - public class EntityTNTPrimed extends Entity { - - public int fuseTicks; - private EntityLiving source; -+ public float yield = 4; // CraftBukkit - add field -+ public boolean isIncendiary = false; // CraftBukkit - add field - - public EntityTNTPrimed(World world) { - super(world); -@@ -52,10 +56,13 @@ - } - - if (this.fuseTicks-- <= 0) { -- this.die(); -+ // CraftBukkit start - Need to reverse the order of the explosion and the entity death so we have a location for the event -+ // this.die(); - if (!this.world.isClientSide) { - this.explode(); - } -+ this.die(); -+ // CraftBukkit end - } else { - this.W(); - this.world.addParticle(EnumParticle.SMOKE_NORMAL, this.locX, this.locY + 0.5D, this.locZ, 0.0D, 0.0D, 0.0D, new int[0]); -@@ -64,9 +71,18 @@ - } - - private void explode() { -- float f = 4.0F; -+ // CraftBukkit start -+ // float f = 4.0F; -+ -+ org.bukkit.craftbukkit.CraftServer server = this.world.getServer(); - -- this.world.explode(this, this.locX, this.locY + (double) (this.length / 16.0F), this.locZ, f, true); -+ ExplosionPrimeEvent event = new ExplosionPrimeEvent((org.bukkit.entity.Explosive) org.bukkit.craftbukkit.entity.CraftEntity.getEntity(server, this)); -+ server.getPluginManager().callEvent(event); -+ -+ if (!event.isCancelled()) { -+ this.world.createExplosion(this, this.locX, this.locY + (double) (this.length / 2.0F), this.locZ, event.getRadius(), event.getFire(), true); -+ } -+ // CraftBukkit end - } - - protected void b(NBTTagCompound nbttagcompound) { diff --git a/TacoSpigot-Server/nms-patches/EntityThrownExpBottle.patch b/TacoSpigot-Server/nms-patches/EntityThrownExpBottle.patch deleted file mode 100644 index 2e68849..0000000 --- a/TacoSpigot-Server/nms-patches/EntityThrownExpBottle.patch +++ /dev/null @@ -1,22 +0,0 @@ ---- a/net/minecraft/server/EntityThrownExpBottle.java -+++ b/net/minecraft/server/EntityThrownExpBottle.java -@@ -28,9 +28,18 @@ - - protected void a(MovingObjectPosition movingobjectposition) { - if (!this.world.isClientSide) { -- this.world.triggerEffect(2002, new BlockPosition(this), 0); -+ // CraftBukkit - moved to after event -+ // this.world.triggerEffect(2002, new BlockPosition(this), 0); - int i = 3 + this.world.random.nextInt(5) + this.world.random.nextInt(5); - -+ // CraftBukkit start -+ org.bukkit.event.entity.ExpBottleEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callExpBottleEvent(this, i); -+ i = event.getExperience(); -+ if (event.getShowEffect()) { -+ this.world.triggerEffect(2002, new BlockPosition(this), 0); -+ } -+ // CraftBukkit end -+ - while (i > 0) { - int j = EntityExperienceOrb.getOrbValue(i); - diff --git a/TacoSpigot-Server/nms-patches/EntityTracker.patch b/TacoSpigot-Server/nms-patches/EntityTracker.patch deleted file mode 100644 index d42e4a6..0000000 --- a/TacoSpigot-Server/nms-patches/EntityTracker.patch +++ /dev/null @@ -1,17 +0,0 @@ ---- a/net/minecraft/server/EntityTracker.java -+++ b/net/minecraft/server/EntityTracker.java -@@ -113,11 +113,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 Callable() { - 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/TacoSpigot-Server/nms-patches/EntityTrackerEntry.patch b/TacoSpigot-Server/nms-patches/EntityTrackerEntry.patch deleted file mode 100644 index 0a6cc77..0000000 --- a/TacoSpigot-Server/nms-patches/EntityTrackerEntry.patch +++ /dev/null @@ -1,187 +0,0 @@ ---- a/net/minecraft/server/EntityTrackerEntry.java -+++ b/net/minecraft/server/EntityTrackerEntry.java -@@ -8,6 +8,11 @@ - import org.apache.logging.log4j.LogManager; - import org.apache.logging.log4j.Logger; - -+// CraftBukkit start -+import org.bukkit.entity.Player; -+import org.bukkit.event.player.PlayerVelocityEvent; -+// CraftBukkit end -+ - public class EntityTrackerEntry { - - private static final Logger p = LogManager.getLogger(); -@@ -74,13 +79,13 @@ - this.broadcast(new PacketPlayOutAttachEntity(0, this.tracker, this.tracker.vehicle)); - } - -- if (this.tracker instanceof EntityItemFrame && this.m % 10 == 0) { -+ if (this.tracker instanceof EntityItemFrame /*&& this.m % 10 == 0*/) { // CraftBukkit - Moved below, should always enter this block - EntityItemFrame entityitemframe = (EntityItemFrame) this.tracker; - ItemStack itemstack = entityitemframe.getItem(); - -- if (itemstack != null && itemstack.getItem() instanceof ItemWorldMap) { -+ if (this.m % 10 == 0 && itemstack != null && itemstack.getItem() instanceof ItemWorldMap) { // CraftBukkit - Moved this.m % 10 logic here so item frames do not enter the other blocks - WorldMap worldmap = Items.FILLED_MAP.getSavedMap(itemstack, this.tracker.world); -- Iterator iterator = list.iterator(); -+ Iterator iterator = this.trackedPlayers.iterator(); // CraftBukkit - - while (iterator.hasNext()) { - EntityHuman entityhuman = (EntityHuman) iterator.next(); -@@ -116,6 +121,19 @@ - boolean flag = Math.abs(j1) >= 4 || Math.abs(k1) >= 4 || Math.abs(l1) >= 4 || this.m % 60 == 0; - boolean flag1 = Math.abs(l - this.yRot) >= 4 || Math.abs(i1 - this.xRot) >= 4; - -+ // CraftBukkit start - Code moved from below -+ if (flag) { -+ this.xLoc = i; -+ this.yLoc = j; -+ this.zLoc = k; -+ } -+ -+ if (flag1) { -+ this.yRot = l; -+ this.xRot = i1; -+ } -+ // CraftBukkit end -+ - if (this.m > 0 || this.tracker instanceof EntityArrow) { - if (j1 >= -128 && j1 < 128 && k1 >= -128 && k1 < 128 && l1 >= -128 && l1 < 128 && this.v <= 400 && !this.x && this.y == this.tracker.onGround) { - if ((!flag || !flag1) && !(this.tracker instanceof EntityArrow)) { -@@ -130,6 +148,11 @@ - } else { - this.y = this.tracker.onGround; - this.v = 0; -+ // CraftBukkit start - Refresh list of who can see a player before sending teleport packet -+ if (this.tracker instanceof EntityPlayer) { -+ this.scanPlayers(new java.util.ArrayList(this.trackedPlayers)); -+ } -+ // CraftBukkit end - object = new PacketPlayOutEntityTeleport(this.tracker.getId(), i, j, k, (byte) l, (byte) i1, this.tracker.onGround); - } - } -@@ -154,6 +177,7 @@ - } - - this.b(); -+ /* CraftBukkit start - Code moved up - if (flag) { - this.xLoc = i; - this.yLoc = j; -@@ -164,6 +188,7 @@ - this.yRot = l; - this.xRot = i1; - } -+ // CraftBukkit end */ - - this.x = false; - } else { -@@ -195,7 +220,27 @@ - - ++this.m; - if (this.tracker.velocityChanged) { -- this.broadcastIncludingSelf(new PacketPlayOutEntityVelocity(this.tracker)); -+ // CraftBukkit start - Create PlayerVelocity event -+ boolean cancelled = false; -+ -+ if (this.tracker instanceof EntityPlayer) { -+ Player player = (Player) this.tracker.getBukkitEntity(); -+ org.bukkit.util.Vector velocity = player.getVelocity(); -+ -+ PlayerVelocityEvent event = new PlayerVelocityEvent(player, velocity.clone()); -+ this.tracker.world.getServer().getPluginManager().callEvent(event); -+ -+ if (event.isCancelled()) { -+ cancelled = true; -+ } else if (!velocity.equals(event.getVelocity())) { -+ player.setVelocity(event.getVelocity()); -+ } -+ } -+ -+ if (!cancelled) { -+ this.broadcastIncludingSelf(new PacketPlayOutEntityVelocity(this.tracker)); -+ } -+ // CraftBukkit end - this.tracker.velocityChanged = false; - } - -@@ -213,6 +258,11 @@ - Set set = attributemapserver.getAttributes(); - - if (!set.isEmpty()) { -+ // CraftBukkit start - Send scaled max health -+ if (this.tracker instanceof EntityPlayer) { -+ ((EntityPlayer) this.tracker).getBukkitEntity().injectScaledMaxHealth(set, false); -+ } -+ // CraftBukkit end - this.broadcastIncludingSelf(new PacketPlayOutUpdateAttributes(this.tracker.getId(), set)); - } - -@@ -263,6 +313,16 @@ - if (entityplayer != this.tracker) { - if (this.c(entityplayer)) { - if (!this.trackedPlayers.contains(entityplayer) && (this.e(entityplayer) || this.tracker.attachedToPlayer)) { -+ // CraftBukkit start - respect vanish API -+ if (this.tracker instanceof EntityPlayer) { -+ Player player = ((EntityPlayer) this.tracker).getBukkitEntity(); -+ if (!entityplayer.getBukkitEntity().canSee(player)) { -+ return; -+ } -+ } -+ -+ entityplayer.removeQueue.remove(Integer.valueOf(this.tracker.getId())); -+ // CraftBukkit end - this.trackedPlayers.add(entityplayer); - Packet packet = this.c(); - -@@ -281,6 +341,12 @@ - AttributeMapServer attributemapserver = (AttributeMapServer) ((EntityLiving) this.tracker).getAttributeMap(); - Collection collection = attributemapserver.c(); - -+ // CraftBukkit start - If sending own attributes send scaled health instead of current maximum health -+ if (this.tracker.getId() == entityplayer.getId()) { -+ ((EntityPlayer) this.tracker).getBukkitEntity().injectScaledMaxHealth(collection, false); -+ } -+ // CraftBukkit end -+ - if (!collection.isEmpty()) { - entityplayer.playerConnection.sendPacket(new PacketPlayOutUpdateAttributes(this.tracker.getId(), collection)); - } -@@ -319,6 +385,11 @@ - } - } - -+ // CraftBukkit start - Fix for nonsensical head yaw -+ this.i = MathHelper.d(this.tracker.getHeadRotation() * 256.0F / 360.0F); -+ this.broadcast(new PacketPlayOutEntityHeadRotation(this.tracker, (byte) i)); -+ // CraftBukkit end -+ - if (this.tracker instanceof EntityLiving) { - EntityLiving entityliving = (EntityLiving) this.tracker; - Iterator iterator = entityliving.getEffects().iterator(); -@@ -339,8 +410,10 @@ - } - - public boolean c(EntityPlayer entityplayer) { -- double d0 = entityplayer.locX - (double) (this.xLoc / 32); -- double d1 = entityplayer.locZ - (double) (this.zLoc / 32); -+ // CraftBukkit start - this.*Loc / 30 -> this.tracker.loc* -+ double d0 = entityplayer.locX - this.tracker.locX; -+ double d1 = entityplayer.locZ - this.tracker.locZ; -+ // CraftBukkit end - - return d0 >= (double) (-this.b) && d0 <= (double) this.b && d1 >= (double) (-this.b) && d1 <= (double) this.b && this.tracker.a(entityplayer); - } -@@ -358,7 +431,10 @@ - - private Packet c() { - if (this.tracker.dead) { -- EntityTrackerEntry.p.warn("Fetching addPacket for removed entity"); -+ // CraftBukkit start - Remove useless error spam, just return -+ // EntityTrackerEntry.p.warn("Fetching addPacket for removed entity"); -+ return null; -+ // CraftBukkit end - } - - if (this.tracker instanceof EntityItem) { diff --git a/TacoSpigot-Server/nms-patches/EntityVillager.patch b/TacoSpigot-Server/nms-patches/EntityVillager.patch deleted file mode 100644 index 93c1439..0000000 --- a/TacoSpigot-Server/nms-patches/EntityVillager.patch +++ /dev/null @@ -1,19 +0,0 @@ ---- a/net/minecraft/server/EntityVillager.java -+++ b/net/minecraft/server/EntityVillager.java -@@ -2,6 +2,7 @@ - - import java.util.Iterator; - import java.util.Random; -+import org.bukkit.craftbukkit.entity.CraftVillager; // CraftBukkit - - public class EntityVillager extends EntityAgeable implements IMerchant, NPC { - -@@ -29,7 +30,7 @@ - - public EntityVillager(World world, int i) { - super(world); -- this.inventory = new InventorySubcontainer("Items", false, 8); -+ this.inventory = new InventorySubcontainer("Items", false, 8, (CraftVillager) this.getBukkitEntity()); // CraftBukkit add argument - this.setProfession(i); - this.setSize(0.6F, 1.8F); - ((Navigation) this.getNavigation()).b(true); diff --git a/TacoSpigot-Server/nms-patches/EntityWither.patch b/TacoSpigot-Server/nms-patches/EntityWither.patch deleted file mode 100644 index ec2eb5d..0000000 --- a/TacoSpigot-Server/nms-patches/EntityWither.patch +++ /dev/null @@ -1,78 +0,0 @@ ---- a/net/minecraft/server/EntityWither.java -+++ b/net/minecraft/server/EntityWither.java -@@ -5,6 +5,12 @@ - import java.util.Iterator; - import java.util.List; - -+// CraftBukkit start -+import org.bukkit.craftbukkit.event.CraftEventFactory; -+import org.bukkit.event.entity.EntityRegainHealthEvent; -+import org.bukkit.event.entity.ExplosionPrimeEvent; -+// CraftBukkit end -+ - public class EntityWither extends EntityMonster implements IRangedEntity { - - private float[] a = new float[2]; -@@ -168,13 +174,38 @@ - if (this.cl() > 0) { - i = this.cl() - 1; - if (i <= 0) { -- this.world.createExplosion(this, this.locX, this.locY + (double) this.getHeadHeight(), this.locZ, 7.0F, false, this.world.getGameRules().getBoolean("mobGriefing")); -- this.world.a(1013, new BlockPosition(this), 0); -+ // CraftBukkit start -+ // this.world.createExplosion(this, this.locX, this.locY + (double) this.getHeadHeight(), this.locZ, 7.0F, false, this.world.getGameRules().getBoolean("mobGriefing")); -+ ExplosionPrimeEvent event = new ExplosionPrimeEvent(this.getBukkitEntity(), 7.0F, false); -+ this.world.getServer().getPluginManager().callEvent(event); -+ -+ if (!event.isCancelled()) { -+ this.world.createExplosion(this, this.locX, this.locY + (double) this.getHeadHeight(), this.locZ, event.getRadius(), event.getFire(), this.world.getGameRules().getBoolean("mobGriefing")); -+ } -+ // CraftBukkit end -+ -+ // CraftBukkit start - Use relative location for far away sounds -+ // this.world.a(1013, new BlockPosition(this), 0); -+ int viewDistance = ((WorldServer) this.world).getServer().getViewDistance() * 16; -+ for (EntityPlayer player : (List) MinecraftServer.getServer().getPlayerList().players) { -+ double deltaX = this.locX - player.locX; -+ double deltaZ = this.locZ - player.locZ; -+ double distanceSquared = deltaX * deltaX + deltaZ * deltaZ; -+ if (distanceSquared > viewDistance * viewDistance) { -+ double deltaLength = Math.sqrt(distanceSquared); -+ double relativeX = player.locX + (deltaX / deltaLength) * viewDistance; -+ double relativeZ = player.locZ + (deltaZ / deltaLength) * viewDistance; -+ player.playerConnection.sendPacket(new PacketPlayOutWorldEvent(1013, new BlockPosition((int) relativeX, (int) this.locY, (int) relativeZ), 0, true)); -+ } else { -+ player.playerConnection.sendPacket(new PacketPlayOutWorldEvent(1013, new BlockPosition((int) this.locX, (int) this.locY, (int) this.locZ), 0, true)); -+ } -+ } -+ // CraftBukkit end - } - - this.r(i); - if (this.ticksLived % 10 == 0) { -- this.heal(10.0F); -+ this.heal(10.0F, EntityRegainHealthEvent.RegainReason.WITHER_SPAWN); // CraftBukkit - } - - } else { -@@ -264,6 +295,11 @@ - Block block = this.world.getType(blockposition).getBlock(); - - if (block.getMaterial() != Material.AIR && a(block)) { -+ // CraftBukkit start -+ if (CraftEventFactory.callEntityChangeBlockEvent(this, j2, k2, l2, Blocks.AIR, 0).isCancelled()) { -+ continue; -+ } -+ // CraftBukkit end - flag = this.world.setAir(blockposition, true) || flag; - } - } -@@ -277,7 +313,7 @@ - } - - if (this.ticksLived % 20 == 0) { -- this.heal(1.0F); -+ this.heal(1.0F, EntityRegainHealthEvent.RegainReason.REGEN); // CraftBukkit - } - - } diff --git a/TacoSpigot-Server/nms-patches/EntityWitherSkull.patch b/TacoSpigot-Server/nms-patches/EntityWitherSkull.patch deleted file mode 100644 index 119a1b9..0000000 --- a/TacoSpigot-Server/nms-patches/EntityWitherSkull.patch +++ /dev/null @@ -1,39 +0,0 @@ ---- a/net/minecraft/server/EntityWitherSkull.java -+++ b/net/minecraft/server/EntityWitherSkull.java -@@ -1,5 +1,7 @@ - package net.minecraft.server; - -+import org.bukkit.event.entity.ExplosionPrimeEvent; // CraftBukkit -+ - public class EntityWitherSkull extends EntityFireball { - - public EntityWitherSkull(World world) { -@@ -35,9 +37,9 @@ - if (!this.world.isClientSide) { - if (movingobjectposition.entity != null) { - if (this.shooter != null) { -- if (movingobjectposition.entity.damageEntity(DamageSource.mobAttack(this.shooter), 8.0F)) { -+ if (movingobjectposition.entity.damageEntity(DamageSource.projectile(this, shooter), 8.0F)) { // CraftBukkit - if (!movingobjectposition.entity.isAlive()) { -- this.shooter.heal(5.0F); -+ this.shooter.heal(5.0F, org.bukkit.event.entity.EntityRegainHealthEvent.RegainReason.WITHER); // CraftBukkit - } else { - this.a(this.shooter, movingobjectposition.entity); - } -@@ -61,7 +63,15 @@ - } - } - -- this.world.createExplosion(this, this.locX, this.locY, this.locZ, 1.0F, false, this.world.getGameRules().getBoolean("mobGriefing")); -+ // CraftBukkit start -+ // this.world.createExplosion(this, this.locX, this.locY, this.locZ, 1.0F, false, this.world.getGameRules().getBoolean("mobGriefing")); -+ ExplosionPrimeEvent event = new ExplosionPrimeEvent(this.getBukkitEntity(), 1.0F, false); -+ this.world.getServer().getPluginManager().callEvent(event); -+ -+ if (!event.isCancelled()) { -+ this.world.createExplosion(this, this.locX, this.locY, this.locZ, event.getRadius(), event.getFire(), this.world.getGameRules().getBoolean("mobGriefing")); -+ } -+ // CraftBukkit end - this.die(); - } - diff --git a/TacoSpigot-Server/nms-patches/EntityWolf.patch b/TacoSpigot-Server/nms-patches/EntityWolf.patch deleted file mode 100644 index d240d76..0000000 --- a/TacoSpigot-Server/nms-patches/EntityWolf.patch +++ /dev/null @@ -1,97 +0,0 @@ ---- a/net/minecraft/server/EntityWolf.java -+++ b/net/minecraft/server/EntityWolf.java -@@ -2,6 +2,11 @@ - - import com.google.common.base.Predicate; - -+// CraftBukkit start -+import org.bukkit.craftbukkit.event.CraftEventFactory; -+import org.bukkit.event.entity.EntityTargetEvent.TargetReason; -+// CraftBukkit end -+ - public class EntityWolf extends EntityTameableAnimal { - - private float bo; -@@ -64,6 +69,18 @@ - - } - -+ // CraftBukkit - add overriden version -+ @Override -+ public void setGoalTarget(EntityLiving entityliving, org.bukkit.event.entity.EntityTargetEvent.TargetReason reason, boolean fire) { -+ super.setGoalTarget(entityliving, reason, fire); -+ if (entityliving == null) { -+ this.setAngry(false); -+ } else if (!this.isTamed()) { -+ this.setAngry(true); -+ } -+ } -+ // CraftBukkit end -+ - protected void E() { - this.datawatcher.watch(18, Float.valueOf(this.getHealth())); - } -@@ -95,7 +112,8 @@ - } - - protected String z() { -- return this.isAngry() ? "mob.wolf.growl" : (this.random.nextInt(3) == 0 ? (this.isTamed() && this.datawatcher.getFloat(18) < 10.0F ? "mob.wolf.whine" : "mob.wolf.panting") : "mob.wolf.bark"); -+ // CraftBukkit - (getFloat(18) < 10) -> (getFloat(18) < this.getMaxHealth() / 2) -+ return this.isAngry() ? "mob.wolf.growl" : (this.random.nextInt(3) == 0 ? (this.isTamed() && this.datawatcher.getFloat(18) < this.getMaxHealth() / 2 ? "mob.wolf.whine" : "mob.wolf.panting") : "mob.wolf.bark"); - } - - protected String bo() { -@@ -186,7 +204,8 @@ - } else { - Entity entity = damagesource.getEntity(); - -- this.bm.setSitting(false); -+ // CraftBukkit - moved into EntityLiving.d(DamageSource, float) -+ // this.bm.setSitting(false); - if (entity != null && !(entity instanceof EntityHuman) && !(entity instanceof EntityArrow)) { - f = (f + 1.0F) / 2.0F; - } -@@ -229,7 +248,7 @@ - --itemstack.count; - } - -- this.heal((float) itemfood.getNutrition(itemstack)); -+ this.heal((float) itemfood.getNutrition(itemstack), org.bukkit.event.entity.EntityRegainHealthEvent.RegainReason.EATING); // CraftBukkit - if (itemstack.count <= 0) { - entityhuman.inventory.setItem(entityhuman.inventory.itemInHandIndex, (ItemStack) null); - } -@@ -254,7 +273,7 @@ - this.bm.setSitting(!this.isSitting()); - this.aY = false; - this.navigation.n(); -- this.setGoalTarget((EntityLiving) null); -+ this.setGoalTarget((EntityLiving) null, TargetReason.FORGOT_TARGET, true); // CraftBukkit - reason - } - } else if (itemstack != null && itemstack.getItem() == Items.BONE && !this.isAngry()) { - if (!entityhuman.abilities.canInstantlyBuild) { -@@ -266,12 +285,13 @@ - } - - if (!this.world.isClientSide) { -- if (this.random.nextInt(3) == 0) { -+ // CraftBukkit - added event call and isCancelled check. -+ if (this.random.nextInt(3) == 0 && !CraftEventFactory.callEntityTameEvent(this, entityhuman).isCancelled()) { - this.setTamed(true); - this.navigation.n(); -- this.setGoalTarget((EntityLiving) null); -+ this.setGoalTarget((EntityLiving) null, TargetReason.FORGOT_TARGET, true); - this.bm.setSitting(true); -- this.setHealth(20.0F); -+ this.setHealth(this.getMaxHealth()); // CraftBukkit - 20.0 -> getMaxHealth() - this.setOwnerUUID(entityhuman.getUniqueID().toString()); - this.l(true); - this.world.broadcastEntityEffect(this, (byte) 7); -@@ -358,7 +378,7 @@ - } - - protected boolean isTypeNotPersistent() { -- return !this.isTamed() && this.ticksLived > 2400; -+ return !this.isTamed() /*&& this.ticksLived > 2400*/; // CraftBukkit - } - - public boolean a(EntityLiving entityliving, EntityLiving entityliving1) { diff --git a/TacoSpigot-Server/nms-patches/EntityZombie.patch b/TacoSpigot-Server/nms-patches/EntityZombie.patch deleted file mode 100644 index 81e4231..0000000 --- a/TacoSpigot-Server/nms-patches/EntityZombie.patch +++ /dev/null @@ -1,136 +0,0 @@ ---- a/net/minecraft/server/EntityZombie.java -+++ b/net/minecraft/server/EntityZombie.java -@@ -4,6 +4,14 @@ - import java.util.List; - import java.util.UUID; - -+//CraftBukkit start -+import org.bukkit.craftbukkit.entity.CraftLivingEntity; -+import org.bukkit.event.entity.CreatureSpawnEvent; -+import org.bukkit.event.entity.EntityCombustByEntityEvent; -+import org.bukkit.event.entity.EntityCombustEvent; -+import org.bukkit.event.entity.EntityTargetEvent; -+//CraftBukkit end -+ - public class EntityZombie extends EntityMonster { - - protected static final IAttribute a = (new AttributeRanged((IAttribute) null, "zombie.spawnReinforcements", 0.0D, 0.0D, 1.0D)).a("Spawn Reinforcements Chance"); -@@ -14,6 +22,7 @@ - private boolean bo = false; - private float bp = -1.0F; - private float bq; -+ private int lastTick = MinecraftServer.currentTick; // CraftBukkit - add field - - public EntityZombie(World world) { - super(world); -@@ -135,7 +144,14 @@ - } - - if (flag) { -- this.setOnFire(8); -+ // CraftBukkit start -+ EntityCombustEvent event = new EntityCombustEvent(this.getBukkitEntity(), 8); -+ this.world.getServer().getPluginManager().callEvent(event); -+ -+ if (!event.isCancelled()) { -+ this.setOnFire(event.getDuration()); -+ } -+ // CraftBukkit end - } - } - } -@@ -169,8 +185,8 @@ - if (World.a((IBlockAccess) this.world, new BlockPosition(i1, j1 - 1, k1)) && this.world.getLightLevel(new BlockPosition(i1, j1, k1)) < 10) { - entityzombie.setPosition((double) i1, (double) j1, (double) k1); - if (!this.world.isPlayerNearby((double) i1, (double) j1, (double) k1, 7.0D) && this.world.a(entityzombie.getBoundingBox(), (Entity) entityzombie) && this.world.getCubes(entityzombie, entityzombie.getBoundingBox()).isEmpty() && !this.world.containsLiquid(entityzombie.getBoundingBox())) { -- this.world.addEntity(entityzombie); -- entityzombie.setGoalTarget(entityliving); -+ this.world.addEntity(entityzombie, CreatureSpawnEvent.SpawnReason.REINFORCEMENTS); // CraftBukkit -+ entityzombie.setGoalTarget(entityliving, EntityTargetEvent.TargetReason.REINFORCEMENT_TARGET, true); - entityzombie.prepare(this.world.E(new BlockPosition(entityzombie)), (GroupDataEntity) null); - this.getAttributeInstance(EntityZombie.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)); -@@ -190,6 +206,12 @@ - if (!this.world.isClientSide && this.cp()) { - int i = this.cr(); - -+ // CraftBukkit start - Use wall time instead of ticks for villager conversion -+ int elapsedTicks = MinecraftServer.currentTick - this.lastTick; -+ this.lastTick = MinecraftServer.currentTick; -+ i *= elapsedTicks; -+ // CraftBukkit end -+ - this.bn -= i; - if (this.bn <= 0) { - this.cq(); -@@ -206,7 +228,14 @@ - int i = this.world.getDifficulty().a(); - - if (this.bA() == null && this.isBurning() && this.random.nextFloat() < (float) i * 0.3F) { -- entity.setOnFire(2 * i); -+ // CraftBukkit start -+ EntityCombustByEntityEvent event = new EntityCombustByEntityEvent(this.getBukkitEntity(), entity.getBukkitEntity(), 2 * i); -+ this.world.getServer().getPluginManager().callEvent(event); -+ -+ if (!event.isCancelled()) { -+ entity.setOnFire(event.getDuration()); -+ } -+ // CraftBukkit end - } - } - -@@ -322,7 +351,7 @@ - entityzombie.setCustomNameVisible(entityinsentient.getCustomNameVisible()); - } - -- this.world.addEntity(entityzombie); -+ this.world.addEntity(entityzombie, CreatureSpawnEvent.SpawnReason.INFECTION); // CraftBukkit - add SpawnReason - this.world.a((EntityHuman) null, 1016, new BlockPosition((int) this.locX, (int) this.locY, (int) this.locZ), 0); - } - -@@ -375,7 +404,7 @@ - entitychicken1.setPositionRotation(this.locX, this.locY, this.locZ, this.yaw, 0.0F); - entitychicken1.prepare(difficultydamagescaler, (GroupDataEntity) null); - entitychicken1.l(true); -- this.world.addEntity(entitychicken1); -+ this.world.addEntity(entitychicken1, CreatureSpawnEvent.SpawnReason.MOUNT); - this.mount(entitychicken1); - } - } -@@ -464,7 +493,7 @@ - entityvillager.setCustomNameVisible(this.getCustomNameVisible()); - } - -- this.world.addEntity(entityvillager); -+ this.world.addEntity(entityvillager, CreatureSpawnEvent.SpawnReason.CURED); // CraftBukkit - add SpawnReason - entityvillager.addEffect(new MobEffect(MobEffectList.CONFUSION.id, 200, 0)); - this.world.a((EntityHuman) null, 1017, new BlockPosition((int) this.locX, (int) this.locY, (int) this.locZ), 0); - } -@@ -500,7 +529,7 @@ - this.a(flag ? 0.5F : 1.0F); - } - -- protected final void setSize(float f, float f1) { -+ public final void setSize(float f, float f1) { // CraftBukkit - public - boolean flag = this.bp > 0.0F && this.bq > 0.0F; - - this.bp = f; -@@ -520,12 +549,16 @@ - } - - public void die(DamageSource damagesource) { -- super.die(damagesource); -+ // super.die(damagesource); // CraftBukkit - if (damagesource.getEntity() instanceof EntityCreeper && !(this instanceof EntityPigZombie) && ((EntityCreeper) damagesource.getEntity()).isPowered() && ((EntityCreeper) damagesource.getEntity()).cp()) { - ((EntityCreeper) damagesource.getEntity()).cq(); -- this.a(new ItemStack(Items.SKULL, 1, 2), 0.0F); -+ // CraftBukkit start -+ // this.a(new ItemStack(Items.SKULL, 1, 2), 0.0F); -+ headDrop = new ItemStack(Items.SKULL, 1, 2); -+ // CraftBukkit end - } - -+ super.die(damagesource); // CraftBukkit - moved from above - } - - static class SyntheticClass_1 { } diff --git a/TacoSpigot-Server/nms-patches/ExpirableListEntry.patch b/TacoSpigot-Server/nms-patches/ExpirableListEntry.patch deleted file mode 100644 index aa81c82..0000000 --- a/TacoSpigot-Server/nms-patches/ExpirableListEntry.patch +++ /dev/null @@ -1,42 +0,0 @@ ---- a/net/minecraft/server/ExpirableListEntry.java -+++ b/net/minecraft/server/ExpirableListEntry.java -@@ -22,7 +22,7 @@ - } - - protected ExpirableListEntry(T t0, JsonObject jsonobject) { -- super(t0, jsonobject); -+ super(checkExpiry(t0, jsonobject), jsonobject); - - Date date; - -@@ -65,4 +65,30 @@ - jsonobject.addProperty("expires", this.d == null ? "forever" : ExpirableListEntry.a.format(this.d)); - jsonobject.addProperty("reason", this.e); - } -+ -+ // CraftBukkit start -+ public String getSource() { -+ return this.c; -+ } -+ -+ public Date getCreated() { -+ return this.b; -+ } -+ -+ private static T checkExpiry(T object, JsonObject jsonobject) { -+ Date expires = null; -+ -+ try { -+ expires = jsonobject.has("expires") ? a.parse(jsonobject.get("expires").getAsString()) : null; -+ } catch (ParseException ex) { -+ // Guess we don't have a date -+ } -+ -+ if (expires == null || expires.after(new Date())) { -+ return object; -+ } else { -+ return null; -+ } -+ } -+ // CraftBukkit end - } diff --git a/TacoSpigot-Server/nms-patches/Explosion.patch b/TacoSpigot-Server/nms-patches/Explosion.patch deleted file mode 100644 index 5ee04c6..0000000 --- a/TacoSpigot-Server/nms-patches/Explosion.patch +++ /dev/null @@ -1,153 +0,0 @@ ---- a/net/minecraft/server/Explosion.java -+++ b/net/minecraft/server/Explosion.java -@@ -9,6 +9,13 @@ - import java.util.Map; - import java.util.Random; - -+// CraftBukkit start -+import org.bukkit.craftbukkit.event.CraftEventFactory; -+import org.bukkit.event.entity.EntityExplodeEvent; -+import org.bukkit.Location; -+import org.bukkit.event.block.BlockExplodeEvent; -+// CraftBukkit end -+ - public class Explosion { - - private final boolean a; -@@ -22,11 +29,12 @@ - private final float size; - private final List blocks = Lists.newArrayList(); - private final Map k = Maps.newHashMap(); -+ public boolean wasCanceled = false; // CraftBukkit - add field - - public Explosion(World world, Entity entity, double d0, double d1, double d2, float f, boolean flag, boolean flag1) { - this.world = world; - this.source = entity; -- this.size = f; -+ this.size = (float) Math.max(f, 0.0); // CraftBukkit - clamp bad values - this.posX = d0; - this.posY = d1; - this.posZ = d2; -@@ -35,6 +43,11 @@ - } - - public void a() { -+ // CraftBukkit start -+ if (this.size < 0.1F) { -+ return; -+ } -+ // CraftBukkit end - HashSet hashset = Sets.newHashSet(); - boolean flag = true; - -@@ -68,7 +81,7 @@ - f -= (f2 + 0.3F) * 0.3F; - } - -- if (f > 0.0F && (this.source == null || this.source.a(this, this.world, blockposition, iblockdata, f))) { -+ if (f > 0.0F && (this.source == null || this.source.a(this, this.world, blockposition, iblockdata, f)) && blockposition.getY() < 256 && blockposition.getY() >= 0) { // CraftBukkit - don't wrap explosions - hashset.add(blockposition); - } - -@@ -112,7 +125,15 @@ - double d12 = (double) this.world.a(vec3d, entity.getBoundingBox()); - double d13 = (1.0D - d7) * d12; - -- entity.damageEntity(DamageSource.explosion(this), (float) ((int) ((d13 * d13 + d13) / 2.0D * 8.0D * (double) f3 + 1.0D))); -+ // entity.damageEntity(DamageSource.explosion(this), (float) ((int) ((d13 * d13 + d13) / 2.0D * 8.0D * (double) f3 + 1.0D)));+ // CraftBukkit start -+ CraftEventFactory.entityDamage = source; -+ entity.forceExplosionKnockback = false; -+ boolean wasDamaged = entity.damageEntity(DamageSource.explosion(this), (float) ((int) ((d13 * d13 + d13) / 2.0D * 8.0D * (double) f3 + 1.0D))); -+ CraftEventFactory.entityDamage = null; -+ if (!wasDamaged && !(entity instanceof EntityTNTPrimed || entity instanceof EntityFallingBlock) && !entity.forceExplosionKnockback) { -+ continue; -+ } -+ // CraftBukkit end - double d14 = EnchantmentProtection.a(entity, d13); - - entity.motX += d8 * d14; -@@ -140,6 +161,50 @@ - BlockPosition blockposition; - - if (this.b) { -+ // CraftBukkit start -+ org.bukkit.World bworld = this.world.getWorld(); -+ org.bukkit.entity.Entity explode = this.source == null ? null : this.source.getBukkitEntity(); -+ Location location = new Location(bworld, this.posX, this.posY, this.posZ); -+ -+ List blockList = Lists.newArrayList(); -+ for (int i1 = this.blocks.size() - 1; i1 >= 0; i1--) { -+ BlockPosition cpos = (BlockPosition) this.blocks.get(i1); -+ org.bukkit.block.Block bblock = bworld.getBlockAt(cpos.getX(), cpos.getY(), cpos.getZ()); -+ if (bblock.getType() != org.bukkit.Material.AIR) { -+ blockList.add(bblock); -+ } -+ } -+ -+ boolean cancelled; -+ List bukkitBlocks; -+ float yield; -+ -+ if (explode != null) { -+ EntityExplodeEvent event = new EntityExplodeEvent(explode, location, blockList, 0.3F); -+ this.world.getServer().getPluginManager().callEvent(event); -+ cancelled = event.isCancelled(); -+ bukkitBlocks = event.blockList(); -+ yield = event.getYield(); -+ } else { -+ BlockExplodeEvent event = new BlockExplodeEvent(location.getBlock(), blockList, 0.3F); -+ this.world.getServer().getPluginManager().callEvent(event); -+ cancelled = event.isCancelled(); -+ bukkitBlocks = event.blockList(); -+ yield = event.getYield(); -+ } -+ -+ this.blocks.clear(); -+ -+ for (org.bukkit.block.Block bblock : bukkitBlocks) { -+ BlockPosition coords = new BlockPosition(bblock.getX(), bblock.getY(), bblock.getZ()); -+ blocks.add(coords); -+ } -+ -+ if (cancelled) { -+ this.wasCanceled = true; -+ return; -+ } -+ // CraftBukkit end - iterator = this.blocks.iterator(); - - while (iterator.hasNext()) { -@@ -170,7 +235,8 @@ - - if (block.getMaterial() != Material.AIR) { - if (block.a(this)) { -- block.dropNaturally(this.world, blockposition, this.world.getType(blockposition), 1.0F / this.size, 0); -+ // CraftBukkit - add yield -+ block.dropNaturally(this.world, blockposition, this.world.getType(blockposition), yield, 0); - } - - this.world.setTypeAndData(blockposition, Blocks.AIR.getBlockData(), 3); -@@ -185,7 +251,11 @@ - while (iterator.hasNext()) { - blockposition = (BlockPosition) iterator.next(); - if (this.world.getType(blockposition).getBlock().getMaterial() == Material.AIR && this.world.getType(blockposition.down()).getBlock().o() && 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()) { -+ this.world.setTypeUpdate(blockposition, Blocks.FIRE.getBlockData()); -+ } -+ // CraftBukkit end - } - } - } -@@ -197,7 +267,9 @@ - } - - public EntityLiving getSource() { -- return this.source == null ? null : (this.source instanceof EntityTNTPrimed ? ((EntityTNTPrimed) this.source).getSource() : (this.source instanceof EntityLiving ? (EntityLiving) this.source : null)); -+ // CraftBukkit start - obtain Fireball shooter for explosion tracking -+ return this.source == null ? null : (this.source instanceof EntityTNTPrimed ? ((EntityTNTPrimed) this.source).getSource() : (this.source instanceof EntityLiving ? (EntityLiving) this.source : (this.source instanceof EntityFireball ? ((EntityFireball) this.source).shooter : null))); -+ // CraftBukkit end - } - - public void clearBlocks() { diff --git a/TacoSpigot-Server/nms-patches/FoodMetaData.patch b/TacoSpigot-Server/nms-patches/FoodMetaData.patch deleted file mode 100644 index aaeab26..0000000 --- a/TacoSpigot-Server/nms-patches/FoodMetaData.patch +++ /dev/null @@ -1,66 +0,0 @@ ---- a/net/minecraft/server/FoodMetaData.java -+++ b/net/minecraft/server/FoodMetaData.java -@@ -6,9 +6,17 @@ - public float saturationLevel = 5.0F; - public float exhaustionLevel; - private int foodTickTimer; -+ private EntityHuman entityhuman; // CraftBukkit - private int e = 20; - -- public FoodMetaData() {} -+ public FoodMetaData() { throw new AssertionError("Whoopsie, we missed the bukkit."); } // CraftBukkit start - throw an error -+ -+ // CraftBukkit start - added EntityHuman constructor -+ public FoodMetaData(EntityHuman entityhuman) { -+ org.apache.commons.lang.Validate.notNull(entityhuman); -+ this.entityhuman = entityhuman; -+ } -+ // CraftBukkit end - - public void eat(int i, float f) { - this.foodLevel = Math.min(i + this.foodLevel, 20); -@@ -16,7 +24,17 @@ - } - - public void a(ItemFood itemfood, ItemStack itemstack) { -- this.eat(itemfood.getNutrition(itemstack), itemfood.getSaturationModifier(itemstack)); -+ // CraftBukkit start -+ int oldFoodLevel = foodLevel; -+ -+ org.bukkit.event.entity.FoodLevelChangeEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callFoodLevelChangeEvent(entityhuman, itemfood.getNutrition(itemstack) + oldFoodLevel); -+ -+ if (!event.isCancelled()) { -+ this.eat(event.getFoodLevel() - oldFoodLevel, itemfood.getSaturationModifier(itemstack)); -+ } -+ -+ ((EntityPlayer) entityhuman).playerConnection.sendPacket(new PacketPlayOutUpdateHealth(((EntityPlayer) entityhuman).getBukkitEntity().getScaledHealth(), entityhuman.getFoodData().foodLevel, entityhuman.getFoodData().saturationLevel)); -+ // CraftBukkit end - } - - public void a(EntityHuman entityhuman) { -@@ -28,14 +46,23 @@ - if (this.saturationLevel > 0.0F) { - this.saturationLevel = Math.max(this.saturationLevel - 1.0F, 0.0F); - } else if (enumdifficulty != EnumDifficulty.PEACEFUL) { -- this.foodLevel = Math.max(this.foodLevel - 1, 0); -+ // CraftBukkit start -+ org.bukkit.event.entity.FoodLevelChangeEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callFoodLevelChangeEvent(entityhuman, Math.max(this.foodLevel - 1, 0)); -+ -+ if (!event.isCancelled()) { -+ this.foodLevel = event.getFoodLevel(); -+ } -+ -+ ((EntityPlayer) entityhuman).playerConnection.sendPacket(new PacketPlayOutUpdateHealth(((EntityPlayer) entityhuman).getBukkitEntity().getScaledHealth(), this.foodLevel, this.saturationLevel)); -+ // CraftBukkit end - } - } - - if (entityhuman.world.getGameRules().getBoolean("naturalRegeneration") && this.foodLevel >= 18 && entityhuman.cm()) { - ++this.foodTickTimer; - if (this.foodTickTimer >= 80) { -- entityhuman.heal(1.0F); -+ // CraftBukkit - added RegainReason -+ entityhuman.heal(1.0F, org.bukkit.event.entity.EntityRegainHealthEvent.RegainReason.SATIATED); - this.a(3.0F); - this.foodTickTimer = 0; - } diff --git a/TacoSpigot-Server/nms-patches/HandshakeListener.patch b/TacoSpigot-Server/nms-patches/HandshakeListener.patch deleted file mode 100644 index a30ece5..0000000 --- a/TacoSpigot-Server/nms-patches/HandshakeListener.patch +++ /dev/null @@ -1,70 +0,0 @@ ---- a/net/minecraft/server/HandshakeListener.java -+++ b/net/minecraft/server/HandshakeListener.java -@@ -1,7 +1,17 @@ - package net.minecraft.server; - -+// CraftBukkit start -+import java.net.InetAddress; -+import java.util.HashMap; -+// CraftBukkit end -+ - public class HandshakeListener implements PacketHandshakingInListener { - -+ // CraftBukkit start - add fields -+ private static final HashMap throttleTracker = new HashMap(); -+ private static int throttleCounter = 0; -+ // CraftBukkit end -+ - private final MinecraftServer a; - private final NetworkManager b; - -@@ -16,6 +26,41 @@ - this.b.a(EnumProtocol.LOGIN); - ChatComponentText chatcomponenttext; - -+ // CraftBukkit start - Connection throttle -+ try { -+ long currentTime = System.currentTimeMillis(); -+ long connectionThrottle = MinecraftServer.getServer().server.getConnectionThrottle(); -+ InetAddress address = ((java.net.InetSocketAddress) this.b.getSocketAddress()).getAddress(); -+ -+ synchronized (throttleTracker) { -+ if (throttleTracker.containsKey(address) && !"127.0.0.1".equals(address.getHostAddress()) && currentTime - throttleTracker.get(address) < connectionThrottle) { -+ throttleTracker.put(address, currentTime); -+ chatcomponenttext = new ChatComponentText("Connection throttled! Please wait before reconnecting."); -+ this.b.handle(new PacketLoginOutDisconnect(chatcomponenttext)); -+ this.b.close(chatcomponenttext); -+ return; -+ } -+ -+ throttleTracker.put(address, currentTime); -+ throttleCounter++; -+ if (throttleCounter > 200) { -+ throttleCounter = 0; -+ -+ // Cleanup stale entries -+ java.util.Iterator iter = throttleTracker.entrySet().iterator(); -+ while (iter.hasNext()) { -+ java.util.Map.Entry entry = (java.util.Map.Entry) iter.next(); -+ if (entry.getValue() > connectionThrottle) { -+ iter.remove(); -+ } -+ } -+ } -+ } -+ } catch (Throwable t) { -+ org.apache.logging.log4j.LogManager.getLogger().debug("Failed to check connection throttle", t); -+ } -+ // CraftBukkit end -+ - if (packethandshakinginsetprotocol.b() > 47) { - chatcomponenttext = new ChatComponentText("Outdated server! I\'m still on 1.8.8"); - this.b.handle(new PacketLoginOutDisconnect(chatcomponenttext)); -@@ -26,6 +71,7 @@ - this.b.close(chatcomponenttext); - } else { - this.b.a((PacketListener) (new LoginListener(this.a, this.b))); -+ ((LoginListener) this.b.getPacketListener()).hostname = packethandshakinginsetprotocol.hostname + ":" + packethandshakinginsetprotocol.port; // CraftBukkit - set hostname - } - break; - diff --git a/TacoSpigot-Server/nms-patches/IDataManager.patch b/TacoSpigot-Server/nms-patches/IDataManager.patch deleted file mode 100644 index fb0b95c..0000000 --- a/TacoSpigot-Server/nms-patches/IDataManager.patch +++ /dev/null @@ -1,9 +0,0 @@ ---- a/net/minecraft/server/IDataManager.java -+++ b/net/minecraft/server/IDataManager.java -@@ -23,4 +23,6 @@ - File getDataFile(String s); - - String g(); -+ -+ java.util.UUID getUUID(); // CraftBukkit - } diff --git a/TacoSpigot-Server/nms-patches/IInventory.patch b/TacoSpigot-Server/nms-patches/IInventory.patch deleted file mode 100644 index 9b2c12b..0000000 --- a/TacoSpigot-Server/nms-patches/IInventory.patch +++ /dev/null @@ -1,31 +0,0 @@ ---- a/net/minecraft/server/IInventory.java -+++ b/net/minecraft/server/IInventory.java -@@ -1,5 +1,7 @@ - package net.minecraft.server; - -+import org.bukkit.craftbukkit.entity.CraftHumanEntity; // CraftBukkit -+ - public interface IInventory extends INamableTileEntity { - - int getSize(); -@@ -31,4 +33,20 @@ - int g(); - - void l(); -+ -+ // CraftBukkit start -+ ItemStack[] getContents(); -+ -+ void onOpen(CraftHumanEntity who); -+ -+ void onClose(CraftHumanEntity who); -+ -+ java.util.List getViewers(); -+ -+ org.bukkit.inventory.InventoryHolder getOwner(); -+ -+ void setMaxStackSize(int size); -+ -+ int MAX_STACK = 64; -+ // CraftBukkit end - } diff --git a/TacoSpigot-Server/nms-patches/IRecipe.patch b/TacoSpigot-Server/nms-patches/IRecipe.patch deleted file mode 100644 index 68aab81..0000000 --- a/TacoSpigot-Server/nms-patches/IRecipe.patch +++ /dev/null @@ -1,9 +0,0 @@ ---- a/net/minecraft/server/IRecipe.java -+++ b/net/minecraft/server/IRecipe.java -@@ -11,4 +11,6 @@ - ItemStack b(); - - ItemStack[] b(InventoryCrafting inventorycrafting); -+ -+ org.bukkit.inventory.Recipe toBukkitRecipe(); // CraftBukkit - } diff --git a/TacoSpigot-Server/nms-patches/InventoryCraftResult.patch b/TacoSpigot-Server/nms-patches/InventoryCraftResult.patch deleted file mode 100644 index de8cd9a..0000000 --- a/TacoSpigot-Server/nms-patches/InventoryCraftResult.patch +++ /dev/null @@ -1,49 +0,0 @@ ---- a/net/minecraft/server/InventoryCraftResult.java -+++ b/net/minecraft/server/InventoryCraftResult.java -@@ -1,9 +1,37 @@ - package net.minecraft.server; - -+// CraftBukkit start -+import org.bukkit.craftbukkit.entity.CraftHumanEntity; -+import org.bukkit.entity.HumanEntity; -+// CraftBukkit end -+ - public class InventoryCraftResult implements IInventory { - - private ItemStack[] items = new ItemStack[1]; - -+ // CraftBukkit start -+ private int maxStack = MAX_STACK; -+ -+ public ItemStack[] getContents() { -+ return this.items; -+ } -+ -+ public org.bukkit.inventory.InventoryHolder getOwner() { -+ return null; // Result slots don't get an owner -+ } -+ -+ // Don't need a transaction; the InventoryCrafting keeps track of it for us -+ public void onOpen(CraftHumanEntity who) {} -+ public void onClose(CraftHumanEntity who) {} -+ public java.util.List getViewers() { -+ return new java.util.ArrayList(); -+ } -+ -+ public void setMaxStackSize(int size) { -+ maxStack = size; -+ } -+ // CraftBukkit end -+ - public InventoryCraftResult() {} - - public int getSize() { -@@ -53,7 +81,7 @@ - } - - public int getMaxStackSize() { -- return 64; -+ return maxStack; // CraftBukkit - } - - public void update() {} diff --git a/TacoSpigot-Server/nms-patches/InventoryCrafting.patch b/TacoSpigot-Server/nms-patches/InventoryCrafting.patch deleted file mode 100644 index 59e32a2..0000000 --- a/TacoSpigot-Server/nms-patches/InventoryCrafting.patch +++ /dev/null @@ -1,65 +0,0 @@ ---- a/net/minecraft/server/InventoryCrafting.java -+++ b/net/minecraft/server/InventoryCrafting.java -@@ -1,5 +1,13 @@ - package net.minecraft.server; - -+// CraftBukkit start -+import java.util.List; -+ -+import org.bukkit.craftbukkit.entity.CraftHumanEntity; -+import org.bukkit.entity.HumanEntity; -+import org.bukkit.event.inventory.InventoryType; -+// CraftBukkit end -+ - public class InventoryCrafting implements IInventory { - - private final ItemStack[] items; -@@ -7,6 +15,48 @@ - private final int c; - private final Container d; - -+ // CraftBukkit start - add fields -+ public List transaction = new java.util.ArrayList(); -+ public IRecipe currentRecipe; -+ public IInventory resultInventory; -+ private EntityHuman owner; -+ private int maxStack = MAX_STACK; -+ -+ public ItemStack[] getContents() { -+ return this.items; -+ } -+ -+ public void onOpen(CraftHumanEntity who) { -+ transaction.add(who); -+ } -+ -+ public InventoryType getInvType() { -+ return items.length == 4 ? InventoryType.CRAFTING : InventoryType.WORKBENCH; -+ } -+ -+ public void onClose(CraftHumanEntity who) { -+ transaction.remove(who); -+ } -+ -+ public List getViewers() { -+ return transaction; -+ } -+ -+ public org.bukkit.inventory.InventoryHolder getOwner() { -+ return (owner == null) ? null : owner.getBukkitEntity(); -+ } -+ -+ public void setMaxStackSize(int size) { -+ maxStack = size; -+ resultInventory.setMaxStackSize(size); -+ } -+ -+ public InventoryCrafting(Container container, int i, int j, EntityHuman player) { -+ this(container, i, j); -+ this.owner = player; -+ } -+ // CraftBukkit end -+ - public InventoryCrafting(Container container, int i, int j) { - int k = i * j; - diff --git a/TacoSpigot-Server/nms-patches/InventoryEnderChest.patch b/TacoSpigot-Server/nms-patches/InventoryEnderChest.patch deleted file mode 100644 index 26b013c..0000000 --- a/TacoSpigot-Server/nms-patches/InventoryEnderChest.patch +++ /dev/null @@ -1,52 +0,0 @@ ---- a/net/minecraft/server/InventoryEnderChest.java -+++ b/net/minecraft/server/InventoryEnderChest.java -@@ -1,9 +1,49 @@ - package net.minecraft.server; - -+// CraftBukkit start -+import java.util.List; -+import org.bukkit.craftbukkit.entity.CraftHumanEntity; -+import org.bukkit.entity.HumanEntity; -+// CraftBukkit end -+ - public class InventoryEnderChest extends InventorySubcontainer { - - private TileEntityEnderChest a; - -+ // CraftBukkit start - add fields and methods -+ public List transaction = new java.util.ArrayList(); -+ public org.bukkit.entity.Player player; -+ private int maxStack = MAX_STACK; -+ -+ public ItemStack[] getContents() { -+ return this.items; -+ } -+ -+ public void onOpen(CraftHumanEntity who) { -+ transaction.add(who); -+ } -+ -+ public void onClose(CraftHumanEntity who) { -+ transaction.remove(who); -+ } -+ -+ public List getViewers() { -+ return transaction; -+ } -+ -+ public org.bukkit.inventory.InventoryHolder getOwner() { -+ return this.player; -+ } -+ -+ public void setMaxStackSize(int size) { -+ maxStack = size; -+ } -+ -+ public int getMaxStackSize() { -+ return maxStack; -+ } -+ // CraftBukkit end -+ - public InventoryEnderChest() { - super("container.enderchest", false, 27); - } diff --git a/TacoSpigot-Server/nms-patches/InventoryHorseChest.patch b/TacoSpigot-Server/nms-patches/InventoryHorseChest.patch deleted file mode 100644 index da3394f..0000000 --- a/TacoSpigot-Server/nms-patches/InventoryHorseChest.patch +++ /dev/null @@ -1,63 +0,0 @@ ---- a/net/minecraft/server/InventoryHorseChest.java -+++ b/net/minecraft/server/InventoryHorseChest.java -@@ -1,8 +1,60 @@ - package net.minecraft.server; - -+// CraftBukkit start -+import java.util.List; -+import org.bukkit.craftbukkit.entity.CraftHumanEntity; -+import org.bukkit.entity.HumanEntity; -+// CraftBukkit end -+ - public class InventoryHorseChest extends InventorySubcontainer { - - public InventoryHorseChest(String s, int i) { - super(s, false, i); - } -+ -+ // CraftBukkit start - add fields and methods -+ public List transaction = new java.util.ArrayList(); -+ private EntityHorse horse; -+ private int maxStack = MAX_STACK; -+ -+ public InventoryHorseChest(String s, int i, EntityHorse horse) { -+ super(s, false, i, (org.bukkit.craftbukkit.entity.CraftHorse) horse.getBukkitEntity()); -+ this.horse = horse; -+ } -+ -+ @Override -+ public ItemStack[] getContents() { -+ return this.items; -+ } -+ -+ @Override -+ public void onOpen(CraftHumanEntity who) { -+ transaction.add(who); -+ } -+ -+ @Override -+ public void onClose(CraftHumanEntity who) { -+ transaction.remove(who); -+ } -+ -+ @Override -+ public List getViewers() { -+ return transaction; -+ } -+ -+ @Override -+ public org.bukkit.inventory.InventoryHolder getOwner() { -+ return (org.bukkit.entity.Horse) this.horse.getBukkitEntity(); -+ } -+ -+ @Override -+ public void setMaxStackSize(int size) { -+ maxStack = size; -+ } -+ -+ @Override -+ public int getMaxStackSize() { -+ return maxStack; -+ } -+ // CraftBukkit end - } diff --git a/TacoSpigot-Server/nms-patches/InventoryLargeChest.patch b/TacoSpigot-Server/nms-patches/InventoryLargeChest.patch deleted file mode 100644 index a23b0cf..0000000 --- a/TacoSpigot-Server/nms-patches/InventoryLargeChest.patch +++ /dev/null @@ -1,67 +0,0 @@ ---- a/net/minecraft/server/InventoryLargeChest.java -+++ b/net/minecraft/server/InventoryLargeChest.java -@@ -1,11 +1,55 @@ - package net.minecraft.server; - -+// CraftBukkit start -+import java.util.List; -+ -+import org.bukkit.craftbukkit.entity.CraftHumanEntity; -+import org.bukkit.entity.HumanEntity; -+// CraftBukkit end -+ - public class InventoryLargeChest implements ITileInventory { - - private String a; - public ITileInventory left; - public ITileInventory right; - -+ // CraftBukkit start - add fields and methods -+ public List transaction = new java.util.ArrayList(); -+ -+ public ItemStack[] getContents() { -+ ItemStack[] result = new ItemStack[this.getSize()]; -+ for (int i = 0; i < result.length; i++) { -+ result[i] = this.getItem(i); -+ } -+ return result; -+ } -+ -+ public void onOpen(CraftHumanEntity who) { -+ this.left.onOpen(who); -+ this.right.onOpen(who); -+ transaction.add(who); -+ } -+ -+ public void onClose(CraftHumanEntity who) { -+ this.left.onClose(who); -+ this.right.onClose(who); -+ transaction.remove(who); -+ } -+ -+ public List getViewers() { -+ return transaction; -+ } -+ -+ public org.bukkit.inventory.InventoryHolder getOwner() { -+ return null; // This method won't be called since CraftInventoryDoubleChest doesn't defer to here -+ } -+ -+ public void setMaxStackSize(int size) { -+ this.left.setMaxStackSize(size); -+ this.right.setMaxStackSize(size); -+ } -+ // CraftBukkit end -+ - public InventoryLargeChest(String s, ITileInventory itileinventory, ITileInventory itileinventory1) { - this.a = s; - if (itileinventory == null) { -@@ -68,7 +112,7 @@ - } - - public int getMaxStackSize() { -- return this.left.getMaxStackSize(); -+ return Math.min(this.left.getMaxStackSize(), this.right.getMaxStackSize()); // CraftBukkit - check both sides - } - - public void update() { diff --git a/TacoSpigot-Server/nms-patches/InventoryMerchant.patch b/TacoSpigot-Server/nms-patches/InventoryMerchant.patch deleted file mode 100644 index 83227eb..0000000 --- a/TacoSpigot-Server/nms-patches/InventoryMerchant.patch +++ /dev/null @@ -1,60 +0,0 @@ ---- a/net/minecraft/server/InventoryMerchant.java -+++ b/net/minecraft/server/InventoryMerchant.java -@@ -1,5 +1,12 @@ - package net.minecraft.server; - -+// CraftBukkit start -+import java.util.List; -+import org.bukkit.craftbukkit.entity.CraftHumanEntity; -+import org.bukkit.craftbukkit.entity.CraftVillager; -+import org.bukkit.entity.HumanEntity; -+// CraftBukkit end -+ - public class InventoryMerchant implements IInventory { - - private final IMerchant merchant; -@@ -8,6 +15,35 @@ - private MerchantRecipe recipe; - private int e; - -+ // CraftBukkit start - add fields and methods -+ public List transaction = new java.util.ArrayList(); -+ private int maxStack = MAX_STACK; -+ -+ public ItemStack[] getContents() { -+ return this.itemsInSlots; -+ } -+ -+ public void onOpen(CraftHumanEntity who) { -+ transaction.add(who); -+ } -+ -+ public void onClose(CraftHumanEntity who) { -+ transaction.remove(who); -+ } -+ -+ public List getViewers() { -+ return transaction; -+ } -+ -+ public void setMaxStackSize(int i) { -+ maxStack = i; -+ } -+ -+ public org.bukkit.inventory.InventoryHolder getOwner() { -+ return (CraftVillager) ((EntityVillager) this.merchant).getBukkitEntity(); -+ } -+ // CraftBukkit end -+ - public InventoryMerchant(EntityHuman entityhuman, IMerchant imerchant) { - this.player = entityhuman; - this.merchant = imerchant; -@@ -94,7 +130,7 @@ - } - - public int getMaxStackSize() { -- return 64; -+ return maxStack; // CraftBukkit - } - - public boolean a(EntityHuman entityhuman) { diff --git a/TacoSpigot-Server/nms-patches/InventorySubcontainer.patch b/TacoSpigot-Server/nms-patches/InventorySubcontainer.patch deleted file mode 100644 index 5cb5243..0000000 --- a/TacoSpigot-Server/nms-patches/InventorySubcontainer.patch +++ /dev/null @@ -1,58 +0,0 @@ ---- a/net/minecraft/server/InventorySubcontainer.java -+++ b/net/minecraft/server/InventorySubcontainer.java -@@ -3,6 +3,12 @@ - import com.google.common.collect.Lists; - import java.util.List; - -+// CraftBukkit start -+import java.util.List; -+import org.bukkit.craftbukkit.entity.CraftHumanEntity; -+import org.bukkit.entity.HumanEntity; -+// CraftBukkit end -+ - public class InventorySubcontainer implements IInventory { - - private String a; -@@ -11,7 +17,42 @@ - private List d; - private boolean e; - -+ // CraftBukkit start - add fields and methods -+ public List transaction = new java.util.ArrayList(); -+ private int maxStack = MAX_STACK; -+ protected org.bukkit.inventory.InventoryHolder bukkitOwner; -+ -+ public ItemStack[] getContents() { -+ return this.items; -+ } -+ -+ public void onOpen(CraftHumanEntity who) { -+ transaction.add(who); -+ } -+ -+ public void onClose(CraftHumanEntity who) { -+ transaction.remove(who); -+ } -+ -+ public List getViewers() { -+ return transaction; -+ } -+ -+ public void setMaxStackSize(int i) { -+ maxStack = i; -+ } -+ -+ public org.bukkit.inventory.InventoryHolder getOwner() { -+ return bukkitOwner; -+ } -+ - public InventorySubcontainer(String s, boolean flag, int i) { -+ this(s, flag, i, null); -+ } -+ -+ public InventorySubcontainer(String s, boolean flag, int i, org.bukkit.inventory.InventoryHolder owner) { // Added argument -+ this.bukkitOwner = owner; -+ // CraftBukkit end - this.a = s; - this.e = flag; - this.b = i; diff --git a/TacoSpigot-Server/nms-patches/ItemArmor.patch b/TacoSpigot-Server/nms-patches/ItemArmor.patch deleted file mode 100644 index e6beb5e..0000000 --- a/TacoSpigot-Server/nms-patches/ItemArmor.patch +++ /dev/null @@ -1,59 +0,0 @@ ---- a/net/minecraft/server/ItemArmor.java -+++ b/net/minecraft/server/ItemArmor.java -@@ -3,6 +3,11 @@ - import com.google.common.base.Predicates; - import java.util.List; - -+// CraftBukkit start -+import org.bukkit.craftbukkit.inventory.CraftItemStack; -+import org.bukkit.event.block.BlockDispenseEvent; -+// CraftBukkit end -+ - public class ItemArmor extends Item { - - private static final int[] k = new int[] { 11, 16, 15, 13}; -@@ -20,7 +25,34 @@ - EntityLiving entityliving = (EntityLiving) list.get(0); - int l = entityliving instanceof EntityHuman ? 1 : 0; - int i1 = EntityInsentient.c(itemstack); -- ItemStack itemstack1 = itemstack.cloneItemStack(); -+ -+ // CraftBukkit start -+ ItemStack itemstack1 = itemstack.cloneAndSubtract(1); -+ World world = isourceblock.getWorld(); -+ org.bukkit.block.Block block = world.getWorld().getBlockAt(isourceblock.getBlockPosition().getX(), isourceblock.getBlockPosition().getY(), isourceblock.getBlockPosition().getZ()); -+ CraftItemStack craftItem = CraftItemStack.asCraftMirror(itemstack1); -+ -+ BlockDispenseEvent event = new BlockDispenseEvent(block, craftItem.clone(), new org.bukkit.util.Vector(0, 0, 0)); -+ if (!BlockDispenser.eventFired) { -+ world.getServer().getPluginManager().callEvent(event); -+ } -+ -+ if (event.isCancelled()) { -+ itemstack.count++; -+ return itemstack; -+ } -+ -+ if (!event.getItem().equals(craftItem)) { -+ itemstack.count++; -+ // Chain to handler for new item -+ ItemStack eventStack = CraftItemStack.asNMSCopy(event.getItem()); -+ IDispenseBehavior idispensebehavior = (IDispenseBehavior) BlockDispenser.REGISTRY.get(eventStack.getItem()); -+ if (idispensebehavior != IDispenseBehavior.NONE && idispensebehavior != this) { -+ idispensebehavior.a(isourceblock, eventStack); -+ return itemstack; -+ } -+ } -+ // CraftBukkit end - - itemstack1.count = 1; - entityliving.setEquipment(i1 - l, itemstack1); -@@ -28,7 +60,7 @@ - ((EntityInsentient) entityliving).a(i1, 2.0F); - } - -- --itemstack.count; -+ // --itemstack.count; // CraftBukkit - handled above - return itemstack; - } else { - return super.b(isourceblock, itemstack); diff --git a/TacoSpigot-Server/nms-patches/ItemBoat.patch b/TacoSpigot-Server/nms-patches/ItemBoat.patch deleted file mode 100644 index 364ba05..0000000 --- a/TacoSpigot-Server/nms-patches/ItemBoat.patch +++ /dev/null @@ -1,17 +0,0 @@ ---- a/net/minecraft/server/ItemBoat.java -+++ b/net/minecraft/server/ItemBoat.java -@@ -54,6 +54,14 @@ - if (movingobjectposition.type == MovingObjectPosition.EnumMovingObjectType.BLOCK) { - BlockPosition blockposition = movingobjectposition.a(); - -+ // CraftBukkit start - Boat placement -+ org.bukkit.event.player.PlayerInteractEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callPlayerInteractEvent(entityhuman, org.bukkit.event.block.Action.RIGHT_CLICK_BLOCK, blockposition, movingobjectposition.direction, itemstack); -+ -+ if (event.isCancelled()) { -+ return itemstack; -+ } -+ // CraftBukkit end -+ - if (world.getType(blockposition).getBlock() == Blocks.SNOW_LAYER) { - blockposition = blockposition.down(); - } diff --git a/TacoSpigot-Server/nms-patches/ItemBow.patch b/TacoSpigot-Server/nms-patches/ItemBow.patch deleted file mode 100644 index b21506f..0000000 --- a/TacoSpigot-Server/nms-patches/ItemBow.patch +++ /dev/null @@ -1,49 +0,0 @@ ---- a/net/minecraft/server/ItemBow.java -+++ b/net/minecraft/server/ItemBow.java -@@ -1,5 +1,7 @@ - package net.minecraft.server; - -+import org.bukkit.event.entity.EntityCombustEvent; // CraftBukkit -+ - public class ItemBow extends Item { - - public static final String[] a = new String[] { "pulling_0", "pulling_1", "pulling_2"}; -@@ -45,9 +47,28 @@ - } - - if (EnchantmentManager.getEnchantmentLevel(Enchantment.ARROW_FIRE.id, itemstack) > 0) { -- entityarrow.setOnFire(100); -+ // CraftBukkit start - call EntityCombustEvent -+ EntityCombustEvent event = new EntityCombustEvent(entityarrow.getBukkitEntity(), 100); -+ entityarrow.world.getServer().getPluginManager().callEvent(event); -+ -+ if (!event.isCancelled()) { -+ entityarrow.setOnFire(event.getDuration()); -+ } -+ // CraftBukkit end -+ } -+ -+ // CraftBukkit start -+ org.bukkit.event.entity.EntityShootBowEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callEntityShootBowEvent(entityhuman, itemstack, entityarrow, f); -+ if (event.isCancelled()) { -+ event.getProjectile().remove(); -+ return; - } - -+ if (event.getProjectile() == entityarrow.getBukkitEntity()) { -+ world.addEntity(entityarrow); -+ } -+ // CraftBukkit end -+ - itemstack.damage(1, entityhuman); - world.makeSound(entityhuman, "random.bow", 1.0F, 1.0F / (ItemBow.g.nextFloat() * 0.4F + 1.2F) + f * 0.5F); - if (flag) { -@@ -58,7 +79,7 @@ - - entityhuman.b(StatisticList.USE_ITEM_COUNT[Item.getId(this)]); - if (!world.isClientSide) { -- world.addEntity(entityarrow); -+ // world.addEntity(entityarrow); // CraftBukkit - moved up - } - } - diff --git a/TacoSpigot-Server/nms-patches/ItemBucket.patch b/TacoSpigot-Server/nms-patches/ItemBucket.patch deleted file mode 100644 index 955279c..0000000 --- a/TacoSpigot-Server/nms-patches/ItemBucket.patch +++ /dev/null @@ -1,99 +0,0 @@ ---- a/net/minecraft/server/ItemBucket.java -+++ b/net/minecraft/server/ItemBucket.java -@@ -1,5 +1,12 @@ - package net.minecraft.server; - -+// CraftBukkit start -+import org.bukkit.craftbukkit.event.CraftEventFactory; -+import org.bukkit.craftbukkit.inventory.CraftItemStack; -+import org.bukkit.event.player.PlayerBucketEmptyEvent; -+import org.bukkit.event.player.PlayerBucketFillEvent; -+// CraftBukkit end -+ - public class ItemBucket extends Item { - - private Block a; -@@ -33,19 +40,41 @@ - Material material = iblockdata.getBlock().getMaterial(); - - if (material == Material.WATER && ((Integer) iblockdata.get(BlockFluids.LEVEL)).intValue() == 0) { -+ // CraftBukkit start -+ PlayerBucketFillEvent event = CraftEventFactory.callPlayerBucketFillEvent(entityhuman, blockposition.getX(), blockposition.getY(), blockposition.getZ(), null, itemstack, Items.WATER_BUCKET); -+ -+ if (event.isCancelled()) { -+ return itemstack; -+ } -+ // CraftBukkit end - world.setAir(blockposition); - entityhuman.b(StatisticList.USE_ITEM_COUNT[Item.getId(this)]); -- return this.a(itemstack, entityhuman, Items.WATER_BUCKET); -+ return this.a(itemstack, entityhuman, Items.WATER_BUCKET, event.getItemStack()); // CraftBukkit - added Event stack - } - - if (material == Material.LAVA && ((Integer) iblockdata.get(BlockFluids.LEVEL)).intValue() == 0) { -+ // CraftBukkit start -+ PlayerBucketFillEvent event = CraftEventFactory.callPlayerBucketFillEvent(entityhuman, blockposition.getX(), blockposition.getY(), blockposition.getZ(), null, itemstack, Items.LAVA_BUCKET); -+ -+ if (event.isCancelled()) { -+ return itemstack; -+ } -+ // CraftBukkit end - world.setAir(blockposition); - entityhuman.b(StatisticList.USE_ITEM_COUNT[Item.getId(this)]); -- return this.a(itemstack, entityhuman, Items.LAVA_BUCKET); -+ return this.a(itemstack, entityhuman, Items.LAVA_BUCKET, event.getItemStack()); // CraftBukkit - added Event stack - } - } else { - if (this.a == Blocks.AIR) { -- return new ItemStack(Items.BUCKET); -+ // CraftBukkit start -+ PlayerBucketEmptyEvent event = CraftEventFactory.callPlayerBucketEmptyEvent(entityhuman, blockposition.getX(), blockposition.getY(), blockposition.getZ(), movingobjectposition.direction, itemstack); -+ -+ if (event.isCancelled()) { -+ return itemstack; -+ } -+ -+ return CraftItemStack.asNMSCopy(event.getItemStack()); -+ // CraftBukkit end - } - - BlockPosition blockposition1 = blockposition.shift(movingobjectposition.direction); -@@ -54,9 +83,17 @@ - return itemstack; - } - -+ // CraftBukkit start -+ PlayerBucketEmptyEvent event = CraftEventFactory.callPlayerBucketEmptyEvent(entityhuman, blockposition.getX(), blockposition.getY(), blockposition.getZ(), movingobjectposition.direction, itemstack); -+ -+ if (event.isCancelled()) { -+ return itemstack; -+ } -+ // CraftBukkit end -+ - if (this.a(world, blockposition1) && !entityhuman.abilities.canInstantlyBuild) { - entityhuman.b(StatisticList.USE_ITEM_COUNT[Item.getId(this)]); -- return new ItemStack(Items.BUCKET); -+ return CraftItemStack.asNMSCopy(event.getItemStack()); // CraftBukkit - } - } - } -@@ -65,14 +102,15 @@ - } - } - -- private ItemStack a(ItemStack itemstack, EntityHuman entityhuman, Item item) { -+ // CraftBukkit - added ob.ItemStack result - TODO: Is this... the right way to handle this? -+ private ItemStack a(ItemStack itemstack, EntityHuman entityhuman, Item item, org.bukkit.inventory.ItemStack result) { - if (entityhuman.abilities.canInstantlyBuild) { - return itemstack; - } else if (--itemstack.count <= 0) { -- return new ItemStack(item); -+ return CraftItemStack.asNMSCopy(result); // CraftBukkit - } else { -- if (!entityhuman.inventory.pickup(new ItemStack(item))) { -- entityhuman.drop(new ItemStack(item, 1, 0), false); -+ if (!entityhuman.inventory.pickup(CraftItemStack.asNMSCopy(result))) { -+ entityhuman.drop(CraftItemStack.asNMSCopy(result), false); - } - - return itemstack; diff --git a/TacoSpigot-Server/nms-patches/ItemDye.patch b/TacoSpigot-Server/nms-patches/ItemDye.patch deleted file mode 100644 index b01d80f..0000000 --- a/TacoSpigot-Server/nms-patches/ItemDye.patch +++ /dev/null @@ -1,28 +0,0 @@ ---- a/net/minecraft/server/ItemDye.java -+++ b/net/minecraft/server/ItemDye.java -@@ -1,5 +1,7 @@ - package net.minecraft.server; - -+import org.bukkit.event.entity.SheepDyeWoolEvent; // CraftBukkit -+ - public class ItemDye extends Item { - - public static final int[] a = new int[] { 1973019, 11743532, 3887386, 5320730, 2437522, 8073150, 2651799, 11250603, 4408131, 14188952, 4312372, 14602026, 6719955, 12801229, 15435844, 15790320}; -@@ -89,6 +91,17 @@ - EnumColor enumcolor = EnumColor.fromInvColorIndex(itemstack.getData()); - - if (!entitysheep.isSheared() && entitysheep.getColor() != enumcolor) { -+ // CraftBukkit start -+ byte bColor = (byte) enumcolor.getColorIndex(); -+ SheepDyeWoolEvent event = new SheepDyeWoolEvent((org.bukkit.entity.Sheep) entitysheep.getBukkitEntity(), org.bukkit.DyeColor.getByData(bColor)); -+ entitysheep.world.getServer().getPluginManager().callEvent(event); -+ -+ if (event.isCancelled()) { -+ return false; -+ } -+ -+ enumcolor = EnumColor.fromColorIndex((byte) event.getColor().getWoolData()); -+ // CraftBukkit end - entitysheep.setColor(enumcolor); - --itemstack.count; - } diff --git a/TacoSpigot-Server/nms-patches/ItemFireball.patch b/TacoSpigot-Server/nms-patches/ItemFireball.patch deleted file mode 100644 index dc040d9..0000000 --- a/TacoSpigot-Server/nms-patches/ItemFireball.patch +++ /dev/null @@ -1,17 +0,0 @@ ---- a/net/minecraft/server/ItemFireball.java -+++ b/net/minecraft/server/ItemFireball.java -@@ -15,6 +15,14 @@ - return false; - } else { - if (world.getType(blockposition).getBlock().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.count; -+ } -+ return false; -+ } -+ // CraftBukkit end - world.makeSound((double) blockposition.getX() + 0.5D, (double) blockposition.getY() + 0.5D, (double) blockposition.getZ() + 0.5D, "item.fireCharge.use", 1.0F, (ItemFireball.g.nextFloat() - ItemFireball.g.nextFloat()) * 0.2F + 1.0F); - world.setTypeUpdate(blockposition, Blocks.FIRE.getBlockData()); - } diff --git a/TacoSpigot-Server/nms-patches/ItemFishingRod.patch b/TacoSpigot-Server/nms-patches/ItemFishingRod.patch deleted file mode 100644 index 9091026..0000000 --- a/TacoSpigot-Server/nms-patches/ItemFishingRod.patch +++ /dev/null @@ -1,30 +0,0 @@ ---- a/net/minecraft/server/ItemFishingRod.java -+++ b/net/minecraft/server/ItemFishingRod.java -@@ -1,5 +1,7 @@ - package net.minecraft.server; - -+import org.bukkit.event.player.PlayerFishEvent; // CraftBukkit -+ - public class ItemFishingRod extends Item { - - public ItemFishingRod() { -@@ -15,9 +17,18 @@ - itemstack.damage(i, entityhuman); - entityhuman.bw(); - } else { -+ // CraftBukkit start -+ EntityFishingHook hook = new EntityFishingHook(world, entityhuman); -+ PlayerFishEvent playerFishEvent = new PlayerFishEvent((org.bukkit.entity.Player) entityhuman.getBukkitEntity(), null, (org.bukkit.entity.Fish) hook.getBukkitEntity(), PlayerFishEvent.State.FISHING); -+ world.getServer().getPluginManager().callEvent(playerFishEvent); -+ -+ if (playerFishEvent.isCancelled()) { -+ return itemstack; -+ } -+ // CraftBukkit end - world.makeSound(entityhuman, "random.bow", 0.5F, 0.4F / (ItemFishingRod.g.nextFloat() * 0.4F + 0.8F)); - if (!world.isClientSide) { -- world.addEntity(new EntityFishingHook(world, entityhuman)); -+ world.addEntity(hook); // CraftBukkit - moved creation up - } - - entityhuman.bw(); diff --git a/TacoSpigot-Server/nms-patches/ItemFlintAndSteel.patch b/TacoSpigot-Server/nms-patches/ItemFlintAndSteel.patch deleted file mode 100644 index ab3aef9..0000000 --- a/TacoSpigot-Server/nms-patches/ItemFlintAndSteel.patch +++ /dev/null @@ -1,45 +0,0 @@ ---- a/net/minecraft/server/ItemFlintAndSteel.java -+++ b/net/minecraft/server/ItemFlintAndSteel.java -@@ -1,5 +1,10 @@ - package net.minecraft.server; - -+// CraftBukkit start -+import org.bukkit.craftbukkit.block.CraftBlockState; -+import org.bukkit.craftbukkit.event.CraftEventFactory; -+// CraftBukkit end -+ - public class ItemFlintAndSteel extends Item { - - public ItemFlintAndSteel() { -@@ -9,13 +14,31 @@ - } - - public boolean interactWith(ItemStack itemstack, EntityHuman entityhuman, World world, BlockPosition blockposition, EnumDirection enumdirection, float f, float f1, float f2) { -+ BlockPosition clicked = blockposition; // CraftBukkit - blockposition = blockposition.shift(enumdirection); - if (!entityhuman.a(blockposition, enumdirection, itemstack)) { - return false; - } else { - if (world.getType(blockposition).getBlock().getMaterial() == Material.AIR) { -+ // CraftBukkit start - Store the clicked block -+ if (CraftEventFactory.callBlockIgniteEvent(world, blockposition.getX(), blockposition.getY(), blockposition.getZ(), org.bukkit.event.block.BlockIgniteEvent.IgniteCause.FLINT_AND_STEEL, entityhuman).isCancelled()) { -+ itemstack.damage(1, entityhuman); -+ return false; -+ } -+ -+ CraftBlockState blockState = CraftBlockState.getBlockState(world, blockposition.getX(), blockposition.getY(), blockposition.getZ()); -+ // CraftBukkit end - world.makeSound((double) blockposition.getX() + 0.5D, (double) blockposition.getY() + 0.5D, (double) blockposition.getZ() + 0.5D, "fire.ignite", 1.0F, ItemFlintAndSteel.g.nextFloat() * 0.4F + 0.8F); - world.setTypeUpdate(blockposition, Blocks.FIRE.getBlockData()); -+ -+ // CraftBukkit start -+ org.bukkit.event.block.BlockPlaceEvent placeEvent = CraftEventFactory.callBlockPlaceEvent(world, entityhuman, blockState, clicked.getX(), clicked.getY(), clicked.getZ()); -+ -+ if (placeEvent.isCancelled() || !placeEvent.canBuild()) { -+ placeEvent.getBlockPlaced().setTypeIdAndData(0, (byte) 0, false); -+ return false; -+ } -+ // CraftBukkit end - } - - itemstack.damage(1, entityhuman); diff --git a/TacoSpigot-Server/nms-patches/ItemHanging.patch b/TacoSpigot-Server/nms-patches/ItemHanging.patch deleted file mode 100644 index d6ec92a..0000000 --- a/TacoSpigot-Server/nms-patches/ItemHanging.patch +++ /dev/null @@ -1,41 +0,0 @@ ---- a/net/minecraft/server/ItemHanging.java -+++ b/net/minecraft/server/ItemHanging.java -@@ -1,5 +1,11 @@ - package net.minecraft.server; - -+// CraftBukkit start -+import org.bukkit.entity.Player; -+import org.bukkit.event.hanging.HangingPlaceEvent; -+import org.bukkit.event.painting.PaintingPlaceEvent; -+// CraftBukkit end -+ - public class ItemHanging extends Item { - - private final Class a; -@@ -24,6 +30,26 @@ - - if (entityhanging != null && entityhanging.survives()) { - if (!world.isClientSide) { -+ // CraftBukkit start - fire HangingPlaceEvent -+ Player who = (entityhuman == null) ? null : (Player) entityhuman.getBukkitEntity(); -+ org.bukkit.block.Block blockClicked = world.getWorld().getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ()); -+ org.bukkit.block.BlockFace blockFace = org.bukkit.craftbukkit.block.CraftBlock.notchToBlockFace(enumdirection); -+ -+ HangingPlaceEvent event = new HangingPlaceEvent((org.bukkit.entity.Hanging) entityhanging.getBukkitEntity(), who, blockClicked, blockFace); -+ world.getServer().getPluginManager().callEvent(event); -+ -+ PaintingPlaceEvent paintingEvent = null; -+ if (entityhanging instanceof EntityPainting) { -+ // Fire old painting event until it can be removed -+ paintingEvent = new PaintingPlaceEvent((org.bukkit.entity.Painting) entityhanging.getBukkitEntity(), who, blockClicked, blockFace); -+ paintingEvent.setCancelled(event.isCancelled()); -+ world.getServer().getPluginManager().callEvent(paintingEvent); -+ } -+ -+ if (event.isCancelled() || (paintingEvent != null && paintingEvent.isCancelled())) { -+ return false; -+ } -+ // CraftBukkit end - world.addEntity(entityhanging); - } - diff --git a/TacoSpigot-Server/nms-patches/ItemLeash.patch b/TacoSpigot-Server/nms-patches/ItemLeash.patch deleted file mode 100644 index c9713f2..0000000 --- a/TacoSpigot-Server/nms-patches/ItemLeash.patch +++ /dev/null @@ -1,35 +0,0 @@ ---- a/net/minecraft/server/ItemLeash.java -+++ b/net/minecraft/server/ItemLeash.java -@@ -3,6 +3,8 @@ - import java.util.Iterator; - import java.util.List; - -+import org.bukkit.event.hanging.HangingPlaceEvent; // CraftBukkit -+ - public class ItemLeash extends Item { - - public ItemLeash() { -@@ -40,7 +42,23 @@ - if (entityinsentient.cc() && entityinsentient.getLeashHolder() == entityhuman) { - if (entityleash == null) { - entityleash = EntityLeash.a(world, blockposition); -+ -+ // CraftBukkit start - fire HangingPlaceEvent -+ HangingPlaceEvent event = new HangingPlaceEvent((org.bukkit.entity.Hanging) entityleash.getBukkitEntity(), entityhuman != null ? (org.bukkit.entity.Player) entityhuman.getBukkitEntity() : null, world.getWorld().getBlockAt(i, j, k), org.bukkit.block.BlockFace.SELF); -+ world.getServer().getPluginManager().callEvent(event); -+ -+ if (event.isCancelled()) { -+ entityleash.die(); -+ return false; -+ } -+ // CraftBukkit end -+ } -+ -+ // CraftBukkit start -+ if (org.bukkit.craftbukkit.event.CraftEventFactory.callPlayerLeashEntityEvent(entityinsentient, entityleash, entityhuman).isCancelled()) { -+ continue; - } -+ // CraftBukkit end - - entityinsentient.setLeashHolder(entityleash, true); - flag = true; diff --git a/TacoSpigot-Server/nms-patches/ItemMapEmpty.patch b/TacoSpigot-Server/nms-patches/ItemMapEmpty.patch deleted file mode 100644 index cc593bb..0000000 --- a/TacoSpigot-Server/nms-patches/ItemMapEmpty.patch +++ /dev/null @@ -1,25 +0,0 @@ ---- a/net/minecraft/server/ItemMapEmpty.java -+++ b/net/minecraft/server/ItemMapEmpty.java -@@ -7,15 +7,19 @@ - } - - public ItemStack a(ItemStack itemstack, World world, EntityHuman entityhuman) { -- ItemStack itemstack1 = new ItemStack(Items.FILLED_MAP, 1, world.b("map")); -+ World worldMain = world.getServer().getServer().worlds.get(0); // CraftBukkit - store reference to primary world -+ ItemStack itemstack1 = new ItemStack(Items.FILLED_MAP, 1, worldMain.b("map")); // CraftBukkit - use primary world for maps - String s = "map_" + itemstack1.getData(); - WorldMap worldmap = new WorldMap(s); - -- world.a(s, (PersistentBase) worldmap); -+ worldMain.a(s, (PersistentBase) worldmap); // CraftBukkit - worldmap.scale = 0; - worldmap.a(entityhuman.locX, entityhuman.locZ, worldmap.scale); -- worldmap.map = (byte) world.worldProvider.getDimension(); -+ worldmap.map = (byte) ((WorldServer) world).dimension; // CraftBukkit - use bukkit dimension - worldmap.c(); -+ -+ org.bukkit.craftbukkit.event.CraftEventFactory.callEvent(new org.bukkit.event.server.MapInitializeEvent(worldmap.mapView)); // CraftBukkit -+ - --itemstack.count; - if (itemstack.count <= 0) { - return itemstack1; diff --git a/TacoSpigot-Server/nms-patches/ItemMinecart.patch b/TacoSpigot-Server/nms-patches/ItemMinecart.patch deleted file mode 100644 index ed8f094..0000000 --- a/TacoSpigot-Server/nms-patches/ItemMinecart.patch +++ /dev/null @@ -1,74 +0,0 @@ ---- a/net/minecraft/server/ItemMinecart.java -+++ b/net/minecraft/server/ItemMinecart.java -@@ -1,5 +1,10 @@ - package net.minecraft.server; - -+// CraftBukkit start -+import org.bukkit.craftbukkit.inventory.CraftItemStack; -+import org.bukkit.event.block.BlockDispenseEvent; -+// CraftBukkit end -+ - public class ItemMinecart extends Item { - - private static final IDispenseBehavior a = new DispenseBehaviorItem() { -@@ -37,14 +42,43 @@ - } - } - -- EntityMinecartAbstract entityminecartabstract = EntityMinecartAbstract.a(world, d0, d1 + d3, d2, ((ItemMinecart) itemstack.getItem()).b); -+ // CraftBukkit start -+ // EntityMinecartAbstract entityminecartabstract = EntityMinecartAbstract.a(world, d0, d1 + d3, d2, ((ItemMinecart) itemstack.getItem()).b); -+ ItemStack itemstack1 = itemstack.cloneAndSubtract(1); -+ org.bukkit.block.Block block2 = world.getWorld().getBlockAt(isourceblock.getBlockPosition().getX(), isourceblock.getBlockPosition().getY(), isourceblock.getBlockPosition().getZ()); -+ CraftItemStack craftItem = CraftItemStack.asCraftMirror(itemstack1); -+ -+ BlockDispenseEvent event = new BlockDispenseEvent(block2, craftItem.clone(), new org.bukkit.util.Vector(d0, d1 + d3, d2)); -+ if (!BlockDispenser.eventFired) { -+ world.getServer().getPluginManager().callEvent(event); -+ } -+ -+ if (event.isCancelled()) { -+ itemstack.count++; -+ return itemstack; -+ } -+ -+ if (!event.getItem().equals(craftItem)) { -+ itemstack.count++; -+ // Chain to handler for new item -+ ItemStack eventStack = CraftItemStack.asNMSCopy(event.getItem()); -+ IDispenseBehavior idispensebehavior = (IDispenseBehavior) BlockDispenser.REGISTRY.get(eventStack.getItem()); -+ if (idispensebehavior != IDispenseBehavior.NONE && idispensebehavior != this) { -+ idispensebehavior.a(isourceblock, eventStack); -+ return itemstack; -+ } -+ } -+ -+ itemstack1 = CraftItemStack.asNMSCopy(event.getItem()); -+ EntityMinecartAbstract entityminecartabstract = EntityMinecartAbstract.a(world, event.getVelocity().getX(), event.getVelocity().getY(), event.getVelocity().getZ(), ((ItemMinecart) itemstack1.getItem()).b); - - if (itemstack.hasName()) { - entityminecartabstract.setCustomName(itemstack.getName()); - } - - world.addEntity(entityminecartabstract); -- itemstack.cloneAndSubtract(1); -+ // itemstack.a(1); // CraftBukkit - handled during event processing -+ // CraftBukkit end - return itemstack; - } - -@@ -73,6 +107,14 @@ - d0 = 0.5D; - } - -+ // CraftBukkit start - Minecarts -+ org.bukkit.event.player.PlayerInteractEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callPlayerInteractEvent(entityhuman, org.bukkit.event.block.Action.RIGHT_CLICK_BLOCK, blockposition, enumdirection, itemstack); -+ -+ if (event.isCancelled()) { -+ return false; -+ } -+ // CraftBukkit end -+ - EntityMinecartAbstract entityminecartabstract = EntityMinecartAbstract.a(world, (double) blockposition.getX() + 0.5D, (double) blockposition.getY() + 0.0625D + d0, (double) blockposition.getZ() + 0.5D, this.b); - - if (itemstack.hasName()) { diff --git a/TacoSpigot-Server/nms-patches/ItemMonsterEgg.patch b/TacoSpigot-Server/nms-patches/ItemMonsterEgg.patch deleted file mode 100644 index e423631..0000000 --- a/TacoSpigot-Server/nms-patches/ItemMonsterEgg.patch +++ /dev/null @@ -1,31 +0,0 @@ ---- a/net/minecraft/server/ItemMonsterEgg.java -+++ b/net/minecraft/server/ItemMonsterEgg.java -@@ -109,6 +109,12 @@ - } - - public static Entity a(World world, int i, double d0, double d1, double d2) { -+ // CraftBukkit start - delegate to spawnCreature -+ return spawnCreature(world, i, d0, d1, d2, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.SPAWNER_EGG); -+ } -+ -+ public static Entity spawnCreature(World world, int i, double d0, double d1, double d2, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason spawnReason) { -+ // CraftBukkit end - if (!EntityTypes.eggInfo.containsKey(Integer.valueOf(i))) { - return null; - } else { -@@ -123,8 +129,13 @@ - entityinsentient.aK = entityinsentient.yaw; - entityinsentient.aI = entityinsentient.yaw; - entityinsentient.prepare(world.E(new BlockPosition(entityinsentient)), (GroupDataEntity) null); -- world.addEntity(entity); -- entityinsentient.x(); -+ // CraftBukkit start - don't return an entity when CreatureSpawnEvent is canceled -+ if (!world.addEntity(entity, spawnReason)) { -+ entity = null; -+ } else { -+ entityinsentient.x(); -+ } -+ // CraftBukkit end - } - } - diff --git a/TacoSpigot-Server/nms-patches/ItemRecord.patch b/TacoSpigot-Server/nms-patches/ItemRecord.patch deleted file mode 100644 index 0698a9d..0000000 --- a/TacoSpigot-Server/nms-patches/ItemRecord.patch +++ /dev/null @@ -1,17 +0,0 @@ ---- a/net/minecraft/server/ItemRecord.java -+++ b/net/minecraft/server/ItemRecord.java -@@ -22,10 +22,14 @@ - if (world.isClientSide) { - return true; - } else { -+ // CraftBukkit Start -+ /* - ((BlockJukeBox) Blocks.JUKEBOX).a(world, blockposition, iblockdata, itemstack); - world.a((EntityHuman) null, 1005, blockposition, Item.getId(this)); - --itemstack.count; - entityhuman.b(StatisticList.X); -+ */ -+ // CraftBukkit End - return true; - } - } else { diff --git a/TacoSpigot-Server/nms-patches/ItemStack.patch b/TacoSpigot-Server/nms-patches/ItemStack.patch deleted file mode 100644 index 9a2c9a5..0000000 --- a/TacoSpigot-Server/nms-patches/ItemStack.patch +++ /dev/null @@ -1,251 +0,0 @@ ---- a/net/minecraft/server/ItemStack.java -+++ b/net/minecraft/server/ItemStack.java -@@ -5,6 +5,19 @@ - import java.text.DecimalFormat; - import java.util.Random; - -+// CraftBukkit start -+import java.util.List; -+import java.util.Map; -+ -+import org.bukkit.Location; -+import org.bukkit.TreeType; -+import org.bukkit.block.BlockState; -+import org.bukkit.craftbukkit.block.CraftBlockState; -+import org.bukkit.craftbukkit.util.CraftMagicNumbers; -+import org.bukkit.entity.Player; -+import org.bukkit.event.world.StructureGrowEvent; -+// CraftBukkit end -+ - public final class ItemStack { - - public static final DecimalFormat a = new DecimalFormat("#.###"); -@@ -46,10 +59,14 @@ - this.k = false; - this.item = item; - this.count = i; -- this.damage = j; -- if (this.damage < 0) { -- this.damage = 0; -- } -+ -+ // CraftBukkit start - Pass to setData to do filtering -+ this.setData(j); -+ //this.damage = j; -+ //if (this.damage < 0) { -+ // this.damage = 0; -+ //} -+ // CraftBukkit end - - } - -@@ -83,11 +100,128 @@ - } - - public boolean placeItem(EntityHuman entityhuman, World world, BlockPosition blockposition, EnumDirection enumdirection, float f, float f1, float f2) { -+ // CraftBukkit start - handle all block place event logic here -+ int data = this.getData(); -+ int count = this.count; -+ -+ if (!(this.getItem() instanceof ItemBucket)) { // if not bucket -+ world.captureBlockStates = true; -+ // special case bonemeal -+ if (this.getItem() instanceof ItemDye && this.getData() == 15) { -+ Block block = world.getType(blockposition).getBlock(); -+ if (block == Blocks.SAPLING || block instanceof BlockMushroom) { -+ world.captureTreeGeneration = true; -+ } -+ } -+ } - boolean flag = this.getItem().interactWith(this, entityhuman, world, blockposition, enumdirection, f, f1, f2); -+ int newData = this.getData(); -+ int newCount = this.count; -+ this.count = count; -+ this.setData(data); -+ world.captureBlockStates = false; -+ if (flag && world.captureTreeGeneration && world.capturedBlockStates.size() > 0) { -+ world.captureTreeGeneration = false; -+ Location location = new Location(world.getWorld(), blockposition.getX(), blockposition.getY(), blockposition.getZ()); -+ TreeType treeType = BlockSapling.treeType; -+ BlockSapling.treeType = null; -+ List blocks = (List) world.capturedBlockStates.clone(); -+ world.capturedBlockStates.clear(); -+ StructureGrowEvent event = null; -+ if (treeType != null) { -+ boolean isBonemeal = getItem() == Items.DYE && data == 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.count == count && this.getData() == data) { -+ this.setData(newData); -+ this.count = newCount; -+ } -+ for (BlockState blockstate : blocks) { -+ blockstate.update(true); -+ } -+ } -+ -+ return flag; -+ } -+ world.captureTreeGeneration = false; - - if (flag) { -- entityhuman.b(StatisticList.USE_ITEM_COUNT[Item.getId(this.item)]); -+ org.bukkit.event.block.BlockPlaceEvent placeEvent = null; -+ List blocks = (List) world.capturedBlockStates.clone(); -+ world.capturedBlockStates.clear(); -+ if (blocks.size() > 1) { -+ placeEvent = org.bukkit.craftbukkit.event.CraftEventFactory.callBlockMultiPlaceEvent(world, entityhuman, blocks, blockposition.getX(), blockposition.getY(), blockposition.getZ()); -+ } else if (blocks.size() == 1) { -+ placeEvent = org.bukkit.craftbukkit.event.CraftEventFactory.callBlockPlaceEvent(world, entityhuman, blocks.get(0), blockposition.getX(), blockposition.getY(), blockposition.getZ()); -+ } -+ -+ if (placeEvent != null && (placeEvent.isCancelled() || !placeEvent.canBuild())) { -+ flag = false; // cancel placement -+ // revert back all captured blocks -+ for (BlockState blockstate : blocks) { -+ blockstate.update(true, false); -+ } -+ } else { -+ // Change the stack to its new contents if it hasn't been tampered with. -+ if (this.count == count && this.getData() == data) { -+ this.setData(newData); -+ this.count = newCount; -+ } -+ for (BlockState blockstate : blocks) { -+ int x = blockstate.getX(); -+ int y = blockstate.getY(); -+ int z = blockstate.getZ(); -+ int updateFlag = ((CraftBlockState) blockstate).getFlag(); -+ org.bukkit.Material mat = blockstate.getType(); -+ Block oldBlock = CraftMagicNumbers.getBlock(mat); -+ BlockPosition newblockposition = new BlockPosition(x, y, z); -+ IBlockData block = world.getType(newblockposition); -+ -+ if (!(block instanceof BlockContainer)) { // Containers get placed automatically -+ block.getBlock().onPlace(world, newblockposition, block); -+ } -+ -+ world.notifyAndUpdatePhysics(newblockposition, null, oldBlock, block.getBlock(), updateFlag); // send null chunk as chunk.k() returns false by this point -+ } -+ -+ for (Map.Entry e : world.capturedTileEntities.entrySet()) { -+ world.setTileEntity(e.getKey(), e.getValue()); -+ } -+ -+ // Special case juke boxes as they update their tile entity. Copied from ItemRecord. -+ if (this.getItem() instanceof ItemRecord) { -+ ((BlockJukeBox) Blocks.JUKEBOX).a(world, blockposition, world.getType(blockposition), this); -+ world.a((EntityHuman) null, 1005, blockposition, Item.getId(this.getItem())); -+ --this.count; -+ entityhuman.b(StatisticList.X); -+ } -+ -+ if (this.getItem() == 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).getBlock().getMaterial().isBuildable()) { -+ bp = null; -+ } else { -+ bp = bp.shift(enumdirection); -+ } -+ } -+ if (bp != null) { -+ TileEntity te = world.getTileEntity(bp); -+ if (te instanceof TileEntitySkull) { -+ Blocks.SKULL.a(world, bp, (TileEntitySkull) te); -+ } -+ } -+ } -+ -+ entityhuman.b(StatisticList.USE_ITEM_COUNT[Item.getId(this.item)]); -+ } - } -+ world.capturedTileEntities.clear(); -+ world.capturedBlockStates.clear(); -+ // CraftBukkit end - - return flag; - } -@@ -111,7 +245,7 @@ - nbttagcompound.setByte("Count", (byte) this.count); - nbttagcompound.setShort("Damage", (short) this.damage); - if (this.tag != null) { -- nbttagcompound.set("tag", this.tag); -+ nbttagcompound.set("tag", this.tag.clone()); // CraftBukkit - make defensive copy, data is going to another thread - } - - return nbttagcompound; -@@ -125,13 +259,18 @@ - } - - this.count = nbttagcompound.getByte("Count"); -+ /* CraftBukkit start - Route through setData for filtering - this.damage = nbttagcompound.getShort("Damage"); - if (this.damage < 0) { - this.damage = 0; - } -+ */ -+ this.setData(nbttagcompound.getShort("Damage")); -+ // CraftBukkit end - - if (nbttagcompound.hasKeyOfType("tag", 10)) { -- this.tag = nbttagcompound.getCompound("tag"); -+ // CraftBukkit - make defensive copy as this data may be coming from the save thread -+ this.tag = (NBTTagCompound) nbttagcompound.getCompound("tag").clone(); - if (this.item != null) { - this.item.a(this.tag); - } -@@ -168,8 +307,28 @@ - } - - public void setData(int i) { -+ // CraftBukkit start - Filter out data for items that shouldn't have it -+ // The crafting system uses this value for a special purpose so we have to allow it -+ if (i == 32767) { -+ this.damage = i; -+ return; -+ } -+ -+ // Is this a block? -+ if (CraftMagicNumbers.getBlock(CraftMagicNumbers.getId(this.getItem())) != Blocks.AIR) { -+ // If vanilla doesn't use data on it don't allow any -+ if (!(this.usesData() || this.getItem().usesDurability())) { -+ i = 0; -+ } -+ } -+ -+ // Filter invalid plant data -+ if (CraftMagicNumbers.getBlock(CraftMagicNumbers.getId(this.getItem())) == Blocks.DOUBLE_PLANT && (i > 5 || i < 0)) { -+ i = 0; -+ } -+ // CraftBukkit end - this.damage = i; -- if (this.damage < 0) { -+ if (this.damage < -1) { // CraftBukkit - this.damage = 0; - } - -@@ -223,6 +382,12 @@ - this.count = 0; - } - -+ // CraftBukkit start - Check for item breaking -+ if (this.count == 0 && entityliving instanceof EntityHuman) { -+ org.bukkit.craftbukkit.event.CraftEventFactory.callPlayerItemBreakEvent((EntityHuman) entityliving, this); -+ } -+ // CraftBukkit end -+ - this.damage = 0; - } - -@@ -489,6 +654,7 @@ - - public void setItem(Item item) { - this.item = item; -+ this.setData(this.getData()); // CraftBukkit - Set data again to ensure it is filtered properly - } - - public IChatBaseComponent C() { diff --git a/TacoSpigot-Server/nms-patches/ItemWaterLily.patch b/TacoSpigot-Server/nms-patches/ItemWaterLily.patch deleted file mode 100644 index d4e7af0..0000000 --- a/TacoSpigot-Server/nms-patches/ItemWaterLily.patch +++ /dev/null @@ -1,18 +0,0 @@ ---- a/net/minecraft/server/ItemWaterLily.java -+++ b/net/minecraft/server/ItemWaterLily.java -@@ -27,7 +27,15 @@ - IBlockData iblockdata = world.getType(blockposition); - - if (iblockdata.getBlock().getMaterial() == Material.WATER && ((Integer) iblockdata.get(BlockFluids.LEVEL)).intValue() == 0 && world.isEmpty(blockposition1)) { -+ // CraftBukkit start - special case for handling block placement with water lilies -+ org.bukkit.block.BlockState blockstate = org.bukkit.craftbukkit.block.CraftBlockState.getBlockState(world, blockposition1.getX(), blockposition1.getY(), blockposition1.getZ()); - world.setTypeUpdate(blockposition1, Blocks.WATERLILY.getBlockData()); -+ org.bukkit.event.block.BlockPlaceEvent placeEvent = org.bukkit.craftbukkit.event.CraftEventFactory.callBlockPlaceEvent(world, entityhuman, blockstate, blockposition.getX(), blockposition.getY(), blockposition.getZ()); -+ if (placeEvent != null && (placeEvent.isCancelled() || !placeEvent.canBuild())) { -+ blockstate.update(true, false); -+ return itemstack; -+ } -+ // CraftBukkit end - if (!entityhuman.abilities.canInstantlyBuild) { - --itemstack.count; - } diff --git a/TacoSpigot-Server/nms-patches/ItemWorldMap.patch b/TacoSpigot-Server/nms-patches/ItemWorldMap.patch deleted file mode 100644 index f40ea52..0000000 --- a/TacoSpigot-Server/nms-patches/ItemWorldMap.patch +++ /dev/null @@ -1,73 +0,0 @@ ---- a/net/minecraft/server/ItemWorldMap.java -+++ b/net/minecraft/server/ItemWorldMap.java -@@ -4,6 +4,11 @@ - import com.google.common.collect.Iterables; - import com.google.common.collect.Multisets; - -+// CraftBukkit start -+import org.bukkit.Bukkit; -+import org.bukkit.event.server.MapInitializeEvent; -+// CraftBukkit end -+ - public class ItemWorldMap extends ItemWorldMapBase { - - protected ItemWorldMap() { -@@ -11,25 +16,32 @@ - } - - public WorldMap getSavedMap(ItemStack itemstack, World world) { -+ World worldMain = world.getServer().getServer().worlds.get(0); // CraftBukkit - store reference to primary world - String s = "map_" + itemstack.getData(); -- WorldMap worldmap = (WorldMap) world.a(WorldMap.class, s); -+ WorldMap worldmap = (WorldMap) worldMain.a(WorldMap.class, s); // CraftBukkit - use primary world for maps - - if (worldmap == null && !world.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().c(), (double) world.getWorldData().e(), worldmap.scale); -- worldmap.map = (byte) world.worldProvider.getDimension(); -+ worldmap.map = (byte) ((WorldServer) world).dimension; // CraftBukkit - fixes Bukkit multiworld maps - worldmap.c(); -- world.a(s, (PersistentBase) worldmap); -+ worldMain.a(s, (PersistentBase) worldmap); // CraftBukkit - use primary world for maps -+ -+ // CraftBukkit start -+ MapInitializeEvent event = new MapInitializeEvent(worldmap.mapView); -+ Bukkit.getServer().getPluginManager().callEvent(event); -+ // CraftBukkit end - } - - return worldmap; - } - - public void a(World world, Entity entity, WorldMap worldmap) { -- if (world.worldProvider.getDimension() == worldmap.map && entity instanceof EntityHuman) { -+ // CraftBukkit - world.worldProvider -> ((WorldServer) world) -+ if (((WorldServer) world).dimension == worldmap.map && entity instanceof EntityHuman) { - int i = 1 << worldmap.scale; - int j = worldmap.centerX; - int k = worldmap.centerZ; -@@ -181,6 +193,8 @@ - if (itemstack.hasTag() && itemstack.getTag().getBoolean("map_is_scaling")) { - WorldMap worldmap = Items.FILLED_MAP.getSavedMap(itemstack, world); - -+ world = world.getServer().getServer().worlds.get(0); // CraftBukkit - use primary world for maps -+ - itemstack.setData(world.b("map")); - WorldMap worldmap1 = new WorldMap("map_" + itemstack.getData()); - -@@ -193,6 +207,11 @@ - worldmap1.map = worldmap.map; - worldmap1.c(); - world.a("map_" + itemstack.getData(), (PersistentBase) worldmap1); -+ -+ // CraftBukkit start -+ MapInitializeEvent event = new MapInitializeEvent(worldmap1.mapView); -+ Bukkit.getServer().getPluginManager().callEvent(event); -+ // CraftBukkit end - } - - } diff --git a/TacoSpigot-Server/nms-patches/JsonList.patch b/TacoSpigot-Server/nms-patches/JsonList.patch deleted file mode 100644 index 10e6bce..0000000 --- a/TacoSpigot-Server/nms-patches/JsonList.patch +++ /dev/null @@ -1,47 +0,0 @@ ---- a/net/minecraft/server/JsonList.java -+++ b/net/minecraft/server/JsonList.java -@@ -83,7 +83,7 @@ - - public V get(K k0) { - this.h(); -- return (JsonListEntry) this.d.get(this.a(k0)); -+ return (V) this.d.get(this.a(k0)); // CraftBukkit - fix decompile error - } - - public void remove(K k0) { -@@ -101,6 +101,12 @@ - return (String[]) this.d.keySet().toArray(new String[this.d.size()]); - } - -+ // CraftBukkit start -+ public Collection getValues() { -+ return this.d.values(); -+ } -+ // CraftBukkit end -+ - public boolean isEmpty() { - return this.d.size() < 1; - } -@@ -176,7 +182,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 - } - } - } -@@ -205,11 +211,11 @@ - } - } - -- public JsonElement serialize(Object object, Type type, JsonSerializationContext jsonserializationcontext) { -+ public JsonElement serialize(JsonListEntry object, Type type, JsonSerializationContext jsonserializationcontext) { // CraftBukkit - fix decompile error - return this.a((JsonListEntry) object, type, jsonserializationcontext); - } - -- public Object deserialize(JsonElement jsonelement, Type type, JsonDeserializationContext jsondeserializationcontext) throws JsonParseException { -+ public JsonListEntry deserialize(JsonElement jsonelement, Type type, JsonDeserializationContext jsondeserializationcontext) throws JsonParseException { // CraftBukkit - fix decompile error - return this.a(jsonelement, type, jsondeserializationcontext); - } - diff --git a/TacoSpigot-Server/nms-patches/LoginListener.patch b/TacoSpigot-Server/nms-patches/LoginListener.patch deleted file mode 100644 index e44493c..0000000 --- a/TacoSpigot-Server/nms-patches/LoginListener.patch +++ /dev/null @@ -1,125 +0,0 @@ ---- a/net/minecraft/server/LoginListener.java -+++ b/net/minecraft/server/LoginListener.java -@@ -18,6 +18,12 @@ - import org.apache.logging.log4j.LogManager; - import org.apache.logging.log4j.Logger; - -+// CraftBukkit start -+import org.bukkit.craftbukkit.util.Waitable; -+import org.bukkit.event.player.AsyncPlayerPreLoginEvent; -+import org.bukkit.event.player.PlayerPreLoginEvent; -+// CraftBukkit end -+ - public class LoginListener implements PacketLoginInListener, IUpdatePlayerListBox { - - private static final AtomicInteger b = new AtomicInteger(0); -@@ -32,6 +38,7 @@ - private String j; - private SecretKey loginKey; - private EntityPlayer l; -+ public String hostname = ""; // CraftBukkit - add field - - public LoginListener(MinecraftServer minecraftserver, NetworkManager networkmanager) { - this.g = LoginListener.EnumProtocolState.HELLO; -@@ -78,10 +85,12 @@ - this.i = this.a(this.i); - } - -- String s = this.server.getPlayerList().attemptLogin(this.networkManager.getSocketAddress(), this.i); -+ // CraftBukkit start - fire PlayerLoginEvent -+ EntityPlayer s = this.server.getPlayerList().attemptLogin(this, this.i, hostname); - -- if (s != null) { -- this.disconnect(s); -+ if (s == null) { -+ // this.disconnect(s); -+ // CraftBukkit end - } else { - this.g = LoginListener.EnumProtocolState.ACCEPTED; - if (this.server.aK() >= 0 && !this.networkManager.c()) { -@@ -90,7 +99,7 @@ - LoginListener.this.networkManager.a(LoginListener.this.server.aK()); - } - -- 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]); -@@ -101,9 +110,9 @@ - - if (entityplayer != null) { - this.g = LoginListener.EnumProtocolState.e; -- this.l = this.server.getPlayerList().processLogin(this.i); -+ this.l = this.server.getPlayerList().processLogin(this.i, s); // CraftBukkit - add player reference - } else { -- this.server.getPlayerList().a(this.networkManager, this.server.getPlayerList().processLogin(this.i)); -+ this.server.getPlayerList().a(this.networkManager, this.server.getPlayerList().processLogin(this.i, s)); // CraftBukkit - add player reference - } - } - -@@ -148,6 +157,43 @@ - - LoginListener.this.i = LoginListener.this.server.aD().hasJoinedServer(new GameProfile((UUID) null, gameprofile.getName()), s); - if (LoginListener.this.i != null) { -+ // CraftBukkit start - fire PlayerPreLoginEvent -+ if (!networkManager.g()) { -+ return; -+ } -+ -+ String playerName = i.getName(); -+ java.net.InetAddress address = ((java.net.InetSocketAddress) networkManager.getSocketAddress()).getAddress(); -+ java.util.UUID uniqueId = i.getId(); -+ final org.bukkit.craftbukkit.CraftServer server = LoginListener.this.server.server; -+ -+ AsyncPlayerPreLoginEvent asyncEvent = new AsyncPlayerPreLoginEvent(playerName, address, uniqueId); -+ server.getPluginManager().callEvent(asyncEvent); -+ -+ if (PlayerPreLoginEvent.getHandlerList().getRegisteredListeners().length != 0) { -+ final PlayerPreLoginEvent event = new PlayerPreLoginEvent(playerName, address, uniqueId); -+ if (asyncEvent.getResult() != PlayerPreLoginEvent.Result.ALLOWED) { -+ event.disallow(asyncEvent.getResult(), asyncEvent.getKickMessage()); -+ } -+ Waitable waitable = new Waitable() { -+ @Override -+ protected PlayerPreLoginEvent.Result evaluate() { -+ server.getPluginManager().callEvent(event); -+ return event.getResult(); -+ }}; -+ -+ LoginListener.this.server.processQueue.add(waitable); -+ if (waitable.get() != PlayerPreLoginEvent.Result.ALLOWED) { -+ disconnect(event.getKickMessage()); -+ return; -+ } -+ } else { -+ if (asyncEvent.getLoginResult() != AsyncPlayerPreLoginEvent.Result.ALLOWED) { -+ disconnect(asyncEvent.getKickMessage()); -+ return; -+ } -+ } -+ // CraftBukkit end - LoginListener.c.info("UUID of player " + LoginListener.this.i.getName() + " is " + LoginListener.this.i.getId()); - LoginListener.this.g = LoginListener.EnumProtocolState.READY_TO_ACCEPT; - } else if (LoginListener.this.server.T()) { -@@ -156,7 +202,7 @@ - LoginListener.this.g = LoginListener.EnumProtocolState.READY_TO_ACCEPT; - } else { - LoginListener.this.disconnect("Failed to verify username!"); -- LoginListener.c.error("Username \'" + LoginListener.this.i.getName() + "\' tried to join with an invalid session"); -+ LoginListener.c.error("Username \'" + gameprofile.getName() + "\' tried to join with an invalid session"); // CraftBukkit - fix null pointer - } - } catch (AuthenticationUnavailableException authenticationunavailableexception) { - if (LoginListener.this.server.T()) { -@@ -167,6 +213,11 @@ - LoginListener.this.disconnect("Authentication servers are down. Please try again later, sorry!"); - LoginListener.c.error("Couldn\'t verify username because servers are unavailable"); - } -+ // CraftBukkit start - catch all exceptions -+ } catch (Exception exception) { -+ disconnect("Failed to verify username!"); -+ server.server.getLogger().log(java.util.logging.Level.WARNING, "Exception verifying " + gameprofile.getName(), exception); -+ // CraftBukkit end - } - - } diff --git a/TacoSpigot-Server/nms-patches/MethodProfiler.patch b/TacoSpigot-Server/nms-patches/MethodProfiler.patch deleted file mode 100644 index 71b91ba..0000000 --- a/TacoSpigot-Server/nms-patches/MethodProfiler.patch +++ /dev/null @@ -1,145 +0,0 @@ ---- a/net/minecraft/server/MethodProfiler.java -+++ b/net/minecraft/server/MethodProfiler.java -@@ -10,130 +10,30 @@ - import org.apache.logging.log4j.LogManager; - import org.apache.logging.log4j.Logger; - -+// CraftBukkit start - Strip down to empty methods, performance cost - public class MethodProfiler { - -- private static final Logger b = LogManager.getLogger(); -- private final List c = Lists.newArrayList(); -- private final List d = Lists.newArrayList(); - public boolean a; -- private String e = ""; -- private final Map f = Maps.newHashMap(); -- - public MethodProfiler() {} - - public void a() { -- this.f.clear(); -- this.e = ""; -- this.c.clear(); - } - - public void a(String s) { -- if (this.a) { -- if (this.e.length() > 0) { -- this.e = this.e + "."; -- } -- -- this.e = this.e + s; -- this.c.add(this.e); -- this.d.add(Long.valueOf(System.nanoTime())); -- } - } - - public void b() { -- if (this.a) { -- long i = System.nanoTime(); -- long j = ((Long) this.d.remove(this.d.size() - 1)).longValue(); -- -- this.c.remove(this.c.size() - 1); -- long k = i - j; -- -- if (this.f.containsKey(this.e)) { -- this.f.put(this.e, Long.valueOf(((Long) this.f.get(this.e)).longValue() + k)); -- } else { -- this.f.put(this.e, Long.valueOf(k)); -- } -- -- if (k > 100000000L) { -- MethodProfiler.b.warn("Something\'s taking too long! \'" + this.e + "\' took aprox " + (double) k / 1000000.0D + " ms"); -- } -- -- this.e = !this.c.isEmpty() ? (String) this.c.get(this.c.size() - 1) : ""; -- } - } - - public List b(String s) { -- if (!this.a) { -- return null; -- } else { -- long i = this.f.containsKey("root") ? ((Long) this.f.get("root")).longValue() : 0L; -- long j = this.f.containsKey(s) ? ((Long) this.f.get(s)).longValue() : -1L; -- ArrayList arraylist = Lists.newArrayList(); -- -- if (s.length() > 0) { -- s = s + "."; -- } -- -- long k = 0L; -- Iterator iterator = this.f.keySet().iterator(); -- -- while (iterator.hasNext()) { -- String s1 = (String) iterator.next(); -- -- if (s1.length() > s.length() && s1.startsWith(s) && s1.indexOf(".", s.length() + 1) < 0) { -- k += ((Long) this.f.get(s1)).longValue(); -- } -- } -- -- float f = (float) k; -- -- if (k < j) { -- k = j; -- } -- -- if (i < k) { -- i = k; -- } -- -- Iterator iterator1 = this.f.keySet().iterator(); -- -- String s2; -- -- while (iterator1.hasNext()) { -- s2 = (String) iterator1.next(); -- if (s2.length() > s.length() && s2.startsWith(s) && s2.indexOf(".", s.length() + 1) < 0) { -- long l = ((Long) this.f.get(s2)).longValue(); -- double d0 = (double) l * 100.0D / (double) k; -- double d1 = (double) l * 100.0D / (double) i; -- String s3 = s2.substring(s.length()); -- -- arraylist.add(new MethodProfiler.ProfilerInfo(s3, d0, d1)); -- } -- } -- -- iterator1 = this.f.keySet().iterator(); -- -- while (iterator1.hasNext()) { -- s2 = (String) iterator1.next(); -- this.f.put(s2, Long.valueOf(((Long) this.f.get(s2)).longValue() * 999L / 1000L)); -- } -- -- if ((float) k > f) { -- arraylist.add(new MethodProfiler.ProfilerInfo("unspecified", (double) ((float) k - f) * 100.0D / (double) k, (double) ((float) k - f) * 100.0D / (double) i)); -- } -- -- Collections.sort(arraylist); -- arraylist.add(0, new MethodProfiler.ProfilerInfo(s, 100.0D, (double) k * 100.0D / (double) i)); -- return arraylist; -- } -+ return null; - } - - public void c(String s) { -- this.b(); -- this.a(s); - } - - public String c() { -- return this.c.size() == 0 ? "[UNKNOWN]" : (String) this.c.get(this.c.size() - 1); -+ return ""; - } - - public static final class ProfilerInfo implements Comparable { -@@ -152,7 +52,7 @@ - return methodprofiler_profilerinfo.a < this.a ? -1 : (methodprofiler_profilerinfo.a > this.a ? 1 : methodprofiler_profilerinfo.c.compareTo(this.c)); - } - -- public int compareTo(Object object) { -+ public int compareTo(MethodProfiler.ProfilerInfo object) { - return this.a((MethodProfiler.ProfilerInfo) object); - } - } diff --git a/TacoSpigot-Server/nms-patches/MinecraftServer.patch b/TacoSpigot-Server/nms-patches/MinecraftServer.patch deleted file mode 100644 index 2568fdd..0000000 --- a/TacoSpigot-Server/nms-patches/MinecraftServer.patch +++ /dev/null @@ -1,678 +0,0 @@ ---- a/net/minecraft/server/MinecraftServer.java -+++ b/net/minecraft/server/MinecraftServer.java -@@ -38,6 +38,15 @@ - import org.apache.logging.log4j.LogManager; - import org.apache.logging.log4j.Logger; - -+// CraftBukkit start -+import java.io.IOException; -+ -+import jline.console.ConsoleReader; -+import joptsimple.OptionSet; -+ -+import org.bukkit.craftbukkit.Main; -+// CraftBukkit end -+ - public abstract class MinecraftServer implements Runnable, ICommandListener, IAsyncTaskHandler, IMojangStatistics { - - public static final Logger LOGGER = LogManager.getLogger(); -@@ -94,19 +103,61 @@ - private Thread serverThread; - private long ab = az(); - -- public MinecraftServer(File file, Proxy proxy, File file1) { -+ // CraftBukkit start -+ public List worlds = new ArrayList(); -+ public org.bukkit.craftbukkit.CraftServer server; -+ public OptionSet options; -+ public org.bukkit.command.ConsoleCommandSender console; -+ public org.bukkit.command.RemoteConsoleCommandSender remoteConsole; -+ public ConsoleReader reader; -+ public static int currentTick = (int) (System.currentTimeMillis() / 50); -+ public final Thread primaryThread; -+ public java.util.Queue processQueue = new java.util.concurrent.ConcurrentLinkedQueue(); -+ public int autosavePeriod; -+ // CraftBukkit end -+ -+ public MinecraftServer(OptionSet options, Proxy proxy, File file1) { - this.e = proxy; - MinecraftServer.l = this; -- this.universe = file; -+ // this.universe = file; // CraftBukkit - this.q = new ServerConnection(this); - this.Z = new UserCache(this, file1); - this.b = this.h(); -- this.convertable = new WorldLoaderServer(file); -+ // this.convertable = new WorldLoaderServer(file); // CraftBukkit - moved to DedicatedServer.init - this.V = new YggdrasilAuthenticationService(proxy, UUID.randomUUID().toString()); - this.W = this.V.createMinecraftSessionService(); - this.Y = this.V.createProfileRepository(); -+ // CraftBukkit start -+ this.options = options; -+ // Try to see if we're actually running in a terminal, disable jline if not -+ if (System.console() == null && System.getProperty("jline.terminal") == null) { -+ System.setProperty("jline.terminal", "jline.UnsupportedTerminal"); -+ Main.useJline = false; -+ } -+ -+ try { -+ reader = new ConsoleReader(System.in, System.out); -+ reader.setExpandEvents(false); // Avoid parsing exceptions for uncommonly used event designators -+ } catch (Throwable e) { -+ try { -+ // Try again with jline disabled for Windows users without C++ 2008 Redistributable -+ System.setProperty("jline.terminal", "jline.UnsupportedTerminal"); -+ System.setProperty("user.language", "en"); -+ Main.useJline = false; -+ reader = new ConsoleReader(System.in, System.out); -+ reader.setExpandEvents(false); -+ } catch (IOException ex) { -+ LOGGER.warn((String) null, ex); -+ } -+ } -+ Runtime.getRuntime().addShutdownHook(new org.bukkit.craftbukkit.util.ServerShutdownThread(this)); -+ -+ this.serverThread = primaryThread = new Thread(this, "Server thread"); // Moved from main - } - -+ public abstract PropertyManager getPropertyManager(); -+ // CraftBukkit end -+ - protected CommandDispatcher h() { - return new CommandDispatcher(); - } -@@ -144,6 +195,7 @@ - this.a(s); - this.b("menu.loadingLevel"); - 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); - -@@ -167,37 +219,108 @@ - worlddata.a(s1); - worldsettings = new WorldSettings(worlddata); - } -+ */ -+ int worldCount = 3; - -- for (int j = 0; j < this.worldServer.length; ++j) { -- byte b0 = 0; -+ for (int j = 0; j < worldCount; ++j) { -+ WorldServer world; -+ byte dimension = 0; - - if (j == 1) { -- b0 = -1; -+ if (getAllowNether()) { -+ dimension = -1; -+ } else { -+ continue; -+ } - } - - if (j == 2) { -- b0 = 1; -+ if (server.getAllowEnd()) { -+ dimension = 1; -+ } else { -+ continue; -+ } - } - -+ String worldType = org.bukkit.World.Environment.getEnvironment(dimension).toString().toLowerCase(); -+ String name = (dimension == 0) ? s : s + "_" + worldType; -+ -+ org.bukkit.generator.ChunkGenerator gen = this.server.getGenerator(name); -+ WorldSettings worldsettings = new WorldSettings(i, this.getGamemode(), this.getGenerateStructures(), this.isHardcore(), worldtype); -+ worldsettings.setGeneratorSettings(s2); -+ - if (j == 0) { -+ IDataManager idatamanager = new ServerNBTManager(server.getWorldContainer(), s1, true); -+ WorldData worlddata = idatamanager.getWorldData(); -+ if (worlddata == null) { -+ worlddata = new WorldData(worldsettings, s1); -+ } -+ 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.X()) { -- this.worldServer[j] = (WorldServer) (new DemoWorldServer(this, idatamanager, worlddata, b0, this.methodProfiler)).b(); -+ world = (WorldServer) (new DemoWorldServer(this, idatamanager, worlddata, dimension, this.methodProfiler)).b(); - } else { -- this.worldServer[j] = (WorldServer) (new WorldServer(this, idatamanager, worlddata, b0, this.methodProfiler)).b(); -+ world = (WorldServer) (new WorldServer(this, idatamanager, worlddata, dimension, this.methodProfiler, org.bukkit.World.Environment.getEnvironment(dimension), gen)).b(); - } - -- this.worldServer[j].a(worldsettings); -+ world.a(worldsettings); -+ this.server.scoreboardManager = new org.bukkit.craftbukkit.scoreboard.CraftScoreboardManager(this, world.getScoreboard()); - } else { -- this.worldServer[j] = (WorldServer) (new SecondaryWorldServer(this, idatamanager, b0, this.worldServer[0], this.methodProfiler)).b(); -+ String dim = "DIM" + dimension; -+ -+ File newWorld = new File(new File(name), dim); -+ File oldWorld = new File(new File(s), dim); -+ -+ if ((!newWorld.isDirectory()) && (oldWorld.isDirectory())) { -+ MinecraftServer.LOGGER.info("---- Migration of old " + worldType + " folder required ----"); -+ MinecraftServer.LOGGER.info("Unfortunately due to the way that Minecraft implemented multiworld support in 1.6, Bukkit requires that you move your " + worldType + " folder to a new location in order to operate correctly."); -+ MinecraftServer.LOGGER.info("We will move this folder for you, but it will mean that you need to move it back should you wish to stop using Bukkit in the future."); -+ MinecraftServer.LOGGER.info("Attempting to move " + oldWorld + " to " + newWorld + "..."); -+ -+ if (newWorld.exists()) { -+ MinecraftServer.LOGGER.warn("A file or folder already exists at " + newWorld + "!"); -+ MinecraftServer.LOGGER.info("---- Migration of old " + worldType + " folder failed ----"); -+ } else if (newWorld.getParentFile().mkdirs()) { -+ if (oldWorld.renameTo(newWorld)) { -+ MinecraftServer.LOGGER.info("Success! To restore " + worldType + " in the future, simply move " + newWorld + " to " + oldWorld); -+ // Migrate world data too. -+ try { -+ com.google.common.io.Files.copy(new File(new File(s), "level.dat"), new File(new File(name), "level.dat")); -+ } catch (IOException exception) { -+ MinecraftServer.LOGGER.warn("Unable to migrate world data."); -+ } -+ MinecraftServer.LOGGER.info("---- Migration of old " + worldType + " folder complete ----"); -+ } else { -+ MinecraftServer.LOGGER.warn("Could not move folder " + oldWorld + " to " + newWorld + "!"); -+ MinecraftServer.LOGGER.info("---- Migration of old " + worldType + " folder failed ----"); -+ } -+ } else { -+ MinecraftServer.LOGGER.warn("Could not create path for " + newWorld + "!"); -+ MinecraftServer.LOGGER.info("---- Migration of old " + worldType + " folder failed ----"); -+ } -+ } -+ -+ IDataManager idatamanager = new ServerNBTManager(server.getWorldContainer(), name, true); -+ // world =, b0 to dimension, s1 to name, added Environment and gen -+ WorldData worlddata = idatamanager.getWorldData(); -+ if (worlddata == null) { -+ worlddata = new WorldData(worldsettings, name); -+ } -+ 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) -+ world = (WorldServer) new SecondaryWorldServer(this, idatamanager, dimension, this.worlds.get(0), this.methodProfiler, worlddata, org.bukkit.World.Environment.getEnvironment(dimension), gen).b(); - } - -- this.worldServer[j].addIWorldAccess(new WorldManager(this, this.worldServer[j])); -+ this.server.getPluginManager().callEvent(new org.bukkit.event.world.WorldInitEvent(world.getWorld())); -+ -+ world.addIWorldAccess(new WorldManager(this, world)); - if (!this.T()) { -- this.worldServer[j].getWorldData().setGameType(this.getGamemode()); -+ world.getWorldData().setGameType(this.getGamemode()); - } -+ -+ worlds.add(world); -+ getPlayerList().setPlayerFileData(worlds.toArray(new WorldServer[worlds.size()])); - } - -- this.v.setPlayerFileData(this.worldServer); -+ // CraftBukkit end - this.a(this.getDifficulty()); - this.k(); - } -@@ -212,25 +335,38 @@ - this.b("menu.generatingTerrain"); - byte b0 = 0; - -- MinecraftServer.LOGGER.info("Preparing start region for level " + b0); -- WorldServer worldserver = this.worldServer[b0]; -- BlockPosition blockposition = worldserver.getSpawn(); -- long j = az(); -- -- for (int k = -192; k <= 192 && this.isRunning(); k += 16) { -- for (int l = -192; l <= 192 && this.isRunning(); l += 16) { -- long i1 = az(); -- -- if (i1 - j > 1000L) { -- this.a_("Preparing spawn area", i * 100 / 625); -- j = i1; -- } -+ // CraftBukkit start - fire WorldLoadEvent and handle whether or not to keep the spawn in memory -+ for (int m = 0; m < worlds.size(); m++) { -+ WorldServer worldserver = this.worlds.get(m); -+ LOGGER.info("Preparing start region for level " + m + " (Seed: " + worldserver.getSeed() + ")"); -+ -+ if (!worldserver.getWorld().getKeepSpawnInMemory()) { -+ continue; -+ } -+ -+ BlockPosition blockposition = worldserver.getSpawn(); -+ long j = az(); -+ i = 0; -+ -+ for (int k = -192; k <= 192 && this.isRunning(); k += 16) { -+ for (int l = -192; l <= 192 && this.isRunning(); l += 16) { -+ long i1 = az(); -+ -+ if (i1 - j > 1000L) { -+ this.a_("Preparing spawn area", i * 100 / 625); -+ j = i1; -+ } - -- ++i; -- worldserver.chunkProviderServer.getChunkAt(blockposition.getX() + k >> 4, blockposition.getZ() + l >> 4); -+ ++i; -+ worldserver.chunkProviderServer.getChunkAt(blockposition.getX() + k >> 4, blockposition.getZ() + l >> 4); -+ } - } - } - -+ for (WorldServer world : this.worlds) { -+ this.server.getPluginManager().callEvent(new org.bukkit.event.world.WorldLoadEvent(world.getWorld())); -+ } -+ // CraftBukkit end - this.s(); - } - -@@ -266,15 +402,19 @@ - protected void s() { - this.f = null; - this.g = 0; -+ -+ this.server.enablePlugins(org.bukkit.plugin.PluginLoadOrder.POSTWORLD); // CraftBukkit - } - -- protected void saveChunks(boolean flag) { -+ protected void saveChunks(boolean flag) throws ExceptionWorldConflict { // CraftBukkit - added throws - if (!this.N) { - WorldServer[] aworldserver = this.worldServer; - int i = aworldserver.length; - -- for (int j = 0; j < i; ++j) { -- WorldServer worldserver = aworldserver[j]; -+ // CraftBukkit start -+ for (int j = 0; j < worlds.size(); ++j) { -+ WorldServer worldserver = worlds.get(j); -+ // CraftBukkit end - - if (worldserver != null) { - if (!flag) { -@@ -283,6 +423,7 @@ - - try { - worldserver.save(true, (IProgressUpdate) null); -+ worldserver.saveLevel(); // CraftBukkit - } catch (ExceptionWorldConflict exceptionworldconflict) { - MinecraftServer.LOGGER.warn(exceptionworldconflict.getMessage()); - } -@@ -292,9 +433,25 @@ - } - } - -- protected void stop() { -+ // CraftBukkit start -+ private boolean hasStopped = false; -+ private final Object stopLock = new Object(); -+ // CraftBukkit end -+ -+ public void stop() throws ExceptionWorldConflict { // CraftBukkit - added throws -+ // CraftBukkit start - prevent double stopping on multiple threads -+ synchronized(stopLock) { -+ if (hasStopped) return; -+ hasStopped = true; -+ } -+ // CraftBukkit end - if (!this.N) { - MinecraftServer.LOGGER.info("Stopping server"); -+ // CraftBukkit start -+ if (this.server != null) { -+ this.server.disablePlugins(); -+ } -+ // CraftBukkit end - if (this.aq() != null) { - this.aq().b(); - } -@@ -303,17 +460,20 @@ - MinecraftServer.LOGGER.info("Saving players"); - this.v.savePlayers(); - this.v.u(); -+ try { Thread.sleep(100); } catch (InterruptedException ex) {} // CraftBukkit - SPIGOT-625 - give server at least a chance to send packets - } - - if (this.worldServer != null) { - MinecraftServer.LOGGER.info("Saving worlds"); - this.saveChunks(false); - -+ /* CraftBukkit start - Handled in saveChunks - for (int i = 0; i < this.worldServer.length; ++i) { - WorldServer worldserver = this.worldServer[i]; - - worldserver.saveLevel(); - } -+ // CraftBukkit end */ - } - - if (this.n.d()) { -@@ -354,6 +514,7 @@ - long k = j - this.ab; - - if (k > 2000L && this.ab - this.R >= 15000L) { -+ if (server.getWarnOnOverload()) // CraftBukkit - MinecraftServer.LOGGER.warn("Can\'t keep up! Did the system time change, or is the server overloaded? Running {}ms behind, skipping {} tick(s)", new Object[] { Long.valueOf(k), Long.valueOf(k / 50L)}); - k = 2000L; - this.R = this.ab; -@@ -366,11 +527,12 @@ - - i += k; - this.ab = j; -- if (this.worldServer[0].everyoneDeeplySleeping()) { -+ if (this.worlds.get(0).everyoneDeeplySleeping()) { // CraftBukkit - this.A(); - i = 0L; - } else { - while (i > 50L) { -+ MinecraftServer.currentTick = (int) (System.currentTimeMillis() / 50); // CraftBukkit - i -= 50L; - this.A(); - } -@@ -408,6 +570,12 @@ - } catch (Throwable throwable1) { - MinecraftServer.LOGGER.error("Exception stopping the server", throwable1); - } finally { -+ // CraftBukkit start - Restore terminal to original settings -+ try { -+ reader.getTerminal().restore(); -+ } catch (Exception ignored) { -+ } -+ // CraftBukkit end - this.z(); - } - -@@ -447,7 +615,7 @@ - - protected void z() {} - -- protected void A() { -+ protected void A() throws ExceptionWorldConflict { // CraftBukkit - added throws - long i = System.nanoTime(); - - ++this.ticks; -@@ -473,7 +641,7 @@ - this.r.b().a(agameprofile); - } - -- if (this.ticks % 900 == 0) { -+ if (autosavePeriod > 0 && this.ticks % autosavePeriod == 0) { // CraftBukkit - this.methodProfiler.a("save"); - this.v.savePlayers(); - this.saveChunks(true); -@@ -508,20 +676,40 @@ - - this.methodProfiler.c("levels"); - -+ // CraftBukkit start -+ this.server.getScheduler().mainThreadHeartbeat(this.ticks); -+ -+ // Run tasks that are waiting on processing -+ while (!processQueue.isEmpty()) { -+ processQueue.remove().run(); -+ } -+ -+ org.bukkit.craftbukkit.chunkio.ChunkIOExecutor.tick(); -+ -+ // Send time updates to everyone, it will get the right time from the world the player is in. -+ if (this.ticks % 20 == 0) { -+ for (int i = 0; i < this.getPlayerList().players.size(); ++i) { -+ EntityPlayer entityplayer = (EntityPlayer) this.getPlayerList().players.get(i); -+ entityplayer.playerConnection.sendPacket(new PacketPlayOutUpdateTime(entityplayer.world.getTime(), entityplayer.getPlayerTime(), entityplayer.world.getGameRules().getBoolean("doDaylightCycle"))); // Add support for per player time -+ } -+ } -+ - int i; - -- for (i = 0; i < this.worldServer.length; ++i) { -+ for (i = 0; i < this.worlds.size(); ++i) { - long j = System.nanoTime(); - -- if (i == 0 || this.getAllowNether()) { -- WorldServer worldserver = this.worldServer[i]; -+ // if (i == 0 || this.getAllowNether()) { -+ WorldServer worldserver = this.worlds.get(i); - - this.methodProfiler.a(worldserver.getWorldData().getName()); -+ /* Drop global time updates - if (this.ticks % 20 == 0) { - this.methodProfiler.a("timeSync"); - this.v.a(new PacketPlayOutUpdateTime(worldserver.getTime(), worldserver.getDayTime(), worldserver.getGameRules().getBoolean("doDaylightCycle")), worldserver.worldProvider.getDimension()); - this.methodProfiler.b(); - } -+ // CraftBukkit end */ - - this.methodProfiler.a("tick"); - -@@ -548,9 +736,9 @@ - worldserver.getTracker().updatePlayers(); - this.methodProfiler.b(); - this.methodProfiler.b(); -- } -+ // } // CraftBukkit - -- this.i[i][this.ticks % 100] = System.nanoTime() - j; -+ // this.i[i][this.ticks % 100] = System.nanoTime() - j; // CraftBukkit - } - - this.methodProfiler.c("connection"); -@@ -574,10 +762,11 @@ - this.p.add(iupdateplayerlistbox); - } - -- public static void main(String[] astring) { -+ public static void main(final OptionSet options) { // CraftBukkit - replaces main(String[] astring) - DispenserRegistry.c(); - - try { -+ /* CraftBukkit start - Replace everything - boolean flag = true; - String s = null; - String s1 = "."; -@@ -655,15 +844,38 @@ - dedicatedserver.stop(); - } - }); -+ */ -+ -+ DedicatedServer dedicatedserver = new DedicatedServer(options); -+ -+ if (options.has("port")) { -+ int port = (Integer) options.valueOf("port"); -+ if (port > 0) { -+ dedicatedserver.setPort(port); -+ } -+ } -+ -+ if (options.has("universe")) { -+ dedicatedserver.universe = (File) options.valueOf("universe"); -+ } -+ -+ if (options.has("world")) { -+ dedicatedserver.setWorld((String) options.valueOf("world")); -+ } -+ -+ dedicatedserver.primaryThread.start(); -+ // CraftBukkit end - } catch (Exception exception) { - MinecraftServer.LOGGER.fatal("Failed to start the minecraft server", exception); - } - - } - -- public void D() { -+ public void C() { -+ /* CraftBukkit start - prevent abuse - this.serverThread = new Thread(this, "Server thread"); - this.serverThread.start(); -+ // CraftBukkit end */ - } - - public File d(String s) { -@@ -679,7 +891,14 @@ - } - - public WorldServer getWorldServer(int i) { -- return i == -1 ? this.worldServer[1] : (i == 1 ? this.worldServer[2] : this.worldServer[0]); -+ // CraftBukkit start -+ for (WorldServer world : worlds) { -+ if (world.dimension == i) { -+ return world; -+ } -+ } -+ return worlds.get(0); -+ // CraftBukkit end - } - - public String E() { -@@ -715,7 +934,7 @@ - } - - public boolean isDebugging() { -- return false; -+ return this.getPropertyManager().getBoolean("debug", false); // CraftBukkit - don't hardcode - } - - public void g(String s) { -@@ -730,7 +949,7 @@ - } - - public String getServerModName() { -- return "vanilla"; -+ return server.getName(); // CraftBukkit - cb > vanilla! - } - - public CrashReport b(CrashReport crashreport) { -@@ -759,6 +978,7 @@ - } - - public List tabCompleteCommand(ICommandListener icommandlistener, String s, BlockPosition blockposition) { -+ /* CraftBukkit start - Allow tab-completion of Bukkit commands - ArrayList arraylist = Lists.newArrayList(); - - if (s.startsWith("/")) { -@@ -797,6 +1017,9 @@ - - return arraylist; - } -+ */ -+ return server.tabComplete(icommandlistener, s); -+ // CraftBukkit end - } - - public static MinecraftServer getServer() { -@@ -804,7 +1027,7 @@ - } - - public boolean O() { -- return this.universe != null; -+ return true; // CraftBukkit - } - - public String getName() { -@@ -860,8 +1083,10 @@ - } - - public void a(EnumDifficulty enumdifficulty) { -- for (int i = 0; i < this.worldServer.length; ++i) { -- WorldServer worldserver = this.worldServer[i]; -+ // CraftBukkit start -+ for (int i = 0; i < this.worlds.size(); ++i) { -+ WorldServer worldserver = this.worlds.get(i); -+ // CraftBukkit end - - if (worldserver != null) { - if (worldserver.getWorldData().isHardcore()) { -@@ -903,15 +1128,17 @@ - this.N = true; - this.getConvertable().d(); - -- for (int i = 0; i < this.worldServer.length; ++i) { -- WorldServer worldserver = this.worldServer[i]; -- -+ // CraftBukkit start -+ for (int i = 0; i < this.worlds.size(); ++i) { -+ WorldServer worldserver = this.worlds.get(i); -+ // CraftBukkit end -+ - if (worldserver != null) { - worldserver.saveLevel(); - } - } - -- this.getConvertable().e(this.worldServer[0].getDataManager().g()); -+ this.getConvertable().e(this.worlds.get(0).getDataManager().g()); // CraftBukkit - this.safeShutdown(); - } - -@@ -944,9 +1171,11 @@ - int i = 0; - - if (this.worldServer != null) { -- for (int j = 0; j < this.worldServer.length; ++j) { -- if (this.worldServer[j] != null) { -- WorldServer worldserver = this.worldServer[j]; -+ // CraftBukkit start -+ for (int j = 0; j < this.worlds.size(); ++j) { -+ WorldServer worldserver = this.worlds.get(j); -+ if (worldserver != null) { -+ // CraftBukkit end - WorldData worlddata = worldserver.getWorldData(); - - mojangstatisticsgenerator.a("world[" + i + "][dimension]", Integer.valueOf(worldserver.worldProvider.getDimension())); -@@ -979,7 +1208,7 @@ - public abstract boolean ae(); - - public boolean getOnlineMode() { -- return this.onlineMode; -+ return server.getOnlineMode(); // CraftBukkit - } - - public void setOnlineMode(boolean flag) { -@@ -1051,8 +1280,9 @@ - } - - public void setGamemode(WorldSettings.EnumGamemode worldsettings_enumgamemode) { -- for (int i = 0; i < this.worldServer.length; ++i) { -- getServer().worldServer[i].getWorldData().setGameType(worldsettings_enumgamemode); -+ // CraftBukkit start -+ for (int i = 0; i < this.worlds.size(); ++i) { -+ getServer().worlds.get(i).getWorldData().setGameType(worldsettings_enumgamemode); - } - - } -@@ -1084,7 +1314,7 @@ - } - - public World getWorld() { -- return this.worldServer[0]; -+ return this.worlds.get(0); // CraftBukkit - } - - public Entity f() { -@@ -1155,8 +1385,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); -@@ -1171,7 +1403,7 @@ - } - - public boolean getSendCommandFeedback() { -- return getServer().worldServer[0].getGameRules().getBoolean("sendCommandFeedback"); -+ return getServer().worlds.get(0).getGameRules().getBoolean("sendCommandFeedback"); - } - - public void a(CommandObjectiveExecutor.EnumCommandResult commandobjectiveexecutor_enumcommandresult, int i) {} -@@ -1182,7 +1414,7 @@ - - public ListenableFuture a(Callable callable) { - Validate.notNull(callable); -- if (!this.isMainThread() && !this.isStopped()) { -+ if (!this.isMainThread()) { // CraftBukkit && !this.isStopped()) { - ListenableFutureTask listenablefuturetask = ListenableFutureTask.create(callable); - Queue queue = this.j; - diff --git a/TacoSpigot-Server/nms-patches/MobEffectList.patch b/TacoSpigot-Server/nms-patches/MobEffectList.patch deleted file mode 100644 index dae68b4..0000000 --- a/TacoSpigot-Server/nms-patches/MobEffectList.patch +++ /dev/null @@ -1,73 +0,0 @@ ---- a/net/minecraft/server/MobEffectList.java -+++ b/net/minecraft/server/MobEffectList.java -@@ -7,6 +7,11 @@ - import java.util.UUID; - import java.util.Map.Entry; - -+// CraftBukkit start -+import org.bukkit.craftbukkit.event.CraftEventFactory; -+import org.bukkit.event.entity.EntityRegainHealthEvent.RegainReason; -+// CraftBukkit end -+ - public class MobEffectList { - - public static final MobEffectList[] byId = new MobEffectList[32]; -@@ -64,6 +69,7 @@ - } - - this.L = j; -+ org.bukkit.potion.PotionEffectType.registerPotionEffectType(new org.bukkit.craftbukkit.potion.CraftPotionEffectType(this)); // CraftBukkit - } - - public static MobEffectList b(String s) { -@@ -86,11 +92,11 @@ - public void tick(EntityLiving entityliving, int i) { - if (this.id == MobEffectList.REGENERATION.id) { - if (entityliving.getHealth() < entityliving.getMaxHealth()) { -- entityliving.heal(1.0F); -+ entityliving.heal(1.0F, RegainReason.MAGIC_REGEN); // CraftBukkit - } - } else if (this.id == MobEffectList.POISON.id) { - if (entityliving.getHealth() > 1.0F) { -- entityliving.damageEntity(DamageSource.MAGIC, 1.0F); -+ entityliving.damageEntity(CraftEventFactory.POISON, 1.0F); // CraftBukkit - DamageSource.MAGIC -> CraftEventFactory.POISON - } - } else if (this.id == MobEffectList.WITHER.id) { - entityliving.damageEntity(DamageSource.WITHER, 1.0F); -@@ -98,14 +104,25 @@ - ((EntityHuman) entityliving).applyExhaustion(0.025F * (float) (i + 1)); - } else if (this.id == MobEffectList.SATURATION.id && entityliving instanceof EntityHuman) { - if (!entityliving.world.isClientSide) { -- ((EntityHuman) entityliving).getFoodData().eat(i + 1, 1.0F); -+ // CraftBukkit start -+ EntityHuman entityhuman = (EntityHuman) entityliving; -+ int oldFoodLevel = entityhuman.getFoodData().foodLevel; -+ -+ org.bukkit.event.entity.FoodLevelChangeEvent event = CraftEventFactory.callFoodLevelChangeEvent(entityhuman, i + 1 + oldFoodLevel); -+ -+ if (!event.isCancelled()) { -+ entityhuman.getFoodData().eat(event.getFoodLevel() - oldFoodLevel, 1.0F); -+ } -+ -+ ((EntityPlayer) entityhuman).playerConnection.sendPacket(new PacketPlayOutUpdateHealth(((EntityPlayer) entityhuman).getBukkitEntity().getScaledHealth(), entityhuman.getFoodData().foodLevel, entityhuman.getFoodData().saturationLevel)); -+ // CraftBukkit end - } - } else if ((this.id != MobEffectList.HEAL.id || entityliving.bm()) && (this.id != MobEffectList.HARM.id || !entityliving.bm())) { - if (this.id == MobEffectList.HARM.id && !entityliving.bm() || this.id == MobEffectList.HEAL.id && entityliving.bm()) { - entityliving.damageEntity(DamageSource.MAGIC, (float) (6 << i)); - } - } else { -- entityliving.heal((float) Math.max(4 << i, 0)); -+ entityliving.heal((float) Math.max(4 << i, 0), RegainReason.MAGIC); // CraftBukkit - } - - } -@@ -124,7 +141,7 @@ - } - } else { - j = (int) (d0 * (double) (4 << i) + 0.5D); -- entityliving.heal((float) j); -+ entityliving.heal((float) j, RegainReason.MAGIC); // CraftBukkit - } - - } diff --git a/TacoSpigot-Server/nms-patches/MobSpawnerAbstract.patch b/TacoSpigot-Server/nms-patches/MobSpawnerAbstract.patch deleted file mode 100644 index ccf99ef..0000000 --- a/TacoSpigot-Server/nms-patches/MobSpawnerAbstract.patch +++ /dev/null @@ -1,50 +0,0 @@ ---- a/net/minecraft/server/MobSpawnerAbstract.java -+++ b/net/minecraft/server/MobSpawnerAbstract.java -@@ -4,6 +4,8 @@ - import java.util.Iterator; - import java.util.List; - -+import org.bukkit.event.entity.CreatureSpawnEvent; // CraftBukkit -+ - public abstract class MobSpawnerAbstract { - - public int spawnDelay = 20; -@@ -24,6 +26,11 @@ - - public String getMobName() { - if (this.i() == null) { -+ // CraftBukkit start - fix NPE -+ if (this.mobName == null) { -+ this.mobName = "Pig"; -+ } -+ // CraftBukkit end - if (this.mobName != null && this.mobName.equals("Minecart")) { - this.mobName = "MinecartRideable"; - } -@@ -129,7 +136,7 @@ - - entity.f(nbttagcompound); - if (entity.world != null && flag) { -- entity.world.addEntity(entity); -+ entity.world.addEntity(entity, CreatureSpawnEvent.SpawnReason.SPAWNER); // CraftBukkit - } - - NBTTagCompound nbttagcompound1; -@@ -154,7 +161,7 @@ - entity2.f(nbttagcompound2); - entity2.setPositionRotation(entity1.locX, entity1.locY, entity1.locZ, entity1.yaw, entity1.pitch); - if (entity.world != null && flag) { -- entity.world.addEntity(entity2); -+ entity.world.addEntity(entity2, CreatureSpawnEvent.SpawnReason.SPAWNER); // CraftBukkit - } - - entity1.mount(entity2); -@@ -167,7 +174,7 @@ - ((EntityInsentient) entity).prepare(entity.world.E(new BlockPosition(entity)), (GroupDataEntity) null); - } - -- entity.world.addEntity(entity); -+ entity.world.addEntity(entity, CreatureSpawnEvent.SpawnReason.SPAWNER); // CraftBukkit - } - - return entity; diff --git a/TacoSpigot-Server/nms-patches/NBTTagList.patch b/TacoSpigot-Server/nms-patches/NBTTagList.patch deleted file mode 100644 index a91a3e3..0000000 --- a/TacoSpigot-Server/nms-patches/NBTTagList.patch +++ /dev/null @@ -1,10 +0,0 @@ ---- a/net/minecraft/server/NBTTagList.java -+++ b/net/minecraft/server/NBTTagList.java -@@ -40,6 +40,7 @@ - } else { - this.type = datainput.readByte(); - int j = datainput.readInt(); -+ nbtreadlimiter.a(j * 8); // CraftBukkit - - if (this.type == 0 && j > 0) { - throw new RuntimeException("Missing type on ListTag"); diff --git a/TacoSpigot-Server/nms-patches/NameReferencingFileConverter.patch b/TacoSpigot-Server/nms-patches/NameReferencingFileConverter.patch deleted file mode 100644 index 2d49bf1..0000000 --- a/TacoSpigot-Server/nms-patches/NameReferencingFileConverter.patch +++ /dev/null @@ -1,90 +0,0 @@ ---- a/net/minecraft/server/NameReferencingFileConverter.java -+++ b/net/minecraft/server/NameReferencingFileConverter.java -@@ -87,8 +87,9 @@ - if (gameprofilebanlist.c().exists()) { - try { - gameprofilebanlist.load(); -- } catch (FileNotFoundException filenotfoundexception) { -- NameReferencingFileConverter.e.warn("Could not load existing file " + gameprofilebanlist.c().getName(), filenotfoundexception); -+ // CraftBukkit start - FileNotFoundException -> IOException, don't print stacetrace -+ } catch (IOException filenotfoundexception) { -+ NameReferencingFileConverter.e.warn("Could not load existing file " + gameprofilebanlist.c().getName()); - } - } - -@@ -145,8 +146,9 @@ - if (ipbanlist.c().exists()) { - try { - ipbanlist.load(); -- } catch (FileNotFoundException filenotfoundexception) { -- NameReferencingFileConverter.e.warn("Could not load existing file " + ipbanlist.c().getName(), filenotfoundexception); -+ // CraftBukkit start - FileNotFoundException -> IOException, don't print stacetrace -+ } catch (IOException filenotfoundexception) { -+ NameReferencingFileConverter.e.warn("Could not load existing file " + ipbanlist.c().getName()); - } - } - -@@ -186,8 +188,9 @@ - if (oplist.c().exists()) { - try { - oplist.load(); -- } catch (FileNotFoundException filenotfoundexception) { -- NameReferencingFileConverter.e.warn("Could not load existing file " + oplist.c().getName(), filenotfoundexception); -+ // CraftBukkit start - FileNotFoundException -> IOException, don't print stacetrace -+ } catch (IOException filenotfoundexception) { -+ NameReferencingFileConverter.e.warn("Could not load existing file " + oplist.c().getName()); - } - } - -@@ -230,8 +233,9 @@ - if (whitelist.c().exists()) { - try { - whitelist.load(); -- } catch (FileNotFoundException filenotfoundexception) { -- NameReferencingFileConverter.e.warn("Could not load existing file " + whitelist.c().getName(), filenotfoundexception); -+ // CraftBukkit start - FileNotFoundException -> IOException, don't print stacetrace -+ } catch (IOException filenotfoundexception) { -+ NameReferencingFileConverter.e.warn("Could not load existing file " + whitelist.c().getName()); - } - } - -@@ -350,6 +354,30 @@ - File file1 = new File(file2, s + ".dat"); - File file3 = new File(file, s1 + ".dat"); - -+ // CraftBukkit start - Use old file name to seed lastKnownName -+ NBTTagCompound root = null; -+ -+ try { -+ root = NBTCompressedStreamTools.a(new java.io.FileInputStream(file1)); -+ } catch (Exception exception) { -+ exception.printStackTrace(); -+ } -+ -+ if (root != null) { -+ if (!root.hasKey("bukkit")) { -+ root.set("bukkit", new NBTTagCompound()); -+ } -+ NBTTagCompound data = root.getCompound("bukkit"); -+ data.setString("lastKnownName", s); -+ -+ try { -+ NBTCompressedStreamTools.a(root, new java.io.FileOutputStream(file2)); -+ } catch (Exception exception) { -+ exception.printStackTrace(); -+ } -+ } -+ // CraftBukkit end -+ - NameReferencingFileConverter.b(file); - if (!file1.renameTo(file3)) { - throw new NameReferencingFileConverter.FileConversionException("Could not convert file for " + s, null); -@@ -467,7 +495,7 @@ - - private static File d(PropertyManager propertymanager) { - String s = propertymanager.getString("level-name", "world"); -- File file = new File(s); -+ File file = new File(MinecraftServer.getServer().server.getWorldContainer(), s); // CraftBukkit - Respect container setting - - return new File(file, "players"); - } diff --git a/TacoSpigot-Server/nms-patches/NetworkManager.patch b/TacoSpigot-Server/nms-patches/NetworkManager.patch deleted file mode 100644 index b41fb16..0000000 --- a/TacoSpigot-Server/nms-patches/NetworkManager.patch +++ /dev/null @@ -1,20 +0,0 @@ ---- a/net/minecraft/server/NetworkManager.java -+++ b/net/minecraft/server/NetworkManager.java -@@ -231,7 +231,7 @@ - - public void close(IChatBaseComponent ichatbasecomponent) { - if (this.channel.isOpen()) { -- this.channel.close().awaitUninterruptibly(); -+ this.channel.close(); // We can't wait as this may be called from an event loop. - this.n = ichatbasecomponent; - } - -@@ -308,7 +308,7 @@ - } - } - -- protected void channelRead0(ChannelHandlerContext channelhandlercontext, Object object) throws Exception { -+ protected void channelRead0(ChannelHandlerContext channelhandlercontext, Packet object) throws Exception { // CraftBukkit - fix decompile error - this.a(channelhandlercontext, (Packet) object); - } - diff --git a/TacoSpigot-Server/nms-patches/PacketDataSerializer.patch b/TacoSpigot-Server/nms-patches/PacketDataSerializer.patch deleted file mode 100644 index c66b7b5..0000000 --- a/TacoSpigot-Server/nms-patches/PacketDataSerializer.patch +++ /dev/null @@ -1,67 +0,0 @@ ---- a/net/minecraft/server/PacketDataSerializer.java -+++ b/net/minecraft/server/PacketDataSerializer.java -@@ -21,6 +21,8 @@ - import java.nio.charset.Charset; - import java.util.UUID; - -+import org.bukkit.craftbukkit.inventory.CraftItemStack; // CraftBukkit -+ - public class PacketDataSerializer extends ByteBuf { - - private final ByteBuf a; -@@ -68,7 +70,7 @@ - } - - public > T a(Class oclass) { -- return ((Enum[]) oclass.getEnumConstants())[this.e()]; -+ return ((T[]) oclass.getEnumConstants())[this.e()]; // CraftBukkit - fix decompile error - } - - public void a(Enum oenum) { -@@ -142,7 +144,7 @@ - } else { - try { - NBTCompressedStreamTools.a(nbttagcompound, (DataOutput) (new ByteBufOutputStream(this))); -- } catch (IOException ioexception) { -+ } catch (Exception ioexception) { // CraftBukkit - IOException -> Exception - throw new EncoderException(ioexception); - } - } -@@ -162,7 +164,7 @@ - } - - public void a(ItemStack itemstack) { -- if (itemstack == null) { -+ if (itemstack == null || itemstack.getItem() == null) { // CraftBukkit - NPE fix itemstack.getItem() - this.writeShort(-1); - } else { - this.writeShort(Item.getId(itemstack.getItem())); -@@ -189,6 +191,11 @@ - - itemstack = new ItemStack(Item.getById(short0), b0, short1); - itemstack.setTag(this.h()); -+ // CraftBukkit start -+ if (itemstack.getTag() != null) { -+ CraftItemStack.setItemMeta(itemstack, CraftItemStack.getItemMeta(itemstack)); -+ } -+ // CraftBukkit end - } - - return itemstack; -@@ -803,16 +810,4 @@ - public boolean release(int i) { - return this.a.release(i); - } -- -- public ReferenceCounted retain(int i) { -- return this.retain(i); -- } -- -- public ReferenceCounted retain() { -- return this.retain(); -- } -- -- public int compareTo(Object object) { -- return this.compareTo((ByteBuf) object); -- } - } diff --git a/TacoSpigot-Server/nms-patches/PacketPlayInBlockPlace.patch b/TacoSpigot-Server/nms-patches/PacketPlayInBlockPlace.patch deleted file mode 100644 index c008192..0000000 --- a/TacoSpigot-Server/nms-patches/PacketPlayInBlockPlace.patch +++ /dev/null @@ -1,28 +0,0 @@ ---- a/net/minecraft/server/PacketPlayInBlockPlace.java -+++ b/net/minecraft/server/PacketPlayInBlockPlace.java -@@ -12,6 +12,8 @@ - private float f; - private float g; - -+ public long timestamp; // CraftBukkit -+ - public PacketPlayInBlockPlace() {} - - public PacketPlayInBlockPlace(ItemStack itemstack) { -@@ -28,6 +30,7 @@ - } - - public void a(PacketDataSerializer packetdataserializer) throws IOException { -+ timestamp = System.currentTimeMillis(); // CraftBukkit - this.b = packetdataserializer.c(); - this.c = packetdataserializer.readUnsignedByte(); - this.d = packetdataserializer.i(); -@@ -72,8 +75,4 @@ - public float f() { - return this.g; - } -- -- public void a(PacketListener packetlistener) { -- this.a((PacketListenerPlayIn) packetlistener); -- } - } diff --git a/TacoSpigot-Server/nms-patches/PacketPlayInCloseWindow.patch b/TacoSpigot-Server/nms-patches/PacketPlayInCloseWindow.patch deleted file mode 100644 index b7678c6..0000000 --- a/TacoSpigot-Server/nms-patches/PacketPlayInCloseWindow.patch +++ /dev/null @@ -1,24 +0,0 @@ ---- a/net/minecraft/server/PacketPlayInCloseWindow.java -+++ b/net/minecraft/server/PacketPlayInCloseWindow.java -@@ -8,6 +8,12 @@ - - public PacketPlayInCloseWindow() {} - -+ // CraftBukkit start -+ public PacketPlayInCloseWindow(int id) { -+ this.id = id; -+ } -+ // CraftBukkit end -+ - public void a(PacketListenerPlayIn packetlistenerplayin) { - packetlistenerplayin.a(this); - } -@@ -19,8 +25,4 @@ - public void b(PacketDataSerializer packetdataserializer) throws IOException { - packetdataserializer.writeByte(this.id); - } -- -- public void a(PacketListener packetlistener) { -- this.a((PacketListenerPlayIn) packetlistener); -- } - } diff --git a/TacoSpigot-Server/nms-patches/PacketPlayInResourcePackStatus.patch b/TacoSpigot-Server/nms-patches/PacketPlayInResourcePackStatus.patch deleted file mode 100644 index b6bbd0d..0000000 --- a/TacoSpigot-Server/nms-patches/PacketPlayInResourcePackStatus.patch +++ /dev/null @@ -1,22 +0,0 @@ ---- a/net/minecraft/server/PacketPlayInResourcePackStatus.java -+++ b/net/minecraft/server/PacketPlayInResourcePackStatus.java -@@ -5,7 +5,7 @@ - public class PacketPlayInResourcePackStatus implements Packet { - - private String a; -- private PacketPlayInResourcePackStatus.EnumResourcePackStatus b; -+ public PacketPlayInResourcePackStatus.EnumResourcePackStatus b; // PAIL: private -> public, rename: status - - public PacketPlayInResourcePackStatus() {} - -@@ -23,10 +23,6 @@ - packetlistenerplayin.a(this); - } - -- public void a(PacketListener packetlistener) { -- this.a((PacketListenerPlayIn) packetlistener); -- } -- - public static enum EnumResourcePackStatus { - - SUCCESSFULLY_LOADED, DECLINED, FAILED_DOWNLOAD, ACCEPTED; diff --git a/TacoSpigot-Server/nms-patches/PacketStatusListener.patch b/TacoSpigot-Server/nms-patches/PacketStatusListener.patch deleted file mode 100644 index 075488f..0000000 --- a/TacoSpigot-Server/nms-patches/PacketStatusListener.patch +++ /dev/null @@ -1,119 +0,0 @@ ---- a/net/minecraft/server/PacketStatusListener.java -+++ b/net/minecraft/server/PacketStatusListener.java -@@ -1,5 +1,16 @@ - package net.minecraft.server; - -+// CraftBukkit start -+import com.mojang.authlib.GameProfile; -+import io.netty.channel.ChannelFutureListener; -+import java.net.InetSocketAddress; -+import java.util.Iterator; -+ -+import org.bukkit.craftbukkit.util.CraftIconCache; -+import org.bukkit.entity.Player; -+ -+// CraftBukkit end -+ - public class PacketStatusListener implements PacketStatusInListener { - - private static final IChatBaseComponent a = new ChatComponentText("Status request has been handled."); -@@ -17,10 +28,96 @@ - public void a(PacketStatusInStart packetstatusinstart) { - if (this.d) { - this.networkManager.close(PacketStatusListener.a); -- } else { -- this.d = true; -- this.networkManager.handle(new PacketStatusOutServerInfo(this.minecraftServer.aG())); -+ // CraftBukkit start - fire ping event -+ return; -+ } -+ this.d = true; -+ // this.networkManager.handle(new PacketStatusOutServerInfo(this.minecraftServer.aG())); -+ final Object[] players = minecraftServer.getPlayerList().players.toArray(); -+ class ServerListPingEvent extends org.bukkit.event.server.ServerListPingEvent { -+ CraftIconCache icon = minecraftServer.server.getServerIcon(); -+ -+ ServerListPingEvent() { -+ super(((InetSocketAddress) networkManager.getSocketAddress()).getAddress(), minecraftServer.getMotd(), minecraftServer.getPlayerList().getMaxPlayers()); -+ } -+ -+ @Override -+ public void setServerIcon(org.bukkit.util.CachedServerIcon icon) { -+ if (!(icon instanceof CraftIconCache)) { -+ throw new IllegalArgumentException(icon + " was not created by " + org.bukkit.craftbukkit.CraftServer.class); -+ } -+ this.icon = (CraftIconCache) icon; -+ } -+ -+ @Override -+ public Iterator iterator() throws UnsupportedOperationException { -+ return new Iterator() { -+ int i; -+ int ret = Integer.MIN_VALUE; -+ EntityPlayer player; -+ -+ @Override -+ public boolean hasNext() { -+ if (player != null) { -+ return true; -+ } -+ final Object[] currentPlayers = players; -+ for (int length = currentPlayers.length, i = this.i; i < length; i++) { -+ final EntityPlayer player = (EntityPlayer) currentPlayers[i]; -+ if (player != null) { -+ this.i = i + 1; -+ this.player = player; -+ return true; -+ } -+ } -+ return false; -+ } -+ -+ @Override -+ public Player next() { -+ if (!hasNext()) { -+ throw new java.util.NoSuchElementException(); -+ } -+ final EntityPlayer player = this.player; -+ this.player = null; -+ this.ret = this.i - 1; -+ return player.getBukkitEntity(); -+ } -+ -+ @Override -+ public void remove() { -+ final Object[] currentPlayers = players; -+ final int i = this.ret; -+ if (i < 0 || currentPlayers[i] == null) { -+ throw new IllegalStateException(); -+ } -+ currentPlayers[i] = null; -+ } -+ }; -+ } -+ } -+ -+ ServerListPingEvent event = new ServerListPingEvent(); -+ this.minecraftServer.server.getPluginManager().callEvent(event); -+ -+ java.util.List profiles = new java.util.ArrayList(players.length); -+ for (Object player : players) { -+ if (player != null) { -+ profiles.add(((EntityPlayer) player).getProfile()); -+ } - } -+ -+ ServerPing.ServerPingPlayerSample playerSample = new ServerPing.ServerPingPlayerSample(event.getMaxPlayers(), profiles.size()); -+ playerSample.a(profiles.toArray(new GameProfile[profiles.size()])); -+ -+ ServerPing ping = new ServerPing(); -+ ping.setFavicon(event.icon.value); -+ ping.setMOTD(new ChatComponentText(event.getMotd())); -+ ping.setPlayerSample(playerSample); -+ ping.setServerInfo(new ServerPing.ServerData(minecraftServer.getServerModName() + " " + minecraftServer.getVersion(), 47)); // TODO: Update when protocol changes -+ -+ this.networkManager.handle(new PacketStatusOutServerInfo(ping)); -+ // CraftBukkit end - } - - public void a(PacketStatusInPing packetstatusinping) { diff --git a/TacoSpigot-Server/nms-patches/Path.patch b/TacoSpigot-Server/nms-patches/Path.patch deleted file mode 100644 index caa5459..0000000 --- a/TacoSpigot-Server/nms-patches/Path.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- a/net/minecraft/server/Path.java -+++ b/net/minecraft/server/Path.java -@@ -2,7 +2,7 @@ - - public class Path { - -- private PathPoint[] a = new PathPoint[1024]; -+ private PathPoint[] a = new PathPoint[128]; // CraftBukkit - reduce default size - private int b; - - public Path() {} diff --git a/TacoSpigot-Server/nms-patches/PathfinderGoalBreakDoor.patch b/TacoSpigot-Server/nms-patches/PathfinderGoalBreakDoor.patch deleted file mode 100644 index 3f61dbe..0000000 --- a/TacoSpigot-Server/nms-patches/PathfinderGoalBreakDoor.patch +++ /dev/null @@ -1,15 +0,0 @@ ---- a/net/minecraft/server/PathfinderGoalBreakDoor.java -+++ b/net/minecraft/server/PathfinderGoalBreakDoor.java -@@ -63,6 +63,12 @@ - } - - if (this.g == 240 && this.a.world.getDifficulty() == EnumDifficulty.HARD) { -+ // CraftBukkit start -+ if (org.bukkit.craftbukkit.event.CraftEventFactory.callEntityBreakDoorEvent(this.a, this.b.getX(), this.b.getY(), this.b.getZ()).isCancelled()) { -+ this.c(); -+ return; -+ } -+ // CraftBukkit end - this.a.world.setAir(this.b); - this.a.world.triggerEffect(1012, this.b, 0); - this.a.world.triggerEffect(2001, this.b, Block.getId(this.c)); diff --git a/TacoSpigot-Server/nms-patches/PathfinderGoalBreed.patch b/TacoSpigot-Server/nms-patches/PathfinderGoalBreed.patch deleted file mode 100644 index 3ae9587..0000000 --- a/TacoSpigot-Server/nms-patches/PathfinderGoalBreed.patch +++ /dev/null @@ -1,23 +0,0 @@ ---- a/net/minecraft/server/PathfinderGoalBreed.java -+++ b/net/minecraft/server/PathfinderGoalBreed.java -@@ -70,6 +70,11 @@ - EntityAgeable entityageable = this.d.createChild(this.e); - - if (entityageable != null) { -+ // CraftBukkit start - set persistence for tame animals -+ if (entityageable instanceof EntityTameableAnimal && ((EntityTameableAnimal) entityageable).isTamed()) { -+ entityageable.persistent = true; -+ } -+ // CraftBukkit end - EntityHuman entityhuman = this.d.cq(); - - if (entityhuman == null && this.e.cq() != null) { -@@ -89,7 +94,7 @@ - this.e.cs(); - entityageable.setAgeRaw(-24000); - entityageable.setPositionRotation(this.d.locX, this.d.locY, this.d.locZ, 0.0F, 0.0F); -- this.a.addEntity(entityageable); -+ this.a.addEntity(entityageable, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.BREEDING); // CraftBukkit - added SpawnReason - Random random = this.d.bc(); - - for (int i = 0; i < 7; ++i) { diff --git a/TacoSpigot-Server/nms-patches/PathfinderGoalDefendVillage.patch b/TacoSpigot-Server/nms-patches/PathfinderGoalDefendVillage.patch deleted file mode 100644 index ab0ddc4..0000000 --- a/TacoSpigot-Server/nms-patches/PathfinderGoalDefendVillage.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- a/net/minecraft/server/PathfinderGoalDefendVillage.java -+++ b/net/minecraft/server/PathfinderGoalDefendVillage.java -@@ -34,7 +34,7 @@ - } - - public void c() { -- this.a.setGoalTarget(this.b); -+ this.a.setGoalTarget(this.b, org.bukkit.event.entity.EntityTargetEvent.TargetReason.DEFEND_VILLAGE, true); // CraftBukkit - reason - super.c(); - } - } diff --git a/TacoSpigot-Server/nms-patches/PathfinderGoalEatTile.patch b/TacoSpigot-Server/nms-patches/PathfinderGoalEatTile.patch deleted file mode 100644 index f3d98e5..0000000 --- a/TacoSpigot-Server/nms-patches/PathfinderGoalEatTile.patch +++ /dev/null @@ -1,34 +0,0 @@ ---- 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; - -+// CraftBukkit start -+import org.bukkit.craftbukkit.event.CraftEventFactory; -+import org.bukkit.Material; -+// CraftBukkit end -+ - public class PathfinderGoalEatTile extends PathfinderGoal { - - private static final Predicate b = BlockStatePredicate.a((Block) Blocks.TALLGRASS).a(BlockLongGrass.TYPE, Predicates.equalTo(BlockLongGrass.EnumTallGrassType.GRASS)); -@@ -50,7 +55,8 @@ - BlockPosition blockposition = new BlockPosition(this.c.locX, this.c.locY, this.c.locZ); - - if (PathfinderGoalEatTile.b.apply(this.d.getType(blockposition))) { -- if (this.d.getGameRules().getBoolean("mobGriefing")) { -+ // CraftBukkit -+ if (!CraftEventFactory.callEntityChangeBlockEvent(this.c, this.c.world.getWorld().getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ()), Material.AIR, !this.d.getGameRules().getBoolean("mobGriefing")).isCancelled()) { - this.d.setAir(blockposition, false); - } - -@@ -59,7 +65,8 @@ - BlockPosition blockposition1 = blockposition.down(); - - if (this.d.getType(blockposition1).getBlock() == Blocks.GRASS) { -- if (this.d.getGameRules().getBoolean("mobGriefing")) { -+ // CraftBukkit -+ if (!CraftEventFactory.callEntityChangeBlockEvent(this.c, this.c.world.getWorld().getBlockAt(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); - } diff --git a/TacoSpigot-Server/nms-patches/PathfinderGoalHurtByTarget.patch b/TacoSpigot-Server/nms-patches/PathfinderGoalHurtByTarget.patch deleted file mode 100644 index e385566..0000000 --- a/TacoSpigot-Server/nms-patches/PathfinderGoalHurtByTarget.patch +++ /dev/null @@ -1,19 +0,0 @@ ---- a/net/minecraft/server/PathfinderGoalHurtByTarget.java -+++ b/net/minecraft/server/PathfinderGoalHurtByTarget.java -@@ -23,7 +23,7 @@ - } - - public void c() { -- this.e.setGoalTarget(this.e.getLastDamager()); -+ this.e.setGoalTarget(this.e.getLastDamager(), org.bukkit.event.entity.EntityTargetEvent.TargetReason.TARGET_ATTACKED_ENTITY, true); // CraftBukkit - reason - this.b = this.e.be(); - if (this.a) { - double d0 = this.f(); -@@ -58,6 +58,6 @@ - } - - protected void a(EntityCreature entitycreature, EntityLiving entityliving) { -- entitycreature.setGoalTarget(entityliving); -+ entitycreature.setGoalTarget(entityliving, org.bukkit.event.entity.EntityTargetEvent.TargetReason.TARGET_ATTACKED_NEARBY_ENTITY, true); // CraftBukkit - reason - } - } diff --git a/TacoSpigot-Server/nms-patches/PathfinderGoalMakeLove.patch b/TacoSpigot-Server/nms-patches/PathfinderGoalMakeLove.patch deleted file mode 100644 index 2673a6b..0000000 --- a/TacoSpigot-Server/nms-patches/PathfinderGoalMakeLove.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- a/net/minecraft/server/PathfinderGoalMakeLove.java -+++ b/net/minecraft/server/PathfinderGoalMakeLove.java -@@ -87,7 +87,7 @@ - this.b.o(false); - entityvillager.setAgeRaw(-24000); - entityvillager.setPositionRotation(this.b.locX, this.b.locY, this.b.locZ, 0.0F, 0.0F); -- this.d.addEntity(entityvillager); -+ this.d.addEntity(entityvillager, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.BREEDING); // CraftBukkit - added SpawnReason - this.d.broadcastEntityEffect(entityvillager, (byte) 12); - } - } diff --git a/TacoSpigot-Server/nms-patches/PathfinderGoalNearestAttackableTarget.patch b/TacoSpigot-Server/nms-patches/PathfinderGoalNearestAttackableTarget.patch deleted file mode 100644 index 860671e..0000000 --- a/TacoSpigot-Server/nms-patches/PathfinderGoalNearestAttackableTarget.patch +++ /dev/null @@ -1,29 +0,0 @@ ---- a/net/minecraft/server/PathfinderGoalNearestAttackableTarget.java -+++ b/net/minecraft/server/PathfinderGoalNearestAttackableTarget.java -@@ -60,7 +60,7 @@ - } - - public boolean apply(Object object) { -- return this.a((EntityLiving) object); -+ return this.a((T) object); // CraftBukkit - fix decompile error - } - }; - } -@@ -83,7 +83,7 @@ - } - - public void c() { -- this.e.setGoalTarget(this.d); -+ this.e.setGoalTarget(this.d, d instanceof EntityPlayer ? org.bukkit.event.entity.EntityTargetEvent.TargetReason.CLOSEST_PLAYER : org.bukkit.event.entity.EntityTargetEvent.TargetReason.CLOSEST_ENTITY, true); // Craftbukkit - reason - super.c(); - } - -@@ -102,7 +102,7 @@ - return d0 < d1 ? -1 : (d0 > d1 ? 1 : 0); - } - -- public int compare(Object object, Object object1) { -+ public int compare(Entity object, Entity object1) { // CraftBukkit - fix decompile error - return this.a((Entity) object, (Entity) object1); - } - } diff --git a/TacoSpigot-Server/nms-patches/PathfinderGoalNearestAttackableTargetInsentient.patch b/TacoSpigot-Server/nms-patches/PathfinderGoalNearestAttackableTargetInsentient.patch deleted file mode 100644 index 624e0c1..0000000 --- a/TacoSpigot-Server/nms-patches/PathfinderGoalNearestAttackableTargetInsentient.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- a/net/minecraft/server/PathfinderGoalNearestAttackableTargetInsentient.java -+++ b/net/minecraft/server/PathfinderGoalNearestAttackableTargetInsentient.java -@@ -68,7 +68,7 @@ - } - - public void c() { -- this.b.setGoalTarget(this.e); -+ this.b.setGoalTarget(this.e, org.bukkit.event.entity.EntityTargetEvent.TargetReason.CLOSEST_ENTITY, true); // CraftBukkit - reason - super.c(); - } - diff --git a/TacoSpigot-Server/nms-patches/PathfinderGoalOwnerHurtByTarget.patch b/TacoSpigot-Server/nms-patches/PathfinderGoalOwnerHurtByTarget.patch deleted file mode 100644 index 5d62045..0000000 --- a/TacoSpigot-Server/nms-patches/PathfinderGoalOwnerHurtByTarget.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- a/net/minecraft/server/PathfinderGoalOwnerHurtByTarget.java -+++ b/net/minecraft/server/PathfinderGoalOwnerHurtByTarget.java -@@ -30,7 +30,7 @@ - } - - public void c() { -- this.e.setGoalTarget(this.b); -+ this.e.setGoalTarget(this.b, org.bukkit.event.entity.EntityTargetEvent.TargetReason.TARGET_ATTACKED_OWNER, true); // CraftBukkit - reason - EntityLiving entityliving = this.a.getOwner(); - - if (entityliving != null) { diff --git a/TacoSpigot-Server/nms-patches/PathfinderGoalOwnerHurtTarget.patch b/TacoSpigot-Server/nms-patches/PathfinderGoalOwnerHurtTarget.patch deleted file mode 100644 index a837933..0000000 --- a/TacoSpigot-Server/nms-patches/PathfinderGoalOwnerHurtTarget.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- a/net/minecraft/server/PathfinderGoalOwnerHurtTarget.java -+++ b/net/minecraft/server/PathfinderGoalOwnerHurtTarget.java -@@ -30,7 +30,7 @@ - } - - public void c() { -- this.e.setGoalTarget(this.b); -+ this.e.setGoalTarget(this.b, org.bukkit.event.entity.EntityTargetEvent.TargetReason.OWNER_ATTACKED_TARGET, true); // CraftBukkit - reason - EntityLiving entityliving = this.a.getOwner(); - - if (entityliving != null) { diff --git a/TacoSpigot-Server/nms-patches/PathfinderGoalPanic.patch b/TacoSpigot-Server/nms-patches/PathfinderGoalPanic.patch deleted file mode 100644 index 8725c76..0000000 --- a/TacoSpigot-Server/nms-patches/PathfinderGoalPanic.patch +++ /dev/null @@ -1,15 +0,0 @@ ---- a/net/minecraft/server/PathfinderGoalPanic.java -+++ b/net/minecraft/server/PathfinderGoalPanic.java -@@ -36,6 +36,12 @@ - } - - public boolean b() { -+ // CraftBukkit start - introduce a temporary timeout hack until this is fixed properly -+ if ((this.b.ticksLived - this.b.hurtTimestamp) > 100) { -+ this.b.b((EntityLiving) null); -+ return false; -+ } -+ // CraftBukkit end - return !this.b.getNavigation().m(); - } - } diff --git a/TacoSpigot-Server/nms-patches/PathfinderGoalSelector.patch b/TacoSpigot-Server/nms-patches/PathfinderGoalSelector.patch deleted file mode 100644 index 27aa230..0000000 --- a/TacoSpigot-Server/nms-patches/PathfinderGoalSelector.patch +++ /dev/null @@ -1,30 +0,0 @@ ---- a/net/minecraft/server/PathfinderGoalSelector.java -+++ b/net/minecraft/server/PathfinderGoalSelector.java -@@ -6,11 +6,13 @@ - import org.apache.logging.log4j.LogManager; - import org.apache.logging.log4j.Logger; - -+import org.bukkit.craftbukkit.util.UnsafeList; // CraftBukkit -+ - public class PathfinderGoalSelector { - - private static final Logger a = LogManager.getLogger(); -- private List b = Lists.newArrayList(); -- private List c = Lists.newArrayList(); -+ private List b = new UnsafeList(); -+ private List c = new UnsafeList(); - private final MethodProfiler d; - private int e; - private int f = 3; -@@ -107,9 +109,11 @@ - if (pathfindergoalselector_pathfindergoalselectoritem1 != pathfindergoalselector_pathfindergoalselectoritem) { - if (pathfindergoalselector_pathfindergoalselectoritem.b >= pathfindergoalselector_pathfindergoalselectoritem1.b) { - if (!this.a(pathfindergoalselector_pathfindergoalselectoritem, pathfindergoalselector_pathfindergoalselectoritem1) && this.c.contains(pathfindergoalselector_pathfindergoalselectoritem1)) { -+ ((UnsafeList.Itr) iterator).valid = false; // CraftBukkit - mark iterator for reuse - return false; - } - } else if (!pathfindergoalselector_pathfindergoalselectoritem1.a.i() && this.c.contains(pathfindergoalselector_pathfindergoalselectoritem1)) { -+ ((UnsafeList.Itr) iterator).valid = false; // CraftBukkit - mark iterator for reuse - return false; - } - } diff --git a/TacoSpigot-Server/nms-patches/PathfinderGoalSit.patch b/TacoSpigot-Server/nms-patches/PathfinderGoalSit.patch deleted file mode 100644 index e6ee998..0000000 --- a/TacoSpigot-Server/nms-patches/PathfinderGoalSit.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- a/net/minecraft/server/PathfinderGoalSit.java -+++ b/net/minecraft/server/PathfinderGoalSit.java -@@ -12,7 +12,7 @@ - - public boolean a() { - if (!this.entity.isTamed()) { -- return false; -+ return this.willSit && this.entity.getGoalTarget() == null; // CraftBukkit - Allow sitting for wild animals - } else if (this.entity.V()) { - return false; - } else if (!this.entity.onGround) { diff --git a/TacoSpigot-Server/nms-patches/PathfinderGoalTame.patch b/TacoSpigot-Server/nms-patches/PathfinderGoalTame.patch deleted file mode 100644 index 2d4f3e9..0000000 --- a/TacoSpigot-Server/nms-patches/PathfinderGoalTame.patch +++ /dev/null @@ -1,31 +0,0 @@ ---- a/net/minecraft/server/PathfinderGoalTame.java -+++ b/net/minecraft/server/PathfinderGoalTame.java -@@ -45,7 +45,8 @@ - int i = this.entity.getTemper(); - int j = this.entity.getMaxDomestication(); - -- if (j > 0 && this.entity.bc().nextInt(j) < i) { -+ // CraftBukkit - fire EntityTameEvent -+ if (j > 0 && this.entity.bc().nextInt(j) < i && !org.bukkit.craftbukkit.event.CraftEventFactory.callEntityTameEvent(this.entity, (EntityHuman) this.entity.passenger).isCancelled() && this.entity.passenger instanceof EntityHuman) { - this.entity.h((EntityHuman) this.entity.passenger); - this.entity.world.broadcastEntityEffect(this.entity, (byte) 7); - return; -@@ -54,8 +55,16 @@ - this.entity.u(5); - } - -- this.entity.passenger.mount((Entity) null); -- this.entity.passenger = null; -+ // CraftBukkit start - Handle dismounting to account for VehicleExitEvent being fired. -+ if (this.entity.passenger != null) { -+ this.entity.passenger.mount((Entity) null); -+ // If the entity still has a passenger, then a plugin cancelled the event. -+ if (this.entity.passenger != null) { -+ return; -+ } -+ } -+ // this.entity.passenger = null; -+ // CraftBukkit end - this.entity.cW(); - this.entity.world.broadcastEntityEffect(this.entity, (byte) 6); - } diff --git a/TacoSpigot-Server/nms-patches/PathfinderGoalTargetNearestPlayer.patch b/TacoSpigot-Server/nms-patches/PathfinderGoalTargetNearestPlayer.patch deleted file mode 100644 index 1bdfde6..0000000 --- a/TacoSpigot-Server/nms-patches/PathfinderGoalTargetNearestPlayer.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- a/net/minecraft/server/PathfinderGoalTargetNearestPlayer.java -+++ b/net/minecraft/server/PathfinderGoalTargetNearestPlayer.java -@@ -91,7 +91,7 @@ - } - - public void c() { -- this.b.setGoalTarget(this.e); -+ this.b.setGoalTarget(this.e, org.bukkit.event.entity.EntityTargetEvent.TargetReason.CLOSEST_PLAYER, true); // CraftBukkit - added reason - super.c(); - } - diff --git a/TacoSpigot-Server/nms-patches/PlayerChunkMap.patch b/TacoSpigot-Server/nms-patches/PlayerChunkMap.patch deleted file mode 100644 index 1c9ec1d..0000000 --- a/TacoSpigot-Server/nms-patches/PlayerChunkMap.patch +++ /dev/null @@ -1,271 +0,0 @@ ---- a/net/minecraft/server/PlayerChunkMap.java -+++ b/net/minecraft/server/PlayerChunkMap.java -@@ -7,17 +7,26 @@ - import org.apache.logging.log4j.LogManager; - import org.apache.logging.log4j.Logger; - -+// CraftBukkit start -+import java.util.Collections; -+import java.util.Queue; -+import java.util.LinkedList; -+import org.bukkit.craftbukkit.chunkio.ChunkIOExecutor; -+import java.util.HashMap; -+// CraftBukkit end -+ - public class PlayerChunkMap { - - private static final Logger a = LogManager.getLogger(); - private final WorldServer world; - private final List managedPlayers = Lists.newArrayList(); - private final LongHashMap d = new LongHashMap(); -- private final List e = Lists.newArrayList(); -- private final List f = Lists.newArrayList(); -+ private final Queue e = new java.util.concurrent.ConcurrentLinkedQueue(); // CraftBukkit ArrayList -> ConcurrentLinkedQueue -+ private final Queue f = new java.util.concurrent.ConcurrentLinkedQueue(); // CraftBukkit ArrayList -> ConcurrentLinkedQueue - private int g; - private long h; - private final int[][] i = new int[][] { { 1, 0}, { 0, 1}, { -1, 0}, { 0, -1}}; -+ private boolean wasNotEmpty; // CraftBukkit - add field - - public PlayerChunkMap(WorldServer worldserver) { - this.world = worldserver; -@@ -36,26 +45,37 @@ - if (i - this.h > 8000L) { - this.h = i; - -- for (j = 0; j < this.f.size(); ++j) { -- playerchunkmap_playerchunk = (PlayerChunkMap.PlayerChunk) this.f.get(j); -+ // CraftBukkit start - Use iterator -+ java.util.Iterator iterator = this.f.iterator(); -+ while (iterator.hasNext()) { -+ playerchunkmap_playerchunk = (PlayerChunk) iterator.next(); - playerchunkmap_playerchunk.b(); - playerchunkmap_playerchunk.a(); - } - } else { -- for (j = 0; j < this.e.size(); ++j) { -- playerchunkmap_playerchunk = (PlayerChunkMap.PlayerChunk) this.e.get(j); -+ java.util.Iterator iterator = this.e.iterator(); -+ while (iterator.hasNext()) { -+ playerchunkmap_playerchunk = (PlayerChunk) iterator.next(); - playerchunkmap_playerchunk.b(); -+ iterator.remove(); -+ // CraftBukkit end - } - } - -- this.e.clear(); -+ // this.e.clear(); //CraftBukkit - Removals are already covered - if (this.managedPlayers.isEmpty()) { -+ if (!wasNotEmpty) return; // CraftBukkit - Only do unload when we go from non-empty to empty - WorldProvider worldprovider = this.world.worldProvider; - - if (!worldprovider.e()) { - this.world.chunkProviderServer.b(); - } -+ // CraftBukkit start -+ wasNotEmpty = false; -+ } else { -+ wasNotEmpty = true; - } -+ // CraftBukkit end - - } - -@@ -78,6 +98,16 @@ - return playerchunkmap_playerchunk; - } - -+ // CraftBukkit start - add method -+ public final boolean isChunkInUse(int x, int z) { -+ PlayerChunk pi = a(x, z, false); -+ if (pi != null) { -+ return (pi.b.size() > 0); -+ } -+ return false; -+ } -+ // CraftBukkit end -+ - public void flagDirty(BlockPosition blockposition) { - int i = blockposition.getX() >> 4; - int j = blockposition.getZ() >> 4; -@@ -96,11 +126,20 @@ - entityplayer.d = entityplayer.locX; - entityplayer.e = entityplayer.locZ; - -+ // CraftBukkit start - Load nearby chunks first -+ List chunkList = new LinkedList(); -+ - for (int k = i - this.g; k <= i + this.g; ++k) { - for (int l = j - this.g; l <= j + this.g; ++l) { -- this.a(k, l, true).a(entityplayer); -+ chunkList.add(new ChunkCoordIntPair(k, l)); - } - } -+ -+ Collections.sort(chunkList, new ChunkCoordComparator(entityplayer)); -+ for (ChunkCoordIntPair pair : chunkList) { -+ this.a(pair.x, pair.z, true).a(entityplayer); -+ } -+ // CraftBukkit end - - this.managedPlayers.add(entityplayer); - this.b(entityplayer); -@@ -188,12 +227,13 @@ - int i1 = this.g; - int j1 = i - k; - int k1 = j - l; -+ List chunksToLoad = new LinkedList(); // CraftBukkit - - if (j1 != 0 || k1 != 0) { - for (int l1 = i - i1; l1 <= i + i1; ++l1) { - for (int i2 = j - i1; i2 <= j + i1; ++i2) { - if (!this.a(l1, i2, k, l, i1)) { -- this.a(l1, i2, true).a(entityplayer); -+ chunksToLoad.add(new ChunkCoordIntPair(l1, i2)); // CraftBukkit - } - - if (!this.a(l1 - j1, i2 - k1, i, j, i1)) { -@@ -209,6 +249,17 @@ - this.b(entityplayer); - entityplayer.d = entityplayer.locX; - entityplayer.e = entityplayer.locZ; -+ -+ // CraftBukkit start - send nearest chunks first -+ Collections.sort(chunksToLoad, new ChunkCoordComparator(entityplayer)); -+ for (ChunkCoordIntPair pair : chunksToLoad) { -+ this.a(pair.x, pair.z, true).a(entityplayer); -+ } -+ -+ if (j1 > 1 || j1 < -1 || k1 > 1 || k1 < -1) { -+ Collections.sort(entityplayer.chunkCoordIntPairQueue, new ChunkCoordComparator(entityplayer)); -+ } -+ // CraftBukkit end - } - } - } -@@ -271,12 +322,22 @@ - private int f; - private long g; - -+ // CraftBukkit start - add fields -+ private final HashMap players = new HashMap(); -+ private boolean loaded = false; -+ private Runnable loadedRunnable = new Runnable() { -+ public void run() { -+ PlayerChunk.this.loaded = true; -+ } -+ }; -+ // CraftBukkit end -+ - public PlayerChunk(int i, int j) { - this.location = new ChunkCoordIntPair(i, j); -- PlayerChunkMap.this.a().chunkProviderServer.getChunkAt(i, j); -+ PlayerChunkMap.this.a().chunkProviderServer.getChunkAt(i, j, loadedRunnable); // CraftBukkit - } - -- public void a(EntityPlayer entityplayer) { -+ public void a(final EntityPlayer entityplayer) { // CraftBukkit - added final to argument - if (this.b.contains(entityplayer)) { - PlayerChunkMap.a.debug("Failed to add player. {} already is in chunk {}, {}", new Object[] { entityplayer, Integer.valueOf(this.location.x), Integer.valueOf(this.location.z)}); - } else { -@@ -285,18 +346,50 @@ - } - - this.b.add(entityplayer); -- entityplayer.chunkCoordIntPairQueue.add(this.location); -+ // CraftBukkit start - use async chunk io -+ Runnable playerRunnable; -+ if (this.loaded) { -+ playerRunnable = null; -+ entityplayer.chunkCoordIntPairQueue.add(this.location); -+ } else { -+ playerRunnable = new Runnable() { -+ public void run() { -+ entityplayer.chunkCoordIntPairQueue.add(PlayerChunk.this.location); -+ } -+ }; -+ PlayerChunkMap.this.a().chunkProviderServer.getChunkAt(this.location.x, this.location.z, playerRunnable); -+ } -+ -+ this.players.put(entityplayer, playerRunnable); -+ // CraftBukkit end - } - } - - public void b(EntityPlayer entityplayer) { - if (this.b.contains(entityplayer)) { -+ // CraftBukkit start - If we haven't loaded yet don't load the chunk just so we can clean it up -+ if (!this.loaded) { -+ ChunkIOExecutor.dropQueuedChunkLoad(PlayerChunkMap.this.a(), this.location.x, this.location.z, this.players.get(entityplayer)); -+ this.b.remove(entityplayer); -+ this.players.remove(entityplayer); -+ -+ if (this.b.isEmpty()) { -+ ChunkIOExecutor.dropQueuedChunkLoad(PlayerChunkMap.this.a(), this.location.x, this.location.z, this.loadedRunnable); -+ long i = (long) this.location.x + 2147483647L | (long) this.location.z + 2147483647L << 32; -+ PlayerChunkMap.this.d.remove(i); -+ PlayerChunkMap.this.f.remove(this); -+ } -+ -+ return; -+ } -+ // CraftBukkit end - Chunk chunk = PlayerChunkMap.this.world.getChunkAt(this.location.x, this.location.z); - - if (chunk.isReady()) { - entityplayer.playerConnection.sendPacket(new PacketPlayOutMapChunk(chunk, true, 0)); - } - -+ this.players.remove(entityplayer); // CraftBukkit - this.b.remove(entityplayer); - entityplayer.chunkCoordIntPairQueue.remove(this.location); - if (this.b.isEmpty()) { -@@ -421,4 +514,47 @@ - - } - } -+ -+ // CraftBukkit start - Sorter to load nearby chunks first -+ private static class ChunkCoordComparator implements java.util.Comparator { -+ private int x; -+ private int z; -+ -+ public ChunkCoordComparator (EntityPlayer entityplayer) { -+ x = (int) entityplayer.locX >> 4; -+ z = (int) entityplayer.locZ >> 4; -+ } -+ -+ public int compare(ChunkCoordIntPair a, ChunkCoordIntPair b) { -+ if (a.equals(b)) { -+ return 0; -+ } -+ -+ // Subtract current position to set center point -+ int ax = a.x - this.x; -+ int az = a.z - this.z; -+ int bx = b.x - this.x; -+ int bz = b.z - this.z; -+ -+ int result = ((ax - bx) * (ax + bx)) + ((az - bz) * (az + bz)); -+ if (result != 0) { -+ return result; -+ } -+ -+ if (ax < 0) { -+ if (bx < 0) { -+ return bz - az; -+ } else { -+ return -1; -+ } -+ } else { -+ if (bx < 0) { -+ return 1; -+ } else { -+ return az - bz; -+ } -+ } -+ } -+ } -+ // CraftBukkit end - } diff --git a/TacoSpigot-Server/nms-patches/PlayerConnection.patch b/TacoSpigot-Server/nms-patches/PlayerConnection.patch deleted file mode 100644 index a1f3b52..0000000 --- a/TacoSpigot-Server/nms-patches/PlayerConnection.patch +++ /dev/null @@ -1,1540 +0,0 @@ ---- a/net/minecraft/server/PlayerConnection.java -+++ b/net/minecraft/server/PlayerConnection.java -@@ -19,6 +19,49 @@ - import org.apache.logging.log4j.LogManager; - import org.apache.logging.log4j.Logger; - -+// CraftBukkit start -+import java.util.concurrent.ExecutionException; -+import java.util.concurrent.atomic.AtomicIntegerFieldUpdater; -+import java.util.HashSet; -+ -+import org.bukkit.craftbukkit.entity.CraftPlayer; -+import org.bukkit.craftbukkit.event.CraftEventFactory; -+import org.bukkit.craftbukkit.inventory.CraftInventoryView; -+import org.bukkit.craftbukkit.inventory.CraftItemStack; -+import org.bukkit.craftbukkit.util.CraftChatMessage; -+import org.bukkit.craftbukkit.util.LazyPlayerSet; -+import org.bukkit.craftbukkit.util.Waitable; -+ -+import org.bukkit.Location; -+import org.bukkit.entity.Player; -+import org.bukkit.event.Event; -+import org.bukkit.event.block.Action; -+import org.bukkit.event.block.SignChangeEvent; -+import org.bukkit.event.inventory.ClickType; -+import org.bukkit.event.inventory.CraftItemEvent; -+import org.bukkit.event.inventory.InventoryAction; -+import org.bukkit.event.inventory.InventoryClickEvent; -+import org.bukkit.event.inventory.InventoryCreativeEvent; -+import org.bukkit.event.inventory.InventoryType.SlotType; -+import org.bukkit.event.player.AsyncPlayerChatEvent; -+import org.bukkit.event.player.PlayerAnimationEvent; -+import org.bukkit.event.player.PlayerChatEvent; -+import org.bukkit.event.player.PlayerCommandPreprocessEvent; -+import org.bukkit.event.player.PlayerInteractEntityEvent; -+import org.bukkit.event.player.PlayerInteractAtEntityEvent; -+import org.bukkit.event.player.PlayerItemHeldEvent; -+import org.bukkit.event.player.PlayerKickEvent; -+import org.bukkit.event.player.PlayerMoveEvent; -+import org.bukkit.event.player.PlayerResourcePackStatusEvent; -+import org.bukkit.event.player.PlayerTeleportEvent; -+import org.bukkit.event.player.PlayerToggleFlightEvent; -+import org.bukkit.event.player.PlayerToggleSneakEvent; -+import org.bukkit.event.player.PlayerToggleSprintEvent; -+import org.bukkit.inventory.CraftingInventory; -+import org.bukkit.inventory.InventoryView; -+import org.bukkit.util.NumberConversions; -+// CraftBukkit end -+ - public class PlayerConnection implements PacketListenerPlayIn, IUpdatePlayerListBox { - - private static final Logger c = LogManager.getLogger(); -@@ -32,13 +75,17 @@ - private int i; - private long j; - private long k; -- private int chatThrottle; -+ // CraftBukkit start - multithreaded fields -+ private volatile int chatThrottle; -+ private static final AtomicIntegerFieldUpdater chatSpamField = AtomicIntegerFieldUpdater.newUpdater(PlayerConnection.class, "chatThrottle"); -+ // CraftBukkit end - private int m; - private IntHashMap n = new IntHashMap(); - private double o; - private double p; - private double q; - private boolean checkMovement = true; -+ private boolean processedDisconnect; // CraftBukkit - added - - public PlayerConnection(MinecraftServer minecraftserver, NetworkManager networkmanager, EntityPlayer entityplayer) { - this.minecraftServer = minecraftserver; -@@ -46,7 +93,31 @@ - networkmanager.a((PacketListener) this); - this.player = entityplayer; - entityplayer.playerConnection = this; -+ -+ // CraftBukkit start - add fields and methods -+ this.server = minecraftserver.server; -+ } -+ -+ private final org.bukkit.craftbukkit.CraftServer server; -+ private int lastTick = MinecraftServer.currentTick; -+ private int lastDropTick = MinecraftServer.currentTick; -+ private int dropCount = 0; -+ private static final int SURVIVAL_PLACE_DISTANCE_SQUARED = 6 * 6; -+ private static final int CREATIVE_PLACE_DISTANCE_SQUARED = 7 * 7; -+ -+ // Get position of last block hit for BlockDamageLevel.STOPPED -+ private double lastPosX = Double.MAX_VALUE; -+ private double lastPosY = Double.MAX_VALUE; -+ private double lastPosZ = Double.MAX_VALUE; -+ private float lastPitch = Float.MAX_VALUE; -+ private float lastYaw = Float.MAX_VALUE; -+ private boolean justTeleported = false; -+ -+ public CraftPlayer getPlayer() { -+ return (this.player == null) ? null : (CraftPlayer) this.player.getBukkitEntity(); - } -+ private final static HashSet invalidItems = new HashSet(java.util.Arrays.asList(8, 9, 10, 11, 26, 34, 36, 43, 51, 52, 55, 59, 60, 62, 63, 64, 68, 71, 74, 75, 83, 90, 92, 93, 94, 104, 105, 115, 117, 118, 119, 125, 127, 132, 140, 141, 142, 144)); // TODO: Check after every update. -+ // CraftBukkit end - - public void c() { - this.h = false; -@@ -60,15 +131,21 @@ - } - - this.minecraftServer.methodProfiler.b(); -+ // CraftBukkit start -+ for (int spam; (spam = this.chatThrottle) > 0 && !chatSpamField.compareAndSet(this, spam, spam - 1); ) ; -+ /* Use thread-safe field access instead - if (this.chatThrottle > 0) { - --this.chatThrottle; - } -+ */ -+ // CraftBukkit end - - if (this.m > 0) { - --this.m; - } - - if (this.player.D() > 0L && this.minecraftServer.getIdleTimeout() > 0 && MinecraftServer.az() - this.player.D() > (long) (this.minecraftServer.getIdleTimeout() * 1000 * 60)) { -+ this.player.resetIdleTimer(); // CraftBukkit - SPIGOT-854 - this.disconnect("You have been idle for too long!"); - } - -@@ -79,19 +156,37 @@ - } - - public void disconnect(String s) { -+ // CraftBukkit start - fire PlayerKickEvent -+ String leaveMessage = EnumChatFormat.YELLOW + this.player.getName() + " left the game."; -+ -+ PlayerKickEvent event = new PlayerKickEvent(this.server.getPlayer(this.player), s, leaveMessage); -+ -+ if (this.server.getServer().isRunning()) { -+ this.server.getPluginManager().callEvent(event); -+ } -+ -+ if (event.isCancelled()) { -+ // Do not kick the player -+ return; -+ } -+ // Send the possibly modified leave message -+ s = event.getReason(); -+ // CraftBukkit end - final ChatComponentText chatcomponenttext = new ChatComponentText(s); - - this.networkManager.a(new PacketPlayOutKickDisconnect(chatcomponenttext), new GenericFutureListener() { -- public void operationComplete(Future future) throws Exception { -+ public void operationComplete(Future future) throws Exception { // CraftBukkit - fix decompile error - PlayerConnection.this.networkManager.close(chatcomponenttext); - } - }, new GenericFutureListener[0]); -+ this.a(chatcomponenttext); // CraftBukkit - fire quit instantly - this.networkManager.k(); -- Futures.getUnchecked(this.minecraftServer.postToMainThread(new Runnable() { -- public void run() { -- PlayerConnection.this.networkManager.l(); -+ // CraftBukkit - Don't wait -+ this.minecraftServer.postToMainThread(new Runnable() { -+ public void run() { -+ PlayerConnection.this.networkManager.l(); - } -- })); -+ }); - } - - public void a(PacketPlayInSteerVehicle packetplayinsteervehicle) { -@@ -126,8 +221,66 @@ - this.checkMovement = true; - } - } -+ // CraftBukkit start - fire PlayerMoveEvent -+ Player player = this.getPlayer(); -+ Location from = new Location(player.getWorld(), lastPosX, lastPosY, lastPosZ, lastYaw, lastPitch); // Get the Players previous Event location. -+ Location to = player.getLocation().clone(); // Start off the To location as the Players current location. -+ -+ // If the packet contains movement information then we update the To location with the correct XYZ. -+ if (packetplayinflying.hasPos && !(packetplayinflying.hasPos && packetplayinflying.y == -999.0D)) { -+ to.setX(packetplayinflying.x); -+ to.setY(packetplayinflying.y); -+ to.setZ(packetplayinflying.z); -+ } -+ -+ // If the packet contains look information then we update the To location with the correct Yaw & Pitch. -+ if (packetplayinflying.hasLook) { -+ to.setYaw(packetplayinflying.yaw); -+ to.setPitch(packetplayinflying.pitch); -+ } -+ -+ // Prevent 40 event-calls for less than a single pixel of movement >.> -+ double delta = Math.pow(this.lastPosX - to.getX(), 2) + Math.pow(this.lastPosY - to.getY(), 2) + Math.pow(this.lastPosZ - to.getZ(), 2); -+ float deltaAngle = Math.abs(this.lastYaw - to.getYaw()) + Math.abs(this.lastPitch - to.getPitch()); -+ -+ if ((delta > 1f / 256 || deltaAngle > 10f) && (this.checkMovement && !this.player.dead)) { -+ this.lastPosX = to.getX(); -+ this.lastPosY = to.getY(); -+ this.lastPosZ = to.getZ(); -+ this.lastYaw = to.getYaw(); -+ this.lastPitch = to.getPitch(); -+ -+ // Skip the first time we do this -+ if (from.getX() != Double.MAX_VALUE) { -+ Location oldTo = to.clone(); -+ PlayerMoveEvent event = new PlayerMoveEvent(player, from, to); -+ this.server.getPluginManager().callEvent(event); -+ -+ // If the event is cancelled we move the player back to their old location. -+ if (event.isCancelled()) { -+ this.player.playerConnection.sendPacket(new PacketPlayOutPosition(from.getX(), from.getY(), from.getZ(), from.getYaw(), from.getPitch(), Collections.emptySet())); -+ return; -+ } - -- if (this.checkMovement) { -+ /* If a Plugin has changed the To destination then we teleport the Player -+ there to avoid any 'Moved wrongly' or 'Moved too quickly' errors. -+ We only do this if the Event was not cancelled. */ -+ if (!oldTo.equals(event.getTo()) && !event.isCancelled()) { -+ this.player.getBukkitEntity().teleport(event.getTo(), PlayerTeleportEvent.TeleportCause.UNKNOWN); -+ return; -+ } -+ -+ /* Check to see if the Players Location has some how changed during the call of the event. -+ This can happen due to a plugin teleporting the player instead of using .setTo() */ -+ if (!from.equals(this.getPlayer().getLocation()) && this.justTeleported) { -+ this.justTeleported = false; -+ return; -+ } -+ } -+ } -+ -+ if (this.checkMovement && !this.player.dead) { -+ // CraftBukkit end - this.f = this.e; - double d7; - double d8; -@@ -155,6 +308,7 @@ - - this.minecraftServer.getPlayerList().d(this.player); - if (this.player.vehicle != null) { -+ this.player.vehicle.ai = true; // CraftBukkit - moved from below - if (d3 > 4.0D) { - Entity entity = this.player.vehicle; - -@@ -162,7 +316,7 @@ - this.a(this.player.locX, this.player.locY, this.player.locZ, this.player.yaw, this.player.pitch); - } - -- this.player.vehicle.ai = true; -+ // this.player.vehicle.ai = true; // CraftBukkit - moved up - } - - if (this.checkMovement) { -@@ -224,7 +378,7 @@ - double d14 = this.player.motX * this.player.motX + this.player.motY * this.player.motY + this.player.motZ * this.player.motZ; - double d15 = d11 * d11 + d12 * d12 + d13 * d13; - -- if (d15 - d14 > 100.0D && (!this.minecraftServer.T() || !this.minecraftServer.S().equals(this.player.getName()))) { -+ if (d15 - d14 > 100.0D && this.checkMovement && (!this.minecraftServer.T() || !this.minecraftServer.S().equals(this.player.getName()))) { // CraftBukkit - Added this.checkMovement condition to solve this check being triggered by teleports - PlayerConnection.c.warn(this.player.getName() + " moved too quickly! " + d11 + "," + d12 + "," + d13 + " (" + d11 + ", " + d12 + ", " + d13 + ")"); - this.a(this.o, this.p, this.q, this.player.yaw, this.player.pitch); - return; -@@ -288,16 +442,73 @@ - } else if (this.e - this.f > 20) { - this.a(this.o, this.p, this.q, this.player.yaw, this.player.pitch); - } -- - } -+ - } - } - - public void a(double d0, double d1, double d2, float f, float f1) { -- this.a(d0, d1, d2, f, f1, Collections.emptySet()); -+ this.a(d0, d1, d2, f, f1, Collections.emptySet()); // CraftBukkit fix decompile errors - } - - public void a(double d0, double d1, double d2, float f, float f1, Set set) { -+ // CraftBukkit start - Delegate to teleport(Location) -+ Player player = this.getPlayer(); -+ Location from = player.getLocation(); -+ -+ double x = d0; -+ double y = d1; -+ double z = d2; -+ float yaw = f; -+ float pitch = f1; -+ if (set.contains(PacketPlayOutPosition.EnumPlayerTeleportFlags.X)) { -+ x += from.getX(); -+ } -+ if (set.contains(PacketPlayOutPosition.EnumPlayerTeleportFlags.Y)) { -+ y += from.getY(); -+ } -+ if (set.contains(PacketPlayOutPosition.EnumPlayerTeleportFlags.Z)) { -+ z += from.getZ(); -+ } -+ if (set.contains(PacketPlayOutPosition.EnumPlayerTeleportFlags.Y_ROT)) { -+ yaw += from.getYaw(); -+ } -+ if (set.contains(PacketPlayOutPosition.EnumPlayerTeleportFlags.X_ROT)) { -+ pitch += from.getPitch(); -+ } -+ -+ -+ Location to = new Location(this.getPlayer().getWorld(), x, y, z, yaw, pitch); -+ PlayerTeleportEvent event = new PlayerTeleportEvent(player, from.clone(), to.clone(), PlayerTeleportEvent.TeleportCause.UNKNOWN); -+ this.server.getPluginManager().callEvent(event); -+ -+ if (event.isCancelled() || to.equals(event.getTo())) { -+ set.clear(); // Can't relative teleport -+ to = event.isCancelled() ? event.getFrom() : event.getTo(); -+ d0 = to.getX(); -+ d1 = to.getY(); -+ d2 = to.getZ(); -+ f = to.getYaw(); -+ f1 = to.getPitch(); -+ } -+ -+ this.internalTeleport(d0, d1, d2, f, f1, set); -+ } -+ -+ public void teleport(Location dest) { -+ internalTeleport(dest.getX(), dest.getY(), dest.getZ(), dest.getYaw(), dest.getPitch(), Collections.emptySet()); -+ } -+ -+ private void internalTeleport(double d0, double d1, double d2, float f, float f1, Set set) { -+ if (Float.isNaN(f)) { -+ f = 0; -+ } -+ -+ if (Float.isNaN(f1)) { -+ f1 = 0; -+ } -+ this.justTeleported = true; -+ // CraftBukkit end - this.checkMovement = false; - this.o = d0; - this.p = d1; -@@ -325,38 +536,63 @@ - f3 = f1 + this.player.pitch; - } - -+ // CraftBukkit start - update last location -+ this.lastPosX = this.o; -+ this.lastPosY = this.p; -+ this.lastPosZ = this.q; -+ this.lastYaw = f2; -+ this.lastPitch = f3; -+ // CraftBukkit end -+ - this.player.setLocation(this.o, this.p, this.q, f2, f3); - this.player.playerConnection.sendPacket(new PacketPlayOutPosition(d0, d1, d2, f, f1, set)); - } - - public void a(PacketPlayInBlockDig packetplayinblockdig) { - PlayerConnectionUtils.ensureMainThread(packetplayinblockdig, this, this.player.u()); -+ if (this.player.dead) return; // CraftBukkit - WorldServer worldserver = this.minecraftServer.getWorldServer(this.player.dimension); - BlockPosition blockposition = packetplayinblockdig.a(); - - this.player.resetIdleTimer(); -+ // CraftBukkit start - switch (PlayerConnection.SyntheticClass_1.a[packetplayinblockdig.c().ordinal()]) { -- case 1: -+ case 1: // DROP_ITEM - if (!this.player.isSpectator()) { -+ // limit how quickly items can be dropped -+ // If the ticks aren't the same then the count starts from 0 and we update the lastDropTick. -+ if (this.lastDropTick != MinecraftServer.currentTick) { -+ this.dropCount = 0; -+ this.lastDropTick = MinecraftServer.currentTick; -+ } else { -+ // Else we increment the drop count and check the amount. -+ this.dropCount++; -+ if (this.dropCount >= 20) { -+ this.c.warn(this.player.getName() + " dropped their items too quickly!"); -+ this.disconnect("You dropped your items too quickly (Hacking?)"); -+ return; -+ } -+ } -+ // CraftBukkit end - this.player.a(false); - } - - return; - -- case 2: -+ case 2: // DROP_ALL_ITEMS - if (!this.player.isSpectator()) { - this.player.a(true); - } - - return; - -- case 3: -+ case 3: // RELEASE_USE_ITEM - this.player.bU(); - return; - -- case 4: -- case 5: -- case 6: -+ case 4: // START_DESTROY_BLOCK -+ case 5: // ABORT_DESTROY_BLOCK -+ case 6: // STOP_DESTROY_BLOCK - double d0 = this.player.locX - ((double) blockposition.getX() + 0.5D); - double d1 = this.player.locY - ((double) blockposition.getY() + 0.5D) + 1.5D; - double d2 = this.player.locZ - ((double) blockposition.getZ() + 0.5D); -@@ -371,7 +607,15 @@ - if (!this.minecraftServer.a(worldserver, blockposition, this.player) && worldserver.getWorldBorder().a(blockposition)) { - this.player.playerInteractManager.a(blockposition, packetplayinblockdig.b()); - } else { -+ // CraftBukkit start - fire PlayerInteractEvent -+ CraftEventFactory.callPlayerInteractEvent(this.player, Action.LEFT_CLICK_BLOCK, blockposition, packetplayinblockdig.b(), this.player.inventory.getItemInHand()); - this.player.playerConnection.sendPacket(new PacketPlayOutBlockChange(worldserver, blockposition)); -+ // Update any tile entity data for this block -+ TileEntity tileentity = worldserver.getTileEntity(blockposition); -+ if (tileentity != null) { -+ this.player.playerConnection.sendPacket(tileentity.getUpdatePacket()); -+ } -+ // CraftBukkit end - } - } else { - if (packetplayinblockdig.c() == PacketPlayInBlockDig.EnumPlayerDigType.STOP_DESTROY_BLOCK) { -@@ -391,11 +635,22 @@ - default: - throw new IllegalArgumentException("Invalid player action"); - } -+ // CraftBukkit end - } - - public void a(PacketPlayInBlockPlace packetplayinblockplace) { - PlayerConnectionUtils.ensureMainThread(packetplayinblockplace, this, this.player.u()); - WorldServer worldserver = this.minecraftServer.getWorldServer(this.player.dimension); -+ -+ // CraftBukkit start -+ if (this.player.dead) return; -+ -+ // CraftBukkit - if rightclick decremented the item, always send the update packet. */ -+ // this is not here for CraftBukkit's own functionality; rather it is to fix -+ // a notch bug where the item doesn't update correctly. -+ boolean always = false; -+ // CraftBukkit end -+ - ItemStack itemstack = this.player.inventory.getItemInHand(); - boolean flag = false; - BlockPosition blockposition = packetplayinblockplace.a(); -@@ -407,7 +662,50 @@ - return; - } - -- this.player.playerInteractManager.useItem(this.player, worldserver, itemstack); -+ // CraftBukkit start -+ int itemstackAmount = itemstack.count; -+ -+ // Raytrace to look for 'rogue armswings' -+ float f1 = this.player.pitch; -+ float f2 = this.player.yaw; -+ double d0 = this.player.locX; -+ double d1 = this.player.locY + (double) this.player.getHeadHeight(); -+ double d2 = this.player.locZ; -+ Vec3D vec3d = new Vec3D(d0, d1, d2); -+ -+ float f3 = MathHelper.cos(-f2 * 0.017453292F - 3.1415927F); -+ float f4 = MathHelper.sin(-f2 * 0.017453292F - 3.1415927F); -+ float f5 = -MathHelper.cos(-f1 * 0.017453292F); -+ float f6 = MathHelper.sin(-f1 * 0.017453292F); -+ float f7 = f4 * f5; -+ float f8 = f3 * f5; -+ double d3 = player.playerInteractManager.getGameMode() == WorldSettings.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); -+ -+ boolean cancelled = false; -+ if (movingobjectposition == null || movingobjectposition.type != MovingObjectPosition.EnumMovingObjectType.BLOCK) { -+ org.bukkit.event.player.PlayerInteractEvent event = CraftEventFactory.callPlayerInteractEvent(this.player, Action.RIGHT_CLICK_AIR, itemstack); -+ cancelled = event.useItemInHand() == Event.Result.DENY; -+ } else { -+ if (player.playerInteractManager.firedInteract) { -+ player.playerInteractManager.firedInteract = false; -+ cancelled = player.playerInteractManager.interactResult; -+ } else { -+ org.bukkit.event.player.PlayerInteractEvent event = CraftEventFactory.callPlayerInteractEvent(player, Action.RIGHT_CLICK_BLOCK, movingobjectposition.a(), movingobjectposition.direction, itemstack, true); -+ cancelled = event.useItemInHand() == Event.Result.DENY; -+ } -+ } -+ -+ if (!cancelled) { -+ this.player.playerInteractManager.useItem(this.player, this.player.world, itemstack); -+ } -+ -+ // CraftBukkit - notch decrements the counter by 1 in the above method with food, -+ // snowballs and so forth, but he does it in a place that doesn't cause the -+ // inventory update packet to get sent -+ always = (itemstack.count != itemstackAmount) || itemstack.getItem() == Item.getItemOf(Blocks.WATERLILY); -+ // CraftBukkit end - } else if (blockposition.getY() >= this.minecraftServer.getMaxBuildHeight() - 1 && (enumdirection == EnumDirection.UP || blockposition.getY() >= this.minecraftServer.getMaxBuildHeight())) { - ChatMessage chatmessage = new ChatMessage("build.tooHigh", new Object[] { Integer.valueOf(this.minecraftServer.getMaxBuildHeight())}); - -@@ -415,8 +713,19 @@ - this.player.playerConnection.sendPacket(new PacketPlayOutChat(chatmessage)); - flag = true; - } else { -+ // CraftBukkit start - Check if we can actually do something over this large a distance -+ Location eyeLoc = this.getPlayer().getEyeLocation(); -+ double reachDistance = NumberConversions.square(eyeLoc.getX() - blockposition.getX()) + NumberConversions.square(eyeLoc.getY() - blockposition.getY()) + NumberConversions.square(eyeLoc.getZ() - blockposition.getZ()); -+ if (reachDistance > (this.getPlayer().getGameMode() == org.bukkit.GameMode.CREATIVE ? CREATIVE_PLACE_DISTANCE_SQUARED : SURVIVAL_PLACE_DISTANCE_SQUARED)) { -+ return; -+ } -+ -+ if (!worldserver.getWorldBorder().a(blockposition)) { -+ return; -+ } -+ - if (this.checkMovement && this.player.e((double) blockposition.getX() + 0.5D, (double) blockposition.getY() + 0.5D, (double) blockposition.getZ() + 0.5D) < 64.0D && !this.minecraftServer.a(worldserver, blockposition, this.player) && worldserver.getWorldBorder().a(blockposition)) { -- this.player.playerInteractManager.interact(this.player, worldserver, itemstack, blockposition, enumdirection, packetplayinblockplace.d(), packetplayinblockplace.e(), packetplayinblockplace.f()); -+ always = !this.player.playerInteractManager.interact(this.player, worldserver, itemstack, blockposition, enumdirection, packetplayinblockplace.d(), packetplayinblockplace.e(), packetplayinblockplace.f()); - } - - flag = true; -@@ -440,7 +749,8 @@ - - this.player.activeContainer.b(); - this.player.g = false; -- if (!ItemStack.matches(this.player.inventory.getItemInHand(), packetplayinblockplace.getItemStack())) { -+ // CraftBukkit - TODO CHECK IF NEEDED -- new if structure might not need 'always'. Kept it in for now, but may be able to remove in future -+ if (!ItemStack.matches(this.player.inventory.getItemInHand(), packetplayinblockplace.getItemStack()) || always) { - this.sendPacket(new PacketPlayOutSetSlot(this.player.activeContainer.windowId, slot.rawSlotIndex, this.player.inventory.getItemInHand())); - } - } -@@ -454,8 +764,8 @@ - WorldServer[] aworldserver = this.minecraftServer.worldServer; - int i = aworldserver.length; - -- for (int j = 0; j < i; ++j) { -- WorldServer worldserver = aworldserver[j]; -+ // CraftBukkit - use the worlds array list -+ for (WorldServer worldserver : minecraftServer.worlds) { - - if (worldserver != null) { - entity = packetplayinspectate.a(worldserver); -@@ -468,6 +778,8 @@ - if (entity != null) { - this.player.setSpectatorTarget(this.player); - this.player.mount((Entity) null); -+ -+ /* CraftBukkit start - replace with bukkit handling for multi-world - if (entity.world != this.player.world) { - WorldServer worldserver1 = this.player.u(); - WorldServer worldserver2 = (WorldServer) entity.world; -@@ -492,22 +804,44 @@ - } else { - this.player.enderTeleportTo(entity.locX, entity.locY, entity.locZ); - } -+ */ -+ this.player.getBukkitEntity().teleport(entity.getBukkitEntity(), PlayerTeleportEvent.TeleportCause.SPECTATE); -+ // CraftBukkit end - } - } - - } - -- public void a(PacketPlayInResourcePackStatus packetplayinresourcepackstatus) {} -+ // CraftBukkit start -+ public void a(PacketPlayInResourcePackStatus packetplayinresourcepackstatus) { -+ this.server.getPluginManager().callEvent(new PlayerResourcePackStatusEvent(getPlayer(), PlayerResourcePackStatusEvent.Status.values()[packetplayinresourcepackstatus.b.ordinal()])); -+ } -+ // CraftBukkit end - - public void a(IChatBaseComponent ichatbasecomponent) { -- PlayerConnection.c.info(this.player.getName() + " lost connection: " + ichatbasecomponent); -+ // CraftBukkit start - Rarely it would send a disconnect line twice -+ if (this.processedDisconnect) { -+ return; -+ } else { -+ this.processedDisconnect = true; -+ } -+ // CraftBukkit end -+ PlayerConnection.c.info(this.player.getName() + " lost connection: " + ichatbasecomponent.c()); // CraftBukkit: Don't toString(). // PAIL: Rename -+ // CraftBukkit start - Replace vanilla quit message handling with our own. -+ /* - this.minecraftServer.aH(); - ChatMessage chatmessage = new ChatMessage("multiplayer.player.left", new Object[] { this.player.getScoreboardDisplayName()}); - - chatmessage.getChatModifier().setColor(EnumChatFormat.YELLOW); - this.minecraftServer.getPlayerList().sendMessage(chatmessage); -+ */ -+ - this.player.q(); -- this.minecraftServer.getPlayerList().disconnect(this.player); -+ String quitMessage = this.minecraftServer.getPlayerList().disconnect(this.player); -+ if ((quitMessage != null) && (quitMessage.length() > 0)) { -+ this.minecraftServer.getPlayerList().sendMessage(CraftChatMessage.fromString(quitMessage)); -+ } -+ // CraftBukkit end - if (this.minecraftServer.T() && this.player.getName().equals(this.minecraftServer.S())) { - PlayerConnection.c.info("Stopping singleplayer server as player logged out"); - this.minecraftServer.safeShutdown(); -@@ -529,6 +863,15 @@ - } - } - -+ // CraftBukkit start -+ if (packet == null) { -+ return; -+ } else if (packet instanceof PacketPlayOutSpawnPosition) { -+ PacketPlayOutSpawnPosition packet6 = (PacketPlayOutSpawnPosition) packet; -+ this.player.compassTarget = new Location(this.getPlayer().getWorld(), packet6.position.getX(), packet6.position.getY(), packet6.position.getZ()); -+ } -+ // CraftBukkit end -+ - try { - this.networkManager.handle(packet); - } catch (Throwable throwable) { -@@ -549,18 +892,34 @@ - } - - public void a(PacketPlayInHeldItemSlot packetplayinhelditemslot) { -+ // CraftBukkit start -+ if (this.player.dead) return; - PlayerConnectionUtils.ensureMainThread(packetplayinhelditemslot, this, this.player.u()); - if (packetplayinhelditemslot.a() >= 0 && packetplayinhelditemslot.a() < PlayerInventory.getHotbarSize()) { -+ PlayerItemHeldEvent event = new PlayerItemHeldEvent(this.getPlayer(), this.player.inventory.itemInHandIndex, packetplayinhelditemslot.a()); -+ this.server.getPluginManager().callEvent(event); -+ if (event.isCancelled()) { -+ this.sendPacket(new PacketPlayOutHeldItemSlot(this.player.inventory.itemInHandIndex)); -+ this.player.resetIdleTimer(); -+ return; -+ } -+ // CraftBukkit end - this.player.inventory.itemInHandIndex = packetplayinhelditemslot.a(); - this.player.resetIdleTimer(); - } else { - PlayerConnection.c.warn(this.player.getName() + " tried to set an invalid carried item"); -+ this.disconnect("Nope!"); // CraftBukkit - } - } - - public void a(PacketPlayInChat packetplayinchat) { -- PlayerConnectionUtils.ensureMainThread(packetplayinchat, this, this.player.u()); -- if (this.player.getChatFlags() == EntityHuman.EnumChatVisibility.HIDDEN) { -+ // CraftBukkit start - async chat -+ boolean isSync = packetplayinchat.a().startsWith("/"); -+ if (packetplayinchat.a().startsWith("/")) { -+ PlayerConnectionUtils.ensureMainThread(packetplayinchat, this, this.player.u()); -+ } -+ // CraftBukkit end -+ if (this.player.dead || this.player.getChatFlags() == EntityHuman.EnumChatVisibility.HIDDEN) { // CraftBukkit - dead men tell no tales - ChatMessage chatmessage = new ChatMessage("chat.cannotSend", new Object[0]); - - chatmessage.getChatModifier().setColor(EnumChatFormat.RED); -@@ -573,39 +932,249 @@ - - for (int i = 0; i < s.length(); ++i) { - if (!SharedConstants.isAllowedChatCharacter(s.charAt(i))) { -- this.disconnect("Illegal characters in chat"); -+ // CraftBukkit start - threadsafety -+ if (!isSync) { -+ Waitable waitable = new Waitable() { -+ @Override -+ protected Object evaluate() { -+ PlayerConnection.this.disconnect("Illegal characters in chat"); -+ return null; -+ } -+ }; -+ -+ this.minecraftServer.processQueue.add(waitable); -+ -+ try { -+ waitable.get(); -+ } catch (InterruptedException e) { -+ Thread.currentThread().interrupt(); -+ } catch (ExecutionException e) { -+ throw new RuntimeException(e); -+ } -+ } else { -+ this.disconnect("Illegal characters in chat"); -+ } -+ // CraftBukkit end - return; - } - } - -- if (s.startsWith("/")) { -- this.handleCommand(s); -+ // CraftBukkit start -+ if (isSync) { -+ try { -+ this.minecraftServer.server.playerCommandState = true; -+ this.handleCommand(s); -+ } finally { -+ this.minecraftServer.server.playerCommandState = false; -+ } -+ } else if (s.isEmpty()) { -+ c.warn(this.player.getName() + " tried to send an empty message"); -+ } else if (getPlayer().isConversing()) { -+ getPlayer().acceptConversationInput(s); -+ } else if (this.player.getChatFlags() == EntityHuman.EnumChatVisibility.SYSTEM) { // Re-add "Command Only" flag check -+ ChatMessage chatmessage = new ChatMessage("chat.cannotSend", new Object[0]); -+ -+ chatmessage.getChatModifier().setColor(EnumChatFormat.RED); -+ this.sendPacket(new PacketPlayOutChat(chatmessage)); -+ } else if (true) { -+ this.chat(s, true); -+ // CraftBukkit end - the below is for reference. :) - } else { - ChatMessage chatmessage1 = new ChatMessage("chat.type.text", new Object[] { this.player.getScoreboardDisplayName(), s}); - - this.minecraftServer.getPlayerList().sendMessage(chatmessage1, false); - } - -- this.chatThrottle += 20; -- if (this.chatThrottle > 200 && !this.minecraftServer.getPlayerList().isOp(this.player.getProfile())) { -- this.disconnect("disconnect.spam"); -+ // CraftBukkit start - replaced with thread safe throttle -+ // this.chatThrottle += 20; -+ if (chatSpamField.addAndGet(this, 20) > 200 && !this.minecraftServer.getPlayerList().isOp(this.player.getProfile())) { -+ if (!isSync) { -+ Waitable waitable = new Waitable() { -+ @Override -+ protected Object evaluate() { -+ PlayerConnection.this.disconnect("disconnect.spam"); -+ return null; -+ } -+ }; -+ -+ this.minecraftServer.processQueue.add(waitable); -+ -+ try { -+ waitable.get(); -+ } catch (InterruptedException e) { -+ Thread.currentThread().interrupt(); -+ } catch (ExecutionException e) { -+ throw new RuntimeException(e); -+ } -+ } else { -+ this.disconnect("disconnect.spam"); -+ } -+ // CraftBukkit end - } - - } - } - -- private void handleCommand(String s) { -- this.minecraftServer.getCommandHandler().a(this.player, s); -+ // CraftBukkit start - add method -+ public void chat(String s, boolean async) { -+ if (s.isEmpty() || this.player.getChatFlags() == EntityHuman.EnumChatVisibility.HIDDEN) { -+ return; -+ } -+ -+ if (!async && s.startsWith("/")) { -+ this.handleCommand(s); -+ } else if (this.player.getChatFlags() == EntityHuman.EnumChatVisibility.SYSTEM) { -+ // Do nothing, this is coming from a plugin -+ } else { -+ Player player = this.getPlayer(); -+ AsyncPlayerChatEvent event = new AsyncPlayerChatEvent(async, player, s, new LazyPlayerSet()); -+ this.server.getPluginManager().callEvent(event); -+ -+ if (PlayerChatEvent.getHandlerList().getRegisteredListeners().length != 0) { -+ // Evil plugins still listening to deprecated event -+ final PlayerChatEvent queueEvent = new PlayerChatEvent(player, event.getMessage(), event.getFormat(), event.getRecipients()); -+ queueEvent.setCancelled(event.isCancelled()); -+ Waitable waitable = new Waitable() { -+ @Override -+ protected Object evaluate() { -+ org.bukkit.Bukkit.getPluginManager().callEvent(queueEvent); -+ -+ if (queueEvent.isCancelled()) { -+ return null; -+ } -+ -+ String message = String.format(queueEvent.getFormat(), queueEvent.getPlayer().getDisplayName(), queueEvent.getMessage()); -+ PlayerConnection.this.minecraftServer.console.sendMessage(message); -+ if (((LazyPlayerSet) queueEvent.getRecipients()).isLazy()) { -+ for (Object player : PlayerConnection.this.minecraftServer.getPlayerList().players) { -+ ((EntityPlayer) player).sendMessage(CraftChatMessage.fromString(message)); -+ } -+ } else { -+ for (Player player : queueEvent.getRecipients()) { -+ player.sendMessage(message); -+ } -+ } -+ return null; -+ }}; -+ if (async) { -+ minecraftServer.processQueue.add(waitable); -+ } else { -+ waitable.run(); -+ } -+ try { -+ waitable.get(); -+ } catch (InterruptedException e) { -+ Thread.currentThread().interrupt(); // This is proper habit for java. If we aren't handling it, pass it on! -+ } catch (ExecutionException e) { -+ throw new RuntimeException("Exception processing chat event", e.getCause()); -+ } -+ } else { -+ if (event.isCancelled()) { -+ return; -+ } -+ -+ s = String.format(event.getFormat(), event.getPlayer().getDisplayName(), event.getMessage()); -+ minecraftServer.console.sendMessage(s); -+ if (((LazyPlayerSet) event.getRecipients()).isLazy()) { -+ for (Object recipient : minecraftServer.getPlayerList().players) { -+ ((EntityPlayer) recipient).sendMessage(CraftChatMessage.fromString(s)); -+ } -+ } else { -+ for (Player recipient : event.getRecipients()) { -+ recipient.sendMessage(s); -+ } -+ } -+ } -+ } -+ } -+ // CraftBukkit end -+ -+ private void handleCommand(String s) { -+ // CraftBukkit start - whole method -+ this.c.info(this.player.getName() + " issued server command: " + s); -+ -+ CraftPlayer player = this.getPlayer(); -+ -+ PlayerCommandPreprocessEvent event = new PlayerCommandPreprocessEvent(player, s, new LazyPlayerSet()); -+ this.server.getPluginManager().callEvent(event); -+ -+ if (event.isCancelled()) { -+ return; -+ } -+ -+ try { -+ if (this.server.dispatchCommand(event.getPlayer(), event.getMessage().substring(1))) { -+ return; -+ } -+ } catch (org.bukkit.command.CommandException ex) { -+ player.sendMessage(org.bukkit.ChatColor.RED + "An internal error occurred while attempting to perform this command"); -+ java.util.logging.Logger.getLogger(PlayerConnection.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); -+ return; -+ } -+ // this.minecraftServer.getCommandHandler().a(this.player, s); -+ // CraftBukkit end - } - - public void a(PacketPlayInArmAnimation packetplayinarmanimation) { -+ if (this.player.dead) return; // CraftBukkit - PlayerConnectionUtils.ensureMainThread(packetplayinarmanimation, this, this.player.u()); - this.player.resetIdleTimer(); -+ // CraftBukkit start - Raytrace to look for 'rogue armswings' -+ float f1 = this.player.pitch; -+ float f2 = this.player.yaw; -+ double d0 = this.player.locX; -+ double d1 = this.player.locY + (double) this.player.getHeadHeight(); -+ double d2 = this.player.locZ; -+ Vec3D vec3d = new Vec3D(d0, d1, d2); -+ -+ float f3 = MathHelper.cos(-f2 * 0.017453292F - 3.1415927F); -+ float f4 = MathHelper.sin(-f2 * 0.017453292F - 3.1415927F); -+ float f5 = -MathHelper.cos(-f1 * 0.017453292F); -+ float f6 = MathHelper.sin(-f1 * 0.017453292F); -+ float f7 = f4 * f5; -+ float f8 = f3 * f5; -+ double d3 = player.playerInteractManager.getGameMode() == WorldSettings.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); -+ -+ if (movingobjectposition == null || movingobjectposition.type != MovingObjectPosition.EnumMovingObjectType.BLOCK) { -+ CraftEventFactory.callPlayerInteractEvent(this.player, Action.LEFT_CLICK_AIR, this.player.inventory.getItemInHand()); -+ } -+ -+ // Arm swing animation -+ PlayerAnimationEvent event = new PlayerAnimationEvent(this.getPlayer()); -+ this.server.getPluginManager().callEvent(event); -+ -+ if (event.isCancelled()) return; -+ // CraftBukkit end - this.player.bw(); - } - - public void a(PacketPlayInEntityAction packetplayinentityaction) { - PlayerConnectionUtils.ensureMainThread(packetplayinentityaction, this, this.player.u()); -+ // CraftBukkit start -+ if (this.player.dead) return; -+ switch (packetplayinentityaction.b()) { -+ case START_SNEAKING: -+ case STOP_SNEAKING: -+ PlayerToggleSneakEvent event = new PlayerToggleSneakEvent(this.getPlayer(), packetplayinentityaction.b() == PacketPlayInEntityAction.EnumPlayerAction.START_SNEAKING); -+ this.server.getPluginManager().callEvent(event); -+ -+ if (event.isCancelled()) { -+ return; -+ } -+ break; -+ case START_SPRINTING: -+ case STOP_SPRINTING: -+ PlayerToggleSprintEvent e2 = new PlayerToggleSprintEvent(this.getPlayer(), packetplayinentityaction.b() == PacketPlayInEntityAction.EnumPlayerAction.START_SPRINTING); -+ this.server.getPluginManager().callEvent(e2); -+ -+ if (e2.isCancelled()) { -+ return; -+ } -+ break; -+ } -+ // CraftBukkit end - this.player.resetIdleTimer(); - switch (PlayerConnection.SyntheticClass_1.b[packetplayinentityaction.b().ordinal()]) { - case 1: -@@ -626,7 +1195,7 @@ - - case 5: - this.player.a(false, true, true); -- this.checkMovement = false; -+ // this.checkMovement = false; // CraftBukkit - this is handled in teleport - break; - - case 6: -@@ -648,6 +1217,7 @@ - } - - public void a(PacketPlayInUseEntity packetplayinuseentity) { -+ if (this.player.dead) return; // CraftBukkit - PlayerConnectionUtils.ensureMainThread(packetplayinuseentity, this, this.player.u()); - WorldServer worldserver = this.minecraftServer.getWorldServer(this.player.dimension); - Entity entity = packetplayinuseentity.a((World) worldserver); -@@ -662,18 +1232,67 @@ - } - - if (this.player.h(entity) < d0) { -+ ItemStack itemInHand = this.player.inventory.getItemInHand(); // CraftBukkit -+ -+ if (packetplayinuseentity.a() == PacketPlayInUseEntity.EnumEntityUseAction.INTERACT -+ || packetplayinuseentity.a() == 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()); -+ } else { -+ Vec3D target = packetplayinuseentity.b(); -+ event = new PlayerInteractAtEntityEvent((Player) this.getPlayer(), entity.getBukkitEntity(), new org.bukkit.util.Vector(target.a, target.b, target.c)); -+ } -+ this.server.getPluginManager().callEvent(event); -+ -+ if (triggerLeashUpdate && (event.isCancelled() || this.player.inventory.getItemInHand() == null || this.player.inventory.getItemInHand().getItem() != Items.LEAD)) { -+ // Refresh the current leash state -+ this.sendPacket(new PacketPlayOutAttachEntity(1, entity, ((EntityInsentient) entity).getLeashHolder())); -+ } -+ -+ if (event.isCancelled() || this.player.inventory.getItemInHand() == null || this.player.inventory.getItemInHand().getItem() != origItem) { -+ // Refresh the current entity metadata -+ this.sendPacket(new PacketPlayOutEntityMetadata(entity.getId(), entity.datawatcher, true)); -+ } -+ -+ if (event.isCancelled()) { -+ return; -+ } -+ // CraftBukkit end -+ } - if (packetplayinuseentity.a() == PacketPlayInUseEntity.EnumEntityUseAction.INTERACT) { - this.player.u(entity); -+ -+ // CraftBukkit start -+ if (itemInHand != null && itemInHand.count <= -1) { -+ this.player.updateInventory(this.player.activeContainer); -+ } -+ // CraftBukkit end - } else if (packetplayinuseentity.a() == PacketPlayInUseEntity.EnumEntityUseAction.INTERACT_AT) { - entity.a((EntityHuman) this.player, packetplayinuseentity.b()); -+ -+ // CraftBukkit start -+ if (itemInHand != null && itemInHand.count <= -1) { -+ this.player.updateInventory(this.player.activeContainer); -+ } -+ // CraftBukkit end - } else if (packetplayinuseentity.a() == 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("Attempting to attack an invalid entity"); - this.minecraftServer.warning("Player " + this.player.getName() + " tried to attack an invalid entity"); - return; - } - - this.player.attack(entity); -+ -+ // CraftBukkit start -+ if (itemInHand != null && itemInHand.count <= -1) { -+ this.player.updateInventory(this.player.activeContainer); -+ } -+ // CraftBukkit end - } - } - } -@@ -688,7 +1307,8 @@ - switch (PlayerConnection.SyntheticClass_1.c[packetplayinclientcommand_enumclientcommand.ordinal()]) { - case 1: - if (this.player.viewingCredits) { -- this.player = this.minecraftServer.getPlayerList().moveToWorld(this.player, 0, true); -+ // this.player = this.minecraftServer.getPlayerList().moveToWorld(this.player, 0, true); -+ this.minecraftServer.getPlayerList().changeDimension(this.player, 0, PlayerTeleportEvent.TeleportCause.END_PORTAL); // CraftBukkit - reroute logic through custom portal management - } else if (this.player.u().getWorldData().isHardcore()) { - if (this.minecraftServer.T() && this.player.getName().equals(this.minecraftServer.S())) { - this.player.playerConnection.disconnect("You have died. Game over, man, it\'s game over!"); -@@ -719,15 +1339,21 @@ - } - - public void a(PacketPlayInCloseWindow packetplayinclosewindow) { -+ if (this.player.dead) return; // CraftBukkit - PlayerConnectionUtils.ensureMainThread(packetplayinclosewindow, this, this.player.u()); -+ -+ CraftEventFactory.handleInventoryCloseEvent(this.player); // CraftBukkit -+ - this.player.p(); - } - - public void a(PacketPlayInWindowClick packetplayinwindowclick) { -+ if (this.player.dead) return; // CraftBukkit - PlayerConnectionUtils.ensureMainThread(packetplayinwindowclick, this, this.player.u()); - this.player.resetIdleTimer(); - if (this.player.activeContainer.windowId == packetplayinwindowclick.a() && this.player.activeContainer.c(this.player)) { -- if (this.player.isSpectator()) { -+ boolean cancelled = this.player.isSpectator(); // CraftBukkit - see below if -+ if (false) { // this.player.isSpectator()) { - ArrayList arraylist = Lists.newArrayList(); - - for (int i = 0; i < this.player.activeContainer.c.size(); ++i) { -@@ -736,7 +1362,270 @@ - - this.player.a(this.player.activeContainer, (List) arraylist); - } else { -- ItemStack itemstack = this.player.activeContainer.clickItem(packetplayinwindowclick.b(), packetplayinwindowclick.c(), packetplayinwindowclick.f(), this.player); -+ // ItemStack itemstack = this.player.activeContainer.clickItem(packetplayinwindowclick.b(), packetplayinwindowclick.c(), packetplayinwindowclick.f(), this.player); -+ // CraftBukkit start - Call InventoryClickEvent -+ if (packetplayinwindowclick.b() < -1 && packetplayinwindowclick.b() != -999) { -+ return; -+ } -+ -+ InventoryView inventory = this.player.activeContainer.getBukkitView(); -+ SlotType type = CraftInventoryView.getSlotType(inventory, packetplayinwindowclick.b()); -+ -+ InventoryClickEvent event = null; -+ ClickType click = ClickType.UNKNOWN; -+ InventoryAction action = InventoryAction.UNKNOWN; -+ -+ ItemStack itemstack = null; -+ -+ if (packetplayinwindowclick.b() == -1) { -+ type = SlotType.OUTSIDE; // override -+ click = packetplayinwindowclick.c() == 0 ? ClickType.WINDOW_BORDER_LEFT : ClickType.WINDOW_BORDER_RIGHT; -+ action = InventoryAction.NOTHING; -+ } else if (packetplayinwindowclick.f() == 0) { -+ if (packetplayinwindowclick.c() == 0) { -+ click = ClickType.LEFT; -+ } else if (packetplayinwindowclick.c() == 1) { -+ click = ClickType.RIGHT; -+ } -+ if (packetplayinwindowclick.c() == 0 || packetplayinwindowclick.c() == 1) { -+ action = InventoryAction.NOTHING; // Don't want to repeat ourselves -+ if (packetplayinwindowclick.b() == -999) { -+ if (player.inventory.getCarried() != null) { -+ action = packetplayinwindowclick.c() == 0 ? InventoryAction.DROP_ALL_CURSOR : InventoryAction.DROP_ONE_CURSOR; -+ } -+ } else { -+ Slot slot = this.player.activeContainer.getSlot(packetplayinwindowclick.b()); -+ if (slot != null) { -+ ItemStack clickedItem = slot.getItem(); -+ ItemStack cursor = player.inventory.getCarried(); -+ if (clickedItem == null) { -+ if (cursor != null) { -+ action = packetplayinwindowclick.c() == 0 ? InventoryAction.PLACE_ALL : InventoryAction.PLACE_ONE; -+ } -+ } else if (slot.isAllowed(player)) { -+ if (cursor == null) { -+ action = packetplayinwindowclick.c() == 0 ? InventoryAction.PICKUP_ALL : InventoryAction.PICKUP_HALF; -+ } else if (slot.isAllowed(cursor)) { -+ if (clickedItem.doMaterialsMatch(cursor) && ItemStack.equals(clickedItem, cursor)) { -+ int toPlace = packetplayinwindowclick.c() == 0 ? cursor.count : 1; -+ toPlace = Math.min(toPlace, clickedItem.getMaxStackSize() - clickedItem.count); -+ toPlace = Math.min(toPlace, slot.inventory.getMaxStackSize() - clickedItem.count); -+ if (toPlace == 1) { -+ action = InventoryAction.PLACE_ONE; -+ } else if (toPlace == cursor.count) { -+ action = InventoryAction.PLACE_ALL; -+ } else if (toPlace < 0) { -+ action = toPlace != -1 ? InventoryAction.PICKUP_SOME : InventoryAction.PICKUP_ONE; // this happens with oversized stacks -+ } else if (toPlace != 0) { -+ action = InventoryAction.PLACE_SOME; -+ } -+ } else if (cursor.count <= slot.getMaxStackSize()) { -+ action = InventoryAction.SWAP_WITH_CURSOR; -+ } -+ } else if (cursor.getItem() == clickedItem.getItem() && (!cursor.usesData() || cursor.getData() == clickedItem.getData()) && ItemStack.equals(cursor, clickedItem)) { -+ if (clickedItem.count >= 0) { -+ if (clickedItem.count + cursor.count <= cursor.getMaxStackSize()) { -+ // As of 1.5, this is result slots only -+ action = InventoryAction.PICKUP_ALL; -+ } -+ } -+ } -+ } -+ } -+ } -+ } -+ } else if (packetplayinwindowclick.f() == 1) { -+ if (packetplayinwindowclick.c() == 0) { -+ click = ClickType.SHIFT_LEFT; -+ } else if (packetplayinwindowclick.c() == 1) { -+ click = ClickType.SHIFT_RIGHT; -+ } -+ if (packetplayinwindowclick.c() == 0 || packetplayinwindowclick.c() == 1) { -+ if (packetplayinwindowclick.b() < 0) { -+ action = InventoryAction.NOTHING; -+ } else { -+ Slot slot = this.player.activeContainer.getSlot(packetplayinwindowclick.b()); -+ if (slot != null && slot.isAllowed(this.player) && slot.hasItem()) { -+ action = InventoryAction.MOVE_TO_OTHER_INVENTORY; -+ } else { -+ action = InventoryAction.NOTHING; -+ } -+ } -+ } -+ } else if (packetplayinwindowclick.f() == 2) { -+ if (packetplayinwindowclick.c() >= 0 && packetplayinwindowclick.c() < 9) { -+ click = ClickType.NUMBER_KEY; -+ Slot clickedSlot = this.player.activeContainer.getSlot(packetplayinwindowclick.b()); -+ if (clickedSlot.isAllowed(player)) { -+ ItemStack hotbar = this.player.inventory.getItem(packetplayinwindowclick.c()); -+ boolean canCleanSwap = hotbar == null || (clickedSlot.inventory == player.inventory && clickedSlot.isAllowed(hotbar)); // the slot will accept the hotbar item -+ if (clickedSlot.hasItem()) { -+ if (canCleanSwap) { -+ action = InventoryAction.HOTBAR_SWAP; -+ } else { -+ int firstEmptySlot = player.inventory.getFirstEmptySlotIndex(); -+ if (firstEmptySlot > -1) { -+ action = InventoryAction.HOTBAR_MOVE_AND_READD; -+ } else { -+ action = InventoryAction.NOTHING; // This is not sane! Mojang: You should test for other slots of same type -+ } -+ } -+ } else if (!clickedSlot.hasItem() && hotbar != null && clickedSlot.isAllowed(hotbar)) { -+ action = InventoryAction.HOTBAR_SWAP; -+ } else { -+ action = InventoryAction.NOTHING; -+ } -+ } else { -+ action = InventoryAction.NOTHING; -+ } -+ // Special constructor for number key -+ event = new InventoryClickEvent(inventory, type, packetplayinwindowclick.b(), click, action, packetplayinwindowclick.c()); -+ } -+ } else if (packetplayinwindowclick.f() == 3) { -+ if (packetplayinwindowclick.c() == 2) { -+ click = ClickType.MIDDLE; -+ if (packetplayinwindowclick.b() == -999) { -+ action = InventoryAction.NOTHING; -+ } else { -+ Slot slot = this.player.activeContainer.getSlot(packetplayinwindowclick.b()); -+ if (slot != null && slot.hasItem() && player.abilities.canInstantlyBuild && player.inventory.getCarried() == null) { -+ action = InventoryAction.CLONE_STACK; -+ } else { -+ action = InventoryAction.NOTHING; -+ } -+ } -+ } else { -+ click = ClickType.UNKNOWN; -+ action = InventoryAction.UNKNOWN; -+ } -+ } else if (packetplayinwindowclick.f() == 4) { -+ if (packetplayinwindowclick.b() >= 0) { -+ if (packetplayinwindowclick.c() == 0) { -+ click = ClickType.DROP; -+ Slot slot = this.player.activeContainer.getSlot(packetplayinwindowclick.b()); -+ if (slot != null && slot.hasItem() && slot.isAllowed(player) && slot.getItem() != null && slot.getItem().getItem() != Item.getItemOf(Blocks.AIR)) { -+ action = InventoryAction.DROP_ONE_SLOT; -+ } else { -+ action = InventoryAction.NOTHING; -+ } -+ } else if (packetplayinwindowclick.c() == 1) { -+ click = ClickType.CONTROL_DROP; -+ Slot slot = this.player.activeContainer.getSlot(packetplayinwindowclick.b()); -+ if (slot != null && slot.hasItem() && slot.isAllowed(player) && slot.getItem() != null && slot.getItem().getItem() != Item.getItemOf(Blocks.AIR)) { -+ action = InventoryAction.DROP_ALL_SLOT; -+ } else { -+ action = InventoryAction.NOTHING; -+ } -+ } -+ } else { -+ // Sane default (because this happens when they are holding nothing. Don't ask why.) -+ click = ClickType.LEFT; -+ if (packetplayinwindowclick.c() == 1) { -+ click = ClickType.RIGHT; -+ } -+ action = InventoryAction.NOTHING; -+ } -+ } else if (packetplayinwindowclick.f() == 5) { -+ itemstack = this.player.activeContainer.clickItem(packetplayinwindowclick.b(), packetplayinwindowclick.c(), 5, this.player); -+ } else if (packetplayinwindowclick.f() == 6) { -+ click = ClickType.DOUBLE_CLICK; -+ action = InventoryAction.NOTHING; -+ if (packetplayinwindowclick.b() >= 0 && this.player.inventory.getCarried() != null) { -+ ItemStack cursor = this.player.inventory.getCarried(); -+ action = InventoryAction.NOTHING; -+ // Quick check for if we have any of the item -+ if (inventory.getTopInventory().contains(org.bukkit.Material.getMaterial(Item.getId(cursor.getItem()))) || inventory.getBottomInventory().contains(org.bukkit.Material.getMaterial(Item.getId(cursor.getItem())))) { -+ action = InventoryAction.COLLECT_TO_CURSOR; -+ } -+ } -+ } -+ // TODO check on updates -+ -+ if (packetplayinwindowclick.f() != 5) { -+ if (click == ClickType.NUMBER_KEY) { -+ event = new InventoryClickEvent(inventory, type, packetplayinwindowclick.b(), click, action, packetplayinwindowclick.c()); -+ } else { -+ event = new InventoryClickEvent(inventory, type, packetplayinwindowclick.b(), click, action); -+ } -+ -+ org.bukkit.inventory.Inventory top = inventory.getTopInventory(); -+ if (packetplayinwindowclick.b() == 0 && top instanceof CraftingInventory) { -+ org.bukkit.inventory.Recipe recipe = ((CraftingInventory) top).getRecipe(); -+ if (recipe != null) { -+ if (click == ClickType.NUMBER_KEY) { -+ event = new CraftItemEvent(recipe, inventory, type, packetplayinwindowclick.b(), click, action, packetplayinwindowclick.c()); -+ } else { -+ event = new CraftItemEvent(recipe, inventory, type, packetplayinwindowclick.b(), click, action); -+ } -+ } -+ } -+ -+ event.setCancelled(cancelled); -+ server.getPluginManager().callEvent(event); -+ -+ switch (event.getResult()) { -+ case ALLOW: -+ case DEFAULT: -+ itemstack = this.player.activeContainer.clickItem(packetplayinwindowclick.b(), packetplayinwindowclick.c(), packetplayinwindowclick.f(), this.player); -+ break; -+ case DENY: -+ /* Needs enum constructor in InventoryAction -+ if (action.modifiesOtherSlots()) { -+ -+ } else { -+ if (action.modifiesCursor()) { -+ this.player.playerConnection.sendPacket(new Packet103SetSlot(-1, -1, this.player.inventory.getCarried())); -+ } -+ if (action.modifiesClicked()) { -+ this.player.playerConnection.sendPacket(new Packet103SetSlot(this.player.activeContainer.windowId, packet102windowclick.slot, this.player.activeContainer.getSlot(packet102windowclick.slot).getItem())); -+ } -+ }*/ -+ switch (action) { -+ // Modified other slots -+ case PICKUP_ALL: -+ case MOVE_TO_OTHER_INVENTORY: -+ case HOTBAR_MOVE_AND_READD: -+ case HOTBAR_SWAP: -+ case COLLECT_TO_CURSOR: -+ case UNKNOWN: -+ this.player.updateInventory(this.player.activeContainer); -+ break; -+ // Modified cursor and clicked -+ case PICKUP_SOME: -+ case PICKUP_HALF: -+ case PICKUP_ONE: -+ case PLACE_ALL: -+ case PLACE_SOME: -+ case PLACE_ONE: -+ case SWAP_WITH_CURSOR: -+ this.player.playerConnection.sendPacket(new PacketPlayOutSetSlot(-1, -1, this.player.inventory.getCarried())); -+ this.player.playerConnection.sendPacket(new PacketPlayOutSetSlot(this.player.activeContainer.windowId, packetplayinwindowclick.b(), this.player.activeContainer.getSlot(packetplayinwindowclick.b()).getItem())); -+ break; -+ // Modified clicked only -+ case DROP_ALL_SLOT: -+ case DROP_ONE_SLOT: -+ this.player.playerConnection.sendPacket(new PacketPlayOutSetSlot(this.player.activeContainer.windowId, packetplayinwindowclick.b(), this.player.activeContainer.getSlot(packetplayinwindowclick.b()).getItem())); -+ break; -+ // Modified cursor only -+ case DROP_ALL_CURSOR: -+ case DROP_ONE_CURSOR: -+ case CLONE_STACK: -+ this.player.playerConnection.sendPacket(new PacketPlayOutSetSlot(-1, -1, this.player.inventory.getCarried())); -+ break; -+ // Nothing -+ case NOTHING: -+ break; -+ } -+ return; -+ } -+ -+ if (event instanceof CraftItemEvent) { -+ // Need to update the inventory on crafting to -+ // correctly support custom recipes -+ player.updateInventory(player.activeContainer); -+ } -+ } -+ // CraftBukkit end - - if (ItemStack.matches(packetplayinwindowclick.e(), itemstack)) { - this.player.playerConnection.sendPacket(new PacketPlayOutTransaction(packetplayinwindowclick.a(), packetplayinwindowclick.d(), true)); -@@ -797,8 +1686,48 @@ - } - - boolean flag1 = packetplayinsetcreativeslot.a() >= 1 && packetplayinsetcreativeslot.a() < 36 + PlayerInventory.getHotbarSize(); -- boolean flag2 = itemstack == null || itemstack.getItem() != null; -+ // CraftBukkit - Add invalidItems check -+ boolean flag2 = itemstack == null || itemstack.getItem() != null && !invalidItems.contains(Item.getId(itemstack.getItem())); - boolean flag3 = itemstack == null || itemstack.getData() >= 0 && itemstack.count <= 64 && itemstack.count > 0; -+ // CraftBukkit start - Call click event -+ if (flag || (flag1 && !ItemStack.matches(this.player.defaultContainer.getSlot(packetplayinsetcreativeslot.a()).getItem(), packetplayinsetcreativeslot.getItemStack()))) { // Insist on valid slot -+ -+ org.bukkit.entity.HumanEntity player = this.player.getBukkitEntity(); -+ InventoryView inventory = new CraftInventoryView(player, player.getInventory(), this.player.defaultContainer); -+ org.bukkit.inventory.ItemStack item = CraftItemStack.asBukkitCopy(packetplayinsetcreativeslot.getItemStack()); -+ -+ SlotType type = SlotType.QUICKBAR; -+ if (flag) { -+ type = SlotType.OUTSIDE; -+ } else if (packetplayinsetcreativeslot.a() < 36) { -+ if (packetplayinsetcreativeslot.a() >= 5 && packetplayinsetcreativeslot.a() < 9) { -+ type = SlotType.ARMOR; -+ } else { -+ type = SlotType.CONTAINER; -+ } -+ } -+ InventoryCreativeEvent event = new InventoryCreativeEvent(inventory, type, flag ? -999 : packetplayinsetcreativeslot.a(), item); -+ server.getPluginManager().callEvent(event); -+ -+ itemstack = CraftItemStack.asNMSCopy(event.getCursor()); -+ -+ switch (event.getResult()) { -+ case ALLOW: -+ // Plugin cleared the id / stacksize checks -+ flag2 = flag3 = true; -+ break; -+ case DEFAULT: -+ break; -+ case DENY: -+ // Reset the slot -+ if (packetplayinsetcreativeslot.a() >= 0) { -+ this.player.playerConnection.sendPacket(new PacketPlayOutSetSlot(this.player.defaultContainer.windowId, packetplayinsetcreativeslot.a(), this.player.defaultContainer.getSlot(packetplayinsetcreativeslot.a()).getItem())); -+ this.player.playerConnection.sendPacket(new PacketPlayOutSetSlot(-1, -1, null)); -+ } -+ return; -+ } -+ } -+ // CraftBukkit end - - if (flag1 && flag2 && flag3) { - if (itemstack == null) { -@@ -821,6 +1750,7 @@ - } - - public void a(PacketPlayInTransaction packetplayintransaction) { -+ if (this.player.dead) return; // CraftBukkit - PlayerConnectionUtils.ensureMainThread(packetplayintransaction, this, this.player.u()); - Short oshort = (Short) this.n.get(this.player.activeContainer.windowId); - -@@ -831,6 +1761,7 @@ - } - - public void a(PacketPlayInUpdateSign packetplayinupdatesign) { -+ if (this.player.dead) return; // CraftBukkit - PlayerConnectionUtils.ensureMainThread(packetplayinupdatesign, this, this.player.u()); - this.player.resetIdleTimer(); - WorldServer worldserver = this.minecraftServer.getWorldServer(this.player.dimension); -@@ -847,14 +1778,30 @@ - - if (!tileentitysign.b() || tileentitysign.c() != this.player) { - this.minecraftServer.warning("Player " + this.player.getName() + " just tried to change non-editable sign"); -+ this.sendPacket(new PacketPlayOutUpdateSign(tileentity.world, packetplayinupdatesign.a(), tileentitysign.lines)); // CraftBukkit - return; - } - - IChatBaseComponent[] aichatbasecomponent = packetplayinupdatesign.b(); - -+ // CraftBukkit start -+ Player player = this.server.getPlayer(this.player); -+ int x = packetplayinupdatesign.a().getX(); -+ int y = packetplayinupdatesign.a().getY(); -+ int z = packetplayinupdatesign.a().getZ(); -+ String[] lines = new String[4]; -+ - for (int i = 0; i < aichatbasecomponent.length; ++i) { -- tileentitysign.lines[i] = new ChatComponentText(EnumChatFormat.a(aichatbasecomponent[i].c())); -+ lines[i] = EnumChatFormat.a(aichatbasecomponent[i].c()); - } -+ 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); -+ -+ if (!event.isCancelled()) { -+ System.arraycopy(org.bukkit.craftbukkit.block.CraftSign.sanitizeLines(event.getLines()), 0, tileentitysign.lines, 0, 4); -+ tileentitysign.isEditable = false; -+ } -+ // CraftBukkit end - - tileentitysign.update(); - worldserver.notify(blockposition); -@@ -877,11 +1824,27 @@ - - public void a(PacketPlayInAbilities packetplayinabilities) { - PlayerConnectionUtils.ensureMainThread(packetplayinabilities, this, this.player.u()); -- this.player.abilities.isFlying = packetplayinabilities.isFlying() && this.player.abilities.canFly; -+ // CraftBukkit start -+ if (this.player.abilities.canFly && this.player.abilities.isFlying != packetplayinabilities.isFlying()) { -+ PlayerToggleFlightEvent event = new PlayerToggleFlightEvent(this.server.getPlayer(this.player), packetplayinabilities.isFlying()); -+ this.server.getPluginManager().callEvent(event); -+ if (!event.isCancelled()) { -+ this.player.abilities.isFlying = packetplayinabilities.isFlying(); // Actually set the player's flying status -+ } else { -+ this.player.updateAbilities(); // Tell the player their ability was reverted -+ } -+ } -+ // CraftBukkit end - } - - public void a(PacketPlayInTabComplete packetplayintabcomplete) { - PlayerConnectionUtils.ensureMainThread(packetplayintabcomplete, this, this.player.u()); -+ // CraftBukkit start -+ if (chatSpamField.addAndGet(this, 10) > 500 && !this.minecraftServer.getPlayerList().isOp(this.player.getProfile())) { -+ this.disconnect("disconnect.spam"); -+ return; -+ } -+ // CraftBukkit end - ArrayList arraylist = Lists.newArrayList(); - Iterator iterator = this.minecraftServer.tabCompleteCommand(this.player, packetplayintabcomplete.a(), packetplayintabcomplete.b()).iterator(); - -@@ -905,6 +1868,7 @@ - ItemStack itemstack; - ItemStack itemstack1; - -+ try { // CraftBukkit - if ("MC|BEdit".equals(packetplayincustompayload.a())) { - packetdataserializer = new PacketDataSerializer(Unpooled.wrappedBuffer(packetplayincustompayload.b())); - -@@ -921,13 +1885,16 @@ - itemstack1 = this.player.inventory.getItemInHand(); - if (itemstack1 != null) { - if (itemstack.getItem() == Items.WRITABLE_BOOK && itemstack.getItem() == itemstack1.getItem()) { -+ itemstack1 = new ItemStack(Items.WRITABLE_BOOK); // CraftBukkit - itemstack1.a("pages", (NBTBase) itemstack.getTag().getList("pages", 8)); -+ CraftEventFactory.handleEditBookEvent(player, itemstack1); // CraftBukkit - } - - return; - } - } catch (Exception exception) { - PlayerConnection.c.error("Couldn\'t handle book info", exception); -+ this.disconnect("Invalid book data!"); // CraftBukkit - return; - } finally { - packetdataserializer.release(); -@@ -950,16 +1917,21 @@ - itemstack1 = this.player.inventory.getItemInHand(); - if (itemstack1 != null) { - if (itemstack.getItem() == Items.WRITTEN_BOOK && itemstack1.getItem() == Items.WRITABLE_BOOK) { -+ // CraftBukkit start -+ itemstack1 = new ItemStack(Items.WRITTEN_BOOK); - itemstack1.a("author", (NBTBase) (new NBTTagString(this.player.getName()))); - itemstack1.a("title", (NBTBase) (new NBTTagString(itemstack.getTag().getString("title")))); - itemstack1.a("pages", (NBTBase) itemstack.getTag().getList("pages", 8)); - itemstack1.setItem(Items.WRITTEN_BOOK); -+ CraftEventFactory.handleEditBookEvent(player, itemstack1); -+ // CraftBukkit end - } - - return; - } - } catch (Exception exception1) { - PlayerConnection.c.error("Couldn\'t sign book", exception1); -+ this.disconnect("Invalid book data!"); // CraftBukkit - return; - } finally { - packetdataserializer.release(); -@@ -976,11 +1948,12 @@ - } - } catch (Exception exception2) { - PlayerConnection.c.error("Couldn\'t select trade", exception2); -+ this.disconnect("Invalid trade data!"); // CraftBukkit - } - } else if ("MC|AdvCdm".equals(packetplayincustompayload.a())) { - if (!this.minecraftServer.getEnableCommandBlock()) { - this.player.sendMessage(new ChatMessage("advMode.notEnabled", new Object[0])); -- } else if (this.player.a(2, "") && this.player.abilities.canInstantlyBuild) { -+ } else if (this.player.getBukkitEntity().isOp() && this.player.abilities.canInstantlyBuild) { // CraftBukkit - Change to Bukkit OP versus Vanilla OP - packetdataserializer = packetplayincustompayload.b(); - - try { -@@ -1016,6 +1989,7 @@ - } - } catch (Exception exception3) { - PlayerConnection.c.error("Couldn\'t set command block", exception3); -+ this.disconnect("Invalid CommandBlock data!"); // CraftBukkit - } finally { - packetdataserializer.release(); - } -@@ -1041,6 +2015,7 @@ - } - } catch (Exception exception4) { - PlayerConnection.c.error("Couldn\'t set beacon", exception4); -+ this.disconnect("Invalid beacon data!"); // CraftBukkit - } - } - } else if ("MC|ItemName".equals(packetplayincustompayload.a()) && this.player.activeContainer instanceof ContainerAnvil) { -@@ -1056,7 +2031,35 @@ - containeranvil.a(""); - } - } -+ // CraftBukkit start -+ else if (packetplayincustompayload.a().equals("REGISTER")) { -+ String channels = packetplayincustompayload.b().toString(com.google.common.base.Charsets.UTF_8); -+ for (String channel : channels.split("\0")) { -+ getPlayer().addChannel(channel); -+ } -+ } else if (packetplayincustompayload.a().equals("UNREGISTER")) { -+ String channels = packetplayincustompayload.b().toString(com.google.common.base.Charsets.UTF_8); -+ for (String channel : channels.split("\0")) { -+ getPlayer().removeChannel(channel); -+ } -+ } else { -+ byte[] data = new byte[packetplayincustompayload.b().readableBytes()]; -+ packetplayincustompayload.b().readBytes(data); -+ server.getMessenger().dispatchIncomingMessage(player.getBukkitEntity(), packetplayincustompayload.a(), data); -+ } -+ // CraftBukkit end -+ // CraftBukkit start -+ } finally { -+ if (packetplayincustompayload.b().refCnt() > 0) { -+ packetplayincustompayload.b().release(); -+ } -+ } -+ // CraftBukkit end -+ } - -+ // CraftBukkit start - Add "isDisconnected" method -+ public final boolean isDisconnected() { -+ return !this.player.joining && !this.networkManager.channel.config().isAutoRead(); - } - - static class SyntheticClass_1 { diff --git a/TacoSpigot-Server/nms-patches/PlayerInteractManager.patch b/TacoSpigot-Server/nms-patches/PlayerInteractManager.patch deleted file mode 100644 index c4b0f19..0000000 --- a/TacoSpigot-Server/nms-patches/PlayerInteractManager.patch +++ /dev/null @@ -1,298 +0,0 @@ ---- a/net/minecraft/server/PlayerInteractManager.java -+++ b/net/minecraft/server/PlayerInteractManager.java -@@ -1,5 +1,13 @@ - package net.minecraft.server; - -+// CraftBukkit start -+import org.bukkit.event.block.BlockBreakEvent; -+import org.bukkit.craftbukkit.event.CraftEventFactory; -+import org.bukkit.event.Event; -+import org.bukkit.event.block.Action; -+import org.bukkit.event.player.PlayerInteractEvent; -+// CraftBukkit end -+ - public class PlayerInteractManager { - - public World world; -@@ -26,7 +34,7 @@ - this.gamemode = worldsettings_enumgamemode; - worldsettings_enumgamemode.a(this.player.abilities); - this.player.updateAbilities(); -- this.player.server.getPlayerList().sendAll(new PacketPlayOutPlayerInfo(PacketPlayOutPlayerInfo.EnumPlayerInfoAction.UPDATE_GAME_MODE, new EntityPlayer[] { this.player})); -+ this.player.server.getPlayerList().sendAll(new PacketPlayOutPlayerInfo(PacketPlayOutPlayerInfo.EnumPlayerInfoAction.UPDATE_GAME_MODE, new EntityPlayer[] { this.player}), this.player); // CraftBukkit - } - - public WorldSettings.EnumGamemode getGameMode() { -@@ -50,7 +58,7 @@ - } - - public void a() { -- ++this.currentTick; -+ this.currentTick = MinecraftServer.currentTick; // CraftBukkit; - float f; - int i; - -@@ -95,6 +103,19 @@ - } - - public void a(BlockPosition blockposition, EnumDirection enumdirection) { -+ // CraftBukkit start -+ PlayerInteractEvent event = CraftEventFactory.callPlayerInteractEvent(this.player, Action.LEFT_CLICK_BLOCK, blockposition, enumdirection, this.player.inventory.getItemInHand()); -+ if (event.isCancelled()) { -+ // Let the client know the block still exists -+ ((EntityPlayer) this.player).playerConnection.sendPacket(new PacketPlayOutBlockChange(this.world, blockposition)); -+ // Update any tile entity data for this block -+ TileEntity tileentity = this.world.getTileEntity(blockposition); -+ if (tileentity != null) { -+ this.player.playerConnection.sendPacket(tileentity.getUpdatePacket()); -+ } -+ return; -+ } -+ // CraftBukkit end - if (this.isCreative()) { - if (!this.world.douseFire((EntityHuman) null, blockposition, enumdirection)) { - this.breakBlock(blockposition); -@@ -121,14 +142,48 @@ - } - } - -- this.world.douseFire((EntityHuman) null, blockposition, enumdirection); -+ // this.world.douseFire((EntityHuman) null, blockposition, enumdirection); // CraftBukkit - Moved down - this.lastDigTick = this.currentTick; - float f = 1.0F; - -- if (block.getMaterial() != Material.AIR) { -+ // CraftBukkit start - Swings at air do *NOT* exist. -+ if (event.useInteractedBlock() == Event.Result.DENY) { -+ // If we denied a door from opening, we need to send a correcting update to the client, as it already opened the door. -+ IBlockData data = this.world.getType(blockposition); -+ if (block == Blocks.WOODEN_DOOR) { -+ // For some reason *BOTH* the bottom/top part have to be marked updated. -+ boolean bottom = data.get(BlockDoor.HALF) == BlockDoor.EnumDoorHalf.LOWER; -+ ((EntityPlayer) this.player).playerConnection.sendPacket(new PacketPlayOutBlockChange(this.world, blockposition)); -+ ((EntityPlayer) this.player).playerConnection.sendPacket(new PacketPlayOutBlockChange(this.world, bottom ? blockposition.up() : blockposition.down())); -+ } else if (block == Blocks.TRAPDOOR) { -+ ((EntityPlayer) this.player).playerConnection.sendPacket(new PacketPlayOutBlockChange(this.world, blockposition)); -+ } -+ } else if (block.getMaterial() != Material.AIR) { - block.attack(this.world, blockposition, this.player); - f = block.getDamage(this.player, this.player.world, blockposition); -+ // Allow fire punching to be blocked -+ this.world.douseFire((EntityHuman) null, blockposition, enumdirection); -+ } -+ -+ if (event.useItemInHand() == Event.Result.DENY) { -+ // If we 'insta destroyed' then the client needs to be informed. -+ if (f > 1.0f) { -+ ((EntityPlayer) this.player).playerConnection.sendPacket(new PacketPlayOutBlockChange(this.world, blockposition)); -+ } -+ return; -+ } -+ org.bukkit.event.block.BlockDamageEvent blockEvent = CraftEventFactory.callBlockDamageEvent(this.player, blockposition.getX(), blockposition.getY(), blockposition.getZ(), this.player.inventory.getItemInHand(), f >= 1.0f); -+ -+ if (blockEvent.isCancelled()) { -+ // Let the client know the block still exists -+ ((EntityPlayer) this.player).playerConnection.sendPacket(new PacketPlayOutBlockChange(this.world, blockposition)); -+ return; -+ } -+ -+ if (blockEvent.getInstaBreak()) { -+ f = 2.0f; - } -+ // CraftBukkit end - - if (block.getMaterial() != Material.AIR && f >= 1.0F) { - this.breakBlock(blockposition); -@@ -146,6 +201,7 @@ - - public void a(BlockPosition blockposition) { - if (blockposition.equals(this.f)) { -+ this.currentTick = MinecraftServer.currentTick; // CraftBukkit - int i = this.currentTick - this.lastDigTick; - Block block = this.world.getType(blockposition).getBlock(); - -@@ -163,6 +219,10 @@ - this.j = this.lastDigTick; - } - } -+ // CraftBukkit start - Force block reset to client -+ } else { -+ this.player.playerConnection.sendPacket(new PacketPlayOutBlockChange(this.world, blockposition)); -+ // CraftBukkit end - } - - } -@@ -186,12 +246,72 @@ - } - - public boolean breakBlock(BlockPosition blockposition) { -- if (this.gamemode.d() && this.player.bA() != null && this.player.bA().getItem() instanceof ItemSword) { -+ // CraftBukkit start - fire BlockBreakEvent -+ BlockBreakEvent event = null; -+ -+ if (this.player instanceof EntityPlayer) { -+ org.bukkit.block.Block block = this.world.getWorld().getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ()); -+ -+ // Sword + Creative mode pre-cancel -+ boolean isSwordNoBreak = this.gamemode.d() && this.player.bA() != null && this.player.bA().getItem() instanceof ItemSword; -+ -+ // Tell client the block is gone immediately then process events -+ // Don't tell the client if its a creative sword break because its not broken! -+ if (world.getTileEntity(blockposition) == null && !isSwordNoBreak) { -+ PacketPlayOutBlockChange packet = new PacketPlayOutBlockChange(this.world, blockposition); -+ packet.block = Blocks.AIR.getBlockData(); -+ ((EntityPlayer) this.player).playerConnection.sendPacket(packet); -+ } -+ -+ event = new BlockBreakEvent(block, this.player.getBukkitEntity()); -+ -+ // Sword + Creative mode pre-cancel -+ event.setCancelled(isSwordNoBreak); -+ -+ // Calculate default block experience -+ IBlockData nmsData = this.world.getType(blockposition); -+ Block nmsBlock = nmsData.getBlock(); -+ -+ if (nmsBlock != null && !event.isCancelled() && !this.isCreative() && this.player.b(nmsBlock)) { -+ // Copied from block.a(World world, EntityHuman entityhuman, BlockPosition blockposition, IBlockData iblockdata, TileEntity tileentity) -+ if (!(nmsBlock.I() && EnchantmentManager.hasSilkTouchEnchantment(this.player))) { -+ int data = block.getData(); -+ int bonusLevel = EnchantmentManager.getBonusBlockLootEnchantmentLevel(this.player); -+ -+ event.setExpToDrop(nmsBlock.getExpDrop(this.world, nmsData, bonusLevel)); -+ } -+ } -+ -+ this.world.getServer().getPluginManager().callEvent(event); -+ -+ if (event.isCancelled()) { -+ if (isSwordNoBreak) { -+ return false; -+ } -+ // Let the client know the block still exists -+ ((EntityPlayer) this.player).playerConnection.sendPacket(new PacketPlayOutBlockChange(this.world, blockposition)); -+ // Update any tile entity data for this block -+ TileEntity tileentity = this.world.getTileEntity(blockposition); -+ if (tileentity != null) { -+ this.player.playerConnection.sendPacket(tileentity.getUpdatePacket()); -+ } -+ return false; -+ } -+ } -+ if (false && this.gamemode.d() && this.player.bA() != null && this.player.bA().getItem() instanceof ItemSword) { - return false; - } else { - IBlockData iblockdata = this.world.getType(blockposition); -+ if (iblockdata.getBlock() == Blocks.AIR) return false; // CraftBukkit - A plugin set block to air without cancelling - TileEntity tileentity = this.world.getTileEntity(blockposition); - -+ // CraftBukkit start - Special case skulls, their item data comes from a tile entity -+ if (iblockdata.getBlock() == Blocks.SKULL && !this.isCreative()) { -+ iblockdata.getBlock().dropNaturally(world, blockposition, iblockdata, 1.0F, 0); -+ return this.c(blockposition); -+ } -+ // CraftBukkit end -+ - if (this.gamemode.c()) { - if (this.gamemode == WorldSettings.EnumGamemode.SPECTATOR) { - return false; -@@ -230,6 +350,12 @@ - iblockdata.getBlock().a(this.world, this.player, blockposition, iblockdata, tileentity); - } - } -+ -+ // CraftBukkit start - Drop event experience -+ if (flag && event != null) { -+ iblockdata.getBlock().dropExperience(this.world, blockposition, event.getExpToDrop()); -+ } -+ // CraftBukkit end - - return flag; - } -@@ -267,7 +393,13 @@ - } - } - -+ // CraftBukkit start -+ public boolean interactResult = false; -+ public boolean firedInteract = false; -+ // CraftBukkit end -+ - public boolean interact(EntityHuman entityhuman, World world, ItemStack itemstack, BlockPosition blockposition, EnumDirection enumdirection, float f, float f1, float f2) { -+ /* CraftBukkit start - whole method - if (this.gamemode == WorldSettings.EnumGamemode.SPECTATOR) { - TileEntity tileentity = world.getTileEntity(blockposition); - -@@ -312,6 +444,72 @@ - return itemstack.placeItem(entityhuman, world, blockposition, enumdirection, f, f1, f2); - } - } -+ // Interract event */ -+ IBlockData blockdata = world.getType(blockposition); -+ boolean result = false; -+ if (blockdata.getBlock() != Blocks.AIR) { -+ boolean cancelledBlock = false; -+ -+ if (this.gamemode == WorldSettings.EnumGamemode.SPECTATOR) { -+ TileEntity tileentity = world.getTileEntity(blockposition); -+ cancelledBlock = !(tileentity instanceof ITileInventory || tileentity instanceof IInventory); -+ } -+ -+ if (!entityhuman.getBukkitEntity().isOp() && itemstack != null && Block.asBlock(itemstack.getItem()) instanceof BlockCommand) { -+ cancelledBlock = true; -+ } -+ -+ PlayerInteractEvent event = CraftEventFactory.callPlayerInteractEvent(entityhuman, Action.RIGHT_CLICK_BLOCK, blockposition, enumdirection, itemstack, cancelledBlock); -+ firedInteract = true; -+ interactResult = event.useItemInHand() == Event.Result.DENY; -+ -+ 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())); -+ } -+ result = (event.useItemInHand() != Event.Result.ALLOW); -+ } else if (this.gamemode == WorldSettings.EnumGamemode.SPECTATOR) { -+ TileEntity tileentity = world.getTileEntity(blockposition); -+ -+ if (tileentity instanceof ITileInventory) { -+ Block block = world.getType(blockposition).getBlock(); -+ ITileInventory itileinventory = (ITileInventory) tileentity; -+ -+ if (itileinventory instanceof TileEntityChest && block instanceof BlockChest) { -+ itileinventory = ((BlockChest) block).f(world, blockposition); -+ } -+ -+ if (itileinventory != null) { -+ entityhuman.openContainer(itileinventory); -+ return true; -+ } -+ } else if (tileentity instanceof IInventory) { -+ entityhuman.openContainer((IInventory) tileentity); -+ return true; -+ } -+ -+ return false; -+ } else if (!entityhuman.isSneaking() || itemstack == null) { -+ result = blockdata.getBlock().interact(world, blockposition, blockdata, entityhuman, enumdirection, f, f1, f2); -+ } -+ -+ if (itemstack != null && !result && !interactResult) { // add !interactResult SPIGOT-764 -+ int j1 = itemstack.getData(); -+ int k1 = itemstack.count; -+ -+ result = itemstack.placeItem(entityhuman, world, blockposition, enumdirection, f, f1, f2); -+ -+ // The item count should not decrement in Creative mode. -+ if (this.isCreative()) { -+ itemstack.setData(j1); -+ itemstack.count = k1; -+ } -+ } -+ } -+ return result; -+ // CraftBukkit end - } - - public void a(WorldServer worldserver) { diff --git a/TacoSpigot-Server/nms-patches/PlayerInventory.patch b/TacoSpigot-Server/nms-patches/PlayerInventory.patch deleted file mode 100644 index cf26956..0000000 --- a/TacoSpigot-Server/nms-patches/PlayerInventory.patch +++ /dev/null @@ -1,100 +0,0 @@ ---- a/net/minecraft/server/PlayerInventory.java -+++ b/net/minecraft/server/PlayerInventory.java -@@ -2,6 +2,13 @@ - - import java.util.concurrent.Callable; - -+// CraftBukkit start -+import java.util.List; -+ -+import org.bukkit.craftbukkit.entity.CraftHumanEntity; -+import org.bukkit.entity.HumanEntity; -+// CraftBukkit end -+ - public class PlayerInventory implements IInventory { - - public ItemStack[] items = new ItemStack[36]; -@@ -11,6 +18,39 @@ - private ItemStack f; - public boolean e; - -+ // CraftBukkit start - add fields and methods -+ public List transaction = new java.util.ArrayList(); -+ private int maxStack = MAX_STACK; -+ -+ public ItemStack[] getContents() { -+ return this.items; -+ } -+ -+ public ItemStack[] getArmorContents() { -+ return this.armor; -+ } -+ -+ public void onOpen(CraftHumanEntity who) { -+ transaction.add(who); -+ } -+ -+ public void onClose(CraftHumanEntity who) { -+ transaction.remove(who); -+ } -+ -+ public List getViewers() { -+ return transaction; -+ } -+ -+ public org.bukkit.inventory.InventoryHolder getOwner() { -+ return this.player.getBukkitEntity(); -+ } -+ -+ public void setMaxStackSize(int size) { -+ maxStack = size; -+ } -+ // CraftBukkit end -+ - public PlayerInventory(EntityHuman entityhuman) { - this.player = entityhuman; - } -@@ -43,6 +83,22 @@ - return -1; - } - -+ // CraftBukkit start - Watch method above! :D -+ public int canHold(ItemStack itemstack) { -+ int remains = itemstack.count; -+ for (int i = 0; i < this.items.length; ++i) { -+ if (this.items[i] == null) return itemstack.count; -+ -+ // Taken from firstPartial(ItemStack) -+ if (this.items[i] != null && this.items[i].getItem() == itemstack.getItem() && this.items[i].isStackable() && this.items[i].count < this.items[i].getMaxStackSize() && this.items[i].count < this.getMaxStackSize() && (!this.items[i].usesData() || this.items[i].getData() == itemstack.getData()) && ItemStack.equals(this.items[i], itemstack)) { -+ remains -= (this.items[i].getMaxStackSize() < this.getMaxStackSize() ? this.items[i].getMaxStackSize() : this.getMaxStackSize()) - this.items[i].count; -+ } -+ if (remains <= 0) return itemstack.count; -+ } -+ return itemstack.count - remains; -+ } -+ // CraftBukkit end -+ - public int getFirstEmptySlotIndex() { - for (int i = 0; i < this.items.length; ++i) { - if (this.items[i] == null) { -@@ -390,7 +446,7 @@ - } - - public int getMaxStackSize() { -- return 64; -+ return maxStack; // CraftBukkit - } - - public boolean b(Block block) { -@@ -466,6 +522,11 @@ - } - - public ItemStack getCarried() { -+ // CraftBukkit start -+ if (this.f != null && this.f.count == 0) { -+ this.setCarried(null); -+ } -+ // CraftBukkit end - return this.f; - } - diff --git a/TacoSpigot-Server/nms-patches/PlayerList.patch b/TacoSpigot-Server/nms-patches/PlayerList.patch deleted file mode 100644 index 52d22e6..0000000 --- a/TacoSpigot-Server/nms-patches/PlayerList.patch +++ /dev/null @@ -1,875 +0,0 @@ ---- a/net/minecraft/server/PlayerList.java -+++ b/net/minecraft/server/PlayerList.java -@@ -18,6 +18,26 @@ - import org.apache.logging.log4j.LogManager; - import org.apache.logging.log4j.Logger; - -+// CraftBukkit start -+import org.bukkit.craftbukkit.CraftServer; -+import org.bukkit.craftbukkit.CraftWorld; -+import org.bukkit.craftbukkit.chunkio.ChunkIOExecutor; -+ -+import org.bukkit.Bukkit; -+import org.bukkit.Location; -+import org.bukkit.TravelAgent; -+import org.bukkit.craftbukkit.util.CraftChatMessage; -+import org.bukkit.entity.Player; -+import org.bukkit.event.player.PlayerChangedWorldEvent; -+import org.bukkit.event.player.PlayerPortalEvent; -+import org.bukkit.event.player.PlayerJoinEvent; -+import org.bukkit.event.player.PlayerLoginEvent; -+import org.bukkit.event.player.PlayerQuitEvent; -+import org.bukkit.event.player.PlayerRespawnEvent; -+import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause; -+import org.bukkit.util.Vector; -+// CraftBukkit end -+ - public abstract class PlayerList { - - public static final File a = new File("banned-players.json"); -@@ -27,7 +47,7 @@ - private static final Logger f = LogManager.getLogger(); - private static final SimpleDateFormat g = new SimpleDateFormat("yyyy-MM-dd \'at\' HH:mm:ss z"); - private final MinecraftServer server; -- public final List players = Lists.newArrayList(); -+ public final List players = new java.util.concurrent.CopyOnWriteArrayList(); // CraftBukkit - ArrayList -> CopyOnWriteArrayList: Iterator safety - private final Map j = Maps.newHashMap(); - private final GameProfileBanList k; - private final IpBanList l; -@@ -42,7 +62,15 @@ - private boolean t; - private int u; - -+ // CraftBukkit start -+ private CraftServer cserver; -+ - public PlayerList(MinecraftServer minecraftserver) { -+ this.cserver = minecraftserver.server = new CraftServer(minecraftserver, this); -+ minecraftserver.console = org.bukkit.craftbukkit.command.ColouredConsoleSender.getInstance(); -+ minecraftserver.reader.addCompleter(new org.bukkit.craftbukkit.command.ConsoleCommandCompleter(minecraftserver.server)); -+ // CraftBukkit end -+ - this.k = new GameProfileBanList(PlayerList.a); - this.l = new IpBanList(PlayerList.b); - this.operators = new OpList(PlayerList.c); -@@ -62,6 +90,12 @@ - - usercache.a(gameprofile); - NBTTagCompound nbttagcompound = this.a(entityplayer); -+ // CraftBukkit start - Better rename detection -+ if (nbttagcompound != null && nbttagcompound.hasKey("bukkit")) { -+ NBTTagCompound bukkit = nbttagcompound.getCompound("bukkit"); -+ s = bukkit.hasKeyOfType("lastKnownName", 8) ? bukkit.getString("lastKnownName") : s; -+ } -+ // CraftBukkit end - - entityplayer.spawnIn(this.server.getWorldServer(entityplayer.dimension)); - entityplayer.playerInteractManager.a((WorldServer) entityplayer.world); -@@ -71,7 +105,8 @@ - s1 = networkmanager.getSocketAddress().toString(); - } - -- PlayerList.f.info(entityplayer.getName() + "[" + s1 + "] logged in with entity id " + entityplayer.getId() + " at (" + entityplayer.locX + ", " + entityplayer.locY + ", " + entityplayer.locZ + ")"); -+ // CraftBukkit - Moved message to after join -+ // PlayerList.f.info(entityplayer.getName() + "[" + s1 + "] logged in with entity id " + entityplayer.getId() + " at (" + entityplayer.locX + ", " + entityplayer.locY + ", " + entityplayer.locZ + ")"); - WorldServer worldserver = this.server.getWorldServer(entityplayer.dimension); - WorldData worlddata = worldserver.getWorldData(); - BlockPosition blockposition = worldserver.getSpawn(); -@@ -79,7 +114,8 @@ - this.a(entityplayer, (EntityPlayer) null, worldserver); - PlayerConnection playerconnection = new PlayerConnection(this.server, networkmanager, entityplayer); - -- playerconnection.sendPacket(new PacketPlayOutLogin(entityplayer.getId(), entityplayer.playerInteractManager.getGameMode(), worlddata.isHardcore(), worldserver.worldProvider.getDimension(), worldserver.getDifficulty(), this.getMaxPlayers(), worlddata.getType(), worldserver.getGameRules().getBoolean("reducedDebugInfo"))); -+ playerconnection.sendPacket(new PacketPlayOutLogin(entityplayer.getId(), entityplayer.playerInteractManager.getGameMode(), worlddata.isHardcore(), worldserver.worldProvider.getDimension(), worldserver.getDifficulty(), Math.min(this.getMaxPlayers(), 60), worlddata.getType(), worldserver.getGameRules().getBoolean("reducedDebugInfo"))); // CraftBukkit - cap player list to 60 -+ entityplayer.getBukkitEntity().sendSupportedChannels(); // CraftBukkit - playerconnection.sendPacket(new PacketPlayOutCustomPayload("MC|Brand", (new PacketDataSerializer(Unpooled.buffer())).a(this.getServer().getServerModName()))); - playerconnection.sendPacket(new PacketPlayOutServerDifficulty(worlddata.getDifficulty(), worlddata.isDifficultyLocked())); - playerconnection.sendPacket(new PacketPlayOutSpawnPosition(blockposition)); -@@ -89,17 +125,23 @@ - entityplayer.getStatisticManager().updateStatistics(entityplayer); - this.sendScoreboard((ScoreboardServer) worldserver.getScoreboard(), entityplayer); - this.server.aH(); -- 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.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); - } else { -- 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()); - } - -- chatmessage.getChatModifier().setColor(EnumChatFormat.YELLOW); -- this.sendMessage(chatmessage); -- this.onPlayerJoin(entityplayer); -+ // chatmessage.getChatModifier().setColor(EnumChatFormat.YELLOW); -+ // this.sendMessage(chatmessage); -+ this.onPlayerJoin(entityplayer, joinMessage); -+ // 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().length() > 0) { -@@ -126,6 +168,8 @@ - } - } - -+ // 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 + ")"); - } - - public void sendScoreboard(ScoreboardServer scoreboardserver, EntityPlayer entityplayer) { -@@ -158,6 +202,7 @@ - } - - public void setPlayerFileData(WorldServer[] aworldserver) { -+ if (playerFileData != null) return; // CraftBukkit - this.playerFileData = aworldserver[0].getDataManager().getPlayerFileData(); - aworldserver[0].getWorldBorder().a(new IWorldBorderListener() { - public void a(WorldBorder worldborder, double d0) { -@@ -202,7 +247,7 @@ - } - - public NBTTagCompound a(EntityPlayer entityplayer) { -- NBTTagCompound nbttagcompound = this.server.worldServer[0].getWorldData().i(); -+ NBTTagCompound nbttagcompound = this.server.worlds.get(0).getWorldData().i(); // CraftBukkit - NBTTagCompound nbttagcompound1; - - if (entityplayer.getName().equals(this.server.S()) && nbttagcompound != null) { -@@ -226,33 +271,72 @@ - - } - -- public void onPlayerJoin(EntityPlayer entityplayer) { -+ public void onPlayerJoin(EntityPlayer entityplayer, String joinMessage) { // CraftBukkit added param - this.players.add(entityplayer); - this.j.put(entityplayer.getUniqueID(), entityplayer); -- this.sendAll(new PacketPlayOutPlayerInfo(PacketPlayOutPlayerInfo.EnumPlayerInfoAction.ADD_PLAYER, new EntityPlayer[] { entityplayer})); -+ // this.sendAll(new PacketPlayOutPlayerInfo(PacketPlayOutPlayerInfo.EnumPlayerInfoAction.ADD_PLAYER, new EntityPlayer[] { entityplayer})); // CraftBukkit - replaced with loop below - WorldServer worldserver = this.server.getWorldServer(entityplayer.dimension); - -- worldserver.addEntity(entityplayer); -- this.a(entityplayer, (WorldServer) null); -+ // CraftBukkit start -+ PlayerJoinEvent playerJoinEvent = new PlayerJoinEvent(cserver.getPlayer(entityplayer), joinMessage); -+ cserver.getPluginManager().callEvent(playerJoinEvent); -+ -+ joinMessage = playerJoinEvent.getJoinMessage(); -+ -+ if (joinMessage != null && joinMessage.length() > 0) { -+ for (IChatBaseComponent line : org.bukkit.craftbukkit.util.CraftChatMessage.fromString(joinMessage)) { -+ server.getPlayerList().sendAll(new PacketPlayOutChat(line)); -+ } -+ } -+ -+ ChunkIOExecutor.adjustPoolSize(getPlayerCount()); -+ // CraftBukkit end -+ -+ // CraftBukkit start - sendAll above replaced with this loop -+ PacketPlayOutPlayerInfo packet = new PacketPlayOutPlayerInfo(PacketPlayOutPlayerInfo.EnumPlayerInfoAction.ADD_PLAYER, entityplayer); - - for (int i = 0; i < this.players.size(); ++i) { - EntityPlayer entityplayer1 = (EntityPlayer) this.players.get(i); - -+ if (entityplayer1.getBukkitEntity().canSee(entityplayer.getBukkitEntity())) { -+ entityplayer1.playerConnection.sendPacket(packet); -+ } -+ -+ if (!entityplayer.getBukkitEntity().canSee(entityplayer1.getBukkitEntity())) { -+ continue; -+ } -+ - entityplayer.playerConnection.sendPacket(new PacketPlayOutPlayerInfo(PacketPlayOutPlayerInfo.EnumPlayerInfoAction.ADD_PLAYER, new EntityPlayer[] { entityplayer1})); - } -+ // CraftBukkit end - -+ // CraftBukkit start - Only add if the player wasn't moved in the event -+ if (entityplayer.world == worldserver && !worldserver.players.contains(entityplayer)) { -+ worldserver.addEntity(entityplayer); -+ this.a(entityplayer, (WorldServer) null); -+ } -+ // CraftBukkit end - } - - public void d(EntityPlayer entityplayer) { - entityplayer.u().getPlayerChunkMap().movePlayer(entityplayer); - } - -- public void disconnect(EntityPlayer entityplayer) { -+ public String disconnect(EntityPlayer entityplayer) { // CraftBukkit - return string - entityplayer.b(StatisticList.f); -+ -+ // CraftBukkit start - Quitting must be before we do final save of data, in case plugins need to modify it -+ org.bukkit.craftbukkit.event.CraftEventFactory.handleInventoryCloseEvent(entityplayer); -+ -+ PlayerQuitEvent playerQuitEvent = new PlayerQuitEvent(cserver.getPlayer(entityplayer), "\u00A7e" + entityplayer.getName() + " left the game."); -+ cserver.getPluginManager().callEvent(playerQuitEvent); -+ entityplayer.getBukkitEntity().disconnect(playerQuitEvent.getQuitMessage()); -+ // CraftBukkit end -+ - this.savePlayerFile(entityplayer); - WorldServer worldserver = entityplayer.u(); - -- if (entityplayer.vehicle != null) { -+ if (entityplayer.vehicle != null && !(entityplayer.vehicle instanceof EntityPlayer)) { // CraftBukkit - Don't remove players - worldserver.removeEntity(entityplayer.vehicle); - PlayerList.f.debug("removing player mount"); - } -@@ -268,13 +352,61 @@ - this.o.remove(uuid); - } - -- this.sendAll(new PacketPlayOutPlayerInfo(PacketPlayOutPlayerInfo.EnumPlayerInfoAction.REMOVE_PLAYER, new EntityPlayer[] { entityplayer})); -+ // CraftBukkit start -+ // this.sendAll(new PacketPlayOutPlayerInfo(EnumPlayerInfoAction.REMOVE_PLAYER, new EntityPlayer[] { entityplayer})); -+ PacketPlayOutPlayerInfo packet = new PacketPlayOutPlayerInfo(PacketPlayOutPlayerInfo.EnumPlayerInfoAction.REMOVE_PLAYER, entityplayer); -+ for (int i = 0; i < players.size(); i++) { -+ EntityPlayer entityplayer2 = (EntityPlayer) this.players.get(i); -+ -+ if (entityplayer2.getBukkitEntity().canSee(entityplayer.getBukkitEntity())) { -+ entityplayer2.playerConnection.sendPacket(packet); -+ } else { -+ entityplayer2.getBukkitEntity().removeDisconnectingPlayer(entityplayer.getBukkitEntity()); -+ } -+ } -+ // This removes the scoreboard (and player reference) for the specific player in the manager -+ cserver.getScoreboardManager().removePlayer(entityplayer.getBukkitEntity()); -+ // CraftBukkit end -+ -+ ChunkIOExecutor.adjustPoolSize(this.getPlayerCount()); // CraftBukkit -+ -+ return playerQuitEvent.getQuitMessage(); // CraftBukkit - } - -- public String attemptLogin(SocketAddress socketaddress, GameProfile gameprofile) { -+ // CraftBukkit start - Whole method, SocketAddress to LoginListener, added hostname to signature, return EntityPlayer -+ public EntityPlayer attemptLogin(LoginListener loginlistener, GameProfile gameprofile, String hostname) { -+ // Moved from processLogin -+ UUID uuid = EntityHuman.a(gameprofile); -+ ArrayList arraylist = Lists.newArrayList(); -+ -+ EntityPlayer entityplayer; -+ -+ for (int i = 0; i < this.players.size(); ++i) { -+ entityplayer = (EntityPlayer) this.players.get(i); -+ if (entityplayer.getUniqueID().equals(uuid)) { -+ arraylist.add(entityplayer); -+ } -+ } -+ -+ Iterator iterator = arraylist.iterator(); -+ -+ while (iterator.hasNext()) { -+ entityplayer = (EntityPlayer) iterator.next(); -+ savePlayerFile(entityplayer); // CraftBukkit - Force the player's inventory to be saved -+ entityplayer.playerConnection.disconnect("You logged in from another location"); -+ } -+ -+ // Instead of kicking then returning, we need to store the kick reason -+ // in the event, check with plugins to see if it's ok, and THEN kick -+ // depending on the outcome. -+ SocketAddress socketaddress = loginlistener.networkManager.getSocketAddress(); -+ -+ EntityPlayer entity = new EntityPlayer(server, server.getWorldServer(0), gameprofile, new PlayerInteractManager(server.getWorldServer(0))); -+ Player player = entity.getBukkitEntity(); -+ PlayerLoginEvent event = new PlayerLoginEvent(player, hostname, ((java.net.InetSocketAddress) socketaddress).getAddress()); - String s; - -- if (this.k.isBanned(gameprofile)) { -+ if (getProfileBans().isBanned(gameprofile) && !getProfileBans().get(gameprofile).hasExpired()) { - GameProfileBanEntry gameprofilebanentry = (GameProfileBanEntry) this.k.get(gameprofile); - - s = "You are banned from this server!\nReason: " + gameprofilebanentry.getReason(); -@@ -282,10 +414,12 @@ - s = s + "\nYour ban will be removed on " + PlayerList.g.format(gameprofilebanentry.getExpires()); - } - -- return s; -+ // return s; -+ event.disallow(PlayerLoginEvent.Result.KICK_BANNED, s); - } else if (!this.isWhitelisted(gameprofile)) { -- return "You are not white-listed on this server!"; -- } else if (this.l.isBanned(socketaddress)) { -+ // return "You are not white-listed on this server!"; -+ event.disallow(PlayerLoginEvent.Result.KICK_WHITELIST, "You are not white-listed on this server!"); -+ } else if (getIPBans().isBanned(socketaddress) && !getIPBans().get(socketaddress).hasExpired()) { - IpBanEntry ipbanentry = this.l.get(socketaddress); - - s = "Your IP address is banned from this server!\nReason: " + ipbanentry.getReason(); -@@ -293,13 +427,25 @@ - s = s + "\nYour ban will be removed on " + PlayerList.g.format(ipbanentry.getExpires()); - } - -- return s; -+ // return s; -+ event.disallow(PlayerLoginEvent.Result.KICK_BANNED, s); - } 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; -+ 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; - } - -- public EntityPlayer processLogin(GameProfile gameprofile) { -+ public EntityPlayer processLogin(GameProfile gameprofile, EntityPlayer player) { // CraftBukkit - added EntityPlayer -+ /* CraftBukkit startMoved up - UUID uuid = EntityHuman.a(gameprofile); - ArrayList arraylist = Lists.newArrayList(); - -@@ -334,17 +480,25 @@ - } - - return new EntityPlayer(this.server, this.server.getWorldServer(0), gameprofile, (PlayerInteractManager) object); -+ */ -+ return player; -+ // CraftBukkit end - } - -+ // CraftBukkit start - public EntityPlayer moveToWorld(EntityPlayer entityplayer, int i, boolean flag) { -+ return this.moveToWorld(entityplayer, i, flag, null, true); -+ } -+ public EntityPlayer moveToWorld(EntityPlayer entityplayer, int i, boolean flag, Location location, boolean avoidSuffocation) { - entityplayer.u().getTracker().untrackPlayer(entityplayer); -- entityplayer.u().getTracker().untrackEntity(entityplayer); -+ // entityplayer.u().getTracker().untrackEntity(entityplayer); // CraftBukkit - entityplayer.u().getPlayerChunkMap().removePlayer(entityplayer); - this.players.remove(entityplayer); - this.server.getWorldServer(entityplayer.dimension).removeEntity(entityplayer); - BlockPosition blockposition = entityplayer.getBed(); - boolean flag1 = entityplayer.isRespawnForced(); - -+ /* CraftBukkit start - entityplayer.dimension = i; - Object object; - -@@ -355,80 +509,276 @@ - } - - EntityPlayer entityplayer1 = new EntityPlayer(this.server, this.server.getWorldServer(entityplayer.dimension), entityplayer.getProfile(), (PlayerInteractManager) object); -- -+ // */ -+ EntityPlayer entityplayer1 = entityplayer; -+ org.bukkit.World fromWorld = entityplayer.getBukkitEntity().getWorld(); -+ entityplayer.viewingCredits = false; -+ // CraftBukkit end -+ - entityplayer1.playerConnection = entityplayer.playerConnection; - entityplayer1.copyTo(entityplayer, flag); - entityplayer1.d(entityplayer.getId()); - entityplayer1.o(entityplayer); -- WorldServer worldserver = this.server.getWorldServer(entityplayer.dimension); -+ // WorldServer worldserver = this.server.getWorldServer(entityplayer.dimension); // CraftBukkit - handled later - -- this.a(entityplayer1, entityplayer, worldserver); -+ // this.a(entityplayer1, entityplayer, worldserver); // CraftBukkit - removed - BlockPosition blockposition1; - -- if (blockposition != null) { -- blockposition1 = EntityHuman.getBed(this.server.getWorldServer(entityplayer.dimension), blockposition, flag1); -- if (blockposition1 != null) { -- entityplayer1.setPositionRotation((double) ((float) blockposition1.getX() + 0.5F), (double) ((float) blockposition1.getY() + 0.1F), (double) ((float) blockposition1.getZ() + 0.5F), 0.0F, 0.0F); -- entityplayer1.setRespawnPosition(blockposition, flag1); -- } else { -- entityplayer1.playerConnection.sendPacket(new PacketPlayOutGameStateChange(0, 0.0F)); -+ // CraftBukkit start - fire PlayerRespawnEvent -+ if (location == null) { -+ boolean isBedSpawn = false; -+ CraftWorld cworld = (CraftWorld) this.server.server.getWorld(entityplayer.spawnWorld); -+ if (cworld != null && blockposition != null) { -+ blockposition1 = EntityHuman.getBed(cworld.getHandle(), blockposition, flag1); -+ if (blockposition1 != null) { -+ isBedSpawn = true; -+ location = new Location(cworld, blockposition1.getX() + 0.5, blockposition1.getY(), blockposition1.getZ() + 0.5); -+ } else { -+ entityplayer1.setRespawnPosition(null, true); -+ entityplayer1.playerConnection.sendPacket(new PacketPlayOutGameStateChange(0, 0.0F)); -+ } - } -+ -+ if (location == null) { -+ cworld = (CraftWorld) this.server.server.getWorlds().get(0); -+ blockposition = cworld.getHandle().getSpawn(); -+ location = new Location(cworld, blockposition.getX() + 0.5, blockposition.getY(), blockposition.getZ() + 0.5); -+ } -+ -+ Player respawnPlayer = cserver.getPlayer(entityplayer1); -+ PlayerRespawnEvent respawnEvent = new PlayerRespawnEvent(respawnPlayer, location, isBedSpawn); -+ cserver.getPluginManager().callEvent(respawnEvent); -+ -+ location = respawnEvent.getRespawnLocation(); -+ entityplayer.reset(); -+ } else { -+ location.setWorld(server.getWorldServer(i).getWorld()); - } -+ WorldServer worldserver = ((CraftWorld) location.getWorld()).getHandle(); -+ entityplayer1.setLocation(location.getX(), location.getY(), location.getZ(), location.getYaw(), location.getPitch()); -+ // CraftBukkit end - - worldserver.chunkProviderServer.getChunkAt((int) entityplayer1.locX >> 4, (int) entityplayer1.locZ >> 4); - -- while (!worldserver.getCubes(entityplayer1, entityplayer1.getBoundingBox()).isEmpty() && entityplayer1.locY < 256.0D) { -+ while (avoidSuffocation && !worldserver.getCubes(entityplayer1, entityplayer1.getBoundingBox()).isEmpty() && entityplayer1.locY < 256.0D) { - entityplayer1.setPosition(entityplayer1.locX, entityplayer1.locY + 1.0D, entityplayer1.locZ); - } -- -- entityplayer1.playerConnection.sendPacket(new PacketPlayOutRespawn(entityplayer1.dimension, entityplayer1.world.getDifficulty(), entityplayer1.world.getWorldData().getType(), entityplayer1.playerInteractManager.getGameMode())); -+ // CraftBukkit start -+ byte actualDimension = (byte) (worldserver.getWorld().getEnvironment().getId()); -+ // Force the client to refresh their chunk cache -+ if (fromWorld.getEnvironment() == worldserver.getWorld().getEnvironment()) { -+ entityplayer1.playerConnection.sendPacket(new PacketPlayOutRespawn((byte) (actualDimension >= 0 ? -1 : 0), worldserver.getDifficulty(), worldserver.getWorldData().getType(), entityplayer.playerInteractManager.getGameMode())); -+ } -+ entityplayer1.playerConnection.sendPacket(new PacketPlayOutRespawn(actualDimension, worldserver.getDifficulty(), worldserver.getWorldData().getType(), entityplayer1.playerInteractManager.getGameMode())); -+ entityplayer1.spawnIn(worldserver); -+ entityplayer1.dead = false; -+ entityplayer1.playerConnection.teleport(new Location(worldserver.getWorld(), entityplayer1.locX, entityplayer1.locY, entityplayer1.locZ, entityplayer1.yaw, entityplayer1.pitch)); -+ entityplayer1.setSneaking(false); - blockposition1 = worldserver.getSpawn(); -- entityplayer1.playerConnection.a(entityplayer1.locX, entityplayer1.locY, entityplayer1.locZ, entityplayer1.yaw, entityplayer1.pitch); -+ // entityplayer1.playerConnection.a(entityplayer1.locX, entityplayer1.locY, entityplayer1.locZ, entityplayer1.yaw, entityplayer1.pitch); - entityplayer1.playerConnection.sendPacket(new PacketPlayOutSpawnPosition(blockposition1)); - entityplayer1.playerConnection.sendPacket(new PacketPlayOutExperience(entityplayer1.exp, entityplayer1.expTotal, entityplayer1.expLevel)); - this.b(entityplayer1, worldserver); -- worldserver.getPlayerChunkMap().addPlayer(entityplayer1); -- worldserver.addEntity(entityplayer1); -- this.players.add(entityplayer1); -- this.j.put(entityplayer1.getUniqueID(), entityplayer1); -- entityplayer1.syncInventory(); -+ -+ if (!entityplayer.playerConnection.isDisconnected()) { -+ worldserver.getPlayerChunkMap().addPlayer(entityplayer1); -+ worldserver.addEntity(entityplayer1); -+ this.players.add(entityplayer1); -+ this.j.put(entityplayer1.getUniqueID(), entityplayer1); -+ } -+ // Added from changeDimension -+ updateClient(entityplayer); // Update health, etc... -+ entityplayer.updateAbilities(); -+ for (Object o1 : entityplayer.getEffects()) { -+ MobEffect mobEffect = (MobEffect) o1; -+ entityplayer.playerConnection.sendPacket(new PacketPlayOutEntityEffect(entityplayer.getId(), mobEffect)); -+ } -+ // entityplayer1.syncInventory(); -+ // CraftBukkit end - entityplayer1.setHealth(entityplayer1.getHealth()); -+ -+ // CraftBukkit start -+ // Don't fire on respawn -+ if (fromWorld != location.getWorld()) { -+ PlayerChangedWorldEvent event = new PlayerChangedWorldEvent(entityplayer.getBukkitEntity(), fromWorld); -+ server.server.getPluginManager().callEvent(event); -+ } -+ -+ // Save player file again if they were disconnected -+ if (entityplayer.playerConnection.isDisconnected()) { -+ this.savePlayerFile(entityplayer); -+ } -+ // CraftBukkit end - return entityplayer1; - } - -- public void changeDimension(EntityPlayer entityplayer, int i) { -- int j = entityplayer.dimension; -- WorldServer worldserver = this.server.getWorldServer(entityplayer.dimension); -+ // CraftBukkit start - Replaced the standard handling of portals with a more customised method. -+ public void changeDimension(EntityPlayer entityplayer, int i, TeleportCause cause) { -+ WorldServer exitWorld = null; -+ if (entityplayer.dimension < CraftWorld.CUSTOM_DIMENSION_OFFSET) { // plugins must specify exit from custom Bukkit worlds -+ // only target existing worlds (compensate for allow-nether/allow-end as false) -+ for (WorldServer world : this.server.worlds) { -+ if (world.dimension == i) { -+ exitWorld = world; -+ } -+ } -+ } - -- entityplayer.dimension = i; -- WorldServer worldserver1 = this.server.getWorldServer(entityplayer.dimension); -+ Location enter = entityplayer.getBukkitEntity().getLocation(); -+ Location exit = null; -+ boolean useTravelAgent = false; // don't use agent for custom worlds or return from THE_END -+ if (exitWorld != null) { -+ if ((cause == TeleportCause.END_PORTAL) && (i == 0)) { -+ // THE_END -> NORMAL; use bed if available, otherwise default spawn -+ exit = ((org.bukkit.craftbukkit.entity.CraftPlayer) entityplayer.getBukkitEntity()).getBedSpawnLocation(); -+ if (exit == null || ((CraftWorld) exit.getWorld()).getHandle().dimension != 0) { -+ exit = exitWorld.getWorld().getSpawnLocation(); -+ } -+ } else { -+ // NORMAL <-> NETHER or NORMAL -> THE_END -+ exit = this.calculateTarget(enter, exitWorld); -+ useTravelAgent = true; -+ } -+ } - -- entityplayer.playerConnection.sendPacket(new PacketPlayOutRespawn(entityplayer.dimension, entityplayer.world.getDifficulty(), entityplayer.world.getWorldData().getType(), entityplayer.playerInteractManager.getGameMode())); -- worldserver.removeEntity(entityplayer); -- entityplayer.dead = false; -- this.changeWorld(entityplayer, j, worldserver, worldserver1); -- this.a(entityplayer, worldserver); -- entityplayer.playerConnection.a(entityplayer.locX, entityplayer.locY, entityplayer.locZ, entityplayer.yaw, entityplayer.pitch); -- entityplayer.playerInteractManager.a(worldserver1); -- this.b(entityplayer, worldserver1); -- this.updateClient(entityplayer); -- Iterator iterator = entityplayer.getEffects().iterator(); -+ TravelAgent agent = exit != null ? (TravelAgent) ((CraftWorld) exit.getWorld()).getHandle().getTravelAgent() : org.bukkit.craftbukkit.CraftTravelAgent.DEFAULT; // return arbitrary TA to compensate for implementation dependent plugins -+ PlayerPortalEvent event = new PlayerPortalEvent(entityplayer.getBukkitEntity(), enter, exit, agent, cause); -+ event.useTravelAgent(useTravelAgent); -+ Bukkit.getServer().getPluginManager().callEvent(event); -+ if (event.isCancelled() || event.getTo() == null) { -+ return; -+ } - -- while (iterator.hasNext()) { -- MobEffect mobeffect = (MobEffect) iterator.next(); -+ exit = event.useTravelAgent() ? event.getPortalTravelAgent().findOrCreate(event.getTo()) : event.getTo(); -+ if (exit == null) { -+ return; -+ } -+ exitWorld = ((CraftWorld) exit.getWorld()).getHandle(); - -- entityplayer.playerConnection.sendPacket(new PacketPlayOutEntityEffect(entityplayer.getId(), mobeffect)); -+ org.bukkit.event.player.PlayerTeleportEvent tpEvent = new org.bukkit.event.player.PlayerTeleportEvent(entityplayer.getBukkitEntity(), enter, exit, cause); -+ Bukkit.getServer().getPluginManager().callEvent(tpEvent); -+ if (tpEvent.isCancelled() || tpEvent.getTo() == null) { -+ return; - } - -+ Vector velocity = entityplayer.getBukkitEntity().getVelocity(); -+ boolean before = exitWorld.chunkProviderServer.forceChunkLoad; -+ exitWorld.chunkProviderServer.forceChunkLoad = true; -+ exitWorld.getTravelAgent().adjustExit(entityplayer, exit, velocity); -+ exitWorld.chunkProviderServer.forceChunkLoad = before; -+ -+ this.moveToWorld(entityplayer, exitWorld.dimension, true, exit, false); // Vanilla doesn't check for suffocation when handling portals, so neither should we -+ if (entityplayer.motX != velocity.getX() || entityplayer.motY != velocity.getY() || entityplayer.motZ != velocity.getZ()) { -+ entityplayer.getBukkitEntity().setVelocity(velocity); -+ } - } - - public void changeWorld(Entity entity, int i, WorldServer worldserver, WorldServer worldserver1) { -+ // CraftBukkit start - Split into modular functions -+ Location exit = calculateTarget(entity.getBukkitEntity().getLocation(), worldserver1); -+ repositionEntity(entity, exit, true); -+ } -+ -+ // Copy of original changeWorld(Entity, int, WorldServer, WorldServer) method with only location calculation logic -+ public Location calculateTarget(Location enter, World target) { -+ WorldServer worldserver = ((CraftWorld) enter.getWorld()).getHandle(); -+ WorldServer worldserver1 = ((CraftWorld) target.getWorld()).getHandle(); -+ int i = worldserver.dimension; -+ -+ double y = enter.getY(); -+ float yaw = enter.getYaw(); -+ float pitch = enter.getPitch(); -+ double d0 = enter.getX(); -+ double d1 = enter.getZ(); -+ double d2 = 8.0D; -+ /* - double d0 = entity.locX; - double d1 = entity.locZ; - double d2 = 8.0D; - float f = entity.yaw; - - worldserver.methodProfiler.a("moving"); -+ */ -+ if (worldserver1.dimension == -1) { -+ d0 = MathHelper.a(d0 / d2, worldserver1.getWorldBorder().b()+ 16.0D, worldserver1.getWorldBorder().d() - 16.0D); -+ d1 = MathHelper.a(d1 / d2, worldserver1.getWorldBorder().c() + 16.0D, worldserver1.getWorldBorder().e() - 16.0D); -+ /* -+ entity.setPositionRotation(d0, entity.locY, d1, entity.yaw, entity.pitch); -+ if (entity.isAlive()) { -+ worldserver.entityJoinedWorld(entity, false); -+ } -+ */ -+ } else if (worldserver1.dimension == 0) { -+ d0 = MathHelper.a(d0 * d2, worldserver1.getWorldBorder().b() + 16.0D, worldserver1.getWorldBorder().d() - 16.0D); -+ d1 = MathHelper.a(d1 * d2, worldserver1.getWorldBorder().c() + 16.0D, worldserver1.getWorldBorder().e() - 16.0D); -+ /* -+ entity.setPositionRotation(d0, entity.locY, d1, entity.yaw, entity.pitch); -+ if (entity.isAlive()) { -+ worldserver.entityJoinedWorld(entity, false); -+ } -+ */ -+ } else { -+ BlockPosition blockposition; -+ -+ if (i == 1) { -+ // use default NORMAL world spawn instead of target -+ worldserver1 = this.server.worlds.get(0); -+ blockposition = worldserver1.getSpawn(); -+ } else { -+ blockposition = worldserver1.getDimensionSpawn(); -+ } -+ -+ d0 = (double) blockposition.getX(); -+ y = (double) blockposition.getY(); -+ d1 = (double) blockposition.getZ(); -+ /* -+ entity.setPositionRotation(d0, entity.locY, d1, 90.0F, 0.0F); -+ if (entity.isAlive()) { -+ worldserver.entityJoinedWorld(entity, false); -+ } -+ */ -+ } -+ -+ // worldserver.methodProfiler.b(); -+ if (i != 1) { -+ worldserver.methodProfiler.a("placing"); -+ d0 = (double) MathHelper.clamp((int) d0, -29999872, 29999872); -+ d1 = (double) MathHelper.clamp((int) d1, -29999872, 29999872); -+ /* -+ if (entity.isAlive()) { -+ entity.setPositionRotation(d0, entity.locY, d1, entity.yaw, entity.pitch); -+ worldserver1.getTravelAgent().a(entity, f); -+ worldserver1.addEntity(entity); -+ worldserver1.entityJoinedWorld(entity, false); -+ } -+ -+ worldserver.methodProfiler.b(); -+ */ -+ } -+ -+ // entity.spawnIn(worldserver1); -+ return new Location(worldserver1.getWorld(), d0, y, d1, yaw, pitch); -+ } -+ -+ // copy of original a(Entity, int, WorldServer, WorldServer) method with only entity repositioning logic -+ public void repositionEntity(Entity entity, Location exit, boolean portal) { -+ WorldServer worldserver = (WorldServer) entity.world; -+ WorldServer worldserver1 = ((CraftWorld) exit.getWorld()).getHandle(); -+ int i = worldserver.dimension; -+ -+ /* -+ double d0 = entity.locX; -+ double d1 = entity.locZ; -+ double d2 = 8.0D; -+ float f = entity.yaw; -+ -+ worldserver.methodProfiler.a("moving"); -+ */ -+ entity.setPositionRotation(exit.getX(), exit.getY(), exit.getZ(), exit.getYaw(), exit.getPitch()); -+ if (entity.isAlive()) { -+ worldserver.entityJoinedWorld(entity, false); -+ } -+ /* - if (entity.dimension == -1) { - d0 = MathHelper.a(d0 / d2, worldserver1.getWorldBorder().b() + 16.0D, worldserver1.getWorldBorder().d() - 16.0D); - d1 = MathHelper.a(d1 / d2, worldserver1.getWorldBorder().c() + 16.0D, worldserver1.getWorldBorder().e() - 16.0D); -@@ -447,6 +797,8 @@ - BlockPosition blockposition; - - if (i == 1) { -+ // use default NORMAL world spawn instead of target -+ worldserver1 = this.server.worlds.get(0); - blockposition = worldserver1.getSpawn(); - } else { - blockposition = worldserver1.getDimensionSpawn(); -@@ -460,15 +812,26 @@ - worldserver.entityJoinedWorld(entity, false); - } - } -+ */ - - worldserver.methodProfiler.b(); - if (i != 1) { - worldserver.methodProfiler.a("placing"); -+ /* - d0 = (double) MathHelper.clamp((int) d0, -29999872, 29999872); - d1 = (double) MathHelper.clamp((int) d1, -29999872, 29999872); -+ */ - if (entity.isAlive()) { -- entity.setPositionRotation(d0, entity.locY, d1, entity.yaw, entity.pitch); -- worldserver1.getTravelAgent().a(entity, f); -+ // entity.setPositionRotation(d0, entity.locY, d1, entity.yaw, entity.pitch); -+ // worldserver1.getTravelAgent().a(entity, f); -+ if (portal) { -+ Vector velocity = entity.getBukkitEntity().getVelocity(); -+ worldserver1.getTravelAgent().adjustExit(entity, exit, velocity); -+ entity.setPositionRotation(exit.getX(), exit.getY(), exit.getZ(), exit.getYaw(), exit.getPitch()); -+ if (entity.motX != velocity.getX() || entity.motY != velocity.getY() || entity.motZ != velocity.getZ()) { -+ entity.getBukkitEntity().setVelocity(velocity); -+ } -+ } - worldserver1.addEntity(entity); - worldserver1.entityJoinedWorld(entity, false); - } -@@ -477,6 +840,7 @@ - } - - entity.spawnIn(worldserver1); -+ // CraftBukkit end - } - - public void tick() { -@@ -494,6 +858,25 @@ - - } - -+ // CraftBukkit start - add a world/entity limited version -+ public void sendAll(Packet packet, EntityHuman entityhuman) { -+ for (int i = 0; i < this.players.size(); ++i) { -+ EntityPlayer entityplayer = this.players.get(i); -+ if (entityhuman != null && entityhuman instanceof EntityPlayer && !entityplayer.getBukkitEntity().canSee(((EntityPlayer) entityhuman).getBukkitEntity())) { -+ continue; -+ } -+ ((EntityPlayer) this.players.get(i)).playerConnection.sendPacket(packet); -+ } -+ } -+ -+ public void sendAll(Packet packet, World world) { -+ for (int i = 0; i < world.players.size(); ++i) { -+ ((EntityPlayer) world.players.get(i)).playerConnection.sendPacket(packet); -+ } -+ -+ } -+ // CraftBukkit end -+ - public void a(Packet packet, int i) { - for (int j = 0; j < this.players.size(); ++j) { - EntityPlayer entityplayer = (EntityPlayer) this.players.get(j); -@@ -589,10 +972,24 @@ - - public void addOp(GameProfile gameprofile) { - this.operators.add(new OpListEntry(gameprofile, this.server.p(), this.operators.b(gameprofile))); -+ -+ // CraftBukkit start -+ Player player = server.server.getPlayer(gameprofile.getId()); -+ if (player != null) { -+ player.recalculatePermissions(); -+ } -+ // CraftBukkit end - } - - public void removeOp(GameProfile gameprofile) { - this.operators.remove(gameprofile); -+ -+ // CraftBukkit start -+ Player player = server.server.getPlayer(gameprofile.getId()); -+ if (player != null) { -+ player.recalculatePermissions(); -+ } -+ // CraftBukkit end - } - - public boolean isWhitelisted(GameProfile gameprofile) { -@@ -600,7 +997,7 @@ - } - - public boolean isOp(GameProfile gameprofile) { -- return this.operators.d(gameprofile) || this.server.T() && this.server.worldServer[0].getWorldData().v() && this.server.S().equalsIgnoreCase(gameprofile.getName()) || this.t; -+ return this.operators.d(gameprofile) || this.server.T() && this.server.worlds.get(0).getWorldData().v() && this.server.S().equalsIgnoreCase(gameprofile.getName()) || this.t; // CraftBukkit - } - - public EntityPlayer getPlayer(String s) { -@@ -627,6 +1024,12 @@ - for (int j = 0; j < this.players.size(); ++j) { - EntityPlayer entityplayer = (EntityPlayer) this.players.get(j); - -+ // CraftBukkit start - Test if player receiving packet can see the source of the packet -+ if (entityhuman != null && entityhuman instanceof EntityPlayer && !entityplayer.getBukkitEntity().canSee(((EntityPlayer) entityhuman).getBukkitEntity())) { -+ continue; -+ } -+ // CraftBukkit end -+ - if (entityplayer != entityhuman && entityplayer.dimension == i) { - double d4 = d0 - entityplayer.locX; - double d5 = d1 - entityplayer.locY; -@@ -674,21 +1077,26 @@ - public void reloadWhitelist() {} - - public void b(EntityPlayer entityplayer, WorldServer worldserver) { -- WorldBorder worldborder = this.server.worldServer[0].getWorldBorder(); -+ WorldBorder worldborder = entityplayer.world.getWorldBorder(); // CraftBukkit - - entityplayer.playerConnection.sendPacket(new PacketPlayOutWorldBorder(worldborder, PacketPlayOutWorldBorder.EnumWorldBorderAction.INITIALIZE)); - entityplayer.playerConnection.sendPacket(new PacketPlayOutUpdateTime(worldserver.getTime(), worldserver.getDayTime(), worldserver.getGameRules().getBoolean("doDaylightCycle"))); - if (worldserver.S()) { -- entityplayer.playerConnection.sendPacket(new PacketPlayOutGameStateChange(1, 0.0F)); -- entityplayer.playerConnection.sendPacket(new PacketPlayOutGameStateChange(7, worldserver.j(1.0F))); -- entityplayer.playerConnection.sendPacket(new PacketPlayOutGameStateChange(8, worldserver.h(1.0F))); -+ // CraftBukkit start - handle player weather -+ // entityplayer.playerConnection.sendPacket(new PacketPlayOutGameStateChange(1, 0.0F)); -+ // entityplayer.playerConnection.sendPacket(new PacketPlayOutGameStateChange(7, worldserver.j(1.0F))); -+ // entityplayer.playerConnection.sendPacket(new PacketPlayOutGameStateChange(8, worldserver.h(1.0F))); -+ entityplayer.setPlayerWeather(org.bukkit.WeatherType.DOWNFALL, false); -+ entityplayer.updateWeather(-worldserver.p, worldserver.p, -worldserver.r, worldserver.r); -+ // CraftBukkit end - } - - } - - public void updateClient(EntityPlayer entityplayer) { - entityplayer.updateInventory(entityplayer.defaultContainer); -- entityplayer.triggerHealthUpdate(); -+ // entityplayer.triggerHealthUpdate(); -+ entityplayer.getBukkitEntity().updateScaledHealth(); // CraftBukkit - Update scaled health on respawn and worldchange - entityplayer.playerConnection.sendPacket(new PacketPlayOutHeldItemSlot(entityplayer.inventory.itemInHandIndex)); - } - -@@ -701,7 +1109,7 @@ - } - - public String[] getSeenPlayers() { -- return this.server.worldServer[0].getDataManager().getPlayerFileData().getSeenPlayers(); -+ return this.server.worlds.get(0).getDataManager().getPlayerFileData().getSeenPlayers(); // CraftBukkit - } - - public boolean getHasWhitelist() { -@@ -751,16 +1159,26 @@ - - public void u() { - for (int i = 0; i < this.players.size(); ++i) { -- ((EntityPlayer) this.players.get(i)).playerConnection.disconnect("Server closed"); -+ ((EntityPlayer) this.players.get(i)).playerConnection.disconnect(this.server.server.getShutdownMessage()); // CraftBukkit - add custom shutdown message - } - - } - -+ // CraftBukkit start -+ public void sendMessage(IChatBaseComponent[] iChatBaseComponents) { -+ for (IChatBaseComponent component : iChatBaseComponents) { -+ sendMessage(component, true); -+ } -+ } -+ // CraftBukkit end -+ - public void sendMessage(IChatBaseComponent ichatbasecomponent, boolean flag) { - this.server.sendMessage(ichatbasecomponent); - int i = flag ? 1 : 0; - -- this.sendAll(new PacketPlayOutChat(ichatbasecomponent, (byte) i)); -+ // CraftBukkit start - we run this through our processor first so we can get web links etc -+ this.sendAll(new PacketPlayOutChat(CraftChatMessage.fixComponent(ichatbasecomponent), (byte) i)); -+ // CraftBukkit end - } - - public void sendMessage(IChatBaseComponent ichatbasecomponent) { -@@ -797,8 +1215,10 @@ - WorldServer[] aworldserver = this.server.worldServer; - int j = aworldserver.length; - -- for (int k = 0; k < j; ++k) { -- WorldServer worldserver = aworldserver[k]; -+ // CraftBukkit start -+ for (int k = 0; k < server.worlds.size(); ++k) { -+ WorldServer worldserver = server.worlds.get(0); -+ // CraftBukkit end - - if (worldserver != null) { - worldserver.getPlayerChunkMap().a(i); diff --git a/TacoSpigot-Server/nms-patches/PortalTravelAgent.patch b/TacoSpigot-Server/nms-patches/PortalTravelAgent.patch deleted file mode 100644 index 73698d3..0000000 --- a/TacoSpigot-Server/nms-patches/PortalTravelAgent.patch +++ /dev/null @@ -1,262 +0,0 @@ ---- a/net/minecraft/server/PortalTravelAgent.java -+++ b/net/minecraft/server/PortalTravelAgent.java -@@ -5,6 +5,12 @@ - import java.util.List; - import java.util.Random; - -+// CraftBukkit start -+import org.bukkit.Location; -+import org.bukkit.event.entity.EntityPortalExitEvent; -+import org.bukkit.util.Vector; -+// CraftBukkit end -+ - public class PortalTravelAgent { - - private final WorldServer a; -@@ -27,6 +33,19 @@ - int i = MathHelper.floor(entity.locX); - int j = MathHelper.floor(entity.locY) - 1; - int k = MathHelper.floor(entity.locZ); -+ // CraftBukkit start - Modularize end portal creation -+ BlockPosition created = this.createEndPortal(entity.locX, entity.locY, entity.locZ); -+ entity.setPositionRotation((double) created.getX(), (double) created.getY(), (double) created.getZ(), entity.yaw, 0.0F); -+ entity.motX = entity.motY = entity.motZ = 0.0D; -+ } -+ } -+ -+ // Split out from original a(Entity, double, double, double, float) method in order to enable being called from createPortal -+ private BlockPosition createEndPortal(double x, double y, double z) { -+ int i = MathHelper.floor(x); -+ int j = MathHelper.floor(y) - 1; -+ int k = MathHelper.floor(z); -+ // CraftBukkit end - byte b0 = 1; - byte b1 = 0; - -@@ -43,16 +62,63 @@ - } - } - -- entity.setPositionRotation((double) i, (double) j, (double) k, entity.yaw, 0.0F); -- entity.motX = entity.motY = entity.motZ = 0.0D; -+ // CraftBukkit start -+ return new BlockPosition(i, k, k); -+ } -+ -+ // use logic based on creation to verify end portal -+ private BlockPosition findEndPortal(BlockPosition portal) { -+ int i = portal.getX(); -+ int j = portal.getY() - 1; -+ int k = portal.getZ(); -+ byte b0 = 1; -+ byte b1 = 0; -+ -+ for (int l = -2; l <= 2; ++l) { -+ for (int i1 = -2; i1 <= 2; ++i1) { -+ for (int j1 = -1; j1 < 3; ++j1) { -+ int k1 = i + i1 * b0 + l * b1; -+ int l1 = j + j1; -+ int i2 = k + i1 * b1 - l * b0; -+ boolean flag = j1 < 0; -+ -+ if (this.a.getType(new BlockPosition(k1, l1, i2)).getBlock() != (flag ? Blocks.OBSIDIAN : Blocks.AIR)) { -+ return null; -+ } -+ } -+ } - } -+ return new BlockPosition(i, j, k); - } -+ // CraftBukkit end - - public boolean b(Entity entity, float f) { -- boolean flag = true; -+ // CraftBukkit start - Modularize portal search process and entity teleportation -+ BlockPosition found = this.findPortal(entity.locX, entity.locY, entity.locZ, 128); -+ if (found == null) { -+ return false; -+ } -+ -+ Location exit = new Location(this.a.getWorld(), found.getX(), found.getY(), found.getZ(), f, entity.pitch); -+ Vector velocity = entity.getBukkitEntity().getVelocity(); -+ this.adjustExit(entity, exit, velocity); -+ entity.setPositionRotation(exit.getX(), exit.getY(), exit.getZ(), exit.getYaw(), exit.getPitch()); -+ if (entity.motX != velocity.getX() || entity.motY != velocity.getY() || entity.motZ != velocity.getZ()) { -+ entity.getBukkitEntity().setVelocity(velocity); -+ } -+ return true; -+ } -+ -+ public BlockPosition findPortal(double x, double y, double z, int short1) { -+ if (this.a.getWorld().getEnvironment() == org.bukkit.World.Environment.THE_END) { -+ return this.findEndPortal(this.a.worldProvider.h()); -+ } -+ // CraftBukkit end - double d0 = -1.0D; -- int i = MathHelper.floor(entity.locX); -- int j = MathHelper.floor(entity.locZ); -+ // CraftBukkit start -+ int i = MathHelper.floor(x); -+ int j = MathHelper.floor(z); -+ // CraftBukkit end - boolean flag1 = true; - Object object = BlockPosition.ZERO; - long k = ChunkCoordIntPair.a(i, j); -@@ -65,7 +131,7 @@ - portaltravelagent_chunkcoordinatesportal.c = this.a.getTime(); - flag1 = false; - } else { -- BlockPosition blockposition = new BlockPosition(entity); -+ BlockPosition blockposition = new BlockPosition(x, y, z); - - for (int l = -128; l <= 128; ++l) { - BlockPosition blockposition1; -@@ -95,6 +161,29 @@ - this.c.put(k, new PortalTravelAgent.ChunkCoordinatesPortal((BlockPosition) object, this.a.getTime())); - this.d.add(Long.valueOf(k)); - } -+ // CraftBukkit start - Move entity teleportation logic into exit -+ return (BlockPosition) object; -+ } else { -+ return null; -+ } -+ } -+ -+ // Entity repositioning logic split out from original b method and combined with repositioning logic for The End from original a method -+ public void adjustExit(Entity entity, Location position, Vector velocity) { -+ Location from = position.clone(); -+ Vector before = velocity.clone(); -+ BlockPosition object = new BlockPosition(position.getBlockX(), position.getBlockY(), position.getBlockZ()); -+ float f = position.getYaw(); -+ -+ if (this.a.getWorld().getEnvironment() == org.bukkit.World.Environment.THE_END || entity.getBukkitEntity().getWorld().getEnvironment() == org.bukkit.World.Environment.THE_END || entity.aG() == null) { -+ // entity.setPositionRotation((double) i, (double) j, (double) k, entity.yaw, 0.0F); -+ // entity.motX = entity.motY = entity.motZ = 0.0D; -+ position.setPitch(0.0F); -+ velocity.setX(0); -+ velocity.setY(0); -+ velocity.setZ(0); -+ } else { -+ // CraftBukkit end - - double d2 = (double) ((BlockPosition) object).getX() + 0.5D; - double d3 = (double) ((BlockPosition) object).getY() + 0.5D; -@@ -132,26 +221,60 @@ - f3 = -1.0F; - f4 = 1.0F; - } -- -- double d6 = entity.motX; -- double d7 = entity.motZ; -- -- entity.motX = d6 * (double) f1 + d7 * (double) f4; -- entity.motZ = d6 * (double) f3 + d7 * (double) f2; -- entity.yaw = f - (float) (entity.aH().opposite().b() * 90) + (float) (shapedetector_shapedetectorcollection.b().b() * 90); -- entity.setPositionRotation(d2, d3, d4, entity.yaw, entity.pitch); -- return true; -+ -+ // CraftBukkit start -+ double d6 = velocity.getX(); -+ double d7 = velocity.getZ(); -+ // CraftBukkit end -+ -+ // CraftBukkit start - Adjust position and velocity instances instead of entity -+ velocity.setX(d6 * (double) f1 + d7 * (double) f4); -+ velocity.setZ(d6 * (double) f3 + d7 * (double) f2); -+ f = f - (float) (entity.aH().opposite().b() * 90) + (float) (shapedetector_shapedetectorcollection.b().b() * 90); -+ // entity.setPositionRotation(d2, d3, d4, entity.yaw, entity.pitch); -+ position.setX(d2); -+ position.setY(d3); -+ position.setZ(d4); -+ position.setYaw(f); -+ } -+ EntityPortalExitEvent event = new EntityPortalExitEvent(entity.getBukkitEntity(), from, position, before, velocity); -+ this.a.getServer().getPluginManager().callEvent(event); -+ Location to = event.getTo(); -+ if (event.isCancelled() || to == null || !entity.isAlive()) { -+ position.setX(from.getX()); -+ position.setY(from.getY()); -+ position.setZ(from.getZ()); -+ position.setYaw(from.getYaw()); -+ position.setPitch(from.getPitch()); -+ velocity.copy(before); - } else { -- return false; -+ position.setX(to.getX()); -+ position.setY(to.getY()); -+ position.setZ(to.getZ()); -+ position.setYaw(to.getYaw()); -+ position.setPitch(to.getPitch()); -+ velocity.copy(event.getAfter()); // event.getAfter() will never be null, as setAfter() will cause an NPE if null is passed in - } -+ // CraftBukkit end - } - - public boolean a(Entity entity) { -- byte b0 = 16; -+ // CraftBukkit start - Allow for portal creation to be based on coordinates instead of entity -+ return this.createPortal(entity.locX, entity.locY, entity.locZ, 16); -+ } -+ -+ public boolean createPortal(double x, double y, double z, int b0) { -+ if (this.a.getWorld().getEnvironment() == org.bukkit.World.Environment.THE_END) { -+ createEndPortal(x, y, z); -+ return true; -+ } -+ // CraftBukkit end - double d0 = -1.0D; -- int i = MathHelper.floor(entity.locX); -- int j = MathHelper.floor(entity.locY); -- int k = MathHelper.floor(entity.locZ); -+ // CraftBukkit start -+ int i = MathHelper.floor(x); -+ int j = MathHelper.floor(y); -+ int k = MathHelper.floor(z); -+ // CraftBukkit end - int l = i; - int i1 = j; - int j1 = k; -@@ -176,10 +299,10 @@ - double d4; - - for (i2 = i - b0; i2 <= i + b0; ++i2) { -- d1 = (double) i2 + 0.5D - entity.locX; -+ d1 = (double) i2 + 0.5D - x; // CraftBukkit - - for (j2 = k - b0; j2 <= k + b0; ++j2) { -- d2 = (double) j2 + 0.5D - entity.locZ; -+ d2 = (double) j2 + 0.5D - z; // CraftBukkit - - label271: - for (k2 = this.a.V() - 1; k2 >= 0; --k2) { -@@ -211,7 +334,7 @@ - } - } - -- d3 = (double) k2 + 0.5D - entity.locY; -+ d3 = (double) k2 + 0.5D - y; // CraftBukkit - d4 = d1 * d1 + d3 * d3 + d2 * d2; - if (d0 < 0.0D || d4 < d0) { - d0 = d4; -@@ -228,10 +351,10 @@ - - if (d0 < 0.0D) { - for (i2 = i - b0; i2 <= i + b0; ++i2) { -- d1 = (double) i2 + 0.5D - entity.locX; -+ d1 = (double) i2 + 0.5D - x; // CraftBukkit - - for (j2 = k - b0; j2 <= k + b0; ++j2) { -- d2 = (double) j2 + 0.5D - entity.locZ; -+ d2 = (double) j2 + 0.5D - z; // CraftBukkit - - label219: - for (k2 = this.a.V() - 1; k2 >= 0; --k2) { -@@ -256,7 +379,7 @@ - } - } - -- d3 = (double) k2 + 0.5D - entity.locY; -+ d3 = (double) k2 + 0.5D - y; // CraftBukkit - d4 = d1 * d1 + d3 * d3 + d2 * d2; - if (d0 < 0.0D || d4 < d0) { - d0 = d4; diff --git a/TacoSpigot-Server/nms-patches/PropertyManager.patch b/TacoSpigot-Server/nms-patches/PropertyManager.patch deleted file mode 100644 index c312cda..0000000 --- a/TacoSpigot-Server/nms-patches/PropertyManager.patch +++ /dev/null @@ -1,93 +0,0 @@ ---- a/net/minecraft/server/PropertyManager.java -+++ b/net/minecraft/server/PropertyManager.java -@@ -8,6 +8,8 @@ - import org.apache.logging.log4j.LogManager; - import org.apache.logging.log4j.Logger; - -+import joptsimple.OptionSet; // CraftBukkit -+ - public class PropertyManager { - - private static final Logger a = LogManager.getLogger(); -@@ -42,6 +44,24 @@ - - } - -+ // CraftBukkit start -+ private OptionSet options = null; -+ -+ public PropertyManager(final OptionSet options) { -+ this((File) options.valueOf("config")); -+ -+ this.options = options; -+ } -+ -+ private T getOverride(String name, T value) { -+ if ((this.options != null) && (this.options.has(name))) { -+ return (T) this.options.valueOf(name); -+ } -+ -+ return value; -+ } -+ // CraftBukkit end -+ - public void a() { - PropertyManager.a.info("Generating new properties file"); - this.savePropertiesFile(); -@@ -51,6 +71,12 @@ - FileOutputStream fileoutputstream = null; - - try { -+ // CraftBukkit start - Don't attempt writing to file if it's read only -+ if (this.file.exists() && !this.file.canWrite()) { -+ return; -+ } -+ // CraftBukkit end -+ - fileoutputstream = new FileOutputStream(this.file); - this.properties.store(fileoutputstream, "Minecraft server properties"); - } catch (Exception exception) { -@@ -80,36 +106,36 @@ - this.savePropertiesFile(); - } - -- return this.properties.getProperty(s, s1); -+ return getOverride(s, this.properties.getProperty(s, s1)); // CraftBukkit - } - - public int getInt(String s, int i) { - try { -- return Integer.parseInt(this.getString(s, "" + i)); -+ return getOverride(s, Integer.parseInt(this.getString(s, "" + i))); // CraftBukkit - } catch (Exception exception) { - this.properties.setProperty(s, "" + i); - this.savePropertiesFile(); -- return i; -+ return getOverride(s, i); // CraftBukkit - } - } - - public long getLong(String s, long i) { - try { -- return Long.parseLong(this.getString(s, "" + i)); -+ return getOverride(s, Long.parseLong(this.getString(s, "" + i))); // CraftBukkit - } catch (Exception exception) { - this.properties.setProperty(s, "" + i); - this.savePropertiesFile(); -- return i; -+ return getOverride(s, i); // CraftBukkit - } - } - - public boolean getBoolean(String s, boolean flag) { - try { -- return Boolean.parseBoolean(this.getString(s, "" + flag)); -+ return getOverride(s, Boolean.parseBoolean(this.getString(s, "" + flag))); //CraftBukkit - } catch (Exception exception) { - this.properties.setProperty(s, "" + flag); - this.savePropertiesFile(); -- return flag; -+ return getOverride(s, flag); // CraftBukkit - } - } - diff --git a/TacoSpigot-Server/nms-patches/RecipeArmorDye.patch b/TacoSpigot-Server/nms-patches/RecipeArmorDye.patch deleted file mode 100644 index 2bf96ca..0000000 --- a/TacoSpigot-Server/nms-patches/RecipeArmorDye.patch +++ /dev/null @@ -1,18 +0,0 @@ ---- a/net/minecraft/server/RecipeArmorDye.java -+++ b/net/minecraft/server/RecipeArmorDye.java -@@ -3,9 +3,13 @@ - import com.google.common.collect.Lists; - import java.util.ArrayList; - --public class RecipeArmorDye implements IRecipe { -+public class RecipeArmorDye extends ShapelessRecipes implements IRecipe { // CraftBukkit - added extends - -- public RecipeArmorDye() {} -+ // CraftBukkit start - Delegate to new parent class with bogus info -+ public RecipeArmorDye() { -+ super(new ItemStack(Items.LEATHER_HELMET, 0, 0), java.util.Arrays.asList(new ItemStack(Items.DYE, 0, 5))); -+ } -+ // CraftBukkit end - - public boolean a(InventoryCrafting inventorycrafting, World world) { - ItemStack itemstack = null; diff --git a/TacoSpigot-Server/nms-patches/RecipeBookClone.patch b/TacoSpigot-Server/nms-patches/RecipeBookClone.patch deleted file mode 100644 index d815fcd..0000000 --- a/TacoSpigot-Server/nms-patches/RecipeBookClone.patch +++ /dev/null @@ -1,17 +0,0 @@ ---- a/net/minecraft/server/RecipeBookClone.java -+++ b/net/minecraft/server/RecipeBookClone.java -@@ -1,8 +1,12 @@ - package net.minecraft.server; - --public class RecipeBookClone implements IRecipe { -+public class RecipeBookClone extends ShapelessRecipes implements IRecipe { // CraftBukkit - added extends - -- public RecipeBookClone() {} -+ // CraftBukkit start - Delegate to new parent class -+ public RecipeBookClone() { -+ super(new ItemStack(Items.WRITTEN_BOOK, 0, -1), java.util.Arrays.asList(new ItemStack(Items.WRITABLE_BOOK, 0, 0))); -+ } -+ // CraftBukkit end - - public boolean a(InventoryCrafting inventorycrafting, World world) { - int i = 0; diff --git a/TacoSpigot-Server/nms-patches/RecipeFireworks.patch b/TacoSpigot-Server/nms-patches/RecipeFireworks.patch deleted file mode 100644 index 039e6b5..0000000 --- a/TacoSpigot-Server/nms-patches/RecipeFireworks.patch +++ /dev/null @@ -1,20 +0,0 @@ ---- a/net/minecraft/server/RecipeFireworks.java -+++ b/net/minecraft/server/RecipeFireworks.java -@@ -3,11 +3,15 @@ - import com.google.common.collect.Lists; - import java.util.ArrayList; - --public class RecipeFireworks implements IRecipe { -+public class RecipeFireworks extends ShapelessRecipes implements IRecipe { // CraftBukkit - added extends - - private ItemStack a; - -- public RecipeFireworks() {} -+ // CraftBukkit start - Delegate to new parent class with bogus info -+ public RecipeFireworks() { -+ super(new ItemStack(Items.FIREWORKS, 0, 0), java.util.Arrays.asList(new ItemStack(Items.GUNPOWDER, 0, 5))); -+ } -+ // CraftBukkit end - - public boolean a(InventoryCrafting inventorycrafting, World world) { - this.a = null; diff --git a/TacoSpigot-Server/nms-patches/RecipeMapClone.patch b/TacoSpigot-Server/nms-patches/RecipeMapClone.patch deleted file mode 100644 index 2349634..0000000 --- a/TacoSpigot-Server/nms-patches/RecipeMapClone.patch +++ /dev/null @@ -1,17 +0,0 @@ ---- a/net/minecraft/server/RecipeMapClone.java -+++ b/net/minecraft/server/RecipeMapClone.java -@@ -1,8 +1,12 @@ - package net.minecraft.server; - --public class RecipeMapClone implements IRecipe { -+public class RecipeMapClone extends ShapelessRecipes implements IRecipe { // CraftBukkit - added extends - -- public RecipeMapClone() {} -+ // CraftBukkit start - Delegate to new parent class -+ public RecipeMapClone() { -+ super(new ItemStack(Items.MAP, 0, -1), java.util.Arrays.asList(new ItemStack(Items.MAP, 0, 0))); -+ } -+ // CraftBukkit end - - public boolean a(InventoryCrafting inventorycrafting, World world) { - int i = 0; diff --git a/TacoSpigot-Server/nms-patches/RecipeRepair.patch b/TacoSpigot-Server/nms-patches/RecipeRepair.patch deleted file mode 100644 index 1d0f914..0000000 --- a/TacoSpigot-Server/nms-patches/RecipeRepair.patch +++ /dev/null @@ -1,37 +0,0 @@ ---- a/net/minecraft/server/RecipeRepair.java -+++ b/net/minecraft/server/RecipeRepair.java -@@ -3,9 +3,13 @@ - import com.google.common.collect.Lists; - import java.util.ArrayList; - --public class RecipeRepair implements IRecipe { -+public class RecipeRepair extends ShapelessRecipes implements IRecipe { // CraftBukkit - added extends - -- public RecipeRepair() {} -+ // CraftBukkit start - Delegate to new parent class -+ public RecipeRepair() { -+ super(new ItemStack(Items.LEATHER_HELMET), java.util.Arrays.asList(new ItemStack(Items.LEATHER_HELMET))); -+ } -+ // CraftBukkit end - - public boolean a(InventoryCrafting inventorycrafting, World world) { - ArrayList arraylist = Lists.newArrayList(); -@@ -62,7 +66,17 @@ - i1 = 0; - } - -- return new ItemStack(itemstack2.getItem(), 1, i1); -+ // CraftBukkit start - Construct a dummy repair recipe -+ ItemStack result = new ItemStack(itemstack.getItem(), 1, i1); -+ java.util.List ingredients = new ArrayList(); -+ ingredients.add(itemstack2.cloneItemStack()); -+ ingredients.add(itemstack.cloneItemStack()); -+ ShapelessRecipes recipe = new ShapelessRecipes(result.cloneItemStack(), ingredients); -+ inventorycrafting.currentRecipe = recipe; -+ result = org.bukkit.craftbukkit.event.CraftEventFactory.callPreCraftEvent(inventorycrafting, result, CraftingManager.getInstance().lastCraftView, true); -+ return result; -+ // return new ItemStack(itemstack2.getItem(), 1, i1); -+ // CraftBukkit end - } - } - diff --git a/TacoSpigot-Server/nms-patches/RecipesBanner.patch b/TacoSpigot-Server/nms-patches/RecipesBanner.patch deleted file mode 100644 index 8e1e1e2..0000000 --- a/TacoSpigot-Server/nms-patches/RecipesBanner.patch +++ /dev/null @@ -1,34 +0,0 @@ ---- a/net/minecraft/server/RecipesBanner.java -+++ b/net/minecraft/server/RecipesBanner.java -@@ -20,9 +20,13 @@ - - static class SyntheticClass_1 { } - -- static class AddRecipe implements IRecipe { -+ static class AddRecipe extends ShapelessRecipes implements IRecipe { // CraftBukkit - added extends - -- private AddRecipe() {} -+ // CraftBukkit start - Delegate to new parent class with bogus info -+ private AddRecipe() { -+ super(new ItemStack(Items.BANNER, 0, 0), java.util.Arrays.asList(new ItemStack(Items.BANNER))); -+ } -+ // CraftBukkit end - - public boolean a(InventoryCrafting inventorycrafting, World world) { - boolean flag = false; -@@ -210,9 +214,13 @@ - } - } - -- static class DuplicateRecipe implements IRecipe { -+ static class DuplicateRecipe extends ShapelessRecipes implements IRecipe { // CraftBukkit - added extends - -- private DuplicateRecipe() {} -+ // CraftBukkit start - Delegate to new parent class with bogus info -+ private DuplicateRecipe() { -+ super(new ItemStack(Items.BANNER, 0, 0), java.util.Arrays.asList(new ItemStack(Items.DYE, 0, 5))); -+ } -+ // CraftBukkit end - - public boolean a(InventoryCrafting inventorycrafting, World world) { - ItemStack itemstack = null; diff --git a/TacoSpigot-Server/nms-patches/RecipesFurnace.patch b/TacoSpigot-Server/nms-patches/RecipesFurnace.patch deleted file mode 100644 index 79bae8a..0000000 --- a/TacoSpigot-Server/nms-patches/RecipesFurnace.patch +++ /dev/null @@ -1,56 +0,0 @@ ---- a/net/minecraft/server/RecipesFurnace.java -+++ b/net/minecraft/server/RecipesFurnace.java -@@ -10,12 +10,13 @@ - private static final RecipesFurnace a = new RecipesFurnace(); - public Map recipes = Maps.newHashMap(); - private Map c = Maps.newHashMap(); -+ public Map customRecipes = Maps.newHashMap(); // CraftBukkit - add field - - public static RecipesFurnace getInstance() { - return RecipesFurnace.a; - } - -- private RecipesFurnace() { -+ public RecipesFurnace() { // PAIL: Public - this.registerRecipe(Blocks.IRON_ORE, new ItemStack(Items.IRON_INGOT), 0.7F); - this.registerRecipe(Blocks.GOLD_ORE, new ItemStack(Items.GOLD_INGOT), 1.0F); - this.registerRecipe(Blocks.DIAMOND_ORE, new ItemStack(Items.DIAMOND), 1.0F); -@@ -53,6 +54,12 @@ - this.registerRecipe(Blocks.QUARTZ_ORE, new ItemStack(Items.QUARTZ), 0.2F); - } - -+ // CraftBukkit start - add method -+ public void registerRecipe(ItemStack itemstack, ItemStack itemstack1) { -+ this.customRecipes.put(itemstack, itemstack1); -+ } -+ // CraftBukkit end -+ - public void registerRecipe(Block block, ItemStack itemstack, float f) { - this.a(Item.getItemOf(block), itemstack, f); - } -@@ -67,13 +74,23 @@ - } - - public ItemStack getResult(ItemStack itemstack) { -- Iterator iterator = this.recipes.entrySet().iterator(); -+ // CraftBukkit start - initialize to customRecipes -+ boolean vanilla = false; -+ Iterator iterator = this.customRecipes.entrySet().iterator(); -+ // CraftBukkit end - - Entry entry; - - do { - if (!iterator.hasNext()) { -- return null; -+ // CraftBukkit start - fall back to vanilla recipes -+ if (!vanilla && !recipes.isEmpty()) { -+ iterator = this.recipes.entrySet().iterator(); -+ vanilla = true; -+ } else { -+ return null; -+ } -+ // CraftBukkit end - } - - entry = (Entry) iterator.next(); diff --git a/TacoSpigot-Server/nms-patches/RegionFile.patch b/TacoSpigot-Server/nms-patches/RegionFile.patch deleted file mode 100644 index 6153576..0000000 --- a/TacoSpigot-Server/nms-patches/RegionFile.patch +++ /dev/null @@ -1,48 +0,0 @@ ---- a/net/minecraft/server/RegionFile.java -+++ b/net/minecraft/server/RegionFile.java -@@ -90,6 +90,45 @@ - - } - -+ // CraftBukkit start - This is a copy (sort of) of the method below it, make sure they stay in sync -+ public synchronized boolean chunkExists(int i, int j) { -+ if (this.d(i, j)) { -+ return false; -+ } else { -+ try { -+ int k = this.e(i, j); -+ -+ if (k == 0) { -+ return false; -+ } else { -+ int l = k >> 8; -+ int i1 = k & 255; -+ -+ if (l + i1 > this.f.size()) { -+ return false; -+ } -+ -+ this.c.seek((long) (l * 4096)); -+ int j1 = this.c.readInt(); -+ -+ if (j1 > 4096 * i1 || j1 <= 0) { -+ return false; -+ } -+ -+ byte b0 = this.c.readByte(); -+ if (b0 == 1 || b0 == 2) { -+ return true; -+ } -+ } -+ } catch (IOException ioexception) { -+ return false; -+ } -+ } -+ -+ return false; -+ } -+ // CraftBukkit end -+ - public synchronized DataInputStream a(int i, int j) { - if (this.d(i, j)) { - return null; diff --git a/TacoSpigot-Server/nms-patches/RemoteControlCommandListener.patch b/TacoSpigot-Server/nms-patches/RemoteControlCommandListener.patch deleted file mode 100644 index 6331f69..0000000 --- a/TacoSpigot-Server/nms-patches/RemoteControlCommandListener.patch +++ /dev/null @@ -1,15 +0,0 @@ ---- a/net/minecraft/server/RemoteControlCommandListener.java -+++ b/net/minecraft/server/RemoteControlCommandListener.java -@@ -27,6 +27,12 @@ - return new ChatComponentText(this.getName()); - } - -+ // CraftBukkit start - Send a String -+ public void sendMessage(String message) { -+ this.b.append(message); -+ } -+ // CraftBukkit end -+ - public void sendMessage(IChatBaseComponent ichatbasecomponent) { - this.b.append(ichatbasecomponent.c()); - } diff --git a/TacoSpigot-Server/nms-patches/ScoreboardServer.patch b/TacoSpigot-Server/nms-patches/ScoreboardServer.patch deleted file mode 100644 index c480fff..0000000 --- a/TacoSpigot-Server/nms-patches/ScoreboardServer.patch +++ /dev/null @@ -1,126 +0,0 @@ ---- a/net/minecraft/server/ScoreboardServer.java -+++ b/net/minecraft/server/ScoreboardServer.java -@@ -21,7 +21,7 @@ - public void handleScoreChanged(ScoreboardScore scoreboardscore) { - super.handleScoreChanged(scoreboardscore); - if (this.b.contains(scoreboardscore.getObjective())) { -- this.a.getPlayerList().sendAll(new PacketPlayOutScoreboardScore(scoreboardscore)); -+ this.sendAll(new PacketPlayOutScoreboardScore(scoreboardscore)); - } - - this.b(); -@@ -29,13 +29,13 @@ - - public void handlePlayerRemoved(String s) { - super.handlePlayerRemoved(s); -- this.a.getPlayerList().sendAll(new PacketPlayOutScoreboardScore(s)); -+ this.sendAll(new PacketPlayOutScoreboardScore(s)); - 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(); - } - -@@ -45,7 +45,7 @@ - super.setDisplaySlot(i, scoreboardobjective); - if (scoreboardobjective1 != scoreboardobjective && scoreboardobjective1 != null) { - if (this.h(scoreboardobjective1) > 0) { -- this.a.getPlayerList().sendAll(new PacketPlayOutScoreboardDisplayObjective(i, scoreboardobjective)); -+ this.sendAll(new PacketPlayOutScoreboardDisplayObjective(i, scoreboardobjective)); - } else { - this.g(scoreboardobjective1); - } -@@ -53,7 +53,7 @@ - - if (scoreboardobjective != null) { - if (this.b.contains(scoreboardobjective)) { -- this.a.getPlayerList().sendAll(new PacketPlayOutScoreboardDisplayObjective(i, scoreboardobjective)); -+ this.sendAll(new PacketPlayOutScoreboardDisplayObjective(i, scoreboardobjective)); - } else { - this.e(scoreboardobjective); - } -@@ -66,7 +66,7 @@ - if (super.addPlayerToTeam(s, s1)) { - ScoreboardTeam scoreboardteam = this.getTeam(s1); - -- this.a.getPlayerList().sendAll(new PacketPlayOutScoreboardTeam(scoreboardteam, Arrays.asList(new String[] { s}), 3)); -+ this.sendAll(new PacketPlayOutScoreboardTeam(scoreboardteam, Arrays.asList(new String[] { s}), 3)); - this.b(); - return true; - } else { -@@ -76,7 +76,7 @@ - - public void removePlayerFromTeam(String s, ScoreboardTeam scoreboardteam) { - super.removePlayerFromTeam(s, scoreboardteam); -- this.a.getPlayerList().sendAll(new PacketPlayOutScoreboardTeam(scoreboardteam, Arrays.asList(new String[] { s}), 4)); -+ this.sendAll(new PacketPlayOutScoreboardTeam(scoreboardteam, Arrays.asList(new String[] { s}), 4)); - this.b(); - } - -@@ -88,7 +88,7 @@ - public void handleObjectiveChanged(ScoreboardObjective scoreboardobjective) { - super.handleObjectiveChanged(scoreboardobjective); - if (this.b.contains(scoreboardobjective)) { -- this.a.getPlayerList().sendAll(new PacketPlayOutScoreboardObjective(scoreboardobjective, 2)); -+ this.sendAll(new PacketPlayOutScoreboardObjective(scoreboardobjective, 2)); - } - - this.b(); -@@ -105,19 +105,19 @@ - - public void handleTeamAdded(ScoreboardTeam scoreboardteam) { - super.handleTeamAdded(scoreboardteam); -- this.a.getPlayerList().sendAll(new PacketPlayOutScoreboardTeam(scoreboardteam, 0)); -+ this.sendAll(new PacketPlayOutScoreboardTeam(scoreboardteam, 0)); - this.b(); - } - - public void handleTeamChanged(ScoreboardTeam scoreboardteam) { - super.handleTeamChanged(scoreboardteam); -- this.a.getPlayerList().sendAll(new PacketPlayOutScoreboardTeam(scoreboardteam, 2)); -+ this.sendAll(new PacketPlayOutScoreboardTeam(scoreboardteam, 2)); - this.b(); - } - - public void handleTeamRemoved(ScoreboardTeam scoreboardteam) { - super.handleTeamRemoved(scoreboardteam); -- this.a.getPlayerList().sendAll(new PacketPlayOutScoreboardTeam(scoreboardteam, 1)); -+ this.sendAll(new PacketPlayOutScoreboardTeam(scoreboardteam, 1)); - this.b(); - } - -@@ -160,6 +160,7 @@ - - while (iterator.hasNext()) { - EntityPlayer entityplayer = (EntityPlayer) iterator.next(); -+ if (entityplayer.getBukkitEntity().getScoreboard().getHandle() != this) continue; // CraftBukkit - Only players on this board - Iterator iterator1 = list.iterator(); - - while (iterator1.hasNext()) { -@@ -192,6 +193,7 @@ - - while (iterator.hasNext()) { - EntityPlayer entityplayer = (EntityPlayer) iterator.next(); -+ if (entityplayer.getBukkitEntity().getScoreboard().getHandle() != this) continue; // CraftBukkit - Only players on this board - Iterator iterator1 = list.iterator(); - - while (iterator1.hasNext()) { -@@ -215,4 +217,14 @@ - - return i; - } -+ -+ // CraftBukkit start - Send to players -+ private void sendAll(Packet packet) { -+ for (EntityPlayer entityplayer : (List) this.a.getPlayerList().players) { -+ if (entityplayer.getBukkitEntity().getScoreboard().getHandle() == this) { -+ entityplayer.playerConnection.sendPacket(packet); -+ } -+ } -+ } -+ // CraftBukkit end - } diff --git a/TacoSpigot-Server/nms-patches/SecondaryWorldServer.patch b/TacoSpigot-Server/nms-patches/SecondaryWorldServer.patch deleted file mode 100644 index a26d9cd..0000000 --- a/TacoSpigot-Server/nms-patches/SecondaryWorldServer.patch +++ /dev/null @@ -1,42 +0,0 @@ ---- a/net/minecraft/server/SecondaryWorldServer.java -+++ b/net/minecraft/server/SecondaryWorldServer.java -@@ -4,9 +4,12 @@ - - private WorldServer a; - -- public SecondaryWorldServer(MinecraftServer minecraftserver, IDataManager idatamanager, int i, WorldServer worldserver, MethodProfiler methodprofiler) { -- super(minecraftserver, idatamanager, new SecondaryWorldData(worldserver.getWorldData()), i, methodprofiler); -+ // CraftBukkit start - Add WorldData, Environment and ChunkGenerator arguments -+ public SecondaryWorldServer(MinecraftServer minecraftserver, IDataManager idatamanager, int i, WorldServer worldserver, MethodProfiler methodprofiler, WorldData worldData, org.bukkit.World.Environment env, org.bukkit.generator.ChunkGenerator gen) { -+ super(minecraftserver, idatamanager, worldData, i, methodprofiler, env, gen); -+ // CraftBukkit end - this.a = worldserver; -+ /* CraftBukkit start - worldserver.getWorldBorder().a(new IWorldBorderListener() { - public void a(WorldBorder worldborder, double d0) { - SecondaryWorldServer.this.getWorldBorder().setSize(d0); -@@ -36,13 +39,14 @@ - SecondaryWorldServer.this.getWorldBorder().setDamageBuffer(d0); - } - }); -+ // CraftBukkit end */ - } - -- protected void a() {} -+ // protected void a() {} // CraftBukkit - - public World b() { - this.worldMaps = this.a.T(); -- this.scoreboard = this.a.getScoreboard(); -+ // this.scoreboard = this.a.getScoreboard(); // CraftBukkit - String s = PersistentVillage.a(this.worldProvider); - PersistentVillage persistentvillage = (PersistentVillage) this.worldMaps.get(PersistentVillage.class, s); - -@@ -54,6 +58,6 @@ - this.villages.a((World) this); - } - -- return this; -+ return super.b(); // CraftBukkit - } - } diff --git a/TacoSpigot-Server/nms-patches/ShapedRecipes.patch b/TacoSpigot-Server/nms-patches/ShapedRecipes.patch deleted file mode 100644 index 699a2af..0000000 --- a/TacoSpigot-Server/nms-patches/ShapedRecipes.patch +++ /dev/null @@ -1,76 +0,0 @@ ---- a/net/minecraft/server/ShapedRecipes.java -+++ b/net/minecraft/server/ShapedRecipes.java -@@ -1,5 +1,10 @@ - package net.minecraft.server; - -+// CraftBukkit start -+import org.bukkit.craftbukkit.inventory.CraftItemStack; -+import org.bukkit.craftbukkit.inventory.CraftShapedRecipe; -+// CraftBukkit end -+ - public class ShapedRecipes implements IRecipe { - - private final int width; -@@ -15,6 +20,62 @@ - this.result = itemstack; - } - -+ // CraftBukkit start -+ public org.bukkit.inventory.ShapedRecipe toBukkitRecipe() { -+ CraftItemStack result = CraftItemStack.asCraftMirror(this.result); -+ CraftShapedRecipe recipe = new CraftShapedRecipe(result, this); -+ switch (this.height) { -+ case 1: -+ switch (this.width) { -+ case 1: -+ recipe.shape("a"); -+ break; -+ case 2: -+ recipe.shape("ab"); -+ break; -+ case 3: -+ recipe.shape("abc"); -+ break; -+ } -+ break; -+ case 2: -+ switch (this.width) { -+ case 1: -+ recipe.shape("a","b"); -+ break; -+ case 2: -+ recipe.shape("ab","cd"); -+ break; -+ case 3: -+ recipe.shape("abc","def"); -+ break; -+ } -+ break; -+ case 3: -+ switch (this.width) { -+ case 1: -+ recipe.shape("a","b","c"); -+ break; -+ case 2: -+ recipe.shape("ab","cd","ef"); -+ break; -+ case 3: -+ recipe.shape("abc","def","ghi"); -+ break; -+ } -+ break; -+ } -+ char c = 'a'; -+ for (ItemStack stack : this.items) { -+ if (stack != null) { -+ recipe.setIngredient(c, org.bukkit.craftbukkit.util.CraftMagicNumbers.getMaterial(stack.getItem()), stack.getData()); -+ } -+ c++; -+ } -+ return recipe; -+ } -+ // CraftBukkit end -+ - public ItemStack b() { - return this.result; - } diff --git a/TacoSpigot-Server/nms-patches/ShapelessRecipes.patch b/TacoSpigot-Server/nms-patches/ShapelessRecipes.patch deleted file mode 100644 index 0ed46af..0000000 --- a/TacoSpigot-Server/nms-patches/ShapelessRecipes.patch +++ /dev/null @@ -1,35 +0,0 @@ ---- a/net/minecraft/server/ShapelessRecipes.java -+++ b/net/minecraft/server/ShapelessRecipes.java -@@ -5,6 +5,11 @@ - import java.util.Iterator; - import java.util.List; - -+// CraftBukkit start -+import org.bukkit.craftbukkit.inventory.CraftItemStack; -+import org.bukkit.craftbukkit.inventory.CraftShapelessRecipe; -+// CraftBukkit end -+ - public class ShapelessRecipes implements IRecipe { - - private final ItemStack result; -@@ -15,6 +20,20 @@ - this.ingredients = list; - } - -+ // CraftBukkit start -+ @SuppressWarnings("unchecked") -+ public org.bukkit.inventory.ShapelessRecipe toBukkitRecipe() { -+ CraftItemStack result = CraftItemStack.asCraftMirror(this.result); -+ CraftShapelessRecipe recipe = new CraftShapelessRecipe(result, this); -+ for (ItemStack stack : (List) this.ingredients) { -+ if (stack != null) { -+ recipe.addIngredient(org.bukkit.craftbukkit.util.CraftMagicNumbers.getMaterial(stack.getItem()), stack.getData()); -+ } -+ } -+ return recipe; -+ } -+ // CraftBukkit end -+ - public ItemStack b() { - return this.result; - } diff --git a/TacoSpigot-Server/nms-patches/Slot.patch b/TacoSpigot-Server/nms-patches/Slot.patch deleted file mode 100644 index a9b73d5..0000000 --- a/TacoSpigot-Server/nms-patches/Slot.patch +++ /dev/null @@ -1,12 +0,0 @@ ---- a/net/minecraft/server/Slot.java -+++ b/net/minecraft/server/Slot.java -@@ -45,6 +45,9 @@ - } - - public boolean hasItem() { -+ if (getItem() != null && getItem().count == 0) { -+ set(null); -+ } - return this.getItem() != null; - } - diff --git a/TacoSpigot-Server/nms-patches/SlotFurnaceResult.patch b/TacoSpigot-Server/nms-patches/SlotFurnaceResult.patch deleted file mode 100644 index cb27c68..0000000 --- a/TacoSpigot-Server/nms-patches/SlotFurnaceResult.patch +++ /dev/null @@ -1,32 +0,0 @@ ---- a/net/minecraft/server/SlotFurnaceResult.java -+++ b/net/minecraft/server/SlotFurnaceResult.java -@@ -1,5 +1,10 @@ - package net.minecraft.server; - -+// CraftBukkit start -+import org.bukkit.entity.Player; -+import org.bukkit.event.inventory.FurnaceExtractEvent; -+// CraftBukkit end -+ - public class SlotFurnaceResult extends Slot { - - private EntityHuman a; -@@ -50,6 +55,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()); -+ -+ 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; diff --git a/TacoSpigot-Server/nms-patches/SpawnerCreature.patch b/TacoSpigot-Server/nms-patches/SpawnerCreature.patch deleted file mode 100644 index be143f6..0000000 --- a/TacoSpigot-Server/nms-patches/SpawnerCreature.patch +++ /dev/null @@ -1,108 +0,0 @@ ---- a/net/minecraft/server/SpawnerCreature.java -+++ b/net/minecraft/server/SpawnerCreature.java -@@ -6,10 +6,16 @@ - import java.util.Random; - import java.util.Set; - -+// CraftBukkit start -+import org.bukkit.craftbukkit.util.LongHash; -+import org.bukkit.craftbukkit.util.LongHashSet; -+import org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason; -+// CraftBukkit end -+ - public final class SpawnerCreature { - - private static final int a = (int) Math.pow(17.0D, 2.0D); -- private final Set b = Sets.newHashSet(); -+ private final LongHashSet b = new LongHashSet(); // CraftBukkit - - public SpawnerCreature() {} - -@@ -36,14 +42,17 @@ - for (int i1 = -b0; i1 <= b0; ++i1) { - for (k = -b0; k <= b0; ++k) { - boolean flag3 = i1 == -b0 || i1 == b0 || k == -b0 || k == b0; -- ChunkCoordIntPair chunkcoordintpair = new ChunkCoordIntPair(i1 + l, k + j); -+ // CraftBukkit start - use LongHash and LongHashSet -+ // ChunkCoordIntPair chunkcoordintpair = new ChunkCoordIntPair(i1 + l, k + j); - -- if (!this.b.contains(chunkcoordintpair)) { -+ long chunkCoords = LongHash.toLong(i1 + l, k + j); -+ if (!this.b.contains(chunkCoords)) { - ++i; -- if (!flag3 && worldserver.getWorldBorder().isInBounds(chunkcoordintpair)) { -- this.b.add(chunkcoordintpair); -+ if (!flag3 && worldserver.getWorldBorder().isInBounds(i1 + l, k + j)) { -+ this.b.add(chunkCoords); - } - } -+ // CraftBukkit end - } - } - } -@@ -58,17 +67,41 @@ - for (int k1 = 0; k1 < j; ++k1) { - EnumCreatureType enumcreaturetype = aenumcreaturetype[k1]; - -+ // CraftBukkit start - Use per-world spawn limits -+ int limit = enumcreaturetype.b(); -+ switch (enumcreaturetype) { -+ case MONSTER: -+ limit = worldserver.getWorld().getMonsterSpawnLimit(); -+ break; -+ case CREATURE: -+ limit = worldserver.getWorld().getAnimalSpawnLimit(); -+ break; -+ case WATER_CREATURE: -+ limit = worldserver.getWorld().getWaterAnimalSpawnLimit(); -+ break; -+ case AMBIENT: -+ limit = worldserver.getWorld().getAmbientSpawnLimit(); -+ break; -+ } -+ -+ if (limit == 0) { -+ continue; -+ } -+ // CraftBukkit end -+ - if ((!enumcreaturetype.d() || flag1) && (enumcreaturetype.d() || flag) && (!enumcreaturetype.e() || flag2)) { - k = worldserver.a(enumcreaturetype.a()); -- int l1 = enumcreaturetype.b() * i / SpawnerCreature.a; -+ int l1 = limit * i / a; // CraftBukkit - use per-world limits - - if (k <= l1) { - Iterator iterator1 = this.b.iterator(); - - label115: - while (iterator1.hasNext()) { -- ChunkCoordIntPair chunkcoordintpair1 = (ChunkCoordIntPair) iterator1.next(); -- BlockPosition blockposition1 = getRandomPosition(worldserver, chunkcoordintpair1.x, chunkcoordintpair1.z); -+ // CraftBukkit start = use LongHash and LongObjectHashMap -+ long key = ((Long) iterator1.next()).longValue(); -+ BlockPosition blockposition1 = getRandomPosition(worldserver, LongHash.msw(key), LongHash.lsw(key)); -+ // CraftBukkit - int i2 = blockposition1.getX(); - int j2 = blockposition1.getY(); - int k2 = blockposition1.getZ(); -@@ -120,7 +153,7 @@ - groupdataentity = entityinsentient.prepare(worldserver.E(new BlockPosition(entityinsentient)), groupdataentity); - if (entityinsentient.canSpawn()) { - ++l2; -- worldserver.addEntity(entityinsentient); -+ worldserver.addEntity(entityinsentient, SpawnReason.NATURAL); // CraftBukkit - Added a reason for spawning this creature - } - - if (l2 >= entityinsentient.bV()) { -@@ -214,8 +247,10 @@ - } - - entityinsentient.setPositionRotation((double) ((float) j1 + 0.5F), (double) blockposition.getY(), (double) ((float) k1 + 0.5F), random.nextFloat() * 360.0F, 0.0F); -- world.addEntity(entityinsentient); -+ // CraftBukkit start - Added a reason for spawning this creature, moved entityinsentient.prepare(groupdataentity) up - groupdataentity = entityinsentient.prepare(world.E(new BlockPosition(entityinsentient)), groupdataentity); -+ world.addEntity(entityinsentient, SpawnReason.CHUNK_GEN); -+ // CraftBukkit end - flag = true; - } - diff --git a/TacoSpigot-Server/nms-patches/StatisticManager.patch b/TacoSpigot-Server/nms-patches/StatisticManager.patch deleted file mode 100644 index c935908..0000000 --- a/TacoSpigot-Server/nms-patches/StatisticManager.patch +++ /dev/null @@ -1,24 +0,0 @@ ---- a/net/minecraft/server/StatisticManager.java -+++ b/net/minecraft/server/StatisticManager.java -@@ -19,6 +19,12 @@ - - public void b(EntityHuman entityhuman, Statistic statistic, int i) { - if (!statistic.d() || this.b((Achievement) statistic)) { -+ // CraftBukkit start - fire Statistic events -+ org.bukkit.event.Cancellable cancellable = org.bukkit.craftbukkit.event.CraftEventFactory.handleStatisticsIncrease(entityhuman, statistic, this.getStatisticValue(statistic), i); -+ if (cancellable != null && cancellable.isCancelled()) { -+ return; -+ } -+ // CraftBukkit end - this.setStatistic(entityhuman, statistic, this.getStatisticValue(statistic) + i); - } - } -@@ -43,7 +49,7 @@ - public T b(Statistic statistic) { - StatisticWrapper statisticwrapper = (StatisticWrapper) this.a.get(statistic); - -- return statisticwrapper != null ? statisticwrapper.b() : null; -+ return statisticwrapper != null ? (T) statisticwrapper.b() : null; // CraftBukkit - fix decompile error - } - - public T a(Statistic statistic, T t0) { diff --git a/TacoSpigot-Server/nms-patches/TileEntity.patch b/TacoSpigot-Server/nms-patches/TileEntity.patch deleted file mode 100644 index c4c4ea6..0000000 --- a/TacoSpigot-Server/nms-patches/TileEntity.patch +++ /dev/null @@ -1,25 +0,0 @@ ---- a/net/minecraft/server/TileEntity.java -+++ b/net/minecraft/server/TileEntity.java -@@ -6,6 +6,8 @@ - import org.apache.logging.log4j.LogManager; - import org.apache.logging.log4j.Logger; - -+import org.bukkit.inventory.InventoryHolder; // CraftBukkit -+ - public abstract class TileEntity { - - private static final Logger a = LogManager.getLogger(); -@@ -221,4 +223,13 @@ - a(TileEntityFlowerPot.class, "FlowerPot"); - a(TileEntityBanner.class, "Banner"); - } -+ -+ // CraftBukkit start - add method -+ public InventoryHolder getOwner() { -+ if (world == null) return null; -+ org.bukkit.block.BlockState state = world.getWorld().getBlockAt(position.getX(), position.getY(), position.getZ()).getState(); -+ if (state instanceof InventoryHolder) return (InventoryHolder) state; -+ return null; -+ } -+ // CraftBukkit end - } diff --git a/TacoSpigot-Server/nms-patches/TileEntityBanner.patch b/TacoSpigot-Server/nms-patches/TileEntityBanner.patch deleted file mode 100644 index f8cd7bc..0000000 --- a/TacoSpigot-Server/nms-patches/TileEntityBanner.patch +++ /dev/null @@ -1,26 +0,0 @@ ---- a/net/minecraft/server/TileEntityBanner.java -+++ b/net/minecraft/server/TileEntityBanner.java -@@ -20,6 +20,11 @@ - - if (nbttagcompound.hasKey("Patterns")) { - this.patterns = (NBTTagList) nbttagcompound.getList("Patterns", 10).clone(); -+ // CraftBukkit start -+ while (this.patterns.size() > 20) { -+ this.patterns.a(20); // PAIL Rename remove -+ } -+ // CraftBukkit end - } - - if (nbttagcompound.hasKeyOfType("Base", 99)) { -@@ -54,6 +59,11 @@ - super.a(nbttagcompound); - this.color = nbttagcompound.getInt("Base"); - this.patterns = nbttagcompound.getList("Patterns", 10); -+ // CraftBukkit start -+ while (this.patterns.size() > 20) { -+ this.patterns.a(20); // PAIL Rename remove -+ } -+ // CraftBukkit end - this.h = null; - this.i = null; - this.j = null; diff --git a/TacoSpigot-Server/nms-patches/TileEntityBeacon.patch b/TacoSpigot-Server/nms-patches/TileEntityBeacon.patch deleted file mode 100644 index 7b81e98..0000000 --- a/TacoSpigot-Server/nms-patches/TileEntityBeacon.patch +++ /dev/null @@ -1,54 +0,0 @@ ---- a/net/minecraft/server/TileEntityBeacon.java -+++ b/net/minecraft/server/TileEntityBeacon.java -@@ -5,6 +5,11 @@ - import java.util.Iterator; - import java.util.List; - -+// CraftBukkit start -+import org.bukkit.craftbukkit.entity.CraftHumanEntity; -+import org.bukkit.entity.HumanEntity; -+// CraftBukkit end -+ - public class TileEntityBeacon extends TileEntityContainer implements IUpdatePlayerListBox, IInventory { - - public static final MobEffectList[][] a = new MobEffectList[][] { { MobEffectList.FASTER_MOVEMENT, MobEffectList.FASTER_DIG}, { MobEffectList.RESISTANCE, MobEffectList.JUMP}, { MobEffectList.INCREASE_DAMAGE}, { MobEffectList.REGENERATION}}; -@@ -15,6 +20,30 @@ - private int l; - private ItemStack inventorySlot; - private String n; -+ // CraftBukkit start - add fields and methods -+ public List transaction = new java.util.ArrayList(); -+ private int maxStack = MAX_STACK; -+ -+ public ItemStack[] getContents() { -+ return new ItemStack[] { this.inventorySlot }; -+ } -+ -+ public void onOpen(CraftHumanEntity who) { -+ transaction.add(who); -+ } -+ -+ public void onClose(CraftHumanEntity who) { -+ transaction.remove(who); -+ } -+ -+ public List getViewers() { -+ return transaction; -+ } -+ -+ public void setMaxStackSize(int size) { -+ maxStack = size; -+ } -+ // CraftBukkit end - - public TileEntityBeacon() {} - -@@ -246,7 +275,7 @@ - } - - public int getMaxStackSize() { -- return 1; -+ return maxStack; // CraftBukkit - } - - public boolean a(EntityHuman entityhuman) { diff --git a/TacoSpigot-Server/nms-patches/TileEntityBrewingStand.patch b/TacoSpigot-Server/nms-patches/TileEntityBrewingStand.patch deleted file mode 100644 index d0158f5..0000000 --- a/TacoSpigot-Server/nms-patches/TileEntityBrewingStand.patch +++ /dev/null @@ -1,94 +0,0 @@ ---- a/net/minecraft/server/TileEntityBrewingStand.java -+++ b/net/minecraft/server/TileEntityBrewingStand.java -@@ -3,6 +3,12 @@ - import java.util.Arrays; - import java.util.List; - -+// CraftBukkit start -+import org.bukkit.craftbukkit.entity.CraftHumanEntity; -+import org.bukkit.entity.HumanEntity; -+import org.bukkit.event.inventory.BrewEvent; -+// CraftBukkit end -+ - public class TileEntityBrewingStand extends TileEntityContainer implements IUpdatePlayerListBox, IWorldInventory { - - private static final int[] a = new int[] { 3}; -@@ -12,9 +18,35 @@ - private boolean[] i; - private Item j; - private String k; -+ private int lastTick = MinecraftServer.currentTick; // CraftBukkit - add field - - public TileEntityBrewingStand() {} - -+ // CraftBukkit start - add fields and methods -+ public List transaction = new java.util.ArrayList(); -+ private int maxStack = 64; -+ -+ public void onOpen(CraftHumanEntity who) { -+ transaction.add(who); -+ } -+ -+ public void onClose(CraftHumanEntity who) { -+ transaction.remove(who); -+ } -+ -+ public List getViewers() { -+ return transaction; -+ } -+ -+ public ItemStack[] getContents() { -+ return this.items; -+ } -+ -+ public void setMaxStackSize(int size) { -+ maxStack = size; -+ } -+ // CraftBukkit end -+ - public String getName() { - return this.hasCustomName() ? this.k : "container.brewing"; - } -@@ -32,9 +64,14 @@ - } - - public void c() { -+ // CraftBukkit start - Use wall time instead of ticks for brewing -+ int elapsedTicks = MinecraftServer.currentTick - this.lastTick; -+ this.lastTick = MinecraftServer.currentTick; -+ - if (this.brewTime > 0) { -- --this.brewTime; -- if (this.brewTime == 0) { -+ this.brewTime -= elapsedTicks; -+ if (this.brewTime <= 0) { // == -> <= -+ // CraftBukkit end - this.o(); - this.update(); - } else if (!this.n()) { -@@ -110,6 +147,16 @@ - if (this.n()) { - ItemStack itemstack = this.items[3]; - -+ // CraftBukkit start -+ if (getOwner() != null) { -+ BrewEvent event = new BrewEvent(world.getWorld().getBlockAt(position.getX(), position.getY(), position.getZ()), (org.bukkit.inventory.BrewerInventory) this.getOwner().getInventory()); -+ org.bukkit.Bukkit.getPluginManager().callEvent(event); -+ if (event.isCancelled()) { -+ return; -+ } -+ } -+ // CraftBukkit end -+ - for (int i = 0; i < 3; ++i) { - if (this.items[i] != null && this.items[i].getItem() == Items.POTION) { - int j = this.items[i].getData(); -@@ -221,7 +268,7 @@ - } - - public int getMaxStackSize() { -- return 64; -+ return this.maxStack; // CraftBukkit - } - - public boolean a(EntityHuman entityhuman) { diff --git a/TacoSpigot-Server/nms-patches/TileEntityChest.patch b/TacoSpigot-Server/nms-patches/TileEntityChest.patch deleted file mode 100644 index 605ced7..0000000 --- a/TacoSpigot-Server/nms-patches/TileEntityChest.patch +++ /dev/null @@ -1,117 +0,0 @@ ---- a/net/minecraft/server/TileEntityChest.java -+++ b/net/minecraft/server/TileEntityChest.java -@@ -3,6 +3,11 @@ - import java.util.Iterator; - import java.util.List; - -+// CraftBukkit start -+import org.bukkit.craftbukkit.entity.CraftHumanEntity; -+import org.bukkit.entity.HumanEntity; -+// CraftBukkit end -+ - public class TileEntityChest extends TileEntityContainer implements IUpdatePlayerListBox, IInventory { - - private ItemStack[] items = new ItemStack[27]; -@@ -20,6 +25,31 @@ - - public TileEntityChest() {} - -+ // CraftBukkit start - add fields and methods -+ public List transaction = new java.util.ArrayList(); -+ private int maxStack = MAX_STACK; -+ -+ public ItemStack[] getContents() { -+ return this.items; -+ } -+ -+ public void onOpen(CraftHumanEntity who) { -+ transaction.add(who); -+ } -+ -+ public void onClose(CraftHumanEntity who) { -+ transaction.remove(who); -+ } -+ -+ public List getViewers() { -+ return transaction; -+ } -+ -+ public void setMaxStackSize(int size) { -+ maxStack = size; -+ } -+ // CraftBukkit end -+ - public int getSize() { - return 27; - } -@@ -125,10 +155,11 @@ - } - - public int getMaxStackSize() { -- return 64; -+ return maxStack; // CraftBukkit - } - - public boolean a(EntityHuman entityhuman) { -+ if (this.world == null) return true; // CraftBukkit - return this.world.getTileEntity(this.position) != this ? false : entityhuman.e((double) this.position.getX() + 0.5D, (double) this.position.getY() + 0.5D, (double) this.position.getZ() + 0.5D) <= 64.0D; - } - -@@ -304,9 +335,21 @@ - if (this.l < 0) { - this.l = 0; - } -+ int oldPower = Math.max(0, Math.min(15, this.l)); // CraftBukkit - Get power before new viewer is added - - ++this.l; -+ if (this.world == null) return; // CraftBukkit - this.world.playBlockAction(this.position, this.w(), 1, this.l); -+ -+ // CraftBukkit start - Call redstone event -+ if (this.w() == Blocks.TRAPPED_CHEST) { -+ int newPower = Math.max(0, Math.min(15, this.l)); -+ -+ if (oldPower != newPower) { -+ org.bukkit.craftbukkit.event.CraftEventFactory.callRedstoneChange(world, position.getX(), position.getY(), position.getZ(), oldPower, newPower); -+ } -+ } -+ // CraftBukkit end - this.world.applyPhysics(this.position, this.w()); - this.world.applyPhysics(this.position.down(), this.w()); - } -@@ -315,8 +358,20 @@ - - public void closeContainer(EntityHuman entityhuman) { - if (!entityhuman.isSpectator() && this.w() instanceof BlockChest) { -+ int oldPower = Math.max(0, Math.min(15, this.l)); // CraftBukkit - Get power before new viewer is added - --this.l; -+ if (this.world == null) return; // CraftBukkit - this.world.playBlockAction(this.position, this.w(), 1, this.l); -+ -+ // CraftBukkit start - Call redstone event -+ if (this.w() == Blocks.TRAPPED_CHEST) { -+ int newPower = Math.max(0, Math.min(15, this.l)); -+ -+ if (oldPower != newPower) { -+ org.bukkit.craftbukkit.event.CraftEventFactory.callRedstoneChange(world, position.getX(), position.getY(), position.getZ(), oldPower, newPower); -+ } -+ } -+ // CraftBukkit end - this.world.applyPhysics(this.position, this.w()); - this.world.applyPhysics(this.position.down(), this.w()); - } -@@ -370,6 +425,14 @@ - - } - -+ // CraftBukkit start -+ // PAIL -+ @Override -+ public boolean F() { -+ return true; -+ } -+ // CraftBukkit end -+ - static class SyntheticClass_1 { - - static final int[] a = new int[EnumDirection.values().length]; diff --git a/TacoSpigot-Server/nms-patches/TileEntityCommand.patch b/TacoSpigot-Server/nms-patches/TileEntityCommand.patch deleted file mode 100644 index 9ef1c0a..0000000 --- a/TacoSpigot-Server/nms-patches/TileEntityCommand.patch +++ /dev/null @@ -1,12 +0,0 @@ ---- a/net/minecraft/server/TileEntityCommand.java -+++ b/net/minecraft/server/TileEntityCommand.java -@@ -3,6 +3,9 @@ - public class TileEntityCommand extends TileEntity { - - private final CommandBlockListenerAbstract a = new CommandBlockListenerAbstract() { -+ { -+ sender = new org.bukkit.craftbukkit.command.CraftBlockCommandSender(this); // CraftBukkit - add sender -+ } - public BlockPosition getChunkCoordinates() { - return TileEntityCommand.this.position; - } diff --git a/TacoSpigot-Server/nms-patches/TileEntityDispenser.patch b/TacoSpigot-Server/nms-patches/TileEntityDispenser.patch deleted file mode 100644 index ec176e9..0000000 --- a/TacoSpigot-Server/nms-patches/TileEntityDispenser.patch +++ /dev/null @@ -1,64 +0,0 @@ ---- a/net/minecraft/server/TileEntityDispenser.java -+++ b/net/minecraft/server/TileEntityDispenser.java -@@ -2,12 +2,44 @@ - - import java.util.Random; - -+// CraftBukkit start -+import java.util.List; -+ -+import org.bukkit.craftbukkit.entity.CraftHumanEntity; -+import org.bukkit.entity.HumanEntity; -+// CraftBukkit end -+ - public class TileEntityDispenser extends TileEntityContainer implements IInventory { - - private static final Random f = new Random(); - private ItemStack[] items = new ItemStack[9]; - protected String a; - -+ // CraftBukkit start - add fields and methods -+ public List transaction = new java.util.ArrayList(); -+ private int maxStack = MAX_STACK; -+ -+ public ItemStack[] getContents() { -+ return this.items; -+ } -+ -+ public void onOpen(CraftHumanEntity who) { -+ transaction.add(who); -+ } -+ -+ public void onClose(CraftHumanEntity who) { -+ transaction.remove(who); -+ } -+ -+ public List getViewers() { -+ return transaction; -+ } -+ -+ public void setMaxStackSize(int size) { -+ maxStack = size; -+ } -+ // CraftBukkit end -+ - public TileEntityDispenser() {} - - public int getSize() { -@@ -58,6 +90,7 @@ - - for (int k = 0; k < this.items.length; ++k) { - if (this.items[k] != null && TileEntityDispenser.f.nextInt(j++) == 0) { -+ if (this.items[k].count == 0) continue; // CraftBukkit - i = k; - } - } -@@ -140,7 +173,7 @@ - } - - public int getMaxStackSize() { -- return 64; -+ return maxStack; // CraftBukkit - } - - public boolean a(EntityHuman entityhuman) { diff --git a/TacoSpigot-Server/nms-patches/TileEntityFurnace.patch b/TacoSpigot-Server/nms-patches/TileEntityFurnace.patch deleted file mode 100644 index 796d323..0000000 --- a/TacoSpigot-Server/nms-patches/TileEntityFurnace.patch +++ /dev/null @@ -1,188 +0,0 @@ ---- a/net/minecraft/server/TileEntityFurnace.java -+++ b/net/minecraft/server/TileEntityFurnace.java -@@ -1,5 +1,15 @@ - package net.minecraft.server; - -+// CraftBukkit start -+import java.util.List; -+ -+import org.bukkit.craftbukkit.inventory.CraftItemStack; -+import org.bukkit.entity.HumanEntity; -+import org.bukkit.event.inventory.FurnaceBurnEvent; -+import org.bukkit.event.inventory.FurnaceSmeltEvent; -+import org.bukkit.craftbukkit.entity.CraftHumanEntity; -+// CraftBukkit end -+ - public class TileEntityFurnace extends TileEntityContainer implements IUpdatePlayerListBox, IWorldInventory { - - private static final int[] a = new int[] { 0}; -@@ -12,6 +22,32 @@ - private int cookTimeTotal; - private String m; - -+ // CraftBukkit start - add fields and methods -+ private int lastTick = MinecraftServer.currentTick; -+ private int maxStack = MAX_STACK; -+ public List transaction = new java.util.ArrayList(); -+ -+ public ItemStack[] getContents() { -+ return this.items; -+ } -+ -+ public void onOpen(CraftHumanEntity who) { -+ transaction.add(who); -+ } -+ -+ public void onClose(CraftHumanEntity who) { -+ transaction.remove(who); -+ } -+ -+ public List getViewers() { -+ return transaction; -+ } -+ -+ public void setMaxStackSize(int size) { -+ maxStack = size; -+ } -+ // CraftBukkit end -+ - public TileEntityFurnace() {} - - public int getSize() { -@@ -132,7 +168,7 @@ - } - - public int getMaxStackSize() { -- return 64; -+ return maxStack; // CraftBukkit - } - - public boolean isBurning() { -@@ -140,11 +176,29 @@ - } - - public void c() { -- boolean flag = this.isBurning(); -+ boolean flag = (this.w() == Blocks.LIT_FURNACE); // CraftBukkit - SPIGOT-844 - Check if furnace block is lit using the block instead of burn time // PAIL: Rename - boolean flag1 = false; - -+ // CraftBukkit start - Use wall time instead of ticks for cooking -+ int elapsedTicks = MinecraftServer.currentTick - this.lastTick; -+ this.lastTick = MinecraftServer.currentTick; -+ -+ // CraftBukkit - moved from below -+ if (this.isBurning() && this.canBurn()) { -+ this.cookTime += elapsedTicks; -+ if (this.cookTime >= this.cookTimeTotal) { -+ this.cookTime = 0; -+ this.cookTimeTotal = this.a(this.items[0]); -+ this.burn(); -+ flag1 = true; -+ } -+ } else { -+ this.cookTime = 0; -+ } -+ // CraftBukkit end -+ - if (this.isBurning()) { -- --this.burnTime; -+ this.burnTime -= elapsedTicks; // CraftBukkit - use elapsedTicks in place of constant - } - - if (!this.world.isClientSide) { -@@ -153,9 +207,21 @@ - this.cookTime = MathHelper.clamp(this.cookTime - 2, 0, this.cookTimeTotal); - } - } else { -- if (!this.isBurning() && this.canBurn()) { -- this.ticksForCurrentFuel = this.burnTime = fuelTime(this.items[1]); -- if (this.isBurning()) { -+ // CraftBukkit start - Handle multiple elapsed ticks -+ if (this.burnTime <= 0 && this.canBurn()) { // CraftBukkit - == to <= -+ CraftItemStack fuel = CraftItemStack.asCraftMirror(this.items[1]); -+ -+ FurnaceBurnEvent furnaceBurnEvent = new FurnaceBurnEvent(this.world.getWorld().getBlockAt(position.getX(), position.getY(), position.getZ()), fuel, fuelTime(this.items[1])); -+ this.world.getServer().getPluginManager().callEvent(furnaceBurnEvent); -+ -+ if (furnaceBurnEvent.isCancelled()) { -+ return; -+ } -+ -+ this.ticksForCurrentFuel = furnaceBurnEvent.getBurnTime(); -+ this.burnTime += this.ticksForCurrentFuel; -+ if (this.burnTime > 0 && furnaceBurnEvent.isBurning()) { -+ // CraftBukkit end - flag1 = true; - if (this.items[1] != null) { - --this.items[1].count; -@@ -168,6 +234,7 @@ - } - } - -+ /* CraftBukkit start - Moved up - if (this.isBurning() && this.canBurn()) { - ++this.cookTime; - if (this.cookTime == this.cookTimeTotal) { -@@ -179,11 +246,13 @@ - } else { - this.cookTime = 0; - } -+ */ - } - - if (flag != this.isBurning()) { - flag1 = true; - BlockFurnace.a(this.isBurning(), this.world, this.position); -+ this.E(); // CraftBukkit - Invalidate tile entity's cached block type // PAIL: Rename - } - } - -@@ -203,7 +272,8 @@ - } else { - ItemStack itemstack = RecipesFurnace.getInstance().getResult(this.items[0]); - -- return itemstack == null ? false : (this.items[2] == null ? true : (!this.items[2].doMaterialsMatch(itemstack) ? false : (this.items[2].count < this.getMaxStackSize() && this.items[2].count < this.items[2].getMaxStackSize() ? true : this.items[2].count < itemstack.getMaxStackSize()))); -+ // CraftBukkit - consider resultant count instead of current count -+ return itemstack == null ? false : (this.items[2] == null ? true : (!this.items[2].doMaterialsMatch(itemstack) ? false : (this.items[2].count + itemstack.count <= this.getMaxStackSize() && this.items[2].count < this.items[2].getMaxStackSize() ? true : this.items[2].count + itemstack.count <= itemstack.getMaxStackSize()))); - } - } - -@@ -211,11 +281,38 @@ - if (this.canBurn()) { - ItemStack itemstack = RecipesFurnace.getInstance().getResult(this.items[0]); - -+ // CraftBukkit start - fire FurnaceSmeltEvent -+ CraftItemStack source = CraftItemStack.asCraftMirror(this.items[0]); -+ org.bukkit.inventory.ItemStack result = CraftItemStack.asBukkitCopy(itemstack); -+ -+ FurnaceSmeltEvent furnaceSmeltEvent = new FurnaceSmeltEvent(this.world.getWorld().getBlockAt(position.getX(), position.getY(), position.getZ()), source, result); -+ this.world.getServer().getPluginManager().callEvent(furnaceSmeltEvent); -+ -+ if (furnaceSmeltEvent.isCancelled()) { -+ return; -+ } -+ -+ result = furnaceSmeltEvent.getResult(); -+ itemstack = CraftItemStack.asNMSCopy(result); -+ -+ if (itemstack != null) { -+ if (this.items[2] == null) { -+ this.items[2] = itemstack; -+ } else if (CraftItemStack.asCraftMirror(this.items[2]).isSimilar(result)) { -+ this.items[2].count += itemstack.count; -+ } else { -+ return; -+ } -+ } -+ -+ /* - if (this.items[2] == null) { - this.items[2] = itemstack.cloneItemStack(); - } else if (this.items[2].getItem() == itemstack.getItem()) { - ++this.items[2].count; - } -+ */ -+ // CraftBukkit end - - if (this.items[0].getItem() == Item.getItemOf(Blocks.SPONGE) && this.items[0].getData() == 1 && this.items[1] != null && this.items[1].getItem() == Items.BUCKET) { - this.items[1] = new ItemStack(Items.WATER_BUCKET); diff --git a/TacoSpigot-Server/nms-patches/TileEntityHopper.patch b/TacoSpigot-Server/nms-patches/TileEntityHopper.patch deleted file mode 100644 index e3ed30c..0000000 --- a/TacoSpigot-Server/nms-patches/TileEntityHopper.patch +++ /dev/null @@ -1,154 +0,0 @@ ---- a/net/minecraft/server/TileEntityHopper.java -+++ b/net/minecraft/server/TileEntityHopper.java -@@ -3,12 +3,46 @@ - import java.util.Iterator; - import java.util.List; - -+// CraftBukkit start -+import org.bukkit.craftbukkit.entity.CraftHumanEntity; -+import org.bukkit.craftbukkit.inventory.CraftItemStack; -+import org.bukkit.entity.HumanEntity; -+import org.bukkit.event.inventory.InventoryMoveItemEvent; -+import org.bukkit.event.inventory.InventoryPickupItemEvent; -+import org.bukkit.inventory.Inventory; -+// CraftBukkit end -+ - public class TileEntityHopper extends TileEntityContainer implements IHopper, IUpdatePlayerListBox { - - private ItemStack[] items = new ItemStack[5]; - private String f; - private int g = -1; - -+ // CraftBukkit start - add fields and methods -+ public List transaction = new java.util.ArrayList(); -+ private int maxStack = MAX_STACK; -+ -+ public ItemStack[] getContents() { -+ return this.items; -+ } -+ -+ public void onOpen(CraftHumanEntity who) { -+ transaction.add(who); -+ } -+ -+ public void onClose(CraftHumanEntity who) { -+ transaction.remove(who); -+ } -+ -+ public List getViewers() { -+ return transaction; -+ } -+ -+ public void setMaxStackSize(int size) { -+ maxStack = size; -+ } -+ // CraftBukkit end -+ - public TileEntityHopper() {} - - public void a(NBTTagCompound nbttagcompound) { -@@ -120,7 +154,7 @@ - } - - public int getMaxStackSize() { -- return 64; -+ return maxStack; // CraftBukkit - } - - public boolean a(EntityHuman entityhuman) { -@@ -216,10 +250,35 @@ - for (int i = 0; i < this.getSize(); ++i) { - if (this.getItem(i) != null) { - ItemStack itemstack = this.getItem(i).cloneItemStack(); -- ItemStack itemstack1 = addItem(iinventory, this.splitStack(i, 1), enumdirection); -+ // ItemStack itemstack1 = addItem(iinventory, this.splitStack(i, 1), enumdirection); -+ -+ // CraftBukkit start - Call event when pushing items into other inventories -+ CraftItemStack oitemstack = CraftItemStack.asCraftMirror(this.splitStack(i, 1)); -+ -+ Inventory destinationInventory; -+ // Have to special case large chests as they work oddly -+ if (iinventory instanceof InventoryLargeChest) { -+ destinationInventory = new org.bukkit.craftbukkit.inventory.CraftInventoryDoubleChest((InventoryLargeChest) iinventory); -+ } else { -+ destinationInventory = iinventory.getOwner().getInventory(); -+ } -+ -+ InventoryMoveItemEvent event = new InventoryMoveItemEvent(this.getOwner().getInventory(), oitemstack.clone(), destinationInventory, true); -+ this.getWorld().getServer().getPluginManager().callEvent(event); -+ if (event.isCancelled()) { -+ this.setItem(i, itemstack); -+ this.d(8); // Delay hopper checks -+ return false; -+ } -+ ItemStack itemstack1 = addItem(iinventory, CraftItemStack.asNMSCopy(event.getItem()), enumdirection); - - if (itemstack1 == null || itemstack1.count == 0) { -- iinventory.update(); -+ if (event.getItem().equals(oitemstack)) { -+ iinventory.update(); -+ } else { -+ this.setItem(i, itemstack); -+ } -+ // CraftBukkit end - return true; - } - -@@ -330,10 +389,41 @@ - - if (itemstack != null && b(iinventory, itemstack, i, enumdirection)) { - ItemStack itemstack1 = itemstack.cloneItemStack(); -- ItemStack itemstack2 = addItem(ihopper, iinventory.splitStack(i, 1), (EnumDirection) null); -+ // ItemStack itemstack2 = addItem(ihopper, iinventory.splitStack(i, 1), (EnumDirection) null); -+ // CraftBukkit start - Call event on collection of items from inventories into the hopper -+ CraftItemStack oitemstack = CraftItemStack.asCraftMirror(iinventory.splitStack(i, 1)); -+ -+ Inventory sourceInventory; -+ // Have to special case large chests as they work oddly -+ if (iinventory instanceof InventoryLargeChest) { -+ sourceInventory = new org.bukkit.craftbukkit.inventory.CraftInventoryDoubleChest((InventoryLargeChest) iinventory); -+ } else { -+ sourceInventory = iinventory.getOwner().getInventory(); -+ } -+ -+ InventoryMoveItemEvent event = new InventoryMoveItemEvent(sourceInventory, oitemstack.clone(), ihopper.getOwner().getInventory(), false); -+ -+ ihopper.getWorld().getServer().getPluginManager().callEvent(event); -+ if (event.isCancelled()) { -+ iinventory.setItem(i, itemstack1); -+ -+ if (ihopper instanceof TileEntityHopper) { -+ ((TileEntityHopper) ihopper).d(8); // Delay hopper checks -+ } else if (ihopper instanceof EntityMinecartHopper) { -+ ((EntityMinecartHopper) ihopper).m(4); // Delay hopper minecart checks -+ } -+ -+ return false; -+ } -+ ItemStack itemstack2 = addItem(ihopper, CraftItemStack.asNMSCopy(event.getItem()), null); - - if (itemstack2 == null || itemstack2.count == 0) { -- iinventory.update(); -+ if (event.getItem().equals(oitemstack)) { -+ iinventory.update(); -+ } else { -+ iinventory.setItem(i, itemstack1); -+ } -+ // CraftBukkit end - return true; - } - -@@ -349,6 +439,13 @@ - if (entityitem == null) { - return false; - } else { -+ // CraftBukkit start -+ InventoryPickupItemEvent event = new InventoryPickupItemEvent(iinventory.getOwner().getInventory(), (org.bukkit.entity.Item) entityitem.getBukkitEntity()); -+ entityitem.world.getServer().getPluginManager().callEvent(event); -+ if (event.isCancelled()) { -+ return false; -+ } -+ // CraftBukkit end - ItemStack itemstack = entityitem.getItemStack().cloneItemStack(); - ItemStack itemstack1 = addItem(iinventory, itemstack, (EnumDirection) null); - diff --git a/TacoSpigot-Server/nms-patches/TileEntityNote.patch b/TacoSpigot-Server/nms-patches/TileEntityNote.patch deleted file mode 100644 index 3e969b7..0000000 --- a/TacoSpigot-Server/nms-patches/TileEntityNote.patch +++ /dev/null @@ -1,16 +0,0 @@ ---- a/net/minecraft/server/TileEntityNote.java -+++ b/net/minecraft/server/TileEntityNote.java -@@ -44,7 +44,12 @@ - b0 = 4; - } - -- world.playBlockAction(blockposition, Blocks.NOTEBLOCK, b0, this.note); -+ // CraftBukkit start -+ org.bukkit.event.block.NotePlayEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callNotePlayEvent(this.world, blockposition.getX(), blockposition.getY(), blockposition.getZ(), b0, this.note); -+ if (!event.isCancelled()) { -+ world.playBlockAction(blockposition, Blocks.NOTEBLOCK, event.getInstrument().getType(), event.getNote().getId()); -+ } -+ // CraftBukkit end - } - } - } diff --git a/TacoSpigot-Server/nms-patches/TileEntityPiston.patch b/TacoSpigot-Server/nms-patches/TileEntityPiston.patch deleted file mode 100644 index 6e1f13a..0000000 --- a/TacoSpigot-Server/nms-patches/TileEntityPiston.patch +++ /dev/null @@ -1,10 +0,0 @@ ---- a/net/minecraft/server/TileEntityPiston.java -+++ b/net/minecraft/server/TileEntityPiston.java -@@ -104,6 +104,7 @@ - } - - public void c() { -+ if (this.world == null) return; // CraftBukkit - this.j = this.i; - if (this.j >= 1.0F) { - this.a(1.0F, 0.25F); diff --git a/TacoSpigot-Server/nms-patches/TileEntitySign.patch b/TacoSpigot-Server/nms-patches/TileEntitySign.patch deleted file mode 100644 index e03d670..0000000 --- a/TacoSpigot-Server/nms-patches/TileEntitySign.patch +++ /dev/null @@ -1,55 +0,0 @@ ---- a/net/minecraft/server/TileEntitySign.java -+++ b/net/minecraft/server/TileEntitySign.java -@@ -21,6 +21,12 @@ - nbttagcompound.setString("Text" + (i + 1), s); - } - -+ // CraftBukkit start -+ if (Boolean.getBoolean("convertLegacySigns")) { -+ nbttagcompound.setBoolean("Bukkit.isConverted", true); -+ } -+ // CraftBukkit end -+ - this.i.b(nbttagcompound); - } - -@@ -65,12 +71,27 @@ - public void a(CommandObjectiveExecutor.EnumCommandResult commandobjectiveexecutor_enumcommandresult, int i) {} - }; - -+ // CraftBukkit start - Add an option to convert signs correctly -+ // This is done with a flag instead of all the time because -+ // we have no way to tell whether a sign is from 1.7.10 or 1.8 -+ -+ boolean oldSign = Boolean.getBoolean("convertLegacySigns") && !nbttagcompound.getBoolean("Bukkit.isConverted"); -+ - for (int i = 0; i < 4; ++i) { - String s = nbttagcompound.getString("Text" + (i + 1)); -+ if (s != null && s.length() > 2048) { -+ s = "\"\""; -+ } - - try { - IChatBaseComponent ichatbasecomponent = IChatBaseComponent.ChatSerializer.a(s); - -+ if (oldSign) { -+ lines[i] = org.bukkit.craftbukkit.util.CraftChatMessage.fromString(s)[0]; -+ continue; -+ } -+ // CraftBukkit end -+ - try { - this.lines[i] = ChatComponentUtils.filterForDisplay(icommandlistener, ichatbasecomponent, (Entity) null); - } catch (CommandException commandexception) { -@@ -155,7 +176,10 @@ - ChatClickable chatclickable = chatmodifier.h(); - - if (chatclickable.a() == ChatClickable.EnumClickAction.RUN_COMMAND) { -- MinecraftServer.getServer().getCommandHandler().a(icommandlistener, chatclickable.b()); -+ // CraftBukkit start -+ // MinecraftServer.getServer().getCommandHandler().a(tileentitysignplayerwrapper, chatclickable.b()); -+ CommandBlockListenerAbstract.executeCommand(entityhuman, (org.bukkit.entity.Player) entityhuman.getBukkitEntity(), chatclickable.b()); -+ // CraftBukkit end - } - } - } diff --git a/TacoSpigot-Server/nms-patches/TileEntitySkull.patch b/TacoSpigot-Server/nms-patches/TileEntitySkull.patch deleted file mode 100644 index c420196..0000000 --- a/TacoSpigot-Server/nms-patches/TileEntitySkull.patch +++ /dev/null @@ -1,13 +0,0 @@ ---- a/net/minecraft/server/TileEntitySkull.java -+++ b/net/minecraft/server/TileEntitySkull.java -@@ -105,4 +105,10 @@ - public void setRotation(int i) { - this.rotation = i; - } -+ -+ // CraftBukkit start - add method -+ public int getRotation() { -+ return this.rotation; -+ } -+ // CraftBukkit end - } diff --git a/TacoSpigot-Server/nms-patches/UserCache.patch b/TacoSpigot-Server/nms-patches/UserCache.patch deleted file mode 100644 index 1433fce..0000000 --- a/TacoSpigot-Server/nms-patches/UserCache.patch +++ /dev/null @@ -1,25 +0,0 @@ ---- a/net/minecraft/server/UserCache.java -+++ b/net/minecraft/server/UserCache.java -@@ -42,7 +42,7 @@ - public static final SimpleDateFormat a = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss Z"); - private final Map c = Maps.newHashMap(); - private final Map d = Maps.newHashMap(); -- private final LinkedList e = Lists.newLinkedList(); -+ private final java.util.Deque e = new java.util.concurrent.LinkedBlockingDeque(); // CraftBukkit - private final MinecraftServer f; - protected final Gson b; - private final File g; -@@ -323,11 +323,11 @@ - } - } - -- public JsonElement serialize(Object object, Type type, JsonSerializationContext jsonserializationcontext) { -+ public JsonElement serialize(UserCacheEntry object, Type type, JsonSerializationContext jsonserializationcontext) { // CraftBukkit - decompile error - return this.a((UserCache.UserCacheEntry) object, type, jsonserializationcontext); - } - -- public Object deserialize(JsonElement jsonelement, Type type, JsonDeserializationContext jsondeserializationcontext) throws JsonParseException { -+ public UserCacheEntry deserialize(JsonElement jsonelement, Type type, JsonDeserializationContext jsondeserializationcontext) throws JsonParseException { // CraftBukkit - decompile error - return this.a(jsonelement, type, jsondeserializationcontext); - } - diff --git a/TacoSpigot-Server/nms-patches/Village.patch b/TacoSpigot-Server/nms-patches/Village.patch deleted file mode 100644 index ee57a43..0000000 --- a/TacoSpigot-Server/nms-patches/Village.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- a/net/minecraft/server/Village.java -+++ b/net/minecraft/server/Village.java -@@ -62,7 +62,7 @@ - EntityIronGolem entityirongolem = new EntityIronGolem(this.a); - - entityirongolem.setPosition(vec3d.a, vec3d.b, vec3d.c); -- this.a.addEntity(entityirongolem); -+ this.a.addEntity(entityirongolem, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.VILLAGE_DEFENSE); // CraftBukkit - ++this.l; - } - } diff --git a/TacoSpigot-Server/nms-patches/VillageSiege.patch b/TacoSpigot-Server/nms-patches/VillageSiege.patch deleted file mode 100644 index 9b174ab..0000000 --- a/TacoSpigot-Server/nms-patches/VillageSiege.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- a/net/minecraft/server/VillageSiege.java -+++ b/net/minecraft/server/VillageSiege.java -@@ -140,7 +140,7 @@ - } - - entityzombie.setPositionRotation(vec3d.a, vec3d.b, vec3d.c, this.a.random.nextFloat() * 360.0F, 0.0F); -- this.a.addEntity(entityzombie); -+ this.a.addEntity(entityzombie, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.VILLAGE_INVASION); // CraftBukkit - BlockPosition blockposition = this.f.a(); - - entityzombie.a(blockposition, this.f.b()); diff --git a/TacoSpigot-Server/nms-patches/World.patch b/TacoSpigot-Server/nms-patches/World.patch deleted file mode 100644 index 484a9e0..0000000 --- a/TacoSpigot-Server/nms-patches/World.patch +++ /dev/null @@ -1,654 +0,0 @@ ---- a/net/minecraft/server/World.java -+++ b/net/minecraft/server/World.java -@@ -13,6 +13,25 @@ - import java.util.UUID; - import java.util.concurrent.Callable; - -+// CraftBukkit start -+import com.google.common.collect.Maps; -+import java.util.Map; -+ -+import org.bukkit.Bukkit; -+import org.bukkit.block.BlockState; -+import org.bukkit.craftbukkit.util.CraftMagicNumbers; -+import org.bukkit.craftbukkit.util.LongHashSet; -+import org.bukkit.generator.ChunkGenerator; -+import org.bukkit.craftbukkit.CraftServer; -+import org.bukkit.craftbukkit.CraftWorld; -+import org.bukkit.craftbukkit.event.CraftEventFactory; -+import org.bukkit.event.block.BlockCanBuildEvent; -+import org.bukkit.event.block.BlockPhysicsEvent; -+import org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason; -+import org.bukkit.event.weather.WeatherChangeEvent; -+import org.bukkit.event.weather.ThunderChangeEvent; -+// CraftBukkit end -+ - public abstract class World implements IBlockAccess { - - private int a = 63; -@@ -36,27 +55,72 @@ - protected float r; - private int J; - public final Random random = new Random(); -- public final WorldProvider worldProvider; -+ public WorldProvider worldProvider; // CraftBukkit - remove final - protected List u = Lists.newArrayList(); - protected IChunkProvider chunkProvider; - protected final IDataManager dataManager; -- protected WorldData worldData; -+ public WorldData worldData; // CraftBukkit - public - protected boolean isLoading; -- protected PersistentCollection worldMaps; -+ public PersistentCollection worldMaps; // CraftBukkit - public - protected PersistentVillage villages; - public final MethodProfiler methodProfiler; - private final Calendar K = Calendar.getInstance(); -- protected Scoreboard scoreboard = new Scoreboard(); -+ public Scoreboard scoreboard = new Scoreboard(); // CraftBukkit - public - public final boolean isClientSide; -- protected Set chunkTickList = Sets.newHashSet(); -+ // CraftBukkit - longhashset -+ protected LongHashSet chunkTickList = new LongHashSet(); - private int L; -- protected boolean allowMonsters; -- protected boolean allowAnimals; -+ public boolean allowMonsters; // CraftBukkit - public -+ public boolean allowAnimals; // CraftBukkit - public - private boolean M; - private final WorldBorder N; - int[] H; - -- protected World(IDataManager idatamanager, WorldData worlddata, WorldProvider worldprovider, MethodProfiler methodprofiler, boolean flag) { -+ // CraftBukkit start Added the following -+ private final CraftWorld world; -+ public boolean pvpMode; -+ public boolean keepSpawnInMemory = true; -+ public ChunkGenerator generator; -+ -+ public boolean captureBlockStates = false; -+ public boolean captureTreeGeneration = false; -+ public ArrayList capturedBlockStates= new ArrayList(){ -+ @Override -+ public boolean add( BlockState blockState ) { -+ Iterator blockStateIterator = this.iterator(); -+ while( blockStateIterator.hasNext() ) { -+ BlockState blockState1 = blockStateIterator.next(); -+ if ( blockState1.getLocation().equals( blockState.getLocation() ) ) { -+ return false; -+ } -+ } -+ -+ return super.add( blockState ); -+ } -+ }; -+ public long ticksPerAnimalSpawns; -+ public long ticksPerMonsterSpawns; -+ public boolean populating; -+ private int tickPosition; -+ -+ public CraftWorld getWorld() { -+ return this.world; -+ } -+ -+ public CraftServer getServer() { -+ return (CraftServer) Bukkit.getServer(); -+ } -+ -+ public Chunk getChunkIfLoaded(int x, int z) { -+ return ((ChunkProviderServer) this.chunkProvider).getChunkIfLoaded(x, z); -+ } -+ -+ protected World(IDataManager idatamanager, WorldData worlddata, WorldProvider worldprovider, MethodProfiler methodprofiler, boolean flag, ChunkGenerator gen, org.bukkit.World.Environment env) { -+ this.generator = gen; -+ this.world = new CraftWorld((WorldServer) this, gen, env); -+ this.ticksPerAnimalSpawns = this.getServer().getTicksPerAnimalSpawns(); // CraftBukkit -+ this.ticksPerMonsterSpawns = this.getServer().getTicksPerMonsterSpawns(); // CraftBukkit -+ // CraftBukkit end - this.L = this.random.nextInt(12000); - this.allowMonsters = true; - this.allowAnimals = true; -@@ -67,6 +131,35 @@ - this.worldProvider = worldprovider; - this.isClientSide = flag; - this.N = worldprovider.getWorldBorder(); -+ // CraftBukkit start -+ // Moved from PlayerList -+ this.N.a(new IWorldBorderListener() { -+ public void a(WorldBorder worldborder, double d0) { -+ getServer().getHandle().sendAll(new PacketPlayOutWorldBorder(worldborder, PacketPlayOutWorldBorder.EnumWorldBorderAction.SET_SIZE), World.this); -+ } -+ -+ public void a(WorldBorder worldborder, double d0, double d1, long i) { -+ getServer().getHandle().sendAll(new PacketPlayOutWorldBorder(worldborder, PacketPlayOutWorldBorder.EnumWorldBorderAction.LERP_SIZE), World.this); -+ } -+ -+ public void a(WorldBorder worldborder, double d0, double d1) { -+ getServer().getHandle().sendAll(new PacketPlayOutWorldBorder(worldborder, PacketPlayOutWorldBorder.EnumWorldBorderAction.SET_CENTER), World.this); -+ } -+ -+ public void a(WorldBorder worldborder, int i) { -+ getServer().getHandle().sendAll(new PacketPlayOutWorldBorder(worldborder, PacketPlayOutWorldBorder.EnumWorldBorderAction.SET_WARNING_TIME), World.this); -+ } -+ -+ public void b(WorldBorder worldborder, int i) { -+ getServer().getHandle().sendAll(new PacketPlayOutWorldBorder(worldborder, PacketPlayOutWorldBorder.EnumWorldBorderAction.SET_WARNING_BLOCKS), World.this); -+ } -+ -+ public void b(WorldBorder worldborder, double d0) {} -+ -+ public void c(WorldBorder worldborder, double d0) {} -+ }); -+ this.getServer().addWorld(this.world); -+ // CraftBukkit end - } - - public World b() { -@@ -193,6 +286,27 @@ - } - - public boolean setTypeAndData(BlockPosition blockposition, IBlockData iblockdata, int i) { -+ // CraftBukkit start - tree generation -+ if (this.captureTreeGeneration) { -+ BlockState blockstate = null; -+ Iterator it = capturedBlockStates.iterator(); -+ while (it.hasNext()) { -+ BlockState previous = it.next(); -+ if (previous.getX() == blockposition.getX() && previous.getY() == blockposition.getY() && previous.getZ() == blockposition.getZ()) { -+ blockstate = previous; -+ it.remove(); -+ break; -+ } -+ } -+ if (blockstate == null) { -+ blockstate = org.bukkit.craftbukkit.block.CraftBlockState.getBlockState(this, blockposition.getX(), blockposition.getY(), blockposition.getZ(), i); -+ } -+ blockstate.setTypeId(CraftMagicNumbers.getId(iblockdata.getBlock())); -+ blockstate.setRawData((byte) iblockdata.getBlock().toLegacyData(iblockdata)); -+ this.capturedBlockStates.add(blockstate); -+ return true; -+ } -+ // CraftBukkit end - if (!this.isValidLocation(blockposition)) { - return false; - } else if (!this.isClientSide && this.worldData.getType() == WorldType.DEBUG_ALL_BLOCK_STATES) { -@@ -200,9 +314,23 @@ - } else { - Chunk chunk = this.getChunkAtWorldCoords(blockposition); - Block block = iblockdata.getBlock(); -+ -+ // CraftBukkit start - capture blockstates -+ BlockState blockstate = null; -+ if (this.captureBlockStates) { -+ blockstate = org.bukkit.craftbukkit.block.CraftBlockState.getBlockState(this, blockposition.getX(), blockposition.getY(), blockposition.getZ(), i); -+ this.capturedBlockStates.add(blockstate); -+ } -+ // CraftBukkit end -+ - IBlockData iblockdata1 = chunk.a(blockposition, iblockdata); - - if (iblockdata1 == null) { -+ // CraftBukkit start - remove blockstate if failed -+ if (this.captureBlockStates) { -+ this.capturedBlockStates.remove(blockstate); -+ } -+ // CraftBukkit end - return false; - } else { - Block block1 = iblockdata1.getBlock(); -@@ -213,6 +341,7 @@ - this.methodProfiler.b(); - } - -+ /* - if ((i & 2) != 0 && (!this.isClientSide || (i & 4) == 0) && chunk.isReady()) { - this.notify(blockposition); - } -@@ -223,12 +352,35 @@ - this.updateAdjacentComparators(blockposition, block); - } - } -+ */ -+ -+ // CraftBukkit start -+ if (!this.captureBlockStates) { // Don't notify clients or update physics while capturing blockstates -+ // Modularize client and physic updates -+ notifyAndUpdatePhysics(blockposition, chunk, block1, block, i); -+ } -+ // CraftBukkit end - - return true; - } - } - } - -+ // CraftBukkit start - Split off from original setTypeAndData(int i, int j, int k, Block block, int l, int i1) method in order to directly send client and physic updates -+ public void notifyAndUpdatePhysics(BlockPosition blockposition, Chunk chunk, Block oldBlock, Block newBLock, int flag) { -+ if ((flag & 2) != 0 && (chunk == null || chunk.isReady())) { // allow chunk to be null here as chunk.isReady() is false when we send our notification during block placement -+ this.notify(blockposition); -+ } -+ -+ if (!this.isClientSide && (flag & 1) != 0) { -+ this.update(blockposition, oldBlock); -+ if (newBLock.isComplexRedstone()) { -+ this.updateAdjacentComparators(blockposition, newBLock); -+ } -+ } -+ } -+ // CraftBukkit end -+ - public boolean setAir(BlockPosition blockposition) { - return this.setTypeAndData(blockposition, Blocks.AIR.getBlockData(), 3); - } -@@ -262,6 +414,11 @@ - - public void update(BlockPosition blockposition, Block block) { - if (this.worldData.getType() != WorldType.DEBUG_ALL_BLOCK_STATES) { -+ // CraftBukkit start -+ if (populating) { -+ return; -+ } -+ // CraftBukkit end - this.applyPhysics(blockposition, block); - } - -@@ -337,6 +494,17 @@ - IBlockData iblockdata = this.getType(blockposition); - - try { -+ // CraftBukkit start -+ CraftWorld world = ((WorldServer) this).getWorld(); -+ if (world != null) { -+ BlockPhysicsEvent event = new BlockPhysicsEvent(world.getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ()), CraftMagicNumbers.getId(block)); -+ this.getServer().getPluginManager().callEvent(event); -+ -+ if (event.isCancelled()) { -+ return; -+ } -+ } -+ // CraftBukkit end - iblockdata.getBlock().doPhysics(this, blockposition, iblockdata, block); - } catch (Throwable throwable) { - CrashReport crashreport = CrashReport.a(throwable, "Exception while updating neighbours"); -@@ -518,6 +686,17 @@ - } - - public IBlockData getType(BlockPosition blockposition) { -+ // CraftBukkit start - tree generation -+ if (captureTreeGeneration) { -+ Iterator it = capturedBlockStates.iterator(); -+ while (it.hasNext()) { -+ BlockState previous = it.next(); -+ if (previous.getX() == blockposition.getX() && previous.getY() == blockposition.getY() && previous.getZ() == blockposition.getZ()) { -+ return CraftMagicNumbers.getBlock(previous.getTypeId()).fromLegacyData(previous.getRawData()); -+ } -+ } -+ } -+ // CraftBukkit end - if (!this.isValidLocation(blockposition)) { - return Blocks.AIR.getBlockData(); - } else { -@@ -723,6 +902,13 @@ - } - - public boolean addEntity(Entity entity) { -+ // CraftBukkit start - Used for entities other than creatures -+ return addEntity(entity, SpawnReason.DEFAULT); -+ } -+ -+ public boolean addEntity(Entity entity, SpawnReason spawnReason) { // Changed signature, added SpawnReason -+ if (entity == null) return false; -+ // CraftBukkit end - int i = MathHelper.floor(entity.locX / 16.0D); - int j = MathHelper.floor(entity.locZ / 16.0D); - boolean flag = entity.attachedToPlayer; -@@ -731,7 +917,35 @@ - flag = true; - } - -+ // CraftBukkit start -+ org.bukkit.event.Cancellable event = null; -+ if (entity instanceof EntityLiving && !(entity instanceof EntityPlayer)) { -+ boolean isAnimal = entity instanceof EntityAnimal || entity instanceof EntityWaterAnimal || entity instanceof EntityGolem; -+ boolean isMonster = entity instanceof EntityMonster || entity instanceof EntityGhast || entity instanceof EntitySlime; -+ -+ if (spawnReason != SpawnReason.CUSTOM) { -+ if (isAnimal && !allowAnimals || isMonster && !allowMonsters) { -+ entity.dead = true; -+ return false; -+ } -+ } -+ -+ event = CraftEventFactory.callCreatureSpawnEvent((EntityLiving) entity, spawnReason); -+ } else if (entity instanceof EntityItem) { -+ event = CraftEventFactory.callItemSpawnEvent((EntityItem) entity); -+ } else if (entity.getBukkitEntity() instanceof org.bukkit.entity.Projectile) { -+ // Not all projectiles extend EntityProjectile, so check for Bukkit interface instead -+ event = CraftEventFactory.callProjectileLaunchEvent(entity); -+ } -+ -+ if (event != null && (event.isCancelled() || entity.dead)) { -+ entity.dead = true; -+ return false; -+ } -+ // CraftBukkit end -+ - if (!flag && !this.isChunkLoaded(i, j, true)) { -+ entity.dead = true; - return false; - } else { - if (entity instanceof EntityHuman) { -@@ -753,6 +967,7 @@ - ((IWorldAccess) this.u.get(i)).a(entity); - } - -+ entity.valid = true; // CraftBukkit - } - - protected void b(Entity entity) { -@@ -760,6 +975,7 @@ - ((IWorldAccess) this.u.get(i)).b(entity); - } - -+ entity.valid = false; // CraftBukkit - } - - public void kill(Entity entity) { -@@ -794,7 +1010,15 @@ - this.getChunkAt(i, j).b(entity); - } - -- this.entityList.remove(entity); -+ // CraftBukkit start - Decrement loop variable field if we've already ticked this entity -+ int index = this.entityList.indexOf(entity); -+ if (index != -1) { -+ if (index <= this.tickPosition) { -+ this.tickPosition--; -+ } -+ this.entityList.remove(index); -+ } -+ // CraftBukkit end - this.b(entity); - } - -@@ -978,6 +1202,11 @@ - - for (i = 0; i < this.k.size(); ++i) { - entity = (Entity) this.k.get(i); -+ // CraftBukkit start - Fixed an NPE -+ if (entity == null) { -+ continue; -+ } -+ // CraftBukkit end - - try { - ++entity.ticksLived; -@@ -1021,8 +1250,10 @@ - this.g.clear(); - this.methodProfiler.c("regular"); - -- for (i = 0; i < this.entityList.size(); ++i) { -- entity = (Entity) this.entityList.get(i); -+ // CraftBukkit start - Use field for loop variable -+ for (this.tickPosition = 0; this.tickPosition < this.entityList.size(); ++this.tickPosition) { -+ entity = (Entity) this.entityList.get(this.tickPosition); -+ // CraftBukkit end - if (entity.vehicle != null) { - if (!entity.vehicle.dead && entity.vehicle.passenger == entity) { - continue; -@@ -1053,7 +1284,7 @@ - this.getChunkAt(j, k).b(entity); - } - -- this.entityList.remove(i--); -+ this.entityList.remove(this.tickPosition--); // CraftBukkit - Use field for loop variable - this.b(entity); - } - -@@ -1062,6 +1293,13 @@ - - this.methodProfiler.c("blockEntities"); - this.M = true; -+ // CraftBukkit start - From below, clean up tile entities before ticking them -+ if (!this.c.isEmpty()) { -+ this.tileEntityList.removeAll(this.c); -+ this.h.removeAll(this.c); -+ this.c.clear(); -+ } -+ // CraftBukkit end - Iterator iterator = this.tileEntityList.iterator(); - - while (iterator.hasNext()) { -@@ -1093,11 +1331,13 @@ - } - - this.M = false; -+ /* CraftBukkit start - Moved up - if (!this.c.isEmpty()) { - this.tileEntityList.removeAll(this.c); - this.h.removeAll(this.c); - this.c.clear(); - } -+ // CraftBukkit end */ - - this.methodProfiler.c("pendingBlockEntities"); - if (!this.b.isEmpty()) { -@@ -1105,9 +1345,11 @@ - TileEntity tileentity1 = (TileEntity) this.b.get(l); - - if (!tileentity1.x()) { -+ /* CraftBukkit start - Order matters, moved down - if (!this.h.contains(tileentity1)) { - this.a(tileentity1); - } -+ // CraftBukkit end */ - - if (this.isLoaded(tileentity1.getPosition())) { - this.getChunkAtWorldCoords(tileentity1.getPosition()).a(tileentity1.getPosition(), tileentity1); -@@ -1161,7 +1403,10 @@ - int j = MathHelper.floor(entity.locZ); - byte b0 = 32; - -- if (!flag || this.isAreaLoaded(i - b0, 0, j - b0, i + b0, 0, j + b0, true)) { -+ // CraftBukkit start - Use neighbor cache instead of looking up -+ Chunk startingChunk = this.getChunkIfLoaded(i >> 4, j >> 4); -+ if (!flag || (startingChunk != null && startingChunk.areNeighborsLoaded(2)) /* this.isAreaLoaded(i - b0, 0, j - b0, i + b0, 0, j + b0) */) { -+ // CraftBukkit end - entity.P = entity.locX; - entity.Q = entity.locY; - entity.R = entity.locZ; -@@ -1479,10 +1724,18 @@ - } - } - -+ public Map capturedTileEntities = Maps.newHashMap(); -+ - public TileEntity getTileEntity(BlockPosition blockposition) { - if (!this.isValidLocation(blockposition)) { - return null; - } else { -+ // CraftBukkit start -+ if (capturedTileEntities.containsKey(blockposition)) { -+ return capturedTileEntities.get(blockposition); -+ } -+ // CraftBukkit end -+ - TileEntity tileentity = null; - int i; - TileEntity tileentity1; -@@ -1517,6 +1770,14 @@ - - public void setTileEntity(BlockPosition blockposition, TileEntity tileentity) { - if (tileentity != null && !tileentity.x()) { -+ // CraftBukkit start -+ if (captureBlockStates) { -+ tileentity.a(this); -+ tileentity.a(blockposition); -+ capturedTileEntities.put(blockposition, tileentity); -+ return; -+ } -+ // CraftBukkit end - if (this.M) { - tileentity.a(blockposition); - Iterator iterator = this.b.iterator(); -@@ -1679,12 +1940,20 @@ - } - - this.p = MathHelper.a(this.p, 0.0F, 1.0F); -+ -+ // CraftBukkit start -+ for (int idx = 0; idx < this.players.size(); ++idx) { -+ if (((EntityPlayer) this.players.get(idx)).world == this) { -+ ((EntityPlayer) this.players.get(idx)).tickWeather(); -+ } -+ } -+ // CraftBukkit end - } - } - } - - protected void D() { -- this.chunkTickList.clear(); -+ // this.chunkTickList.clear(); // CraftBukkit - removed - this.methodProfiler.a("buildList"); - - int i; -@@ -1701,7 +1970,7 @@ - - for (int i1 = -l; i1 <= l; ++i1) { - for (int j1 = -l; j1 <= l; ++j1) { -- this.chunkTickList.add(new ChunkCoordIntPair(i1 + j, j1 + k)); -+ this.chunkTickList.add(org.bukkit.craftbukkit.util.LongHash.toLong(i1 + j, j1 + k)); - } - } - } -@@ -1879,7 +2148,10 @@ - } - - public boolean c(EnumSkyBlock enumskyblock, BlockPosition blockposition) { -- if (!this.areChunksLoaded(blockposition, 17, false)) { -+ // CraftBukkit start - Use neighbor cache instead of looking up -+ Chunk chunk = this.getChunkIfLoaded(blockposition.getX() >> 4, blockposition.getZ() >> 4); -+ if (chunk == null || !chunk.areNeighborsLoaded(1) /*!this.areChunksLoaded(blockposition, 17, false)*/) { -+ // CraftBukkit end - return false; - } else { - int i = 0; -@@ -2042,7 +2314,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 - arraylist.add(entity); - } - } -@@ -2057,7 +2329,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 - arraylist.add(entity); - } - } -@@ -2105,7 +2377,7 @@ - } - } - -- return entity; -+ return (T) entity; // CraftBukkit fix decompile error - } - - public Entity a(int i) { -@@ -2125,8 +2397,17 @@ - - while (iterator.hasNext()) { - Entity entity = (Entity) iterator.next(); -- -- if ((!(entity instanceof EntityInsentient) || !((EntityInsentient) entity).isPersistent()) && oclass.isAssignableFrom(entity.getClass())) { -+ // CraftBukkit start - Split out persistent check, don't apply it to special persistent mobs -+ if (entity instanceof EntityInsentient) { -+ EntityInsentient entityinsentient = (EntityInsentient) entity; -+ if (entityinsentient.isTypeNotPersistent() && entityinsentient.isPersistent()) { -+ continue; -+ } -+ } -+ -+ if (oclass.isAssignableFrom(entity.getClass())) { -+ // if ((!(entity instanceof EntityInsentient) || !((EntityInsentient) entity).isPersistent()) && oclass.isAssignableFrom(entity.getClass())) { -+ // CraftBukkit end - ++i; - } - } -@@ -2135,12 +2416,18 @@ - } - - public void b(Collection collection) { -- this.entityList.addAll(collection); -+ // CraftBukkit start -+ // this.entityList.addAll(collection); - Iterator iterator = collection.iterator(); - - while (iterator.hasNext()) { - Entity entity = (Entity) iterator.next(); - -+ if (entity == null) { -+ continue; -+ } -+ this.entityList.add(entity); -+ // CraftBukkit end - this.a(entity); - } - -@@ -2154,7 +2441,13 @@ - Block block1 = this.getType(blockposition).getBlock(); - AxisAlignedBB axisalignedbb = flag ? null : block.a(this, blockposition, block.getBlockData()); - -- return axisalignedbb != null && !this.a(axisalignedbb, entity) ? false : (block1.getMaterial() == Material.ORIENTABLE && block == Blocks.ANVIL ? true : block1.getMaterial().isReplaceable() && block.canPlace(this, blockposition, enumdirection, itemstack)); -+ // CraftBukkit start - store default return -+ boolean defaultReturn = axisalignedbb != null && !this.a(axisalignedbb, entity) ? false : (block1.getMaterial() == Material.ORIENTABLE && block == Blocks.ANVIL ? true : block1.getMaterial().isReplaceable() && block.canPlace(this, blockposition, enumdirection, itemstack)); -+ BlockCanBuildEvent event = new BlockCanBuildEvent(this.getWorld().getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ()), CraftMagicNumbers.getId(block), defaultReturn); -+ this.getServer().getPluginManager().callEvent(event); -+ -+ return event.isBuildable(); -+ // CraftBukkit end - } - - public int F() { -@@ -2253,6 +2546,11 @@ - - for (int i = 0; i < this.players.size(); ++i) { - EntityHuman entityhuman1 = (EntityHuman) this.players.get(i); -+ // CraftBukkit start - Fixed an NPE -+ if (entityhuman1 == null || entityhuman1.dead) { -+ continue; -+ } -+ // CraftBukkit end - - if (IEntitySelector.d.apply(entityhuman1)) { - double d5 = entityhuman1.e(d0, d1, d2); -@@ -2369,6 +2667,16 @@ - - public void everyoneSleeping() {} - -+ // CraftBukkit start -+ // Calls the method that checks to see if players are sleeping -+ // Called by CraftPlayer.setPermanentSleeping() -+ public void checkSleepStatus() { -+ if (!this.isClientSide) { -+ this.everyoneSleeping(); -+ } -+ } -+ // CraftBukkit end -+ - public float h(float f) { - return (this.q + (this.r - this.q) * f) * this.j(f); - } -@@ -2592,6 +2900,6 @@ - int l = j * 16 + 8 - blockposition.getZ(); - short short0 = 128; - -- return k >= -short0 && k <= short0 && l >= -short0 && l <= short0; -+ return k >= -short0 && k <= short0 && l >= -short0 && l <= short0 && this.keepSpawnInMemory; // CraftBukkit - Added 'this.keepSpawnInMemory' - } - } diff --git a/TacoSpigot-Server/nms-patches/WorldBorder.patch b/TacoSpigot-Server/nms-patches/WorldBorder.patch deleted file mode 100644 index d40f879..0000000 --- a/TacoSpigot-Server/nms-patches/WorldBorder.patch +++ /dev/null @@ -1,39 +0,0 @@ ---- a/net/minecraft/server/WorldBorder.java -+++ b/net/minecraft/server/WorldBorder.java -@@ -18,6 +18,7 @@ - private double j; - private int k; - private int l; -+ public WorldServer world; // CraftBukkit - - public WorldBorder() { - this.e = this.d; -@@ -32,8 +33,19 @@ - return (double) (blockposition.getX() + 1) > this.b() && (double) blockposition.getX() < this.d() && (double) (blockposition.getZ() + 1) > this.c() && (double) blockposition.getZ() < this.e(); - } - -+ // CraftBukkit start - split method - public boolean isInBounds(ChunkCoordIntPair chunkcoordintpair) { -- return (double) chunkcoordintpair.e() > this.b() && (double) chunkcoordintpair.c() < this.d() && (double) chunkcoordintpair.f() > this.c() && (double) chunkcoordintpair.d() < this.e(); -+ return isInBounds(chunkcoordintpair.x, chunkcoordintpair.z); -+ } -+ -+ // Inlined the getters from ChunkCoordIntPair -+ public boolean isInBounds(long chunkcoords) { -+ return isInBounds(org.bukkit.craftbukkit.util.LongHash.msw(chunkcoords), org.bukkit.craftbukkit.util.LongHash.lsw(chunkcoords)); -+ } -+ -+ // Inlined the getters from ChunkCoordIntPair -+ public boolean isInBounds(int x, int z) { -+ return (double) ((x << 4) + 15) > this.b() && (double) (x << 4) < this.d() && (double) ((z << 4) + 15) > this.c() && (double) (x << 4) < this.e(); - } - - public boolean a(AxisAlignedBB axisalignedbb) { -@@ -177,6 +189,7 @@ - } - - public void a(IWorldBorderListener iworldborderlistener) { -+ if (a.contains(iworldborderlistener)) return; // CraftBukkit - this.a.add(iworldborderlistener); - } - diff --git a/TacoSpigot-Server/nms-patches/WorldData.patch b/TacoSpigot-Server/nms-patches/WorldData.patch deleted file mode 100644 index d225068..0000000 --- a/TacoSpigot-Server/nms-patches/WorldData.patch +++ /dev/null @@ -1,86 +0,0 @@ ---- a/net/minecraft/server/WorldData.java -+++ b/net/minecraft/server/WorldData.java -@@ -1,6 +1,11 @@ - package net.minecraft.server; - - import java.util.concurrent.Callable; -+// CraftBukkit start -+import org.bukkit.Bukkit; -+import org.bukkit.event.weather.ThunderChangeEvent; -+import org.bukkit.event.weather.WeatherChangeEvent; -+// CraftBukkit end - - public class WorldData { - -@@ -41,6 +46,7 @@ - private int I; - private int J; - private GameRules K; -+ public WorldServer world; // CraftBukkit - - protected WorldData() { - this.c = WorldType.NORMAL; -@@ -395,6 +401,18 @@ - } - - public void setThundering(boolean flag) { -+ // CraftBukkit start -+ org.bukkit.World world = Bukkit.getWorld(getName()); -+ if (world != null) { -+ ThunderChangeEvent thunder = new ThunderChangeEvent(world, flag); -+ Bukkit.getServer().getPluginManager().callEvent(thunder); -+ if (thunder.isCancelled()) { -+ return; -+ } -+ -+ setThunderDuration(0); // Will force a time reset -+ } -+ // CraftBukkit end - this.s = flag; - } - -@@ -411,6 +429,18 @@ - } - - public void setStorm(boolean flag) { -+ // CraftBukkit start -+ org.bukkit.World world = Bukkit.getWorld(getName()); -+ if (world != null) { -+ WeatherChangeEvent weather = new WeatherChangeEvent(world, flag); -+ Bukkit.getServer().getPluginManager().callEvent(weather); -+ if (weather.isCancelled()) { -+ return; -+ } -+ -+ setWeatherDuration(0); // Will force a time reset -+ } -+ // CraftBukkit end - this.q = flag; - } - -@@ -556,6 +586,12 @@ - - public void setDifficulty(EnumDifficulty enumdifficulty) { - this.z = enumdifficulty; -+ // CraftBukkit start -+ PacketPlayOutServerDifficulty packet = new PacketPlayOutServerDifficulty(this.getDifficulty(), this.isDifficultyLocked()); -+ for (EntityPlayer player : (java.util.List) (java.util.List) world.players) { -+ player.playerConnection.sendPacket(packet); -+ } -+ // CraftBukkit end - } - - public boolean isDifficultyLocked() { -@@ -664,4 +700,12 @@ - } - }); - } -+ -+ // CraftBukkit start - Check if the name stored in NBT is the correct one -+ public void checkName( String name ) { -+ if ( !this.n.equals( name ) ) { -+ this.n = name; -+ } -+ } -+ // CraftBukkit end - } diff --git a/TacoSpigot-Server/nms-patches/WorldGenGroundBush.patch b/TacoSpigot-Server/nms-patches/WorldGenGroundBush.patch deleted file mode 100644 index 4afb31c..0000000 --- a/TacoSpigot-Server/nms-patches/WorldGenGroundBush.patch +++ /dev/null @@ -1,15 +0,0 @@ ---- a/net/minecraft/server/WorldGenGroundBush.java -+++ b/net/minecraft/server/WorldGenGroundBush.java -@@ -46,7 +46,12 @@ - } - } - } -+ // CraftBukkit start - Return false if gen was unsuccessful -+ } else { -+ return false; - } -+ // CraftBukkit end -+ - - return true; - } diff --git a/TacoSpigot-Server/nms-patches/WorldGenMegaTreeAbstract.patch b/TacoSpigot-Server/nms-patches/WorldGenMegaTreeAbstract.patch deleted file mode 100644 index 99dd51e..0000000 --- a/TacoSpigot-Server/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/TacoSpigot-Server/nms-patches/WorldGenRegistration.patch b/TacoSpigot-Server/nms-patches/WorldGenRegistration.patch deleted file mode 100644 index 736860c..0000000 --- a/TacoSpigot-Server/nms-patches/WorldGenRegistration.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- a/net/minecraft/server/WorldGenRegistration.java -+++ b/net/minecraft/server/WorldGenRegistration.java -@@ -108,7 +108,7 @@ - - entitywitch.setPositionRotation((double) i1 + 0.5D, (double) j1, (double) k1 + 0.5D, 0.0F, 0.0F); - entitywitch.prepare(world.E(new BlockPosition(i1, j1, k1)), (GroupDataEntity) null); -- world.addEntity(entitywitch); -+ world.addEntity(entitywitch, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.CHUNK_GEN); // CraftBukkit - add SpawnReason - } - } - diff --git a/TacoSpigot-Server/nms-patches/WorldGenVillagePieces.patch b/TacoSpigot-Server/nms-patches/WorldGenVillagePieces.patch deleted file mode 100644 index 4c46ae3..0000000 --- a/TacoSpigot-Server/nms-patches/WorldGenVillagePieces.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- a/net/minecraft/server/WorldGenVillagePieces.java -+++ b/net/minecraft/server/WorldGenVillagePieces.java -@@ -1559,7 +1559,7 @@ - entityvillager.setPositionRotation((double) j1 + 0.5D, (double) k1, (double) l1 + 0.5D, 0.0F, 0.0F); - entityvillager.prepare(world.E(new BlockPosition(entityvillager)), (GroupDataEntity) null); - entityvillager.setProfession(this.c(i1, entityvillager.getProfession())); -- world.addEntity(entityvillager); -+ world.addEntity(entityvillager, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.CHUNK_GEN); // CraftBukkit - add SpawnReason - } - - } diff --git a/TacoSpigot-Server/nms-patches/WorldManager.patch b/TacoSpigot-Server/nms-patches/WorldManager.patch deleted file mode 100644 index 4a9fa5b..0000000 --- a/TacoSpigot-Server/nms-patches/WorldManager.patch +++ /dev/null @@ -1,54 +0,0 @@ ---- a/net/minecraft/server/WorldManager.java -+++ b/net/minecraft/server/WorldManager.java -@@ -24,11 +24,13 @@ - } - - public void a(String s, double d0, double d1, double d2, float f, float f1) { -- this.a.getPlayerList().sendPacketNearby(d0, d1, d2, f > 1.0F ? (double) (16.0F * f) : 16.0D, this.world.worldProvider.getDimension(), new PacketPlayOutNamedSoundEffect(s, d0, d1, d2, f, f1)); -+ // CraftBukkit - this.world.dimension -+ this.a.getPlayerList().sendPacketNearby(d0, d1, d2, f > 1.0F ? (double) (16.0F * f) : 16.0D, this.world.dimension, new PacketPlayOutNamedSoundEffect(s, d0, d1, d2, f, f1)); - } - - public void a(EntityHuman entityhuman, String s, double d0, double d1, double d2, float f, float f1) { -- this.a.getPlayerList().sendPacketNearby(entityhuman, d0, d1, d2, f > 1.0F ? (double) (16.0F * f) : 16.0D, this.world.worldProvider.getDimension(), new PacketPlayOutNamedSoundEffect(s, d0, d1, d2, f, f1)); -+ // CraftBukkit - this.world.dimension -+ this.a.getPlayerList().sendPacketNearby(entityhuman, d0, d1, d2, f > 1.0F ? (double) (16.0F * f) : 16.0D, this.world.dimension, new PacketPlayOutNamedSoundEffect(s, d0, d1, d2, f, f1)); - } - - public void a(int i, int j, int k, int l, int i1, int j1) {} -@@ -42,7 +44,8 @@ - public void a(String s, BlockPosition blockposition) {} - - public void a(EntityHuman entityhuman, int i, BlockPosition blockposition, int j) { -- this.a.getPlayerList().sendPacketNearby(entityhuman, (double) blockposition.getX(), (double) blockposition.getY(), (double) blockposition.getZ(), 64.0D, this.world.worldProvider.getDimension(), new PacketPlayOutWorldEvent(i, blockposition, j, false)); -+ // CraftBukkit - this.world.dimension -+ this.a.getPlayerList().sendPacketNearby(entityhuman, (double) blockposition.getX(), (double) blockposition.getY(), (double) blockposition.getZ(), 64.0D, this.world.dimension, new PacketPlayOutWorldEvent(i, blockposition, j, false)); - } - - public void a(int i, BlockPosition blockposition, int j) { -@@ -52,6 +55,12 @@ - public void b(int i, BlockPosition blockposition, int j) { - Iterator iterator = this.a.getPlayerList().v().iterator(); - -+ // CraftBukkit start -+ EntityHuman entityhuman = null; -+ Entity entity = world.a(i); // PAIL Rename getEntity -+ if (entity instanceof EntityHuman) entityhuman = (EntityHuman) entity; -+ // CraftBukkit end -+ - while (iterator.hasNext()) { - EntityPlayer entityplayer = (EntityPlayer) iterator.next(); - -@@ -60,6 +69,12 @@ - double d1 = (double) blockposition.getY() - entityplayer.locY; - double d2 = (double) blockposition.getZ() - entityplayer.locZ; - -+ // CraftBukkit start -+ if (entityhuman != null && entityhuman instanceof EntityPlayer && !entityplayer.getBukkitEntity().canSee(((EntityPlayer) entityhuman).getBukkitEntity())) { -+ continue; -+ } -+ // CraftBukkit end -+ - if (d0 * d0 + d1 * d1 + d2 * d2 < 1024.0D) { - entityplayer.playerConnection.sendPacket(new PacketPlayOutBlockBreakAnimation(i, blockposition, j)); - } diff --git a/TacoSpigot-Server/nms-patches/WorldMap.patch b/TacoSpigot-Server/nms-patches/WorldMap.patch deleted file mode 100644 index ab9784f..0000000 --- a/TacoSpigot-Server/nms-patches/WorldMap.patch +++ /dev/null @@ -1,122 +0,0 @@ ---- a/net/minecraft/server/WorldMap.java -+++ b/net/minecraft/server/WorldMap.java -@@ -6,6 +6,14 @@ - import java.util.List; - import java.util.Map; - -+// CraftBukkit start -+import java.util.UUID; -+ -+import org.bukkit.craftbukkit.CraftServer; -+import org.bukkit.craftbukkit.CraftWorld; -+import org.bukkit.craftbukkit.map.CraftMapView; -+// CraftBukkit end -+ - public class WorldMap extends PersistentBase { - - public int centerX; -@@ -17,8 +25,18 @@ - private Map i = Maps.newHashMap(); - public Map decorations = Maps.newLinkedHashMap(); - -+ // CraftBukkit start -+ public final CraftMapView mapView; -+ private CraftServer server; -+ private UUID uniqueId = null; -+ // CraftBukkit end -+ - public WorldMap(String s) { - super(s); -+ // CraftBukkit start -+ mapView = new CraftMapView(this); -+ server = (CraftServer) org.bukkit.Bukkit.getServer(); -+ // CraftBukkit end - } - - public void a(double d0, double d1, int i) { -@@ -31,7 +49,30 @@ - } - - public void a(NBTTagCompound nbttagcompound) { -- this.map = nbttagcompound.getByte("dimension"); -+ // CraftBukkit start -+ byte dimension = nbttagcompound.getByte("dimension"); -+ -+ if (dimension >= 10) { -+ long least = nbttagcompound.getLong("UUIDLeast"); -+ long most = nbttagcompound.getLong("UUIDMost"); -+ -+ if (least != 0L && most != 0L) { -+ this.uniqueId = new UUID(most, least); -+ -+ CraftWorld world = (CraftWorld) server.getWorld(this.uniqueId); -+ // Check if the stored world details are correct. -+ if (world == null) { -+ /* All Maps which do not have their valid world loaded are set to a dimension which hopefully won't be reached. -+ This is to prevent them being corrupted with the wrong map data. */ -+ dimension = 127; -+ } else { -+ dimension = (byte) world.getHandle().dimension; -+ } -+ } -+ } -+ -+ this.map = dimension; -+ // CraftBukkit end - this.centerX = nbttagcompound.getInt("xCenter"); - this.centerZ = nbttagcompound.getInt("zCenter"); - this.scale = nbttagcompound.getByte("scale"); -@@ -66,6 +107,25 @@ - } - - public void b(NBTTagCompound nbttagcompound) { -+ // CraftBukkit start -+ if (this.map >= 10) { -+ if (this.uniqueId == null) { -+ for (org.bukkit.World world : server.getWorlds()) { -+ CraftWorld cWorld = (CraftWorld) world; -+ if (cWorld.getHandle().dimension == this.map) { -+ this.uniqueId = cWorld.getUID(); -+ break; -+ } -+ } -+ } -+ /* Perform a second check to see if a matching world was found, this is a necessary -+ change incase Maps are forcefully unlinked from a World and lack a UID.*/ -+ if (this.uniqueId != null) { -+ nbttagcompound.setLong("UUIDLeast", this.uniqueId.getLeastSignificantBits()); -+ nbttagcompound.setLong("UUIDMost", this.uniqueId.getMostSignificantBits()); -+ } -+ } -+ // CraftBukkit end - nbttagcompound.setByte("dimension", this.map); - nbttagcompound.setInt("xCenter", this.centerX); - nbttagcompound.setInt("zCenter", this.centerZ); -@@ -212,12 +272,25 @@ - } - - public Packet a(ItemStack itemstack) { -+ // CraftBukkit start -+ org.bukkit.craftbukkit.map.RenderData render = WorldMap.this.mapView.render((org.bukkit.craftbukkit.entity.CraftPlayer) this.trackee.getBukkitEntity()); // CraftBukkit -+ -+ java.util.Collection icons = new java.util.ArrayList(); -+ -+ for ( org.bukkit.map.MapCursor cursor : render.cursors) { -+ -+ if (cursor.isVisible()) { -+ icons.add(new MapIcon(cursor.getRawType(), cursor.getX(), cursor.getY(), cursor.getDirection())); -+ } -+ } -+ - if (this.d) { - this.d = false; -- return new PacketPlayOutMap(itemstack.getData(), WorldMap.this.scale, WorldMap.this.decorations.values(), WorldMap.this.colors, this.e, this.f, this.g + 1 - this.e, this.h + 1 - this.f); -+ return new PacketPlayOutMap(itemstack.getData(), WorldMap.this.scale, icons, render.buffer, this.e, this.f, this.g + 1 - this.e, this.h + 1 - this.f); - } else { -- return this.i++ % 5 == 0 ? new PacketPlayOutMap(itemstack.getData(), WorldMap.this.scale, WorldMap.this.decorations.values(), WorldMap.this.colors, 0, 0, 0, 0) : null; -+ return this.i++ % 5 == 0 ? new PacketPlayOutMap(itemstack.getData(), WorldMap.this.scale, icons, render.buffer, 0, 0, 0, 0) : null; - } -+ // CraftBukkit end - } - - public void a(int i, int j) { diff --git a/TacoSpigot-Server/nms-patches/WorldNBTStorage.patch b/TacoSpigot-Server/nms-patches/WorldNBTStorage.patch deleted file mode 100644 index 549de01..0000000 --- a/TacoSpigot-Server/nms-patches/WorldNBTStorage.patch +++ /dev/null @@ -1,114 +0,0 @@ ---- a/net/minecraft/server/WorldNBTStorage.java -+++ b/net/minecraft/server/WorldNBTStorage.java -@@ -11,6 +11,12 @@ - import org.apache.logging.log4j.LogManager; - import org.apache.logging.log4j.Logger; - -+// CraftBukkit start -+import java.util.UUID; -+ -+import org.bukkit.craftbukkit.entity.CraftPlayer; -+// CraftBukkit end -+ - public class WorldNBTStorage implements IDataManager, IPlayerFileData { - - private static final Logger a = LogManager.getLogger(); -@@ -19,6 +25,7 @@ - private final File dataDir; - private final long sessionId = MinecraftServer.az(); - private final String f; -+ private UUID uuid = null; // CraftBukkit - - public WorldNBTStorage(File file, String s, boolean flag) { - this.baseDir = new File(file, s); -@@ -202,12 +209,39 @@ - } - - if (nbttagcompound != null) { -+ // CraftBukkit start -+ if (entityhuman instanceof EntityPlayer) { -+ CraftPlayer player = (CraftPlayer) entityhuman.getBukkitEntity(); -+ // Only update first played if it is older than the one we have -+ long modified = new File(this.playerDir, entityhuman.getUniqueID().toString() + ".dat").lastModified(); -+ if (modified < player.getFirstPlayed()) { -+ player.setFirstPlayed(modified); -+ } -+ } -+ // CraftBukkit end -+ - entityhuman.f(nbttagcompound); - } - - return nbttagcompound; - } - -+ // CraftBukkit start -+ public NBTTagCompound getPlayerData(String s) { -+ try { -+ File file1 = new File(this.playerDir, s + ".dat"); -+ -+ if (file1.exists()) { -+ return NBTCompressedStreamTools.a((InputStream) (new FileInputStream(file1))); -+ } -+ } catch (Exception exception) { -+ a.warn("Failed to load player data for " + s); -+ } -+ -+ return null; -+ } -+ // CraftBukkit end -+ - public IPlayerFileData getPlayerFileData() { - return this; - } -@@ -237,4 +271,50 @@ - public String g() { - return this.f; - } -+ -+ // CraftBukkit start -+ public UUID getUUID() { -+ if (uuid != null) return uuid; -+ File file1 = new File(this.baseDir, "uid.dat"); -+ if (file1.exists()) { -+ DataInputStream dis = null; -+ try { -+ dis = new DataInputStream(new FileInputStream(file1)); -+ return uuid = new UUID(dis.readLong(), dis.readLong()); -+ } catch (IOException ex) { -+ a.warn("Failed to read " + file1 + ", generating new random UUID", ex); -+ } finally { -+ if (dis != null) { -+ try { -+ dis.close(); -+ } catch (IOException ex) { -+ // NOOP -+ } -+ } -+ } -+ } -+ uuid = UUID.randomUUID(); -+ DataOutputStream dos = null; -+ try { -+ dos = new DataOutputStream(new FileOutputStream(file1)); -+ dos.writeLong(uuid.getMostSignificantBits()); -+ dos.writeLong(uuid.getLeastSignificantBits()); -+ } catch (IOException ex) { -+ a.warn("Failed to write " + file1, ex); -+ } finally { -+ if (dos != null) { -+ try { -+ dos.close(); -+ } catch (IOException ex) { -+ // NOOP -+ } -+ } -+ } -+ return uuid; -+ } -+ -+ public File getPlayerDir() { -+ return playerDir; -+ } -+ // CraftBukkit end - } diff --git a/TacoSpigot-Server/nms-patches/WorldServer.patch b/TacoSpigot-Server/nms-patches/WorldServer.patch deleted file mode 100644 index 5acbfbd..0000000 --- a/TacoSpigot-Server/nms-patches/WorldServer.patch +++ /dev/null @@ -1,620 +0,0 @@ ---- a/net/minecraft/server/WorldServer.java -+++ b/net/minecraft/server/WorldServer.java -@@ -16,14 +16,27 @@ - import org.apache.logging.log4j.LogManager; - import org.apache.logging.log4j.Logger; - -+// CraftBukkit start -+import java.util.*; -+import java.util.logging.Level; -+ -+import org.bukkit.WeatherType; -+import org.bukkit.block.BlockState; -+import org.bukkit.craftbukkit.util.LongHash; -+import org.bukkit.craftbukkit.util.HashTreeSet; -+ -+import org.bukkit.event.block.BlockFormEvent; -+import org.bukkit.event.weather.LightningStrikeEvent; -+// CraftBukkit end -+ - 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 L = Sets.newHashSet(); -- private final TreeSet M = new TreeSet(); -+ // private final Set L = Sets.newHashSet(); // PAIL: Rename nextTickListHash -+ private final HashTreeSet M = new HashTreeSet(); // CraftBukkit - HashTreeSet // PAIL: Rename nextTickList - private final Map entitiesByUUID = Maps.newHashMap(); - public ChunkProviderServer chunkProviderServer; - public boolean savingDisabled; -@@ -37,14 +50,22 @@ - private static final List U = Lists.newArrayList(new StructurePieceTreasure[] { new StructurePieceTreasure(Items.STICK, 0, 1, 3, 10), new StructurePieceTreasure(Item.getItemOf(Blocks.PLANKS), 0, 1, 3, 10), new StructurePieceTreasure(Item.getItemOf(Blocks.LOG), 0, 1, 3, 10), new StructurePieceTreasure(Items.STONE_AXE, 0, 1, 1, 3), new StructurePieceTreasure(Items.WOODEN_AXE, 0, 1, 1, 5), new StructurePieceTreasure(Items.STONE_PICKAXE, 0, 1, 1, 3), new StructurePieceTreasure(Items.WOODEN_PICKAXE, 0, 1, 1, 5), new StructurePieceTreasure(Items.APPLE, 0, 2, 3, 5), new StructurePieceTreasure(Items.BREAD, 0, 2, 3, 3), new StructurePieceTreasure(Item.getItemOf(Blocks.LOG2), 0, 1, 3, 10)}); - private List V = Lists.newArrayList(); - -- public WorldServer(MinecraftServer minecraftserver, IDataManager idatamanager, WorldData worlddata, int i, MethodProfiler methodprofiler) { -- super(idatamanager, worlddata, WorldProvider.byDimension(i), methodprofiler, false); -+ // CraftBukkit start -+ public final int dimension; -+ -+ // Add env and gen to constructor -+ public WorldServer(MinecraftServer minecraftserver, IDataManager idatamanager, WorldData worlddata, int i, MethodProfiler methodprofiler, org.bukkit.World.Environment env, org.bukkit.generator.ChunkGenerator gen) { -+ super(idatamanager, worlddata, WorldProvider.byDimension(env.getId()), methodprofiler, false, gen, env); -+ this.dimension = i; -+ this.pvpMode = minecraftserver.getPVP(); -+ worlddata.world = this; -+ // CraftBukkit end - this.server = minecraftserver; - this.tracker = new EntityTracker(this); - this.manager = new PlayerChunkMap(this); - this.worldProvider.a(this); - this.chunkProvider = this.k(); -- this.Q = new PortalTravelAgent(this); -+ this.Q = new org.bukkit.craftbukkit.CraftTravelAgent(this); // CraftBukkit - this.B(); - this.C(); - this.getWorldBorder().a(minecraftserver.aI()); -@@ -63,6 +84,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"); - -@@ -73,6 +95,11 @@ - - persistentscoreboard.a(this.scoreboard); - ((ScoreboardServer) this.scoreboard).a(persistentscoreboard); -+ // CraftBukkit start -+ } else { -+ this.scoreboard = getServer().getScoreboardManager().getMainScoreboard().getHandle(); -+ } -+ // CraftBukkit end - this.getWorldBorder().setCenter(this.worldData.C(), this.worldData.D()); - this.getWorldBorder().setDamageAmount(this.worldData.I()); - this.getWorldBorder().setDamageBuffer(this.worldData.H()); -@@ -84,9 +111,98 @@ - this.getWorldBorder().setSize(this.worldData.E()); - } - -+ // CraftBukkit start -+ if (generator != null) { -+ getWorld().getPopulators().addAll(generator.getDefaultPopulators(getWorld())); -+ } -+ // CraftBukkit end -+ - return this; - } - -+ // CraftBukkit start -+ @Override -+ public TileEntity getTileEntity(BlockPosition pos) { -+ TileEntity result = super.getTileEntity(pos); -+ Block type = getType(pos).getBlock(); -+ -+ if (type == Blocks.CHEST) { -+ if (!(result instanceof TileEntityChest)) { -+ result = fixTileEntity(pos, type, result); -+ } -+ } else if (type == Blocks.FURNACE) { -+ if (!(result instanceof TileEntityFurnace)) { -+ result = fixTileEntity(pos, type, result); -+ } -+ } else if (type == Blocks.DROPPER) { -+ if (!(result instanceof TileEntityDropper)) { -+ result = fixTileEntity(pos, type, result); -+ } -+ } else if (type == Blocks.DISPENSER) { -+ if (!(result instanceof TileEntityDispenser)) { -+ result = fixTileEntity(pos, type, result); -+ } -+ } else if (type == Blocks.JUKEBOX) { -+ if (!(result instanceof BlockJukeBox.TileEntityRecordPlayer)) { -+ result = fixTileEntity(pos, type, result); -+ } -+ } else if (type == Blocks.NOTEBLOCK) { -+ if (!(result instanceof TileEntityNote)) { -+ result = fixTileEntity(pos, type, result); -+ } -+ } else if (type == Blocks.MOB_SPAWNER) { -+ if (!(result instanceof TileEntityMobSpawner)) { -+ result = fixTileEntity(pos, type, result); -+ } -+ } else if ((type == Blocks.STANDING_SIGN) || (type == Blocks.WALL_SIGN)) { -+ if (!(result instanceof TileEntitySign)) { -+ result = fixTileEntity(pos, type, result); -+ } -+ } else if (type == Blocks.ENDER_CHEST) { -+ if (!(result instanceof TileEntityEnderChest)) { -+ result = fixTileEntity(pos, type, result); -+ } -+ } else if (type == Blocks.BREWING_STAND) { -+ if (!(result instanceof TileEntityBrewingStand)) { -+ result = fixTileEntity(pos, type, result); -+ } -+ } else if (type == Blocks.BEACON) { -+ if (!(result instanceof TileEntityBeacon)) { -+ result = fixTileEntity(pos, type, result); -+ } -+ } else if (type == Blocks.HOPPER) { -+ if (!(result instanceof TileEntityHopper)) { -+ result = fixTileEntity(pos, type, result); -+ } -+ } -+ -+ return result; -+ } -+ -+ private TileEntity fixTileEntity(BlockPosition pos, Block type, TileEntity found) { -+ this.getServer().getLogger().log(Level.SEVERE, "Block at {0},{1},{2} is {3} but has {4}" + ". " -+ + "Bukkit will attempt to fix this, but there may be additional damage that we cannot recover.", new Object[]{pos.getX(), pos.getY(), pos.getZ(), org.bukkit.Material.getMaterial(Block.getId(type)).toString(), found}); -+ -+ if (type instanceof IContainer) { -+ TileEntity replacement = ((IContainer) type).a(this, type.toLegacyData(this.getType(pos))); -+ replacement.world = this; -+ this.setTileEntity(pos, replacement); -+ return replacement; -+ } else { -+ this.getServer().getLogger().severe("Don't know how to fix for this type... Can't do anything! :("); -+ return found; -+ } -+ } -+ -+ private boolean canSpawn(int x, int z) { -+ if (this.generator != null) { -+ return this.generator.canSpawn(this.getWorld(), x, z); -+ } else { -+ return this.worldProvider.canSpawn(x, z); -+ } -+ } -+ // CraftBukkit end -+ - public void doTick() { - super.doTick(); - if (this.getWorldData().isHardcore() && this.getDifficulty() != EnumDifficulty.HARD) { -@@ -104,9 +220,11 @@ - this.e(); - } - -- this.methodProfiler.a("mobSpawner"); -- if (this.getGameRules().getBoolean("doMobSpawning") && this.worldData.getType() != WorldType.DEBUG_ALL_BLOCK_STATES) { -- this.R.a(this, this.allowMonsters, this.allowAnimals, this.worldData.getTime() % 400L == 0L); -+ // CraftBukkit start - Only call spawner if we have players online and the world allows for mobs or animals -+ long time = this.worldData.getTime(); -+ if (this.getGameRules().getBoolean("doMobSpawning") && this.worldData.getType() != WorldType.DEBUG_ALL_BLOCK_STATES && (this.allowMonsters || this.allowAnimals) && (this instanceof WorldServer && this.players.size() > 0)) { -+ this.R.a(this, this.allowMonsters && (this.ticksPerMonsterSpawns != 0 && time % this.ticksPerMonsterSpawns == 0L), this.allowAnimals && (this.ticksPerAnimalSpawns != 0 && time % this.ticksPerAnimalSpawns == 0L), this.worldData.getTime() % 400L == 0L); -+ // CraftBukkit end - } - - this.methodProfiler.c("chunkSource"); -@@ -135,6 +253,8 @@ - this.Q.a(this.getTime()); - this.methodProfiler.b(); - this.ak(); -+ -+ this.getWorld().processChunkGC(); // CraftBukkit - } - - public BiomeBase.BiomeMeta a(EnumCreatureType enumcreaturetype, BlockPosition blockposition) { -@@ -161,7 +281,7 @@ - - if (entityhuman.isSpectator()) { - ++i; -- } else if (entityhuman.isSleeping()) { -+ } else if (entityhuman.isSleeping() || entityhuman.fauxSleeping) { - ++j; - } - } -@@ -187,25 +307,46 @@ - } - - private void ag() { -- this.worldData.setWeatherDuration(0); - 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()) { -+ this.worldData.setWeatherDuration(0); -+ } -+ // CraftBukkit end - this.worldData.setThundering(false); -+ // 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.isThundering()) { -+ this.worldData.setThunderDuration(0); -+ } -+ // CraftBukkit end - } - - public boolean everyoneDeeplySleeping() { - if (this.O && !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 -+ boolean foundActualSleepers = false; -+ - EntityHuman entityhuman; - - do { - if (!iterator.hasNext()) { -- return true; -+ return foundActualSleepers; - } - - entityhuman = (EntityHuman) iterator.next(); -- } while (!entityhuman.isSpectator() && entityhuman.isDeeplySleeping()); -+ -+ // CraftBukkit start -+ if (entityhuman.isDeeplySleeping()) { -+ foundActualSleepers = true; -+ } -+ } while (!entityhuman.isSpectator() || entityhuman.isDeeplySleeping() || entityhuman.fauxSleeping); -+ // CraftBukkit end - - return false; - } else { -@@ -228,13 +369,20 @@ - int i = 0; - int j = 0; - -- for (Iterator iterator1 = this.chunkTickList.iterator(); iterator1.hasNext(); this.methodProfiler.b()) { -- ChunkCoordIntPair chunkcoordintpair1 = (ChunkCoordIntPair) iterator1.next(); -- int k = chunkcoordintpair1.x * 16; -- int l = chunkcoordintpair1.z * 16; -+ // CraftBukkit start -+ //for (Iterator iterator1 = this.chunkTickList.iterator(); iterator1.hasNext(); this.methodProfiler.b()) { -+ // ChunkCoordIntPair chunkcoordintpair1 = (ChunkCoordIntPair) iterator1.next(); -+ // int k = chunkcoordintpair1.x * 16; -+ // int l = chunkcoordintpair1.z * 16; -+ for (long chunkCoord : chunkTickList.popAll()) { -+ int chunkX = LongHash.msw(chunkCoord); -+ int chunkZ = LongHash.lsw(chunkCoord); -+ int k = chunkX * 16; -+ int l = chunkZ * 16; - - this.methodProfiler.a("getChunk"); -- Chunk chunk = this.getChunkAt(chunkcoordintpair1.x, chunkcoordintpair1.z); -+ Chunk chunk = this.getChunkAt(chunkX, chunkZ); -+ // CraftBukkit end - - this.a(k, l, chunk); - this.methodProfiler.c("tickChunk"); -@@ -260,11 +408,29 @@ - BlockPosition blockposition1 = blockposition.down(); - - if (this.w(blockposition1)) { -- this.setTypeUpdate(blockposition1, Blocks.ICE.getBlockData()); -+ // CraftBukkit start -+ BlockState blockState = this.getWorld().getBlockAt(blockposition1.getX(), blockposition1.getY(), blockposition1.getZ()).getState(); -+ blockState.setTypeId(Block.getId(Blocks.ICE)); -+ -+ BlockFormEvent iceBlockForm = new BlockFormEvent(blockState.getBlock(), blockState); -+ this.getServer().getPluginManager().callEvent(iceBlockForm); -+ if (!iceBlockForm.isCancelled()) { -+ blockState.update(true); -+ } -+ // CraftBukkit end - } - - if (this.S() && this.f(blockposition, true)) { -- this.setTypeUpdate(blockposition, Blocks.SNOW_LAYER.getBlockData()); -+ // CraftBukkit start -+ BlockState blockState = this.getWorld().getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ()).getState(); -+ blockState.setTypeId(Block.getId(Blocks.SNOW_LAYER)); -+ -+ BlockFormEvent snow = new BlockFormEvent(blockState.getBlock(), blockState); -+ this.getServer().getPluginManager().callEvent(snow); -+ if (!snow.isCancelled()) { -+ blockState.update(true); -+ } -+ // CraftBukkit end - } - - if (this.S() && this.getBiome(blockposition1).e()) { -@@ -359,8 +525,8 @@ - nextticklistentry.a(j); - } - -- if (!this.L.contains(nextticklistentry)) { -- this.L.add(nextticklistentry); -+ // CraftBukkit - use M, PAIL: Rename nextTickList -+ if (!this.M.contains(nextticklistentry)) { - this.M.add(nextticklistentry); - } - } -@@ -375,15 +541,15 @@ - nextticklistentry.a((long) i + this.worldData.getTime()); - } - -- if (!this.L.contains(nextticklistentry)) { -- this.L.add(nextticklistentry); -+ // CraftBukkit - use M, PAIL: Rename nextTickList -+ if (!this.M.contains(nextticklistentry)) { - this.M.add(nextticklistentry); - } - - } - - public void tickEntities() { -- if (this.players.isEmpty()) { -+ if (false && this.players.isEmpty()) { // CraftBukkit - this prevents entity cleanup, other issues on servers with no players - if (this.emptyTime++ >= 1200) { - return; - } -@@ -404,11 +570,17 @@ - } else { - int i = this.M.size(); - -- if (i != this.L.size()) { -+ if (false) { // CraftBukkit - throw new IllegalStateException("TickNextTick list out of synch"); - } else { - if (i > 1000) { -- i = 1000; -+ // CraftBukkit start - If the server has too much to process over time, try to alleviate that -+ if (i > 20 * 1000) { -+ i = i / 20; -+ } else { -+ i = 1000; -+ } -+ // CraftBukkit end - } - - this.methodProfiler.a("cleaning"); -@@ -421,8 +593,8 @@ - break; - } - -+ // CraftBukkit - use M, PAIL: Rename nextTickList - this.M.remove(nextticklistentry); -- this.L.remove(nextticklistentry); - this.V.add(nextticklistentry); - } - -@@ -489,7 +661,7 @@ - - if (blockposition.getX() >= structureboundingbox.a && blockposition.getX() < structureboundingbox.d && blockposition.getZ() >= structureboundingbox.c && blockposition.getZ() < structureboundingbox.f) { - if (flag) { -- this.L.remove(nextticklistentry); -+ // CraftBukkit - use M - iterator.remove(); - } - -@@ -505,6 +677,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(); -@@ -516,6 +689,7 @@ - - super.entityJoinedWorld(entity, flag); - } -+ // CraftBukkit end */ - - private boolean getSpawnNPCs() { - return this.server.getSpawnNPCs(); -@@ -528,13 +702,43 @@ - protected IChunkProvider k() { - IChunkLoader ichunkloader = this.dataManager.createChunkLoader(this.worldProvider); - -- this.chunkProviderServer = new ChunkProviderServer(this, ichunkloader, this.worldProvider.getChunkProvider()); -+ // CraftBukkit start -+ org.bukkit.craftbukkit.generator.InternalChunkGenerator gen; -+ -+ if (this.generator != null) { -+ gen = new org.bukkit.craftbukkit.generator.CustomChunkGenerator(this, this.getSeed(), this.generator); -+ } else if (this.worldProvider instanceof WorldProviderHell) { -+ gen = new org.bukkit.craftbukkit.generator.NetherChunkGenerator(this, this.getSeed()); -+ } else if (this.worldProvider instanceof WorldProviderTheEnd) { -+ gen = new org.bukkit.craftbukkit.generator.SkyLandsChunkGenerator(this, this.getSeed()); -+ } else { -+ gen = new org.bukkit.craftbukkit.generator.NormalChunkGenerator(this, this.getSeed()); -+ } -+ -+ this.chunkProviderServer = new ChunkProviderServer(this, ichunkloader, gen); -+ // CraftBukkit end - return this.chunkProviderServer; - } - - public List getTileEntities(int i, int j, int k, int l, int i1, int j1) { - ArrayList arraylist = Lists.newArrayList(); - -+ // CraftBukkit start - Get tile entities from chunks instead of world -+ for (int chunkX = (i >> 4); chunkX <= ((l - 1) >> 4); chunkX++) { -+ for (int chunkZ = (k >> 4); chunkZ <= ((j1 - 1) >> 4); chunkZ++) { -+ Chunk chunk = getChunkAt(chunkX, chunkZ); -+ if (chunk == null) { -+ continue; -+ } -+ for (Object te : chunk.tileEntities.values()) { -+ TileEntity tileentity = (TileEntity) te; -+ if ((tileentity.position.getX() >= i) && (tileentity.position.getY() >= j) && (tileentity.position.getZ() >= k) && (tileentity.position.getX() < l) && (tileentity.position.getY() < i1) && (tileentity.position.getZ() < j1)) { -+ arraylist.add(tileentity); -+ } -+ } -+ } -+ } -+ /* - for (int k1 = 0; k1 < this.h.size(); ++k1) { - TileEntity tileentity = (TileEntity) this.h.get(k1); - BlockPosition blockposition = tileentity.getPosition(); -@@ -543,6 +747,8 @@ - arraylist.add(tileentity); - } - } -+ */ -+ // CraftBukkit end - - return arraylist; - } -@@ -606,6 +812,23 @@ - int j = this.worldProvider.getSeaLevel(); - int k = 0; - -+ // CraftBukkit start -+ if (this.generator != null) { -+ Random rand = new Random(this.getSeed()); -+ org.bukkit.Location spawn = this.generator.getFixedSpawnLocation(((WorldServer) this).getWorld(), rand); -+ -+ if (spawn != null) { -+ if (spawn.getWorld() != ((WorldServer) this).getWorld()) { -+ throw new IllegalStateException("Cannot set spawn point for " + this.worldData.getName() + " to be in another world (" + spawn.getWorld().getName() + ")"); -+ } else { -+ this.worldData.setSpawn(new BlockPosition(spawn.getBlockX(), spawn.getBlockY(), spawn.getBlockZ())); -+ this.isLoading = false; -+ return; -+ } -+ } -+ } -+ // CraftBukkit end -+ - if (blockposition != null) { - i = blockposition.getX(); - k = blockposition.getZ(); -@@ -615,7 +838,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; -@@ -654,6 +877,7 @@ - - public void save(boolean flag, IProgressUpdate iprogressupdate) throws ExceptionWorldConflict { - if (this.chunkProvider.canSave()) { -+ org.bukkit.Bukkit.getPluginManager().callEvent(new org.bukkit.event.world.WorldSaveEvent(getWorld())); // CraftBukkit - if (iprogressupdate != null) { - iprogressupdate.a("Saving level"); - } -@@ -664,7 +888,8 @@ - } - - this.chunkProvider.saveChunks(flag, iprogressupdate); -- ArrayList arraylist = Lists.newArrayList(this.chunkProviderServer.a()); -+ // CraftBukkit - ArrayList -> Collection -+ Collection arraylist = this.chunkProviderServer.a(); - Iterator iterator = arraylist.iterator(); - - while (iterator.hasNext()) { -@@ -695,8 +920,12 @@ - this.worldData.k(this.getWorldBorder().getWarningTime()); - this.worldData.b(this.getWorldBorder().j()); - this.worldData.e(this.getWorldBorder().i()); -+ // CraftBukkit start - save worldMaps once, rather than once per shared world -+ if (!(this instanceof SecondaryWorldServer)) { -+ this.worldMaps.a(); -+ } - this.dataManager.saveWorldData(this.worldData, this.server.getPlayerList().t()); -- this.worldMaps.a(); -+ // CraftBukkit end - } - - protected void a(Entity entity) { -@@ -728,8 +957,16 @@ - } - - public boolean strikeLightning(Entity entity) { -+ // CraftBukkit start -+ LightningStrikeEvent lightning = new LightningStrikeEvent(this.getWorld(), (org.bukkit.entity.LightningStrike) entity.getBukkitEntity()); -+ this.getServer().getPluginManager().callEvent(lightning); -+ -+ if (lightning.isCancelled()) { -+ return false; -+ } - if (super.strikeLightning(entity)) { -- this.server.getPlayerList().sendPacketNearby(entity.locX, entity.locY, entity.locZ, 512.0D, this.worldProvider.getDimension(), new PacketPlayOutSpawnEntityWeather(entity)); -+ this.server.getPlayerList().sendPacketNearby(entity.locX, entity.locY, entity.locZ, 512.0D, dimension, new PacketPlayOutSpawnEntityWeather(entity)); -+ // CraftBukkit end - return true; - } else { - return false; -@@ -741,10 +978,20 @@ - } - - public Explosion createExplosion(Entity entity, double d0, double d1, double d2, float f, boolean flag, boolean flag1) { -+ // CraftBukkit start -+ Explosion explosion = super.createExplosion(entity, d0, d1, d2, f, flag, flag1); -+ -+ if (explosion.wasCanceled) { -+ return explosion; -+ } -+ -+ /* Remove - Explosion explosion = new Explosion(this, entity, d0, d1, d2, f, flag, flag1); - - explosion.a(); - explosion.a(false); -+ */ -+ // CraftBukkit end - TODO: Check if explosions are still properly implemented - if (!flag1) { - explosion.clearBlocks(); - } -@@ -790,7 +1037,8 @@ - BlockActionData blockactiondata = (BlockActionData) iterator.next(); - - if (this.a(blockactiondata)) { -- this.server.getPlayerList().sendPacketNearby((double) blockactiondata.a().getX(), (double) blockactiondata.a().getY(), (double) blockactiondata.a().getZ(), 64.0D, this.worldProvider.getDimension(), new PacketPlayOutBlockAction(blockactiondata.a(), blockactiondata.d(), blockactiondata.b(), blockactiondata.c())); -+ // CraftBukkit - this.worldProvider.dimension -> this.dimension -+ this.server.getPlayerList().sendPacketNearby((double) blockactiondata.a().getX(), (double) blockactiondata.a().getY(), (double) blockactiondata.a().getZ(), 64.0D, dimension, new PacketPlayOutBlockAction(blockactiondata.a(), blockactiondata.d(), blockactiondata.b(), blockactiondata.c())); - } - } - -@@ -813,6 +1061,7 @@ - boolean flag = this.S(); - - super.p(); -+ /* CraftBukkit start - if (this.o != this.p) { - this.server.getPlayerList().a(new PacketPlayOutGameStateChange(7, this.p), this.worldProvider.getDimension()); - } -@@ -831,6 +1080,21 @@ - this.server.getPlayerList().sendAll(new PacketPlayOutGameStateChange(7, this.p)); - this.server.getPlayerList().sendAll(new PacketPlayOutGameStateChange(8, this.r)); - } -+ // */ -+ if (flag != this.S()) { -+ // Only send weather packets to those affected -+ for (int i = 0; i < this.players.size(); ++i) { -+ if (((EntityPlayer) this.players.get(i)).world == this) { -+ ((EntityPlayer) this.players.get(i)).setPlayerWeather((!flag ? WeatherType.DOWNFALL : WeatherType.CLEAR), false); -+ } -+ } -+ } -+ for (int i = 0; i < this.players.size(); ++i) { -+ if (((EntityPlayer) this.players.get(i)).world == this) { -+ ((EntityPlayer) this.players.get(i)).updateWeather(this.o, this.p, this.q, this.r); -+ } -+ } -+ // CraftBukkit end - - } - -@@ -859,10 +1123,17 @@ - } - - public void a(EnumParticle enumparticle, boolean flag, double d0, double d1, double d2, int i, double d3, double d4, double d5, double d6, int... aint) { -+ // CraftBukkit - visibility api support -+ sendParticles(null, enumparticle, flag, d0, d1, d2, i, d3, d4, d5, d6, aint); -+ } -+ -+ public void sendParticles(EntityPlayer sender, EnumParticle enumparticle, boolean flag, double d0, double d1, double d2, int i, double d3, double d4, double d5, double d6, int... aint) { -+ // CraftBukkit end - PacketPlayOutWorldParticles packetplayoutworldparticles = new PacketPlayOutWorldParticles(enumparticle, flag, (float) d0, (float) d1, (float) d2, (float) d3, (float) d4, (float) d5, (float) d6, i, aint); - - for (int j = 0; j < this.players.size(); ++j) { - EntityPlayer entityplayer = (EntityPlayer) this.players.get(j); -+ if (sender != null && !entityplayer.getBukkitEntity().canSee(sender.getBukkitEntity())) continue; // CraftBukkit - BlockPosition blockposition = entityplayer.getChunkCoordinates(); - double d7 = blockposition.c(d0, d1, d2); - diff --git a/TacoSpigot-Server/pom.xml b/TacoSpigot-Server/pom.xml index 913011d..614566c 100644 --- a/TacoSpigot-Server/pom.xml +++ b/TacoSpigot-Server/pom.xml @@ -117,6 +117,11 @@ 1.18.20 provided + + com.velocitypowered + velocity-native + 1.1.0-SNAPSHOT + @@ -136,23 +141,6 @@ install - - com.lukegb.mojo - gitdescribe-maven-plugin - 1.3 - - git-TacoSpigot- - .. - - - - compile - - gitdescribe - - - - org.apache.maven.plugins maven-jar-plugin @@ -163,7 +151,7 @@ org.bukkit.craftbukkit.Main CraftBukkit - ${describe} + RELEASE Bukkit Team Bukkit ${api.version} @@ -205,7 +193,7 @@ ${project.build.directory}/dependency-reduced-pom.xml - ${shadeSourcesJar} + false joptsimple diff --git a/TacoSpigot-Server/src/main/java/monkey/sindre/spigot/MonkeyFeature.java b/TacoSpigot-Server/src/main/java/com/elevatemc/spigot/MonkeyFeature.java similarity index 92% rename from TacoSpigot-Server/src/main/java/monkey/sindre/spigot/MonkeyFeature.java rename to TacoSpigot-Server/src/main/java/com/elevatemc/spigot/MonkeyFeature.java index 9c5f42c..e9f619b 100644 --- a/TacoSpigot-Server/src/main/java/monkey/sindre/spigot/MonkeyFeature.java +++ b/TacoSpigot-Server/src/main/java/com/elevatemc/spigot/MonkeyFeature.java @@ -1,7 +1,7 @@ -package monkey.sindre.spigot; +package com.elevatemc.spigot; import org.bukkit.configuration.file.YamlConfiguration; -import monkey.sindre.spigot.util.YamlConfig; +import com.elevatemc.spigot.util.YamlConfig; public enum MonkeyFeature { diff --git a/TacoSpigot-Server/src/main/java/monkey/sindre/spigot/command/KnockbackCommand.java b/TacoSpigot-Server/src/main/java/com/elevatemc/spigot/command/KnockbackCommand.java similarity index 96% rename from TacoSpigot-Server/src/main/java/monkey/sindre/spigot/command/KnockbackCommand.java rename to TacoSpigot-Server/src/main/java/com/elevatemc/spigot/command/KnockbackCommand.java index c9be417..bf84d2e 100644 --- a/TacoSpigot-Server/src/main/java/monkey/sindre/spigot/command/KnockbackCommand.java +++ b/TacoSpigot-Server/src/main/java/com/elevatemc/spigot/command/KnockbackCommand.java @@ -1,9 +1,9 @@ -package monkey.sindre.spigot.command; +package com.elevatemc.spigot.command; -import monkey.sindre.spigot.MonkeySpigot; -import monkey.sindre.spigot.knockback.KnockbackHandler; -import monkey.sindre.spigot.knockback.KnockbackModifier; -import monkey.sindre.spigot.knockback.KnockbackProfile; +import com.elevatemc.spigot.eSpigot; +import com.elevatemc.spigot.knockback.KnockbackHandler; +import com.elevatemc.spigot.knockback.KnockbackModifier; +import com.elevatemc.spigot.knockback.KnockbackProfile; import net.md_5.bungee.api.ChatColor; import org.bukkit.Bukkit; import org.bukkit.command.Command; @@ -47,7 +47,7 @@ public class KnockbackCommand extends Command { "setactive", "setprofile" ); - KnockbackHandler knockbackHandler = MonkeySpigot.getInstance().getKnockbackHandler(); + KnockbackHandler knockbackHandler = eSpigot.getInstance().getKnockbackHandler(); public KnockbackCommand() { super("knockback"); @@ -190,7 +190,7 @@ public class KnockbackCommand extends Command { } knockbackProfile.modify(args[2], Boolean.parseBoolean(args[3])); - knockbackModifier.writeToConfig(knockbackProfile, MonkeySpigot.getInstance().getKnockbackConfig(), true); + knockbackModifier.writeToConfig(knockbackProfile, eSpigot.getInstance().getKnockbackConfig(), true); sendMessage(sender, "&aSuccessfully updated modifier " + knockbackModifier.getLabel() + " to " + args[2] + "."); return true; @@ -201,7 +201,7 @@ public class KnockbackCommand extends Command { } knockbackProfile.modify(args[2], Double.parseDouble(args[3])); - knockbackModifier.writeToConfig(knockbackProfile, MonkeySpigot.getInstance().getKnockbackConfig(), true); + knockbackModifier.writeToConfig(knockbackProfile, eSpigot.getInstance().getKnockbackConfig(), true); sendMessage(sender, "&aSuccessfully updated modifier " + knockbackModifier.getLabel() + " to " + args[2] + "."); return true; @@ -212,7 +212,7 @@ public class KnockbackCommand extends Command { } knockbackProfile.modify(args[2], Integer.parseInt(args[3])); - knockbackModifier.writeToConfig(knockbackProfile, MonkeySpigot.getInstance().getKnockbackConfig(), true); + knockbackModifier.writeToConfig(knockbackProfile, eSpigot.getInstance().getKnockbackConfig(), true); sendMessage(sender, "&aSuccessfully updated modifier " + knockbackModifier.getLabel() + " to " + args[2] + "."); return true; @@ -223,7 +223,7 @@ public class KnockbackCommand extends Command { } knockbackProfile.modify(args[2], Long.parseLong(args[3])); - knockbackModifier.writeToConfig(knockbackProfile, MonkeySpigot.getInstance().getKnockbackConfig(), true); + knockbackModifier.writeToConfig(knockbackProfile, eSpigot.getInstance().getKnockbackConfig(), true); sendMessage(sender, "&aSuccessfully updated modifier " + knockbackModifier.getLabel() + " to " + args[2] + "."); return true; @@ -234,7 +234,7 @@ public class KnockbackCommand extends Command { } knockbackProfile.modify(args[2], Float.parseFloat(args[3])); - knockbackModifier.writeToConfig(knockbackProfile, MonkeySpigot.getInstance().getKnockbackConfig(), true); + knockbackModifier.writeToConfig(knockbackProfile, eSpigot.getInstance().getKnockbackConfig(), true); sendMessage(sender, "&aSuccessfully updated modifier " + knockbackModifier.getLabel() + " to " + args[2] + "."); return true; @@ -242,7 +242,7 @@ public class KnockbackCommand extends Command { try { knockbackProfile.modify(args[2], args[3]); - knockbackModifier.writeToConfig(knockbackProfile, MonkeySpigot.getInstance().getKnockbackConfig(), true); + knockbackModifier.writeToConfig(knockbackProfile, eSpigot.getInstance().getKnockbackConfig(), true); sendMessage(sender, "&aSuccessfully updated modifier " + knockbackModifier.getLabel() + " to " + args[2] + "."); } catch (Exception e) { diff --git a/TacoSpigot-Server/src/main/java/com/elevatemc/spigot/command/TicksPerSecondCommand.java b/TacoSpigot-Server/src/main/java/com/elevatemc/spigot/command/TicksPerSecondCommand.java new file mode 100644 index 0000000..6fa10cf --- /dev/null +++ b/TacoSpigot-Server/src/main/java/com/elevatemc/spigot/command/TicksPerSecondCommand.java @@ -0,0 +1,119 @@ +package com.elevatemc.spigot.command; + +import com.elevatemc.spigot.util.DateUtil; +import com.velocitypowered.natives.util.Natives; +import net.minecraft.server.MinecraftServer; +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.World; +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.bukkit.craftbukkit.entity.CraftEntity; +import org.bukkit.entity.Entity; +import org.spigotmc.ActivationRange; + +import java.lang.management.ManagementFactory; +import java.math.RoundingMode; +import java.text.DecimalFormat; + +public class TicksPerSecondCommand extends Command { + + public TicksPerSecondCommand() { + super("tps"); + this.description = "Gets the current ticks per second for the server"; + this.usageMessage = "/tps"; + this.setPermission("bukkit.command.tps"); + } + + + @Override + public boolean execute(CommandSender sender, String currentAlias, String[] args) { + if (!testPermission(sender)) { + return true; + } + + double[] tps = Bukkit.spigot().getTPS(); + String[] tpsAvg = new String[tps.length]; + + for (int i = 0; i < tps.length; i++) { + tpsAvg[i] = format(tps[i]); + } + + int lag = (int) Math.round(100.0 - Bukkit.spigot().getTPS()[0] * 5.0); + String bar = getProgressBar(lag, 100, 20, "|", "&c", "&a"); + + + float totalEntities = 0; + float activeEntities = 0; + for(World world : Bukkit.getWorlds()) { + totalEntities += world.getEntities().size(); + + for(Entity entity : world.getEntities()) { + if(ActivationRange.checkIfActive(((CraftEntity)entity).getHandle())) { + activeEntities++; + } + } + } + + final long usedMemory = ((Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory()) / 2) / 1048576L; + final long allocatedMemory = Runtime.getRuntime().totalMemory() / 1048576L; + + sender.sendMessage("" + ChatColor.GRAY + ChatColor.STRIKETHROUGH + "----------------------------------------------"); + sender.sendMessage(ChatColor.DARK_AQUA + "TPS (1m, 5m, 15m): " + ChatColor.GREEN + org.apache.commons.lang.StringUtils.join(tpsAvg, ", ")); + sender.sendMessage(ChatColor.DARK_AQUA + "Lag: " + bar + ChatColor.GRAY + "(" + ChatColor.RED + lag + "%" + ChatColor.GRAY + ")"); + sender.sendMessage(ChatColor.DARK_AQUA + "Last tick: " + ChatColor.GREEN + (System.currentTimeMillis() - Math.round(MinecraftServer.getLastTickTime() / 10*6) + "ms")); + sender.sendMessage(ChatColor.DARK_AQUA + "Uptime: " + ChatColor.AQUA + DateUtil.formatDateDiff(ManagementFactory.getRuntimeMXBean().getStartTime())); + sender.sendMessage(ChatColor.DARK_AQUA + "Timings: " + (Bukkit.getPluginManager().useTimings() ? ChatColor.GREEN + "Enabled" : ChatColor.RED + "Disabled")); + sender.sendMessage(ChatColor.DARK_AQUA + "Online: " + ChatColor.AQUA + Bukkit.getOnlinePlayers().size() + ChatColor.GRAY + "/" + ChatColor.AQUA + Bukkit.getMaxPlayers()); + + sender.sendMessage(ChatColor.DARK_AQUA + "Entities: " + ChatColor.AQUA + activeEntities + ChatColor.GRAY + "/" + ChatColor.AQUA + + totalEntities + ChatColor.DARK_AQUA + " (" + ChatColor.GREEN + this.round(100 * (activeEntities / totalEntities)) + "%" + ChatColor.DARK_AQUA + ")"); + + sender.sendMessage(ChatColor.DARK_AQUA + "Active workers: " + ChatColor.AQUA + Bukkit.getScheduler().getActiveWorkers().size() + ChatColor.DARK_AQUA + " - Pending tasks: " + ChatColor.AQUA + + Bukkit.getScheduler().getPendingTasks().size()); + + sender.sendMessage(ChatColor.DARK_AQUA + "Alive threads: " + ChatColor.AQUA + Thread.getAllStackTraces().keySet().parallelStream().filter(Thread::isAlive).count() + + ChatColor.DARK_AQUA + " - Daemon threads: " + ChatColor.AQUA + Thread.getAllStackTraces().keySet().parallelStream().filter(Thread::isDaemon).count()); + + sender.sendMessage(ChatColor.DARK_AQUA + "Interrupted threads: " + ChatColor.AQUA + Thread.getAllStackTraces().keySet().parallelStream().filter(Thread::isInterrupted).count() + + ChatColor.DARK_AQUA + " - Processors: " + ChatColor.AQUA + Runtime.getRuntime().availableProcessors()); + sender.sendMessage(ChatColor.DARK_AQUA + "Compression: " + ChatColor.AQUA + Natives.compress.getLoadedVariant() + ChatColor.DARK_AQUA + " Cipher: " + ChatColor.AQUA + Natives.cipher.getLoadedVariant()); + + sender.sendMessage(ChatColor.DARK_AQUA + "Memory usage: " + ChatColor.AQUA + usedMemory + ChatColor.GRAY + "/" + ChatColor.AQUA + allocatedMemory + ChatColor.DARK_AQUA + "MB"); + sender.sendMessage("" + ChatColor.GRAY + ChatColor.STRIKETHROUGH + "----------------------------------------------"); + return true; + } + + private static String format(double tps) { + DecimalFormat format = new DecimalFormat("##.##"); + format.setRoundingMode(RoundingMode.CEILING); + + String s = format.format(tps); + return (tps < 10.0) ? ("" + ChatColor.RED + s) : ((tps < 15.0) ? ("" + ChatColor.AQUA + s) : ((tps > 20.0 ) ? "*" : "" ) + Math.min( Math.round( tps * 100.0 ) / 100.0, 20.0)); + } + + private float round(float value) { + return (float) (Math.round(value * 100.0) / 100.0); + } + + + private String getProgressBar(int current, int max, int totalBars, String symbol, String completedColor, String notCompletedColor){ + + float percent = (float) current / max; + + int progressBars = (int) (totalBars * percent); + + int leftOver = (totalBars - progressBars); + + StringBuilder sb = new StringBuilder(); + sb.append(ChatColor.translateAlternateColorCodes('&', completedColor)); + for (int i = 0; i < progressBars; i++) { + sb.append(symbol); + } + sb.append(ChatColor.translateAlternateColorCodes('&', notCompletedColor)); + for (int i = 0; i < leftOver; i++) { + sb.append(symbol); + } + return sb.toString(); + } +} \ No newline at end of file diff --git a/TacoSpigot-Server/src/main/java/monkey/sindre/spigot/MonkeySpigot.java b/TacoSpigot-Server/src/main/java/com/elevatemc/spigot/eSpigot.java similarity index 74% rename from TacoSpigot-Server/src/main/java/monkey/sindre/spigot/MonkeySpigot.java rename to TacoSpigot-Server/src/main/java/com/elevatemc/spigot/eSpigot.java index 1e79bca..1b87ae0 100644 --- a/TacoSpigot-Server/src/main/java/monkey/sindre/spigot/MonkeySpigot.java +++ b/TacoSpigot-Server/src/main/java/com/elevatemc/spigot/eSpigot.java @@ -1,32 +1,32 @@ -package monkey.sindre.spigot; +package com.elevatemc.spigot; -import monkey.sindre.spigot.command.KnockbackCommand; -import monkey.sindre.spigot.util.YamlConfig; +import com.elevatemc.spigot.command.KnockbackCommand; +import com.elevatemc.spigot.command.TicksPerSecondCommand; +import com.elevatemc.spigot.util.YamlConfig; import net.minecraft.server.MinecraftServer; import org.bukkit.command.Command; -import monkey.sindre.spigot.command.TicksPerSecondCommand; -import monkey.sindre.spigot.knockback.KnockbackHandler; +import com.elevatemc.spigot.knockback.KnockbackHandler; import java.util.Arrays; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; -public class MonkeySpigot { +public class eSpigot { public static final ScheduledExecutorService EXECUTOR_SERVICE = Executors.newSingleThreadScheduledExecutor(); - private static MonkeySpigot instance = null; + private static eSpigot instance = null; - public static MonkeySpigot getInstance() { + public static eSpigot getInstance() { return instance; } private final YamlConfig config, knockbackConfig; private final KnockbackHandler knockbackHandler; - public MonkeySpigot() { + public eSpigot() { // Set instance of the server instance = this; @@ -40,7 +40,7 @@ public class MonkeySpigot { for (Command command : Arrays.asList(new KnockbackCommand(), new TicksPerSecondCommand())) MinecraftServer.getServer().server.getCommandMap() - .register(command.getLabel(), "MonkeySpigot", command); + .register(command.getLabel(), "eSpigot", command); EXECUTOR_SERVICE.scheduleAtFixedRate(() -> MinecraftServer.getServer().aq().processFastPackets(), 5L, 5L, TimeUnit.MILLISECONDS); } diff --git a/TacoSpigot-Server/src/main/java/monkey/sindre/spigot/knockback/KnockbackHandler.java b/TacoSpigot-Server/src/main/java/com/elevatemc/spigot/knockback/KnockbackHandler.java similarity index 80% rename from TacoSpigot-Server/src/main/java/monkey/sindre/spigot/knockback/KnockbackHandler.java rename to TacoSpigot-Server/src/main/java/com/elevatemc/spigot/knockback/KnockbackHandler.java index 66579c6..d63a440 100644 --- a/TacoSpigot-Server/src/main/java/monkey/sindre/spigot/knockback/KnockbackHandler.java +++ b/TacoSpigot-Server/src/main/java/com/elevatemc/spigot/knockback/KnockbackHandler.java @@ -1,7 +1,7 @@ -package monkey.sindre.spigot.knockback; +package com.elevatemc.spigot.knockback; -import monkey.sindre.spigot.MonkeySpigot; -import monkey.sindre.spigot.knockback.impl.AdvancedKnockbackProfile; +import com.elevatemc.spigot.eSpigot; +import com.elevatemc.spigot.knockback.impl.AdvancedKnockbackProfile; import org.bukkit.Bukkit; import org.bukkit.configuration.file.YamlConfiguration; @@ -26,7 +26,7 @@ public class KnockbackHandler { } private void initialize() { - YamlConfiguration config = MonkeySpigot.getInstance().getKnockbackConfig().getConfig(); + YamlConfiguration config = eSpigot.getInstance().getKnockbackConfig().getConfig(); if (config.getConfigurationSection("profiles") != null) { config.getConfigurationSection("profiles").getKeys(false).forEach(profile -> { @@ -36,7 +36,7 @@ public class KnockbackHandler { Bukkit.getLogger().severe("Knockback Profile " + profile + " with implementation " + implementation + " couldn't be loaded due to the implementation not being found!"); config.set("profiles." + profile, null); - MonkeySpigot.getInstance().getKnockbackConfig().save(); + eSpigot.getInstance().getKnockbackConfig().save(); return; } @@ -50,7 +50,7 @@ public class KnockbackHandler { + " couldn't be loaded due to the constructor of the implementation not being found!"); e.printStackTrace(); config.set("profiles." + profile, null); - MonkeySpigot.getInstance().getKnockbackConfig().save(); + eSpigot.getInstance().getKnockbackConfig().save(); return; } @@ -67,7 +67,7 @@ public class KnockbackHandler { (knockbackProfiles.isEmpty() ? createDefault() : new ArrayList<>(knockbackProfiles).get(0)).getName() : activeProfile.getName()); - MonkeySpigot.getInstance().getKnockbackConfig().save(); + eSpigot.getInstance().getKnockbackConfig().save(); } activeProfile = getKnockbackProfileByName(config.getString("active-profile"), false); @@ -81,9 +81,9 @@ public class KnockbackHandler { } public void deleteProfile(KnockbackProfile knockbackProfile) { - MonkeySpigot.getInstance().getKnockbackConfig().getConfig().set("profiles." + knockbackProfile, null); + eSpigot.getInstance().getKnockbackConfig().getConfig().set("profiles." + knockbackProfile, null); knockbackProfiles.remove(knockbackProfile); - MonkeySpigot.getInstance().getKnockbackConfig().saveAsync(); + eSpigot.getInstance().getKnockbackConfig().saveAsync(); } private KnockbackProfile createDefault() { @@ -108,10 +108,10 @@ public class KnockbackHandler { } public void saveKnockbackProfile(KnockbackProfile knockbackProfile) { - MonkeySpigot.getInstance().getKnockbackConfig().getConfig().set("profiles." + knockbackProfile.getName() + ".implementation", + eSpigot.getInstance().getKnockbackConfig().getConfig().set("profiles." + knockbackProfile.getName() + ".implementation", knockbackProfile.getImplementationName()); - knockbackProfile.getModifiers().forEach(modifier -> modifier.writeToConfig(knockbackProfile, MonkeySpigot.getInstance().getKnockbackConfig(), false)); - MonkeySpigot.getInstance().getKnockbackConfig().saveAsync(); + knockbackProfile.getModifiers().forEach(modifier -> modifier.writeToConfig(knockbackProfile, eSpigot.getInstance().getKnockbackConfig(), false)); + eSpigot.getInstance().getKnockbackConfig().saveAsync(); } public KnockbackProfile getActiveProfile() { @@ -121,8 +121,8 @@ public class KnockbackHandler { public void setActiveProfile(KnockbackProfile activeProfile) { this.activeProfile = activeProfile; - MonkeySpigot.getInstance().getKnockbackConfig().getConfig().set("active-profile", activeProfile.getName()); - MonkeySpigot.getInstance().getKnockbackConfig().saveAsync(); + eSpigot.getInstance().getKnockbackConfig().getConfig().set("active-profile", activeProfile.getName()); + eSpigot.getInstance().getKnockbackConfig().saveAsync(); } public Set getKnockbackProfiles() { diff --git a/TacoSpigot-Server/src/main/java/monkey/sindre/spigot/knockback/KnockbackModifier.java b/TacoSpigot-Server/src/main/java/com/elevatemc/spigot/knockback/KnockbackModifier.java similarity index 94% rename from TacoSpigot-Server/src/main/java/monkey/sindre/spigot/knockback/KnockbackModifier.java rename to TacoSpigot-Server/src/main/java/com/elevatemc/spigot/knockback/KnockbackModifier.java index 5c32c0f..367871a 100644 --- a/TacoSpigot-Server/src/main/java/monkey/sindre/spigot/knockback/KnockbackModifier.java +++ b/TacoSpigot-Server/src/main/java/com/elevatemc/spigot/knockback/KnockbackModifier.java @@ -1,6 +1,6 @@ -package monkey.sindre.spigot.knockback; +package com.elevatemc.spigot.knockback; -import monkey.sindre.spigot.util.YamlConfig; +import com.elevatemc.spigot.util.YamlConfig; import java.io.IOException; import java.util.concurrent.CompletableFuture; diff --git a/TacoSpigot-Server/src/main/java/monkey/sindre/spigot/knockback/KnockbackProfile.java b/TacoSpigot-Server/src/main/java/com/elevatemc/spigot/knockback/KnockbackProfile.java similarity index 98% rename from TacoSpigot-Server/src/main/java/monkey/sindre/spigot/knockback/KnockbackProfile.java rename to TacoSpigot-Server/src/main/java/com/elevatemc/spigot/knockback/KnockbackProfile.java index 7077d1b..c34b40e 100644 --- a/TacoSpigot-Server/src/main/java/monkey/sindre/spigot/knockback/KnockbackProfile.java +++ b/TacoSpigot-Server/src/main/java/com/elevatemc/spigot/knockback/KnockbackProfile.java @@ -1,4 +1,4 @@ -package monkey.sindre.spigot.knockback; +package com.elevatemc.spigot.knockback; import net.minecraft.server.Entity; import net.minecraft.server.EntityPlayer; diff --git a/TacoSpigot-Server/src/main/java/monkey/sindre/spigot/knockback/impl/AdvancedKnockbackProfile.java b/TacoSpigot-Server/src/main/java/com/elevatemc/spigot/knockback/impl/AdvancedKnockbackProfile.java similarity index 97% rename from TacoSpigot-Server/src/main/java/monkey/sindre/spigot/knockback/impl/AdvancedKnockbackProfile.java rename to TacoSpigot-Server/src/main/java/com/elevatemc/spigot/knockback/impl/AdvancedKnockbackProfile.java index 9e8dc84..e451205 100644 --- a/TacoSpigot-Server/src/main/java/monkey/sindre/spigot/knockback/impl/AdvancedKnockbackProfile.java +++ b/TacoSpigot-Server/src/main/java/com/elevatemc/spigot/knockback/impl/AdvancedKnockbackProfile.java @@ -1,7 +1,7 @@ -package monkey.sindre.spigot.knockback.impl; +package com.elevatemc.spigot.knockback.impl; -import monkey.sindre.spigot.knockback.KnockbackModifier; -import monkey.sindre.spigot.knockback.KnockbackProfile; +import com.elevatemc.spigot.knockback.KnockbackModifier; +import com.elevatemc.spigot.knockback.KnockbackProfile; import net.minecraft.server.Entity; import net.minecraft.server.EntityPlayer; import net.minecraft.server.MathHelper; diff --git a/TacoSpigot-Server/src/main/java/com/elevatemc/spigot/util/CryptException.java b/TacoSpigot-Server/src/main/java/com/elevatemc/spigot/util/CryptException.java new file mode 100644 index 0000000..4a0dad3 --- /dev/null +++ b/TacoSpigot-Server/src/main/java/com/elevatemc/spigot/util/CryptException.java @@ -0,0 +1,8 @@ +// Taken from https://github.com/Elierrr/NachoSpigot/blob/b52603b25ff32b54c0b8df769e2271d187f92dc8/NachoSpigot-Server/src/main/java/me/elier/minecraft/util/CryptException.java +package com.elevatemc.spigot.util; + +public class CryptException extends Exception { + public CryptException(Throwable throwable) { + super(throwable); + } +} \ No newline at end of file diff --git a/TacoSpigot-Server/src/main/java/com/elevatemc/spigot/util/DateUtil.java b/TacoSpigot-Server/src/main/java/com/elevatemc/spigot/util/DateUtil.java new file mode 100644 index 0000000..4619a0e --- /dev/null +++ b/TacoSpigot-Server/src/main/java/com/elevatemc/spigot/util/DateUtil.java @@ -0,0 +1,74 @@ +package com.elevatemc.spigot.util; + +/** + * Copyright (c) 2022 - Tranquil, LLC. + * + * @author ImHacking + * @date 6/4/2022 + */ +import java.util.Calendar; +import java.util.GregorianCalendar; + +public class DateUtil { + private static final int MAX_YEARS = 100000; + + private DateUtil() { + } + + private static int dateDiff(int type, Calendar fromDate, Calendar toDate, boolean future) { + int year = Calendar.YEAR; + + int fromYear = fromDate.get(year); + int toYear = toDate.get(year); + if (Math.abs(fromYear - toYear) > DateUtil.MAX_YEARS) { + toDate.set(year, fromYear + + (future ? DateUtil.MAX_YEARS : -DateUtil.MAX_YEARS)); + } + + int diff = 0; + long savedDate = fromDate.getTimeInMillis(); + while ((future && !fromDate.after(toDate)) || (!future && !fromDate.before(toDate))) { + savedDate = fromDate.getTimeInMillis(); + fromDate.add(type, future ? 1 : -1); + diff++; + } + diff--; + fromDate.setTimeInMillis(savedDate); + return diff; + } + + public static String formatDateDiff(long date) { + Calendar c = new GregorianCalendar(); + c.setTimeInMillis(date); + Calendar now = new GregorianCalendar(); + return DateUtil.formatDateDiff(now, c); + } + + private static String formatDateDiff(Calendar fromDate, Calendar toDate) { + boolean future = false; + if (toDate.equals(fromDate)) { + return "now"; + } + if (toDate.after(fromDate)) { + future = true; + } + StringBuilder sb = new StringBuilder(); + int[] types = new int[]{Calendar.YEAR, Calendar.MONTH, Calendar.DAY_OF_MONTH, Calendar.HOUR_OF_DAY, Calendar.MINUTE, Calendar.SECOND}; + String[] names = new String[]{"year", "years", "month", "months", "day", "days", "hour", "hours", "minute", "minutes", "second", "seconds"}; + int accuracy = 0; + for (int i = 0; i < types.length; i++) { + if (accuracy > 2) { + break; + } + int diff = dateDiff(types[i], fromDate, toDate, future); + if (diff > 0) { + accuracy++; + sb.append(" ").append(diff).append(" ").append(names[i * 2 + (diff > 1 ? 1 : 0)]); + } + } + if (sb.length() == 0) { + return "now"; + } + return sb.toString().trim(); + } +} \ No newline at end of file diff --git a/TacoSpigot-Server/src/main/java/com/elevatemc/spigot/util/FastRandom.java b/TacoSpigot-Server/src/main/java/com/elevatemc/spigot/util/FastRandom.java new file mode 100644 index 0000000..eff5db2 --- /dev/null +++ b/TacoSpigot-Server/src/main/java/com/elevatemc/spigot/util/FastRandom.java @@ -0,0 +1,93 @@ +// From https://github.com/MaxWgamer/AW-Spigot/blob/71d7e988e006b527af2604062122169f475007cb/PaperSpigot-Server/src/main/java/fr/MaxWgamer/custom/utils/FastRandom.java +package com.elevatemc.spigot.util; + +import java.util.Random; + +import javax.annotation.concurrent.ThreadSafe; + +/** + * Implementation of George Marsaglia's elegant Xorshift random generator which is + * 30% faster and better quality than the built-in java.util.random see also see + * http://www.javamex.com/tutorials/random_numbers/xorshift.shtml + */ +@ThreadSafe // The fast random can be used with multiple threads +public strictfp class FastRandom extends Random implements Cloneable { + + private static final long serialVersionUID = 1L; + + protected long seed; + + /** + * Creates a new pseudo random number generator. The seed is initialized to the + * current time, as if by setSeed(System.currentTimeMillis());. + */ + public FastRandom() { + this(System.nanoTime()); + } + + /** + * Creates a new pseudo random number generator, starting with the specified + * seed, using setSeed(seed);. + * + * @param seed the initial seed + */ + public FastRandom(long seed) { + this.seed = seed; + } + + /** + * Returns the current state of the seed, can be used to clone the object + * + * @returns the current seed + */ + public synchronized long getSeed() { + return seed; + } + + /** + * Sets the seed for this pseudo random number generator. As described above, + * two instances of the same random class, starting with the same seed, produce + * the same results, if the same methods are called. + * + * @param s the new seed + */ + public synchronized void setSeed(long seed) { + this.seed = seed; + super.setSeed(seed); + } + + /** + * Returns an XSRandom object with the same state as the original + */ + public FastRandom clone() { + return new FastRandom(getSeed()); + } + + /** + * Implementation of George Marsaglia's elegant Xorshift random generator 30% + * faster and better quality than the built-in java.util.random see also see + * http://www.javamex.com/tutorials/random_numbers/xorshift.shtml + */ + @Override + protected int next(int nbits) { + long x = seed; + x ^= (x << 21); + x ^= (x >>> 35); + x ^= (x << 4); + seed = x; + x &= ((1L << nbits) - 1); + + return (int) x; + } + + /** + * Sets the specified seed value from the specified int[] + * + * @param array + */ + synchronized public void setSeed(int[] array) { + if (array.length == 0) + throw new IllegalArgumentException("Array length must be greater than zero"); + setSeed(array.hashCode()); + } +} \ No newline at end of file diff --git a/TacoSpigot-Server/src/main/java/monkey/sindre/spigot/util/SynchronizedIntHashMap.java b/TacoSpigot-Server/src/main/java/com/elevatemc/spigot/util/SynchronizedIntHashMap.java similarity index 95% rename from TacoSpigot-Server/src/main/java/monkey/sindre/spigot/util/SynchronizedIntHashMap.java rename to TacoSpigot-Server/src/main/java/com/elevatemc/spigot/util/SynchronizedIntHashMap.java index 6d4e654..36eb6fa 100644 --- a/TacoSpigot-Server/src/main/java/monkey/sindre/spigot/util/SynchronizedIntHashMap.java +++ b/TacoSpigot-Server/src/main/java/com/elevatemc/spigot/util/SynchronizedIntHashMap.java @@ -1,4 +1,4 @@ -package monkey.sindre.spigot.util; +package com.elevatemc.spigot.util; import net.minecraft.server.IntHashMap; diff --git a/TacoSpigot-Server/src/main/java/monkey/sindre/spigot/util/YamlConfig.java b/TacoSpigot-Server/src/main/java/com/elevatemc/spigot/util/YamlConfig.java similarity index 98% rename from TacoSpigot-Server/src/main/java/monkey/sindre/spigot/util/YamlConfig.java rename to TacoSpigot-Server/src/main/java/com/elevatemc/spigot/util/YamlConfig.java index 6625aa4..cd4fcb9 100644 --- a/TacoSpigot-Server/src/main/java/monkey/sindre/spigot/util/YamlConfig.java +++ b/TacoSpigot-Server/src/main/java/com/elevatemc/spigot/util/YamlConfig.java @@ -1,4 +1,4 @@ -package monkey.sindre.spigot.util; +package com.elevatemc.spigot.util; import com.google.common.base.Throwables; import org.bukkit.Bukkit; diff --git a/TacoSpigot-Server/src/main/java/monkey/sindre/spigot/util/task/AbstractTaskExecutor.java b/TacoSpigot-Server/src/main/java/com/elevatemc/spigot/util/task/AbstractTaskExecutor.java similarity index 96% rename from TacoSpigot-Server/src/main/java/monkey/sindre/spigot/util/task/AbstractTaskExecutor.java rename to TacoSpigot-Server/src/main/java/com/elevatemc/spigot/util/task/AbstractTaskExecutor.java index 75b4f36..07a3d42 100644 --- a/TacoSpigot-Server/src/main/java/monkey/sindre/spigot/util/task/AbstractTaskExecutor.java +++ b/TacoSpigot-Server/src/main/java/com/elevatemc/spigot/util/task/AbstractTaskExecutor.java @@ -1,4 +1,4 @@ -package monkey.sindre.spigot.util.task; +package com.elevatemc.spigot.util.task; import java.util.ArrayList; import java.util.List; diff --git a/TacoSpigot-Server/src/main/java/monkey/sindre/spigot/util/task/Task.java b/TacoSpigot-Server/src/main/java/com/elevatemc/spigot/util/task/Task.java similarity index 63% rename from TacoSpigot-Server/src/main/java/monkey/sindre/spigot/util/task/Task.java rename to TacoSpigot-Server/src/main/java/com/elevatemc/spigot/util/task/Task.java index 5f798e2..1966b05 100644 --- a/TacoSpigot-Server/src/main/java/monkey/sindre/spigot/util/task/Task.java +++ b/TacoSpigot-Server/src/main/java/com/elevatemc/spigot/util/task/Task.java @@ -1,4 +1,4 @@ -package monkey.sindre.spigot.util.task; +package com.elevatemc.spigot.util.task; public interface Task { diff --git a/TacoSpigot-Server/src/main/java/monkey/sindre/spigot/util/task/TaskExecutor.java b/TacoSpigot-Server/src/main/java/com/elevatemc/spigot/util/task/TaskExecutor.java similarity index 86% rename from TacoSpigot-Server/src/main/java/monkey/sindre/spigot/util/task/TaskExecutor.java rename to TacoSpigot-Server/src/main/java/com/elevatemc/spigot/util/task/TaskExecutor.java index e474878..6a4f359 100644 --- a/TacoSpigot-Server/src/main/java/monkey/sindre/spigot/util/task/TaskExecutor.java +++ b/TacoSpigot-Server/src/main/java/com/elevatemc/spigot/util/task/TaskExecutor.java @@ -1,4 +1,4 @@ -package monkey.sindre.spigot.util.task; +package com.elevatemc.spigot.util.task; import java.util.Collection; diff --git a/TacoSpigot-Server/src/main/java/monkey/sindre/spigot/util/task/impl/ThreadTaskExecutor.java b/TacoSpigot-Server/src/main/java/com/elevatemc/spigot/util/task/impl/ThreadTaskExecutor.java similarity index 88% rename from TacoSpigot-Server/src/main/java/monkey/sindre/spigot/util/task/impl/ThreadTaskExecutor.java rename to TacoSpigot-Server/src/main/java/com/elevatemc/spigot/util/task/impl/ThreadTaskExecutor.java index 2ea70f8..eb31a55 100644 --- a/TacoSpigot-Server/src/main/java/monkey/sindre/spigot/util/task/impl/ThreadTaskExecutor.java +++ b/TacoSpigot-Server/src/main/java/com/elevatemc/spigot/util/task/impl/ThreadTaskExecutor.java @@ -1,7 +1,7 @@ -package monkey.sindre.spigot.util.task.impl; +package com.elevatemc.spigot.util.task.impl; -import monkey.sindre.spigot.util.task.Task; -import monkey.sindre.spigot.util.task.AbstractTaskExecutor; +import com.elevatemc.spigot.util.task.AbstractTaskExecutor; +import com.elevatemc.spigot.util.task.Task; import java.util.concurrent.TimeUnit; diff --git a/TacoSpigot-Server/src/main/java/monkey/sindre/spigot/command/TicksPerSecondCommand.java b/TacoSpigot-Server/src/main/java/monkey/sindre/spigot/command/TicksPerSecondCommand.java deleted file mode 100644 index e1e9ed7..0000000 --- a/TacoSpigot-Server/src/main/java/monkey/sindre/spigot/command/TicksPerSecondCommand.java +++ /dev/null @@ -1,86 +0,0 @@ -package monkey.sindre.spigot.command; - -import net.minecraft.server.MinecraftServer; -import net.minecraft.server.WorldServer; -import org.apache.commons.lang.StringUtils; -import org.bukkit.ChatColor; -import org.bukkit.command.Command; -import org.bukkit.command.CommandSender; - -public class TicksPerSecondCommand extends Command -{ - - public TicksPerSecondCommand() { - super("tps"); - this.description = "Gets the current ticks per second for the server"; - this.usageMessage = "/tps"; - this.setPermission("bukkit.command.tps"); - } - - private static String formatTps(double tps) // PaperSpigot - made static - { - return String.format("%s%s%s", (tps > 18.0 ? ChatColor.AQUA : tps > 16.0 ? ChatColor.YELLOW : ChatColor.RED), tps > 20.0 ? "*" : "", Math.min(Math.round(tps * 100.0) / 100.0, 20.0)); - } - - private static String formatMs(double time) { - - time = time / 1000000D; - return String.format("%s%.1f", ((time < 15) ? ChatColor.AQUA : (time < 30) ? ChatColor.YELLOW : ChatColor.RED), time); - } - - private static String formatMem(double mem) { - return ChatColor.AQUA.toString().toString() + Math.round(mem / 1024 / 1024); - } - - @Override - public boolean execute(CommandSender sender, String currentAlias, String[] args) { - if (!testPermission(sender)) { - return true; - } - - double[] tps = org.bukkit.Bukkit.spigot().getTPS(); - String[] tpsAvg = new String[tps.length]; - - for (int i = 0; i < tps.length; i++) { - tpsAvg[i] = formatTps(tps[i]); - } - - StringBuilder sb = new StringBuilder(); - - final Runtime runtime = Runtime.getRuntime(); - - double usedMemory = runtime.totalMemory() - runtime.freeMemory(); - double maxMemory = runtime.maxMemory(); - double freeMemory = maxMemory - usedMemory; - - int totalPlayers = 0; - int totalEntities = 0; - int totalChunks = 0; - - for (WorldServer server : MinecraftServer.getServer().worlds) { - totalPlayers += server.players.size(); - totalChunks += server.chunkProviderServer.chunks.size(); - totalEntities += server.entityList.size(); - } - - sb.append(ChatColor.WHITE).append("TPS from last 5s, 1m, 5m, 15m: ") - .append(StringUtils.join(tpsAvg, ", ")).append("\n"); - sb.append(ChatColor.WHITE).append("Full Tick: ") - .append(formatMs(MinecraftServer.getLastTickTime())).append(" ms").append("\n"); - sb.append(ChatColor.WHITE) - .append("Online Players: ").append(ChatColor.AQUA).append(totalPlayers).append(ChatColor.WHITE) - .append(" ❘ Total Entities: ").append(ChatColor.AQUA).append(totalEntities).append(ChatColor.WHITE) - .append(" ❘ Chunks: ").append(ChatColor.AQUA).append(totalChunks).append("\n"); - sb.append(ChatColor.WHITE).append("Active Threads: ").append(ChatColor.AQUA).append(Thread.activeCount()) - .append(ChatColor.WHITE).append(" ❘ Daemon Threads: ").append(ChatColor.AQUA) - .append(Thread.getAllStackTraces().keySet().stream().filter(Thread::isDaemon).count()) - .append("\n"); - sb.append(ChatColor.WHITE).append("Memory Usage: ").append(ChatColor.AQUA) - .append(formatMem(usedMemory)).append("/").append(formatMem(maxMemory)) - .append(" MB ").append("(").append(formatMem(freeMemory)) - .append(" MB free)"); - - sender.sendMessage(sb.toString()); - return true; - } -} \ No newline at end of file diff --git a/TacoSpigot-Server/src/main/java/net/minecraft/server/BaseBlockPosition.java b/TacoSpigot-Server/src/main/java/net/minecraft/server/BaseBlockPosition.java index a685e08..578c49d 100644 --- a/TacoSpigot-Server/src/main/java/net/minecraft/server/BaseBlockPosition.java +++ b/TacoSpigot-Server/src/main/java/net/minecraft/server/BaseBlockPosition.java @@ -21,7 +21,7 @@ public class BaseBlockPosition implements Comparable { this(MathHelper.floor(d0), MathHelper.floor(d1), MathHelper.floor(d2)); } - public boolean equals(Object object) { + public final boolean equals(Object object) { //Paper if (this == object) { return true; } else if (!(object instanceof BaseBlockPosition)) { @@ -33,7 +33,7 @@ public class BaseBlockPosition implements Comparable { } } - public int hashCode() { + public final int hashCode() { return (this.getY() + this.getZ() * 31) * 31 + this.getX(); } @@ -87,4 +87,4 @@ public class BaseBlockPosition implements Comparable { public int compareTo(BaseBlockPosition object) { return this.g((BaseBlockPosition) object); } -} +} \ No newline at end of file diff --git a/TacoSpigot-Server/src/main/java/net/minecraft/server/BlockBeacon.java b/TacoSpigot-Server/src/main/java/net/minecraft/server/BlockBeacon.java new file mode 100644 index 0000000..249608a --- /dev/null +++ b/TacoSpigot-Server/src/main/java/net/minecraft/server/BlockBeacon.java @@ -0,0 +1,89 @@ +package net.minecraft.server; + +public class BlockBeacon extends BlockContainer { + public BlockBeacon() { + super(Material.SHATTERABLE, MaterialMapColor.G); + this.c(3.0F); + this.a(CreativeModeTab.f); + } + + public TileEntity a(World var1, int var2) { + return new TileEntityBeacon(); + } + + public boolean interact(World var1, BlockPosition var2, IBlockData var3, EntityHuman var4, EnumDirection var5, float var6, float var7, float var8) { + if (var1.isClientSide) { + return true; + } else { + TileEntity var9 = var1.getTileEntity(var2); + if (var9 instanceof TileEntityBeacon) { + var4.openContainer((TileEntityBeacon)var9); + var4.b(StatisticList.N); + } + + return true; + } + } + + public boolean c() { + return false; + } + + public boolean d() { + return false; + } + + public int b() { + return 3; + } + + public void postPlace(World var1, BlockPosition var2, IBlockData var3, EntityLiving var4, ItemStack var5) { + super.postPlace(var1, var2, var3, var4, var5); + if (var5.hasName()) { + TileEntity var6 = var1.getTileEntity(var2); + if (var6 instanceof TileEntityBeacon) { + ((TileEntityBeacon)var6).a(var5.getName()); + } + } + + } + + public void doPhysics(World var1, BlockPosition var2, IBlockData var3, Block var4) { + TileEntity var5 = var1.getTileEntity(var2); + if (var5 instanceof TileEntityBeacon) { + ((TileEntityBeacon)var5).m(); + var1.playBlockAction(var2, this, 1, 0); + } + + } + + public static void f(final World var0, final BlockPosition var1) { + /* HttpUtilities.a.submit(new Runnable() { + public void run() { */ //Paper + Chunk var1x = var0.getChunkAtWorldCoords(var1); + + for(int var2 = var1.getY() - 1; var2 >= 0; --var2) { + final BlockPosition var3 = new BlockPosition(var1.getX(), var2, var1.getZ()); + if (!var1x.d(var3)) { + break; + } + + IBlockData var4 = var0.getType(var3); + if (var4.getBlock() == Blocks.BEACON) { + /* ((WorldServer)var0).postToMainThread(new Runnable() { + public void run() { */ //Paper + TileEntity tileentity = var0.getTileEntity(var3); + if (tileentity instanceof TileEntityBeacon) { + ((TileEntityBeacon)tileentity).m(); + var0.playBlockAction(var3, Blocks.BEACON, 1, 0); + } + + /*} + });*/ // Paper + } + } + + /* } + });*/ //Paper + } +} \ No newline at end of file diff --git a/TacoSpigot-Server/src/main/java/net/minecraft/server/BlockChest.java b/TacoSpigot-Server/src/main/java/net/minecraft/server/BlockChest.java index eed516e..8a0f881 100644 --- a/TacoSpigot-Server/src/main/java/net/minecraft/server/BlockChest.java +++ b/TacoSpigot-Server/src/main/java/net/minecraft/server/BlockChest.java @@ -353,7 +353,7 @@ public class BlockChest extends BlockContainer { Block block = world.getType(blockposition1).getBlock(); if (block == this) { - if (this.n(world, blockposition1)) { + if (this.n(world, blockposition1)) { // Paper - check for allowBlocked flag - MC-99321 return null; } diff --git a/TacoSpigot-Server/src/main/java/net/minecraft/server/BlockCrops.java b/TacoSpigot-Server/src/main/java/net/minecraft/server/BlockCrops.java index b91b220..f698996 100644 --- a/TacoSpigot-Server/src/main/java/net/minecraft/server/BlockCrops.java +++ b/TacoSpigot-Server/src/main/java/net/minecraft/server/BlockCrops.java @@ -26,7 +26,7 @@ public class BlockCrops extends BlockPlant implements IBlockFragilePlantElement public void b(World world, BlockPosition blockposition, IBlockData iblockdata, Random random) { super.b(world, blockposition, iblockdata, random); - if (world.getLightLevel(blockposition.up()) >= 9) { + if (world.isLightLevel(blockposition.up(), 9)) { // Paper int i = ((Integer) iblockdata.get(BlockCrops.AGE)).intValue(); if (i < 7) { diff --git a/TacoSpigot-Server/src/main/java/net/minecraft/server/BlockDiodeAbstract.java b/TacoSpigot-Server/src/main/java/net/minecraft/server/BlockDiodeAbstract.java index eaf9154..065fa3e 100644 --- a/TacoSpigot-Server/src/main/java/net/minecraft/server/BlockDiodeAbstract.java +++ b/TacoSpigot-Server/src/main/java/net/minecraft/server/BlockDiodeAbstract.java @@ -6,6 +6,7 @@ import org.bukkit.craftbukkit.event.CraftEventFactory; // CraftBukkit public abstract class BlockDiodeAbstract extends BlockDirectional { + public static final EnumDirection[] aenumdirection = EnumDirection.values(); protected final boolean N; protected BlockDiodeAbstract(boolean flag) { @@ -83,7 +84,6 @@ public abstract class BlockDiodeAbstract extends BlockDirectional { return; } // PaperSpigot end - EnumDirection[] aenumdirection = EnumDirection.values(); int i = aenumdirection.length; for (int j = 0; j < i; ++j) { @@ -191,7 +191,6 @@ public abstract class BlockDiodeAbstract extends BlockDirectional { return; } // PaperSpigot end - EnumDirection[] aenumdirection = EnumDirection.values(); int i = aenumdirection.length; for (int j = 0; j < i; ++j) { diff --git a/TacoSpigot-Server/src/main/java/net/minecraft/server/BlockFluids.java b/TacoSpigot-Server/src/main/java/net/minecraft/server/BlockFluids.java index db73f5d..f5d7ae2 100644 --- a/TacoSpigot-Server/src/main/java/net/minecraft/server/BlockFluids.java +++ b/TacoSpigot-Server/src/main/java/net/minecraft/server/BlockFluids.java @@ -5,6 +5,7 @@ import java.util.Random; public abstract class BlockFluids extends Block { + public static final EnumDirection[] aenumdirection = EnumDirection.values(); public static final BlockStateInteger LEVEL = BlockStateInteger.of("level", 0, 15); protected BlockFluids(Material material) { @@ -133,7 +134,6 @@ public abstract class BlockFluids extends Block { public boolean e(World world, BlockPosition blockposition, IBlockData iblockdata) { if (this.material == Material.LAVA) { boolean flag = false; - EnumDirection[] aenumdirection = EnumDirection.values(); int i = aenumdirection.length; for (int j = 0; j < i; ++j) { diff --git a/TacoSpigot-Server/src/main/java/net/minecraft/server/BlockPiston.java b/TacoSpigot-Server/src/main/java/net/minecraft/server/BlockPiston.java index b582f4b..8426097 100644 --- a/TacoSpigot-Server/src/main/java/net/minecraft/server/BlockPiston.java +++ b/TacoSpigot-Server/src/main/java/net/minecraft/server/BlockPiston.java @@ -16,6 +16,8 @@ import org.bukkit.event.block.BlockPistonExtendEvent; public class BlockPiston extends Block { + private final static EnumDirection[] aenumdirection = EnumDirection.values(); + public static final BlockStateDirection FACING = BlockStateDirection.of("facing"); public static final BlockStateBoolean EXTENDED = BlockStateBoolean.of("extended"); private final boolean sticky; @@ -86,7 +88,6 @@ public class BlockPiston extends Block { } private boolean a(World world, BlockPosition blockposition, EnumDirection enumdirection) { - EnumDirection[] aenumdirection = EnumDirection.values(); int i = aenumdirection.length; int j; @@ -103,12 +104,11 @@ public class BlockPiston extends Block { return true; } else { BlockPosition blockposition1 = blockposition.up(); - EnumDirection[] aenumdirection1 = EnumDirection.values(); - j = aenumdirection1.length; + j = aenumdirection.length; for (int k = 0; k < j; ++k) { - EnumDirection enumdirection2 = aenumdirection1[k]; + EnumDirection enumdirection2 = aenumdirection[k]; if (enumdirection2 != EnumDirection.DOWN && world.isBlockFacePowered(blockposition1.shift(enumdirection2), enumdirection2)) { return true; @@ -191,28 +191,28 @@ public class BlockPiston extends Block { if (enumdirection != null) { switch (BlockPiston.SyntheticClass_1.a[enumdirection.ordinal()]) { - case 1: - this.a(0.0F, 0.25F, 0.0F, 1.0F, 1.0F, 1.0F); - break; + case 1: + this.a(0.0F, 0.25F, 0.0F, 1.0F, 1.0F, 1.0F); + break; - case 2: - this.a(0.0F, 0.0F, 0.0F, 1.0F, 0.75F, 1.0F); - break; + case 2: + this.a(0.0F, 0.0F, 0.0F, 1.0F, 0.75F, 1.0F); + break; - case 3: - this.a(0.0F, 0.0F, 0.25F, 1.0F, 1.0F, 1.0F); - break; + case 3: + this.a(0.0F, 0.0F, 0.25F, 1.0F, 1.0F, 1.0F); + break; - case 4: - this.a(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 0.75F); - break; + case 4: + this.a(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 0.75F); + break; - case 5: - this.a(0.25F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F); - break; + case 5: + this.a(0.25F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F); + break; - case 6: - this.a(0.0F, 0.0F, 0.0F, 0.75F, 1.0F, 1.0F); + case 6: + this.a(0.0F, 0.0F, 0.0F, 0.75F, 1.0F, 1.0F); } } } else { @@ -478,4 +478,4 @@ public class BlockPiston extends Block { } } -} +} \ No newline at end of file diff --git a/TacoSpigot-Server/src/main/java/net/minecraft/server/BlockPosition.java b/TacoSpigot-Server/src/main/java/net/minecraft/server/BlockPosition.java index 977c44f..3260b56 100644 --- a/TacoSpigot-Server/src/main/java/net/minecraft/server/BlockPosition.java +++ b/TacoSpigot-Server/src/main/java/net/minecraft/server/BlockPosition.java @@ -1,19 +1,20 @@ package net.minecraft.server; -import com.google.common.collect.AbstractIterator; import java.util.Iterator; +import com.google.common.collect.AbstractIterator; + public class BlockPosition extends BaseBlockPosition { public static final BlockPosition ZERO = new BlockPosition(0, 0, 0); - private static final int c = 1 + MathHelper.c(MathHelper.b(30000000)); - private static final int d = BlockPosition.c; - private static final int e = 64 - BlockPosition.c - BlockPosition.d; - private static final int f = 0 + BlockPosition.d; - private static final int g = BlockPosition.f + BlockPosition.e; - private static final long h = (1L << BlockPosition.c) - 1L; - private static final long i = (1L << BlockPosition.e) - 1L; - private static final long j = (1L << BlockPosition.d) - 1L; + public static final int c = 1 + MathHelper.c(MathHelper.b(30000000)); + public static final int d = BlockPosition.c; + public static final int e = 64 - BlockPosition.c - BlockPosition.d; + public static final int f = BlockPosition.d; + public static final int g = BlockPosition.f + BlockPosition.e; + public static final long h = (1L << BlockPosition.c) - 1L; + public static final long i = (1L << BlockPosition.e) - 1L; + public static final long j = (1L << BlockPosition.d) - 1L; public BlockPosition(int i, int j, int k) { super(i, j, k); @@ -35,86 +36,6 @@ public class BlockPosition extends BaseBlockPosition { this(baseblockposition.getX(), baseblockposition.getY(), baseblockposition.getZ()); } - public BlockPosition a(double d0, double d1, double d2) { - return d0 == 0.0D && d1 == 0.0D && d2 == 0.0D ? this : new BlockPosition((double) this.getX() + d0, (double) this.getY() + d1, (double) this.getZ() + d2); - } - - public BlockPosition a(int i, int j, int k) { - return i == 0 && j == 0 && k == 0 ? this : new BlockPosition(this.getX() + i, this.getY() + j, this.getZ() + k); - } - - public BlockPosition a(BaseBlockPosition baseblockposition) { - return baseblockposition.getX() == 0 && baseblockposition.getY() == 0 && baseblockposition.getZ() == 0 ? this : new BlockPosition(this.getX() + baseblockposition.getX(), this.getY() + baseblockposition.getY(), this.getZ() + baseblockposition.getZ()); - } - - public BlockPosition b(BaseBlockPosition baseblockposition) { - return baseblockposition.getX() == 0 && baseblockposition.getY() == 0 && baseblockposition.getZ() == 0 ? this : new BlockPosition(this.getX() - baseblockposition.getX(), this.getY() - baseblockposition.getY(), this.getZ() - baseblockposition.getZ()); - } - - public BlockPosition up() { - return this.up(1); - } - - public BlockPosition up(int i) { - return this.shift(EnumDirection.UP, i); - } - - public BlockPosition down() { - return this.down(1); - } - - public BlockPosition down(int i) { - return this.shift(EnumDirection.DOWN, i); - } - - public BlockPosition north() { - return this.north(1); - } - - public BlockPosition north(int i) { - return this.shift(EnumDirection.NORTH, i); - } - - public BlockPosition south() { - return this.south(1); - } - - public BlockPosition south(int i) { - return this.shift(EnumDirection.SOUTH, i); - } - - public BlockPosition west() { - return this.west(1); - } - - public BlockPosition west(int i) { - return this.shift(EnumDirection.WEST, i); - } - - public BlockPosition east() { - return this.east(1); - } - - public BlockPosition east(int i) { - return this.shift(EnumDirection.EAST, i); - } - - public BlockPosition shift(EnumDirection enumdirection) { - return this.shift(enumdirection, 1); - } - - public BlockPosition shift(EnumDirection enumdirection, int i) { - return i == 0 ? this : new BlockPosition(this.getX() + enumdirection.getAdjacentX() * i, this.getY() + enumdirection.getAdjacentY() * i, this.getZ() + enumdirection.getAdjacentZ() * i); - } - - public BlockPosition c(BaseBlockPosition baseblockposition) { - return new BlockPosition(this.getY() * baseblockposition.getZ() - this.getZ() * baseblockposition.getY(), this.getZ() * baseblockposition.getX() - this.getX() * baseblockposition.getZ(), this.getX() * baseblockposition.getY() - this.getY() * baseblockposition.getX()); - } - - public long asLong() { - return ((long) this.getX() & BlockPosition.h) << BlockPosition.g | ((long) this.getY() & BlockPosition.i) << BlockPosition.f | ((long) this.getZ() & BlockPosition.j) << 0; - } - public static BlockPosition fromLong(long i) { int j = (int) (i << 64 - BlockPosition.g - BlockPosition.c >> 64 - BlockPosition.c); int k = (int) (i << 64 - BlockPosition.f - BlockPosition.e >> 64 - BlockPosition.e); @@ -124,20 +45,19 @@ public class BlockPosition extends BaseBlockPosition { } public static Iterable a(BlockPosition blockposition, BlockPosition blockposition1) { - final BlockPosition blockposition2 = new BlockPosition(Math.min(blockposition.getX(), blockposition1.getX()), Math.min(blockposition.getY(), blockposition1.getY()), Math.min(blockposition.getZ(), blockposition1.getZ())); - final BlockPosition blockposition3 = new BlockPosition(Math.max(blockposition.getX(), blockposition1.getX()), Math.max(blockposition.getY(), blockposition1.getY()), Math.max(blockposition.getZ(), blockposition1.getZ())); - - return new Iterable() { + return new Iterable() { + @Override public Iterator iterator() { - return new AbstractIterator() { + return new AbstractIterator() { private BlockPosition b = null; - protected BlockPosition a() { + @Override + protected BlockPosition computeNext() { if (this.b == null) { this.b = blockposition; return this.b; } else if (this.b.equals(blockposition1)) { - return (BlockPosition) this.endOfData(); + return this.endOfData(); } else { int i = this.b.getX(); int j = this.b.getY(); @@ -158,30 +78,27 @@ public class BlockPosition extends BaseBlockPosition { return this.b; } } - - protected Object computeNext() { - return this.a(); - } }; } }; } - public static Iterable b(BlockPosition blockposition, BlockPosition blockposition1) { - final BlockPosition blockposition2 = new BlockPosition(Math.min(blockposition.getX(), blockposition1.getX()), Math.min(blockposition.getY(), blockposition1.getY()), Math.min(blockposition.getZ(), blockposition1.getZ())); - final BlockPosition blockposition3 = new BlockPosition(Math.max(blockposition.getX(), blockposition1.getX()), Math.max(blockposition.getY(), blockposition1.getY()), Math.max(blockposition.getZ(), blockposition1.getZ())); - - return new Iterable() { + public static Iterable b(BlockPosition blockposition, + BlockPosition blockposition1) { + return new Iterable() { + @Override public Iterator iterator() { - return new AbstractIterator() { + return new AbstractIterator() { private BlockPosition.MutableBlockPosition b = null; - protected BlockPosition.MutableBlockPosition a() { + @Override + protected BlockPosition.MutableBlockPosition computeNext() { if (this.b == null) { - this.b = new BlockPosition.MutableBlockPosition(blockposition.getX(), blockposition.getY(), blockposition.getZ()); + this.b = new BlockPosition.MutableBlockPosition(blockposition.getX(), blockposition.getY(), + blockposition.getZ()); return this.b; } else if (this.b.equals(blockposition1)) { - return (BlockPosition.MutableBlockPosition) this.endOfData(); + return this.endOfData(); } else { int i = this.b.getX(); int j = this.b.getY(); @@ -206,15 +123,152 @@ public class BlockPosition extends BaseBlockPosition { return this.b; } } - - protected Object computeNext() { - return this.a(); - } }; } }; } + public BlockPosition a(double d0, double d1, double d2) { + return d0 == 0.0D && d1 == 0.0D && d2 == 0.0D ? this + : new BlockPosition(this.getX() + d0, this.getY() + d1, this.getZ() + d2); + } + + public BlockPosition a(int i, int j, int k) { + return i == 0 && j == 0 && k == 0 ? this : new BlockPosition(this.getX() + i, this.getY() + j, this.getZ() + k); + } + + // WindSpigot start - obfuscation helper + public BlockPosition add(int x, int y, int z) { + return a(x, y, z); + } + // WindSpigot end + + public BlockPosition a(BaseBlockPosition baseblockposition) { + return baseblockposition.getX() == 0 && baseblockposition.getY() == 0 && baseblockposition.getZ() == 0 ? this + : new BlockPosition(this.getX() + baseblockposition.getX(), this.getY() + baseblockposition.getY(), + this.getZ() + baseblockposition.getZ()); + } + + public BlockPosition b(BaseBlockPosition baseblockposition) { + return baseblockposition.getX() == 0 && baseblockposition.getY() == 0 && baseblockposition.getZ() == 0 ? this + : new BlockPosition(this.getX() - baseblockposition.getX(), this.getY() - baseblockposition.getY(), + this.getZ() - baseblockposition.getZ()); + } + + public BlockPosition up() { + return new BlockPosition(this.getX(), this.getY() + 1, this.getZ()); // Paper - Optimize BlockPosition + } + + public BlockPosition up(int i) { + return i == 0 ? this : new BlockPosition(this.getX(), this.getY() + i, this.getZ()); // Paper - Optimize + // BlockPosition + } + + public BlockPosition down() { + return new BlockPosition(this.getX(), this.getY() - 1, this.getZ()); // Paper - Optimize BlockPosition + } + + public BlockPosition down(int i) { + return i == 0 ? this : new BlockPosition(this.getX(), this.getY() - i, this.getZ()); // Paper - Optimize + // BlockPosition + } + + public BlockPosition north() { + return new BlockPosition(this.getX(), this.getY(), this.getZ() - 1); // Paper - Optimize BlockPosition + } + + public BlockPosition north(int i) { + return i == 0 ? this : new BlockPosition(this.getX(), this.getY(), this.getZ() - i); // Paper - Optimize + // BlockPosition + } + + public BlockPosition south() { + return new BlockPosition(this.getX(), this.getY(), this.getZ() + 1); // Paper - Optimize BlockPosition + } + + public BlockPosition south(int i) { + return i == 0 ? this : new BlockPosition(this.getX(), this.getY(), this.getZ() + i); // Paper - Optimize + // BlockPosition + } + + public BlockPosition west() { + return new BlockPosition(this.getX() - 1, this.getY(), this.getZ()); // Paper - Optimize BlockPosition + } + + public BlockPosition west(int i) { + return i == 0 ? this : new BlockPosition(this.getX() - i, this.getY(), this.getZ()); // Paper - Optimize + // BlockPosition + } + + public BlockPosition east() { + return new BlockPosition(this.getX() + 1, this.getY(), this.getZ()); // Paper - Optimize BlockPosition + } + + public BlockPosition east(int i) { + return i == 0 ? this : new BlockPosition(this.getX() + i, this.getY(), this.getZ()); // Paper - Optimize + // BlockPosition + } + + public BlockPosition shift(EnumDirection enumdirection) { + // Paper Start - Optimize BlockPosition + switch (enumdirection) { + case UP: + return new BlockPosition(this.getX(), this.getY() + 1, this.getZ()); + case DOWN: + return new BlockPosition(this.getX(), this.getY() - 1, this.getZ()); + case NORTH: + return new BlockPosition(this.getX(), this.getY(), this.getZ() - 1); + case SOUTH: + return new BlockPosition(this.getX(), this.getY(), this.getZ() + 1); + case WEST: + return new BlockPosition(this.getX() - 1, this.getY(), this.getZ()); + case EAST: + return new BlockPosition(this.getX() + 1, this.getY(), this.getZ()); + default: + return new BlockPosition(this.getX() + enumdirection.getAdjacentX(), + this.getY() + enumdirection.getAdjacentY(), this.getZ() + enumdirection.getAdjacentZ()); + } + // Paper End + } + + public BlockPosition shift(EnumDirection enumdirection, int i) { + // Paper Start - Optimize BlockPosition + if (i == 0) { + return this; + } + + switch (enumdirection) { + case UP: + return new BlockPosition(this.getX(), this.getY() + i, this.getZ()); + case DOWN: + return new BlockPosition(this.getX(), this.getY() - i, this.getZ()); + case NORTH: + return new BlockPosition(this.getX(), this.getY(), this.getZ() - i); + case SOUTH: + return new BlockPosition(this.getX(), this.getY(), this.getZ() + i); + case WEST: + return new BlockPosition(this.getX() - i, this.getY(), this.getZ()); + case EAST: + return new BlockPosition(this.getX() + i, this.getY(), this.getZ()); + default: + return new BlockPosition(this.getX() + enumdirection.getAdjacentX() * i, + this.getY() + enumdirection.getAdjacentY() * i, this.getZ() + enumdirection.getAdjacentZ() * i); + } + // Paper End + } + + public BlockPosition c(BaseBlockPosition baseblockposition) { + return new BlockPosition(this.getY() * baseblockposition.getZ() - this.getZ() * baseblockposition.getY(), + this.getZ() * baseblockposition.getX() - this.getX() * baseblockposition.getZ(), + this.getX() * baseblockposition.getY() - this.getY() * baseblockposition.getX()); + } + + public long asLong() { + return (this.getX() & BlockPosition.h) << BlockPosition.g | (this.getY() & BlockPosition.i) << BlockPosition.f + | (this.getZ() & BlockPosition.j); + } + + @Override public BaseBlockPosition d(BaseBlockPosition baseblockposition) { return this.c(baseblockposition); } @@ -223,23 +277,8 @@ public class BlockPosition extends BaseBlockPosition { // PaperSpigot start - remove our overriding variables /* - private int c; - private int d; - private int e; - */ - - public void setX(int x) { - ((BaseBlockPosition) this).a = x; - } - - public void setY(int y) { - ((BaseBlockPosition) this).c = y; - } - - public void setZ(int z) { - ((BaseBlockPosition) this).d = z; - } - // PaperSpigot end + * private int c; private int d; private int e; + */ public MutableBlockPosition() { this(0, 0, 0); @@ -253,19 +292,26 @@ public class BlockPosition extends BaseBlockPosition { this.setZ(k); } + public void setX(int x) { + this.a = x; + } + // PaperSpigot end + + public void setY(int y) { + ((BaseBlockPosition) this).c = y; + } + + public void setZ(int z) { + ((BaseBlockPosition) this).d = z; + } + /* - public int getX() { - return this.c; - } - - public int getY() { - return this.d; - } - - public int getZ() { - return this.e; - } - */ + * public int getX() { return this.c; } + * + * public int getY() { return this.d; } + * + * public int getZ() { return this.e; } + */ // TacoSpigot start - OBFHELPER public BlockPosition.MutableBlockPosition setValues(int x, int y, int z) { @@ -281,8 +327,9 @@ public class BlockPosition extends BaseBlockPosition { return this; } + @Override public BaseBlockPosition d(BaseBlockPosition baseblockposition) { return super.c(baseblockposition); } } -} +} \ No newline at end of file diff --git a/TacoSpigot-Server/src/main/java/net/minecraft/server/BlockRedstoneTorch.java b/TacoSpigot-Server/src/main/java/net/minecraft/server/BlockRedstoneTorch.java index 78c6d19..ae64ebf 100644 --- a/TacoSpigot-Server/src/main/java/net/minecraft/server/BlockRedstoneTorch.java +++ b/TacoSpigot-Server/src/main/java/net/minecraft/server/BlockRedstoneTorch.java @@ -1,33 +1,28 @@ package net.minecraft.server; -import com.google.common.collect.Lists; -import com.google.common.collect.Maps; -import java.util.List; -import java.util.Map; import java.util.Random; import org.bukkit.event.block.BlockRedstoneEvent; // CraftBukkit public class BlockRedstoneTorch extends BlockTorch { - private static Map> b = new java.util.WeakHashMap(); // Spigot private final boolean isOn; private boolean a(World world, BlockPosition blockposition, boolean flag) { - if (!BlockRedstoneTorch.b.containsKey(world)) { - BlockRedstoneTorch.b.put(world, Lists.newArrayList()); // CraftBukkit - fix decompile error + java.util.ArrayDeque list = world.redstoneUpdateInfos; + if (list == null) { + list = world.redstoneUpdateInfos = new java.util.ArrayDeque<>(); } - List list = (List) BlockRedstoneTorch.b.get(world); - if (flag) { list.add(new BlockRedstoneTorch.RedstoneUpdateInfo(blockposition, world.getTime())); } int i = 0; - for (int j = 0; j < list.size(); ++j) { - BlockRedstoneTorch.RedstoneUpdateInfo blockredstonetorch_redstoneupdateinfo = (BlockRedstoneTorch.RedstoneUpdateInfo) list.get(j); + for (java.util.Iterator iterator = list.iterator(); iterator + .hasNext();) { + BlockRedstoneTorch.RedstoneUpdateInfo blockredstonetorch_redstoneupdateinfo = iterator.next(); if (blockredstonetorch_redstoneupdateinfo.a.equals(blockposition)) { ++i; @@ -46,10 +41,12 @@ public class BlockRedstoneTorch extends BlockTorch { this.a((CreativeModeTab) null); } + @Override public int a(World world) { return 2; } + @Override public void onPlace(World world, BlockPosition blockposition, IBlockData iblockdata) { if (this.isOn) { // PaperSpigot start - Fix cannons @@ -75,6 +72,7 @@ public class BlockRedstoneTorch extends BlockTorch { } + @Override public void remove(World world, BlockPosition blockposition, IBlockData iblockdata) { if (this.isOn) { // PaperSpigot start - Fix cannons @@ -100,29 +98,39 @@ public class BlockRedstoneTorch extends BlockTorch { } - public int a(IBlockAccess iblockaccess, BlockPosition blockposition, IBlockData iblockdata, EnumDirection enumdirection) { - return this.isOn && iblockdata.get(BlockRedstoneTorch.FACING) != enumdirection ? 15 : 0; + @Override + public int a(IBlockAccess iblockaccess, BlockPosition blockposition, IBlockData iblockdata, + EnumDirection enumdirection) { + return this.isOn && iblockdata.get(BlockTorch.FACING) != enumdirection ? 15 : 0; } private boolean g(World world, BlockPosition blockposition, IBlockData iblockdata) { - EnumDirection enumdirection = ((EnumDirection) iblockdata.get(BlockRedstoneTorch.FACING)).opposite(); + EnumDirection enumdirection = iblockdata.get(BlockTorch.FACING).opposite(); return world.isBlockFacePowered(blockposition.shift(enumdirection), enumdirection); } - public void a(World world, BlockPosition blockposition, IBlockData iblockdata, Random random) {} + @Override + public void a(World world, BlockPosition blockposition, IBlockData iblockdata, Random random) { + } + @Override public void b(World world, BlockPosition blockposition, IBlockData iblockdata, Random random) { boolean flag = this.g(world, blockposition, iblockdata); - List list = (List) BlockRedstoneTorch.b.get(world); - - while (list != null && !list.isEmpty() && world.getTime() - ((BlockRedstoneTorch.RedstoneUpdateInfo) list.get(0)).b > 60L) { - list.remove(0); + // Paper start + java.util.ArrayDeque redstoneUpdateInfos = world.redstoneUpdateInfos; + if (redstoneUpdateInfos != null) { + BlockRedstoneTorch.RedstoneUpdateInfo curr; + while ((curr = redstoneUpdateInfos.peek()) != null && world.getTime() - curr.getTime() > 60L) { + redstoneUpdateInfos.poll(); + } } + // Paper end // CraftBukkit start org.bukkit.plugin.PluginManager manager = world.getServer().getPluginManager(); - org.bukkit.block.Block block = world.getWorld().getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ()); + org.bukkit.block.Block block = world.getWorld().getBlockAt(blockposition.getX(), blockposition.getY(), + blockposition.getZ()); int oldCurrent = this.isOn ? 15 : 0; BlockRedstoneEvent event = new BlockRedstoneEvent(block, oldCurrent, oldCurrent); @@ -139,14 +147,17 @@ public class BlockRedstoneTorch extends BlockTorch { } } // CraftBukkit end - world.setTypeAndData(blockposition, Blocks.UNLIT_REDSTONE_TORCH.getBlockData().set(BlockRedstoneTorch.FACING, iblockdata.get(BlockRedstoneTorch.FACING)), 3); + world.setTypeAndData(blockposition, Blocks.UNLIT_REDSTONE_TORCH.getBlockData().set(BlockTorch.FACING, + iblockdata.get(BlockTorch.FACING)), 3); if (this.a(world, blockposition, true)) { - world.makeSound((double) ((float) blockposition.getX() + 0.5F), (double) ((float) blockposition.getY() + 0.5F), (double) ((float) blockposition.getZ() + 0.5F), "random.fizz", 0.5F, 2.6F + (world.random.nextFloat() - world.random.nextFloat()) * 0.8F); + world.makeSound(blockposition.getX() + 0.5F, blockposition.getY() + 0.5F, + blockposition.getZ() + 0.5F, "random.fizz", 0.5F, + 2.6F + (world.random.nextFloat() - world.random.nextFloat()) * 0.8F); for (int i = 0; i < 5; ++i) { - double d0 = (double) blockposition.getX() + random.nextDouble() * 0.6D + 0.2D; - double d1 = (double) blockposition.getY() + random.nextDouble() * 0.6D + 0.2D; - double d2 = (double) blockposition.getZ() + random.nextDouble() * 0.6D + 0.2D; + double d0 = blockposition.getX() + random.nextDouble() * 0.6D + 0.2D; + double d1 = blockposition.getY() + random.nextDouble() * 0.6D + 0.2D; + double d2 = blockposition.getZ() + random.nextDouble() * 0.6D + 0.2D; world.addParticle(EnumParticle.SMOKE_NORMAL, d0, d1, d2, 0.0D, 0.0D, 0.0D, new int[0]); } @@ -164,32 +175,39 @@ public class BlockRedstoneTorch extends BlockTorch { } } // CraftBukkit end - world.setTypeAndData(blockposition, Blocks.REDSTONE_TORCH.getBlockData().set(BlockRedstoneTorch.FACING, iblockdata.get(BlockRedstoneTorch.FACING)), 3); + world.setTypeAndData(blockposition, + Blocks.REDSTONE_TORCH.getBlockData().set(BlockTorch.FACING, iblockdata.get(BlockTorch.FACING)), 3); } } + @Override public void doPhysics(World world, BlockPosition blockposition, IBlockData iblockdata, Block block) { if (!this.e(world, blockposition, iblockdata)) { if (this.isOn == this.g(world, blockposition, iblockdata)) { - world.a(blockposition, (Block) this, this.a(world)); + world.a(blockposition, this, this.a(world)); } } } - public int b(IBlockAccess iblockaccess, BlockPosition blockposition, IBlockData iblockdata, EnumDirection enumdirection) { + @Override + public int b(IBlockAccess iblockaccess, BlockPosition blockposition, IBlockData iblockdata, + EnumDirection enumdirection) { return enumdirection == EnumDirection.DOWN ? this.a(iblockaccess, blockposition, iblockdata, enumdirection) : 0; } + @Override public Item getDropType(IBlockData iblockdata, Random random, int i) { return Item.getItemOf(Blocks.REDSTONE_TORCH); } + @Override public boolean isPowerSource() { return true; } + @Override public boolean b(Block block) { return block == Blocks.UNLIT_REDSTONE_TORCH || block == Blocks.REDSTONE_TORCH; } @@ -199,9 +217,13 @@ public class BlockRedstoneTorch extends BlockTorch { BlockPosition a; long b; + final long getTime() { + return this.b; + } // Paper - OBFHELPER + public RedstoneUpdateInfo(BlockPosition blockposition, long i) { this.a = blockposition; this.b = i; } } -} +} \ No newline at end of file diff --git a/TacoSpigot-Server/src/main/java/net/minecraft/server/BlockSnowBlock.java b/TacoSpigot-Server/src/main/java/net/minecraft/server/BlockSnowBlock.java new file mode 100644 index 0000000..c6fd60b --- /dev/null +++ b/TacoSpigot-Server/src/main/java/net/minecraft/server/BlockSnowBlock.java @@ -0,0 +1,30 @@ +package net.minecraft.server; + +import java.util.Random; + +public class BlockSnowBlock extends Block { + protected BlockSnowBlock() { + super(Material.SNOW_BLOCK); +// this.a(true); // Paper - snow blocks don't need to tick + this.a(CreativeModeTab.b); + } + + @Override + public Item getDropType(IBlockData var1, Random var2, int var3) { + return Items.SNOWBALL; + } + + @Override + public int a(Random var1) { + return 4; + } + + // Paper start - snow blocks don't need to tick + /* + * public void b(World var1, BlockPosition var2, IBlockData var3, Random var4) { + * if (var1.b(EnumSkyBlock.BLOCK, var2) > 11) { this.b(var1, var2, + * var1.getType(var2), 0); var1.setAir(var2); } + * + * } + */ +} \ No newline at end of file diff --git a/TacoSpigot-Server/src/main/java/net/minecraft/server/BlockStationary.java b/TacoSpigot-Server/src/main/java/net/minecraft/server/BlockStationary.java index 4860aa4..a4ff3f8 100644 --- a/TacoSpigot-Server/src/main/java/net/minecraft/server/BlockStationary.java +++ b/TacoSpigot-Server/src/main/java/net/minecraft/server/BlockStationary.java @@ -80,7 +80,6 @@ public class BlockStationary extends BlockFluids { } protected boolean f(World world, BlockPosition blockposition) { - EnumDirection[] aenumdirection = EnumDirection.values(); int i = aenumdirection.length; for (int j = 0; j < i; ++j) { diff --git a/TacoSpigot-Server/src/main/java/net/minecraft/server/BlockStem.java b/TacoSpigot-Server/src/main/java/net/minecraft/server/BlockStem.java index 2618c40..0a6871b 100644 --- a/TacoSpigot-Server/src/main/java/net/minecraft/server/BlockStem.java +++ b/TacoSpigot-Server/src/main/java/net/minecraft/server/BlockStem.java @@ -52,7 +52,7 @@ public class BlockStem extends BlockPlant implements IBlockFragilePlantElement { public void b(World world, BlockPosition blockposition, IBlockData iblockdata, Random random) { super.b(world, blockposition, iblockdata, random); - if (world.getLightLevel(blockposition.up()) >= 9) { + if (world.isLightLevel(blockposition.up(), 9)) { // Paper float f = BlockCrops.a((Block) this, world, blockposition); if (random.nextInt((int) (world.growthOdds / (this == Blocks.PUMPKIN_STEM? world.spigotConfig.pumpkinModifier : world.spigotConfig.melonModifier) * (25.0F / f)) + 1) == 0) { // Spigot diff --git a/TacoSpigot-Server/src/main/java/net/minecraft/server/Chunk.java b/TacoSpigot-Server/src/main/java/net/minecraft/server/Chunk.java index 590fab6..1157d4e 100644 --- a/TacoSpigot-Server/src/main/java/net/minecraft/server/Chunk.java +++ b/TacoSpigot-Server/src/main/java/net/minecraft/server/Chunk.java @@ -98,6 +98,10 @@ public class Chunk { } // PaperSpigot end + private boolean isTicked() { + return this.p; + } + // CraftBukkit start - Neighbor loaded cache for chunk lighting and entity ticking private int neighbors = 0x1 << 12; @@ -689,6 +693,10 @@ public class Chunk { } + public int getLightSubtracted(BlockPosition blockposition, int i) { + return this.a(blockposition, i); + } + public int a(BlockPosition blockposition, int i) { int j = blockposition.getX() & 15; int k = blockposition.getY(); @@ -812,6 +820,14 @@ public class Chunk { return j >= this.heightMap[k << 4 | i]; } + public boolean isBelowHeightMap(int blockposition_x, int blockposition_y, int blockposition_z) { + int i = blockposition_x & 15; + int j = blockposition_y; + int k = blockposition_z & 15; + + return j >= this.heightMap[k << 4 | i]; + } + private TileEntity i(BlockPosition blockposition) { Block block = this.getType(blockposition); @@ -1188,7 +1204,7 @@ public class Chunk { * We cannot unfortunately do this lighting stage during chunk gen as it appears to put a lot more noticeable load on the server, than when it is done at play time. * For now at least we will simply send all chunks, in accordance with pre 1.7 behaviour. */ - return true; + return !this.world.spigotConfig.randomLightUpdates || (this.isTicked() && this.done && this.lit); // Spigot End } diff --git a/TacoSpigot-Server/src/main/java/net/minecraft/server/DataWatcher.java b/TacoSpigot-Server/src/main/java/net/minecraft/server/DataWatcher.java index 1fbbfaa..ed52d3c 100644 --- a/TacoSpigot-Server/src/main/java/net/minecraft/server/DataWatcher.java +++ b/TacoSpigot-Server/src/main/java/net/minecraft/server/DataWatcher.java @@ -1,22 +1,21 @@ package net.minecraft.server; -import com.google.common.collect.Lists; -import com.google.common.collect.Maps; import java.io.IOException; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Map; -import java.util.concurrent.locks.ReadWriteLock; -import java.util.concurrent.locks.ReentrantReadWriteLock; + import org.apache.commons.lang3.ObjectUtils; + +import com.google.common.collect.Lists; + +import it.unimi.dsi.fastutil.ints.Int2ObjectMap; +import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; +// TacoSpigot end // TacoSpigot start import it.unimi.dsi.fastutil.objects.Object2IntMap; import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap; -import it.unimi.dsi.fastutil.ints.Int2ObjectMap; -import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; -import it.unimi.dsi.fastutil.ints.IntIterator; -// TacoSpigot end public class DataWatcher { @@ -32,13 +31,17 @@ public class DataWatcher { // TacoSpigot end // Spigot End private boolean e; - private ReadWriteLock f = new ReentrantReadWriteLock(); + // private ReadWriteLock f = new ReentrantReadWriteLock(); // Spigot - Remove DataWatcher Locking + boolean registrationLocked; // Spigot public DataWatcher(Entity entity) { this.a = entity; } public void a(int i, T t0) { + if (this.registrationLocked) { + throw new IllegalStateException("Registering datawatcher object after entity initialization"); // Spigot + } int integer = classToId.get(t0.getClass()); // Spigot if (integer == -1) { // Spigot @@ -50,9 +53,9 @@ public class DataWatcher { } else { DataWatcher.WatchableObject datawatcher_watchableobject = new DataWatcher.WatchableObject(integer, i, t0); // Spigot - this.f.writeLock().lock(); +// this.f.writeLock().lock(); // Spigot - not required this.dataValues.put(i, datawatcher_watchableobject); // Spigot - this.f.writeLock().unlock(); +// this.f.writeLock().unlock(); // Spigot - not required this.b = false; } } @@ -60,9 +63,9 @@ public class DataWatcher { public void add(int i, int j) { DataWatcher.WatchableObject datawatcher_watchableobject = new DataWatcher.WatchableObject(j, i, (Object) null); - this.f.writeLock().lock(); +// this.f.writeLock().lock(); // Spigot - not required this.dataValues.put(i, datawatcher_watchableobject); // Spigot - this.f.writeLock().unlock(); +// this.f.writeLock().unlock(); // Spigot - not required this.b = false; } @@ -91,22 +94,25 @@ public class DataWatcher { } private DataWatcher.WatchableObject j(int i) { - this.f.readLock().lock(); - - DataWatcher.WatchableObject datawatcher_watchableobject; - - try { - datawatcher_watchableobject = (DataWatcher.WatchableObject) this.dataValues.get(i); // Spigot - } catch (Throwable throwable) { - CrashReport crashreport = CrashReport.a(throwable, "Getting synched entity data"); - CrashReportSystemDetails crashreportsystemdetails = crashreport.a("Synched entity data"); - - crashreportsystemdetails.a("Data ID", (Object) Integer.valueOf(i)); - throw new ReportedException(crashreport); - } - - this.f.readLock().unlock(); - return datawatcher_watchableobject; + // Spigot - not required + /* + * this.f.readLock().lock(); + * + * DataWatcher.WatchableObject datawatcher_watchableobject; + * + * try { datawatcher_watchableobject = (DataWatcher.WatchableObject) + * this.dataValues.get(i); // Spigot } catch (Throwable throwable) { CrashReport + * crashreport = CrashReport.a(throwable, "Getting synched entity data"); + * CrashReportSystemDetails crashreportsystemdetails = + * crashreport.a("Synched entity data"); + * + * crashreportsystemdetails.a("Data ID", (Object) Integer.valueOf(i)); throw new + * ReportedException(crashreport); } + * + * this.f.readLock().unlock(); return datawatcher_watchableobject; + * + */ + return (WatchableObject) this.dataValues.get(i); } public Vector3f h(int i) { @@ -134,25 +140,25 @@ public class DataWatcher { return this.e; } - public static void a(List list, PacketDataSerializer packetdataserializer) throws IOException { + public static void a(List list, PacketDataSerializer serializer) throws IOException { if (list != null) { Iterator iterator = list.iterator(); while (iterator.hasNext()) { DataWatcher.WatchableObject datawatcher_watchableobject = (DataWatcher.WatchableObject) iterator.next(); - a(packetdataserializer, datawatcher_watchableobject); + a(serializer, datawatcher_watchableobject); } } - packetdataserializer.writeByte(127); + serializer.writeByte(127); } public List b() { ArrayList arraylist = null; if (this.e) { - this.f.readLock().lock(); +// this.f.readLock().lock(); // Spigot - not required Iterator iterator = this.dataValues.values().iterator(); // Spigot // TacoSpigot while (iterator.hasNext()) { @@ -164,14 +170,11 @@ public class DataWatcher { arraylist = Lists.newArrayList(); } - // Spigot start - copy ItemStacks to prevent ConcurrentModificationExceptions - if ( datawatcher_watchableobject.b() instanceof ItemStack ) - { - datawatcher_watchableobject = new WatchableObject( - datawatcher_watchableobject.c(), + // Spigot start - copy ItemStacks to prevent ConcurrentModificationExceptions + if (datawatcher_watchableobject.b() instanceof ItemStack) { + datawatcher_watchableobject = new WatchableObject(datawatcher_watchableobject.c(), datawatcher_watchableobject.a(), - ( (ItemStack) datawatcher_watchableobject.b() ).cloneItemStack() - ); + ((ItemStack) datawatcher_watchableobject.b()).cloneItemStack()); } // Spigot end @@ -179,106 +182,102 @@ public class DataWatcher { } } - this.f.readLock().unlock(); +// this.f.readLock().unlock(); // Spigot - not required } this.e = false; return arraylist; } - public void a(PacketDataSerializer packetdataserializer) throws IOException { - this.f.readLock().lock(); + public void a(PacketDataSerializer serializer) throws IOException { +// this.f.readLock().lock(); // Spigot - not required Iterator iterator = this.dataValues.values().iterator(); // Spigot // TacoSpigot while (iterator.hasNext()) { DataWatcher.WatchableObject datawatcher_watchableobject = (DataWatcher.WatchableObject) iterator.next(); - a(packetdataserializer, datawatcher_watchableobject); + a(serializer, datawatcher_watchableobject); } - this.f.readLock().unlock(); - packetdataserializer.writeByte(127); +// this.f.readLock().unlock(); // Spigot - not required + serializer.writeByte(127); } public List c() { ArrayList arraylist = Lists.newArrayList(); // Spigot - this.f.readLock().lock(); +// this.f.readLock().lock(); // Spigot - not required arraylist.addAll(this.dataValues.values()); // Spigot // TacoSpigot // Spigot start - copy ItemStacks to prevent ConcurrentModificationExceptions - for ( int i = 0; i < arraylist.size(); i++ ) - { - WatchableObject watchableobject = (WatchableObject) arraylist.get( i ); - if ( watchableobject.b() instanceof ItemStack ) - { - watchableobject = new WatchableObject( - watchableobject.c(), - watchableobject.a(), - ( (ItemStack) watchableobject.b() ).cloneItemStack() - ); - arraylist.set( i, watchableobject ); + for (int i = 0; i < arraylist.size(); i++) { + WatchableObject watchableobject = (WatchableObject) arraylist.get(i); + if (watchableobject.b() instanceof ItemStack) { + watchableobject = new WatchableObject(watchableobject.c(), watchableobject.a(), + ((ItemStack) watchableobject.b()).cloneItemStack()); + arraylist.set(i, watchableobject); } } // Spigot end - this.f.readLock().unlock(); +// this.f.readLock().unlock(); // Spigot - not required return arraylist; } - private static void a(PacketDataSerializer packetdataserializer, DataWatcher.WatchableObject datawatcher_watchableobject) throws IOException { + private static void a(PacketDataSerializer serializer, DataWatcher.WatchableObject datawatcher_watchableobject) + throws IOException { int i = (datawatcher_watchableobject.c() << 5 | datawatcher_watchableobject.a() & 31) & 255; - packetdataserializer.writeByte(i); + serializer.writeByte(i); switch (datawatcher_watchableobject.c()) { - case 0: - packetdataserializer.writeByte(((Byte) datawatcher_watchableobject.b()).byteValue()); - break; + case 0: + serializer.writeByte(((Byte) datawatcher_watchableobject.b()).byteValue()); + break; - case 1: - packetdataserializer.writeShort(((Short) datawatcher_watchableobject.b()).shortValue()); - break; + case 1: + serializer.writeShort(((Short) datawatcher_watchableobject.b()).shortValue()); + break; - case 2: - packetdataserializer.writeInt(((Integer) datawatcher_watchableobject.b()).intValue()); - break; + case 2: + serializer.writeInt(((Integer) datawatcher_watchableobject.b()).intValue()); + break; - case 3: - packetdataserializer.writeFloat(((Float) datawatcher_watchableobject.b()).floatValue()); - break; + case 3: + serializer.writeFloat(((Float) datawatcher_watchableobject.b()).floatValue()); + break; - case 4: - packetdataserializer.a((String) datawatcher_watchableobject.b()); - break; + case 4: + serializer.a((String) datawatcher_watchableobject.b()); + break; - case 5: - ItemStack itemstack = (ItemStack) datawatcher_watchableobject.b(); + case 5: + ItemStack itemstack = (ItemStack) datawatcher_watchableobject.b(); - packetdataserializer.a(itemstack); - break; + serializer.a(itemstack); + break; - case 6: - BlockPosition blockposition = (BlockPosition) datawatcher_watchableobject.b(); + case 6: + BlockPosition blockposition = (BlockPosition) datawatcher_watchableobject.b(); - packetdataserializer.writeInt(blockposition.getX()); - packetdataserializer.writeInt(blockposition.getY()); - packetdataserializer.writeInt(blockposition.getZ()); - break; + serializer.writeInt(blockposition.getX()); + serializer.writeInt(blockposition.getY()); + serializer.writeInt(blockposition.getZ()); + break; - case 7: - Vector3f vector3f = (Vector3f) datawatcher_watchableobject.b(); + case 7: + Vector3f vector3f = (Vector3f) datawatcher_watchableobject.b(); - packetdataserializer.writeFloat(vector3f.getX()); - packetdataserializer.writeFloat(vector3f.getY()); - packetdataserializer.writeFloat(vector3f.getZ()); + serializer.writeFloat(vector3f.getX()); + serializer.writeFloat(vector3f.getY()); + serializer.writeFloat(vector3f.getZ()); } } - public static List b(PacketDataSerializer packetdataserializer) throws IOException { + public static List b(PacketDataSerializer serializer) throws IOException { ArrayList arraylist = null; - for (byte b0 = packetdataserializer.readByte(); b0 != 127; b0 = packetdataserializer.readByte()) { + for (byte b0 = serializer.readByte(); b0 != 127; b0 = serializer.readByte()) { if (arraylist == null) { arraylist = Lists.newArrayList(); } @@ -288,44 +287,48 @@ public class DataWatcher { DataWatcher.WatchableObject datawatcher_watchableobject = null; switch (i) { - case 0: - datawatcher_watchableobject = new DataWatcher.WatchableObject(i, j, Byte.valueOf(packetdataserializer.readByte())); - break; + case 0: + datawatcher_watchableobject = new DataWatcher.WatchableObject(i, j, + Byte.valueOf(serializer.readByte())); + break; - case 1: - datawatcher_watchableobject = new DataWatcher.WatchableObject(i, j, Short.valueOf(packetdataserializer.readShort())); - break; + case 1: + datawatcher_watchableobject = new DataWatcher.WatchableObject(i, j, + Short.valueOf(serializer.readShort())); + break; - case 2: - datawatcher_watchableobject = new DataWatcher.WatchableObject(i, j, Integer.valueOf(packetdataserializer.readInt())); - break; + case 2: + datawatcher_watchableobject = new DataWatcher.WatchableObject(i, j, + Integer.valueOf(serializer.readInt())); + break; - case 3: - datawatcher_watchableobject = new DataWatcher.WatchableObject(i, j, Float.valueOf(packetdataserializer.readFloat())); - break; + case 3: + datawatcher_watchableobject = new DataWatcher.WatchableObject(i, j, + Float.valueOf(serializer.readFloat())); + break; - case 4: - datawatcher_watchableobject = new DataWatcher.WatchableObject(i, j, packetdataserializer.c(32767)); - break; + case 4: + datawatcher_watchableobject = new DataWatcher.WatchableObject(i, j, serializer.c(32767)); + break; - case 5: - datawatcher_watchableobject = new DataWatcher.WatchableObject(i, j, packetdataserializer.i()); - break; + case 5: + datawatcher_watchableobject = new DataWatcher.WatchableObject(i, j, serializer.i()); + break; - case 6: - int k = packetdataserializer.readInt(); - int l = packetdataserializer.readInt(); - int i1 = packetdataserializer.readInt(); + case 6: + int k = serializer.readInt(); + int l = serializer.readInt(); + int i1 = serializer.readInt(); - datawatcher_watchableobject = new DataWatcher.WatchableObject(i, j, new BlockPosition(k, l, i1)); - break; + datawatcher_watchableobject = new DataWatcher.WatchableObject(i, j, new BlockPosition(k, l, i1)); + break; - case 7: - float f = packetdataserializer.readFloat(); - float f1 = packetdataserializer.readFloat(); - float f2 = packetdataserializer.readFloat(); + case 7: + float f = serializer.readFloat(); + float f1 = serializer.readFloat(); + float f2 = serializer.readFloat(); - datawatcher_watchableobject = new DataWatcher.WatchableObject(i, j, new Vector3f(f, f1, f2)); + datawatcher_watchableobject = new DataWatcher.WatchableObject(i, j, new Vector3f(f, f1, f2)); } arraylist.add(datawatcher_watchableobject); @@ -393,4 +396,4 @@ public class DataWatcher { this.d = flag; } } -} +} \ No newline at end of file diff --git a/TacoSpigot-Server/src/main/java/net/minecraft/server/Entity.java b/TacoSpigot-Server/src/main/java/net/minecraft/server/Entity.java index 92734af..99303c3 100644 --- a/TacoSpigot-Server/src/main/java/net/minecraft/server/Entity.java +++ b/TacoSpigot-Server/src/main/java/net/minecraft/server/Entity.java @@ -7,6 +7,8 @@ import java.util.UUID; import java.util.concurrent.Callable; // CraftBukkit start +import com.elevatemc.spigot.util.FastRandom; +import org.apache.logging.log4j.LogManager; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.Server; @@ -118,6 +120,11 @@ public abstract class Entity implements ICommandListener { public boolean ai; public int portalCooldown; protected boolean ak; + + public final boolean inPortal() { + return this.ak; + } // Paper - OBFHELPER + protected int al; public int dimension; protected BlockPosition an; @@ -132,6 +139,21 @@ public abstract class Entity implements ICommandListener { public boolean inUnloadedChunk = false; // PaperSpigot - Remove entities in unloaded chunks public boolean loadChunks = false; // PaperSpigot - Entities can load chunks they move through and keep them loaded + public static Random SHARED_RANDOM = new FastRandom() { + private boolean locked = false; + + @Override + public synchronized void setSeed(long seed) { + if (locked) { + LogManager.getLogger().error("Ignoring setSeed on Entity.SHARED_RANDOM", new Throwable()); + } else { + super.setSeed(seed); + locked = true; + } + } + }; + + // Spigot start public Timing tickTimer = SpigotTimings.getEntityTimings(this); // Spigot public final byte activationType = org.spigotmc.ActivationRange.initializeEntityActivationType(this); @@ -160,7 +182,7 @@ public abstract class Entity implements ICommandListener { this.width = 0.6F; this.length = 1.8F; this.h = 1; - this.random = new Random(); + this.random = SHARED_RANDOM; // Paper this.maxFireTicks = 1; this.justCreated = true; this.uniqueID = MathHelper.a(this.random); @@ -414,7 +436,7 @@ public abstract class Entity implements ICommandListener { return this.b(axisalignedbb); } - private boolean b(AxisAlignedBB axisalignedbb) { // MonkeySpigot - Don't check for entities + private boolean b(AxisAlignedBB axisalignedbb) { // eSpigot - Don't check for entities return this.world.getCubesNoEntities(this, axisalignedbb).isEmpty() && !this.world.containsLiquid(axisalignedbb); } @@ -539,7 +561,7 @@ public abstract class Entity implements ICommandListener { AxisAlignedBB axisalignedbb2; Iterator iterator1; - // MonkeySpigot start - getCubesNoEntities + // eSpigot start - getCubesNoEntities if(this.world.tacoSpigotConfig.fixEastWest && Math.abs(d0) > Math.abs(d2)) { //TacoSpigot - fix east/west cannoning by calculating the z movement before x if the x velocity is greater if(axisScan) list = this.world.getCubesNoEntities(this, this.getBoundingBox().a(0, 0, d2)); // TacoSpigot - get z axis blocks @@ -571,7 +593,7 @@ public abstract class Entity implements ICommandListener { for (iterator1 = list.iterator(); iterator1.hasNext(); d2 = axisalignedbb2.c(this.getBoundingBox(), d2)) { axisalignedbb2 = (AxisAlignedBB) iterator1.next(); } - // MonkeySpigot end + // eSpigot end this.a(this.getBoundingBox().c(0.0D, 0.0D, d2)); } @@ -584,7 +606,7 @@ public abstract class Entity implements ICommandListener { this.a(axisalignedbb); d1 = (double) this.S; - List list1 = this.world.getCubesNoEntities(this, this.getBoundingBox().a(d6, d1, d8)); // MonkeySpigot - Don't check entities + List list1 = this.world.getCubesNoEntities(this, this.getBoundingBox().a(d6, d1, d8)); // eSpigot - Don't check entities AxisAlignedBB axisalignedbb4 = this.getBoundingBox(); AxisAlignedBB axisalignedbb5 = axisalignedbb4.a(d6, 0.0D, d8); double d13 = d1; diff --git a/TacoSpigot-Server/src/main/java/net/minecraft/server/EntityArmorStand.java b/TacoSpigot-Server/src/main/java/net/minecraft/server/EntityArmorStand.java index 7be0351..bdbd2ed 100644 --- a/TacoSpigot-Server/src/main/java/net/minecraft/server/EntityArmorStand.java +++ b/TacoSpigot-Server/src/main/java/net/minecraft/server/EntityArmorStand.java @@ -208,6 +208,11 @@ public class EntityArmorStand extends EntityLiving { } + @Override + public boolean canBreatheUnderwater() { // Skips a bit of damage handling code, probably a micro-optimization + return true; + } + private NBTTagCompound z() { NBTTagCompound nbttagcompound = new NBTTagCompound(); diff --git a/TacoSpigot-Server/src/main/java/net/minecraft/server/EntityExperienceOrb.java b/TacoSpigot-Server/src/main/java/net/minecraft/server/EntityExperienceOrb.java index aefa9fa..0035be9 100644 --- a/TacoSpigot-Server/src/main/java/net/minecraft/server/EntityExperienceOrb.java +++ b/TacoSpigot-Server/src/main/java/net/minecraft/server/EntityExperienceOrb.java @@ -145,7 +145,7 @@ public class EntityExperienceOrb extends Entity { public void b(NBTTagCompound nbttagcompound) { nbttagcompound.setShort("Health", (short) ((byte) this.d)); nbttagcompound.setShort("Age", (short) this.b); - nbttagcompound.setShort("Value", (short) this.value); + nbttagcompound.setInt("Value", (short) this.value); } public void a(NBTTagCompound nbttagcompound) { diff --git a/TacoSpigot-Server/src/main/java/net/minecraft/server/EntityFishingHook.java b/TacoSpigot-Server/src/main/java/net/minecraft/server/EntityFishingHook.java index df6ce0d..2a90f79 100644 --- a/TacoSpigot-Server/src/main/java/net/minecraft/server/EntityFishingHook.java +++ b/TacoSpigot-Server/src/main/java/net/minecraft/server/EntityFishingHook.java @@ -360,6 +360,9 @@ public class EntityFishingHook extends Entity { this.motY *= (double) f2; this.motZ *= (double) f2; this.setPosition(this.locX, this.locY, this.locZ); + if (inPortal()) { + die(); + } } } } diff --git a/TacoSpigot-Server/src/main/java/net/minecraft/server/EntityHuman.java b/TacoSpigot-Server/src/main/java/net/minecraft/server/EntityHuman.java index 0568367..fac3c8e 100644 --- a/TacoSpigot-Server/src/main/java/net/minecraft/server/EntityHuman.java +++ b/TacoSpigot-Server/src/main/java/net/minecraft/server/EntityHuman.java @@ -3,6 +3,7 @@ package net.minecraft.server; import com.google.common.base.Charsets; import com.google.common.collect.Lists; import com.mojang.authlib.GameProfile; +import com.elevatemc.spigot.eSpigot; import org.bukkit.craftbukkit.entity.CraftHumanEntity; import org.bukkit.craftbukkit.entity.CraftItem; import org.bukkit.craftbukkit.inventory.CraftItemStack; @@ -12,8 +13,7 @@ import org.bukkit.event.player.PlayerBedEnterEvent; import org.bukkit.event.player.PlayerBedLeaveEvent; import org.bukkit.event.player.PlayerDropItemEvent; import org.bukkit.event.player.PlayerItemConsumeEvent; -import monkey.sindre.spigot.MonkeySpigot; -import monkey.sindre.spigot.knockback.KnockbackProfile; +import com.elevatemc.spigot.knockback.KnockbackProfile; import org.bukkit.util.Vector; import java.util.Collection; @@ -664,6 +664,13 @@ public abstract class EntityHuman extends EntityLiving { this.b(StatisticList.v); } + // Paper start - remove player from map on drop + if (itemstack.getItem() == Items.FILLED_MAP) { + WorldMap worldmap = ((ItemWorldMap) itemstack.getItem()).getSavedMap(itemstack, this.world); + worldmap.updateSeenPlayers(this, itemstack); + } + // Paper end + return entityitem; } } @@ -1059,7 +1066,7 @@ public abstract class EntityHuman extends EntityLiving { if (flag2) { if (entity instanceof EntityPlayer) { if (((EntityPlayer) entity).knockbackProfile == null) - ((EntityPlayer) entity).knockbackProfile = MonkeySpigot.getInstance().getKnockbackHandler().getActiveProfile(); + ((EntityPlayer) entity).knockbackProfile = eSpigot.getInstance().getKnockbackHandler().getActiveProfile(); KnockbackProfile knockbackProfile = ((EntityPlayer) entity).knockbackProfile; diff --git a/TacoSpigot-Server/src/main/java/net/minecraft/server/EntityItem.java b/TacoSpigot-Server/src/main/java/net/minecraft/server/EntityItem.java index 34a51a5..bb2710f 100644 --- a/TacoSpigot-Server/src/main/java/net/minecraft/server/EntityItem.java +++ b/TacoSpigot-Server/src/main/java/net/minecraft/server/EntityItem.java @@ -70,6 +70,7 @@ public class EntityItem extends Entity implements HopperPusher { // CraftBukkit start - Use wall time for pickup and despawn timers int elapsedTicks = MinecraftServer.currentTick - this.lastTick; if (this.pickupDelay != 32767) this.pickupDelay -= elapsedTicks; + this.pickupDelay = Math.max(0, this.pickupDelay); // Paper - don't go below 0 if (this.age != -32768) this.age += elapsedTicks; this.lastTick = MinecraftServer.currentTick; // CraftBukkit end @@ -137,6 +138,7 @@ public class EntityItem extends Entity implements HopperPusher { // CraftBukkit start - Use wall time for pickup and despawn timers int elapsedTicks = MinecraftServer.currentTick - this.lastTick; if (this.pickupDelay != 32767) this.pickupDelay -= elapsedTicks; + this.pickupDelay = Math.max(0, this.pickupDelay); // Paper - don't go below 0 if (this.age != -32768) this.age += elapsedTicks; this.lastTick = MinecraftServer.currentTick; // CraftBukkit end diff --git a/TacoSpigot-Server/src/main/java/net/minecraft/server/EntityLiving.java b/TacoSpigot-Server/src/main/java/net/minecraft/server/EntityLiving.java index a29ada9..d8620c9 100644 --- a/TacoSpigot-Server/src/main/java/net/minecraft/server/EntityLiving.java +++ b/TacoSpigot-Server/src/main/java/net/minecraft/server/EntityLiving.java @@ -27,8 +27,8 @@ import org.bukkit.event.vehicle.VehicleExitEvent; // PaperSpigot start import org.bukkit.Bukkit; -import monkey.sindre.spigot.MonkeyFeature; -import monkey.sindre.spigot.MonkeySpigot; +import com.elevatemc.spigot.MonkeyFeature; +import com.elevatemc.spigot.eSpigot; import org.spigotmc.event.entity.EntityDismountEvent; // PaperSpigot end @@ -167,6 +167,10 @@ public abstract class EntityLiving extends Entity { super.a(d0, flag, block, blockposition); } + public boolean canBreatheUnderwater() { + return this.aY(); + } // Paper - OBFHELPER + public boolean aY() { return false; } @@ -197,7 +201,7 @@ public abstract class EntityLiving extends Entity { if (this.isAlive()) { if (this.a(Material.WATER)) { - if (!this.aY() && !this.hasEffect(MobEffectList.WATER_BREATHING.id) && !flag1) { + if (!this.canBreatheUnderwater() && !this.hasEffect(MobEffectList.WATER_BREATHING.id) && !flag1) { // Paper - Use obfhelper this.setAirTicks(this.j(this.getAirTicks())); if (this.getAirTicks() == -20) { this.setAirTicks(0); @@ -937,7 +941,7 @@ public abstract class EntityLiving extends Entity { if (this.random.nextDouble() >= this.getAttributeInstance(GenericAttributes.c).getValue()) { if (this instanceof EntityPlayer) { if (((EntityPlayer) this).knockbackProfile == null) - ((EntityPlayer) this).knockbackProfile = MonkeySpigot.getInstance().getKnockbackHandler().getActiveProfile(); + ((EntityPlayer) this).knockbackProfile = eSpigot.getInstance().getKnockbackHandler().getActiveProfile(); ((EntityPlayer) this).knockbackProfile.handleEntityLiving((EntityPlayer) this, entity, f, d0, d1); return; diff --git a/TacoSpigot-Server/src/main/java/net/minecraft/server/EntityMonster.java b/TacoSpigot-Server/src/main/java/net/minecraft/server/EntityMonster.java index 9fefb86..419cd16 100644 --- a/TacoSpigot-Server/src/main/java/net/minecraft/server/EntityMonster.java +++ b/TacoSpigot-Server/src/main/java/net/minecraft/server/EntityMonster.java @@ -107,17 +107,18 @@ public abstract class EntityMonster extends EntityCreature implements IMonster { if (this.world.b(EnumSkyBlock.SKY, blockposition) > this.random.nextInt(32)) { return false; } else { - int i = this.world.getLightLevel(blockposition); - + boolean passes; // Paper if (this.world.R()) { int j = this.world.ab(); this.world.c(10); - i = this.world.getLightLevel(blockposition); + passes = !world.isLightLevel(blockposition, this.random.nextInt(9)); // Paper this.world.c(j); - } + } else { + passes = !world.isLightLevel(blockposition, this.random.nextInt(9)); + } // Paper - return i <= this.random.nextInt(8); + return passes; // Paper } } diff --git a/TacoSpigot-Server/src/main/java/net/minecraft/server/EntityPlayer.java b/TacoSpigot-Server/src/main/java/net/minecraft/server/EntityPlayer.java index 667f0fe..5a55be1 100644 --- a/TacoSpigot-Server/src/main/java/net/minecraft/server/EntityPlayer.java +++ b/TacoSpigot-Server/src/main/java/net/minecraft/server/EntityPlayer.java @@ -10,6 +10,8 @@ import java.util.Collection; import java.util.HashSet; import java.util.Iterator; import java.util.List; + +import com.elevatemc.spigot.eSpigot; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -22,8 +24,7 @@ import org.bukkit.craftbukkit.event.CraftEventFactory; import org.bukkit.craftbukkit.inventory.CraftItemStack; import org.bukkit.event.inventory.InventoryType; import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause; -import monkey.sindre.spigot.MonkeySpigot; -import monkey.sindre.spigot.knockback.KnockbackProfile; +import com.elevatemc.spigot.knockback.KnockbackProfile; // CraftBukkit end public class EntityPlayer extends EntityHuman implements ICrafting { @@ -70,7 +71,7 @@ public class EntityPlayer extends EntityHuman implements ICrafting { private int containerUpdateDelay; // PaperSpigot public boolean positiveXMovement, positiveYMovement, positiveZMovement; - public KnockbackProfile knockbackProfile = MonkeySpigot.getInstance().getKnockbackHandler().getActiveProfile(); + public KnockbackProfile knockbackProfile = eSpigot.getInstance().getKnockbackHandler().getActiveProfile(); @Override diff --git a/TacoSpigot-Server/src/main/java/net/minecraft/server/EntitySquid.java b/TacoSpigot-Server/src/main/java/net/minecraft/server/EntitySquid.java index 31996b4..7ba2444 100644 --- a/TacoSpigot-Server/src/main/java/net/minecraft/server/EntitySquid.java +++ b/TacoSpigot-Server/src/main/java/net/minecraft/server/EntitySquid.java @@ -20,7 +20,6 @@ public class EntitySquid extends EntityWaterAnimal { public EntitySquid(World world) { super(world); this.setSize(0.95F, 0.95F); - this.random.setSeed((long) (1 + this.getId())); this.bq = 1.0F / (this.random.nextFloat() + 1.0F) * 0.2F; this.goalSelector.a(0, new EntitySquid.PathfinderGoalSquid(this)); } diff --git a/TacoSpigot-Server/src/main/java/net/minecraft/server/EntityTracker.java b/TacoSpigot-Server/src/main/java/net/minecraft/server/EntityTracker.java index 9515b1d..5d993ac 100644 --- a/TacoSpigot-Server/src/main/java/net/minecraft/server/EntityTracker.java +++ b/TacoSpigot-Server/src/main/java/net/minecraft/server/EntityTracker.java @@ -10,9 +10,9 @@ import java.util.concurrent.Callable; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.bukkit.Bukkit; -import monkey.sindre.spigot.util.SynchronizedIntHashMap; -import monkey.sindre.spigot.util.task.Task; -import monkey.sindre.spigot.util.task.impl.ThreadTaskExecutor; +import com.elevatemc.spigot.util.SynchronizedIntHashMap; +import com.elevatemc.spigot.util.task.Task; +import com.elevatemc.spigot.util.task.impl.ThreadTaskExecutor; public class EntityTracker { @@ -24,8 +24,8 @@ public class EntityTracker { } private WorldServer world; - private Set c = Sets.newConcurrentHashSet(); // MonkeySpigot - ConcurrentHashSet - public IntHashMap trackedEntities = new SynchronizedIntHashMap<>(); // MonkeySpigot - Thread safe implementation of IntHashMap (SynchronizedIntHashMap) + private Set c = Sets.newConcurrentHashSet(); // eSpigot - ConcurrentHashSet + public IntHashMap trackedEntities = new SynchronizedIntHashMap<>(); // eSpigot - Thread safe implementation of IntHashMap (SynchronizedIntHashMap) private int e; public EntityTracker(WorldServer worldserver) { diff --git a/TacoSpigot-Server/src/main/java/net/minecraft/server/EntityTrackerEntry.java b/TacoSpigot-Server/src/main/java/net/minecraft/server/EntityTrackerEntry.java index e5d5cf8..421f871 100644 --- a/TacoSpigot-Server/src/main/java/net/minecraft/server/EntityTrackerEntry.java +++ b/TacoSpigot-Server/src/main/java/net/minecraft/server/EntityTrackerEntry.java @@ -43,7 +43,7 @@ public class EntityTrackerEntry { // PaperSpigot start // Replace trackedPlayers Set with a Map. The value is true until the player receives // their first update (which is forced to have absolute coordinates), false afterward. - public java.util.Map trackedPlayerMap = new ConcurrentHashMap<>(); // MonkeySpigot - ConcurrentHashMap + public java.util.Map trackedPlayerMap = new ConcurrentHashMap<>(); // eSpigot - ConcurrentHashMap public Set trackedPlayers = trackedPlayerMap.keySet(); // PaperSpigot end @@ -85,11 +85,11 @@ public class EntityTrackerEntry { this.broadcast(new PacketPlayOutAttachEntity(0, this.tracker, this.tracker.vehicle)); } - if (this.tracker instanceof EntityItemFrame /*&& this.m % 10 == 0*/) { // CraftBukkit - Moved below, should always enter this block + if (this.tracker instanceof EntityItemFrame && this.m % 20 == 0) { // Paper EntityItemFrame entityitemframe = (EntityItemFrame) this.tracker; ItemStack itemstack = entityitemframe.getItem(); - if (this.m % 10 == 0 && itemstack != null && itemstack.getItem() instanceof ItemWorldMap) { // CraftBukkit - Moved this.m % 10 logic here so item frames do not enter the other blocks + if (itemstack != null && itemstack.getItem() instanceof ItemWorldMap) { // Paper - moved back up WorldMap worldmap = Items.FILLED_MAP.getSavedMap(itemstack, this.tracker.world); // CraftBukkit @@ -557,7 +557,7 @@ public class EntityTrackerEntry { } public void clear(EntityPlayer entityplayer) { - if (this.trackedPlayers.remove(entityplayer)) // MonkeySpigot - Directly remove + if (this.trackedPlayers.remove(entityplayer)) // eSpigot - Directly remove entityplayer.d(this.tracker); } } \ No newline at end of file diff --git a/TacoSpigot-Server/src/main/java/net/minecraft/server/EntityZombie.java b/TacoSpigot-Server/src/main/java/net/minecraft/server/EntityZombie.java index 6d3b002..6c6a13a 100644 --- a/TacoSpigot-Server/src/main/java/net/minecraft/server/EntityZombie.java +++ b/TacoSpigot-Server/src/main/java/net/minecraft/server/EntityZombie.java @@ -182,7 +182,7 @@ public class EntityZombie extends EntityMonster { int j1 = j + MathHelper.nextInt(this.random, 7, 40) * MathHelper.nextInt(this.random, -1, 1); int k1 = k + MathHelper.nextInt(this.random, 7, 40) * MathHelper.nextInt(this.random, -1, 1); - if (World.a((IBlockAccess) this.world, new BlockPosition(i1, j1 - 1, k1)) && this.world.getLightLevel(new BlockPosition(i1, j1, k1)) < 10) { + if (World.a(this.world, new BlockPosition(i1, j1 - 1, k1)) && !this.world.isLightLevel(new BlockPosition(i1, j1, k1), 10)) { // Paper entityzombie.setPosition((double) i1, (double) j1, (double) k1); if (!this.world.isPlayerNearby((double) i1, (double) j1, (double) k1, 7.0D) && this.world.a(entityzombie.getBoundingBox(), (Entity) entityzombie) && this.world.getCubes(entityzombie, entityzombie.getBoundingBox()).isEmpty() && !this.world.containsLiquid(entityzombie.getBoundingBox())) { this.world.addEntity(entityzombie, CreatureSpawnEvent.SpawnReason.REINFORCEMENTS); // CraftBukkit diff --git a/TacoSpigot-Server/src/main/java/net/minecraft/server/Explosion.java b/TacoSpigot-Server/src/main/java/net/minecraft/server/Explosion.java index f4ccd8d..3c280f2 100644 --- a/TacoSpigot-Server/src/main/java/net/minecraft/server/Explosion.java +++ b/TacoSpigot-Server/src/main/java/net/minecraft/server/Explosion.java @@ -1,5 +1,6 @@ package net.minecraft.server; +import com.elevatemc.spigot.util.FastRandom; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.google.common.collect.Sets; @@ -18,9 +19,10 @@ import org.bukkit.event.block.BlockExplodeEvent; public class Explosion { + public static final Random CACHED_RANDOM = new FastRandom(); // AW-Spigot - fast random private final boolean a; private final boolean b; - private final Random c = new Random(); + private final Random c = CACHED_RANDOM; private final World world; private final double posX; private final double posY; diff --git a/TacoSpigot-Server/src/main/java/net/minecraft/server/LoginListener.java b/TacoSpigot-Server/src/main/java/net/minecraft/server/LoginListener.java index 541cec7..704600b 100644 --- a/TacoSpigot-Server/src/main/java/net/minecraft/server/LoginListener.java +++ b/TacoSpigot-Server/src/main/java/net/minecraft/server/LoginListener.java @@ -5,7 +5,6 @@ import com.mojang.authlib.GameProfile; import com.mojang.authlib.exceptions.AuthenticationUnavailableException; import io.netty.channel.ChannelFuture; import io.netty.channel.ChannelFutureListener; -import io.netty.util.concurrent.Future; import io.netty.util.concurrent.GenericFutureListener; import java.math.BigInteger; import java.security.PrivateKey; @@ -13,7 +12,6 @@ import java.util.Arrays; import java.util.Random; import java.util.UUID; import java.util.concurrent.atomic.AtomicInteger; -import java.util.logging.Level; import javax.crypto.SecretKey; import org.apache.commons.lang3.Validate; import org.apache.logging.log4j.LogManager; @@ -81,6 +79,12 @@ public class LoginListener implements PacketLoginInListener, IUpdatePlayerListBo } + // KigPaper start - SportPaper-0107 + private static final java.util.concurrent.ExecutorService authenticatorPool = java.util.concurrent.Executors.newCachedThreadPool( + r -> new Thread(r, "User Authenticator #" + b.incrementAndGet()) + ); + // KigPaper end + // Spigot start public void initUUID() { @@ -164,8 +168,8 @@ public class LoginListener implements PacketLoginInListener, IUpdatePlayerListBo } else { // Spigot start initUUID(); - new Thread(new Runnable() { - + //new Thread(new Runnable() { // KigPaper + authenticatorPool.execute(new Runnable() { @Override public void run() { try{ @@ -175,7 +179,7 @@ public class LoginListener implements PacketLoginInListener, IUpdatePlayerListBo server.server.getLogger().log(java.util.logging.Level.WARNING, "Exception verifying " + i.getName(), ex); } } - }).start(); + }); // Spigot end } @@ -188,10 +192,15 @@ public class LoginListener implements PacketLoginInListener, IUpdatePlayerListBo if (!Arrays.equals(this.e, packetlogininencryptionbegin.b(privatekey))) { throw new IllegalStateException("Invalid nonce!"); } else { - this.loginKey = packetlogininencryptionbegin.a(privatekey); - this.g = LoginListener.EnumProtocolState.AUTHENTICATING; - this.networkManager.a(this.loginKey); - (new Thread("User Authenticator #" + LoginListener.b.incrementAndGet()) { + try { + this.loginKey = packetlogininencryptionbegin.a(privatekey); + this.g = LoginListener.EnumProtocolState.AUTHENTICATING; + this.networkManager.setupEncryption(this.loginKey); + } catch (Exception ex) { + throw new IllegalStateException("Protocol error", ex); + } + // (new Thread("User Authenticator #" + LoginListener.b.incrementAndGet()) { // KigPaper - SportPaper-0107 + authenticatorPool.execute(new Runnable() { public void run() { GameProfile gameprofile = LoginListener.this.i; @@ -231,7 +240,7 @@ public class LoginListener implements PacketLoginInListener, IUpdatePlayerListBo } } - }).start(); + }); } } @@ -239,40 +248,40 @@ public class LoginListener implements PacketLoginInListener, IUpdatePlayerListBo public class LoginHandler { public void fireEvents() throws Exception { - String playerName = i.getName(); - java.net.InetAddress address = ((java.net.InetSocketAddress) networkManager.getSocketAddress()).getAddress(); - java.util.UUID uniqueId = i.getId(); - final org.bukkit.craftbukkit.CraftServer server = LoginListener.this.server.server; + String playerName = i.getName(); + java.net.InetAddress address = ((java.net.InetSocketAddress) networkManager.getSocketAddress()).getAddress(); + java.util.UUID uniqueId = i.getId(); + final org.bukkit.craftbukkit.CraftServer server = LoginListener.this.server.server; - AsyncPlayerPreLoginEvent asyncEvent = new AsyncPlayerPreLoginEvent(playerName, address, uniqueId); - server.getPluginManager().callEvent(asyncEvent); + AsyncPlayerPreLoginEvent asyncEvent = new AsyncPlayerPreLoginEvent(playerName, address, uniqueId); + server.getPluginManager().callEvent(asyncEvent); - if (PlayerPreLoginEvent.getHandlerList().getRegisteredListeners().length != 0) { - final PlayerPreLoginEvent event = new PlayerPreLoginEvent(playerName, address, uniqueId); - if (asyncEvent.getResult() != PlayerPreLoginEvent.Result.ALLOWED) { - event.disallow(asyncEvent.getResult(), asyncEvent.getKickMessage()); - } - Waitable waitable = new Waitable() { - @Override - protected PlayerPreLoginEvent.Result evaluate() { - server.getPluginManager().callEvent(event); - return event.getResult(); - }}; + if (PlayerPreLoginEvent.getHandlerList().getRegisteredListeners().length != 0) { + final PlayerPreLoginEvent event = new PlayerPreLoginEvent(playerName, address, uniqueId); + if (asyncEvent.getResult() != PlayerPreLoginEvent.Result.ALLOWED) { + event.disallow(asyncEvent.getResult(), asyncEvent.getKickMessage()); + } + Waitable waitable = new Waitable() { + @Override + protected PlayerPreLoginEvent.Result evaluate() { + server.getPluginManager().callEvent(event); + return event.getResult(); + }}; - LoginListener.this.server.processQueue.add(waitable); - if (waitable.get() != PlayerPreLoginEvent.Result.ALLOWED) { - disconnect(event.getKickMessage()); - return; - } - } else { - if (asyncEvent.getLoginResult() != AsyncPlayerPreLoginEvent.Result.ALLOWED) { - disconnect(asyncEvent.getKickMessage()); - return; - } - } - // CraftBukkit end - LoginListener.c.info("UUID of player " + LoginListener.this.i.getName() + " is " + LoginListener.this.i.getId()); - LoginListener.this.g = LoginListener.EnumProtocolState.READY_TO_ACCEPT; + LoginListener.this.server.processQueue.add(waitable); + if (waitable.get() != PlayerPreLoginEvent.Result.ALLOWED) { + disconnect(event.getKickMessage()); + return; + } + } else { + if (asyncEvent.getLoginResult() != AsyncPlayerPreLoginEvent.Result.ALLOWED) { + disconnect(asyncEvent.getKickMessage()); + return; + } + } + // CraftBukkit end + LoginListener.c.info("UUID of player " + LoginListener.this.i.getName() + " is " + LoginListener.this.i.getId()); + LoginListener.this.g = LoginListener.EnumProtocolState.READY_TO_ACCEPT; } } // Spigot end @@ -289,4 +298,4 @@ public class LoginListener implements PacketLoginInListener, IUpdatePlayerListBo private EnumProtocolState() {} } -} +} \ No newline at end of file diff --git a/TacoSpigot-Server/src/main/java/net/minecraft/server/MinecraftServer.java b/TacoSpigot-Server/src/main/java/net/minecraft/server/MinecraftServer.java index d31a677..b744605 100644 --- a/TacoSpigot-Server/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/TacoSpigot-Server/src/main/java/net/minecraft/server/MinecraftServer.java @@ -16,7 +16,7 @@ import io.netty.buffer.Unpooled; import io.netty.handler.codec.base64.Base64; import jline.console.ConsoleReader; import joptsimple.OptionSet; -import monkey.sindre.spigot.MonkeySpigot; +import com.elevatemc.spigot.eSpigot; import net.openhft.affinity.AffinityLock; import org.apache.commons.lang3.Validate; import org.apache.logging.log4j.LogManager; @@ -52,7 +52,7 @@ public abstract class MinecraftServer implements Runnable, ICommandListener, IAs public static long TICK_TIME = SEC_IN_NANO / TPS; private static final long MAX_CATCHUP_BUFFER = TICK_TIME * TPS * 60L; private static MinecraftServer l; - private static long lastTickTime; // MonkeySpigot - Tick time variable + private static long lastTickTime; // eSpigot - Tick time variable public final MethodProfiler methodProfiler = new MethodProfiler(); public final long[] h = new long[100]; public final Thread primaryThread; @@ -63,7 +63,7 @@ public abstract class MinecraftServer implements Runnable, ICommandListener, IAs protected final ICommandHandler b; protected final Proxy e; protected final Queue> j = new java.util.concurrent.ConcurrentLinkedQueue<>(); // Spigot, PAIL: Rename - protected final Queue> fastPackets = new java.util.concurrent.ConcurrentLinkedQueue<>(); // MonkeySpigot + protected final Queue> fastPackets = new java.util.concurrent.ConcurrentLinkedQueue<>(); // eSpigot private final MojangStatisticsGenerator n = new MojangStatisticsGenerator("server", this, az()); private final List p = Lists.newArrayList(); private final ServerPing r = new ServerPing(); @@ -90,8 +90,8 @@ public abstract class MinecraftServer implements Runnable, ICommandListener, IAs public java.util.Queue processQueue = new java.util.concurrent.ConcurrentLinkedQueue(); public int autosavePeriod; public double[] recentTps = new double[3]; // PaperSpigot - Fine have your darn compat with bad plugins - // MonkeySpigot start - private MonkeySpigot monkeySpigot; + // eSpigot start + private eSpigot eSpigot; private ServerConnection q; // Spigot private String serverIp; private int u = -1; @@ -114,7 +114,7 @@ public abstract class MinecraftServer implements Runnable, ICommandListener, IAs private boolean M; // CraftBukkit end private boolean N; - // MonkeySpigot end + // eSpigot end private String O = ""; private String P = ""; // CraftBukkit end @@ -659,11 +659,11 @@ public abstract class MinecraftServer implements Runnable, ICommandListener, IAs AffinityLock affinityLock = null; try (final AffinityLock lock = AffinityLock.acquireLock()) { if (this.init()) { - // MonkeySpigot start - Thread affinity - MinecraftServer.LOGGER.info("[MonkeySpigot] Locked main thread. CPU: " + lock.cpuId()); + // eSpigot start - Thread affinity + MinecraftServer.LOGGER.info("[eSpigot] Locked main thread. CPU: " + lock.cpuId()); affinityLock = lock; - this.monkeySpigot = new MonkeySpigot(); - // MonkeySpigot end + this.eSpigot = new eSpigot(); + // eSpigot end this.ab = az(); long i = 0L; @@ -759,13 +759,13 @@ public abstract class MinecraftServer implements Runnable, ICommandListener, IAs this.a(crashreport); } finally { - // MonkeySpigot start - Thread affinity - MinecraftServer.LOGGER.info("[MonkeySpigot] " + (affinityLock == null ? + // eSpigot start - Thread affinity + MinecraftServer.LOGGER.info("[eSpigot] " + (affinityLock == null ? "Didn't release affinity lock since it does not exist." : "Released affinity lock.")); if (affinityLock != null) affinityLock.release(); - // MonkeySpigot end + // eSpigot end try { org.spigotmc.WatchdogThread.doStop(); @@ -870,7 +870,7 @@ public abstract class MinecraftServer implements Runnable, ICommandListener, IAs this.h[this.ticks % 100] = System.nanoTime() - i; this.methodProfiler.b(); - this.methodProfiler.a("snooper"); + /* this.methodProfiler.a("snooper"); if (getSnooperEnabled() && !this.n.d() && this.ticks > 100) { // Spigot this.n.a(); } @@ -879,7 +879,7 @@ public abstract class MinecraftServer implements Runnable, ICommandListener, IAs this.n.b(); } - this.methodProfiler.b(); + this.methodProfiler.b(); */ this.methodProfiler.b(); org.spigotmc.WatchdogThread.tick(); // Spigot @@ -919,8 +919,8 @@ public abstract class MinecraftServer implements Runnable, ICommandListener, IAs SpigotTimings.chunkIOTickTimer.stopTiming(); // Spigot SpigotTimings.timeUpdateTimer.startTiming(); // Spigot - if (this.ticks % 60 == 0) {// MonkeySpigot - Send time update packets less often - MonkeySpigot.EXECUTOR_SERVICE.execute(() -> { + if (this.ticks % 60 == 0) {// eSpigot - Send time update packets less often + eSpigot.EXECUTOR_SERVICE.execute(() -> { // Send time updates to everyone, it will get the right time from the world the player is in. for (int i = 0; i < this.getPlayerList().players.size(); ++i) { // PlayerList's players field is // a concurrent collection (CopyOnWriteArrayList), so this is safe to run async. diff --git a/TacoSpigot-Server/src/main/java/net/minecraft/server/NBTTagCompound.java b/TacoSpigot-Server/src/main/java/net/minecraft/server/NBTTagCompound.java new file mode 100644 index 0000000..b6231d9 --- /dev/null +++ b/TacoSpigot-Server/src/main/java/net/minecraft/server/NBTTagCompound.java @@ -0,0 +1,344 @@ +package net.minecraft.server; + +import java.io.DataInput; +import java.io.DataOutput; +import java.io.IOException; +import java.util.Iterator; +import java.util.Map; +import java.util.Set; +import java.util.Map.Entry; +import java.util.concurrent.Callable; + +public class NBTTagCompound extends NBTBase { + private it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap map = new it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap<>(8, 0.8f); // Paper - reduce memory footprint of NBTTagCompound + + public NBTTagCompound() { + } + + public NBTTagCompound(it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap map) + { + this.map = map; + } + + void write(DataOutput var1) throws IOException { + Iterator var2 = this.map.keySet().iterator(); + + while(var2.hasNext()) { + String var3 = (String)var2.next(); + NBTBase var4 = (NBTBase)this.map.get(var3); + a(var3, var4, var1); + } + + var1.writeByte(0); + } + + void load(DataInput var1, int var2, NBTReadLimiter var3) throws IOException { + var3.a(384L); + if (var2 > 512) { + throw new RuntimeException("Tried to read NBT tag with too high complexity, depth > 512"); + } else { + this.map.clear(); + + byte var4; + while((var4 = a(var1, var3)) != 0) { + String var5 = b(var1, var3); + var3.a((long)(224 + 16 * var5.length())); + NBTBase var6 = a(var4, var5, var1, var2 + 1, var3); + if (this.map.put(var5, var6) != null) { + var3.a(288L); + } + } + + } + } + + public Set c() { + return this.map.keySet(); + } + + public byte getTypeId() { + return 10; + } + + public void set(String var1, NBTBase var2) { + this.map.put(var1, var2); + } + + public void setByte(String var1, byte var2) { + this.map.put(var1, new NBTTagByte(var2)); + } + + public void setShort(String var1, short var2) { + this.map.put(var1, new NBTTagShort(var2)); + } + + public void setInt(String var1, int var2) { + this.map.put(var1, new NBTTagInt(var2)); + } + + public void setLong(String var1, long var2) { + this.map.put(var1, new NBTTagLong(var2)); + } + + public void setFloat(String var1, float var2) { + this.map.put(var1, new NBTTagFloat(var2)); + } + + public void setDouble(String var1, double var2) { + this.map.put(var1, new NBTTagDouble(var2)); + } + + public void setString(String var1, String var2) { + this.map.put(var1, new NBTTagString(var2)); + } + + public void setByteArray(String var1, byte[] var2) { + this.map.put(var1, new NBTTagByteArray(var2)); + } + + public void setIntArray(String var1, int[] var2) { + this.map.put(var1, new NBTTagIntArray(var2)); + } + + public void setBoolean(String var1, boolean var2) { + this.setByte(var1, (byte)(var2 ? 1 : 0)); + } + + public NBTBase get(String var1) { + return (NBTBase)this.map.get(var1); + } + + public byte b(String var1) { + NBTBase var2 = (NBTBase)this.map.get(var1); + return var2 != null ? var2.getTypeId() : 0; + } + + public boolean hasKey(String var1) { + return this.map.containsKey(var1); + } + + public boolean hasKeyOfType(String var1, int var2) { + byte var3 = this.b(var1); + if (var3 == var2) { + return true; + } else if (var2 != 99) { + if (var3 > 0) { + } + + return false; + } else { + return var3 == 1 || var3 == 2 || var3 == 3 || var3 == 4 || var3 == 5 || var3 == 6; + } + } + + public byte getByte(String var1) { + try { + return !this.hasKeyOfType(var1, 99) ? 0 : ((NBTNumber)this.map.get(var1)).f(); + } catch (ClassCastException var3) { + return 0; + } + } + + public short getShort(String var1) { + try { + return !this.hasKeyOfType(var1, 99) ? 0 : ((NBTNumber)this.map.get(var1)).e(); + } catch (ClassCastException var3) { + return 0; + } + } + + public int getInt(String var1) { + try { + return !this.hasKeyOfType(var1, 99) ? 0 : ((NBTNumber)this.map.get(var1)).d(); + } catch (ClassCastException var3) { + return 0; + } + } + + public long getLong(String var1) { + try { + return !this.hasKeyOfType(var1, 99) ? 0L : ((NBTNumber)this.map.get(var1)).c(); + } catch (ClassCastException var3) { + return 0L; + } + } + + public float getFloat(String var1) { + try { + return !this.hasKeyOfType(var1, 99) ? 0.0F : ((NBTNumber)this.map.get(var1)).h(); + } catch (ClassCastException var3) { + return 0.0F; + } + } + + public double getDouble(String var1) { + try { + return !this.hasKeyOfType(var1, 99) ? 0.0D : ((NBTNumber)this.map.get(var1)).g(); + } catch (ClassCastException var3) { + return 0.0D; + } + } + + public String getString(String var1) { + try { + return !this.hasKeyOfType(var1, 8) ? "" : ((NBTBase)this.map.get(var1)).a_(); + } catch (ClassCastException var3) { + return ""; + } + } + + public byte[] getByteArray(String var1) { + try { + return !this.hasKeyOfType(var1, 7) ? new byte[0] : ((NBTTagByteArray)this.map.get(var1)).c(); + } catch (ClassCastException var3) { + throw new ReportedException(this.a(var1, 7, var3)); + } + } + + public int[] getIntArray(String var1) { + try { + return !this.hasKeyOfType(var1, 11) ? new int[0] : ((NBTTagIntArray)this.map.get(var1)).c(); + } catch (ClassCastException var3) { + throw new ReportedException(this.a(var1, 11, var3)); + } + } + + public NBTTagCompound getCompound(String var1) { + try { + return !this.hasKeyOfType(var1, 10) ? new NBTTagCompound() : (NBTTagCompound)this.map.get(var1); + } catch (ClassCastException var3) { + throw new ReportedException(this.a(var1, 10, var3)); + } + } + + public NBTTagList getList(String var1, int var2) { + try { + if (this.b(var1) != 9) { + return new NBTTagList(); + } else { + NBTTagList var3 = (NBTTagList)this.map.get(var1); + return var3.size() > 0 && var3.f() != var2 ? new NBTTagList() : var3; + } + } catch (ClassCastException var4) { + throw new ReportedException(this.a(var1, 9, var4)); + } + } + + public boolean getBoolean(String var1) { + return this.getByte(var1) != 0; + } + + public void remove(String var1) { + this.map.remove(var1); + } + + public String toString() { + StringBuilder var1 = new StringBuilder("{"); + + Entry var3; + for(Iterator var2 = this.map.entrySet().iterator(); var2.hasNext(); var1.append((String)var3.getKey()).append(':').append(var3.getValue())) { + var3 = (Entry)var2.next(); + if (var1.length() != 1) { + var1.append(','); + } + } + + return var1.append('}').toString(); + } + + public boolean isEmpty() { + return this.map.isEmpty(); + } + + private CrashReport a(final String var1, final int var2, ClassCastException var3) { + CrashReport var4 = CrashReport.a(var3, "Reading NBT data"); + CrashReportSystemDetails var5 = var4.a("Corrupt NBT tag", 1); + var5.a("Tag type found", new Callable() { + public String call() throws Exception { + return NBTBase.a[((NBTBase)NBTTagCompound.this.map.get(var1)).getTypeId()]; + } + }); + var5.a("Tag type expected", new Callable() { + public String call() throws Exception { + return NBTBase.a[var2]; + } + }); + var5.a("Tag name", var1); + return var4; + } + + public NBTBase clone() { + it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap ret = new it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap<>(this.map.size(), 0.8f); + Iterator> iterator = (this.map instanceof it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap) ? ((it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap)this.map).object2ObjectEntrySet().fastIterator() : this.map.entrySet().iterator(); + while (iterator.hasNext()) + { + Map.Entry entry = iterator.next(); + ret.put(entry.getKey(), entry.getValue().clone()); + } + return new NBTTagCompound(ret); + } + + public boolean equals(Object var1) { + if (super.equals(var1)) { + NBTTagCompound var2 = (NBTTagCompound)var1; + return this.map.entrySet().equals(var2.map.entrySet()); + } else { + return false; + } + } + + public int hashCode() { + return super.hashCode() ^ this.map.hashCode(); + } + + private static void a(String var0, NBTBase var1, DataOutput var2) throws IOException { + var2.writeByte(var1.getTypeId()); + if (var1.getTypeId() != 0) { + var2.writeUTF(var0); + var1.write(var2); + } + } + + private static byte a(DataInput var0, NBTReadLimiter var1) throws IOException { + return var0.readByte(); + } + + private static String b(DataInput var0, NBTReadLimiter var1) throws IOException { + return var0.readUTF(); + } + + static NBTBase a(byte var0, String var1, DataInput var2, int var3, NBTReadLimiter var4) throws IOException { + NBTBase var5 = NBTBase.createTag(var0); + + try { + var5.load(var2, var3, var4); + return var5; + } catch (IOException var9) { + CrashReport var7 = CrashReport.a(var9, "Loading NBT data"); + CrashReportSystemDetails var8 = var7.a("NBT Tag"); + var8.a("Tag name", var1); + var8.a("Tag type", var0); + throw new ReportedException(var7); + } + } + + public void a(NBTTagCompound var1) { + Iterator var2 = var1.map.keySet().iterator(); + + while(var2.hasNext()) { + String var3 = (String)var2.next(); + NBTBase var4 = (NBTBase)var1.map.get(var3); + if (var4.getTypeId() == 10) { + if (this.hasKeyOfType(var3, 10)) { + NBTTagCompound var5 = this.getCompound(var3); + var5.a((NBTTagCompound)var4); + } else { + this.set(var3, var4.clone()); + } + } else { + this.set(var3, var4.clone()); + } + } + + } +} \ No newline at end of file diff --git a/TacoSpigot-Server/src/main/java/net/minecraft/server/NetworkManager.java b/TacoSpigot-Server/src/main/java/net/minecraft/server/NetworkManager.java index 5c2c3b5..6c2e06f 100644 --- a/TacoSpigot-Server/src/main/java/net/minecraft/server/NetworkManager.java +++ b/TacoSpigot-Server/src/main/java/net/minecraft/server/NetworkManager.java @@ -1,7 +1,10 @@ package net.minecraft.server; +import com.elevatemc.spigot.util.CryptException; import com.google.common.collect.Queues; import com.google.common.util.concurrent.ThreadFactoryBuilder; +import com.velocitypowered.natives.compression.VelocityCompressor; +import com.velocitypowered.natives.util.Natives; import io.netty.buffer.PooledByteBufAllocator; import io.netty.channel.*; import io.netty.channel.epoll.EpollEventLoopGroup; @@ -75,7 +78,7 @@ public class NetworkManager extends SimpleChannelInboundHandler { private final EnumProtocolDirection h; private final ConcurrentLinkedQueue i = Queues.newConcurrentLinkedQueue(); - private final ConcurrentLinkedQueue fastPackets = Queues.newConcurrentLinkedQueue(); // MonkeySpigot - Process combat packets faster + private final ConcurrentLinkedQueue fastPackets = Queues.newConcurrentLinkedQueue(); // eSpigot - Process combat packets faster private final ReentrantReadWriteLock j = new ReentrantReadWriteLock(); private final java.util.concurrent.atomic.AtomicInteger packetWrites = new java.util.concurrent.atomic.AtomicInteger(); private final Object flushLock = new Object(); @@ -123,14 +126,14 @@ public class NetworkManager extends SimpleChannelInboundHandler { super.channelActive(channelhandlercontext); this.channel = channelhandlercontext.channel(); this.l = this.channel.remoteAddress(); - // MonkeySpigot start + // eSpigot start this.channel.config().setOption(ChannelOption.SO_KEEPALIVE, true); this.channel.config().setOption(ChannelOption.TCP_NODELAY, true); this.channel.config().setOption(ChannelOption.ALLOCATOR, PooledByteBufAllocator.DEFAULT); this.channel.config().setOption(ChannelOption.WRITE_BUFFER_HIGH_WATER_MARK, 32 * 1024); this.channel.config().setOption(ChannelOption.WRITE_BUFFER_LOW_WATER_MARK, 8 * 1024); this.channel.config().setOption(ChannelOption.IP_TOS, 0x18); - // MonkeySpigot end + // eSpigot end // Spigot Start this.preparing = false; @@ -144,6 +147,22 @@ public class NetworkManager extends SimpleChannelInboundHandler { } + public void setupEncryption(javax.crypto.SecretKey key) throws CryptException { + if (!this.o) { + try { + com.velocitypowered.natives.encryption.VelocityCipher decryption = com.velocitypowered.natives.util.Natives.cipher.get().forDecryption(key); + com.velocitypowered.natives.encryption.VelocityCipher encryption = com.velocitypowered.natives.util.Natives.cipher.get().forEncryption(key); + + this.o = true; + this.channel.pipeline().addBefore("splitter", "decrypt", new PacketDecrypter(decryption)); + this.channel.pipeline().addBefore("prepender", "encrypt", new PacketEncrypter(encryption)); + } catch (java.security.GeneralSecurityException e) { + throw new CryptException(e); + } + } + } + // Paper end + public void a(EnumProtocol enumprotocol) { this.channel.attr(NetworkManager.c).set(enumprotocol); this.channel.config().setAutoRead(true); @@ -372,11 +391,11 @@ public class NetworkManager extends SimpleChannelInboundHandler { return this.channel instanceof LocalChannel || this.channel instanceof LocalServerChannel; } - public void a(SecretKey secretkey) { + /* public void a(SecretKey secretkey) { this.o = true; this.channel.pipeline().addBefore("splitter", "decrypt", new PacketDecrypter(MinecraftEncryption.a(2, secretkey))); this.channel.pipeline().addBefore("prepender", "encrypt", new PacketEncrypter(MinecraftEncryption.a(1, secretkey))); - } + } */ public boolean g() { return this.channel != null && this.channel.isOpen(); @@ -398,18 +417,27 @@ public class NetworkManager extends SimpleChannelInboundHandler { this.channel.config().setAutoRead(false); } - public void a(int i) { - if (i >= 0) { + public void a(int i) + { + // Nacho start - OBFHELPER + this.setupCompression(i); + } + + public void setupCompression(int compressionThreshold) { + // Nacho end + if (compressionThreshold >= 0) + { + VelocityCompressor compressor = Natives.compress.get().create(-1); // Paper if (this.channel.pipeline().get("decompress") instanceof PacketDecompressor) { - ((PacketDecompressor) this.channel.pipeline().get("decompress")).a(i); + ((PacketDecompressor) this.channel.pipeline().get("decompress")).a(compressionThreshold); } else { - this.channel.pipeline().addBefore("decoder", "decompress", new PacketDecompressor(i)); + this.channel.pipeline().addBefore("decoder", "decompress", new PacketDecompressor(compressor, compressionThreshold)); // Paper } if (this.channel.pipeline().get("compress") instanceof PacketCompressor) { - ((PacketCompressor) this.channel.pipeline().get("decompress")).a(i); + ((PacketCompressor) this.channel.pipeline().get("decompress")).a(compressionThreshold); } else { - this.channel.pipeline().addBefore("encoder", "compress", new PacketCompressor(i)); + this.channel.pipeline().addBefore("encoder", "compress", new PacketCompressor(compressor, compressionThreshold)); // Paper } } else { if (this.channel.pipeline().get("decompress") instanceof PacketDecompressor) { @@ -420,7 +448,6 @@ public class NetworkManager extends SimpleChannelInboundHandler { this.channel.pipeline().remove("compress"); } } - } public void l() { diff --git a/TacoSpigot-Server/src/main/java/net/minecraft/server/NibbleArray.java b/TacoSpigot-Server/src/main/java/net/minecraft/server/NibbleArray.java index 9306f97..03b4d70 100644 --- a/TacoSpigot-Server/src/main/java/net/minecraft/server/NibbleArray.java +++ b/TacoSpigot-Server/src/main/java/net/minecraft/server/NibbleArray.java @@ -3,9 +3,16 @@ package net.minecraft.server; public class NibbleArray { private final byte[] a; + private final boolean dummy; public NibbleArray() { this.a = new byte[2048]; + this.dummy = false; + } + + public NibbleArray(boolean isDummy) { + this.a = new byte[2048]; + this.dummy = true; } public NibbleArray(byte[] abyte) { @@ -13,6 +20,7 @@ public class NibbleArray { if (abyte.length != 2048) { throw new IllegalArgumentException("ChunkNibbleArrays should be 2048 bytes not: " + abyte.length); } + this.dummy = false; } public int a(int i, int j, int k) { @@ -30,17 +38,22 @@ public class NibbleArray { public int a(int i) { int j = this.c(i); - return this.b(i) ? this.a[j] & 15 : this.a[j] >> 4 & 15; + return this.a[j] >> ((i & 1) << 2) & 15; // Spigot } public void a(int i, int j) { int k = this.c(i); - if (this.b(i)) { - this.a[k] = (byte) (this.a[k] & 240 | j & 15); - } else { - this.a[k] = (byte) (this.a[k] & 15 | (j & 15) << 4); - } +// if (this.b(i)) { +// this.a[k] = (byte) (this.a[k] & 240 | j & 15); +// } else { +// this.a[k] = (byte) (this.a[k] & 15 | (j & 15) << 4); +// } + + // Spigot start + int shift = (i & 1) << 2; + this.a[k] = (byte) (this.a[k] & ~(15 << shift) | (j & 15) << shift); + // Spigot end } @@ -55,4 +68,12 @@ public class NibbleArray { public byte[] a() { return this.a; } -} + + public byte[] getBytes() { + return this.a; + } + + public boolean isDummy() { + return dummy; + } +} \ No newline at end of file diff --git a/TacoSpigot-Server/src/main/java/net/minecraft/server/PacketCompressor.java b/TacoSpigot-Server/src/main/java/net/minecraft/server/PacketCompressor.java new file mode 100644 index 0000000..8f6ea54 --- /dev/null +++ b/TacoSpigot-Server/src/main/java/net/minecraft/server/PacketCompressor.java @@ -0,0 +1,103 @@ +package net.minecraft.server; + +import com.velocitypowered.natives.compression.VelocityCompressor; // Paper +import com.velocitypowered.natives.util.MoreByteBufUtils; // Paper +import io.netty.buffer.ByteBuf; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.MessageToByteEncoder; +import java.util.zip.Deflater; + +public class PacketCompressor extends MessageToByteEncoder { + private final byte[] encodeBuf; // Paper + private final Deflater deflater; + private final com.velocitypowered.natives.compression.VelocityCompressor compressor; // Paper + private int threshold; + + public PacketCompressor(int compressionThreshold) { + // Paper start + this(null, compressionThreshold); + } + public PacketCompressor(VelocityCompressor compressor, int compressionThreshold) { + this.threshold = compressionThreshold; + if (compressor == null) { + this.encodeBuf = new byte[8192]; + this.deflater = new Deflater(); + } else { + this.encodeBuf = null; + this.deflater = null; + } + this.compressor = compressor; + // Paper end + } + + protected void encode(ChannelHandlerContext var1, ByteBuf var2, ByteBuf var3) throws Exception { + int var4 = var2.readableBytes(); + PacketDataSerializer var5 = new PacketDataSerializer(var3); + if (var4 < this.threshold) { + var5.b(0); + var5.writeBytes(var2); + } else { + // Paper start + if (this.deflater != null) { + byte[] var6 = new byte[var4]; + var2.readBytes(var6); + var5.b(var6.length); + this.deflater.setInput(var6, 0, var4); + this.deflater.finish(); + + while (!this.deflater.finished()) { + int var7 = this.deflater.deflate(this.encodeBuf); + var5.writeBytes(this.encodeBuf, 0, var7); + } + + this.deflater.reset(); + return; + } + + var5.b(var4); + ByteBuf compatibleIn = MoreByteBufUtils.ensureCompatible(var1.alloc(), this.compressor, var2); + try { + this.compressor.deflate(compatibleIn, var3); + } finally { + compatibleIn.release(); + } + // Paper end + } + } + + // Paper start + @Override + protected ByteBuf allocateBuffer(ChannelHandlerContext ctx, ByteBuf msg, boolean preferDirect) throws Exception{ + if (this.compressor != null) { + // We allocate bytes to be compressed plus 1 byte. This covers two cases: + // + // - Compression + // According to https://github.com/ebiggers/libdeflate/blob/master/libdeflate.h#L103, + // if the data compresses well (and we do not have some pathological case) then the maximum + // size the compressed size will ever be is the input size minus one. + // - Uncompressed + // This is fairly obvious - we will then have one more than the uncompressed size. + int initialBufferSize = msg.readableBytes() + 1; + return com.velocitypowered.natives.util.MoreByteBufUtils.preferredBuffer(ctx.alloc(), this.compressor, initialBufferSize); + } + + return super.allocateBuffer(ctx, msg, preferDirect); + } + + @Override + public void handlerRemoved(ChannelHandlerContext ctx) throws Exception { + if (this.compressor != null) { + this.compressor.close(); + } + } + // Paper end + + public void a(int var1) { + // Nacho start - OBFHELPER + this.setThreshold(var1); + } + + public void setThreshold(int threshold) { + this.threshold = threshold; + } +} \ No newline at end of file diff --git a/TacoSpigot-Server/src/main/java/net/minecraft/server/PacketDecompressor.java b/TacoSpigot-Server/src/main/java/net/minecraft/server/PacketDecompressor.java new file mode 100644 index 0000000..659d081 --- /dev/null +++ b/TacoSpigot-Server/src/main/java/net/minecraft/server/PacketDecompressor.java @@ -0,0 +1,82 @@ +package net.minecraft.server; + +import com.velocitypowered.natives.compression.VelocityCompressor; // Paper +import com.velocitypowered.natives.util.MoreByteBufUtils; // Paper +import io.netty.buffer.ByteBuf; +import io.netty.buffer.Unpooled; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.ByteToMessageDecoder; +import io.netty.handler.codec.DecoderException; +import java.util.List; +import java.util.zip.Inflater; + +public class PacketDecompressor extends ByteToMessageDecoder { + private final Inflater inflater; + private final com.velocitypowered.natives.compression.VelocityCompressor compressor; // Paper + private int threshold; + + public PacketDecompressor(int compressionThreshold) { + this(null, compressionThreshold); + } + public PacketDecompressor(VelocityCompressor compressor, int compressionThreshold) { + this.threshold = compressionThreshold; + this.inflater = compressor == null ? new Inflater() : null; + this.compressor = compressor; + } + + protected void decode(ChannelHandlerContext var1, ByteBuf var2, List var3) throws Exception { + if (var2.readableBytes() != 0) { + PacketDataSerializer var4 = new PacketDataSerializer(var2); + int var5 = var4.e(); + if (var5 == 0) { + var3.add(var4.readBytes(var4.readableBytes())); + } else { + if (var5 < this.threshold) { + throw new DecoderException("Badly compressed packet - size of " + var5 + " is below server threshold of " + this.threshold); + } + + if (var5 > 2097152) { + throw new DecoderException("Badly compressed packet - size of " + var5 + " is larger than protocol maximum of " + 2097152); + } + // Paper start + if(this.inflater != null) { + byte[] var6 = new byte[var4.readableBytes()]; + var4.readBytes(var6); + this.inflater.setInput(var6); + byte[] var7 = new byte[var5]; + this.inflater.inflate(var7); + var3.add(Unpooled.wrappedBuffer(var7)); + this.inflater.reset(); + return; + } + int claimedUncompressedSize = var5; // OBFHELPER + ByteBuf compatibleIn = MoreByteBufUtils.ensureCompatible(var1.alloc(), this.compressor, var2); + ByteBuf uncompressed = MoreByteBufUtils.preferredBuffer(var1.alloc(), this.compressor, claimedUncompressedSize); + try { + this.compressor.inflate(compatibleIn, uncompressed, claimedUncompressedSize); + var3.add(uncompressed); + var2.clear(); + } catch (Exception e) { + uncompressed.release(); + throw e; + } finally { + compatibleIn.release(); + } + // Paper end + } + } + } + + // Paper start + @Override + public void handlerRemoved0(ChannelHandlerContext ctx) throws Exception { + if (this.compressor != null) { + this.compressor.close(); + } + } + // Paper end + + public void a(int var1) { + this.threshold = var1; + } +} \ No newline at end of file diff --git a/TacoSpigot-Server/src/main/java/net/minecraft/server/PacketDecrypter.java b/TacoSpigot-Server/src/main/java/net/minecraft/server/PacketDecrypter.java new file mode 100644 index 0000000..2852385 --- /dev/null +++ b/TacoSpigot-Server/src/main/java/net/minecraft/server/PacketDecrypter.java @@ -0,0 +1,36 @@ +package net.minecraft.server; + +import com.velocitypowered.natives.encryption.VelocityCipher; +import com.velocitypowered.natives.util.MoreByteBufUtils; +import io.netty.buffer.ByteBuf; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.MessageToMessageDecoder; +import java.util.List; + +public class PacketDecrypter extends MessageToMessageDecoder { + private final VelocityCipher cipher; // Paper + + public PacketDecrypter(VelocityCipher cipher) { // Paper + this.cipher = cipher; // Paper + } + + protected void decode(ChannelHandlerContext channelHandlerContext, ByteBuf byteBuf, List list) throws Exception { + // Paper start + ByteBuf compatible = MoreByteBufUtils.ensureCompatible(channelHandlerContext.alloc(), cipher, byteBuf); + try { + cipher.process(compatible); + list.add(compatible); + } catch (Exception e) { + compatible.release(); // compatible will never be used if we throw an exception + throw e; + } + // Paper end + } + + // Paper start + @Override + public void handlerRemoved(ChannelHandlerContext ctx) { + cipher.close(); + } + // Paper end +} \ No newline at end of file diff --git a/TacoSpigot-Server/src/main/java/net/minecraft/server/PacketEncrypter.java b/TacoSpigot-Server/src/main/java/net/minecraft/server/PacketEncrypter.java new file mode 100644 index 0000000..23efafd --- /dev/null +++ b/TacoSpigot-Server/src/main/java/net/minecraft/server/PacketEncrypter.java @@ -0,0 +1,37 @@ +package net.minecraft.server; + +import com.velocitypowered.natives.encryption.VelocityCipher; // Paper +import com.velocitypowered.natives.util.MoreByteBufUtils; // Paper +import io.netty.buffer.ByteBuf; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.MessageToMessageEncoder; // Paper + +import java.util.List; // Paper + +public class PacketEncrypter extends MessageToMessageEncoder { // Paper - change superclass + private final VelocityCipher cipher; // Paper + + public PacketEncrypter(VelocityCipher ciper) { // Paper + this.cipher = ciper; // Paper + } + + protected void encode(ChannelHandlerContext channelHandlerContext, ByteBuf byteBuf, List list) throws Exception { // Paper + // Paper start + ByteBuf compatible = MoreByteBufUtils.ensureCompatible(channelHandlerContext.alloc(), cipher, byteBuf); + try { + cipher.process(compatible); + list.add(compatible); + } catch (Exception e) { + compatible.release(); // compatible will never be used if we throw an exception + throw e; + } + // Paper end + } + + // Paper start + @Override + public void handlerRemoved(ChannelHandlerContext ctx) { + cipher.close(); + } + // Paper end +} \ No newline at end of file diff --git a/TacoSpigot-Server/src/main/java/net/minecraft/server/PacketPlayOutUpdateTime.java b/TacoSpigot-Server/src/main/java/net/minecraft/server/PacketPlayOutUpdateTime.java new file mode 100644 index 0000000..d155e43 --- /dev/null +++ b/TacoSpigot-Server/src/main/java/net/minecraft/server/PacketPlayOutUpdateTime.java @@ -0,0 +1,41 @@ +package net.minecraft.server; + +import java.io.IOException; + +public class PacketPlayOutUpdateTime implements Packet { + private long a; + private long b; + + public PacketPlayOutUpdateTime() { + } + + public PacketPlayOutUpdateTime(long var1, long var3, boolean var5) { + this.a = var1; + this.b = var3; + if (!var5) { + this.b = -this.b; + if (this.b == 0L) { + this.b = -1L; + } + } + + this.a = this.a % 192000; + } + + @Override + public void a(PacketDataSerializer var1) throws IOException { + this.a = var1.readLong(); + this.b = var1.readLong(); + } + + @Override + public void b(PacketDataSerializer var1) throws IOException { + var1.writeLong(this.a); + var1.writeLong(this.b); + } + + @Override + public void a(PacketListenerPlayOut var1) { + var1.a(this); + } +} \ No newline at end of file diff --git a/TacoSpigot-Server/src/main/java/net/minecraft/server/PacketSplitter.java b/TacoSpigot-Server/src/main/java/net/minecraft/server/PacketSplitter.java new file mode 100644 index 0000000..1526dd0 --- /dev/null +++ b/TacoSpigot-Server/src/main/java/net/minecraft/server/PacketSplitter.java @@ -0,0 +1,58 @@ +package net.minecraft.server; + +import io.netty.buffer.ByteBuf; +import io.netty.buffer.Unpooled; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.ByteToMessageDecoder; +import io.netty.handler.codec.CorruptedFrameException; +import java.util.List; + +public class PacketSplitter extends ByteToMessageDecoder { + + private final byte[] lenBuf = new byte[3]; // Paper + + public PacketSplitter() { + } + + protected void decode(ChannelHandlerContext channelhandlercontext, ByteBuf bytebuf, List list) throws Exception { + // Paper start - if channel is not active just discard the packet + if (!channelhandlercontext.channel().isActive()) { + bytebuf.skipBytes(bytebuf.readableBytes()); + return; + } + bytebuf.markReaderIndex(); + + // Paper start - reuse temporary length buffer + byte[] abyte = lenBuf; + java.util.Arrays.fill(abyte, (byte) 0); + // Paper end + + for(int var5 = 0; var5 < abyte.length; ++var5) { + if (!bytebuf.isReadable()) { + bytebuf.resetReaderIndex(); + return; + } + + abyte[var5] = bytebuf.readByte(); + if (abyte[var5] >= 0) { + PacketDataSerializer var6 = new PacketDataSerializer(Unpooled.wrappedBuffer(abyte)); + + try { + int var7 = var6.e(); + if (bytebuf.readableBytes() < var7) { + bytebuf.resetReaderIndex(); + return; + } + + list.add(bytebuf.readBytes(var7)); + } finally { + var6.release(); + } + + return; + } + } + + throw new CorruptedFrameException("length wider than 21-bit"); + } +} \ No newline at end of file diff --git a/TacoSpigot-Server/src/main/java/net/minecraft/server/PersistentCollection.java b/TacoSpigot-Server/src/main/java/net/minecraft/server/PersistentCollection.java index 451f481..4233449 100644 --- a/TacoSpigot-Server/src/main/java/net/minecraft/server/PersistentCollection.java +++ b/TacoSpigot-Server/src/main/java/net/minecraft/server/PersistentCollection.java @@ -181,4 +181,14 @@ public class PersistentCollection { return oshort.shortValue(); } } + + // FlamePaper - Minetick fix memory leaks + public void removeTrackedPlayer(EntityHuman entityhuman) { + for (Object o : this.c) { + if (o instanceof WorldMap) { + WorldMap map = (WorldMap) o; + map.untrackPlayer(entityhuman); + } + } + } } diff --git a/TacoSpigot-Server/src/main/java/net/minecraft/server/PlayerConnection.java b/TacoSpigot-Server/src/main/java/net/minecraft/server/PlayerConnection.java index 2a2d06f..f9c79be 100644 --- a/TacoSpigot-Server/src/main/java/net/minecraft/server/PlayerConnection.java +++ b/TacoSpigot-Server/src/main/java/net/minecraft/server/PlayerConnection.java @@ -63,7 +63,7 @@ import co.aikar.timings.SpigotTimings; // Spigot // CraftBukkit end import org.github.paperspigot.PaperSpigotConfig; // PaperSpigot -import monkey.sindre.spigot.MonkeyFeature; +import com.elevatemc.spigot.MonkeyFeature; public class PlayerConnection implements PacketListenerPlayIn, IUpdatePlayerListBox { @@ -610,7 +610,7 @@ public class PlayerConnection implements PacketListenerPlayIn, IUpdatePlayerList case 3: // RELEASE_USE_ITEM if (MonkeyFeature.FIX_SPRINT_EAT_EXPLOIT.isEnabled()) - this.player.bU(); // MonkeySpigot - Patch eat while running glitch + this.player.bU(); // eSpigot - Patch eat while running glitch this.player.setSprinting(true); return; diff --git a/TacoSpigot-Server/src/main/java/net/minecraft/server/PlayerList.java b/TacoSpigot-Server/src/main/java/net/minecraft/server/PlayerList.java index cbbfd76..b060292 100644 --- a/TacoSpigot-Server/src/main/java/net/minecraft/server/PlayerList.java +++ b/TacoSpigot-Server/src/main/java/net/minecraft/server/PlayerList.java @@ -16,7 +16,7 @@ import java.util.List; import java.util.Map; import java.util.UUID; -import monkey.sindre.spigot.MonkeyFeature; +import com.elevatemc.spigot.MonkeyFeature; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -601,7 +601,7 @@ public abstract class PlayerList { worldserver.chunkProviderServer.getChunkAt((int) entityplayer1.locX >> 4, (int) entityplayer1.locZ >> 4); - // MonkeySpigot - Don't check for entities + // eSpigot - Don't check for entities while (avoidSuffocation && !worldserver.getCubesNoEntities(entityplayer1, entityplayer1.getBoundingBox()).isEmpty() && entityplayer1.locY < 256.0D) { entityplayer1.setPosition(entityplayer1.locX, entityplayer1.locY + 1.0D, entityplayer1.locZ); } diff --git a/TacoSpigot-Server/src/main/java/net/minecraft/server/ServerConnection.java b/TacoSpigot-Server/src/main/java/net/minecraft/server/ServerConnection.java index fdd6389..4e523bd 100644 --- a/TacoSpigot-Server/src/main/java/net/minecraft/server/ServerConnection.java +++ b/TacoSpigot-Server/src/main/java/net/minecraft/server/ServerConnection.java @@ -2,6 +2,7 @@ package net.minecraft.server; import com.google.common.collect.Lists; import com.google.common.util.concurrent.ThreadFactoryBuilder; +import com.velocitypowered.natives.util.Natives; import io.netty.bootstrap.ServerBootstrap; import io.netty.channel.Channel; import io.netty.channel.ChannelException; @@ -84,6 +85,11 @@ public class ServerConnection { ServerConnection.e.info("Using default channel type"); } + // Paper start - indicate Velocity natives in use + MinecraftServer.LOGGER.info("Using " + Natives.compress.getLoadedVariant() + " compression from Velocity."); + MinecraftServer.LOGGER.info("Using " + Natives.cipher.getLoadedVariant() + " cipher from Velocity."); + // Paper end + this.g.add(((ServerBootstrap) ((ServerBootstrap) (new ServerBootstrap()).channel(oclass)).childHandler(new ChannelInitializer() { protected void initChannel(Channel channel) throws Exception { try { diff --git a/TacoSpigot-Server/src/main/java/net/minecraft/server/Village.java b/TacoSpigot-Server/src/main/java/net/minecraft/server/Village.java index e67aa04..4bb971f 100644 --- a/TacoSpigot-Server/src/main/java/net/minecraft/server/Village.java +++ b/TacoSpigot-Server/src/main/java/net/minecraft/server/Village.java @@ -318,7 +318,13 @@ public class Village { } private boolean f(BlockPosition blockposition) { - Block block = this.a.getType(blockposition).getBlock(); + // Paper start + IBlockData iblockdata = this.a.getTypeIfLoaded(blockposition); + if (iblockdata == null) { + return false; + } + Block block = iblockdata.getBlock(); + // Paper end return block instanceof BlockDoor ? block.getMaterial() == Material.WOOD : false; } diff --git a/TacoSpigot-Server/src/main/java/net/minecraft/server/World.java b/TacoSpigot-Server/src/main/java/net/minecraft/server/World.java index 456f4d4..baf34c4 100644 --- a/TacoSpigot-Server/src/main/java/net/minecraft/server/World.java +++ b/TacoSpigot-Server/src/main/java/net/minecraft/server/World.java @@ -65,6 +65,9 @@ public abstract class World implements IBlockAccess { public final List tileEntityList = Lists.newArrayList(); private final List b = Lists.newArrayList(); private final Set c = Sets.newHashSet(); // Paper + public Set getTileEntityListUnload() { + return c; + }// Paper public final List players = Lists.newArrayList(); public final List k = Lists.newArrayList(); protected final IntHashMap entitiesById = new IntHashMap(); @@ -139,6 +142,7 @@ public abstract class World implements IBlockAccess { private int tileTickPosition; public ExecutorService lightingExecutor = Executors.newSingleThreadExecutor(new ThreadFactoryBuilder().setNameFormat("PaperSpigot - Lighting Thread").build()); // PaperSpigot - Asynchronous lighting updates public final Map explosionDensityCache = new HashMap(); // PaperSpigot - Optimize explosions + public java.util.ArrayDeque redstoneUpdateInfos; // Paper - Move from Map in BlockRedstoneTorch to here public static long chunkToKey(int x, int z) { @@ -296,7 +300,8 @@ public abstract class World implements IBlockAccess { } public boolean isLoaded(BlockPosition blockposition) { - return this.a(blockposition, true); + return getChunkIfLoaded(blockposition.getX() >> 4, blockposition.getZ() >> 4) != null; // Paper + // return this.a(blockposition, true); } public boolean a(BlockPosition blockposition, boolean flag) { @@ -652,6 +657,42 @@ public abstract class World implements IBlockAccess { } } + public boolean isLightLevel(BlockPosition blockposition, int level) { + if (blockposition.getX() >= -30000000 && blockposition.getZ() >= -30000000 && blockposition.getX() < 30000000 + && blockposition.getZ() < 30000000) { + if (this.getType(blockposition).getBlock().s()) { + if (c(blockposition.up(), false) >= level) { + return true; + } + if (c(blockposition.east(), false) >= level) { + return true; + } + if (c(blockposition.west(), false) >= level) { + return true; + } + if (c(blockposition.south(), false) >= level) { + return true; + } + if (c(blockposition.north(), false) >= level) { + return true; + } + return false; + } + + if (blockposition.getY() >= 256) { + blockposition = new BlockPosition(blockposition.getX(), 255, blockposition.getZ()); + } + + Chunk chunk = this.getChunkAtWorldCoords(blockposition); + + return chunk.getLightSubtracted(blockposition, this.I) >= level; + } else if (blockposition.getY() < 0) { + return false; + } + return true; + } + + public int getLightLevel(BlockPosition blockposition) { return this.c(blockposition, true); } @@ -766,6 +807,34 @@ public abstract class World implements IBlockAccess { return this.worldProvider.p()[this.getLightLevel(blockposition)]; } + private IBlockData getCapturedBlockType(int x, int y, int z) { + Iterator it = this.capturedBlockStates.iterator(); + while (it.hasNext()) { + BlockState previous = it.next(); + if (previous.getX() == x && previous.getY() == y && previous.getZ() == z) { + return CraftMagicNumbers.getBlock(previous.getTypeId()).fromLegacyData(previous.getRawData()); + } + } + return null; + } + + public IBlockData getTypeIfLoaded(BlockPosition blockposition) { + int x = blockposition.getX(); + int y = blockposition.getY(); + int z = blockposition.getZ(); + if (this.captureTreeGeneration) { + IBlockData previous = getCapturedBlockType(x, y, z); + if (previous != null) { + return previous; + } + } + Chunk chunk = ((ChunkProviderServer) this.chunkProvider).getChunkIfLoaded(x >> 4, z >> 4); + if (chunk != null) { + return chunk.getBlockData(blockposition); + } + return null; + } + // Spigot start public IBlockData getType(BlockPosition blockposition) { @@ -1119,6 +1188,7 @@ public abstract class World implements IBlockAccess { { if ( iter.next().trackee == entity ) { + map.decorations.remove(entity.getUniqueID()); // Paper iter.remove(); } } @@ -1132,30 +1202,35 @@ public abstract class World implements IBlockAccess { } public void removeEntity(Entity entity) { - org.spigotmc.AsyncCatcher.catchOp( "entity remove"); // Spigot + org.spigotmc.AsyncCatcher.catchOp("entity remove"); // Spigot entity.die(); if (entity instanceof EntityHuman) { this.players.remove(entity); + this.worldMaps.removeTrackedPlayer((EntityHuman) entity); // FlamePaper - Minetick fix memory leaks this.everyoneSleeping(); } - if (!guardEntityList) { // Spigot - It will get removed after the tick if we are ticking +// if (!guardEntityList) { // Spigot - It will get removed after the tick if we are ticking // Paper - moved down int i = entity.ae; int j = entity.ag; - if (entity.ad && this.isChunkLoaded(i, j, true)) { - this.getChunkAt(i, j).b(entity); + Chunk chunk = this.getChunkIfLoaded(i, j); + if (entity.ad && chunk != null) { + chunk.b(entity); } - // CraftBukkit start - Decrement loop variable field if we've already ticked this entity - int index = this.entityList.indexOf(entity); - if (index != -1) { - if (index <= this.tickPosition) { - this.tickPosition--; + if (!guardEntityList) { // Spigot - It will get removed after the tick if we are ticking // Paper - + // always remove from current chunk above + // CraftBukkit start - Decrement loop variable field if we've already ticked + // this entity + int index = this.entityList.indexOf(entity); + if (index != -1) { + if (index <= this.tickPosition) { + this.tickPosition--; + } + this.entityList.remove(index); } - this.entityList.remove(index); - } - // CraftBukkit end + // CraftBukkit end } // Spigot this.b(entity); } @@ -1270,7 +1345,7 @@ public abstract class World implements IBlockAccess { return arraylist; } - // MonkeySpigot - Ignore entities + // eSpigot - Ignore entities public List getCubesNoEntities(Entity entity, AxisAlignedBB axisalignedbb) { ArrayList arraylist = Lists.newArrayList(); int i = MathHelper.floor(axisalignedbb.a); @@ -1579,9 +1654,14 @@ public abstract class World implements IBlockAccess { this.M = true; // CraftBukkit start - From below, clean up tile entities before ticking them if (!this.c.isEmpty()) { - this.tileEntityList.removeAll(this.c); - //this.h.removeAll(this.c); // PaperSpigot - Remove unused list - this.c.clear(); + // Paper start - Use alternate implementation with faster contains + java.util.Set toRemove = java.util.Collections.newSetFromMap(new java.util.IdentityHashMap<>()); + toRemove.addAll(this.getTileEntityListUnload()); + this.tileEntityList.removeAll(toRemove); + // Paper end +// this.tileEntityList.removeAll(this.c);//c == tileEntityListUnload + // this.h.removeAll(this.c); // PaperSpigot - Remove unused list + this.getTileEntityListUnload().clear(); } // CraftBukkit end diff --git a/TacoSpigot-Server/src/main/java/net/minecraft/server/WorldMap.java b/TacoSpigot-Server/src/main/java/net/minecraft/server/WorldMap.java index 162b3a3..40c4246 100644 --- a/TacoSpigot-Server/src/main/java/net/minecraft/server/WorldMap.java +++ b/TacoSpigot-Server/src/main/java/net/minecraft/server/WorldMap.java @@ -1,19 +1,22 @@ package net.minecraft.server; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.UUID; + +// CraftBukkit start +import org.bukkit.Bukkit; +import org.bukkit.craftbukkit.CraftServer; +import org.bukkit.craftbukkit.CraftWorld; +import org.bukkit.craftbukkit.map.CraftMapView; +import org.bukkit.entity.Player; +// CraftBukkit end + import com.google.common.base.Charsets; import com.google.common.collect.Lists; import com.google.common.collect.Maps; -import java.util.Iterator; -import java.util.List; -import java.util.Map; - -// CraftBukkit start -import java.util.UUID; - -import org.bukkit.craftbukkit.CraftServer; -import org.bukkit.craftbukkit.CraftWorld; -import org.bukkit.craftbukkit.map.CraftMapView; -// CraftBukkit end public class WorldMap extends PersistentBase { @@ -25,6 +28,7 @@ public class WorldMap extends PersistentBase { public List g = Lists.newArrayList(); public Map i = Maps.newHashMap(); // Spigot public Map decorations = Maps.newLinkedHashMap(); // Spigot + private org.bukkit.craftbukkit.map.RenderData vanillaRender = new org.bukkit.craftbukkit.map.RenderData(); // Paper // CraftBukkit start public final CraftMapView mapView; @@ -37,18 +41,20 @@ public class WorldMap extends PersistentBase { // CraftBukkit start mapView = new CraftMapView(this); server = (CraftServer) org.bukkit.Bukkit.getServer(); + vanillaRender.buffer = colors; // Paper // CraftBukkit end } public void a(double d0, double d1, int i) { int j = 128 * (1 << i); - int k = MathHelper.floor((d0 + 64.0D) / (double) j); - int l = MathHelper.floor((d1 + 64.0D) / (double) j); + int k = MathHelper.floor((d0 + 64.0D) / j); + int l = MathHelper.floor((d1 + 64.0D) / j); this.centerX = k * j + j / 2 - 64; this.centerZ = l * j + j / 2 - 64; } + @Override public void a(NBTTagCompound nbttagcompound) { // CraftBukkit start byte dimension = nbttagcompound.getByte("dimension"); @@ -63,8 +69,11 @@ public class WorldMap extends PersistentBase { CraftWorld world = (CraftWorld) server.getWorld(this.uniqueId); // Check if the stored world details are correct. if (world == null) { - /* All Maps which do not have their valid world loaded are set to a dimension which hopefully won't be reached. - This is to prevent them being corrupted with the wrong map data. */ + /* + * All Maps which do not have their valid world loaded are set to a dimension + * which hopefully won't be reached. This is to prevent them being corrupted + * with the wrong map data. + */ dimension = 127; } else { dimension = (byte) world.getHandle().dimension; @@ -104,9 +113,10 @@ public class WorldMap extends PersistentBase { } } } - + this.vanillaRender.buffer = this.colors; // Paper } + @Override public void b(NBTTagCompound nbttagcompound) { // CraftBukkit start if (this.map >= 10) { @@ -119,8 +129,11 @@ public class WorldMap extends PersistentBase { } } } - /* Perform a second check to see if a matching world was found, this is a necessary - change incase Maps are forcefully unlinked from a World and lack a UID.*/ + /* + * Perform a second check to see if a matching world was found, this is a + * necessary change incase Maps are forcefully unlinked from a World and lack a + * UID. + */ if (this.uniqueId != null) { nbttagcompound.setLong("UUIDLeast", this.uniqueId.getLeastSignificantBits()); nbttagcompound.setLong("UUIDMost", this.uniqueId.getMostSignificantBits()); @@ -136,9 +149,14 @@ public class WorldMap extends PersistentBase { nbttagcompound.setByteArray("colors", this.colors); } + public void updateSeenPlayers(EntityHuman entityhuman, ItemStack itemstack) { + this.a(entityhuman, itemstack); + } + public void a(EntityHuman entityhuman, ItemStack itemstack) { if (!this.i.containsKey(entityhuman)) { - WorldMap.WorldMapHumanTracker worldmap_worldmaphumantracker = new WorldMap.WorldMapHumanTracker(entityhuman); + WorldMap.WorldMapHumanTracker worldmap_worldmaphumantracker = new WorldMap.WorldMapHumanTracker( + entityhuman); this.i.put(entityhuman, worldmap_worldmaphumantracker); this.g.add(worldmap_worldmaphumantracker); @@ -149,11 +167,15 @@ public class WorldMap extends PersistentBase { } for (int i = 0; i < this.g.size(); ++i) { - WorldMap.WorldMapHumanTracker worldmap_worldmaphumantracker1 = (WorldMap.WorldMapHumanTracker) this.g.get(i); + WorldMap.WorldMapHumanTracker worldmap_worldmaphumantracker1 = this.g.get(i); - if (!worldmap_worldmaphumantracker1.trackee.dead && (worldmap_worldmaphumantracker1.trackee.inventory.c(itemstack) || itemstack.y())) { + if (!worldmap_worldmaphumantracker1.trackee.dead + && (worldmap_worldmaphumantracker1.trackee.inventory.c(itemstack) || itemstack.y())) { if (!itemstack.y() && worldmap_worldmaphumantracker1.trackee.dimension == this.map) { - this.a(0, worldmap_worldmaphumantracker1.trackee.world, worldmap_worldmaphumantracker1.trackee.getUniqueID(), worldmap_worldmaphumantracker1.trackee.locX, worldmap_worldmaphumantracker1.trackee.locZ, (double) worldmap_worldmaphumantracker1.trackee.yaw); // Spigot + this.a(0, worldmap_worldmaphumantracker1.trackee.world, + worldmap_worldmaphumantracker1.trackee.getUniqueID(), + worldmap_worldmaphumantracker1.trackee.locX, worldmap_worldmaphumantracker1.trackee.locZ, + worldmap_worldmaphumantracker1.trackee.yaw); // Spigot } } else { this.i.remove(worldmap_worldmaphumantracker1.trackee); @@ -165,7 +187,9 @@ public class WorldMap extends PersistentBase { EntityItemFrame entityitemframe = itemstack.z(); BlockPosition blockposition = entityitemframe.getBlockPosition(); - this.a(1, entityhuman.world, UUID.nameUUIDFromBytes(("frame-" + entityitemframe.getId()).getBytes(Charsets.US_ASCII)), (double) blockposition.getX(), (double) blockposition.getZ(), (double) (entityitemframe.direction.b() * 90)); // Spigot + this.a(1, entityhuman.world, + UUID.nameUUIDFromBytes(("frame-" + entityitemframe.getId()).getBytes(Charsets.US_ASCII)), + blockposition.getX(), blockposition.getZ(), entityitemframe.direction.b() * 90); // Spigot } if (itemstack.hasTag() && itemstack.getTag().hasKeyOfType("Decorations", 9)) { @@ -177,8 +201,9 @@ public class WorldMap extends PersistentBase { // Spigot - start UUID uuid = UUID.nameUUIDFromBytes(nbttagcompound.getString("id").getBytes(Charsets.US_ASCII)); if (!this.decorations.containsKey(uuid)) { - this.a(nbttagcompound.getByte("type"), entityhuman.world, uuid, nbttagcompound.getDouble("x"), nbttagcompound.getDouble("z"), nbttagcompound.getDouble("rot")); - // Spigot - end + this.a(nbttagcompound.getByte("type"), entityhuman.world, uuid, nbttagcompound.getDouble("x"), + nbttagcompound.getDouble("z"), nbttagcompound.getDouble("rot")); + // Spigot - end } } } @@ -187,14 +212,14 @@ public class WorldMap extends PersistentBase { private void a(int i, World world, UUID s, double d0, double d1, double d2) { int j = 1 << this.scale; - float f = (float) (d0 - (double) this.centerX) / (float) j; - float f1 = (float) (d1 - (double) this.centerZ) / (float) j; - byte b0 = (byte) ((int) ((double) (f * 2.0F) + 0.5D)); - byte b1 = (byte) ((int) ((double) (f1 * 2.0F) + 0.5D)); + float f = (float) (d0 - this.centerX) / j; + float f1 = (float) (d1 - this.centerZ) / j; + byte b0 = (byte) ((int) (f * 2.0F + 0.5D)); + byte b1 = (byte) ((int) (f1 * 2.0F + 0.5D)); byte b2 = 63; byte b3; - if (f >= (float) (-b2) && f1 >= (float) (-b2) && f <= (float) b2 && f1 <= (float) b2) { + if (f >= (-b2) && f1 >= (-b2) && f <= b2 && f1 <= b2) { d2 += d2 < 0.0D ? -8.0D : 8.0D; b3 = (byte) ((int) (d2 * 16.0D / 360.0D)); if (this.map < 0) { @@ -210,19 +235,19 @@ public class WorldMap extends PersistentBase { i = 6; b3 = 0; - if (f <= (float) (-b2)) { - b0 = (byte) ((int) ((double) (b2 * 2) + 2.5D)); + if (f <= (-b2)) { + b0 = (byte) ((int) (b2 * 2 + 2.5D)); } - if (f1 <= (float) (-b2)) { - b1 = (byte) ((int) ((double) (b2 * 2) + 2.5D)); + if (f1 <= (-b2)) { + b1 = (byte) ((int) (b2 * 2 + 2.5D)); } - if (f >= (float) b2) { + if (f >= b2) { b0 = (byte) (b2 * 2 + 1); } - if (f1 >= (float) b2) { + if (f1 >= b2) { b1 = (byte) (b2 * 2 + 1); } } @@ -231,7 +256,7 @@ public class WorldMap extends PersistentBase { } public Packet a(ItemStack itemstack, World world, EntityHuman entityhuman) { - WorldMap.WorldMapHumanTracker worldmap_worldmaphumantracker = (WorldMap.WorldMapHumanTracker) this.i.get(entityhuman); + WorldMap.WorldMapHumanTracker worldmap_worldmaphumantracker = this.i.get(entityhuman); return worldmap_worldmaphumantracker == null ? null : worldmap_worldmaphumantracker.a(itemstack); } @@ -241,7 +266,8 @@ public class WorldMap extends PersistentBase { Iterator iterator = this.g.iterator(); while (iterator.hasNext()) { - WorldMap.WorldMapHumanTracker worldmap_worldmaphumantracker = (WorldMap.WorldMapHumanTracker) iterator.next(); + WorldMap.WorldMapHumanTracker worldmap_worldmaphumantracker = (WorldMap.WorldMapHumanTracker) iterator + .next(); worldmap_worldmaphumantracker.a(i, j); } @@ -249,7 +275,7 @@ public class WorldMap extends PersistentBase { } public WorldMap.WorldMapHumanTracker a(EntityHuman entityhuman) { - WorldMap.WorldMapHumanTracker worldmap_worldmaphumantracker = (WorldMap.WorldMapHumanTracker) this.i.get(entityhuman); + WorldMap.WorldMapHumanTracker worldmap_worldmaphumantracker = this.i.get(entityhuman); if (worldmap_worldmaphumantracker == null) { worldmap_worldmaphumantracker = new WorldMap.WorldMapHumanTracker(entityhuman); @@ -275,13 +301,27 @@ public class WorldMap extends PersistentBase { this.trackee = entityhuman; } - public Packet a(ItemStack itemstack) { + public Packet a(ItemStack itemstack) { // CraftBukkit start - org.bukkit.craftbukkit.map.RenderData render = WorldMap.this.mapView.render((org.bukkit.craftbukkit.entity.CraftPlayer) this.trackee.getBukkitEntity()); // CraftBukkit + // org.bukkit.craftbukkit.map.RenderData render = + // WorldMap.this.mapView.render((org.bukkit.craftbukkit.entity.CraftPlayer) + // this.trackee.getBukkitEntity()); // CraftBukkit + if (!this.d && this.i % 5 != 0) { + this.i++; + return null; + } // Paper - this won't end up sending, so don't render it! + boolean vanillaMaps = shouldUseVanillaMap(); // Paper + org.bukkit.craftbukkit.map.RenderData render = !vanillaMaps + ? WorldMap.this.mapView + .render((org.bukkit.craftbukkit.entity.CraftPlayer) this.trackee.getBukkitEntity()) + : WorldMap.this.vanillaRender; // CraftBukkit // Paper java.util.Collection icons = new java.util.ArrayList(); + if (vanillaMaps) { + addSeenPlayers(icons); // Paper + } - for ( org.bukkit.map.MapCursor cursor : render.cursors) { + for (org.bukkit.map.MapCursor cursor : render.cursors) { if (cursor.isVisible()) { icons.add(new MapIcon(cursor.getRawType(), cursor.getX(), cursor.getY(), cursor.getDirection())); @@ -290,13 +330,32 @@ public class WorldMap extends PersistentBase { if (this.d) { this.d = false; - return new PacketPlayOutMap(itemstack.getData(), WorldMap.this.scale, icons, render.buffer, this.e, this.f, this.g + 1 - this.e, this.h + 1 - this.f); + return new PacketPlayOutMap(itemstack.getData(), WorldMap.this.scale, icons, render.buffer, this.e, + this.f, this.g + 1 - this.e, this.h + 1 - this.f); } else { - return this.i++ % 5 == 0 ? new PacketPlayOutMap(itemstack.getData(), WorldMap.this.scale, icons, render.buffer, 0, 0, 0, 0) : null; + return this.i++ % 5 == 0 + ? new PacketPlayOutMap(itemstack.getData(), WorldMap.this.scale, icons, render.buffer, 0, 0, 0, + 0) + : null; } // CraftBukkit end } + private void addSeenPlayers(Collection icons) { + Player player = (Player) this.trackee.getBukkitEntity(); + WorldMap.this.decorations.forEach((uuid, mapIcon) -> { + Player other = Bukkit.getPlayer(uuid); + if (other == null || player.canSee(other)) { + icons.add(mapIcon); + } + }); + } + + private boolean shouldUseVanillaMap() { + return mapView.getRenderers().size() == 1 + && mapView.getRenderers().get(0).getClass() == org.bukkit.craftbukkit.map.CraftMapRenderer.class; + } + public void a(int i, int j) { if (this.d) { this.e = Math.min(this.e, i); @@ -313,4 +372,12 @@ public class WorldMap extends PersistentBase { } } -} + + // FlamePaper - Minetick fix memory leaks + public void untrackPlayer(EntityHuman entityhuman) { + if (this.i.containsKey(entityhuman)) { + this.i.remove(entityhuman); + this.g.removeIf(worldMapHumanTracker -> worldMapHumanTracker.trackee == entityhuman); + } + } +} \ No newline at end of file diff --git a/TacoSpigot-Server/src/main/java/net/minecraft/server/WorldServer.java b/TacoSpigot-Server/src/main/java/net/minecraft/server/WorldServer.java index a8adfae..f005d91 100644 --- a/TacoSpigot-Server/src/main/java/net/minecraft/server/WorldServer.java +++ b/TacoSpigot-Server/src/main/java/net/minecraft/server/WorldServer.java @@ -24,7 +24,7 @@ import org.bukkit.craftbukkit.util.HashTreeSet; import org.bukkit.event.block.BlockFormEvent; import org.bukkit.event.weather.LightningStrikeEvent; -import monkey.sindre.spigot.MonkeyFeature; +import com.elevatemc.spigot.MonkeyFeature; // CraftBukkit end public class WorldServer extends World implements IAsyncTaskHandler { @@ -260,7 +260,7 @@ public class WorldServer extends World implements IAsyncTaskHandler { this.manager.flush(); timings.doChunkMap.stopTiming(); // Spigot - if (MonkeyFeature.VILLAGE_TICKING.isEnabled()) { // MonkeySpigot - Disable village ticking + if (MonkeyFeature.VILLAGE_TICKING.isEnabled()) { // eSpigot - Disable village ticking this.methodProfiler.c("village"); timings.doVillages.startTiming(); // Spigot this.villages.tick(); diff --git a/TacoSpigot-Server/src/main/java/org/bukkit/craftbukkit/CraftChunk.java b/TacoSpigot-Server/src/main/java/org/bukkit/craftbukkit/CraftChunk.java index 8a33e28..9fea55b 100644 --- a/TacoSpigot-Server/src/main/java/org/bukkit/craftbukkit/CraftChunk.java +++ b/TacoSpigot-Server/src/main/java/org/bukkit/craftbukkit/CraftChunk.java @@ -75,6 +75,7 @@ public class CraftChunk implements Chunk { return new CraftBlock(this, (getX() << 4) | (x & 0xF), y, (getZ() << 4) | (z & 0xF)); } + @Override public Entity[] getEntities() { int count = 0, index = 0; net.minecraft.server.Chunk chunk = getHandle(); @@ -86,14 +87,15 @@ public class CraftChunk implements Chunk { Entity[] entities = new Entity[count]; for (int i = 0; i < 16; i++) { - - for (Object obj : chunk.entitySlices[i].toArray()) { - if (!(obj instanceof net.minecraft.server.Entity)) { + // Paper start - speed up (was with chunk.entitySlices[i].toArray() and cast + // checks which costs a lot of performance if called often) + for (Object entity : chunk.entitySlices[i]) { + if (entity == null) { continue; } - - entities[index++] = ((net.minecraft.server.Entity) obj).getBukkitEntity(); + entities[index++] = ((net.minecraft.server.Entity) entity).getBukkitEntity(); } + // Paper end } return entities; diff --git a/TacoSpigot-Server/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/TacoSpigot-Server/src/main/java/org/bukkit/craftbukkit/CraftServer.java index 9145bc3..6190e22 100644 --- a/TacoSpigot-Server/src/main/java/org/bukkit/craftbukkit/CraftServer.java +++ b/TacoSpigot-Server/src/main/java/org/bukkit/craftbukkit/CraftServer.java @@ -127,7 +127,7 @@ import net.md_5.bungee.api.chat.BaseComponent; public final class CraftServer implements Server { private static final Player[] EMPTY_PLAYER_ARRAY = new Player[0]; - private final String serverName = "MonkeySpigot"; + private final String serverName = "eSpigot"; private final String serverVersion; private final String bukkitVersion = Versioning.getBukkitVersion(); private final Logger logger = Logger.getLogger("Minecraft"); diff --git a/TacoSpigot-Server/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/TacoSpigot-Server/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java index 87c47d3..ad661c4 100644 --- a/TacoSpigot-Server/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +++ b/TacoSpigot-Server/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java @@ -21,7 +21,7 @@ import java.util.UUID; import java.util.logging.Level; import java.util.logging.Logger; -import monkey.sindre.spigot.MonkeyFeature; +import com.elevatemc.spigot.MonkeyFeature; import net.md_5.bungee.api.chat.BaseComponent; import net.minecraft.server.*; diff --git a/TacoSpigot-Server/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaSkull.java b/TacoSpigot-Server/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaSkull.java index 55bbad7..5266f70 100644 --- a/TacoSpigot-Server/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaSkull.java +++ b/TacoSpigot-Server/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaSkull.java @@ -2,13 +2,7 @@ package org.bukkit.craftbukkit.inventory; import java.util.Map; -import net.minecraft.server.GameProfileSerializer; -import net.minecraft.server.NBTBase; -import net.minecraft.server.NBTTagCompound; - // PaperSpigot start -import net.minecraft.server.EntityPlayer; -import net.minecraft.server.MinecraftServer; // PaperSpigot end import org.bukkit.Material; @@ -19,6 +13,13 @@ import org.bukkit.inventory.meta.SkullMeta; import com.google.common.collect.ImmutableMap.Builder; import com.mojang.authlib.GameProfile; +import net.minecraft.server.EntityPlayer; +import net.minecraft.server.GameProfileSerializer; +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.NBTBase; +import net.minecraft.server.NBTTagCompound; +import net.minecraft.server.TileEntitySkull; + @DelegateDeserialization(SerializableMeta.class) class CraftMetaSkull extends CraftMetaItem implements SkullMeta { @@ -79,19 +80,15 @@ class CraftMetaSkull extends CraftMetaItem implements SkullMeta { if (profile != null) { NBTTagCompound owner = new NBTTagCompound(); GameProfileSerializer.serialize(owner, profile); - tag.set( SKULL_OWNER.NBT, owner ); - // Spigot start - do an async lookup of the profile. + tag.set(SKULL_OWNER.NBT, owner); + // Spigot start - do an async lookup of the profile. // Unfortunately there is not way to refresh the holding // inventory, so that responsibility is left to the user. - net.minecraft.server.TileEntitySkull.b(profile, new com.google.common.base.Predicate() { - - @Override - public boolean apply(GameProfile input) { - NBTTagCompound owner = new NBTTagCompound(); - GameProfileSerializer.serialize( owner, input ); - tag.set( SKULL_OWNER.NBT, owner ); - return false; - } + net.minecraft.server.TileEntitySkull.b(profile, input -> { + NBTTagCompound owner1 = new NBTTagCompound(); + GameProfileSerializer.serialize(owner1, input); + tag.set(SKULL_OWNER.NBT, owner1); + return false; }); // Spigot end } @@ -108,7 +105,7 @@ class CraftMetaSkull extends CraftMetaItem implements SkullMeta { @Override boolean applicableTo(Material type) { - switch(type) { + switch (type) { case SKULL_ITEM: return true; default: @@ -121,28 +118,40 @@ class CraftMetaSkull extends CraftMetaItem implements SkullMeta { return (CraftMetaSkull) super.clone(); } + @Override public boolean hasOwner() { return profile != null && profile.getName() != null; } + @Override public String getOwner() { return hasOwner() ? profile.getName() : null; } + @Override public boolean setOwner(String name) { - if (name != null && name.length() > MAX_OWNER_LENGTH) { + // Feather - Null name would break everything and makes no sense and causes NPE + if (name == null || name.length() > MAX_OWNER_LENGTH) { return false; } - if (name == null) { - profile = null; - } else { - // PaperSpigot start - Check usercache if the player is online - EntityPlayer player = MinecraftServer.getServer().getPlayerList().getPlayer(name); - profile = player != null ? player.getProfile() : new GameProfile(null, name); + // PaperSpigot start - Check usercache if the player is online + EntityPlayer player = MinecraftServer.getServer().getPlayerList().getPlayer(name); + if (profile == null && player != null) { + profile = player.getProfile(); // PaperSpigot end } + if (profile == null) { + // name.toLowerCase(java.util.Locale.ROOT) causes the NPE + profile = TileEntitySkull.skinCache.getIfPresent(name.toLowerCase(java.util.Locale.ROOT)); // Paper // tries + // to get from + // skincache + } + if (profile == null) { + profile = new GameProfile(null, name); + } + return true; } @@ -164,7 +173,7 @@ class CraftMetaSkull extends CraftMetaItem implements SkullMeta { if (meta instanceof CraftMetaSkull) { CraftMetaSkull that = (CraftMetaSkull) meta; - return (this.hasOwner() ? that.hasOwner() && this.profile.equals(that.profile) : !that.hasOwner()); + return (this.hasOwner() ? that.hasOwner() && profile.equals(that.profile) : !that.hasOwner()); } return true; } @@ -178,8 +187,8 @@ class CraftMetaSkull extends CraftMetaItem implements SkullMeta { Builder serialize(Builder builder) { super.serialize(builder); if (hasOwner()) { - return builder.put(SKULL_OWNER.BUKKIT, this.profile.getName()); + return builder.put(SKULL_OWNER.BUKKIT, profile.getName()); } return builder; } -} +} \ No newline at end of file diff --git a/TacoSpigot-Server/src/main/java/org/bukkit/craftbukkit/map/RenderData.java b/TacoSpigot-Server/src/main/java/org/bukkit/craftbukkit/map/RenderData.java index 256a131..503a31b 100644 --- a/TacoSpigot-Server/src/main/java/org/bukkit/craftbukkit/map/RenderData.java +++ b/TacoSpigot-Server/src/main/java/org/bukkit/craftbukkit/map/RenderData.java @@ -5,7 +5,7 @@ import org.bukkit.map.MapCursor; public class RenderData { - public final byte[] buffer; + public byte[] buffer; public final ArrayList cursors; public RenderData() { diff --git a/TacoSpigot-Server/src/main/java/org/github/paperspigot/PaperSpigotConfig.java b/TacoSpigot-Server/src/main/java/org/github/paperspigot/PaperSpigotConfig.java index d6d9899..6e9bec7 100644 --- a/TacoSpigot-Server/src/main/java/org/github/paperspigot/PaperSpigotConfig.java +++ b/TacoSpigot-Server/src/main/java/org/github/paperspigot/PaperSpigotConfig.java @@ -222,4 +222,9 @@ public class PaperSpigotConfig { warnForExcessiveVelocity = getBoolean("warnWhenSettingExcessiveVelocity", true); } + + public static boolean saveEmptyScoreboardTeams; + private static void saveEmptyScoreboardTeams() { + saveEmptyScoreboardTeams = getBoolean("save-empty-scoreboard-teams", false); + } } diff --git a/pom.xml b/pom.xml index a413dfc..674eedc 100644 --- a/pom.xml +++ b/pom.xml @@ -30,7 +30,11 @@ md_5-releases - http://repo.md-5.net/content/repositories/releases/ + https://repo.md-5.net/content/repositories/releases/ + + + velocity-repo + https://repo.velocitypowered.com/snapshots/