From 9d740b84b060d7f4c5a8f2ce846a8501c241f1ca Mon Sep 17 00:00:00 2001 From: CraftBukkit/Spigot Date: Thu, 8 Jun 2023 01:30:00 +1000 Subject: [PATCH] Update to Minecraft 1.20 By: md_5 --- .../minecraft/advancements/Advancement.patch | 6 +- .../commands/CommandDispatcher.patch | 16 +- .../commands/CommandListenerWrapper.patch | 12 +- .../core/cauldron/CauldronInteraction.patch | 20 +- .../core/dispenser/DispenseBehaviorBoat.patch | 12 +- .../dispenser/DispenseBehaviorShears.patch | 4 +- .../core/dispenser/IDispenseBehavior.patch | 38 ++- .../game/PacketPlayOutMultiBlockChange.patch | 7 +- .../network/syncher/DataWatcher.patch | 8 +- .../server/AdvancementDataPlayer.patch | 4 +- .../minecraft/server/CustomFunctionData.patch | 2 +- .../minecraft/server/DispenserRegistry.patch | 12 +- .../net/minecraft/server/Main.patch | 4 +- .../minecraft/server/MinecraftServer.patch | 71 ++--- .../server/commands/CommandDifficulty.patch | 8 +- .../server/commands/CommandEffect.patch | 4 +- .../server/commands/CommandGamerule.patch | 8 +- .../server/commands/CommandGive.patch | 10 +- .../server/commands/CommandList.patch | 11 +- .../commands/CommandSpreadPlayers.patch | 14 +- .../server/commands/CommandTeleport.patch | 2 +- .../server/commands/CommandTime.patch | 6 +- .../server/commands/CommandTrigger.patch | 2 +- .../server/commands/CommandWorldBorder.patch | 15 +- .../server/dedicated/DedicatedServer.patch | 4 +- .../server/dedicated/PropertyManager.patch | 20 +- .../server/level/ChunkMapDistance.patch | 20 +- .../server/level/ChunkProviderServer.patch | 18 +- .../minecraft/server/level/EntityPlayer.patch | 182 ++++++------- .../server/level/EntityTrackerEntry.patch | 39 ++- .../minecraft/server/level/PlayerChunk.patch | 53 ++-- .../server/level/PlayerChunkMap.patch | 50 ++-- .../server/level/PlayerInteractManager.patch | 2 +- .../minecraft/server/level/WorldServer.patch | 93 +++---- .../server/network/HandshakeListener.patch | 2 +- .../server/network/PlayerConnection.patch | 255 ++++++++---------- .../packs/repository/ResourcePackLoader.patch | 29 -- .../minecraft/server/players/PlayerList.patch | 80 +++--- .../minecraft/stats/RecipeBookServer.patch | 2 +- .../net/minecraft/util/SpawnUtil.patch | 4 +- .../util/datafix/DataConverterRegistry.patch | 14 +- .../world/damagesource/DamageSources.patch | 6 +- .../world/effect/MobEffectList.patch | 2 +- .../net/minecraft/world/entity/Entity.patch | 120 ++++----- .../world/entity/EntityAgeable.patch | 6 +- .../world/entity/EntityCreature.patch | 4 +- .../world/entity/EntityExperienceOrb.patch | 8 +- .../world/entity/EntityInsentient.patch | 90 +++---- .../world/entity/EntityLightning.patch | 24 +- .../minecraft/world/entity/EntityLiving.patch | 201 +++++++------- .../world/entity/IEntitySelector.patch | 2 +- .../minecraft/world/entity/Interaction.patch | 4 +- .../behavior/BehaviorAttackTargetForget.patch | 2 +- .../entity/ai/behavior/BehaviorFarm.patch | 58 ++-- .../behavior/BehaviorFindAdmirableItem.patch | 2 +- .../ai/behavior/BehaviorInteractDoor.patch | 8 +- .../entity/ai/behavior/BehaviorUtil.patch | 6 +- .../ai/goal/PathfinderGoalBreakDoor.patch | 8 +- .../ai/goal/PathfinderGoalFollowOwner.patch | 2 +- .../entity/ai/goal/PathfinderGoalSit.patch | 2 +- .../entity/ai/goal/PathfinderGoalTempt.patch | 2 +- .../world/entity/ambient/EntityBat.patch | 14 +- .../world/entity/animal/EntityAnimal.patch | 80 +++--- .../world/entity/animal/EntityBee.patch | 22 +- .../world/entity/animal/EntityCat.patch | 10 +- .../world/entity/animal/EntityChicken.patch | 2 +- .../world/entity/animal/EntityCow.patch | 4 +- .../world/entity/animal/EntityDolphin.patch | 4 +- .../world/entity/animal/EntityFox.patch | 2 +- .../world/entity/animal/EntityIronGolem.patch | 2 +- .../entity/animal/EntityMushroomCow.patch | 16 +- .../world/entity/animal/EntityOcelot.patch | 4 +- .../world/entity/animal/EntityPanda.patch | 2 +- .../world/entity/animal/EntityParrot.patch | 6 +- .../world/entity/animal/EntityRabbit.patch | 2 +- .../world/entity/animal/EntitySheep.patch | 30 +-- .../world/entity/animal/EntitySnowman.patch | 20 +- .../world/entity/animal/EntityTurtle.patch | 4 +- .../world/entity/animal/EntityWolf.patch | 50 ++-- .../world/entity/animal/allay/Allay.patch | 48 ++-- .../world/entity/animal/goat/Goat.patch | 4 +- .../animal/horse/EntityHorseAbstract.patch | 4 +- .../world/entity/animal/sniffer/Sniffer.patch | 83 ++---- .../boss/enderdragon/EntityEnderCrystal.patch | 16 +- .../boss/enderdragon/EntityEnderDragon.patch | 77 +++--- .../phases/DragonControllerManager.patch | 4 +- .../entity/boss/wither/EntityWither.patch | 18 +- .../entity/decoration/EntityArmorStand.patch | 45 ++-- .../entity/decoration/EntityHanging.patch | 33 ++- .../entity/decoration/EntityItemFrame.patch | 9 +- .../entity/item/EntityFallingBlock.patch | 28 +- .../world/entity/item/EntityItem.patch | 18 +- .../world/entity/item/EntityTNTPrimed.patch | 10 +- .../world/entity/monster/EntityCreeper.patch | 14 +- .../world/entity/monster/EntityDrowned.patch | 4 +- .../world/entity/monster/EntityEnderman.patch | 2 +- .../entity/monster/EntityGuardianElder.patch | 4 +- .../world/entity/monster/EntityPhantom.patch | 2 +- .../entity/monster/EntityPigZombie.patch | 4 +- .../world/entity/monster/EntityRavager.patch | 4 +- .../world/entity/monster/EntityShulker.patch | 8 +- .../world/entity/monster/EntitySkeleton.patch | 2 +- .../monster/EntitySkeletonAbstract.patch | 8 +- .../world/entity/monster/EntitySlime.patch | 6 +- .../world/entity/monster/EntityZombie.patch | 14 +- .../entity/monster/EntityZombieHusk.patch | 2 +- .../entity/monster/EntityZombieVillager.patch | 8 +- .../entity/monster/piglin/EntityPiglin.patch | 20 +- .../world/entity/monster/warden/Warden.patch | 22 +- .../world/entity/npc/EntityVillager.patch | 28 +- .../entity/npc/EntityVillagerTrader.patch | 8 +- .../world/entity/player/EntityHuman.patch | 100 +++---- .../world/entity/projectile/EntityArrow.patch | 8 +- .../world/entity/projectile/EntityEgg.patch | 14 +- .../entity/projectile/EntityEnderPearl.patch | 18 +- .../entity/projectile/EntityEnderSignal.patch | 10 +- .../entity/projectile/EntityFireball.patch | 4 +- .../projectile/EntityFireballFireball.patch | 2 +- .../entity/projectile/EntityFireworks.patch | 10 +- .../entity/projectile/EntityFishingHook.patch | 34 +-- .../projectile/EntityLargeFireball.patch | 14 +- .../entity/projectile/EntityLlamaSpit.patch | 2 +- .../entity/projectile/EntityPotion.patch | 30 +-- .../EntityProjectileThrowable.patch | 11 +- .../projectile/EntityShulkerBullet.patch | 6 +- .../projectile/EntitySmallFireball.patch | 14 +- .../projectile/EntityThrownExpBottle.patch | 12 +- .../projectile/EntityThrownTrident.patch | 4 +- .../entity/projectile/EntityWitherSkull.patch | 10 +- .../world/entity/projectile/IProjectile.patch | 10 +- .../world/entity/raid/EntityRaider.patch | 2 +- .../world/entity/vehicle/ChestBoat.patch | 2 +- .../world/entity/vehicle/EntityBoat.patch | 22 +- .../vehicle/EntityMinecartAbstract.patch | 56 ++-- .../vehicle/EntityMinecartCommandBlock.patch | 6 +- .../entity/vehicle/EntityMinecartTNT.patch | 22 +- .../minecraft/world/flag/FeatureFlag.patch | 11 - .../world/flag/FeatureFlagRegistry.patch | 11 - .../minecraft/world/inventory/Container.patch | 24 +- .../world/inventory/ContainerAnvil.patch | 24 +- .../inventory/ContainerEnchantTable.patch | 2 +- .../world/inventory/ContainerGrindstone.patch | 2 +- .../world/inventory/ContainerLoom.patch | 2 +- .../world/inventory/ContainerMerchant.patch | 2 +- .../world/inventory/ContainerPlayer.patch | 6 +- .../world/inventory/ContainerSmithing.patch | 6 +- .../inventory/ContainerStonecutter.patch | 4 +- .../world/inventory/ContainerWorkbench.patch | 11 +- .../world/inventory/LegacySmithingMenu.patch | 60 ----- .../world/inventory/SlotFurnaceResult.patch | 14 +- ...patch => TransientCraftingContainer.patch} | 21 +- .../net/minecraft/world/item/ItemBucket.patch | 12 +- .../net/minecraft/world/item/ItemDye.patch | 16 +- .../minecraft/world/item/ItemEndCrystal.patch | 2 +- .../minecraft/world/item/ItemMonsterEgg.patch | 4 +- .../net/minecraft/world/item/ItemSign.patch | 22 +- .../net/minecraft/world/item/ItemStack.patch | 55 ++-- .../item/crafting/LegacyUpgradeRecipe.patch | 35 --- .../world/item/crafting/RecipeItemStack.patch | 2 +- .../enchantment/EnchantmentFrostWalker.patch | 4 +- .../world/item/trading/MerchantRecipe.patch | 16 +- .../net/minecraft/world/level/Explosion.patch | 6 +- .../net/minecraft/world/level/World.patch | 25 +- .../world/level/block/BigDripleafBlock.patch | 2 +- .../minecraft/world/level/block/Block.patch | 6 +- .../world/level/block/BlockBed.patch | 8 +- .../world/level/block/BlockBell.patch | 4 +- .../world/level/block/BlockCactus.patch | 2 +- .../world/level/block/BlockComposter.patch | 16 +- .../level/block/BlockDiodeAbstract.patch | 4 +- .../world/level/block/BlockDispenser.patch | 4 +- .../world/level/block/BlockDoor.patch | 4 +- .../world/level/block/BlockIce.patch | 2 +- .../world/level/block/BlockLeaves.patch | 4 +- .../world/level/block/BlockMagma.patch | 2 +- .../world/level/block/BlockNote.patch | 6 +- .../block/BlockPressurePlateAbstract.patch | 17 ++ .../block/BlockPressurePlateBinary.patch | 65 +++-- .../block/BlockPressurePlateWeighted.patch | 12 +- .../level/block/BlockPumpkinCarved.patch | 8 +- .../world/level/block/BlockSoil.patch | 6 +- .../world/level/block/BlockSponge.patch | 111 ++++---- .../world/level/block/BlockTrapdoor.patch | 4 +- .../world/level/block/BlockWaterLily.patch | 2 +- .../world/level/block/BlockWitherSkull.patch | 12 +- .../level/block/BuddingAmethystBlock.patch | 2 +- .../level/block/PointedDripstoneBlock.patch | 16 +- .../level/block/SculkCatalystBlock.patch | 2 +- .../world/level/block/SculkSensorBlock.patch | 22 +- .../world/level/block/SculkVeinBlock.patch | 4 +- .../entity/ChiseledBookShelfBlockEntity.patch | 2 +- .../entity/SculkCatalystBlockEntity.patch | 4 +- .../level/block/entity/TileEntityBell.patch | 11 - .../block/entity/TileEntityFurnace.patch | 15 +- .../level/block/entity/TileEntityHopper.patch | 2 +- .../block/entity/TileEntityJukeBox.patch | 14 +- .../level/block/entity/TileEntitySign.patch | 133 +++++---- .../level/block/piston/BlockPiston.patch | 2 +- .../minecraft/world/level/chunk/Chunk.patch | 32 +-- .../world/level/chunk/ChunkSection.patch | 14 +- .../world/level/chunk/ChunkStatus.patch | 14 +- .../world/level/chunk/IChunkAccess.patch | 12 +- .../world/level/chunk/NibbleArray.patch | 2 +- .../chunk/storage/ChunkRegionLoader.patch | 24 +- .../vibrations/VibrationListener.patch | 51 ---- .../vibrations/VibrationSystem.patch | 52 ++++ .../level/levelgen/MobSpawnerPhantom.patch | 2 +- .../templatesystem/DefinedStructure.patch | 14 +- .../level/material/FluidTypeFlowing.patch | 8 +- .../world/level/storage/Convertable.patch | 67 +++-- .../world/level/storage/WorldDataServer.patch | 61 +++-- .../level/storage/loot/LootDataManager.patch | 43 +++ .../world/level/storage/loot/LootTable.patch | 11 +- .../storage/loot/LootTableRegistry.patch | 31 --- paper-server/pom.xml | 30 +-- .../org/bukkit/craftbukkit/CraftChunk.java | 4 +- .../bukkit/craftbukkit/CraftLootTable.java | 18 +- .../org/bukkit/craftbukkit/CraftParticle.java | 5 +- .../craftbukkit/CraftRegionAccessor.java | 2 +- .../org/bukkit/craftbukkit/CraftServer.java | 20 +- .../org/bukkit/craftbukkit/CraftWorld.java | 6 +- .../java/org/bukkit/craftbukkit/Main.java | 4 +- .../bukkit/craftbukkit/block/CraftBlock.java | 2 +- .../craftbukkit/block/CraftBlockStates.java | 7 +- .../block/CraftBrushableBlock.java | 67 +++++ .../block/CraftCalibratedSculkSensor.java | 12 + .../craftbukkit/block/CraftDecoratedPot.java | 19 +- .../craftbukkit/block/CraftSculkSensor.java | 4 +- .../bukkit/craftbukkit/block/CraftSign.java | 21 +- .../block/CraftSuspiciousSand.java | 61 +---- .../block/data/CraftBlockData.java | 6 +- .../block/data/CraftBrushable.java | 23 ++ .../block/data/CraftHatchable.java | 23 ++ ...uspiciousSand.java => CraftBrushable.java} | 4 +- .../block/data/type/CraftTurtleEgg.java | 16 -- ...uspiciousSand.java => CraftBrushable.java} | 10 +- .../impl/CraftCalibratedSculkSensor.java | 81 ++++++ .../impl/CraftEquipableCarvedPumpkin.java | 34 +++ .../block/impl/CraftPitcherCrop.java | 48 ++++ .../block/impl/CraftSnifferEgg.java | 34 +++ .../block/impl/CraftTurtleEgg.java | 7 +- .../craftbukkit/block/sign/CraftSignSide.java | 12 +- .../craftbukkit/entity/CraftEntity.java | 8 +- .../craftbukkit/entity/CraftFishHook.java | 2 +- .../craftbukkit/entity/CraftHumanEntity.java | 20 +- .../craftbukkit/entity/CraftItemFrame.java | 2 +- .../craftbukkit/entity/CraftPlayer.java | 22 +- .../craftbukkit/entity/CraftRaider.java | 3 +- .../craftbukkit/entity/CraftSniffer.java | 20 +- .../craftbukkit/entity/CraftVillager.java | 4 +- .../craftbukkit/entity/CraftWither.java | 2 +- .../craftbukkit/event/CraftEventFactory.java | 44 +-- .../generator/CustomChunkGenerator.java | 5 - .../generator/OldCraftChunkData.java | 2 +- .../craftbukkit/inventory/CraftContainer.java | 2 - .../inventory/CraftItemFactory.java | 2 + .../craftbukkit/inventory/CraftItemStack.java | 2 + .../inventory/CraftMetaBlockState.java | 4 +- .../inventory/CraftSmithingRecipe.java | 29 -- .../profile/CraftProfileProperty.java | 18 +- .../craftbukkit/structure/CraftPalette.java | 2 +- .../craftbukkit/util/CraftLocation.java | 6 +- .../craftbukkit/util/CraftMagicNumbers.java | 6 +- .../util/DummyGeneratorAccess.java | 4 +- .../java/org/bukkit/ChunkLoadLevelTest.java | 22 -- .../test/java/org/bukkit/PerMaterialTest.java | 10 +- .../bukkit/craftbukkit/legacy/LegacyTest.java | 7 +- .../bukkit/support/AbstractTestingBase.java | 2 +- .../java/org/bukkit/support/DummyServer.java | 2 +- 269 files changed, 2605 insertions(+), 2568 deletions(-) delete mode 100644 paper-server/nms-patches/net/minecraft/server/packs/repository/ResourcePackLoader.patch delete mode 100644 paper-server/nms-patches/net/minecraft/world/flag/FeatureFlag.patch delete mode 100644 paper-server/nms-patches/net/minecraft/world/flag/FeatureFlagRegistry.patch delete mode 100644 paper-server/nms-patches/net/minecraft/world/inventory/LegacySmithingMenu.patch rename paper-server/nms-patches/net/minecraft/world/inventory/{InventoryCrafting.patch => TransientCraftingContainer.patch} (78%) delete mode 100644 paper-server/nms-patches/net/minecraft/world/item/crafting/LegacyUpgradeRecipe.patch delete mode 100644 paper-server/nms-patches/net/minecraft/world/level/gameevent/vibrations/VibrationListener.patch create mode 100644 paper-server/nms-patches/net/minecraft/world/level/gameevent/vibrations/VibrationSystem.patch create mode 100644 paper-server/nms-patches/net/minecraft/world/level/storage/loot/LootDataManager.patch delete mode 100644 paper-server/nms-patches/net/minecraft/world/level/storage/loot/LootTableRegistry.patch create mode 100644 paper-server/src/main/java/org/bukkit/craftbukkit/block/CraftBrushableBlock.java create mode 100644 paper-server/src/main/java/org/bukkit/craftbukkit/block/CraftCalibratedSculkSensor.java create mode 100644 paper-server/src/main/java/org/bukkit/craftbukkit/block/data/CraftBrushable.java create mode 100644 paper-server/src/main/java/org/bukkit/craftbukkit/block/data/CraftHatchable.java rename paper-server/src/main/java/org/bukkit/craftbukkit/block/data/type/{CraftSuspiciousSand.java => CraftBrushable.java} (77%) rename paper-server/src/main/java/org/bukkit/craftbukkit/block/impl/{CraftSuspiciousSand.java => CraftBrushable.java} (58%) create mode 100644 paper-server/src/main/java/org/bukkit/craftbukkit/block/impl/CraftCalibratedSculkSensor.java create mode 100644 paper-server/src/main/java/org/bukkit/craftbukkit/block/impl/CraftEquipableCarvedPumpkin.java create mode 100644 paper-server/src/main/java/org/bukkit/craftbukkit/block/impl/CraftPitcherCrop.java create mode 100644 paper-server/src/main/java/org/bukkit/craftbukkit/block/impl/CraftSnifferEgg.java delete mode 100644 paper-server/src/main/java/org/bukkit/craftbukkit/inventory/CraftSmithingRecipe.java delete mode 100644 paper-server/src/test/java/org/bukkit/ChunkLoadLevelTest.java diff --git a/paper-server/nms-patches/net/minecraft/advancements/Advancement.patch b/paper-server/nms-patches/net/minecraft/advancements/Advancement.patch index 273b5b0080..e526fe5257 100644 --- a/paper-server/nms-patches/net/minecraft/advancements/Advancement.patch +++ b/paper-server/nms-patches/net/minecraft/advancements/Advancement.patch @@ -1,10 +1,10 @@ --- a/net/minecraft/advancements/Advancement.java +++ b/net/minecraft/advancements/Advancement.java -@@ -40,6 +40,7 @@ - private final String[][] requirements; +@@ -41,6 +41,7 @@ private final Set children = Sets.newLinkedHashSet(); private final IChatBaseComponent chatComponent; + private final boolean sendsTelemetryEvent; + public final org.bukkit.advancement.Advancement bukkit = new org.bukkit.craftbukkit.advancement.CraftAdvancement(this); // CraftBukkit - public Advancement(MinecraftKey minecraftkey, @Nullable Advancement advancement, @Nullable AdvancementDisplay advancementdisplay, AdvancementRewards advancementrewards, Map map, String[][] astring) { + public Advancement(MinecraftKey minecraftkey, @Nullable Advancement advancement, @Nullable AdvancementDisplay advancementdisplay, AdvancementRewards advancementrewards, Map map, String[][] astring, boolean flag) { this.id = minecraftkey; diff --git a/paper-server/nms-patches/net/minecraft/commands/CommandDispatcher.patch b/paper-server/nms-patches/net/minecraft/commands/CommandDispatcher.patch index 8085fe8a75..d8501d35d6 100644 --- a/paper-server/nms-patches/net/minecraft/commands/CommandDispatcher.patch +++ b/paper-server/nms-patches/net/minecraft/commands/CommandDispatcher.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/commands/CommandDispatcher.java +++ b/net/minecraft/commands/CommandDispatcher.java -@@ -119,6 +119,14 @@ +@@ -120,6 +120,14 @@ import net.minecraft.util.profiling.jfr.JvmProfiler; import org.slf4j.Logger; @@ -15,7 +15,7 @@ public class CommandDispatcher { private static final Logger LOGGER = LogUtils.getLogger(); -@@ -130,6 +138,7 @@ +@@ -131,6 +139,7 @@ private final com.mojang.brigadier.CommandDispatcher dispatcher = new com.mojang.brigadier.CommandDispatcher(); public CommandDispatcher(CommandDispatcher.ServerType commanddispatcher_servertype, CommandBuildContext commandbuildcontext) { @@ -23,7 +23,7 @@ CommandAdvancement.register(this.dispatcher); CommandAttribute.register(this.dispatcher, commandbuildcontext); CommandExecute.register(this.dispatcher, commandbuildcontext); -@@ -218,6 +227,11 @@ +@@ -220,6 +229,11 @@ CommandPublish.register(this.dispatcher); } @@ -35,7 +35,7 @@ this.dispatcher.setConsumer((commandcontext, flag, i) -> { ((CommandListenerWrapper) commandcontext.getSource()).onCommandComplete(commandcontext, flag, i); }); -@@ -230,12 +244,59 @@ +@@ -232,12 +246,59 @@ return new ParseResults(commandcontextbuilder1, parseresults.getReader(), parseresults.getExceptions()); } @@ -96,7 +96,7 @@ CommandListenerWrapper commandlistenerwrapper = (CommandListenerWrapper) parseresults.getContext().getSource(); commandlistenerwrapper.getServer().getProfiler().push(() -> { -@@ -260,7 +321,7 @@ +@@ -262,7 +323,7 @@ if (commandsyntaxexception.getInput() != null && commandsyntaxexception.getCursor() >= 0) { int j = Math.min(commandsyntaxexception.getInput().length(), commandsyntaxexception.getCursor()); IChatMutableComponent ichatmutablecomponent = IChatBaseComponent.empty().withStyle(EnumChatFormat.GRAY).withStyle((chatmodifier) -> { @@ -105,7 +105,7 @@ }); if (j > 10) { -@@ -310,11 +371,36 @@ +@@ -312,11 +373,36 @@ } public void sendCommands(EntityPlayer entityplayer) { @@ -143,7 +143,7 @@ entityplayer.connection.send(new PacketPlayOutCommands(rootcommandnode)); } -@@ -325,7 +411,7 @@ +@@ -327,7 +413,7 @@ CommandNode commandnode2 = (CommandNode) iterator.next(); if (commandnode2.canUse(commandlistenerwrapper)) { @@ -152,7 +152,7 @@ argumentbuilder.requires((icompletionprovider) -> { return true; -@@ -348,7 +434,7 @@ +@@ -350,7 +436,7 @@ argumentbuilder.redirect((CommandNode) map.get(argumentbuilder.getRedirect())); } diff --git a/paper-server/nms-patches/net/minecraft/commands/CommandListenerWrapper.patch b/paper-server/nms-patches/net/minecraft/commands/CommandListenerWrapper.patch index 9bb12cce01..bc97dc4f75 100644 --- a/paper-server/nms-patches/net/minecraft/commands/CommandListenerWrapper.patch +++ b/paper-server/nms-patches/net/minecraft/commands/CommandListenerWrapper.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/commands/CommandListenerWrapper.java +++ b/net/minecraft/commands/CommandListenerWrapper.java -@@ -40,6 +40,8 @@ +@@ -42,6 +42,8 @@ import net.minecraft.world.phys.Vec2F; import net.minecraft.world.phys.Vec3D; @@ -9,15 +9,15 @@ public class CommandListenerWrapper implements ICompletionProvider { public static final SimpleCommandExceptionType ERROR_NOT_PLAYER = new SimpleCommandExceptionType(IChatBaseComponent.translatable("permissions.requires.player")); -@@ -60,6 +62,7 @@ - private final Vec2F rotation; +@@ -63,6 +65,7 @@ private final CommandSigningContext signingContext; private final TaskChainer chatMessageChainer; + private final IntConsumer returnValueConsumer; + public volatile CommandNode currentCommand; // CraftBukkit public CommandListenerWrapper(ICommandListener icommandlistener, Vec3D vec3d, Vec2F vec2f, WorldServer worldserver, int i, String s, IChatBaseComponent ichatbasecomponent, MinecraftServer minecraftserver, @Nullable Entity entity) { this(icommandlistener, vec3d, vec2f, worldserver, i, s, ichatbasecomponent, minecraftserver, entity, false, (commandcontext, flag, j) -> { -@@ -170,9 +173,23 @@ +@@ -179,9 +182,23 @@ @Override public boolean hasPermission(int i) { @@ -41,7 +41,7 @@ public Vec3D getPosition() { return this.worldPosition; } -@@ -298,7 +315,7 @@ +@@ -318,7 +335,7 @@ while (iterator.hasNext()) { EntityPlayer entityplayer = (EntityPlayer) iterator.next(); @@ -50,7 +50,7 @@ entityplayer.sendSystemMessage(ichatmutablecomponent); } } -@@ -371,4 +388,10 @@ +@@ -391,4 +408,10 @@ public FeatureFlagSet enabledFeatures() { return this.level.enabledFeatures(); } diff --git a/paper-server/nms-patches/net/minecraft/core/cauldron/CauldronInteraction.patch b/paper-server/nms-patches/net/minecraft/core/cauldron/CauldronInteraction.patch index a3c1c3c0f1..f00efc7e9c 100644 --- a/paper-server/nms-patches/net/minecraft/core/cauldron/CauldronInteraction.patch +++ b/paper-server/nms-patches/net/minecraft/core/cauldron/CauldronInteraction.patch @@ -41,10 +41,10 @@ + return EnumInteractionResult.SUCCESS; + } + // CraftBukkit end - ItemStack itemstack1 = itemstack.copy(); + ItemStack itemstack1 = itemstack.copyWithCount(1); - itemstack1.setCount(1); -@@ -87,7 +101,7 @@ + TileEntityBanner.removeLastPattern(itemstack1); +@@ -86,7 +100,7 @@ } entityhuman.awardStat(StatisticList.CLEAN_BANNER); @@ -53,7 +53,7 @@ } return EnumInteractionResult.sidedSuccess(world.isClientSide); -@@ -105,9 +119,14 @@ +@@ -104,9 +118,14 @@ return EnumInteractionResult.PASS; } else { if (!world.isClientSide) { @@ -69,7 +69,7 @@ } return EnumInteractionResult.sidedSuccess(world.isClientSide); -@@ -116,7 +135,7 @@ +@@ -115,7 +134,7 @@ }; static Object2ObjectOpenHashMap newInteractionMap() { @@ -78,7 +78,7 @@ object2objectopenhashmap.defaultReturnValue((iblockdata, world, blockposition, entityhuman, enumhand, itemstack) -> { return EnumInteractionResult.PASS; }); -@@ -132,12 +151,17 @@ +@@ -131,12 +150,17 @@ return EnumInteractionResult.PASS; } else { if (!world.isClientSide) { @@ -97,7 +97,7 @@ world.playSound((EntityHuman) null, blockposition, SoundEffects.BOTTLE_EMPTY, SoundCategory.BLOCKS, 1.0F, 1.0F); world.gameEvent((Entity) null, GameEvent.FLUID_PLACE, blockposition); } -@@ -153,12 +177,17 @@ +@@ -152,12 +176,17 @@ }); CauldronInteraction.WATER.put(Items.GLASS_BOTTLE, (iblockdata, world, blockposition, entityhuman, enumhand, itemstack) -> { if (!world.isClientSide) { @@ -116,7 +116,7 @@ world.playSound((EntityHuman) null, blockposition, SoundEffects.BOTTLE_FILL, SoundCategory.BLOCKS, 1.0F, 1.0F); world.gameEvent((Entity) null, GameEvent.FLUID_PICKUP, blockposition); } -@@ -168,10 +197,15 @@ +@@ -167,10 +196,15 @@ CauldronInteraction.WATER.put(Items.POTION, (iblockdata, world, blockposition, entityhuman, enumhand, itemstack) -> { if ((Integer) iblockdata.getValue(LayeredCauldronBlock.LEVEL) != 3 && PotionUtil.getPotion(itemstack) == Potions.WATER) { if (!world.isClientSide) { @@ -133,7 +133,7 @@ world.playSound((EntityHuman) null, blockposition, SoundEffects.BOTTLE_EMPTY, SoundCategory.BLOCKS, 1.0F, 1.0F); world.gameEvent((Entity) null, GameEvent.FLUID_PLACE, blockposition); } -@@ -243,12 +277,17 @@ +@@ -242,12 +276,17 @@ return EnumInteractionResult.PASS; } else { if (!world.isClientSide) { @@ -152,7 +152,7 @@ world.playSound((EntityHuman) null, blockposition, soundeffect, SoundCategory.BLOCKS, 1.0F, 1.0F); world.gameEvent((Entity) null, GameEvent.FLUID_PICKUP, blockposition); } -@@ -259,12 +298,17 @@ +@@ -258,12 +297,17 @@ static EnumInteractionResult emptyBucket(World world, BlockPosition blockposition, EntityHuman entityhuman, EnumHand enumhand, ItemStack itemstack, IBlockData iblockdata, SoundEffect soundeffect) { if (!world.isClientSide) { diff --git a/paper-server/nms-patches/net/minecraft/core/dispenser/DispenseBehaviorBoat.patch b/paper-server/nms-patches/net/minecraft/core/dispenser/DispenseBehaviorBoat.patch index 335fabca36..7d33299bec 100644 --- a/paper-server/nms-patches/net/minecraft/core/dispenser/DispenseBehaviorBoat.patch +++ b/paper-server/nms-patches/net/minecraft/core/dispenser/DispenseBehaviorBoat.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/core/dispenser/DispenseBehaviorBoat.java +++ b/net/minecraft/core/dispenser/DispenseBehaviorBoat.java -@@ -11,6 +11,11 @@ +@@ -12,6 +12,11 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.BlockDispenser; @@ -12,18 +12,18 @@ public class DispenseBehaviorBoat extends DispenseBehaviorItem { private final DispenseBehaviorItem defaultDispenseItemBehavior; -@@ -47,12 +52,40 @@ - d3 = 0.0D; +@@ -49,12 +54,40 @@ + d4 = 0.0D; } -- Object object = this.isChestBoat ? new ChestBoat(worldserver, d0, d1 + d3, d2) : new EntityBoat(worldserver, d0, d1 + d3, d2); -+ // EntityBoat entityboat = new EntityBoat(worldserver, d0, d1 + d3, d2); +- Object object = this.isChestBoat ? new ChestBoat(worldserver, d1, d2 + d4, d3) : new EntityBoat(worldserver, d1, d2 + d4, d3); ++ // Object object = this.isChestBoat ? new ChestBoat(worldserver, d1, d2 + d4, d3) : new EntityBoat(worldserver, d1, d2 + d4, d3); + // CraftBukkit start + ItemStack itemstack1 = itemstack.split(1); + org.bukkit.block.Block block = worldserver.getWorld().getBlockAt(isourceblock.getPos().getX(), isourceblock.getPos().getY(), isourceblock.getPos().getZ()); + CraftItemStack craftItem = CraftItemStack.asCraftMirror(itemstack1); + -+ BlockDispenseEvent event = new BlockDispenseEvent(block, craftItem.clone(), new org.bukkit.util.Vector(d0, d1 + d3, d2)); ++ BlockDispenseEvent event = new BlockDispenseEvent(block, craftItem.clone(), new org.bukkit.util.Vector(d1, d2 + d4, d3)); + if (!BlockDispenser.eventFired) { + worldserver.getCraftServer().getPluginManager().callEvent(event); + } diff --git a/paper-server/nms-patches/net/minecraft/core/dispenser/DispenseBehaviorShears.patch b/paper-server/nms-patches/net/minecraft/core/dispenser/DispenseBehaviorShears.patch index 86ae585f82..42d96f8b10 100644 --- a/paper-server/nms-patches/net/minecraft/core/dispenser/DispenseBehaviorShears.patch +++ b/paper-server/nms-patches/net/minecraft/core/dispenser/DispenseBehaviorShears.patch @@ -44,8 +44,8 @@ if (!worldserver.isClientSide()) { BlockPosition blockposition = isourceblock.getPos().relative((EnumDirection) isourceblock.getBlockState().getValue(BlockDispenser.FACING)); -- this.setSuccess(tryShearBeehive((WorldServer) worldserver, blockposition) || tryShearLivingEntity((WorldServer) worldserver, blockposition)); -+ this.setSuccess(tryShearBeehive((WorldServer) worldserver, blockposition) || tryShearLivingEntity((WorldServer) worldserver, blockposition, bukkitBlock, craftItem)); // CraftBukkit +- this.setSuccess(tryShearBeehive(worldserver, blockposition) || tryShearLivingEntity(worldserver, blockposition)); ++ this.setSuccess(tryShearBeehive(worldserver, blockposition) || tryShearLivingEntity(worldserver, blockposition, bukkitBlock, craftItem)); // CraftBukkit if (this.isSuccess() && itemstack.hurt(1, worldserver.getRandom(), (EntityPlayer) null)) { itemstack.setCount(0); } diff --git a/paper-server/nms-patches/net/minecraft/core/dispenser/IDispenseBehavior.patch b/paper-server/nms-patches/net/minecraft/core/dispenser/IDispenseBehavior.patch index 4ab7edfcee..54eeaf4116 100644 --- a/paper-server/nms-patches/net/minecraft/core/dispenser/IDispenseBehavior.patch +++ b/paper-server/nms-patches/net/minecraft/core/dispenser/IDispenseBehavior.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/core/dispenser/IDispenseBehavior.java +++ b/net/minecraft/core/dispenser/IDispenseBehavior.java -@@ -78,6 +78,22 @@ +@@ -78,6 +78,21 @@ import net.minecraft.world.phys.MovingObjectPositionBlock; import org.slf4j.Logger; @@ -8,7 +8,6 @@ +import net.minecraft.world.item.ItemBucket; +import net.minecraft.world.level.block.BlockSapling; +import net.minecraft.world.level.block.IFluidContainer; -+import net.minecraft.world.level.material.Material; +import org.bukkit.Location; +import org.bukkit.TreeType; +import org.bukkit.craftbukkit.inventory.CraftItemStack; @@ -23,7 +22,7 @@ public interface IDispenseBehavior { Logger LOGGER = LogUtils.getLogger(); -@@ -202,14 +218,42 @@ +@@ -202,14 +217,42 @@ EnumDirection enumdirection = (EnumDirection) isourceblock.getBlockState().getValue(BlockDispenser.FACING); EntityTypes entitytypes = ((ItemMonsterEgg) itemstack.getItem()).getType(itemstack.getTag()); @@ -68,7 +67,7 @@ isourceblock.getLevel().gameEvent((Entity) null, GameEvent.ENTITY_PLACE, isourceblock.getPos()); return itemstack; } -@@ -228,13 +272,41 @@ +@@ -228,13 +271,41 @@ EnumDirection enumdirection = (EnumDirection) isourceblock.getBlockState().getValue(BlockDispenser.FACING); BlockPosition blockposition = isourceblock.getPos().relative(enumdirection); WorldServer worldserver = isourceblock.getLevel(); @@ -111,7 +110,7 @@ } return itemstack; -@@ -255,8 +327,35 @@ +@@ -255,8 +326,35 @@ }); if (!list.isEmpty()) { @@ -148,7 +147,7 @@ this.setSuccess(true); return itemstack; } else { -@@ -283,7 +382,35 @@ +@@ -283,7 +381,35 @@ entityhorseabstract = (EntityHorseAbstract) iterator1.next(); } while (!entityhorseabstract.isArmor(itemstack) || entityhorseabstract.isWearingArmor() || !entityhorseabstract.isTamed()); @@ -185,7 +184,7 @@ this.setSuccess(true); return itemstack; } -@@ -326,9 +453,35 @@ +@@ -326,9 +452,35 @@ } entityhorsechestedabstract = (EntityHorseChestedAbstract) iterator1.next(); @@ -223,7 +222,7 @@ this.setSuccess(true); return itemstack; } -@@ -337,12 +490,41 @@ +@@ -337,12 +489,41 @@ @Override public ItemStack execute(ISourceBlock isourceblock, ItemStack itemstack) { EnumDirection enumdirection = (EnumDirection) isourceblock.getBlockState().getValue(BlockDispenser.FACING); @@ -266,7 +265,7 @@ return itemstack; } -@@ -364,12 +546,40 @@ +@@ -364,12 +545,40 @@ double d3 = randomsource.triangle((double) enumdirection.getStepX(), 0.11485000000000001D); double d4 = randomsource.triangle((double) enumdirection.getStepY(), 0.11485000000000001D); double d5 = randomsource.triangle((double) enumdirection.getStepZ(), 0.11485000000000001D); @@ -312,7 +311,7 @@ return itemstack; } -@@ -405,9 +615,52 @@ +@@ -405,9 +614,51 @@ BlockPosition blockposition = isourceblock.getPos().relative((EnumDirection) isourceblock.getBlockState().getValue(BlockDispenser.FACING)); WorldServer worldserver = isourceblock.getLevel(); @@ -321,8 +320,7 @@ + int y = blockposition.getY(); + int z = blockposition.getZ(); + IBlockData iblockdata = worldserver.getBlockState(blockposition); -+ Material material = iblockdata.getMaterial(); -+ if (worldserver.isEmptyBlock(blockposition) || !material.isSolid() || material.isReplaceable() || (dispensiblecontaineritem instanceof ItemBucket && iblockdata.getBlock() instanceof IFluidContainer && ((IFluidContainer) iblockdata.getBlock()).canPlaceLiquid(worldserver, blockposition, iblockdata, ((ItemBucket) dispensiblecontaineritem).content))) { ++ if (iblockdata.isAir() || iblockdata.canBeReplaced() || (dispensiblecontaineritem instanceof ItemBucket && iblockdata.getBlock() instanceof IFluidContainer && ((IFluidContainer) iblockdata.getBlock()).canPlaceLiquid(worldserver, blockposition, iblockdata, ((ItemBucket) dispensiblecontaineritem).content))) { + org.bukkit.block.Block block = worldserver.getWorld().getBlockAt(isourceblock.getPos().getX(), isourceblock.getPos().getY(), isourceblock.getPos().getZ()); + CraftItemStack craftItem = CraftItemStack.asCraftMirror(itemstack); + @@ -366,7 +364,7 @@ } else { return this.defaultDispenseItemBehavior.dispense(isourceblock, itemstack); } -@@ -434,7 +687,7 @@ +@@ -434,7 +685,7 @@ Block block = iblockdata.getBlock(); if (block instanceof IFluidSource) { @@ -375,7 +373,7 @@ if (itemstack1.isEmpty()) { return super.execute(isourceblock, itemstack); -@@ -442,6 +695,32 @@ +@@ -442,6 +693,32 @@ worldserver.gameEvent((Entity) null, GameEvent.FLUID_PICKUP, blockposition); Item item = itemstack1.getItem(); @@ -408,7 +406,7 @@ itemstack.shrink(1); if (itemstack.isEmpty()) { return new ItemStack(item); -@@ -463,16 +742,44 @@ +@@ -463,16 +740,44 @@ protected ItemStack execute(ISourceBlock isourceblock, ItemStack itemstack) { WorldServer worldserver = isourceblock.getLevel(); @@ -456,7 +454,7 @@ BlockTNT.explode(worldserver, blockposition); worldserver.removeBlock(blockposition, false); } else { -@@ -496,12 +803,62 @@ +@@ -496,12 +801,62 @@ this.setSuccess(true); WorldServer worldserver = isourceblock.getLevel(); BlockPosition blockposition = isourceblock.getPos().relative((EnumDirection) isourceblock.getBlockState().getValue(BlockDispenser.FACING)); @@ -519,7 +517,7 @@ return itemstack; } -@@ -511,12 +868,41 @@ +@@ -511,12 +866,41 @@ protected ItemStack execute(ISourceBlock isourceblock, ItemStack itemstack) { WorldServer worldserver = isourceblock.getLevel(); BlockPosition blockposition = isourceblock.getPos().relative((EnumDirection) isourceblock.getBlockState().getValue(BlockDispenser.FACING)); @@ -563,7 +561,7 @@ return itemstack; } }); -@@ -541,6 +927,30 @@ +@@ -541,6 +925,30 @@ EnumDirection enumdirection = (EnumDirection) isourceblock.getBlockState().getValue(BlockDispenser.FACING); BlockPosition blockposition = isourceblock.getPos().relative(enumdirection); @@ -594,7 +592,7 @@ if (worldserver.isEmptyBlock(blockposition) && BlockWitherSkull.canSpawnMob(worldserver, blockposition, itemstack)) { worldserver.setBlock(blockposition, (IBlockData) Blocks.WITHER_SKELETON_SKULL.defaultBlockState().setValue(BlockSkull.ROTATION, RotationSegment.convertToSegment(enumdirection)), 3); worldserver.gameEvent((Entity) null, GameEvent.BLOCK_PLACE, blockposition); -@@ -566,6 +976,30 @@ +@@ -566,6 +974,30 @@ BlockPosition blockposition = isourceblock.getPos().relative((EnumDirection) isourceblock.getBlockState().getValue(BlockDispenser.FACING)); BlockPumpkinCarved blockpumpkincarved = (BlockPumpkinCarved) Blocks.CARVED_PUMPKIN; @@ -625,7 +623,7 @@ if (worldserver.isEmptyBlock(blockposition) && blockpumpkincarved.canSpawnGolem(worldserver, blockposition)) { if (!worldserver.isClientSide) { worldserver.setBlock(blockposition, blockpumpkincarved.defaultBlockState(), 3); -@@ -615,6 +1049,30 @@ +@@ -615,6 +1047,30 @@ BlockPosition blockposition = isourceblock.getPos().relative((EnumDirection) isourceblock.getBlockState().getValue(BlockDispenser.FACING)); IBlockData iblockdata = worldserver.getBlockState(blockposition); diff --git a/paper-server/nms-patches/net/minecraft/network/protocol/game/PacketPlayOutMultiBlockChange.patch b/paper-server/nms-patches/net/minecraft/network/protocol/game/PacketPlayOutMultiBlockChange.patch index f62e9348f5..06f07964d1 100644 --- a/paper-server/nms-patches/net/minecraft/network/protocol/game/PacketPlayOutMultiBlockChange.patch +++ b/paper-server/nms-patches/net/minecraft/network/protocol/game/PacketPlayOutMultiBlockChange.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/network/protocol/game/PacketPlayOutMultiBlockChange.java +++ b/net/minecraft/network/protocol/game/PacketPlayOutMultiBlockChange.java -@@ -32,11 +32,20 @@ +@@ -30,11 +30,19 @@ short short0 = (Short) shortiterator.next(); this.positions[j] = short0; @@ -11,9 +11,8 @@ } + // CraftBukkit start - Add constructor -+ public PacketPlayOutMultiBlockChange(SectionPosition sectionposition, ShortSet shortset, IBlockData[] states, boolean flag) { ++ public PacketPlayOutMultiBlockChange(SectionPosition sectionposition, ShortSet shortset, IBlockData[] states) { + this.sectionPos = sectionposition; -+ this.suppressLightUpdates = flag; + this.positions = shortset.toShortArray(); + this.states = states; + } @@ -21,4 +20,4 @@ + public PacketPlayOutMultiBlockChange(PacketDataSerializer packetdataserializer) { this.sectionPos = SectionPosition.of(packetdataserializer.readLong()); - this.suppressLightUpdates = packetdataserializer.readBoolean(); + int i = packetdataserializer.readVarInt(); diff --git a/paper-server/nms-patches/net/minecraft/network/syncher/DataWatcher.patch b/paper-server/nms-patches/net/minecraft/network/syncher/DataWatcher.patch index e92b802732..a818feaeda 100644 --- a/paper-server/nms-patches/net/minecraft/network/syncher/DataWatcher.patch +++ b/paper-server/nms-patches/net/minecraft/network/syncher/DataWatcher.patch @@ -12,7 +12,7 @@ public class DataWatcher { private static final Logger LOGGER = LogUtils.getLogger(); -@@ -142,6 +147,13 @@ +@@ -146,6 +151,13 @@ } @@ -26,7 +26,7 @@ public boolean isDirty() { return this.isDirty; } -@@ -223,7 +235,7 @@ +@@ -227,7 +239,7 @@ if (!Objects.equals(datawatcher_b.serializer(), datawatcher_item.accessor.getSerializer())) { throw new IllegalStateException(String.format(Locale.ROOT, "Invalid entity data item type for field %d on entity %s: old=%s(%s), new=%s(%s)", datawatcher_item.accessor.getId(), this.entity, datawatcher_item.value, datawatcher_item.value.getClass(), datawatcher_b.value, datawatcher_b.value.getClass())); } else { @@ -35,7 +35,7 @@ } } -@@ -231,6 +243,18 @@ +@@ -235,6 +247,18 @@ return this.itemsById.isEmpty(); } @@ -54,7 +54,7 @@ public static class Item { final DataWatcherObject accessor; -@@ -273,7 +297,7 @@ +@@ -277,7 +301,7 @@ } } diff --git a/paper-server/nms-patches/net/minecraft/server/AdvancementDataPlayer.patch b/paper-server/nms-patches/net/minecraft/server/AdvancementDataPlayer.patch index 2c10c4effe..42e602d64a 100644 --- a/paper-server/nms-patches/net/minecraft/server/AdvancementDataPlayer.patch +++ b/paper-server/nms-patches/net/minecraft/server/AdvancementDataPlayer.patch @@ -17,7 +17,7 @@ this.progressChanged.add(advancement); flag = true; if (!flag1 && advancementprogress.isDone()) { -+ this.player.level.getCraftServer().getPluginManager().callEvent(new org.bukkit.event.player.PlayerAdvancementDoneEvent(this.player.getBukkitEntity(), advancement.bukkit)); // CraftBukkit ++ this.player.level().getCraftServer().getPluginManager().callEvent(new org.bukkit.event.player.PlayerAdvancementDoneEvent(this.player.getBukkitEntity(), advancement.bukkit)); // CraftBukkit advancement.getRewards().grant(this.player); - if (advancement.getDisplay() != null && advancement.getDisplay().shouldAnnounceChat() && this.player.level.getGameRules().getBoolean(GameRules.RULE_ANNOUNCE_ADVANCEMENTS)) { + if (advancement.getDisplay() != null && advancement.getDisplay().shouldAnnounceChat() && this.player.level().getGameRules().getBoolean(GameRules.RULE_ANNOUNCE_ADVANCEMENTS)) { this.playerList.broadcastSystemMessage(IChatBaseComponent.translatable("chat.type.advancement." + advancement.getDisplay().getFrame().getName(), this.player.getDisplayName(), advancement.getChatComponent()), false); diff --git a/paper-server/nms-patches/net/minecraft/server/CustomFunctionData.patch b/paper-server/nms-patches/net/minecraft/server/CustomFunctionData.patch index f359368394..3bd47afc4c 100644 --- a/paper-server/nms-patches/net/minecraft/server/CustomFunctionData.patch +++ b/paper-server/nms-patches/net/minecraft/server/CustomFunctionData.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/server/CustomFunctionData.java +++ b/net/minecraft/server/CustomFunctionData.java -@@ -42,7 +42,7 @@ +@@ -43,7 +43,7 @@ } public CommandDispatcher getDispatcher() { diff --git a/paper-server/nms-patches/net/minecraft/server/DispenserRegistry.patch b/paper-server/nms-patches/net/minecraft/server/DispenserRegistry.patch index 266dca74ef..e592b70ef9 100644 --- a/paper-server/nms-patches/net/minecraft/server/DispenserRegistry.patch +++ b/paper-server/nms-patches/net/minecraft/server/DispenserRegistry.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/server/DispenserRegistry.java +++ b/net/minecraft/server/DispenserRegistry.java -@@ -26,6 +26,12 @@ +@@ -30,6 +30,12 @@ import net.minecraft.world.level.block.BlockFire; import org.slf4j.Logger; @@ -13,7 +13,7 @@ public class DispenserRegistry { public static final PrintStream STDOUT = System.out; -@@ -36,6 +42,23 @@ +@@ -41,6 +47,23 @@ public static void bootStrap() { if (!DispenserRegistry.isBootstrapped) { @@ -35,11 +35,11 @@ + } + // CraftBukkit end DispenserRegistry.isBootstrapped = true; - if (BuiltInRegistries.REGISTRY.keySet().isEmpty()) { - throw new IllegalStateException("Unable to load registries"); -@@ -52,6 +75,69 @@ - BuiltInRegistries.bootStrap(); + Instant instant = Instant.now(); + +@@ -61,6 +84,69 @@ wrapStreams(); + DispenserRegistry.bootstrapDuration.set(Duration.between(instant, Instant.now()).toMillis()); } + // CraftBukkit start - easier than fixing the decompile + DataConverterFlattenData.register(1008, "{Name:'minecraft:oak_sign',Properties:{rotation:'0'}}", "{Name:'minecraft:standing_sign',Properties:{rotation:'0'}}"); diff --git a/paper-server/nms-patches/net/minecraft/server/Main.patch b/paper-server/nms-patches/net/minecraft/server/Main.patch index b4c2f112a7..2bfd4f53a5 100644 --- a/paper-server/nms-patches/net/minecraft/server/Main.patch +++ b/paper-server/nms-patches/net/minecraft/server/Main.patch @@ -89,8 +89,8 @@ + // CraftBukkit start + String s = (String) Optional.ofNullable((String) optionset.valueOf("world")).orElse(dedicatedserversettings.getProperties().levelName); Convertable convertable = Convertable.createDefault(file.toPath()); -- Convertable.ConversionSession convertable_conversionsession = convertable.createAccess(s); -+ Convertable.ConversionSession convertable_conversionsession = convertable.createAccess(s, WorldDimension.OVERWORLD); +- Convertable.ConversionSession convertable_conversionsession = convertable.validateAndCreateAccess(s); ++ Convertable.ConversionSession convertable_conversionsession = convertable.validateAndCreateAccess(s, WorldDimension.OVERWORLD); WorldInfo worldinfo = convertable_conversionsession.getSummary(); if (worldinfo != null) { diff --git a/paper-server/nms-patches/net/minecraft/server/MinecraftServer.patch b/paper-server/nms-patches/net/minecraft/server/MinecraftServer.patch index 6452dbc7a3..0e98c2e2f1 100644 --- a/paper-server/nms-patches/net/minecraft/server/MinecraftServer.patch +++ b/paper-server/nms-patches/net/minecraft/server/MinecraftServer.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/server/MinecraftServer.java +++ b/net/minecraft/server/MinecraftServer.java -@@ -165,6 +165,32 @@ +@@ -164,6 +164,33 @@ import net.minecraft.world.phys.Vec3D; import org.slf4j.Logger; @@ -21,6 +21,7 @@ +import net.minecraft.world.level.levelgen.WorldDimensions; +import net.minecraft.world.level.levelgen.presets.WorldPresets; +import net.minecraft.world.level.storage.WorldDataServer; ++import net.minecraft.world.level.validation.ContentValidationException; +import org.bukkit.Bukkit; +import org.bukkit.craftbukkit.CraftServer; +import org.bukkit.craftbukkit.Main; @@ -33,7 +34,7 @@ public abstract class MinecraftServer extends IAsyncTaskHandlerReentrant implements ICommandListener, AutoCloseable { public static final Logger LOGGER = LogUtils.getLogger(); -@@ -250,6 +276,20 @@ +@@ -249,6 +276,20 @@ protected SaveData worldData; private volatile boolean isSaving; @@ -54,7 +55,7 @@ public static S spin(Function function) { AtomicReference atomicreference = new AtomicReference(); Thread thread = new Thread(() -> { -@@ -263,14 +303,14 @@ +@@ -262,14 +303,14 @@ thread.setPriority(8); } @@ -71,7 +72,7 @@ super("Server"); this.metricsRecorder = InactiveMetricsRecorder.INSTANCE; this.profiler = this.metricsRecorder.getProfiler(); -@@ -290,7 +330,7 @@ +@@ -289,7 +330,7 @@ this.frameTimer = new CircularTimer(); this.registries = worldstem.registries(); this.worldData = worldstem.worldData(); @@ -80,7 +81,7 @@ throw new IllegalStateException("Missing Overworld dimension data"); } else { this.proxy = proxy; -@@ -313,13 +353,40 @@ +@@ -312,13 +353,40 @@ this.serverThread = thread; this.executor = SystemUtils.backgroundExecutor(); } @@ -122,7 +123,7 @@ ScoreboardServer scoreboardserver1 = this.getScoreboard(); Objects.requireNonNull(scoreboardserver1); -@@ -328,7 +395,7 @@ +@@ -327,7 +395,7 @@ protected abstract boolean initServer() throws IOException; @@ -131,7 +132,7 @@ if (!JvmProfiler.INSTANCE.isRunning()) { ; } -@@ -336,12 +403,8 @@ +@@ -335,12 +403,8 @@ boolean flag = false; ProfiledDuration profiledduration = JvmProfiler.INSTANCE.onWorldLoadedStarted(); @@ -145,7 +146,7 @@ if (profiledduration != null) { profiledduration.finish(); } -@@ -356,25 +419,183 @@ +@@ -355,25 +419,183 @@ } @@ -186,7 +187,7 @@ - long j = BiomeManager.obfuscateSeed(i); - List list = ImmutableList.of(new MobSpawnerPhantom(), new MobSpawnerPatrol(), new MobSpawnerCat(), new VillageSiege(), new MobSpawnerTrader(iworlddataserver)); - WorldDimension worlddimension = (WorldDimension) iregistry.get(WorldDimension.OVERWORLD); -- WorldServer worldserver = new WorldServer(this, this.executor, this.storageSource, iworlddataserver, World.OVERWORLD, worlddimension, worldloadlistener, flag, j, list, true); +- WorldServer worldserver = new WorldServer(this, this.executor, this.storageSource, iworlddataserver, World.OVERWORLD, worlddimension, worldloadlistener, flag, j, list, true, (RandomSequences) null); + String worldType = (dimension == -999) ? dimensionKey.location().getNamespace() + "_" + dimensionKey.location().getPath() : org.bukkit.World.Environment.getEnvironment(dimension).toString().toLowerCase(); + String name = (dimensionKey == WorldDimension.OVERWORLD) ? s : s + "_" + worldType; + if (dimension != 0) { @@ -225,8 +226,8 @@ + } + + try { -+ worldSession = Convertable.createDefault(server.getWorldContainer().toPath()).createAccess(name, dimensionKey); -+ } catch (IOException ex) { ++ worldSession = Convertable.createDefault(server.getWorldContainer().toPath()).validateAndCreateAccess(name, dimensionKey); ++ } catch (IOException | ContentValidationException ex) { + throw new RuntimeException(ex); + } + } @@ -296,14 +297,14 @@ - this.readScoreboard(worldpersistentdata); - this.commandStorage = new PersistentCommandStorage(worldpersistentdata); -+ world = new WorldServer(this, this.executor, worldSession, iworlddataserver, worldKey, worlddimension, worldloadlistener, flag, j, list, true, org.bukkit.World.Environment.getEnvironment(dimension), gen, biomeProvider); ++ world = new WorldServer(this, this.executor, worldSession, iworlddataserver, worldKey, worlddimension, worldloadlistener, flag, j, list, true, (RandomSequences) null, org.bukkit.World.Environment.getEnvironment(dimension), gen, biomeProvider); + WorldPersistentData worldpersistentdata = world.getDataStorage(); + this.readScoreboard(worldpersistentdata); + this.server.scoreboardManager = new org.bukkit.craftbukkit.scoreboard.CraftScoreboardManager(this, world.getScoreboard()); + this.commandStorage = new PersistentCommandStorage(worldpersistentdata); + } else { + WorldLoadListener worldloadlistener = this.progressListenerFactory.create(11); -+ world = new WorldServer(this, this.executor, worldSession, iworlddataserver, worldKey, worlddimension, worldloadlistener, flag, j, ImmutableList.of(), true, org.bukkit.World.Environment.getEnvironment(dimension), gen, biomeProvider); ++ world = new WorldServer(this, this.executor, worldSession, iworlddataserver, worldKey, worlddimension, worldloadlistener, flag, j, ImmutableList.of(), true, this.overworld().getRandomSequences(), org.bukkit.World.Environment.getEnvironment(dimension), gen, biomeProvider); + } + + worlddata.setModdedInfo(this.getServerModName(), this.getModdedStatus().shouldReportAsModified()); @@ -344,7 +345,7 @@ if (!iworlddataserver.isInitialized()) { try { -@@ -398,29 +619,8 @@ +@@ -397,30 +619,8 @@ iworlddataserver.setInitialized(true); } @@ -353,6 +354,7 @@ - this.getCustomBossEvents().load(this.worldData.getCustomBossEvents()); - } - +- RandomSequences randomsequences = worldserver.getRandomSequences(); - Iterator iterator = iregistry.entrySet().iterator(); - - while (iterator.hasNext()) { @@ -362,7 +364,7 @@ - if (resourcekey != WorldDimension.OVERWORLD) { - ResourceKey resourcekey1 = ResourceKey.create(Registries.DIMENSION, resourcekey.location()); - SecondaryWorldData secondaryworlddata = new SecondaryWorldData(this.worldData, iworlddataserver); -- WorldServer worldserver1 = new WorldServer(this, this.executor, this.storageSource, secondaryworlddata, resourcekey1, (WorldDimension) entry.getValue(), worldloadlistener, flag, j, ImmutableList.of(), false); +- WorldServer worldserver1 = new WorldServer(this, this.executor, this.storageSource, secondaryworlddata, resourcekey1, (WorldDimension) entry.getValue(), worldloadlistener, flag, j, ImmutableList.of(), false, randomsequences); - - worldborder.addListener(new IWorldBorderListener.a(worldserver1.getWorldBorder())); - this.levels.put(resourcekey1, worldserver1); @@ -411,9 +413,9 @@ MinecraftServer.LOGGER.info("Preparing start region for dimension {}", worldserver.dimension().location()); BlockPosition blockposition = worldserver.getSharedSpawnPos(); -@@ -498,19 +716,23 @@ +@@ -497,19 +715,23 @@ + ChunkProviderServer chunkproviderserver = worldserver.getChunkSource(); - chunkproviderserver.getLightEngine().setTaskPerBatch(500); this.nextTickTime = SystemUtils.getMillis(); - chunkproviderserver.addRegionTicket(TicketType.START, new ChunkCoordIntPair(blockposition), 11, Unit.INSTANCE); + // CraftBukkit start @@ -444,7 +446,7 @@ ForcedChunk forcedchunk = (ForcedChunk) worldserver1.getDataStorage().get(ForcedChunk::load, "chunks"); if (forcedchunk != null) { -@@ -525,11 +747,18 @@ +@@ -524,10 +746,17 @@ } } @@ -455,7 +457,6 @@ + this.executeModerately(); + // CraftBukkit end worldloadlistener.stop(); - chunkproviderserver.getLightEngine().setTaskPerBatch(5); - this.updateMobSpawningFlags(); + // CraftBukkit start + // this.updateMobSpawningFlags(); @@ -466,7 +467,7 @@ } public EnumGamemode getDefaultGameType() { -@@ -559,12 +788,16 @@ +@@ -557,12 +786,16 @@ worldserver.save((IProgressUpdate) null, flag1, worldserver.noSave && !flag2); } @@ -483,7 +484,7 @@ if (flag1) { Iterator iterator1 = this.getAllLevels().iterator(); -@@ -599,12 +832,33 @@ +@@ -597,12 +830,33 @@ this.stopServer(); } @@ -517,7 +518,7 @@ if (this.getConnection() != null) { this.getConnection().stop(); } -@@ -614,6 +868,7 @@ +@@ -612,6 +866,7 @@ MinecraftServer.LOGGER.info("Saving players"); this.playerList.saveAll(); this.playerList.removeAll(); @@ -525,7 +526,7 @@ } MinecraftServer.LOGGER.info("Saving worlds"); -@@ -701,15 +956,16 @@ +@@ -699,15 +954,16 @@ } this.nextTickTime = SystemUtils.getMillis(); @@ -544,7 +545,7 @@ MinecraftServer.LOGGER.warn("Can't keep up! Is the server overloaded? Running {}ms or {} ticks behind", i, j); this.nextTickTime += j * 50L; this.lastOverloadWarning = this.nextTickTime; -@@ -720,6 +976,7 @@ +@@ -718,6 +974,7 @@ this.debugCommandProfiler = new MinecraftServer.TimeProfiler(SystemUtils.getNanos(), this.tickCount); } @@ -552,7 +553,7 @@ this.nextTickTime += 50L; this.startMetricsRecordingTick(); this.profiler.push("tick"); -@@ -758,6 +1015,12 @@ +@@ -756,6 +1013,12 @@ this.services.profileCache().clearExecutor(); } @@ -565,7 +566,7 @@ this.onServerExit(); } -@@ -791,9 +1054,16 @@ +@@ -789,9 +1052,16 @@ } private boolean haveTime() { @@ -583,7 +584,7 @@ protected void waitUntilNextTick() { this.runAllTasks(); this.managedBlock(() -> { -@@ -838,7 +1108,7 @@ +@@ -836,7 +1106,7 @@ } } @@ -592,7 +593,7 @@ this.getProfiler().incrementCounter("runTask"); super.doRunTask(ticktask); } -@@ -891,7 +1161,7 @@ +@@ -889,7 +1159,7 @@ this.status = this.buildServerStatus(); } @@ -601,7 +602,7 @@ MinecraftServer.LOGGER.debug("Autosave started"); this.profiler.push("save"); this.saveEverything(true, false, false); -@@ -938,22 +1208,39 @@ +@@ -936,22 +1206,39 @@ } public void tickChildren(BooleanSupplier booleansupplier) { @@ -621,7 +622,7 @@ + if (this.tickCount % 20 == 0) { + for (int i = 0; i < this.getPlayerList().players.size(); ++i) { + EntityPlayer entityplayer = (EntityPlayer) this.getPlayerList().players.get(i); -+ entityplayer.connection.send(new PacketPlayOutUpdateTime(entityplayer.level.getGameTime(), entityplayer.getPlayerTime(), entityplayer.level.getGameRules().getBoolean(GameRules.RULE_DAYLIGHT))); // Add support for per player time ++ entityplayer.connection.send(new PacketPlayOutUpdateTime(entityplayer.level().getGameTime(), entityplayer.getPlayerTime(), entityplayer.level().getGameRules().getBoolean(GameRules.RULE_DAYLIGHT))); // Add support for per player time + } + } + @@ -641,7 +642,7 @@ this.profiler.push("tick"); -@@ -1033,6 +1320,22 @@ +@@ -1031,6 +1318,22 @@ return (WorldServer) this.levels.get(resourcekey); } @@ -664,7 +665,7 @@ public Set> levelKeys() { return this.levels.keySet(); } -@@ -1059,7 +1362,7 @@ +@@ -1057,7 +1360,7 @@ @DontObfuscate public String getServerModName() { @@ -695,7 +696,7 @@ this.packRepository.setSelected(collection); WorldDataConfiguration worlddataconfiguration = new WorldDataConfiguration(getSelectedPacks(this.packRepository), this.worldData.enabledFeatures()); -@@ -1785,7 +2089,7 @@ +@@ -1777,7 +2081,7 @@ try { label51: { @@ -704,7 +705,7 @@ try { arraylist = Lists.newArrayList(NativeModuleLister.listModules()); -@@ -1835,6 +2139,22 @@ +@@ -1827,6 +2131,22 @@ } @@ -727,7 +728,7 @@ private void startMetricsRecordingTick() { if (this.willStartRecordingMetrics) { this.metricsRecorder = ActiveMetricsRecorder.createStarted(new ServerMetricsSamplersProvider(SystemUtils.timeSource, this.isDedicatedServer()), SystemUtils.timeSource, SystemUtils.ioPool(), new MetricsPersister("server"), this.onMetricsRecordingStopped, (path) -> { -@@ -1961,8 +2281,30 @@ +@@ -1953,8 +2273,30 @@ } diff --git a/paper-server/nms-patches/net/minecraft/server/commands/CommandDifficulty.patch b/paper-server/nms-patches/net/minecraft/server/commands/CommandDifficulty.patch index 93981a7c39..2a303cc1f1 100644 --- a/paper-server/nms-patches/net/minecraft/server/commands/CommandDifficulty.patch +++ b/paper-server/nms-patches/net/minecraft/server/commands/CommandDifficulty.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/server/commands/CommandDifficulty.java +++ b/net/minecraft/server/commands/CommandDifficulty.java -@@ -42,11 +42,12 @@ +@@ -44,11 +44,12 @@ public static int setDifficulty(CommandListenerWrapper commandlistenerwrapper, EnumDifficulty enumdifficulty) throws CommandSyntaxException { MinecraftServer minecraftserver = commandlistenerwrapper.getServer(); @@ -12,6 +12,6 @@ } else { - minecraftserver.setDifficulty(enumdifficulty, true); + worldServer.serverLevelData.setDifficulty(enumdifficulty); // CraftBukkit - commandlistenerwrapper.sendSuccess(IChatBaseComponent.translatable("commands.difficulty.success", enumdifficulty.getDisplayName()), true); - return 0; - } + commandlistenerwrapper.sendSuccess(() -> { + return IChatBaseComponent.translatable("commands.difficulty.success", enumdifficulty.getDisplayName()); + }, true); diff --git a/paper-server/nms-patches/net/minecraft/server/commands/CommandEffect.patch b/paper-server/nms-patches/net/minecraft/server/commands/CommandEffect.patch index 9df39d9511..bc43b68302 100644 --- a/paper-server/nms-patches/net/minecraft/server/commands/CommandEffect.patch +++ b/paper-server/nms-patches/net/minecraft/server/commands/CommandEffect.patch @@ -9,7 +9,7 @@ ++j; } } -@@ -110,7 +110,7 @@ +@@ -114,7 +114,7 @@ while (iterator.hasNext()) { Entity entity = (Entity) iterator.next(); @@ -18,7 +18,7 @@ ++i; } } -@@ -136,7 +136,7 @@ +@@ -144,7 +144,7 @@ while (iterator.hasNext()) { Entity entity = (Entity) iterator.next(); diff --git a/paper-server/nms-patches/net/minecraft/server/commands/CommandGamerule.patch b/paper-server/nms-patches/net/minecraft/server/commands/CommandGamerule.patch index 12721b3415..e9c56cdd3c 100644 --- a/paper-server/nms-patches/net/minecraft/server/commands/CommandGamerule.patch +++ b/paper-server/nms-patches/net/minecraft/server/commands/CommandGamerule.patch @@ -8,13 +8,13 @@ + T t0 = commandlistenerwrapper.getLevel().getGameRules().getRule(gamerules_gamerulekey); // CraftBukkit t0.setFromArgument(commandcontext, "value"); - commandlistenerwrapper.sendSuccess(IChatBaseComponent.translatable("commands.gamerule.set", gamerules_gamerulekey.getId(), t0.toString()), true); -@@ -39,7 +39,7 @@ + commandlistenerwrapper.sendSuccess(() -> { +@@ -41,7 +41,7 @@ } static > int queryRule(CommandListenerWrapper commandlistenerwrapper, GameRules.GameRuleKey gamerules_gamerulekey) { - T t0 = commandlistenerwrapper.getServer().getGameRules().getRule(gamerules_gamerulekey); + T t0 = commandlistenerwrapper.getLevel().getGameRules().getRule(gamerules_gamerulekey); // CraftBukkit - commandlistenerwrapper.sendSuccess(IChatBaseComponent.translatable("commands.gamerule.query", gamerules_gamerulekey.getId(), t0.toString()), false); - return t0.getCommandResult(); + commandlistenerwrapper.sendSuccess(() -> { + return IChatBaseComponent.translatable("commands.gamerule.query", gamerules_gamerulekey.getId(), t0.toString()); diff --git a/paper-server/nms-patches/net/minecraft/server/commands/CommandGive.patch b/paper-server/nms-patches/net/minecraft/server/commands/CommandGive.patch index aa517e373b..fb37066202 100644 --- a/paper-server/nms-patches/net/minecraft/server/commands/CommandGive.patch +++ b/paper-server/nms-patches/net/minecraft/server/commands/CommandGive.patch @@ -1,11 +1,11 @@ --- a/net/minecraft/server/commands/CommandGive.java +++ b/net/minecraft/server/commands/CommandGive.java -@@ -60,7 +60,7 @@ +@@ -61,7 +61,7 @@ - if (flag && itemstack.isEmpty()) { - itemstack.setCount(1); -- entityitem = entityplayer.drop(itemstack, false); -+ entityitem = entityplayer.drop(itemstack, false, false, false); // SPIGOT-2942: Add boolean to call event + if (flag && itemstack1.isEmpty()) { + itemstack1.setCount(1); +- entityitem = entityplayer.drop(itemstack1, false); ++ entityitem = entityplayer.drop(itemstack1, false, false, false); // SPIGOT-2942: Add boolean to call event if (entityitem != null) { entityitem.makeFakeItem(); } diff --git a/paper-server/nms-patches/net/minecraft/server/commands/CommandList.patch b/paper-server/nms-patches/net/minecraft/server/commands/CommandList.patch index 702cc6b050..dbd943ac63 100644 --- a/paper-server/nms-patches/net/minecraft/server/commands/CommandList.patch +++ b/paper-server/nms-patches/net/minecraft/server/commands/CommandList.patch @@ -1,15 +1,18 @@ --- a/net/minecraft/server/commands/CommandList.java +++ b/net/minecraft/server/commands/CommandList.java -@@ -36,6 +36,12 @@ +@@ -35,7 +35,14 @@ + private static int format(CommandListenerWrapper commandlistenerwrapper, Function function) { PlayerList playerlist = commandlistenerwrapper.getServer().getPlayerList(); - List list = playerlist.getPlayers(); +- List list = playerlist.getPlayers(); + // CraftBukkit start ++ List players = playerlist.getPlayers(); + if (commandlistenerwrapper.getBukkitSender() instanceof org.bukkit.entity.Player) { + org.bukkit.entity.Player sender = (org.bukkit.entity.Player) commandlistenerwrapper.getBukkitSender(); -+ list = list.stream().filter((ep) -> sender.canSee(ep.getBukkitEntity())).collect(java.util.stream.Collectors.toList()); ++ players = players.stream().filter((ep) -> sender.canSee(ep.getBukkitEntity())).collect(java.util.stream.Collectors.toList()); + } ++ List list = players; + // CraftBukkit end IChatBaseComponent ichatbasecomponent = ChatComponentUtils.formatList(list, function); - commandlistenerwrapper.sendSuccess(IChatBaseComponent.translatable("commands.list.players", list.size(), playerlist.getMaxPlayers(), ichatbasecomponent), false); + commandlistenerwrapper.sendSuccess(() -> { diff --git a/paper-server/nms-patches/net/minecraft/server/commands/CommandSpreadPlayers.patch b/paper-server/nms-patches/net/minecraft/server/commands/CommandSpreadPlayers.patch index b74d043eca..db85f1a79a 100644 --- a/paper-server/nms-patches/net/minecraft/server/commands/CommandSpreadPlayers.patch +++ b/paper-server/nms-patches/net/minecraft/server/commands/CommandSpreadPlayers.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/server/commands/CommandSpreadPlayers.java +++ b/net/minecraft/server/commands/CommandSpreadPlayers.java -@@ -90,7 +90,7 @@ +@@ -92,7 +92,7 @@ if (entity instanceof EntityHuman) { set.add(entity.getTeam()); } else { @@ -9,7 +9,7 @@ } } -@@ -200,7 +200,7 @@ +@@ -202,7 +202,7 @@ commandspreadplayers_a = acommandspreadplayers_a[j++]; } @@ -18,7 +18,7 @@ d1 = Double.MAX_VALUE; CommandSpreadPlayers.a[] acommandspreadplayers_a1 = acommandspreadplayers_a; int k = acommandspreadplayers_a.length; -@@ -299,7 +299,7 @@ +@@ -301,7 +301,7 @@ for (boolean flag2 = iblockaccess.getBlockState(blockposition_mutableblockposition).isAir(); blockposition_mutableblockposition.getY() > iblockaccess.getMinBuildHeight(); flag2 = flag1) { blockposition_mutableblockposition.move(EnumDirection.DOWN); @@ -27,16 +27,16 @@ if (!flag1 && flag2 && flag) { return blockposition_mutableblockposition.getY() + 1; } -@@ -312,7 +312,7 @@ +@@ -314,7 +314,7 @@ public boolean isSafe(IBlockAccess iblockaccess, int i) { BlockPosition blockposition = BlockPosition.containing(this.x, (double) (this.getSpawnY(iblockaccess, i) - 1), this.z); - IBlockData iblockdata = iblockaccess.getBlockState(blockposition); + IBlockData iblockdata = getBlockState(iblockaccess, blockposition); // CraftBukkit - Material material = iblockdata.getMaterial(); - return blockposition.getY() < i && !material.isLiquid() && material != Material.FIRE; -@@ -322,5 +322,12 @@ + return blockposition.getY() < i && !iblockdata.liquid() && !iblockdata.is(TagsBlock.FIRE); + } +@@ -323,5 +323,12 @@ this.x = MathHelper.nextDouble(randomsource, d0, d2); this.z = MathHelper.nextDouble(randomsource, d1, d3); } diff --git a/paper-server/nms-patches/net/minecraft/server/commands/CommandTeleport.patch b/paper-server/nms-patches/net/minecraft/server/commands/CommandTeleport.patch index 7699b8562d..c96cfba8e5 100644 --- a/paper-server/nms-patches/net/minecraft/server/commands/CommandTeleport.patch +++ b/paper-server/nms-patches/net/minecraft/server/commands/CommandTeleport.patch @@ -14,7 +14,7 @@ public class CommandTeleport { private static final SimpleCommandExceptionType INVALID_POSITION = new SimpleCommandExceptionType(IChatBaseComponent.translatable("commands.teleport.invalidPosition")); -@@ -147,7 +154,30 @@ +@@ -155,7 +162,30 @@ float f2 = MathHelper.wrapDegrees(f); float f3 = MathHelper.wrapDegrees(f1); diff --git a/paper-server/nms-patches/net/minecraft/server/commands/CommandTime.patch b/paper-server/nms-patches/net/minecraft/server/commands/CommandTime.patch index 1e4ca76063..8711223f84 100644 --- a/paper-server/nms-patches/net/minecraft/server/commands/CommandTime.patch +++ b/paper-server/nms-patches/net/minecraft/server/commands/CommandTime.patch @@ -12,7 +12,7 @@ public class CommandTime { public CommandTime() {} -@@ -47,12 +52,18 @@ +@@ -49,12 +54,18 @@ } public static int setTime(CommandListenerWrapper commandlistenerwrapper, int i) { @@ -32,8 +32,8 @@ + // CraftBukkit end } - commandlistenerwrapper.sendSuccess(IChatBaseComponent.translatable("commands.time.set", i), true); -@@ -60,12 +71,18 @@ + commandlistenerwrapper.sendSuccess(() -> { +@@ -64,12 +75,18 @@ } public static int addTime(CommandListenerWrapper commandlistenerwrapper, int i) { diff --git a/paper-server/nms-patches/net/minecraft/server/commands/CommandTrigger.patch b/paper-server/nms-patches/net/minecraft/server/commands/CommandTrigger.patch index 82f7e7615a..abe2a2a981 100644 --- a/paper-server/nms-patches/net/minecraft/server/commands/CommandTrigger.patch +++ b/paper-server/nms-patches/net/minecraft/server/commands/CommandTrigger.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/server/commands/CommandTrigger.java +++ b/net/minecraft/server/commands/CommandTrigger.java -@@ -90,7 +90,7 @@ +@@ -96,7 +96,7 @@ if (scoreboardobjective.getCriteria() != IScoreboardCriteria.TRIGGER) { throw CommandTrigger.ERROR_INVALID_OBJECTIVE.create(); } else { diff --git a/paper-server/nms-patches/net/minecraft/server/commands/CommandWorldBorder.patch b/paper-server/nms-patches/net/minecraft/server/commands/CommandWorldBorder.patch index 4127dd4345..e21e3f8c38 100644 --- a/paper-server/nms-patches/net/minecraft/server/commands/CommandWorldBorder.patch +++ b/paper-server/nms-patches/net/minecraft/server/commands/CommandWorldBorder.patch @@ -9,7 +9,7 @@ if (worldborder.getDamageSafeZone() == (double) f) { throw CommandWorldBorder.ERROR_SAME_DAMAGE_BUFFER.create(); -@@ -69,7 +69,7 @@ +@@ -71,7 +71,7 @@ } private static int setDamageAmount(CommandListenerWrapper commandlistenerwrapper, float f) throws CommandSyntaxException { @@ -18,7 +18,7 @@ if (worldborder.getDamagePerBlock() == (double) f) { throw CommandWorldBorder.ERROR_SAME_DAMAGE_AMOUNT.create(); -@@ -81,7 +81,7 @@ +@@ -85,7 +85,7 @@ } private static int setWarningTime(CommandListenerWrapper commandlistenerwrapper, int i) throws CommandSyntaxException { @@ -27,7 +27,7 @@ if (worldborder.getWarningTime() == i) { throw CommandWorldBorder.ERROR_SAME_WARNING_TIME.create(); -@@ -93,7 +93,7 @@ +@@ -99,7 +99,7 @@ } private static int setWarningDistance(CommandListenerWrapper commandlistenerwrapper, int i) throws CommandSyntaxException { @@ -36,15 +36,16 @@ if (worldborder.getWarningBlocks() == i) { throw CommandWorldBorder.ERROR_SAME_WARNING_DISTANCE.create(); -@@ -105,14 +105,14 @@ +@@ -113,7 +113,7 @@ } private static int getSize(CommandListenerWrapper commandlistenerwrapper) { - double d0 = commandlistenerwrapper.getServer().overworld().getWorldBorder().getSize(); + double d0 = commandlistenerwrapper.getLevel().getWorldBorder().getSize(); // CraftBukkit - commandlistenerwrapper.sendSuccess(IChatBaseComponent.translatable("commands.worldborder.get", String.format(Locale.ROOT, "%.0f", d0)), false); - return MathHelper.floor(d0 + 0.5D); + commandlistenerwrapper.sendSuccess(() -> { + return IChatBaseComponent.translatable("commands.worldborder.get", String.format(Locale.ROOT, "%.0f", d0)); +@@ -122,7 +122,7 @@ } private static int setCenter(CommandListenerWrapper commandlistenerwrapper, Vec2F vec2f) throws CommandSyntaxException { @@ -53,7 +54,7 @@ if (worldborder.getCenterX() == (double) vec2f.x && worldborder.getCenterZ() == (double) vec2f.y) { throw CommandWorldBorder.ERROR_SAME_CENTER.create(); -@@ -126,7 +126,7 @@ +@@ -138,7 +138,7 @@ } private static int setSize(CommandListenerWrapper commandlistenerwrapper, double d0, long i) throws CommandSyntaxException { diff --git a/paper-server/nms-patches/net/minecraft/server/dedicated/DedicatedServer.patch b/paper-server/nms-patches/net/minecraft/server/dedicated/DedicatedServer.patch index 877797385d..fdd2ed1c91 100644 --- a/paper-server/nms-patches/net/minecraft/server/dedicated/DedicatedServer.patch +++ b/paper-server/nms-patches/net/minecraft/server/dedicated/DedicatedServer.patch @@ -177,7 +177,7 @@ } } -@@ -537,14 +617,45 @@ +@@ -539,14 +619,45 @@ @Override public String getPluginNames() { @@ -225,7 +225,7 @@ }); return this.rconConsoleSource.getCommandResponse(); } -@@ -597,4 +708,15 @@ +@@ -599,4 +710,15 @@ public Optional getServerResourcePack() { return this.settings.getProperties().serverResourcePackInfo; } diff --git a/paper-server/nms-patches/net/minecraft/server/dedicated/PropertyManager.patch b/paper-server/nms-patches/net/minecraft/server/dedicated/PropertyManager.patch index 30e027901c..0c844635f7 100644 --- a/paper-server/nms-patches/net/minecraft/server/dedicated/PropertyManager.patch +++ b/paper-server/nms-patches/net/minecraft/server/dedicated/PropertyManager.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/server/dedicated/PropertyManager.java +++ b/net/minecraft/server/dedicated/PropertyManager.java -@@ -17,13 +17,28 @@ +@@ -23,13 +23,28 @@ import net.minecraft.core.IRegistryCustom; import org.slf4j.Logger; @@ -30,7 +30,7 @@ } public static Properties loadFromFile(Path path) { -@@ -58,6 +73,11 @@ +@@ -97,6 +112,11 @@ public void store(Path path) { try { @@ -39,10 +39,10 @@ + return; + } + // CraftBukkit end - OutputStream outputstream = Files.newOutputStream(path); + BufferedWriter bufferedwriter = Files.newBufferedWriter(path, StandardCharsets.UTF_8); try { -@@ -86,7 +106,7 @@ +@@ -125,7 +145,7 @@ private static Function wrapNumberDeserializer(Function function) { return (s) -> { try { @@ -51,7 +51,7 @@ } catch (NumberFormatException numberformatexception) { return null; } -@@ -105,7 +125,7 @@ +@@ -144,7 +164,7 @@ @Nullable private String getStringRaw(String s) { @@ -60,7 +60,7 @@ } @Nullable -@@ -121,6 +141,16 @@ +@@ -160,6 +180,16 @@ } protected V get(String s, Function function, Function function1, V v0) { @@ -77,7 +77,7 @@ String s1 = this.getStringRaw(s); V v1 = MoreObjects.firstNonNull(s1 != null ? function.apply(s1) : null, v0); -@@ -133,7 +163,7 @@ +@@ -172,7 +202,7 @@ V v1 = MoreObjects.firstNonNull(s1 != null ? function.apply(s1) : null, v0); this.properties.put(s, function1.apply(v1)); @@ -86,7 +86,7 @@ } protected V get(String s, Function function, UnaryOperator unaryoperator, Function function1, V v0) { -@@ -197,7 +227,7 @@ +@@ -236,7 +266,7 @@ return properties; } @@ -95,7 +95,7 @@ public class EditableProperty implements Supplier { -@@ -205,7 +235,7 @@ +@@ -244,7 +274,7 @@ private final V value; private final Function serializer; @@ -104,7 +104,7 @@ this.key = s; this.value = object; this.serializer = function; -@@ -219,7 +249,7 @@ +@@ -258,7 +288,7 @@ Properties properties = PropertyManager.this.cloneProperties(); properties.put(this.key, this.serializer.apply(v0)); diff --git a/paper-server/nms-patches/net/minecraft/server/level/ChunkMapDistance.patch b/paper-server/nms-patches/net/minecraft/server/level/ChunkMapDistance.patch index dee2977df2..327db5593a 100644 --- a/paper-server/nms-patches/net/minecraft/server/level/ChunkMapDistance.patch +++ b/paper-server/nms-patches/net/minecraft/server/level/ChunkMapDistance.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/server/level/ChunkMapDistance.java +++ b/net/minecraft/server/level/ChunkMapDistance.java -@@ -126,10 +126,25 @@ +@@ -122,10 +122,25 @@ } if (!this.chunksToUpdateFutures.isEmpty()) { @@ -29,7 +29,7 @@ return true; } else { if (!this.ticketsToRelease.isEmpty()) { -@@ -165,7 +180,7 @@ +@@ -161,7 +176,7 @@ } } @@ -38,7 +38,7 @@ ArraySetSorted> arraysetsorted = this.getTickets(i); int j = getTicketLevelAt(arraysetsorted); Ticket ticket1 = (Ticket) arraysetsorted.addOrGet(ticket); -@@ -175,13 +190,15 @@ +@@ -171,13 +186,15 @@ this.ticketTracker.update(i, ticket.getTicketLevel(), true); } @@ -56,7 +56,7 @@ } if (arraysetsorted.isEmpty()) { -@@ -189,6 +206,7 @@ +@@ -185,6 +202,7 @@ } this.ticketTracker.update(i, getTicketLevelAt(arraysetsorted), false); @@ -64,7 +64,7 @@ } public void addTicket(TicketType tickettype, ChunkCoordIntPair chunkcoordintpair, int i, T t0) { -@@ -202,19 +220,33 @@ +@@ -198,19 +216,33 @@ } public void addRegionTicket(TicketType tickettype, ChunkCoordIntPair chunkcoordintpair, int i, T t0) { @@ -74,7 +74,7 @@ + + public boolean addRegionTicketAtDistance(TicketType tickettype, ChunkCoordIntPair chunkcoordintpair, int i, T t0) { + // CraftBukkit end - Ticket ticket = new Ticket<>(tickettype, 33 - i, t0); + Ticket ticket = new Ticket<>(tickettype, ChunkLevel.byStatus(FullChunkStatus.FULL) - i, t0); long j = chunkcoordintpair.toLong(); - this.addTicket(j, ticket); @@ -90,7 +90,7 @@ + + public boolean removeRegionTicketAtDistance(TicketType tickettype, ChunkCoordIntPair chunkcoordintpair, int i, T t0) { + // CraftBukkit end - Ticket ticket = new Ticket<>(tickettype, 33 - i, t0); + Ticket ticket = new Ticket<>(tickettype, ChunkLevel.byStatus(FullChunkStatus.FULL) - i, t0); long j = chunkcoordintpair.toLong(); - this.removeTicket(j, ticket); @@ -100,7 +100,7 @@ } private ArraySetSorted> getTickets(long i) { -@@ -253,6 +285,7 @@ +@@ -249,6 +281,7 @@ ChunkCoordIntPair chunkcoordintpair = sectionposition.chunk(); long i = chunkcoordintpair.toLong(); ObjectSet objectset = (ObjectSet) this.playersPerChunk.get(i); @@ -108,7 +108,7 @@ objectset.remove(entityplayer); if (objectset.isEmpty()) { -@@ -382,6 +415,26 @@ +@@ -378,6 +411,26 @@ return !this.tickets.isEmpty(); } @@ -134,4 +134,4 @@ + private class a extends ChunkMap { - public a() { + private static final int MAX_LEVEL = ChunkLevel.MAX_LEVEL + 1; diff --git a/paper-server/nms-patches/net/minecraft/server/level/ChunkProviderServer.patch b/paper-server/nms-patches/net/minecraft/server/level/ChunkProviderServer.patch index 5ffa553e5e..598c451f1c 100644 --- a/paper-server/nms-patches/net/minecraft/server/level/ChunkProviderServer.patch +++ b/paper-server/nms-patches/net/minecraft/server/level/ChunkProviderServer.patch @@ -42,16 +42,16 @@ if (ichunkaccess1 != null) { this.storeInCache(k, ichunkaccess1, ChunkStatus.FULL); @@ -230,7 +240,15 @@ - int l = 33 + ChunkStatus.getDistance(chunkstatus); + int l = ChunkLevel.byStatus(chunkstatus); PlayerChunk playerchunk = this.getVisibleChunkIfPresent(k); - if (flag) { + // CraftBukkit start - don't add new ticket for currently unloading chunk + boolean currentlyUnloading = false; + if (playerchunk != null) { -+ PlayerChunk.State oldChunkState = PlayerChunk.getFullChunkStatus(playerchunk.oldTicketLevel); -+ PlayerChunk.State currentChunkState = PlayerChunk.getFullChunkStatus(playerchunk.getTicketLevel()); -+ currentlyUnloading = (oldChunkState.isOrAfter(PlayerChunk.State.BORDER) && !currentChunkState.isOrAfter(PlayerChunk.State.BORDER)); ++ FullChunkStatus oldChunkState = ChunkLevel.fullStatus(playerchunk.oldTicketLevel); ++ FullChunkStatus currentChunkState = ChunkLevel.fullStatus(playerchunk.getTicketLevel()); ++ currentlyUnloading = (oldChunkState.isOrAfter(FullChunkStatus.FULL) && !currentChunkState.isOrAfter(FullChunkStatus.FULL)); + } + if (flag && !currentlyUnloading) { + // CraftBukkit end @@ -67,7 +67,7 @@ } @Override -@@ -316,7 +334,7 @@ +@@ -317,7 +335,7 @@ } else if (!this.level.shouldTickBlocksAt(i)) { return false; } else { @@ -76,7 +76,7 @@ return either != null && either.left().isPresent(); } -@@ -329,11 +347,31 @@ +@@ -330,11 +348,31 @@ @Override public void close() throws IOException { @@ -109,7 +109,7 @@ @Override public void tick(BooleanSupplier booleansupplier, boolean flag) { this.level.getProfiler().push("purge"); -@@ -365,7 +403,7 @@ +@@ -366,7 +404,7 @@ gameprofilerfiller.push("pollingChunks"); int k = this.level.getGameRules().getInt(GameRules.RULE_RANDOMTICKING); @@ -118,7 +118,7 @@ gameprofilerfiller.push("naturalSpawnCount"); int l = this.distanceManager.getNaturalSpawnChunkCount(); -@@ -386,7 +424,7 @@ +@@ -387,7 +425,7 @@ } gameprofilerfiller.popPush("spawnAndTick"); @@ -127,7 +127,7 @@ Collections.shuffle(list); Iterator iterator1 = list.iterator(); -@@ -591,13 +629,19 @@ +@@ -592,13 +630,19 @@ } @Override diff --git a/paper-server/nms-patches/net/minecraft/server/level/EntityPlayer.patch b/paper-server/nms-patches/net/minecraft/server/level/EntityPlayer.patch index b60361a388..ac9d837860 100644 --- a/paper-server/nms-patches/net/minecraft/server/level/EntityPlayer.patch +++ b/paper-server/nms-patches/net/minecraft/server/level/EntityPlayer.patch @@ -61,7 +61,7 @@ public EntityPlayer(MinecraftServer minecraftserver, WorldServer worldserver, GameProfile gameprofile) { super(worldserver, worldserver.getSharedSpawnPos(), worldserver.getSharedSpawnAngle(), gameprofile); this.chatVisibility = EnumChatVisibility.FULL; -@@ -275,12 +322,56 @@ +@@ -274,12 +321,56 @@ this.advancements = minecraftserver.getPlayerList().getPlayerAdvancements(this); this.setMaxUpStep(1.0F); this.fudgeSpawnLocation(worldserver); @@ -119,7 +119,7 @@ int i = Math.max(0, this.server.getSpawnRadius(worldserver)); int j = MathHelper.floor(worldserver.getWorldBorder().getDistanceToBorder((double) blockposition.getX(), (double) blockposition.getZ())); -@@ -329,7 +420,7 @@ +@@ -328,7 +419,7 @@ public void readAdditionalSaveData(NBTTagCompound nbttagcompound) { super.readAdditionalSaveData(nbttagcompound); if (nbttagcompound.contains("warden_spawn_tracker", 10)) { @@ -128,7 +128,7 @@ Logger logger = EntityPlayer.LOGGER; Objects.requireNonNull(logger); -@@ -348,17 +439,26 @@ +@@ -347,17 +438,26 @@ if (nbttagcompound.contains("recipeBook", 10)) { this.recipeBook.fromNbt(nbttagcompound.getCompound("recipeBook"), this.server.getRecipeManager()); } @@ -156,7 +156,7 @@ Logger logger1 = EntityPlayer.LOGGER; Objects.requireNonNull(logger1); -@@ -371,7 +471,7 @@ +@@ -370,7 +470,7 @@ @Override public void addAdditionalSaveData(NBTTagCompound nbttagcompound) { super.addAdditionalSaveData(nbttagcompound); @@ -165,7 +165,7 @@ Logger logger = EntityPlayer.LOGGER; Objects.requireNonNull(logger); -@@ -392,7 +492,20 @@ +@@ -391,7 +491,20 @@ Entity entity = this.getRootVehicle(); Entity entity1 = this.getVehicle(); @@ -187,7 +187,7 @@ NBTTagCompound nbttagcompound2 = new NBTTagCompound(); NBTTagCompound nbttagcompound3 = new NBTTagCompound(); -@@ -417,8 +530,32 @@ +@@ -416,8 +529,32 @@ nbttagcompound.put("SpawnDimension", nbtbase); }); } @@ -197,7 +197,7 @@ + // CraftBukkit start - World fallback code, either respawn location or global spawn + public void spawnIn(World world) { -+ this.level = world; ++ this.setLevel(world); + if (world == null) { + this.unsetRemoved(); + Vec3D position = null; @@ -211,7 +211,7 @@ + world = ((CraftWorld) Bukkit.getServer().getWorlds().get(0)).getHandle(); + position = Vec3D.atCenterOf(world.getSharedSpawnPos()); + } -+ this.level = world; ++ this.setLevel(world); + this.setPos(position); + } + this.gameMode.setLevel((WorldServer) world); @@ -220,7 +220,7 @@ public void setExperiencePoints(int i) { float f = (float) this.getXpNeededForNextLevel(); -@@ -478,6 +615,11 @@ +@@ -477,6 +614,11 @@ @Override public void tick() { @@ -232,7 +232,7 @@ this.gameMode.tick(); this.wardenSpawnTracker.tick(); --this.spawnInvulnerableTime; -@@ -534,7 +676,7 @@ +@@ -533,7 +675,7 @@ } if (this.getHealth() != this.lastSentHealth || this.lastSentFood != this.foodData.getFoodLevel() || this.foodData.getSaturationLevel() == 0.0F != this.lastFoodSaturationZero) { @@ -241,7 +241,7 @@ this.lastSentHealth = this.getHealth(); this.lastSentFood = this.foodData.getFoodLevel(); this.lastFoodSaturationZero = this.foodData.getSaturationLevel() == 0.0F; -@@ -565,6 +707,12 @@ +@@ -564,6 +706,12 @@ this.updateScoreForCriteria(IScoreboardCriteria.EXPERIENCE, MathHelper.ceil((float) this.lastRecordedExperience)); } @@ -254,7 +254,7 @@ if (this.experienceLevel != this.lastRecordedLevel) { this.lastRecordedLevel = this.experienceLevel; this.updateScoreForCriteria(IScoreboardCriteria.LEVEL, MathHelper.ceil((float) this.lastRecordedLevel)); -@@ -579,6 +727,20 @@ +@@ -578,6 +726,20 @@ CriterionTriggers.LOCATION.trigger(this); } @@ -275,26 +275,26 @@ } catch (Throwable throwable) { CrashReport crashreport = CrashReport.forThrowable(throwable, "Ticking player"); CrashReportSystemDetails crashreportsystemdetails = crashreport.addCategory("Player being ticked"); -@@ -621,7 +783,8 @@ +@@ -620,7 +782,8 @@ } private void updateScoreForCriteria(IScoreboardCriteria iscoreboardcriteria, int i) { - this.getScoreboard().forAllObjectives(iscoreboardcriteria, this.getScoreboardName(), (scoreboardscore) -> { + // CraftBukkit - Use our scores instead -+ this.level.getCraftServer().getScoreboardManager().getScoreboardScores(iscoreboardcriteria, this.getScoreboardName(), (scoreboardscore) -> { ++ this.level().getCraftServer().getScoreboardManager().getScoreboardScores(iscoreboardcriteria, this.getScoreboardName(), (scoreboardscore) -> { scoreboardscore.setScore(i); }); } -@@ -630,9 +793,47 @@ +@@ -629,9 +792,47 @@ public void die(DamageSource damagesource) { this.gameEvent(GameEvent.ENTITY_DIE); - boolean flag = this.level.getGameRules().getBoolean(GameRules.RULE_SHOWDEATHMESSAGES); + boolean flag = this.level().getGameRules().getBoolean(GameRules.RULE_SHOWDEATHMESSAGES); + // CraftBukkit start - fire PlayerDeathEvent + if (this.isRemoved()) { + return; + } + java.util.List loot = new java.util.ArrayList(this.getInventory().getContainerSize()); -+ boolean keepInventory = this.level.getGameRules().getBoolean(GameRules.RULE_KEEPINVENTORY) || this.isSpectator(); ++ boolean keepInventory = this.level().getGameRules().getBoolean(GameRules.RULE_KEEPINVENTORY) || this.isSpectator(); + + if (!keepInventory) { + for (ItemStack item : this.getInventory().getContents()) { @@ -333,10 +333,10 @@ + ichatbasecomponent = org.bukkit.craftbukkit.util.CraftChatMessage.fromStringOrNull(deathMessage); + } - this.connection.send(new ClientboundPlayerCombatKillPacket(this.getCombatTracker(), ichatbasecomponent), PacketSendListener.exceptionallySend(() -> { + this.connection.send(new ClientboundPlayerCombatKillPacket(this.getId(), ichatbasecomponent), PacketSendListener.exceptionallySend(() -> { boolean flag1 = true; -@@ -663,12 +864,18 @@ - if (this.level.getGameRules().getBoolean(GameRules.RULE_FORGIVE_DEAD_PLAYERS)) { +@@ -662,12 +863,18 @@ + if (this.level().getGameRules().getBoolean(GameRules.RULE_FORGIVE_DEAD_PLAYERS)) { this.tellNeutralMobsThatIDied(); } - @@ -354,42 +354,42 @@ + // CraftBukkit end + + // CraftBukkit - Get our scores instead -+ this.level.getCraftServer().getScoreboardManager().getScoreboardScores(IScoreboardCriteria.DEATH_COUNT, this.getScoreboardName(), ScoreboardScore::increment); ++ this.level().getCraftServer().getScoreboardManager().getScoreboardScores(IScoreboardCriteria.DEATH_COUNT, this.getScoreboardName(), ScoreboardScore::increment); EntityLiving entityliving = this.getKillCredit(); if (entityliving != null) { -@@ -706,10 +913,12 @@ +@@ -705,10 +912,12 @@ String s = this.getScoreboardName(); String s1 = entity.getScoreboardName(); - this.getScoreboard().forAllObjectives(IScoreboardCriteria.KILL_COUNT_ALL, s, ScoreboardScore::increment); + // CraftBukkit - Get our scores instead -+ this.level.getCraftServer().getScoreboardManager().getScoreboardScores(IScoreboardCriteria.KILL_COUNT_ALL, s, ScoreboardScore::increment); ++ this.level().getCraftServer().getScoreboardManager().getScoreboardScores(IScoreboardCriteria.KILL_COUNT_ALL, s, ScoreboardScore::increment); if (entity instanceof EntityHuman) { this.awardStat(StatisticList.PLAYER_KILLS); - this.getScoreboard().forAllObjectives(IScoreboardCriteria.KILL_COUNT_PLAYERS, s, ScoreboardScore::increment); + // CraftBukkit - Get our scores instead -+ this.level.getCraftServer().getScoreboardManager().getScoreboardScores(IScoreboardCriteria.KILL_COUNT_PLAYERS, s, ScoreboardScore::increment); ++ this.level().getCraftServer().getScoreboardManager().getScoreboardScores(IScoreboardCriteria.KILL_COUNT_PLAYERS, s, ScoreboardScore::increment); } else { this.awardStat(StatisticList.MOB_KILLS); } -@@ -727,7 +936,8 @@ +@@ -726,7 +935,8 @@ int i = scoreboardteam.getColor().getId(); if (i >= 0 && i < aiscoreboardcriteria.length) { - this.getScoreboard().forAllObjectives(aiscoreboardcriteria[i], s, ScoreboardScore::increment); + // CraftBukkit - Get our scores instead -+ this.level.getCraftServer().getScoreboardManager().getScoreboardScores(aiscoreboardcriteria[i], s, ScoreboardScore::increment); ++ this.level().getCraftServer().getScoreboardManager().getScoreboardScores(aiscoreboardcriteria[i], s, ScoreboardScore::increment); } } -@@ -777,18 +987,20 @@ +@@ -776,18 +986,20 @@ } private boolean isPvpAllowed() { - return this.server.isPvpAllowed(); + // CraftBukkit - this.server.isPvpAllowed() -> this.world.pvpMode -+ return this.level.pvpMode; ++ return this.level().pvpMode; } @Nullable @@ -398,8 +398,8 @@ ShapeDetectorShape shapedetectorshape = super.findDimensionEntryPoint(worldserver); + worldserver = (shapedetectorshape == null) ? worldserver : shapedetectorshape.world; // CraftBukkit -- if (shapedetectorshape != null && this.level.dimension() == World.OVERWORLD && worldserver.dimension() == World.END) { -+ if (shapedetectorshape != null && this.level.getTypeKey() == WorldDimension.OVERWORLD && worldserver != null && worldserver.getTypeKey() == WorldDimension.END) { // CraftBukkit +- if (shapedetectorshape != null && this.level().dimension() == World.OVERWORLD && worldserver.dimension() == World.END) { ++ if (shapedetectorshape != null && this.level().getTypeKey() == WorldDimension.OVERWORLD && worldserver != null && worldserver.getTypeKey() == WorldDimension.END) { // CraftBukkit Vec3D vec3d = shapedetectorshape.pos.add(0.0D, -1.0D, 0.0D); - return new ShapeDetectorShape(vec3d, Vec3D.ZERO, 90.0F, 0.0F); @@ -407,7 +407,7 @@ } else { return shapedetectorshape; } -@@ -797,11 +1009,20 @@ +@@ -796,11 +1008,20 @@ @Nullable @Override public Entity changeDimension(WorldServer worldserver) { @@ -421,7 +421,7 @@ + // CraftBukkit end + if (this.isSleeping()) return this; // CraftBukkit - SPIGOT-3154 + // this.isChangingDimension = true; // CraftBukkit - Moved down and into PlayerList#changeDimension - WorldServer worldserver1 = this.getLevel(); + WorldServer worldserver1 = this.serverLevel(); - ResourceKey resourcekey = worldserver1.dimension(); + ResourceKey resourcekey = worldserver1.getTypeKey(); // CraftBukkit @@ -429,9 +429,9 @@ + if (resourcekey == WorldDimension.END && worldserver != null && worldserver.getTypeKey() == WorldDimension.OVERWORLD) { // CraftBukkit + this.isChangingDimension = true; // CraftBukkit - Moved down from above this.unRide(); - this.getLevel().removePlayerImmediately(this, Entity.RemovalReason.CHANGED_DIMENSION); + this.serverLevel().removePlayerImmediately(this, Entity.RemovalReason.CHANGED_DIMENSION); if (!this.wonGame) { -@@ -812,6 +1033,8 @@ +@@ -811,6 +1032,8 @@ return this; } else { @@ -439,8 +439,8 @@ + /* WorldData worlddata = worldserver.getLevelData(); - this.connection.send(new PacketPlayOutRespawn(worldserver.dimensionTypeId(), worldserver.dimension(), BiomeManager.obfuscateSeed(worldserver.getSeed()), this.gameMode.getGameModeForPlayer(), this.gameMode.getPreviousGameModeForPlayer(), worldserver.isDebug(), worldserver.isFlat(), (byte) 3, this.getLastDeathLocation())); -@@ -821,20 +1044,50 @@ + this.connection.send(new PacketPlayOutRespawn(worldserver.dimensionTypeId(), worldserver.dimension(), BiomeManager.obfuscateSeed(worldserver.getSeed()), this.gameMode.getGameModeForPlayer(), this.gameMode.getPreviousGameModeForPlayer(), worldserver.isDebug(), worldserver.isFlat(), (byte) 3, this.getLastDeathLocation(), this.getPortalCooldown())); +@@ -820,20 +1043,50 @@ playerlist.sendPlayerPermissionLevel(this); worldserver1.removePlayerImmediately(this, Entity.RemovalReason.CHANGED_DIMENSION); this.unsetRemoved(); @@ -479,8 +479,8 @@ + if (true) { // CraftBukkit + this.isChangingDimension = true; // CraftBukkit - Set teleport invulnerability only if player changing worlds + -+ this.connection.send(new PacketPlayOutRespawn(worldserver.dimensionTypeId(), worldserver.dimension(), BiomeManager.obfuscateSeed(worldserver.getSeed()), this.gameMode.getGameModeForPlayer(), this.gameMode.getPreviousGameModeForPlayer(), worldserver.isDebug(), worldserver.isFlat(), (byte) 3, this.getLastDeathLocation())); -+ this.connection.send(new PacketPlayOutServerDifficulty(this.level.getDifficulty(), this.level.getLevelData().isDifficultyLocked())); ++ this.connection.send(new PacketPlayOutRespawn(worldserver.dimensionTypeId(), worldserver.dimension(), BiomeManager.obfuscateSeed(worldserver.getSeed()), this.gameMode.getGameModeForPlayer(), this.gameMode.getPreviousGameModeForPlayer(), worldserver.isDebug(), worldserver.isFlat(), (byte) 3, this.getLastDeathLocation(), this.getPortalCooldown())); ++ this.connection.send(new PacketPlayOutServerDifficulty(this.level().getDifficulty(), this.level().getLevelData().isDifficultyLocked())); + PlayerList playerlist = this.server.getPlayerList(); + + playerlist.sendPlayerPermissionLevel(this); @@ -490,20 +490,20 @@ - worldserver1.getProfiler().pop(); - worldserver1.getProfiler().push("placing"); + // CraftBukkit end - this.setLevel(worldserver); + this.setServerLevel(worldserver); - this.connection.teleport(shapedetectorshape.pos.x, shapedetectorshape.pos.y, shapedetectorshape.pos.z, shapedetectorshape.yRot, shapedetectorshape.xRot); + this.connection.teleport(exit); // CraftBukkit - use internal teleport without event this.connection.resetPosition(); worldserver.addDuringPortalTeleport(this); worldserver1.getProfiler().pop(); -@@ -854,39 +1107,66 @@ +@@ -853,39 +1106,66 @@ this.lastSentExp = -1; this.lastSentHealth = -1.0F; this.lastSentFood = -1; + + // CraftBukkit start + PlayerChangedWorldEvent changeEvent = new PlayerChangedWorldEvent(this.getBukkitEntity(), worldserver1.getWorld()); -+ this.level.getCraftServer().getPluginManager().callEvent(changeEvent); ++ this.level().getCraftServer().getPluginManager().callEvent(changeEvent); + // CraftBukkit end } @@ -559,7 +559,7 @@ + if (optional.isPresent() || !canCreatePortal) { // CraftBukkit return optional; } else { - EnumDirection.EnumAxis enumdirection_enumaxis = (EnumDirection.EnumAxis) this.level.getBlockState(this.portalEntrancePos).getOptionalValue(BlockPortal.AXIS).orElse(EnumDirection.EnumAxis.X); + EnumDirection.EnumAxis enumdirection_enumaxis = (EnumDirection.EnumAxis) this.level().getBlockState(this.portalEntrancePos).getOptionalValue(BlockPortal.AXIS).orElse(EnumDirection.EnumAxis.X); - Optional optional1 = worldserver.getPortalForcer().createPortal(blockposition, enumdirection_enumaxis); + Optional optional1 = worldserver.getPortalForcer().createPortal(blockposition, enumdirection_enumaxis, this, createRadius); // CraftBukkit @@ -569,13 +569,13 @@ } return optional1; -@@ -896,13 +1176,21 @@ +@@ -895,13 +1175,21 @@ public void triggerDimensionChangeTriggers(WorldServer worldserver) { ResourceKey resourcekey = worldserver.dimension(); - ResourceKey resourcekey1 = this.level.dimension(); + ResourceKey resourcekey1 = this.level().dimension(); + // CraftBukkit start + ResourceKey maindimensionkey = CraftDimensionUtil.getMainDimensionKey(worldserver); -+ ResourceKey maindimensionkey1 = CraftDimensionUtil.getMainDimensionKey(this.level); ++ ResourceKey maindimensionkey1 = CraftDimensionUtil.getMainDimensionKey(this.level()); + + CriterionTriggers.CHANGED_DIMENSION.trigger(this, maindimensionkey, maindimensionkey1); + if (maindimensionkey != resourcekey || maindimensionkey1 != resourcekey1) { @@ -594,31 +594,31 @@ this.enteredNetherPosition = null; } -@@ -919,19 +1207,17 @@ +@@ -918,19 +1206,17 @@ this.containerMenu.broadcastChanges(); } - @Override - public Either startSleepInBed(BlockPosition blockposition) { -- EnumDirection enumdirection = (EnumDirection) this.level.getBlockState(blockposition).getValue(BlockFacingHorizontal.FACING); +- EnumDirection enumdirection = (EnumDirection) this.level().getBlockState(blockposition).getValue(BlockFacingHorizontal.FACING); - + // CraftBukkit start - moved bed result checks from below into separate method + private Either getBedResult(BlockPosition blockposition, EnumDirection enumdirection) { if (!this.isSleeping() && this.isAlive()) { -- if (!this.level.dimensionType().natural()) { -+ if (!this.level.dimensionType().natural() || !this.level.dimensionType().bedWorks()) { +- if (!this.level().dimensionType().natural()) { ++ if (!this.level().dimensionType().natural() || !this.level().dimensionType().bedWorks()) { return Either.left(EntityHuman.EnumBedResult.NOT_POSSIBLE_HERE); } else if (!this.bedInRange(blockposition, enumdirection)) { return Either.left(EntityHuman.EnumBedResult.TOO_FAR_AWAY); } else if (this.bedBlocked(blockposition, enumdirection)) { return Either.left(EntityHuman.EnumBedResult.OBSTRUCTED); } else { -- this.setRespawnPosition(this.level.dimension(), blockposition, this.getYRot(), false, true); -+ this.setRespawnPosition(this.level.dimension(), blockposition, this.getYRot(), false, true, PlayerSpawnChangeEvent.Cause.BED); // CraftBukkit - if (this.level.isDay()) { +- this.setRespawnPosition(this.level().dimension(), blockposition, this.getYRot(), false, true); ++ this.setRespawnPosition(this.level().dimension(), blockposition, this.getYRot(), false, true, PlayerSpawnChangeEvent.Cause.BED); // CraftBukkit + if (this.level().isDay()) { return Either.left(EntityHuman.EnumBedResult.NOT_POSSIBLE_NOW); } else { -@@ -948,7 +1234,36 @@ +@@ -947,7 +1233,36 @@ } } @@ -633,7 +633,7 @@ + + @Override + public Either startSleepInBed(BlockPosition blockposition, boolean force) { -+ EnumDirection enumdirection = (EnumDirection) this.level.getBlockState(blockposition).getValue(BlockFacingHorizontal.FACING); ++ EnumDirection enumdirection = (EnumDirection) this.level().getBlockState(blockposition).getValue(BlockFacingHorizontal.FACING); + Either bedResult = this.getBedResult(blockposition, enumdirection); + + if (bedResult.left().orElse(null) == EntityHuman.EnumBedResult.OTHER_PROBLEM) { @@ -656,7 +656,7 @@ this.awardStat(StatisticList.SLEEP_IN_BED); CriterionTriggers.SLEPT_IN_BED.trigger(this); }); -@@ -961,9 +1276,8 @@ +@@ -960,9 +1275,8 @@ return either; } } @@ -667,7 +667,7 @@ } @Override -@@ -990,6 +1304,24 @@ +@@ -989,6 +1303,24 @@ @Override public void stopSleepInBed(boolean flag, boolean flag1) { @@ -678,22 +678,22 @@ + + org.bukkit.block.Block bed; + if (bedPosition != null) { -+ bed = this.level.getWorld().getBlockAt(bedPosition.getX(), bedPosition.getY(), bedPosition.getZ()); ++ bed = this.level().getWorld().getBlockAt(bedPosition.getX(), bedPosition.getY(), bedPosition.getZ()); + } else { -+ bed = this.level.getWorld().getBlockAt(player.getLocation()); ++ bed = this.level().getWorld().getBlockAt(player.getLocation()); + } + + PlayerBedLeaveEvent event = new PlayerBedLeaveEvent(player, bed, true); -+ this.level.getCraftServer().getPluginManager().callEvent(event); ++ this.level().getCraftServer().getPluginManager().callEvent(event); + if (event.isCancelled()) { + return; + } + // CraftBukkit end if (this.isSleeping()) { - this.getLevel().getChunkSource().broadcastAndSend(this, new PacketPlayOutAnimation(this, 2)); + this.serverLevel().getChunkSource().broadcastAndSend(this, new PacketPlayOutAnimation(this, 2)); } -@@ -1038,8 +1370,9 @@ - this.connection.send(new PacketPlayOutOpenSignEditor(tileentitysign.getBlockPos())); +@@ -1037,8 +1369,9 @@ + this.connection.send(new PacketPlayOutOpenSignEditor(tileentitysign.getBlockPos(), flag)); } - public void nextContainerCounter() { @@ -703,7 +703,7 @@ } @Override -@@ -1047,13 +1380,35 @@ +@@ -1046,13 +1379,35 @@ if (itileinventory == null) { return OptionalInt.empty(); } else { @@ -739,7 +739,7 @@ if (container == null) { if (this.isSpectator()) { this.displayClientMessage(IChatBaseComponent.translatable("container.spectatorCantOpen").withStyle(EnumChatFormat.RED), true); -@@ -1061,9 +1416,11 @@ +@@ -1060,9 +1415,11 @@ return OptionalInt.empty(); } else { @@ -753,7 +753,7 @@ return OptionalInt.of(this.containerCounter); } } -@@ -1076,13 +1433,24 @@ +@@ -1075,13 +1432,24 @@ @Override public void openHorseInventory(EntityHorseAbstract entityhorseabstract, IInventory iinventory) { @@ -780,7 +780,7 @@ this.initMenu(this.containerMenu); } -@@ -1105,6 +1473,7 @@ +@@ -1104,6 +1472,7 @@ @Override public void closeContainer() { @@ -788,7 +788,7 @@ this.connection.send(new PacketPlayOutCloseWindow(this.containerMenu.containerId)); this.doCloseContainer(); } -@@ -1127,6 +1496,16 @@ +@@ -1126,6 +1495,16 @@ } this.jumping = flag; @@ -805,25 +805,25 @@ this.setShiftKeyDown(flag1); } -@@ -1135,7 +1514,7 @@ +@@ -1134,7 +1513,7 @@ @Override public void awardStat(Statistic statistic, int i) { this.stats.increment(this, statistic, i); - this.getScoreboard().forAllObjectives(statistic, this.getScoreboardName(), (scoreboardscore) -> { -+ this.level.getCraftServer().getScoreboardManager().getScoreboardScores(statistic, this.getScoreboardName(), (scoreboardscore) -> { // CraftBukkit - Get our scores instead ++ this.level().getCraftServer().getScoreboardManager().getScoreboardScores(statistic, this.getScoreboardName(), (scoreboardscore) -> { // CraftBukkit - Get our scores instead scoreboardscore.add(i); }); } -@@ -1143,7 +1522,7 @@ +@@ -1142,7 +1521,7 @@ @Override public void resetStat(Statistic statistic) { this.stats.setValue(this, statistic, 0); - this.getScoreboard().forAllObjectives(statistic, this.getScoreboardName(), ScoreboardScore::reset); -+ this.level.getCraftServer().getScoreboardManager().getScoreboardScores(statistic, this.getScoreboardName(), ScoreboardScore::reset); // CraftBukkit - Get our scores instead ++ this.level().getCraftServer().getScoreboardManager().getScoreboardScores(statistic, this.getScoreboardName(), ScoreboardScore::reset); // CraftBukkit - Get our scores instead } @Override -@@ -1159,7 +1538,7 @@ +@@ -1163,7 +1542,7 @@ for (int j = 0; j < i; ++j) { MinecraftKey minecraftkey = aminecraftkey1[j]; @@ -832,7 +832,7 @@ Objects.requireNonNull(list); optional.ifPresent(list::add); -@@ -1194,6 +1573,7 @@ +@@ -1198,6 +1577,7 @@ public void resetSentInfo() { this.lastSentHealth = -1.0E8F; @@ -840,7 +840,7 @@ } @Override -@@ -1252,7 +1632,7 @@ +@@ -1256,7 +1636,7 @@ this.lastSentExp = -1; this.lastSentHealth = -1.0F; this.lastSentFood = -1; @@ -849,7 +849,7 @@ this.seenCredits = entityplayer.seenCredits; this.enteredNetherPosition = entityplayer.enteredNetherPosition; this.setShoulderEntityLeft(entityplayer.getShoulderEntityLeft()); -@@ -1302,6 +1682,12 @@ +@@ -1306,6 +1686,12 @@ @Override public boolean teleportTo(WorldServer worldserver, double d0, double d1, double d2, Set set, float f, float f1) { @@ -862,10 +862,10 @@ ChunkCoordIntPair chunkcoordintpair = new ChunkCoordIntPair(BlockPosition.containing(d0, d1, d2)); worldserver.getChunkSource().addRegionTicket(TicketType.POST_TELEPORT, chunkcoordintpair, 1, this.getId()); -@@ -1311,9 +1697,9 @@ +@@ -1315,9 +1701,9 @@ } - if (worldserver == this.level) { + if (worldserver == this.level()) { - this.connection.teleport(d0, d1, d2, f, f1, set); + this.connection.teleport(d0, d1, d2, f, f1, set, cause); // CraftBukkit } else { @@ -874,7 +874,7 @@ } this.setYHeadRot(f); -@@ -1417,7 +1803,20 @@ +@@ -1420,7 +1806,20 @@ } } @@ -895,7 +895,7 @@ this.chatVisibility = packetplayinsettings.chatVisibility(); this.canChatColor = packetplayinsettings.chatColors(); this.textFilteringEnabled = packetplayinsettings.textFilteringEnabled(); -@@ -1492,7 +1891,7 @@ +@@ -1495,7 +1894,7 @@ if (world instanceof WorldServer) { WorldServer worldserver = (WorldServer) world; @@ -904,7 +904,7 @@ } if (entity != null) { -@@ -1529,7 +1928,7 @@ +@@ -1532,7 +1931,7 @@ @Nullable public IChatBaseComponent getTabListDisplayName() { @@ -913,7 +913,7 @@ } @Override -@@ -1550,9 +1949,16 @@ +@@ -1553,9 +1952,16 @@ return this.advancements; } @@ -927,10 +927,10 @@ this.setCamera(this); this.stopRiding(); + /* CraftBukkit start - replace with bukkit handling for multi-world - if (worldserver == this.level) { + if (worldserver == this.level()) { this.connection.teleport(d0, d1, d2, f, f1); } else { -@@ -1572,6 +1978,9 @@ +@@ -1575,6 +1981,9 @@ this.server.getPlayerList().sendLevelInfo(this, worldserver); this.server.getPlayerList().sendAllPlayerInfo(this); } @@ -940,7 +940,7 @@ } -@@ -1593,6 +2002,32 @@ +@@ -1596,6 +2005,32 @@ } public void setRespawnPosition(ResourceKey resourcekey, @Nullable BlockPosition blockposition, float f, boolean flag, boolean flag1) { @@ -973,9 +973,9 @@ if (blockposition != null) { boolean flag2 = blockposition.equals(this.respawnPosition) && resourcekey.equals(this.respawnDimension); -@@ -1762,4 +2197,146 @@ - this.hurtDir = (float) (MathHelper.atan2(d1, d0) * 57.2957763671875D - (double) this.getYRot()); - this.connection.send(new ClientboundHurtAnimationPacket(this)); +@@ -1805,4 +2240,146 @@ + } + } + + // CraftBukkit start - Add per-player time and weather. @@ -985,10 +985,10 @@ + public long getPlayerTime() { + if (this.relativeTime) { + // Adds timeOffset to the current server time. -+ return this.level.getDayTime() + this.timeOffset; ++ return this.level().getDayTime() + this.timeOffset; + } else { + // Adds timeOffset to the beginning of this day. -+ return this.level.getDayTime() - (this.level.getDayTime() % 24000) + this.timeOffset; ++ return this.level().getDayTime() - (this.level().getDayTime() % 24000) + this.timeOffset; + } + } + @@ -1054,7 +1054,7 @@ + + public void resetPlayerWeather() { + this.weather = null; -+ this.setPlayerWeather(this.level.getLevelData().isRaining() ? WeatherType.DOWNFALL : WeatherType.CLEAR, false); ++ this.setPlayerWeather(this.level().getLevelData().isRaining() ? WeatherType.DOWNFALL : WeatherType.CLEAR, false); + } + + @Override @@ -1080,7 +1080,7 @@ + + public void reset() { + float exp = 0; -+ boolean keepInventory = this.level.getGameRules().getBoolean(GameRules.RULE_KEEPINVENTORY); ++ boolean keepInventory = this.level().getGameRules().getBoolean(GameRules.RULE_KEEPINVENTORY); + + if (this.keepLevel) { // CraftBukkit - SPIGOT-6687: Only use keepLevel (was pre-set with RULE_KEEPINVENTORY value in PlayerDeathEvent) + exp = this.experienceProgress; diff --git a/paper-server/nms-patches/net/minecraft/server/level/EntityTrackerEntry.patch b/paper-server/nms-patches/net/minecraft/server/level/EntityTrackerEntry.patch index 28cc0f3df7..f5d9aeba05 100644 --- a/paper-server/nms-patches/net/minecraft/server/level/EntityTrackerEntry.patch +++ b/paper-server/nms-patches/net/minecraft/server/level/EntityTrackerEntry.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/server/level/EntityTrackerEntry.java +++ b/net/minecraft/server/level/EntityTrackerEntry.java -@@ -44,6 +44,12 @@ +@@ -42,6 +42,12 @@ import net.minecraft.world.phys.Vec3D; import org.slf4j.Logger; @@ -13,7 +13,7 @@ public class EntityTrackerEntry { private static final Logger LOGGER = LogUtils.getLogger(); -@@ -65,8 +71,12 @@ +@@ -63,8 +69,12 @@ private boolean wasOnGround; @Nullable private List> trackedDataValues; @@ -27,16 +27,16 @@ this.ap = Vec3D.ZERO; this.lastPassengers = Collections.emptyList(); this.level = worldserver; -@@ -86,7 +96,7 @@ +@@ -84,7 +94,7 @@ List list = this.entity.getPassengers(); if (!list.equals(this.lastPassengers)) { - this.broadcast.accept(new PacketPlayOutMount(this.entity)); + this.broadcastAndSend(new PacketPlayOutMount(this.entity)); // CraftBukkit - this.changedPassengers(list, this.lastPassengers).forEach((entity) -> { + removedPassengers(list, this.lastPassengers).forEach((entity) -> { if (entity instanceof EntityPlayer) { EntityPlayer entityplayer = (EntityPlayer) entity; -@@ -105,18 +115,18 @@ +@@ -101,18 +111,18 @@ if (entity instanceof EntityItemFrame) { EntityItemFrame entityitemframe = (EntityItemFrame) entity; @@ -59,7 +59,7 @@ worldmap.tickCarriedBy(entityplayer, itemstack); Packet packet = worldmap.getUpdatePacket(integer, entityplayer); -@@ -229,7 +239,27 @@ +@@ -225,7 +235,27 @@ ++this.tickCount; if (this.entity.hurtMarked) { @@ -72,7 +72,7 @@ + org.bukkit.util.Vector velocity = player.getVelocity(); + + PlayerVelocityEvent event = new PlayerVelocityEvent(player, velocity.clone()); -+ this.entity.level.getCraftServer().getPluginManager().callEvent(event); ++ this.entity.level().getCraftServer().getPluginManager().callEvent(event); + + if (event.isCancelled()) { + cancelled = true; @@ -88,18 +88,9 @@ this.entity.hurtMarked = false; } -@@ -252,14 +282,17 @@ - List> list = new ArrayList(); +@@ -253,7 +283,10 @@ - Objects.requireNonNull(list); -- this.sendPairingData(list::add); -+ this.sendPairingData(list::add, entityplayer); // CraftBukkit - add player - entityplayer.connection.send(new ClientboundBundlePacket(list)); - this.entity.startSeenByPlayer(entityplayer); - } - -- public void sendPairingData(Consumer> consumer) { -+ public void sendPairingData(Consumer> consumer, EntityPlayer entityplayer) { // CraftBukkit - add player + public void sendPairingData(EntityPlayer entityplayer, Consumer> consumer) { if (this.entity.isRemoved()) { - EntityTrackerEntry.LOGGER.warn("Fetching packet for removed entity {}", this.entity); + // CraftBukkit start - Remove useless error spam, just return @@ -109,7 +100,7 @@ } Packet packet = this.entity.getAddEntityPacket(); -@@ -275,6 +308,12 @@ +@@ -269,6 +302,12 @@ if (this.entity instanceof EntityLiving) { Collection collection = ((EntityLiving) this.entity).getAttributes().getSyncableAttributes(); @@ -122,7 +113,7 @@ if (!collection.isEmpty()) { consumer.accept(new PacketPlayOutUpdateAttributes(this.entity.getId(), collection)); } -@@ -306,8 +345,14 @@ +@@ -300,8 +339,14 @@ if (!list.isEmpty()) { consumer.accept(new PacketPlayOutEntityEquipment(this.entity.getId(), list)); } @@ -134,10 +125,10 @@ + consumer.accept(new PacketPlayOutEntityHeadRotation(this.entity, (byte) yHeadRotp)); + // CraftBukkit end + - if (this.entity instanceof EntityLiving) { - EntityLiving entityliving = (EntityLiving) this.entity; - Iterator iterator = entityliving.getActiveEffects().iterator(); -@@ -350,6 +395,11 @@ + if (!this.entity.getPassengers().isEmpty()) { + consumer.accept(new PacketPlayOutMount(this.entity)); + } +@@ -333,6 +378,11 @@ Set set = ((EntityLiving) this.entity).getAttributes().getDirtyAttributes(); if (!set.isEmpty()) { diff --git a/paper-server/nms-patches/net/minecraft/server/level/PlayerChunk.patch b/paper-server/nms-patches/net/minecraft/server/level/PlayerChunk.patch index 46804d54e8..35211d2adc 100644 --- a/paper-server/nms-patches/net/minecraft/server/level/PlayerChunk.patch +++ b/paper-server/nms-patches/net/minecraft/server/level/PlayerChunk.patch @@ -1,8 +1,8 @@ --- a/net/minecraft/server/level/PlayerChunk.java +++ b/net/minecraft/server/level/PlayerChunk.java -@@ -37,6 +37,10 @@ +@@ -36,6 +36,10 @@ import net.minecraft.world.level.chunk.ProtoChunkExtension; - import net.minecraft.world.level.lighting.LightEngine; + import net.minecraft.world.level.lighting.LevelLightEngine; +// CraftBukkit start +import net.minecraft.server.MinecraftServer; @@ -11,7 +11,7 @@ public class PlayerChunk { public static final Either UNLOADED_CHUNK = Either.right(PlayerChunk.Failure.UNLOADED); -@@ -75,11 +79,11 @@ +@@ -71,11 +75,11 @@ this.fullChunkFuture = PlayerChunk.UNLOADED_LEVEL_CHUNK_FUTURE; this.tickingChunkFuture = PlayerChunk.UNLOADED_LEVEL_CHUNK_FUTURE; this.entityTickingChunkFuture = PlayerChunk.UNLOADED_LEVEL_CHUNK_FUTURE; @@ -24,15 +24,15 @@ + this.pendingFullStateConfirmation = CompletableFuture.completedFuture(null); // CraftBukkit - decompile error this.pos = chunkcoordintpair; this.levelHeightAccessor = levelheightaccessor; - this.lightEngine = lightengine; -@@ -92,6 +96,20 @@ + this.lightEngine = levellightengine; +@@ -88,6 +92,20 @@ this.changedBlocksPerSection = new ShortSet[levelheightaccessor.getSectionsCount()]; } + // CraftBukkit start + public Chunk getFullChunkNow() { + // Note: We use the oldTicketLevel for isLoaded checks. -+ if (!getFullChunkStatus(this.oldTicketLevel).isOrAfter(PlayerChunk.State.BORDER)) return null; ++ if (!ChunkLevel.fullStatus(this.oldTicketLevel).isOrAfter(FullChunkStatus.FULL)) return null; + return this.getFullChunkNowUnchecked(); + } + @@ -46,7 +46,7 @@ public CompletableFuture> getFutureIfPresentUnchecked(ChunkStatus chunkstatus) { CompletableFuture> completablefuture = (CompletableFuture) this.futures.get(chunkstatus.getIndex()); -@@ -117,17 +135,17 @@ +@@ -113,17 +131,17 @@ @Nullable public Chunk getTickingChunk() { CompletableFuture> completablefuture = this.getTickingChunkFuture(); @@ -68,7 +68,7 @@ } @Nullable -@@ -172,6 +190,7 @@ +@@ -168,6 +186,7 @@ if (chunk != null) { int i = this.levelHeightAccessor.getSectionIndex(blockposition.getY()); @@ -76,12 +76,12 @@ if (this.changedBlocksPerSection[i] == null) { this.hasChangedSections = true; this.changedBlocksPerSection[i] = new ShortOpenHashSet(); -@@ -182,10 +201,10 @@ +@@ -178,10 +197,10 @@ } public void sectionLightChanged(EnumSkyBlock enumskyblock, int i) { -- Either either = (Either) this.getFutureIfPresent(ChunkStatus.FEATURES).getNow((Object) null); -+ Either either = (Either) this.getFutureIfPresent(ChunkStatus.FEATURES).getNow(null); // CraftBukkit - decompile error +- Either either = (Either) this.getFutureIfPresent(ChunkStatus.INITIALIZE_LIGHT).getNow((Object) null); ++ Either either = (Either) this.getFutureIfPresent(ChunkStatus.INITIALIZE_LIGHT).getNow(null); // CraftBukkit - decompile error if (either != null) { - IChunkAccess ichunkaccess = (IChunkAccess) either.left().orElse((Object) null); @@ -89,7 +89,20 @@ if (ichunkaccess != null) { ichunkaccess.setUnsaved(true); -@@ -372,7 +391,7 @@ +@@ -246,8 +265,11 @@ + PacketPlayOutMultiBlockChange packetplayoutmultiblockchange = new PacketPlayOutMultiBlockChange(sectionposition, shortset, chunksection); + + this.broadcast(list, packetplayoutmultiblockchange); ++ // CraftBukkit start ++ List finalList = list; + packetplayoutmultiblockchange.runUpdates((blockposition1, iblockdata1) -> { +- this.broadcastBlockEntityIfNeeded(list, world, blockposition1, iblockdata1); ++ this.broadcastBlockEntityIfNeeded(finalList, world, blockposition1, iblockdata1); ++ // CraftBukkit end + }); + } + } +@@ -372,7 +394,7 @@ this.pendingFullStateConfirmation = completablefuture1; completablefuture.thenAccept((either) -> { either.ifLeft((chunk) -> { @@ -98,13 +111,13 @@ }); }); } -@@ -389,6 +408,30 @@ - boolean flag1 = this.ticketLevel <= PlayerChunkMap.MAX_CHUNK_DISTANCE; - PlayerChunk.State playerchunk_state = getFullChunkStatus(this.oldTicketLevel); - PlayerChunk.State playerchunk_state1 = getFullChunkStatus(this.ticketLevel); +@@ -389,6 +411,30 @@ + boolean flag1 = ChunkLevel.isLoaded(this.ticketLevel); + FullChunkStatus fullchunkstatus = ChunkLevel.fullStatus(this.oldTicketLevel); + FullChunkStatus fullchunkstatus1 = ChunkLevel.fullStatus(this.ticketLevel); + // CraftBukkit start + // ChunkUnloadEvent: Called before the chunk is unloaded: isChunkLoaded is still true and chunk can still be modified by plugins. -+ if (playerchunk_state.isOrAfter(PlayerChunk.State.BORDER) && !playerchunk_state1.isOrAfter(PlayerChunk.State.BORDER)) { ++ if (fullchunkstatus.isOrAfter(FullChunkStatus.FULL) && !fullchunkstatus1.isOrAfter(FullChunkStatus.FULL)) { + this.getFutureIfPresentUnchecked(ChunkStatus.FULL).thenAccept((either) -> { + Chunk chunk = (Chunk)either.left().orElse(null); + if (chunk != null) { @@ -129,13 +142,13 @@ if (flag) { Either either = Either.right(new PlayerChunk.Failure() { -@@ -459,6 +502,26 @@ +@@ -459,6 +505,26 @@ this.onLevelChange.onLevelChange(this.pos, this::getQueueLevel, this.ticketLevel, this::setQueueLevel); this.oldTicketLevel = this.ticketLevel; + // CraftBukkit start + // ChunkLoadEvent: Called after the chunk is loaded: isChunkLoaded returns true and chunk is ready to be modified by plugins. -+ if (!playerchunk_state.isOrAfter(PlayerChunk.State.BORDER) && playerchunk_state1.isOrAfter(PlayerChunk.State.BORDER)) { ++ if (!fullchunkstatus.isOrAfter(FullChunkStatus.FULL) && fullchunkstatus1.isOrAfter(FullChunkStatus.FULL)) { + this.getFutureIfPresentUnchecked(ChunkStatus.FULL).thenAccept((either) -> { + Chunk chunk = (Chunk)either.left().orElse(null); + if (chunk != null) { @@ -155,4 +168,4 @@ + // CraftBukkit end } - public static ChunkStatus getStatus(int i) { + public boolean wasAccessibleSinceLastSave() { diff --git a/paper-server/nms-patches/net/minecraft/server/level/PlayerChunkMap.patch b/paper-server/nms-patches/net/minecraft/server/level/PlayerChunkMap.patch index 5848f7e474..91a5337909 100644 --- a/paper-server/nms-patches/net/minecraft/server/level/PlayerChunkMap.patch +++ b/paper-server/nms-patches/net/minecraft/server/level/PlayerChunkMap.patch @@ -10,10 +10,10 @@ +import org.bukkit.entity.Player; +// CraftBukkit end + - public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.e { + public class PlayerChunkMap extends IChunkLoader implements PlayerChunk.d { private static final byte CHUNK_TYPE_REPLACEABLE = -1; -@@ -152,6 +158,27 @@ +@@ -151,6 +157,27 @@ private final Queue unloadQueue; int viewDistance; @@ -41,7 +41,7 @@ public PlayerChunkMap(WorldServer worldserver, Convertable.ConversionSession convertable_conversionsession, DataFixer datafixer, StructureTemplateManager structuretemplatemanager, Executor executor, IAsyncTaskHandler iasynctaskhandler, ILightAccess ilightaccess, ChunkGenerator chunkgenerator, WorldLoadListener worldloadlistener, ChunkStatusUpdateListener chunkstatusupdatelistener, Supplier supplier, int i, boolean flag) { super(convertable_conversionsession.getDimensionPath(worldserver.dimension()).resolve("region"), datafixer, flag); this.visibleChunkMap = this.updatingChunkMap.clone(); -@@ -170,6 +197,11 @@ +@@ -169,6 +196,11 @@ this.storageName = path.getFileName().toString(); this.level = worldserver; this.generator = chunkgenerator; @@ -53,22 +53,22 @@ IRegistryCustom iregistrycustom = worldserver.registryAccess(); long j = worldserver.getSeed(); -@@ -329,9 +361,12 @@ - CompletableFuture>> completablefuture1 = SystemUtils.sequence(list); - CompletableFuture, PlayerChunk.Failure>> completablefuture2 = completablefuture1.thenApply((list2) -> { - List list3 = Lists.newArrayList(); -- final int l1 = 0; -+ // CraftBukkit start - decompile error -+ int cnt = 0; +@@ -335,9 +367,12 @@ + CompletableFuture>> completablefuture1 = SystemUtils.sequence(list); + CompletableFuture, PlayerChunk.Failure>> completablefuture2 = completablefuture1.thenApply((list2) -> { + List list3 = Lists.newArrayList(); +- final int l1 = 0; ++ // CraftBukkit start - decompile error ++ int cnt = 0; -- for (Iterator iterator = list2.iterator(); iterator.hasNext(); ++l1) { -+ for (Iterator iterator = list2.iterator(); iterator.hasNext(); ++cnt) { -+ final int l1 = cnt; -+ // CraftBukkit end - final Either either = (Either) iterator.next(); +- for (Iterator iterator = list2.iterator(); iterator.hasNext(); ++l1) { ++ for (Iterator iterator = list2.iterator(); iterator.hasNext(); ++cnt) { ++ final int l1 = cnt; ++ // CraftBukkit end + final Either either = (Either) iterator.next(); - if (either == null) { -@@ -536,7 +571,7 @@ + if (either == null) { +@@ -543,7 +578,7 @@ private void scheduleUnload(long i, PlayerChunk playerchunk) { CompletableFuture completablefuture = playerchunk.getChunkToSave(); @@ -77,7 +77,7 @@ CompletableFuture completablefuture1 = playerchunk.getChunkToSave(); if (completablefuture1 != completablefuture) { -@@ -625,9 +660,9 @@ +@@ -634,9 +669,9 @@ ProtoChunk protochunk = ChunkRegionLoader.read(this.level, this.poiManager, chunkcoordintpair, (NBTTagCompound) optional.get()); this.markPosition(chunkcoordintpair, protochunk.getStatus().getChunkType()); @@ -89,7 +89,7 @@ } }, this.mainThreadExecutor).exceptionallyAsync((throwable) -> { return this.handleChunkLoadFailure(throwable, chunkcoordintpair); -@@ -733,7 +768,21 @@ +@@ -751,7 +786,21 @@ private static void postLoadProtoChunk(WorldServer worldserver, List list) { if (!list.isEmpty()) { @@ -112,7 +112,7 @@ } } -@@ -832,7 +881,7 @@ +@@ -852,7 +901,7 @@ if (!playerchunk.wasAccessibleSinceLastSave()) { return false; } else { @@ -121,7 +121,7 @@ if (!(ichunkaccess instanceof ProtoChunkExtension) && !(ichunkaccess instanceof Chunk)) { return false; -@@ -994,7 +1043,8 @@ +@@ -1014,7 +1063,8 @@ return ichunkaccess instanceof Chunk ? Optional.of((Chunk) ichunkaccess) : Optional.empty(); }); @@ -131,7 +131,7 @@ return chunk.getBlockEntities().size(); }).orElse(0), tickingtracker.getTicketDebugString(i), tickingtracker.getLevel(i), optional1.map((chunk) -> { return chunk.getBlockTicks().count(); -@@ -1007,7 +1057,7 @@ +@@ -1027,7 +1077,7 @@ private static String printFuture(CompletableFuture> completablefuture) { try { @@ -140,7 +140,7 @@ return either != null ? (String) either.map((chunk) -> { return "done"; -@@ -1023,12 +1073,14 @@ +@@ -1043,12 +1093,14 @@ private CompletableFuture> readChunk(ChunkCoordIntPair chunkcoordintpair) { return this.read(chunkcoordintpair).thenApplyAsync((optional) -> { @@ -158,7 +158,7 @@ } boolean anyPlayerCloseEnoughForSpawning(ChunkCoordIntPair chunkcoordintpair) { -@@ -1482,7 +1534,7 @@ +@@ -1503,7 +1555,7 @@ public final Set seenBy = Sets.newIdentityHashSet(); public EntityTracker(Entity entity, int i, int j, boolean flag) { @@ -167,7 +167,7 @@ this.entity = entity; this.range = i; this.lastSectionPos = SectionPosition.of((EntityAccess) entity); -@@ -1541,6 +1593,11 @@ +@@ -1562,6 +1614,11 @@ double d2 = d0 * d0; boolean flag = d1 <= d2 && this.entity.broadcastToPlayer(entityplayer); diff --git a/paper-server/nms-patches/net/minecraft/server/level/PlayerInteractManager.patch b/paper-server/nms-patches/net/minecraft/server/level/PlayerInteractManager.patch index 5fca72ed05..87d2651aed 100644 --- a/paper-server/nms-patches/net/minecraft/server/level/PlayerInteractManager.patch +++ b/paper-server/nms-patches/net/minecraft/server/level/PlayerInteractManager.patch @@ -108,7 +108,7 @@ + } + } else if (!iblockdata.isAir()) { iblockdata.attack(this.level, blockposition, this.player); - f = iblockdata.getDestroyProgress(this.player, this.player.level, blockposition); + f = iblockdata.getDestroyProgress(this.player, this.player.level(), blockposition); } + if (event.useItemInHand() == Event.Result.DENY) { diff --git a/paper-server/nms-patches/net/minecraft/server/level/WorldServer.patch b/paper-server/nms-patches/net/minecraft/server/level/WorldServer.patch index 889389b2b7..00f6dd003c 100644 --- a/paper-server/nms-patches/net/minecraft/server/level/WorldServer.patch +++ b/paper-server/nms-patches/net/minecraft/server/level/WorldServer.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/server/level/WorldServer.java +++ b/net/minecraft/server/level/WorldServer.java -@@ -159,6 +159,26 @@ +@@ -162,6 +162,26 @@ import net.minecraft.world.ticks.TickListServer; import org.slf4j.Logger; @@ -27,7 +27,7 @@ public class WorldServer extends World implements GeneratorAccessSeed { public static final BlockPosition END_SPAWN_POINT = new BlockPosition(100, 50, 0); -@@ -172,7 +192,7 @@ +@@ -175,7 +195,7 @@ final List players; private final ChunkProviderServer chunkSource; private final MinecraftServer server; @@ -36,11 +36,11 @@ final EntityTickList entityTickList; public final PersistentEntitySectionManager entityManager; private final GameEventDispatcher gameEventDispatcher; -@@ -196,12 +216,30 @@ - private final StructureCheck structureCheck; +@@ -200,12 +220,30 @@ private final boolean tickTime; + private final RandomSequences randomSequences; -- public WorldServer(MinecraftServer minecraftserver, Executor executor, Convertable.ConversionSession convertable_conversionsession, IWorldDataServer iworlddataserver, ResourceKey resourcekey, WorldDimension worlddimension, WorldLoadListener worldloadlistener, boolean flag, long i, List list, boolean flag1) { +- public WorldServer(MinecraftServer minecraftserver, Executor executor, Convertable.ConversionSession convertable_conversionsession, IWorldDataServer iworlddataserver, ResourceKey resourcekey, WorldDimension worlddimension, WorldLoadListener worldloadlistener, boolean flag, long i, List list, boolean flag1, @Nullable RandomSequences randomsequences) { - IRegistryCustom.Dimension iregistrycustom_dimension = minecraftserver.registryAccess(); - Holder holder = worlddimension.type(); + // CraftBukkit start @@ -59,7 +59,7 @@ - Objects.requireNonNull(minecraftserver); - super(iworlddataserver, resourcekey, iregistrycustom_dimension, holder, minecraftserver::getProfiler, false, flag, i, minecraftserver.getMaxChainedNeighborUpdates()); + // Add env and gen to constructor, IWorldDataServer -> WorldDataServer -+ public WorldServer(MinecraftServer minecraftserver, Executor executor, Convertable.ConversionSession convertable_conversionsession, WorldDataServer iworlddataserver, ResourceKey resourcekey, WorldDimension worlddimension, WorldLoadListener worldloadlistener, boolean flag, long i, List list, boolean flag1, org.bukkit.World.Environment env, org.bukkit.generator.ChunkGenerator gen, org.bukkit.generator.BiomeProvider biomeProvider) { ++ public WorldServer(MinecraftServer minecraftserver, Executor executor, Convertable.ConversionSession convertable_conversionsession, WorldDataServer iworlddataserver, ResourceKey resourcekey, WorldDimension worlddimension, WorldLoadListener worldloadlistener, boolean flag, long i, List list, boolean flag1, @Nullable RandomSequences randomsequences, org.bukkit.World.Environment env, org.bukkit.generator.ChunkGenerator gen, org.bukkit.generator.BiomeProvider biomeProvider) { + // IRegistryCustom.Dimension iregistrycustom_dimension = minecraftserver.registryAccess(); // CraftBukkit - decompile error + // Holder holder = worlddimension.type(); // CraftBukkit - decompile error + @@ -72,7 +72,7 @@ this.players = Lists.newArrayList(); this.entityTickList = new EntityTickList(); this.blockTicks = new TickListServer<>(this::isPositionTickingWithEntitiesLoaded, this.getProfilerSupplier()); -@@ -215,6 +253,22 @@ +@@ -219,6 +257,22 @@ this.customSpawners = list; this.serverLevelData = iworlddataserver; ChunkGenerator chunkgenerator = worlddimension.generator(); @@ -95,7 +95,7 @@ boolean flag2 = minecraftserver.forceSynchronousWrites(); DataFixer datafixer = minecraftserver.getFixerUpper(); EntityPersistentStorage entitypersistentstorage = new EntityStorage(this, convertable_conversionsession.getDimensionPath(resourcekey).resolve("entities"), datafixer, flag2, minecraftserver); -@@ -246,15 +300,16 @@ +@@ -250,9 +304,9 @@ long l = minecraftserver.getWorldData().worldGenOptions().seed(); this.structureCheck = new StructureCheck(this.chunkSource.chunkScanner(), this.registryAccess(), minecraftserver.getStructureManager(), resourcekey, chunkgenerator, this.chunkSource.randomState(), this, chunkgenerator.getBiomeSource(), l, datafixer); @@ -108,14 +108,15 @@ } else { this.dragonFight = null; } - - this.sleepStatus = new SleepStatus(); - this.gameEventDispatcher = new GameEventDispatcher(this); +@@ -266,6 +320,7 @@ + return new RandomSequences(l); + }, "random_sequences"); + }); + this.getCraftServer().addWorld(this.getWorld()); // CraftBukkit } - public void setWeatherParameters(int i, int j, boolean flag, boolean flag1) { -@@ -286,12 +341,20 @@ + /** @deprecated */ +@@ -304,12 +359,20 @@ long j; if (this.sleepStatus.areEnoughSleeping(i) && this.sleepStatus.areEnoughDeepSleeping(i, this.players)) { @@ -139,7 +140,7 @@ if (this.getGameRules().getBoolean(GameRules.RULE_WEATHER_CYCLE) && this.isRaining()) { this.resetWeatherCycle(); } -@@ -317,7 +380,7 @@ +@@ -335,7 +398,7 @@ this.runBlockEvents(); this.handlingTick = false; gameprofilerfiller.pop(); @@ -148,7 +149,7 @@ if (flag) { this.resetEmptyTime(); -@@ -333,7 +396,7 @@ +@@ -351,7 +414,7 @@ this.entityTickList.forEach((entity) -> { if (!entity.isRemoved()) { @@ -157,7 +158,7 @@ entity.discard(); } else { gameprofilerfiller.push("checkDespawn"); -@@ -405,7 +468,7 @@ +@@ -423,7 +486,7 @@ private void wakeUpAllPlayers() { this.sleepStatus.removeAllSleepers(); @@ -166,7 +167,7 @@ entityplayer.stopSleepInBed(false, false); }); } -@@ -433,7 +496,7 @@ +@@ -451,7 +514,7 @@ entityhorseskeleton.setTrap(true); entityhorseskeleton.setAge(0); entityhorseskeleton.setPos((double) blockposition.getX(), (double) blockposition.getY(), (double) blockposition.getZ()); @@ -175,7 +176,7 @@ } } -@@ -442,7 +505,7 @@ +@@ -460,7 +523,7 @@ if (entitylightning != null) { entitylightning.moveTo(Vec3D.atBottomCenterOf(blockposition)); entitylightning.setVisualOnly(flag1); @@ -184,7 +185,7 @@ } } } -@@ -456,7 +519,7 @@ +@@ -475,7 +538,7 @@ BiomeBase biomebase = (BiomeBase) this.getBiome(blockposition).value(); if (biomebase.shouldFreeze(this, blockposition1)) { @@ -193,8 +194,8 @@ } if (flag) { -@@ -471,10 +534,10 @@ - IBlockData iblockdata1 = (IBlockData) iblockdata.setValue(BlockSnow.LAYERS, l + 1); +@@ -489,10 +552,10 @@ + IBlockData iblockdata1 = (IBlockData) iblockdata.setValue(BlockSnow.LAYERS, i1 + 1); Block.pushEntitiesUp(iblockdata, iblockdata1, this, blockposition); - this.setBlockAndUpdate(blockposition, iblockdata1); @@ -206,7 +207,7 @@ } } -@@ -670,6 +733,7 @@ +@@ -688,6 +751,7 @@ this.rainLevel = MathHelper.clamp(this.rainLevel, 0.0F, 1.0F); } @@ -214,13 +215,13 @@ if (this.oRainLevel != this.rainLevel) { this.server.getPlayerList().broadcastAll(new PacketPlayOutGameStateChange(PacketPlayOutGameStateChange.RAIN_LEVEL_CHANGE, this.rainLevel), this.dimension()); } -@@ -688,14 +752,47 @@ +@@ -706,14 +770,47 @@ this.server.getPlayerList().broadcastAll(new PacketPlayOutGameStateChange(PacketPlayOutGameStateChange.RAIN_LEVEL_CHANGE, this.rainLevel)); this.server.getPlayerList().broadcastAll(new PacketPlayOutGameStateChange(PacketPlayOutGameStateChange.THUNDER_LEVEL_CHANGE, this.thunderLevel)); } + // */ + for (int idx = 0; idx < this.players.size(); ++idx) { -+ if (((EntityPlayer) this.players.get(idx)).level == this) { ++ if (((EntityPlayer) this.players.get(idx)).level() == this) { + ((EntityPlayer) this.players.get(idx)).tickWeather(); + } + } @@ -228,13 +229,13 @@ + if (flag != this.isRaining()) { + // Only send weather packets to those affected + for (int idx = 0; idx < this.players.size(); ++idx) { -+ if (((EntityPlayer) this.players.get(idx)).level == this) { ++ if (((EntityPlayer) this.players.get(idx)).level() == this) { + ((EntityPlayer) this.players.get(idx)).setPlayerWeather((!flag ? WeatherType.DOWNFALL : WeatherType.CLEAR), false); + } + } + } + for (int idx = 0; idx < this.players.size(); ++idx) { -+ if (((EntityPlayer) this.players.get(idx)).level == this) { ++ if (((EntityPlayer) this.players.get(idx)).level() == this) { + ((EntityPlayer) this.players.get(idx)).updateWeather(this.oRainLevel, this.rainLevel, this.oThunderLevel, this.thunderLevel); + } + } @@ -264,7 +265,7 @@ } public void resetEmptyTime() { -@@ -730,6 +827,7 @@ +@@ -748,6 +845,7 @@ }); gameprofilerfiller.incrementCounter("tickNonPassenger"); entity.tick(); @@ -272,7 +273,7 @@ this.getProfiler().pop(); Iterator iterator = entity.getPassengers().iterator(); -@@ -753,6 +851,7 @@ +@@ -771,6 +869,7 @@ }); gameprofilerfiller.incrementCounter("tickPassenger"); entity1.rideTick(); @@ -280,7 +281,7 @@ gameprofilerfiller.pop(); Iterator iterator = entity1.getPassengers().iterator(); -@@ -777,6 +876,7 @@ +@@ -795,6 +894,7 @@ ChunkProviderServer chunkproviderserver = this.getChunkSource(); if (!flag1) { @@ -288,7 +289,7 @@ if (iprogressupdate != null) { iprogressupdate.progressStartNoAbort(IChatBaseComponent.translatable("menu.savingLevel")); } -@@ -794,11 +894,19 @@ +@@ -812,11 +912,19 @@ } } @@ -309,7 +310,7 @@ } this.getChunkSource().getDataStorage().save(); -@@ -863,15 +971,37 @@ +@@ -881,15 +989,37 @@ @Override public boolean addFreshEntity(Entity entity) { @@ -350,7 +351,7 @@ } public void addDuringCommandTeleport(EntityPlayer entityplayer) { -@@ -902,24 +1032,37 @@ +@@ -920,24 +1050,37 @@ this.entityManager.addNewEntity(entityplayer); } @@ -392,7 +393,7 @@ return true; } } -@@ -933,10 +1076,32 @@ +@@ -951,10 +1094,32 @@ entityplayer.remove(entity_removalreason); } @@ -425,7 +426,7 @@ while (iterator.hasNext()) { EntityPlayer entityplayer = (EntityPlayer) iterator.next(); -@@ -945,6 +1110,12 @@ +@@ -963,6 +1128,12 @@ double d1 = (double) blockposition.getY() - entityplayer.getY(); double d2 = (double) blockposition.getZ() - entityplayer.getZ(); @@ -438,7 +439,7 @@ if (d0 * d0 + d1 * d1 + d2 * d2 < 1024.0D) { entityplayer.connection.send(new PacketPlayOutBlockBreakAnimation(i, blockposition, j)); } -@@ -1004,7 +1175,18 @@ +@@ -1022,7 +1193,18 @@ Iterator iterator = this.navigatingMobs.iterator(); while (iterator.hasNext()) { @@ -458,7 +459,7 @@ NavigationAbstract navigationabstract = entityinsentient.getNavigation(); if (navigationabstract.shouldRecomputePath(blockposition)) { -@@ -1066,6 +1248,11 @@ +@@ -1084,6 +1266,11 @@ @Override public Explosion explode(@Nullable Entity entity, @Nullable DamageSource damagesource, @Nullable ExplosionDamageCalculator explosiondamagecalculator, double d0, double d1, double d2, float f, boolean flag, World.a world_a) { Explosion explosion = this.explode(entity, damagesource, explosiondamagecalculator, d0, d1, d2, f, flag, world_a, false); @@ -470,7 +471,7 @@ if (!explosion.interactsWithBlocks()) { explosion.clearToBlow(); -@@ -1138,13 +1325,20 @@ +@@ -1156,13 +1343,20 @@ } public int sendParticles(T t0, double d0, double d1, double d2, int i, double d3, double d4, double d5, double d6) { @@ -493,7 +494,7 @@ ++j; } } -@@ -1195,7 +1389,7 @@ +@@ -1213,7 +1407,7 @@ @Nullable public BlockPosition findNearestMapStructure(TagKey tagkey, BlockPosition blockposition, int i, boolean flag) { @@ -502,7 +503,7 @@ return null; } else { Optional> optional = this.registryAccess().registryOrThrow(Registries.STRUCTURE).getTag(tagkey); -@@ -1232,11 +1426,21 @@ +@@ -1250,11 +1444,21 @@ @Nullable @Override public WorldMap getMapData(String s) { @@ -525,7 +526,7 @@ this.getServer().overworld().getDataStorage().set(s, worldmap); } -@@ -1534,6 +1738,11 @@ +@@ -1552,6 +1756,11 @@ @Override public void blockUpdated(BlockPosition blockposition, Block block) { if (!this.isDebug()) { @@ -537,7 +538,7 @@ this.updateNeighborsAt(blockposition, block); } -@@ -1553,12 +1762,12 @@ +@@ -1571,12 +1780,12 @@ } public boolean isFlat() { @@ -552,7 +553,7 @@ } @Nullable -@@ -1581,7 +1790,7 @@ +@@ -1599,7 +1808,7 @@ private static String getTypeCount(Iterable iterable, Function function) { try { Object2IntOpenHashMap object2intopenhashmap = new Object2IntOpenHashMap(); @@ -561,7 +562,7 @@ while (iterator.hasNext()) { T t0 = iterator.next(); -@@ -1590,7 +1799,7 @@ +@@ -1608,7 +1817,7 @@ object2intopenhashmap.addTo(s, 1); } @@ -570,7 +571,7 @@ String s1 = (String) entry.getKey(); return s1 + ":" + entry.getIntValue(); -@@ -1601,17 +1810,33 @@ +@@ -1619,17 +1828,33 @@ } public static void makeObsidianPlatform(WorldServer worldserver) { @@ -606,7 +607,7 @@ } @Override -@@ -1727,6 +1952,7 @@ +@@ -1753,6 +1978,7 @@ } entity.updateDynamicGameEventListener(DynamicGameEventListener::add); @@ -614,7 +615,7 @@ } public void onTrackingEnd(Entity entity) { -@@ -1763,6 +1989,14 @@ +@@ -1789,6 +2015,14 @@ } entity.updateDynamicGameEventListener(DynamicGameEventListener::remove); diff --git a/paper-server/nms-patches/net/minecraft/server/network/HandshakeListener.patch b/paper-server/nms-patches/net/minecraft/server/network/HandshakeListener.patch index 937d7f4809..e649d2e28f 100644 --- a/paper-server/nms-patches/net/minecraft/server/network/HandshakeListener.patch +++ b/paper-server/nms-patches/net/minecraft/server/network/HandshakeListener.patch @@ -15,7 +15,7 @@ + private static final HashMap throttleTracker = new HashMap(); + private static int throttleCounter = 0; + // CraftBukkit end - private static final IChatBaseComponent IGNORE_STATUS_REASON = IChatBaseComponent.literal("Ignoring status request"); + private static final IChatBaseComponent IGNORE_STATUS_REASON = IChatBaseComponent.translatable("disconnect.ignoring_status_request"); private final MinecraftServer server; private final NetworkManager connection; @@ -24,9 +33,44 @@ diff --git a/paper-server/nms-patches/net/minecraft/server/network/PlayerConnection.patch b/paper-server/nms-patches/net/minecraft/server/network/PlayerConnection.patch index bef7528d99..4be67e954b 100644 --- a/paper-server/nms-patches/net/minecraft/server/network/PlayerConnection.patch +++ b/paper-server/nms-patches/net/minecraft/server/network/PlayerConnection.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/server/network/PlayerConnection.java +++ b/net/minecraft/server/network/PlayerConnection.java -@@ -184,6 +184,69 @@ +@@ -185,6 +185,69 @@ import net.minecraft.world.phys.shapes.VoxelShapes; import org.slf4j.Logger; @@ -70,7 +70,7 @@ public class PlayerConnection implements ServerPlayerConnection, TickablePacketListener, PacketListenerPlayIn { static final Logger LOGGER = LogUtils.getLogger(); -@@ -200,7 +263,9 @@ +@@ -201,7 +264,9 @@ private long keepAliveTime; private boolean keepAlivePending; private long keepAliveChallenge; @@ -81,7 +81,7 @@ private int dropSpamTickCount; private double firstGoodX; private double firstGoodY; -@@ -246,8 +311,31 @@ +@@ -247,8 +312,31 @@ this.keepAliveTime = SystemUtils.getMillis(); entityplayer.getTextFilter().join(); this.signedMessageDecoder = minecraftserver.enforceSecureProfile() ? SignedMessageChain.b.REJECT_ALL : SignedMessageChain.b.unsigned(entityplayer.getUUID()); @@ -114,7 +114,7 @@ @Override public void tick() { -@@ -302,7 +390,7 @@ +@@ -303,7 +391,7 @@ this.server.getProfiler().push("keepAlive"); long i = SystemUtils.getMillis(); @@ -123,7 +123,7 @@ if (this.keepAlivePending) { this.disconnect(IChatBaseComponent.translatable("disconnect.timeout")); } else { -@@ -314,15 +402,21 @@ +@@ -315,15 +403,21 @@ } this.server.getProfiler().pop(); @@ -140,12 +140,12 @@ --this.dropSpamTickCount; } - if (this.player.getLastActionTime() > 0L && this.server.getPlayerIdleTimeout() > 0 && SystemUtils.getMillis() - this.player.getLastActionTime() > (long) (this.server.getPlayerIdleTimeout() * 1000 * 60)) { + if (this.player.getLastActionTime() > 0L && this.server.getPlayerIdleTimeout() > 0 && SystemUtils.getMillis() - this.player.getLastActionTime() > (long) this.server.getPlayerIdleTimeout() * 1000L * 60L) { + this.player.resetLastActionTime(); // CraftBukkit - SPIGOT-854 this.disconnect(IChatBaseComponent.translatable("multiplayer.disconnect.idling")); } -@@ -346,16 +440,67 @@ +@@ -347,16 +441,67 @@ return this.server.isSingleplayerOwner(this.player.getGameProfile()); } @@ -214,7 +214,7 @@ } private CompletableFuture filterTextPacket(T t0, BiFunction> bifunction) { -@@ -419,7 +564,34 @@ +@@ -420,7 +565,34 @@ double d9 = entity.getDeltaMovement().lengthSqr(); double d10 = d6 * d6 + d7 * d7 + d8 * d8; @@ -250,7 +250,7 @@ PlayerConnection.LOGGER.warn("{} (vehicle of {}) moved too quickly! {},{},{}", new Object[]{entity.getName().getString(), this.player.getName().getString(), d6, d7, d8}); this.connection.send(new PacketPlayOutVehicleMove(entity)); return; -@@ -451,14 +623,72 @@ +@@ -460,14 +632,72 @@ } entity.absMoveTo(d3, d4, d5, f, f1); @@ -320,30 +320,30 @@ + } + // CraftBukkit end + - this.player.getLevel().getChunkSource().move(this.player); + this.player.serverLevel().getChunkSource().move(this.player); this.player.checkMovementStatistics(this.player.getX() - d0, this.player.getY() - d1, this.player.getZ() - d2); this.clientVehicleIsFloating = d11 >= -0.03125D && !flag1 && !this.server.isFlightAllowed() && !entity.isNoGravity() && this.noBlocksAround(entity); -@@ -492,6 +722,7 @@ +@@ -501,6 +731,7 @@ } this.awaitingPositionFromClient = null; -+ this.player.getLevel().getChunkSource().move(this.player); // CraftBukkit ++ this.player.serverLevel().getChunkSource().move(this.player); // CraftBukkit } } -@@ -499,7 +730,7 @@ +@@ -508,7 +739,7 @@ @Override public void handleRecipeBookSeenRecipePacket(PacketPlayInRecipeDisplayed packetplayinrecipedisplayed) { - PlayerConnectionUtils.ensureRunningOnSameThread(packetplayinrecipedisplayed, this, this.player.getLevel()); + PlayerConnectionUtils.ensureRunningOnSameThread(packetplayinrecipedisplayed, this, this.player.serverLevel()); - Optional optional = this.server.getRecipeManager().byKey(packetplayinrecipedisplayed.getRecipe()); + Optional> optional = this.server.getRecipeManager().byKey(packetplayinrecipedisplayed.getRecipe()); // CraftBukkit - decompile error RecipeBookServer recipebookserver = this.player.getRecipeBook(); Objects.requireNonNull(recipebookserver); -@@ -529,6 +760,12 @@ +@@ -538,6 +769,12 @@ @Override public void handleCustomCommandSuggestions(PacketPlayInTabComplete packetplayintabcomplete) { - PlayerConnectionUtils.ensureRunningOnSameThread(packetplayintabcomplete, this, this.player.getLevel()); + PlayerConnectionUtils.ensureRunningOnSameThread(packetplayintabcomplete, this, this.player.serverLevel()); + // CraftBukkit start + if (chatSpamTickCount.addAndGet(1) > 500 && !this.server.getPlayerList().isOp(this.player.getGameProfile())) { + this.disconnect(IChatBaseComponent.translatable("disconnect.spam")); @@ -353,7 +353,7 @@ StringReader stringreader = new StringReader(packetplayintabcomplete.getCommand()); if (stringreader.canRead() && stringreader.peek() == '/') { -@@ -538,6 +775,7 @@ +@@ -547,6 +784,7 @@ ParseResults parseresults = this.server.getCommands().getDispatcher().parse(stringreader, this.player.createCommandSourceStack()); this.server.getCommands().getDispatcher().getCompletionSuggestions(parseresults).thenAccept((suggestions) -> { @@ -361,7 +361,7 @@ this.connection.send(new PacketPlayOutTabComplete(packetplayintabcomplete.getId(), suggestions)); }); } -@@ -787,6 +1025,13 @@ +@@ -792,6 +1030,13 @@ if (container instanceof ContainerMerchant) { ContainerMerchant containermerchant = (ContainerMerchant) container; @@ -375,7 +375,7 @@ if (!containermerchant.stillValid(this.player)) { PlayerConnection.LOGGER.debug("Player {} interacted with invalid menu {}", this.player, containermerchant); -@@ -801,6 +1046,13 @@ +@@ -806,6 +1051,13 @@ @Override public void handleEditBook(PacketPlayInBEdit packetplayinbedit) { @@ -389,7 +389,7 @@ int i = packetplayinbedit.getSlot(); if (PlayerInventory.isHotbarSlot(i) || i == 40) { -@@ -809,7 +1061,7 @@ +@@ -814,7 +1066,7 @@ Objects.requireNonNull(list); optional.ifPresent(list::add); @@ -398,7 +398,7 @@ Objects.requireNonNull(list); stream.forEach(list::add); -@@ -827,7 +1079,7 @@ +@@ -832,7 +1084,7 @@ ItemStack itemstack = this.player.getInventory().getItem(i); if (itemstack.is(Items.WRITABLE_BOOK)) { @@ -407,7 +407,7 @@ } } -@@ -852,16 +1104,16 @@ +@@ -857,16 +1109,16 @@ this.updateBookPages(list, (s) -> { return IChatBaseComponent.ChatSerializer.toJson(IChatBaseComponent.literal(s)); @@ -428,7 +428,7 @@ return NBTTagString.valueOf((String) unaryoperator.apply(filteredtext.filteredOrEmpty())); }); -@@ -887,6 +1139,7 @@ +@@ -892,6 +1144,7 @@ } itemstack.addTagElement("pages", nbttaglist); @@ -436,16 +436,16 @@ } @Override -@@ -923,7 +1176,7 @@ +@@ -928,7 +1181,7 @@ } else { - WorldServer worldserver = this.player.getLevel(); + WorldServer worldserver = this.player.serverLevel(); - if (!this.player.wonGame) { + if (!this.player.wonGame && !this.player.isImmobile()) { // CraftBukkit if (this.tickCount == 0) { this.resetPosition(); } -@@ -933,7 +1186,7 @@ +@@ -938,7 +1191,7 @@ this.awaitingTeleportTime = this.tickCount; this.teleport(this.awaitingPositionFromClient.x, this.awaitingPositionFromClient.y, this.awaitingPositionFromClient.z, this.player.getYRot(), this.player.getXRot()); } @@ -454,10 +454,10 @@ } else { this.awaitingTeleportTime = this.tickCount; double d0 = clampHorizontal(packetplayinflying.getX(this.player.getX())); -@@ -945,7 +1198,15 @@ +@@ -950,7 +1203,15 @@ if (this.player.isPassenger()) { this.player.absMoveTo(this.player.getX(), this.player.getY(), this.player.getZ(), f, f1); - this.player.getLevel().getChunkSource().move(this.player); + this.player.serverLevel().getChunkSource().move(this.player); + this.allowedPlayerTicks = 20; // CraftBukkit } else { + // CraftBukkit - Make sure the move is valid but then reset it for plugins to modify @@ -470,7 +470,7 @@ double d3 = this.player.getX(); double d4 = this.player.getY(); double d5 = this.player.getZ(); -@@ -965,15 +1226,33 @@ +@@ -969,15 +1230,33 @@ ++this.receivedMovePacketCount; int i = this.receivedMovePacketCount - this.knownMovePacketCount; @@ -485,7 +485,7 @@ i = 1; } -+ if (packetplayinflying.hasRot || d11 > 0) { ++ if (packetplayinflying.hasRot || d10 > 0) { + allowedPlayerTicks -= 1; + } else { + allowedPlayerTicks = 20; @@ -497,35 +497,32 @@ + speed = player.getAbilities().walkingSpeed * 10f; + } + - if (!this.player.isChangingDimension() && (!this.player.getLevel().getGameRules().getBoolean(GameRules.RULE_DISABLE_ELYTRA_MOVEMENT_CHECK) || !this.player.isFallFlying())) { + if (!this.player.isChangingDimension() && (!this.player.level().getGameRules().getBoolean(GameRules.RULE_DISABLE_ELYTRA_MOVEMENT_CHECK) || !this.player.isFallFlying())) { float f2 = this.player.isFallFlying() ? 300.0F : 100.0F; -- if (d11 - d10 > (double) (f2 * (float) i) && !this.isSingleplayerOwner()) { -+ if (d11 - d10 > Math.max(f2, Math.pow((double) (10.0F * (float) i * speed), 2)) && !this.isSingleplayerOwner()) { +- if (d10 - d9 > (double) (f2 * (float) i) && !this.isSingleplayerOwner()) { ++ if (d10 - d9 > Math.max(f2, Math.pow((double) (10.0F * (float) i * speed), 2)) && !this.isSingleplayerOwner()) { + // CraftBukkit end - PlayerConnection.LOGGER.warn("{} moved too quickly! {},{},{}", new Object[]{this.player.getName().getString(), d7, d8, d9}); + PlayerConnection.LOGGER.warn("{} moved too quickly! {},{},{}", new Object[]{this.player.getName().getString(), d6, d7, d8}); this.teleport(this.player.getX(), this.player.getY(), this.player.getZ(), this.player.getYRot(), this.player.getXRot()); return; -@@ -994,6 +1273,7 @@ +@@ -998,6 +1277,7 @@ boolean flag1 = this.player.verticalCollisionBelow; - this.player.move(EnumMoveType.PLAYER, new Vec3D(d7, d8, d9)); + this.player.move(EnumMoveType.PLAYER, new Vec3D(d6, d7, d8)); + this.player.onGround = packetplayinflying.isOnGround(); // CraftBukkit - SPIGOT-5810, SPIGOT-5835, SPIGOT-6828: reset by this.player.move - double d12 = d8; + double d11 = d7; - d7 = d0 - this.player.getX(); -@@ -1013,9 +1293,72 @@ + d6 = d0 - this.player.getX(); +@@ -1016,9 +1296,67 @@ + } - this.player.absMoveTo(d0, d1, d2, f, f1); - if (!this.player.noPhysics && !this.player.isSleeping() && (flag2 && worldserver.noCollision(this.player, axisalignedbb) || this.isPlayerCollidingWithAnythingNew(worldserver, axisalignedbb))) { + if (!this.player.noPhysics && !this.player.isSleeping() && (flag2 && worldserver.noCollision(this.player, axisalignedbb) || this.isPlayerCollidingWithAnythingNew(worldserver, axisalignedbb, d0, d1, d2))) { - this.teleport(d3, d4, d5, f, f1); + this.internalTeleport(d3, d4, d5, f, f1, Collections.emptySet()); // CraftBukkit - SPIGOT-1807: Don't call teleport event, when the client thinks the player is falling, because the chunks are not loaded on the client yet. - this.player.doCheckFallDamage(this.player.getY() - d6, packetplayinflying.isOnGround()); + this.player.doCheckFallDamage(this.player.getX() - d3, this.player.getY() - d4, this.player.getZ() - d5, packetplayinflying.isOnGround()); } else { + // CraftBukkit start - fire PlayerMoveEvent -+ // Rest to old location first -+ this.player.absMoveTo(prevX, prevY, prevZ, prevYaw, prevPitch); -+ + Player player = this.getCraftPlayer(); + 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. @@ -582,13 +579,11 @@ + } + } + } -+ this.player.absMoveTo(d0, d1, d2, f, f1); // Copied from above + // CraftBukkit end -+ - this.clientIsFloating = d12 >= -0.03125D && !flag1 && this.player.gameMode.getGameModeForPlayer() != EnumGamemode.SPECTATOR && !this.server.isFlightAllowed() && !this.player.getAbilities().mayfly && !this.player.hasEffect(MobEffects.LEVITATION) && !this.player.isFallFlying() && !this.player.isAutoSpinAttack() && this.noBlocksAround(this.player); - this.player.getLevel().getChunkSource().move(this.player); - this.player.doCheckFallDamage(this.player.getY() - d6, packetplayinflying.isOnGround()); -@@ -1054,11 +1397,68 @@ + this.player.absMoveTo(d0, d1, d2, f, f1); + this.clientIsFloating = d11 >= -0.03125D && !flag1 && this.player.gameMode.getGameModeForPlayer() != EnumGamemode.SPECTATOR && !this.server.isFlightAllowed() && !this.player.getAbilities().mayfly && !this.player.hasEffect(MobEffects.LEVITATION) && !this.player.isFallFlying() && !this.player.isAutoSpinAttack() && this.noBlocksAround(this.player); + this.player.serverLevel().getChunkSource().move(this.player); +@@ -1059,11 +1397,68 @@ return true; } @@ -658,7 +653,7 @@ double d3 = set.contains(RelativeMovement.X) ? this.player.getX() : 0.0D; double d4 = set.contains(RelativeMovement.Y) ? this.player.getY() : 0.0D; double d5 = set.contains(RelativeMovement.Z) ? this.player.getZ() : 0.0D; -@@ -1070,6 +1470,14 @@ +@@ -1075,6 +1470,14 @@ this.awaitingTeleport = 0; } @@ -673,15 +668,15 @@ this.awaitingTeleportTime = this.tickCount; this.player.absMoveTo(d0, d1, d2, f, f1); this.player.connection.send(new PacketPlayOutPosition(d0 - d3, d1 - d4, d2 - d5, f - f2, f1 - f3, set, this.awaitingTeleport)); -@@ -1078,6 +1486,7 @@ +@@ -1083,6 +1486,7 @@ @Override public void handlePlayerAction(PacketPlayInBlockDig packetplayinblockdig) { - PlayerConnectionUtils.ensureRunningOnSameThread(packetplayinblockdig, this, this.player.getLevel()); + PlayerConnectionUtils.ensureRunningOnSameThread(packetplayinblockdig, this, this.player.serverLevel()); + if (this.player.isImmobile()) return; // CraftBukkit BlockPosition blockposition = packetplayinblockdig.getPos(); this.player.resetLastActionTime(); -@@ -1088,14 +1497,46 @@ +@@ -1093,14 +1497,46 @@ if (!this.player.isSpectator()) { ItemStack itemstack = this.player.getItemInHand(EnumHand.OFF_HAND); @@ -730,15 +725,15 @@ this.player.drop(false); } -@@ -1133,6 +1574,7 @@ +@@ -1138,6 +1574,7 @@ @Override public void handleUseItemOn(PacketPlayInUseItem packetplayinuseitem) { - PlayerConnectionUtils.ensureRunningOnSameThread(packetplayinuseitem, this, this.player.getLevel()); + PlayerConnectionUtils.ensureRunningOnSameThread(packetplayinuseitem, this, this.player.serverLevel()); + if (this.player.isImmobile()) return; // CraftBukkit this.player.connection.ackBlockChangesUpTo(packetplayinuseitem.getSequence()); - WorldServer worldserver = this.player.getLevel(); + WorldServer worldserver = this.player.serverLevel(); EnumHand enumhand = packetplayinuseitem.getHand(); -@@ -1156,6 +1598,7 @@ +@@ -1161,6 +1598,7 @@ if (blockposition.getY() < i) { if (this.awaitingPositionFromClient == null && this.player.distanceToSqr((double) blockposition.getX() + 0.5D, (double) blockposition.getY() + 0.5D, (double) blockposition.getZ() + 0.5D) < 64.0D && worldserver.mayInteract(this.player, blockposition)) { @@ -746,15 +741,15 @@ EnumInteractionResult enuminteractionresult = this.player.gameMode.useItemOn(this.player, worldserver, itemstack, enumhand, movingobjectpositionblock); if (enumdirection == EnumDirection.UP && !enuminteractionresult.consumesAction() && blockposition.getY() >= i - 1 && wasBlockPlacementAttempt(this.player, itemstack)) { -@@ -1184,6 +1627,7 @@ +@@ -1189,6 +1627,7 @@ @Override public void handleUseItem(PacketPlayInBlockPlace packetplayinblockplace) { - PlayerConnectionUtils.ensureRunningOnSameThread(packetplayinblockplace, this, this.player.getLevel()); + PlayerConnectionUtils.ensureRunningOnSameThread(packetplayinblockplace, this, this.player.serverLevel()); + if (this.player.isImmobile()) return; // CraftBukkit this.ackBlockChangesUpTo(packetplayinblockplace.getSequence()); - WorldServer worldserver = this.player.getLevel(); + WorldServer worldserver = this.player.serverLevel(); EnumHand enumhand = packetplayinblockplace.getHand(); -@@ -1191,6 +1635,49 @@ +@@ -1196,6 +1635,49 @@ this.player.resetLastActionTime(); if (!itemstack.isEmpty() && itemstack.isItemEnabled(worldserver.enabledFeatures())) { @@ -775,7 +770,7 @@ + float f8 = f3 * f5; + double d3 = player.gameMode.getGameModeForPlayer()== EnumGamemode.CREATIVE ? 5.0D : 4.5D; + Vec3D vec3d1 = vec3d.add((double) f7 * d3, (double) f6 * d3, (double) f8 * d3); -+ MovingObjectPosition movingobjectposition = this.player.level.clip(new RayTrace(vec3d, vec3d1, RayTrace.BlockCollisionOption.OUTLINE, RayTrace.FluidCollisionOption.NONE, player)); ++ MovingObjectPosition movingobjectposition = this.player.level().clip(new RayTrace(vec3d, vec3d1, RayTrace.BlockCollisionOption.OUTLINE, RayTrace.FluidCollisionOption.NONE, player)); + + boolean cancelled; + if (movingobjectposition == null || movingobjectposition.getType() != MovingObjectPosition.EnumMovingObjectType.BLOCK) { @@ -783,7 +778,7 @@ + cancelled = event.useItemInHand() == Event.Result.DENY; + } else { + MovingObjectPositionBlock movingobjectpositionblock = (MovingObjectPositionBlock) movingobjectposition; -+ if (player.gameMode.firedInteract && player.gameMode.interactPosition.equals(movingobjectpositionblock.getBlockPos()) && player.gameMode.interactHand == enumhand && ItemStack.tagMatches(player.gameMode.interactItemStack, itemstack)) { ++ if (player.gameMode.firedInteract && player.gameMode.interactPosition.equals(movingobjectpositionblock.getBlockPos()) && player.gameMode.interactHand == enumhand && ItemStack.isSameItemSameTags(player.gameMode.interactItemStack, itemstack)) { + cancelled = player.gameMode.interactResult; + } else { + org.bukkit.event.player.PlayerInteractEvent event = CraftEventFactory.callPlayerInteractEvent(player, Action.RIGHT_CLICK_BLOCK, movingobjectpositionblock.getBlockPos(), movingobjectpositionblock.getDirection(), itemstack, true, enumhand); @@ -804,7 +799,7 @@ EnumInteractionResult enuminteractionresult = this.player.gameMode.useItem(this.player, worldserver, itemstack, enumhand); if (enuminteractionresult.shouldSwing()) { -@@ -1211,7 +1698,7 @@ +@@ -1216,7 +1698,7 @@ Entity entity = packetplayinspectate.getEntity(worldserver); if (entity != null) { @@ -813,7 +808,7 @@ return; } } -@@ -1226,6 +1713,7 @@ +@@ -1231,6 +1713,7 @@ PlayerConnection.LOGGER.info("Disconnecting {} due to resource pack rejection", this.player.getName()); this.disconnect(IChatBaseComponent.translatable("multiplayer.requiredTexturePrompt.disconnect")); } @@ -821,7 +816,7 @@ } -@@ -1247,12 +1735,27 @@ +@@ -1252,12 +1735,27 @@ @Override public void onDisconnect(IChatBaseComponent ichatbasecomponent) { @@ -850,7 +845,7 @@ this.player.getTextFilter().leave(); if (this.isSingleplayerOwner()) { PlayerConnection.LOGGER.info("Stopping singleplayer server as player logged out"); -@@ -1275,6 +1778,15 @@ +@@ -1280,6 +1778,15 @@ } public void send(Packet packet, @Nullable PacketSendListener packetsendlistener) { @@ -866,10 +861,10 @@ try { this.connection.send(packet, packetsendlistener); } catch (Throwable throwable) { -@@ -1291,7 +1803,16 @@ +@@ -1296,7 +1803,16 @@ @Override public void handleSetCarriedItem(PacketPlayInHeldItemSlot packetplayinhelditemslot) { - PlayerConnectionUtils.ensureRunningOnSameThread(packetplayinhelditemslot, this, this.player.getLevel()); + PlayerConnectionUtils.ensureRunningOnSameThread(packetplayinhelditemslot, this, this.player.serverLevel()); + if (this.player.isImmobile()) return; // CraftBukkit if (packetplayinhelditemslot.getSlot() >= 0 && packetplayinhelditemslot.getSlot() < PlayerInventory.getSelectionSize()) { + PlayerItemHeldEvent event = new PlayerItemHeldEvent(this.getCraftPlayer(), this.player.getInventory().selected, packetplayinhelditemslot.getSlot()); @@ -883,7 +878,7 @@ if (this.player.getInventory().selected != packetplayinhelditemslot.getSlot() && this.player.getUsedItemHand() == EnumHand.MAIN_HAND) { this.player.stopUsingItem(); } -@@ -1300,18 +1821,25 @@ +@@ -1305,18 +1821,25 @@ this.player.resetLastActionTime(); } else { PlayerConnection.LOGGER.warn("{} tried to set an invalid carried item", this.player.getName().getString()); @@ -910,7 +905,7 @@ PlayerChatMessage playerchatmessage; try { -@@ -1329,9 +1857,9 @@ +@@ -1334,9 +1857,9 @@ PlayerChatMessage playerchatmessage1 = playerchatmessage.withUnsignedContent((IChatBaseComponent) completablefuture1.join()).filter(((FilteredText) completablefuture.join()).mask()); this.broadcastChatMessage(playerchatmessage1); @@ -922,7 +917,7 @@ } } -@@ -1346,6 +1874,12 @@ +@@ -1351,6 +1874,12 @@ if (optional.isPresent()) { this.server.submit(() -> { @@ -935,7 +930,7 @@ this.performChatCommand(serverboundchatcommandpacket, (LastSeenMessages) optional.get()); this.detectRateSpam(); }); -@@ -1355,12 +1889,25 @@ +@@ -1360,12 +1889,25 @@ } private void performChatCommand(ServerboundChatCommandPacket serverboundchatcommandpacket, LastSeenMessages lastseenmessages) { @@ -963,7 +958,7 @@ } catch (SignedMessageChain.a signedmessagechain_a) { this.handleMessageDecodeFailure(signedmessagechain_a); return; -@@ -1368,10 +1915,10 @@ +@@ -1373,10 +1915,10 @@ CommandSigningContext.a commandsigningcontext_a = new CommandSigningContext.a(map); @@ -976,7 +971,7 @@ } private void handleMessageDecodeFailure(SignedMessageChain.a signedmessagechain_a) { -@@ -1412,7 +1959,7 @@ +@@ -1417,7 +1959,7 @@ } else { Optional optional = this.unpackAndApplyLastSeen(lastseenmessages_b); @@ -985,7 +980,7 @@ this.send(new ClientboundSystemChatPacket(IChatBaseComponent.translatable("chat.disabled.options").withStyle(EnumChatFormat.RED), false)); return Optional.empty(); } else { -@@ -1460,6 +2007,122 @@ +@@ -1465,6 +2007,122 @@ return false; } @@ -1108,7 +1103,7 @@ private PlayerChatMessage getSignedMessage(PacketPlayInChat packetplayinchat, LastSeenMessages lastseenmessages) throws SignedMessageChain.a { SignedMessageBody signedmessagebody = new SignedMessageBody(packetplayinchat.message(), packetplayinchat.timeStamp(), packetplayinchat.salt(), lastseenmessages); -@@ -1467,13 +2130,33 @@ +@@ -1472,13 +2130,33 @@ } private void broadcastChatMessage(PlayerChatMessage playerchatmessage) { @@ -1145,10 +1140,10 @@ this.disconnect(IChatBaseComponent.translatable("disconnect.spam")); } -@@ -1495,13 +2178,59 @@ +@@ -1500,13 +2178,59 @@ @Override public void handleAnimate(PacketPlayInArmAnimation packetplayinarmanimation) { - PlayerConnectionUtils.ensureRunningOnSameThread(packetplayinarmanimation, this, this.player.getLevel()); + PlayerConnectionUtils.ensureRunningOnSameThread(packetplayinarmanimation, this, this.player.serverLevel()); + if (this.player.isImmobile()) return; // CraftBukkit this.player.resetLastActionTime(); + // CraftBukkit start - Raytrace to look for 'rogue armswings' @@ -1157,11 +1152,11 @@ + double d0 = this.player.getX(); + double d1 = this.player.getY() + (double) this.player.getEyeHeight(); + double d2 = this.player.getZ(); -+ Location origin = new Location(this.player.level.getWorld(), d0, d1, d2, f2, f1); ++ Location origin = new Location(this.player.level().getWorld(), d0, d1, d2, f2, f1); + + double d3 = player.gameMode.getGameModeForPlayer() == EnumGamemode.CREATIVE ? 5.0D : 4.5D; + // SPIGOT-5607: Only call interact event if no block or entity is being clicked. Use bukkit ray trace method, because it handles blocks and entities at the same time -+ org.bukkit.util.RayTraceResult result = this.player.level.getWorld().rayTrace(origin, origin.getDirection(), d3, org.bukkit.FluidCollisionMode.NEVER, false, 0.1, entity -> entity != this.player.getBukkitEntity() && this.player.getBukkitEntity().canSee(entity)); ++ org.bukkit.util.RayTraceResult result = this.player.level().getWorld().rayTrace(origin, origin.getDirection(), d3, org.bukkit.FluidCollisionMode.NEVER, false, 0.1, entity -> entity != this.player.getBukkitEntity() && this.player.getBukkitEntity().canSee(entity)); + + if (result == null) { + CraftEventFactory.callPlayerInteractEvent(this.player, Action.LEFT_CLICK_AIR, this.player.getInventory().getSelected(), EnumHand.MAIN_HAND); @@ -1178,7 +1173,7 @@ @Override public void handlePlayerCommand(PacketPlayInEntityAction packetplayinentityaction) { - PlayerConnectionUtils.ensureRunningOnSameThread(packetplayinentityaction, this, this.player.getLevel()); + PlayerConnectionUtils.ensureRunningOnSameThread(packetplayinentityaction, this, this.player.serverLevel()); + // CraftBukkit start + if (this.player.isRemoved()) return; + switch (packetplayinentityaction.getAction()) { @@ -1205,7 +1200,7 @@ this.player.resetLastActionTime(); Entity entity; IJumpable ijumpable; -@@ -1583,6 +2312,12 @@ +@@ -1588,6 +2312,12 @@ } public void sendPlayerChatMessage(PlayerChatMessage playerchatmessage, ChatMessageType.a chatmessagetype_a) { @@ -1215,18 +1210,18 @@ + return; + } + // CraftBukkit end - this.send(new ClientboundPlayerChatPacket(playerchatmessage.link().sender(), playerchatmessage.link().index(), playerchatmessage.signature(), playerchatmessage.signedBody().pack(this.messageSignatureCache), playerchatmessage.unsignedContent(), playerchatmessage.filterMask(), chatmessagetype_a.toNetwork(this.player.level.registryAccess()))); + this.send(new ClientboundPlayerChatPacket(playerchatmessage.link().sender(), playerchatmessage.link().index(), playerchatmessage.signature(), playerchatmessage.signedBody().pack(this.messageSignatureCache), playerchatmessage.unsignedContent(), playerchatmessage.filterMask(), chatmessagetype_a.toNetwork(this.player.level().registryAccess()))); this.addPendingMessage(playerchatmessage); } -@@ -1598,6 +2333,7 @@ +@@ -1603,6 +2333,7 @@ @Override public void handleInteract(PacketPlayInUseEntity packetplayinuseentity) { - PlayerConnectionUtils.ensureRunningOnSameThread(packetplayinuseentity, this, this.player.getLevel()); + PlayerConnectionUtils.ensureRunningOnSameThread(packetplayinuseentity, this, this.player.serverLevel()); + if (this.player.isImmobile()) return; // CraftBukkit - final WorldServer worldserver = this.player.getLevel(); + final WorldServer worldserver = this.player.serverLevel(); final Entity entity = packetplayinuseentity.getTarget(worldserver); -@@ -1612,13 +2348,51 @@ +@@ -1617,13 +2348,51 @@ if (axisalignedbb.distanceToSqr(this.player.getEyePosition()) < PlayerConnection.MAX_INTERACTION_DISTANCE) { packetplayinuseentity.dispatch(new PacketPlayInUseEntity.c() { @@ -1279,7 +1274,7 @@ if (enuminteractionresult.consumesAction()) { CriterionTriggers.PLAYER_INTERACTED_WITH_ENTITY.trigger(PlayerConnection.this.player, itemstack1, entity); if (enuminteractionresult.shouldSwing()) { -@@ -1631,23 +2405,29 @@ +@@ -1636,23 +2405,29 @@ @Override public void onInteraction(EnumHand enumhand) { @@ -1312,7 +1307,7 @@ } } else { PlayerConnection.this.disconnect(IChatBaseComponent.translatable("multiplayer.disconnect.invalid_entity_attacked")); -@@ -1670,14 +2450,14 @@ +@@ -1675,14 +2450,14 @@ case PERFORM_RESPAWN: if (this.player.wonGame) { this.player.wonGame = false; @@ -1328,11 +1323,11 @@ + this.player = this.server.getPlayerList().respawn(this.player, false, RespawnReason.DEATH); if (this.server.isHardcore()) { this.player.setGameMode(EnumGamemode.SPECTATOR); - ((GameRules.GameRuleBoolean) this.player.getLevel().getGameRules().getRule(GameRules.RULE_SPECTATORSGENERATECHUNKS)).set(false, this.server); -@@ -1693,15 +2473,21 @@ + ((GameRules.GameRuleBoolean) this.player.level().getGameRules().getRule(GameRules.RULE_SPECTATORSGENERATECHUNKS)).set(false, this.server); +@@ -1698,15 +2473,21 @@ @Override public void handleContainerClose(PacketPlayInCloseWindow packetplayinclosewindow) { - PlayerConnectionUtils.ensureRunningOnSameThread(packetplayinclosewindow, this, this.player.getLevel()); + PlayerConnectionUtils.ensureRunningOnSameThread(packetplayinclosewindow, this, this.player.serverLevel()); + + if (this.player.isImmobile()) return; // CraftBukkit + CraftEventFactory.handleInventoryCloseEvent(this.player); // CraftBukkit @@ -1342,7 +1337,7 @@ @Override public void handleContainerClick(PacketPlayInWindowClick packetplayinwindowclick) { - PlayerConnectionUtils.ensureRunningOnSameThread(packetplayinwindowclick, this, this.player.getLevel()); + PlayerConnectionUtils.ensureRunningOnSameThread(packetplayinwindowclick, this, this.player.serverLevel()); + if (this.player.isImmobile()) return; // CraftBukkit this.player.resetLastActionTime(); - if (this.player.containerMenu.containerId == packetplayinwindowclick.getContainerId()) { @@ -1353,7 +1348,7 @@ this.player.containerMenu.sendAllDataToRemote(); } else if (!this.player.containerMenu.stillValid(this.player)) { PlayerConnection.LOGGER.debug("Player {} interacted with invalid menu {}", this.player, this.player.containerMenu); -@@ -1714,7 +2500,284 @@ +@@ -1719,7 +2500,284 @@ boolean flag = packetplayinwindowclick.getStateId() != this.player.containerMenu.getStateId(); this.player.containerMenu.suppressRemoteUpdates(); @@ -1400,7 +1395,7 @@ + if (cursor.isEmpty()) { + action = packetplayinwindowclick.getButtonNum() == 0 ? InventoryAction.PICKUP_ALL : InventoryAction.PICKUP_HALF; + } else if (slot.mayPlace(cursor)) { -+ if (clickedItem.sameItem(cursor) && ItemStack.tagMatches(clickedItem, cursor)) { ++ if (ItemStack.isSameItemSameTags(clickedItem, cursor)) { + int toPlace = packetplayinwindowclick.getButtonNum() == 0 ? cursor.getCount() : 1; + toPlace = Math.min(toPlace, clickedItem.getMaxStackSize() - clickedItem.getCount()); + toPlace = Math.min(toPlace, slot.container.getMaxStackSize() - clickedItem.getCount()); @@ -1416,7 +1411,7 @@ + } else if (cursor.getCount() <= slot.getMaxStackSize()) { + action = InventoryAction.SWAP_WITH_CURSOR; + } -+ } else if (cursor.getItem() == clickedItem.getItem() && ItemStack.tagMatches(cursor, clickedItem)) { ++ } else if (ItemStack.isSameItemSameTags(cursor, clickedItem)) { + if (clickedItem.getCount() >= 0) { + if (clickedItem.getCount() + cursor.getCount() <= cursor.getMaxStackSize()) { + // As of 1.5, this is result slots only @@ -1639,15 +1634,15 @@ ObjectIterator objectiterator = Int2ObjectMaps.fastIterable(packetplayinwindowclick.getChangedSlots()).iterator(); while (objectiterator.hasNext()) { -@@ -1754,6 +2817,7 @@ +@@ -1759,6 +2817,7 @@ @Override public void handleContainerButtonClick(PacketPlayInEnchantItem packetplayinenchantitem) { - PlayerConnectionUtils.ensureRunningOnSameThread(packetplayinenchantitem, this, this.player.getLevel()); + PlayerConnectionUtils.ensureRunningOnSameThread(packetplayinenchantitem, this, this.player.serverLevel()); + if (this.player.isImmobile()) return; // CraftBukkit this.player.resetLastActionTime(); if (this.player.containerMenu.containerId == packetplayinenchantitem.getContainerId() && !this.player.isSpectator()) { if (!this.player.containerMenu.stillValid(this.player)) { -@@ -1796,6 +2860,43 @@ +@@ -1801,6 +2860,43 @@ boolean flag1 = packetplayinsetcreativeslot.getSlotNum() >= 1 && packetplayinsetcreativeslot.getSlotNum() <= 45; boolean flag2 = itemstack.isEmpty() || itemstack.getDamageValue() >= 0 && itemstack.getCount() <= 64 && !itemstack.isEmpty(); @@ -1691,66 +1686,26 @@ if (flag1 && flag2) { this.player.inventoryMenu.getSlot(packetplayinsetcreativeslot.getSlotNum()).setByPlayer(itemstack); -@@ -1818,6 +2919,7 @@ +@@ -1823,6 +2919,7 @@ } private void updateSignText(PacketPlayInUpdateSign packetplayinupdatesign, List list) { + if (this.player.isImmobile()) return; // CraftBukkit this.player.resetLastActionTime(); - WorldServer worldserver = this.player.getLevel(); + WorldServer worldserver = this.player.serverLevel(); BlockPosition blockposition = packetplayinupdatesign.getPos(); -@@ -1834,18 +2936,37 @@ - - if (!tileentitysign.isEditable() || !this.player.getUUID().equals(tileentitysign.getPlayerWhoMayEdit())) { - PlayerConnection.LOGGER.warn("Player {} just tried to change non-editable sign", this.player.getName().getString()); -+ this.send(tileentity.getUpdatePacket()); // CraftBukkit - return; - } - -+ // CraftBukkit start -+ Player player = this.player.getBukkitEntity(); -+ int x = packetplayinupdatesign.getPos().getX(); -+ int y = packetplayinupdatesign.getPos().getY(); -+ int z = packetplayinupdatesign.getPos().getZ(); -+ String[] lines = new String[4]; -+ - for (int i = 0; i < list.size(); ++i) { - FilteredText filteredtext = (FilteredText) list.get(i); - - if (this.player.isTextFilteringEnabled()) { -- tileentitysign.setMessage(i, IChatBaseComponent.literal(filteredtext.filteredOrEmpty())); -+ lines[i] = EnumChatFormat.stripFormatting(filteredtext.filteredOrEmpty()); - } else { -- tileentitysign.setMessage(i, IChatBaseComponent.literal(filteredtext.raw()), IChatBaseComponent.literal(filteredtext.filteredOrEmpty())); -+ lines[i] = EnumChatFormat.stripFormatting(filteredtext.raw()); -+ } -+ } -+ SignChangeEvent event = new SignChangeEvent((org.bukkit.craftbukkit.block.CraftBlock) player.getWorld().getBlockAt(x, y, z), this.player.getBukkitEntity(), lines); -+ this.cserver.getPluginManager().callEvent(event); -+ -+ if (!event.isCancelled()) { -+ IChatBaseComponent[] components = org.bukkit.craftbukkit.block.CraftSign.sanitizeLines(event.getLines()); -+ for (int i = 0; i < components.length; i++) { -+ tileentitysign.setMessage(i, components[i]); - } -+ tileentitysign.isEditable = false; - } -+ // CraftBukkit end - - tileentitysign.setChanged(); - worldserver.sendBlockUpdated(blockposition, iblockdata, iblockdata, 3); -@@ -1855,6 +2976,7 @@ +@@ -1843,6 +2940,7 @@ @Override public void handleKeepAlive(PacketPlayInKeepAlive packetplayinkeepalive) { -+ PlayerConnectionUtils.ensureRunningOnSameThread(packetplayinkeepalive, this, this.player.getLevel()); // CraftBukkit ++ PlayerConnectionUtils.ensureRunningOnSameThread(packetplayinkeepalive, this, this.player.serverLevel()); // CraftBukkit if (this.keepAlivePending && packetplayinkeepalive.getId() == this.keepAliveChallenge) { int i = (int) (SystemUtils.getMillis() - this.keepAliveTime); -@@ -1869,7 +2991,17 @@ +@@ -1857,7 +2955,17 @@ @Override public void handlePlayerAbilities(PacketPlayInAbilities packetplayinabilities) { - PlayerConnectionUtils.ensureRunningOnSameThread(packetplayinabilities, this, this.player.getLevel()); + PlayerConnectionUtils.ensureRunningOnSameThread(packetplayinabilities, this, this.player.serverLevel()); - this.player.getAbilities().flying = packetplayinabilities.isFlying() && this.player.getAbilities().mayfly; + // CraftBukkit start + if (this.player.getAbilities().mayfly && this.player.getAbilities().flying != packetplayinabilities.isFlying()) { @@ -1766,7 +1721,7 @@ } @Override -@@ -1878,8 +3010,50 @@ +@@ -1866,8 +2974,50 @@ this.player.updateOptions(packetplayinsettings); } @@ -1778,7 +1733,7 @@ + + @Override + public void handleCustomPayload(PacketPlayInCustomPayload packetplayincustompayload) { -+ PlayerConnectionUtils.ensureRunningOnSameThread(packetplayincustompayload, this, this.player.getLevel()); ++ PlayerConnectionUtils.ensureRunningOnSameThread(packetplayincustompayload, this, this.player.serverLevel()); + if (packetplayincustompayload.identifier.equals(CUSTOM_REGISTER)) { + try { + String channels = packetplayincustompayload.data.toString(com.google.common.base.Charsets.UTF_8); diff --git a/paper-server/nms-patches/net/minecraft/server/packs/repository/ResourcePackLoader.patch b/paper-server/nms-patches/net/minecraft/server/packs/repository/ResourcePackLoader.patch deleted file mode 100644 index fc4a06aa80..0000000000 --- a/paper-server/nms-patches/net/minecraft/server/packs/repository/ResourcePackLoader.patch +++ /dev/null @@ -1,29 +0,0 @@ ---- a/net/minecraft/server/packs/repository/ResourcePackLoader.java -+++ b/net/minecraft/server/packs/repository/ResourcePackLoader.java -@@ -20,7 +20,7 @@ - - private static final Logger LOGGER = LogUtils.getLogger(); - private final String id; -- private final ResourcePackLoader.c resources; -+ public final ResourcePackLoader.c resources; // PAIL private -> public - private final IChatBaseComponent title; - private final IChatBaseComponent description; - private final EnumResourcePackVersion compatibility; -@@ -59,7 +59,7 @@ - try { - IResourcePack iresourcepack = resourcepackloader_c.open(s); - -- ResourcePackLoader.a resourcepackloader_a; -+ ResourcePackLoader.a resourcepackloader_a = null; // CraftBukkit - decompile fix - label53: - { - FeatureFlagsMetadataSection featureflagsmetadatasection; -@@ -93,7 +93,7 @@ - iresourcepack.close(); - } - -- return featureflagsmetadatasection; -+ return resourcepackloader_a; // CraftBukkit - decompile fix - } - - if (iresourcepack != null) { diff --git a/paper-server/nms-patches/net/minecraft/server/players/PlayerList.patch b/paper-server/nms-patches/net/minecraft/server/players/PlayerList.patch index d72104efc8..0e4a41bc57 100644 --- a/paper-server/nms-patches/net/minecraft/server/players/PlayerList.patch +++ b/paper-server/nms-patches/net/minecraft/server/players/PlayerList.patch @@ -73,8 +73,8 @@ this.server = minecraftserver; this.registries = layeredregistryaccess; this.synchronizedRegistries = (new IRegistryCustom.c(RegistrySynchronization.networkedRegistries(layeredregistryaccess))).freeze(); -@@ -161,9 +193,15 @@ - usercache.add(gameprofile); +@@ -168,9 +200,15 @@ + NBTTagCompound nbttagcompound = this.load(entityplayer); ResourceKey resourcekey; + // CraftBukkit start - Better rename detection @@ -90,7 +90,7 @@ Logger logger = PlayerList.LOGGER; Objects.requireNonNull(logger); -@@ -190,7 +228,8 @@ +@@ -197,7 +235,8 @@ s1 = networkmanager.getRemoteAddress().toString(); } @@ -100,15 +100,15 @@ WorldData worlddata = worldserver1.getLevelData(); entityplayer.loadGameTypes(nbttagcompound); -@@ -200,6 +239,7 @@ +@@ -207,6 +246,7 @@ boolean flag1 = gamerules.getBoolean(GameRules.RULE_REDUCEDDEBUGINFO); - playerconnection.send(new PacketPlayOutLogin(entityplayer.getId(), worlddata.isHardcore(), entityplayer.gameMode.getGameModeForPlayer(), entityplayer.gameMode.getPreviousGameModeForPlayer(), this.server.levelKeys(), this.synchronizedRegistries, worldserver1.dimensionTypeId(), worldserver1.dimension(), BiomeManager.obfuscateSeed(worldserver1.getSeed()), this.getMaxPlayers(), this.viewDistance, this.simulationDistance, flag1, !flag, worldserver1.isDebug(), worldserver1.isFlat(), entityplayer.getLastDeathLocation())); + playerconnection.send(new PacketPlayOutLogin(entityplayer.getId(), worlddata.isHardcore(), entityplayer.gameMode.getGameModeForPlayer(), entityplayer.gameMode.getPreviousGameModeForPlayer(), this.server.levelKeys(), this.synchronizedRegistries, worldserver1.dimensionTypeId(), worldserver1.dimension(), BiomeManager.obfuscateSeed(worldserver1.getSeed()), this.getMaxPlayers(), this.viewDistance, this.simulationDistance, flag1, !flag, worldserver1.isDebug(), worldserver1.isFlat(), entityplayer.getLastDeathLocation(), entityplayer.getPortalCooldown())); + entityplayer.getBukkitEntity().sendSupportedChannels(); // CraftBukkit playerconnection.send(new ClientboundUpdateEnabledFeaturesPacket(FeatureFlags.REGISTRY.toNames(worldserver1.enabledFeatures()))); playerconnection.send(new PacketPlayOutCustomPayload(PacketPlayOutCustomPayload.BRAND, (new PacketDataSerializer(Unpooled.buffer())).writeUtf(this.getServer().getServerModName()))); playerconnection.send(new PacketPlayOutServerDifficulty(worlddata.getDifficulty(), worlddata.isDifficultyLocked())); -@@ -219,8 +259,10 @@ +@@ -226,8 +266,10 @@ } else { ichatmutablecomponent = IChatBaseComponent.translatable("multiplayer.player.joined.renamed", entityplayer.getDisplayName(), s); } @@ -120,7 +120,7 @@ playerconnection.teleport(entityplayer.getX(), entityplayer.getY(), entityplayer.getZ(), entityplayer.getYRot(), entityplayer.getXRot()); ServerPing serverping = this.server.getStatus(); -@@ -231,10 +273,61 @@ +@@ -238,10 +280,61 @@ entityplayer.connection.send(ClientboundPlayerInfoUpdatePacket.createPlayerInitializing(this.players)); this.players.add(entityplayer); this.playersByUUID.put(entityplayer.getUUID(), entityplayer); @@ -175,17 +175,17 @@ - this.server.getCustomBossEvents().onPlayerConnect(entityplayer); + + // CraftBukkit start - Only add if the player wasn't moved in the event -+ if (entityplayer.level == worldserver1 && !worldserver1.players().contains(entityplayer)) { ++ if (entityplayer.level() == worldserver1 && !worldserver1.players().contains(entityplayer)) { + worldserver1.addNewPlayer(entityplayer); + this.server.getCustomBossEvents().onPlayerConnect(entityplayer); + } + -+ worldserver1 = entityplayer.getLevel(); // CraftBukkit - Update in case join event changed it ++ worldserver1 = entityplayer.serverLevel(); // CraftBukkit - Update in case join event changed it + // CraftBukkit end this.server.getServerResourcePack().ifPresent((minecraftserver_serverresourcepackinfo) -> { entityplayer.sendTexturePack(minecraftserver_serverresourcepackinfo.url(), minecraftserver_serverresourcepackinfo.hash(), minecraftserver_serverresourcepackinfo.isRequired(), minecraftserver_serverresourcepackinfo.prompt()); }); -@@ -248,8 +341,11 @@ +@@ -255,8 +348,11 @@ if (nbttagcompound != null && nbttagcompound.contains("RootVehicle", 10)) { NBTTagCompound nbttagcompound1 = nbttagcompound.getCompound("RootVehicle"); @@ -199,7 +199,7 @@ }); if (entity != null) { -@@ -292,6 +388,8 @@ +@@ -299,6 +395,8 @@ } entityplayer.initInventoryMenu(); @@ -208,7 +208,7 @@ } public void updateEntireScoreboard(ScoreboardServer scoreboardserver, EntityPlayer entityplayer) { -@@ -324,30 +422,31 @@ +@@ -331,30 +429,31 @@ } public void addWorldborderListener(WorldServer worldserver) { @@ -245,7 +245,7 @@ } @Override -@@ -375,14 +474,15 @@ +@@ -382,14 +481,15 @@ } protected void save(EntityPlayer entityplayer) { @@ -263,13 +263,13 @@ if (advancementdataplayer != null) { advancementdataplayer.save(); -@@ -390,10 +490,24 @@ +@@ -397,10 +497,24 @@ } - public void remove(EntityPlayer entityplayer) { + public String remove(EntityPlayer entityplayer) { // CraftBukkit - return string - WorldServer worldserver = entityplayer.getLevel(); + WorldServer worldserver = entityplayer.serverLevel(); entityplayer.awardStat(StatisticList.LEAVE_GAME); + @@ -289,7 +289,7 @@ this.save(entityplayer); if (entityplayer.isPassenger()) { Entity entity = entityplayer.getRootVehicle(); -@@ -417,18 +531,66 @@ +@@ -424,18 +538,66 @@ if (entityplayer1 == entityplayer) { this.playersByUUID.remove(uuid); @@ -362,7 +362,7 @@ GameProfileBanEntry gameprofilebanentry = (GameProfileBanEntry) this.bans.get(gameprofile); ichatmutablecomponent = IChatBaseComponent.translatable("multiplayer.disconnect.banned.reason", gameprofilebanentry.getReason()); -@@ -436,10 +598,12 @@ +@@ -443,10 +605,12 @@ ichatmutablecomponent.append((IChatBaseComponent) IChatBaseComponent.translatable("multiplayer.disconnect.banned.expiration", PlayerList.BAN_DATE_FORMAT.format(gameprofilebanentry.getExpires()))); } @@ -378,7 +378,7 @@ IpBanEntry ipbanentry = this.ipBans.get(socketaddress); ichatmutablecomponent = IChatBaseComponent.translatable("multiplayer.disconnect.banned_ip.reason", ipbanentry.getReason()); -@@ -447,13 +611,25 @@ +@@ -454,13 +618,25 @@ ichatmutablecomponent.append((IChatBaseComponent) IChatBaseComponent.translatable("multiplayer.disconnect.banned_ip.expiration", PlayerList.BAN_DATE_FORMAT.format(ipbanentry.getExpires()))); } @@ -407,7 +407,7 @@ UUID uuid = UUIDUtil.getOrCreatePlayerUUID(gameprofile); List list = Lists.newArrayList(); -@@ -480,14 +656,24 @@ +@@ -487,14 +663,24 @@ } return new EntityPlayer(this.server, this.server.overworld(), gameprofile); @@ -425,7 +425,7 @@ + public EntityPlayer respawn(EntityPlayer entityplayer, WorldServer worldserver, boolean flag, Location location, boolean avoidSuffocation, RespawnReason reason) { + entityplayer.stopRiding(); // CraftBukkit this.players.remove(entityplayer); - entityplayer.getLevel().removePlayerImmediately(entityplayer, Entity.RemovalReason.DISCARDED); + entityplayer.serverLevel().removePlayerImmediately(entityplayer, Entity.RemovalReason.DISCARDED); BlockPosition blockposition = entityplayer.getRespawnPosition(); float f = entityplayer.getRespawnAngle(); boolean flag1 = entityplayer.isRespawnForced(); @@ -433,7 +433,7 @@ WorldServer worldserver = this.server.getLevel(entityplayer.getRespawnDimension()); Optional optional; -@@ -499,6 +685,11 @@ +@@ -506,6 +692,11 @@ WorldServer worldserver1 = worldserver != null && optional.isPresent() ? worldserver : this.server.overworld(); EntityPlayer entityplayer1 = new EntityPlayer(this.server, worldserver1, entityplayer.getGameProfile()); @@ -445,7 +445,7 @@ entityplayer1.connection = entityplayer.connection; entityplayer1.restoreFrom(entityplayer, flag); -@@ -514,50 +705,112 @@ +@@ -521,50 +712,112 @@ boolean flag2 = false; @@ -526,16 +526,16 @@ } int i = flag ? 1 : 0; -- WorldData worlddata = entityplayer1.level.getLevelData(); +- WorldData worlddata = entityplayer1.level().getLevelData(); + // CraftBukkit start + WorldData worlddata = worldserver1.getLevelData(); -+ entityplayer1.connection.send(new PacketPlayOutRespawn(worldserver1.dimensionTypeId(), worldserver1.dimension(), BiomeManager.obfuscateSeed(worldserver1.getSeed()), entityplayer1.gameMode.getGameModeForPlayer(), entityplayer1.gameMode.getPreviousGameModeForPlayer(), worldserver1.isDebug(), worldserver1.isFlat(), (byte) i, entityplayer1.getLastDeathLocation())); ++ entityplayer1.connection.send(new PacketPlayOutRespawn(worldserver1.dimensionTypeId(), worldserver1.dimension(), BiomeManager.obfuscateSeed(worldserver1.getSeed()), entityplayer1.gameMode.getGameModeForPlayer(), entityplayer1.gameMode.getPreviousGameModeForPlayer(), worldserver1.isDebug(), worldserver1.isFlat(), (byte) i, entityplayer1.getLastDeathLocation(), entityplayer1.getPortalCooldown())); + entityplayer1.spawnIn(worldserver1); + entityplayer1.unsetRemoved(); + entityplayer1.connection.teleport(CraftLocation.toBukkit(entityplayer1.position(), worldserver1.getWorld(), entityplayer1.getYRot(), entityplayer1.getXRot())); + entityplayer1.setShiftKeyDown(false); -- entityplayer1.connection.send(new PacketPlayOutRespawn(entityplayer1.level.dimensionTypeId(), entityplayer1.level.dimension(), BiomeManager.obfuscateSeed(entityplayer1.getLevel().getSeed()), entityplayer1.gameMode.getGameModeForPlayer(), entityplayer1.gameMode.getPreviousGameModeForPlayer(), entityplayer1.getLevel().isDebug(), entityplayer1.getLevel().isFlat(), (byte) i, entityplayer1.getLastDeathLocation())); +- entityplayer1.connection.send(new PacketPlayOutRespawn(entityplayer1.level().dimensionTypeId(), entityplayer1.level().dimension(), BiomeManager.obfuscateSeed(entityplayer1.serverLevel().getSeed()), entityplayer1.gameMode.getGameModeForPlayer(), entityplayer1.gameMode.getPreviousGameModeForPlayer(), entityplayer1.level().isDebug(), entityplayer1.serverLevel().isFlat(), (byte) i, entityplayer1.getLastDeathLocation(), entityplayer1.getPortalCooldown())); - entityplayer1.connection.teleport(entityplayer1.getX(), entityplayer1.getY(), entityplayer1.getZ(), entityplayer1.getYRot(), entityplayer1.getXRot()); + // entityplayer1.connection.teleport(entityplayer1.getX(), entityplayer1.getY(), entityplayer1.getZ(), entityplayer1.getYRot(), entityplayer1.getXRot()); entityplayer1.connection.send(new PacketPlayOutSpawnPosition(worldserver1.getSharedSpawnPos(), worldserver1.getSharedSpawnAngle())); @@ -581,7 +581,7 @@ return entityplayer1; } -@@ -570,7 +823,18 @@ +@@ -577,7 +830,18 @@ public void tick() { if (++this.sendAllPlayerInfoIn > 600) { @@ -601,7 +601,7 @@ this.sendAllPlayerInfoIn = 0; } -@@ -587,6 +851,25 @@ +@@ -594,6 +858,25 @@ } @@ -627,7 +627,7 @@ public void broadcastAll(Packet packet, ResourceKey resourcekey) { Iterator iterator = this.players.iterator(); -@@ -665,7 +948,7 @@ +@@ -672,7 +955,7 @@ } public void deop(GameProfile gameprofile) { @@ -636,7 +636,7 @@ EntityPlayer entityplayer = this.getPlayer(gameprofile.getId()); if (entityplayer != null) { -@@ -689,6 +972,7 @@ +@@ -696,6 +979,7 @@ entityplayer.connection.send(new PacketPlayOutEntityStatus(entityplayer, b0)); } @@ -644,7 +644,7 @@ this.server.getCommands().sendCommands(entityplayer); } -@@ -721,6 +1005,12 @@ +@@ -728,6 +1012,12 @@ for (int i = 0; i < this.players.size(); ++i) { EntityPlayer entityplayer = (EntityPlayer) this.players.get(i); @@ -654,15 +654,15 @@ + } + // CraftBukkit end + - if (entityplayer != entityhuman && entityplayer.level.dimension() == resourcekey) { + if (entityplayer != entityhuman && entityplayer.level().dimension() == resourcekey) { double d4 = d0 - entityplayer.getX(); double d5 = d1 - entityplayer.getY(); -@@ -760,23 +1050,35 @@ +@@ -767,23 +1057,35 @@ public void reloadWhiteList() {} public void sendLevelInfo(EntityPlayer entityplayer, WorldServer worldserver) { - WorldBorder worldborder = this.server.overworld().getWorldBorder(); -+ WorldBorder worldborder = entityplayer.level.getWorldBorder(); // CraftBukkit ++ WorldBorder worldborder = entityplayer.level().getWorldBorder(); // CraftBukkit entityplayer.connection.send(new ClientboundInitializeBorderPacket(worldborder)); entityplayer.connection.send(new PacketPlayOutUpdateTime(worldserver.getGameTime(), worldserver.getDayTime(), worldserver.getGameRules().getBoolean(GameRules.RULE_DAYLIGHT))); @@ -690,15 +690,15 @@ + entityplayer.getEntityData().refresh(entityplayer); // CraftBukkkit - SPIGOT-7218: sync metadata entityplayer.connection.send(new PacketPlayOutHeldItemSlot(entityplayer.getInventory().selected)); + // CraftBukkit start - from GameRules -+ int i = entityplayer.level.getGameRules().getBoolean(GameRules.RULE_REDUCEDDEBUGINFO) ? 22 : 23; ++ int i = entityplayer.level().getGameRules().getBoolean(GameRules.RULE_REDUCEDDEBUGINFO) ? 22 : 23; + entityplayer.connection.send(new PacketPlayOutEntityStatus(entityplayer, (byte) i)); -+ float immediateRespawn = entityplayer.level.getGameRules().getBoolean(GameRules.RULE_DO_IMMEDIATE_RESPAWN) ? 1.0F: 0.0F; ++ float immediateRespawn = entityplayer.level().getGameRules().getBoolean(GameRules.RULE_DO_IMMEDIATE_RESPAWN) ? 1.0F: 0.0F; + entityplayer.connection.send(new PacketPlayOutGameStateChange(PacketPlayOutGameStateChange.IMMEDIATE_RESPAWN, immediateRespawn)); + // CraftBukkit end } public int getPlayerCount() { -@@ -832,12 +1134,22 @@ +@@ -839,12 +1141,22 @@ } public void removeAll() { @@ -723,7 +723,7 @@ public void broadcastSystemMessage(IChatBaseComponent ichatbasecomponent, boolean flag) { this.broadcastSystemMessage(ichatbasecomponent, (entityplayer) -> { return ichatbasecomponent; -@@ -895,16 +1207,23 @@ +@@ -902,16 +1214,23 @@ return playerchatmessage.hasSignature() && !playerchatmessage.hasExpiredServer(Instant.now()); } @@ -751,7 +751,7 @@ Path path = file2.toPath(); if (FileUtils.isPathNormalized(path) && FileUtils.isPathPortable(path) && path.startsWith(file.getPath()) && file2.isFile()) { -@@ -913,7 +1232,7 @@ +@@ -920,7 +1239,7 @@ } serverstatisticmanager = new ServerStatisticManager(this.server, file1); @@ -760,7 +760,7 @@ } return serverstatisticmanager; -@@ -921,13 +1240,13 @@ +@@ -928,13 +1247,13 @@ public AdvancementDataPlayer getPlayerAdvancements(EntityPlayer entityplayer) { UUID uuid = entityplayer.getUUID(); @@ -776,7 +776,7 @@ } advancementdataplayer.setPlayer(entityplayer); -@@ -978,13 +1297,20 @@ +@@ -985,13 +1304,20 @@ } public void reloadResources() { diff --git a/paper-server/nms-patches/net/minecraft/stats/RecipeBookServer.patch b/paper-server/nms-patches/net/minecraft/stats/RecipeBookServer.patch index 756dc7fb8c..705cbb4d37 100644 --- a/paper-server/nms-patches/net/minecraft/stats/RecipeBookServer.patch +++ b/paper-server/nms-patches/net/minecraft/stats/RecipeBookServer.patch @@ -18,7 +18,7 @@ this.add(minecraftkey); this.addHighlight(minecraftkey); list.add(minecraftkey); -@@ -70,6 +72,7 @@ +@@ -73,6 +75,7 @@ } private void sendRecipes(PacketPlayOutRecipes.Action packetplayoutrecipes_action, EntityPlayer entityplayer, List list) { diff --git a/paper-server/nms-patches/net/minecraft/util/SpawnUtil.patch b/paper-server/nms-patches/net/minecraft/util/SpawnUtil.patch index b374037a7c..150612747c 100644 --- a/paper-server/nms-patches/net/minecraft/util/SpawnUtil.patch +++ b/paper-server/nms-patches/net/minecraft/util/SpawnUtil.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/util/SpawnUtil.java +++ b/net/minecraft/util/SpawnUtil.java -@@ -17,6 +17,12 @@ +@@ -21,6 +21,12 @@ public SpawnUtil() {} public static Optional trySpawnMob(EntityTypes entitytypes, EnumMobSpawn enummobspawn, WorldServer worldserver, BlockPosition blockposition, int i, int j, int k, SpawnUtil.a spawnutil_a) { @@ -13,7 +13,7 @@ BlockPosition.MutableBlockPosition blockposition_mutableblockposition = blockposition.mutable(); for (int l = 0; l < i; ++l) { -@@ -25,11 +31,11 @@ +@@ -29,11 +35,11 @@ blockposition_mutableblockposition.setWithOffset(blockposition, i1, k, j1); if (worldserver.getWorldBorder().isWithinBounds((BlockPosition) blockposition_mutableblockposition) && moveToPossibleSpawnPosition(worldserver, k, blockposition_mutableblockposition, spawnutil_a)) { diff --git a/paper-server/nms-patches/net/minecraft/util/datafix/DataConverterRegistry.patch b/paper-server/nms-patches/net/minecraft/util/datafix/DataConverterRegistry.patch index 8e4b61026e..70a390799a 100644 --- a/paper-server/nms-patches/net/minecraft/util/datafix/DataConverterRegistry.patch +++ b/paper-server/nms-patches/net/minecraft/util/datafix/DataConverterRegistry.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/util/datafix/DataConverterRegistry.java +++ b/net/minecraft/util/datafix/DataConverterRegistry.java -@@ -434,6 +434,18 @@ +@@ -445,6 +445,18 @@ datafixerbuilder.addFixer(new DataConverterItemFrame(schema44, false)); Schema schema45 = datafixerbuilder.addSchema(1458, DataConverterRegistry.SAME_NAMESPACED); @@ -19,7 +19,7 @@ datafixerbuilder.addFixer(new DataConverterCustomNameEntity(schema45, false)); datafixerbuilder.addFixer(new DataConverterCustomNameItem(schema45, false)); datafixerbuilder.addFixer(new DataConverterCustomNameTile(schema45, false)); -@@ -751,12 +763,14 @@ +@@ -762,12 +774,14 @@ datafixerbuilder.addFixer(new DataConverterAddChoices(schema129, "Added Glow Squid", DataConverterTypes.ENTITY)); datafixerbuilder.addFixer(new DataConverterAddChoices(schema129, "Added Glow Item Frame", DataConverterTypes.ENTITY)); Schema schema130 = datafixerbuilder.addSchema(2690, DataConverterRegistry.SAME_NAMESPACED); @@ -36,7 +36,7 @@ datafixerbuilder.addFixer(DataConverterItemName.create(schema131, "Rename copper item suffixes", createRenamer(immutablemap1))); datafixerbuilder.addFixer(BlockRenameFixWithJigsaw.create(schema131, "Rename copper blocks suffixes", createRenamer(immutablemap1))); -@@ -764,7 +778,8 @@ +@@ -775,7 +789,8 @@ datafixerbuilder.addFixer(new AddFlagIfNotPresentFix(schema132, DataConverterTypes.WORLD_GEN_SETTINGS, "has_increased_height_already", false)); Schema schema133 = datafixerbuilder.addSchema(2696, DataConverterRegistry.SAME_NAMESPACED); @@ -46,13 +46,13 @@ datafixerbuilder.addFixer(DataConverterItemName.create(schema133, "Renamed grimstone block items to deepslate", createRenamer(immutablemap2))); datafixerbuilder.addFixer(BlockRenameFixWithJigsaw.create(schema133, "Renamed grimstone blocks to deepslate", createRenamer(immutablemap2))); -@@ -851,10 +866,11 @@ +@@ -862,10 +877,11 @@ datafixerbuilder.addFixer(new DataConverterAddChoices(schema158, "Added Allay", DataConverterTypes.ENTITY)); Schema schema159 = datafixerbuilder.addSchema(3084, DataConverterRegistry.SAME_NAMESPACED); -- datafixerbuilder.addFixer(new SimpleRenameFix(schema159, DataConverterTypes.GAME_EVENT_NAME, ImmutableMap.builder().put("minecraft:block_press", "minecraft:block_activate").put("minecraft:block_switch", "minecraft:block_activate").put("minecraft:block_unpress", "minecraft:block_deactivate").put("minecraft:block_unswitch", "minecraft:block_deactivate").put("minecraft:drinking_finish", "minecraft:drink").put("minecraft:elytra_free_fall", "minecraft:elytra_glide").put("minecraft:entity_damaged", "minecraft:entity_damage").put("minecraft:entity_dying", "minecraft:entity_die").put("minecraft:entity_killed", "minecraft:entity_die").put("minecraft:mob_interact", "minecraft:entity_interact").put("minecraft:ravager_roar", "minecraft:entity_roar").put("minecraft:ring_bell", "minecraft:block_change").put("minecraft:shulker_close", "minecraft:container_close").put("minecraft:shulker_open", "minecraft:container_open").put("minecraft:wolf_shaking", "minecraft:entity_shake").build())); +- datafixerbuilder.addFixer(new NamespacedTypeRenameFix(schema159, "game_event_renames_3084", DataConverterTypes.GAME_EVENT_NAME, createRenamer(ImmutableMap.builder().put("minecraft:block_press", "minecraft:block_activate").put("minecraft:block_switch", "minecraft:block_activate").put("minecraft:block_unpress", "minecraft:block_deactivate").put("minecraft:block_unswitch", "minecraft:block_deactivate").put("minecraft:drinking_finish", "minecraft:drink").put("minecraft:elytra_free_fall", "minecraft:elytra_glide").put("minecraft:entity_damaged", "minecraft:entity_damage").put("minecraft:entity_dying", "minecraft:entity_die").put("minecraft:entity_killed", "minecraft:entity_die").put("minecraft:mob_interact", "minecraft:entity_interact").put("minecraft:ravager_roar", "minecraft:entity_roar").put("minecraft:ring_bell", "minecraft:block_change").put("minecraft:shulker_close", "minecraft:container_close").put("minecraft:shulker_open", "minecraft:container_open").put("minecraft:wolf_shaking", "minecraft:entity_shake").build()))); + // CraftBukkit - decompile error -+ datafixerbuilder.addFixer(new SimpleRenameFix(schema159, DataConverterTypes.GAME_EVENT_NAME, ImmutableMap.builder().put("minecraft:block_press", "minecraft:block_activate").put("minecraft:block_switch", "minecraft:block_activate").put("minecraft:block_unpress", "minecraft:block_deactivate").put("minecraft:block_unswitch", "minecraft:block_deactivate").put("minecraft:drinking_finish", "minecraft:drink").put("minecraft:elytra_free_fall", "minecraft:elytra_glide").put("minecraft:entity_damaged", "minecraft:entity_damage").put("minecraft:entity_dying", "minecraft:entity_die").put("minecraft:entity_killed", "minecraft:entity_die").put("minecraft:mob_interact", "minecraft:entity_interact").put("minecraft:ravager_roar", "minecraft:entity_roar").put("minecraft:ring_bell", "minecraft:block_change").put("minecraft:shulker_close", "minecraft:container_close").put("minecraft:shulker_open", "minecraft:container_open").put("minecraft:wolf_shaking", "minecraft:entity_shake").build())); ++ datafixerbuilder.addFixer(new NamespacedTypeRenameFix(schema159, "game_event_renames_3084", DataConverterTypes.GAME_EVENT_NAME, createRenamer(ImmutableMap.builder().put("minecraft:block_press", "minecraft:block_activate").put("minecraft:block_switch", "minecraft:block_activate").put("minecraft:block_unpress", "minecraft:block_deactivate").put("minecraft:block_unswitch", "minecraft:block_deactivate").put("minecraft:drinking_finish", "minecraft:drink").put("minecraft:elytra_free_fall", "minecraft:elytra_glide").put("minecraft:entity_damaged", "minecraft:entity_damage").put("minecraft:entity_dying", "minecraft:entity_die").put("minecraft:entity_killed", "minecraft:entity_die").put("minecraft:mob_interact", "minecraft:entity_interact").put("minecraft:ravager_roar", "minecraft:entity_roar").put("minecraft:ring_bell", "minecraft:block_change").put("minecraft:shulker_close", "minecraft:container_close").put("minecraft:shulker_open", "minecraft:container_open").put("minecraft:wolf_shaking", "minecraft:entity_shake").build()))); Schema schema160 = datafixerbuilder.addSchema(3086, DataConverterRegistry.SAME_NAMESPACED); TypeReference typereference = DataConverterTypes.ENTITY; - Int2ObjectOpenHashMap int2objectopenhashmap = (Int2ObjectOpenHashMap) SystemUtils.make(new Int2ObjectOpenHashMap(), (int2objectopenhashmap1) -> { @@ -60,7 +60,7 @@ int2objectopenhashmap1.defaultReturnValue("minecraft:tabby"); int2objectopenhashmap1.put(0, "minecraft:tabby"); int2objectopenhashmap1.put(1, "minecraft:black"); -@@ -871,7 +887,8 @@ +@@ -882,7 +898,8 @@ Objects.requireNonNull(int2objectopenhashmap); datafixerbuilder.addFixer(new EntityVariantFix(schema160, "Change cat variant type", typereference, "minecraft:cat", "CatType", int2objectopenhashmap::get)); diff --git a/paper-server/nms-patches/net/minecraft/world/damagesource/DamageSources.patch b/paper-server/nms-patches/net/minecraft/world/damagesource/DamageSources.patch index 561959560d..55ecabb4d9 100644 --- a/paper-server/nms-patches/net/minecraft/world/damagesource/DamageSources.patch +++ b/paper-server/nms-patches/net/minecraft/world/damagesource/DamageSources.patch @@ -1,9 +1,9 @@ --- a/net/minecraft/world/damagesource/DamageSources.java +++ b/net/minecraft/world/damagesource/DamageSources.java -@@ -39,9 +39,15 @@ - private final DamageSource sweetBerryBush; - private final DamageSource freeze; +@@ -41,9 +41,15 @@ private final DamageSource stalagmite; + private final DamageSource outsideBorder; + private final DamageSource genericKill; + // CraftBukkit start + public final DamageSource melting; + public final DamageSource poison; diff --git a/paper-server/nms-patches/net/minecraft/world/effect/MobEffectList.patch b/paper-server/nms-patches/net/minecraft/world/effect/MobEffectList.patch index 5dd7e11f5b..3565259d2b 100644 --- a/paper-server/nms-patches/net/minecraft/world/effect/MobEffectList.patch +++ b/paper-server/nms-patches/net/minecraft/world/effect/MobEffectList.patch @@ -32,7 +32,7 @@ - ((EntityHuman) entityliving).causeFoodExhaustion(0.005F * (float) (i + 1)); + ((EntityHuman) entityliving).causeFoodExhaustion(0.005F * (float) (i + 1), org.bukkit.event.entity.EntityExhaustionEvent.ExhaustionReason.HUNGER_EFFECT); // CraftBukkit - EntityExhaustionEvent } else if (this == MobEffects.SATURATION && entityliving instanceof EntityHuman) { - if (!entityliving.level.isClientSide) { + if (!entityliving.level().isClientSide) { - ((EntityHuman) entityliving).getFoodData().eat(i + 1, 1.0F); + // CraftBukkit start + EntityHuman entityhuman = (EntityHuman) entityliving; diff --git a/paper-server/nms-patches/net/minecraft/world/entity/Entity.patch b/paper-server/nms-patches/net/minecraft/world/entity/Entity.patch index 7e63029402..1cb796e2ec 100644 --- a/paper-server/nms-patches/net/minecraft/world/entity/Entity.patch +++ b/paper-server/nms-patches/net/minecraft/world/entity/Entity.patch @@ -67,7 +67,7 @@ private static final Logger LOGGER = LogUtils.getLogger(); public static final String ID_TAG = "id"; public static final String PASSENGERS_TAG = "Passengers"; -@@ -236,6 +294,25 @@ +@@ -240,6 +298,25 @@ public boolean hasVisualFire; @Nullable private IBlockData feetBlockState; @@ -93,7 +93,7 @@ public Entity(EntityTypes entitytypes, World world) { this.id = Entity.ENTITY_COUNTER.incrementAndGet(); -@@ -367,6 +444,12 @@ +@@ -373,6 +450,12 @@ public void onClientRemoval() {} public void setPose(EntityPose entitypose) { @@ -106,7 +106,7 @@ this.entityData.set(Entity.DATA_POSE, entitypose); } -@@ -391,6 +474,33 @@ +@@ -397,6 +480,33 @@ } protected void setRot(float f, float f1) { @@ -140,7 +140,7 @@ this.setYRot(f % 360.0F); this.setXRot(f1 % 360.0F); } -@@ -432,6 +542,15 @@ +@@ -438,6 +548,15 @@ this.baseTick(); } @@ -154,9 +154,9 @@ + // CraftBukkit end + public void baseTick() { - this.level.getProfiler().push("entityBaseTick"); + this.level().getProfiler().push("entityBaseTick"); this.feetBlockState = null; -@@ -446,7 +565,7 @@ +@@ -452,7 +571,7 @@ this.walkDistO = this.walkDist; this.xRotO = this.getXRot(); this.yRotO = this.getYRot(); @@ -165,7 +165,7 @@ if (this.canSpawnSprintParticle()) { this.spawnSprintParticle(); } -@@ -481,6 +600,10 @@ +@@ -487,6 +606,10 @@ if (this.isInLava()) { this.lavaHurt(); this.fallDistance *= 0.5F; @@ -175,8 +175,8 @@ + // CraftBukkit end } - this.checkOutOfWorld(); -@@ -524,15 +647,48 @@ + this.checkBelowWorld(); +@@ -538,15 +661,48 @@ public void lavaHurt() { if (!this.fireImmune()) { @@ -226,8 +226,8 @@ int j = i * 20; if (this instanceof EntityLiving) { -@@ -646,6 +802,28 @@ - block.updateEntityAfterFallOn(this.level, this); +@@ -697,6 +853,28 @@ + block.updateEntityAfterFallOn(this.level(), this); } + // CraftBukkit start @@ -252,10 +252,10 @@ + } + // CraftBukkit end + - if (this.onGround) { - block.stepOn(this.level, blockposition, iblockdata, this); + if (this.onGround()) { + block.stepOn(this.level(), blockposition, iblockdata, this); } -@@ -948,6 +1126,20 @@ +@@ -1024,6 +1202,20 @@ return SoundEffects.GENERIC_SPLASH; } @@ -276,7 +276,7 @@ protected void checkInsideBlocks() { AxisAlignedBB axisalignedbb = this.getBoundingBox(); BlockPosition blockposition = BlockPosition.containing(axisalignedbb.minX + 1.0E-7D, axisalignedbb.minY + 1.0E-7D, axisalignedbb.minZ + 1.0E-7D); -@@ -1311,6 +1503,7 @@ +@@ -1430,6 +1622,7 @@ this.yo = d1; this.zo = d4; this.setPos(d3, d1, d4); @@ -284,7 +284,7 @@ } public void moveTo(Vec3D vec3d) { -@@ -1505,6 +1698,12 @@ +@@ -1624,6 +1817,12 @@ return false; } @@ -297,7 +297,7 @@ public void awardKillScore(Entity entity, int i, DamageSource damagesource) { if (entity instanceof EntityPlayer) { CriterionTriggers.ENTITY_KILLED_PLAYER.trigger((EntityPlayer) entity, this, damagesource); -@@ -1538,7 +1737,7 @@ +@@ -1657,7 +1856,7 @@ } else { String s = this.getEncodeId(); @@ -306,7 +306,7 @@ return false; } else { nbttagcompound.putString("id", s); -@@ -1563,6 +1762,18 @@ +@@ -1682,6 +1881,18 @@ Vec3D vec3d = this.getDeltaMovement(); nbttagcompound.put("Motion", this.newDoubleList(vec3d.x, vec3d.y, vec3d.z)); @@ -325,7 +325,7 @@ nbttagcompound.put("Rotation", this.newFloatList(this.getYRot(), this.getXRot())); nbttagcompound.putFloat("FallDistance", this.fallDistance); nbttagcompound.putShort("Fire", (short) this.remainingFireTicks); -@@ -1571,6 +1782,25 @@ +@@ -1690,6 +1901,25 @@ nbttagcompound.putBoolean("Invulnerable", this.invulnerable); nbttagcompound.putInt("PortalCooldown", this.portalCooldown); nbttagcompound.putUUID("UUID", this.getUUID()); @@ -351,7 +351,7 @@ IChatBaseComponent ichatbasecomponent = this.getCustomName(); if (ichatbasecomponent != null) { -@@ -1638,6 +1868,11 @@ +@@ -1757,6 +1987,11 @@ } } @@ -363,7 +363,7 @@ return nbttagcompound; } catch (Throwable throwable) { CrashReport crashreport = CrashReport.forThrowable(throwable, "Saving entity NBT"); -@@ -1721,6 +1956,45 @@ +@@ -1840,6 +2075,45 @@ } else { throw new IllegalStateException("Entity has invalid position"); } @@ -409,8 +409,8 @@ } catch (Throwable throwable) { CrashReport crashreport = CrashReport.forThrowable(throwable, "Loading entity NBT"); CrashReportSystemDetails crashreportsystemdetails = crashreport.addCategory("Entity being loaded"); -@@ -1796,9 +2070,22 @@ - } else if (this.level.isClientSide) { +@@ -1915,9 +2189,22 @@ + } else if (this.level().isClientSide) { return null; } else { + // CraftBukkit start - Capture drops for death event @@ -419,7 +419,7 @@ + return null; + } + // CraftBukkit end - EntityItem entityitem = new EntityItem(this.level, this.getX(), this.getY() + (double) f, this.getZ(), itemstack); + EntityItem entityitem = new EntityItem(this.level(), this.getX(), this.getY() + (double) f, this.getZ(), itemstack); entityitem.setDefaultPickUpDelay(); + // CraftBukkit start @@ -429,10 +429,10 @@ + return null; + } + // CraftBukkit end - this.level.addFreshEntity(entityitem); + this.level().addFreshEntity(entityitem); return entityitem; } -@@ -1894,7 +2181,7 @@ +@@ -2013,7 +2300,7 @@ this.setPose(EntityPose.STANDING); this.vehicle = entity; @@ -441,7 +441,7 @@ entity.getIndirectPassengersStream().filter((entity2) -> { return entity2 instanceof EntityPlayer; }).forEach((entity2) -> { -@@ -1925,7 +2212,7 @@ +@@ -2044,7 +2331,7 @@ Entity entity = this.vehicle; this.vehicle = null; @@ -450,7 +450,7 @@ } } -@@ -1934,10 +2221,31 @@ +@@ -2053,10 +2340,31 @@ this.removeVehicle(); } @@ -483,7 +483,7 @@ if (this.passengers.isEmpty()) { this.passengers = ImmutableList.of(entity); } else { -@@ -1954,12 +2262,32 @@ +@@ -2073,12 +2381,32 @@ this.gameEvent(GameEvent.ENTITY_MOUNT, entity); } @@ -517,7 +517,7 @@ if (this.passengers.size() == 1 && this.passengers.get(0) == entity) { this.passengers = ImmutableList.of(); } else { -@@ -1971,6 +2299,7 @@ +@@ -2090,6 +2418,7 @@ entity.boardingCooldown = 60; this.gameEvent(GameEvent.ENTITY_DISMOUNT, entity); } @@ -525,17 +525,17 @@ } protected boolean canAddPassenger(Entity entity) { -@@ -2037,14 +2366,20 @@ +@@ -2156,14 +2485,20 @@ if (this.isInsidePortal) { MinecraftServer minecraftserver = worldserver.getServer(); -- ResourceKey resourcekey = this.level.dimension() == World.NETHER ? World.OVERWORLD : World.NETHER; -+ ResourceKey resourcekey = this.level.getTypeKey() == WorldDimension.NETHER ? World.OVERWORLD : World.NETHER; // CraftBukkit +- ResourceKey resourcekey = this.level().dimension() == World.NETHER ? World.OVERWORLD : World.NETHER; ++ ResourceKey resourcekey = this.level().getTypeKey() == WorldDimension.NETHER ? World.OVERWORLD : World.NETHER; // CraftBukkit WorldServer worldserver1 = minecraftserver.getLevel(resourcekey); - if (worldserver1 != null && minecraftserver.isNetherEnabled() && !this.isPassenger() && this.portalTime++ >= i) { + if (true && !this.isPassenger() && this.portalTime++ >= i) { // CraftBukkit - this.level.getProfiler().push("portal"); + this.level().getProfiler().push("portal"); this.portalTime = i; this.setPortalCooldown(); - this.changeDimension(worldserver1); @@ -546,10 +546,10 @@ + this.changeDimension(worldserver1); + } + // CraftBukkit end - this.level.getProfiler().pop(); + this.level().getProfiler().pop(); } -@@ -2164,6 +2499,13 @@ +@@ -2283,6 +2618,13 @@ } public void setSwimming(boolean flag) { @@ -563,7 +563,7 @@ this.setSharedFlag(4, flag); } -@@ -2209,8 +2551,12 @@ +@@ -2332,8 +2674,12 @@ return this.getTeam() != null ? this.getTeam().isAlliedTo(scoreboardteambase) : false; } @@ -577,7 +577,7 @@ } public boolean getSharedFlag(int i) { -@@ -2229,7 +2575,7 @@ +@@ -2352,7 +2698,7 @@ } public int getMaxAirSupply() { @@ -586,7 +586,7 @@ } public int getAirSupply() { -@@ -2237,7 +2583,18 @@ +@@ -2360,7 +2706,18 @@ } public void setAirSupply(int i) { @@ -606,7 +606,7 @@ } public int getTicksFrozen() { -@@ -2264,11 +2621,41 @@ +@@ -2387,11 +2744,41 @@ public void thunderHit(WorldServer worldserver, EntityLightning entitylightning) { this.setRemainingFireTicks(this.remainingFireTicks + 1); @@ -650,7 +650,7 @@ } public void onAboveBubbleCol(boolean flag) { -@@ -2433,15 +2820,38 @@ +@@ -2556,15 +2943,38 @@ @Nullable public Entity changeDimension(WorldServer worldserver) { @@ -661,16 +661,16 @@ + @Nullable + public Entity teleportTo(WorldServer worldserver, Position location) { + // CraftBukkit end - if (this.level instanceof WorldServer && !this.isRemoved()) { - this.level.getProfiler().push("changeDimension"); + if (this.level() instanceof WorldServer && !this.isRemoved()) { + this.level().getProfiler().push("changeDimension"); - this.unRide(); + // CraftBukkit start -+ // this.decouple(); ++ // this.unRide(); + if (worldserver == null) { + return null; + } + // CraftBukkit end - this.level.getProfiler().push("reposition"); + this.level().getProfiler().push("reposition"); - ShapeDetectorShape shapedetectorshape = this.findDimensionEntryPoint(worldserver); + ShapeDetectorShape shapedetectorshape = (location == null) ? this.findDimensionEntryPoint(worldserver) : new ShapeDetectorShape(new Vec3D(location.x(), location.y(), location.z()), Vec3D.ZERO, this.yRot, this.xRot, worldserver, null); // CraftBukkit @@ -688,10 +688,10 @@ + this.unRide(); + // CraftBukkit end + - this.level.getProfiler().popPush("reloading"); + this.level().getProfiler().popPush("reloading"); Entity entity = this.getType().create(worldserver); -@@ -2450,9 +2860,17 @@ +@@ -2573,9 +2983,17 @@ entity.moveTo(shapedetectorshape.pos.x, shapedetectorshape.pos.y, shapedetectorshape.pos.z, shapedetectorshape.yRot, entity.getXRot()); entity.setDeltaMovement(shapedetectorshape.speed); worldserver.addDuringTeleport(entity); @@ -711,17 +711,17 @@ } this.removeAfterChangingDimensions(); -@@ -2473,20 +2891,34 @@ +@@ -2596,20 +3014,34 @@ @Nullable protected ShapeDetectorShape findDimensionEntryPoint(WorldServer worldserver) { -- boolean flag = this.level.dimension() == World.END && worldserver.dimension() == World.OVERWORLD; +- boolean flag = this.level().dimension() == World.END && worldserver.dimension() == World.OVERWORLD; - boolean flag1 = worldserver.dimension() == World.END; + // CraftBukkit start + if (worldserver == null) { + return null; + } -+ boolean flag = this.level.getTypeKey() == WorldDimension.END && worldserver.getTypeKey() == WorldDimension.OVERWORLD; // fromEndToOverworld ++ boolean flag = this.level().getTypeKey() == WorldDimension.END && worldserver.getTypeKey() == WorldDimension.OVERWORLD; // fromEndToOverworld + boolean flag1 = worldserver.getTypeKey() == WorldDimension.END; // targetIsEnd + // CraftBukkit end @@ -729,12 +729,12 @@ - boolean flag2 = worldserver.dimension() == World.NETHER; + boolean flag2 = worldserver.getTypeKey() == WorldDimension.NETHER; // CraftBukkit -- if (this.level.dimension() != World.NETHER && !flag2) { -+ if (this.level.getTypeKey() != WorldDimension.NETHER && !flag2) { // CraftBukkit +- if (this.level().dimension() != World.NETHER && !flag2) { ++ if (this.level().getTypeKey() != WorldDimension.NETHER && !flag2) { // CraftBukkit return null; } else { WorldBorder worldborder = worldserver.getWorldBorder(); - double d0 = DimensionManager.getTeleportationScale(this.level.dimensionType(), worldserver.dimensionType()); + double d0 = DimensionManager.getTeleportationScale(this.level().dimensionType(), worldserver.dimensionType()); BlockPosition blockposition = worldborder.clampToBounds(this.getX() * d0, this.getY(), this.getZ() * d0); + // CraftBukkit start + CraftPortalEvent event = callPortalEvent(this, worldserver, new Position(blockposition.getX(), blockposition.getY(), blockposition.getZ()), PlayerTeleportEvent.TeleportCause.NETHER_PORTAL, flag2 ? 16 : 128, 16); @@ -748,10 +748,10 @@ - return (ShapeDetectorShape) this.getExitPortal(worldserver, blockposition, flag2, worldborder).map((blockutil_rectangle) -> { + return (ShapeDetectorShape) this.getExitPortal(worldserver, blockposition, flag2, worldborder, event.getSearchRadius(), event.getCanCreatePortal(), event.getCreationRadius()).map((blockutil_rectangle) -> { + // CraftBukkit end - IBlockData iblockdata = this.level.getBlockState(this.portalEntrancePos); + IBlockData iblockdata = this.level().getBlockState(this.portalEntrancePos); EnumDirection.EnumAxis enumdirection_enumaxis; Vec3D vec3d; -@@ -2503,8 +2935,8 @@ +@@ -2626,8 +3058,8 @@ vec3d = new Vec3D(0.5D, 0.0D, 0.0D); } @@ -762,7 +762,7 @@ } } else { BlockPosition blockposition1; -@@ -2514,8 +2946,14 @@ +@@ -2637,8 +3069,14 @@ } else { blockposition1 = worldserver.getHeightmapPos(HeightMap.Type.MOTION_BLOCKING_NO_LEAVES, worldserver.getSharedSpawnPos()); } @@ -778,7 +778,7 @@ } } -@@ -2523,8 +2961,23 @@ +@@ -2646,8 +3084,23 @@ return BlockPortalShape.getRelativePosition(blockutil_rectangle, enumdirection_enumaxis, this.position(), this.getDimensions(this.getPose())); } @@ -804,7 +804,7 @@ } public boolean canChangeDimensions() { -@@ -2644,6 +3097,12 @@ +@@ -2767,6 +3220,12 @@ } } @@ -817,7 +817,7 @@ public boolean teleportTo(WorldServer worldserver, double d0, double d1, double d2, Set set, float f, float f1) { float f2 = MathHelper.clamp(f1, -90.0F, 90.0F); -@@ -2773,7 +3232,26 @@ +@@ -2901,7 +3360,26 @@ } public final void setBoundingBox(AxisAlignedBB axisalignedbb) { @@ -845,7 +845,7 @@ } protected float getEyeHeight(EntityPose entitypose, EntitySize entitysize) { -@@ -3084,6 +3562,11 @@ +@@ -3212,6 +3690,11 @@ vec3d = vec3d.add(vec3d1); ++k1; } diff --git a/paper-server/nms-patches/net/minecraft/world/entity/EntityAgeable.patch b/paper-server/nms-patches/net/minecraft/world/entity/EntityAgeable.patch index aba475a606..b5e1154ce9 100644 --- a/paper-server/nms-patches/net/minecraft/world/entity/EntityAgeable.patch +++ b/paper-server/nms-patches/net/minecraft/world/entity/EntityAgeable.patch @@ -28,8 +28,8 @@ @Override public void aiStep() { super.aiStep(); -- if (this.level.isClientSide) { -+ if (this.level.isClientSide || ageLocked) { // CraftBukkit +- if (this.level().isClientSide) { ++ if (this.level().isClientSide || ageLocked) { // CraftBukkit if (this.forcedAgeTimer > 0) { if (this.forcedAgeTimer % 4 == 0) { - this.level.addParticle(Particles.HAPPY_VILLAGER, this.getRandomX(1.0D), this.getRandomY() + 0.5D, this.getRandomZ(1.0D), 0.0D, 0.0D, 0.0D); + this.level().addParticle(Particles.HAPPY_VILLAGER, this.getRandomX(1.0D), this.getRandomY() + 0.5D, this.getRandomZ(1.0D), 0.0D, 0.0D, 0.0D); diff --git a/paper-server/nms-patches/net/minecraft/world/entity/EntityCreature.patch b/paper-server/nms-patches/net/minecraft/world/entity/EntityCreature.patch index 99e9b9786a..9cff885bfc 100644 --- a/paper-server/nms-patches/net/minecraft/world/entity/EntityCreature.patch +++ b/paper-server/nms-patches/net/minecraft/world/entity/EntityCreature.patch @@ -15,7 +15,7 @@ if (this instanceof EntityTameableAnimal && ((EntityTameableAnimal) this).isInSittingPose()) { if (f > 10.0F) { -+ this.level.getCraftServer().getPluginManager().callEvent(new EntityUnleashEvent(this.getBukkitEntity(), EntityUnleashEvent.UnleashReason.DISTANCE)); // CraftBukkit ++ this.level().getCraftServer().getPluginManager().callEvent(new EntityUnleashEvent(this.getBukkitEntity(), EntityUnleashEvent.UnleashReason.DISTANCE)); // CraftBukkit this.dropLeash(true, true); } @@ -23,7 +23,7 @@ this.onLeashDistance(f); if (f > 10.0F) { -+ this.level.getCraftServer().getPluginManager().callEvent(new EntityUnleashEvent(this.getBukkitEntity(), EntityUnleashEvent.UnleashReason.DISTANCE)); // CraftBukkit ++ this.level().getCraftServer().getPluginManager().callEvent(new EntityUnleashEvent(this.getBukkitEntity(), EntityUnleashEvent.UnleashReason.DISTANCE)); // CraftBukkit this.dropLeash(true, true); this.goalSelector.disableControlFlag(PathfinderGoal.Type.MOVE); } else if (f > 6.0F) { diff --git a/paper-server/nms-patches/net/minecraft/world/entity/EntityExperienceOrb.patch b/paper-server/nms-patches/net/minecraft/world/entity/EntityExperienceOrb.patch index cd96164aaf..ae2f402304 100644 --- a/paper-server/nms-patches/net/minecraft/world/entity/EntityExperienceOrb.patch +++ b/paper-server/nms-patches/net/minecraft/world/entity/EntityExperienceOrb.patch @@ -46,9 +46,9 @@ Vec3D vec3d = new Vec3D(this.followingPlayer.getX() - this.getX(), this.followingPlayer.getY() + (double) this.followingPlayer.getEyeHeight() / 2.0D - this.getY(), this.followingPlayer.getZ() - this.getZ()); double d0 = vec3d.lengthSqr(); -@@ -222,12 +245,12 @@ +@@ -227,12 +250,12 @@ public void playerTouch(EntityHuman entityhuman) { - if (!this.level.isClientSide) { + if (!this.level().isClientSide) { if (entityhuman.takeXpDelay == 0) { - entityhuman.takeXpDelay = 2; + entityhuman.takeXpDelay = CraftEventFactory.callPlayerXpCooldownEvent(entityhuman, 2, PlayerExpCooldownChangeEvent.ChangeReason.PICKUP_ORB).getNewCooldown(); // CraftBukkit - entityhuman.takeXpDelay = 2; @@ -61,7 +61,7 @@ } --this.count; -@@ -245,9 +268,17 @@ +@@ -250,9 +273,17 @@ if (entry != null) { ItemStack itemstack = (ItemStack) entry.getValue(); int j = Math.min(this.xpToDurability(this.value), itemstack.getDamageValue()); @@ -79,7 +79,7 @@ return k > 0 ? this.repairPlayerItems(entityhuman, k) : 0; } else { -@@ -272,6 +303,24 @@ +@@ -277,6 +308,24 @@ } public static int getExperienceValue(int i) { diff --git a/paper-server/nms-patches/net/minecraft/world/entity/EntityInsentient.patch b/paper-server/nms-patches/net/minecraft/world/entity/EntityInsentient.patch index 4e9a5910d0..31239a1b60 100644 --- a/paper-server/nms-patches/net/minecraft/world/entity/EntityInsentient.patch +++ b/paper-server/nms-patches/net/minecraft/world/entity/EntityInsentient.patch @@ -1,8 +1,8 @@ --- a/net/minecraft/world/entity/EntityInsentient.java +++ b/net/minecraft/world/entity/EntityInsentient.java -@@ -75,6 +75,19 @@ +@@ -74,6 +74,19 @@ + import net.minecraft.world.level.material.FluidType; import net.minecraft.world.level.pathfinder.PathType; - import net.minecraft.world.level.storage.loot.LootTableInfo; +// CraftBukkit start +import net.minecraft.server.level.EntityPlayer; @@ -20,7 +20,7 @@ public abstract class EntityInsentient extends EntityLiving implements Targeting { private static final DataWatcherObject DATA_MOB_FLAGS_ID = DataWatcher.defineId(EntityInsentient.class, DataWatcherRegistry.BYTE); -@@ -121,6 +134,8 @@ +@@ -120,6 +133,8 @@ private BlockPosition restrictCenter; private float restrictRadius; @@ -29,7 +29,7 @@ protected EntityInsentient(EntityTypes entitytypes, World world) { super(entitytypes, world); this.handItems = NonNullList.withSize(2, ItemStack.EMPTY); -@@ -146,6 +161,12 @@ +@@ -145,6 +160,12 @@ } @@ -42,7 +42,7 @@ protected void registerGoals() {} public static AttributeProvider.Builder createMobAttributes() { -@@ -254,7 +275,38 @@ +@@ -257,7 +278,38 @@ } public void setTarget(@Nullable EntityLiving entityliving) { @@ -57,14 +57,14 @@ + reason = getTarget().isAlive() ? EntityTargetEvent.TargetReason.FORGOT_TARGET : EntityTargetEvent.TargetReason.TARGET_DIED; + } + if (reason == EntityTargetEvent.TargetReason.UNKNOWN) { -+ level.getCraftServer().getLogger().log(java.util.logging.Level.WARNING, "Unknown target reason, please report on the issue tracker", new Exception()); ++ this.level().getCraftServer().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); -+ level.getCraftServer().getPluginManager().callEvent(event); ++ this.level().getCraftServer().getPluginManager().callEvent(event); + if (event.isCancelled()) { + return false; + } @@ -81,7 +81,7 @@ } @Override -@@ -394,6 +446,12 @@ +@@ -397,6 +449,12 @@ return null; } @@ -94,7 +94,7 @@ @Override public void addAdditionalSaveData(NBTTagCompound nbttagcompound) { super.addAdditionalSaveData(nbttagcompound); -@@ -483,16 +541,26 @@ +@@ -486,16 +544,26 @@ nbttagcompound.putBoolean("NoAI", this.isNoAi()); } @@ -123,7 +123,7 @@ NBTTagList nbttaglist; int i; -@@ -539,6 +607,11 @@ +@@ -542,6 +610,11 @@ } this.setNoAi(nbttagcompound.getBoolean("NoAI")); @@ -135,7 +135,7 @@ } @Override -@@ -606,7 +679,7 @@ +@@ -609,7 +682,7 @@ protected void pickUpItem(EntityItem entityitem) { ItemStack itemstack = entityitem.getItem(); @@ -144,7 +144,7 @@ if (!itemstack1.isEmpty()) { this.onItemPickup(entityitem); -@@ -620,6 +693,12 @@ +@@ -623,6 +696,12 @@ } public ItemStack equipItemIfPossible(ItemStack itemstack) { @@ -157,8 +157,8 @@ EnumItemSlot enumitemslot = getEquipmentSlotForItem(itemstack); ItemStack itemstack1 = this.getItemBySlot(enumitemslot); boolean flag = this.canReplaceCurrentItem(itemstack, itemstack1); -@@ -630,11 +709,19 @@ - flag = this.canReplaceCurrentItem(itemstack, itemstack1); +@@ -633,11 +712,19 @@ + flag = itemstack1.isEmpty(); } - if (flag && this.canHoldItem(itemstack)) { @@ -178,15 +178,15 @@ } if (enumitemslot.isArmor() && itemstack.getCount() > 1) { -@@ -779,6 +866,7 @@ +@@ -782,6 +869,7 @@ @Override protected final void serverAiStep() { ++this.noActionTime; + if (!this.aware) return; // CraftBukkit - this.level.getProfiler().push("sensing"); + this.level().getProfiler().push("sensing"); this.sensing.tick(); - this.level.getProfiler().pop(); -@@ -1172,6 +1260,12 @@ + this.level().getProfiler().pop(); +@@ -1175,6 +1263,12 @@ if (!this.isAlive()) { return EnumInteractionResult.PASS; } else if (this.getLeashHolder() == entityhuman) { @@ -198,8 +198,8 @@ + // CraftBukkit end this.dropLeash(true, !entityhuman.getAbilities().instabuild); this.gameEvent(GameEvent.ENTITY_INTERACT, entityhuman); - return EnumInteractionResult.sidedSuccess(this.level.isClientSide); -@@ -1197,6 +1291,12 @@ + return EnumInteractionResult.sidedSuccess(this.level().isClientSide); +@@ -1200,6 +1294,12 @@ ItemStack itemstack = entityhuman.getItemInHand(enumhand); if (itemstack.is(Items.LEAD) && this.canBeLeashed(entityhuman)) { @@ -211,17 +211,17 @@ + // CraftBukkit end this.setLeashedTo(entityhuman, true); itemstack.shrink(1); - return EnumInteractionResult.sidedSuccess(this.level.isClientSide); -@@ -1212,7 +1312,7 @@ + return EnumInteractionResult.sidedSuccess(this.level().isClientSide); +@@ -1215,7 +1315,7 @@ if (itemstack.getItem() instanceof ItemMonsterEgg) { - if (this.level instanceof WorldServer) { + if (this.level() instanceof WorldServer) { ItemMonsterEgg itemmonsteregg = (ItemMonsterEgg) itemstack.getItem(); -- Optional optional = itemmonsteregg.spawnOffspringFromSpawnEgg(entityhuman, this, this.getType(), (WorldServer) this.level, this.position(), itemstack); -+ Optional optional = itemmonsteregg.spawnOffspringFromSpawnEgg(entityhuman, this, (EntityTypes) this.getType(), (WorldServer) this.level, this.position(), itemstack); // CraftBukkit - decompile error +- Optional optional = itemmonsteregg.spawnOffspringFromSpawnEgg(entityhuman, this, this.getType(), (WorldServer) this.level(), this.position(), itemstack); ++ Optional optional = itemmonsteregg.spawnOffspringFromSpawnEgg(entityhuman, this, (EntityTypes) this.getType(), (WorldServer) this.level(), this.position(), itemstack); // CraftBukkit - decompile error optional.ifPresent((entityinsentient) -> { this.onOffspringSpawnedFromEgg(entityhuman, entityinsentient); -@@ -1262,12 +1362,19 @@ +@@ -1265,12 +1365,19 @@ return this.restrictRadius != -1.0F; } @@ -237,52 +237,52 @@ if (this.isRemoved()) { return null; } else { -- T t0 = (EntityInsentient) entitytypes.create(this.level); -+ T t0 = entitytypes.create(this.level); // CraftBukkit - decompile error +- T t0 = (EntityInsentient) entitytypes.create(this.level()); ++ T t0 = entitytypes.create(this.level()); // CraftBukkit - decompile error if (t0 == null) { return null; -@@ -1302,7 +1409,12 @@ +@@ -1304,7 +1411,12 @@ } } -- this.level.addFreshEntity(t0); +- this.level().addFreshEntity(t0); + // CraftBukkit start + if (CraftEventFactory.callEntityTransformEvent(this, t0, transformReason).isCancelled()) { + return null; + } -+ this.level.addFreshEntity(t0, spawnReason); ++ this.level().addFreshEntity(t0, spawnReason); + // CraftBukkit end if (this.isPassenger()) { Entity entity = this.getVehicle(); -@@ -1323,6 +1435,7 @@ +@@ -1325,6 +1437,7 @@ if (this.leashHolder != null) { if (!this.isAlive() || !this.leashHolder.isAlive()) { -+ this.level.getCraftServer().getPluginManager().callEvent(new EntityUnleashEvent(this.getBukkitEntity(), (!this.isAlive()) ? UnleashReason.PLAYER_UNLEASH : UnleashReason.HOLDER_GONE)); // CraftBukkit ++ this.level().getCraftServer().getPluginManager().callEvent(new EntityUnleashEvent(this.getBukkitEntity(), (!this.isAlive()) ? UnleashReason.PLAYER_UNLEASH : UnleashReason.HOLDER_GONE)); // CraftBukkit this.dropLeash(true, true); } -@@ -1334,7 +1447,9 @@ +@@ -1336,7 +1449,9 @@ this.leashHolder = null; this.leashInfoTag = null; - if (!this.level.isClientSide && flag1) { + if (!this.level().isClientSide && flag1) { + this.forceDrops = true; // CraftBukkit this.spawnAtLocation((IMaterial) Items.LEAD); + this.forceDrops = false; // CraftBukkit } - if (!this.level.isClientSide && flag && this.level instanceof WorldServer) { -@@ -1384,6 +1499,7 @@ + if (!this.level().isClientSide && flag && this.level() instanceof WorldServer) { +@@ -1386,6 +1501,7 @@ boolean flag1 = super.startRiding(entity, flag); if (flag1 && this.isLeashed()) { -+ this.level.getCraftServer().getPluginManager().callEvent(new EntityUnleashEvent(this.getBukkitEntity(), UnleashReason.UNKNOWN)); // CraftBukkit ++ this.level().getCraftServer().getPluginManager().callEvent(new EntityUnleashEvent(this.getBukkitEntity(), UnleashReason.UNKNOWN)); // CraftBukkit this.dropLeash(true, true); } -@@ -1408,7 +1524,9 @@ +@@ -1410,7 +1526,9 @@ } if (this.tickCount > 100) { @@ -292,7 +292,7 @@ this.leashInfoTag = null; } } -@@ -1484,7 +1602,14 @@ +@@ -1486,7 +1604,14 @@ int i = EnchantmentManager.getFireAspect(this); if (i > 0) { @@ -308,15 +308,11 @@ } boolean flag = entity.hurt(this.damageSources().mobAttack(this), f); -@@ -1558,9 +1683,10 @@ +@@ -1560,6 +1685,7 @@ @Override protected void removeAfterChangingDimensions() { super.removeAfterChangingDimensions(); -+ this.level.getCraftServer().getPluginManager().callEvent(new EntityUnleashEvent(this.getBukkitEntity(), UnleashReason.UNKNOWN)); // CraftBukkit ++ this.level().getCraftServer().getPluginManager().callEvent(new EntityUnleashEvent(this.getBukkitEntity(), UnleashReason.UNKNOWN)); // CraftBukkit this.dropLeash(true, false); this.getAllSlots().forEach((itemstack) -> { -- itemstack.setCount(0); -+ if (!itemstack.isEmpty()) itemstack.setCount(0); // CraftBukkit - }); - } - + if (!itemstack.isEmpty()) { diff --git a/paper-server/nms-patches/net/minecraft/world/entity/EntityLightning.patch b/paper-server/nms-patches/net/minecraft/world/entity/EntityLightning.patch index 938e9bebc5..a6705430a4 100644 --- a/paper-server/nms-patches/net/minecraft/world/entity/EntityLightning.patch +++ b/paper-server/nms-patches/net/minecraft/world/entity/EntityLightning.patch @@ -17,18 +17,18 @@ - if (this.life >= 0) { + if (this.life >= 0 && !this.visualOnly) { // CraftBukkit - add !this.visualOnly - if (!(this.level instanceof WorldServer)) { - this.level.setSkyFlashTime(2); + if (!(this.level() instanceof WorldServer)) { + this.level().setSkyFlashTime(2); } else if (!this.visualOnly) { @@ -163,8 +167,12 @@ - IBlockData iblockdata = BlockFireAbstract.getState(this.level, blockposition); + IBlockData iblockdata = BlockFireAbstract.getState(this.level(), blockposition); - if (this.level.getBlockState(blockposition).isAir() && iblockdata.canSurvive(this.level, blockposition)) { -- this.level.setBlockAndUpdate(blockposition, iblockdata); + if (this.level().getBlockState(blockposition).isAir() && iblockdata.canSurvive(this.level(), blockposition)) { +- this.level().setBlockAndUpdate(blockposition, iblockdata); - ++this.blocksSetOnFire; + // CraftBukkit start - add "!visualOnly" -+ if (!visualOnly && !CraftEventFactory.callBlockIgniteEvent(level, blockposition, this).isCancelled()) { -+ this.level.setBlockAndUpdate(blockposition, iblockdata); ++ if (!visualOnly && !CraftEventFactory.callBlockIgniteEvent(this.level(), blockposition, this).isCancelled()) { ++ this.level().setBlockAndUpdate(blockposition, iblockdata); + ++this.blocksSetOnFire; + } + // CraftBukkit end @@ -37,13 +37,13 @@ for (int j = 0; j < i; ++j) { @@ -172,8 +180,12 @@ - iblockdata = BlockFireAbstract.getState(this.level, blockposition1); - if (this.level.getBlockState(blockposition1).isAir() && iblockdata.canSurvive(this.level, blockposition1)) { -- this.level.setBlockAndUpdate(blockposition1, iblockdata); + iblockdata = BlockFireAbstract.getState(this.level(), blockposition1); + if (this.level().getBlockState(blockposition1).isAir() && iblockdata.canSurvive(this.level(), blockposition1)) { +- this.level().setBlockAndUpdate(blockposition1, iblockdata); - ++this.blocksSetOnFire; + // CraftBukkit start - add "!visualOnly" -+ if (!visualOnly && !CraftEventFactory.callBlockIgniteEvent(level, blockposition1, this).isCancelled()) { -+ this.level.setBlockAndUpdate(blockposition1, iblockdata); ++ if (!visualOnly && !CraftEventFactory.callBlockIgniteEvent(this.level(), blockposition1, this).isCancelled()) { ++ this.level().setBlockAndUpdate(blockposition1, iblockdata); + ++this.blocksSetOnFire; + } + // CraftBukkit end diff --git a/paper-server/nms-patches/net/minecraft/world/entity/EntityLiving.patch b/paper-server/nms-patches/net/minecraft/world/entity/EntityLiving.patch index 94126d5e8f..b61f485f77 100644 --- a/paper-server/nms-patches/net/minecraft/world/entity/EntityLiving.patch +++ b/paper-server/nms-patches/net/minecraft/world/entity/EntityLiving.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/entity/EntityLiving.java +++ b/net/minecraft/world/entity/EntityLiving.java -@@ -117,6 +117,30 @@ +@@ -119,6 +119,30 @@ import net.minecraft.world.scores.ScoreboardTeam; import org.slf4j.Logger; @@ -31,7 +31,7 @@ public abstract class EntityLiving extends Entity implements Attackable { private static final Logger LOGGER = LogUtils.getLogger(); -@@ -224,6 +248,20 @@ +@@ -227,6 +251,20 @@ private float swimAmountO; protected BehaviorController brain; private boolean skipDropExperience; @@ -52,7 +52,7 @@ protected EntityLiving(EntityTypes entitytypes, World world) { super(entitytypes, world); -@@ -236,7 +274,9 @@ +@@ -239,7 +277,9 @@ this.useItem = ItemStack.EMPTY; this.lastClimbablePos = Optional.empty(); this.attributes = new AttributeMapBase(AttributeDefaults.getSupplier(entitytypes)); @@ -63,22 +63,22 @@ this.blocksBuilding = true; this.rotA = (float) ((Math.random() + 1.0D) * 0.009999999776482582D); this.reapplyPosition(); -@@ -303,7 +343,13 @@ - double d1 = Math.min((double) (0.2F + f / 15.0F), 2.5D); - int i = (int) (150.0D * d1); +@@ -318,7 +358,13 @@ + double d7 = Math.min((double) (0.2F + f / 15.0F), 2.5D); + int i = (int) (150.0D * d7); -- ((WorldServer) this.level).sendParticles(new ParticleParamBlock(Particles.BLOCK, iblockdata), this.getX(), this.getY(), this.getZ(), i, 0.0D, 0.0D, 0.0D, 0.15000000596046448D); -+ // CraftBukkit start - visiblity api -+ if (this instanceof EntityPlayer) { -+ ((WorldServer) this.level).sendParticles((EntityPlayer) this, new ParticleParamBlock(Particles.BLOCK, iblockdata), this.getX(), this.getY(), this.getZ(), i, 0.0D, 0.0D, 0.0D, 0.15000000596046448D, false); -+ } else { -+ ((WorldServer) this.level).sendParticles(new ParticleParamBlock(Particles.BLOCK, iblockdata), this.getX(), this.getY(), this.getZ(), i, 0.0D, 0.0D, 0.0D, 0.15000000596046448D); -+ } -+ // CraftBukkit end - } +- ((WorldServer) this.level()).sendParticles(new ParticleParamBlock(Particles.BLOCK, iblockdata), d1, d2, d3, i, 0.0D, 0.0D, 0.0D, 0.15000000596046448D); ++ // CraftBukkit start - visiblity api ++ if (this instanceof EntityPlayer) { ++ ((WorldServer) this.level()).sendParticles((EntityPlayer) this, new ParticleParamBlock(Particles.BLOCK, iblockdata), this.getX(), this.getY(), this.getZ(), i, 0.0D, 0.0D, 0.0D, 0.15000000596046448D, false); ++ } else { ++ ((WorldServer) this.level()).sendParticles(new ParticleParamBlock(Particles.BLOCK, iblockdata), d1, d2, d3, i, 0.0D, 0.0D, 0.0D, 0.15000000596046448D); ++ } ++ // CraftBukkit end } -@@ -655,13 +701,19 @@ + super.checkFallDamage(d0, flag, iblockdata, blockposition); +@@ -673,13 +719,19 @@ } public void onEquipItem(EnumItemSlot enumitemslot, ItemStack itemstack, ItemStack itemstack1) { @@ -94,12 +94,12 @@ Equipable equipable = Equipable.get(itemstack1); if (equipable != null && !this.isSpectator() && equipable.getEquipmentSlot() == enumitemslot) { -- if (!this.level.isClientSide() && !this.isSilent()) { -+ if (!this.level.isClientSide() && !this.isSilent() && !silent) { // CraftBukkit - this.level.playSound((EntityHuman) null, this.getX(), this.getY(), this.getZ(), equipable.getEquipSound(), this.getSoundSource(), 1.0F, 1.0F); +- if (!this.level().isClientSide() && !this.isSilent()) { ++ if (!this.level().isClientSide() && !this.isSilent() && !silent) { // CraftBukkit + this.level().playSound((EntityHuman) null, this.getX(), this.getY(), this.getZ(), equipable.getEquipSound(), this.getSoundSource(), 1.0F, 1.0F); } -@@ -735,6 +787,17 @@ +@@ -753,6 +805,17 @@ } } @@ -117,7 +117,7 @@ if (nbttagcompound.contains("Health", 99)) { this.setHealth(nbttagcompound.getFloat("Health")); } -@@ -772,9 +835,32 @@ +@@ -790,9 +853,32 @@ } @@ -150,10 +150,10 @@ try { while (iterator.hasNext()) { MobEffectList mobeffectlist = (MobEffectList) iterator.next(); -@@ -784,6 +870,12 @@ +@@ -802,6 +888,12 @@ this.onEffectUpdated(mobeffect, true, (Entity) null); })) { - if (!this.level.isClientSide) { + if (!this.level().isClientSide) { + // CraftBukkit start + EntityPotionEffectEvent event = CraftEventFactory.callEntityPotionEffectChangeEvent(this, mobeffect, null, org.bukkit.event.entity.EntityPotionEffectEvent.Cause.EXPIRATION); + if (event.isCancelled()) { @@ -163,7 +163,7 @@ iterator.remove(); this.onEffectRemoved(mobeffect); } -@@ -794,6 +886,17 @@ +@@ -812,6 +904,17 @@ } catch (ConcurrentModificationException concurrentmodificationexception) { ; } @@ -180,8 +180,8 @@ + // CraftBukkit end if (this.effectsDirty) { - if (!this.level.isClientSide) { -@@ -920,7 +1023,13 @@ + if (!this.level().isClientSide) { +@@ -938,7 +1041,13 @@ this.entityData.set(EntityLiving.DATA_EFFECT_COLOR_ID, 0); } @@ -192,10 +192,10 @@ + + public boolean removeAllEffects(EntityPotionEffectEvent.Cause cause) { + // CraftBukkit end - if (this.level.isClientSide) { + if (this.level().isClientSide) { return false; } else { -@@ -929,7 +1038,14 @@ +@@ -947,7 +1056,14 @@ boolean flag; for (flag = false; iterator.hasNext(); flag = true) { @@ -211,7 +211,7 @@ iterator.remove(); } -@@ -958,18 +1074,48 @@ +@@ -976,18 +1092,48 @@ return this.addEffect(mobeffect, (Entity) null); } @@ -261,7 +261,7 @@ return true; } else { return false; -@@ -1006,13 +1152,39 @@ +@@ -1024,13 +1170,39 @@ return this.getMobType() == EnumMonsterType.UNDEAD; } @@ -302,7 +302,7 @@ if (mobeffect != null) { this.onEffectRemoved(mobeffect); -@@ -1049,20 +1221,55 @@ +@@ -1098,20 +1270,55 @@ } @@ -319,7 +319,7 @@ + EntityRegainHealthEvent event = new EntityRegainHealthEvent(this.getBukkitEntity(), f, regainReason); + // Suppress during worldgen + if (this.valid) { -+ this.level.getCraftServer().getPluginManager().callEvent(event); ++ this.level().getCraftServer().getPluginManager().callEvent(event); + } + + if (!event.isCancelled()) { @@ -359,16 +359,16 @@ this.entityData.set(EntityLiving.DATA_HEALTH_ID, MathHelper.clamp(f, 0.0F, this.getMaxHealth())); } -@@ -1076,7 +1283,7 @@ +@@ -1125,7 +1332,7 @@ return false; - } else if (this.level.isClientSide) { + } else if (this.level().isClientSide) { return false; - } else if (this.isDeadOrDying()) { + } else if (this.isRemoved() || this.dead || this.getHealth() <= 0.0F) { // CraftBukkit - Don't allow entities that got set to dead/killed elsewhere to get damaged and die return false; } else if (damagesource.is(DamageTypeTags.IS_FIRE) && this.hasEffect(MobEffects.FIRE_RESISTANCE)) { return false; -@@ -1087,10 +1294,11 @@ +@@ -1136,10 +1343,11 @@ this.noActionTime = 0; float f1 = f; @@ -382,7 +382,7 @@ this.hurtCurrentlyUsedShield(f); f2 = f; f = 0.0F; -@@ -1114,27 +1322,46 @@ +@@ -1163,27 +1371,46 @@ this.walkAnimation.setSpeed(1.5F); boolean flag1 = true; @@ -434,7 +434,7 @@ Entity entity1 = damagesource.getEntity(); if (entity1 != null) { -@@ -1248,19 +1475,32 @@ +@@ -1297,19 +1524,32 @@ EnumHand[] aenumhand = EnumHand.values(); int i = aenumhand.length; @@ -460,7 +460,7 @@ + org.bukkit.inventory.EquipmentSlot handSlot = (hand != null) ? org.bukkit.craftbukkit.CraftEquipmentSlot.getHand(hand) : null; + EntityResurrectEvent event = new EntityResurrectEvent((LivingEntity) this.getBukkitEntity(), handSlot); + event.setCancelled(itemstack == null); -+ this.level.getCraftServer().getPluginManager().callEvent(event); ++ this.level().getCraftServer().getPluginManager().callEvent(event); + + if (!event.isCancelled()) { + if (!itemstack1.isEmpty()) { @@ -471,7 +471,7 @@ EntityPlayer entityplayer = (EntityPlayer) this; entityplayer.awardStat(StatisticList.ITEM_USED.get(Items.TOTEM_OF_UNDYING)); -@@ -1268,14 +1508,16 @@ +@@ -1317,14 +1557,16 @@ } this.setHealth(1.0F); @@ -485,7 +485,7 @@ + this.addEffect(new MobEffect(MobEffects.ABSORPTION, 100, 1), org.bukkit.event.entity.EntityPotionEffectEvent.Cause.TOTEM); + this.addEffect(new MobEffect(MobEffects.FIRE_RESISTANCE, 800, 0), org.bukkit.event.entity.EntityPotionEffectEvent.Cause.TOTEM); + // CraftBukkit end - this.level.broadcastEntityEvent(this, (byte) 35); + this.level().broadcastEntityEvent(this, (byte) 35); } - return itemstack != null; @@ -493,20 +493,20 @@ } } -@@ -1380,14 +1622,22 @@ +@@ -1433,14 +1675,22 @@ IBlockData iblockdata = Blocks.WITHER_ROSE.defaultBlockState(); - if (this.level.getBlockState(blockposition).isAir() && iblockdata.canSurvive(this.level, blockposition)) { -- this.level.setBlock(blockposition, iblockdata, 3); + if (this.level().getBlockState(blockposition).isAir() && iblockdata.canSurvive(this.level(), blockposition)) { +- this.level().setBlock(blockposition, iblockdata, 3); - flag = true; + // CraftBukkit start - call EntityBlockFormEvent for Wither Rose -+ flag = org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockFormEvent(this.level, blockposition, iblockdata, 3, this); ++ flag = org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockFormEvent(this.level(), blockposition, iblockdata, 3, this); + // CraftBukkit end } } if (!flag) { - EntityItem entityitem = new EntityItem(this.level, this.getX(), this.getY(), this.getZ(), new ItemStack(Items.WITHER_ROSE)); + EntityItem entityitem = new EntityItem(this.level(), this.getX(), this.getY(), this.getZ(), new ItemStack(Items.WITHER_ROSE)); + // CraftBukkit start + org.bukkit.event.entity.EntityDropItemEvent event = new org.bukkit.event.entity.EntityDropItemEvent(this.getBukkitEntity(), (org.bukkit.entity.Item) entityitem.getBukkitEntity()); @@ -515,15 +515,15 @@ + return; + } + // CraftBukkit end - this.level.addFreshEntity(entityitem); + this.level().addFreshEntity(entityitem); } } -@@ -1407,21 +1657,40 @@ +@@ -1460,21 +1710,40 @@ boolean flag = this.lastHurtByPlayerTime > 0; + this.dropEquipment(); // CraftBukkit - from below - if (this.shouldDropLoot() && this.level.getGameRules().getBoolean(GameRules.RULE_DOMOBLOOT)) { + if (this.shouldDropLoot() && this.level().getGameRules().getBoolean(GameRules.RULE_DOMOBLOOT)) { this.dropFromLootTable(damagesource, flag); this.dropCustomDeathLoot(damagesource, i, flag); } @@ -542,27 +542,27 @@ - protected void dropExperience() { + // CraftBukkit start + public int getExpReward() { - if (this.level instanceof WorldServer && !this.wasExperienceConsumed() && (this.isAlwaysExperienceDropper() || this.lastHurtByPlayerTime > 0 && this.shouldDropExperience() && this.level.getGameRules().getBoolean(GameRules.RULE_DOMOBLOOT))) { -- EntityExperienceOrb.award((WorldServer) this.level, this.position(), this.getExperienceReward()); + if (this.level() instanceof WorldServer && !this.wasExperienceConsumed() && (this.isAlwaysExperienceDropper() || this.lastHurtByPlayerTime > 0 && this.shouldDropExperience() && this.level().getGameRules().getBoolean(GameRules.RULE_DOMOBLOOT))) { +- EntityExperienceOrb.award((WorldServer) this.level(), this.position(), this.getExperienceReward()); + int i = this.getExperienceReward(); + return i; + } else { + return 0; -+ } + } + } + // CraftBukkit end + + protected void dropExperience() { + // CraftBukkit start - Update getExpReward() above if the removed if() changes! + if (true && !(this instanceof net.minecraft.world.entity.boss.enderdragon.EntityEnderDragon)) { // CraftBukkit - SPIGOT-2420: Special case ender dragon will drop the xp over time -+ EntityExperienceOrb.award((WorldServer) this.level, this.position(), this.expToDrop); ++ EntityExperienceOrb.award((WorldServer) this.level(), this.position(), this.expToDrop); + this.expToDrop = 0; - } ++ } + // CraftBukkit end } -@@ -1512,6 +1781,28 @@ +@@ -1565,6 +1834,28 @@ return itemstack.getEatingSound(); } @@ -588,10 +588,10 @@ + } + // CraftBukkit end + - @Override - public void setOnGround(boolean flag) { - super.setOnGround(flag); -@@ -1567,9 +1858,14 @@ + public Optional getLastClimbablePos() { + return this.lastClimbablePos; + } +@@ -1611,9 +1902,14 @@ int i = this.calculateFallDamage(f, f1); if (i > 0) { @@ -607,7 +607,7 @@ return true; } else { return flag; -@@ -1621,7 +1917,7 @@ +@@ -1665,7 +1961,7 @@ protected float getDamageAfterArmorAbsorb(DamageSource damagesource, float f) { if (!damagesource.is(DamageTypeTags.BYPASSES_ARMOR)) { @@ -616,7 +616,7 @@ f = CombatMath.getDamageAfterAbsorb(f, (float) this.getArmorValue(), (float) this.getAttributeValue(GenericAttributes.ARMOR_TOUGHNESS)); } -@@ -1634,7 +1930,8 @@ +@@ -1678,7 +1974,8 @@ } else { int i; @@ -626,7 +626,7 @@ i = (this.getEffect(MobEffects.DAMAGE_RESISTANCE).getAmplifier() + 1) * 5; int j = 25 - i; float f1 = f * (float) j; -@@ -1667,16 +1964,125 @@ +@@ -1711,16 +2008,125 @@ } } @@ -712,7 +712,10 @@ + } + + f = (float) event.getFinalDamage(); -+ + +- f = Math.max(f - this.getAbsorptionAmount(), 0.0F); +- this.setAbsorptionAmount(this.getAbsorptionAmount() - (f1 - f)); +- float f2 = f1 - f; + // Resistance + if (event.getDamage(DamageModifier.RESISTANCE) < 0) { + float f3 = (float) -event.getDamage(DamageModifier.RESISTANCE); @@ -724,7 +727,7 @@ + } + } + } -+ + + // Apply damage to helmet + if (damagesource.is(DamageTypeTags.DAMAGES_HELMET) && !this.getItemBySlot(EnumItemSlot.HEAD).isEmpty()) { + this.hurtHelmet(damagesource, f); @@ -738,7 +741,7 @@ + + // Apply blocking code // PAIL: steal from above + if (event.getDamage(DamageModifier.BLOCKING) < 0) { -+ this.level.broadcastEntityEvent(this, (byte) 29); // SPIGOT-4635 - shield damage sound ++ this.level().broadcastEntityEvent(this, (byte) 29); // SPIGOT-4635 - shield damage sound + this.hurtCurrentlyUsedShield((float) -event.getDamage(DamageModifier.BLOCKING)); + Entity entity = damagesource.getDirectEntity(); + @@ -746,21 +749,18 @@ + this.blockUsingShield((EntityLiving) entity); + } + } - -- f = Math.max(f - this.getAbsorptionAmount(), 0.0F); -- this.setAbsorptionAmount(this.getAbsorptionAmount() - (f1 - f)); -- float f2 = f1 - f; ++ + absorptionModifier = (float) -event.getDamage(DamageModifier.ABSORPTION); + this.setAbsorptionAmount(Math.max(this.getAbsorptionAmount() - absorptionModifier, 0.0F)); + float f2 = absorptionModifier; - ++ + if (f2 > 0.0F && f2 < 3.4028235E37F && this instanceof EntityHuman) { + ((EntityHuman) this).awardStat(StatisticList.DAMAGE_ABSORBED, Math.round(f2 * 10.0F)); + } if (f2 > 0.0F && f2 < 3.4028235E37F) { Entity entity = damagesource.getEntity(); -@@ -1687,15 +2093,49 @@ +@@ -1731,13 +2137,47 @@ } } @@ -774,10 +774,8 @@ + } + } + // CraftBukkit end - float f3 = this.getHealth(); - - this.getCombatTracker().recordDamage(damagesource, f3, f); - this.setHealth(f3 - f); + this.getCombatTracker().recordDamage(damagesource, f); + this.setHealth(this.getHealth() - f); - this.setAbsorptionAmount(this.getAbsorptionAmount() - f); + // CraftBukkit start + if (!human) { @@ -812,28 +810,27 @@ } public CombatTracker getCombatTracker() { -@@ -1716,9 +2156,19 @@ +@@ -1758,8 +2198,18 @@ } public final void setArrowCount(int i) { - this.entityData.set(EntityLiving.DATA_ARROW_COUNT_ID, i); + // CraftBukkit start + setArrowCount(i, false); - } - ++ } ++ + public final void setArrowCount(int i, boolean flag) { + ArrowBodyCountChangeEvent event = CraftEventFactory.callArrowBodyCountChangeEvent(this, getArrowCount(), i, flag); + if (event.isCancelled()) { + return; + } + this.entityData.set(EntityLiving.DATA_ARROW_COUNT_ID, event.getNewAmount()); -+ } + } + // CraftBukkit end -+ + public final int getStingerCount() { return (Integer) this.entityData.get(EntityLiving.DATA_STINGER_COUNT_ID); - } -@@ -1959,6 +2409,12 @@ +@@ -2001,6 +2451,12 @@ public abstract ItemStack getItemBySlot(EnumItemSlot enumitemslot); @@ -846,23 +843,23 @@ @Override public abstract void setItemSlot(EnumItemSlot enumitemslot, ItemStack itemstack); -@@ -2198,6 +2654,7 @@ +@@ -2238,6 +2694,7 @@ } - if (this.onGround && !this.level.isClientSide) { + if (this.onGround() && !this.level().isClientSide) { + if (getSharedFlag(7) && !CraftEventFactory.callToggleGlideEvent(this, false).isCancelled()) // CraftBukkit this.setSharedFlag(7, false); } } else { -@@ -2757,6 +3214,7 @@ +@@ -2809,6 +3266,7 @@ } - if (!this.level.isClientSide) { + if (!this.level().isClientSide) { + if (flag != this.getSharedFlag(7) && !CraftEventFactory.callToggleGlideEvent(this, flag).isCancelled()) // CraftBukkit this.setSharedFlag(7, flag); } -@@ -2916,14 +3374,21 @@ +@@ -2968,14 +3426,21 @@ @Override public boolean isPickable() { @@ -886,18 +883,18 @@ @Override public float getYHeadRot() { return this.yHeadRot; -@@ -3118,7 +3583,26 @@ +@@ -3170,7 +3635,26 @@ } else { if (!this.useItem.isEmpty() && this.isUsingItem()) { this.triggerItemUseEffects(this.useItem, 16); -- ItemStack itemstack = this.useItem.finishUsingItem(this.level, this); +- ItemStack itemstack = this.useItem.finishUsingItem(this.level(), this); + // CraftBukkit start - fire PlayerItemConsumeEvent + ItemStack itemstack; + if (this instanceof EntityPlayer) { + org.bukkit.inventory.ItemStack craftItem = CraftItemStack.asBukkitCopy(this.useItem); + org.bukkit.inventory.EquipmentSlot hand = org.bukkit.craftbukkit.CraftEquipmentSlot.getHand(enumhand); + PlayerItemConsumeEvent event = new PlayerItemConsumeEvent((Player) this.getBukkitEntity(), craftItem, hand); -+ level.getCraftServer().getPluginManager().callEvent(event); ++ this.level().getCraftServer().getPluginManager().callEvent(event); + + if (event.isCancelled()) { + // Update client @@ -906,15 +903,15 @@ + return; + } + -+ itemstack = (craftItem.equals(event.getItem())) ? this.useItem.finishUsingItem(this.level, this) : CraftItemStack.asNMSCopy(event.getItem()).finishUsingItem(level, this); ++ itemstack = (craftItem.equals(event.getItem())) ? this.useItem.finishUsingItem(this.level(), this) : CraftItemStack.asNMSCopy(event.getItem()).finishUsingItem(this.level(), this); + } else { -+ itemstack = this.useItem.finishUsingItem(this.level, this); ++ itemstack = this.useItem.finishUsingItem(this.level(), this); + } + // CraftBukkit end if (itemstack != this.useItem) { this.setItemInHand(enumhand, itemstack); -@@ -3196,6 +3680,12 @@ +@@ -3248,6 +3732,12 @@ } public boolean randomTeleport(double d0, double d1, double d2, boolean flag) { @@ -927,7 +924,7 @@ double d3 = this.getX(); double d4 = this.getY(); double d5 = this.getZ(); -@@ -3220,16 +3710,41 @@ +@@ -3272,16 +3762,41 @@ } if (flag2) { @@ -945,8 +942,8 @@ + + if (flag1) { + if (!(this instanceof EntityPlayer)) { -+ EntityTeleportEvent teleport = new EntityTeleportEvent(this.getBukkitEntity(), new Location(this.level.getWorld(), d3, d4, d5), new Location(this.level.getWorld(), d0, d6, d2)); -+ this.level.getCraftServer().getPluginManager().callEvent(teleport); ++ EntityTeleportEvent teleport = new EntityTeleportEvent(this.getBukkitEntity(), new Location(this.level().getWorld(), d3, d4, d5), new Location(this.level().getWorld(), d0, d6, d2)); ++ this.level().getCraftServer().getPluginManager().callEvent(teleport); + if (!teleport.isCancelled()) { + Location to = teleport.getTo(); + this.teleportTo(to.getX(), to.getY(), to.getZ()); @@ -972,7 +969,7 @@ } else { if (flag) { world.broadcastEntityEvent(this, (byte) 46); -@@ -3239,7 +3754,7 @@ +@@ -3291,7 +3806,7 @@ ((EntityCreature) this).getNavigation().stop(); } @@ -981,25 +978,25 @@ } } -@@ -3322,7 +3837,7 @@ +@@ -3374,7 +3889,7 @@ } public void stopSleeping() { - Optional optional = this.getSleepingPos(); + Optional optional = this.getSleepingPos(); // CraftBukkit - decompile error - World world = this.level; + World world = this.level(); - java.util.Objects.requireNonNull(this.level); -@@ -3356,7 +3871,7 @@ + java.util.Objects.requireNonNull(world); +@@ -3408,7 +3923,7 @@ @Nullable public EnumDirection getBedOrientation() { - BlockPosition blockposition = (BlockPosition) this.getSleepingPos().orElse((Object) null); + BlockPosition blockposition = (BlockPosition) this.getSleepingPos().orElse(null); // CraftBukkit - decompile error - return blockposition != null ? BlockBed.getBedOrientation(this.level, blockposition) : null; + return blockposition != null ? BlockBed.getBedOrientation(this.level(), blockposition) : null; } -@@ -3404,7 +3919,7 @@ +@@ -3456,7 +3971,7 @@ Pair pair = (Pair) iterator.next(); if (!world.isClientSide && pair.getFirst() != null && world.random.nextFloat() < (Float) pair.getSecond()) { diff --git a/paper-server/nms-patches/net/minecraft/world/entity/IEntitySelector.patch b/paper-server/nms-patches/net/minecraft/world/entity/IEntitySelector.patch index 72795fc389..baf18425ac 100644 --- a/paper-server/nms-patches/net/minecraft/world/entity/IEntitySelector.patch +++ b/paper-server/nms-patches/net/minecraft/world/entity/IEntitySelector.patch @@ -7,5 +7,5 @@ - if (!entity1.isPushable()) { + if (!entity1.canCollideWithBukkit(entity) || !entity.canCollideWithBukkit(entity1)) { // CraftBukkit - collidable API return false; - } else if (entity.level.isClientSide && (!(entity1 instanceof EntityHuman) || !((EntityHuman) entity1).isLocalPlayer())) { + } else if (entity.level().isClientSide && (!(entity1 instanceof EntityHuman) || !((EntityHuman) entity1).isLocalPlayer())) { return false; diff --git a/paper-server/nms-patches/net/minecraft/world/entity/Interaction.patch b/paper-server/nms-patches/net/minecraft/world/entity/Interaction.patch index 4e95c9fe21..717ba74985 100644 --- a/paper-server/nms-patches/net/minecraft/world/entity/Interaction.patch +++ b/paper-server/nms-patches/net/minecraft/world/entity/Interaction.patch @@ -22,7 +22,7 @@ Logger logger; if (nbttagcompound.contains("attack")) { -@@ -138,12 +144,19 @@ +@@ -143,12 +149,19 @@ public boolean skipAttackInteraction(Entity entity) { if (entity instanceof EntityHuman) { EntityHuman entityhuman = (EntityHuman) entity; @@ -34,7 +34,7 @@ + } + // CraftBukkit end - this.attack = new Interaction.PlayerAction(entityhuman.getUUID(), this.level.getGameTime()); + this.attack = new Interaction.PlayerAction(entityhuman.getUUID(), this.level().getGameTime()); if (entityhuman instanceof EntityPlayer) { EntityPlayer entityplayer = (EntityPlayer) entityhuman; diff --git a/paper-server/nms-patches/net/minecraft/world/entity/ai/behavior/BehaviorAttackTargetForget.patch b/paper-server/nms-patches/net/minecraft/world/entity/ai/behavior/BehaviorAttackTargetForget.patch index 207170382d..24aed4d7eb 100644 --- a/paper-server/nms-patches/net/minecraft/world/entity/ai/behavior/BehaviorAttackTargetForget.patch +++ b/paper-server/nms-patches/net/minecraft/world/entity/ai/behavior/BehaviorAttackTargetForget.patch @@ -14,7 +14,7 @@ private static final int TIMEOUT_TO_GET_WITHIN_ATTACK_RANGE = 200; @@ -41,6 +47,18 @@ - if (entityinsentient.canAttack(entityliving) && (!flag || !isTiredOfTryingToReachTarget(entityinsentient, behaviorbuilder_b.tryGet(memoryaccessor1))) && entityliving.isAlive() && entityliving.level == entityinsentient.level && !predicate.test(entityliving)) { + if (entityinsentient.canAttack(entityliving) && (!flag || !isTiredOfTryingToReachTarget(entityinsentient, behaviorbuilder_b.tryGet(memoryaccessor1))) && entityliving.isAlive() && entityliving.level() == entityinsentient.level() && !predicate.test(entityliving)) { return true; } else { + // CraftBukkit start diff --git a/paper-server/nms-patches/net/minecraft/world/entity/ai/behavior/BehaviorFarm.patch b/paper-server/nms-patches/net/minecraft/world/entity/ai/behavior/BehaviorFarm.patch index 7c17d87c61..e88db9b584 100644 --- a/paper-server/nms-patches/net/minecraft/world/entity/ai/behavior/BehaviorFarm.patch +++ b/paper-server/nms-patches/net/minecraft/world/entity/ai/behavior/BehaviorFarm.patch @@ -1,6 +1,17 @@ --- a/net/minecraft/world/entity/ai/behavior/BehaviorFarm.java +++ b/net/minecraft/world/entity/ai/behavior/BehaviorFarm.java -@@ -80,8 +80,8 @@ +@@ -26,6 +26,10 @@ + import net.minecraft.world.level.block.state.IBlockData; + import net.minecraft.world.level.gameevent.GameEvent; + ++// CraftBukkit start ++import net.minecraft.world.level.block.Blocks; ++// CraftBukkit end ++ + public class BehaviorFarm extends Behavior { + + private static final int HARVEST_DURATION = 200; +@@ -81,8 +85,8 @@ protected void start(WorldServer worldserver, EntityVillager entityvillager, long i) { if (i > this.nextOkStartTime && this.aboveFarmlandPos != null) { @@ -11,7 +22,7 @@ } } -@@ -101,7 +101,11 @@ +@@ -102,7 +106,11 @@ Block block1 = worldserver.getBlockState(this.aboveFarmlandPos.below()).getBlock(); if (block instanceof BlockCrops && ((BlockCrops) block).isMaxAge(iblockdata)) { @@ -24,45 +35,24 @@ } if (iblockdata.isAir() && block1 instanceof BlockSoil && entityvillager.hasFarmSeeds()) { -@@ -114,27 +118,30 @@ - if (!itemstack.isEmpty()) { - IBlockData iblockdata1; +@@ -119,9 +127,13 @@ + ItemBlock itemblock = (ItemBlock) item; + IBlockData iblockdata1 = itemblock.getBlock().defaultBlockState(); -+ // CraftBukkit start - if (itemstack.is(Items.WHEAT_SEEDS)) { - iblockdata1 = Blocks.WHEAT.defaultBlockState(); - worldserver.setBlockAndUpdate(this.aboveFarmlandPos, iblockdata1); - worldserver.gameEvent(GameEvent.BLOCK_PLACE, this.aboveFarmlandPos, GameEvent.a.of(entityvillager, iblockdata1)); - flag = true; - } else if (itemstack.is(Items.POTATO)) { - iblockdata1 = Blocks.POTATOES.defaultBlockState(); -- worldserver.setBlockAndUpdate(this.aboveFarmlandPos, iblockdata1); -- worldserver.gameEvent(GameEvent.BLOCK_PLACE, this.aboveFarmlandPos, GameEvent.a.of(entityvillager, iblockdata1)); - flag = true; - } else if (itemstack.is(Items.CARROT)) { - iblockdata1 = Blocks.CARROTS.defaultBlockState(); -- worldserver.setBlockAndUpdate(this.aboveFarmlandPos, iblockdata1); -- worldserver.gameEvent(GameEvent.BLOCK_PLACE, this.aboveFarmlandPos, GameEvent.a.of(entityvillager, iblockdata1)); - flag = true; - } else if (itemstack.is(Items.BEETROOT_SEEDS)) { - iblockdata1 = Blocks.BEETROOTS.defaultBlockState(); -+ flag = true; -+ } else { -+ iblockdata1 = null; -+ } -+ -+ if (iblockdata1 != null && !org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(entityvillager, this.aboveFarmlandPos, iblockdata1).isCancelled()) { - worldserver.setBlockAndUpdate(this.aboveFarmlandPos, iblockdata1); - worldserver.gameEvent(GameEvent.BLOCK_PLACE, this.aboveFarmlandPos, GameEvent.a.of(entityvillager, iblockdata1)); - flag = true; -+ } else { -+ flag = false; ++ // CraftBukkit start ++ if (!org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(entityvillager, this.aboveFarmlandPos, iblockdata1).isCancelled()) { ++ worldserver.setBlockAndUpdate(this.aboveFarmlandPos, iblockdata1); ++ worldserver.gameEvent(GameEvent.BLOCK_PLACE, this.aboveFarmlandPos, GameEvent.a.of(entityvillager, iblockdata1)); ++ flag = true; ++ } ++ // CraftBukkit end } -+ // CraftBukkit end } - if (flag) { -@@ -153,8 +160,8 @@ +@@ -141,8 +153,8 @@ this.aboveFarmlandPos = this.getValidFarmland(worldserver); if (this.aboveFarmlandPos != null) { this.nextOkStartTime = i + 20L; diff --git a/paper-server/nms-patches/net/minecraft/world/entity/ai/behavior/BehaviorFindAdmirableItem.patch b/paper-server/nms-patches/net/minecraft/world/entity/ai/behavior/BehaviorFindAdmirableItem.patch index 76c9978ab9..de85cbfef8 100644 --- a/paper-server/nms-patches/net/minecraft/world/entity/ai/behavior/BehaviorFindAdmirableItem.patch +++ b/paper-server/nms-patches/net/minecraft/world/entity/ai/behavior/BehaviorFindAdmirableItem.patch @@ -3,7 +3,7 @@ @@ -28,6 +28,20 @@ EntityItem entityitem = (EntityItem) behaviorbuilder_b.get(memoryaccessor2); - if (behaviorbuilder_b.tryGet(memoryaccessor3).isEmpty() && predicate.test(entityliving) && entityitem.closerThan(entityliving, (double) i) && entityliving.level.getWorldBorder().isWithinBounds(entityitem.blockPosition())) { + if (behaviorbuilder_b.tryGet(memoryaccessor3).isEmpty() && predicate.test(entityliving) && entityitem.closerThan(entityliving, (double) i) && entityliving.level().getWorldBorder().isWithinBounds(entityitem.blockPosition())) { + // CraftBukkit start + if (entityliving instanceof net.minecraft.world.entity.animal.allay.Allay) { + org.bukkit.event.entity.EntityTargetEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callEntityTargetEvent(entityliving, entityitem, org.bukkit.event.entity.EntityTargetEvent.TargetReason.CLOSEST_ENTITY); diff --git a/paper-server/nms-patches/net/minecraft/world/entity/ai/behavior/BehaviorInteractDoor.patch b/paper-server/nms-patches/net/minecraft/world/entity/ai/behavior/BehaviorInteractDoor.patch index 640dfea90f..28e608f44b 100644 --- a/paper-server/nms-patches/net/minecraft/world/entity/ai/behavior/BehaviorInteractDoor.patch +++ b/paper-server/nms-patches/net/minecraft/world/entity/ai/behavior/BehaviorInteractDoor.patch @@ -5,8 +5,8 @@ if (!blockdoor.isOpen(iblockdata)) { + // CraftBukkit start - entities opening doors -+ org.bukkit.event.entity.EntityInteractEvent event = new org.bukkit.event.entity.EntityInteractEvent(entityliving.getBukkitEntity(), org.bukkit.craftbukkit.block.CraftBlock.at(entityliving.level, blockposition)); -+ entityliving.level.getCraftServer().getPluginManager().callEvent(event); ++ org.bukkit.event.entity.EntityInteractEvent event = new org.bukkit.event.entity.EntityInteractEvent(entityliving.getBukkitEntity(), org.bukkit.craftbukkit.block.CraftBlock.at(entityliving.level(), blockposition)); ++ entityliving.level().getCraftServer().getPluginManager().callEvent(event); + if (event.isCancelled()) { + return false; + } @@ -19,8 +19,8 @@ if (!blockdoor1.isOpen(iblockdata1)) { + // CraftBukkit start - entities opening doors -+ org.bukkit.event.entity.EntityInteractEvent event = new org.bukkit.event.entity.EntityInteractEvent(entityliving.getBukkitEntity(), org.bukkit.craftbukkit.block.CraftBlock.at(entityliving.level, blockposition1)); -+ entityliving.level.getCraftServer().getPluginManager().callEvent(event); ++ org.bukkit.event.entity.EntityInteractEvent event = new org.bukkit.event.entity.EntityInteractEvent(entityliving.getBukkitEntity(), org.bukkit.craftbukkit.block.CraftBlock.at(entityliving.level(), blockposition1)); ++ entityliving.level().getCraftServer().getPluginManager().callEvent(event); + if (event.isCancelled()) { + return false; + } diff --git a/paper-server/nms-patches/net/minecraft/world/entity/ai/behavior/BehaviorUtil.patch b/paper-server/nms-patches/net/minecraft/world/entity/ai/behavior/BehaviorUtil.patch index 08d5c77781..246146ed44 100644 --- a/paper-server/nms-patches/net/minecraft/world/entity/ai/behavior/BehaviorUtil.patch +++ b/paper-server/nms-patches/net/minecraft/world/entity/ai/behavior/BehaviorUtil.patch @@ -26,7 +26,7 @@ public static void throwItem(EntityLiving entityliving, ItemStack itemstack, Vec3D vec3d, Vec3D vec3d1, float f) { + if (itemstack.isEmpty()) return; // CraftBukkit - SPIGOT-4940: no empty loot double d0 = entityliving.getEyeY() - (double) f; - EntityItem entityitem = new EntityItem(entityliving.level, entityliving.getX(), d0, entityliving.getZ(), itemstack); + EntityItem entityitem = new EntityItem(entityliving.level(), entityliving.getX(), d0, entityliving.getZ(), itemstack); @@ -101,12 +102,19 @@ vec3d2 = vec3d2.normalize().multiply(vec3d1.x, vec3d1.y, vec3d1.z); @@ -34,12 +34,12 @@ entityitem.setDefaultPickUpDelay(); + // CraftBukkit start + org.bukkit.event.entity.EntityDropItemEvent event = new org.bukkit.event.entity.EntityDropItemEvent(entityliving.getBukkitEntity(), (org.bukkit.entity.Item) entityitem.getBukkitEntity()); -+ entityitem.level.getCraftServer().getPluginManager().callEvent(event); ++ entityitem.level().getCraftServer().getPluginManager().callEvent(event); + if (event.isCancelled()) { + return; + } + // CraftBukkit end - entityliving.level.addFreshEntity(entityitem); + entityliving.level().addFreshEntity(entityitem); } public static SectionPosition findSectionClosestToVillage(WorldServer worldserver, SectionPosition sectionposition, int i) { diff --git a/paper-server/nms-patches/net/minecraft/world/entity/ai/goal/PathfinderGoalBreakDoor.patch b/paper-server/nms-patches/net/minecraft/world/entity/ai/goal/PathfinderGoalBreakDoor.patch index 5de56bf64c..2a6ba8eb11 100644 --- a/paper-server/nms-patches/net/minecraft/world/entity/ai/goal/PathfinderGoalBreakDoor.patch +++ b/paper-server/nms-patches/net/minecraft/world/entity/ai/goal/PathfinderGoalBreakDoor.patch @@ -3,13 +3,13 @@ @@ -71,6 +71,12 @@ } - if (this.breakTime == this.getDoorBreakTime() && this.isValidDifficulty(this.mob.level.getDifficulty())) { + if (this.breakTime == this.getDoorBreakTime() && this.isValidDifficulty(this.mob.level().getDifficulty())) { + // CraftBukkit start + if (org.bukkit.craftbukkit.event.CraftEventFactory.callEntityBreakDoorEvent(this.mob, this.doorPos).isCancelled()) { + this.start(); + return; + } + // CraftBukkit end - this.mob.level.removeBlock(this.doorPos, false); - this.mob.level.levelEvent(1021, this.doorPos, 0); - this.mob.level.levelEvent(2001, this.doorPos, Block.getId(this.mob.level.getBlockState(this.doorPos))); + this.mob.level().removeBlock(this.doorPos, false); + this.mob.level().levelEvent(1021, this.doorPos, 0); + this.mob.level().levelEvent(2001, this.doorPos, Block.getId(this.mob.level().getBlockState(this.doorPos))); diff --git a/paper-server/nms-patches/net/minecraft/world/entity/ai/goal/PathfinderGoalFollowOwner.patch b/paper-server/nms-patches/net/minecraft/world/entity/ai/goal/PathfinderGoalFollowOwner.patch index f23150a95b..6871610669 100644 --- a/paper-server/nms-patches/net/minecraft/world/entity/ai/goal/PathfinderGoalFollowOwner.patch +++ b/paper-server/nms-patches/net/minecraft/world/entity/ai/goal/PathfinderGoalFollowOwner.patch @@ -22,7 +22,7 @@ + CraftEntity entity = this.tamable.getBukkitEntity(); + Location to = new Location(entity.getWorld(), (double) i + 0.5D, (double) j, (double) k + 0.5D, this.tamable.getYRot(), this.tamable.getXRot()); + EntityTeleportEvent event = new EntityTeleportEvent(entity, entity.getLocation(), to); -+ this.tamable.level.getCraftServer().getPluginManager().callEvent(event); ++ this.tamable.level().getCraftServer().getPluginManager().callEvent(event); + if (event.isCancelled()) { + return false; + } diff --git a/paper-server/nms-patches/net/minecraft/world/entity/ai/goal/PathfinderGoalSit.patch b/paper-server/nms-patches/net/minecraft/world/entity/ai/goal/PathfinderGoalSit.patch index 5dcfbc00f6..10fef72e32 100644 --- a/paper-server/nms-patches/net/minecraft/world/entity/ai/goal/PathfinderGoalSit.patch +++ b/paper-server/nms-patches/net/minecraft/world/entity/ai/goal/PathfinderGoalSit.patch @@ -8,4 +8,4 @@ + return this.mob.isOrderedToSit() && this.mob.getTarget() == null; // CraftBukkit - Allow sitting for wild animals } else if (this.mob.isInWaterOrBubble()) { return false; - } else if (!this.mob.isOnGround()) { + } else if (!this.mob.onGround()) { diff --git a/paper-server/nms-patches/net/minecraft/world/entity/ai/goal/PathfinderGoalTempt.patch b/paper-server/nms-patches/net/minecraft/world/entity/ai/goal/PathfinderGoalTempt.patch index c6b5c45c10..2d265cb8c5 100644 --- a/paper-server/nms-patches/net/minecraft/world/entity/ai/goal/PathfinderGoalTempt.patch +++ b/paper-server/nms-patches/net/minecraft/world/entity/ai/goal/PathfinderGoalTempt.patch @@ -26,7 +26,7 @@ @@ -43,6 +50,15 @@ return false; } else { - this.player = this.mob.level.getNearestPlayer(this.targetingConditions, this.mob); + this.player = this.mob.level().getNearestPlayer(this.targetingConditions, this.mob); + // CraftBukkit start + if (this.player != null) { + EntityTargetLivingEntityEvent event = CraftEventFactory.callEntityTargetLivingEvent(this.mob, this.player, EntityTargetEvent.TargetReason.TEMPT); diff --git a/paper-server/nms-patches/net/minecraft/world/entity/ambient/EntityBat.patch b/paper-server/nms-patches/net/minecraft/world/entity/ambient/EntityBat.patch index e2755de4a6..99a53f8318 100644 --- a/paper-server/nms-patches/net/minecraft/world/entity/ambient/EntityBat.patch +++ b/paper-server/nms-patches/net/minecraft/world/entity/ambient/EntityBat.patch @@ -12,12 +12,12 @@ @@ -140,16 +142,24 @@ } - if (this.level.getNearestPlayer(EntityBat.BAT_RESTING_TARGETING, this) != null) { + if (this.level().getNearestPlayer(EntityBat.BAT_RESTING_TARGETING, this) != null) { + // CraftBukkit Start - Call BatToggleSleepEvent + if (CraftEventFactory.handleBatToggleSleepEvent(this, true)) { + this.setResting(false); + if (!flag) { -+ this.level.levelEvent((EntityHuman) null, 1025, blockposition, 0); ++ this.level().levelEvent((EntityHuman) null, 1025, blockposition, 0); + } + } + // CraftBukkit End @@ -27,22 +27,22 @@ + if (CraftEventFactory.handleBatToggleSleepEvent(this, true)) { this.setResting(false); if (!flag) { - this.level.levelEvent((EntityHuman) null, 1025, blockposition, 0); + this.level().levelEvent((EntityHuman) null, 1025, blockposition, 0); } } - } else { - this.setResting(false); - if (!flag) { -- this.level.levelEvent((EntityHuman) null, 1025, blockposition, 0); +- this.level().levelEvent((EntityHuman) null, 1025, blockposition, 0); - } + // CraftBukkit End - Call BatToggleSleepEvent } } else { - if (this.targetPosition != null && (!this.level.isEmptyBlock(this.targetPosition) || this.targetPosition.getY() <= this.level.getMinBuildHeight())) { + if (this.targetPosition != null && (!this.level().isEmptyBlock(this.targetPosition) || this.targetPosition.getY() <= this.level().getMinBuildHeight())) { @@ -173,7 +183,11 @@ this.zza = 0.5F; this.setYRot(this.getYRot() + f1); - if (this.random.nextInt(100) == 0 && this.level.getBlockState(blockposition1).isRedstoneConductor(this.level, blockposition1)) { + if (this.random.nextInt(100) == 0 && this.level().getBlockState(blockposition1).isRedstoneConductor(this.level(), blockposition1)) { - this.setResting(true); + // CraftBukkit Start - Call BatToggleSleepEvent + if (CraftEventFactory.handleBatToggleSleepEvent(this, false)) { @@ -55,7 +55,7 @@ @@ -198,7 +212,11 @@ return false; } else { - if (!this.level.isClientSide && this.isResting()) { + if (!this.level().isClientSide && this.isResting()) { - this.setResting(false); + // CraftBukkit Start - Call BatToggleSleepEvent + if (CraftEventFactory.handleBatToggleSleepEvent(this, true)) { diff --git a/paper-server/nms-patches/net/minecraft/world/entity/animal/EntityAnimal.patch b/paper-server/nms-patches/net/minecraft/world/entity/animal/EntityAnimal.patch index 0959348edd..30ec455630 100644 --- a/paper-server/nms-patches/net/minecraft/world/entity/animal/EntityAnimal.patch +++ b/paper-server/nms-patches/net/minecraft/world/entity/animal/EntityAnimal.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/entity/animal/EntityAnimal.java +++ b/net/minecraft/world/entity/animal/EntityAnimal.java -@@ -29,12 +29,19 @@ +@@ -30,12 +30,19 @@ import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.pathfinder.PathType; @@ -20,7 +20,7 @@ protected EntityAnimal(EntityTypes entitytypes, World world) { super(entitytypes, world); -@@ -71,6 +78,9 @@ +@@ -72,6 +79,9 @@ } @@ -30,7 +30,7 @@ @Override public boolean hurt(DamageSource damagesource, float f) { if (this.isInvulnerableTo(damagesource)) { -@@ -80,6 +90,7 @@ +@@ -81,6 +91,7 @@ return super.hurt(damagesource, f); } } @@ -38,7 +38,7 @@ @Override public float getWalkTargetValue(BlockPosition blockposition, IWorldReader iworldreader) { -@@ -174,10 +185,17 @@ +@@ -175,10 +186,17 @@ } public void setInLove(@Nullable EntityHuman entityhuman) { @@ -55,41 +55,45 @@ } + this.breedItem = entityhuman.getInventory().getSelected(); // CraftBukkit - this.level.broadcastEntityEvent(this, (byte) 18); + this.level().broadcastEntityEvent(this, (byte) 18); } -@@ -222,6 +240,16 @@ - if (entityplayer == null && entityanimal.getLoveCause() != null) { - entityplayer = entityanimal.getLoveCause(); - } -+ // CraftBukkit start - call EntityBreedEvent -+ entityageable.setBaby(true); -+ entityageable.moveTo(this.getX(), this.getY(), this.getZ(), 0.0F, 0.0F); -+ int experience = this.getRandom().nextInt(7) + 1; -+ org.bukkit.event.entity.EntityBreedEvent entityBreedEvent = org.bukkit.craftbukkit.event.CraftEventFactory.callEntityBreedEvent(entityageable, this, entityanimal, entityplayer, this.breedItem, experience); -+ if (entityBreedEvent.isCancelled()) { -+ return; -+ } -+ experience = entityBreedEvent.getExperience(); -+ // CraftBukkit end - - if (entityplayer != null) { - entityplayer.awardStat(StatisticList.ANIMALS_BRED); -@@ -232,12 +260,14 @@ - entityanimal.setAge(6000); - this.resetLove(); - entityanimal.resetLove(); -- entityageable.setBaby(true); -- entityageable.moveTo(this.getX(), this.getY(), this.getZ(), 0.0F, 0.0F); +@@ -221,14 +239,23 @@ + entityageable.setBaby(true); + entityageable.moveTo(this.getX(), this.getY(), this.getZ(), 0.0F, 0.0F); + this.finalizeSpawnChildFromBreeding(worldserver, entityanimal, entityageable); - worldserver.addFreshEntityWithPassengers(entityageable); + worldserver.addFreshEntityWithPassengers(entityageable, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.BREEDING); // CraftBukkit - added SpawnReason - worldserver.broadcastEntityEvent(this, (byte) 18); - if (worldserver.getGameRules().getBoolean(GameRules.RULE_DOMOBLOOT)) { -- worldserver.addFreshEntity(new EntityExperienceOrb(worldserver, this.getX(), this.getY(), this.getZ(), this.getRandom().nextInt(7) + 1)); -+ // CraftBukkit start - use event experience -+ if (experience > 0) { -+ worldserver.addFreshEntity(new EntityExperienceOrb(worldserver, this.getX(), this.getY(), this.getZ(), experience)); -+ } -+ // CraftBukkit end - } - } + } + + public void finalizeSpawnChildFromBreeding(WorldServer worldserver, EntityAnimal entityanimal, @Nullable EntityAgeable entityageable) { +- Optional.ofNullable(this.getLoveCause()).or(() -> { ++ // CraftBukkit start - call EntityBreedEvent ++ Optional cause = Optional.ofNullable(this.getLoveCause()).or(() -> { + return Optional.ofNullable(entityanimal.getLoveCause()); +- }).ifPresent((entityplayer) -> { ++ }); ++ int experience = this.getRandom().nextInt(7) + 1; ++ org.bukkit.event.entity.EntityBreedEvent entityBreedEvent = org.bukkit.craftbukkit.event.CraftEventFactory.callEntityBreedEvent(entityageable, this, entityanimal, cause.orElse(null), this.breedItem, experience); ++ if (entityBreedEvent.isCancelled()) { ++ return; ++ } ++ experience = entityBreedEvent.getExperience(); ++ cause.ifPresent((entityplayer) -> { ++ // CraftBukkit end + entityplayer.awardStat(StatisticList.ANIMALS_BRED); + CriterionTriggers.BRED_ANIMALS.trigger(entityplayer, this, entityanimal, entityageable); + }); +@@ -238,7 +265,11 @@ + entityanimal.resetLove(); + worldserver.broadcastEntityEvent(this, (byte) 18); + if (worldserver.getGameRules().getBoolean(GameRules.RULE_DOMOBLOOT)) { +- worldserver.addFreshEntity(new EntityExperienceOrb(worldserver, this.getX(), this.getY(), this.getZ(), this.getRandom().nextInt(7) + 1)); ++ // CraftBukkit start - use event experience ++ if (experience > 0) { ++ worldserver.addFreshEntity(new EntityExperienceOrb(worldserver, this.getX(), this.getY(), this.getZ(), experience)); ++ } ++ // CraftBukkit end + } + + } diff --git a/paper-server/nms-patches/net/minecraft/world/entity/animal/EntityBee.patch b/paper-server/nms-patches/net/minecraft/world/entity/animal/EntityBee.patch index 76fb97ab63..f3d1ba67bd 100644 --- a/paper-server/nms-patches/net/minecraft/world/entity/animal/EntityBee.patch +++ b/paper-server/nms-patches/net/minecraft/world/entity/animal/EntityBee.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/entity/animal/EntityBee.java +++ b/net/minecraft/world/entity/animal/EntityBee.java -@@ -243,7 +243,7 @@ +@@ -242,7 +242,7 @@ } if (b0 > 0) { @@ -9,15 +9,15 @@ } } -@@ -641,11 +641,15 @@ +@@ -640,11 +640,15 @@ if (this.isInvulnerableTo(damagesource)) { return false; } else { -- if (!this.level.isClientSide) { +- if (!this.level().isClientSide) { + // CraftBukkit start + boolean result = super.hurt(damagesource, f); + -+ if (result && !this.level.isClientSide) { ++ if (result && !this.level().isClientSide) { this.beePollinateGoal.stopPollinating(); } @@ -27,16 +27,16 @@ } } -@@ -1221,7 +1225,7 @@ +@@ -1216,7 +1220,7 @@ } } -- if (flag) { -+ if (flag && !org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(EntityBee.this, blockposition, iblockdata.setValue(blockstateinteger, (Integer) iblockdata.getValue(blockstateinteger) + 1)).isCancelled()) { // Spigot - EntityBee.this.level.levelEvent(2005, blockposition, 0); - EntityBee.this.level.setBlockAndUpdate(blockposition, (IBlockData) iblockdata.setValue(blockstateinteger, (Integer) iblockdata.getValue(blockstateinteger) + 1)); +- if (iblockdata1 != null) { ++ if (iblockdata1 != null&& !org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(EntityBee.this, blockposition, iblockdata1).isCancelled()) { // CraftBukkit + EntityBee.this.level().levelEvent(2005, blockposition, 0); + EntityBee.this.level().setBlockAndUpdate(blockposition, iblockdata1); EntityBee.this.incrementNumCropsGrownSincePollination(); -@@ -1294,7 +1298,7 @@ +@@ -1289,7 +1293,7 @@ @Override protected void alertOther(EntityInsentient entityinsentient, EntityLiving entityliving) { if (entityinsentient instanceof EntityBee && this.mob.hasLineOfSight(entityliving)) { @@ -45,7 +45,7 @@ } } -@@ -1303,7 +1307,7 @@ +@@ -1298,7 +1302,7 @@ private static class c extends PathfinderGoalNearestAttackableTarget { c(EntityBee entitybee) { diff --git a/paper-server/nms-patches/net/minecraft/world/entity/animal/EntityCat.patch b/paper-server/nms-patches/net/minecraft/world/entity/animal/EntityCat.patch index 139d6632dc..cbb1519ccd 100644 --- a/paper-server/nms-patches/net/minecraft/world/entity/animal/EntityCat.patch +++ b/paper-server/nms-patches/net/minecraft/world/entity/animal/EntityCat.patch @@ -8,7 +8,7 @@ + if (this.random.nextInt(3) == 0 && !org.bukkit.craftbukkit.event.CraftEventFactory.callEntityTameEvent(this, entityhuman).isCancelled()) { // CraftBukkit this.tame(entityhuman); this.setOrderedToSit(true); - this.level.broadcastEntityEvent(this, (byte) 7); + this.level().broadcastEntityEvent(this, (byte) 7); @@ -469,7 +469,7 @@ private static class PathfinderGoalTemptChance extends PathfinderGoalTempt { @@ -22,15 +22,15 @@ while (iterator.hasNext()) { ItemStack itemstack = (ItemStack) iterator.next(); -- this.cat.level.addFreshEntity(new EntityItem(this.cat.level, (double) blockposition_mutableblockposition.getX() - (double) MathHelper.sin(this.cat.yBodyRot * 0.017453292F), (double) blockposition_mutableblockposition.getY(), (double) blockposition_mutableblockposition.getZ() + (double) MathHelper.cos(this.cat.yBodyRot * 0.017453292F), itemstack)); +- this.cat.level().addFreshEntity(new EntityItem(this.cat.level(), (double) blockposition_mutableblockposition.getX() - (double) MathHelper.sin(this.cat.yBodyRot * 0.017453292F), (double) blockposition_mutableblockposition.getY(), (double) blockposition_mutableblockposition.getZ() + (double) MathHelper.cos(this.cat.yBodyRot * 0.017453292F), itemstack)); + // CraftBukkit start -+ EntityItem entityitem = new EntityItem(this.cat.level, (double) blockposition_mutableblockposition.getX() - (double) MathHelper.sin(this.cat.yBodyRot * 0.017453292F), (double) blockposition_mutableblockposition.getY(), (double) blockposition_mutableblockposition.getZ() + (double) MathHelper.cos(this.cat.yBodyRot * 0.017453292F), itemstack); ++ EntityItem entityitem = new EntityItem(this.cat.level(), (double) blockposition_mutableblockposition.getX() - (double) MathHelper.sin(this.cat.yBodyRot * 0.017453292F), (double) blockposition_mutableblockposition.getY(), (double) blockposition_mutableblockposition.getZ() + (double) MathHelper.cos(this.cat.yBodyRot * 0.017453292F), itemstack); + org.bukkit.event.entity.EntityDropItemEvent event = new org.bukkit.event.entity.EntityDropItemEvent(this.cat.getBukkitEntity(), (org.bukkit.entity.Item) entityitem.getBukkitEntity()); -+ entityitem.level.getCraftServer().getPluginManager().callEvent(event); ++ entityitem.level().getCraftServer().getPluginManager().callEvent(event); + if (event.isCancelled()) { + continue; + } -+ this.cat.level.addFreshEntity(entityitem); ++ this.cat.level().addFreshEntity(entityitem); + // CraftBukkit end } diff --git a/paper-server/nms-patches/net/minecraft/world/entity/animal/EntityChicken.patch b/paper-server/nms-patches/net/minecraft/world/entity/animal/EntityChicken.patch index 2ee248f0b2..84468709c3 100644 --- a/paper-server/nms-patches/net/minecraft/world/entity/animal/EntityChicken.patch +++ b/paper-server/nms-patches/net/minecraft/world/entity/animal/EntityChicken.patch @@ -2,7 +2,7 @@ +++ b/net/minecraft/world/entity/animal/EntityChicken.java @@ -96,7 +96,9 @@ this.flap += this.flapping * 2.0F; - if (!this.level.isClientSide && this.isAlive() && !this.isBaby() && !this.isChickenJockey() && --this.eggTime <= 0) { + if (!this.level().isClientSide && this.isAlive() && !this.isBaby() && !this.isChickenJockey() && --this.eggTime <= 0) { this.playSound(SoundEffects.CHICKEN_EGG, 1.0F, (this.random.nextFloat() - this.random.nextFloat()) * 0.2F + 1.0F); + this.forceDrops = true; // CraftBukkit this.spawnAtLocation((IMaterial) Items.EGG); diff --git a/paper-server/nms-patches/net/minecraft/world/entity/animal/EntityCow.patch b/paper-server/nms-patches/net/minecraft/world/entity/animal/EntityCow.patch index ba850bb869..035154efb8 100644 --- a/paper-server/nms-patches/net/minecraft/world/entity/animal/EntityCow.patch +++ b/paper-server/nms-patches/net/minecraft/world/entity/animal/EntityCow.patch @@ -17,7 +17,7 @@ if (itemstack.is(Items.BUCKET) && !this.isBaby()) { + // CraftBukkit start - Got milk? -+ org.bukkit.event.player.PlayerBucketFillEvent event = CraftEventFactory.callPlayerBucketFillEvent((WorldServer) entityhuman.level, entityhuman, this.blockPosition(), this.blockPosition(), null, itemstack, Items.MILK_BUCKET, enumhand); ++ org.bukkit.event.player.PlayerBucketFillEvent event = CraftEventFactory.callPlayerBucketFillEvent((WorldServer) entityhuman.level(), entityhuman, this.blockPosition(), this.blockPosition(), null, itemstack, Items.MILK_BUCKET, enumhand); + + if (event.isCancelled()) { + return EnumInteractionResult.PASS; @@ -29,4 +29,4 @@ + ItemStack itemstack1 = ItemLiquidUtil.createFilledResult(itemstack, entityhuman, CraftItemStack.asNMSCopy(event.getItemStack())); // CraftBukkit entityhuman.setItemInHand(enumhand, itemstack1); - return EnumInteractionResult.sidedSuccess(this.level.isClientSide); + return EnumInteractionResult.sidedSuccess(this.level().isClientSide); diff --git a/paper-server/nms-patches/net/minecraft/world/entity/animal/EntityDolphin.patch b/paper-server/nms-patches/net/minecraft/world/entity/animal/EntityDolphin.patch index c802e3d869..e688097c81 100644 --- a/paper-server/nms-patches/net/minecraft/world/entity/animal/EntityDolphin.patch +++ b/paper-server/nms-patches/net/minecraft/world/entity/animal/EntityDolphin.patch @@ -40,7 +40,7 @@ @Override public boolean canUse() { - return this.dolphin.gotFish() && this.dolphin.getAirSupply() >= 100; -+ return this.dolphin.gotFish() && this.dolphin.getAirSupply() >= 100 && this.dolphin.level.getWorld().canGenerateStructures(); // MC-151364, SPIGOT-5494: hangs if generate-structures=false ++ return this.dolphin.gotFish() && this.dolphin.getAirSupply() >= 100 && this.dolphin.level().getWorld().canGenerateStructures(); // MC-151364, SPIGOT-5494: hangs if generate-structures=false } @Override @@ -56,7 +56,7 @@ @@ -508,7 +520,7 @@ } - if (this.player.isSwimming() && this.player.level.random.nextInt(6) == 0) { + if (this.player.isSwimming() && this.player.level().random.nextInt(6) == 0) { - this.player.addEffect(new MobEffect(MobEffects.DOLPHINS_GRACE, 100), this.dolphin); + this.player.addEffect(new MobEffect(MobEffects.DOLPHINS_GRACE, 100), this.dolphin, org.bukkit.event.entity.EntityPotionEffectEvent.Cause.DOLPHIN); // CraftBukkit } diff --git a/paper-server/nms-patches/net/minecraft/world/entity/animal/EntityFox.patch b/paper-server/nms-patches/net/minecraft/world/entity/animal/EntityFox.patch index f3a4740457..b81dfd2f94 100644 --- a/paper-server/nms-patches/net/minecraft/world/entity/animal/EntityFox.patch +++ b/paper-server/nms-patches/net/minecraft/world/entity/animal/EntityFox.patch @@ -55,7 +55,7 @@ + return; + } + // CraftBukkit end - int j = 1 + EntityFox.this.level.random.nextInt(2) + (i == 3 ? 1 : 0); + int j = 1 + EntityFox.this.level().random.nextInt(2) + (i == 3 ? 1 : 0); ItemStack itemstack = EntityFox.this.getItemBySlot(EnumItemSlot.MAINHAND); @@ -1441,7 +1459,7 @@ diff --git a/paper-server/nms-patches/net/minecraft/world/entity/animal/EntityIronGolem.patch b/paper-server/nms-patches/net/minecraft/world/entity/animal/EntityIronGolem.patch index 1fd07248a5..9142266872 100644 --- a/paper-server/nms-patches/net/minecraft/world/entity/animal/EntityIronGolem.patch +++ b/paper-server/nms-patches/net/minecraft/world/entity/animal/EntityIronGolem.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/entity/animal/EntityIronGolem.java +++ b/net/minecraft/world/entity/animal/EntityIronGolem.java -@@ -105,7 +105,7 @@ +@@ -102,7 +102,7 @@ @Override protected void doPush(Entity entity) { if (entity instanceof IMonster && !(entity instanceof EntityCreeper) && this.getRandom().nextInt(20) == 0) { diff --git a/paper-server/nms-patches/net/minecraft/world/entity/animal/EntityMushroomCow.patch b/paper-server/nms-patches/net/minecraft/world/entity/animal/EntityMushroomCow.patch index d67502cf40..c9e0305cab 100644 --- a/paper-server/nms-patches/net/minecraft/world/entity/animal/EntityMushroomCow.patch +++ b/paper-server/nms-patches/net/minecraft/world/entity/animal/EntityMushroomCow.patch @@ -16,7 +16,7 @@ private static final DataWatcherObject DATA_TYPE = DataWatcher.defineId(EntityMushroomCow.class, DataWatcherRegistry.STRING); @@ -115,6 +122,11 @@ this.playSound(soundeffect, 1.0F, 1.0F); - return EnumInteractionResult.sidedSuccess(this.level.isClientSide); + return EnumInteractionResult.sidedSuccess(this.level().isClientSide); } else if (itemstack.is(Items.SHEARS) && this.readyForShearing()) { + // CraftBukkit start + if (!CraftEventFactory.handlePlayerShearEntityEvent(entityhuman, this, itemstack, enumhand)) { @@ -25,11 +25,11 @@ + // CraftBukkit end this.shear(SoundCategory.PLAYERS); this.gameEvent(GameEvent.SHEAR, entityhuman); - if (!this.level.isClientSide) { + if (!this.level().isClientSide) { @@ -165,7 +177,7 @@ if (entitycow != null) { - ((WorldServer) this.level).sendParticles(Particles.EXPLOSION, this.getX(), this.getY(0.5D), this.getZ(), 1, 0.0D, 0.0D, 0.0D, 0.0D); + ((WorldServer) this.level()).sendParticles(Particles.EXPLOSION, this.getX(), this.getY(0.5D), this.getZ(), 1, 0.0D, 0.0D, 0.0D, 0.0D); - this.discard(); + // this.discard(); // CraftBukkit - moved down entitycow.moveTo(this.getX(), this.getY(), this.getZ(), this.getYRot(), this.getXRot()); @@ -39,26 +39,26 @@ } entitycow.setInvulnerable(this.isInvulnerable()); -- this.level.addFreshEntity(entitycow); +- this.level().addFreshEntity(entitycow); + // CraftBukkit start + if (CraftEventFactory.callEntityTransformEvent(this, entitycow, EntityTransformEvent.TransformReason.SHEARED).isCancelled()) { + return; + } -+ this.level.addFreshEntity(entitycow, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.SHEARED); ++ this.level().addFreshEntity(entitycow, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.SHEARED); + + this.discard(); // CraftBukkit - from above + // CraftBukkit end for (int i = 0; i < 5; ++i) { -- this.level.addFreshEntity(new EntityItem(this.level, this.getX(), this.getY(1.0D), this.getZ(), new ItemStack(this.getVariant().blockState.getBlock()))); +- this.level().addFreshEntity(new EntityItem(this.level(), this.getX(), this.getY(1.0D), this.getZ(), new ItemStack(this.getVariant().blockState.getBlock()))); + // CraftBukkit start -+ EntityItem entityitem = new EntityItem(this.level, this.getX(), this.getY(1.0D), this.getZ(), new ItemStack(this.getVariant().blockState.getBlock())); ++ EntityItem entityitem = new EntityItem(this.level(), this.getX(), this.getY(1.0D), this.getZ(), new ItemStack(this.getVariant().blockState.getBlock())); + EntityDropItemEvent event = new EntityDropItemEvent(this.getBukkitEntity(), (org.bukkit.entity.Item) entityitem.getBukkitEntity()); + Bukkit.getPluginManager().callEvent(event); + if (event.isCancelled()) { + continue; + } -+ this.level.addFreshEntity(entityitem); ++ this.level().addFreshEntity(entityitem); + // CraftBukkit end } } diff --git a/paper-server/nms-patches/net/minecraft/world/entity/animal/EntityOcelot.patch b/paper-server/nms-patches/net/minecraft/world/entity/animal/EntityOcelot.patch index 498a128d12..05df6bd694 100644 --- a/paper-server/nms-patches/net/minecraft/world/entity/animal/EntityOcelot.patch +++ b/paper-server/nms-patches/net/minecraft/world/entity/animal/EntityOcelot.patch @@ -3,13 +3,13 @@ @@ -177,7 +177,8 @@ if ((this.temptGoal == null || this.temptGoal.isRunning()) && !this.isTrusting() && this.isFood(itemstack) && entityhuman.distanceToSqr((Entity) this) < 9.0D) { this.usePlayerItem(entityhuman, enumhand, itemstack); - if (!this.level.isClientSide) { + if (!this.level().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.setTrusting(true); this.spawnTrustingParticles(true); - this.level.broadcastEntityEvent(this, (byte) 41); + this.level().broadcastEntityEvent(this, (byte) 41); @@ -308,10 +309,10 @@ private final EntityOcelot ocelot; diff --git a/paper-server/nms-patches/net/minecraft/world/entity/animal/EntityPanda.patch b/paper-server/nms-patches/net/minecraft/world/entity/animal/EntityPanda.patch index 60cc6fac96..20ecc612bf 100644 --- a/paper-server/nms-patches/net/minecraft/world/entity/animal/EntityPanda.patch +++ b/paper-server/nms-patches/net/minecraft/world/entity/animal/EntityPanda.patch @@ -35,7 +35,7 @@ @@ -1105,7 +1107,7 @@ @Override protected void alertOther(EntityInsentient entityinsentient, EntityLiving entityliving) { - if (entityinsentient instanceof EntityPanda && ((EntityPanda) entityinsentient).isAggressive()) { + if (entityinsentient instanceof EntityPanda && entityinsentient.isAggressive()) { - entityinsentient.setTarget(entityliving); + entityinsentient.setTarget(entityliving, EntityTargetEvent.TargetReason.TARGET_ATTACKED_ENTITY, true); // CraftBukkit } diff --git a/paper-server/nms-patches/net/minecraft/world/entity/animal/EntityParrot.patch b/paper-server/nms-patches/net/minecraft/world/entity/animal/EntityParrot.patch index 487f7035aa..02cb39229c 100644 --- a/paper-server/nms-patches/net/minecraft/world/entity/animal/EntityParrot.patch +++ b/paper-server/nms-patches/net/minecraft/world/entity/animal/EntityParrot.patch @@ -3,11 +3,11 @@ @@ -261,7 +261,7 @@ } - if (!this.level.isClientSide) { + if (!this.level().isClientSide) { - if (this.random.nextInt(10) == 0) { + if (this.random.nextInt(10) == 0 && !org.bukkit.craftbukkit.event.CraftEventFactory.callEntityTameEvent(this, entityhuman).isCancelled()) { // CraftBukkit this.tame(entityhuman); - this.level.broadcastEntityEvent(this, (byte) 7); + this.level().broadcastEntityEvent(this, (byte) 7); } else { @@ -275,7 +275,7 @@ itemstack.shrink(1); @@ -30,7 +30,7 @@ @@ -398,7 +398,7 @@ return false; } else { - if (!this.level.isClientSide) { + if (!this.level().isClientSide) { - this.setOrderedToSit(false); + // this.setOrderedToSit(false); // CraftBukkit - moved into EntityLiving.damageEntity(DamageSource, float) } diff --git a/paper-server/nms-patches/net/minecraft/world/entity/animal/EntityRabbit.patch b/paper-server/nms-patches/net/minecraft/world/entity/animal/EntityRabbit.patch index 275266eaf1..159c8a9a62 100644 --- a/paper-server/nms-patches/net/minecraft/world/entity/animal/EntityRabbit.patch +++ b/paper-server/nms-patches/net/minecraft/world/entity/animal/EntityRabbit.patch @@ -15,7 +15,7 @@ @Override public void registerGoals() { -@@ -570,9 +576,23 @@ +@@ -576,9 +582,23 @@ int i = (Integer) iblockdata.getValue(BlockCarrots.AGE); if (i == 0) { diff --git a/paper-server/nms-patches/net/minecraft/world/entity/animal/EntitySheep.patch b/paper-server/nms-patches/net/minecraft/world/entity/animal/EntitySheep.patch index cb3d307364..14f1ab76d6 100644 --- a/paper-server/nms-patches/net/minecraft/world/entity/animal/EntitySheep.patch +++ b/paper-server/nms-patches/net/minecraft/world/entity/animal/EntitySheep.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/entity/animal/EntitySheep.java +++ b/net/minecraft/world/entity/animal/EntitySheep.java -@@ -63,6 +63,14 @@ +@@ -64,6 +64,14 @@ import net.minecraft.world.level.gameevent.GameEvent; import net.minecraft.world.level.storage.loot.LootTables; @@ -15,10 +15,10 @@ public class EntitySheep extends EntityAnimal implements IShearable { private static final int EAT_ANIMATION_TICKS = 40; -@@ -243,6 +251,11 @@ +@@ -244,6 +252,11 @@ if (itemstack.is(Items.SHEARS)) { - if (!this.level.isClientSide && this.readyForShearing()) { + if (!this.level().isClientSide && this.readyForShearing()) { + // CraftBukkit start + if (!CraftEventFactory.handlePlayerShearEntityEvent(entityhuman, this, itemstack, enumhand)) { + return EnumInteractionResult.PASS; @@ -27,7 +27,7 @@ this.shear(SoundCategory.PLAYERS); this.gameEvent(GameEvent.SHEAR, entityhuman); itemstack.hurtAndBreak(1, entityhuman, (entityhuman1) -> { -@@ -264,7 +277,9 @@ +@@ -265,7 +278,9 @@ int i = 1 + this.random.nextInt(3); for (int j = 0; j < i; ++j) { @@ -37,29 +37,29 @@ if (entityitem != null) { entityitem.setDeltaMovement(entityitem.getDeltaMovement().add((double) ((this.random.nextFloat() - this.random.nextFloat()) * 0.1F), (double) (this.random.nextFloat() * 0.05F), (double) ((this.random.nextFloat() - this.random.nextFloat()) * 0.1F))); -@@ -357,6 +372,12 @@ +@@ -358,6 +373,12 @@ @Override public void ate() { + // CraftBukkit start + SheepRegrowWoolEvent event = new SheepRegrowWoolEvent((org.bukkit.entity.Sheep) this.getBukkitEntity()); -+ this.level.getCraftServer().getPluginManager().callEvent(event); ++ this.level().getCraftServer().getPluginManager().callEvent(event); + + if (event.isCancelled()) return; + // CraftBukkit end super.ate(); this.setSheared(false); if (this.isBaby()) { -@@ -376,7 +397,7 @@ +@@ -377,7 +398,7 @@ EnumColor enumcolor = ((EntitySheep) entityanimal).getColor(); EnumColor enumcolor1 = ((EntitySheep) entityanimal1).getColor(); InventoryCrafting inventorycrafting = makeContainer(enumcolor, enumcolor1); -- Optional optional = this.level.getRecipeManager().getRecipeFor(Recipes.CRAFTING, inventorycrafting, this.level).map((recipecrafting) -> { -+ Optional optional = this.level.getRecipeManager().getRecipeFor(Recipes.CRAFTING, inventorycrafting, this.level).map((recipecrafting) -> { // CraftBukkit - decompile error - return recipecrafting.assemble(inventorycrafting, this.level.registryAccess()); +- Optional optional = this.level().getRecipeManager().getRecipeFor(Recipes.CRAFTING, inventorycrafting, this.level()).map((recipecrafting) -> { ++ Optional optional = this.level().getRecipeManager().getRecipeFor(Recipes.CRAFTING, inventorycrafting, this.level()).map((recipecrafting) -> { // CraftBukkit - decompile error + return recipecrafting.assemble(inventorycrafting, this.level().registryAccess()); }).map(ItemStack::getItem); -@@ -399,10 +420,18 @@ +@@ -400,10 +421,18 @@ public boolean stillValid(EntityHuman entityhuman) { return false; } @@ -72,9 +72,9 @@ + // CraftBukkit end }, 2, 1); - inventorycrafting.setItem(0, new ItemStack(ItemDye.byColor(enumcolor))); - inventorycrafting.setItem(1, new ItemStack(ItemDye.byColor(enumcolor1))); -+ inventorycrafting.resultInventory = new InventoryCraftResult(); // CraftBukkit - add result slot for event - return inventorycrafting; + transientcraftingcontainer.setItem(0, new ItemStack(ItemDye.byColor(enumcolor))); + transientcraftingcontainer.setItem(1, new ItemStack(ItemDye.byColor(enumcolor1))); ++ transientcraftingcontainer.resultInventory = new InventoryCraftResult(); // CraftBukkit - add result slot for event + return transientcraftingcontainer; } diff --git a/paper-server/nms-patches/net/minecraft/world/entity/animal/EntitySnowman.patch b/paper-server/nms-patches/net/minecraft/world/entity/animal/EntitySnowman.patch index 83dcf05153..420f7650af 100644 --- a/paper-server/nms-patches/net/minecraft/world/entity/animal/EntitySnowman.patch +++ b/paper-server/nms-patches/net/minecraft/world/entity/animal/EntitySnowman.patch @@ -13,24 +13,24 @@ private static final DataWatcherObject DATA_PUMPKIN_ID = DataWatcher.defineId(EntitySnowman.class, DataWatcherRegistry.BYTE); @@ -97,7 +101,7 @@ super.aiStep(); - if (!this.level.isClientSide) { - if (this.level.getBiome(this.blockPosition()).is(BiomeTags.SNOW_GOLEM_MELTS)) { + if (!this.level().isClientSide) { + if (this.level().getBiome(this.blockPosition()).is(BiomeTags.SNOW_GOLEM_MELTS)) { - this.hurt(this.damageSources().onFire(), 1.0F); + this.hurt(this.damageSources().melting, 1.0F); // CraftBukkit - DamageSource.BURN -> CraftEventFactory.MELTING } - if (!this.level.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)) { + if (!this.level().getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)) { @@ -113,7 +117,11 @@ BlockPosition blockposition = new BlockPosition(j, k, l); - if (this.level.getBlockState(blockposition).isAir() && iblockdata.canSurvive(this.level, blockposition)) { -- this.level.setBlockAndUpdate(blockposition, iblockdata); + if (this.level().getBlockState(blockposition).isAir() && iblockdata.canSurvive(this.level(), blockposition)) { +- this.level().setBlockAndUpdate(blockposition, iblockdata); + // CraftBukkit start -+ if (!org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockFormEvent(this.level, blockposition, iblockdata, this)) { ++ if (!org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockFormEvent(this.level(), blockposition, iblockdata, this)) { + continue; + } + // CraftBukkit end - this.level.gameEvent(GameEvent.BLOCK_PLACE, blockposition, GameEvent.a.of(this, iblockdata)); + this.level().gameEvent(GameEvent.BLOCK_PLACE, blockposition, GameEvent.a.of(this, iblockdata)); } } @@ -145,6 +153,11 @@ @@ -44,10 +44,10 @@ + // CraftBukkit end this.shear(SoundCategory.PLAYERS); this.gameEvent(GameEvent.SHEAR, entityhuman); - if (!this.level.isClientSide) { + if (!this.level().isClientSide) { @@ -164,7 +177,9 @@ - this.level.playSound((EntityHuman) null, (Entity) this, SoundEffects.SNOW_GOLEM_SHEAR, soundcategory, 1.0F, 1.0F); - if (!this.level.isClientSide()) { + this.level().playSound((EntityHuman) null, (Entity) this, SoundEffects.SNOW_GOLEM_SHEAR, soundcategory, 1.0F, 1.0F); + if (!this.level().isClientSide()) { this.setPumpkin(false); + this.forceDrops = true; // CraftBukkit this.spawnAtLocation(new ItemStack(Items.CARVED_PUMPKIN), 1.7F); diff --git a/paper-server/nms-patches/net/minecraft/world/entity/animal/EntityTurtle.patch b/paper-server/nms-patches/net/minecraft/world/entity/animal/EntityTurtle.patch index 89f0e2e193..1c6684810c 100644 --- a/paper-server/nms-patches/net/minecraft/world/entity/animal/EntityTurtle.patch +++ b/paper-server/nms-patches/net/minecraft/world/entity/animal/EntityTurtle.patch @@ -3,7 +3,7 @@ @@ -308,7 +308,9 @@ protected void ageBoundaryReached() { super.ageBoundaryReached(); - if (!this.isBaby() && this.level.getGameRules().getBoolean(GameRules.RULE_DOMOBLOOT)) { + if (!this.isBaby() && this.level().getGameRules().getBoolean(GameRules.RULE_DOMOBLOOT)) { + this.forceDrops = true; // CraftBukkit this.spawnAtLocation(Items.SCUTE, 1); + this.forceDrops = false; // CraftBukkit @@ -22,7 +22,7 @@ private static class e extends ControllerMove { @@ -487,12 +491,16 @@ } else if (this.turtle.layEggCounter > this.adjustedTickDelay(200)) { - World world = this.turtle.level; + World world = this.turtle.level(); + // CraftBukkit start + if (!org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(this.turtle, this.blockPos.above(), (IBlockData) Blocks.TURTLE_EGG.defaultBlockState().setValue(BlockTurtleEgg.EGGS, this.turtle.random.nextInt(4) + 1)).isCancelled()) { diff --git a/paper-server/nms-patches/net/minecraft/world/entity/animal/EntityWolf.patch b/paper-server/nms-patches/net/minecraft/world/entity/animal/EntityWolf.patch index 9739c08e1f..df256f641f 100644 --- a/paper-server/nms-patches/net/minecraft/world/entity/animal/EntityWolf.patch +++ b/paper-server/nms-patches/net/minecraft/world/entity/animal/EntityWolf.patch @@ -40,7 +40,7 @@ @@ -298,7 +321,7 @@ Entity entity = damagesource.getEntity(); - if (!this.level.isClientSide) { + if (!this.level().isClientSide) { - this.setOrderedToSit(false); + // this.setOrderedToSit(false); // CraftBukkit - moved into EntityLiving.damageEntity(DamageSource, float) } @@ -55,31 +55,31 @@ } else { this.getAttribute(GenericAttributes.MAX_HEALTH).setBaseValue(8.0D); } -@@ -349,7 +372,7 @@ - itemstack.shrink(1); - } - -- this.heal((float) item.getFoodProperties().getNutrition()); -+ this.heal((float) item.getFoodProperties().getNutrition(), org.bukkit.event.entity.EntityRegainHealthEvent.RegainReason.EATING); // CraftBukkit - return EnumInteractionResult.SUCCESS; - } - -@@ -360,7 +383,7 @@ - this.setOrderedToSit(!this.isOrderedToSit()); - this.jumping = false; - this.navigation.stop(); -- this.setTarget((EntityLiving) null); -+ this.setTarget((EntityLiving) null, TargetReason.FORGOT_TARGET, true); // CraftBukkit - reason - return EnumInteractionResult.SUCCESS; - } - -@@ -382,7 +405,8 @@ +@@ -348,7 +371,7 @@ itemstack.shrink(1); } -- 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.tame(entityhuman); +- this.heal((float) item.getFoodProperties().getNutrition()); ++ this.heal((float) item.getFoodProperties().getNutrition(), org.bukkit.event.entity.EntityRegainHealthEvent.RegainReason.EATING); // CraftBukkit + return EnumInteractionResult.SUCCESS; + } else { + if (item instanceof ItemDye) { +@@ -376,7 +399,7 @@ + this.setOrderedToSit(!this.isOrderedToSit()); + this.jumping = false; this.navigation.stop(); - this.setTarget((EntityLiving) null); +- this.setTarget((EntityLiving) null); ++ this.setTarget((EntityLiving) null, TargetReason.FORGOT_TARGET, true); // CraftBukkit - reason + return EnumInteractionResult.SUCCESS; + } else { + return enuminteractionresult; +@@ -387,7 +410,8 @@ + itemstack.shrink(1); + } + +- 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.tame(entityhuman); + this.navigation.stop(); + this.setTarget((EntityLiving) null); diff --git a/paper-server/nms-patches/net/minecraft/world/entity/animal/allay/Allay.patch b/paper-server/nms-patches/net/minecraft/world/entity/animal/allay/Allay.patch index ece69d697b..2aa5583553 100644 --- a/paper-server/nms-patches/net/minecraft/world/entity/animal/allay/Allay.patch +++ b/paper-server/nms-patches/net/minecraft/world/entity/animal/allay/Allay.patch @@ -1,7 +1,7 @@ --- a/net/minecraft/world/entity/animal/allay/Allay.java +++ b/net/minecraft/world/entity/animal/allay/Allay.java @@ -93,13 +93,14 @@ - private final DynamicGameEventListener dynamicJukeboxListener; + private final DynamicGameEventListener dynamicJukeboxListener; private final InventorySubcontainer inventory = new InventorySubcontainer(1); @Nullable - private BlockPosition jukeboxPos; @@ -17,8 +17,8 @@ public Allay(EntityTypes entitytypes, World world) { super(entitytypes, world); -@@ -112,6 +113,12 @@ - this.dynamicJukeboxListener = new DynamicGameEventListener<>(new Allay.b(entitypositionsource, GameEvent.JUKEBOX_PLAY.getNotificationRadius())); +@@ -111,6 +112,12 @@ + this.dynamicJukeboxListener = new DynamicGameEventListener<>(new Allay.a(this.vibrationUser.getPositionSource(), GameEvent.JUKEBOX_PLAY.getNotificationRadius())); } + // CraftBukkit start @@ -30,7 +30,7 @@ @Override protected BehaviorController.b brainProvider() { return BehaviorController.provider(Allay.MEMORY_TYPES, Allay.SENSOR_TYPES); -@@ -124,7 +131,7 @@ +@@ -123,7 +130,7 @@ @Override public BehaviorController getBrain() { @@ -39,16 +39,16 @@ } public static AttributeProvider.Builder createAttributes() { -@@ -231,7 +238,7 @@ +@@ -230,7 +237,7 @@ public void aiStep() { super.aiStep(); - if (!this.level.isClientSide && this.isAlive() && this.tickCount % 10 == 0) { + if (!this.level().isClientSide && this.isAlive() && this.tickCount % 10 == 0) { - this.heal(1.0F); + this.heal(1.0F, org.bukkit.event.entity.EntityRegainHealthEvent.RegainReason.REGEN); // CraftBukkit } if (this.isDancing() && this.shouldStopDancing() && this.tickCount % 20 == 0) { -@@ -301,7 +308,12 @@ +@@ -300,7 +307,12 @@ ItemStack itemstack1 = this.getItemInHand(EnumHand.MAIN_HAND); if (this.isDancing() && this.isDuplicationItem(itemstack) && this.canDuplicate()) { @@ -59,59 +59,59 @@ + return EnumInteractionResult.SUCCESS; + } + // CraftBukkit end - this.level.broadcastEntityEvent(this, (byte) 18); - this.level.playSound(entityhuman, (Entity) this, SoundEffects.AMETHYST_BLOCK_CHIME, SoundCategory.NEUTRAL, 2.0F, 1.0F); + this.level().broadcastEntityEvent(this, (byte) 18); + this.level().playSound(entityhuman, (Entity) this, SoundEffects.AMETHYST_BLOCK_CHIME, SoundCategory.NEUTRAL, 2.0F, 1.0F); this.removeInteractionItem(entityhuman, itemstack); -@@ -313,7 +325,7 @@ +@@ -311,7 +323,7 @@ this.setItemInHand(EnumHand.MAIN_HAND, itemstack2); this.removeInteractionItem(entityhuman, itemstack); - this.level.playSound(entityhuman, (Entity) this, SoundEffects.ALLAY_ITEM_GIVEN, SoundCategory.NEUTRAL, 2.0F, 1.0F); + this.level().playSound(entityhuman, (Entity) this, SoundEffects.ALLAY_ITEM_GIVEN, SoundCategory.NEUTRAL, 2.0F, 1.0F); - this.getBrain().setMemory(MemoryModuleType.LIKED_PLAYER, (Object) entityhuman.getUUID()); + this.getBrain().setMemory(MemoryModuleType.LIKED_PLAYER, entityhuman.getUUID()); // CraftBukkit - decompile error return EnumInteractionResult.SUCCESS; } else if (!itemstack1.isEmpty() && enumhand == EnumHand.MAIN_HAND && itemstack.isEmpty()) { this.setItemSlot(EnumItemSlot.MAINHAND, ItemStack.EMPTY); -@@ -434,6 +446,7 @@ +@@ -432,6 +444,7 @@ } private boolean shouldStopDancing() { + if (this.forceDancing) {return false;} // CraftBukkit - return this.jukeboxPos == null || !this.jukeboxPos.closerToCenterThan(this.position(), (double) GameEvent.JUKEBOX_PLAY.getNotificationRadius()) || !this.level.getBlockState(this.jukeboxPos).is(Blocks.JUKEBOX); + return this.jukeboxPos == null || !this.jukeboxPos.closerToCenterThan(this.position(), (double) GameEvent.JUKEBOX_PLAY.getNotificationRadius()) || !this.level().getBlockState(this.jukeboxPos).is(Blocks.JUKEBOX); } -@@ -478,7 +491,7 @@ +@@ -476,7 +489,7 @@ public void addAdditionalSaveData(NBTTagCompound nbttagcompound) { super.addAdditionalSaveData(nbttagcompound); this.writeInventoryToTag(nbttagcompound); -- DataResult dataresult = VibrationListener.codec(this.vibrationListenerConfig).encodeStart(DynamicOpsNBT.INSTANCE, (VibrationListener) this.dynamicVibrationListener.getListener()); -+ DataResult dataresult = VibrationListener.codec(this.vibrationListenerConfig).encodeStart(DynamicOpsNBT.INSTANCE, (VibrationListener) this.dynamicVibrationListener.getListener()); // CraftBukkit - decompile error +- DataResult dataresult = VibrationSystem.a.CODEC.encodeStart(DynamicOpsNBT.INSTANCE, this.vibrationData); ++ DataResult dataresult = VibrationSystem.a.CODEC.encodeStart(DynamicOpsNBT.INSTANCE, this.vibrationData); // CraftBukkit - decompile error Logger logger = Allay.LOGGER; Objects.requireNonNull(logger); -@@ -494,7 +507,7 @@ +@@ -492,7 +505,7 @@ super.readAdditionalSaveData(nbttagcompound); this.readInventoryFromTag(nbttagcompound); if (nbttagcompound.contains("listener", 10)) { -- DataResult dataresult = VibrationListener.codec(this.vibrationListenerConfig).parse(new Dynamic(DynamicOpsNBT.INSTANCE, nbttagcompound.getCompound("listener"))); -+ DataResult dataresult = VibrationListener.codec(this.vibrationListenerConfig).parse(new Dynamic(DynamicOpsNBT.INSTANCE, nbttagcompound.getCompound("listener"))); // CraftBukkit - decompile error +- DataResult dataresult = VibrationSystem.a.CODEC.parse(new Dynamic(DynamicOpsNBT.INSTANCE, nbttagcompound.getCompound("listener"))); ++ DataResult dataresult = VibrationSystem.a.CODEC.parse(new Dynamic(DynamicOpsNBT.INSTANCE, nbttagcompound.getCompound("listener"))); // CraftBukkit - decompile error Logger logger = Allay.LOGGER; Objects.requireNonNull(logger); -@@ -527,7 +540,7 @@ +@@ -525,7 +538,7 @@ return Allay.DUPLICATION_ITEM.test(itemstack); } - private void duplicateAllay() { + public Allay duplicateAllay() { // CraftBukkit - return allay and private -> public - Allay allay = (Allay) EntityTypes.ALLAY.create(this.level); + Allay allay = (Allay) EntityTypes.ALLAY.create(this.level()); if (allay != null) { -@@ -535,17 +548,17 @@ +@@ -533,17 +546,17 @@ allay.setPersistenceRequired(); allay.resetDuplicationCooldown(); this.resetDuplicationCooldown(); -- this.level.addFreshEntity(allay); -+ this.level.addFreshEntity(allay, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.DUPLICATION); // CraftBukkit - reason for duplicated allay +- this.level().addFreshEntity(allay); ++ this.level().addFreshEntity(allay, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.DUPLICATION); // CraftBukkit - reason for duplicated allay } - + return allay; // CraftBukkit diff --git a/paper-server/nms-patches/net/minecraft/world/entity/animal/goat/Goat.patch b/paper-server/nms-patches/net/minecraft/world/entity/animal/goat/Goat.patch index 681f54696e..0a697c13e3 100644 --- a/paper-server/nms-patches/net/minecraft/world/entity/animal/goat/Goat.patch +++ b/paper-server/nms-patches/net/minecraft/world/entity/animal/goat/Goat.patch @@ -26,7 +26,7 @@ if (itemstack.is(Items.BUCKET) && !this.isBaby()) { + // CraftBukkit start - Got milk? -+ org.bukkit.event.player.PlayerBucketFillEvent event = CraftEventFactory.callPlayerBucketFillEvent((WorldServer) entityhuman.level, entityhuman, this.blockPosition(), this.blockPosition(), null, itemstack, Items.MILK_BUCKET, enumhand); ++ org.bukkit.event.player.PlayerBucketFillEvent event = CraftEventFactory.callPlayerBucketFillEvent((WorldServer) entityhuman.level(), entityhuman, this.blockPosition(), this.blockPosition(), null, itemstack, Items.MILK_BUCKET, enumhand); + + if (event.isCancelled()) { + return EnumInteractionResult.PASS; @@ -37,4 +37,4 @@ + ItemStack itemstack1 = ItemLiquidUtil.createFilledResult(itemstack, entityhuman, CraftItemStack.asNMSCopy(event.getItemStack())); // CraftBukkit entityhuman.setItemInHand(enumhand, itemstack1); - return EnumInteractionResult.sidedSuccess(this.level.isClientSide); + return EnumInteractionResult.sidedSuccess(this.level().isClientSide); diff --git a/paper-server/nms-patches/net/minecraft/world/entity/animal/horse/EntityHorseAbstract.patch b/paper-server/nms-patches/net/minecraft/world/entity/animal/horse/EntityHorseAbstract.patch index c583d674de..b6d69142a1 100644 --- a/paper-server/nms-patches/net/minecraft/world/entity/animal/horse/EntityHorseAbstract.patch +++ b/paper-server/nms-patches/net/minecraft/world/entity/animal/horse/EntityHorseAbstract.patch @@ -17,7 +17,7 @@ protected EntityHorseAbstract(EntityTypes entitytypes, World world) { super(entitytypes, world); -@@ -338,7 +341,7 @@ +@@ -334,7 +337,7 @@ public void createInventory() { InventorySubcontainer inventorysubcontainer = this.inventory; @@ -46,7 +46,7 @@ @@ -590,7 +593,7 @@ super.aiStep(); - if (!this.level.isClientSide && this.isAlive()) { + if (!this.level().isClientSide && this.isAlive()) { if (this.random.nextInt(900) == 0 && this.deathTime == 0) { - this.heal(1.0F); + this.heal(1.0F, RegainReason.REGEN); // CraftBukkit diff --git a/paper-server/nms-patches/net/minecraft/world/entity/animal/sniffer/Sniffer.patch b/paper-server/nms-patches/net/minecraft/world/entity/animal/sniffer/Sniffer.patch index 975f797b33..1eeb190c89 100644 --- a/paper-server/nms-patches/net/minecraft/world/entity/animal/sniffer/Sniffer.patch +++ b/paper-server/nms-patches/net/minecraft/world/entity/animal/sniffer/Sniffer.patch @@ -1,22 +1,24 @@ --- a/net/minecraft/world/entity/animal/sniffer/Sniffer.java +++ b/net/minecraft/world/entity/animal/sniffer/Sniffer.java -@@ -75,12 +75,21 @@ +@@ -82,14 +82,23 @@ public Sniffer(EntityTypes entitytypes, World world) { super(entitytypes, world); -- this.entityData.define(Sniffer.DATA_STATE, Sniffer.a.IDLING); +- this.entityData.define(Sniffer.DATA_STATE, Sniffer.State.IDLING); - this.entityData.define(Sniffer.DATA_DROP_SEED_AT_TICK, 0); -+ // this.entityData.define(Sniffer.DATA_STATE, Sniffer.a.IDLING); // CraftBukkit - moved down to appropriate location ++ // this.entityData.define(Sniffer.DATA_STATE, Sniffer.State.IDLING); // CraftBukkit - moved down to appropriate location + // this.entityData.define(Sniffer.DATA_DROP_SEED_AT_TICK, 0); // CraftBukkit - moved down to appropriate location this.getNavigation().setCanFloat(true); - this.setPathfindingMalus(PathType.WATER, -2.0F); + this.setPathfindingMalus(PathType.WATER, -1.0F); + this.setPathfindingMalus(PathType.DANGER_POWDER_SNOW, -1.0F); + this.setPathfindingMalus(PathType.DAMAGE_CAUTIOUS, -1.0F); } + // CraftBukkit start - SPIGOT-7295: moved from constructor to appropriate location + @Override + protected void defineSynchedData() { + super.defineSynchedData(); -+ this.entityData.define(Sniffer.DATA_STATE, Sniffer.a.IDLING); ++ this.entityData.define(Sniffer.DATA_STATE, Sniffer.State.IDLING); + this.entityData.define(Sniffer.DATA_DROP_SEED_AT_TICK, 0); + } + // CraftBukkit end @@ -24,67 +26,30 @@ @Override protected float getStandingEyeHeight(EntityPose entitypose, EntitySize entitysize) { return this.getDimensions(entitypose).height * 0.6F; -@@ -114,7 +123,7 @@ - return BlockPosition.containing(vec3d.x(), this.getY(), vec3d.z()); - } +@@ -270,6 +279,13 @@ + ItemStack itemstack = (ItemStack) iterator.next(); + EntityItem entityitem = new EntityItem(worldserver, (double) blockposition.getX(), (double) blockposition.getY(), (double) blockposition.getZ(), itemstack); -- private Sniffer.a getState() { -+ public Sniffer.a getState() { // PAIL private -> public - return (Sniffer.a) this.entityData.get(Sniffer.DATA_STATE); - } ++ // CraftBukkit start - handle EntityDropItemEvent ++ org.bukkit.event.entity.EntityDropItemEvent event = new org.bukkit.event.entity.EntityDropItemEvent(this.getBukkitEntity(), (org.bukkit.entity.Item) entityitem.getBukkitEntity()); ++ org.bukkit.Bukkit.getPluginManager().callEvent(event); ++ if (event.isCancelled()) { ++ continue; ++ } ++ // CraftBukkit end + entityitem.setDefaultPickUpDelay(); + worldserver.addFreshEntity(entityitem); + } +@@ -309,7 +325,7 @@ + List list = (List) this.getExploredPositions().limit(20L).collect(Collectors.toList()); -@@ -207,7 +216,7 @@ - return this; - } - -- Optional calculateDigPosition() { -+ public Optional calculateDigPosition() { // PAIL public - return IntStream.range(0, 5).mapToObj((i) -> { - return LandRandomPos.getPos(this, 10 + 2 * i, 3); - }).filter(Objects::nonNull).map(BlockPosition::containing).map(BlockPosition::below).filter(this::canDig).findFirst(); -@@ -218,7 +227,7 @@ - return false; - } - -- boolean canDig() { -+ public boolean canDig() { // PAIL public - return !this.isPanicking() && !this.isBaby() && !this.isInWater() && this.canDig(this.getHeadPosition().below()); - } - -@@ -245,6 +254,13 @@ - BlockPosition blockposition = this.getHeadPosition(); - EntityItem entityitem = new EntityItem(this.level, (double) blockposition.getX(), (double) blockposition.getY(), (double) blockposition.getZ(), itemstack); - -+ // CraftBukkit start - handle EntityDropItemEvent -+ org.bukkit.event.entity.EntityDropItemEvent event = new org.bukkit.event.entity.EntityDropItemEvent(this.getBukkitEntity(), (org.bukkit.entity.Item) entityitem.getBukkitEntity()); -+ org.bukkit.Bukkit.getPluginManager().callEvent(event); -+ if (event.isCancelled()) { -+ return; -+ } -+ // CraftBukkit end - entityitem.setDefaultPickUpDelay(); - this.level.addFreshEntity(entityitem); - this.playSound(SoundEffects.SNIFFER_DROP_SEED, 1.0F, 1.0F); -@@ -274,15 +290,15 @@ - return this; - } - -- private Sniffer storeExploredPosition(BlockPosition blockposition) { -+ public Sniffer storeExploredPosition(BlockPosition blockposition) { // PAIL private -> public - List list = (List) this.getExploredPositions().limit(20L).collect(Collectors.toList()); - - list.add(0, blockposition); + list.add(0, GlobalPos.of(this.level().dimension(), blockposition)); - this.getBrain().setMemory(MemoryModuleType.SNIFFER_EXPLORED_POSITIONS, (Object) list); + this.getBrain().setMemory(MemoryModuleType.SNIFFER_EXPLORED_POSITIONS, list); // CraftBukkit - decompile error return this; } -- private Stream getExploredPositions() { -+ public Stream getExploredPositions() { // PAIL private -> public - return this.getBrain().getMemory(MemoryModuleType.SNIFFER_EXPLORED_POSITIONS).stream().flatMap(Collection::stream); - } - -@@ -416,7 +432,7 @@ +@@ -461,7 +477,7 @@ @Override public BehaviorController getBrain() { diff --git a/paper-server/nms-patches/net/minecraft/world/entity/boss/enderdragon/EntityEnderCrystal.patch b/paper-server/nms-patches/net/minecraft/world/entity/boss/enderdragon/EntityEnderCrystal.patch index 29b33de614..37bd2df794 100644 --- a/paper-server/nms-patches/net/minecraft/world/entity/boss/enderdragon/EntityEnderCrystal.patch +++ b/paper-server/nms-patches/net/minecraft/world/entity/boss/enderdragon/EntityEnderCrystal.patch @@ -15,11 +15,11 @@ @@ -55,7 +60,11 @@ BlockPosition blockposition = this.blockPosition(); - if (((WorldServer) this.level).dragonFight() != null && this.level.getBlockState(blockposition).isAir()) { -- this.level.setBlockAndUpdate(blockposition, BlockFireAbstract.getState(this.level, blockposition)); + if (((WorldServer) this.level()).getDragonFight() != null && this.level().getBlockState(blockposition).isAir()) { +- this.level().setBlockAndUpdate(blockposition, BlockFireAbstract.getState(this.level(), blockposition)); + // CraftBukkit start -+ if (!CraftEventFactory.callBlockIgniteEvent(this.level, blockposition, this).isCancelled()) { -+ this.level.setBlockAndUpdate(blockposition, BlockFireAbstract.getState(this.level, blockposition)); ++ if (!CraftEventFactory.callBlockIgniteEvent(this.level(), blockposition, this).isCancelled()) { ++ this.level().setBlockAndUpdate(blockposition, BlockFireAbstract.getState(this.level(), blockposition)); + } + // CraftBukkit end } @@ -28,7 +28,7 @@ @@ -95,11 +104,24 @@ return false; } else { - if (!this.isRemoved() && !this.level.isClientSide) { + if (!this.isRemoved() && !this.level().isClientSide) { + // CraftBukkit start - All non-living entities need this + if (CraftEventFactory.handleNonLivingEntityDamageEvent(this, damagesource, f, false)) { + return false; @@ -38,15 +38,15 @@ if (!damagesource.is(DamageTypeTags.IS_EXPLOSION)) { DamageSource damagesource1 = damagesource.getEntity() != null ? this.damageSources().explosion(this, damagesource.getEntity()) : null; -- this.level.explode(this, damagesource1, (ExplosionDamageCalculator) null, this.getX(), this.getY(), this.getZ(), 6.0F, false, World.a.BLOCK); +- this.level().explode(this, damagesource1, (ExplosionDamageCalculator) null, this.getX(), this.getY(), this.getZ(), 6.0F, false, World.a.BLOCK); + // CraftBukkit start + ExplosionPrimeEvent event = new ExplosionPrimeEvent(this.getBukkitEntity(), 6.0F, false); -+ this.level.getCraftServer().getPluginManager().callEvent(event); ++ this.level().getCraftServer().getPluginManager().callEvent(event); + if (event.isCancelled()) { + this.unsetRemoved(); + return false; + } -+ this.level.explode(this, damagesource1, (ExplosionDamageCalculator) null, this.getX(), this.getY(), this.getZ(), event.getRadius(), event.getFire(), World.a.BLOCK); ++ this.level().explode(this, damagesource1, (ExplosionDamageCalculator) null, this.getX(), this.getY(), this.getZ(), event.getRadius(), event.getFire(), World.a.BLOCK); + // CraftBukkit end } diff --git a/paper-server/nms-patches/net/minecraft/world/entity/boss/enderdragon/EntityEnderDragon.patch b/paper-server/nms-patches/net/minecraft/world/entity/boss/enderdragon/EntityEnderDragon.patch index ed0b5b661d..45dc955d67 100644 --- a/paper-server/nms-patches/net/minecraft/world/entity/boss/enderdragon/EntityEnderDragon.patch +++ b/paper-server/nms-patches/net/minecraft/world/entity/boss/enderdragon/EntityEnderDragon.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/entity/boss/enderdragon/EntityEnderDragon.java +++ b/net/minecraft/world/entity/boss/enderdragon/EntityEnderDragon.java -@@ -51,6 +51,18 @@ +@@ -51,6 +51,19 @@ import net.minecraft.world.phys.Vec3D; import org.slf4j.Logger; @@ -9,6 +9,7 @@ +import net.minecraft.world.level.Explosion; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.entity.TileEntity; ++import net.minecraft.world.level.storage.loot.LootParams; +import net.minecraft.world.level.storage.loot.LootTableInfo; +import net.minecraft.world.level.storage.loot.parameters.LootContextParameters; +import org.bukkit.craftbukkit.block.CraftBlock; @@ -19,23 +20,23 @@ public class EntityEnderDragon extends EntityInsentient implements IMonster { private static final Logger LOGGER = LogUtils.getLogger(); -@@ -87,6 +99,7 @@ - private final PathPoint[] nodes = new PathPoint[24]; - private final int[] nodeAdjacency = new int[24]; - private final Path openSet = new Path(); +@@ -88,6 +101,7 @@ + private final PathPoint[] nodes; + private final int[] nodeAdjacency; + private final Path openSet; + private final Explosion explosionSource; // CraftBukkit - reusable source for CraftTNTPrimed.getSource() public EntityEnderDragon(EntityTypes entitytypes, World world) { super(EntityTypes.ENDER_DRAGON, world); -@@ -101,6 +114,7 @@ - } - +@@ -109,6 +123,7 @@ + this.noPhysics = true; + this.noCulling = true; this.phaseManager = new DragonControllerManager(this); + this.explosionSource = new Explosion(world, this, null, null, Double.NaN, Double.NaN, Double.NaN, Float.NaN, true, Explosion.Effect.DESTROY); // CraftBukkit } - public static AttributeProvider.Builder createAttributes() { -@@ -234,7 +248,7 @@ + public void setDragonFight(EnderDragonBattle enderdragonbattle) { +@@ -267,7 +282,7 @@ Vec3D vec3d1 = idragoncontroller.getFlyTargetLocation(); @@ -44,14 +45,14 @@ d0 = vec3d1.x - this.getX(); d1 = vec3d1.y - this.getY(); d2 = vec3d1.z - this.getZ(); -@@ -375,7 +389,14 @@ +@@ -408,7 +423,14 @@ if (this.nearestCrystal.isRemoved()) { this.nearestCrystal = null; } else if (this.tickCount % 10 == 0 && this.getHealth() < this.getMaxHealth()) { - this.setHealth(this.getHealth() + 1.0F); + // CraftBukkit start + EntityRegainHealthEvent event = new EntityRegainHealthEvent(this.getBukkitEntity(), 1.0F, EntityRegainHealthEvent.RegainReason.ENDER_CRYSTAL); -+ this.level.getCraftServer().getPluginManager().callEvent(event); ++ this.level().getCraftServer().getPluginManager().callEvent(event); + + if (!event.isCancelled()) { + this.setHealth((float) (this.getHealth() + event.getAmount())); @@ -60,7 +61,7 @@ } } -@@ -450,6 +471,9 @@ +@@ -483,6 +505,9 @@ int j1 = MathHelper.floor(axisalignedbb.maxZ); boolean flag = false; boolean flag1 = false; @@ -70,20 +71,20 @@ for (int k1 = i; k1 <= l; ++k1) { for (int l1 = j; l1 <= i1; ++l1) { -@@ -459,7 +483,11 @@ +@@ -492,7 +517,11 @@ if (!iblockdata.isAir() && !iblockdata.is(TagsBlock.DRAGON_TRANSPARENT)) { - if (this.level.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING) && !iblockdata.is(TagsBlock.DRAGON_IMMUNE)) { -- flag1 = this.level.removeBlock(blockposition, false) || flag1; + if (this.level().getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING) && !iblockdata.is(TagsBlock.DRAGON_IMMUNE)) { +- flag1 = this.level().removeBlock(blockposition, false) || flag1; + // CraftBukkit start - Add blocks to list rather than destroying them -+ // flag1 = this.level.removeBlock(blockposition, false) || flag1; ++ // flag1 = this.level().removeBlock(blockposition, false) || flag1; + flag1 = true; -+ destroyedBlocks.add(CraftBlock.at(level, blockposition)); ++ destroyedBlocks.add(CraftBlock.at(this.level(), blockposition)); + // CraftBukkit end } else { flag = true; } -@@ -468,6 +496,51 @@ +@@ -501,6 +530,51 @@ } } @@ -103,7 +104,7 @@ + } else if (event.getYield() == 0F) { + // Yield zero ==> no drops + for (org.bukkit.block.Block block : event.blockList()) { -+ this.level.removeBlock(new BlockPosition(block.getX(), block.getY(), block.getZ()), false); ++ this.level().removeBlock(new BlockPosition(block.getX(), block.getY(), block.getZ()), false); + } + } else { + for (org.bukkit.block.Block block : event.blockList()) { @@ -117,17 +118,17 @@ + + Block nmsBlock = craftBlock.getNMS().getBlock(); + if (nmsBlock.dropFromExplosion(explosionSource)) { -+ TileEntity tileentity = craftBlock.getNMS().hasBlockEntity() ? this.level.getBlockEntity(blockposition) : null; -+ LootTableInfo.Builder loottableinfo_builder = (new LootTableInfo.Builder((WorldServer) this.level)).withRandom(this.level.random).withParameter(LootContextParameters.ORIGIN, Vec3D.atCenterOf(blockposition)).withParameter(LootContextParameters.TOOL, ItemStack.EMPTY).withParameter(LootContextParameters.EXPLOSION_RADIUS, 1.0F / event.getYield()).withOptionalParameter(LootContextParameters.BLOCK_ENTITY, tileentity); ++ TileEntity tileentity = craftBlock.getNMS().hasBlockEntity() ? this.level().getBlockEntity(blockposition) : null; ++ LootParams.a loottableinfo_builder = (new LootParams.a((WorldServer) this.level())).withParameter(LootContextParameters.ORIGIN, Vec3D.atCenterOf(blockposition)).withParameter(LootContextParameters.TOOL, ItemStack.EMPTY).withParameter(LootContextParameters.EXPLOSION_RADIUS, 1.0F / event.getYield()).withOptionalParameter(LootContextParameters.BLOCK_ENTITY, tileentity); + + craftBlock.getNMS().getDrops(loottableinfo_builder).forEach((itemstack) -> { -+ Block.popResource(level, blockposition, itemstack); ++ Block.popResource(this.level(), blockposition, itemstack); + }); -+ craftBlock.getNMS().spawnAfterBreak((WorldServer) level, blockposition, ItemStack.EMPTY, false); ++ craftBlock.getNMS().spawnAfterBreak((WorldServer) this.level(), blockposition, ItemStack.EMPTY, false); + } -+ nmsBlock.wasExploded(level, blockposition, explosionSource); ++ nmsBlock.wasExploded(this.level(), blockposition, explosionSource); + -+ this.level.removeBlock(blockposition, false); ++ this.level().removeBlock(blockposition, false); + } + } + // CraftBukkit end @@ -135,7 +136,7 @@ if (flag1) { BlockPosition blockposition1 = new BlockPosition(i + this.random.nextInt(l - i + 1), j + this.random.nextInt(i1 - j + 1), k + this.random.nextInt(j1 - k + 1)); -@@ -532,6 +605,21 @@ +@@ -565,6 +639,21 @@ } @@ -143,7 +144,7 @@ + @Override + public int getExpReward() { + // CraftBukkit - Moved from #tickDeath method -+ boolean flag = this.level.getGameRules().getBoolean(GameRules.RULE_DOMOBLOOT); ++ boolean flag = this.level().getGameRules().getBoolean(GameRules.RULE_DOMOBLOOT); + short short0 = 500; + + if (this.dragonFight != null && !this.dragonFight.hasPreviouslyKilledDragon()) { @@ -157,13 +158,13 @@ @Override protected void tickDeath() { if (this.dragonFight != null) { -@@ -547,15 +635,20 @@ - this.level.addParticle(Particles.EXPLOSION_EMITTER, this.getX() + (double) f, this.getY() + 2.0D + (double) f1, this.getZ() + (double) f2, 0.0D, 0.0D, 0.0D); +@@ -580,15 +669,20 @@ + this.level().addParticle(Particles.EXPLOSION_EMITTER, this.getX() + (double) f, this.getY() + 2.0D + (double) f1, this.getZ() + (double) f2, 0.0D, 0.0D, 0.0D); } + // CraftBukkit start - SPIGOT-2420: Moved up to #getExpReward method + /* - boolean flag = this.level.getGameRules().getBoolean(GameRules.RULE_DOMOBLOOT); + boolean flag = this.level().getGameRules().getBoolean(GameRules.RULE_DOMOBLOOT); short short0 = 500; if (this.dragonFight != null && !this.dragonFight.hasPreviouslyKilledDragon()) { @@ -173,22 +174,22 @@ + int short0 = expToDrop; + // CraftBukkit end - if (this.level instanceof WorldServer) { + if (this.level() instanceof WorldServer) { - if (this.dragonDeathTime > 150 && this.dragonDeathTime % 5 == 0 && flag) { + if (this.dragonDeathTime > 150 && this.dragonDeathTime % 5 == 0 && true) { // CraftBukkit - SPIGOT-2420: Already checked for the game rule when calculating the xp - EntityExperienceOrb.award((WorldServer) this.level, this.position(), MathHelper.floor((float) short0 * 0.08F)); + EntityExperienceOrb.award((WorldServer) this.level(), this.position(), MathHelper.floor((float) short0 * 0.08F)); } -@@ -566,7 +659,7 @@ +@@ -599,7 +693,7 @@ this.move(EnumMoveType.SELF, new Vec3D(0.0D, 0.10000000149011612D, 0.0D)); - if (this.dragonDeathTime == 200 && this.level instanceof WorldServer) { + if (this.dragonDeathTime == 200 && this.level() instanceof WorldServer) { - if (flag) { + if (true) { // CraftBukkit - SPIGOT-2420: Already checked for the game rule when calculating the xp - EntityExperienceOrb.award((WorldServer) this.level, this.position(), MathHelper.floor((float) short0 * 0.2F)); + EntityExperienceOrb.award((WorldServer) this.level(), this.position(), MathHelper.floor((float) short0 * 0.2F)); } -@@ -787,6 +880,7 @@ +@@ -820,6 +914,7 @@ super.addAdditionalSaveData(nbttagcompound); nbttagcompound.putInt("DragonPhase", this.phaseManager.getCurrentPhase().getPhase().getId()); nbttagcompound.putInt("DragonDeathTime", this.dragonDeathTime); @@ -196,7 +197,7 @@ } @Override -@@ -800,6 +894,11 @@ +@@ -833,6 +928,11 @@ this.dragonDeathTime = nbttagcompound.getInt("DragonDeathTime"); } diff --git a/paper-server/nms-patches/net/minecraft/world/entity/boss/enderdragon/phases/DragonControllerManager.patch b/paper-server/nms-patches/net/minecraft/world/entity/boss/enderdragon/phases/DragonControllerManager.patch index 7a0a3e5575..21603a23d6 100644 --- a/paper-server/nms-patches/net/minecraft/world/entity/boss/enderdragon/phases/DragonControllerManager.patch +++ b/paper-server/nms-patches/net/minecraft/world/entity/boss/enderdragon/phases/DragonControllerManager.patch @@ -22,7 +22,7 @@ + (this.currentPhase == null) ? null : CraftEnderDragon.getBukkitPhase(this.currentPhase.getPhase()), + CraftEnderDragon.getBukkitPhase(dragoncontrollerphase) + ); -+ this.dragon.level.getCraftServer().getPluginManager().callEvent(event); ++ this.dragon.level().getCraftServer().getPluginManager().callEvent(event); + if (event.isCancelled()) { + return; + } @@ -30,7 +30,7 @@ + // CraftBukkit end + this.currentPhase = this.getPhase(dragoncontrollerphase); - if (!this.dragon.level.isClientSide) { + if (!this.dragon.level().isClientSide) { this.dragon.getEntityData().set(EntityEnderDragon.DATA_PHASE, dragoncontrollerphase.getId()); @@ -45,6 +63,6 @@ this.phases[i] = dragoncontrollerphase.createInstance(this.dragon); diff --git a/paper-server/nms-patches/net/minecraft/world/entity/boss/wither/EntityWither.patch b/paper-server/nms-patches/net/minecraft/world/entity/boss/wither/EntityWither.patch index 76dca9a9d5..f37f057a6b 100644 --- a/paper-server/nms-patches/net/minecraft/world/entity/boss/wither/EntityWither.patch +++ b/paper-server/nms-patches/net/minecraft/world/entity/boss/wither/EntityWither.patch @@ -22,22 +22,22 @@ i = this.getInvulnerableTicks() - 1; this.bossEvent.setProgress(1.0F - (float) i / 220.0F); if (i <= 0) { -- this.level.explode(this, this.getX(), this.getEyeY(), this.getZ(), 7.0F, false, World.a.MOB); +- this.level().explode(this, this.getX(), this.getEyeY(), this.getZ(), 7.0F, false, World.a.MOB); + // CraftBukkit start -+ // this.level.explode(this, this.getX(), this.getEyeY(), this.getZ(), 7.0F, false, World.a.MOB); ++ // this.level().explode(this, this.getX(), this.getEyeY(), this.getZ(), 7.0F, false, World.a.MOB); + ExplosionPrimeEvent event = new ExplosionPrimeEvent(this.getBukkitEntity(), 7.0F, false); -+ this.level.getCraftServer().getPluginManager().callEvent(event); ++ this.level().getCraftServer().getPluginManager().callEvent(event); + + if (!event.isCancelled()) { -+ this.level.explode(this, this.getX(), this.getEyeY(), this.getZ(), event.getRadius(), event.getFire(), World.a.MOB); ++ this.level().explode(this, this.getX(), this.getEyeY(), this.getZ(), event.getRadius(), event.getFire(), World.a.MOB); + } + // CraftBukkit end + if (!this.isSilent()) { -- this.level.globalLevelEvent(1023, this.blockPosition(), 0); +- this.level().globalLevelEvent(1023, this.blockPosition(), 0); + // CraftBukkit start - Use relative location for far away sounds -+ // this.world.globalLevelEvent(1023, new BlockPosition(this), 0); -+ int viewDistance = ((WorldServer) this.level).getCraftServer().getViewDistance() * 16; ++ // this.level().globalLevelEvent(1023, new BlockPosition(this), 0); ++ int viewDistance = ((WorldServer) this.level()).getCraftServer().getViewDistance() * 16; + for (EntityPlayer player : (List) MinecraftServer.getServer().getPlayerList().players) { + double deltaX = this.getX() - player.getX(); + double deltaZ = this.getZ() - player.getZ(); @@ -71,7 +71,7 @@ } } @@ -331,6 +368,11 @@ - IBlockData iblockdata = this.level.getBlockState(blockposition); + IBlockData iblockdata = this.level().getBlockState(blockposition); if (canDestroy(iblockdata)) { + // CraftBukkit start @@ -79,7 +79,7 @@ + continue; + } + // CraftBukkit end - flag = this.level.destroyBlock(blockposition, true, this) || flag; + flag = this.level().destroyBlock(blockposition, true, this) || flag; } } @@ -344,7 +386,7 @@ diff --git a/paper-server/nms-patches/net/minecraft/world/entity/decoration/EntityArmorStand.patch b/paper-server/nms-patches/net/minecraft/world/entity/decoration/EntityArmorStand.patch index 0c84531e3e..b6007e5c42 100644 --- a/paper-server/nms-patches/net/minecraft/world/entity/decoration/EntityArmorStand.patch +++ b/paper-server/nms-patches/net/minecraft/world/entity/decoration/EntityArmorStand.patch @@ -53,11 +53,13 @@ } } -@@ -403,6 +426,22 @@ +@@ -401,7 +424,25 @@ return false; - } else { - ItemStack itemstack2; + } else if (itemstack1.isEmpty() && (this.disabledSlots & 1 << enumitemslot.getFilterFlag() + 16) != 0) { + return false; +- } else if (entityhuman.getAbilities().instabuild && itemstack1.isEmpty() && !itemstack.isEmpty()) { + // CraftBukkit start ++ } else { + org.bukkit.inventory.ItemStack armorStandItem = CraftItemStack.asCraftMirror(itemstack1); + org.bukkit.inventory.ItemStack playerHeldItem = CraftItemStack.asCraftMirror(itemstack); + @@ -66,19 +68,28 @@ + + EquipmentSlot slot = CraftEquipmentSlot.getSlot(enumitemslot); + EquipmentSlot hand = CraftEquipmentSlot.getHand(enumhand); -+ PlayerArmorStandManipulateEvent armorStandManipulateEvent = new PlayerArmorStandManipulateEvent(player,self,playerHeldItem,armorStandItem,slot,hand); -+ this.level.getCraftServer().getPluginManager().callEvent(armorStandManipulateEvent); ++ PlayerArmorStandManipulateEvent armorStandManipulateEvent = new PlayerArmorStandManipulateEvent(player, self, playerHeldItem, armorStandItem, slot, hand); ++ this.level().getCraftServer().getPluginManager().callEvent(armorStandManipulateEvent); + + if (armorStandManipulateEvent.isCancelled()) { + return true; + } ++ ++ if (entityhuman.getAbilities().instabuild && itemstack1.isEmpty() && !itemstack.isEmpty()) { + // CraftBukkit end + this.setItemSlot(enumitemslot, itemstack.copyWithCount(1)); + return true; + } else if (!itemstack.isEmpty() && itemstack.getCount() > 1) { +@@ -416,15 +457,26 @@ + entityhuman.setItemInHand(enumhand, itemstack1); + return true; + } ++ } // CraftBukkit + } - if (entityhuman.getAbilities().instabuild && itemstack1.isEmpty() && !itemstack.isEmpty()) { - itemstack2 = itemstack.copy(); -@@ -431,9 +470,19 @@ + @Override public boolean hurt(DamageSource damagesource, float f) { - if (!this.level.isClientSide && !this.isRemoved()) { + if (!this.level().isClientSide && !this.isRemoved()) { if (damagesource.is(DamageTypeTags.BYPASSES_INVULNERABILITY)) { + // CraftBukkit start + if (org.bukkit.craftbukkit.event.CraftEventFactory.handleNonLivingEntityDamageEvent(this, damagesource, f)) { @@ -97,7 +108,7 @@ if (damagesource.is(DamageTypeTags.IS_EXPLOSION)) { this.brokenByAnything(damagesource); this.kill(); -@@ -482,7 +531,7 @@ +@@ -473,7 +525,7 @@ } else { this.brokenByPlayer(damagesource); this.showBreakingParticles(); @@ -106,11 +117,11 @@ } return true; -@@ -550,13 +599,13 @@ +@@ -541,13 +593,13 @@ itemstack.setHoverName(this.getCustomName()); } -- Block.popResource(this.level, this.blockPosition(), itemstack); +- Block.popResource(this.level(), this.blockPosition(), itemstack); + drops.add(org.bukkit.craftbukkit.inventory.CraftItemStack.asBukkitCopy(itemstack)); // CraftBukkit - add to drops this.brokenByAnything(damagesource); } @@ -122,20 +133,20 @@ ItemStack itemstack; int i; -@@ -564,7 +613,7 @@ +@@ -555,7 +607,7 @@ for (i = 0; i < this.handItems.size(); ++i) { itemstack = (ItemStack) this.handItems.get(i); if (!itemstack.isEmpty()) { -- Block.popResource(this.level, this.blockPosition().above(), itemstack); +- Block.popResource(this.level(), this.blockPosition().above(), itemstack); + drops.add(org.bukkit.craftbukkit.inventory.CraftItemStack.asBukkitCopy(itemstack)); // CraftBukkit - add to drops this.handItems.set(i, ItemStack.EMPTY); } } -@@ -572,10 +621,11 @@ +@@ -563,10 +615,11 @@ for (i = 0; i < this.armorItems.size(); ++i) { itemstack = (ItemStack) this.armorItems.get(i); if (!itemstack.isEmpty()) { -- Block.popResource(this.level, this.blockPosition().above(), itemstack); +- Block.popResource(this.level(), this.blockPosition().above(), itemstack); + drops.add(org.bukkit.craftbukkit.inventory.CraftItemStack.asBukkitCopy(itemstack)); // CraftBukkit - add to drops this.armorItems.set(i, ItemStack.EMPTY); } @@ -144,7 +155,7 @@ } -@@ -676,8 +726,16 @@ +@@ -667,8 +720,16 @@ return this.isSmall(); } diff --git a/paper-server/nms-patches/net/minecraft/world/entity/decoration/EntityHanging.patch b/paper-server/nms-patches/net/minecraft/world/entity/decoration/EntityHanging.patch index f39a39136f..ab985853b5 100644 --- a/paper-server/nms-patches/net/minecraft/world/entity/decoration/EntityHanging.patch +++ b/paper-server/nms-patches/net/minecraft/world/entity/decoration/EntityHanging.patch @@ -1,12 +1,11 @@ --- a/net/minecraft/world/entity/decoration/EntityHanging.java +++ b/net/minecraft/world/entity/decoration/EntityHanging.java -@@ -26,6 +26,14 @@ +@@ -26,6 +26,13 @@ import org.apache.commons.lang3.Validate; import org.slf4j.Logger; +// CraftBukkit start +import net.minecraft.tags.DamageTypeTags; -+import net.minecraft.world.level.material.Material; +import org.bukkit.entity.Hanging; +import org.bukkit.event.hanging.HangingBreakByEntityEvent; +import org.bukkit.event.hanging.HangingBreakEvent; @@ -15,7 +14,7 @@ public abstract class EntityHanging extends Entity { private static final Logger LOGGER = LogUtils.getLogger(); -@@ -60,26 +68,37 @@ +@@ -60,26 +67,37 @@ protected void recalculateBoundingBox() { if (this.direction != null) { @@ -66,7 +65,7 @@ d8 = 1.0D; } else { d6 = 1.0D; -@@ -88,11 +107,12 @@ +@@ -88,11 +106,12 @@ d6 /= 32.0D; d7 /= 32.0D; d8 /= 32.0D; @@ -81,15 +80,15 @@ return i % 32 == 0 ? 0.5D : 0.0D; } -@@ -103,6 +123,24 @@ +@@ -103,6 +122,24 @@ if (this.checkInterval++ == 100) { this.checkInterval = 0; if (!this.isRemoved() && !this.survives()) { + // CraftBukkit start - fire break events -+ Material material = this.level.getBlockState(this.blockPosition()).getMaterial(); ++ IBlockData material = this.level().getBlockState(this.blockPosition()); + HangingBreakEvent.RemoveCause cause; + -+ if (!material.equals(Material.AIR)) { ++ if (!material.isAir()) { + // TODO: This feels insufficient to catch 100% of suffocation cases + cause = HangingBreakEvent.RemoveCause.OBSTRUCTION; + } else { @@ -97,7 +96,7 @@ + } + + HangingBreakEvent event = new HangingBreakEvent((Hanging) this.getBukkitEntity(), cause); -+ this.level.getCraftServer().getPluginManager().callEvent(event); ++ this.level().getCraftServer().getPluginManager().callEvent(event); + + if (this.isRemoved() || event.isCancelled()) { + return; @@ -106,10 +105,10 @@ this.discard(); this.dropItem((Entity) null); } -@@ -166,6 +204,22 @@ +@@ -166,6 +203,22 @@ return false; } else { - if (!this.isRemoved() && !this.level.isClientSide) { + if (!this.isRemoved() && !this.level().isClientSide) { + // CraftBukkit start - fire break events + Entity damager = (damagesource.isIndirect()) ? damagesource.getEntity() : damagesource.getDirectEntity(); + HangingBreakEvent event; @@ -119,7 +118,7 @@ + event = new HangingBreakEvent((Hanging) this.getBukkitEntity(), damagesource.is(DamageTypeTags.IS_EXPLOSION) ? HangingBreakEvent.RemoveCause.EXPLOSION : HangingBreakEvent.RemoveCause.DEFAULT); + } + -+ this.level.getCraftServer().getPluginManager().callEvent(event); ++ this.level().getCraftServer().getPluginManager().callEvent(event); + + if (this.isRemoved() || event.isCancelled()) { + return true; @@ -129,16 +128,16 @@ this.kill(); this.markHurt(); this.dropItem(damagesource.getEntity()); -@@ -178,6 +232,18 @@ +@@ -178,6 +231,18 @@ @Override public void move(EnumMoveType enummovetype, Vec3D vec3d) { - if (!this.level.isClientSide && !this.isRemoved() && vec3d.lengthSqr() > 0.0D) { + if (!this.level().isClientSide && !this.isRemoved() && vec3d.lengthSqr() > 0.0D) { + if (this.isRemoved()) 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.level.getCraftServer().getPluginManager().callEvent(event); ++ this.level().getCraftServer().getPluginManager().callEvent(event); + + if (this.isRemoved() || event.isCancelled()) { + return; @@ -148,12 +147,12 @@ this.kill(); this.dropItem((Entity) null); } -@@ -186,7 +252,7 @@ +@@ -186,7 +251,7 @@ @Override public void push(double d0, double d1, double d2) { -- if (!this.level.isClientSide && !this.isRemoved() && d0 * d0 + d1 * d1 + d2 * d2 > 0.0D) { -+ if (false && !this.level.isClientSide && !this.isRemoved() && d0 * d0 + d1 * d1 + d2 * d2 > 0.0D) { // CraftBukkit - not needed +- if (!this.level().isClientSide && !this.isRemoved() && d0 * d0 + d1 * d1 + d2 * d2 > 0.0D) { ++ if (false && !this.level().isClientSide && !this.isRemoved() && d0 * d0 + d1 * d1 + d2 * d2 > 0.0D) { // CraftBukkit - not needed this.kill(); this.dropItem((Entity) null); } diff --git a/paper-server/nms-patches/net/minecraft/world/entity/decoration/EntityItemFrame.patch b/paper-server/nms-patches/net/minecraft/world/entity/decoration/EntityItemFrame.patch index 1207997e69..b233ded221 100644 --- a/paper-server/nms-patches/net/minecraft/world/entity/decoration/EntityItemFrame.patch +++ b/paper-server/nms-patches/net/minecraft/world/entity/decoration/EntityItemFrame.patch @@ -52,7 +52,7 @@ @@ -173,6 +185,11 @@ return false; } else if (!damagesource.is(DamageTypeTags.IS_EXPLOSION) && !this.getItem().isEmpty()) { - if (!this.level.isClientSide) { + if (!this.level().isClientSide) { + // CraftBukkit start - fire EntityDamageEvent + if (org.bukkit.craftbukkit.event.CraftEventFactory.handleNonLivingEntityDamageEvent(this, damagesource, f, false) || this.isRemoved()) { + return true; @@ -61,7 +61,7 @@ this.dropItem(damagesource.getEntity(), false); this.gameEvent(GameEvent.BLOCK_CHANGE, damagesource.getEntity()); this.playSound(this.getRemoveItemSound(), 1.0F, 1.0F); -@@ -302,6 +319,12 @@ +@@ -302,13 +319,19 @@ } public void setItem(ItemStack itemstack, boolean flag) { @@ -72,9 +72,8 @@ + public void setItem(ItemStack itemstack, boolean flag, boolean playSound) { + // CraftBukkit end if (!itemstack.isEmpty()) { - itemstack = itemstack.copy(); - itemstack.setCount(1); -@@ -309,7 +332,7 @@ + itemstack = itemstack.copyWithCount(1); + } this.onItemChanged(itemstack); this.getEntityData().set(EntityItemFrame.DATA_ITEM, itemstack); diff --git a/paper-server/nms-patches/net/minecraft/world/entity/item/EntityFallingBlock.patch b/paper-server/nms-patches/net/minecraft/world/entity/item/EntityFallingBlock.patch index 06950aa924..b96e34e817 100644 --- a/paper-server/nms-patches/net/minecraft/world/entity/item/EntityFallingBlock.patch +++ b/paper-server/nms-patches/net/minecraft/world/entity/item/EntityFallingBlock.patch @@ -9,17 +9,6 @@ public class EntityFallingBlock extends Entity { private static final Logger LOGGER = LogUtils.getLogger(); -@@ -57,8 +59,8 @@ - public boolean dropItem; - private boolean cancelDrop; - public boolean hurtEntities; -- private int fallDamageMax; -- private float fallDamagePerDistance; -+ public int fallDamageMax; -+ public float fallDamagePerDistance; - @Nullable - public NBTTagCompound blockData; - protected static final DataWatcherObject DATA_START_POS = DataWatcher.defineId(EntityFallingBlock.class, DataWatcherRegistry.BLOCK_POS); @@ -83,10 +85,17 @@ } @@ -49,24 +38,15 @@ + return; + } + // CraftBukkit end - if (this.level.setBlock(blockposition, this.blockState, 3)) { - ((WorldServer) this.level).getChunkSource().chunkMap.broadcast(this, new PacketPlayOutBlockChange(blockposition, this.level.getBlockState(blockposition))); + if (this.level().setBlock(blockposition, this.blockState, 3)) { + ((WorldServer) this.level()).getChunkSource().chunkMap.broadcast(this, new PacketPlayOutBlockChange(blockposition, this.level().getBlockState(blockposition))); this.discard(); -@@ -239,7 +254,7 @@ - if (i < 0) { - return false; - } else { -- Predicate predicate; -+ Predicate predicate; // CraftBukkit - decompile error - DamageSource damagesource1; - - if (this.blockState.getBlock() instanceof Fallable) { @@ -255,7 +270,9 @@ float f2 = (float) Math.min(MathHelper.floor((float) i * this.fallDamagePerDistance), this.fallDamageMax); - this.level.getEntities((Entity) this, this.getBoundingBox(), predicate).forEach((entity) -> { + this.level().getEntities((Entity) this, this.getBoundingBox(), predicate).forEach((entity) -> { + CraftEventFactory.entityDamage = this; // CraftBukkit - entity.hurt(damagesource1, f2); + entity.hurt(damagesource2, f2); + CraftEventFactory.entityDamage = null; // CraftBukkit }); boolean flag = this.blockState.is(TagsBlock.ANVIL); diff --git a/paper-server/nms-patches/net/minecraft/world/entity/item/EntityItem.patch b/paper-server/nms-patches/net/minecraft/world/entity/item/EntityItem.patch index fdd0a7adee..4a4287e345 100644 --- a/paper-server/nms-patches/net/minecraft/world/entity/item/EntityItem.patch +++ b/paper-server/nms-patches/net/minecraft/world/entity/item/EntityItem.patch @@ -48,11 +48,11 @@ + // CraftBukkit end */ this.hasImpulse |= this.updateInWaterStateAndDoFluidPushing(); - if (!this.level.isClientSide) { + if (!this.level().isClientSide) { @@ -176,6 +188,12 @@ } - if (!this.level.isClientSide && this.age >= 6000) { + if (!this.level().isClientSide && this.age >= 6000) { + // CraftBukkit start - fire ItemDespawnEvent + if (org.bukkit.craftbukkit.event.CraftEventFactory.callItemDespawnEvent(this).isCancelled()) { + this.age = 0; @@ -62,7 +62,7 @@ this.discard(); } -@@ -251,10 +269,11 @@ +@@ -255,10 +273,11 @@ private static void merge(EntityItem entityitem, ItemStack itemstack, ItemStack itemstack1) { ItemStack itemstack2 = merge(itemstack, itemstack1, 64); @@ -75,8 +75,8 @@ merge(entityitem, itemstack, itemstack1); entityitem.pickupDelay = Math.max(entityitem.pickupDelay, entityitem1.pickupDelay); entityitem.age = Math.min(entityitem.age, entityitem1.age); -@@ -280,6 +299,11 @@ - } else if (this.level.isClientSide) { +@@ -284,6 +303,11 @@ + } else if (this.level().isClientSide) { return true; } else { + // CraftBukkit start @@ -87,7 +87,7 @@ this.markHurt(); this.health = (int) ((float) this.health - f); this.gameEvent(GameEvent.ENTITY_DAMAGE, damagesource.getEntity()); -@@ -343,6 +367,46 @@ +@@ -347,6 +371,46 @@ Item item = itemstack.getItem(); int i = itemstack.getCount(); @@ -100,7 +100,7 @@ + // Call legacy event + PlayerPickupItemEvent playerEvent = new PlayerPickupItemEvent((org.bukkit.entity.Player) entityhuman.getBukkitEntity(), (org.bukkit.entity.Item) this.getBukkitEntity(), remaining); + playerEvent.setCancelled(!playerEvent.getPlayer().getCanPickupItems()); -+ this.level.getCraftServer().getPluginManager().callEvent(playerEvent); ++ this.level().getCraftServer().getPluginManager().callEvent(playerEvent); + if (playerEvent.isCancelled()) { + itemstack.setCount(i); // SPIGOT-5294 - restore count + return; @@ -109,7 +109,7 @@ + // Call newer event afterwards + EntityPickupItemEvent entityEvent = new EntityPickupItemEvent((org.bukkit.entity.Player) entityhuman.getBukkitEntity(), (org.bukkit.entity.Item) this.getBukkitEntity(), remaining); + entityEvent.setCancelled(!entityEvent.getEntity().getCanPickupItems()); -+ this.level.getCraftServer().getPluginManager().callEvent(entityEvent); ++ this.level().getCraftServer().getPluginManager().callEvent(entityEvent); + if (entityEvent.isCancelled()) { + itemstack.setCount(i); // SPIGOT-5294 - restore count + return; @@ -134,7 +134,7 @@ if (this.pickupDelay == 0 && (this.target == null || this.target.equals(entityhuman.getUUID())) && entityhuman.getInventory().add(itemstack)) { entityhuman.take(this, i); if (itemstack.isEmpty()) { -@@ -386,7 +450,9 @@ +@@ -390,7 +454,9 @@ } public void setItem(ItemStack itemstack) { diff --git a/paper-server/nms-patches/net/minecraft/world/entity/item/EntityTNTPrimed.patch b/paper-server/nms-patches/net/minecraft/world/entity/item/EntityTNTPrimed.patch index c88f4c1d9b..11022fc41c 100644 --- a/paper-server/nms-patches/net/minecraft/world/entity/item/EntityTNTPrimed.patch +++ b/paper-server/nms-patches/net/minecraft/world/entity/item/EntityTNTPrimed.patch @@ -24,14 +24,14 @@ - this.discard(); + // CraftBukkit start - Need to reverse the order of the explosion and the entity death so we have a location for the event + // this.discard(); - if (!this.level.isClientSide) { + if (!this.level().isClientSide) { this.explode(); } + this.discard(); + // CraftBukkit end } else { this.updateInWaterStateAndDoFluidPushing(); - if (this.level.isClientSide) { + if (this.level().isClientSide) { @@ -85,9 +92,16 @@ } @@ -40,12 +40,12 @@ + // CraftBukkit start + // float f = 4.0F; -- this.level.explode(this, this.getX(), this.getY(0.0625D), this.getZ(), 4.0F, World.a.TNT); +- this.level().explode(this, this.getX(), this.getY(0.0625D), this.getZ(), 4.0F, World.a.TNT); + ExplosionPrimeEvent event = new ExplosionPrimeEvent((org.bukkit.entity.Explosive) this.getBukkitEntity()); -+ this.level.getCraftServer().getPluginManager().callEvent(event); ++ this.level().getCraftServer().getPluginManager().callEvent(event); + + if (!event.isCancelled()) { -+ this.level.explode(this, this.getX(), this.getY(0.0625D), this.getZ(), event.getRadius(), event.getFire(), World.a.TNT); ++ this.level().explode(this, this.getX(), this.getY(0.0625D), this.getZ(), event.getRadius(), event.getFire(), World.a.TNT); + } + // CraftBukkit end } diff --git a/paper-server/nms-patches/net/minecraft/world/entity/monster/EntityCreeper.patch b/paper-server/nms-patches/net/minecraft/world/entity/monster/EntityCreeper.patch index 3b3589608a..49c86a1788 100644 --- a/paper-server/nms-patches/net/minecraft/world/entity/monster/EntityCreeper.patch +++ b/paper-server/nms-patches/net/minecraft/world/entity/monster/EntityCreeper.patch @@ -35,19 +35,19 @@ protected EnumInteractionResult mobInteract(EntityHuman entityhuman, EnumHand enumhand) { ItemStack itemstack = entityhuman.getItemInHand(enumhand); @@ -250,10 +266,18 @@ - if (!this.level.isClientSide) { + if (!this.level().isClientSide) { float f = this.isPowered() ? 2.0F : 1.0F; - this.dead = true; -- this.level.explode(this, this.getX(), this.getY(), this.getZ(), (float) this.explosionRadius * f, World.a.MOB); +- this.level().explode(this, this.getX(), this.getY(), this.getZ(), (float) this.explosionRadius * f, World.a.MOB); - this.discard(); - this.spawnLingeringCloud(); + // CraftBukkit start + ExplosionPrimeEvent event = new ExplosionPrimeEvent(this.getBukkitEntity(), this.explosionRadius * f, false); -+ this.level.getCraftServer().getPluginManager().callEvent(event); ++ this.level().getCraftServer().getPluginManager().callEvent(event); + if (!event.isCancelled()) { + this.dead = true; -+ this.level.explode(this, this.getX(), this.getY(), this.getZ(), event.getRadius(), event.getFire(), World.a.MOB); ++ this.level().explode(this, this.getX(), this.getY(), this.getZ(), event.getRadius(), event.getFire(), World.a.MOB); + this.discard(); + this.spawnLingeringCloud(); + } else { @@ -59,7 +59,7 @@ } @@ -264,6 +288,7 @@ if (!collection.isEmpty()) { - EntityAreaEffectCloud entityareaeffectcloud = new EntityAreaEffectCloud(this.level, this.getX(), this.getY(), this.getZ()); + EntityAreaEffectCloud entityareaeffectcloud = new EntityAreaEffectCloud(this.level(), this.getX(), this.getY(), this.getZ()); + entityareaeffectcloud.setOwner(this); // CraftBukkit entityareaeffectcloud.setRadius(2.5F); @@ -69,8 +69,8 @@ entityareaeffectcloud.addEffect(new MobEffect(mobeffect)); } -- this.level.addFreshEntity(entityareaeffectcloud); -+ this.level.addFreshEntity(entityareaeffectcloud, CreatureSpawnEvent.SpawnReason.EXPLOSION); // CraftBukkit +- this.level().addFreshEntity(entityareaeffectcloud); ++ this.level().addFreshEntity(entityareaeffectcloud, CreatureSpawnEvent.SpawnReason.EXPLOSION); // CraftBukkit } } diff --git a/paper-server/nms-patches/net/minecraft/world/entity/monster/EntityDrowned.patch b/paper-server/nms-patches/net/minecraft/world/entity/monster/EntityDrowned.patch index b6916ad7b4..b405773eca 100644 --- a/paper-server/nms-patches/net/minecraft/world/entity/monster/EntityDrowned.patch +++ b/paper-server/nms-patches/net/minecraft/world/entity/monster/EntityDrowned.patch @@ -4,8 +4,8 @@ @Override public void performRangedAttack(EntityLiving entityliving, float f) { -- EntityThrownTrident entitythrowntrident = new EntityThrownTrident(this.level, this, new ItemStack(Items.TRIDENT)); -+ EntityThrownTrident entitythrowntrident = new EntityThrownTrident(this.level, this, this.getItemInHand(net.minecraft.world.entity.projectile.ProjectileHelper.getWeaponHoldingHand(this, Items.TRIDENT))); // CraftBukkit - Use Trident in hand like skeletons (SPIGOT-7025) +- EntityThrownTrident entitythrowntrident = new EntityThrownTrident(this.level(), this, new ItemStack(Items.TRIDENT)); ++ EntityThrownTrident entitythrowntrident = new EntityThrownTrident(this.level(), this, this.getItemInHand(net.minecraft.world.entity.projectile.ProjectileHelper.getWeaponHoldingHand(this, Items.TRIDENT))); // CraftBukkit - Use Trident in hand like skeletons (SPIGOT-7025) double d0 = entityliving.getX() - this.getX(); double d1 = entityliving.getY(0.3333333333333333D) - entitythrowntrident.getY(); double d2 = entityliving.getZ() - this.getZ(); diff --git a/paper-server/nms-patches/net/minecraft/world/entity/monster/EntityEnderman.patch b/paper-server/nms-patches/net/minecraft/world/entity/monster/EntityEnderman.patch index 2295a5b1f3..cc6aadc3ef 100644 --- a/paper-server/nms-patches/net/minecraft/world/entity/monster/EntityEnderman.patch +++ b/paper-server/nms-patches/net/minecraft/world/entity/monster/EntityEnderman.patch @@ -29,7 +29,7 @@ @@ -487,9 +498,13 @@ if (iblockdata2 != null) { - iblockdata2 = Block.updateFromNeighbourShapes(iblockdata2, this.enderman.level, blockposition); + iblockdata2 = Block.updateFromNeighbourShapes(iblockdata2, this.enderman.level(), blockposition); if (this.canPlaceBlock(world, blockposition, iblockdata2, iblockdata, iblockdata1, blockposition1)) { + // CraftBukkit start - Place event + if (!org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(this.enderman, blockposition, iblockdata2).isCancelled()) { diff --git a/paper-server/nms-patches/net/minecraft/world/entity/monster/EntityGuardianElder.patch b/paper-server/nms-patches/net/minecraft/world/entity/monster/EntityGuardianElder.patch index aac71aadd0..c708cf101b 100644 --- a/paper-server/nms-patches/net/minecraft/world/entity/monster/EntityGuardianElder.patch +++ b/paper-server/nms-patches/net/minecraft/world/entity/monster/EntityGuardianElder.patch @@ -4,8 +4,8 @@ super.customServerAiStep(); if ((this.tickCount + this.getId()) % 1200 == 0) { MobEffect mobeffect = new MobEffect(MobEffects.DIG_SLOWDOWN, 6000, 2); -- List list = MobEffectUtil.addEffectToPlayersAround((WorldServer) this.level, this, this.position(), 50.0D, mobeffect, 1200); -+ List list = MobEffectUtil.addEffectToPlayersAround((WorldServer) this.level, this, this.position(), 50.0D, mobeffect, 1200, org.bukkit.event.entity.EntityPotionEffectEvent.Cause.ATTACK); // CraftBukkit +- List list = MobEffectUtil.addEffectToPlayersAround((WorldServer) this.level(), this, this.position(), 50.0D, mobeffect, 1200); ++ List list = MobEffectUtil.addEffectToPlayersAround((WorldServer) this.level(), this, this.position(), 50.0D, mobeffect, 1200, org.bukkit.event.entity.EntityPotionEffectEvent.Cause.ATTACK); // CraftBukkit list.forEach((entityplayer) -> { entityplayer.connection.send(new PacketPlayOutGameStateChange(PacketPlayOutGameStateChange.GUARDIAN_ELDER_EFFECT, this.isSilent() ? 0.0F : 1.0F)); diff --git a/paper-server/nms-patches/net/minecraft/world/entity/monster/EntityPhantom.patch b/paper-server/nms-patches/net/minecraft/world/entity/monster/EntityPhantom.patch index 529a384433..67782a5164 100644 --- a/paper-server/nms-patches/net/minecraft/world/entity/monster/EntityPhantom.patch +++ b/paper-server/nms-patches/net/minecraft/world/entity/monster/EntityPhantom.patch @@ -1,7 +1,7 @@ --- a/net/minecraft/world/entity/monster/EntityPhantom.java +++ b/net/minecraft/world/entity/monster/EntityPhantom.java @@ -538,14 +538,14 @@ - List list = EntityPhantom.this.level.getNearbyPlayers(this.attackTargeting, EntityPhantom.this, EntityPhantom.this.getBoundingBox().inflate(16.0D, 64.0D, 16.0D)); + List list = EntityPhantom.this.level().getNearbyPlayers(this.attackTargeting, EntityPhantom.this, EntityPhantom.this.getBoundingBox().inflate(16.0D, 64.0D, 16.0D)); if (!list.isEmpty()) { - list.sort(Comparator.comparing(Entity::getY).reversed()); diff --git a/paper-server/nms-patches/net/minecraft/world/entity/monster/EntityPigZombie.patch b/paper-server/nms-patches/net/minecraft/world/entity/monster/EntityPigZombie.patch index b3fd8e09dd..90bb4fb348 100644 --- a/paper-server/nms-patches/net/minecraft/world/entity/monster/EntityPigZombie.patch +++ b/paper-server/nms-patches/net/minecraft/world/entity/monster/EntityPigZombie.patch @@ -30,9 +30,9 @@ public void startPersistentAngerTimer() { - this.setRemainingPersistentAngerTime(EntityPigZombie.PERSISTENT_ANGER_TIME.sample(this.random)); + // CraftBukkit start -+ Entity entity = ((WorldServer) this.level).getEntity(getPersistentAngerTarget()); ++ Entity entity = ((WorldServer) this.level()).getEntity(getPersistentAngerTarget()); + org.bukkit.event.entity.PigZombieAngerEvent event = new org.bukkit.event.entity.PigZombieAngerEvent((org.bukkit.entity.PigZombie) this.getBukkitEntity(), (entity == null) ? null : entity.getBukkitEntity(), EntityPigZombie.PERSISTENT_ANGER_TIME.sample(this.random)); -+ this.level.getCraftServer().getPluginManager().callEvent(event); ++ this.level().getCraftServer().getPluginManager().callEvent(event); + if (event.isCancelled()) { + this.setPersistentAngerTarget(null); + return; diff --git a/paper-server/nms-patches/net/minecraft/world/entity/monster/EntityRavager.patch b/paper-server/nms-patches/net/minecraft/world/entity/monster/EntityRavager.patch index 3baa64d8f3..c2e713e5e0 100644 --- a/paper-server/nms-patches/net/minecraft/world/entity/monster/EntityRavager.patch +++ b/paper-server/nms-patches/net/minecraft/world/entity/monster/EntityRavager.patch @@ -1,11 +1,11 @@ --- a/net/minecraft/world/entity/monster/EntityRavager.java +++ b/net/minecraft/world/entity/monster/EntityRavager.java @@ -170,7 +170,7 @@ - IBlockData iblockdata = this.level.getBlockState(blockposition); + IBlockData iblockdata = this.level().getBlockState(blockposition); Block block = iblockdata.getBlock(); - if (block instanceof BlockLeaves) { + if (block instanceof BlockLeaves && !org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(this, blockposition, net.minecraft.world.level.block.Blocks.AIR.defaultBlockState()).isCancelled()) { // CraftBukkit - flag = this.level.destroyBlock(blockposition, true, this) || flag; + flag = this.level().destroyBlock(blockposition, true, this) || flag; } } diff --git a/paper-server/nms-patches/net/minecraft/world/entity/monster/EntityShulker.patch b/paper-server/nms-patches/net/minecraft/world/entity/monster/EntityShulker.patch index dd9138ebac..0a6e238be1 100644 --- a/paper-server/nms-patches/net/minecraft/world/entity/monster/EntityShulker.patch +++ b/paper-server/nms-patches/net/minecraft/world/entity/monster/EntityShulker.patch @@ -18,8 +18,8 @@ if (enumdirection != null) { + // CraftBukkit start -+ EntityTeleportEvent teleport = new EntityTeleportEvent(this.getBukkitEntity(), this.getBukkitEntity().getLocation(), CraftLocation.toBukkit(blockposition1, this.level.getWorld())); -+ this.level.getCraftServer().getPluginManager().callEvent(teleport); ++ EntityTeleportEvent teleport = new EntityTeleportEvent(this.getBukkitEntity(), this.getBukkitEntity().getLocation(), CraftLocation.toBukkit(blockposition1, this.level().getWorld())); ++ this.level().getCraftServer().getPluginManager().callEvent(teleport); + if (!teleport.isCancelled()) { + Location to = teleport.getTo(); + blockposition1 = BlockPosition.containing(to.getX(), to.getY(), to.getZ()); @@ -34,8 +34,8 @@ if (entityshulker != null) { entityshulker.setVariant(this.getVariant()); entityshulker.moveTo(vec3d); -- this.level.addFreshEntity(entityshulker); -+ this.level.addFreshEntity(entityshulker, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.BREEDING); // CraftBukkit - the mysteries of life +- this.level().addFreshEntity(entityshulker); ++ this.level().addFreshEntity(entityshulker, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.BREEDING); // CraftBukkit - the mysteries of life } } diff --git a/paper-server/nms-patches/net/minecraft/world/entity/monster/EntitySkeleton.patch b/paper-server/nms-patches/net/minecraft/world/entity/monster/EntitySkeleton.patch index f9af5924c1..0d58e34745 100644 --- a/paper-server/nms-patches/net/minecraft/world/entity/monster/EntitySkeleton.patch +++ b/paper-server/nms-patches/net/minecraft/world/entity/monster/EntitySkeleton.patch @@ -7,5 +7,5 @@ - this.convertTo(EntityTypes.STRAY, true); + this.convertTo(EntityTypes.STRAY, true, org.bukkit.event.entity.EntityTransformEvent.TransformReason.FROZEN, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.FROZEN); // CraftBukkit - add spawn and transform reasons if (!this.isSilent()) { - this.level.levelEvent((EntityHuman) null, 1048, this.blockPosition(), 0); + this.level().levelEvent((EntityHuman) null, 1048, this.blockPosition(), 0); } diff --git a/paper-server/nms-patches/net/minecraft/world/entity/monster/EntitySkeletonAbstract.patch b/paper-server/nms-patches/net/minecraft/world/entity/monster/EntitySkeletonAbstract.patch index cf31770d49..bab47f75c2 100644 --- a/paper-server/nms-patches/net/minecraft/world/entity/monster/EntitySkeletonAbstract.patch +++ b/paper-server/nms-patches/net/minecraft/world/entity/monster/EntitySkeletonAbstract.patch @@ -3,7 +3,7 @@ @@ -200,8 +200,19 @@ double d3 = Math.sqrt(d0 * d0 + d2 * d2); - entityarrow.shoot(d0, d1 + d3 * 0.20000000298023224D, d2, 1.6F, (float) (14 - this.level.getDifficulty().getId() * 4)); + entityarrow.shoot(d0, d1 + d3 * 0.20000000298023224D, d2, 1.6F, (float) (14 - this.level().getDifficulty().getId() * 4)); + // CraftBukkit start + org.bukkit.event.entity.EntityShootBowEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callEntityShootBowEvent(this, this.getMainHandItem(), null, entityarrow, net.minecraft.world.EnumHand.MAIN_HAND, 0.8F, true); + if (event.isCancelled()) { @@ -12,12 +12,12 @@ + } + + if (event.getProjectile() == entityarrow.getBukkitEntity()) { -+ level.addFreshEntity(entityarrow); ++ this.level().addFreshEntity(entityarrow); + } + // CraftBukkit end this.playSound(SoundEffects.SKELETON_SHOOT, 1.0F, 1.0F / (this.getRandom().nextFloat() * 0.4F + 0.8F)); -- this.level.addFreshEntity(entityarrow); -+ // this.level.addFreshEntity(entityarrow); // CraftBukkit - moved up +- this.level().addFreshEntity(entityarrow); ++ // this.level().addFreshEntity(entityarrow); // CraftBukkit - moved up } protected EntityArrow getArrow(ItemStack itemstack, float f) { diff --git a/paper-server/nms-patches/net/minecraft/world/entity/monster/EntitySlime.patch b/paper-server/nms-patches/net/minecraft/world/entity/monster/EntitySlime.patch index ffec2feab5..c22e95ef41 100644 --- a/paper-server/nms-patches/net/minecraft/world/entity/monster/EntitySlime.patch +++ b/paper-server/nms-patches/net/minecraft/world/entity/monster/EntitySlime.patch @@ -30,7 +30,7 @@ + // CraftBukkit start + SlimeSplitEvent event = new SlimeSplitEvent((org.bukkit.entity.Slime) this.getBukkitEntity(), k); -+ this.level.getCraftServer().getPluginManager().callEvent(event); ++ this.level().getCraftServer().getPluginManager().callEvent(event); + + if (!event.isCancelled() && event.getCount() > 0) { + k = event.getCount(); @@ -48,7 +48,7 @@ entityslime.setInvulnerable(this.isInvulnerable()); entityslime.setSize(j, true); entityslime.moveTo(this.getX() + (double) f1, this.getY() + 0.5D, this.getZ() + (double) f2, this.random.nextFloat() * 360.0F, 0.0F); -- this.level.addFreshEntity(entityslime); +- this.level().addFreshEntity(entityslime); + slimes.add(entityslime); // CraftBukkit } } @@ -58,7 +58,7 @@ + return; + } + for (EntityLiving living : slimes) { -+ this.level.addFreshEntity(living, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.SLIME_SPLIT); // CraftBukkit - SpawnReason ++ this.level().addFreshEntity(living, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.SLIME_SPLIT); // CraftBukkit - SpawnReason + } + // CraftBukkit end } diff --git a/paper-server/nms-patches/net/minecraft/world/entity/monster/EntityZombie.patch b/paper-server/nms-patches/net/minecraft/world/entity/monster/EntityZombie.patch index 5b44a2ae23..6071fb1c4c 100644 --- a/paper-server/nms-patches/net/minecraft/world/entity/monster/EntityZombie.patch +++ b/paper-server/nms-patches/net/minecraft/world/entity/monster/EntityZombie.patch @@ -26,7 +26,7 @@ super(entitytypes, world); @@ -202,7 +212,10 @@ public void tick() { - if (!this.level.isClientSide && this.isAlive() && !this.isNoAi()) { + if (!this.level().isClientSide && this.isAlive() && !this.isNoAi()) { if (this.isUnderWaterConverting()) { - --this.conversionTime; + // CraftBukkit start - Use wall time instead of ticks for conversion @@ -60,7 +60,7 @@ + EntityZombie entityzombie = (EntityZombie) this.convertTo(entitytypes, true, EntityTransformEvent.TransformReason.DROWNED, CreatureSpawnEvent.SpawnReason.DROWNED); if (entityzombie != null) { - entityzombie.handleAttributes(entityzombie.level.getCurrentDifficultyAt(entityzombie.blockPosition()).getSpecialMultiplier()); + entityzombie.handleAttributes(entityzombie.level().getCurrentDifficultyAt(entityzombie.blockPosition()).getSpecialMultiplier()); entityzombie.setCanBreakDoors(entityzombie.supportsBreakDoorGoal() && this.canBreakDoors()); + // CraftBukkit start - SPIGOT-5208: End conversion to stop event spam + } else { @@ -70,25 +70,25 @@ } @@ -308,9 +327,9 @@ - if (SpawnerCreature.isSpawnPositionOk(entitypositiontypes_surface, this.level, blockposition, entitytypes) && EntityPositionTypes.checkSpawnRules(entitytypes, worldserver, EnumMobSpawn.REINFORCEMENT, blockposition, this.level.random)) { + if (SpawnerCreature.isSpawnPositionOk(entitypositiontypes_surface, this.level(), blockposition, entitytypes) && EntityPositionTypes.checkSpawnRules(entitytypes, worldserver, EnumMobSpawn.REINFORCEMENT, blockposition, this.level().random)) { entityzombie.setPos((double) i1, (double) j1, (double) k1); - if (!this.level.hasNearbyAlivePlayer((double) i1, (double) j1, (double) k1, 7.0D) && this.level.isUnobstructed(entityzombie) && this.level.noCollision((Entity) entityzombie) && !this.level.containsAnyLiquid(entityzombie.getBoundingBox())) { + if (!this.level().hasNearbyAlivePlayer((double) i1, (double) j1, (double) k1, 7.0D) && this.level().isUnobstructed(entityzombie) && this.level().noCollision((Entity) entityzombie) && !this.level().containsAnyLiquid(entityzombie.getBoundingBox())) { - entityzombie.setTarget(entityliving); + entityzombie.setTarget(entityliving, EntityTargetEvent.TargetReason.REINFORCEMENT_TARGET, true); // CraftBukkit - entityzombie.finalizeSpawn(worldserver, this.level.getCurrentDifficultyAt(entityzombie.blockPosition()), EnumMobSpawn.REINFORCEMENT, (GroupDataEntity) null, (NBTTagCompound) null); + entityzombie.finalizeSpawn(worldserver, this.level().getCurrentDifficultyAt(entityzombie.blockPosition()), EnumMobSpawn.REINFORCEMENT, (GroupDataEntity) null, (NBTTagCompound) null); - worldserver.addFreshEntityWithPassengers(entityzombie); + worldserver.addFreshEntityWithPassengers(entityzombie, CreatureSpawnEvent.SpawnReason.REINFORCEMENTS); // CraftBukkit this.getAttribute(GenericAttributes.SPAWN_REINFORCEMENTS_CHANCE).addPermanentModifier(new AttributeModifier("Zombie reinforcement caller charge", -0.05000000074505806D, AttributeModifier.Operation.ADDITION)); entityzombie.getAttribute(GenericAttributes.SPAWN_REINFORCEMENTS_CHANCE).addPermanentModifier(new AttributeModifier("Zombie reinforcement callee charge", -0.05000000074505806D, AttributeModifier.Operation.ADDITION)); break; @@ -331,7 +350,14 @@ - float f = this.level.getCurrentDifficultyAt(this.blockPosition()).getEffectiveDifficulty(); + float f = this.level().getCurrentDifficultyAt(this.blockPosition()).getEffectiveDifficulty(); if (this.getMainHandItem().isEmpty() && this.isOnFire() && this.random.nextFloat() < f * 0.3F) { - entity.setSecondsOnFire(2 * (int) f); + // CraftBukkit start + EntityCombustByEntityEvent event = new EntityCombustByEntityEvent(this.getBukkitEntity(), entity.getBukkitEntity(), 2 * (int) f); // PAIL: fixme -+ this.level.getCraftServer().getPluginManager().callEvent(event); ++ this.level().getCraftServer().getPluginManager().callEvent(event); + + if (!event.isCancelled()) { + entity.setSecondsOnFire(event.getDuration(), false); diff --git a/paper-server/nms-patches/net/minecraft/world/entity/monster/EntityZombieHusk.patch b/paper-server/nms-patches/net/minecraft/world/entity/monster/EntityZombieHusk.patch index 00fdf04cfb..dab22fcd43 100644 --- a/paper-server/nms-patches/net/minecraft/world/entity/monster/EntityZombieHusk.patch +++ b/paper-server/nms-patches/net/minecraft/world/entity/monster/EntityZombieHusk.patch @@ -2,7 +2,7 @@ +++ b/net/minecraft/world/entity/monster/EntityZombieHusk.java @@ -58,7 +58,7 @@ if (flag && this.getMainHandItem().isEmpty() && entity instanceof EntityLiving) { - float f = this.level.getCurrentDifficultyAt(this.blockPosition()).getEffectiveDifficulty(); + float f = this.level().getCurrentDifficultyAt(this.blockPosition()).getEffectiveDifficulty(); - ((EntityLiving) entity).addEffect(new MobEffect(MobEffects.HUNGER, 140 * (int) f), this); + ((EntityLiving) entity).addEffect(new MobEffect(MobEffects.HUNGER, 140 * (int) f), this, org.bukkit.event.entity.EntityPotionEffectEvent.Cause.ATTACK); // CraftBukkit diff --git a/paper-server/nms-patches/net/minecraft/world/entity/monster/EntityZombieVillager.patch b/paper-server/nms-patches/net/minecraft/world/entity/monster/EntityZombieVillager.patch index a7da7bee1f..61117d8bbf 100644 --- a/paper-server/nms-patches/net/minecraft/world/entity/monster/EntityZombieVillager.patch +++ b/paper-server/nms-patches/net/minecraft/world/entity/monster/EntityZombieVillager.patch @@ -33,7 +33,7 @@ Objects.requireNonNull(logger); @@ -138,6 +146,10 @@ public void tick() { - if (!this.level.isClientSide && this.isAlive() && this.isConverting()) { + if (!this.level().isClientSide && this.isAlive() && this.isConverting()) { int i = this.getConversionProgress(); + // CraftBukkit start - Use wall time instead of ticks for villager conversion + int elapsedTicks = MinecraftServer.currentTick - this.lastTick; @@ -55,12 +55,12 @@ this.villagerConversionTime = i; this.getEntityData().set(EntityZombieVillager.DATA_CONVERTING_ID, true); - this.removeEffect(MobEffects.WEAKNESS); -- this.addEffect(new MobEffect(MobEffects.DAMAGE_BOOST, i, Math.min(this.level.getDifficulty().getId() - 1, 0))); +- this.addEffect(new MobEffect(MobEffects.DAMAGE_BOOST, i, Math.min(this.level().getDifficulty().getId() - 1, 0))); + // CraftBukkit start + this.removeEffect(MobEffects.WEAKNESS, org.bukkit.event.entity.EntityPotionEffectEvent.Cause.CONVERSION); -+ this.addEffect(new MobEffect(MobEffects.DAMAGE_BOOST, i, Math.min(this.level.getDifficulty().getId() - 1, 0)), org.bukkit.event.entity.EntityPotionEffectEvent.Cause.CONVERSION); ++ this.addEffect(new MobEffect(MobEffects.DAMAGE_BOOST, i, Math.min(this.level().getDifficulty().getId() - 1, 0)), org.bukkit.event.entity.EntityPotionEffectEvent.Cause.CONVERSION); + // CraftBukkit end - this.level.broadcastEntityEvent(this, (byte) 16); + this.level().broadcastEntityEvent(this, (byte) 16); } @@ -207,7 +222,13 @@ diff --git a/paper-server/nms-patches/net/minecraft/world/entity/monster/piglin/EntityPiglin.patch b/paper-server/nms-patches/net/minecraft/world/entity/monster/piglin/EntityPiglin.patch index 0f27d24e89..8418045ad8 100644 --- a/paper-server/nms-patches/net/minecraft/world/entity/monster/piglin/EntityPiglin.patch +++ b/paper-server/nms-patches/net/minecraft/world/entity/monster/piglin/EntityPiglin.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/entity/monster/piglin/EntityPiglin.java +++ b/net/minecraft/world/entity/monster/piglin/EntityPiglin.java -@@ -56,6 +56,18 @@ +@@ -55,6 +55,18 @@ import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.state.IBlockData; @@ -19,7 +19,7 @@ public class EntityPiglin extends EntityPiglinAbstract implements ICrossbow, InventoryCarrier { private static final DataWatcherObject DATA_BABY_ID = DataWatcher.defineId(EntityPiglin.class, DataWatcherRegistry.BOOLEAN); -@@ -76,6 +88,10 @@ +@@ -75,6 +87,10 @@ public boolean cannotHunt; protected static final ImmutableList>> SENSOR_TYPES = ImmutableList.of(SensorType.NEAREST_LIVING_ENTITIES, SensorType.NEAREST_PLAYERS, SensorType.NEAREST_ITEMS, SensorType.HURT_BY, SensorType.PIGLIN_SPECIFIC_SENSOR); protected static final ImmutableList> MEMORY_TYPES = ImmutableList.of(MemoryModuleType.LOOK_TARGET, MemoryModuleType.DOORS_TO_CLOSE, MemoryModuleType.NEAREST_LIVING_ENTITIES, MemoryModuleType.NEAREST_VISIBLE_LIVING_ENTITIES, MemoryModuleType.NEAREST_VISIBLE_PLAYER, MemoryModuleType.NEAREST_VISIBLE_ATTACKABLE_PLAYER, MemoryModuleType.NEAREST_VISIBLE_ADULT_PIGLINS, MemoryModuleType.NEARBY_ADULT_PIGLINS, MemoryModuleType.NEAREST_VISIBLE_WANTED_ITEM, MemoryModuleType.ITEM_PICKUP_COOLDOWN_TICKS, MemoryModuleType.HURT_BY, MemoryModuleType.HURT_BY_ENTITY, new MemoryModuleType[]{MemoryModuleType.WALK_TARGET, MemoryModuleType.CANT_REACH_WALK_TARGET_SINCE, MemoryModuleType.ATTACK_TARGET, MemoryModuleType.ATTACK_COOLING_DOWN, MemoryModuleType.INTERACTION_TARGET, MemoryModuleType.PATH, MemoryModuleType.ANGRY_AT, MemoryModuleType.UNIVERSAL_ANGER, MemoryModuleType.AVOID_TARGET, MemoryModuleType.ADMIRING_ITEM, MemoryModuleType.TIME_TRYING_TO_REACH_ADMIRE_ITEM, MemoryModuleType.ADMIRING_DISABLED, MemoryModuleType.DISABLE_WALK_TO_ADMIRE_ITEM, MemoryModuleType.CELEBRATE_LOCATION, MemoryModuleType.DANCING, MemoryModuleType.HUNTED_RECENTLY, MemoryModuleType.NEAREST_VISIBLE_BABY_HOGLIN, MemoryModuleType.NEAREST_VISIBLE_NEMESIS, MemoryModuleType.NEAREST_VISIBLE_ZOMBIFIED, MemoryModuleType.RIDE_TARGET, MemoryModuleType.VISIBLE_ADULT_PIGLIN_COUNT, MemoryModuleType.VISIBLE_ADULT_HOGLIN_COUNT, MemoryModuleType.NEAREST_VISIBLE_HUNTABLE_HOGLIN, MemoryModuleType.NEAREST_TARGETABLE_PLAYER_NOT_WEARING_GOLD, MemoryModuleType.NEAREST_PLAYER_HOLDING_WANTED_ITEM, MemoryModuleType.ATE_RECENTLY, MemoryModuleType.NEAREST_REPELLENT}); @@ -30,7 +30,7 @@ public EntityPiglin(EntityTypes entitytypes, World world) { super(entitytypes, world); -@@ -94,6 +110,14 @@ +@@ -93,6 +109,14 @@ } this.writeInventoryToTag(nbttagcompound); @@ -45,7 +45,7 @@ } @Override -@@ -102,6 +126,10 @@ +@@ -101,6 +125,10 @@ this.setBaby(nbttagcompound.getBoolean("IsBaby")); this.setCannotHunt(nbttagcompound.getBoolean("CannotHunt")); this.readInventoryFromTag(nbttagcompound); @@ -56,7 +56,7 @@ } @VisibleForDebug -@@ -223,7 +251,7 @@ +@@ -220,7 +248,7 @@ @Override public BehaviorController getBrain() { @@ -65,7 +65,7 @@ } @Override -@@ -368,7 +396,7 @@ +@@ -365,7 +393,7 @@ } protected void holdInOffHand(ItemStack itemstack) { @@ -74,7 +74,7 @@ this.setItemSlot(EnumItemSlot.OFFHAND, itemstack); this.setGuaranteedDrop(EnumItemSlot.OFFHAND); } else { -@@ -394,8 +422,8 @@ +@@ -391,8 +419,8 @@ if (EnchantmentManager.hasBindingCurse(itemstack1)) { return false; } else { @@ -85,12 +85,12 @@ return flag && !flag1 ? true : (!flag && flag1 ? false : (this.isAdult() && !itemstack.is(Items.CROSSBOW) && itemstack1.is(Items.CROSSBOW) ? false : super.canReplaceCurrentItem(itemstack, itemstack1))); } -@@ -424,7 +452,7 @@ +@@ -421,7 +449,7 @@ @Override protected SoundEffect getAmbientSound() { -- return this.level.isClientSide ? null : (SoundEffect) PiglinAI.getSoundForCurrentActivity(this).orElse((Object) null); -+ return this.level.isClientSide ? null : (SoundEffect) PiglinAI.getSoundForCurrentActivity(this).orElse(null); // CraftBukkit - Decompile error +- return this.level().isClientSide ? null : (SoundEffect) PiglinAI.getSoundForCurrentActivity(this).orElse((Object) null); ++ return this.level().isClientSide ? null : (SoundEffect) PiglinAI.getSoundForCurrentActivity(this).orElse(null); // CraftBukkit - Decompile error } @Override diff --git a/paper-server/nms-patches/net/minecraft/world/entity/monster/warden/Warden.patch b/paper-server/nms-patches/net/minecraft/world/entity/monster/warden/Warden.patch index c5be45a197..1591dcbed1 100644 --- a/paper-server/nms-patches/net/minecraft/world/entity/monster/warden/Warden.patch +++ b/paper-server/nms-patches/net/minecraft/world/entity/monster/warden/Warden.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/entity/monster/warden/Warden.java +++ b/net/minecraft/world/entity/monster/warden/Warden.java -@@ -370,7 +370,7 @@ +@@ -371,7 +371,7 @@ @Override public BehaviorController getBrain() { @@ -9,7 +9,7 @@ } @Override -@@ -421,13 +421,13 @@ +@@ -412,13 +412,13 @@ public static void applyDarknessAround(WorldServer worldserver, Vec3D vec3d, @Nullable Entity entity, int i) { MobEffect mobeffect = new MobEffect(MobEffects.DARKNESS, 260, 0, false, false); @@ -25,7 +25,7 @@ Logger logger = Warden.LOGGER; Objects.requireNonNull(logger); -@@ -452,7 +452,7 @@ +@@ -443,7 +443,7 @@ dataresult = AngerManagement.codec(this::canTargetEntity).parse(new Dynamic(DynamicOpsNBT.INSTANCE, nbttagcompound.get("anger"))); logger = Warden.LOGGER; Objects.requireNonNull(logger); @@ -34,16 +34,16 @@ this.angerManagement = angermanagement; }); this.syncClientAngerLevel(); -@@ -462,7 +462,7 @@ - dataresult = VibrationListener.codec(this).parse(new Dynamic(DynamicOpsNBT.INSTANCE, nbttagcompound.getCompound("listener"))); +@@ -453,7 +453,7 @@ + dataresult = VibrationSystem.a.CODEC.parse(new Dynamic(DynamicOpsNBT.INSTANCE, nbttagcompound.getCompound("listener"))); logger = Warden.LOGGER; Objects.requireNonNull(logger); -- dataresult.resultOrPartial(logger::error).ifPresent((vibrationlistener) -> { -+ ((DataResult) dataresult).resultOrPartial(logger::error).ifPresent((vibrationlistener) -> { // CraftBukkit - decompile error - this.dynamicGameEventListener.updateListener(vibrationlistener, this.level); +- dataresult.resultOrPartial(logger::error).ifPresent((vibrationsystem_a) -> { ++ ((DataResult) dataresult).resultOrPartial(logger::error).ifPresent((vibrationsystem_a) -> { // CraftBukkit - decompile error + this.vibrationData = vibrationsystem_a; }); } -@@ -496,7 +496,7 @@ +@@ -487,7 +487,7 @@ public void increaseAngerAt(@Nullable Entity entity, int i, boolean flag) { if (!this.isNoAi() && this.canTargetEntity(entity)) { WardenAi.setDigCooldown(this); @@ -52,7 +52,7 @@ int j = this.angerManagement.increaseAnger(entity, i); if (entity instanceof EntityHuman && flag1 && AngerLevel.byAnger(j).isAngry()) { -@@ -517,7 +517,7 @@ +@@ -508,7 +508,7 @@ @Nullable @Override public EntityLiving getTarget() { @@ -61,7 +61,7 @@ } @Override -@@ -560,7 +560,7 @@ +@@ -551,7 +551,7 @@ public void setAttackTarget(EntityLiving entityliving) { this.getBrain().eraseMemory(MemoryModuleType.ROAR_TARGET); diff --git a/paper-server/nms-patches/net/minecraft/world/entity/npc/EntityVillager.patch b/paper-server/nms-patches/net/minecraft/world/entity/npc/EntityVillager.patch index 65f712b008..5fe6a637ca 100644 --- a/paper-server/nms-patches/net/minecraft/world/entity/npc/EntityVillager.patch +++ b/paper-server/nms-patches/net/minecraft/world/entity/npc/EntityVillager.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/entity/npc/EntityVillager.java +++ b/net/minecraft/world/entity/npc/EntityVillager.java -@@ -90,6 +90,14 @@ +@@ -91,6 +91,14 @@ import net.minecraft.world.phys.AxisAlignedBB; import org.slf4j.Logger; @@ -15,7 +15,7 @@ public class EntityVillager extends EntityVillagerAbstract implements ReputationHandler, VillagerDataHolder { private static final Logger LOGGER = LogUtils.getLogger(); -@@ -148,7 +156,7 @@ +@@ -149,7 +157,7 @@ @Override public BehaviorController getBrain() { @@ -24,7 +24,7 @@ } @Override -@@ -231,7 +239,7 @@ +@@ -232,7 +240,7 @@ this.increaseProfessionLevelOnUpdate = false; } @@ -33,7 +33,7 @@ } } -@@ -359,7 +367,13 @@ +@@ -360,7 +368,13 @@ while (iterator.hasNext()) { MerchantRecipe merchantrecipe = (MerchantRecipe) iterator.next(); @@ -48,7 +48,7 @@ } this.resendOffersToTradingPlayer(); -@@ -428,7 +442,13 @@ +@@ -429,7 +443,13 @@ while (iterator.hasNext()) { MerchantRecipe merchantrecipe = (MerchantRecipe) iterator.next(); @@ -63,7 +63,7 @@ } } -@@ -488,7 +508,7 @@ +@@ -489,7 +509,7 @@ @Override public void addAdditionalSaveData(NBTTagCompound nbttagcompound) { super.addAdditionalSaveData(nbttagcompound); @@ -72,7 +72,7 @@ Logger logger = EntityVillager.LOGGER; Objects.requireNonNull(logger); -@@ -832,7 +852,12 @@ +@@ -833,7 +853,12 @@ } entitywitch.setPersistenceRequired(); @@ -86,7 +86,7 @@ this.releaseAllPois(); this.discard(); } else { -@@ -921,7 +946,7 @@ +@@ -924,7 +949,7 @@ }).limit(5L).collect(Collectors.toList()); if (list1.size() >= j) { @@ -95,21 +95,21 @@ list.forEach(SensorGolemLastSeen::golemDetected); } } -@@ -978,7 +1003,7 @@ +@@ -981,7 +1006,7 @@ @Override public void startSleeping(BlockPosition blockposition) { super.startSleeping(blockposition); -- this.brain.setMemory(MemoryModuleType.LAST_SLEPT, (Object) this.level.getGameTime()); -+ this.brain.setMemory(MemoryModuleType.LAST_SLEPT, this.level.getGameTime()); // CraftBukkit - decompile error +- this.brain.setMemory(MemoryModuleType.LAST_SLEPT, (Object) this.level().getGameTime()); ++ this.brain.setMemory(MemoryModuleType.LAST_SLEPT, this.level().getGameTime()); // CraftBukkit - decompile error this.brain.eraseMemory(MemoryModuleType.WALK_TARGET); this.brain.eraseMemory(MemoryModuleType.CANT_REACH_WALK_TARGET_SINCE); } -@@ -986,7 +1011,7 @@ +@@ -989,7 +1014,7 @@ @Override public void stopSleeping() { super.stopSleeping(); -- this.brain.setMemory(MemoryModuleType.LAST_WOKEN, (Object) this.level.getGameTime()); -+ this.brain.setMemory(MemoryModuleType.LAST_WOKEN, this.level.getGameTime()); // CraftBukkit - decompile error +- this.brain.setMemory(MemoryModuleType.LAST_WOKEN, (Object) this.level().getGameTime()); ++ this.brain.setMemory(MemoryModuleType.LAST_WOKEN, this.level().getGameTime()); // CraftBukkit - decompile error } private boolean golemSpawnConditionsMet(long i) { diff --git a/paper-server/nms-patches/net/minecraft/world/entity/npc/EntityVillagerTrader.patch b/paper-server/nms-patches/net/minecraft/world/entity/npc/EntityVillagerTrader.patch index 602578a506..a3be4da981 100644 --- a/paper-server/nms-patches/net/minecraft/world/entity/npc/EntityVillagerTrader.patch +++ b/paper-server/nms-patches/net/minecraft/world/entity/npc/EntityVillagerTrader.patch @@ -1,8 +1,8 @@ --- a/net/minecraft/world/entity/npc/EntityVillagerTrader.java +++ b/net/minecraft/world/entity/npc/EntityVillagerTrader.java -@@ -46,6 +46,13 @@ +@@ -44,6 +44,13 @@ + import net.minecraft.world.level.World; import net.minecraft.world.phys.Vec3D; - import org.apache.commons.lang3.ArrayUtils; +// CraftBukkit start +import org.bukkit.Bukkit; @@ -14,7 +14,7 @@ public class EntityVillagerTrader extends EntityVillagerAbstract { private static final int NUMBER_OF_TRADE_OFFERS = 5; -@@ -55,6 +62,7 @@ +@@ -53,6 +60,7 @@ public EntityVillagerTrader(EntityTypes entitytypes, World world) { super(entitytypes, world); @@ -22,7 +22,7 @@ } @Override -@@ -140,7 +148,16 @@ +@@ -130,7 +138,16 @@ MerchantRecipe merchantrecipe = villagertrades_imerchantrecipeoption.getOffer(this, this.random); if (merchantrecipe != null) { diff --git a/paper-server/nms-patches/net/minecraft/world/entity/player/EntityHuman.patch b/paper-server/nms-patches/net/minecraft/world/entity/player/EntityHuman.patch index 893b6cb504..84c4870287 100644 --- a/paper-server/nms-patches/net/minecraft/world/entity/player/EntityHuman.patch +++ b/paper-server/nms-patches/net/minecraft/world/entity/player/EntityHuman.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/entity/player/EntityHuman.java +++ b/net/minecraft/world/entity/player/EntityHuman.java -@@ -117,6 +117,20 @@ +@@ -118,6 +118,20 @@ import net.minecraft.world.scores.ScoreboardTeamBase; import org.slf4j.Logger; @@ -21,7 +21,7 @@ public abstract class EntityHuman extends EntityLiving { private static final Logger LOGGER = LogUtils.getLogger(); -@@ -130,7 +144,8 @@ +@@ -131,7 +145,8 @@ public static final float SWIMMING_BB_HEIGHT = 0.6F; public static final float DEFAULT_EYE_HEIGHT = 1.62F; public static final EntitySize STANDING_DIMENSIONS = EntitySize.scalable(0.6F, 1.8F); @@ -31,7 +31,7 @@ private static final int FLY_ACHIEVEMENT_SPEED = 25; private static final DataWatcherObject DATA_PLAYER_ABSORPTION_ID = DataWatcher.defineId(EntityHuman.class, DataWatcherRegistry.FLOAT); private static final DataWatcherObject DATA_SCORE_ID = DataWatcher.defineId(EntityHuman.class, DataWatcherRegistry.INT); -@@ -140,10 +155,10 @@ +@@ -141,10 +156,10 @@ protected static final DataWatcherObject DATA_SHOULDER_RIGHT = DataWatcher.defineId(EntityHuman.class, DataWatcherRegistry.COMPOUND_TAG); private long timeEntitySatOnShoulder; private final PlayerInventory inventory = new PlayerInventory(this); @@ -44,7 +44,7 @@ protected int jumpTriggerTime; public float oBob; public float bob; -@@ -172,6 +187,16 @@ +@@ -173,6 +188,16 @@ public EntityFishingHook fishing; protected float hurtDir; @@ -61,7 +61,7 @@ public EntityHuman(World world, BlockPosition blockposition, float f, GameProfile gameprofile) { super(EntityTypes.PLAYER, world); this.lastItemInMainHand = ItemStack.EMPTY; -@@ -311,7 +336,7 @@ +@@ -312,7 +337,7 @@ ItemStack itemstack = this.getItemBySlot(EnumItemSlot.HEAD); if (itemstack.is(Items.TURTLE_HELMET) && !this.isEyeInFluid(TagsFluid.WATER)) { @@ -70,9 +70,9 @@ } } -@@ -477,8 +502,14 @@ +@@ -478,8 +503,14 @@ public void rideTick() { - if (!this.level.isClientSide && this.wantsToStopRiding() && this.isPassenger()) { + if (!this.level().isClientSide && this.wantsToStopRiding() && this.isPassenger()) { this.stopRiding(); - this.setShiftKeyDown(false); - } else { @@ -87,9 +87,9 @@ double d0 = this.getX(); double d1 = this.getY(); double d2 = this.getZ(); -@@ -505,7 +536,8 @@ +@@ -506,7 +537,8 @@ - if (this.level.getDifficulty() == EnumDifficulty.PEACEFUL && this.level.getGameRules().getBoolean(GameRules.RULE_NATURAL_REGENERATION)) { + if (this.level().getDifficulty() == EnumDifficulty.PEACEFUL && this.level().getGameRules().getBoolean(GameRules.RULE_NATURAL_REGENERATION)) { if (this.getHealth() < this.getMaxHealth() && this.tickCount % 20 == 0) { - this.heal(1.0F); + // CraftBukkit - added regain reason of "REGEN" for filtering purposes. @@ -97,7 +97,7 @@ } if (this.foodData.needsFood() && this.tickCount % 10 == 0) { -@@ -664,6 +696,13 @@ +@@ -665,6 +697,13 @@ @Nullable public EntityItem drop(ItemStack itemstack, boolean flag, boolean flag1) { @@ -111,7 +111,7 @@ if (itemstack.isEmpty()) { return null; } else { -@@ -698,6 +737,33 @@ +@@ -699,6 +738,33 @@ entityitem.setDeltaMovement((double) (-f3 * f2 * 0.3F) + Math.cos((double) f5) * (double) f6, (double) (-f1 * 0.3F + 0.1F + (this.random.nextFloat() - this.random.nextFloat()) * 0.1F), (double) (f4 * f2 * 0.3F) + Math.sin((double) f5) * (double) f6); } @@ -123,7 +123,7 @@ + Item drop = (Item) entityitem.getBukkitEntity(); + + PlayerDropItemEvent event = new PlayerDropItemEvent(player, drop); -+ this.level.getCraftServer().getPluginManager().callEvent(event); ++ this.level().getCraftServer().getPluginManager().callEvent(event); + + if (event.isCancelled()) { + org.bukkit.inventory.ItemStack cur = player.getInventory().getItemInHand(); @@ -145,7 +145,7 @@ return entityitem; } } -@@ -788,7 +854,7 @@ +@@ -789,7 +855,7 @@ } if (nbttagcompound.contains("LastDeathLocation", 10)) { @@ -154,7 +154,7 @@ Logger logger = EntityHuman.LOGGER; Objects.requireNonNull(logger); -@@ -821,7 +887,7 @@ +@@ -822,7 +888,7 @@ } this.getLastDeathLocation().flatMap((globalpos) -> { @@ -163,22 +163,22 @@ Logger logger = EntityHuman.LOGGER; Objects.requireNonNull(logger); -@@ -848,12 +914,12 @@ +@@ -849,12 +915,12 @@ return false; } else { - if (!this.level.isClientSide) { + if (!this.level().isClientSide) { - this.removeEntitiesOnShoulder(); + // this.removeEntitiesOnShoulder(); // CraftBukkit - moved down } if (damagesource.scalesWithDifficulty()) { - if (this.level.getDifficulty() == EnumDifficulty.PEACEFUL) { + if (this.level().getDifficulty() == EnumDifficulty.PEACEFUL) { - f = 0.0F; + return false; // CraftBukkit - f = 0.0f -> return false } - if (this.level.getDifficulty() == EnumDifficulty.EASY) { -@@ -865,7 +931,13 @@ + if (this.level().getDifficulty() == EnumDifficulty.EASY) { +@@ -866,7 +932,13 @@ } } @@ -193,7 +193,7 @@ } } } -@@ -885,10 +957,29 @@ +@@ -886,10 +958,29 @@ } public boolean canHarmPlayer(EntityHuman entityhuman) { @@ -210,8 +210,8 @@ + } + } else { + // This should never be called, but is implemented anyway -+ org.bukkit.OfflinePlayer thisPlayer = entityhuman.level.getCraftServer().getOfflinePlayer(entityhuman.getScoreboardName()); -+ team = entityhuman.level.getCraftServer().getScoreboardManager().getMainScoreboard().getPlayerTeam(thisPlayer); ++ org.bukkit.OfflinePlayer thisPlayer = entityhuman.level().getCraftServer().getOfflinePlayer(entityhuman.getScoreboardName()); ++ team = entityhuman.level().getCraftServer().getScoreboardManager().getMainScoreboard().getPlayerTeam(thisPlayer); + if (team == null || team.allowFriendlyFire()) { + return true; + } @@ -221,12 +221,12 @@ + if (this instanceof EntityPlayer) { + return !team.hasPlayer(((EntityPlayer) this).getBukkitEntity()); + } -+ return !team.hasPlayer(this.level.getCraftServer().getOfflinePlayer(this.getScoreboardName())); ++ return !team.hasPlayer(this.level().getCraftServer().getOfflinePlayer(this.getScoreboardName())); + // CraftBukkit end } @Override -@@ -930,8 +1021,13 @@ +@@ -931,8 +1022,13 @@ } } @@ -241,17 +241,17 @@ if (!this.isInvulnerableTo(damagesource)) { f = this.getDamageAfterArmorAbsorb(damagesource, f); f = this.getDamageAfterMagicAbsorb(damagesource, f); -@@ -946,7 +1042,7 @@ +@@ -947,7 +1043,7 @@ } if (f != 0.0F) { - this.causeFoodExhaustion(damagesource.getFoodExhaustion()); + this.causeFoodExhaustion(damagesource.getFoodExhaustion(), EntityExhaustionEvent.ExhaustionReason.DAMAGED); // CraftBukkit - EntityExhaustionEvent - float f3 = this.getHealth(); - - this.getCombatTracker().recordDamage(damagesource, f3, f); + this.getCombatTracker().recordDamage(damagesource, f); + this.setHealth(this.getHealth() - f); + if (f < 3.4028235E37F) { @@ -957,6 +1053,7 @@ - + this.gameEvent(GameEvent.ENTITY_DAMAGE); } } + return false; // CraftBukkit @@ -308,7 +308,7 @@ + org.bukkit.util.Vector velocity = CraftVector.toBukkit(vec3d); + + PlayerVelocityEvent event = new PlayerVelocityEvent(player, velocity.clone()); -+ level.getCraftServer().getPluginManager().callEvent(event); ++ this.level().getCraftServer().getPluginManager().callEvent(event); + + if (event.isCancelled()) { + cancelled = true; @@ -340,7 +340,7 @@ + // CraftBukkit end } - if (this.level instanceof WorldServer && f5 > 2.0F) { + if (this.level() instanceof WorldServer && f5 > 2.0F) { @@ -1256,12 +1387,17 @@ } } @@ -348,7 +348,7 @@ - this.causeFoodExhaustion(0.1F); + this.causeFoodExhaustion(0.1F, EntityExhaustionEvent.ExhaustionReason.ATTACK); // CraftBukkit - EntityExhaustionEvent } else { - this.level.playSound((EntityHuman) null, this.getX(), this.getY(), this.getZ(), SoundEffects.PLAYER_ATTACK_NODAMAGE, this.getSoundSource(), 1.0F, 1.0F); + this.level().playSound((EntityHuman) null, this.getX(), this.getY(), this.getZ(), SoundEffects.PLAYER_ATTACK_NODAMAGE, this.getSoundSource(), 1.0F, 1.0F); if (flag4) { entity.clearFire(); } @@ -373,7 +373,7 @@ this.startSleeping(blockposition); this.sleepCounter = 0; return Either.right(Unit.INSTANCE); -@@ -1422,9 +1564,9 @@ +@@ -1425,9 +1567,9 @@ super.jumpFromGround(); this.awardStat(StatisticList.JUMP); if (this.isSprinting()) { @@ -385,7 +385,7 @@ } } -@@ -1454,7 +1596,11 @@ +@@ -1457,7 +1599,11 @@ this.setDeltaMovement(vec3d2.x, d3 * 0.6D, vec3d2.z); this.resetFallDistance(); @@ -398,7 +398,7 @@ } else { super.travel(vec3d); } -@@ -1489,19 +1635,19 @@ +@@ -1492,19 +1638,19 @@ i = Math.round((float) Math.sqrt(d0 * d0 + d1 * d1 + d2 * d2) * 100.0F); if (i > 0) { this.awardStat(StatisticList.SWIM_ONE_CM, i); @@ -421,7 +421,7 @@ } } else if (this.onClimbable()) { if (d1 > 0.0D) { -@@ -1512,13 +1658,13 @@ +@@ -1515,13 +1661,13 @@ if (i > 0) { if (this.isSprinting()) { this.awardStat(StatisticList.SPRINT_ONE_CM, i); @@ -438,7 +438,7 @@ } } } else if (this.isFallFlying()) { -@@ -1584,12 +1730,24 @@ +@@ -1587,12 +1733,24 @@ } public void startFallFlying() { @@ -464,7 +464,7 @@ } @Override -@@ -1680,10 +1838,21 @@ +@@ -1706,10 +1864,21 @@ return this.experienceLevel >= 30 ? 112 + (this.experienceLevel - 30) * 9 : (this.experienceLevel >= 15 ? 37 + (this.experienceLevel - 15) * 5 : 7 + this.experienceLevel * 2); } @@ -476,7 +476,7 @@ + public void causeFoodExhaustion(float f, EntityExhaustionEvent.ExhaustionReason reason) { + // CraftBukkit end if (!this.abilities.invulnerable) { - if (!this.level.isClientSide) { + if (!this.level().isClientSide) { - this.foodData.addExhaustion(f); + // CraftBukkit start + EntityExhaustionEvent event = CraftEventFactory.callPlayerExhaustionEvent(this, reason, f); @@ -487,7 +487,7 @@ } } -@@ -1769,13 +1938,20 @@ +@@ -1795,13 +1964,20 @@ @Override public void setItemSlot(EnumItemSlot enumitemslot, ItemStack itemstack) { @@ -511,19 +511,19 @@ } } -@@ -1814,26 +1990,31 @@ +@@ -1840,26 +2016,31 @@ protected void removeEntitiesOnShoulder() { - if (this.timeEntitySatOnShoulder + 20L < this.level.getGameTime()) { + if (this.timeEntitySatOnShoulder + 20L < this.level().getGameTime()) { - this.respawnEntityOnShoulder(this.getShoulderEntityLeft()); - this.setShoulderEntityLeft(new NBTTagCompound()); - this.respawnEntityOnShoulder(this.getShoulderEntityRight()); - this.setShoulderEntityRight(new NBTTagCompound()); + // CraftBukkit start -+ if (this.spawnEntityFromShoulder(this.getShoulderEntityLeft())) { ++ if (this.respawnEntityOnShoulder(this.getShoulderEntityLeft())) { + this.setShoulderEntityLeft(new NBTTagCompound()); + } -+ if (this.spawnEntityFromShoulder(this.getShoulderEntityRight())) { ++ if (this.respawnEntityOnShoulder(this.getShoulderEntityRight())) { + this.setShoulderEntityRight(new NBTTagCompound()); + } + // CraftBukkit end @@ -532,18 +532,18 @@ } - private void respawnEntityOnShoulder(NBTTagCompound nbttagcompound) { -+ private boolean spawnEntityFromShoulder(NBTTagCompound nbttagcompound) { // CraftBukkit void->boolean - if (!this.level.isClientSide && !nbttagcompound.isEmpty()) { -- EntityTypes.create(nbttagcompound, this.level).ifPresent((entity) -> { -+ return EntityTypes.create(nbttagcompound, this.level).map((entity) -> { // CraftBukkit ++ private boolean respawnEntityOnShoulder(NBTTagCompound nbttagcompound) { // CraftBukkit void->boolean + if (!this.level().isClientSide && !nbttagcompound.isEmpty()) { +- EntityTypes.create(nbttagcompound, this.level()).ifPresent((entity) -> { ++ return EntityTypes.create(nbttagcompound, this.level()).map((entity) -> { // CraftBukkit if (entity instanceof EntityTameableAnimal) { ((EntityTameableAnimal) entity).setOwnerUUID(this.uuid); } entity.setPos(this.getX(), this.getY() + 0.699999988079071D, this.getZ()); -- ((WorldServer) this.level).addWithUUID(entity); +- ((WorldServer) this.level()).addWithUUID(entity); - }); -+ return ((WorldServer) this.level).addWithUUID(entity, CreatureSpawnEvent.SpawnReason.SHOULDER_ENTITY); // CraftBukkit ++ return ((WorldServer) this.level()).addWithUUID(entity, CreatureSpawnEvent.SpawnReason.SHOULDER_ENTITY); // CraftBukkit + }).orElse(true); // CraftBukkit } diff --git a/paper-server/nms-patches/net/minecraft/world/entity/projectile/EntityArrow.patch b/paper-server/nms-patches/net/minecraft/world/entity/projectile/EntityArrow.patch index 1f16586c3f..1f85bd4304 100644 --- a/paper-server/nms-patches/net/minecraft/world/entity/projectile/EntityArrow.patch +++ b/paper-server/nms-patches/net/minecraft/world/entity/projectile/EntityArrow.patch @@ -40,15 +40,15 @@ @@ -522,7 +534,22 @@ @Override public void playerTouch(EntityHuman entityhuman) { - if (!this.level.isClientSide && (this.inGround || this.isNoPhysics()) && this.shakeTime <= 0) { + if (!this.level().isClientSide && (this.inGround || this.isNoPhysics()) && this.shakeTime <= 0) { - if (this.tryPickup(entityhuman)) { + // CraftBukkit start + ItemStack itemstack = this.getPickupItem(); + if (this.pickup == PickupStatus.ALLOWED && !itemstack.isEmpty() && entityhuman.getInventory().canHold(itemstack) > 0) { -+ EntityItem item = new EntityItem(this.level, this.getX(), this.getY(), this.getZ(), itemstack); -+ PlayerPickupArrowEvent event = new PlayerPickupArrowEvent((org.bukkit.entity.Player) entityhuman.getBukkitEntity(), new org.bukkit.craftbukkit.entity.CraftItem(this.level.getCraftServer(), this, item), (org.bukkit.entity.AbstractArrow) this.getBukkitEntity()); ++ EntityItem item = new EntityItem(this.level(), this.getX(), this.getY(), this.getZ(), itemstack); ++ PlayerPickupArrowEvent event = new PlayerPickupArrowEvent((org.bukkit.entity.Player) entityhuman.getBukkitEntity(), new org.bukkit.craftbukkit.entity.CraftItem(this.level().getCraftServer(), this, item), (org.bukkit.entity.AbstractArrow) this.getBukkitEntity()); + // event.setCancelled(!entityhuman.canPickUpLoot); TODO -+ this.level.getCraftServer().getPluginManager().callEvent(event); ++ this.level().getCraftServer().getPluginManager().callEvent(event); + + if (event.isCancelled()) { + return; diff --git a/paper-server/nms-patches/net/minecraft/world/entity/projectile/EntityEgg.patch b/paper-server/nms-patches/net/minecraft/world/entity/projectile/EntityEgg.patch index d0ff328bb8..50babc4e37 100644 --- a/paper-server/nms-patches/net/minecraft/world/entity/projectile/EntityEgg.patch +++ b/paper-server/nms-patches/net/minecraft/world/entity/projectile/EntityEgg.patch @@ -19,7 +19,7 @@ @@ -47,22 +56,42 @@ protected void onHit(MovingObjectPosition movingobjectposition) { super.onHit(movingobjectposition); - if (!this.level.isClientSide) { + if (!this.level().isClientSide) { - if (this.random.nextInt(8) == 0) { + boolean hatching = this.random.nextInt(8) == 0; // CraftBukkit + if (true) { @@ -30,7 +30,7 @@ } - for (int i = 0; i < b0; ++i) { -- EntityChicken entitychicken = (EntityChicken) EntityTypes.CHICKEN.create(this.level); +- EntityChicken entitychicken = (EntityChicken) EntityTypes.CHICKEN.create(this.level()); + // CraftBukkit start + if (!hatching) { + b0 = 0; @@ -40,7 +40,7 @@ + Entity shooter = this.getOwner(); + if (shooter instanceof EntityPlayer) { + PlayerEggThrowEvent event = new PlayerEggThrowEvent((Player) shooter.getBukkitEntity(), (org.bukkit.entity.Egg) this.getBukkitEntity(), hatching, b0, hatchingType); -+ this.level.getCraftServer().getPluginManager().callEvent(event); ++ this.level().getCraftServer().getPluginManager().callEvent(event); + + b0 = event.getNumHatches(); + hatching = event.isHatching(); @@ -50,19 +50,19 @@ - if (entitychicken != null) { - entitychicken.setAge(-24000); - entitychicken.moveTo(this.getX(), this.getY(), this.getZ(), this.getYRot(), 0.0F); -- this.level.addFreshEntity(entitychicken); +- this.level().addFreshEntity(entitychicken); + if (hatching) { + for (int i = 0; i < b0; ++i) { -+ Entity entity = level.getWorld().createEntity(new org.bukkit.Location(level.getWorld(), this.getX(), this.getY(), this.getZ(), this.getYRot(), 0.0F), hatchingType.getEntityClass()); ++ Entity entity = this.level().getWorld().createEntity(new org.bukkit.Location(this.level().getWorld(), this.getX(), this.getY(), this.getZ(), this.getYRot(), 0.0F), hatchingType.getEntityClass()); + if (entity != null) { + if (entity.getBukkitEntity() instanceof Ageable) { + ((Ageable) entity.getBukkitEntity()).setBaby(); + } -+ level.getWorld().addEntity(entity, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.EGG); ++ this.level().getWorld().addEntity(entity, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.EGG); + } } } + // CraftBukkit end } - this.level.broadcastEntityEvent(this, (byte) 3); + this.level().broadcastEntityEvent(this, (byte) 3); diff --git a/paper-server/nms-patches/net/minecraft/world/entity/projectile/EntityEnderPearl.patch b/paper-server/nms-patches/net/minecraft/world/entity/projectile/EntityEnderPearl.patch index 9109f1b47c..6bd5ea762a 100644 --- a/paper-server/nms-patches/net/minecraft/world/entity/projectile/EntityEnderPearl.patch +++ b/paper-server/nms-patches/net/minecraft/world/entity/projectile/EntityEnderPearl.patch @@ -17,9 +17,9 @@ @@ -52,23 +59,36 @@ EntityPlayer entityplayer = (EntityPlayer) entity; - if (entityplayer.connection.isAcceptingMessages() && entityplayer.level == this.level && !entityplayer.isSleeping()) { -- if (this.random.nextFloat() < 0.05F && this.level.getGameRules().getBoolean(GameRules.RULE_DOMOBSPAWNING)) { -- EntityEndermite entityendermite = (EntityEndermite) EntityTypes.ENDERMITE.create(this.level); + if (entityplayer.connection.isAcceptingMessages() && entityplayer.level() == this.level() && !entityplayer.isSleeping()) { +- if (this.random.nextFloat() < 0.05F && this.level().getGameRules().getBoolean(GameRules.RULE_DOMOBSPAWNING)) { +- EntityEndermite entityendermite = (EntityEndermite) EntityTypes.ENDERMITE.create(this.level()); + // CraftBukkit start - Fire PlayerTeleportEvent + org.bukkit.craftbukkit.entity.CraftPlayer player = entityplayer.getBukkitEntity(); + org.bukkit.Location location = getBukkitEntity().getLocation(); @@ -30,18 +30,18 @@ + Bukkit.getPluginManager().callEvent(teleEvent); + + if (!teleEvent.isCancelled() && entityplayer.connection.isAcceptingMessages()) { -+ if (this.random.nextFloat() < 0.05F && this.level.getGameRules().getBoolean(GameRules.RULE_DOMOBSPAWNING)) { -+ EntityEndermite entityendermite = (EntityEndermite) EntityTypes.ENDERMITE.create(this.level); ++ if (this.random.nextFloat() < 0.05F && this.level().getGameRules().getBoolean(GameRules.RULE_DOMOBSPAWNING)) { ++ EntityEndermite entityendermite = (EntityEndermite) EntityTypes.ENDERMITE.create(this.level()); + + if (entityendermite != null) { + entityendermite.moveTo(entity.getX(), entity.getY(), entity.getZ(), entity.getYRot(), entity.getXRot()); -+ this.level.addFreshEntity(entityendermite, CreatureSpawnEvent.SpawnReason.ENDER_PEARL); ++ this.level().addFreshEntity(entityendermite, CreatureSpawnEvent.SpawnReason.ENDER_PEARL); + } + } - if (entityendermite != null) { - entityendermite.moveTo(entity.getX(), entity.getY(), entity.getZ(), entity.getYRot(), entity.getXRot()); -- this.level.addFreshEntity(entityendermite); +- this.level().addFreshEntity(entityendermite); + if (entity.isPassenger()) { + entity.stopRiding(); } @@ -68,8 +68,8 @@ public Entity changeDimension(WorldServer worldserver) { Entity entity = this.getOwner(); -- if (entity != null && entity.level.dimension() != worldserver.dimension()) { -+ if (entity != null && worldserver != null && entity.level.dimension() != worldserver.dimension()) { // CraftBukkit - SPIGOT-6113 +- if (entity != null && entity.level().dimension() != worldserver.dimension()) { ++ if (entity != null && worldserver != null && entity.level().dimension() != worldserver.dimension()) { // CraftBukkit - SPIGOT-6113 this.setOwner((Entity) null); } diff --git a/paper-server/nms-patches/net/minecraft/world/entity/projectile/EntityEnderSignal.patch b/paper-server/nms-patches/net/minecraft/world/entity/projectile/EntityEnderSignal.patch index b539557d13..63b12f9cc6 100644 --- a/paper-server/nms-patches/net/minecraft/world/entity/projectile/EntityEnderSignal.patch +++ b/paper-server/nms-patches/net/minecraft/world/entity/projectile/EntityEnderSignal.patch @@ -1,15 +1,15 @@ --- a/net/minecraft/world/entity/projectile/EntityEnderSignal.java +++ b/net/minecraft/world/entity/projectile/EntityEnderSignal.java -@@ -36,7 +36,7 @@ +@@ -35,7 +35,7 @@ } public void setItem(ItemStack itemstack) { - if (!itemstack.is(Items.ENDER_EYE) || itemstack.hasTag()) { + if (true || !itemstack.is(Items.ENDER_EYE) || itemstack.hasTag()) { // CraftBukkit - always allow item changing - this.getEntityData().set(EntityEnderSignal.DATA_ITEM_STACK, (ItemStack) SystemUtils.make(itemstack.copy(), (itemstack1) -> { - itemstack1.setCount(1); - })); -@@ -180,7 +180,7 @@ + this.getEntityData().set(EntityEnderSignal.DATA_ITEM_STACK, itemstack.copyWithCount(1)); + } + +@@ -177,7 +177,7 @@ public void readAdditionalSaveData(NBTTagCompound nbttagcompound) { ItemStack itemstack = ItemStack.of(nbttagcompound.getCompound("Item")); diff --git a/paper-server/nms-patches/net/minecraft/world/entity/projectile/EntityFireball.patch b/paper-server/nms-patches/net/minecraft/world/entity/projectile/EntityFireball.patch index fddbf1c4d9..5dc6376541 100644 --- a/paper-server/nms-patches/net/minecraft/world/entity/projectile/EntityFireball.patch +++ b/paper-server/nms-patches/net/minecraft/world/entity/projectile/EntityFireball.patch @@ -30,7 +30,7 @@ if (d6 != 0.0D) { @@ -75,7 +85,13 @@ - MovingObjectPosition movingobjectposition = ProjectileHelper.getHitResult(this, this::canHitEntity); + MovingObjectPosition movingobjectposition = ProjectileHelper.getHitResultOnMoveVector(this, this::canHitEntity); if (movingobjectposition.getType() != MovingObjectPosition.EnumMovingObjectType.MISS) { - this.onHit(movingobjectposition); @@ -47,7 +47,7 @@ @@ -161,6 +177,11 @@ if (entity != null) { - if (!this.level.isClientSide) { + if (!this.level().isClientSide) { + // CraftBukkit start + if (CraftEventFactory.handleNonLivingEntityDamageEvent(this, damagesource, f, false)) { + return false; diff --git a/paper-server/nms-patches/net/minecraft/world/entity/projectile/EntityFireballFireball.patch b/paper-server/nms-patches/net/minecraft/world/entity/projectile/EntityFireballFireball.patch index cd494a2b34..4c175de142 100644 --- a/paper-server/nms-patches/net/minecraft/world/entity/projectile/EntityFireballFireball.patch +++ b/paper-server/nms-patches/net/minecraft/world/entity/projectile/EntityFireballFireball.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/entity/projectile/EntityFireballFireball.java +++ b/net/minecraft/world/entity/projectile/EntityFireballFireball.java -@@ -68,6 +68,6 @@ +@@ -65,6 +65,6 @@ super.readAdditionalSaveData(nbttagcompound); ItemStack itemstack = ItemStack.of(nbttagcompound.getCompound("Item")); diff --git a/paper-server/nms-patches/net/minecraft/world/entity/projectile/EntityFireworks.patch b/paper-server/nms-patches/net/minecraft/world/entity/projectile/EntityFireworks.patch index 5b9fda7288..1fd74e3369 100644 --- a/paper-server/nms-patches/net/minecraft/world/entity/projectile/EntityFireworks.patch +++ b/paper-server/nms-patches/net/minecraft/world/entity/projectile/EntityFireworks.patch @@ -10,7 +10,7 @@ public static final DataWatcherObject DATA_ID_FIREWORKS_ITEM = DataWatcher.defineId(EntityFireworks.class, DataWatcherRegistry.ITEM_STACK); @@ -143,7 +145,7 @@ - MovingObjectPosition movingobjectposition = ProjectileHelper.getHitResult(this, this::canHitEntity); + MovingObjectPosition movingobjectposition = ProjectileHelper.getHitResultOnMoveVector(this, this::canHitEntity); if (!this.noPhysics) { - this.onHit(movingobjectposition); @@ -21,7 +21,7 @@ @@ -158,7 +160,11 @@ } - if (!this.level.isClientSide && this.life > this.lifetime) { + if (!this.level().isClientSide && this.life > this.lifetime) { - this.explode(); + // CraftBukkit start + if (!org.bukkit.craftbukkit.event.CraftEventFactory.callFireworkExplodeEvent(this).isCancelled()) { @@ -34,7 +34,7 @@ @@ -174,7 +180,11 @@ protected void onHitEntity(MovingObjectPositionEntity movingobjectpositionentity) { super.onHitEntity(movingobjectpositionentity); - if (!this.level.isClientSide) { + if (!this.level().isClientSide) { - this.explode(); + // CraftBukkit start + if (!org.bukkit.craftbukkit.event.CraftEventFactory.callFireworkExplodeEvent(this).isCancelled()) { @@ -46,8 +46,8 @@ @@ -184,7 +194,11 @@ - this.level.getBlockState(blockposition).entityInside(this.level, blockposition, this); - if (!this.level.isClientSide() && this.hasExplosion()) { + this.level().getBlockState(blockposition).entityInside(this.level(), blockposition, this); + if (!this.level().isClientSide() && this.hasExplosion()) { - this.explode(); + // CraftBukkit start + if (!org.bukkit.craftbukkit.event.CraftEventFactory.callFireworkExplodeEvent(this).isCancelled()) { diff --git a/paper-server/nms-patches/net/minecraft/world/entity/projectile/EntityFishingHook.patch b/paper-server/nms-patches/net/minecraft/world/entity/projectile/EntityFishingHook.patch index 60b7331369..93a0601030 100644 --- a/paper-server/nms-patches/net/minecraft/world/entity/projectile/EntityFishingHook.patch +++ b/paper-server/nms-patches/net/minecraft/world/entity/projectile/EntityFishingHook.patch @@ -34,7 +34,7 @@ this.syncronizedRandom = RandomSource.create(); @@ -261,7 +279,7 @@ private void checkCollision() { - MovingObjectPosition movingobjectposition = ProjectileHelper.getHitResult(this, this::canHitEntity); + MovingObjectPosition movingobjectposition = ProjectileHelper.getHitResultOnMoveVector(this, this::canHitEntity); - this.onHit(movingobjectposition); + this.preOnHit(movingobjectposition); // CraftBukkit - projectile hit event @@ -45,13 +45,13 @@ int i = 1; BlockPosition blockposition1 = blockposition.above(); -- if (this.random.nextFloat() < 0.25F && this.level.isRainingAt(blockposition1)) { -+ if (this.rainInfluenced && this.random.nextFloat() < 0.25F && this.level.isRainingAt(blockposition1)) { // CraftBukkit +- if (this.random.nextFloat() < 0.25F && this.level().isRainingAt(blockposition1)) { ++ if (this.rainInfluenced && this.random.nextFloat() < 0.25F && this.level().isRainingAt(blockposition1)) { // CraftBukkit ++i; } -- if (this.random.nextFloat() < 0.5F && !this.level.canSeeSky(blockposition1)) { -+ if (this.skyInfluenced && this.random.nextFloat() < 0.5F && !this.level.canSeeSky(blockposition1)) { // CraftBukkit +- if (this.random.nextFloat() < 0.5F && !this.level().canSeeSky(blockposition1)) { ++ if (this.skyInfluenced && this.random.nextFloat() < 0.5F && !this.level().canSeeSky(blockposition1)) { // CraftBukkit --i; } @@ -61,7 +61,7 @@ this.getEntityData().set(EntityFishingHook.DATA_BITING, false); + // CraftBukkit start + PlayerFishEvent playerFishEvent = new PlayerFishEvent((Player) this.getPlayerOwner().getBukkitEntity(), null, (FishHook) this.getBukkitEntity(), PlayerFishEvent.State.FAILED_ATTEMPT); -+ this.level.getCraftServer().getPluginManager().callEvent(playerFishEvent); ++ this.level().getCraftServer().getPluginManager().callEvent(playerFishEvent); + // CraftBukkit end } } else { @@ -72,7 +72,7 @@ } else { + // CraftBukkit start + PlayerFishEvent playerFishEvent = new PlayerFishEvent((Player) this.getPlayerOwner().getBukkitEntity(), null, (FishHook) this.getBukkitEntity(), PlayerFishEvent.State.BITE); -+ this.level.getCraftServer().getPluginManager().callEvent(playerFishEvent); ++ this.level().getCraftServer().getPluginManager().callEvent(playerFishEvent); + if (playerFishEvent.isCancelled()) { + return; + } @@ -107,7 +107,7 @@ if (this.hookedIn != null) { + // CraftBukkit start + PlayerFishEvent playerFishEvent = new PlayerFishEvent((Player) entityhuman.getBukkitEntity(), this.hookedIn.getBukkitEntity(), (FishHook) this.getBukkitEntity(), PlayerFishEvent.State.CAUGHT_ENTITY); -+ this.level.getCraftServer().getPluginManager().callEvent(playerFishEvent); ++ this.level().getCraftServer().getPluginManager().callEvent(playerFishEvent); + + if (playerFishEvent.isCancelled()) { + return 0; @@ -115,15 +115,15 @@ + // CraftBukkit end this.pullEntity(this.hookedIn); CriterionTriggers.FISHING_ROD_HOOKED.trigger((EntityPlayer) entityhuman, itemstack, this, Collections.emptyList()); - this.level.broadcastEntityEvent(this, (byte) 31); + this.level().broadcastEntityEvent(this, (byte) 31); @@ -460,6 +501,15 @@ while (iterator.hasNext()) { ItemStack itemstack1 = (ItemStack) iterator.next(); - EntityItem entityitem = new EntityItem(this.level, this.getX(), this.getY(), this.getZ(), itemstack1); + EntityItem entityitem = new EntityItem(this.level(), this.getX(), this.getY(), this.getZ(), itemstack1); + // CraftBukkit start + PlayerFishEvent playerFishEvent = new PlayerFishEvent((Player) entityhuman.getBukkitEntity(), entityitem.getBukkitEntity(), (FishHook) this.getBukkitEntity(), PlayerFishEvent.State.CAUGHT_FISH); + playerFishEvent.setExpToDrop(this.random.nextInt(6) + 1); -+ this.level.getCraftServer().getPluginManager().callEvent(playerFishEvent); ++ this.level().getCraftServer().getPluginManager().callEvent(playerFishEvent); + + if (playerFishEvent.isCancelled()) { + return 0; @@ -135,11 +135,11 @@ @@ -467,7 +517,11 @@ entityitem.setDeltaMovement(d0 * 0.1D, d1 * 0.1D + Math.sqrt(Math.sqrt(d0 * d0 + d1 * d1 + d2 * d2)) * 0.08D, d2 * 0.1D); - this.level.addFreshEntity(entityitem); -- entityhuman.level.addFreshEntity(new EntityExperienceOrb(entityhuman.level, entityhuman.getX(), entityhuman.getY() + 0.5D, entityhuman.getZ() + 0.5D, this.random.nextInt(6) + 1)); + this.level().addFreshEntity(entityitem); +- entityhuman.level().addFreshEntity(new EntityExperienceOrb(entityhuman.level(), entityhuman.getX(), entityhuman.getY() + 0.5D, entityhuman.getZ() + 0.5D, this.random.nextInt(6) + 1)); + // CraftBukkit start - this.random.nextInt(6) + 1 -> playerFishEvent.getExpToDrop() + if (playerFishEvent.getExpToDrop() > 0) { -+ entityhuman.level.addFreshEntity(new EntityExperienceOrb(entityhuman.level, entityhuman.getX(), entityhuman.getY() + 0.5D, entityhuman.getZ() + 0.5D, playerFishEvent.getExpToDrop())); ++ entityhuman.level().addFreshEntity(new EntityExperienceOrb(entityhuman.level(), entityhuman.getX(), entityhuman.getY() + 0.5D, entityhuman.getZ() + 0.5D, playerFishEvent.getExpToDrop())); + } + // CraftBukkit end if (itemstack1.is(TagsItem.FISHES)) { @@ -148,10 +148,10 @@ @@ -477,8 +531,25 @@ } - if (this.onGround) { + if (this.onGround()) { + // CraftBukkit start + PlayerFishEvent playerFishEvent = new PlayerFishEvent((Player) entityhuman.getBukkitEntity(), null, (FishHook) this.getBukkitEntity(), PlayerFishEvent.State.IN_GROUND); -+ this.level.getCraftServer().getPluginManager().callEvent(playerFishEvent); ++ this.level().getCraftServer().getPluginManager().callEvent(playerFishEvent); + + if (playerFishEvent.isCancelled()) { + return 0; @@ -162,7 +162,7 @@ + // CraftBukkit start + if (i == 0) { + PlayerFishEvent playerFishEvent = new PlayerFishEvent((Player) entityhuman.getBukkitEntity(), null, (FishHook) this.getBukkitEntity(), PlayerFishEvent.State.REEL_IN); -+ this.level.getCraftServer().getPluginManager().callEvent(playerFishEvent); ++ this.level().getCraftServer().getPluginManager().callEvent(playerFishEvent); + if (playerFishEvent.isCancelled()) { + return 0; + } diff --git a/paper-server/nms-patches/net/minecraft/world/entity/projectile/EntityLargeFireball.patch b/paper-server/nms-patches/net/minecraft/world/entity/projectile/EntityLargeFireball.patch index 7fa395e8f8..3a8815f46c 100644 --- a/paper-server/nms-patches/net/minecraft/world/entity/projectile/EntityLargeFireball.patch +++ b/paper-server/nms-patches/net/minecraft/world/entity/projectile/EntityLargeFireball.patch @@ -12,28 +12,28 @@ public EntityLargeFireball(EntityTypes entitytypes, World world) { super(entitytypes, world); -+ isIncendiary = this.level.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING); // CraftBukkit ++ isIncendiary = this.level().getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING); // CraftBukkit } public EntityLargeFireball(World world, EntityLiving entityliving, double d0, double d1, double d2, int i) { super(EntityTypes.FIREBALL, entityliving, d0, d1, d2, world); this.explosionPower = i; -+ isIncendiary = this.level.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING); // CraftBukkit ++ isIncendiary = this.level().getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING); // CraftBukkit } @Override @@ -28,7 +32,15 @@ - if (!this.level.isClientSide) { - boolean flag = this.level.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING); + if (!this.level().isClientSide) { + boolean flag = this.level().getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING); -- this.level.explode(this, this.getX(), this.getY(), this.getZ(), (float) this.explosionPower, flag, World.a.MOB); +- this.level().explode(this, this.getX(), this.getY(), this.getZ(), (float) this.explosionPower, flag, World.a.MOB); + // CraftBukkit start - fire ExplosionPrimeEvent + ExplosionPrimeEvent event = new ExplosionPrimeEvent((org.bukkit.entity.Explosive) this.getBukkitEntity()); -+ this.level.getCraftServer().getPluginManager().callEvent(event); ++ this.level().getCraftServer().getPluginManager().callEvent(event); + + if (!event.isCancelled()) { + // give 'this' instead of (Entity) null so we know what causes the damage -+ this.level.explode(this, this.getX(), this.getY(), this.getZ(), event.getRadius(), event.getFire(), World.a.MOB); ++ this.level().explode(this, this.getX(), this.getY(), this.getZ(), event.getRadius(), event.getFire(), World.a.MOB); + } + // CraftBukkit end this.discard(); diff --git a/paper-server/nms-patches/net/minecraft/world/entity/projectile/EntityLlamaSpit.patch b/paper-server/nms-patches/net/minecraft/world/entity/projectile/EntityLlamaSpit.patch index 8576fa4ef8..408aa43d97 100644 --- a/paper-server/nms-patches/net/minecraft/world/entity/projectile/EntityLlamaSpit.patch +++ b/paper-server/nms-patches/net/minecraft/world/entity/projectile/EntityLlamaSpit.patch @@ -2,7 +2,7 @@ +++ b/net/minecraft/world/entity/projectile/EntityLlamaSpit.java @@ -32,7 +32,7 @@ Vec3D vec3d = this.getDeltaMovement(); - MovingObjectPosition movingobjectposition = ProjectileHelper.getHitResult(this, this::canHitEntity); + MovingObjectPosition movingobjectposition = ProjectileHelper.getHitResultOnMoveVector(this, this::canHitEntity); - this.onHit(movingobjectposition); + this.preOnHit(movingobjectposition); // CraftBukkit - projectile hit event diff --git a/paper-server/nms-patches/net/minecraft/world/entity/projectile/EntityPotion.patch b/paper-server/nms-patches/net/minecraft/world/entity/projectile/EntityPotion.patch index ec66fe3332..678c57aeb7 100644 --- a/paper-server/nms-patches/net/minecraft/world/entity/projectile/EntityPotion.patch +++ b/paper-server/nms-patches/net/minecraft/world/entity/projectile/EntityPotion.patch @@ -29,7 +29,7 @@ @@ -148,6 +158,7 @@ private void applySplash(List list, @Nullable Entity entity) { AxisAlignedBB axisalignedbb = this.getBoundingBox().inflate(4.0D, 2.0D, 4.0D); - List list1 = this.level.getEntitiesOfClass(EntityLiving.class, axisalignedbb); + List list1 = this.level().getEntitiesOfClass(EntityLiving.class, axisalignedbb); + Map affected = new HashMap(); // CraftBukkit if (!list1.isEmpty()) { @@ -64,7 +64,7 @@ + MobEffect mobeffect = (MobEffect) iterator1.next(); + MobEffectList mobeffectlist = mobeffect.getEffect(); + // CraftBukkit start - Abide by PVP settings - for players only! -+ if (!this.level.pvpMode && this.getOwner() instanceof EntityPlayer && entityliving instanceof EntityPlayer && entityliving != this.getOwner()) { ++ if (!this.level().pvpMode && this.getOwner() instanceof EntityPlayer && entityliving instanceof EntityPlayer && entityliving != this.getOwner()) { + int i = MobEffectList.getId(mobeffectlist); + // 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) { @@ -106,11 +106,11 @@ entityareaeffectcloud.setFixedColor(nbttagcompound.getInt("CustomPotionColor")); } -- this.level.addFreshEntity(entityareaeffectcloud); +- this.level().addFreshEntity(entityareaeffectcloud); + // CraftBukkit start + org.bukkit.event.entity.LingeringPotionSplashEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callLingeringPotionSplashEvent(this, entityareaeffectcloud); + if (!(event.isCancelled() || entityareaeffectcloud.isRemoved())) { -+ this.level.addFreshEntity(entityareaeffectcloud); ++ this.level().addFreshEntity(entityareaeffectcloud); + } else { + entityareaeffectcloud.discard(); + } @@ -119,31 +119,31 @@ public boolean isLingering() { @@ -232,13 +276,25 @@ - IBlockData iblockdata = this.level.getBlockState(blockposition); + IBlockData iblockdata = this.level().getBlockState(blockposition); if (iblockdata.is(TagsBlock.FIRE)) { -- this.level.removeBlock(blockposition, false); +- this.level().removeBlock(blockposition, false); + // CraftBukkit start + if (!CraftEventFactory.callEntityChangeBlockEvent(this, blockposition, Blocks.AIR.defaultBlockState()).isCancelled()) { -+ this.level.removeBlock(blockposition, false); ++ this.level().removeBlock(blockposition, false); + } + // CraftBukkit end } else if (AbstractCandleBlock.isLit(iblockdata)) { -- AbstractCandleBlock.extinguish((EntityHuman) null, iblockdata, this.level, blockposition); +- AbstractCandleBlock.extinguish((EntityHuman) null, iblockdata, this.level(), blockposition); + // CraftBukkit start + if (!CraftEventFactory.callEntityChangeBlockEvent(this, blockposition, iblockdata.setValue(AbstractCandleBlock.LIT, false)).isCancelled()) { -+ AbstractCandleBlock.extinguish((EntityHuman) null, iblockdata, this.level, blockposition); ++ AbstractCandleBlock.extinguish((EntityHuman) null, iblockdata, this.level(), blockposition); + } + // CraftBukkit end } else if (BlockCampfire.isLitCampfire(iblockdata)) { -- this.level.levelEvent((EntityHuman) null, 1009, blockposition, 0); -- BlockCampfire.dowse(this.getOwner(), this.level, blockposition, iblockdata); -- this.level.setBlockAndUpdate(blockposition, (IBlockData) iblockdata.setValue(BlockCampfire.LIT, false)); +- this.level().levelEvent((EntityHuman) null, 1009, blockposition, 0); +- BlockCampfire.dowse(this.getOwner(), this.level(), blockposition, iblockdata); +- this.level().setBlockAndUpdate(blockposition, (IBlockData) iblockdata.setValue(BlockCampfire.LIT, false)); + // CraftBukkit start + if (!CraftEventFactory.callEntityChangeBlockEvent(this, blockposition, iblockdata.setValue(BlockCampfire.LIT, false)).isCancelled()) { -+ this.level.levelEvent((EntityHuman) null, 1009, blockposition, 0); -+ BlockCampfire.dowse(this.getOwner(), this.level, blockposition, iblockdata); -+ this.level.setBlockAndUpdate(blockposition, (IBlockData) iblockdata.setValue(BlockCampfire.LIT, false)); ++ this.level().levelEvent((EntityHuman) null, 1009, blockposition, 0); ++ BlockCampfire.dowse(this.getOwner(), this.level(), blockposition, iblockdata); ++ this.level().setBlockAndUpdate(blockposition, (IBlockData) iblockdata.setValue(BlockCampfire.LIT, false)); + } + // CraftBukkit end } diff --git a/paper-server/nms-patches/net/minecraft/world/entity/projectile/EntityProjectileThrowable.patch b/paper-server/nms-patches/net/minecraft/world/entity/projectile/EntityProjectileThrowable.patch index 2fc626827a..969c95218b 100644 --- a/paper-server/nms-patches/net/minecraft/world/entity/projectile/EntityProjectileThrowable.patch +++ b/paper-server/nms-patches/net/minecraft/world/entity/projectile/EntityProjectileThrowable.patch @@ -1,15 +1,6 @@ --- a/net/minecraft/world/entity/projectile/EntityProjectileThrowable.java +++ b/net/minecraft/world/entity/projectile/EntityProjectileThrowable.java -@@ -30,7 +30,7 @@ - public void setItem(ItemStack itemstack) { - if (!itemstack.is(this.getDefaultItem()) || itemstack.hasTag()) { - this.getEntityData().set(EntityProjectileThrowable.DATA_ITEM_STACK, (ItemStack) SystemUtils.make(itemstack.copy(), (itemstack1) -> { -- itemstack1.setCount(1); -+ if (!itemstack1.isEmpty()) itemstack1.setCount(1); // CraftBukkit - })); - } - -@@ -38,6 +38,12 @@ +@@ -35,6 +35,12 @@ protected abstract Item getDefaultItem(); diff --git a/paper-server/nms-patches/net/minecraft/world/entity/projectile/EntityShulkerBullet.patch b/paper-server/nms-patches/net/minecraft/world/entity/projectile/EntityShulkerBullet.patch index b90ff03a36..d6a8f7057a 100644 --- a/paper-server/nms-patches/net/minecraft/world/entity/projectile/EntityShulkerBullet.patch +++ b/paper-server/nms-patches/net/minecraft/world/entity/projectile/EntityShulkerBullet.patch @@ -23,7 +23,7 @@ public SoundCategory getSoundSource() { return SoundCategory.HOSTILE; @@ -225,7 +238,7 @@ - MovingObjectPosition movingobjectposition = ProjectileHelper.getHitResult(this, this::canHitEntity); + MovingObjectPosition movingobjectposition = ProjectileHelper.getHitResultOnMoveVector(this, this::canHitEntity); if (movingobjectposition.getType() != MovingObjectPosition.EnumMovingObjectType.MISS) { - this.onHit(movingobjectposition); @@ -49,6 +49,6 @@ + return false; + } + // CraftBukkit end - if (!this.level.isClientSide) { + if (!this.level().isClientSide) { this.playSound(SoundEffects.SHULKER_BULLET_HURT, 1.0F, 1.0F); - ((WorldServer) this.level).sendParticles(Particles.CRIT, this.getX(), this.getY(), this.getZ(), 15, 0.2D, 0.2D, 0.2D, 0.0D); + ((WorldServer) this.level()).sendParticles(Particles.CRIT, this.getX(), this.getY(), this.getZ(), 15, 0.2D, 0.2D, 0.2D, 0.0D); diff --git a/paper-server/nms-patches/net/minecraft/world/entity/projectile/EntitySmallFireball.patch b/paper-server/nms-patches/net/minecraft/world/entity/projectile/EntitySmallFireball.patch index 943e4464fb..d193a82795 100644 --- a/paper-server/nms-patches/net/minecraft/world/entity/projectile/EntitySmallFireball.patch +++ b/paper-server/nms-patches/net/minecraft/world/entity/projectile/EntitySmallFireball.patch @@ -15,7 +15,7 @@ super(EntityTypes.SMALL_FIREBALL, entityliving, d0, d1, d2, world); + // CraftBukkit start + if (this.getOwner() != null && this.getOwner() instanceof EntityInsentient) { -+ isIncendiary = this.level.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING); ++ isIncendiary = this.level().getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING); + } + // CraftBukkit end } @@ -28,7 +28,7 @@ - entity.setSecondsOnFire(5); + // CraftBukkit start - Entity damage by entity event + combust event + EntityCombustByEntityEvent event = new EntityCombustByEntityEvent((org.bukkit.entity.Projectile) this.getBukkitEntity(), entity.getBukkitEntity(), 5); -+ entity.level.getCraftServer().getPluginManager().callEvent(event); ++ entity.level().getCraftServer().getPluginManager().callEvent(event); + + if (!event.isCancelled()) { + entity.setSecondsOnFire(event.getDuration(), false); @@ -38,15 +38,15 @@ entity.setRemainingFireTicks(i); } else if (entity1 instanceof EntityLiving) { @@ -51,10 +65,10 @@ - if (!this.level.isClientSide) { + if (!this.level().isClientSide) { Entity entity = this.getOwner(); -- if (!(entity instanceof EntityInsentient) || this.level.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)) { +- if (!(entity instanceof EntityInsentient) || this.level().getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)) { + if (isIncendiary) { // CraftBukkit BlockPosition blockposition = movingobjectpositionblock.getBlockPos().relative(movingobjectpositionblock.getDirection()); -- if (this.level.isEmptyBlock(blockposition)) { -+ if (this.level.isEmptyBlock(blockposition) && !org.bukkit.craftbukkit.event.CraftEventFactory.callBlockIgniteEvent(level, blockposition, this).isCancelled()) { // CraftBukkit - this.level.setBlockAndUpdate(blockposition, BlockFireAbstract.getState(this.level, blockposition)); +- if (this.level().isEmptyBlock(blockposition)) { ++ if (this.level().isEmptyBlock(blockposition) && !org.bukkit.craftbukkit.event.CraftEventFactory.callBlockIgniteEvent(this.level(), blockposition, this).isCancelled()) { // CraftBukkit + this.level().setBlockAndUpdate(blockposition, BlockFireAbstract.getState(this.level(), blockposition)); } } diff --git a/paper-server/nms-patches/net/minecraft/world/entity/projectile/EntityThrownExpBottle.patch b/paper-server/nms-patches/net/minecraft/world/entity/projectile/EntityThrownExpBottle.patch index bc5ff7b9d5..bf66baf4cb 100644 --- a/paper-server/nms-patches/net/minecraft/world/entity/projectile/EntityThrownExpBottle.patch +++ b/paper-server/nms-patches/net/minecraft/world/entity/projectile/EntityThrownExpBottle.patch @@ -3,20 +3,20 @@ @@ -39,9 +39,18 @@ protected void onHit(MovingObjectPosition movingobjectposition) { super.onHit(movingobjectposition); - if (this.level instanceof WorldServer) { -- this.level.levelEvent(2002, this.blockPosition(), PotionUtil.getColor(Potions.WATER)); + if (this.level() instanceof WorldServer) { +- this.level().levelEvent(2002, this.blockPosition(), PotionUtil.getColor(Potions.WATER)); + // CraftBukkit - moved to after event -+ // this.level.levelEvent(2002, this.blockPosition(), PotionUtil.getColor(Potions.WATER)); - int i = 3 + this.level.random.nextInt(5) + this.level.random.nextInt(5); ++ // this.level().levelEvent(2002, this.blockPosition(), PotionUtil.getColor(Potions.WATER)); + int i = 3 + this.level().random.nextInt(5) + this.level().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.level.levelEvent(2002, this.blockPosition(), PotionUtil.getColor(Potions.WATER)); ++ this.level().levelEvent(2002, this.blockPosition(), PotionUtil.getColor(Potions.WATER)); + } + // CraftBukkit end + - EntityExperienceOrb.award((WorldServer) this.level, this.position(), i); + EntityExperienceOrb.award((WorldServer) this.level(), this.position(), i); this.discard(); } diff --git a/paper-server/nms-patches/net/minecraft/world/entity/projectile/EntityThrownTrident.patch b/paper-server/nms-patches/net/minecraft/world/entity/projectile/EntityThrownTrident.patch index 62ec7ee760..25c1c6f2b8 100644 --- a/paper-server/nms-patches/net/minecraft/world/entity/projectile/EntityThrownTrident.patch +++ b/paper-server/nms-patches/net/minecraft/world/entity/projectile/EntityThrownTrident.patch @@ -4,8 +4,8 @@ if (entitylightning != null) { entitylightning.moveTo(Vec3D.atBottomCenterOf(blockposition)); entitylightning.setCause(entity1 instanceof EntityPlayer ? (EntityPlayer) entity1 : null); -- this.level.addFreshEntity(entitylightning); -+ ((WorldServer) this.level).strikeLightning(entitylightning, org.bukkit.event.weather.LightningStrikeEvent.Cause.TRIDENT); // CraftBukkit +- this.level().addFreshEntity(entitylightning); ++ ((WorldServer) this.level()).strikeLightning(entitylightning, org.bukkit.event.weather.LightningStrikeEvent.Cause.TRIDENT); // CraftBukkit soundeffect = SoundEffects.TRIDENT_THUNDER; f1 = 5.0F; } diff --git a/paper-server/nms-patches/net/minecraft/world/entity/projectile/EntityWitherSkull.patch b/paper-server/nms-patches/net/minecraft/world/entity/projectile/EntityWitherSkull.patch index ff7357bc3e..3404a648c0 100644 --- a/paper-server/nms-patches/net/minecraft/world/entity/projectile/EntityWitherSkull.patch +++ b/paper-server/nms-patches/net/minecraft/world/entity/projectile/EntityWitherSkull.patch @@ -30,15 +30,15 @@ @@ -92,7 +94,15 @@ protected void onHit(MovingObjectPosition movingobjectposition) { super.onHit(movingobjectposition); - if (!this.level.isClientSide) { -- this.level.explode(this, this.getX(), this.getY(), this.getZ(), 1.0F, false, World.a.MOB); + if (!this.level().isClientSide) { +- this.level().explode(this, this.getX(), this.getY(), this.getZ(), 1.0F, false, World.a.MOB); + // CraftBukkit start -+ // this.level.explode(this, this.getX(), this.getY(), this.getZ(), 1.0F, false, World.a.MOB); ++ // this.level().explode(this, this.getX(), this.getY(), this.getZ(), 1.0F, false, World.a.MOB); + ExplosionPrimeEvent event = new ExplosionPrimeEvent(this.getBukkitEntity(), 1.0F, false); -+ this.level.getCraftServer().getPluginManager().callEvent(event); ++ this.level().getCraftServer().getPluginManager().callEvent(event); + + if (!event.isCancelled()) { -+ this.level.explode(this, this.getX(), this.getY(), this.getZ(), event.getRadius(), event.getFire(), World.a.MOB); ++ this.level().explode(this, this.getX(), this.getY(), this.getZ(), event.getRadius(), event.getFire(), World.a.MOB); + } + // CraftBukkit end this.discard(); diff --git a/paper-server/nms-patches/net/minecraft/world/entity/projectile/IProjectile.patch b/paper-server/nms-patches/net/minecraft/world/entity/projectile/IProjectile.patch index 4372f58d51..dd61f54d72 100644 --- a/paper-server/nms-patches/net/minecraft/world/entity/projectile/IProjectile.patch +++ b/paper-server/nms-patches/net/minecraft/world/entity/projectile/IProjectile.patch @@ -30,8 +30,8 @@ } -@@ -146,6 +155,16 @@ - this.setDeltaMovement(this.getDeltaMovement().add(vec3d.x, entity.isOnGround() ? 0.0D : vec3d.y, vec3d.z)); +@@ -147,6 +156,16 @@ + this.setDeltaMovement(this.getDeltaMovement().add(vec3d.x, entity.onGround() ? 0.0D : vec3d.y, vec3d.z)); } + // CraftBukkit start - call projectile hit event @@ -47,7 +47,7 @@ protected void onHit(MovingObjectPosition movingobjectposition) { MovingObjectPosition.EnumMovingObjectType movingobjectposition_enummovingobjecttype = movingobjectposition.getType(); -@@ -166,6 +185,11 @@ +@@ -167,6 +186,11 @@ protected void onHitEntity(MovingObjectPositionEntity movingobjectpositionentity) {} protected void onHitBlock(MovingObjectPositionBlock movingobjectpositionblock) { @@ -56,6 +56,6 @@ + return; + } + // CraftBukkit end - IBlockData iblockdata = this.level.getBlockState(movingobjectpositionblock.getBlockPos()); + IBlockData iblockdata = this.level().getBlockState(movingobjectpositionblock.getBlockPos()); - iblockdata.onProjectileHit(this.level, iblockdata, movingobjectpositionblock, this); + iblockdata.onProjectileHit(this.level(), iblockdata, movingobjectpositionblock, this); diff --git a/paper-server/nms-patches/net/minecraft/world/entity/raid/EntityRaider.patch b/paper-server/nms-patches/net/minecraft/world/entity/raid/EntityRaider.patch index c725271cd9..a54568be33 100644 --- a/paper-server/nms-patches/net/minecraft/world/entity/raid/EntityRaider.patch +++ b/paper-server/nms-patches/net/minecraft/world/entity/raid/EntityRaider.patch @@ -3,7 +3,7 @@ @@ -165,7 +165,7 @@ MobEffect mobeffect1 = new MobEffect(MobEffects.BAD_OMEN, 120000, i, false, false, true); - if (!this.level.getGameRules().getBoolean(GameRules.RULE_DISABLE_RAIDS)) { + if (!this.level().getGameRules().getBoolean(GameRules.RULE_DISABLE_RAIDS)) { - entityhuman.addEffect(mobeffect1); + entityhuman.addEffect(mobeffect1, org.bukkit.event.entity.EntityPotionEffectEvent.Cause.PATROL_CAPTAIN); // CraftBukkit } diff --git a/paper-server/nms-patches/net/minecraft/world/entity/vehicle/ChestBoat.patch b/paper-server/nms-patches/net/minecraft/world/entity/vehicle/ChestBoat.patch index 421724dd3e..9e6fc3c7b3 100644 --- a/paper-server/nms-patches/net/minecraft/world/entity/vehicle/ChestBoat.patch +++ b/paper-server/nms-patches/net/minecraft/world/entity/vehicle/ChestBoat.patch @@ -16,7 +16,7 @@ @@ -237,4 +244,51 @@ public void stopOpen(EntityHuman entityhuman) { - this.level.gameEvent(GameEvent.CONTAINER_CLOSE, this.position(), GameEvent.a.of((Entity) entityhuman)); + this.level().gameEvent(GameEvent.CONTAINER_CLOSE, this.position(), GameEvent.a.of((Entity) entityhuman)); } + + // CraftBukkit start diff --git a/paper-server/nms-patches/net/minecraft/world/entity/vehicle/EntityBoat.patch b/paper-server/nms-patches/net/minecraft/world/entity/vehicle/EntityBoat.patch index aa8ab69119..06995eb691 100644 --- a/paper-server/nms-patches/net/minecraft/world/entity/vehicle/EntityBoat.patch +++ b/paper-server/nms-patches/net/minecraft/world/entity/vehicle/EntityBoat.patch @@ -35,13 +35,13 @@ @@ -162,6 +180,19 @@ if (this.isInvulnerableTo(damagesource)) { return false; - } else if (!this.level.isClientSide && !this.isRemoved()) { + } else if (!this.level().isClientSide && !this.isRemoved()) { + // 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.level.getCraftServer().getPluginManager().callEvent(event); ++ this.level().getCraftServer().getPluginManager().callEvent(event); + + if (event.isCancelled()) { + return false; @@ -58,14 +58,14 @@ if (flag || this.getDamage() > 40.0F) { + // CraftBukkit start + VehicleDestroyEvent destroyEvent = new VehicleDestroyEvent(vehicle, attacker); -+ this.level.getCraftServer().getPluginManager().callEvent(destroyEvent); ++ this.level().getCraftServer().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 (!flag && this.level.getGameRules().getBoolean(GameRules.RULE_DOENTITYDROPS)) { + if (!flag && this.level().getGameRules().getBoolean(GameRules.RULE_DOENTITYDROPS)) { this.destroy(damagesource); } @@ -209,9 +249,29 @@ @@ -75,7 +75,7 @@ + // CraftBukkit start + if (!this.isPassengerOfSameVehicle(entity)) { + VehicleEntityCollisionEvent event = new VehicleEntityCollisionEvent((Vehicle) this.getBukkitEntity(), entity.getBukkitEntity()); -+ this.level.getCraftServer().getPluginManager().callEvent(event); ++ this.level().getCraftServer().getPluginManager().callEvent(event); + + if (event.isCancelled()) { + return; @@ -88,7 +88,7 @@ + // CraftBukkit start + if (!this.isPassengerOfSameVehicle(entity)) { + VehicleEntityCollisionEvent event = new VehicleEntityCollisionEvent((Vehicle) this.getBukkitEntity(), entity.getBukkitEntity()); -+ this.level.getCraftServer().getPluginManager().callEvent(event); ++ this.level().getCraftServer().getPluginManager().callEvent(event); + + if (event.isCancelled()) { + return; @@ -111,8 +111,8 @@ } + // CraftBukkit start -+ org.bukkit.Server server = this.level.getCraftServer(); -+ org.bukkit.World bworld = this.level.getWorld(); ++ org.bukkit.Server server = this.level().getCraftServer(); ++ org.bukkit.World bworld = this.level().getWorld(); + + Location to = CraftLocation.toBukkit(this.position(), bworld, this.getYRot(), this.getXRot()); + Vehicle vehicle = (Vehicle) this.getBukkitEntity(); @@ -132,14 +132,14 @@ @@ -830,6 +907,11 @@ this.causeFallDamage(this.fallDistance, 1.0F, this.damageSources().fall()); - if (!this.level.isClientSide && !this.isRemoved()) { + if (!this.level().isClientSide && !this.isRemoved()) { + // CraftBukkit start + Vehicle vehicle = (Vehicle) this.getBukkitEntity(); + VehicleDestroyEvent destroyEvent = new VehicleDestroyEvent(vehicle, null); -+ this.level.getCraftServer().getPluginManager().callEvent(destroyEvent); ++ this.level().getCraftServer().getPluginManager().callEvent(destroyEvent); + if (!destroyEvent.isCancelled()) { this.kill(); - if (this.level.getGameRules().getBoolean(GameRules.RULE_DOENTITYDROPS)) { + if (this.level().getGameRules().getBoolean(GameRules.RULE_DOENTITYDROPS)) { int i; @@ -843,6 +925,7 @@ } diff --git a/paper-server/nms-patches/net/minecraft/world/entity/vehicle/EntityMinecartAbstract.patch b/paper-server/nms-patches/net/minecraft/world/entity/vehicle/EntityMinecartAbstract.patch index 4289dcd118..da6cba53a2 100644 --- a/paper-server/nms-patches/net/minecraft/world/entity/vehicle/EntityMinecartAbstract.patch +++ b/paper-server/nms-patches/net/minecraft/world/entity/vehicle/EntityMinecartAbstract.patch @@ -17,7 +17,7 @@ public abstract class EntityMinecartAbstract extends Entity { private static final DataWatcherObject DATA_ID_HURT = DataWatcher.defineId(EntityMinecartAbstract.class, DataWatcherRegistry.INT); -@@ -89,6 +99,17 @@ +@@ -90,6 +100,17 @@ private double lyd; private double lzd; @@ -35,7 +35,7 @@ protected EntityMinecartAbstract(EntityTypes entitytypes, World world) { super(entitytypes, world); this.blocksBuilding = true; -@@ -215,6 +236,19 @@ +@@ -216,6 +237,19 @@ if (this.isInvulnerableTo(damagesource)) { return false; } else { @@ -44,7 +44,7 @@ + org.bukkit.entity.Entity passenger = (damagesource.getEntity() == null) ? null : damagesource.getEntity().getBukkitEntity(); + + VehicleDamageEvent event = new VehicleDamageEvent(vehicle, passenger, f); -+ this.level.getCraftServer().getPluginManager().callEvent(event); ++ this.level().getCraftServer().getPluginManager().callEvent(event); + + if (event.isCancelled()) { + return false; @@ -55,13 +55,13 @@ this.setHurtDir(-this.getHurtDir()); this.setHurtTime(10); this.markHurt(); -@@ -223,6 +257,15 @@ +@@ -224,6 +258,15 @@ boolean flag = damagesource.getEntity() instanceof EntityHuman && ((EntityHuman) damagesource.getEntity()).getAbilities().instabuild; if (flag || this.getDamage() > 40.0F) { + // CraftBukkit start + VehicleDestroyEvent destroyEvent = new VehicleDestroyEvent(vehicle, passenger); -+ this.level.getCraftServer().getPluginManager().callEvent(destroyEvent); ++ this.level().getCraftServer().getPluginManager().callEvent(destroyEvent); + + if (destroyEvent.isCancelled()) { + this.setDamage(40); // Maximize damage so this doesn't get triggered again right away @@ -71,7 +71,7 @@ this.ejectPassengers(); if (flag && !this.hasCustomName()) { this.discard(); -@@ -284,6 +327,14 @@ +@@ -285,6 +328,14 @@ @Override public void tick() { @@ -86,41 +86,41 @@ if (this.getHurtTime() > 0) { this.setHurtTime(this.getHurtTime() - 1); } -@@ -293,7 +344,7 @@ +@@ -294,7 +345,7 @@ } - this.checkOutOfWorld(); + this.checkBelowWorld(); - this.handleNetherPortal(); + // this.handleNetherPortal(); // CraftBukkit - handled in postTick double d0; - if (this.level.isClientSide) { -@@ -359,6 +410,18 @@ + if (this.level().isClientSide) { +@@ -361,6 +412,18 @@ } this.setRot(this.getYRot(), this.getXRot()); + // CraftBukkit start -+ org.bukkit.World bworld = this.level.getWorld(); ++ org.bukkit.World bworld = this.level().getWorld(); + Location from = new Location(bworld, prevX, prevY, prevZ, prevYaw, prevPitch); + Location to = CraftLocation.toBukkit(this.position(), bworld, this.getYRot(), this.getXRot()); + Vehicle vehicle = (Vehicle) this.getBukkitEntity(); + -+ this.level.getCraftServer().getPluginManager().callEvent(new org.bukkit.event.vehicle.VehicleUpdateEvent(vehicle)); ++ this.level().getCraftServer().getPluginManager().callEvent(new org.bukkit.event.vehicle.VehicleUpdateEvent(vehicle)); + + if (!from.equals(to)) { -+ this.level.getCraftServer().getPluginManager().callEvent(new org.bukkit.event.vehicle.VehicleMoveEvent(vehicle, from, to)); ++ this.level().getCraftServer().getPluginManager().callEvent(new org.bukkit.event.vehicle.VehicleMoveEvent(vehicle, from, to)); + } + // CraftBukkit end if (this.getMinecartType() == EntityMinecartAbstract.EnumMinecartType.RIDEABLE && this.getDeltaMovement().horizontalDistanceSqr() > 0.01D) { - List list = this.level.getEntities((Entity) this, this.getBoundingBox().inflate(0.20000000298023224D, 0.0D, 0.20000000298023224D), IEntitySelector.pushableBy(this)); + List list = this.level().getEntities((Entity) this, this.getBoundingBox().inflate(0.20000000298023224D, 0.0D, 0.20000000298023224D), IEntitySelector.pushableBy(this)); -@@ -367,8 +430,26 @@ +@@ -369,8 +432,26 @@ Entity entity = (Entity) list.get(l); if (!(entity instanceof EntityHuman) && !(entity instanceof EntityIronGolem) && !(entity instanceof EntityMinecartAbstract) && !this.isVehicle() && !entity.isPassenger()) { + // CraftBukkit start + VehicleEntityCollisionEvent collisionEvent = new VehicleEntityCollisionEvent(vehicle, entity.getBukkitEntity()); -+ this.level.getCraftServer().getPluginManager().callEvent(collisionEvent); ++ this.level().getCraftServer().getPluginManager().callEvent(collisionEvent); + + if (collisionEvent.isCancelled()) { + continue; @@ -131,7 +131,7 @@ + // CraftBukkit start + if (!this.isPassengerOfSameVehicle(entity)) { + VehicleEntityCollisionEvent collisionEvent = new VehicleEntityCollisionEvent(vehicle, entity.getBukkitEntity()); -+ this.level.getCraftServer().getPluginManager().callEvent(collisionEvent); ++ this.level().getCraftServer().getPluginManager().callEvent(collisionEvent); + + if (collisionEvent.isCancelled()) { + continue; @@ -141,13 +141,13 @@ entity.push(this); } } -@@ -380,6 +461,14 @@ +@@ -382,6 +463,14 @@ Entity entity1 = (Entity) iterator.next(); if (!this.hasPassenger(entity1) && entity1.isPushable() && entity1 instanceof EntityMinecartAbstract) { + // CraftBukkit start + VehicleEntityCollisionEvent collisionEvent = new VehicleEntityCollisionEvent(vehicle, entity1.getBukkitEntity()); -+ this.level.getCraftServer().getPluginManager().callEvent(collisionEvent); ++ this.level().getCraftServer().getPluginManager().callEvent(collisionEvent); + + if (collisionEvent.isCancelled()) { + continue; @@ -156,7 +156,7 @@ entity1.push(this); } } -@@ -396,7 +485,7 @@ +@@ -398,7 +487,7 @@ } protected double getMaxSpeed() { @@ -165,10 +165,10 @@ } public void activateMinecart(int i, int j, int k, boolean flag) {} -@@ -407,12 +496,16 @@ +@@ -409,12 +498,16 @@ this.setDeltaMovement(MathHelper.clamp(vec3d.x, -d0, d0), vec3d.y, MathHelper.clamp(vec3d.z, -d0, d0)); - if (this.onGround) { + if (this.onGround()) { - this.setDeltaMovement(this.getDeltaMovement().scale(0.5D)); + // CraftBukkit start - replace magic numbers with our variables + this.setDeltaMovement(new Vec3D(this.getDeltaMovement().x * this.derailedX, this.getDeltaMovement().y * this.derailedY, this.getDeltaMovement().z * this.derailedZ)); @@ -176,7 +176,7 @@ } this.move(EnumMoveType.SELF, this.getDeltaMovement()); - if (!this.onGround) { + if (!this.onGround()) { - this.setDeltaMovement(this.getDeltaMovement().scale(0.95D)); + // CraftBukkit start - replace magic numbers with our variables + this.setDeltaMovement(new Vec3D(this.getDeltaMovement().x * this.flyingX, this.getDeltaMovement().y * this.flyingY, this.getDeltaMovement().z * this.flyingZ)); @@ -184,7 +184,7 @@ } } -@@ -603,7 +696,7 @@ +@@ -610,7 +703,7 @@ } protected void applyNaturalSlowdown() { @@ -193,13 +193,13 @@ Vec3D vec3d = this.getDeltaMovement(); vec3d = vec3d.multiply(d0, 0.0D, d0); -@@ -742,6 +835,14 @@ - if (!this.level.isClientSide) { +@@ -749,6 +842,14 @@ + if (!this.level().isClientSide) { if (!entity.noPhysics && !this.noPhysics) { if (!this.hasPassenger(entity)) { + // CraftBukkit start + VehicleEntityCollisionEvent collisionEvent = new VehicleEntityCollisionEvent((Vehicle) this.getBukkitEntity(), entity.getBukkitEntity()); -+ this.level.getCraftServer().getPluginManager().callEvent(collisionEvent); ++ this.level().getCraftServer().getPluginManager().callEvent(collisionEvent); + + if (collisionEvent.isCancelled()) { + return; @@ -208,7 +208,7 @@ double d0 = entity.getX() - this.getX(); double d1 = entity.getZ() - this.getZ(); double d2 = d0 * d0 + d1 * d1; -@@ -916,4 +1017,26 @@ +@@ -923,4 +1024,26 @@ private EnumMinecartType() {} } diff --git a/paper-server/nms-patches/net/minecraft/world/entity/vehicle/EntityMinecartCommandBlock.patch b/paper-server/nms-patches/net/minecraft/world/entity/vehicle/EntityMinecartCommandBlock.patch index 8aa3eba616..fc124c7edf 100644 --- a/paper-server/nms-patches/net/minecraft/world/entity/vehicle/EntityMinecartCommandBlock.patch +++ b/paper-server/nms-patches/net/minecraft/world/entity/vehicle/EntityMinecartCommandBlock.patch @@ -1,8 +1,8 @@ --- a/net/minecraft/world/entity/vehicle/EntityMinecartCommandBlock.java +++ b/net/minecraft/world/entity/vehicle/EntityMinecartCommandBlock.java -@@ -138,5 +138,12 @@ - public CommandListenerWrapper createCommandSourceStack() { - return new CommandListenerWrapper(this, EntityMinecartCommandBlock.this.position(), EntityMinecartCommandBlock.this.getRotationVector(), this.getLevel(), 2, this.getName().getString(), EntityMinecartCommandBlock.this.getDisplayName(), this.getLevel().getServer(), EntityMinecartCommandBlock.this); +@@ -143,5 +143,12 @@ + public boolean isValid() { + return !EntityMinecartCommandBlock.this.isRemoved(); } + + // CraftBukkit start diff --git a/paper-server/nms-patches/net/minecraft/world/entity/vehicle/EntityMinecartTNT.patch b/paper-server/nms-patches/net/minecraft/world/entity/vehicle/EntityMinecartTNT.patch index dc5e82ae5b..9e12da637f 100644 --- a/paper-server/nms-patches/net/minecraft/world/entity/vehicle/EntityMinecartTNT.patch +++ b/paper-server/nms-patches/net/minecraft/world/entity/vehicle/EntityMinecartTNT.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/entity/vehicle/EntityMinecartTNT.java +++ b/net/minecraft/world/entity/vehicle/EntityMinecartTNT.java -@@ -23,10 +23,14 @@ +@@ -23,6 +23,10 @@ import net.minecraft.world.level.block.state.IBlockData; import net.minecraft.world.level.material.Fluid; @@ -11,33 +11,19 @@ public class EntityMinecartTNT extends EntityMinecartAbstract { private static final byte EVENT_PRIME = 10; -- private int fuse = -1; -+ public int fuse = -1; - - public EntityMinecartTNT(EntityTypes entitytypes, World world) { - super(entitytypes, world); -@@ -103,7 +107,7 @@ - return Items.TNT_MINECART; - } - -- protected void explode(double d0) { -+ public void explode(double d0) { - this.explode((DamageSource) null, d0); - } - @@ -115,7 +119,15 @@ d1 = 5.0D; } -- this.level.explode(this, damagesource, (ExplosionDamageCalculator) null, this.getX(), this.getY(), this.getZ(), (float) (4.0D + this.random.nextDouble() * 1.5D * d1), false, World.a.TNT); +- this.level().explode(this, damagesource, (ExplosionDamageCalculator) null, this.getX(), this.getY(), this.getZ(), (float) (4.0D + this.random.nextDouble() * 1.5D * d1), false, World.a.TNT); + // CraftBukkit start + ExplosionPrimeEvent event = new ExplosionPrimeEvent(this.getBukkitEntity(), (float) (4.0D + this.random.nextDouble() * 1.5D * d1), false); -+ this.level.getCraftServer().getPluginManager().callEvent(event); ++ this.level().getCraftServer().getPluginManager().callEvent(event); + if (event.isCancelled()) { + fuse = -1; + return; + } -+ this.level.explode(this, damagesource, (ExplosionDamageCalculator) null, this.getX(), this.getY(), this.getZ(), event.getRadius(), event.getFire(), World.a.TNT); ++ this.level().explode(this, damagesource, (ExplosionDamageCalculator) null, this.getX(), this.getY(), this.getZ(), event.getRadius(), event.getFire(), World.a.TNT); + // CraftBukkit end this.discard(); } diff --git a/paper-server/nms-patches/net/minecraft/world/flag/FeatureFlag.patch b/paper-server/nms-patches/net/minecraft/world/flag/FeatureFlag.patch deleted file mode 100644 index afcc4f6a6a..0000000000 --- a/paper-server/nms-patches/net/minecraft/world/flag/FeatureFlag.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- a/net/minecraft/world/flag/FeatureFlag.java -+++ b/net/minecraft/world/flag/FeatureFlag.java -@@ -2,7 +2,7 @@ - - public class FeatureFlag { - -- final FeatureFlagUniverse universe; -+ public final FeatureFlagUniverse universe; // PAIL public - final long mask; - - FeatureFlag(FeatureFlagUniverse featureflaguniverse, int i) { diff --git a/paper-server/nms-patches/net/minecraft/world/flag/FeatureFlagRegistry.patch b/paper-server/nms-patches/net/minecraft/world/flag/FeatureFlagRegistry.patch deleted file mode 100644 index 2e179d81fb..0000000000 --- a/paper-server/nms-patches/net/minecraft/world/flag/FeatureFlagRegistry.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- a/net/minecraft/world/flag/FeatureFlagRegistry.java -+++ b/net/minecraft/world/flag/FeatureFlagRegistry.java -@@ -20,7 +20,7 @@ - - private static final Logger LOGGER = LogUtils.getLogger(); - private final FeatureFlagUniverse universe; -- private final Map names; -+ public final Map names; // PAIL public - private final FeatureFlagSet allFlags; - - FeatureFlagRegistry(FeatureFlagUniverse featureflaguniverse, FeatureFlagSet featureflagset, Map map) { diff --git a/paper-server/nms-patches/net/minecraft/world/inventory/Container.patch b/paper-server/nms-patches/net/minecraft/world/inventory/Container.patch index 408681934c..2e1cc660a1 100644 --- a/paper-server/nms-patches/net/minecraft/world/inventory/Container.patch +++ b/paper-server/nms-patches/net/minecraft/world/inventory/Container.patch @@ -74,7 +74,7 @@ k = ((Slot) this.quickcraftSlots.iterator().next()).index; this.resetQuickCraft(); this.doClick(k, this.quickcraftType, InventoryClickType.PICKUP, entityhuman); -@@ -391,6 +435,7 @@ +@@ -396,6 +440,7 @@ l = this.getCarried().getCount(); Iterator iterator = this.quickcraftSlots.iterator(); @@ -82,13 +82,13 @@ while (iterator.hasNext()) { Slot slot1 = (Slot) iterator.next(); ItemStack itemstack2 = this.getCarried(); -@@ -407,12 +452,48 @@ - } +@@ -406,12 +451,48 @@ + int l1 = Math.min(getQuickCraftPlaceCount(this.quickcraftSlots, this.quickcraftType, itemstack1) + j1, k1); - l -= itemstack3.getCount() - j1; -- slot1.setByPlayer(itemstack3); -+ // slot1.setByPlayer(itemstack3); -+ draggedSlots.put(slot1.index, itemstack3); // CraftBukkit - Put in map instead of setting + l -= l1 - j1; +- slot1.setByPlayer(itemstack1.copyWithCount(l1)); ++ // slot1.setByPlayer(itemstack1.copyWithCount(l1)); ++ draggedSlots.put(slot1.index, itemstack1.copyWithCount(l1)); // CraftBukkit - Put in map instead of setting } } @@ -108,7 +108,7 @@ + this.setCarried(CraftItemStack.asNMSCopy(newcursor)); + + InventoryDragEvent event = new InventoryDragEvent(view, (newcursor.getType() != org.bukkit.Material.AIR ? newcursor : null), CraftItemStack.asBukkitCopy(oldCursor), this.quickcraftType == 1, eventmap); -+ entityhuman.level.getCraftServer().getPluginManager().callEvent(event); ++ entityhuman.level().getCraftServer().getPluginManager().callEvent(event); + + // Whether or not a change was made to the inventory that requires an update. + boolean needsUpdate = event.getResult() != Result.DEFAULT; @@ -134,7 +134,7 @@ } this.resetQuickCraft(); -@@ -430,8 +511,11 @@ +@@ -429,8 +510,11 @@ if (i == -999) { if (!this.getCarried().isEmpty()) { if (clickaction == ClickAction.PRIMARY) { @@ -147,7 +147,7 @@ } else { entityhuman.drop(this.getCarried().split(1), true); } -@@ -494,6 +578,15 @@ +@@ -493,6 +577,15 @@ } slot.setChanged(); @@ -163,7 +163,7 @@ } } else { Slot slot2; -@@ -607,13 +700,14 @@ +@@ -605,13 +698,14 @@ ItemStack itemstack = this.getCarried(); if (!itemstack.isEmpty()) { @@ -179,7 +179,7 @@ } } -@@ -827,6 +921,11 @@ +@@ -830,6 +924,11 @@ } public ItemStack getCarried() { diff --git a/paper-server/nms-patches/net/minecraft/world/inventory/ContainerAnvil.patch b/paper-server/nms-patches/net/minecraft/world/inventory/ContainerAnvil.patch index b72f4f314c..6565787448 100644 --- a/paper-server/nms-patches/net/minecraft/world/inventory/ContainerAnvil.patch +++ b/paper-server/nms-patches/net/minecraft/world/inventory/ContainerAnvil.patch @@ -1,7 +1,7 @@ --- a/net/minecraft/world/inventory/ContainerAnvil.java +++ b/net/minecraft/world/inventory/ContainerAnvil.java -@@ -17,6 +17,10 @@ - import org.apache.commons.lang3.StringUtils; +@@ -19,6 +19,10 @@ + import net.minecraft.world.level.block.state.IBlockData; import org.slf4j.Logger; +// CraftBukkit start @@ -11,7 +11,7 @@ public class ContainerAnvil extends ContainerAnvilAbstract { public static final int INPUT_SLOT = 0; -@@ -39,6 +43,11 @@ +@@ -42,6 +46,11 @@ private static final int ADDITIONAL_SLOT_X_PLACEMENT = 76; private static final int RESULT_SLOT_X_PLACEMENT = 134; private static final int SLOT_Y_PLACEMENT = 47; @@ -23,7 +23,7 @@ public ContainerAnvil(int i, PlayerInventory playerinventory) { this(i, playerinventory, ContainerAccess.NULL); -@@ -66,7 +75,7 @@ +@@ -69,7 +78,7 @@ @Override protected boolean mayPickup(EntityHuman entityhuman, boolean flag) { @@ -32,7 +32,7 @@ } @Override -@@ -89,7 +98,7 @@ +@@ -92,7 +101,7 @@ this.inputSlots.setItem(1, ItemStack.EMPTY); } @@ -41,7 +41,7 @@ this.access.execute((world, blockposition) -> { IBlockData iblockdata = world.getBlockState(blockposition); -@@ -120,8 +129,8 @@ +@@ -123,8 +132,8 @@ byte b1 = 0; if (itemstack.isEmpty()) { @@ -52,7 +52,7 @@ } else { ItemStack itemstack1 = itemstack.copy(); ItemStack itemstack2 = this.inputSlots.getItem(1); -@@ -138,8 +147,8 @@ +@@ -141,8 +150,8 @@ if (itemstack1.isDamageableItem() && itemstack1.getItem().isValidRepairItem(itemstack, itemstack2)) { k = Math.min(itemstack1.getDamageValue(), itemstack1.getMaxDamage() / 4); if (k <= 0) { @@ -63,7 +63,7 @@ return; } -@@ -153,8 +162,8 @@ +@@ -156,8 +165,8 @@ this.repairItemCountCost = i1; } else { if (!flag && (!itemstack1.is(itemstack2.getItem()) || !itemstack1.isDamageableItem())) { @@ -74,7 +74,7 @@ return; } -@@ -243,8 +252,8 @@ +@@ -246,8 +255,8 @@ } if (flag2 && !flag1) { @@ -85,7 +85,7 @@ return; } } -@@ -267,11 +276,11 @@ +@@ -270,11 +279,11 @@ itemstack1 = ItemStack.EMPTY; } @@ -100,7 +100,7 @@ itemstack1 = ItemStack.EMPTY; } -@@ -290,7 +299,8 @@ +@@ -293,7 +302,8 @@ EnchantmentManager.setEnchantments(map, itemstack1); } @@ -110,7 +110,7 @@ this.broadcastChanges(); } } -@@ -317,4 +327,18 @@ +@@ -334,4 +344,18 @@ public int getCost() { return this.cost.get(); } diff --git a/paper-server/nms-patches/net/minecraft/world/inventory/ContainerEnchantTable.patch b/paper-server/nms-patches/net/minecraft/world/inventory/ContainerEnchantTable.patch index 50e280e266..23fdf432cc 100644 --- a/paper-server/nms-patches/net/minecraft/world/inventory/ContainerEnchantTable.patch +++ b/paper-server/nms-patches/net/minecraft/world/inventory/ContainerEnchantTable.patch @@ -180,7 +180,7 @@ return stillValid(this.access, entityhuman, Blocks.ENCHANTING_TABLE); } -@@ -305,4 +398,17 @@ +@@ -304,4 +397,17 @@ return itemstack; } diff --git a/paper-server/nms-patches/net/minecraft/world/inventory/ContainerGrindstone.patch b/paper-server/nms-patches/net/minecraft/world/inventory/ContainerGrindstone.patch index fb24941282..7569ed90a7 100644 --- a/paper-server/nms-patches/net/minecraft/world/inventory/ContainerGrindstone.patch +++ b/paper-server/nms-patches/net/minecraft/world/inventory/ContainerGrindstone.patch @@ -96,7 +96,7 @@ this.broadcastChanges(); } -@@ -251,6 +281,7 @@ +@@ -250,6 +280,7 @@ @Override public boolean stillValid(EntityHuman entityhuman) { diff --git a/paper-server/nms-patches/net/minecraft/world/inventory/ContainerLoom.patch b/paper-server/nms-patches/net/minecraft/world/inventory/ContainerLoom.patch index a37cd50724..858325140c 100644 --- a/paper-server/nms-patches/net/minecraft/world/inventory/ContainerLoom.patch +++ b/paper-server/nms-patches/net/minecraft/world/inventory/ContainerLoom.patch @@ -72,7 +72,7 @@ return stillValid(this.access, entityhuman, Blocks.LOOM); } -@@ -309,6 +347,11 @@ +@@ -308,6 +346,11 @@ if (nbttagcompound != null && nbttagcompound.contains("Patterns", 9)) { nbttaglist = nbttagcompound.getList("Patterns", 10); diff --git a/paper-server/nms-patches/net/minecraft/world/inventory/ContainerMerchant.patch b/paper-server/nms-patches/net/minecraft/world/inventory/ContainerMerchant.patch index e55d226afe..0d7382d66f 100644 --- a/paper-server/nms-patches/net/minecraft/world/inventory/ContainerMerchant.patch +++ b/paper-server/nms-patches/net/minecraft/world/inventory/ContainerMerchant.patch @@ -45,4 +45,4 @@ + if (!this.trader.isClientSide() && this.trader instanceof Entity) { // CraftBukkit - SPIGOT-5035 Entity entity = (Entity) this.trader; - entity.getLevel().playLocalSound(entity.getX(), entity.getY(), entity.getZ(), this.trader.getNotifyTradeSound(), SoundCategory.NEUTRAL, 1.0F, 1.0F, false); + entity.level().playLocalSound(entity.getX(), entity.getY(), entity.getZ(), this.trader.getNotifyTradeSound(), SoundCategory.NEUTRAL, 1.0F, 1.0F, false); diff --git a/paper-server/nms-patches/net/minecraft/world/inventory/ContainerPlayer.patch b/paper-server/nms-patches/net/minecraft/world/inventory/ContainerPlayer.patch index 0e44ec9e9a..9b5c0069cd 100644 --- a/paper-server/nms-patches/net/minecraft/world/inventory/ContainerPlayer.patch +++ b/paper-server/nms-patches/net/minecraft/world/inventory/ContainerPlayer.patch @@ -17,10 +17,10 @@ public static final MinecraftKey EMPTY_ARMOR_SLOT_SHIELD = new MinecraftKey("item/empty_armor_slot_shield"); static final MinecraftKey[] TEXTURE_EMPTY_SLOTS = new MinecraftKey[]{ContainerPlayer.EMPTY_ARMOR_SLOT_BOOTS, ContainerPlayer.EMPTY_ARMOR_SLOT_LEGGINGS, ContainerPlayer.EMPTY_ARMOR_SLOT_CHESTPLATE, ContainerPlayer.EMPTY_ARMOR_SLOT_HELMET}; private static final EnumItemSlot[] SLOT_IDS = new EnumItemSlot[]{EnumItemSlot.HEAD, EnumItemSlot.CHEST, EnumItemSlot.LEGS, EnumItemSlot.FEET}; -- private final InventoryCrafting craftSlots = new InventoryCrafting(this, 2, 2); +- private final InventoryCrafting craftSlots = new TransientCraftingContainer(this, 2, 2); - private final InventoryCraftResult resultSlots = new InventoryCraftResult(); + // CraftBukkit start -+ private final InventoryCrafting craftSlots; ++ private final TransientCraftingContainer craftSlots; + private final InventoryCraftResult resultSlots; + // CraftBukkit end public final boolean active; @@ -36,7 +36,7 @@ this.owner = entityhuman; + // CraftBukkit start + this.resultSlots = new InventoryCraftResult(); // CraftBukkit - moved to before InventoryCrafting construction -+ this.craftSlots = new InventoryCrafting(this, 2, 2, playerinventory.player); // CraftBukkit - pass player ++ this.craftSlots = new TransientCraftingContainer(this, 2, 2, playerinventory.player); // CraftBukkit - pass player + this.craftSlots.resultInventory = this.resultSlots; // CraftBukkit - let InventoryCrafting know about its result slot + this.player = playerinventory; // CraftBukkit - save player + setTitle(IChatBaseComponent.translatable("container.crafting")); // SPIGOT-4722: Allocate title for player inventory diff --git a/paper-server/nms-patches/net/minecraft/world/inventory/ContainerSmithing.patch b/paper-server/nms-patches/net/minecraft/world/inventory/ContainerSmithing.patch index d4fd6d831a..cc7292992f 100644 --- a/paper-server/nms-patches/net/minecraft/world/inventory/ContainerSmithing.patch +++ b/paper-server/nms-patches/net/minecraft/world/inventory/ContainerSmithing.patch @@ -19,7 +19,7 @@ public ContainerSmithing(int i, PlayerInventory playerinventory) { this(i, playerinventory, ContainerAccess.NULL); -@@ -89,7 +94,7 @@ +@@ -96,7 +101,7 @@ List list = this.level.getRecipeManager().getRecipesFor(Recipes.SMITHING, this.inputSlots, this.level); if (list.isEmpty()) { @@ -28,7 +28,7 @@ } else { SmithingRecipe smithingrecipe = (SmithingRecipe) list.get(0); ItemStack itemstack = smithingrecipe.assemble(this.inputSlots, this.level.registryAccess()); -@@ -97,7 +102,9 @@ +@@ -104,7 +109,9 @@ if (itemstack.isItemEnabled(this.level.enabledFeatures())) { this.selectedRecipe = smithingrecipe; this.resultSlots.setRecipeUsed(smithingrecipe); @@ -39,7 +39,7 @@ } } -@@ -125,4 +132,18 @@ +@@ -132,4 +139,18 @@ return findSlotMatchingIngredient(smithingrecipe, itemstack); }).anyMatch(Optional::isPresent); } diff --git a/paper-server/nms-patches/net/minecraft/world/inventory/ContainerStonecutter.patch b/paper-server/nms-patches/net/minecraft/world/inventory/ContainerStonecutter.patch index 65a1ab1257..d756cdd1f5 100644 --- a/paper-server/nms-patches/net/minecraft/world/inventory/ContainerStonecutter.patch +++ b/paper-server/nms-patches/net/minecraft/world/inventory/ContainerStonecutter.patch @@ -50,7 +50,7 @@ }; this.resultContainer = new InventoryCraftResult(); this.access = containeraccess; -@@ -100,6 +129,7 @@ +@@ -104,6 +133,7 @@ } this.addDataSlot(this.selectedRecipeIndex); @@ -58,7 +58,7 @@ } public int getSelectedRecipeIndex() { -@@ -120,6 +150,7 @@ +@@ -124,6 +154,7 @@ @Override public boolean stillValid(EntityHuman entityhuman) { diff --git a/paper-server/nms-patches/net/minecraft/world/inventory/ContainerWorkbench.patch b/paper-server/nms-patches/net/minecraft/world/inventory/ContainerWorkbench.patch index 8d21248f63..37eb039a40 100644 --- a/paper-server/nms-patches/net/minecraft/world/inventory/ContainerWorkbench.patch +++ b/paper-server/nms-patches/net/minecraft/world/inventory/ContainerWorkbench.patch @@ -13,7 +13,12 @@ public class ContainerWorkbench extends ContainerRecipeBook { public static final int RESULT_SLOT = 0; -@@ -27,6 +33,9 @@ +@@ -23,10 +29,13 @@ + private static final int INV_SLOT_END = 37; + private static final int USE_ROW_SLOT_START = 37; + private static final int USE_ROW_SLOT_END = 46; +- public final InventoryCrafting craftSlots; ++ public final TransientCraftingContainer craftSlots; // CraftBukkit public final InventoryCraftResult resultSlots; public final ContainerAccess access; private final EntityHuman player; @@ -27,10 +32,10 @@ public ContainerWorkbench(int i, PlayerInventory playerinventory, ContainerAccess containeraccess) { super(Containers.CRAFTING, i); -- this.craftSlots = new InventoryCrafting(this, 3, 3); +- this.craftSlots = new TransientCraftingContainer(this, 3, 3); + // CraftBukkit start - Switched order of IInventory construction and stored player this.resultSlots = new InventoryCraftResult(); -+ this.craftSlots = new InventoryCrafting(this, 3, 3, playerinventory.player); // CraftBukkit - pass player ++ this.craftSlots = new TransientCraftingContainer(this, 3, 3, playerinventory.player); // CraftBukkit - pass player + this.craftSlots.resultInventory = this.resultSlots; + // CraftBukkit end this.access = containeraccess; diff --git a/paper-server/nms-patches/net/minecraft/world/inventory/LegacySmithingMenu.patch b/paper-server/nms-patches/net/minecraft/world/inventory/LegacySmithingMenu.patch deleted file mode 100644 index 4d4f02b25e..0000000000 --- a/paper-server/nms-patches/net/minecraft/world/inventory/LegacySmithingMenu.patch +++ /dev/null @@ -1,60 +0,0 @@ ---- a/net/minecraft/world/inventory/LegacySmithingMenu.java -+++ b/net/minecraft/world/inventory/LegacySmithingMenu.java -@@ -11,6 +11,8 @@ - import net.minecraft.world.level.block.Blocks; - import net.minecraft.world.level.block.state.IBlockData; - -+import org.bukkit.craftbukkit.inventory.CraftInventoryView; // CraftBukkit -+ - /** @deprecated */ - @Deprecated(forRemoval = true) - public class LegacySmithingMenu extends ContainerAnvilAbstract { -@@ -26,6 +28,9 @@ - @Nullable - private LegacyUpgradeRecipe selectedRecipe; - private final List recipes; -+ // CraftBukkit start -+ private CraftInventoryView bukkitEntity; -+ // CraftBukkit end - - public LegacySmithingMenu(int i, PlayerInventory playerinventory) { - this(i, playerinventory, ContainerAccess.NULL); -@@ -87,7 +92,7 @@ - }).toList(); - - if (list.isEmpty()) { -- this.resultSlots.setItem(0, ItemStack.EMPTY); -+ org.bukkit.craftbukkit.event.CraftEventFactory.callPrepareSmithingEvent(getBukkitView(), ItemStack.EMPTY); // CraftBukkit - } else { - LegacyUpgradeRecipe legacyupgraderecipe = (LegacyUpgradeRecipe) list.get(0); - ItemStack itemstack = legacyupgraderecipe.assemble(this.inputSlots, this.level.registryAccess()); -@@ -95,7 +100,9 @@ - if (itemstack.isItemEnabled(this.level.enabledFeatures())) { - this.selectedRecipe = legacyupgraderecipe; - this.resultSlots.setRecipeUsed(legacyupgraderecipe); -- this.resultSlots.setItem(0, itemstack); -+ // CraftBukkit start -+ org.bukkit.craftbukkit.event.CraftEventFactory.callPrepareSmithingEvent(getBukkitView(), itemstack); -+ // CraftBukkit end - } - } - -@@ -116,4 +123,18 @@ - public boolean canTakeItemForPickAll(ItemStack itemstack, Slot slot) { - return slot.container != this.resultSlots && super.canTakeItemForPickAll(itemstack, slot); - } -+ -+ // CraftBukkit start -+ @Override -+ public CraftInventoryView getBukkitView() { -+ if (bukkitEntity != null) { -+ return bukkitEntity; -+ } -+ -+ org.bukkit.craftbukkit.inventory.CraftInventory inventory = new org.bukkit.craftbukkit.inventory.CraftInventorySmithing( -+ access.getLocation(), this.inputSlots, this.resultSlots); -+ bukkitEntity = new CraftInventoryView(this.player.getBukkitEntity(), inventory, this); -+ return bukkitEntity; -+ } -+ // CraftBukkit end - } diff --git a/paper-server/nms-patches/net/minecraft/world/inventory/SlotFurnaceResult.patch b/paper-server/nms-patches/net/minecraft/world/inventory/SlotFurnaceResult.patch index 26c7ac041d..6f6494dba3 100644 --- a/paper-server/nms-patches/net/minecraft/world/inventory/SlotFurnaceResult.patch +++ b/paper-server/nms-patches/net/minecraft/world/inventory/SlotFurnaceResult.patch @@ -1,11 +1,11 @@ --- a/net/minecraft/world/inventory/SlotFurnaceResult.java +++ b/net/minecraft/world/inventory/SlotFurnaceResult.java -@@ -46,7 +46,7 @@ - protected void checkTakeAchievements(ItemStack itemstack) { - itemstack.onCraftedBy(this.player.level, this.player, this.removeCount); - if (this.player instanceof EntityPlayer && this.container instanceof TileEntityFurnace) { -- ((TileEntityFurnace) this.container).awardUsedRecipesAndPopExperience((EntityPlayer) this.player); -+ ((TileEntityFurnace) this.container).awardUsedRecipesAndPopExperience((EntityPlayer) this.player, itemstack, this.removeCount); // CraftBukkit +@@ -54,7 +54,7 @@ + if (iinventory instanceof TileEntityFurnace) { + TileEntityFurnace tileentityfurnace = (TileEntityFurnace) iinventory; + +- tileentityfurnace.awardUsedRecipesAndPopExperience(entityplayer); ++ tileentityfurnace.awardUsedRecipesAndPopExperience(entityplayer, itemstack, this.removeCount); // CraftBukkit + } } - this.removeCount = 0; diff --git a/paper-server/nms-patches/net/minecraft/world/inventory/InventoryCrafting.patch b/paper-server/nms-patches/net/minecraft/world/inventory/TransientCraftingContainer.patch similarity index 78% rename from paper-server/nms-patches/net/minecraft/world/inventory/InventoryCrafting.patch rename to paper-server/nms-patches/net/minecraft/world/inventory/TransientCraftingContainer.patch index 2e20505b00..a6bb0c12e2 100644 --- a/paper-server/nms-patches/net/minecraft/world/inventory/InventoryCrafting.patch +++ b/paper-server/nms-patches/net/minecraft/world/inventory/TransientCraftingContainer.patch @@ -1,11 +1,12 @@ ---- a/net/minecraft/world/inventory/InventoryCrafting.java -+++ b/net/minecraft/world/inventory/InventoryCrafting.java -@@ -8,6 +8,15 @@ +--- a/net/minecraft/world/inventory/TransientCraftingContainer.java ++++ b/net/minecraft/world/inventory/TransientCraftingContainer.java +@@ -8,6 +8,16 @@ import net.minecraft.world.entity.player.EntityHuman; import net.minecraft.world.item.ItemStack; +// CraftBukkit start +import java.util.List; ++import net.minecraft.world.IInventory; +import net.minecraft.world.item.crafting.IRecipe; +import org.bukkit.Location; +import org.bukkit.craftbukkit.entity.CraftHumanEntity; @@ -13,12 +14,12 @@ +import org.bukkit.event.inventory.InventoryType; +// CraftBukkit end + - public class InventoryCrafting implements IInventory, AutoRecipeOutput { + public class TransientCraftingContainer implements InventoryCrafting { private final NonNullList items; -@@ -15,6 +24,68 @@ +@@ -15,6 +25,68 @@ private final int height; - public final Container menu; + private final Container menu; + // CraftBukkit start - add fields + public List transaction = new java.util.ArrayList(); @@ -76,12 +77,12 @@ + this.currentRecipe = currentRecipe; + } + -+ public InventoryCrafting(Container container, int i, int j, EntityHuman player) { ++ public TransientCraftingContainer(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) { - this.items = NonNullList.withSize(i * j, ItemStack.EMPTY); - this.menu = container; + public TransientCraftingContainer(Container container, int i, int j) { + this(container, i, j, NonNullList.withSize(i * j, ItemStack.EMPTY)); + } diff --git a/paper-server/nms-patches/net/minecraft/world/item/ItemBucket.patch b/paper-server/nms-patches/net/minecraft/world/item/ItemBucket.patch index 228afbe237..a0706cca14 100644 --- a/paper-server/nms-patches/net/minecraft/world/item/ItemBucket.patch +++ b/paper-server/nms-patches/net/minecraft/world/item/ItemBucket.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/item/ItemBucket.java +++ b/net/minecraft/world/item/ItemBucket.java -@@ -30,6 +30,16 @@ +@@ -29,6 +29,16 @@ import net.minecraft.world.phys.MovingObjectPosition; import net.minecraft.world.phys.MovingObjectPositionBlock; @@ -17,7 +17,7 @@ public class ItemBucket extends Item implements DispensibleContainerItem { public final FluidType content; -@@ -60,6 +70,17 @@ +@@ -59,6 +69,17 @@ iblockdata = world.getBlockState(blockposition); if (iblockdata.getBlock() instanceof IFluidSource) { IFluidSource ifluidsource = (IFluidSource) iblockdata.getBlock(); @@ -35,7 +35,7 @@ ItemStack itemstack1 = ifluidsource.pickupBlock(world, blockposition, iblockdata); if (!itemstack1.isEmpty()) { -@@ -68,7 +89,7 @@ +@@ -67,7 +88,7 @@ entityhuman.playSound(soundeffect, 1.0F, 1.0F); }); world.gameEvent((Entity) entityhuman, GameEvent.FLUID_PICKUP, blockposition); @@ -44,7 +44,7 @@ if (!world.isClientSide) { CriterionTriggers.FILLED_BUCKET.trigger((EntityPlayer) entityhuman, itemstack1); -@@ -83,7 +104,7 @@ +@@ -82,7 +103,7 @@ iblockdata = world.getBlockState(blockposition); BlockPosition blockposition2 = iblockdata.getBlock() instanceof IFluidContainer && this.content == FluidTypes.WATER ? blockposition : blockposition1; @@ -53,7 +53,7 @@ this.checkExtraContent(entityhuman, world, itemstack, blockposition2); if (entityhuman instanceof EntityPlayer) { CriterionTriggers.PLACED_BLOCK.trigger((EntityPlayer) entityhuman, blockposition2, itemstack); -@@ -110,6 +131,12 @@ +@@ -109,6 +130,12 @@ @Override public boolean emptyContents(@Nullable EntityHuman entityhuman, World world, BlockPosition blockposition, @Nullable MovingObjectPositionBlock movingobjectpositionblock) { @@ -66,7 +66,7 @@ if (!(this.content instanceof FluidTypeFlowing)) { return false; } else { -@@ -119,8 +146,18 @@ +@@ -117,8 +144,18 @@ boolean flag = iblockdata.canBeReplaced(this.content); boolean flag1 = iblockdata.isAir() || flag || block instanceof IFluidContainer && ((IFluidContainer) block).canPlaceLiquid(world, blockposition, iblockdata, this.content); diff --git a/paper-server/nms-patches/net/minecraft/world/item/ItemDye.patch b/paper-server/nms-patches/net/minecraft/world/item/ItemDye.patch index 91a7169386..67a3f2eab9 100644 --- a/paper-server/nms-patches/net/minecraft/world/item/ItemDye.patch +++ b/paper-server/nms-patches/net/minecraft/world/item/ItemDye.patch @@ -1,23 +1,23 @@ --- a/net/minecraft/world/item/ItemDye.java +++ b/net/minecraft/world/item/ItemDye.java -@@ -11,6 +11,8 @@ - import net.minecraft.world.entity.animal.EntitySheep; - import net.minecraft.world.entity.player.EntityHuman; +@@ -13,6 +13,8 @@ + import net.minecraft.world.level.World; + import net.minecraft.world.level.block.entity.TileEntitySign; +import org.bukkit.event.entity.SheepDyeWoolEvent; // CraftBukkit + - public class ItemDye extends Item { + public class ItemDye extends Item implements SignApplicator { private static final Map ITEM_BY_COLOR = Maps.newEnumMap(EnumColor.class); -@@ -30,7 +32,17 @@ +@@ -32,7 +34,17 @@ if (entitysheep.isAlive() && !entitysheep.isSheared() && entitysheep.getColor() != this.dyeColor) { - entitysheep.level.playSound(entityhuman, (Entity) entitysheep, SoundEffects.DYE_USE, SoundCategory.PLAYERS, 1.0F, 1.0F); - if (!entityhuman.level.isClientSide) { + entitysheep.level().playSound(entityhuman, (Entity) entitysheep, SoundEffects.DYE_USE, SoundCategory.PLAYERS, 1.0F, 1.0F); + if (!entityhuman.level().isClientSide) { - entitysheep.setColor(this.dyeColor); + // CraftBukkit start + byte bColor = (byte) this.dyeColor.getId(); + SheepDyeWoolEvent event = new SheepDyeWoolEvent((org.bukkit.entity.Sheep) entitysheep.getBukkitEntity(), org.bukkit.DyeColor.getByWoolData(bColor), (org.bukkit.entity.Player) entityhuman.getBukkitEntity()); -+ entitysheep.level.getCraftServer().getPluginManager().callEvent(event); ++ entitysheep.level().getCraftServer().getPluginManager().callEvent(event); + + if (event.isCancelled()) { + return EnumInteractionResult.PASS; diff --git a/paper-server/nms-patches/net/minecraft/world/item/ItemEndCrystal.patch b/paper-server/nms-patches/net/minecraft/world/item/ItemEndCrystal.patch index 4144e147c9..9ca1d4f105 100644 --- a/paper-server/nms-patches/net/minecraft/world/item/ItemEndCrystal.patch +++ b/paper-server/nms-patches/net/minecraft/world/item/ItemEndCrystal.patch @@ -11,4 +11,4 @@ + // CraftBukkit end world.addFreshEntity(entityendercrystal); world.gameEvent((Entity) itemactioncontext.getPlayer(), GameEvent.ENTITY_PLACE, blockposition1); - EnderDragonBattle enderdragonbattle = ((WorldServer) world).dragonFight(); + EnderDragonBattle enderdragonbattle = ((WorldServer) world).getDragonFight(); diff --git a/paper-server/nms-patches/net/minecraft/world/item/ItemMonsterEgg.patch b/paper-server/nms-patches/net/minecraft/world/item/ItemMonsterEgg.patch index b3c272e265..1788e2f8b8 100644 --- a/paper-server/nms-patches/net/minecraft/world/item/ItemMonsterEgg.patch +++ b/paper-server/nms-patches/net/minecraft/world/item/ItemMonsterEgg.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/item/ItemMonsterEgg.java +++ b/net/minecraft/world/item/ItemMonsterEgg.java -@@ -186,7 +186,7 @@ +@@ -185,7 +185,7 @@ return Optional.empty(); } else { ((EntityInsentient) object).moveTo(vec3d.x(), vec3d.y(), vec3d.z(), 0.0F, 0.0F); @@ -9,7 +9,7 @@ if (itemstack.hasCustomHoverName()) { ((EntityInsentient) object).setCustomName(itemstack.getHoverName()); } -@@ -195,7 +195,7 @@ +@@ -194,7 +194,7 @@ itemstack.shrink(1); } diff --git a/paper-server/nms-patches/net/minecraft/world/item/ItemSign.patch b/paper-server/nms-patches/net/minecraft/world/item/ItemSign.patch index 4e2c6bef5b..2b304e15d8 100644 --- a/paper-server/nms-patches/net/minecraft/world/item/ItemSign.patch +++ b/paper-server/nms-patches/net/minecraft/world/item/ItemSign.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/item/ItemSign.java +++ b/net/minecraft/world/item/ItemSign.java -@@ -11,6 +11,8 @@ +@@ -13,6 +13,8 @@ public class ItemSign extends ItemBlockWallable { @@ -9,15 +9,15 @@ public ItemSign(Item.Info item_info, Block block, Block block1) { super(block, block1, item_info, EnumDirection.DOWN); } -@@ -20,7 +22,10 @@ - boolean flag = super.updateCustomBlockEntityTag(blockposition, world, entityhuman, itemstack, iblockdata); +@@ -35,7 +37,10 @@ + if (block instanceof BlockSign) { + BlockSign blocksign = (BlockSign) block; - if (!world.isClientSide && !flag && entityhuman != null) { -- entityhuman.openTextEdit((TileEntitySign) world.getBlockEntity(blockposition)); -+ // CraftBukkit start - SPIGOT-4678 -+ // entityhuman.openTextEdit((TileEntitySign) world.getBlockEntity(blockposition)); -+ ItemSign.openSign = blockposition; -+ // CraftBukkit end +- blocksign.openTextEdit(entityhuman, tileentitysign, true); ++ // CraftBukkit start - SPIGOT-4678 ++ // blocksign.openTextEdit(entityhuman, tileentitysign, true); ++ ItemSign.openSign = blockposition; ++ // CraftBukkit end + } + } } - - return flag; diff --git a/paper-server/nms-patches/net/minecraft/world/item/ItemStack.patch b/paper-server/nms-patches/net/minecraft/world/item/ItemStack.patch index 62afe5eeb0..90d4279fab 100644 --- a/paper-server/nms-patches/net/minecraft/world/item/ItemStack.patch +++ b/paper-server/nms-patches/net/minecraft/world/item/ItemStack.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/item/ItemStack.java +++ b/net/minecraft/world/item/ItemStack.java -@@ -75,6 +75,42 @@ +@@ -76,6 +76,43 @@ import net.minecraft.world.level.block.state.pattern.ShapeDetectorBlock; import org.slf4j.Logger; @@ -18,6 +18,7 @@ +import net.minecraft.world.level.block.BlockBed; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.BlockSapling; ++import net.minecraft.world.level.block.BlockSign; +import net.minecraft.world.level.block.BlockTileEntity; +import net.minecraft.world.level.block.BlockWitherSkull; +import net.minecraft.world.level.block.SoundEffectType; @@ -43,10 +44,11 @@ public final class ItemStack { public static final Codec CODEC = RecordCodecBuilder.create((instance) -> { -@@ -151,16 +187,30 @@ - this.updateEmptyCacheFlag(); +@@ -151,11 +188,24 @@ + this.item = null; } +- private ItemStack(NBTTagCompound nbttagcompound) { + // Called to run this stack through the data converter to handle older storage methods and serialized items + public void convertStack(int version) { + if (0 < version && version < CraftMagicNumbers.INSTANCE.getDataVersion()) { @@ -57,13 +59,6 @@ + } + } + - private void updateEmptyCacheFlag() { -+ if (this.emptyCacheFlag && this == ItemStack.EMPTY) throw new AssertionError("TRAP"); // CraftBukkit - this.emptyCacheFlag = false; - this.emptyCacheFlag = this.isEmpty(); - } - -- private ItemStack(NBTTagCompound nbttagcompound) { + // CraftBukkit - break into own method + private void load(NBTTagCompound nbttagcompound) { this.item = (Item) BuiltInRegistries.ITEM.get(new MinecraftKey(nbttagcompound.getString("id"))); @@ -76,19 +71,19 @@ this.getItem().verifyTagAfterLoad(this.tag); } -@@ -168,6 +218,11 @@ - this.setDamageValue(this.getDamageValue()); - } +@@ -165,6 +215,11 @@ + + } -+ } -+ + private ItemStack(NBTTagCompound nbttagcompound) { + this.load(nbttagcompound); + // CraftBukkit end - this.updateEmptyCacheFlag(); - } - -@@ -225,7 +280,7 @@ ++ } ++ + public static ItemStack of(NBTTagCompound nbttagcompound) { + try { + return new ItemStack(nbttagcompound); +@@ -229,7 +284,7 @@ return this.getItem().builtInRegistryHolder().tags(); } @@ -97,7 +92,7 @@ EntityHuman entityhuman = itemactioncontext.getPlayer(); BlockPosition blockposition = itemactioncontext.getClickedPos(); ShapeDetectorBlock shapedetectorblock = new ShapeDetectorBlock(itemactioncontext.getLevel(), blockposition, false); -@@ -233,12 +288,182 @@ +@@ -237,12 +292,186 @@ if (entityhuman != null && !entityhuman.getAbilities().mayBuild && !this.hasAdventureModePlaceTagForBlock(itemactioncontext.getLevel().registryAccess().registryOrThrow(Registries.BLOCK), shapedetectorblock)) { return EnumInteractionResult.PASS; } else { @@ -231,8 +226,8 @@ + + if (this.item == Items.WITHER_SKELETON_SKULL) { // Special case skulls to allow wither spawns to be cancelled + BlockPosition bp = blockposition; -+ if (!world.getBlockState(blockposition).getMaterial().isReplaceable()) { -+ if (!world.getBlockState(blockposition).getMaterial().isSolid()) { ++ if (!world.getBlockState(blockposition).canBeReplaced()) { ++ if (!world.getBlockState(blockposition).isSolid()) { + bp = null; + } else { + bp = bp.relative(itemactioncontext.getClickedFace()); @@ -249,7 +244,11 @@ + // SPIGOT-4678 + if (this.item instanceof ItemSign && ItemSign.openSign != null) { + try { -+ entityhuman.openTextEdit((TileEntitySign) world.getBlockEntity(ItemSign.openSign)); ++ if (world.getBlockEntity(blockposition) instanceof TileEntitySign tileentitysign) { ++ if (world.getBlockState(blockposition).getBlock() instanceof BlockSign blocksign) { ++ blocksign.openTextEdit(entityhuman, tileentitysign, true); ++ } ++ } + } finally { + ItemSign.openSign = null; + } @@ -281,7 +280,7 @@ return enuminteractionresult; } -@@ -319,6 +544,21 @@ +@@ -323,6 +552,21 @@ } i -= k; @@ -303,7 +302,7 @@ if (i <= 0) { return false; } -@@ -340,6 +580,11 @@ +@@ -344,6 +588,11 @@ if (this.hurt(i, t0.getRandom(), t0 instanceof EntityPlayer ? (EntityPlayer) t0 : null)) { consumer.accept(t0); Item item = this.getItem(); @@ -315,7 +314,7 @@ this.shrink(1); if (t0 instanceof EntityHuman) { -@@ -494,6 +739,17 @@ +@@ -492,6 +741,17 @@ return this.tag; } @@ -333,7 +332,7 @@ public NBTTagCompound getOrCreateTag() { if (this.tag == null) { this.setTag(new NBTTagCompound()); -@@ -864,6 +1120,12 @@ +@@ -862,6 +1122,12 @@ } public void setRepairCost(int i) { @@ -346,7 +345,7 @@ this.getOrCreateTag().putInt("RepairCost", i); } -@@ -913,6 +1175,13 @@ +@@ -911,6 +1177,13 @@ nbttaglist.add(nbttagcompound); } diff --git a/paper-server/nms-patches/net/minecraft/world/item/crafting/LegacyUpgradeRecipe.patch b/paper-server/nms-patches/net/minecraft/world/item/crafting/LegacyUpgradeRecipe.patch deleted file mode 100644 index e1454343ec..0000000000 --- a/paper-server/nms-patches/net/minecraft/world/item/crafting/LegacyUpgradeRecipe.patch +++ /dev/null @@ -1,35 +0,0 @@ ---- a/net/minecraft/world/item/crafting/LegacyUpgradeRecipe.java -+++ b/net/minecraft/world/item/crafting/LegacyUpgradeRecipe.java -@@ -11,6 +11,14 @@ - import net.minecraft.world.item.ItemStack; - import net.minecraft.world.level.World; - -+// CraftBukkit start -+import org.bukkit.craftbukkit.inventory.CraftItemStack; -+import org.bukkit.craftbukkit.inventory.CraftRecipe; -+import org.bukkit.craftbukkit.inventory.CraftSmithingRecipe; -+import org.bukkit.craftbukkit.util.CraftNamespacedKey; -+import org.bukkit.inventory.Recipe; -+// CraftBukkit end -+ - /** @deprecated */ - @Deprecated(forRemoval = true) - public class LegacyUpgradeRecipe implements SmithingRecipe { -@@ -86,6 +94,17 @@ - }); - } - -+ // CraftBukkit start -+ @Override -+ public Recipe toBukkitRecipe() { -+ CraftItemStack result = CraftItemStack.asCraftMirror(this.result); -+ -+ CraftSmithingRecipe recipe = new CraftSmithingRecipe(CraftNamespacedKey.fromMinecraft(this.id), result, CraftRecipe.toBukkit(this.base), CraftRecipe.toBukkit(this.addition)); -+ -+ return recipe; -+ } -+ // CraftBukkit end -+ - public static class a implements RecipeSerializer { - - public a() {} diff --git a/paper-server/nms-patches/net/minecraft/world/item/crafting/RecipeItemStack.patch b/paper-server/nms-patches/net/minecraft/world/item/crafting/RecipeItemStack.patch index 77f22ede92..87b08310f0 100644 --- a/paper-server/nms-patches/net/minecraft/world/item/crafting/RecipeItemStack.patch +++ b/paper-server/nms-patches/net/minecraft/world/item/crafting/RecipeItemStack.patch @@ -14,7 +14,7 @@ + // CraftBukkit start + if (exact) { -+ if (itemstack1.getItem() == itemstack.getItem() && ItemStack.tagMatches(itemstack, itemstack1)) { ++ if (itemstack1.getItem() == itemstack.getItem() && ItemStack.isSameItemSameTags(itemstack, itemstack1)) { + return true; + } + diff --git a/paper-server/nms-patches/net/minecraft/world/item/enchantment/EnchantmentFrostWalker.patch b/paper-server/nms-patches/net/minecraft/world/item/enchantment/EnchantmentFrostWalker.patch index 42f0047156..7e3647bd33 100644 --- a/paper-server/nms-patches/net/minecraft/world/item/enchantment/EnchantmentFrostWalker.patch +++ b/paper-server/nms-patches/net/minecraft/world/item/enchantment/EnchantmentFrostWalker.patch @@ -1,9 +1,9 @@ --- a/net/minecraft/world/item/enchantment/EnchantmentFrostWalker.java +++ b/net/minecraft/world/item/enchantment/EnchantmentFrostWalker.java -@@ -56,8 +56,11 @@ +@@ -55,8 +55,11 @@ IBlockData iblockdata2 = world.getBlockState(blockposition1); - if (iblockdata2.getMaterial() == Material.WATER && (Integer) iblockdata2.getValue(BlockFluids.LEVEL) == 0 && iblockdata.canSurvive(world, blockposition1) && world.isUnobstructed(iblockdata, blockposition1, VoxelShapeCollision.empty())) { + if (iblockdata2 == BlockIceFrost.meltsInto() && iblockdata.canSurvive(world, blockposition1) && world.isUnobstructed(iblockdata, blockposition1, VoxelShapeCollision.empty())) { - world.setBlockAndUpdate(blockposition1, iblockdata); - world.scheduleTick(blockposition1, Blocks.FROSTED_ICE, MathHelper.nextInt(entityliving.getRandom(), 60, 120)); + // CraftBukkit Start - Call EntityBlockFormEvent for Frost Walker diff --git a/paper-server/nms-patches/net/minecraft/world/item/trading/MerchantRecipe.patch b/paper-server/nms-patches/net/minecraft/world/item/trading/MerchantRecipe.patch index a66820d43d..3589ce09d7 100644 --- a/paper-server/nms-patches/net/minecraft/world/item/trading/MerchantRecipe.patch +++ b/paper-server/nms-patches/net/minecraft/world/item/trading/MerchantRecipe.patch @@ -32,15 +32,15 @@ public MerchantRecipe(NBTTagCompound nbttagcompound) { this.rewardExp = true; -@@ -78,6 +96,7 @@ +@@ -81,6 +99,7 @@ + return ItemStack.EMPTY; + } else { + int i = this.baseCostA.getCount(); ++ if (i <= 0) return ItemStack.EMPTY; // CraftBukkit - SPIGOT-5476 + int j = Math.max(0, MathHelper.floor((float) (i * this.demand) * this.priceMultiplier)); - public ItemStack getCostA() { - int i = this.baseCostA.getCount(); -+ if (i <= 0) return ItemStack.EMPTY; // CraftBukkit - SPIGOT-5476 - ItemStack itemstack = this.baseCostA.copy(); - int j = Math.max(0, MathHelper.floor((float) (i * this.demand) * this.priceMultiplier)); - -@@ -199,7 +218,11 @@ + return this.baseCostA.copyWithCount(MathHelper.clamp(i + j + this.specialPriceDiff, 1, this.baseCostA.getItem().getMaxStackSize())); +@@ -201,7 +220,11 @@ if (!this.satisfiedBy(itemstack, itemstack1)) { return false; } else { diff --git a/paper-server/nms-patches/net/minecraft/world/level/Explosion.patch b/paper-server/nms-patches/net/minecraft/world/level/Explosion.patch index e0d192b8b9..f3a1f86a6c 100644 --- a/paper-server/nms-patches/net/minecraft/world/level/Explosion.patch +++ b/paper-server/nms-patches/net/minecraft/world/level/Explosion.patch @@ -155,12 +155,12 @@ BlockPosition blockposition1 = blockposition.immutable(); @@ -281,8 +383,8 @@ TileEntity tileentity = iblockdata.hasBlockEntity() ? this.level.getBlockEntity(blockposition) : null; - LootTableInfo.Builder loottableinfo_builder = (new LootTableInfo.Builder(worldserver)).withRandom(this.level.random).withParameter(LootContextParameters.ORIGIN, Vec3D.atCenterOf(blockposition)).withParameter(LootContextParameters.TOOL, ItemStack.EMPTY).withOptionalParameter(LootContextParameters.BLOCK_ENTITY, tileentity).withOptionalParameter(LootContextParameters.THIS_ENTITY, this.source); + LootParams.a lootparams_a = (new LootParams.a(worldserver)).withParameter(LootContextParameters.ORIGIN, Vec3D.atCenterOf(blockposition)).withParameter(LootContextParameters.TOOL, ItemStack.EMPTY).withOptionalParameter(LootContextParameters.BLOCK_ENTITY, tileentity).withOptionalParameter(LootContextParameters.THIS_ENTITY, this.source); - if (this.blockInteraction == Explosion.Effect.DESTROY_WITH_DECAY) { -- loottableinfo_builder.withParameter(LootContextParameters.EXPLOSION_RADIUS, this.radius); +- lootparams_a.withParameter(LootContextParameters.EXPLOSION_RADIUS, this.radius); + if (yield < 1.0F) { // CraftBukkit - add yield -+ loottableinfo_builder.withParameter(LootContextParameters.EXPLOSION_RADIUS, 1.0F / yield); // CraftBukkit - add yield ++ lootparams_a.withParameter(LootContextParameters.EXPLOSION_RADIUS, 1.0F / yield); // CraftBukkit - add yield } iblockdata.spawnAfterBreak(worldserver, blockposition, ItemStack.EMPTY, flag2); diff --git a/paper-server/nms-patches/net/minecraft/world/level/World.patch b/paper-server/nms-patches/net/minecraft/world/level/World.patch index 0200c24569..c5cea5ec95 100644 --- a/paper-server/nms-patches/net/minecraft/world/level/World.patch +++ b/paper-server/nms-patches/net/minecraft/world/level/World.patch @@ -32,7 +32,7 @@ public abstract class World implements GeneratorAccess, AutoCloseable { public static final Codec> RESOURCE_KEY_CODEC = ResourceKey.codec(Registries.DIMENSION); -@@ -115,7 +140,43 @@ +@@ -114,7 +139,43 @@ private final DamageSources damageSources; private long subTickCount; @@ -77,7 +77,7 @@ this.profiler = supplier; this.levelData = worlddatamutable; this.dimensionTypeRegistration = holder; -@@ -130,12 +191,12 @@ +@@ -129,12 +190,12 @@ this.worldBorder = new WorldBorder() { @Override public double getCenterX() { @@ -92,7 +92,7 @@ } }; } else { -@@ -148,6 +209,42 @@ +@@ -147,6 +208,42 @@ this.neighborUpdater = new CollectingNeighborUpdater(this, j); this.registryAccess = iregistrycustom; this.damageSources = new DamageSources(iregistrycustom); @@ -135,7 +135,7 @@ } @Override -@@ -205,6 +302,17 @@ +@@ -204,6 +301,17 @@ @Override public boolean setBlock(BlockPosition blockposition, IBlockData iblockdata, int i, int j) { @@ -153,7 +153,7 @@ if (this.isOutsideBuildHeight(blockposition)) { return false; } else if (!this.isClientSide && this.isDebug()) { -@@ -212,9 +320,24 @@ +@@ -211,13 +319,29 @@ } else { Chunk chunk = this.getChunkAt(blockposition); Block block = iblockdata.getBlock(); @@ -179,15 +179,12 @@ return false; } else { IBlockData iblockdata2 = this.getBlockState(blockposition); -@@ -225,6 +348,7 @@ - this.getProfiler().pop(); - } + /* if (iblockdata2 == iblockdata) { if (iblockdata1 != iblockdata2) { this.setBlocksDirty(blockposition, iblockdata1, iblockdata2); -@@ -251,12 +375,69 @@ +@@ -244,12 +368,69 @@ this.onBlockStateChange(blockposition, iblockdata1, iblockdata2); } @@ -215,7 +212,7 @@ + this.setBlocksDirty(blockposition, iblockdata1, iblockdata2); + } + -+ if ((i & 2) != 0 && (!this.isClientSide || (i & 4) == 0) && (this.isClientSide || chunk == null || (chunk.getFullStatus() != null && chunk.getFullStatus().isOrAfter(PlayerChunk.State.TICKING)))) { // allow chunk to be null here as chunk.isReady() is false when we send our notification during block placement ++ if ((i & 2) != 0 && (!this.isClientSide || (i & 4) == 0) && (this.isClientSide || chunk == null || (chunk.getFullStatus() != null && chunk.getFullStatus().isOrAfter(FullChunkStatus.BLOCK_TICKING)))) { // allow chunk to be null here as chunk.isReady() is false when we send our notification during block placement + this.sendBlockUpdated(blockposition, iblockdata1, iblockdata, i); + } + @@ -257,7 +254,7 @@ public void onBlockStateChange(BlockPosition blockposition, IBlockData iblockdata, IBlockData iblockdata1) {} @Override -@@ -342,6 +523,14 @@ +@@ -335,6 +516,14 @@ @Override public IBlockData getBlockState(BlockPosition blockposition) { @@ -272,7 +269,7 @@ if (this.isOutsideBuildHeight(blockposition)) { return Blocks.VOID_AIR.defaultBlockState(); } else { -@@ -533,6 +722,16 @@ +@@ -526,6 +715,16 @@ @Nullable @Override public TileEntity getBlockEntity(BlockPosition blockposition) { @@ -289,7 +286,7 @@ return this.isOutsideBuildHeight(blockposition) ? null : (!this.isClientSide && Thread.currentThread() != this.thread ? null : this.getChunkAt(blockposition).getBlockEntity(blockposition, Chunk.EnumTileEntityState.IMMEDIATE)); } -@@ -540,6 +739,12 @@ +@@ -533,6 +732,12 @@ BlockPosition blockposition = tileentity.getBlockPos(); if (!this.isOutsideBuildHeight(blockposition)) { @@ -302,7 +299,7 @@ this.getChunkAt(blockposition).addAndRegisterBlockEntity(tileentity); } } -@@ -670,7 +875,7 @@ +@@ -663,7 +868,7 @@ for (int k = 0; k < j; ++k) { EntityComplexPart entitycomplexpart = aentitycomplexpart[k]; diff --git a/paper-server/nms-patches/net/minecraft/world/level/block/BigDripleafBlock.patch b/paper-server/nms-patches/net/minecraft/world/level/block/BigDripleafBlock.patch index de23d09a66..9ff3d790f5 100644 --- a/paper-server/nms-patches/net/minecraft/world/level/block/BigDripleafBlock.patch +++ b/paper-server/nms-patches/net/minecraft/world/level/block/BigDripleafBlock.patch @@ -56,7 +56,7 @@ resetTilt(iblockdata, worldserver, blockposition); } @@ -210,8 +228,10 @@ - return entity.isOnGround() && entity.position().y > (double) ((float) blockposition.getY() + 0.6875F); + return entity.onGround() && entity.position().y > (double) ((float) blockposition.getY() + 0.6875F); } - private void setTiltAndScheduleTick(IBlockData iblockdata, World world, BlockPosition blockposition, Tilt tilt, @Nullable SoundEffect soundeffect) { diff --git a/paper-server/nms-patches/net/minecraft/world/level/block/Block.patch b/paper-server/nms-patches/net/minecraft/world/level/block/Block.patch index 39750ef499..3fc1a6510c 100644 --- a/paper-server/nms-patches/net/minecraft/world/level/block/Block.patch +++ b/paper-server/nms-patches/net/minecraft/world/level/block/Block.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/level/block/Block.java +++ b/net/minecraft/world/level/block/Block.java -@@ -354,7 +354,13 @@ +@@ -342,7 +342,13 @@ EntityItem entityitem = (EntityItem) supplier.get(); entityitem.setDefaultPickUpDelay(); @@ -15,7 +15,7 @@ } } -@@ -380,7 +386,7 @@ +@@ -368,7 +374,7 @@ public void playerDestroy(World world, EntityHuman entityhuman, BlockPosition blockposition, IBlockData iblockdata, @Nullable TileEntity tileentity, ItemStack itemstack) { entityhuman.awardStat(StatisticList.BLOCK_MINED.get(this)); @@ -24,7 +24,7 @@ dropResources(iblockdata, world, blockposition, tileentity, entityhuman, itemstack); } -@@ -516,16 +522,24 @@ +@@ -504,16 +510,24 @@ return this.builtInRegistryHolder; } diff --git a/paper-server/nms-patches/net/minecraft/world/level/block/BlockBed.patch b/paper-server/nms-patches/net/minecraft/world/level/block/BlockBed.patch index 89fa430bf3..cac30056f1 100644 --- a/paper-server/nms-patches/net/minecraft/world/level/block/BlockBed.patch +++ b/paper-server/nms-patches/net/minecraft/world/level/block/BlockBed.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/level/block/BlockBed.java +++ b/net/minecraft/world/level/block/BlockBed.java -@@ -85,7 +85,8 @@ +@@ -84,7 +84,8 @@ } } @@ -10,7 +10,7 @@ world.removeBlock(blockposition, false); BlockPosition blockposition1 = blockposition.relative(((EnumDirection) iblockdata.getValue(BlockBed.FACING)).getOpposite()); -@@ -104,7 +105,16 @@ +@@ -103,7 +104,16 @@ return EnumInteractionResult.SUCCESS; } else { @@ -27,7 +27,7 @@ if (entityhuman_enumbedresult.getMessage() != null) { entityhuman.displayClientMessage(entityhuman_enumbedresult.getMessage(), true); } -@@ -115,8 +125,29 @@ +@@ -114,8 +124,29 @@ } } @@ -58,7 +58,7 @@ } private boolean kickVillagerOutOfBed(World world, BlockPosition blockposition) { -@@ -320,6 +351,11 @@ +@@ -314,6 +345,11 @@ BlockPosition blockposition1 = blockposition.relative((EnumDirection) iblockdata.getValue(BlockBed.FACING)); world.setBlock(blockposition1, (IBlockData) iblockdata.setValue(BlockBed.PART, BlockPropertyBedPart.HEAD), 3); diff --git a/paper-server/nms-patches/net/minecraft/world/level/block/BlockBell.patch b/paper-server/nms-patches/net/minecraft/world/level/block/BlockBell.patch index 167cbb25cd..dfd90966d4 100644 --- a/paper-server/nms-patches/net/minecraft/world/level/block/BlockBell.patch +++ b/paper-server/nms-patches/net/minecraft/world/level/block/BlockBell.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/level/block/BlockBell.java +++ b/net/minecraft/world/level/block/BlockBell.java -@@ -137,6 +137,11 @@ +@@ -136,6 +136,11 @@ if (enumdirection == null) { enumdirection = (EnumDirection) world.getBlockState(blockposition).getValue(BlockBell.FACING); } @@ -12,7 +12,7 @@ ((TileEntityBell) tileentity).onHit(enumdirection); world.playSound((EntityHuman) null, blockposition, SoundEffects.BELL_BLOCK, SoundCategory.BLOCKS, 2.0F, 1.0F); -@@ -268,4 +273,16 @@ +@@ -262,4 +267,16 @@ public boolean isPathfindable(IBlockData iblockdata, IBlockAccess iblockaccess, BlockPosition blockposition, PathMode pathmode) { return false; } diff --git a/paper-server/nms-patches/net/minecraft/world/level/block/BlockCactus.patch b/paper-server/nms-patches/net/minecraft/world/level/block/BlockCactus.patch index 78465ceef5..35be6f1dc1 100644 --- a/paper-server/nms-patches/net/minecraft/world/level/block/BlockCactus.patch +++ b/paper-server/nms-patches/net/minecraft/world/level/block/BlockCactus.patch @@ -18,7 +18,7 @@ IBlockData iblockdata1 = (IBlockData) iblockdata.setValue(BlockCactus.AGE, 0); worldserver.setBlock(blockposition, iblockdata1, 4); -@@ -114,7 +116,9 @@ +@@ -112,7 +114,9 @@ @Override public void entityInside(IBlockData iblockdata, World world, BlockPosition blockposition, Entity entity) { diff --git a/paper-server/nms-patches/net/minecraft/world/level/block/BlockComposter.patch b/paper-server/nms-patches/net/minecraft/world/level/block/BlockComposter.patch index 823c5917f7..41b86605ec 100644 --- a/paper-server/nms-patches/net/minecraft/world/level/block/BlockComposter.patch +++ b/paper-server/nms-patches/net/minecraft/world/level/block/BlockComposter.patch @@ -13,7 +13,7 @@ public class BlockComposter extends Block implements IInventoryHolder { public static final int READY = 8; -@@ -246,7 +252,14 @@ +@@ -248,7 +254,14 @@ int i = (Integer) iblockdata.getValue(BlockComposter.LEVEL); if (i < 7 && BlockComposter.COMPOSTABLES.containsKey(itemstack.getItem())) { @@ -29,7 +29,7 @@ itemstack.shrink(1); return iblockdata1; -@@ -256,6 +269,14 @@ +@@ -258,6 +271,14 @@ } public static IBlockData extractProduce(Entity entity, IBlockData iblockdata, World world, BlockPosition blockposition) { @@ -44,7 +44,7 @@ if (!world.isClientSide) { Vec3D vec3d = Vec3D.atLowerCornerWithOffset(blockposition, 0.5D, 1.01D, 0.5D).offsetRandom(world.random, 0.7F); EntityItem entityitem = new EntityItem(world, vec3d.x(), vec3d.y(), vec3d.z(), new ItemStack(Items.BONE_MEAL)); -@@ -279,10 +300,16 @@ +@@ -281,10 +302,16 @@ } static IBlockData addItem(@Nullable Entity entity, IBlockData iblockdata, GeneratorAccess generatoraccess, BlockPosition blockposition, ItemStack itemstack) { @@ -62,7 +62,7 @@ return iblockdata; } else { int j = i + 1; -@@ -331,7 +358,8 @@ +@@ -333,7 +360,8 @@ public IWorldInventory getContainer(IBlockData iblockdata, GeneratorAccess generatoraccess, BlockPosition blockposition) { int i = (Integer) iblockdata.getValue(BlockComposter.LEVEL); @@ -72,7 +72,7 @@ } public static class ContainerOutput extends InventorySubcontainer implements IWorldInventory { -@@ -346,6 +374,7 @@ +@@ -348,6 +376,7 @@ this.state = iblockdata; this.level = generatoraccess; this.pos = blockposition; @@ -80,7 +80,7 @@ } @Override -@@ -370,8 +399,15 @@ +@@ -372,8 +401,15 @@ @Override public void setChanged() { @@ -98,7 +98,7 @@ } } -@@ -384,6 +420,7 @@ +@@ -386,6 +422,7 @@ public ContainerInput(IBlockData iblockdata, GeneratorAccess generatoraccess, BlockPosition blockposition) { super(1); @@ -106,7 +106,7 @@ this.state = iblockdata; this.level = generatoraccess; this.pos = blockposition; -@@ -426,8 +463,9 @@ +@@ -428,8 +465,9 @@ public static class ContainerEmpty extends InventorySubcontainer implements IWorldInventory { diff --git a/paper-server/nms-patches/net/minecraft/world/level/block/BlockDiodeAbstract.patch b/paper-server/nms-patches/net/minecraft/world/level/block/BlockDiodeAbstract.patch index 1fd1f42a0d..16226cff47 100644 --- a/paper-server/nms-patches/net/minecraft/world/level/block/BlockDiodeAbstract.patch +++ b/paper-server/nms-patches/net/minecraft/world/level/block/BlockDiodeAbstract.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/level/block/BlockDiodeAbstract.java +++ b/net/minecraft/world/level/block/BlockDiodeAbstract.java -@@ -19,6 +19,8 @@ +@@ -20,6 +20,8 @@ import net.minecraft.world.phys.shapes.VoxelShapeCollision; import net.minecraft.world.ticks.TickListPriority; @@ -9,7 +9,7 @@ public abstract class BlockDiodeAbstract extends BlockFacingHorizontal { protected static final VoxelShape SHAPE = Block.box(0.0D, 0.0D, 0.0D, 16.0D, 2.0D, 16.0D); -@@ -45,8 +47,18 @@ +@@ -46,8 +48,18 @@ boolean flag1 = this.shouldTurnOn(worldserver, blockposition, iblockdata); if (flag && !flag1) { diff --git a/paper-server/nms-patches/net/minecraft/world/level/block/BlockDispenser.patch b/paper-server/nms-patches/net/minecraft/world/level/block/BlockDispenser.patch index a63acc830b..30344ab7f0 100644 --- a/paper-server/nms-patches/net/minecraft/world/level/block/BlockDispenser.patch +++ b/paper-server/nms-patches/net/minecraft/world/level/block/BlockDispenser.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/level/block/BlockDispenser.java +++ b/net/minecraft/world/level/block/BlockDispenser.java -@@ -47,6 +47,7 @@ +@@ -46,6 +46,7 @@ object2objectopenhashmap.defaultReturnValue(new DispenseBehaviorItem()); }); private static final int TRIGGER_DURATION = 4; @@ -8,7 +8,7 @@ public static void registerBehavior(IMaterial imaterial, IDispenseBehavior idispensebehavior) { BlockDispenser.DISPENSER_REGISTRY.put(imaterial.asItem(), idispensebehavior); -@@ -90,6 +91,7 @@ +@@ -89,6 +90,7 @@ IDispenseBehavior idispensebehavior = this.getDispenseMethod(itemstack); if (idispensebehavior != IDispenseBehavior.NOOP) { diff --git a/paper-server/nms-patches/net/minecraft/world/level/block/BlockDoor.patch b/paper-server/nms-patches/net/minecraft/world/level/block/BlockDoor.patch index fcfc330d8e..70e0efbfe6 100644 --- a/paper-server/nms-patches/net/minecraft/world/level/block/BlockDoor.patch +++ b/paper-server/nms-patches/net/minecraft/world/level/block/BlockDoor.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/level/block/BlockDoor.java +++ b/net/minecraft/world/level/block/BlockDoor.java -@@ -35,6 +35,8 @@ +@@ -33,6 +33,8 @@ import net.minecraft.world.phys.shapes.VoxelShape; import net.minecraft.world.phys.shapes.VoxelShapeCollision; @@ -9,7 +9,7 @@ public class BlockDoor extends Block { public static final BlockStateDirection FACING = BlockFacingHorizontal.FACING; -@@ -187,9 +189,24 @@ +@@ -189,9 +191,24 @@ @Override public void neighborChanged(IBlockData iblockdata, World world, BlockPosition blockposition, Block block, BlockPosition blockposition1, boolean flag) { diff --git a/paper-server/nms-patches/net/minecraft/world/level/block/BlockIce.patch b/paper-server/nms-patches/net/minecraft/world/level/block/BlockIce.patch index 388a97d6fb..f818abc2de 100644 --- a/paper-server/nms-patches/net/minecraft/world/level/block/BlockIce.patch +++ b/paper-server/nms-patches/net/minecraft/world/level/block/BlockIce.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/level/block/BlockIce.java +++ b/net/minecraft/world/level/block/BlockIce.java -@@ -49,6 +49,11 @@ +@@ -51,6 +51,11 @@ } protected void melt(IBlockData iblockdata, World world, BlockPosition blockposition) { diff --git a/paper-server/nms-patches/net/minecraft/world/level/block/BlockLeaves.patch b/paper-server/nms-patches/net/minecraft/world/level/block/BlockLeaves.patch index b060213b97..a198cc831b 100644 --- a/paper-server/nms-patches/net/minecraft/world/level/block/BlockLeaves.patch +++ b/paper-server/nms-patches/net/minecraft/world/level/block/BlockLeaves.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/level/block/BlockLeaves.java +++ b/net/minecraft/world/level/block/BlockLeaves.java -@@ -23,6 +23,8 @@ +@@ -24,6 +24,8 @@ import net.minecraft.world.phys.shapes.VoxelShape; import net.minecraft.world.phys.shapes.VoxelShapes; @@ -9,7 +9,7 @@ public class BlockLeaves extends Block implements IBlockWaterlogged { public static final int DECAY_DISTANCE = 7; -@@ -49,6 +51,14 @@ +@@ -50,6 +52,14 @@ @Override public void randomTick(IBlockData iblockdata, WorldServer worldserver, BlockPosition blockposition, RandomSource randomsource) { if (this.decaying(iblockdata)) { diff --git a/paper-server/nms-patches/net/minecraft/world/level/block/BlockMagma.patch b/paper-server/nms-patches/net/minecraft/world/level/block/BlockMagma.patch index 10a03635b0..530bc03619 100644 --- a/paper-server/nms-patches/net/minecraft/world/level/block/BlockMagma.patch +++ b/paper-server/nms-patches/net/minecraft/world/level/block/BlockMagma.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/level/block/BlockMagma.java +++ b/net/minecraft/world/level/block/BlockMagma.java -@@ -28,7 +28,9 @@ +@@ -23,7 +23,9 @@ @Override public void stepOn(World world, BlockPosition blockposition, IBlockData iblockdata, Entity entity) { if (!entity.isSteppingCarefully() && entity instanceof EntityLiving && !EnchantmentManager.hasFrostWalker((EntityLiving) entity)) { diff --git a/paper-server/nms-patches/net/minecraft/world/level/block/BlockNote.patch b/paper-server/nms-patches/net/minecraft/world/level/block/BlockNote.patch index 6145a974d4..b822f7858f 100644 --- a/paper-server/nms-patches/net/minecraft/world/level/block/BlockNote.patch +++ b/paper-server/nms-patches/net/minecraft/world/level/block/BlockNote.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/level/block/BlockNote.java +++ b/net/minecraft/world/level/block/BlockNote.java -@@ -79,6 +79,7 @@ +@@ -75,6 +75,7 @@ if (flag1 != (Boolean) iblockdata.getValue(BlockNote.POWERED)) { if (flag1) { this.playNote((Entity) null, iblockdata, world, blockposition); @@ -8,10 +8,10 @@ } world.setBlock(blockposition, (IBlockData) iblockdata.setValue(BlockNote.POWERED, flag1), 3); -@@ -88,6 +89,12 @@ +@@ -84,6 +85,12 @@ private void playNote(@Nullable Entity entity, IBlockData iblockdata, World world, BlockPosition blockposition) { - if (!((BlockPropertyInstrument) iblockdata.getValue(BlockNote.INSTRUMENT)).requiresAirAbove() || world.getBlockState(blockposition.above()).isAir()) { + if (((BlockPropertyInstrument) iblockdata.getValue(BlockNote.INSTRUMENT)).worksAboveNoteBlock() || world.getBlockState(blockposition.above()).isAir()) { + // CraftBukkit start + org.bukkit.event.block.NotePlayEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callNotePlayEvent(world, blockposition, iblockdata.getValue(BlockNote.INSTRUMENT), iblockdata.getValue(BlockNote.NOTE)); + if (event.isCancelled()) { diff --git a/paper-server/nms-patches/net/minecraft/world/level/block/BlockPressurePlateAbstract.patch b/paper-server/nms-patches/net/minecraft/world/level/block/BlockPressurePlateAbstract.patch index a912c63a12..07bf0ee8ea 100644 --- a/paper-server/nms-patches/net/minecraft/world/level/block/BlockPressurePlateAbstract.patch +++ b/paper-server/nms-patches/net/minecraft/world/level/block/BlockPressurePlateAbstract.patch @@ -29,3 +29,20 @@ if (i != j) { IBlockData iblockdata1 = this.setSignalForState(iblockdata, j); +@@ -140,9 +155,15 @@ + } + + protected static int getEntityCount(World world, AxisAlignedBB axisalignedbb, Class oclass) { ++ // CraftBukkit start ++ return getEntities(world, axisalignedbb, oclass).size(); ++ } ++ ++ protected static java.util.List getEntities(World world, AxisAlignedBB axisalignedbb, Class oclass) { ++ // CraftBukkit end + return world.getEntitiesOfClass(oclass, axisalignedbb, IEntitySelector.NO_SPECTATORS.and((entity) -> { + return !entity.isIgnoringBlockTriggers(); +- })).size(); ++ })); // CraftBukkit + } + + protected abstract int getSignalStrength(World world, BlockPosition blockposition); diff --git a/paper-server/nms-patches/net/minecraft/world/level/block/BlockPressurePlateBinary.patch b/paper-server/nms-patches/net/minecraft/world/level/block/BlockPressurePlateBinary.patch index 924d30e68e..571a233719 100644 --- a/paper-server/nms-patches/net/minecraft/world/level/block/BlockPressurePlateBinary.patch +++ b/paper-server/nms-patches/net/minecraft/world/level/block/BlockPressurePlateBinary.patch @@ -1,8 +1,8 @@ --- a/net/minecraft/world/level/block/BlockPressurePlateBinary.java +++ b/net/minecraft/world/level/block/BlockPressurePlateBinary.java -@@ -14,6 +14,11 @@ +@@ -11,6 +11,11 @@ + import net.minecraft.world.level.block.state.properties.BlockSetType; import net.minecraft.world.level.block.state.properties.BlockStateBoolean; - import net.minecraft.world.phys.AxisAlignedBB; +// CraftBukkit start +import net.minecraft.world.entity.player.EntityHuman; @@ -12,30 +12,45 @@ public class BlockPressurePlateBinary extends BlockPressurePlateAbstract { public static final BlockStateBoolean POWERED = BlockProperties.POWERED; -@@ -57,6 +62,26 @@ - while (iterator.hasNext()) { - Entity entity = (Entity) iterator.next(); +@@ -34,7 +39,7 @@ -+ // CraftBukkit start - Call interact event when turning on a pressure plate -+ if (this.getSignalForState(world.getBlockState(blockposition)) == 0) { -+ org.bukkit.World bworld = world.getWorld(); -+ org.bukkit.plugin.PluginManager manager = world.getCraftServer().getPluginManager(); -+ org.bukkit.event.Cancellable cancellable; + @Override + protected int getSignalStrength(World world, BlockPosition blockposition) { +- Class oclass; ++ Class oclass; // CraftBukkit + + switch (this.sensitivity) { + case EVERYTHING: +@@ -49,7 +54,31 @@ + + Class oclass1 = oclass; + +- return getEntityCount(world, BlockPressurePlateBinary.TOUCH_AABB.move(blockposition), oclass1) > 0 ? 15 : 0; ++ // CraftBukkit start - Call interact event when turning on a pressure plate ++ for (Entity entity : getEntities(world, BlockPressurePlateBinary.TOUCH_AABB.move(blockposition), oclass)) { ++ if (this.getSignalForState(world.getBlockState(blockposition)) == 0) { ++ org.bukkit.World bworld = world.getWorld(); ++ org.bukkit.plugin.PluginManager manager = world.getCraftServer().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, 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; -+ } ++ if (entity instanceof EntityHuman) { ++ cancellable = org.bukkit.craftbukkit.event.CraftEventFactory.callPlayerInteractEvent((EntityHuman) entity, org.bukkit.event.block.Action.PHYSICAL, blockposition, null, null, null); ++ } else { ++ cancellable = new EntityInteractEvent(entity.getBukkitEntity(), bworld.getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ())); ++ manager.callEvent((EntityInteractEvent) cancellable); + } -+ // CraftBukkit end + - if (!entity.isIgnoringBlockTriggers()) { - return 15; - } ++ // We only want to block turning the plate on if all events are cancelled ++ if (cancellable.isCancelled()) { ++ continue; ++ } ++ } ++ ++ return 15; ++ } ++ ++ return 0; ++ // CraftBukkit end + } + + @Override diff --git a/paper-server/nms-patches/net/minecraft/world/level/block/BlockPressurePlateWeighted.patch b/paper-server/nms-patches/net/minecraft/world/level/block/BlockPressurePlateWeighted.patch index 1ef6d67fc6..c03ba700f1 100644 --- a/paper-server/nms-patches/net/minecraft/world/level/block/BlockPressurePlateWeighted.patch +++ b/paper-server/nms-patches/net/minecraft/world/level/block/BlockPressurePlateWeighted.patch @@ -12,19 +12,15 @@ public class BlockPressurePlateWeighted extends BlockPressurePlateAbstract { public static final BlockStateInteger POWER = BlockProperties.POWER; -@@ -24,7 +29,31 @@ +@@ -24,7 +29,27 @@ @Override protected int getSignalStrength(World world, BlockPosition blockposition) { -- int i = Math.min(world.getEntitiesOfClass(Entity.class, BlockPressurePlateWeighted.TOUCH_AABB.move(blockposition)).size(), this.maxWeight); +- int i = Math.min(getEntityCount(world, BlockPressurePlateWeighted.TOUCH_AABB.move(blockposition), Entity.class), this.maxWeight); + // CraftBukkit start -+ // int i = Math.min(world.getEntitiesOfClass(Entity.class, BlockPressurePlateWeighted.TOUCH_AABB.move(blockposition)).size(), this.maxWeight); ++ // int i = Math.min(getEntityCount(world, BlockPressurePlateWeighted.TOUCH_AABB.move(blockposition), Entity.class), this.maxWeight); + int i = 0; -+ java.util.Iterator iterator = world.getEntitiesOfClass(Entity.class, BlockPressurePlateWeighted.TOUCH_AABB.move(blockposition)).iterator(); -+ -+ while (iterator.hasNext()) { -+ Entity entity = (Entity) iterator.next(); -+ ++ for (Entity entity : getEntities(world, BlockPressurePlateWeighted.TOUCH_AABB.move(blockposition), Entity.class)) { + org.bukkit.event.Cancellable cancellable; + + if (entity instanceof EntityHuman) { diff --git a/paper-server/nms-patches/net/minecraft/world/level/block/BlockPumpkinCarved.patch b/paper-server/nms-patches/net/minecraft/world/level/block/BlockPumpkinCarved.patch index b70b6b511e..9d67227453 100644 --- a/paper-server/nms-patches/net/minecraft/world/level/block/BlockPumpkinCarved.patch +++ b/paper-server/nms-patches/net/minecraft/world/level/block/BlockPumpkinCarved.patch @@ -1,17 +1,17 @@ --- a/net/minecraft/world/level/block/BlockPumpkinCarved.java +++ b/net/minecraft/world/level/block/BlockPumpkinCarved.java -@@ -27,6 +27,10 @@ +@@ -23,6 +23,10 @@ + import net.minecraft.world.level.block.state.predicate.BlockStatePredicate; import net.minecraft.world.level.block.state.properties.BlockStateDirection; - import net.minecraft.world.level.material.Material; +// CraftBukkit start +import org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason; +// CraftBukkit end + - public class BlockPumpkinCarved extends BlockFacingHorizontal implements Equipable { + public class BlockPumpkinCarved extends BlockFacingHorizontal { public static final BlockStateDirection FACING = BlockFacingHorizontal.FACING; -@@ -83,9 +87,14 @@ +@@ -79,9 +83,14 @@ } private static void spawnGolemInWorld(World world, ShapeDetector.ShapeDetectorCollection shapedetector_shapedetectorcollection, Entity entity, BlockPosition blockposition) { diff --git a/paper-server/nms-patches/net/minecraft/world/level/block/BlockSoil.patch b/paper-server/nms-patches/net/minecraft/world/level/block/BlockSoil.patch index cecd65f316..bb50518446 100644 --- a/paper-server/nms-patches/net/minecraft/world/level/block/BlockSoil.patch +++ b/paper-server/nms-patches/net/minecraft/world/level/block/BlockSoil.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/level/block/BlockSoil.java +++ b/net/minecraft/world/level/block/BlockSoil.java -@@ -27,6 +27,11 @@ +@@ -28,6 +28,11 @@ import net.minecraft.world.phys.shapes.VoxelShape; import net.minecraft.world.phys.shapes.VoxelShapeCollision; @@ -12,13 +12,13 @@ public class BlockSoil extends Block { public static final BlockStateInteger MOISTURE = BlockProperties.MOISTURE; -@@ -83,26 +88,49 @@ +@@ -84,26 +89,49 @@ if (!isNearWater(worldserver, blockposition) && !worldserver.isRainingAt(blockposition.above())) { if (i > 0) { - worldserver.setBlock(blockposition, (IBlockData) iblockdata.setValue(BlockSoil.MOISTURE, i - 1), 2); + org.bukkit.craftbukkit.event.CraftEventFactory.handleMoistureChangeEvent(worldserver, blockposition, (IBlockData) iblockdata.setValue(BlockSoil.MOISTURE, i - 1), 2); // CraftBukkit - } else if (!isUnderCrops(worldserver, blockposition)) { + } else if (!shouldMaintainFarmland(worldserver, blockposition)) { turnToDirt((Entity) null, iblockdata, worldserver, blockposition); } } else if (i < 7) { diff --git a/paper-server/nms-patches/net/minecraft/world/level/block/BlockSponge.patch b/paper-server/nms-patches/net/minecraft/world/level/block/BlockSponge.patch index fb98a878b3..78d23a4bde 100644 --- a/paper-server/nms-patches/net/minecraft/world/level/block/BlockSponge.patch +++ b/paper-server/nms-patches/net/minecraft/world/level/block/BlockSponge.patch @@ -1,8 +1,8 @@ --- a/net/minecraft/world/level/block/BlockSponge.java +++ b/net/minecraft/world/level/block/BlockSponge.java -@@ -13,6 +13,13 @@ +@@ -9,6 +9,13 @@ + import net.minecraft.world.level.block.state.IBlockData; import net.minecraft.world.level.material.Fluid; - import net.minecraft.world.level.material.Material; +// CraftBukkit start +import java.util.List; @@ -14,57 +14,63 @@ public class BlockSponge extends Block { public static final int MAX_DEPTH = 6; -@@ -48,6 +55,7 @@ +@@ -41,7 +48,8 @@ + } - queue.add(new Tuple<>(blockposition, 0)); - int i = 0; + private boolean removeWaterBreadthFirstSearch(World world, BlockPosition blockposition) { +- return BlockPosition.breadthFirstTraversal(blockposition, 6, 65, (blockposition1, consumer) -> { + BlockStateListPopulator blockList = new BlockStateListPopulator(world); // CraftBukkit - Use BlockStateListPopulator ++ BlockPosition.breadthFirstTraversal(blockposition, 6, 65, (blockposition1, consumer) -> { + EnumDirection[] aenumdirection = BlockSponge.ALL_DIRECTIONS; + int i = aenumdirection.length; - while (!queue.isEmpty()) { - Tuple tuple = (Tuple) queue.poll(); -@@ -59,27 +67,31 @@ - for (int l = 0; l < k; ++l) { - EnumDirection enumdirection = aenumdirection[l]; - BlockPosition blockposition2 = blockposition1.relative(enumdirection); -- IBlockData iblockdata = world.getBlockState(blockposition2); -- Fluid fluid = world.getFluidState(blockposition2); +@@ -55,8 +63,10 @@ + if (blockposition1.equals(blockposition)) { + return true; + } else { +- IBlockData iblockdata = world.getBlockState(blockposition1); +- Fluid fluid = world.getFluidState(blockposition1); + // CraftBukkit start -+ IBlockData iblockdata = blockList.getBlockState(blockposition2); -+ Fluid fluid = blockList.getFluidState(blockposition2); ++ IBlockData iblockdata = blockList.getBlockState(blockposition1); ++ Fluid fluid = blockList.getFluidState(blockposition1); + // CraftBukkit end - Material material = iblockdata.getMaterial(); - if (fluid.is(TagsFluid.WATER)) { -- if (iblockdata.getBlock() instanceof IFluidSource && !((IFluidSource) iblockdata.getBlock()).pickupBlock(world, blockposition2, iblockdata).isEmpty()) { -+ if (iblockdata.getBlock() instanceof IFluidSource && !((IFluidSource) iblockdata.getBlock()).pickupBlock(blockList, blockposition2, iblockdata).isEmpty()) { // CraftBukkit - ++i; - if (j < 6) { - queue.add(new Tuple<>(blockposition2, j + 1)); + if (!fluid.is(TagsFluid.WATER)) { + return false; +@@ -66,27 +76,64 @@ + if (block instanceof IFluidSource) { + IFluidSource ifluidsource = (IFluidSource) block; + +- if (!ifluidsource.pickupBlock(world, blockposition1, iblockdata).isEmpty()) { ++ if (!ifluidsource.pickupBlock(blockList, blockposition1, iblockdata).isEmpty()) { // CraftBukkit + return true; } - } else if (iblockdata.getBlock() instanceof BlockFluids) { -- world.setBlock(blockposition2, Blocks.AIR.defaultBlockState(), 3); -+ blockList.setBlock(blockposition2, Blocks.AIR.defaultBlockState(), 3); // CraftBukkit - ++i; - if (j < 6) { - queue.add(new Tuple<>(blockposition2, j + 1)); + } + + if (iblockdata.getBlock() instanceof BlockFluids) { +- world.setBlock(blockposition1, Blocks.AIR.defaultBlockState(), 3); ++ blockList.setBlock(blockposition1, Blocks.AIR.defaultBlockState(), 3); // CraftBukkit + } else { + if (!iblockdata.is(Blocks.KELP) && !iblockdata.is(Blocks.KELP_PLANT) && !iblockdata.is(Blocks.SEAGRASS) && !iblockdata.is(Blocks.TALL_SEAGRASS)) { + return false; } - } else if (material == Material.WATER_PLANT || material == Material.REPLACEABLE_WATER_PLANT) { -- TileEntity tileentity = iblockdata.hasBlockEntity() ? world.getBlockEntity(blockposition2) : null; + +- TileEntity tileentity = iblockdata.hasBlockEntity() ? world.getBlockEntity(blockposition1) : null; + // CraftBukkit start -+ // TileEntity tileentity = iblockdata.hasBlockEntity() ? world.getBlockEntity(blockposition2) : null; ++ // TileEntity tileentity = iblockdata.hasBlockEntity() ? world.getBlockEntity(blockposition1) : null; -- dropResources(iblockdata, world, blockposition2, tileentity); -- world.setBlock(blockposition2, Blocks.AIR.defaultBlockState(), 3); -+ // dropResources(iblockdata, world, blockposition2, tileentity); -+ blockList.setBlock(blockposition2, Blocks.AIR.defaultBlockState(), 3); +- dropResources(iblockdata, world, blockposition1, tileentity); +- world.setBlock(blockposition1, Blocks.AIR.defaultBlockState(), 3); ++ // dropResources(iblockdata, world, blockposition1, tileentity); ++ blockList.setBlock(blockposition1, Blocks.AIR.defaultBlockState(), 3); + // CraftBukkit end - ++i; - if (j < 6) { - queue.add(new Tuple<>(blockposition2, j + 1)); -@@ -92,6 +104,39 @@ - break; + } + + return true; + } } - } +- }) > 1; ++ }); + // CraftBukkit start + List blocks = blockList.getList(); // Is a clone + if (!blocks.isEmpty()) { @@ -78,26 +84,27 @@ + } + + for (CraftBlockState block : blocks) { -+ BlockPosition blockposition2 = block.getPosition(); -+ IBlockData iblockdata = world.getBlockState(blockposition2); -+ Fluid fluid = world.getFluidState(blockposition2); -+ Material material = iblockdata.getMaterial(); ++ BlockPosition blockposition1 = block.getPosition(); ++ IBlockData iblockdata = world.getBlockState(blockposition1); ++ Fluid fluid = world.getFluidState(blockposition1); + + if (fluid.is(TagsFluid.WATER)) { -+ if (iblockdata.getBlock() instanceof IFluidSource && !((IFluidSource) iblockdata.getBlock()).pickupBlock(blockList, blockposition2, iblockdata).isEmpty()) { ++ if (iblockdata.getBlock() instanceof IFluidSource && !((IFluidSource) iblockdata.getBlock()).pickupBlock(blockList, blockposition1, iblockdata).isEmpty()) { + // NOP + } else if (iblockdata.getBlock() instanceof BlockFluids) { + // NOP -+ } else if (material == Material.WATER_PLANT || material == Material.REPLACEABLE_WATER_PLANT) { -+ TileEntity tileentity = iblockdata.hasBlockEntity() ? world.getBlockEntity(blockposition2) : null; ++ } else if (iblockdata.is(Blocks.KELP) || iblockdata.is(Blocks.KELP_PLANT) || iblockdata.is(Blocks.SEAGRASS) || iblockdata.is(Blocks.TALL_SEAGRASS)) { ++ TileEntity tileentity = iblockdata.hasBlockEntity() ? world.getBlockEntity(blockposition1) : null; + -+ dropResources(iblockdata, world, blockposition2, tileentity); ++ dropResources(iblockdata, world, blockposition1, tileentity); + } + } -+ world.setBlock(blockposition2, block.getHandle(), block.getFlag()); ++ world.setBlock(blockposition1, block.getHandle(), block.getFlag()); + } ++ ++ return true; + } ++ return false; + // CraftBukkit end - - return i > 0; } + } diff --git a/paper-server/nms-patches/net/minecraft/world/level/block/BlockTrapdoor.patch b/paper-server/nms-patches/net/minecraft/world/level/block/BlockTrapdoor.patch index c5c971db9a..e875f03cc3 100644 --- a/paper-server/nms-patches/net/minecraft/world/level/block/BlockTrapdoor.patch +++ b/paper-server/nms-patches/net/minecraft/world/level/block/BlockTrapdoor.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/level/block/BlockTrapdoor.java +++ b/net/minecraft/world/level/block/BlockTrapdoor.java -@@ -30,6 +30,8 @@ +@@ -29,6 +29,8 @@ import net.minecraft.world.phys.shapes.VoxelShape; import net.minecraft.world.phys.shapes.VoxelShapeCollision; @@ -9,7 +9,7 @@ public class BlockTrapdoor extends BlockFacingHorizontal implements IBlockWaterlogged { public static final BlockStateBoolean OPEN = BlockProperties.OPEN; -@@ -111,6 +113,19 @@ +@@ -110,6 +112,19 @@ boolean flag1 = world.hasNeighborSignal(blockposition); if (flag1 != (Boolean) iblockdata.getValue(BlockTrapdoor.POWERED)) { diff --git a/paper-server/nms-patches/net/minecraft/world/level/block/BlockWaterLily.patch b/paper-server/nms-patches/net/minecraft/world/level/block/BlockWaterLily.patch index 44068eccf8..696047eed2 100644 --- a/paper-server/nms-patches/net/minecraft/world/level/block/BlockWaterLily.patch +++ b/paper-server/nms-patches/net/minecraft/world/level/block/BlockWaterLily.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/level/block/BlockWaterLily.java +++ b/net/minecraft/world/level/block/BlockWaterLily.java -@@ -25,7 +25,7 @@ +@@ -24,7 +24,7 @@ @Override public void entityInside(IBlockData iblockdata, World world, BlockPosition blockposition, Entity entity) { super.entityInside(iblockdata, world, blockposition, entity); diff --git a/paper-server/nms-patches/net/minecraft/world/level/block/BlockWitherSkull.patch b/paper-server/nms-patches/net/minecraft/world/level/block/BlockWitherSkull.patch index 0b6490fba0..982df61676 100644 --- a/paper-server/nms-patches/net/minecraft/world/level/block/BlockWitherSkull.patch +++ b/paper-server/nms-patches/net/minecraft/world/level/block/BlockWitherSkull.patch @@ -1,8 +1,8 @@ --- a/net/minecraft/world/level/block/BlockWitherSkull.java +++ b/net/minecraft/world/level/block/BlockWitherSkull.java -@@ -26,6 +26,10 @@ - import net.minecraft.world.level.block.state.predicate.MaterialPredicate; - import net.minecraft.world.level.material.Material; +@@ -24,6 +24,10 @@ + import net.minecraft.world.level.block.state.pattern.ShapeDetectorBuilder; + import net.minecraft.world.level.block.state.predicate.BlockStatePredicate; +// CraftBukkit start +import org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason; @@ -11,7 +11,7 @@ public class BlockWitherSkull extends BlockSkull { @Nullable -@@ -49,6 +53,7 @@ +@@ -47,6 +51,7 @@ } public static void checkSpawn(World world, BlockPosition blockposition, TileEntitySkull tileentityskull) { @@ -19,7 +19,7 @@ if (!world.isClientSide) { IBlockData iblockdata = tileentityskull.getBlockState(); boolean flag = iblockdata.is(Blocks.WITHER_SKELETON_SKULL) || iblockdata.is(Blocks.WITHER_SKELETON_WALL_SKULL); -@@ -60,12 +65,18 @@ +@@ -58,12 +63,18 @@ EntityWither entitywither = (EntityWither) EntityTypes.WITHER.create(world); if (entitywither != null) { @@ -39,7 +39,7 @@ Iterator iterator = world.getEntitiesOfClass(EntityPlayer.class, entitywither.getBoundingBox().inflate(50.0D)).iterator(); while (iterator.hasNext()) { -@@ -74,7 +85,7 @@ +@@ -72,7 +83,7 @@ CriterionTriggers.SUMMONED_ENTITY.trigger(entityplayer, (Entity) entitywither); } diff --git a/paper-server/nms-patches/net/minecraft/world/level/block/BuddingAmethystBlock.patch b/paper-server/nms-patches/net/minecraft/world/level/block/BuddingAmethystBlock.patch index e778875c32..390b35dbad 100644 --- a/paper-server/nms-patches/net/minecraft/world/level/block/BuddingAmethystBlock.patch +++ b/paper-server/nms-patches/net/minecraft/world/level/block/BuddingAmethystBlock.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/level/block/BuddingAmethystBlock.java +++ b/net/minecraft/world/level/block/BuddingAmethystBlock.java -@@ -44,7 +44,7 @@ +@@ -38,7 +38,7 @@ if (block != null) { IBlockData iblockdata2 = (IBlockData) ((IBlockData) block.defaultBlockState().setValue(AmethystClusterBlock.FACING, enumdirection)).setValue(AmethystClusterBlock.WATERLOGGED, iblockdata1.getFluidState().getType() == FluidTypes.WATER); diff --git a/paper-server/nms-patches/net/minecraft/world/level/block/PointedDripstoneBlock.patch b/paper-server/nms-patches/net/minecraft/world/level/block/PointedDripstoneBlock.patch index 55ccc81511..d29c54f252 100644 --- a/paper-server/nms-patches/net/minecraft/world/level/block/PointedDripstoneBlock.patch +++ b/paper-server/nms-patches/net/minecraft/world/level/block/PointedDripstoneBlock.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/level/block/PointedDripstoneBlock.java +++ b/net/minecraft/world/level/block/PointedDripstoneBlock.java -@@ -44,6 +44,11 @@ +@@ -42,6 +42,11 @@ import net.minecraft.world.phys.shapes.VoxelShapeCollision; import net.minecraft.world.phys.shapes.VoxelShapes; @@ -12,7 +12,7 @@ public class PointedDripstoneBlock extends Block implements Fallable, IBlockWaterlogged { public static final BlockStateDirection TIP_DIRECTION = BlockProperties.VERTICAL_DIRECTION; -@@ -126,6 +131,11 @@ +@@ -124,6 +129,11 @@ BlockPosition blockposition = movingobjectpositionblock.getBlockPos(); if (!world.isClientSide && iprojectile.mayInteract(world, blockposition) && iprojectile instanceof EntityThrownTrident && iprojectile.getDeltaMovement().length() > 0.6D) { @@ -24,7 +24,7 @@ world.destroyBlock(blockposition, true); } -@@ -134,7 +144,9 @@ +@@ -132,7 +142,9 @@ @Override public void fallOn(World world, IBlockData iblockdata, BlockPosition blockposition, Entity entity, float f) { if (iblockdata.getValue(PointedDripstoneBlock.TIP_DIRECTION) == EnumDirection.UP && iblockdata.getValue(PointedDripstoneBlock.THICKNESS) == DripstoneThickness.TIP) { @@ -34,7 +34,7 @@ } else { super.fallOn(world, iblockdata, blockposition, entity, f); } -@@ -389,15 +401,15 @@ +@@ -377,15 +389,15 @@ if (isUnmergedTipWithDirection(iblockdata, enumdirection.getOpposite())) { createMergedTips(iblockdata, worldserver, blockposition1); } else if (iblockdata.isAir() || iblockdata.is(Blocks.WATER)) { @@ -53,7 +53,7 @@ } private static void createMergedTips(IBlockData iblockdata, GeneratorAccess generatoraccess, BlockPosition blockposition) { -@@ -412,8 +424,8 @@ +@@ -400,8 +412,8 @@ blockposition1 = blockposition.below(); } @@ -64,7 +64,7 @@ } public static void spawnDripParticle(World world, BlockPosition blockposition, IBlockData iblockdata) { -@@ -446,7 +458,7 @@ +@@ -434,7 +446,7 @@ return (BlockPosition) findBlockVertical(generatoraccess, blockposition, enumdirection.getAxisDirection(), bipredicate, (iblockdata1) -> { return isTip(iblockdata1, flag); @@ -73,7 +73,7 @@ } } -@@ -562,7 +574,7 @@ +@@ -550,7 +562,7 @@ return canDripThrough(world, blockposition1, iblockdata); }; @@ -82,7 +82,7 @@ } @Nullable -@@ -571,7 +583,7 @@ +@@ -559,7 +571,7 @@ return canDripThrough(world, blockposition1, iblockdata); }; diff --git a/paper-server/nms-patches/net/minecraft/world/level/block/SculkCatalystBlock.patch b/paper-server/nms-patches/net/minecraft/world/level/block/SculkCatalystBlock.patch index 59a6e806c9..2d49b6a459 100644 --- a/paper-server/nms-patches/net/minecraft/world/level/block/SculkCatalystBlock.patch +++ b/paper-server/nms-patches/net/minecraft/world/level/block/SculkCatalystBlock.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/level/block/SculkCatalystBlock.java +++ b/net/minecraft/world/level/block/SculkCatalystBlock.java -@@ -86,9 +86,16 @@ +@@ -61,9 +61,16 @@ @Override public void spawnAfterBreak(IBlockData iblockdata, WorldServer worldserver, BlockPosition blockposition, ItemStack itemstack, boolean flag) { super.spawnAfterBreak(iblockdata, worldserver, blockposition, itemstack, flag); diff --git a/paper-server/nms-patches/net/minecraft/world/level/block/SculkSensorBlock.patch b/paper-server/nms-patches/net/minecraft/world/level/block/SculkSensorBlock.patch index 8131dcd688..d647810770 100644 --- a/paper-server/nms-patches/net/minecraft/world/level/block/SculkSensorBlock.patch +++ b/paper-server/nms-patches/net/minecraft/world/level/block/SculkSensorBlock.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/level/block/SculkSensorBlock.java +++ b/net/minecraft/world/level/block/SculkSensorBlock.java -@@ -38,6 +38,11 @@ +@@ -41,6 +41,11 @@ import net.minecraft.world.phys.shapes.VoxelShape; import net.minecraft.world.phys.shapes.VoxelShapeCollision; @@ -11,8 +11,8 @@ + public class SculkSensorBlock extends BlockTileEntity implements IBlockWaterlogged { - public static final int ACTIVE_TICKS = 40; -@@ -87,6 +92,18 @@ + public static final int ACTIVE_TICKS = 30; +@@ -95,6 +100,18 @@ @Override public void stepOn(World world, BlockPosition blockposition, IBlockData iblockdata, Entity entity) { if (!world.isClientSide() && canActivate(iblockdata) && entity.getType() != EntityTypes.WARDEN) { @@ -31,7 +31,7 @@ TileEntity tileentity = world.getBlockEntity(blockposition); if (tileentity instanceof SculkSensorBlockEntity) { -@@ -188,6 +205,15 @@ +@@ -198,6 +215,15 @@ } public static void deactivate(World world, BlockPosition blockposition, IBlockData iblockdata) { @@ -45,12 +45,12 @@ + } + // CraftBukkit end world.setBlock(blockposition, (IBlockData) ((IBlockData) iblockdata.setValue(SculkSensorBlock.PHASE, SculkSensorPhase.COOLDOWN)).setValue(SculkSensorBlock.POWER, 0), 3); - world.scheduleTick(blockposition, iblockdata.getBlock(), 1); - if (!(Boolean) iblockdata.getValue(SculkSensorBlock.WATERLOGGED)) { -@@ -198,6 +224,15 @@ + world.scheduleTick(blockposition, iblockdata.getBlock(), 10); + updateNeighbours(world, blockposition, iblockdata); +@@ -209,6 +235,15 @@ } - public static void activate(@Nullable Entity entity, World world, BlockPosition blockposition, IBlockData iblockdata, int i) { + public void activate(@Nullable Entity entity, World world, BlockPosition blockposition, IBlockData iblockdata, int i, int j) { + // CraftBukkit start + BlockRedstoneEvent eventRedstone = new BlockRedstoneEvent(CraftBlock.at(world, blockposition), iblockdata.getValue(SculkSensorBlock.POWER), i); + world.getCraftServer().getPluginManager().callEvent(eventRedstone); @@ -61,9 +61,9 @@ + i = eventRedstone.getNewCurrent(); + // CraftBukkit end world.setBlock(blockposition, (IBlockData) ((IBlockData) iblockdata.setValue(SculkSensorBlock.PHASE, SculkSensorPhase.ACTIVE)).setValue(SculkSensorBlock.POWER, i), 3); - world.scheduleTick(blockposition, iblockdata.getBlock(), 40); - updateNeighbours(world, blockposition); -@@ -260,9 +295,16 @@ + world.scheduleTick(blockposition, iblockdata.getBlock(), this.getActiveTicks()); + updateNeighbours(world, blockposition, iblockdata); +@@ -291,9 +326,16 @@ @Override public void spawnAfterBreak(IBlockData iblockdata, WorldServer worldserver, BlockPosition blockposition, ItemStack itemstack, boolean flag) { super.spawnAfterBreak(iblockdata, worldserver, blockposition, itemstack, flag); diff --git a/paper-server/nms-patches/net/minecraft/world/level/block/SculkVeinBlock.patch b/paper-server/nms-patches/net/minecraft/world/level/block/SculkVeinBlock.patch index 4996259a41..768898a5e6 100644 --- a/paper-server/nms-patches/net/minecraft/world/level/block/SculkVeinBlock.patch +++ b/paper-server/nms-patches/net/minecraft/world/level/block/SculkVeinBlock.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/level/block/SculkVeinBlock.java +++ b/net/minecraft/world/level/block/SculkVeinBlock.java -@@ -103,10 +103,11 @@ +@@ -101,10 +101,11 @@ @Override public int attemptUseCharge(SculkSpreader.a sculkspreader_a, GeneratorAccess generatoraccess, BlockPosition blockposition, RandomSource randomsource, SculkSpreader sculkspreader, boolean flag) { @@ -14,7 +14,7 @@ IBlockData iblockdata = generatoraccess.getBlockState(blockposition); TagKey tagkey = sculkspreader.replaceableBlocks(); Iterator iterator = EnumDirection.allShuffled(randomsource).iterator(); -@@ -121,7 +122,11 @@ +@@ -119,7 +120,11 @@ if (iblockdata1.is(tagkey)) { IBlockData iblockdata2 = Blocks.SCULK.defaultBlockState(); diff --git a/paper-server/nms-patches/net/minecraft/world/level/block/entity/ChiseledBookShelfBlockEntity.patch b/paper-server/nms-patches/net/minecraft/world/level/block/entity/ChiseledBookShelfBlockEntity.patch index 98acf9f8f4..f647d65fce 100644 --- a/paper-server/nms-patches/net/minecraft/world/level/block/entity/ChiseledBookShelfBlockEntity.patch +++ b/paper-server/nms-patches/net/minecraft/world/level/block/entity/ChiseledBookShelfBlockEntity.patch @@ -55,7 +55,7 @@ public ChiseledBookShelfBlockEntity(BlockPosition blockposition, IBlockData iblockdata) { super(TileEntityTypes.CHISELED_BOOKSHELF, blockposition, iblockdata); -@@ -113,7 +155,7 @@ +@@ -120,7 +162,7 @@ @Override public int getMaxStackSize() { diff --git a/paper-server/nms-patches/net/minecraft/world/level/block/entity/SculkCatalystBlockEntity.patch b/paper-server/nms-patches/net/minecraft/world/level/block/entity/SculkCatalystBlockEntity.patch index c29cfc0a9f..7a6c34dcec 100644 --- a/paper-server/nms-patches/net/minecraft/world/level/block/entity/SculkCatalystBlockEntity.patch +++ b/paper-server/nms-patches/net/minecraft/world/level/block/entity/SculkCatalystBlockEntity.patch @@ -1,11 +1,11 @@ --- a/net/minecraft/world/level/block/entity/SculkCatalystBlockEntity.java +++ b/net/minecraft/world/level/block/entity/SculkCatalystBlockEntity.java -@@ -86,7 +86,9 @@ +@@ -35,7 +35,9 @@ } public static void serverTick(World world, BlockPosition blockposition, IBlockData iblockdata, SculkCatalystBlockEntity sculkcatalystblockentity) { + org.bukkit.craftbukkit.event.CraftEventFactory.sourceBlockOverride = sculkcatalystblockentity.getBlockPos(); // CraftBukkit - SPIGOT-7068: Add source block override, not the most elegant way but better than passing down a BlockPosition up to five methods deep. - sculkcatalystblockentity.sculkSpreader.updateCursors(world, blockposition, world.getRandom(), true); + sculkcatalystblockentity.catalystListener.getSculkSpreader().updateCursors(world, blockposition, world.getRandom(), true); + org.bukkit.craftbukkit.event.CraftEventFactory.sourceBlockOverride = null; // CraftBukkit } diff --git a/paper-server/nms-patches/net/minecraft/world/level/block/entity/TileEntityBell.patch b/paper-server/nms-patches/net/minecraft/world/level/block/entity/TileEntityBell.patch index 7428161560..c54d843b60 100644 --- a/paper-server/nms-patches/net/minecraft/world/level/block/entity/TileEntityBell.patch +++ b/paper-server/nms-patches/net/minecraft/world/level/block/entity/TileEntityBell.patch @@ -1,16 +1,5 @@ --- a/net/minecraft/world/level/block/entity/TileEntityBell.java +++ b/net/minecraft/world/level/block/entity/TileEntityBell.java -@@ -35,8 +35,8 @@ - public boolean shaking; - public EnumDirection clickDirection; - private List nearbyEntities; -- private boolean resonating; -- private int resonationTicks; -+ public boolean resonating; -+ public int resonationTicks; - - public TileEntityBell(BlockPosition blockposition, IBlockData iblockdata) { - super(TileEntityTypes.BELL, blockposition, iblockdata); @@ -120,7 +120,7 @@ EntityLiving entityliving = (EntityLiving) iterator.next(); diff --git a/paper-server/nms-patches/net/minecraft/world/level/block/entity/TileEntityFurnace.patch b/paper-server/nms-patches/net/minecraft/world/level/block/entity/TileEntityFurnace.patch index 4b0c1e7694..1ffcfd0543 100644 --- a/paper-server/nms-patches/net/minecraft/world/level/block/entity/TileEntityFurnace.patch +++ b/paper-server/nms-patches/net/minecraft/world/level/block/entity/TileEntityFurnace.patch @@ -183,17 +183,18 @@ } public static boolean isFuel(ItemStack itemstack) { -@@ -493,14 +591,20 @@ +@@ -493,8 +591,8 @@ @Override - public void awardUsedRecipes(EntityHuman entityhuman) {} + public void awardUsedRecipes(EntityHuman entityhuman, List list) {} - public void awardUsedRecipesAndPopExperience(EntityPlayer entityplayer) { -- List> list = this.getRecipesToAwardAndPopExperience(entityplayer.getLevel(), entityplayer.position()); +- List> list = this.getRecipesToAwardAndPopExperience(entityplayer.serverLevel(), entityplayer.position()); + public void awardUsedRecipesAndPopExperience(EntityPlayer entityplayer, ItemStack itemstack, int amount) { // CraftBukkit -+ List> list = this.getRecipesToAwardAndPopExperience(entityplayer.getLevel(), entityplayer.position(), this.worldPosition, entityplayer, itemstack, amount); // CraftBukkit ++ List> list = this.getRecipesToAwardAndPopExperience(entityplayer.serverLevel(), entityplayer.position(), this.worldPosition, entityplayer, itemstack, amount); // CraftBukkit entityplayer.awardRecipes(list); - this.recipesUsed.clear(); + Iterator iterator = list.iterator(); +@@ -511,6 +609,12 @@ } public List> getRecipesToAwardAndPopExperience(WorldServer worldserver, Vec3D vec3d) { @@ -206,7 +207,7 @@ List> list = Lists.newArrayList(); ObjectIterator objectiterator = this.recipesUsed.object2IntEntrySet().iterator(); -@@ -509,14 +613,14 @@ +@@ -519,14 +623,14 @@ worldserver.getRecipeManager().byKey((MinecraftKey) entry.getKey()).ifPresent((irecipe) -> { list.add(irecipe); @@ -223,7 +224,7 @@ int j = MathHelper.floor((float) i * f); float f1 = MathHelper.frac((float) i * f); -@@ -524,6 +628,17 @@ +@@ -534,6 +638,17 @@ ++j; } diff --git a/paper-server/nms-patches/net/minecraft/world/level/block/entity/TileEntityHopper.patch b/paper-server/nms-patches/net/minecraft/world/level/block/entity/TileEntityHopper.patch index f6c7f252df..3f8467ca71 100644 --- a/paper-server/nms-patches/net/minecraft/world/level/block/entity/TileEntityHopper.patch +++ b/paper-server/nms-patches/net/minecraft/world/level/block/entity/TileEntityHopper.patch @@ -151,7 +151,7 @@ boolean flag = false; + // CraftBukkit start + InventoryPickupItemEvent event = new InventoryPickupItemEvent(iinventory.getOwner().getInventory(), (org.bukkit.entity.Item) entityitem.getBukkitEntity()); -+ entityitem.level.getCraftServer().getPluginManager().callEvent(event); ++ entityitem.level().getCraftServer().getPluginManager().callEvent(event); + if (event.isCancelled()) { + return false; + } diff --git a/paper-server/nms-patches/net/minecraft/world/level/block/entity/TileEntityJukeBox.patch b/paper-server/nms-patches/net/minecraft/world/level/block/entity/TileEntityJukeBox.patch index a31d7eb84e..d5579c1826 100644 --- a/paper-server/nms-patches/net/minecraft/world/level/block/entity/TileEntityJukeBox.patch +++ b/paper-server/nms-patches/net/minecraft/world/level/block/entity/TileEntityJukeBox.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/level/block/entity/TileEntityJukeBox.java +++ b/net/minecraft/world/level/block/entity/TileEntityJukeBox.java -@@ -24,14 +24,57 @@ +@@ -24,6 +24,13 @@ import net.minecraft.world.phys.Vec3D; import net.minecraft.world.ticks.ContainerSingleItem; @@ -14,14 +14,10 @@ public class TileEntityJukeBox extends TileEntity implements Clearable, ContainerSingleItem { private static final int SONG_END_PADDING = 20; - private final NonNullList items; - private int ticksSinceLastEvent; -- private long tickCount; -- private long recordStartedTick; -- private boolean isPlaying; -+ public long tickCount; -+ public long recordStartedTick; -+ public boolean isPlaying; +@@ -32,6 +39,42 @@ + public long tickCount; + public long recordStartedTick; + public boolean isPlaying; + // CraftBukkit start - add fields and methods + public List transaction = new java.util.ArrayList(); + private int maxStack = MAX_STACK; diff --git a/paper-server/nms-patches/net/minecraft/world/level/block/entity/TileEntitySign.patch b/paper-server/nms-patches/net/minecraft/world/level/block/entity/TileEntitySign.patch index 92ce5bb09e..a0c04cccfd 100644 --- a/paper-server/nms-patches/net/minecraft/world/level/block/entity/TileEntitySign.patch +++ b/paper-server/nms-patches/net/minecraft/world/level/block/entity/TileEntitySign.patch @@ -1,67 +1,81 @@ --- a/net/minecraft/world/level/block/entity/TileEntitySign.java +++ b/net/minecraft/world/level/block/entity/TileEntitySign.java -@@ -25,7 +25,7 @@ - import net.minecraft.world.phys.Vec2F; +@@ -31,7 +31,17 @@ import net.minecraft.world.phys.Vec3D; + import org.slf4j.Logger; -public class TileEntitySign extends TileEntity { ++// CraftBukkit start ++import net.minecraft.EnumChatFormat; ++import net.minecraft.nbt.NBTBase; ++import net.minecraft.server.level.EntityPlayer; ++import org.bukkit.craftbukkit.block.CraftBlock; ++import org.bukkit.craftbukkit.util.CraftChatMessage; ++import org.bukkit.entity.Player; ++import org.bukkit.event.block.SignChangeEvent; ++// CraftBukkit end ++ +public class TileEntitySign extends TileEntity implements ICommandListener { // CraftBukkit - implements - public static final int LINES = 4; + private static final Logger LOGGER = LogUtils.getLogger(); private static final int MAX_TEXT_LINE_WIDTH = 90; -@@ -83,6 +83,12 @@ - } - } +@@ -100,7 +110,7 @@ + @Override + protected void saveAdditional(NBTTagCompound nbttagcompound) { + super.saveAdditional(nbttagcompound); +- DataResult dataresult = SignText.DIRECT_CODEC.encodeStart(DynamicOpsNBT.INSTANCE, this.frontText); ++ DataResult dataresult = SignText.DIRECT_CODEC.encodeStart(DynamicOpsNBT.INSTANCE, this.frontText); // CraftBukkit - decompile error + Logger logger = TileEntitySign.LOGGER; -+ // CraftBukkit start -+ if (Boolean.getBoolean("convertLegacySigns")) { -+ nbttagcompound.putBoolean("Bukkit.isConverted", true); -+ } -+ // CraftBukkit end -+ - nbttagcompound.putString("Color", this.color.getName()); - nbttagcompound.putBoolean("GlowingText", this.hasGlowingText); - } -@@ -93,8 +99,24 @@ + Objects.requireNonNull(logger); +@@ -119,7 +129,7 @@ + @Override + public void load(NBTTagCompound nbttagcompound) { super.load(nbttagcompound); - this.color = EnumColor.byName(nbttagcompound.getString("Color"), EnumColor.BLACK); +- DataResult dataresult; ++ DataResult dataresult; // CraftBukkit - decompile error + Logger logger; -+ // 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"); -+ // CraftBukkit end -+ - for (int i = 0; i < 4; ++i) { - String s = nbttagcompound.getString(TileEntitySign.RAW_TEXT_FIELD_NAMES[i]); -+ // CraftBukkit start -+ if (s != null && s.length() > 2048) { -+ s = "\"\""; -+ } -+ -+ if (oldSign) { -+ messages[i] = org.bukkit.craftbukkit.util.CraftChatMessage.fromString(s)[0]; -+ continue; -+ } -+ // CraftBukkit end - IChatBaseComponent ichatbasecomponent = this.loadLine(s); - - this.messages[i] = ichatbasecomponent; -@@ -132,6 +154,10 @@ - if (ichatmutablecomponent != null) { - return ichatmutablecomponent; - } -+ // CraftBukkit start -+ } catch (com.google.gson.JsonParseException jsonparseexception) { -+ return IChatBaseComponent.empty(); -+ // CraftBukkit end - } catch (Exception exception) { - ; + if (nbttagcompound.contains("front_text")) { +@@ -179,6 +189,7 @@ + this.level.sendBlockUpdated(this.getBlockPos(), this.getBlockState(), this.getBlockState(), 3); + } else { + TileEntitySign.LOGGER.warn("Player {} just tried to change non-editable sign", entityhuman.getName().getString()); ++ ((EntityPlayer) entityhuman).connection.send(this.getUpdatePacket()); // CraftBukkit } -@@ -240,11 +266,37 @@ - return true; } +@@ -198,6 +209,25 @@ + } else { + signtext = signtext.setMessage(i, IChatBaseComponent.literal(filteredtext.raw()).setStyle(chatmodifier), IChatBaseComponent.literal(filteredtext.filteredOrEmpty()).setStyle(chatmodifier)); + } ++ ++ // CraftBukkit start ++ Player player = ((EntityPlayer) entityhuman).getBukkitEntity(); ++ String[] lines = new String[4]; ++ ++ for (int j = 0; j < list.size(); ++j) { ++ lines[j] = CraftChatMessage.fromComponent(signtext.getMessage(j, entityhuman.isTextFilteringEnabled())); ++ } ++ ++ SignChangeEvent event = new SignChangeEvent(CraftBlock.at(this.level, this.worldPosition), player, lines); ++ entityhuman.level().getCraftServer().getPluginManager().callEvent(event); ++ ++ if (!event.isCancelled()) { ++ IChatBaseComponent[] components = org.bukkit.craftbukkit.block.CraftSign.sanitizeLines(event.getLines()); ++ for (int j = 0; j < components.length; j++) { ++ signtext = signtext.setMessage(j, components[j]); ++ } ++ } ++ // CraftBukkit end + } + + return signtext; +@@ -250,11 +280,37 @@ + return flag1; + } + +- private static CommandListenerWrapper createCommandSourceStack(@Nullable EntityHuman entityhuman, World world, BlockPosition blockposition) { + // CraftBukkit start + @Override + public void sendSystemMessage(IChatBaseComponent ichatbasecomponent) {} @@ -85,23 +99,24 @@ + public boolean shouldInformAdmins() { + return false; + } -+ // CraftBukkit end + - public CommandListenerWrapper createCommandSourceStack(@Nullable EntityPlayer entityplayer) { - String s = entityplayer == null ? "Sign" : entityplayer.getName().getString(); - Object object = entityplayer == null ? IChatBaseComponent.literal("Sign") : entityplayer.getDisplayName(); ++ private CommandListenerWrapper createCommandSourceStack(@Nullable EntityHuman entityhuman, World world, BlockPosition blockposition) { ++ // CraftBukkit end + String s = entityhuman == null ? "Sign" : entityhuman.getName().getString(); + Object object = entityhuman == null ? IChatBaseComponent.literal("Sign") : entityhuman.getDisplayName(); -- return new CommandListenerWrapper(ICommandListener.NULL, Vec3D.atCenterOf(this.worldPosition), Vec2F.ZERO, (WorldServer) this.level, 2, s, (IChatBaseComponent) object, this.level.getServer(), entityplayer); +- return new CommandListenerWrapper(ICommandListener.NULL, Vec3D.atCenterOf(blockposition), Vec2F.ZERO, (WorldServer) world, 2, s, (IChatBaseComponent) object, world.getServer(), entityhuman); + // CraftBukkit - this -+ return new CommandListenerWrapper(this, Vec3D.atCenterOf(this.worldPosition), Vec2F.ZERO, (WorldServer) this.level, 2, s, (IChatBaseComponent) object, this.level.getServer(), entityplayer); ++ return new CommandListenerWrapper(this, Vec3D.atCenterOf(blockposition), Vec2F.ZERO, (WorldServer) world, 2, s, (IChatBaseComponent) object, world.getServer(), entityhuman); } - public EnumColor getColor() { -@@ -277,6 +329,6 @@ + @Override +@@ -283,7 +339,7 @@ private void markUpdated() { this.setChanged(); - this.level.sendBlockUpdated(this.getBlockPos(), this.getBlockState(), this.getBlockState(), 3); + if (this.level != null) this.level.sendBlockUpdated(this.getBlockPos(), this.getBlockState(), this.getBlockState(), 3); // CraftBukkit - skip notify if world is null (SPIGOT-5122) } - } + + public boolean isWaxed() { diff --git a/paper-server/nms-patches/net/minecraft/world/level/block/piston/BlockPiston.patch b/paper-server/nms-patches/net/minecraft/world/level/block/piston/BlockPiston.patch index dbe75e8377..76375ba234 100644 --- a/paper-server/nms-patches/net/minecraft/world/level/block/piston/BlockPiston.patch +++ b/paper-server/nms-patches/net/minecraft/world/level/block/piston/BlockPiston.patch @@ -34,7 +34,7 @@ world.blockEvent(blockposition, this, b0, enumdirection.get3DDataValue()); } -@@ -316,6 +336,48 @@ +@@ -317,6 +337,48 @@ IBlockData[] aiblockdata = new IBlockData[list.size() + list2.size()]; EnumDirection enumdirection1 = flag ? enumdirection : enumdirection.getOpposite(); int j = 0; diff --git a/paper-server/nms-patches/net/minecraft/world/level/chunk/Chunk.patch b/paper-server/nms-patches/net/minecraft/world/level/chunk/Chunk.patch index c6a1c246e8..a09e16522b 100644 --- a/paper-server/nms-patches/net/minecraft/world/level/chunk/Chunk.patch +++ b/paper-server/nms-patches/net/minecraft/world/level/chunk/Chunk.patch @@ -1,24 +1,24 @@ --- a/net/minecraft/world/level/chunk/Chunk.java +++ b/net/minecraft/world/level/chunk/Chunk.java -@@ -77,7 +77,7 @@ +@@ -75,7 +75,7 @@ + }; private final Map tickersInLevel; public boolean loaded; - private boolean clientLightReady; - public final World level; + public final WorldServer level; // CraftBukkit - type @Nullable - private Supplier fullStatus; + private Supplier fullStatus; @Nullable -@@ -94,7 +94,7 @@ +@@ -91,7 +91,7 @@ + public Chunk(World world, ChunkCoordIntPair chunkcoordintpair, ChunkConverter chunkconverter, LevelChunkTicks levelchunkticks, LevelChunkTicks levelchunkticks1, long i, @Nullable ChunkSection[] achunksection, @Nullable Chunk.c chunk_c, @Nullable BlendingData blendingdata) { super(chunkcoordintpair, chunkconverter, world, world.registryAccess().registryOrThrow(Registries.BIOME), i, achunksection, blendingdata); this.tickersInLevel = Maps.newHashMap(); - this.clientLightReady = false; - this.level = world; + this.level = (WorldServer) world; // CraftBukkit - type this.gameEventListenerRegistrySections = new Int2ObjectOpenHashMap(); HeightMap.Type[] aheightmap_type = HeightMap.Type.values(); int j = aheightmap_type.length; -@@ -112,6 +112,11 @@ +@@ -109,6 +109,11 @@ this.fluidTicks = levelchunkticks1; } @@ -30,8 +30,8 @@ public Chunk(WorldServer worldserver, ProtoChunk protochunk, @Nullable Chunk.c chunk_c) { this(worldserver, protochunk.getPos(), protochunk.getUpgradeData(), protochunk.unpackBlockTicks(), protochunk.unpackFluidTicks(), protochunk.getInhabitedTime(), protochunk.getSections(), chunk_c, protochunk.getBlendingData()); Iterator iterator = protochunk.getBlockEntities().values().iterator(); -@@ -142,6 +147,10 @@ - +@@ -140,6 +145,10 @@ + this.skyLightSources = protochunk.skyLightSources; this.setLightCorrect(protochunk.isLightCorrect()); this.unsaved = true; + this.needsDecoration = true; // CraftBukkit @@ -41,7 +41,7 @@ } @Override -@@ -246,9 +255,16 @@ +@@ -244,9 +253,16 @@ } } @@ -58,7 +58,7 @@ int i = blockposition.getY(); ChunkSection chunksection = this.getSection(this.getSectionIndex(i)); boolean flag1 = chunksection.hasOnlyAir(); -@@ -287,7 +303,8 @@ +@@ -295,7 +311,8 @@ if (!chunksection.getBlockState(j, k, l).is(block)) { return null; } else { @@ -68,7 +68,7 @@ iblockdata.onPlace(this.level, blockposition, iblockdata1, flag); } -@@ -332,7 +349,12 @@ +@@ -340,7 +357,12 @@ @Nullable public TileEntity getBlockEntity(BlockPosition blockposition, Chunk.EnumTileEntityState chunk_enumtileentitystate) { @@ -82,7 +82,7 @@ if (tileentity == null) { NBTTagCompound nbttagcompound = (NBTTagCompound) this.pendingBlockEntities.remove(blockposition); -@@ -410,6 +432,13 @@ +@@ -418,6 +440,13 @@ tileentity1.setRemoved(); } @@ -96,7 +96,7 @@ } } -@@ -439,6 +468,12 @@ +@@ -447,6 +476,12 @@ if (this.isInLevel()) { TileEntity tileentity = (TileEntity) this.blockEntities.remove(blockposition); @@ -109,7 +109,7 @@ if (tileentity != null) { World world = this.level; -@@ -491,6 +526,57 @@ +@@ -500,6 +535,57 @@ } @@ -167,7 +167,7 @@ public boolean isEmpty() { return false; } -@@ -694,7 +780,7 @@ +@@ -697,7 +783,7 @@ private void updateBlockEntityTicker(T t0) { IBlockData iblockdata = t0.getBlockState(); @@ -176,7 +176,7 @@ if (blockentityticker == null) { this.removeBlockEntityTicker(t0.getBlockPos()); -@@ -787,7 +873,7 @@ +@@ -782,7 +868,7 @@ private boolean loggedInvalidBlockState; a(TileEntity tileentity, BlockEntityTicker blockentityticker) { diff --git a/paper-server/nms-patches/net/minecraft/world/level/chunk/ChunkSection.patch b/paper-server/nms-patches/net/minecraft/world/level/chunk/ChunkSection.patch index 6edbdac25e..2978daa498 100644 --- a/paper-server/nms-patches/net/minecraft/world/level/chunk/ChunkSection.patch +++ b/paper-server/nms-patches/net/minecraft/world/level/chunk/ChunkSection.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/level/chunk/ChunkSection.java +++ b/net/minecraft/world/level/chunk/ChunkSection.java -@@ -25,9 +25,11 @@ +@@ -23,9 +23,11 @@ private short tickingBlockCount; private short tickingFluidCount; private final DataPaletteBlock states; @@ -8,13 +8,13 @@ + // CraftBukkit start - read/write + private DataPaletteBlock> biomes; -- public ChunkSection(int i, DataPaletteBlock datapaletteblock, PalettedContainerRO> palettedcontainerro) { -+ public ChunkSection(int i, DataPaletteBlock datapaletteblock, DataPaletteBlock> palettedcontainerro) { +- public ChunkSection(DataPaletteBlock datapaletteblock, PalettedContainerRO> palettedcontainerro) { ++ public ChunkSection(DataPaletteBlock datapaletteblock, DataPaletteBlock> palettedcontainerro) { + // CraftBukkit end - this.bottomBlockY = getBottomBlockY(i); this.states = datapaletteblock; this.biomes = palettedcontainerro; -@@ -200,6 +202,12 @@ + this.recalcBlockCounts(); +@@ -188,6 +190,12 @@ return (Holder) this.biomes.get(i, j, k); } @@ -24,6 +24,6 @@ + } + // CraftBukkit end + - public void fillBiomesFromNoise(BiomeResolver biomeresolver, Climate.Sampler climate_sampler, int i, int j) { + public void fillBiomesFromNoise(BiomeResolver biomeresolver, Climate.Sampler climate_sampler, int i, int j, int k) { DataPaletteBlock> datapaletteblock = this.biomes.recreate(); - int k = QuartPos.fromBlock(this.bottomBlockY()); + boolean flag = true; diff --git a/paper-server/nms-patches/net/minecraft/world/level/chunk/ChunkStatus.patch b/paper-server/nms-patches/net/minecraft/world/level/chunk/ChunkStatus.patch index 90d9833959..b06192ac5d 100644 --- a/paper-server/nms-patches/net/minecraft/world/level/chunk/ChunkStatus.patch +++ b/paper-server/nms-patches/net/minecraft/world/level/chunk/ChunkStatus.patch @@ -1,11 +1,11 @@ --- a/net/minecraft/world/level/chunk/ChunkStatus.java +++ b/net/minecraft/world/level/chunk/ChunkStatus.java -@@ -48,7 +48,7 @@ +@@ -39,7 +39,7 @@ + public static final ChunkStatus EMPTY = registerSimple("empty", (ChunkStatus) null, -1, ChunkStatus.PRE_FEATURES, ChunkStatus.Type.PROTOCHUNK, (chunkstatus, worldserver, chunkgenerator, list, ichunkaccess) -> { }); - public static final ChunkStatus STRUCTURE_STARTS = register("structure_starts", ChunkStatus.EMPTY, 0, ChunkStatus.PRE_FEATURES, ChunkStatus.Type.PROTOCHUNK, (chunkstatus, executor, worldserver, chunkgenerator, structuretemplatemanager, lightenginethreaded, function, list, ichunkaccess, flag) -> { - if (!ichunkaccess.getStatus().isOrAfter(chunkstatus)) { -- if (worldserver.getServer().getWorldData().worldGenOptions().generateStructures()) { -+ if (worldserver.serverLevelData.worldGenOptions().generateStructures()) { // CraftBukkit - chunkgenerator.createStructures(worldserver.registryAccess(), worldserver.getChunkSource().getGeneratorState(), worldserver.structureManager(), ichunkaccess, structuretemplatemanager); - } + public static final ChunkStatus STRUCTURE_STARTS = register("structure_starts", ChunkStatus.EMPTY, 0, false, ChunkStatus.PRE_FEATURES, ChunkStatus.Type.PROTOCHUNK, (chunkstatus, executor, worldserver, chunkgenerator, structuretemplatemanager, lightenginethreaded, function, list, ichunkaccess) -> { +- if (worldserver.getServer().getWorldData().worldGenOptions().generateStructures()) { ++ if (worldserver.serverLevelData.worldGenOptions().generateStructures()) { // CraftBukkit + chunkgenerator.createStructures(worldserver.registryAccess(), worldserver.getChunkSource().getGeneratorState(), worldserver.structureManager(), ichunkaccess, structuretemplatemanager); + } diff --git a/paper-server/nms-patches/net/minecraft/world/level/chunk/IChunkAccess.patch b/paper-server/nms-patches/net/minecraft/world/level/chunk/IChunkAccess.patch index 1e906d3ee9..ef98585d46 100644 --- a/paper-server/nms-patches/net/minecraft/world/level/chunk/IChunkAccess.patch +++ b/paper-server/nms-patches/net/minecraft/world/level/chunk/IChunkAccess.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/level/chunk/IChunkAccess.java +++ b/net/minecraft/world/level/chunk/IChunkAccess.java -@@ -77,6 +77,11 @@ +@@ -82,6 +82,11 @@ protected final LevelHeightAccessor levelHeightAccessor; protected final ChunkSection[] sections; @@ -12,19 +12,19 @@ public IChunkAccess(ChunkCoordIntPair chunkcoordintpair, ChunkConverter chunkconverter, LevelHeightAccessor levelheightaccessor, IRegistry iregistry, long i, @Nullable ChunkSection[] achunksection, @Nullable BlendingData blendingdata) { this.chunkPos = chunkcoordintpair; this.upgradeData = chunkconverter; -@@ -94,7 +99,11 @@ +@@ -100,7 +105,11 @@ } - replaceMissingSections(levelheightaccessor, iregistry, this.sections); + replaceMissingSections(iregistry, this.sections); + // CraftBukkit start + this.biomeRegistry = iregistry; } + public final IRegistry biomeRegistry; + // CraftBukkit end - private static void replaceMissingSections(LevelHeightAccessor levelheightaccessor, IRegistry iregistry, ChunkSection[] achunksection) { + private static void replaceMissingSections(IRegistry iregistry, ChunkSection[] achunksection) { for (int i = 0; i < achunksection.length; ++i) { -@@ -256,10 +265,11 @@ +@@ -263,10 +272,11 @@ public void setUnsaved(boolean flag) { this.unsaved = flag; @@ -37,7 +37,7 @@ } public abstract ChunkStatus getStatus(); -@@ -392,6 +402,27 @@ +@@ -442,6 +452,27 @@ } } diff --git a/paper-server/nms-patches/net/minecraft/world/level/chunk/NibbleArray.patch b/paper-server/nms-patches/net/minecraft/world/level/chunk/NibbleArray.patch index f72b7918a8..48ffdb3140 100644 --- a/paper-server/nms-patches/net/minecraft/world/level/chunk/NibbleArray.patch +++ b/paper-server/nms-patches/net/minecraft/world/level/chunk/NibbleArray.patch @@ -4,4 +4,4 @@ +// mc-dev import package net.minecraft.world.level.chunk; - import javax.annotation.Nullable; + import java.util.Arrays; diff --git a/paper-server/nms-patches/net/minecraft/world/level/chunk/storage/ChunkRegionLoader.patch b/paper-server/nms-patches/net/minecraft/world/level/chunk/storage/ChunkRegionLoader.patch index 1ba1576bf2..4f2cd8bb05 100644 --- a/paper-server/nms-patches/net/minecraft/world/level/chunk/storage/ChunkRegionLoader.patch +++ b/paper-server/nms-patches/net/minecraft/world/level/chunk/storage/ChunkRegionLoader.patch @@ -2,7 +2,7 @@ +++ b/net/minecraft/world/level/chunk/storage/ChunkRegionLoader.java @@ -102,7 +102,7 @@ ChunkProviderServer chunkproviderserver = worldserver.getChunkSource(); - LightEngine lightengine = chunkproviderserver.getLightEngine(); + LevelLightEngine levellightengine = chunkproviderserver.getLightEngine(); IRegistry iregistry = worldserver.registryAccess().registryOrThrow(Registries.BIOME); - Codec>> codec = makeBiomeCodec(iregistry); + Codec>> codec = makeBiomeCodecRW(iregistry); // CraftBukkit - read/write @@ -34,12 +34,12 @@ object = new DataPaletteBlock<>(iregistry.asHolderIdMap(), iregistry.getHolderOrThrow(Biomes.PLAINS), DataPaletteBlock.d.SECTION_BIOMES); } -- ChunkSection chunksection = new ChunkSection(b0, datapaletteblock, (PalettedContainerRO) object); -+ ChunkSection chunksection = new ChunkSection(b0, datapaletteblock, (DataPaletteBlock) object); // CraftBukkit - read/write +- ChunkSection chunksection = new ChunkSection(datapaletteblock, (PalettedContainerRO) object); ++ ChunkSection chunksection = new ChunkSection(datapaletteblock, (DataPaletteBlock) object); // CraftBukkit - read/write achunksection[k] = chunksection; - villageplace.checkConsistencyWithBlocks(chunkcoordintpair, chunksection); -@@ -174,7 +174,7 @@ + SectionPosition sectionposition = SectionPosition.of(chunkcoordintpair, b0); +@@ -176,7 +176,7 @@ dataresult = BlendingData.CODEC.parse(new Dynamic(DynamicOpsNBT.INSTANCE, nbttagcompound.getCompound("blending_data"))); logger1 = ChunkRegionLoader.LOGGER; Objects.requireNonNull(logger1); @@ -48,7 +48,7 @@ } else { blendingdata = null; } -@@ -205,7 +205,7 @@ +@@ -207,7 +207,7 @@ dataresult = BelowZeroRetrogen.CODEC.parse(new Dynamic(DynamicOpsNBT.INSTANCE, nbttagcompound.getCompound("below_zero_retrogen"))); logger1 = ChunkRegionLoader.LOGGER; Objects.requireNonNull(logger1); @@ -57,7 +57,7 @@ Objects.requireNonNull(protochunk); optional.ifPresent(protochunk::setBelowZeroRetrogen); -@@ -234,6 +234,13 @@ +@@ -221,6 +221,13 @@ } } @@ -71,7 +71,7 @@ ((IChunkAccess) object1).setLightCorrect(flag); NBTTagCompound nbttagcompound2 = nbttagcompound.getCompound("Heightmaps"); EnumSet enumset = EnumSet.noneOf(HeightMap.Type.class); -@@ -328,6 +335,12 @@ +@@ -300,6 +307,12 @@ return DataPaletteBlock.codecRO(iregistry.asHolderIdMap(), iregistry.holderByNameCodec(), DataPaletteBlock.d.SECTION_BIOMES, iregistry.getHolderOrThrow(Biomes.PLAINS)); } @@ -84,16 +84,16 @@ public static NBTTagCompound write(WorldServer worldserver, IChunkAccess ichunkaccess) { ChunkCoordIntPair chunkcoordintpair = ichunkaccess.getPos(); NBTTagCompound nbttagcompound = GameProfileSerializer.addCurrentDataVersion(new NBTTagCompound()); -@@ -339,7 +352,7 @@ +@@ -311,7 +324,7 @@ nbttagcompound.putLong("InhabitedTime", ichunkaccess.getInhabitedTime()); - nbttagcompound.putString("Status", ichunkaccess.getStatus().getName()); + nbttagcompound.putString("Status", BuiltInRegistries.CHUNK_STATUS.getKey(ichunkaccess.getStatus()).toString()); BlendingData blendingdata = ichunkaccess.getBlendingData(); - DataResult dataresult; + DataResult dataresult; // CraftBukkit - decompile error Logger logger; if (blendingdata != null) { -@@ -386,7 +399,7 @@ +@@ -358,7 +371,7 @@ if (flag1) { ChunkSection chunksection = achunksection[j]; @@ -102,7 +102,7 @@ Logger logger1 = ChunkRegionLoader.LOGGER; Objects.requireNonNull(logger1); -@@ -470,6 +483,11 @@ +@@ -441,6 +454,11 @@ nbttagcompound.put("Heightmaps", nbttagcompound3); nbttagcompound.put("structures", packStructureData(StructurePieceSerializationContext.fromLevel(worldserver), chunkcoordintpair, ichunkaccess.getAllStarts(), ichunkaccess.getAllReferences())); diff --git a/paper-server/nms-patches/net/minecraft/world/level/gameevent/vibrations/VibrationListener.patch b/paper-server/nms-patches/net/minecraft/world/level/gameevent/vibrations/VibrationListener.patch deleted file mode 100644 index 8fe15813c2..0000000000 --- a/paper-server/nms-patches/net/minecraft/world/level/gameevent/vibrations/VibrationListener.patch +++ /dev/null @@ -1,51 +0,0 @@ ---- a/net/minecraft/world/level/gameevent/vibrations/VibrationListener.java -+++ b/net/minecraft/world/level/gameevent/vibrations/VibrationListener.java -@@ -29,6 +29,13 @@ - import net.minecraft.world.phys.MovingObjectPosition; - import net.minecraft.world.phys.Vec3D; - -+// CraftBukkit start -+import net.minecraft.core.registries.BuiltInRegistries; -+import org.bukkit.craftbukkit.block.CraftBlock; -+import org.bukkit.craftbukkit.util.CraftNamespacedKey; -+import org.bukkit.event.block.BlockReceiveGameEvent; -+// CraftBukkit end -+ - public class VibrationListener implements GameEventListener { - - @VisibleForTesting -@@ -98,7 +105,7 @@ - }), ExtraCodecs.NON_NEGATIVE_INT.fieldOf("event_delay").orElse(0).forGetter((vibrationlistener) -> { - return vibrationlistener.travelTimeInTicks; - })).apply(instance, (positionsource, integer, optional, vibrationselector, integer1) -> { -- return new VibrationListener(positionsource, integer, vibrationlistener_a, (VibrationInfo) optional.orElse((Object) null), vibrationselector, integer1); -+ return new VibrationListener(positionsource, integer, vibrationlistener_a, (VibrationInfo) optional.orElse(null), vibrationselector, integer1); // CraftBukkit - decompile error - }); - }); - } -@@ -140,7 +147,8 @@ - --this.travelTimeInTicks; - if (this.travelTimeInTicks <= 0) { - this.travelTimeInTicks = 0; -- this.config.onSignalReceive(worldserver, this, BlockPosition.containing(this.currentVibration.pos()), this.currentVibration.gameEvent(), (Entity) this.currentVibration.getEntity(worldserver).orElse((Object) null), (Entity) this.currentVibration.getProjectileOwner(worldserver).orElse((Object) null), this.currentVibration.distance()); -+ // CraftBukkit - decompile error -+ this.config.onSignalReceive(worldserver, this, BlockPosition.containing(this.currentVibration.pos()), this.currentVibration.gameEvent(), (Entity) this.currentVibration.getEntity(worldserver).orElse(null), (Entity) this.currentVibration.getProjectileOwner(worldserver).orElse(null), this.currentVibration.distance()); - this.currentVibration = null; - } - } -@@ -172,7 +180,14 @@ - } else { - Vec3D vec3d1 = (Vec3D) optional.get(); - -- if (!this.config.shouldListen(worldserver, this, BlockPosition.containing(vec3d), gameevent, gameevent_a)) { -+ // CraftBukkit start -+ boolean defaultCancel = !this.config.shouldListen(worldserver, this, BlockPosition.containing(vec3d), gameevent, gameevent_a); -+ Entity entity = gameevent_a.sourceEntity(); -+ BlockReceiveGameEvent event = new BlockReceiveGameEvent(org.bukkit.GameEvent.getByKey(CraftNamespacedKey.fromMinecraft(BuiltInRegistries.GAME_EVENT.getKey(gameevent))), CraftBlock.at(worldserver, BlockPosition.containing(vec3d1)), (entity == null) ? null : entity.getBukkitEntity()); -+ event.setCancelled(defaultCancel); -+ worldserver.getCraftServer().getPluginManager().callEvent(event); -+ if (event.isCancelled()) { -+ // CraftBukkit end - return false; - } else if (isOccluded(worldserver, vec3d, vec3d1)) { - return false; diff --git a/paper-server/nms-patches/net/minecraft/world/level/gameevent/vibrations/VibrationSystem.patch b/paper-server/nms-patches/net/minecraft/world/level/gameevent/vibrations/VibrationSystem.patch new file mode 100644 index 0000000000..82732f57cb --- /dev/null +++ b/paper-server/nms-patches/net/minecraft/world/level/gameevent/vibrations/VibrationSystem.patch @@ -0,0 +1,52 @@ +--- a/net/minecraft/world/level/gameevent/vibrations/VibrationSystem.java ++++ b/net/minecraft/world/level/gameevent/vibrations/VibrationSystem.java +@@ -29,6 +29,13 @@ + import net.minecraft.world.phys.MovingObjectPosition; + import net.minecraft.world.phys.Vec3D; + ++// CraftBukkit start ++import net.minecraft.core.registries.BuiltInRegistries; ++import org.bukkit.craftbukkit.block.CraftBlock; ++import org.bukkit.craftbukkit.util.CraftNamespacedKey; ++import org.bukkit.event.block.BlockReceiveGameEvent; ++// CraftBukkit end ++ + public interface VibrationSystem { + + GameEvent[] RESONANCE_EVENTS = new GameEvent[]{GameEvent.RESONATE_1, GameEvent.RESONATE_2, GameEvent.RESONATE_3, GameEvent.RESONATE_4, GameEvent.RESONATE_5, GameEvent.RESONATE_6, GameEvent.RESONATE_7, GameEvent.RESONATE_8, GameEvent.RESONATE_9, GameEvent.RESONATE_10, GameEvent.RESONATE_11, GameEvent.RESONATE_12, GameEvent.RESONATE_13, GameEvent.RESONATE_14, GameEvent.RESONATE_15}; +@@ -228,7 +235,8 @@ + if (vibrationsystem_d.requiresAdjacentChunksToBeTicking() && !areAdjacentChunksTicking(worldserver, blockposition1)) { + return false; + } else { +- vibrationsystem_d.onReceiveVibration(worldserver, blockposition, vibrationinfo.gameEvent(), (Entity) vibrationinfo.getEntity(worldserver).orElse((Object) null), (Entity) vibrationinfo.getProjectileOwner(worldserver).orElse((Object) null), VibrationSystem.b.distanceBetweenInBlocks(blockposition, blockposition1)); ++ // CraftBukkit - decompile error ++ vibrationsystem_d.onReceiveVibration(worldserver, blockposition, vibrationinfo.gameEvent(), (Entity) vibrationinfo.getEntity(worldserver).orElse(null), (Entity) vibrationinfo.getProjectileOwner(worldserver).orElse(null), VibrationSystem.b.distanceBetweenInBlocks(blockposition, blockposition1)); + vibrationsystem_a.setCurrentVibration((VibrationInfo) null); + return true; + } +@@ -285,8 +293,14 @@ + return false; + } else { + Vec3D vec3d1 = (Vec3D) optional.get(); +- +- if (!vibrationsystem_d.canReceiveVibration(worldserver, BlockPosition.containing(vec3d), gameevent, gameevent_a)) { ++ // CraftBukkit start ++ boolean defaultCancel = !vibrationsystem_d.canReceiveVibration(worldserver, BlockPosition.containing(vec3d), gameevent, gameevent_a); ++ Entity entity = gameevent_a.sourceEntity(); ++ BlockReceiveGameEvent event = new BlockReceiveGameEvent(org.bukkit.GameEvent.getByKey(CraftNamespacedKey.fromMinecraft(BuiltInRegistries.GAME_EVENT.getKey(gameevent))), CraftBlock.at(worldserver, BlockPosition.containing(vec3d1)), (entity == null) ? null : entity.getBukkitEntity()); ++ event.setCancelled(defaultCancel); ++ worldserver.getCraftServer().getPluginManager().callEvent(event); ++ if (event.isCancelled()) { ++ // CraftBukkit end + return false; + } else if (isOccluded(worldserver, vec3d, vec3d1)) { + return false; +@@ -339,7 +353,7 @@ + return instance.group(VibrationInfo.CODEC.optionalFieldOf("event").forGetter((vibrationsystem_a) -> { + return Optional.ofNullable(vibrationsystem_a.currentVibration); + }), VibrationSelector.CODEC.fieldOf("selector").forGetter(VibrationSystem.a::getSelectionStrategy), ExtraCodecs.NON_NEGATIVE_INT.fieldOf("event_delay").orElse(0).forGetter(VibrationSystem.a::getTravelTimeInTicks)).apply(instance, (optional, vibrationselector, integer) -> { +- return new VibrationSystem.a((VibrationInfo) optional.orElse((Object) null), vibrationselector, integer, true); ++ return new VibrationSystem.a((VibrationInfo) optional.orElse(null), vibrationselector, integer, true); // CraftBukkit - decompile error + }); + }); + public static final String NBT_TAG_KEY = "listener"; diff --git a/paper-server/nms-patches/net/minecraft/world/level/levelgen/MobSpawnerPhantom.patch b/paper-server/nms-patches/net/minecraft/world/level/levelgen/MobSpawnerPhantom.patch index 9fd5c56786..dd29749c1a 100644 --- a/paper-server/nms-patches/net/minecraft/world/level/levelgen/MobSpawnerPhantom.patch +++ b/paper-server/nms-patches/net/minecraft/world/level/levelgen/MobSpawnerPhantom.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/level/levelgen/MobSpawnerPhantom.java +++ b/net/minecraft/world/level/levelgen/MobSpawnerPhantom.java -@@ -76,7 +76,7 @@ +@@ -75,7 +75,7 @@ if (entityphantom != null) { entityphantom.moveTo(blockposition1, 0.0F, 0.0F); groupdataentity = entityphantom.finalizeSpawn(worldserver, difficultydamagescaler, EnumMobSpawn.NATURAL, groupdataentity, (NBTTagCompound) null); diff --git a/paper-server/nms-patches/net/minecraft/world/level/levelgen/structure/templatesystem/DefinedStructure.patch b/paper-server/nms-patches/net/minecraft/world/level/levelgen/structure/templatesystem/DefinedStructure.patch index c056443fcb..82b39ab1e4 100644 --- a/paper-server/nms-patches/net/minecraft/world/level/levelgen/structure/templatesystem/DefinedStructure.patch +++ b/paper-server/nms-patches/net/minecraft/world/level/levelgen/structure/templatesystem/DefinedStructure.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/level/levelgen/structure/templatesystem/DefinedStructure.java +++ b/net/minecraft/world/level/levelgen/structure/templatesystem/DefinedStructure.java -@@ -51,6 +51,12 @@ +@@ -52,6 +52,12 @@ import net.minecraft.world.phys.shapes.VoxelShapeBitSet; import net.minecraft.world.phys.shapes.VoxelShapeDiscrete; @@ -13,7 +13,7 @@ public class DefinedStructure { public static final String PALETTE_TAG = "palette"; -@@ -69,6 +75,11 @@ +@@ -70,6 +76,11 @@ private BaseBlockPosition size; private String author; @@ -25,7 +25,7 @@ public DefinedStructure() { this.size = BaseBlockPosition.ZERO; this.author = "?"; -@@ -142,7 +153,7 @@ +@@ -143,7 +154,7 @@ } private static List buildInfoList(List list, List list1, List list2) { @@ -34,7 +34,7 @@ return definedstructure_blockinfo.pos.getY(); }).thenComparingInt((definedstructure_blockinfo) -> { return definedstructure_blockinfo.pos.getX(); -@@ -471,11 +482,13 @@ +@@ -472,11 +483,13 @@ } private static Optional createEntityIgnoreException(WorldAccess worldaccess, NBTTagCompound nbttagcompound) { @@ -52,7 +52,7 @@ } public BaseBlockPosition getSize(EnumBlockRotation enumblockrotation) { -@@ -689,6 +702,11 @@ +@@ -690,6 +703,11 @@ nbttagcompound.put("entities", nbttaglist3); nbttagcompound.put("size", this.newIntegerList(this.size.getX(), this.size.getY(), this.size.getZ())); @@ -64,7 +64,7 @@ return GameProfileSerializer.addCurrentDataVersion(nbttagcompound); } -@@ -728,6 +746,12 @@ +@@ -729,6 +747,12 @@ } } @@ -77,7 +77,7 @@ } private void loadPalette(HolderGetter holdergetter, NBTTagList nbttaglist, NBTTagList nbttaglist1) { -@@ -867,7 +891,7 @@ +@@ -858,7 +882,7 @@ public IBlockData stateFor(int i) { IBlockData iblockdata = (IBlockData) this.ids.byId(i); diff --git a/paper-server/nms-patches/net/minecraft/world/level/material/FluidTypeFlowing.patch b/paper-server/nms-patches/net/minecraft/world/level/material/FluidTypeFlowing.patch index e0d98830f2..c631b701e9 100644 --- a/paper-server/nms-patches/net/minecraft/world/level/material/FluidTypeFlowing.patch +++ b/paper-server/nms-patches/net/minecraft/world/level/material/FluidTypeFlowing.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/level/material/FluidTypeFlowing.java +++ b/net/minecraft/world/level/material/FluidTypeFlowing.java -@@ -30,6 +30,15 @@ +@@ -31,6 +31,15 @@ import net.minecraft.world.phys.shapes.VoxelShape; import net.minecraft.world.phys.shapes.VoxelShapes; @@ -16,7 +16,7 @@ public abstract class FluidTypeFlowing extends FluidType { public static final BlockStateBoolean FALLING = BlockProperties.FALLING; -@@ -130,6 +139,15 @@ +@@ -131,6 +140,15 @@ Fluid fluid1 = this.getNewLiquid(world, blockposition1, iblockdata1); if (this.canSpreadTo(world, blockposition, iblockdata, EnumDirection.DOWN, blockposition1, iblockdata1, world.getFluidState(blockposition1), fluid1.getType())) { @@ -32,7 +32,7 @@ this.spreadTo(world, blockposition1, iblockdata1, EnumDirection.DOWN, fluid1); if (this.sourceNeighborCount(world, blockposition) >= 3) { this.spreadToSides(world, blockposition, fluid, iblockdata); -@@ -160,6 +178,15 @@ +@@ -161,6 +179,15 @@ IBlockData iblockdata1 = world.getBlockState(blockposition1); if (this.canSpreadTo(world, blockposition, iblockdata, enumdirection, blockposition1, iblockdata1, world.getFluidState(blockposition1), fluid1.getType())) { @@ -48,7 +48,7 @@ this.spreadTo(world, blockposition1, iblockdata1, enumdirection, fluid1); } } -@@ -438,12 +465,23 @@ +@@ -431,12 +458,23 @@ if (fluid1.isEmpty()) { fluid = fluid1; diff --git a/paper-server/nms-patches/net/minecraft/world/level/storage/Convertable.patch b/paper-server/nms-patches/net/minecraft/world/level/storage/Convertable.patch index 86d795c4cc..917222d4c8 100644 --- a/paper-server/nms-patches/net/minecraft/world/level/storage/Convertable.patch +++ b/paper-server/nms-patches/net/minecraft/world/level/storage/Convertable.patch @@ -1,7 +1,7 @@ --- a/net/minecraft/world/level/storage/Convertable.java +++ b/net/minecraft/world/level/storage/Convertable.java -@@ -68,6 +68,10 @@ - import net.minecraft.world.level.levelgen.WorldDimensions; +@@ -74,6 +74,10 @@ + import net.minecraft.world.level.validation.PathAllowList; import org.slf4j.Logger; +// CraftBukkit start @@ -11,7 +11,7 @@ public class Convertable { static final Logger LOGGER = LogUtils.getLogger(); -@@ -114,7 +118,7 @@ +@@ -160,7 +164,7 @@ } private static WorldDataConfiguration readDataConfig(Dynamic dynamic) { @@ -20,7 +20,16 @@ Logger logger = Convertable.LOGGER; Objects.requireNonNull(logger); -@@ -252,6 +256,7 @@ +@@ -176,7 +180,7 @@ + throw new LevelStorageException(IChatBaseComponent.translatable("selectWorld.load_folder_access")); + } else { + try { +- Stream stream = Files.list(this.baseDir); ++ Stream stream = Files.list(this.baseDir); // CraftBukkit - decompile error + + Convertable.a convertable_a; + +@@ -320,6 +324,7 @@ WorldDimensions.b worlddimensions_b = generatorsettings.dimensions().bake(iregistry); Lifecycle lifecycle1 = worlddimensions_b.lifecycle().add(lifecycle); WorldDataServer worlddataserver = WorldDataServer.parse(dynamic, datafixer, i, nbttagcompound2, worldsettings, levelversion, worlddimensions_b.specialWorldProperty(), generatorsettings.options(), lifecycle1); @@ -28,17 +37,36 @@ return Pair.of(worlddataserver, worlddimensions_b); }; -@@ -333,9 +338,23 @@ +@@ -415,27 +420,41 @@ return this.backupDir; } +- public Convertable.ConversionSession validateAndCreateAccess(String s) throws IOException, ContentValidationException { ++ public Convertable.ConversionSession validateAndCreateAccess(String s, ResourceKey dimensionType) throws IOException, ContentValidationException { // CraftBukkit + Path path = this.getLevelPath(s); + List list = this.worldDirValidator.validateSave(path, true); + + if (!list.isEmpty()) { + throw new ContentValidationException(path, list); + } else { +- return new Convertable.ConversionSession(s, path); ++ return new Convertable.ConversionSession(s, path, dimensionType); // CraftBukkit + } + } + - public Convertable.ConversionSession createAccess(String s) throws IOException { -- return new Convertable.ConversionSession(s); ++ public Convertable.ConversionSession createAccess(String s, ResourceKey dimensionType) throws IOException { // CraftBukkit + Path path = this.getLevelPath(s); + +- return new Convertable.ConversionSession(s, path); ++ return new Convertable.ConversionSession(s, path, dimensionType); // CraftBukkit + } + + public DirectoryValidator getWorldDirValidator() { + return this.worldDirValidator; + } + + // CraftBukkit start -+ public Convertable.ConversionSession createAccess(String s, ResourceKey dimensionType) throws IOException { -+ return new Convertable.ConversionSession(s, dimensionType); -+ } -+ + public static Path getStorageFolder(Path path, ResourceKey dimensionType) { + if (dimensionType == WorldDimension.OVERWORLD) { + return path; @@ -49,26 +77,27 @@ + } else { + return path.resolve("dimensions").resolve(dimensionType.location().getNamespace()).resolve(dimensionType.location().getPath()); + } - } ++ } + // CraftBukkit end - ++ public static record a(List levels) implements Iterable { -@@ -388,8 +407,12 @@ + public boolean isEmpty() { +@@ -487,8 +506,12 @@ public final Convertable.b levelDirectory; private final String levelId; private final Map resources = Maps.newHashMap(); + // CraftBukkit start + public final ResourceKey dimensionType; -- public ConversionSession(String s) throws IOException { -+ public ConversionSession(String s, ResourceKey dimensionType) throws IOException { +- ConversionSession(String s, Path path) throws IOException { ++ ConversionSession(String s, Path path, ResourceKey dimensionType) throws IOException { + this.dimensionType = dimensionType; + // CraftBukkit end this.levelId = s; - this.levelDirectory = new Convertable.b(Convertable.this.baseDir.resolve(s)); - this.lock = SessionLock.create(this.levelDirectory.path()); -@@ -400,7 +423,7 @@ + this.levelDirectory = new Convertable.b(path); + this.lock = SessionLock.create(path); +@@ -499,7 +522,7 @@ } public Path getLevelPath(SavedFile savedfile) { @@ -77,7 +106,7 @@ Convertable.b convertable_b = this.levelDirectory; Objects.requireNonNull(this.levelDirectory); -@@ -408,7 +431,7 @@ +@@ -507,7 +530,7 @@ } public Path getDimensionPath(ResourceKey resourcekey) { diff --git a/paper-server/nms-patches/net/minecraft/world/level/storage/WorldDataServer.patch b/paper-server/nms-patches/net/minecraft/world/level/storage/WorldDataServer.patch index 469665ecdd..1baaa3f953 100644 --- a/paper-server/nms-patches/net/minecraft/world/level/storage/WorldDataServer.patch +++ b/paper-server/nms-patches/net/minecraft/world/level/storage/WorldDataServer.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/level/storage/WorldDataServer.java +++ b/net/minecraft/world/level/storage/WorldDataServer.java -@@ -43,6 +43,19 @@ +@@ -45,6 +45,19 @@ import net.minecraft.world.level.timers.CustomFunctionCallbackTimers; import org.slf4j.Logger; @@ -20,9 +20,9 @@ public class WorldDataServer implements IWorldDataServer, SaveData { private static final Logger LOGGER = LogUtils.getLogger(); -@@ -83,6 +96,20 @@ - private final Set knownServerBrands; +@@ -86,6 +99,20 @@ private boolean wasModded; + private final Set removedFeatureFlags; private final CustomFunctionCallbackTimerQueue scheduledEvents; + // CraftBukkit start - Add world and pdc + public IRegistry customDimensions; @@ -39,28 +39,27 @@ + } + // CraftBukkit end - private WorldDataServer(@Nullable DataFixer datafixer, int i, @Nullable NBTTagCompound nbttagcompound, boolean flag, int j, int k, int l, float f, long i1, long j1, int k1, int l1, int i2, boolean flag1, int j2, boolean flag2, boolean flag3, boolean flag4, WorldBorder.c worldborder_c, int k2, int l2, @Nullable UUID uuid, Set set, CustomFunctionCallbackTimerQueue customfunctioncallbacktimerqueue, @Nullable NBTTagCompound nbttagcompound1, NBTTagCompound nbttagcompound2, WorldSettings worldsettings, WorldOptions worldoptions, WorldDataServer.a worlddataserver_a, Lifecycle lifecycle) { + private WorldDataServer(@Nullable DataFixer datafixer, int i, @Nullable NBTTagCompound nbttagcompound, boolean flag, int j, int k, int l, float f, long i1, long j1, int k1, int l1, int i2, boolean flag1, int j2, boolean flag2, boolean flag3, boolean flag4, WorldBorder.c worldborder_c, int k2, int l2, @Nullable UUID uuid, Set set, Set set1, CustomFunctionCallbackTimerQueue customfunctioncallbacktimerqueue, @Nullable NBTTagCompound nbttagcompound1, EnderDragonBattle.a enderdragonbattle_a, WorldSettings worldsettings, WorldOptions worldoptions, WorldDataServer.a worlddataserver_a, Lifecycle lifecycle) { this.fixerUpper = datafixer; -@@ -127,7 +154,8 @@ - return dynamic.get("DimensionData").get("1").get("DragonFight").orElseEmptyMap(); - })).convert(DynamicOpsNBT.INSTANCE).getValue(); - -- return new WorldDataServer(datafixer, i, nbttagcompound, dynamic.get("WasModded").asBoolean(false), dynamic.get("SpawnX").asInt(0), dynamic.get("SpawnY").asInt(0), dynamic.get("SpawnZ").asInt(0), dynamic.get("SpawnAngle").asFloat(0.0F), j, dynamic.get("DayTime").asLong(j), levelversion.levelDataVersion(), dynamic.get("clearWeatherTime").asInt(0), dynamic.get("rainTime").asInt(0), dynamic.get("raining").asBoolean(false), dynamic.get("thunderTime").asInt(0), dynamic.get("thundering").asBoolean(false), dynamic.get("initialized").asBoolean(true), dynamic.get("DifficultyLocked").asBoolean(false), WorldBorder.c.read(dynamic, WorldBorder.DEFAULT_SETTINGS), dynamic.get("WanderingTraderSpawnDelay").asInt(0), dynamic.get("WanderingTraderSpawnChance").asInt(0), (UUID) dynamic.get("WanderingTraderId").read(UUIDUtil.CODEC).result().orElse((Object) null), (Set) dynamic.get("ServerBrands").asStream().flatMap((dynamic1) -> { -+ // CraftBukkit - decompile error -+ return new WorldDataServer(datafixer, i, nbttagcompound, dynamic.get("WasModded").asBoolean(false), dynamic.get("SpawnX").asInt(0), dynamic.get("SpawnY").asInt(0), dynamic.get("SpawnZ").asInt(0), dynamic.get("SpawnAngle").asFloat(0.0F), j, dynamic.get("DayTime").asLong(j), levelversion.levelDataVersion(), dynamic.get("clearWeatherTime").asInt(0), dynamic.get("rainTime").asInt(0), dynamic.get("raining").asBoolean(false), dynamic.get("thunderTime").asInt(0), dynamic.get("thundering").asBoolean(false), dynamic.get("initialized").asBoolean(true), dynamic.get("DifficultyLocked").asBoolean(false), WorldBorder.c.read(dynamic, WorldBorder.DEFAULT_SETTINGS), dynamic.get("WanderingTraderSpawnDelay").asInt(0), dynamic.get("WanderingTraderSpawnChance").asInt(0), (UUID) dynamic.get("WanderingTraderId").read(UUIDUtil.CODEC).result().orElse(null), (Set) dynamic.get("ServerBrands").asStream().flatMap((dynamic1) -> { +@@ -144,7 +171,7 @@ + WorldBorder.c worldborder_c = WorldBorder.c.read(dynamic, WorldBorder.DEFAULT_SETTINGS); + int k2 = dynamic.get("WanderingTraderSpawnDelay").asInt(0); + int l2 = dynamic.get("WanderingTraderSpawnChance").asInt(0); +- UUID uuid = (UUID) dynamic.get("WanderingTraderId").read(UUIDUtil.CODEC).result().orElse((Object) null); ++ UUID uuid = (UUID) dynamic.get("WanderingTraderId").read(UUIDUtil.CODEC).result().orElse(null); // CraftBukkit - decompile error + Set set = (Set) dynamic.get("ServerBrands").asStream().flatMap((dynamic1) -> { return dynamic1.asString().result().stream(); - }).collect(Collectors.toCollection(Sets::newLinkedHashSet)), new CustomFunctionCallbackTimerQueue<>(CustomFunctionCallbackTimers.SERVER_CALLBACKS, dynamic.get("ScheduledEvents").asStream()), (NBTTagCompound) dynamic.get("CustomBossEvents").orElseEmptyMap().getValue(), nbttagcompound1, worldsettings, worldoptions, worlddataserver_a, lifecycle); - } -@@ -147,7 +175,7 @@ + }).collect(Collectors.toCollection(Sets::newLinkedHashSet)); +@@ -153,7 +180,7 @@ + }).collect(Collectors.toSet()); + CustomFunctionCallbackTimerQueue customfunctioncallbacktimerqueue = new CustomFunctionCallbackTimerQueue<>(CustomFunctionCallbackTimers.SERVER_CALLBACKS, dynamic.get("ScheduledEvents").asStream()); + NBTTagCompound nbttagcompound1 = (NBTTagCompound) dynamic.get("CustomBossEvents").orElseEmptyMap().getValue(); +- DataResult dataresult = dynamic.get("DragonFight").read(EnderDragonBattle.a.CODEC); ++ DataResult dataresult = dynamic.get("DragonFight").read(EnderDragonBattle.a.CODEC); // CraftBukkit - decompile error + Logger logger = WorldDataServer.LOGGER; - private void setTagData(IRegistryCustom iregistrycustom, NBTTagCompound nbttagcompound, @Nullable NBTTagCompound nbttagcompound1) { - NBTTagList nbttaglist = new NBTTagList(); -- Stream stream = this.knownServerBrands.stream().map(NBTTagString::valueOf); -+ Stream stream = this.knownServerBrands.stream().map(NBTTagString::valueOf); // CraftBukkit - decompile error - - Objects.requireNonNull(nbttaglist); - stream.forEach(nbttaglist::add); -@@ -162,7 +190,7 @@ + Objects.requireNonNull(logger); +@@ -189,7 +216,7 @@ nbttagcompound.put("Version", nbttagcompound2); GameProfileSerializer.addCurrentDataVersion(nbttagcompound); DynamicOps dynamicops = RegistryOps.create(DynamicOpsNBT.INSTANCE, (HolderLookup.b) iregistrycustom); @@ -69,7 +68,7 @@ Logger logger = WorldDataServer.LOGGER; Objects.requireNonNull(logger); -@@ -214,6 +242,8 @@ +@@ -241,11 +268,13 @@ nbttagcompound.putUUID("WanderingTraderId", this.wanderingTraderId); } @@ -77,8 +76,14 @@ + world.getWorld().storeBukkitValues(nbttagcompound); // CraftBukkit - add pdc } - @Override -@@ -331,6 +361,20 @@ + private static NBTTagList stringCollectionToTag(Set set) { + NBTTagList nbttaglist = new NBTTagList(); +- Stream stream = set.stream().map(NBTTagString::valueOf); ++ Stream stream = set.stream().map(NBTTagString::valueOf); // CraftBukkit - decompile error + + Objects.requireNonNull(nbttaglist); + stream.forEach(nbttaglist::add); +@@ -367,6 +396,20 @@ @Override public void setThundering(boolean flag) { @@ -99,7 +104,7 @@ this.thundering = flag; } -@@ -351,6 +395,20 @@ +@@ -387,6 +430,20 @@ @Override public void setRaining(boolean flag) { @@ -120,7 +125,7 @@ this.raining = flag; } -@@ -417,6 +475,12 @@ +@@ -453,6 +510,12 @@ @Override public void setDifficulty(EnumDifficulty enumdifficulty) { this.settings = this.settings.withDifficulty(enumdifficulty); @@ -133,7 +138,7 @@ } @Override -@@ -548,6 +612,14 @@ +@@ -589,6 +652,14 @@ return this.settings.copy(); } diff --git a/paper-server/nms-patches/net/minecraft/world/level/storage/loot/LootDataManager.patch b/paper-server/nms-patches/net/minecraft/world/level/storage/loot/LootDataManager.patch new file mode 100644 index 0000000000..457a5fb5d1 --- /dev/null +++ b/paper-server/nms-patches/net/minecraft/world/level/storage/loot/LootDataManager.patch @@ -0,0 +1,43 @@ +--- a/net/minecraft/world/level/storage/loot/LootDataManager.java ++++ b/net/minecraft/world/level/storage/loot/LootDataManager.java +@@ -36,6 +36,7 @@ + public static final LootDataId EMPTY_LOOT_TABLE_KEY = new LootDataId<>(LootDataType.TABLE, LootTables.EMPTY); + private Map, ?> elements = Map.of(); + private Multimap, MinecraftKey> typeKeys = ImmutableMultimap.of(); ++ public Map lootTableToKey = ImmutableMap.of(); // CraftBukkit + + public LootDataManager() {} + +@@ -93,7 +94,7 @@ + @Nullable + @Override + public T getElement(LootDataId lootdataid) { +- return map1.get(lootdataid); ++ return (T) map1.get(lootdataid); // CraftBukkit - decompile error + } + }); + +@@ -105,16 +106,21 @@ + }); + this.elements = map1; + this.typeKeys = com_google_common_collect_immutablemultimap_builder.build(); ++ // CraftBukkit start - build a reversed registry map ++ ImmutableMap.Builder lootTableToKeyBuilder = ImmutableMap.builder(); ++ this.elements.forEach((key, lootTable) -> lootTableToKeyBuilder.put((Object) lootTable, key.location())); ++ this.lootTableToKey = lootTableToKeyBuilder.build(); ++ // CraftBukkit end + } + + private static void castAndValidate(LootCollector lootcollector, LootDataId lootdataid, Object object) { +- lootdataid.type().runValidation(lootcollector, lootdataid, object); ++ lootdataid.type().runValidation(lootcollector, lootdataid, (T) object); // CraftBukkit - decompile error + } + + @Nullable + @Override + public T getElement(LootDataId lootdataid) { +- return this.elements.get(lootdataid); ++ return (T) this.elements.get(lootdataid); // CraftBukkit - decompile error + } + + public Collection getKeys(LootDataType lootdatatype) { diff --git a/paper-server/nms-patches/net/minecraft/world/level/storage/loot/LootTable.patch b/paper-server/nms-patches/net/minecraft/world/level/storage/loot/LootTable.patch index 6bf2a9f471..0ed1ef6433 100644 --- a/paper-server/nms-patches/net/minecraft/world/level/storage/loot/LootTable.patch +++ b/paper-server/nms-patches/net/minecraft/world/level/storage/loot/LootTable.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/level/storage/loot/LootTable.java +++ b/net/minecraft/world/level/storage/loot/LootTable.java -@@ -32,6 +32,13 @@ +@@ -34,6 +34,13 @@ import org.apache.commons.lang3.ArrayUtils; import org.slf4j.Logger; @@ -14,16 +14,17 @@ public class LootTable { static final Logger LOGGER = LogUtils.getLogger(); -@@ -119,8 +126,21 @@ +@@ -145,9 +152,22 @@ } - public void fill(IInventory iinventory, LootTableInfo loottableinfo) { + public void fill(IInventory iinventory, LootParams lootparams, long i) { + // CraftBukkit start -+ this.fillInventory(iinventory, loottableinfo, false); ++ this.fillInventory(iinventory, lootparams, i, false); + } + -+ public void fillInventory(IInventory iinventory, LootTableInfo loottableinfo, boolean plugin) { ++ public void fillInventory(IInventory iinventory, LootParams lootparams, long i, boolean plugin) { + // CraftBukkit end + LootTableInfo loottableinfo = (new LootTableInfo.Builder(lootparams)).withOptionalRandomSeed(i).create(this.randomSequence); ObjectArrayList objectarraylist = this.getRandomItems(loottableinfo); RandomSource randomsource = loottableinfo.getRandom(); + // CraftBukkit start diff --git a/paper-server/nms-patches/net/minecraft/world/level/storage/loot/LootTableRegistry.patch b/paper-server/nms-patches/net/minecraft/world/level/storage/loot/LootTableRegistry.patch deleted file mode 100644 index c574b84e5c..0000000000 --- a/paper-server/nms-patches/net/minecraft/world/level/storage/loot/LootTableRegistry.patch +++ /dev/null @@ -1,31 +0,0 @@ ---- a/net/minecraft/world/level/storage/loot/LootTableRegistry.java -+++ b/net/minecraft/world/level/storage/loot/LootTableRegistry.java -@@ -22,6 +22,7 @@ - private static final Logger LOGGER = LogUtils.getLogger(); - private static final Gson GSON = LootSerialization.createLootTableSerializer().create(); - private Map tables = ImmutableMap.of(); -+ public Map lootTableToKey = ImmutableMap.of(); // CraftBukkit - private final LootPredicateManager predicateManager; - - public LootTableRegistry(LootPredicateManager lootpredicatemanager) { -@@ -57,7 +58,7 @@ - LootPredicateManager lootpredicatemanager = this.predicateManager; - - Objects.requireNonNull(this.predicateManager); -- Function function = lootpredicatemanager::get; -+ Function function = lootpredicatemanager::get; // CraftBukkit - decompile error - - Objects.requireNonNull(immutablemap); - LootCollector lootcollector = new LootCollector(lootcontextparameterset, function, immutablemap::get); -@@ -69,6 +70,11 @@ - LootTableRegistry.LOGGER.warn("Found validation problem in {}: {}", s, s1); - }); - this.tables = immutablemap; -+ // CraftBukkit start - build a reversed registry map -+ ImmutableMap.Builder lootTableToKeyBuilder = ImmutableMap.builder(); -+ this.tables.forEach((lootTable, key) -> lootTableToKeyBuilder.put(key, lootTable)); -+ this.lootTableToKey = lootTableToKeyBuilder.build(); -+ // CraftBukkit end - } - - public static void validate(LootCollector lootcollector, MinecraftKey minecraftkey, LootTable loottable) { diff --git a/paper-server/pom.xml b/paper-server/pom.xml index cbf83d5b58..76efcc1b74 100644 --- a/paper-server/pom.xml +++ b/paper-server/pom.xml @@ -4,7 +4,7 @@ org.bukkit craftbukkit jar - 1.19.4-R0.1-SNAPSHOT + 1.20-R0.1-SNAPSHOT CraftBukkit https://www.spigotmc.org/ @@ -13,7 +13,7 @@ UTF-8 unknown git - 1_19_R3 + 1_20_R1 17 17 @@ -67,19 +67,19 @@ com.mojang authlib - 3.17.30 + 4.0.43 compile com.mojang brigadier - 1.0.18 + 1.1.8 compile com.mojang datafixerupper - 6.0.6 + 6.0.8 compile @@ -221,39 +221,39 @@ org.xerial sqlite-jdbc - 3.41.2.2 + 3.42.0.0 runtime com.mysql mysql-connector-j - 8.0.32 + 8.0.33 runtime org.apache.maven maven-resolver-provider - 3.8.5 + 3.9.2 runtime org.apache.maven.resolver maven-resolver-connector-basic - 1.7.3 + 1.9.10 runtime org.apache.maven.resolver maven-resolver-transport-http - 1.7.3 + 1.9.10 runtime org.jetbrains annotations-java5 - 23.0.0 + 24.0.1 provided @@ -379,7 +379,7 @@ net.md-5 specialsource-maven-plugin - 1.2.4 + 1.2.5 package @@ -424,7 +424,7 @@ org.apache.maven.plugins maven-assembly-plugin - 3.5.0 + 3.6.0 package @@ -469,7 +469,7 @@ org.apache.maven.plugins maven-surefire-plugin - 3.0.0 + 3.1.0 ${basedir}/target/test-server @@ -498,7 +498,7 @@ org.apache.maven.plugins maven-checkstyle-plugin - 3.2.1 + 3.3.0 test-compile diff --git a/paper-server/src/main/java/org/bukkit/craftbukkit/CraftChunk.java b/paper-server/src/main/java/org/bukkit/craftbukkit/CraftChunk.java index f64f5aeb50..a66c5162dd 100644 --- a/paper-server/src/main/java/org/bukkit/craftbukkit/CraftChunk.java +++ b/paper-server/src/main/java/org/bukkit/craftbukkit/CraftChunk.java @@ -36,7 +36,7 @@ import net.minecraft.world.level.chunk.storage.EntityStorage; import net.minecraft.world.level.entity.PersistentEntitySectionManager; import net.minecraft.world.level.levelgen.HeightMap; import net.minecraft.world.level.levelgen.SeededRandom; -import net.minecraft.world.level.lighting.LightEngine; +import net.minecraft.world.level.lighting.LevelLightEngine; import org.bukkit.Chunk; import org.bukkit.ChunkSnapshot; import org.bukkit.World; @@ -314,7 +314,7 @@ public class CraftChunk implements Chunk { data.put("block_states", ChunkRegionLoader.BLOCK_STATE_CODEC.encodeStart(DynamicOpsNBT.INSTANCE, cs[i].getStates()).get().left().get()); sectionBlockIDs[i] = ChunkRegionLoader.BLOCK_STATE_CODEC.parse(DynamicOpsNBT.INSTANCE, data.getCompound("block_states")).get().left().get(); - LightEngine lightengine = worldServer.getLightEngine(); + LevelLightEngine lightengine = worldServer.getLightEngine(); NibbleArray skyLightArray = lightengine.getLayerListener(EnumSkyBlock.SKY).getDataLayerData(SectionPosition.of(x, i, z)); if (skyLightArray == null) { sectionSkyLights[i] = emptyLight; diff --git a/paper-server/src/main/java/org/bukkit/craftbukkit/CraftLootTable.java b/paper-server/src/main/java/org/bukkit/craftbukkit/CraftLootTable.java index fe354ddd6e..97243c316b 100644 --- a/paper-server/src/main/java/org/bukkit/craftbukkit/CraftLootTable.java +++ b/paper-server/src/main/java/org/bukkit/craftbukkit/CraftLootTable.java @@ -10,10 +10,12 @@ import net.minecraft.world.IInventory; import net.minecraft.world.damagesource.DamageSource; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.player.EntityHuman; +import net.minecraft.world.level.storage.loot.LootParams; import net.minecraft.world.level.storage.loot.LootTable; import net.minecraft.world.level.storage.loot.LootTableInfo; import net.minecraft.world.level.storage.loot.parameters.LootContextParameter; import net.minecraft.world.level.storage.loot.parameters.LootContextParameterSet; +import net.minecraft.world.level.storage.loot.parameters.LootContextParameterSets; import net.minecraft.world.level.storage.loot.parameters.LootContextParameters; import net.minecraft.world.phys.Vec3D; import org.bukkit.Location; @@ -45,7 +47,7 @@ public class CraftLootTable implements org.bukkit.loot.LootTable { @Override public Collection populateLoot(Random random, LootContext context) { Preconditions.checkArgument(context != null, "LootContext cannot be null"); - LootTableInfo nmsContext = convertContext(context, random); + LootParams nmsContext = convertContext(context, random); List nmsItems = handle.getRandomItems(nmsContext); Collection bukkit = new ArrayList<>(nmsItems.size()); @@ -63,12 +65,12 @@ public class CraftLootTable implements org.bukkit.loot.LootTable { public void fillInventory(Inventory inventory, Random random, LootContext context) { Preconditions.checkArgument(inventory != null, "Inventory cannot be null"); Preconditions.checkArgument(context != null, "LootContext cannot be null"); - LootTableInfo nmsContext = convertContext(context, random); + LootParams nmsContext = convertContext(context, random); CraftInventory craftInventory = (CraftInventory) inventory; IInventory handle = craftInventory.getInventory(); // TODO: When events are added, call event here w/ custom reason? - getHandle().fillInventory(handle, nmsContext, true); + getHandle().fillInventory(handle, nmsContext, random.nextLong(), true); } @Override @@ -76,15 +78,15 @@ public class CraftLootTable implements org.bukkit.loot.LootTable { return key; } - private LootTableInfo convertContext(LootContext context, Random random) { + private LootParams convertContext(LootContext context, Random random) { Preconditions.checkArgument(context != null, "LootContext cannot be null"); Location loc = context.getLocation(); Preconditions.checkArgument(loc.getWorld() != null, "LootContext.getLocation#getWorld cannot be null"); WorldServer handle = ((CraftWorld) loc.getWorld()).getHandle(); - LootTableInfo.Builder builder = new LootTableInfo.Builder(handle); + LootParams.a builder = new LootParams.a(handle); if (random != null) { - builder = builder.withRandom(new RandomSourceWrapper(random)); + // builder = builder.withRandom(new RandomSourceWrapper(random)); } setMaybe(builder, LootContextParameters.ORIGIN, CraftLocation.toVec3D(loc)); if (getHandle() != LootTable.EMPTY) { @@ -124,10 +126,10 @@ public class CraftLootTable implements org.bukkit.loot.LootTable { } nmsBuilder.optional(LootContextParameters.LOOTING_MOD); - return builder.create(nmsBuilder.build()); + return builder.create(getHandle().getParamSet()); } - private void setMaybe(LootTableInfo.Builder builder, LootContextParameter param, T value) { + private void setMaybe(LootParams.a builder, LootContextParameter param, T value) { if (getHandle().getParamSet().getRequired().contains(param) || getHandle().getParamSet().getAllowed().contains(param)) { builder.withParameter(param, value); } diff --git a/paper-server/src/main/java/org/bukkit/craftbukkit/CraftParticle.java b/paper-server/src/main/java/org/bukkit/craftbukkit/CraftParticle.java index 9436870973..90cdcf1eb5 100644 --- a/paper-server/src/main/java/org/bukkit/craftbukkit/CraftParticle.java +++ b/paper-server/src/main/java/org/bukkit/craftbukkit/CraftParticle.java @@ -133,9 +133,8 @@ public enum CraftParticle { SCULK_CHARGE("sculk_charge"), SCULK_CHARGE_POP("sculk_charge_pop"), SHRIEK("shriek"), - DRIPPING_CHERRY_LEAVES("dripping_cherry_leaves"), - FALLING_CHERRY_LEAVES("falling_cherry_leaves"), - LANDING_CHERRY_LEAVES("landing_cherry_leaves"), + CHERRY_LEAVES("cherry_leaves"), + EGG_CRACK("egg_crack"), // ----- Legacy Separator ----- LEGACY_BLOCK_CRACK("block"), LEGACY_BLOCK_DUST("block"), diff --git a/paper-server/src/main/java/org/bukkit/craftbukkit/CraftRegionAccessor.java b/paper-server/src/main/java/org/bukkit/craftbukkit/CraftRegionAccessor.java index c42d4b2e5a..94ab6418ad 100644 --- a/paper-server/src/main/java/org/bukkit/craftbukkit/CraftRegionAccessor.java +++ b/paper-server/src/main/java/org/bukkit/craftbukkit/CraftRegionAccessor.java @@ -912,7 +912,7 @@ public abstract class CraftRegionAccessor implements RegionAccessor { final BlockPosition pos = BlockPosition.containing(x, y, z); for (BlockFace dir : faces) { IBlockData nmsBlock = getHandle().getBlockState(pos.relative(CraftBlock.blockFaceToNotch(dir))); - if (nmsBlock.getMaterial().isSolid() || BlockDiodeAbstract.isDiode(nmsBlock)) { + if (nmsBlock.isSolid() || BlockDiodeAbstract.isDiode(nmsBlock)) { boolean taken = false; AxisAlignedBB bb = (ItemFrame.class.isAssignableFrom(clazz)) ? EntityItemFrame.calculateBoundingBox(null, pos, CraftBlock.blockFaceToNotch(dir).getOpposite(), width, height) diff --git a/paper-server/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/paper-server/src/main/java/org/bukkit/craftbukkit/CraftServer.java index a211da846f..0b11dd945e 100644 --- a/paper-server/src/main/java/org/bukkit/craftbukkit/CraftServer.java +++ b/paper-server/src/main/java/org/bukkit/craftbukkit/CraftServer.java @@ -88,6 +88,7 @@ import net.minecraft.world.inventory.Container; import net.minecraft.world.inventory.ContainerWorkbench; import net.minecraft.world.inventory.InventoryCraftResult; import net.minecraft.world.inventory.InventoryCrafting; +import net.minecraft.world.inventory.TransientCraftingContainer; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemWorldMap; import net.minecraft.world.item.crafting.IRecipe; @@ -113,7 +114,8 @@ import net.minecraft.world.level.storage.Convertable; import net.minecraft.world.level.storage.SaveData; import net.minecraft.world.level.storage.WorldDataServer; import net.minecraft.world.level.storage.WorldNBTStorage; -import net.minecraft.world.level.storage.loot.LootTableRegistry; +import net.minecraft.world.level.storage.loot.LootDataManager; +import net.minecraft.world.level.validation.ContentValidationException; import net.minecraft.world.phys.Vec3D; import org.apache.commons.lang.Validate; import org.bukkit.BanList; @@ -169,7 +171,6 @@ import org.bukkit.craftbukkit.inventory.CraftMerchantCustom; import org.bukkit.craftbukkit.inventory.CraftRecipe; import org.bukkit.craftbukkit.inventory.CraftShapedRecipe; import org.bukkit.craftbukkit.inventory.CraftShapelessRecipe; -import org.bukkit.craftbukkit.inventory.CraftSmithingRecipe; import org.bukkit.craftbukkit.inventory.CraftSmithingTransformRecipe; import org.bukkit.craftbukkit.inventory.CraftSmithingTrimRecipe; import org.bukkit.craftbukkit.inventory.CraftSmokingRecipe; @@ -227,7 +228,6 @@ import org.bukkit.inventory.Merchant; import org.bukkit.inventory.Recipe; import org.bukkit.inventory.ShapedRecipe; import org.bukkit.inventory.ShapelessRecipe; -import org.bukkit.inventory.SmithingRecipe; import org.bukkit.inventory.SmithingTransformRecipe; import org.bukkit.inventory.SmithingTrimRecipe; import org.bukkit.inventory.SmokingRecipe; @@ -1061,8 +1061,8 @@ public final class CraftServer implements Server { Convertable.ConversionSession worldSession; try { - worldSession = Convertable.createDefault(getWorldContainer().toPath()).createAccess(name, actualDimension); - } catch (IOException ex) { + worldSession = Convertable.createDefault(getWorldContainer().toPath()).validateAndCreateAccess(name, actualDimension); + } catch (IOException | ContentValidationException ex) { throw new RuntimeException(ex); } @@ -1123,7 +1123,7 @@ public final class CraftServer implements Server { } WorldServer internal = (WorldServer) new WorldServer(console, console.executor, worldSession, worlddata, worldKey, worlddimension, getServer().progressListenerFactory.create(11), - worlddata.isDebugWorld(), j, creator.environment() == Environment.NORMAL ? list : ImmutableList.of(), true, creator.environment(), generator, biomeProvider); + worlddata.isDebugWorld(), j, creator.environment() == Environment.NORMAL ? list : ImmutableList.of(), true, console.overworld().getRandomSequences(), creator.environment(), generator, biomeProvider); if (!(worlds.containsKey(name.toLowerCase(java.util.Locale.ENGLISH)))) { return null; @@ -1271,8 +1271,6 @@ public final class CraftServer implements Server { toAdd = CraftSmokingRecipe.fromBukkitRecipe((SmokingRecipe) recipe); } else if (recipe instanceof StonecuttingRecipe) { toAdd = CraftStonecuttingRecipe.fromBukkitRecipe((StonecuttingRecipe) recipe); - } else if (recipe instanceof SmithingRecipe) { - toAdd = CraftSmithingRecipe.fromBukkitRecipe((SmithingRecipe) recipe); } else if (recipe instanceof SmithingTransformRecipe) { toAdd = CraftSmithingTransformRecipe.fromBukkitRecipe((SmithingTransformRecipe) recipe); } else if (recipe instanceof SmithingTrimRecipe) { @@ -1332,7 +1330,7 @@ public final class CraftServer implements Server { return net.minecraft.world.item.ItemStack.EMPTY; } }; - InventoryCrafting inventoryCrafting = new InventoryCrafting(container, 3, 3); + InventoryCrafting inventoryCrafting = new TransientCraftingContainer(container, 3, 3); return getNMSRecipe(craftingMatrix, inventoryCrafting, (CraftWorld) world).map(IRecipe::toBukkitRecipe).orElse(null); } @@ -2290,8 +2288,8 @@ public final class CraftServer implements Server { public LootTable getLootTable(NamespacedKey key) { Validate.notNull(key, "NamespacedKey cannot be null"); - LootTableRegistry registry = getServer().getLootTables(); - return new CraftLootTable(key, registry.get(CraftNamespacedKey.toMinecraft(key))); + LootDataManager registry = getServer().getLootData(); + return new CraftLootTable(key, registry.getLootTable(CraftNamespacedKey.toMinecraft(key))); } @Override diff --git a/paper-server/src/main/java/org/bukkit/craftbukkit/CraftWorld.java b/paper-server/src/main/java/org/bukkit/craftbukkit/CraftWorld.java index 16360a0392..3f2dd5172a 100644 --- a/paper-server/src/main/java/org/bukkit/craftbukkit/CraftWorld.java +++ b/paper-server/src/main/java/org/bukkit/craftbukkit/CraftWorld.java @@ -329,7 +329,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { List playersInRange = playerChunk.playerProvider.getPlayers(playerChunk.getPos(), false); if (playersInRange.isEmpty()) return; - ClientboundLevelChunkWithLightPacket refreshPacket = new ClientboundLevelChunkWithLightPacket(chunk, world.getLightEngine(), null, null, true); + ClientboundLevelChunkWithLightPacket refreshPacket = new ClientboundLevelChunkWithLightPacket(chunk, world.getLightEngine(), null, null); for (EntityPlayer player : playersInRange) { if (player.connection == null) continue; @@ -643,7 +643,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { CraftPlayer cp = (CraftPlayer) p; if (cp.getHandle().connection == null) continue; - cp.getHandle().connection.send(new PacketPlayOutUpdateTime(cp.getHandle().level.getGameTime(), cp.getHandle().getPlayerTime(), cp.getHandle().level.getGameRules().getBoolean(GameRules.RULE_DAYLIGHT))); + cp.getHandle().connection.send(new PacketPlayOutUpdateTime(cp.getHandle().level().getGameTime(), cp.getHandle().getPlayerTime(), cp.getHandle().level().getGameRules().getBoolean(GameRules.RULE_DAYLIGHT))); } } @@ -1894,7 +1894,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { @Override public DragonBattle getEnderDragonBattle() { - return (getHandle().dragonFight() == null) ? null : new CraftDragonBattle(getHandle().dragonFight()); + return (getHandle().getDragonFight() == null) ? null : new CraftDragonBattle(getHandle().getDragonFight()); } @Override diff --git a/paper-server/src/main/java/org/bukkit/craftbukkit/Main.java b/paper-server/src/main/java/org/bukkit/craftbukkit/Main.java index de9e099be9..67dfba2ef6 100644 --- a/paper-server/src/main/java/org/bukkit/craftbukkit/Main.java +++ b/paper-server/src/main/java/org/bukkit/craftbukkit/Main.java @@ -200,11 +200,11 @@ public class Main { useConsole = false; } - if (false && Main.class.getPackage().getImplementationVendor() != null && System.getProperty("IReallyKnowWhatIAmDoingISwear") == null) { + if (Main.class.getPackage().getImplementationVendor() != null && System.getProperty("IReallyKnowWhatIAmDoingISwear") == null) { Date buildDate = new Date(Integer.parseInt(Main.class.getPackage().getImplementationVendor()) * 1000L); Calendar deadline = Calendar.getInstance(); - deadline.add(Calendar.DAY_OF_YEAR, -21); + deadline.add(Calendar.DAY_OF_YEAR, -3); if (buildDate.before(deadline.getTime())) { System.err.println("*** Error, this build is outdated ***"); System.err.println("*** Please download a new build as per instructions from https://www.spigotmc.org/go/outdated-spigot ***"); diff --git a/paper-server/src/main/java/org/bukkit/craftbukkit/block/CraftBlock.java b/paper-server/src/main/java/org/bukkit/craftbukkit/block/CraftBlock.java index 046b75c620..ef3ede7cf6 100644 --- a/paper-server/src/main/java/org/bukkit/craftbukkit/block/CraftBlock.java +++ b/paper-server/src/main/java/org/bukkit/craftbukkit/block/CraftBlock.java @@ -460,7 +460,7 @@ public class CraftBlock implements Block { @Override public boolean isLiquid() { - return getNMS().getMaterial().isLiquid(); + return getNMS().liquid(); } @Override diff --git a/paper-server/src/main/java/org/bukkit/craftbukkit/block/CraftBlockStates.java b/paper-server/src/main/java/org/bukkit/craftbukkit/block/CraftBlockStates.java index 8506d2dcc5..d5395d25cb 100644 --- a/paper-server/src/main/java/org/bukkit/craftbukkit/block/CraftBlockStates.java +++ b/paper-server/src/main/java/org/bukkit/craftbukkit/block/CraftBlockStates.java @@ -11,13 +11,14 @@ import javax.annotation.Nullable; import net.minecraft.core.BlockPosition; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.level.GeneratorAccess; +import net.minecraft.world.level.block.entity.BrushableBlockEntity; +import net.minecraft.world.level.block.entity.CalibratedSculkSensorBlockEntity; import net.minecraft.world.level.block.entity.ChiseledBookShelfBlockEntity; import net.minecraft.world.level.block.entity.DecoratedPotBlockEntity; import net.minecraft.world.level.block.entity.HangingSignBlockEntity; import net.minecraft.world.level.block.entity.SculkCatalystBlockEntity; import net.minecraft.world.level.block.entity.SculkSensorBlockEntity; import net.minecraft.world.level.block.entity.SculkShriekerBlockEntity; -import net.minecraft.world.level.block.entity.SuspiciousSandBlockEntity; import net.minecraft.world.level.block.entity.TileEntity; import net.minecraft.world.level.block.entity.TileEntityBanner; import net.minecraft.world.level.block.entity.TileEntityBarrel; @@ -323,12 +324,14 @@ public final class CraftBlockStates { register(Material.LECTERN, CraftLectern.class, CraftLectern::new, TileEntityLectern::new); register(Material.MOVING_PISTON, CraftMovingPiston.class, CraftMovingPiston::new, TileEntityPiston::new); register(Material.SCULK_CATALYST, CraftSculkCatalyst.class, CraftSculkCatalyst::new, SculkCatalystBlockEntity::new); + register(Material.CALIBRATED_SCULK_SENSOR, CraftCalibratedSculkSensor.class, CraftCalibratedSculkSensor::new, CalibratedSculkSensorBlockEntity::new); register(Material.SCULK_SENSOR, CraftSculkSensor.class, CraftSculkSensor::new, SculkSensorBlockEntity::new); register(Material.SCULK_SHRIEKER, CraftSculkShrieker.class, CraftSculkShrieker::new, SculkShriekerBlockEntity::new); register(Material.SMOKER, CraftSmoker.class, CraftSmoker::new, TileEntitySmoker::new); register(Material.SPAWNER, CraftCreatureSpawner.class, CraftCreatureSpawner::new, TileEntityMobSpawner::new); register(Material.STRUCTURE_BLOCK, CraftStructureBlock.class, CraftStructureBlock::new, TileEntityStructure::new); - register(Material.SUSPICIOUS_SAND, CraftSuspiciousSand.class, CraftSuspiciousSand::new, SuspiciousSandBlockEntity::new); + register(Material.SUSPICIOUS_SAND, CraftSuspiciousSand.class, CraftSuspiciousSand::new, BrushableBlockEntity::new); + register(Material.SUSPICIOUS_GRAVEL, CraftBrushableBlock.class, CraftBrushableBlock::new, BrushableBlockEntity::new); register(Material.TRAPPED_CHEST, CraftChest.class, CraftChest::new, TileEntityChestTrapped::new); } diff --git a/paper-server/src/main/java/org/bukkit/craftbukkit/block/CraftBrushableBlock.java b/paper-server/src/main/java/org/bukkit/craftbukkit/block/CraftBrushableBlock.java new file mode 100644 index 0000000000..a821828e94 --- /dev/null +++ b/paper-server/src/main/java/org/bukkit/craftbukkit/block/CraftBrushableBlock.java @@ -0,0 +1,67 @@ +package org.bukkit.craftbukkit.block; + +import net.minecraft.resources.MinecraftKey; +import net.minecraft.world.level.block.entity.BrushableBlockEntity; +import org.bukkit.Bukkit; +import org.bukkit.World; +import org.bukkit.block.BrushableBlock; +import org.bukkit.craftbukkit.inventory.CraftItemStack; +import org.bukkit.craftbukkit.util.CraftNamespacedKey; +import org.bukkit.inventory.ItemStack; +import org.bukkit.loot.LootTable; + +public class CraftBrushableBlock extends CraftBlockEntityState implements BrushableBlock { + + public CraftBrushableBlock(World world, BrushableBlockEntity tileEntity) { + super(world, tileEntity); + } + + @Override + public ItemStack getItem() { + return CraftItemStack.asBukkitCopy(getSnapshot().getItem()); + } + + @Override + public void setItem(ItemStack item) { + getSnapshot().item = CraftItemStack.asNMSCopy(item); + } + + @Override + public void applyTo(BrushableBlockEntity lootable) { + super.applyTo(lootable); + + if (this.getSnapshot().lootTable == null) { + lootable.setLootTable((MinecraftKey) null, 0L); + } + } + + @Override + public LootTable getLootTable() { + if (getSnapshot().lootTable == null) { + return null; + } + + MinecraftKey key = getSnapshot().lootTable; + return Bukkit.getLootTable(CraftNamespacedKey.fromMinecraft(key)); + } + + @Override + public void setLootTable(LootTable table) { + setLootTable(table, getSeed()); + } + + @Override + public long getSeed() { + return getSnapshot().lootTableSeed; + } + + @Override + public void setSeed(long seed) { + setLootTable(getLootTable(), seed); + } + + private void setLootTable(LootTable table, long seed) { + MinecraftKey key = (table == null) ? null : CraftNamespacedKey.toMinecraft(table.getKey()); + getSnapshot().setLootTable(key, seed); + } +} diff --git a/paper-server/src/main/java/org/bukkit/craftbukkit/block/CraftCalibratedSculkSensor.java b/paper-server/src/main/java/org/bukkit/craftbukkit/block/CraftCalibratedSculkSensor.java new file mode 100644 index 0000000000..389505e50f --- /dev/null +++ b/paper-server/src/main/java/org/bukkit/craftbukkit/block/CraftCalibratedSculkSensor.java @@ -0,0 +1,12 @@ +package org.bukkit.craftbukkit.block; + +import net.minecraft.world.level.block.entity.CalibratedSculkSensorBlockEntity; +import org.bukkit.World; +import org.bukkit.block.CalibratedSculkSensor; + +public class CraftCalibratedSculkSensor extends CraftSculkSensor implements CalibratedSculkSensor { + + public CraftCalibratedSculkSensor(World world, CalibratedSculkSensorBlockEntity tileEntity) { + super(world, tileEntity); + } +} diff --git a/paper-server/src/main/java/org/bukkit/craftbukkit/block/CraftDecoratedPot.java b/paper-server/src/main/java/org/bukkit/craftbukkit/block/CraftDecoratedPot.java index 224563dec2..41b9d49acc 100644 --- a/paper-server/src/main/java/org/bukkit/craftbukkit/block/CraftDecoratedPot.java +++ b/paper-server/src/main/java/org/bukkit/craftbukkit/block/CraftDecoratedPot.java @@ -1,6 +1,5 @@ package org.bukkit.craftbukkit.block; -import com.google.common.base.Preconditions; import java.util.List; import java.util.stream.Collectors; import net.minecraft.world.level.block.entity.DecoratedPotBlockEntity; @@ -17,22 +16,6 @@ public class CraftDecoratedPot extends CraftBlockEntityState getShards() { - return getSnapshot().getShards().stream().map(CraftMagicNumbers::getMaterial).collect(Collectors.toUnmodifiableList()); - } - - @Override - public void addShard(Material material) { - Preconditions.checkArgument(material != null && material.isItem(), "Material must be an item"); - - getSnapshot().getShards().add(CraftMagicNumbers.getItem(material)); - } - - @Override - public void setShards(List shard) { - getSnapshot().getShards().clear(); - - for (Material material : shard) { - addShard(material); - } + return getSnapshot().getDecorations().sorted().map(CraftMagicNumbers::getMaterial).collect(Collectors.toUnmodifiableList()); } } diff --git a/paper-server/src/main/java/org/bukkit/craftbukkit/block/CraftSculkSensor.java b/paper-server/src/main/java/org/bukkit/craftbukkit/block/CraftSculkSensor.java index 2733154f56..de80438346 100644 --- a/paper-server/src/main/java/org/bukkit/craftbukkit/block/CraftSculkSensor.java +++ b/paper-server/src/main/java/org/bukkit/craftbukkit/block/CraftSculkSensor.java @@ -5,9 +5,9 @@ import net.minecraft.world.level.block.entity.SculkSensorBlockEntity; import org.bukkit.World; import org.bukkit.block.SculkSensor; -public class CraftSculkSensor extends CraftBlockEntityState implements SculkSensor { +public class CraftSculkSensor extends CraftBlockEntityState implements SculkSensor { - public CraftSculkSensor(World world, SculkSensorBlockEntity tileEntity) { + public CraftSculkSensor(World world, T tileEntity) { super(world, tileEntity); } diff --git a/paper-server/src/main/java/org/bukkit/craftbukkit/block/CraftSign.java b/paper-server/src/main/java/org/bukkit/craftbukkit/block/CraftSign.java index 761970797a..8cc0f8c2bb 100644 --- a/paper-server/src/main/java/org/bukkit/craftbukkit/block/CraftSign.java +++ b/paper-server/src/main/java/org/bukkit/craftbukkit/block/CraftSign.java @@ -17,10 +17,12 @@ import org.jetbrains.annotations.NotNull; public class CraftSign extends CraftBlockEntityState implements Sign { private final CraftSignSide front; + private final CraftSignSide back; public CraftSign(World world, T tileEntity) { super(world, tileEntity); - this.front = new CraftSignSide(this.getSnapshot()); + this.front = new CraftSignSide(this.getSnapshot().getFrontText()); + this.back = new CraftSignSide(this.getSnapshot().getBackText()); } @Override @@ -40,12 +42,12 @@ public class CraftSign extends CraftBlockEntityState extends CraftBlockEntityState extends CraftBlockEntityState extends CraftBlockEntityState) sign).getTileEntity(); - handle.isEditable = true; - ((CraftPlayer) player).getHandle().openTextEdit(handle); + ((CraftPlayer) player).getHandle().openTextEdit(handle, true); } public static IChatBaseComponent[] sanitizeLines(String[] lines) { diff --git a/paper-server/src/main/java/org/bukkit/craftbukkit/block/CraftSuspiciousSand.java b/paper-server/src/main/java/org/bukkit/craftbukkit/block/CraftSuspiciousSand.java index a2c50590f2..46d9148810 100644 --- a/paper-server/src/main/java/org/bukkit/craftbukkit/block/CraftSuspiciousSand.java +++ b/paper-server/src/main/java/org/bukkit/craftbukkit/block/CraftSuspiciousSand.java @@ -1,67 +1,12 @@ package org.bukkit.craftbukkit.block; -import net.minecraft.resources.MinecraftKey; -import net.minecraft.world.level.block.entity.SuspiciousSandBlockEntity; -import org.bukkit.Bukkit; +import net.minecraft.world.level.block.entity.BrushableBlockEntity; import org.bukkit.World; import org.bukkit.block.SuspiciousSand; -import org.bukkit.craftbukkit.inventory.CraftItemStack; -import org.bukkit.craftbukkit.util.CraftNamespacedKey; -import org.bukkit.inventory.ItemStack; -import org.bukkit.loot.LootTable; -public class CraftSuspiciousSand extends CraftBlockEntityState implements SuspiciousSand { +public class CraftSuspiciousSand extends CraftBrushableBlock implements SuspiciousSand { - public CraftSuspiciousSand(World world, SuspiciousSandBlockEntity tileEntity) { + public CraftSuspiciousSand(World world, BrushableBlockEntity tileEntity) { super(world, tileEntity); } - - @Override - public ItemStack getItem() { - return CraftItemStack.asBukkitCopy(getSnapshot().getItem()); - } - - @Override - public void setItem(ItemStack item) { - getSnapshot().item = CraftItemStack.asNMSCopy(item); - } - - @Override - public void applyTo(SuspiciousSandBlockEntity lootable) { - super.applyTo(lootable); - - if (this.getSnapshot().lootTable == null) { - lootable.setLootTable((MinecraftKey) null, 0L); - } - } - - @Override - public LootTable getLootTable() { - if (getSnapshot().lootTable == null) { - return null; - } - - MinecraftKey key = getSnapshot().lootTable; - return Bukkit.getLootTable(CraftNamespacedKey.fromMinecraft(key)); - } - - @Override - public void setLootTable(LootTable table) { - setLootTable(table, getSeed()); - } - - @Override - public long getSeed() { - return getSnapshot().lootTableSeed; - } - - @Override - public void setSeed(long seed) { - setLootTable(getLootTable(), seed); - } - - private void setLootTable(LootTable table, long seed) { - MinecraftKey key = (table == null) ? null : CraftNamespacedKey.toMinecraft(table.getKey()); - getSnapshot().setLootTable(key, seed); - } } diff --git a/paper-server/src/main/java/org/bukkit/craftbukkit/block/data/CraftBlockData.java b/paper-server/src/main/java/org/bukkit/craftbukkit/block/data/CraftBlockData.java index 8d0878df57..d6d4c21d7a 100644 --- a/paper-server/src/main/java/org/bukkit/craftbukkit/block/data/CraftBlockData.java +++ b/paper-server/src/main/java/org/bukkit/craftbukkit/block/data/CraftBlockData.java @@ -480,6 +480,8 @@ public class CraftBlockData implements BlockData { register(net.minecraft.world.level.block.BlockWeepingVines.class, org.bukkit.craftbukkit.block.impl.CraftWeepingVines::new); register(net.minecraft.world.level.block.BlockWitherSkull.class, org.bukkit.craftbukkit.block.impl.CraftWitherSkull::new); register(net.minecraft.world.level.block.BlockWitherSkullWall.class, org.bukkit.craftbukkit.block.impl.CraftWitherSkullWall::new); + register(net.minecraft.world.level.block.BrushableBlock.class, org.bukkit.craftbukkit.block.impl.CraftBrushable::new); + register(net.minecraft.world.level.block.CalibratedSculkSensorBlock.class, org.bukkit.craftbukkit.block.impl.CraftCalibratedSculkSensor::new); register(net.minecraft.world.level.block.CandleBlock.class, org.bukkit.craftbukkit.block.impl.CraftCandle::new); register(net.minecraft.world.level.block.CandleCakeBlock.class, org.bukkit.craftbukkit.block.impl.CraftCandleCake::new); register(net.minecraft.world.level.block.CaveVinesBlock.class, org.bukkit.craftbukkit.block.impl.CraftCaveVines::new); @@ -488,6 +490,7 @@ public class CraftBlockData implements BlockData { register(net.minecraft.world.level.block.CherryLeavesBlock.class, org.bukkit.craftbukkit.block.impl.CraftCherryLeaves::new); register(net.minecraft.world.level.block.ChiseledBookShelfBlock.class, org.bukkit.craftbukkit.block.impl.CraftChiseledBookShelf::new); register(net.minecraft.world.level.block.DecoratedPotBlock.class, org.bukkit.craftbukkit.block.impl.CraftDecoratedPot::new); + register(net.minecraft.world.level.block.EquipableCarvedPumpkinBlock.class, org.bukkit.craftbukkit.block.impl.CraftEquipableCarvedPumpkin::new); register(net.minecraft.world.level.block.GlowLichenBlock.class, org.bukkit.craftbukkit.block.impl.CraftGlowLichen::new); register(net.minecraft.world.level.block.HangingRootsBlock.class, org.bukkit.craftbukkit.block.impl.CraftHangingRoots::new); register(net.minecraft.world.level.block.InfestedRotatedPillarBlock.class, org.bukkit.craftbukkit.block.impl.CraftInfestedRotatedPillar::new); @@ -499,6 +502,7 @@ public class CraftBlockData implements BlockData { register(net.minecraft.world.level.block.MangroveRootsBlock.class, org.bukkit.craftbukkit.block.impl.CraftMangroveRoots::new); register(net.minecraft.world.level.block.PiglinWallSkullBlock.class, org.bukkit.craftbukkit.block.impl.CraftPiglinWallSkull::new); register(net.minecraft.world.level.block.PinkPetalsBlock.class, org.bukkit.craftbukkit.block.impl.CraftPinkPetals::new); + register(net.minecraft.world.level.block.PitcherCropBlock.class, org.bukkit.craftbukkit.block.impl.CraftPitcherCrop::new); register(net.minecraft.world.level.block.PointedDripstoneBlock.class, org.bukkit.craftbukkit.block.impl.CraftPointedDripstone::new); register(net.minecraft.world.level.block.PowderSnowCauldronBlock.class, org.bukkit.craftbukkit.block.impl.CraftPowderSnowCauldron::new); register(net.minecraft.world.level.block.SculkCatalystBlock.class, org.bukkit.craftbukkit.block.impl.CraftSculkCatalyst::new); @@ -506,7 +510,7 @@ public class CraftBlockData implements BlockData { register(net.minecraft.world.level.block.SculkShriekerBlock.class, org.bukkit.craftbukkit.block.impl.CraftSculkShrieker::new); register(net.minecraft.world.level.block.SculkVeinBlock.class, org.bukkit.craftbukkit.block.impl.CraftSculkVein::new); register(net.minecraft.world.level.block.SmallDripleafBlock.class, org.bukkit.craftbukkit.block.impl.CraftSmallDripleaf::new); - register(net.minecraft.world.level.block.SuspiciousSandBlock.class, org.bukkit.craftbukkit.block.impl.CraftSuspiciousSand::new); + register(net.minecraft.world.level.block.SnifferEggBlock.class, org.bukkit.craftbukkit.block.impl.CraftSnifferEgg::new); register(net.minecraft.world.level.block.TallSeagrassBlock.class, org.bukkit.craftbukkit.block.impl.CraftTallSeagrass::new); register(net.minecraft.world.level.block.TorchflowerCropBlock.class, org.bukkit.craftbukkit.block.impl.CraftTorchflowerCrop::new); register(net.minecraft.world.level.block.WallHangingSignBlock.class, org.bukkit.craftbukkit.block.impl.CraftWallHangingSign::new); diff --git a/paper-server/src/main/java/org/bukkit/craftbukkit/block/data/CraftBrushable.java b/paper-server/src/main/java/org/bukkit/craftbukkit/block/data/CraftBrushable.java new file mode 100644 index 0000000000..ee4d20b085 --- /dev/null +++ b/paper-server/src/main/java/org/bukkit/craftbukkit/block/data/CraftBrushable.java @@ -0,0 +1,23 @@ +package org.bukkit.craftbukkit.block.data; + +import org.bukkit.block.data.Brushable; + +public abstract class CraftBrushable extends CraftBlockData implements Brushable { + + private static final net.minecraft.world.level.block.state.properties.BlockStateInteger DUSTED = getInteger("dusted"); + + @Override + public int getDusted() { + return get(DUSTED); + } + + @Override + public void setDusted(int dusted) { + set(DUSTED, dusted); + } + + @Override + public int getMaximumDusted() { + return getMax(DUSTED); + } +} diff --git a/paper-server/src/main/java/org/bukkit/craftbukkit/block/data/CraftHatchable.java b/paper-server/src/main/java/org/bukkit/craftbukkit/block/data/CraftHatchable.java new file mode 100644 index 0000000000..462bda804a --- /dev/null +++ b/paper-server/src/main/java/org/bukkit/craftbukkit/block/data/CraftHatchable.java @@ -0,0 +1,23 @@ +package org.bukkit.craftbukkit.block.data; + +import org.bukkit.block.data.Hatchable; + +public abstract class CraftHatchable extends CraftBlockData implements Hatchable { + + private static final net.minecraft.world.level.block.state.properties.BlockStateInteger HATCH = getInteger("hatch"); + + @Override + public int getHatch() { + return get(HATCH); + } + + @Override + public void setHatch(int hatch) { + set(HATCH, hatch); + } + + @Override + public int getMaximumHatch() { + return getMax(HATCH); + } +} diff --git a/paper-server/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftSuspiciousSand.java b/paper-server/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftBrushable.java similarity index 77% rename from paper-server/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftSuspiciousSand.java rename to paper-server/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftBrushable.java index afcb9e096c..444af6dda9 100644 --- a/paper-server/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftSuspiciousSand.java +++ b/paper-server/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftBrushable.java @@ -1,9 +1,9 @@ package org.bukkit.craftbukkit.block.data.type; -import org.bukkit.block.data.type.SuspiciousSand; +import org.bukkit.block.data.Brushable; import org.bukkit.craftbukkit.block.data.CraftBlockData; -public abstract class CraftSuspiciousSand extends CraftBlockData implements SuspiciousSand { +public abstract class CraftBrushable extends CraftBlockData implements Brushable { private static final net.minecraft.world.level.block.state.properties.BlockStateInteger DUSTED = getInteger("dusted"); diff --git a/paper-server/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftTurtleEgg.java b/paper-server/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftTurtleEgg.java index b5e7164f3b..2150d67ecd 100644 --- a/paper-server/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftTurtleEgg.java +++ b/paper-server/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftTurtleEgg.java @@ -6,7 +6,6 @@ import org.bukkit.craftbukkit.block.data.CraftBlockData; public abstract class CraftTurtleEgg extends CraftBlockData implements TurtleEgg { private static final net.minecraft.world.level.block.state.properties.BlockStateInteger EGGS = getInteger("eggs"); - private static final net.minecraft.world.level.block.state.properties.BlockStateInteger HATCH = getInteger("hatch"); @Override public int getEggs() { @@ -27,19 +26,4 @@ public abstract class CraftTurtleEgg extends CraftBlockData implements TurtleEgg public int getMaximumEggs() { return getMax(EGGS); } - - @Override - public int getHatch() { - return get(HATCH); - } - - @Override - public void setHatch(int hatch) { - set(HATCH, hatch); - } - - @Override - public int getMaximumHatch() { - return getMax(HATCH); - } } diff --git a/paper-server/src/main/java/org/bukkit/craftbukkit/block/impl/CraftSuspiciousSand.java b/paper-server/src/main/java/org/bukkit/craftbukkit/block/impl/CraftBrushable.java similarity index 58% rename from paper-server/src/main/java/org/bukkit/craftbukkit/block/impl/CraftSuspiciousSand.java rename to paper-server/src/main/java/org/bukkit/craftbukkit/block/impl/CraftBrushable.java index b92f320ba6..31de535aab 100644 --- a/paper-server/src/main/java/org/bukkit/craftbukkit/block/impl/CraftSuspiciousSand.java +++ b/paper-server/src/main/java/org/bukkit/craftbukkit/block/impl/CraftBrushable.java @@ -3,19 +3,19 @@ */ package org.bukkit.craftbukkit.block.impl; -public final class CraftSuspiciousSand extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.type.SuspiciousSand { +public final class CraftBrushable extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.Brushable { - public CraftSuspiciousSand() { + public CraftBrushable() { super(); } - public CraftSuspiciousSand(net.minecraft.world.level.block.state.IBlockData state) { + public CraftBrushable(net.minecraft.world.level.block.state.IBlockData state) { super(state); } - // org.bukkit.craftbukkit.block.data.type.CraftSuspiciousSand + // org.bukkit.craftbukkit.block.data.CraftBrushable - private static final net.minecraft.world.level.block.state.properties.BlockStateInteger DUSTED = getInteger(net.minecraft.world.level.block.SuspiciousSandBlock.class, "dusted"); + private static final net.minecraft.world.level.block.state.properties.BlockStateInteger DUSTED = getInteger(net.minecraft.world.level.block.BrushableBlock.class, "dusted"); @Override public int getDusted() { diff --git a/paper-server/src/main/java/org/bukkit/craftbukkit/block/impl/CraftCalibratedSculkSensor.java b/paper-server/src/main/java/org/bukkit/craftbukkit/block/impl/CraftCalibratedSculkSensor.java new file mode 100644 index 0000000000..48d0591a3d --- /dev/null +++ b/paper-server/src/main/java/org/bukkit/craftbukkit/block/impl/CraftCalibratedSculkSensor.java @@ -0,0 +1,81 @@ +/** + * Automatically generated file, changes will be lost. + */ +package org.bukkit.craftbukkit.block.impl; + +public final class CraftCalibratedSculkSensor extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.type.CalibratedSculkSensor, org.bukkit.block.data.Directional, org.bukkit.block.data.type.SculkSensor, org.bukkit.block.data.AnaloguePowerable, org.bukkit.block.data.Waterlogged { + + public CraftCalibratedSculkSensor() { + super(); + } + + public CraftCalibratedSculkSensor(net.minecraft.world.level.block.state.IBlockData state) { + super(state); + } + + // org.bukkit.craftbukkit.block.data.CraftDirectional + + private static final net.minecraft.world.level.block.state.properties.BlockStateEnum FACING = getEnum(net.minecraft.world.level.block.CalibratedSculkSensorBlock.class, "facing"); + + @Override + public org.bukkit.block.BlockFace getFacing() { + return get(FACING, org.bukkit.block.BlockFace.class); + } + + @Override + public void setFacing(org.bukkit.block.BlockFace facing) { + set(FACING, facing); + } + + @Override + public java.util.Set getFaces() { + return getValues(FACING, org.bukkit.block.BlockFace.class); + } + + // org.bukkit.craftbukkit.block.data.type.CraftSculkSensor + + private static final net.minecraft.world.level.block.state.properties.BlockStateEnum PHASE = getEnum(net.minecraft.world.level.block.CalibratedSculkSensorBlock.class, "sculk_sensor_phase"); + + @Override + public org.bukkit.block.data.type.SculkSensor.Phase getPhase() { + return get(PHASE, org.bukkit.block.data.type.SculkSensor.Phase.class); + } + + @Override + public void setPhase(org.bukkit.block.data.type.SculkSensor.Phase phase) { + set(PHASE, phase); + } + + // org.bukkit.craftbukkit.block.data.CraftAnaloguePowerable + + private static final net.minecraft.world.level.block.state.properties.BlockStateInteger POWER = getInteger(net.minecraft.world.level.block.CalibratedSculkSensorBlock.class, "power"); + + @Override + public int getPower() { + return get(POWER); + } + + @Override + public void setPower(int power) { + set(POWER, power); + } + + @Override + public int getMaximumPower() { + return getMax(POWER); + } + + // org.bukkit.craftbukkit.block.data.CraftWaterlogged + + private static final net.minecraft.world.level.block.state.properties.BlockStateBoolean WATERLOGGED = getBoolean(net.minecraft.world.level.block.CalibratedSculkSensorBlock.class, "waterlogged"); + + @Override + public boolean isWaterlogged() { + return get(WATERLOGGED); + } + + @Override + public void setWaterlogged(boolean waterlogged) { + set(WATERLOGGED, waterlogged); + } +} diff --git a/paper-server/src/main/java/org/bukkit/craftbukkit/block/impl/CraftEquipableCarvedPumpkin.java b/paper-server/src/main/java/org/bukkit/craftbukkit/block/impl/CraftEquipableCarvedPumpkin.java new file mode 100644 index 0000000000..11cb5f2626 --- /dev/null +++ b/paper-server/src/main/java/org/bukkit/craftbukkit/block/impl/CraftEquipableCarvedPumpkin.java @@ -0,0 +1,34 @@ +/** + * Automatically generated file, changes will be lost. + */ +package org.bukkit.craftbukkit.block.impl; + +public final class CraftEquipableCarvedPumpkin extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.Directional { + + public CraftEquipableCarvedPumpkin() { + super(); + } + + public CraftEquipableCarvedPumpkin(net.minecraft.world.level.block.state.IBlockData state) { + super(state); + } + + // org.bukkit.craftbukkit.block.data.CraftDirectional + + private static final net.minecraft.world.level.block.state.properties.BlockStateEnum FACING = getEnum(net.minecraft.world.level.block.EquipableCarvedPumpkinBlock.class, "facing"); + + @Override + public org.bukkit.block.BlockFace getFacing() { + return get(FACING, org.bukkit.block.BlockFace.class); + } + + @Override + public void setFacing(org.bukkit.block.BlockFace facing) { + set(FACING, facing); + } + + @Override + public java.util.Set getFaces() { + return getValues(FACING, org.bukkit.block.BlockFace.class); + } +} diff --git a/paper-server/src/main/java/org/bukkit/craftbukkit/block/impl/CraftPitcherCrop.java b/paper-server/src/main/java/org/bukkit/craftbukkit/block/impl/CraftPitcherCrop.java new file mode 100644 index 0000000000..d529867f06 --- /dev/null +++ b/paper-server/src/main/java/org/bukkit/craftbukkit/block/impl/CraftPitcherCrop.java @@ -0,0 +1,48 @@ +/** + * Automatically generated file, changes will be lost. + */ +package org.bukkit.craftbukkit.block.impl; + +public final class CraftPitcherCrop extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.type.PitcherCrop, org.bukkit.block.data.Ageable, org.bukkit.block.data.Bisected { + + public CraftPitcherCrop() { + super(); + } + + public CraftPitcherCrop(net.minecraft.world.level.block.state.IBlockData state) { + super(state); + } + + // org.bukkit.craftbukkit.block.data.CraftAgeable + + private static final net.minecraft.world.level.block.state.properties.BlockStateInteger AGE = getInteger(net.minecraft.world.level.block.PitcherCropBlock.class, "age"); + + @Override + public int getAge() { + return get(AGE); + } + + @Override + public void setAge(int age) { + set(AGE, age); + } + + @Override + public int getMaximumAge() { + return getMax(AGE); + } + + // org.bukkit.craftbukkit.block.data.CraftBisected + + private static final net.minecraft.world.level.block.state.properties.BlockStateEnum HALF = getEnum(net.minecraft.world.level.block.PitcherCropBlock.class, "half"); + + @Override + public org.bukkit.block.data.Bisected.Half getHalf() { + return get(HALF, org.bukkit.block.data.Bisected.Half.class); + } + + @Override + public void setHalf(org.bukkit.block.data.Bisected.Half half) { + set(HALF, half); + } +} diff --git a/paper-server/src/main/java/org/bukkit/craftbukkit/block/impl/CraftSnifferEgg.java b/paper-server/src/main/java/org/bukkit/craftbukkit/block/impl/CraftSnifferEgg.java new file mode 100644 index 0000000000..53957ea2f6 --- /dev/null +++ b/paper-server/src/main/java/org/bukkit/craftbukkit/block/impl/CraftSnifferEgg.java @@ -0,0 +1,34 @@ +/** + * Automatically generated file, changes will be lost. + */ +package org.bukkit.craftbukkit.block.impl; + +public final class CraftSnifferEgg extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.Hatchable { + + public CraftSnifferEgg() { + super(); + } + + public CraftSnifferEgg(net.minecraft.world.level.block.state.IBlockData state) { + super(state); + } + + // org.bukkit.craftbukkit.block.data.CraftHatchable + + private static final net.minecraft.world.level.block.state.properties.BlockStateInteger HATCH = getInteger(net.minecraft.world.level.block.SnifferEggBlock.class, "hatch"); + + @Override + public int getHatch() { + return get(HATCH); + } + + @Override + public void setHatch(int hatch) { + set(HATCH, hatch); + } + + @Override + public int getMaximumHatch() { + return getMax(HATCH); + } +} diff --git a/paper-server/src/main/java/org/bukkit/craftbukkit/block/impl/CraftTurtleEgg.java b/paper-server/src/main/java/org/bukkit/craftbukkit/block/impl/CraftTurtleEgg.java index b916d3f556..99937123c3 100644 --- a/paper-server/src/main/java/org/bukkit/craftbukkit/block/impl/CraftTurtleEgg.java +++ b/paper-server/src/main/java/org/bukkit/craftbukkit/block/impl/CraftTurtleEgg.java @@ -3,7 +3,7 @@ */ package org.bukkit.craftbukkit.block.impl; -public final class CraftTurtleEgg extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.type.TurtleEgg { +public final class CraftTurtleEgg extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.type.TurtleEgg, org.bukkit.block.data.Hatchable { public CraftTurtleEgg() { super(); @@ -16,7 +16,6 @@ public final class CraftTurtleEgg extends org.bukkit.craftbukkit.block.data.Craf // org.bukkit.craftbukkit.block.data.type.CraftTurtleEgg private static final net.minecraft.world.level.block.state.properties.BlockStateInteger EGGS = getInteger(net.minecraft.world.level.block.BlockTurtleEgg.class, "eggs"); - private static final net.minecraft.world.level.block.state.properties.BlockStateInteger HATCH = getInteger(net.minecraft.world.level.block.BlockTurtleEgg.class, "hatch"); @Override public int getEggs() { @@ -38,6 +37,10 @@ public final class CraftTurtleEgg extends org.bukkit.craftbukkit.block.data.Craf return getMax(EGGS); } + // org.bukkit.craftbukkit.block.data.CraftHatchable + + private static final net.minecraft.world.level.block.state.properties.BlockStateInteger HATCH = getInteger(net.minecraft.world.level.block.BlockTurtleEgg.class, "hatch"); + @Override public int getHatch() { return get(HATCH); diff --git a/paper-server/src/main/java/org/bukkit/craftbukkit/block/sign/CraftSignSide.java b/paper-server/src/main/java/org/bukkit/craftbukkit/block/sign/CraftSignSide.java index d4e3b4b465..0bae2463e8 100644 --- a/paper-server/src/main/java/org/bukkit/craftbukkit/block/sign/CraftSignSide.java +++ b/paper-server/src/main/java/org/bukkit/craftbukkit/block/sign/CraftSignSide.java @@ -1,7 +1,8 @@ package org.bukkit.craftbukkit.block.sign; +import net.minecraft.network.chat.IChatBaseComponent; import net.minecraft.world.item.EnumColor; -import net.minecraft.world.level.block.entity.TileEntitySign; +import net.minecraft.world.level.block.entity.SignText; import org.bukkit.DyeColor; import org.bukkit.block.sign.SignSide; import org.bukkit.craftbukkit.block.CraftSign; @@ -14,9 +15,9 @@ public class CraftSignSide implements SignSide { // Lazily initialized only if requested: private String[] originalLines = null; private String[] lines = null; - private final TileEntitySign signText; + private final SignText signText; - public CraftSignSide(TileEntitySign signText) { + public CraftSignSide(SignText signText) { this.signText = signText; } @@ -25,8 +26,9 @@ public class CraftSignSide implements SignSide { public String[] getLines() { if (lines == null) { // Lazy initialization: - lines = new String[signText.messages.length]; - System.arraycopy(CraftSign.revertComponents(signText.messages), 0, lines, 0, lines.length); + IChatBaseComponent[] messages = signText.getMessages(false); + lines = new String[messages.length]; + System.arraycopy(CraftSign.revertComponents(messages), 0, lines, 0, lines.length); originalLines = new String[lines.length]; System.arraycopy(lines, 0, originalLines, 0, originalLines.length); } diff --git a/paper-server/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java b/paper-server/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java index 16b9623e33..2d79f30b95 100644 --- a/paper-server/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java +++ b/paper-server/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java @@ -489,7 +489,7 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity { if (entity instanceof EntityArrow) { return ((EntityArrow) entity).inGround; } - return entity.isOnGround(); + return entity.onGround(); } @Override @@ -499,7 +499,7 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity { @Override public World getWorld() { - return entity.level.getWorld(); + return entity.level().getWorld(); } @Override @@ -564,7 +564,7 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity { public List getNearbyEntities(double x, double y, double z) { Preconditions.checkState(!entity.generation, "Cannot get nearby entities during world generation"); - List notchEntityList = entity.level.getEntities(entity, entity.getBoundingBox().inflate(x, y, z), Predicates.alwaysTrue()); + List notchEntityList = entity.level().getEntities(entity, entity.getBoundingBox().inflate(x, y, z), Predicates.alwaysTrue()); List bukkitEntityList = new java.util.ArrayList(notchEntityList.size()); for (Entity e : notchEntityList) { @@ -768,7 +768,7 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity { Preconditions.checkState(!entity.generation, "Cannot play effect during world generation"); if (type.getApplicable().isInstance(this)) { - this.getHandle().level.broadcastEntityEvent(getHandle(), type.getData()); + this.getHandle().level().broadcastEntityEvent(getHandle(), type.getData()); } } diff --git a/paper-server/src/main/java/org/bukkit/craftbukkit/entity/CraftFishHook.java b/paper-server/src/main/java/org/bukkit/craftbukkit/entity/CraftFishHook.java index eec57195a8..b165fe1196 100644 --- a/paper-server/src/main/java/org/bukkit/craftbukkit/entity/CraftFishHook.java +++ b/paper-server/src/main/java/org/bukkit/craftbukkit/entity/CraftFishHook.java @@ -156,7 +156,7 @@ public class CraftFishHook extends CraftProjectile implements FishHook { EntityFishingHook hook = getHandle(); if (this.biteChance == -1) { - if (hook.level.isRainingAt(BlockPosition.containing(hook.position()).offset(0, 1, 0))) { + if (hook.level().isRainingAt(BlockPosition.containing(hook.position()).offset(0, 1, 0))) { return 1 / 300.0; } return 1 / 500.0; diff --git a/paper-server/src/main/java/org/bukkit/craftbukkit/entity/CraftHumanEntity.java b/paper-server/src/main/java/org/bukkit/craftbukkit/entity/CraftHumanEntity.java index 3df8d342f7..c25f8bcf84 100644 --- a/paper-server/src/main/java/org/bukkit/craftbukkit/entity/CraftHumanEntity.java +++ b/paper-server/src/main/java/org/bukkit/craftbukkit/entity/CraftHumanEntity.java @@ -138,7 +138,7 @@ public class CraftHumanEntity extends CraftLivingEntity implements HumanEntity { Preconditions.checkArgument(location.getWorld().equals(getWorld()), "Cannot sleep across worlds"); BlockPosition blockposition = CraftLocation.toBlockPosition(location); - IBlockData iblockdata = getHandle().level.getBlockState(blockposition); + IBlockData iblockdata = getHandle().level().getBlockState(blockposition); if (!(iblockdata.getBlock() instanceof BlockBed)) { return false; } @@ -149,7 +149,7 @@ public class CraftHumanEntity extends CraftLivingEntity implements HumanEntity { // From BlockBed iblockdata = iblockdata.setValue(BlockBed.OCCUPIED, true); - getHandle().level.setBlock(blockposition, iblockdata, 4); + getHandle().level().setBlock(blockposition, iblockdata, 4); return true; } @@ -296,7 +296,7 @@ public class CraftHumanEntity extends CraftLivingEntity implements HumanEntity { if (iinventory instanceof TileEntity) { TileEntity te = (TileEntity) iinventory; if (!te.hasLevel()) { - te.setLevel(getHandle().level); + te.setLevel(getHandle().level()); } } } @@ -341,7 +341,7 @@ public class CraftHumanEntity extends CraftLivingEntity implements HumanEntity { return null; } } - getHandle().openMenu(((BlockWorkbench) Blocks.CRAFTING_TABLE).getMenuProvider(null, getHandle().level, CraftLocation.toBlockPosition(location))); + getHandle().openMenu(((BlockWorkbench) Blocks.CRAFTING_TABLE).getMenuProvider(null, getHandle().level(), CraftLocation.toBlockPosition(location))); if (force) { getHandle().containerMenu.checkReachable = false; } @@ -362,7 +362,7 @@ public class CraftHumanEntity extends CraftLivingEntity implements HumanEntity { // If there isn't an enchant table we can force create one, won't be very useful though. BlockPosition pos = CraftLocation.toBlockPosition(location); - getHandle().openMenu(((BlockEnchantmentTable) Blocks.ENCHANTING_TABLE).getMenuProvider(null, getHandle().level, pos)); + getHandle().openMenu(((BlockEnchantmentTable) Blocks.ENCHANTING_TABLE).getMenuProvider(null, getHandle().level(), pos)); if (force) { getHandle().containerMenu.checkReachable = false; @@ -544,7 +544,7 @@ public class CraftHumanEntity extends CraftLivingEntity implements HumanEntity { private Collection> bukkitKeysToMinecraftRecipes(Collection recipeKeys) { Collection> recipes = new ArrayList<>(); - CraftingManager manager = getHandle().level.getServer().getRecipeManager(); + CraftingManager manager = getHandle().level().getServer().getRecipeManager(); for (NamespacedKey recipeKey : recipeKeys) { Optional> recipe = manager.byKey(CraftNamespacedKey.toMinecraft(recipeKey)); @@ -561,7 +561,7 @@ public class CraftHumanEntity extends CraftLivingEntity implements HumanEntity { @Override public org.bukkit.entity.Entity getShoulderEntityLeft() { if (!getHandle().getShoulderEntityLeft().isEmpty()) { - Optional shoulder = EntityTypes.create(getHandle().getShoulderEntityLeft(), getHandle().level); + Optional shoulder = EntityTypes.create(getHandle().getShoulderEntityLeft(), getHandle().level()); return (!shoulder.isPresent()) ? null : shoulder.get().getBukkitEntity(); } @@ -580,7 +580,7 @@ public class CraftHumanEntity extends CraftLivingEntity implements HumanEntity { @Override public org.bukkit.entity.Entity getShoulderEntityRight() { if (!getHandle().getShoulderEntityRight().isEmpty()) { - Optional shoulder = EntityTypes.create(getHandle().getShoulderEntityRight(), getHandle().level); + Optional shoulder = EntityTypes.create(getHandle().getShoulderEntityRight(), getHandle().level()); return (!shoulder.isPresent()) ? null : shoulder.get().getBukkitEntity(); } @@ -681,8 +681,8 @@ public class CraftHumanEntity extends CraftLivingEntity implements HumanEntity { Preconditions.checkArgument(fireworkItemStack != null, "fireworkItemStack must not be null"); Preconditions.checkArgument(fireworkItemStack.getType() == Material.FIREWORK_ROCKET, "fireworkItemStack must be of type %s", Material.FIREWORK_ROCKET); - EntityFireworks fireworks = new EntityFireworks(getHandle().level, CraftItemStack.asNMSCopy(fireworkItemStack), getHandle()); - boolean success = getHandle().level.addFreshEntity(fireworks, SpawnReason.CUSTOM); + EntityFireworks fireworks = new EntityFireworks(getHandle().level(), CraftItemStack.asNMSCopy(fireworkItemStack), getHandle()); + boolean success = getHandle().level().addFreshEntity(fireworks, SpawnReason.CUSTOM); return success ? (Firework) fireworks.getBukkitEntity() : null; } } diff --git a/paper-server/src/main/java/org/bukkit/craftbukkit/entity/CraftItemFrame.java b/paper-server/src/main/java/org/bukkit/craftbukkit/entity/CraftItemFrame.java index b9e0df66fa..1ff379bf6f 100644 --- a/paper-server/src/main/java/org/bukkit/craftbukkit/entity/CraftItemFrame.java +++ b/paper-server/src/main/java/org/bukkit/craftbukkit/entity/CraftItemFrame.java @@ -48,7 +48,7 @@ public class CraftItemFrame extends CraftHanging implements ItemFrame { // update redstone if (!getHandle().generation) { - getHandle().getLevel().updateNeighbourForOutputSignal(getHandle().pos, Blocks.AIR); + getHandle().level().updateNeighbourForOutputSignal(getHandle().pos, Blocks.AIR); } } diff --git a/paper-server/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/paper-server/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java index be4affa765..7c4ea7f68b 100644 --- a/paper-server/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +++ b/paper-server/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java @@ -85,6 +85,7 @@ import net.minecraft.world.inventory.Container; import net.minecraft.world.item.EnumColor; import net.minecraft.world.level.EnumGamemode; import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.entity.SignText; import net.minecraft.world.level.block.entity.TileEntitySign; import net.minecraft.world.level.block.state.IBlockData; import net.minecraft.world.level.border.IWorldBorderListener; @@ -148,7 +149,6 @@ import org.bukkit.entity.Player; import org.bukkit.event.player.PlayerExpCooldownChangeEvent; import org.bukkit.event.player.PlayerHideEntityEvent; import org.bukkit.event.player.PlayerRegisterChannelEvent; -import org.bukkit.event.player.PlayerRespawnEvent.RespawnReason; import org.bukkit.event.player.PlayerShowEntityEvent; import org.bukkit.event.player.PlayerSpawnChangeEvent; import org.bukkit.event.player.PlayerTeleportEvent; @@ -644,7 +644,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player { } @Override - public void sendBlockChanges(Collection blocks, boolean suppressLightUpdates) { + public void sendBlockChanges(Collection blocks) { Preconditions.checkArgument(blocks != null, "blocks must not be null"); if (getHandle().connection == null || blocks.isEmpty()) { @@ -669,11 +669,16 @@ public class CraftPlayer extends CraftHumanEntity implements Player { // Construct the packets using the data allocated above and send then to the players for (Map.Entry entry : changes.entrySet()) { ChunkSectionChanges chunkChanges = entry.getValue(); - PacketPlayOutMultiBlockChange packet = new PacketPlayOutMultiBlockChange(entry.getKey(), chunkChanges.positions(), chunkChanges.blockData().toArray(IBlockData[]::new), suppressLightUpdates); + PacketPlayOutMultiBlockChange packet = new PacketPlayOutMultiBlockChange(entry.getKey(), chunkChanges.positions(), chunkChanges.blockData().toArray(IBlockData[]::new)); getHandle().connection.send(packet); } } + @Override + public void sendBlockChanges(Collection blocks, boolean suppressLightUpdates) { + this.sendBlockChanges(blocks); + } + private record ChunkSectionChanges(ShortSet positions, List blockData) { public ChunkSectionChanges() { @@ -736,10 +741,11 @@ public class CraftPlayer extends CraftHumanEntity implements Player { IChatBaseComponent[] components = CraftSign.sanitizeLines(lines); TileEntitySign sign = new TileEntitySign(CraftLocation.toBlockPosition(loc), Blocks.OAK_SIGN.defaultBlockState()); - sign.setColor(EnumColor.byId(dyeColor.getWoolData())); - sign.setHasGlowingText(hasGlowingText); + SignText text = sign.getFrontText(); + text.setColor(EnumColor.byId(dyeColor.getWoolData())); + text.setHasGlowingText(hasGlowingText); for (int i = 0; i < components.length; i++) { - sign.setMessage(i, components[i]); + text.setMessage(i, components[i]); } getHandle().connection.send(sign.getUpdatePacket()); @@ -1368,7 +1374,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player { private void untrackAndHideEntity(org.bukkit.entity.Entity entity) { // Remove this entity from the hidden player's EntityTrackerEntry - PlayerChunkMap tracker = ((WorldServer) getHandle().level).getChunkSource().chunkMap; + PlayerChunkMap tracker = ((WorldServer) getHandle().level()).getChunkSource().chunkMap; Entity other = ((CraftEntity) entity).getHandle(); PlayerChunkMap.EntityTracker entry = tracker.entityMap.get(other.getId()); if (entry != null) { @@ -1448,7 +1454,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player { } private void trackAndShowEntity(org.bukkit.entity.Entity entity) { - PlayerChunkMap tracker = ((WorldServer) getHandle().level).getChunkSource().chunkMap; + PlayerChunkMap tracker = ((WorldServer) getHandle().level()).getChunkSource().chunkMap; Entity other = ((CraftEntity) entity).getHandle(); if (other instanceof EntityPlayer) { diff --git a/paper-server/src/main/java/org/bukkit/craftbukkit/entity/CraftRaider.java b/paper-server/src/main/java/org/bukkit/craftbukkit/entity/CraftRaider.java index 824accc7fb..8c442386bb 100644 --- a/paper-server/src/main/java/org/bukkit/craftbukkit/entity/CraftRaider.java +++ b/paper-server/src/main/java/org/bukkit/craftbukkit/entity/CraftRaider.java @@ -1,7 +1,6 @@ package org.bukkit.craftbukkit.entity; import com.google.common.base.Preconditions; -import net.minecraft.core.BlockPosition; import net.minecraft.world.entity.raid.EntityRaider; import org.bukkit.Sound; import org.bukkit.block.Block; @@ -28,7 +27,7 @@ public abstract class CraftRaider extends CraftMonster implements Raider { @Override public Block getPatrolTarget() { - return getHandle().getPatrolTarget() == null ? null : CraftBlock.at(getHandle().level, getHandle().getPatrolTarget()); + return getHandle().getPatrolTarget() == null ? null : CraftBlock.at(getHandle().level(), getHandle().getPatrolTarget()); } @Override diff --git a/paper-server/src/main/java/org/bukkit/craftbukkit/entity/CraftSniffer.java b/paper-server/src/main/java/org/bukkit/craftbukkit/entity/CraftSniffer.java index 0c2795d5c2..9848733296 100644 --- a/paper-server/src/main/java/org/bukkit/craftbukkit/entity/CraftSniffer.java +++ b/paper-server/src/main/java/org/bukkit/craftbukkit/entity/CraftSniffer.java @@ -34,7 +34,7 @@ public class CraftSniffer extends CraftAnimals implements Sniffer { @Override public Collection getExploredLocations() { - return this.getHandle().getExploredPositions().map(blockPosition -> CraftLocation.toBukkit(blockPosition, this.getLocation().getWorld())).collect(Collectors.toList()); + return this.getHandle().getExploredPositions().map(blockPosition -> CraftLocation.toBukkit(blockPosition.pos(), this.server.getServer().getLevel(blockPosition.dimension()))).collect(Collectors.toList()); } @Override @@ -79,19 +79,19 @@ public class CraftSniffer extends CraftAnimals implements Sniffer { return this.getHandle().canDig(); } - private net.minecraft.world.entity.animal.sniffer.Sniffer.a stateToNMS(Sniffer.State state) { + private net.minecraft.world.entity.animal.sniffer.Sniffer.State stateToNMS(Sniffer.State state) { return switch (state) { - case IDLING -> net.minecraft.world.entity.animal.sniffer.Sniffer.a.IDLING; - case FEELING_HAPPY -> net.minecraft.world.entity.animal.sniffer.Sniffer.a.FEELING_HAPPY; - case SCENTING -> net.minecraft.world.entity.animal.sniffer.Sniffer.a.SCENTING; - case SNIFFING -> net.minecraft.world.entity.animal.sniffer.Sniffer.a.SNIFFING; - case SEARCHING -> net.minecraft.world.entity.animal.sniffer.Sniffer.a.SEARCHING; - case DIGGING -> net.minecraft.world.entity.animal.sniffer.Sniffer.a.DIGGING; - case RISING -> net.minecraft.world.entity.animal.sniffer.Sniffer.a.RISING; + case IDLING -> net.minecraft.world.entity.animal.sniffer.Sniffer.State.IDLING; + case FEELING_HAPPY -> net.minecraft.world.entity.animal.sniffer.Sniffer.State.FEELING_HAPPY; + case SCENTING -> net.minecraft.world.entity.animal.sniffer.Sniffer.State.SCENTING; + case SNIFFING -> net.minecraft.world.entity.animal.sniffer.Sniffer.State.SNIFFING; + case SEARCHING -> net.minecraft.world.entity.animal.sniffer.Sniffer.State.SEARCHING; + case DIGGING -> net.minecraft.world.entity.animal.sniffer.Sniffer.State.DIGGING; + case RISING -> net.minecraft.world.entity.animal.sniffer.Sniffer.State.RISING; }; } - private Sniffer.State stateToBukkit(net.minecraft.world.entity.animal.sniffer.Sniffer.a state) { + private Sniffer.State stateToBukkit(net.minecraft.world.entity.animal.sniffer.Sniffer.State state) { return switch (state) { case IDLING -> Sniffer.State.IDLING; case FEELING_HAPPY -> Sniffer.State.FEELING_HAPPY; diff --git a/paper-server/src/main/java/org/bukkit/craftbukkit/entity/CraftVillager.java b/paper-server/src/main/java/org/bukkit/craftbukkit/entity/CraftVillager.java index a33d2b3c00..adf6e03747 100644 --- a/paper-server/src/main/java/org/bukkit/craftbukkit/entity/CraftVillager.java +++ b/paper-server/src/main/java/org/bukkit/craftbukkit/entity/CraftVillager.java @@ -102,7 +102,7 @@ public class CraftVillager extends CraftAbstractVillager implements Villager { Preconditions.checkState(!getHandle().generation, "Cannot sleep during world generation"); BlockPosition position = CraftLocation.toBlockPosition(location); - IBlockData iblockdata = getHandle().level.getBlockState(position); + IBlockData iblockdata = getHandle().level().getBlockState(position); if (!(iblockdata.getBlock() instanceof BlockBed)) { return false; } @@ -126,7 +126,7 @@ public class CraftVillager extends CraftAbstractVillager implements Villager { @Override public ZombieVillager zombify() { - EntityZombieVillager entityzombievillager = EntityZombie.zombifyVillager(getHandle().level.getMinecraftWorld(), getHandle(), getHandle().blockPosition(), isSilent(), CreatureSpawnEvent.SpawnReason.CUSTOM); + EntityZombieVillager entityzombievillager = EntityZombie.zombifyVillager(getHandle().level().getMinecraftWorld(), getHandle(), getHandle().blockPosition(), isSilent(), CreatureSpawnEvent.SpawnReason.CUSTOM); return (entityzombievillager != null) ? (ZombieVillager) entityzombievillager.getBukkitEntity() : null; } diff --git a/paper-server/src/main/java/org/bukkit/craftbukkit/entity/CraftWither.java b/paper-server/src/main/java/org/bukkit/craftbukkit/entity/CraftWither.java index be80058b37..bafe5fed0b 100644 --- a/paper-server/src/main/java/org/bukkit/craftbukkit/entity/CraftWither.java +++ b/paper-server/src/main/java/org/bukkit/craftbukkit/entity/CraftWither.java @@ -58,7 +58,7 @@ public class CraftWither extends CraftMonster implements Wither { if (entityId == 0) { return null; } - Entity target = getHandle().getLevel().getEntity(entityId); + Entity target = getHandle().level().getEntity(entityId); return (target != null) ? (LivingEntity) target.getBukkitEntity() : null; } diff --git a/paper-server/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java b/paper-server/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java index 14a429cf45..58134f53e2 100644 --- a/paper-server/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java +++ b/paper-server/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java @@ -284,7 +284,7 @@ public class CraftEventFactory { } }, t -> BedEnterResult.OK).map(java.util.function.Function.identity(), java.util.function.Function.identity()); - PlayerBedEnterEvent event = new PlayerBedEnterEvent((Player) player.getBukkitEntity(), CraftBlock.at(player.level, bed), bedEnterResult); + PlayerBedEnterEvent event = new PlayerBedEnterEvent((Player) player.getBukkitEntity(), CraftBlock.at(player.level(), bed), bedEnterResult); Bukkit.getServer().getPluginManager().callEvent(event); Result result = event.useBed(); @@ -422,7 +422,7 @@ public class CraftEventFactory { if (!event.isCancelled()) { for (EntityItem item : items) { - item.level.addFreshEntity(item); + item.level().addFreshEntity(item); } } } @@ -437,7 +437,7 @@ public class CraftEventFactory { org.bukkit.block.BlockFace blockFace = org.bukkit.craftbukkit.block.CraftBlock.notchToBlockFace(clickedFace); EntityPlaceEvent event = new EntityPlaceEvent(entity.getBukkitEntity(), who, blockClicked, blockFace, CraftEquipmentSlot.getHand(enumhand)); - entity.level.getCraftServer().getPluginManager().callEvent(event); + entity.level().getCraftServer().getPluginManager().callEvent(event); return event; } @@ -587,7 +587,7 @@ public class CraftEventFactory { Player player = who.getBukkitEntity(); CraftItemStack itemInHand = CraftItemStack.asCraftMirror(itemstack); - Block blockClicked = CraftBlock.at(who.getLevel(), pos); + Block blockClicked = CraftBlock.at(who.level(), pos); BlockDamageEvent event = new BlockDamageEvent(player, blockClicked, itemInHand, instaBreak); player.getServer().getPluginManager().callEvent(event); @@ -599,7 +599,7 @@ public class CraftEventFactory { Player player = who.getBukkitEntity(); CraftItemStack itemInHand = CraftItemStack.asCraftMirror(itemstack); - Block blockClicked = CraftBlock.at(who.getLevel(), pos); + Block blockClicked = CraftBlock.at(who.level(), pos); BlockDamageAbortEvent event = new BlockDamageAbortEvent(player, blockClicked, itemInHand); player.getServer().getPluginManager().callEvent(event); @@ -917,7 +917,7 @@ public class CraftEventFactory { } return callEntityDamageEvent(damager, entity, cause, modifiers, modifierFunctions, cancelled); - } else if (source.is(DamageTypes.OUT_OF_WORLD)) { + } else if (source.is(DamageTypes.FELL_OUT_OF_WORLD)) { EntityDamageEvent event = new EntityDamageByBlockEvent(null, entity.getBukkitEntity(), DamageCause.VOID, modifiers, modifierFunctions); event.setCancelled(cancelled); callEvent(event); @@ -1194,7 +1194,7 @@ public class CraftEventFactory { } public static EntityChangeBlockEvent callEntityChangeBlockEvent(Entity entity, BlockPosition position, IBlockData newBlock, boolean cancelled) { - Block block = entity.level.getWorld().getBlockAt(position.getX(), position.getY(), position.getZ()); + Block block = entity.level().getWorld().getBlockAt(position.getX(), position.getY(), position.getZ()); EntityChangeBlockEvent event = new EntityChangeBlockEvent(entity.getBukkitEntity(), block, CraftBlockData.fromData(newBlock)); event.setCancelled(cancelled); @@ -1222,7 +1222,7 @@ public class CraftEventFactory { public static EntityBreakDoorEvent callEntityBreakDoorEvent(Entity entity, BlockPosition pos) { org.bukkit.entity.Entity entity1 = entity.getBukkitEntity(); - Block block = CraftBlock.at(entity.level, pos); + Block block = CraftBlock.at(entity.level(), pos); EntityBreakDoorEvent event = new EntityBreakDoorEvent((LivingEntity) entity1, block); entity1.getServer().getPluginManager().callEvent(event); @@ -1239,7 +1239,7 @@ public class CraftEventFactory { player.connection.handleContainerClose(new PacketPlayInCloseWindow(player.containerMenu.containerId)); } - CraftServer server = player.level.getCraftServer(); + CraftServer server = player.level().getCraftServer(); CraftPlayer craftPlayer = player.getBukkitEntity(); player.containerMenu.transferTo(container, craftPlayer); @@ -1283,7 +1283,7 @@ public class CraftEventFactory { BlockFace hitFace = null; if (position.getType() == MovingObjectPosition.EnumMovingObjectType.BLOCK) { MovingObjectPositionBlock positionBlock = (MovingObjectPositionBlock) position; - hitBlock = CraftBlock.at(entity.level, positionBlock.getBlockPos()); + hitBlock = CraftBlock.at(entity.level(), positionBlock.getBlockPos()); hitFace = CraftBlock.notchToBlockFace(positionBlock.getDirection()); } @@ -1293,7 +1293,7 @@ public class CraftEventFactory { } ProjectileHitEvent event = new ProjectileHitEvent((Projectile) entity.getBukkitEntity(), hitEntity, hitBlock, hitFace); - entity.level.getCraftServer().getPluginManager().callEvent(event); + entity.level().getCraftServer().getPluginManager().callEvent(event); return event; } @@ -1394,13 +1394,13 @@ public class CraftEventFactory { public static void handleInventoryCloseEvent(EntityHuman human) { InventoryCloseEvent event = new InventoryCloseEvent(human.containerMenu.getBukkitView()); - human.level.getCraftServer().getPluginManager().callEvent(event); + human.level().getCraftServer().getPluginManager().callEvent(event); human.containerMenu.transferTo(human.inventoryMenu, human.getBukkitEntity()); } public static ItemStack handleEditBookEvent(EntityPlayer player, int itemInHandIndex, ItemStack itemInHand, ItemStack newBookItem) { PlayerEditBookEvent editBookEvent = new PlayerEditBookEvent(player.getBukkitEntity(), (itemInHandIndex >= 0 && itemInHandIndex <= 8) ? itemInHandIndex : -1, (BookMeta) CraftItemStack.getItemMeta(itemInHand), (BookMeta) CraftItemStack.getItemMeta(newBookItem), newBookItem.getItem() == Items.WRITTEN_BOOK); - player.level.getCraftServer().getPluginManager().callEvent(editBookEvent); + player.level().getCraftServer().getPluginManager().callEvent(editBookEvent); // If they've got the same item in their hand, it'll need to be updated. if (itemInHand != null && itemInHand.getItem() == Items.WRITABLE_BOOK) { @@ -1418,13 +1418,13 @@ public class CraftEventFactory { public static PlayerUnleashEntityEvent callPlayerUnleashEntityEvent(EntityInsentient entity, EntityHuman player, EnumHand enumhand) { PlayerUnleashEntityEvent event = new PlayerUnleashEntityEvent(entity.getBukkitEntity(), (Player) player.getBukkitEntity(), CraftEquipmentSlot.getHand(enumhand)); - entity.level.getCraftServer().getPluginManager().callEvent(event); + entity.level().getCraftServer().getPluginManager().callEvent(event); return event; } public static PlayerLeashEntityEvent callPlayerLeashEntityEvent(EntityInsentient entity, Entity leashHolder, EntityHuman player, EnumHand enumhand) { PlayerLeashEntityEvent event = new PlayerLeashEntityEvent(entity.getBukkitEntity(), leashHolder.getBukkitEntity(), (Player) player.getBukkitEntity(), CraftEquipmentSlot.getHand(enumhand)); - entity.level.getCraftServer().getPluginManager().callEvent(event); + entity.level().getCraftServer().getPluginManager().callEvent(event); return event; } @@ -1488,13 +1488,13 @@ public class CraftEventFactory { event = new PlayerStatisticIncrementEvent(player, stat, current, newValue, material); } } - entityHuman.level.getCraftServer().getPluginManager().callEvent(event); + entityHuman.level().getCraftServer().getPluginManager().callEvent(event); return (Cancellable) event; } public static FireworkExplodeEvent callFireworkExplodeEvent(EntityFireworks firework) { FireworkExplodeEvent event = new FireworkExplodeEvent((Firework) firework.getBukkitEntity()); - firework.level.getCraftServer().getPluginManager().callEvent(event); + firework.level().getCraftServer().getPluginManager().callEvent(event); return event; } @@ -1521,19 +1521,19 @@ public class CraftEventFactory { public static EntityToggleGlideEvent callToggleGlideEvent(EntityLiving entity, boolean gliding) { EntityToggleGlideEvent event = new EntityToggleGlideEvent((LivingEntity) entity.getBukkitEntity(), gliding); - entity.level.getCraftServer().getPluginManager().callEvent(event); + entity.level().getCraftServer().getPluginManager().callEvent(event); return event; } public static EntityToggleSwimEvent callToggleSwimEvent(EntityLiving entity, boolean swimming) { EntityToggleSwimEvent event = new EntityToggleSwimEvent((LivingEntity) entity.getBukkitEntity(), swimming); - entity.level.getCraftServer().getPluginManager().callEvent(event); + entity.level().getCraftServer().getPluginManager().callEvent(event); return event; } public static AreaEffectCloudApplyEvent callAreaEffectCloudApplyEvent(EntityAreaEffectCloud cloud, List entities) { AreaEffectCloudApplyEvent event = new AreaEffectCloudApplyEvent((AreaEffectCloud) cloud.getBukkitEntity(), entities); - cloud.level.getCraftServer().getPluginManager().callEvent(event); + cloud.level().getCraftServer().getPluginManager().callEvent(event); return event; } @@ -1549,7 +1549,7 @@ public class CraftEventFactory { CraftItemStack bredWithStack = bredWith == null ? null : CraftItemStack.asCraftMirror(bredWith).clone(); EntityBreedEvent event = new EntityBreedEvent((LivingEntity) child.getBukkitEntity(), (LivingEntity) mother.getBukkitEntity(), (LivingEntity) father.getBukkitEntity(), breederEntity, bredWithStack, experience); - child.level.getCraftServer().getPluginManager().callEvent(event); + child.level().getCraftServer().getPluginManager().callEvent(event); return event; } @@ -1679,7 +1679,7 @@ public class CraftEventFactory { public static LootGenerateEvent callLootGenerateEvent(IInventory inventory, LootTable lootTable, LootTableInfo lootInfo, List loot, boolean plugin) { CraftWorld world = lootInfo.getLevel().getWorld(); Entity entity = lootInfo.getParamOrNull(LootContextParameters.THIS_ENTITY); - NamespacedKey key = CraftNamespacedKey.fromMinecraft(world.getHandle().getServer().getLootTables().lootTableToKey.get(lootTable)); + NamespacedKey key = CraftNamespacedKey.fromMinecraft(world.getHandle().getServer().getLootData().lootTableToKey.get(lootTable)); CraftLootTable craftLootTable = new CraftLootTable(key, lootTable); List bukkitLoot = loot.stream().map(CraftItemStack::asCraftMirror).collect(Collectors.toCollection(ArrayList::new)); diff --git a/paper-server/src/main/java/org/bukkit/craftbukkit/generator/CustomChunkGenerator.java b/paper-server/src/main/java/org/bukkit/craftbukkit/generator/CustomChunkGenerator.java index 7c3b1d949f..332da6be3c 100644 --- a/paper-server/src/main/java/org/bukkit/craftbukkit/generator/CustomChunkGenerator.java +++ b/paper-server/src/main/java/org/bukkit/craftbukkit/generator/CustomChunkGenerator.java @@ -223,11 +223,6 @@ public class CustomChunkGenerator extends InternalChunkGenerator { } } } - - // Apply captured light blocks - for (BlockPosition lightPosition : craftData.getLights()) { - ((ProtoChunk) ichunkaccess).addLight(new BlockPosition((x << 4) + lightPosition.getX(), lightPosition.getY(), (z << 4) + lightPosition.getZ())); - } } @Override diff --git a/paper-server/src/main/java/org/bukkit/craftbukkit/generator/OldCraftChunkData.java b/paper-server/src/main/java/org/bukkit/craftbukkit/generator/OldCraftChunkData.java index 929730b621..1ff806fd6d 100644 --- a/paper-server/src/main/java/org/bukkit/craftbukkit/generator/OldCraftChunkData.java +++ b/paper-server/src/main/java/org/bukkit/craftbukkit/generator/OldCraftChunkData.java @@ -177,7 +177,7 @@ public final class OldCraftChunkData implements ChunkGenerator.ChunkData { int offset = (y - minHeight) >> 4; ChunkSection section = sections[offset]; if (create && section == null) { - sections[offset] = section = new ChunkSection(offset + (minHeight >> 4), biomes); + sections[offset] = section = new ChunkSection(biomes); } return section; } diff --git a/paper-server/src/main/java/org/bukkit/craftbukkit/inventory/CraftContainer.java b/paper-server/src/main/java/org/bukkit/craftbukkit/inventory/CraftContainer.java index 39a1a87e8c..24d378dd79 100644 --- a/paper-server/src/main/java/org/bukkit/craftbukkit/inventory/CraftContainer.java +++ b/paper-server/src/main/java/org/bukkit/craftbukkit/inventory/CraftContainer.java @@ -134,8 +134,6 @@ public class CraftContainer extends Container { return Containers.BEACON; case ANVIL: return Containers.ANVIL; - case SMITHING: - return Containers.LEGACY_SMITHING; case HOPPER: return Containers.HOPPER; case DROPPER: diff --git a/paper-server/src/main/java/org/bukkit/craftbukkit/inventory/CraftItemFactory.java b/paper-server/src/main/java/org/bukkit/craftbukkit/inventory/CraftItemFactory.java index cf198a63e0..4b721bfcd2 100644 --- a/paper-server/src/main/java/org/bukkit/craftbukkit/inventory/CraftItemFactory.java +++ b/paper-server/src/main/java/org/bukkit/craftbukkit/inventory/CraftItemFactory.java @@ -329,9 +329,11 @@ public final class CraftItemFactory implements ItemFactory { case SCULK_CATALYST: case SCULK_SHRIEKER: case SCULK_SENSOR: + case CALIBRATED_SCULK_SENSOR: case CHISELED_BOOKSHELF: case DECORATED_POT: case SUSPICIOUS_SAND: + case SUSPICIOUS_GRAVEL: return new CraftMetaBlockState(meta, material); case TROPICAL_FISH_BUCKET: return meta instanceof CraftMetaTropicalFishBucket ? meta : new CraftMetaTropicalFishBucket(meta); diff --git a/paper-server/src/main/java/org/bukkit/craftbukkit/inventory/CraftItemStack.java b/paper-server/src/main/java/org/bukkit/craftbukkit/inventory/CraftItemStack.java index a2579d2287..dc8c1c65fd 100644 --- a/paper-server/src/main/java/org/bukkit/craftbukkit/inventory/CraftItemStack.java +++ b/paper-server/src/main/java/org/bukkit/craftbukkit/inventory/CraftItemStack.java @@ -592,9 +592,11 @@ public final class CraftItemStack extends ItemStack { case SCULK_CATALYST: case SCULK_SHRIEKER: case SCULK_SENSOR: + case CALIBRATED_SCULK_SENSOR: case CHISELED_BOOKSHELF: case DECORATED_POT: case SUSPICIOUS_SAND: + case SUSPICIOUS_GRAVEL: return new CraftMetaBlockState(item.getTag(), CraftMagicNumbers.getMaterial(item.getItem())); case TROPICAL_FISH_BUCKET: return new CraftMetaTropicalFishBucket(item.getTag()); diff --git a/paper-server/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaBlockState.java b/paper-server/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaBlockState.java index 76b946dfa2..6b70017307 100644 --- a/paper-server/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaBlockState.java +++ b/paper-server/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaBlockState.java @@ -116,10 +116,12 @@ public class CraftMetaBlockState extends CraftMetaItem implements BlockStateMeta Material.BEE_NEST, Material.SCULK_CATALYST, Material.SCULK_SHRIEKER, + Material.CALIBRATED_SCULK_SENSOR, Material.SCULK_SENSOR, Material.CHISELED_BOOKSHELF, Material.DECORATED_POT, - Material.SUSPICIOUS_SAND + Material.SUSPICIOUS_SAND, + Material.SUSPICIOUS_GRAVEL ); static { diff --git a/paper-server/src/main/java/org/bukkit/craftbukkit/inventory/CraftSmithingRecipe.java b/paper-server/src/main/java/org/bukkit/craftbukkit/inventory/CraftSmithingRecipe.java deleted file mode 100644 index d3e149d9d9..0000000000 --- a/paper-server/src/main/java/org/bukkit/craftbukkit/inventory/CraftSmithingRecipe.java +++ /dev/null @@ -1,29 +0,0 @@ -package org.bukkit.craftbukkit.inventory; - -import net.minecraft.server.MinecraftServer; -import org.bukkit.NamespacedKey; -import org.bukkit.craftbukkit.util.CraftNamespacedKey; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.RecipeChoice; -import org.bukkit.inventory.SmithingRecipe; - -public class CraftSmithingRecipe extends SmithingRecipe implements CraftRecipe { - public CraftSmithingRecipe(NamespacedKey key, ItemStack result, RecipeChoice base, RecipeChoice addition) { - super(key, result, base, addition); - } - - public static CraftSmithingRecipe fromBukkitRecipe(SmithingRecipe recipe) { - if (recipe instanceof CraftSmithingRecipe) { - return (CraftSmithingRecipe) recipe; - } - CraftSmithingRecipe ret = new CraftSmithingRecipe(recipe.getKey(), recipe.getResult(), recipe.getBase(), recipe.getAddition()); - return ret; - } - - @Override - public void addToCraftingManager() { - ItemStack result = this.getResult(); - - MinecraftServer.getServer().getRecipeManager().addRecipe(new net.minecraft.world.item.crafting.LegacyUpgradeRecipe(CraftNamespacedKey.toMinecraft(this.getKey()), toNMS(this.getBase(), true), toNMS(this.getAddition(), true), CraftItemStack.asNMSCopy(result))); - } -} diff --git a/paper-server/src/main/java/org/bukkit/craftbukkit/profile/CraftProfileProperty.java b/paper-server/src/main/java/org/bukkit/craftbukkit/profile/CraftProfileProperty.java index 9d7715f39a..a102ee4f49 100644 --- a/paper-server/src/main/java/org/bukkit/craftbukkit/profile/CraftProfileProperty.java +++ b/paper-server/src/main/java/org/bukkit/craftbukkit/profile/CraftProfileProperty.java @@ -7,18 +7,17 @@ import com.google.gson.JsonObject; import com.google.gson.JsonParseException; import com.google.gson.JsonParser; import com.mojang.authlib.properties.Property; -import com.mojang.authlib.yggdrasil.YggdrasilMinecraftSessionService; +import com.mojang.authlib.yggdrasil.ServicesKeySet; +import com.mojang.authlib.yggdrasil.ServicesKeyType; +import com.mojang.authlib.yggdrasil.YggdrasilAuthenticationService; +import java.net.Proxy; import java.nio.charset.StandardCharsets; -import java.security.KeyFactory; -import java.security.PublicKey; -import java.security.spec.X509EncodedKeySpec; import java.util.Base64; import java.util.LinkedHashMap; import java.util.Map; import java.util.Objects; import javax.annotation.Nonnull; import javax.annotation.Nullable; -import org.apache.commons.io.IOUtils; import org.bukkit.craftbukkit.configuration.ConfigSerializationUtil; final class CraftProfileProperty { @@ -44,19 +43,18 @@ final class CraftProfileProperty { public String format(JsonElement jsonElement); } - private static final PublicKey PUBLIC_KEY; + private static final ServicesKeySet PUBLIC_KEYS; static { try { - X509EncodedKeySpec spec = new X509EncodedKeySpec(IOUtils.toByteArray(YggdrasilMinecraftSessionService.class.getResourceAsStream("/yggdrasil_session_pubkey.der"))); - PUBLIC_KEY = KeyFactory.getInstance("RSA").generatePublic(spec); + PUBLIC_KEYS = new YggdrasilAuthenticationService(Proxy.NO_PROXY).getServicesKeySet(); } catch (Exception e) { - throw new Error("Could not find yggdrasil_session_pubkey.der! This indicates a bug."); + throw new Error("Could not load yggdrasil_session_pubkey.der! This indicates a bug."); } } public static boolean hasValidSignature(@Nonnull Property property) { - return property.hasSignature() && property.isSignatureValid(PUBLIC_KEY); + return property.hasSignature() && PUBLIC_KEYS.keys(ServicesKeyType.PROFILE_PROPERTY).stream().anyMatch((key) -> key.validateProperty(property)); } @Nullable diff --git a/paper-server/src/main/java/org/bukkit/craftbukkit/structure/CraftPalette.java b/paper-server/src/main/java/org/bukkit/craftbukkit/structure/CraftPalette.java index 6dd3153242..808965c410 100644 --- a/paper-server/src/main/java/org/bukkit/craftbukkit/structure/CraftPalette.java +++ b/paper-server/src/main/java/org/bukkit/craftbukkit/structure/CraftPalette.java @@ -19,7 +19,7 @@ public class CraftPalette implements Palette { public List getBlocks() { List blocks = new ArrayList<>(); for (DefinedStructure.BlockInfo blockInfo : palette.blocks()) { - blocks.add(CraftBlockStates.getBlockState(blockInfo.pos, blockInfo.state, blockInfo.nbt)); + blocks.add(CraftBlockStates.getBlockState(blockInfo.pos(), blockInfo.state(), blockInfo.nbt())); } return blocks; } diff --git a/paper-server/src/main/java/org/bukkit/craftbukkit/util/CraftLocation.java b/paper-server/src/main/java/org/bukkit/craftbukkit/util/CraftLocation.java index 1098aab815..40893399c1 100644 --- a/paper-server/src/main/java/org/bukkit/craftbukkit/util/CraftLocation.java +++ b/paper-server/src/main/java/org/bukkit/craftbukkit/util/CraftLocation.java @@ -24,9 +24,11 @@ public final class CraftLocation { } public static Location toBukkit(BlockPosition blockPosition) { - return toBukkit(blockPosition, null); + return toBukkit(blockPosition, (World) null); + } + public static Location toBukkit(BlockPosition blockPosition, net.minecraft.world.level.World world) { + return toBukkit(blockPosition, world.getWorld(), 0.0F, 0.0F); } - public static Location toBukkit(BlockPosition blockPosition, World world) { return toBukkit(blockPosition, world, 0.0F, 0.0F); } diff --git a/paper-server/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java b/paper-server/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java index 68fe752dad..1210807bed 100644 --- a/paper-server/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java +++ b/paper-server/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java @@ -239,7 +239,7 @@ public final class CraftMagicNumbers implements UnsafeValues { * @return string */ public String getMappingsVersion() { - return "3009edc0fff87fa34680686663bd59df"; + return "34f399b4f2033891290b7f0700e9e47b"; } @Override @@ -275,7 +275,7 @@ public final class CraftMagicNumbers implements UnsafeValues { JsonElement jsonelement = AdvancementDataWorld.GSON.fromJson(advancement, JsonElement.class); JsonObject jsonobject = ChatDeserializer.convertToJsonObject(jsonelement, "advancement"); - net.minecraft.advancements.Advancement.SerializedAdvancement nms = net.minecraft.advancements.Advancement.SerializedAdvancement.fromJson(jsonobject, new LootDeserializationContext(minecraftkey, MinecraftServer.getServer().getPredicateManager())); + net.minecraft.advancements.Advancement.SerializedAdvancement nms = net.minecraft.advancements.Advancement.SerializedAdvancement.fromJson(jsonobject, new LootDeserializationContext(minecraftkey, MinecraftServer.getServer().getLootData())); if (nms != null) { MinecraftServer.getServer().getAdvancements().advancements.add(Maps.newHashMap(Collections.singletonMap(minecraftkey, nms))); Advancement bukkit = Bukkit.getAdvancement(key); @@ -305,7 +305,7 @@ public final class CraftMagicNumbers implements UnsafeValues { return file.delete(); } - private static final List SUPPORTED_API = Arrays.asList("1.13", "1.14", "1.15", "1.16", "1.17", "1.18", "1.19"); + private static final List SUPPORTED_API = Arrays.asList("1.13", "1.14", "1.15", "1.16", "1.17", "1.18", "1.19", "1.20"); @Override public void checkSupported(PluginDescriptionFile pdf) throws InvalidPluginException { diff --git a/paper-server/src/main/java/org/bukkit/craftbukkit/util/DummyGeneratorAccess.java b/paper-server/src/main/java/org/bukkit/craftbukkit/util/DummyGeneratorAccess.java index 87a7f3084f..abc0bd1066 100644 --- a/paper-server/src/main/java/org/bukkit/craftbukkit/util/DummyGeneratorAccess.java +++ b/paper-server/src/main/java/org/bukkit/craftbukkit/util/DummyGeneratorAccess.java @@ -31,7 +31,7 @@ import net.minecraft.world.level.dimension.DimensionManager; import net.minecraft.world.level.entity.EntityTypeTest; import net.minecraft.world.level.gameevent.GameEvent; import net.minecraft.world.level.levelgen.HeightMap; -import net.minecraft.world.level.lighting.LightEngine; +import net.minecraft.world.level.lighting.LevelLightEngine; import net.minecraft.world.level.material.Fluid; import net.minecraft.world.level.material.FluidType; import net.minecraft.world.level.material.FluidTypes; @@ -194,7 +194,7 @@ public class DummyGeneratorAccess implements GeneratorAccessSeed { } @Override - public LightEngine getLightEngine() { + public LevelLightEngine getLightEngine() { throw new UnsupportedOperationException("Not supported yet."); } diff --git a/paper-server/src/test/java/org/bukkit/ChunkLoadLevelTest.java b/paper-server/src/test/java/org/bukkit/ChunkLoadLevelTest.java deleted file mode 100644 index e5bc2ffd34..0000000000 --- a/paper-server/src/test/java/org/bukkit/ChunkLoadLevelTest.java +++ /dev/null @@ -1,22 +0,0 @@ -package org.bukkit; - -import net.minecraft.server.level.PlayerChunk; -import org.junit.Assert; -import org.junit.Test; - -public class ChunkLoadLevelTest { - - @Test - public void testOrdinalsAndNames() { - Chunk.LoadLevel[] bukkit = Chunk.LoadLevel.values(); - PlayerChunk.State[] nms = PlayerChunk.State.values(); - - Assert.assertEquals("Enum length mismatch", bukkit.length - 1, nms.length); // Final entry is Bukkit-specific UNLOADED - for (int i = 0; i < nms.length; i++) { - Assert.assertEquals("Enum name mismatch, expected Bukkit " + bukkit[i] + " got NMS " + nms[i], bukkit[i].name(), nms[i].name()); - } - - // Check that Bukkit-specific UNLOADED is last - Assert.assertEquals("Final Bukkit entry should be UNLOADED", Chunk.LoadLevel.UNLOADED, bukkit[bukkit.length - 1]); - } -} diff --git a/paper-server/src/test/java/org/bukkit/PerMaterialTest.java b/paper-server/src/test/java/org/bukkit/PerMaterialTest.java index 9bdcd945ba..344ca0129e 100644 --- a/paper-server/src/test/java/org/bukkit/PerMaterialTest.java +++ b/paper-server/src/test/java/org/bukkit/PerMaterialTest.java @@ -70,7 +70,7 @@ public class PerMaterialTest extends AbstractTestingBase { if (material == Material.AIR) { assertFalse(material.isSolid()); } else if (material.isBlock()) { - assertThat(material.isSolid(), is(CraftMagicNumbers.getBlock(material).defaultBlockState().getMaterial().blocksMotion())); + assertThat(material.isSolid(), is(CraftMagicNumbers.getBlock(material).defaultBlockState().blocksMotion())); } else { assertFalse(material.isSolid()); } @@ -134,7 +134,7 @@ public class PerMaterialTest extends AbstractTestingBase { @Test public void isFlammable() { if (material != Material.AIR && material.isBlock()) { - assertThat(material.isFlammable(), is(CraftMagicNumbers.getBlock(material).defaultBlockState().getMaterial().isFlammable())); + assertThat(material.isFlammable(), is(CraftMagicNumbers.getBlock(material).defaultBlockState().ignitedByLava())); } else { assertFalse(material.isFlammable()); } @@ -152,7 +152,11 @@ public class PerMaterialTest extends AbstractTestingBase { @Test public void isFuel() { - assertThat(material.isFuel(), is(TileEntityFurnace.isFuel(new net.minecraft.world.item.ItemStack(CraftMagicNumbers.getItem(material))))); + if (material.isItem()) { + assertThat(material.isFuel(), is(TileEntityFurnace.isFuel(new net.minecraft.world.item.ItemStack(CraftMagicNumbers.getItem(material))))); + } else { + assertFalse(material.isFuel()); + } } @Test diff --git a/paper-server/src/test/java/org/bukkit/craftbukkit/legacy/LegacyTest.java b/paper-server/src/test/java/org/bukkit/craftbukkit/legacy/LegacyTest.java index 2b8b5224ed..bf6d9fb625 100644 --- a/paper-server/src/test/java/org/bukkit/craftbukkit/legacy/LegacyTest.java +++ b/paper-server/src/test/java/org/bukkit/craftbukkit/legacy/LegacyTest.java @@ -103,9 +103,14 @@ public class LegacyTest extends AbstractTestingBase { Material.BRUSH, Material.CHERRY_BOAT, Material.CHERRY_BUTTON, Material.CHERRY_CHEST_BOAT, Material.CHERRY_DOOR, Material.CHERRY_FENCE, Material.CHERRY_FENCE_GATE, Material.CHERRY_HANGING_SIGN, Material.CHERRY_LEAVES, Material.CHERRY_LOG, Material.CHERRY_PLANKS, Material.CHERRY_PRESSURE_PLATE, Material.CHERRY_SAPLING, Material.CHERRY_SIGN, Material.CHERRY_SLAB, Material.CHERRY_STAIRS, Material.CHERRY_TRAPDOOR, Material.CHERRY_WALL_HANGING_SIGN, Material.CHERRY_WALL_SIGN, Material.CHERRY_WOOD, Material.COAST_ARMOR_TRIM_SMITHING_TEMPLATE, Material.DECORATED_POT, Material.DUNE_ARMOR_TRIM_SMITHING_TEMPLATE, Material.EYE_ARMOR_TRIM_SMITHING_TEMPLATE, Material.NETHERITE_UPGRADE_SMITHING_TEMPLATE, Material.PINK_PETALS, - Material.POTTED_CHERRY_SAPLING, Material.POTTED_TORCHFLOWER, Material.POTTERY_SHARD_ARCHER, Material.POTTERY_SHARD_ARMS_UP, Material.POTTERY_SHARD_PRIZE, Material.POTTERY_SHARD_SKULL, Material.RIB_ARMOR_TRIM_SMITHING_TEMPLATE, + Material.POTTED_CHERRY_SAPLING, Material.POTTED_TORCHFLOWER, Material.RIB_ARMOR_TRIM_SMITHING_TEMPLATE, Material.SENTRY_ARMOR_TRIM_SMITHING_TEMPLATE, Material.SNIFFER_SPAWN_EGG, Material.SNOUT_ARMOR_TRIM_SMITHING_TEMPLATE, Material.SPIRE_ARMOR_TRIM_SMITHING_TEMPLATE, Material.STRIPPED_CHERRY_LOG, Material.STRIPPED_CHERRY_WOOD, Material.SUSPICIOUS_SAND, Material.TIDE_ARMOR_TRIM_SMITHING_TEMPLATE, Material.TORCHFLOWER, Material.TORCHFLOWER_CROP, Material.TORCHFLOWER_SEEDS, Material.VEX_ARMOR_TRIM_SMITHING_TEMPLATE, Material.WARD_ARMOR_TRIM_SMITHING_TEMPLATE, Material.WILD_ARMOR_TRIM_SMITHING_TEMPLATE, + // 1.20 + Material.SUSPICIOUS_GRAVEL, Material.PITCHER_PLANT, Material.SNIFFER_EGG, Material.CALIBRATED_SCULK_SENSOR, Material.PITCHER_POD, Material.MUSIC_DISC_RELIC, Material.WAYFINDER_ARMOR_TRIM_SMITHING_TEMPLATE, Material.SHAPER_ARMOR_TRIM_SMITHING_TEMPLATE, + Material.SILENCE_ARMOR_TRIM_SMITHING_TEMPLATE, Material.RAISER_ARMOR_TRIM_SMITHING_TEMPLATE, Material.HOST_ARMOR_TRIM_SMITHING_TEMPLATE, Material.ANGLER_POTTERY_SHERD, Material.ARCHER_POTTERY_SHERD, Material.ARMS_UP_POTTERY_SHERD, Material.BLADE_POTTERY_SHERD, + Material.BREWER_POTTERY_SHERD, Material.BURN_POTTERY_SHERD, Material.DANGER_POTTERY_SHERD, Material.EXPLORER_POTTERY_SHERD, Material.FRIEND_POTTERY_SHERD, Material.HEART_POTTERY_SHERD, Material.HEARTBREAK_POTTERY_SHERD, Material.HOWL_POTTERY_SHERD, + Material.MINER_POTTERY_SHERD, Material.MOURNER_POTTERY_SHERD, Material.PLENTY_POTTERY_SHERD, Material.PRIZE_POTTERY_SHERD, Material.SHEAF_POTTERY_SHERD, Material.SHELTER_POTTERY_SHERD, Material.SKULL_POTTERY_SHERD, Material.SNORT_POTTERY_SHERD, Material.PITCHER_CROP, // Material.LEGACY_AIR, Material.LEGACY_DEAD_BUSH, Material.LEGACY_BURNING_FURNACE, Material.LEGACY_WALL_SIGN, Material.LEGACY_REDSTONE_TORCH_OFF, Material.LEGACY_SKULL, Material.LEGACY_REDSTONE_COMPARATOR_ON, Material.LEGACY_WALL_BANNER, Material.LEGACY_MONSTER_EGG)); diff --git a/paper-server/src/test/java/org/bukkit/support/AbstractTestingBase.java b/paper-server/src/test/java/org/bukkit/support/AbstractTestingBase.java index e716d13e06..212a348a27 100644 --- a/paper-server/src/test/java/org/bukkit/support/AbstractTestingBase.java +++ b/paper-server/src/test/java/org/bukkit/support/AbstractTestingBase.java @@ -70,6 +70,6 @@ public abstract class AbstractTestingBase { } } INVALIDATED_MATERIALS = builder.build(); - Assert.assertEquals("Expected 609 invalidated materials (got " + INVALIDATED_MATERIALS.size() + ")", 609, INVALIDATED_MATERIALS.size()); + Assert.assertEquals("Expected 610 invalidated materials (got " + INVALIDATED_MATERIALS.size() + ")", 610, INVALIDATED_MATERIALS.size()); } } diff --git a/paper-server/src/test/java/org/bukkit/support/DummyServer.java b/paper-server/src/test/java/org/bukkit/support/DummyServer.java index 3769892093..21605003da 100644 --- a/paper-server/src/test/java/org/bukkit/support/DummyServer.java +++ b/paper-server/src/test/java/org/bukkit/support/DummyServer.java @@ -94,7 +94,7 @@ public final class DummyServer implements InvocationHandler { @Override public Object handle(DummyServer server, Object[] args) { NamespacedKey key = (NamespacedKey) args[0]; - return new CraftLootTable(key, AbstractTestingBase.DATA_PACK.getLootTables().get(CraftNamespacedKey.toMinecraft(key))); + return new CraftLootTable(key, AbstractTestingBase.DATA_PACK.getLootData().getLootTable(CraftNamespacedKey.toMinecraft(key))); } } );