From 0dd7fe3b9c3129b5f9e8b8fce6d254448b9a4aad Mon Sep 17 00:00:00 2001 From: Nassim Jahnke Date: Fri, 12 May 2023 13:10:08 +0200 Subject: [PATCH] Updated Upstream (Bukkit/CraftBukkit/Spigot) (#9188) * Updated Upstream (Bukkit/CraftBukkit/Spigot) Upstream has released updates that appear to apply and compile correctly. This update has not been tested by PaperMC and as with ANY update, please do your own testing Bukkit Changes: 2fcba9b2 SPIGOT-7347: Add missing documentation and details to ShapedRecipe c278419d PR-854: Move getHighestBlockYAt methods from World to RegionAccessor 201399fb PR-853: Add API for directly setting Display transformation matrices ecfa559a PR-849: Add InventoryView#setTitle 653d7edb SPIGOT-519: Add TNTPrimeEvent 22fccc09 PR-846: Add method to get chunk load level a070a52c PR-844: Add methods to convert Vector to and from JOML vectors cc7111fe PR-276: Add accessors to Wither's invulnerability ticks 777d24e9 SPIGOT-7209: Accessors and events for player's exp cooldown ccb2d01b SPIGOT-6308: Deprecate the location name property of map items cd04a31b PR-780: Add PlayerSpawnChangeEvent 7d1f5b64 SPIGOT-6780: Improve documentation for World#spawnFallingBlock 5696668a SPIGOT-6885: Add test and easier to debug code for reference in yaml configuration comments 2e13cff7 PR-589: Expand the FishHook API 2c7d3da5 PR-279: Minor edits to various Javadocs CraftBukkit Changes: 01b2e1af4 SPIGOT-7346: Disallow players from executing commands after disconnecting 7fe5ee022 PR-1186: Move getHighestBlockYAt methods from World to RegionAccessor bcc85ef67 PR-1185: Add API for directly setting Display transformation matrices a7cfc778f PR-1176: Add InventoryView#setTitle 563d42226 SPIGOT-519: Add TNTPrimeEvent ccbc6abca Add test for Chunk.LoadLevel mirroring 2926e0513 PR-1171: Add method to get chunk load level 63cad7f84 PR-375: Add accessors to Wither's invulnerability ticks bfd8b1ac8 SPIGOT-7209: Accessors and events for player's exp cooldown f92a41c39 PR-1181: Consolidate Location conversion code 10f866759 SPIGOT-6308: Deprecate the location name property of map items 82f7b658a PR-1095: Add PlayerSpawnChangeEvent b421af7e4 PR-808: Expand the FishHook API 598ad7b3f Increase outdated build delay Spigot Changes: d1bd3bd2 Rebuild patches e4265cc8 SPIGOT-7297: Entity Tracking Range option for Display entities * Work around javac bug * Call PlayerSpawnChangeEvent * Updated Upstream (Bukkit/CraftBukkit/Spigot) Upstream has released updates that appear to apply and compile correctly. This update has not been tested by PaperMC and as with ANY update, please do your own testing Bukkit Changes: 2fcba9b2 SPIGOT-7347: Add missing documentation and details to ShapedRecipe c278419d PR-854: Move getHighestBlockYAt methods from World to RegionAccessor 201399fb PR-853: Add API for directly setting Display transformation matrices CraftBukkit Changes: 01b2e1af4 SPIGOT-7346: Disallow players from executing commands after disconnecting 7fe5ee022 PR-1186: Move getHighestBlockYAt methods from World to RegionAccessor bcc85ef67 PR-1185: Add API for directly setting Display transformation matrices Spigot Changes: 7da74dae Rebuild patches --- .../Ability-to-apply-mending-to-XP-API.patch | 3 + patches/api/Add-Heightmap-API.patch | 2 +- patches/api/Add-PlayerSetSpawnEvent.patch | 15 +++ patches/api/Add-TNTPrimeEvent.patch | 2 + patches/api/Add-moon-phase-API.patch | 4 +- patches/api/Adventure.patch | 5 +- ...Blocks-to-be-accessed-via-a-long-key.patch | 4 +- .../api/Fix-Spigot-annotation-mistakes.patch | 2 +- patches/api/Fix-upstream-javadocs.patch | 25 ++-- ...onent-with-empty-text-instead-of-thr.patch | 20 ---- patches/server/Add-Heightmap-API.patch | 2 +- patches/server/Add-PlayerSetSpawnEvent.patch | 111 ++++++++++++------ patches/server/Add-TNTPrimeEvent.patch | 26 ++-- ...ded-block-state-to-BlockExplodeEvent.patch | 12 +- patches/server/Adventure.patch | 29 ++--- patches/server/Build-system-changes.patch | 2 +- ...target-without-changing-other-things.patch | 4 +- ...move-existing-players-to-world-spawn.patch | 4 +- patches/server/Expose-world-spawn-angle.patch | 4 +- ...Fix-force-opening-enchantment-tables.patch | 2 +- patches/server/Fix-this-stupid-bullshit.patch | 2 +- ...lement-EntityTeleportEndGatewayEvent.patch | 2 +- ...Implemented-BlockFailedDispenseEvent.patch | 4 +- patches/server/Improve-PortalEvents.patch | 2 +- .../Kick-on-main-for-illegal-chat.patch | 6 - .../server/Missing-Entity-Behavior-API.patch | 4 +- patches/server/More-World-API.patch | 2 +- .../server/PlayerPickupExperienceEvent.patch | 2 +- ...and-End-Portal-Frames-from-being-des.patch | 4 +- ...store-custom-InventoryHolder-support.patch | 16 +-- patches/server/Rewrite-chunk-system.patch | 2 +- ...ient-crashes-server-lists-and-Mojang.patch | 2 +- .../server/Tracking-Range-Improvements.patch | 3 + ...tance-map-to-optimise-entity-tracker.patch | 2 +- work/Bukkit | 2 +- work/CraftBukkit | 2 +- work/Spigot | 2 +- 37 files changed, 186 insertions(+), 151 deletions(-) delete mode 100644 patches/api/Return-chat-component-with-empty-text-instead-of-thr.patch diff --git a/patches/api/Ability-to-apply-mending-to-XP-API.patch b/patches/api/Ability-to-apply-mending-to-XP-API.patch index d654150ccb..a469407ed7 100644 --- a/patches/api/Ability-to-apply-mending-to-XP-API.patch +++ b/patches/api/Ability-to-apply-mending-to-XP-API.patch @@ -27,6 +27,9 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000 + giveExp(amount, false); + } /** + * Gets the player's cooldown between picking up experience orbs. + * +@@ -0,0 +0,0 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM * Gives the player the amount of experience specified. * * @param amount Exp amount to give diff --git a/patches/api/Add-Heightmap-API.patch b/patches/api/Add-Heightmap-API.patch index a7420f1b86..8be5eb512b 100644 --- a/patches/api/Add-Heightmap-API.patch +++ b/patches/api/Add-Heightmap-API.patch @@ -192,5 +192,5 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000 + // Paper end + /** - * Gets the highest coordinate corresponding to the {@link HeightMap} at the + * Gets the highest block corresponding to the {@link HeightMap} at the * given coordinates. diff --git a/patches/api/Add-PlayerSetSpawnEvent.patch b/patches/api/Add-PlayerSetSpawnEvent.patch index 2119863b80..664cba2b90 100644 --- a/patches/api/Add-PlayerSetSpawnEvent.patch +++ b/patches/api/Add-PlayerSetSpawnEvent.patch @@ -185,3 +185,18 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000 + UNKNOWN, + } +} +diff --git a/src/main/java/org/bukkit/event/player/PlayerSpawnChangeEvent.java b/src/main/java/org/bukkit/event/player/PlayerSpawnChangeEvent.java +index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644 +--- a/src/main/java/org/bukkit/event/player/PlayerSpawnChangeEvent.java ++++ b/src/main/java/org/bukkit/event/player/PlayerSpawnChangeEvent.java +@@ -0,0 +0,0 @@ import org.jetbrains.annotations.Nullable; + /** + * This event is fired when the spawn point of the player is changed. + * @apiNote draft API ++ * @deprecated use {@link com.destroystokyo.paper.event.player.PlayerSetSpawnEvent} + */ + @ApiStatus.Experimental ++@Deprecated(forRemoval = true) // Paper + public class PlayerSpawnChangeEvent extends PlayerEvent implements Cancellable { + + private static final HandlerList handlers = new HandlerList(); diff --git a/patches/api/Add-TNTPrimeEvent.patch b/patches/api/Add-TNTPrimeEvent.patch index b6e2c9711f..1192baba55 100644 --- a/patches/api/Add-TNTPrimeEvent.patch +++ b/patches/api/Add-TNTPrimeEvent.patch @@ -27,7 +27,9 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000 + * the TNT block as-is + * + * @author Mark Vainomaa ++ * @deprecated use {@link org.bukkit.event.block.TNTPrimeEvent} + */ ++@Deprecated(forRemoval = true) +public class TNTPrimeEvent extends BlockEvent implements Cancellable { + private static final HandlerList handlers = new HandlerList(); + private boolean cancelled; diff --git a/patches/api/Add-moon-phase-API.patch b/patches/api/Add-moon-phase-API.patch index 333c594e3c..94da1edd9f 100644 --- a/patches/api/Add-moon-phase-API.patch +++ b/patches/api/Add-moon-phase-API.patch @@ -51,9 +51,9 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000 --- a/src/main/java/org/bukkit/RegionAccessor.java +++ b/src/main/java/org/bukkit/RegionAccessor.java @@ -0,0 +0,0 @@ public interface RegionAccessor { + * {@link HeightMap} */ - @NotNull - public T spawn(@NotNull Location location, @NotNull Class clazz, boolean randomizeData, @Nullable Consumer function) throws IllegalArgumentException; + public int getHighestBlockYAt(@NotNull Location location, @NotNull HeightMap heightMap); + + // Paper start + /** diff --git a/patches/api/Adventure.patch b/patches/api/Adventure.patch index 9162bc3a91..cbb38859e8 100644 --- a/patches/api/Adventure.patch +++ b/patches/api/Adventure.patch @@ -1007,7 +1007,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000 --- a/src/main/java/org/bukkit/Nameable.java +++ b/src/main/java/org/bukkit/Nameable.java @@ -0,0 +0,0 @@ import org.jetbrains.annotations.Nullable; - + */ public interface Nameable { + // Paper start @@ -3802,7 +3802,8 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000 + @Deprecated // Paper + @NotNull public abstract String getTitle(); - } + + /** diff --git a/src/main/java/org/bukkit/inventory/ItemFactory.java b/src/main/java/org/bukkit/inventory/ItemFactory.java index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644 --- a/src/main/java/org/bukkit/inventory/ItemFactory.java diff --git a/patches/api/Allow-Blocks-to-be-accessed-via-a-long-key.patch b/patches/api/Allow-Blocks-to-be-accessed-via-a-long-key.patch index 8f930a52e7..44f5d84ed2 100644 --- a/patches/api/Allow-Blocks-to-be-accessed-via-a-long-key.patch +++ b/patches/api/Allow-Blocks-to-be-accessed-via-a-long-key.patch @@ -92,8 +92,8 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000 + // Paper end + /** - * Gets the highest non-empty (impassable) coordinate at the given - * coordinates. + * Gets the highest non-empty (impassable) block at the given coordinates. + * diff --git a/src/main/java/org/bukkit/block/Block.java b/src/main/java/org/bukkit/block/Block.java index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644 --- a/src/main/java/org/bukkit/block/Block.java diff --git a/patches/api/Fix-Spigot-annotation-mistakes.patch b/patches/api/Fix-Spigot-annotation-mistakes.patch index 9bd0d2bcdb..40a5e64e78 100644 --- a/patches/api/Fix-Spigot-annotation-mistakes.patch +++ b/patches/api/Fix-Spigot-annotation-mistakes.patch @@ -743,9 +743,9 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000 --- a/src/main/java/org/bukkit/inventory/ShapedRecipe.java +++ b/src/main/java/org/bukkit/inventory/ShapedRecipe.java @@ -0,0 +0,0 @@ public class ShapedRecipe implements Recipe, Keyed { - * @param key The character that represents the ingredient in the shape. * @param ingredient The ingredient. * @return The changed recipe, so you can chain calls. + * @throws IllegalArgumentException if the {@code key} does not appear in the shape. + * @deprecated use {@link #setIngredient(char, RecipeChoice)} */ @NotNull diff --git a/patches/api/Fix-upstream-javadocs.patch b/patches/api/Fix-upstream-javadocs.patch index 3e8517a403..c4cbe86b5f 100644 --- a/patches/api/Fix-upstream-javadocs.patch +++ b/patches/api/Fix-upstream-javadocs.patch @@ -173,19 +173,6 @@ diff --git a/src/main/java/org/bukkit/World.java b/src/main/java/org/bukkit/Worl index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644 --- a/src/main/java/org/bukkit/World.java +++ b/src/main/java/org/bukkit/World.java -@@ -0,0 +0,0 @@ public interface World extends RegionAccessor, WorldInfo, PluginMessageRecipient - - /** - * Spawn a {@link FallingBlock} entity at the given {@link Location} of -- * the specified {@link Material}. The material dictates what is falling. -+ * the specified {@link BlockData}. The block data dictates what is falling. - * When the FallingBlock hits the ground, it will place that block. -- *

-- * The Material must be a block type, check with {@link Material#isBlock() -- * material.isBlock()}. The Material may not be air. - * - * @param location The {@link Location} to spawn the FallingBlock - * @param data The block data @@ -0,0 +0,0 @@ public interface World extends RegionAccessor, WorldInfo, PluginMessageRecipient /** * Find the closest nearby structure of a given {@link StructureType}. @@ -1044,10 +1031,18 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000 * @see ShapedRecipe#setIngredient(char, Material) - * @see ShapedRecipe#setIngredient(char, Material, int) - * @see ShapedRecipe#setIngredient(char, MaterialData) -+ * @see ShapedRecipe#setIngredient(char, RecipeChoice) + * @see ShapedRecipe#setIngredient(char, RecipeChoice) + * @deprecated Recipes must have keys. Use {@link #ShapedRecipe(NamespacedKey, ItemStack)} + * instead. +@@ -0,0 +0,0 @@ public class ShapedRecipe implements Recipe, Keyed { + * @param result The item you want the recipe to create. + * @see ShapedRecipe#shape(String...) + * @see ShapedRecipe#setIngredient(char, Material) +- * @see ShapedRecipe#setIngredient(char, Material, int) +- * @see ShapedRecipe#setIngredient(char, MaterialData) + * @see ShapedRecipe#setIngredient(char, RecipeChoice) */ public ShapedRecipe(@NotNull NamespacedKey key, @NotNull ItemStack result) { - Preconditions.checkArgument(key != null, "key"); diff --git a/src/main/java/org/bukkit/inventory/ShapelessRecipe.java b/src/main/java/org/bukkit/inventory/ShapelessRecipe.java index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644 --- a/src/main/java/org/bukkit/inventory/ShapelessRecipe.java diff --git a/patches/api/Return-chat-component-with-empty-text-instead-of-thr.patch b/patches/api/Return-chat-component-with-empty-text-instead-of-thr.patch deleted file mode 100644 index db87f797eb..0000000000 --- a/patches/api/Return-chat-component-with-empty-text-instead-of-thr.patch +++ /dev/null @@ -1,20 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: CDFN -Date: Tue, 7 Jul 2020 17:53:23 +0200 -Subject: [PATCH] Return chat component with empty text instead of throwing - exception - - -diff --git a/src/main/java/org/bukkit/inventory/InventoryView.java b/src/main/java/org/bukkit/inventory/InventoryView.java -index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644 ---- a/src/main/java/org/bukkit/inventory/InventoryView.java -+++ b/src/main/java/org/bukkit/inventory/InventoryView.java -@@ -0,0 +0,0 @@ public abstract class InventoryView { - /** - * Get the title of this inventory window. - * -- * @return The title. -+ * @return The title or empty string when title is {@code null}. - */ - @NotNull - public /*abstract*/ net.kyori.adventure.text.Component title() { diff --git a/patches/server/Add-Heightmap-API.patch b/patches/server/Add-Heightmap-API.patch index 0ea6b2e7f1..0a793f1932 100644 --- a/patches/server/Add-Heightmap-API.patch +++ b/patches/server/Add-Heightmap-API.patch @@ -9,7 +9,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000 --- a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java @@ -0,0 +0,0 @@ public class CraftWorld extends CraftRegionAccessor implements World { - return this.getHighestBlockYAt(x, z, org.bukkit.HeightMap.MOTION_BLOCKING); + return CraftBlock.at(world, new BlockPos(x, y, z)); } + // Paper start - Implement heightmap api diff --git a/patches/server/Add-PlayerSetSpawnEvent.patch b/patches/server/Add-PlayerSetSpawnEvent.patch index 9f288250c0..433aa31171 100644 --- a/patches/server/Add-PlayerSetSpawnEvent.patch +++ b/patches/server/Add-PlayerSetSpawnEvent.patch @@ -9,15 +9,17 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000 --- a/src/main/java/net/minecraft/server/commands/SetSpawnCommand.java +++ b/src/main/java/net/minecraft/server/commands/SetSpawnCommand.java @@ -0,0 +0,0 @@ public class SetSpawnCommand { - private static int setSpawn(CommandSourceStack source, Collection targets, BlockPos pos, float angle) { - ResourceKey resourceKey = source.getLevel().dimension(); + ResourceKey resourcekey = source.getLevel().dimension(); + Iterator iterator = targets.iterator(); + final Collection actualTargets = new java.util.ArrayList<>(); // Paper - for(ServerPlayer serverPlayer : targets) { -- serverPlayer.setRespawnPosition(resourceKey, pos, angle, true, false); + while (iterator.hasNext()) { + ServerPlayer entityplayer = (ServerPlayer) iterator.next(); + +- entityplayer.setRespawnPosition(resourcekey, pos, angle, true, false, org.bukkit.event.player.PlayerSpawnChangeEvent.Cause.COMMAND); // CraftBukkit + // Paper start - PlayerSetSpawnEvent -+ if (serverPlayer.setRespawnPosition(resourceKey, pos, angle, true, false, com.destroystokyo.paper.event.player.PlayerSetSpawnEvent.Cause.COMMAND)) { -+ actualTargets.add(serverPlayer); ++ if (entityplayer.setRespawnPosition(resourcekey, pos, angle, true, false, com.destroystokyo.paper.event.player.PlayerSetSpawnEvent.Cause.COMMAND)) { ++ actualTargets.add(entityplayer); + } + // Paper end } @@ -29,8 +31,8 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000 + } + // Paper end - String string = resourceKey.location().toString(); - if (targets.size() == 1) { + String s = resourcekey.location().toString(); + diff --git a/src/main/java/net/minecraft/server/level/ServerPlayer.java b/src/main/java/net/minecraft/server/level/ServerPlayer.java index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644 --- a/src/main/java/net/minecraft/server/level/ServerPlayer.java @@ -39,7 +41,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000 } else if (this.bedBlocked(blockposition, enumdirection)) { return Either.left(Player.BedSleepingProblem.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 + this.setRespawnPosition(this.level.dimension(), blockposition, this.getYRot(), false, true, com.destroystokyo.paper.event.player.PlayerSetSpawnEvent.Cause.BED); // Paper - PlayerSetSpawnEvent if (this.level.isDay()) { return Either.left(Player.BedSleepingProblem.NOT_POSSIBLE_NOW); @@ -50,36 +52,84 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000 + @Deprecated // Paper public void setRespawnPosition(ResourceKey dimension, @Nullable BlockPos pos, float angle, boolean forced, boolean sendMessage) { +- // CraftBukkit start +- this.setRespawnPosition(dimension, pos, angle, forced, sendMessage, PlayerSpawnChangeEvent.Cause.UNKNOWN); +- } +- +- public void setRespawnPosition(ResourceKey resourcekey, @Nullable BlockPos blockposition, float f, boolean flag, boolean flag1, PlayerSpawnChangeEvent.Cause cause) { +- ServerLevel newWorld = this.server.getLevel(resourcekey); +- Location newSpawn = (blockposition != null) ? CraftLocation.toBukkit(blockposition, newWorld.getWorld(), f, 0) : null; +- +- PlayerSpawnChangeEvent event = new PlayerSpawnChangeEvent(this.getBukkitEntity(), newSpawn, flag, cause); +- Bukkit.getServer().getPluginManager().callEvent(event); +- if (event.isCancelled()) { +- return; +- } +- newSpawn = event.getNewSpawn(); +- flag = event.isForced(); +- +- if (newSpawn != null) { +- resourcekey = ((CraftWorld) newSpawn.getWorld()).getHandle().dimension(); +- blockposition = BlockPos.containing(newSpawn.getX(), newSpawn.getY(), newSpawn.getZ()); +- f = newSpawn.getYaw(); +- } else { +- resourcekey = Level.OVERWORLD; +- blockposition = null; +- f = 0.0F; + // Paper start + this.setRespawnPosition(dimension, pos, angle, forced, sendMessage, com.destroystokyo.paper.event.player.PlayerSetSpawnEvent.Cause.UNKNOWN); + } ++ @Deprecated ++ public boolean setRespawnPosition(ResourceKey dimension, @Nullable BlockPos pos, float angle, boolean forced, boolean sendMessage, PlayerSpawnChangeEvent.Cause cause) { ++ return this.setRespawnPosition(dimension, pos, angle, forced, sendMessage, cause == PlayerSpawnChangeEvent.Cause.RESET ? ++ com.destroystokyo.paper.event.player.PlayerSetSpawnEvent.Cause.PLAYER_RESPAWN : com.destroystokyo.paper.event.player.PlayerSetSpawnEvent.Cause.valueOf(cause.name())); ++ } + public boolean setRespawnPosition(ResourceKey dimension, @Nullable BlockPos pos, float angle, boolean forced, boolean sendMessage, com.destroystokyo.paper.event.player.PlayerSetSpawnEvent.Cause cause) { + Location spawnLoc = null; + boolean willNotify = false; - if (pos != null) { - boolean flag2 = pos.equals(this.respawnPosition) && dimension.equals(this.respawnDimension); ++ if (pos != null) { ++ boolean flag2 = pos.equals(this.respawnPosition) && dimension.equals(this.respawnDimension); + spawnLoc = io.papermc.paper.util.MCUtil.toLocation(this.getServer().getLevel(dimension), pos); + spawnLoc.setYaw(angle); + willNotify = sendMessage && !flag2; + } -+ com.destroystokyo.paper.event.player.PlayerSetSpawnEvent event = new com.destroystokyo.paper.event.player.PlayerSetSpawnEvent(this.getBukkitEntity(), cause, spawnLoc, forced, willNotify, willNotify ? net.kyori.adventure.text.Component.translatable("block.minecraft.set_spawn") : null); ++ ++ PlayerSpawnChangeEvent dumbEvent = new PlayerSpawnChangeEvent(this.getBukkitEntity(), spawnLoc, forced, ++ cause == com.destroystokyo.paper.event.player.PlayerSetSpawnEvent.Cause.PLAYER_RESPAWN ? PlayerSpawnChangeEvent.Cause.RESET : PlayerSpawnChangeEvent.Cause.valueOf(cause.name())); ++ dumbEvent.callEvent(); ++ ++ com.destroystokyo.paper.event.player.PlayerSetSpawnEvent event = new com.destroystokyo.paper.event.player.PlayerSetSpawnEvent(this.getBukkitEntity(), cause, dumbEvent.getNewSpawn(), dumbEvent.isForced(), willNotify, willNotify ? net.kyori.adventure.text.Component.translatable("block.minecraft.set_spawn") : null); ++ event.setCancelled(dumbEvent.isCancelled()); + if (!event.callEvent()) { + return false; -+ } + } +- // CraftBukkit end +- if (blockposition != null) { +- boolean flag2 = blockposition.equals(this.respawnPosition) && resourcekey.equals(this.respawnDimension); + if (event.getLocation() != null) { + dimension = event.getLocation().getWorld() != null ? ((CraftWorld) event.getLocation().getWorld()).getHandle().dimension() : dimension; + pos = io.papermc.paper.util.MCUtil.toBlockPosition(event.getLocation()); -+ angle = (float) event.getLocation().getYaw(); ++ angle = event.getLocation().getYaw(); + forced = event.isForced(); + // Paper end -- if (sendMessage && !flag2) { +- if (flag1 && !flag2) { - this.sendSystemMessage(Component.translatable("block.minecraft.set_spawn")); + if (event.willNotifyPlayer() && event.getNotification() != null) { // Paper + this.sendSystemMessage(PaperAdventure.asVanilla(event.getNotification())); // Paper } - this.respawnPosition = pos; +- this.respawnPosition = blockposition; +- this.respawnDimension = resourcekey; +- this.respawnAngle = f; +- this.respawnForced = flag; ++ this.respawnPosition = pos; ++ this.respawnDimension = dimension; ++ this.respawnAngle = angle; ++ this.respawnForced = forced; + } else { + this.respawnPosition = null; + this.respawnDimension = Level.OVERWORLD; @@ -0,0 +0,0 @@ public class ServerPlayer extends Player { this.respawnForced = false; } @@ -93,17 +143,10 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000 --- a/src/main/java/net/minecraft/server/players/PlayerList.java +++ b/src/main/java/net/minecraft/server/players/PlayerList.java @@ -0,0 +0,0 @@ public abstract class PlayerList { - f1 = (float) Mth.wrapDegrees(Mth.atan2(vec3d1.z, vec3d1.x) * 57.2957763671875D - 90.0D); - } - -- entityplayer1.setRespawnPosition(worldserver1.dimension(), blockposition, f, flag1, false); -+ entityplayer1.setRespawnPosition(worldserver1.dimension(), blockposition, f, flag1, false, com.destroystokyo.paper.event.player.PlayerSetSpawnEvent.Cause.PLAYER_RESPAWN); // Paper - PlayerSetSpawnEvent - flag2 = !flag && flag3; - isBedSpawn = true; - location = new Location(worldserver1.getWorld(), vec3d.x, vec3d.y, vec3d.z, f1, 0.0F); + location = CraftLocation.toBukkit(vec3d, worldserver1.getWorld(), f1, 0.0F); } else if (blockposition != null) { entityplayer1.connection.send(new ClientboundGameEventPacket(ClientboundGameEventPacket.NO_RESPAWN_BLOCK_AVAILABLE, 0.0F)); -- entityplayer1.setRespawnPosition(null, null, 0f, false, false); // CraftBukkit - SPIGOT-5988: Clear respawn location when obstructed +- entityplayer1.setRespawnPosition(null, null, 0f, false, false, PlayerSpawnChangeEvent.Cause.RESET); // CraftBukkit - SPIGOT-5988: Clear respawn location when obstructed + entityplayer1.setRespawnPosition(null, null, 0f, false, false, com.destroystokyo.paper.event.player.PlayerSetSpawnEvent.Cause.PLAYER_RESPAWN); // CraftBukkit - SPIGOT-5988: Clear respawn location when obstructed // Paper - PlayerSetSpawnEvent } } @@ -113,12 +156,12 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000 --- a/src/main/java/net/minecraft/world/level/block/RespawnAnchorBlock.java +++ b/src/main/java/net/minecraft/world/level/block/RespawnAnchorBlock.java @@ -0,0 +0,0 @@ public class RespawnAnchorBlock extends Block { - if (!world.isClientSide) { - ServerPlayer serverPlayer = (ServerPlayer)player; - if (serverPlayer.getRespawnDimension() != world.dimension() || !pos.equals(serverPlayer.getRespawnPosition())) { -- serverPlayer.setRespawnPosition(world.dimension(), pos, 0.0F, false, true); -+ if (serverPlayer.setRespawnPosition(world.dimension(), pos, 0.0F, false, true, com.destroystokyo.paper.event.player.PlayerSetSpawnEvent.Cause.RESPAWN_ANCHOR)) { // Paper - PlayerSetSpawnEvent - world.playSound((Player)null, (double)pos.getX() + 0.5D, (double)pos.getY() + 0.5D, (double)pos.getZ() + 0.5D, SoundEvents.RESPAWN_ANCHOR_SET_SPAWN, SoundSource.BLOCKS, 1.0F, 1.0F); + ServerPlayer entityplayer = (ServerPlayer) player; + + if (entityplayer.getRespawnDimension() != world.dimension() || !pos.equals(entityplayer.getRespawnPosition())) { +- entityplayer.setRespawnPosition(world.dimension(), pos, 0.0F, false, true, org.bukkit.event.player.PlayerSpawnChangeEvent.Cause.RESPAWN_ANCHOR); // CraftBukkit ++ if (entityplayer.setRespawnPosition(world.dimension(), pos, 0.0F, false, true, com.destroystokyo.paper.event.player.PlayerSetSpawnEvent.Cause.RESPAWN_ANCHOR)) { // Paper - PlayerSetSpawnEvent + world.playSound((Player) null, (double) pos.getX() + 0.5D, (double) pos.getY() + 0.5D, (double) pos.getZ() + 0.5D, SoundEvents.RESPAWN_ANCHOR_SET_SPAWN, SoundSource.BLOCKS, 1.0F, 1.0F); return InteractionResult.SUCCESS; + // Paper start - handle failed set spawn + } else { @@ -136,11 +179,11 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000 @Override public void setBedSpawnLocation(Location location, boolean override) { if (location == null) { -- this.getHandle().setRespawnPosition(null, null, 0.0F, override, false); +- this.getHandle().setRespawnPosition(null, null, 0.0F, override, false, PlayerSpawnChangeEvent.Cause.PLUGIN); + this.getHandle().setRespawnPosition(null, null, 0.0F, override, false, com.destroystokyo.paper.event.player.PlayerSetSpawnEvent.Cause.PLUGIN); // Paper - PlayerSetSpawnEvent } else { -- this.getHandle().setRespawnPosition(((CraftWorld) location.getWorld()).getHandle().dimension(), new BlockPos(location.getBlockX(), location.getBlockY(), location.getBlockZ()), location.getYaw(), override, false); -+ this.getHandle().setRespawnPosition(((CraftWorld) location.getWorld()).getHandle().dimension(), new BlockPos(location.getBlockX(), location.getBlockY(), location.getBlockZ()), location.getYaw(), override, false, com.destroystokyo.paper.event.player.PlayerSetSpawnEvent.Cause.PLUGIN); // Paper - PlayerSetSpawnEvent +- this.getHandle().setRespawnPosition(((CraftWorld) location.getWorld()).getHandle().dimension(), CraftLocation.toBlockPosition(location), location.getYaw(), override, false, PlayerSpawnChangeEvent.Cause.PLUGIN); ++ this.getHandle().setRespawnPosition(((CraftWorld) location.getWorld()).getHandle().dimension(), CraftLocation.toBlockPosition(location), location.getYaw(), override, false, com.destroystokyo.paper.event.player.PlayerSetSpawnEvent.Cause.PLUGIN); // Paper - PlayerSetSpawnEvent } } diff --git a/patches/server/Add-TNTPrimeEvent.patch b/patches/server/Add-TNTPrimeEvent.patch index 4ae0742501..c85b73f810 100644 --- a/patches/server/Add-TNTPrimeEvent.patch +++ b/patches/server/Add-TNTPrimeEvent.patch @@ -52,11 +52,12 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000 @@ -0,0 +0,0 @@ public class TntBlock extends Block { public void onPlace(BlockState state, Level world, BlockPos pos, BlockState oldState, boolean notify) { if (!oldState.is(state.getBlock())) { - if (world.hasNeighborSignal(pos)) { + if (world.hasNeighborSignal(pos) && CraftEventFactory.callTNTPrimeEvent(world, pos, PrimeCause.REDSTONE, null, null)) { // CraftBukkit - TNTPrimeEvent + // Paper start - TNTPrimeEvent -+ org.bukkit.block.Block tntBlock = io.papermc.paper.util.MCUtil.toBukkitBlock(world, pos);; -+ if(!new com.destroystokyo.paper.event.block.TNTPrimeEvent(tntBlock, com.destroystokyo.paper.event.block.TNTPrimeEvent.PrimeReason.REDSTONE, null).callEvent()) ++ org.bukkit.block.Block tntBlock = io.papermc.paper.util.MCUtil.toBukkitBlock(world, pos); ++ if (!new com.destroystokyo.paper.event.block.TNTPrimeEvent(tntBlock, com.destroystokyo.paper.event.block.TNTPrimeEvent.PrimeReason.REDSTONE, null).callEvent()) { + return; ++ } + // Paper end TntBlock.explode(world, pos); world.removeBlock(pos, false); @@ -64,11 +65,12 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000 @@ -0,0 +0,0 @@ public class TntBlock extends Block { @Override public void neighborChanged(BlockState state, Level world, BlockPos pos, Block sourceBlock, BlockPos sourcePos, boolean notify) { - if (world.hasNeighborSignal(pos)) { + if (world.hasNeighborSignal(pos) && CraftEventFactory.callTNTPrimeEvent(world, pos, PrimeCause.REDSTONE, null, sourcePos)) { // CraftBukkit - TNTPrimeEvent + // Paper start - TNTPrimeEvent -+ org.bukkit.block.Block tntBlock = io.papermc.paper.util.MCUtil.toBukkitBlock(world, pos);; -+ if(!new com.destroystokyo.paper.event.block.TNTPrimeEvent(tntBlock, com.destroystokyo.paper.event.block.TNTPrimeEvent.PrimeReason.REDSTONE, null).callEvent()) ++ org.bukkit.block.Block tntBlock = io.papermc.paper.util.MCUtil.toBukkitBlock(world, pos); ++ if (!new com.destroystokyo.paper.event.block.TNTPrimeEvent(tntBlock, com.destroystokyo.paper.event.block.TNTPrimeEvent.PrimeReason.REDSTONE, null).callEvent()) { + return; ++ } + // Paper end TntBlock.explode(world, pos); world.removeBlock(pos, false); @@ -80,20 +82,22 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000 + // Paper start - TNTPrimeEvent + org.bukkit.block.Block tntBlock = io.papermc.paper.util.MCUtil.toBukkitBlock(world, pos); + org.bukkit.entity.Entity source = explosion.source != null ? explosion.source.getBukkitEntity() : null; -+ if(!new com.destroystokyo.paper.event.block.TNTPrimeEvent(tntBlock, com.destroystokyo.paper.event.block.TNTPrimeEvent.PrimeReason.EXPLOSION, source).callEvent()) ++ if (!new com.destroystokyo.paper.event.block.TNTPrimeEvent(tntBlock, com.destroystokyo.paper.event.block.TNTPrimeEvent.PrimeReason.EXPLOSION, source).callEvent()) { + return; ++ } + // Paper end PrimedTnt entitytntprimed = new PrimedTnt(world, (double) pos.getX() + 0.5D, (double) pos.getY(), (double) pos.getZ() + 0.5D, explosion.getIndirectSourceEntity()); int i = entitytntprimed.getFuse(); @@ -0,0 +0,0 @@ public class TntBlock extends Block { - if (!itemstack.is(Items.FLINT_AND_STEEL) && !itemstack.is(Items.FIRE_CHARGE)) { - return super.use(state, world, pos, player, hand, hit); - } else { + return InteractionResult.CONSUME; + } + // CraftBukkit end + // Paper start - TNTPrimeEvent + org.bukkit.block.Block tntBlock = io.papermc.paper.util.MCUtil.toBukkitBlock(world, pos); -+ if(!new com.destroystokyo.paper.event.block.TNTPrimeEvent(tntBlock, com.destroystokyo.paper.event.block.TNTPrimeEvent.PrimeReason.ITEM, player.getBukkitEntity()).callEvent()) ++ if (!new com.destroystokyo.paper.event.block.TNTPrimeEvent(tntBlock, com.destroystokyo.paper.event.block.TNTPrimeEvent.PrimeReason.ITEM, player.getBukkitEntity()).callEvent()) { + return InteractionResult.FAIL; ++ } + // Paper end TntBlock.explode(world, pos, player); world.setBlock(pos, Blocks.AIR.defaultBlockState(), 11); diff --git a/patches/server/Add-exploded-block-state-to-BlockExplodeEvent.patch b/patches/server/Add-exploded-block-state-to-BlockExplodeEvent.patch index 1020485044..183150bf2b 100644 --- a/patches/server/Add-exploded-block-state-to-BlockExplodeEvent.patch +++ b/patches/server/Add-exploded-block-state-to-BlockExplodeEvent.patch @@ -99,14 +99,14 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000 private void explode(BlockState state, Level world, final BlockPos explodedPos) { + final org.bukkit.block.BlockState explodedBlockState = org.bukkit.craftbukkit.block.CraftBlockStates.getBlockState(explodedPos, state, null); // Paper - exploded block state world.removeBlock(explodedPos, false); - boolean bl = Direction.Plane.HORIZONTAL.stream().map(explodedPos::relative).anyMatch((pos) -> { - return isWaterThatWouldFlow(pos, world); + Stream stream = Direction.Plane.HORIZONTAL.stream(); // CraftBukkit - decompile error + @@ -0,0 +0,0 @@ public class RespawnAnchorBlock extends Block { - } }; - Vec3 vec3 = explodedPos.getCenter(); -- world.explode((Entity)null, world.damageSources().badRespawnPointExplosion(vec3), explosionDamageCalculator, vec3, 5.0F, true, Level.ExplosionInteraction.BLOCK); -+ world.explode((Entity)null, world.damageSources().badRespawnPointExplosion(vec3, explodedBlockState), explosionDamageCalculator, vec3, 5.0F, true, Level.ExplosionInteraction.BLOCK); + Vec3 vec3d = explodedPos.getCenter(); + +- world.explode((Entity) null, world.damageSources().badRespawnPointExplosion(vec3d), explosiondamagecalculator, vec3d, 5.0F, true, Level.ExplosionInteraction.BLOCK); ++ world.explode((Entity) null, world.damageSources().badRespawnPointExplosion(vec3d, explodedBlockState), explosiondamagecalculator, vec3d, 5.0F, true, Level.ExplosionInteraction.BLOCK); // Paper } public static boolean canSetSpawn(Level world) { diff --git a/patches/server/Adventure.patch b/patches/server/Adventure.patch index b756a6f644..27d2ee75ab 100644 --- a/patches/server/Adventure.patch +++ b/patches/server/Adventure.patch @@ -3612,17 +3612,6 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000 + Component[] components = CraftSign.sanitizeLines(lines); + this.sendSignChange0(components, loc, dyeColor, hasGlowingText); + } -+ -+ private void sendSignChange0(Component[] components, Location loc, DyeColor dyeColor, boolean hasGlowingText) { -+ SignBlockEntity sign = new SignBlockEntity(new BlockPos(loc.getBlockX(), loc.getBlockY(), loc.getBlockZ()), Blocks.OAK_SIGN.defaultBlockState()); -+ sign.setColor(net.minecraft.world.item.DyeColor.byId(dyeColor.getWoolData())); -+ sign.setHasGlowingText(hasGlowingText); -+ for (int i = 0; i < components.length; i++) { -+ sign.setMessage(i, components[i]); -+ } -+ -+ getHandle().connection.send(sign.getUpdatePacket()); -+ } + // Paper end @Override public void sendSignChange(Location loc, String[] lines) { @@ -3631,17 +3620,21 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000 } Component[] components = CraftSign.sanitizeLines(lines); -- SignBlockEntity sign = new SignBlockEntity(new BlockPos(loc.getBlockX(), loc.getBlockY(), loc.getBlockZ()), Blocks.OAK_SIGN.defaultBlockState()); -+ /*SignBlockEntity sign = new SignBlockEntity(new BlockPos(loc.getBlockX(), loc.getBlockY(), loc.getBlockZ()), Blocks.OAK_SIGN.defaultBlockState()); ++ // Paper start - adventure ++ this.sendSignChange0(components, loc, dyeColor, hasGlowingText); ++ } ++ ++ private void sendSignChange0(Component[] components, Location loc, DyeColor dyeColor, boolean hasGlowingText) { + SignBlockEntity sign = new SignBlockEntity(CraftLocation.toBlockPosition(loc), Blocks.OAK_SIGN.defaultBlockState()); sign.setColor(net.minecraft.world.item.DyeColor.byId(dyeColor.getWoolData())); sign.setHasGlowingText(hasGlowingText); - for (int i = 0; i < components.length; i++) { +@@ -0,0 +0,0 @@ public class CraftPlayer extends CraftHumanEntity implements Player { sign.setMessage(i, components[i]); } - this.getHandle().connection.send(sign.getUpdatePacket()); -+ this.getHandle().connection.send(sign.getUpdatePacket());*/ // Paper -+ this.sendSignChange0(components, loc, dyeColor, hasGlowingText); // Paper ++ getHandle().connection.send(sign.getUpdatePacket()); ++ // Paper end } @Override @@ -4017,7 +4010,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000 + @Override public String getTitle() { - return inventory instanceof CraftInventoryCustom ? ((CraftInventoryCustom.MinecraftInventory) ((CraftInventory) inventory).getInventory()).getTitle() : inventory.getType().getDefaultTitle(); + return title; diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventoryCustom.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventoryCustom.java index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644 --- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventoryCustom.java @@ -4121,7 +4114,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000 + @Override public String getTitle() { - return CraftChatMessage.fromComponent(this.container.getTitle()); + return this.title; diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftItemFactory.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftItemFactory.java index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644 --- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftItemFactory.java diff --git a/patches/server/Build-system-changes.patch b/patches/server/Build-system-changes.patch index ed6743db7a..d7b636fd4c 100644 --- a/patches/server/Build-system-changes.patch +++ b/patches/server/Build-system-changes.patch @@ -78,7 +78,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000 + Date buildDate = new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss Z").parse(Main.class.getPackage().getImplementationVendor()); // Paper Calendar deadline = Calendar.getInstance(); - deadline.add(Calendar.DAY_OF_YEAR, -7); + deadline.add(Calendar.DAY_OF_YEAR, -21); diff --git a/src/main/java/org/bukkit/craftbukkit/util/Versioning.java b/src/main/java/org/bukkit/craftbukkit/util/Versioning.java index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644 --- a/src/main/java/org/bukkit/craftbukkit/util/Versioning.java diff --git a/patches/server/Change-EnderEye-target-without-changing-other-things.patch b/patches/server/Change-EnderEye-target-without-changing-other-things.patch index ba8cc5944a..f34a97e3fa 100644 --- a/patches/server/Change-EnderEye-target-without-changing-other-things.patch +++ b/patches/server/Change-EnderEye-target-without-changing-other-things.patch @@ -47,8 +47,8 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000 + public void setTargetLocation(Location location, boolean update) { + // Paper end Preconditions.checkArgument(getWorld().equals(location.getWorld()), "Cannot target EnderSignal across worlds"); -- this.getHandle().signalTo(BlockPos.containing(location.getX(), location.getY(), location.getZ())); -+ this.getHandle().signalTo(BlockPos.containing(location.getX(), location.getY(), location.getZ()), update); // Paper +- this.getHandle().signalTo(CraftLocation.toBlockPosition(location)); ++ this.getHandle().signalTo(CraftLocation.toBlockPosition(location), update); // Paper } @Override diff --git a/patches/server/Don-t-move-existing-players-to-world-spawn.patch b/patches/server/Don-t-move-existing-players-to-world-spawn.patch index 1c252138ee..2253367ead 100644 --- a/patches/server/Don-t-move-existing-players-to-world-spawn.patch +++ b/patches/server/Don-t-move-existing-players-to-world-spawn.patch @@ -26,10 +26,10 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000 this.cachedSingleHashSet = new com.destroystokyo.paper.util.misc.PooledLinkedHashSets.PooledObjectLinkedOpenHashSet<>(this); // Paper @@ -0,0 +0,0 @@ public class ServerPlayer extends Player { - position = Vec3.atCenterOf(((ServerLevel) world).getSharedSpawnPos()); + position = Vec3.atCenterOf(world.getSharedSpawnPos()); } this.level = world; -- this.setPos(position.x(), position.y(), position.z()); +- this.setPos(position); + this.setPosRaw(position.x(), position.y(), position.z()); // Paper - don't register to chunks yet } this.gameMode.setLevel((ServerLevel) world); diff --git a/patches/server/Expose-world-spawn-angle.patch b/patches/server/Expose-world-spawn-angle.patch index fdb70eeb3f..4cb6e1cfae 100644 --- a/patches/server/Expose-world-spawn-angle.patch +++ b/patches/server/Expose-world-spawn-angle.patch @@ -12,8 +12,8 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000 if (location == null) { worldserver1 = this.server.getLevel(Level.OVERWORLD); blockposition = entityplayer1.getSpawnPoint(worldserver1); -- location = new Location(worldserver1.getWorld(), (double) ((float) blockposition.getX() + 0.5F), (double) ((float) blockposition.getY() + 0.1F), (double) ((float) blockposition.getZ() + 0.5F)); -+ location = new Location(worldserver1.getWorld(), (double) ((float) blockposition.getX() + 0.5F), (double) ((float) blockposition.getY() + 0.1F), (double) ((float) blockposition.getZ() + 0.5F), worldserver1.levelData.getSpawnAngle(), 0.0F); // Paper - use world spawn angle +- location = CraftLocation.toBukkit(blockposition, worldserver1.getWorld()).add(0.5F, 0.1F, 0.5F); ++ location = CraftLocation.toBukkit(blockposition, worldserver1.getWorld(), worldserver1.levelData.getSpawnAngle(), 0.0F).add(0.5F, 0.1F, 0.5F); // Paper - use world spawn angle } Player respawnPlayer = entityplayer1.getBukkitEntity(); diff --git a/patches/server/Fix-force-opening-enchantment-tables.patch b/patches/server/Fix-force-opening-enchantment-tables.patch index 34b08c5965..f3bd1d1682 100644 --- a/patches/server/Fix-force-opening-enchantment-tables.patch +++ b/patches/server/Fix-force-opening-enchantment-tables.patch @@ -11,7 +11,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000 @@ -0,0 +0,0 @@ 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. - BlockPos pos = new BlockPos(location.getBlockX(), location.getBlockY(), location.getBlockZ()); + BlockPos pos = CraftLocation.toBlockPosition(location); - this.getHandle().openMenu(((EnchantmentTableBlock) Blocks.ENCHANTING_TABLE).getMenuProvider(null, this.getHandle().level, pos)); + // Paper start + MenuProvider menuProvider = ((EnchantmentTableBlock) Blocks.ENCHANTING_TABLE).getMenuProvider(null, this.getHandle().level, pos); diff --git a/patches/server/Fix-this-stupid-bullshit.patch b/patches/server/Fix-this-stupid-bullshit.patch index ee787d7140..2e8b1ad818 100644 --- a/patches/server/Fix-this-stupid-bullshit.patch +++ b/patches/server/Fix-this-stupid-bullshit.patch @@ -36,7 +36,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000 +++ b/src/main/java/org/bukkit/craftbukkit/Main.java @@ -0,0 +0,0 @@ public class Main { Calendar deadline = Calendar.getInstance(); - deadline.add(Calendar.DAY_OF_YEAR, -7); + deadline.add(Calendar.DAY_OF_YEAR, -21); if (buildDate.before(deadline.getTime())) { - System.err.println("*** Error, this build is outdated ***"); + // Paper start - This is some stupid bullshit diff --git a/patches/server/Implement-EntityTeleportEndGatewayEvent.patch b/patches/server/Implement-EntityTeleportEndGatewayEvent.patch index 5868d2c1d4..348607e1ae 100644 --- a/patches/server/Implement-EntityTeleportEndGatewayEvent.patch +++ b/patches/server/Implement-EntityTeleportEndGatewayEvent.patch @@ -14,7 +14,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000 // CraftBukkit end + // Paper start - EntityTeleportEndGatewayEvent - replicated from above + org.bukkit.craftbukkit.entity.CraftEntity bukkitEntity = entity.getBukkitEntity(); -+ org.bukkit.Location location = new Location(world.getWorld(), (double) blockposition1.getX() + 0.5D, (double) blockposition1.getY() + 0.5D, (double) blockposition1.getZ() + 0.5D); ++ org.bukkit.Location location = new org.bukkit.Location(world.getWorld(), (double) blockposition1.getX() + 0.5D, (double) blockposition1.getY() + 0.5D, (double) blockposition1.getZ() + 0.5D); + location.setPitch(bukkitEntity.getLocation().getPitch()); + location.setYaw(bukkitEntity.getLocation().getYaw()); + diff --git a/patches/server/Implemented-BlockFailedDispenseEvent.patch b/patches/server/Implemented-BlockFailedDispenseEvent.patch index 8925fc8ec9..363d4c83e4 100644 --- a/patches/server/Implemented-BlockFailedDispenseEvent.patch +++ b/patches/server/Implemented-BlockFailedDispenseEvent.patch @@ -36,8 +36,8 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000 --- a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java +++ b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java @@ -0,0 +0,0 @@ public class CraftEventFactory { - EntitiesUnloadEvent event = new EntitiesUnloadEvent(new CraftChunk((ServerLevel) world, coords.x, coords.z), bukkitEntities); - Bukkit.getPluginManager().callEvent(event); + + return !event.isCancelled(); } + + // Paper start diff --git a/patches/server/Improve-PortalEvents.patch b/patches/server/Improve-PortalEvents.patch index b31bf83a36..8d6e463843 100644 --- a/patches/server/Improve-PortalEvents.patch +++ b/patches/server/Improve-PortalEvents.patch @@ -10,7 +10,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000 +++ b/src/main/java/net/minecraft/world/entity/Entity.java @@ -0,0 +0,0 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { Location enter = bukkitEntity.getLocation(); - Location exit = new Location(exitWorldServer.getWorld(), exitPosition.x(), exitPosition.y(), exitPosition.z()); + Location exit = CraftLocation.toBukkit(exitPosition, exitWorldServer.getWorld()); - EntityPortalEvent event = new EntityPortalEvent(bukkitEntity, enter, exit, searchRadius); + // Paper start diff --git a/patches/server/Kick-on-main-for-illegal-chat.patch b/patches/server/Kick-on-main-for-illegal-chat.patch index 5a4db46068..201904a088 100644 --- a/patches/server/Kick-on-main-for-illegal-chat.patch +++ b/patches/server/Kick-on-main-for-illegal-chat.patch @@ -30,12 +30,6 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000 } else { Optional optional = this.tryHandleChat(packet.command(), packet.timeStamp(), packet.lastSeenMessages()); - if (optional.isPresent()) { - this.server.submit(() -> { -+ if (player.hasDisconnected()) return; // Paper - this.performChatCommand(packet, (LastSeenMessages) optional.get()); - this.detectRateSpam("/" + packet.command()); // Spigot - }); @@ -0,0 +0,0 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic private Optional tryHandleChat(String message, Instant timestamp, LastSeenMessages.Update acknowledgment) { if (!this.updateChatOrder(timestamp)) { diff --git a/patches/server/Missing-Entity-Behavior-API.patch b/patches/server/Missing-Entity-Behavior-API.patch index b044c1b25e..134a214c2a 100644 --- a/patches/server/Missing-Entity-Behavior-API.patch +++ b/patches/server/Missing-Entity-Behavior-API.patch @@ -1208,8 +1208,8 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftWither.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftWither.java @@ -0,0 +0,0 @@ public class CraftWither extends CraftMonster implements Wither, com.destroystok - Entity target = this.getHandle().getLevel().getEntity(entityId); - return (target != null) ? (LivingEntity) target.getBukkitEntity() : null; + + this.getHandle().setInvulnerableTicks(ticks); } + + // Paper start diff --git a/patches/server/More-World-API.patch b/patches/server/More-World-API.patch index d9eecfcc3a..d480a75424 100644 --- a/patches/server/More-World-API.patch +++ b/patches/server/More-World-API.patch @@ -9,7 +9,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000 --- a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java @@ -0,0 +0,0 @@ public class CraftWorld extends CraftRegionAccessor implements World { - return new CraftStructureSearchResult(CraftStructure.minecraftToBukkit(found.getSecond().value(), this.getHandle().registryAccess()), new Location(this, found.getFirst().getX(), found.getFirst().getY(), found.getFirst().getZ())); + return new CraftStructureSearchResult(CraftStructure.minecraftToBukkit(found.getSecond().value(), this.getHandle().registryAccess()), CraftLocation.toBukkit(found.getFirst(), this)); } + // Paper start diff --git a/patches/server/PlayerPickupExperienceEvent.patch b/patches/server/PlayerPickupExperienceEvent.patch index 68ac81ba3d..215d48097b 100644 --- a/patches/server/PlayerPickupExperienceEvent.patch +++ b/patches/server/PlayerPickupExperienceEvent.patch @@ -15,6 +15,6 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000 if (!this.level.isClientSide) { - if (player.takeXpDelay == 0) { + if (player.takeXpDelay == 0 && new com.destroystokyo.paper.event.player.PlayerPickupExperienceEvent(((net.minecraft.server.level.ServerPlayer) player).getBukkitEntity(), (org.bukkit.entity.ExperienceOrb) this.getBukkitEntity()).callEvent()) { // Paper - player.takeXpDelay = 2; + player.takeXpDelay = CraftEventFactory.callPlayerXpCooldownEvent(player, 2, PlayerExpCooldownChangeEvent.ChangeReason.PICKUP_ORB).getNewCooldown(); // CraftBukkit - entityhuman.takeXpDelay = 2; player.take(this, 1); int i = this.repairPlayerItems(player, this.value); diff --git a/patches/server/Protect-Bedrock-and-End-Portal-Frames-from-being-des.patch b/patches/server/Protect-Bedrock-and-End-Portal-Frames-from-being-des.patch index 8da3855735..a8e7dda0e7 100644 --- a/patches/server/Protect-Bedrock-and-End-Portal-Frames-from-being-des.patch +++ b/patches/server/Protect-Bedrock-and-End-Portal-Frames-from-being-des.patch @@ -25,8 +25,8 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000 if (!this.level.isInWorldBounds(blockposition)) { @@ -0,0 +0,0 @@ public class Explosion { - BlockState iblockdata = this.level.getBlockState(blockposition); - Block block = iblockdata.getBlock(); + } + // CraftBukkit end - if (!iblockdata.isAir()) { + if (!iblockdata.isAir() && iblockdata.isDestroyable()) { // Paper diff --git a/patches/server/Restore-custom-InventoryHolder-support.patch b/patches/server/Restore-custom-InventoryHolder-support.patch index 403e547b48..4a6594578c 100644 --- a/patches/server/Restore-custom-InventoryHolder-support.patch +++ b/patches/server/Restore-custom-InventoryHolder-support.patch @@ -164,6 +164,15 @@ diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftContainer.java index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644 --- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftContainer.java +++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftContainer.java +@@ -0,0 +0,0 @@ public class CraftContainer extends AbstractContainerMenu { + public CraftContainer(final Inventory inventory, final Player player, int id) { + this(new InventoryView() { + +- private final String originalTitle = (inventory instanceof CraftInventoryCustom) ? ((CraftInventoryCustom.MinecraftInventory) ((CraftInventory) inventory).getInventory()).getTitle() : inventory.getType().getDefaultTitle(); ++ private final String originalTitle = inventory instanceof CraftInventoryCustom ? ((CraftInventoryCustom) inventory).getTitle() : inventory.getType().getDefaultTitle(); // Paper + private String title = this.originalTitle; + + @Override @@ -0,0 +0,0 @@ public class CraftContainer extends AbstractContainerMenu { // Paper start @Override @@ -173,13 +182,6 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000 } // Paper end - @Override - public String getTitle() { -- return inventory instanceof CraftInventoryCustom ? ((CraftInventoryCustom.MinecraftInventory) ((CraftInventory) inventory).getInventory()).getTitle() : inventory.getType().getDefaultTitle(); -+ return inventory instanceof CraftInventoryCustom custom ? custom.getTitle() : inventory.getType().getDefaultTitle(); // Paper - } - }, player, id); - } @@ -0,0 +0,0 @@ public class CraftContainer extends AbstractContainerMenu { this.lastSlots = delegate.lastSlots; this.slots = delegate.slots; diff --git a/patches/server/Rewrite-chunk-system.patch b/patches/server/Rewrite-chunk-system.patch index 35b2dc4f96..73c26ca139 100644 --- a/patches/server/Rewrite-chunk-system.patch +++ b/patches/server/Rewrite-chunk-system.patch @@ -15955,7 +15955,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000 + entityplayer1.connection.send(new ClientboundSetSimulationDistancePacket(worldserver1.getChunkSource().chunkMap.playerChunkManager.getTargetTickViewDistance())); // Spigot // Paper - replace old player chunk management entityplayer1.spawnIn(worldserver1); entityplayer1.unsetRemoved(); - entityplayer1.connection.teleport(new Location(worldserver1.getWorld(), entityplayer1.getX(), entityplayer1.getY(), entityplayer1.getZ(), entityplayer1.getYRot(), entityplayer1.getXRot())); + entityplayer1.connection.teleport(CraftLocation.toBukkit(entityplayer1.position(), worldserver1.getWorld(), entityplayer1.getYRot(), entityplayer1.getXRot())); @@ -0,0 +0,0 @@ public abstract class PlayerList { public void setViewDistance(int viewDistance) { diff --git a/patches/server/Show-Paper-in-client-crashes-server-lists-and-Mojang.patch b/patches/server/Show-Paper-in-client-crashes-server-lists-and-Mojang.patch index a46534b52e..de8ee7d258 100644 --- a/patches/server/Show-Paper-in-client-crashes-server-lists-and-Mojang.patch +++ b/patches/server/Show-Paper-in-client-crashes-server-lists-and-Mojang.patch @@ -36,7 +36,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000 --- a/src/main/java/org/bukkit/craftbukkit/Main.java +++ b/src/main/java/org/bukkit/craftbukkit/Main.java @@ -0,0 +0,0 @@ public class Main { - deadline.add(Calendar.DAY_OF_YEAR, -7); + deadline.add(Calendar.DAY_OF_YEAR, -21); 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/patches/server/Tracking-Range-Improvements.patch b/patches/server/Tracking-Range-Improvements.patch index 51d846e7bb..8fdfc73b8d 100644 --- a/patches/server/Tracking-Range-Improvements.patch +++ b/patches/server/Tracking-Range-Improvements.patch @@ -67,6 +67,9 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000 + // Paper end { return config.miscTrackingRange; + } else if ( entity instanceof Display ) +@@ -0,0 +0,0 @@ public class TrackingRange + return config.displayTrackingRange; } else { + if (entity instanceof net.minecraft.world.entity.boss.enderdragon.EnderDragon) return ((net.minecraft.server.level.ServerLevel)(entity.getCommandSenderWorld())).getChunkSource().chunkMap.getEffectiveViewDistance(); // Paper - enderdragon is exempt diff --git a/patches/server/Use-distance-map-to-optimise-entity-tracker.patch b/patches/server/Use-distance-map-to-optimise-entity-tracker.patch index f38fab1a4c..9ee059fe4d 100644 --- a/patches/server/Use-distance-map-to-optimise-entity-tracker.patch +++ b/patches/server/Use-distance-map-to-optimise-entity-tracker.patch @@ -350,7 +350,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000 if ( entity instanceof ServerPlayer ) { @@ -0,0 +0,0 @@ public class TrackingRange - return config.miscTrackingRange; + return config.displayTrackingRange; } else { - if (entity instanceof net.minecraft.world.entity.boss.enderdragon.EnderDragon) return ((net.minecraft.server.level.ServerLevel)(entity.getCommandSenderWorld())).getChunkSource().chunkMap.getEffectiveViewDistance(); // Paper - enderdragon is exempt diff --git a/work/Bukkit b/work/Bukkit index 465c496472..2fcba9b271 160000 --- a/work/Bukkit +++ b/work/Bukkit @@ -1 +1 @@ -Subproject commit 465c4964722bd062eb83331142cfa1af63a4f0c2 +Subproject commit 2fcba9b271a8557073af845ba6c9c1c121565bea diff --git a/work/CraftBukkit b/work/CraftBukkit index 818582f409..01b2e1af41 160000 --- a/work/CraftBukkit +++ b/work/CraftBukkit @@ -1 +1 @@ -Subproject commit 818582f409401817e7331a6e31e25a1ae4832ad8 +Subproject commit 01b2e1af41a8698d54437d275b2e7d41014d5d81 diff --git a/work/Spigot b/work/Spigot index 514cf03ae9..7da74dae7f 160000 --- a/work/Spigot +++ b/work/Spigot @@ -1 +1 @@ -Subproject commit 514cf03ae91c086bf9e47825379698b3a97b6326 +Subproject commit 7da74dae7f21e374cd5ee71645fb2bfccdf05beb