diff --git a/paper-server/patches/sources/com/mojang/brigadier/tree/CommandNode.java.patch b/paper-server/patches/sources/com/mojang/brigadier/tree/CommandNode.java.patch index 1b5e8b98af..1431fc6d44 100644 --- a/paper-server/patches/sources/com/mojang/brigadier/tree/CommandNode.java.patch +++ b/paper-server/patches/sources/com/mojang/brigadier/tree/CommandNode.java.patch @@ -1,26 +1,10 @@ --- a/com/mojang/brigadier/tree/CommandNode.java +++ b/com/mojang/brigadier/tree/CommandNode.java -@@ -3,6 +_,7 @@ - - package com.mojang.brigadier.tree; - -+// CHECKSTYLE:OFF - import com.mojang.brigadier.AmbiguityConsumer; - import com.mojang.brigadier.Command; - import com.mojang.brigadier.RedirectModifier; -@@ -22,6 +_,7 @@ - import java.util.Set; - import java.util.concurrent.CompletableFuture; - import java.util.function.Predicate; -+import net.minecraft.commands.CommandSourceStack; - - public abstract class CommandNode implements Comparable> { - private final Map> children = new LinkedHashMap<>(); @@ -32,6 +_,16 @@ private final RedirectModifier modifier; private final boolean forks; private Command command; -+ public CommandNode clientNode; // Paper - Brigadier API ++ public CommandNode clientNode; // Paper - Brigadier API + public CommandNode unwrappedCached = null; // Paper - Brigadier Command API + public CommandNode wrappedCached = null; // Paper - Brigadier Command API + // CraftBukkit start @@ -40,12 +24,12 @@ - public boolean canUse(final S source) { + // CraftBukkit start + public synchronized boolean canUse(final S source) { -+ if (source instanceof CommandSourceStack) { ++ if (source instanceof final net.minecraft.commands.CommandSourceStack css) { + try { -+ ((CommandSourceStack) source).currentCommand.put(Thread.currentThread(), this); // Paper - Thread Safe Vanilla Command permission checking ++ css.currentCommand.put(Thread.currentThread(), this); // Paper - Thread Safe Vanilla Command permission checking + return this.requirement.test(source); + } finally { -+ ((CommandSourceStack) source).currentCommand.remove(Thread.currentThread()); // Paper - Thread Safe Vanilla Command permission checking ++ css.currentCommand.remove(Thread.currentThread()); // Paper - Thread Safe Vanilla Command permission checking + } + } + // CraftBukkit end @@ -72,11 +56,11 @@ - final LiteralCommandNode literal = literals.get(text); + // Paper start - prioritize mc commands in function parsing + LiteralCommandNode literal = null; -+ if (source instanceof CommandSourceStack css && css.source == net.minecraft.commands.CommandSource.NULL) { ++ if (source instanceof net.minecraft.commands.CommandSourceStack css && css.source == net.minecraft.commands.CommandSource.NULL) { + if (!text.contains(":")) { + literal = this.literals.get("minecraft:" + text); + } -+ } else if (source instanceof CommandSourceStack css && css.source instanceof net.minecraft.world.level.BaseCommandBlock) { ++ } else if (source instanceof net.minecraft.commands.CommandSourceStack css && css.source instanceof net.minecraft.world.level.BaseCommandBlock) { + if (css.getServer().server.getCommandBlockOverride(text) && !text.contains(":")) { + literal = this.literals.get("minecraft:" + text); + } diff --git a/paper-server/patches/sources/net/minecraft/advancements/critereon/SimpleCriterionTrigger.java.patch b/paper-server/patches/sources/net/minecraft/advancements/critereon/SimpleCriterionTrigger.java.patch index f953971ef6..1817a4cb37 100644 --- a/paper-server/patches/sources/net/minecraft/advancements/critereon/SimpleCriterionTrigger.java.patch +++ b/paper-server/patches/sources/net/minecraft/advancements/critereon/SimpleCriterionTrigger.java.patch @@ -5,23 +5,23 @@ public abstract class SimpleCriterionTrigger implements CriterionTrigger { - private final Map>> players = Maps.newIdentityHashMap(); -+ // private final Map>> players = Maps.newIdentityHashMap(); // Paper - fix AdvancementDataPlayer leak; moved into AdvancementDataPlayer to fix memory leak ++ // private final Map>> players = Maps.newIdentityHashMap(); // Paper - fix PlayerAdvancements leak; moved into PlayerAdvancements to fix memory leak @Override public final void addPlayerListener(PlayerAdvancements playerAdvancements, CriterionTrigger.Listener listener) { - this.players.computeIfAbsent(playerAdvancements, advancements -> Sets.newHashSet()).add(listener); -+ playerAdvancements.criterionData.computeIfAbsent(this, managerx -> Sets.newHashSet()).add(listener); // Paper - fix AdvancementDataPlayer leak ++ playerAdvancements.criterionData.computeIfAbsent(this, managerx -> Sets.newHashSet()).add(listener); // Paper - fix PlayerAdvancements leak } @Override public final void removePlayerListener(PlayerAdvancements playerAdvancements, CriterionTrigger.Listener listener) { - Set> set = this.players.get(playerAdvancements); -+ Set> set = (Set) playerAdvancements.criterionData.get(this); // Paper - fix AdvancementDataPlayer leak ++ Set> set = (Set) playerAdvancements.criterionData.get(this); // Paper - fix PlayerAdvancements leak if (set != null) { set.remove(listener); if (set.isEmpty()) { - this.players.remove(playerAdvancements); -+ playerAdvancements.criterionData.remove(this); // Paper - fix AdvancementDataPlayer leak ++ playerAdvancements.criterionData.remove(this); // Paper - fix PlayerAdvancements leak } } } @@ -29,13 +29,13 @@ @Override public final void removePlayerListeners(PlayerAdvancements playerAdvancements) { - this.players.remove(playerAdvancements); -+ playerAdvancements.criterionData.remove(this); // Paper - fix AdvancementDataPlayer leak ++ playerAdvancements.criterionData.remove(this); // Paper - fix PlayerAdvancements leak } protected void trigger(ServerPlayer player, Predicate testTrigger) { PlayerAdvancements advancements = player.getAdvancements(); - Set> set = this.players.get(advancements); -+ Set> set = (Set) advancements.criterionData.get(this); // Paper - fix AdvancementDataPlayer leak ++ Set> set = (Set) advancements.criterionData.get(this); // Paper - fix PlayerAdvancements leak if (set != null && !set.isEmpty()) { - LootContext lootContext = EntityPredicate.createContext(player, player); + LootContext lootContext = null; // EntityPredicate.createContext(player, player); // Paper - Perf: lazily create LootContext for criterions diff --git a/paper-server/patches/sources/net/minecraft/commands/Commands.java.patch b/paper-server/patches/sources/net/minecraft/commands/Commands.java.patch index 843b1af707..954cc79823 100644 --- a/paper-server/patches/sources/net/minecraft/commands/Commands.java.patch +++ b/paper-server/patches/sources/net/minecraft/commands/Commands.java.patch @@ -1,20 +1,5 @@ --- a/net/minecraft/commands/Commands.java +++ b/net/minecraft/commands/Commands.java -@@ -139,6 +_,14 @@ - import net.minecraft.world.level.GameRules; - import org.slf4j.Logger; - -+// CraftBukkit start -+import com.google.common.base.Joiner; -+import java.util.Collection; -+import java.util.LinkedHashSet; -+import org.bukkit.event.player.PlayerCommandSendEvent; -+import org.bukkit.event.server.ServerCommandEvent; -+// CraftBukkit end -+ - public class Commands { - private static final ThreadLocal> CURRENT_EXECUTION_CONTEXT = new ThreadLocal<>(); - private static final Logger LOGGER = LogUtils.getLogger(); @@ -251,6 +_,30 @@ PublishCommand.register(this.dispatcher); } @@ -52,12 +37,12 @@ + // CraftBukkit start + public void dispatchServerCommand(CommandSourceStack sender, String command) { -+ Joiner joiner = Joiner.on(" "); ++ com.google.common.base.Joiner joiner = com.google.common.base.Joiner.on(" "); + if (command.startsWith("/")) { + command = command.substring(1); + } + -+ ServerCommandEvent event = new ServerCommandEvent(sender.getBukkitSender(), command); ++ org.bukkit.event.server.ServerCommandEvent event = new org.bukkit.event.server.ServerCommandEvent(sender.getBukkitSender(), command); + org.bukkit.Bukkit.getPluginManager().callEvent(event); + if (event.isCancelled()) { + return; @@ -135,7 +120,7 @@ + // Paper start - Add UnknownCommandEvent + final net.kyori.adventure.text.TextComponent.Builder builder = net.kyori.adventure.text.Component.text(); + // source.sendFailure(ComponentUtils.fromMessage(var7.getRawMessage())); -+ builder.color(net.kyori.adventure.text.format.NamedTextColor.RED).append(io.papermc.paper.brigadier.PaperBrigadier.componentFromMessage(var7.getRawMessage())); ++ builder.color(net.kyori.adventure.text.format.NamedTextColor.RED).append(io.papermc.paper.command.brigadier.MessageComponentSerializer.message().deserialize(var7.getRawMessage())); + // Paper end - Add UnknownCommandEvent if (var7.getInput() != null && var7.getCursor() >= 0) { int min = Math.min(var7.getInput().length(), var7.getCursor()); @@ -180,7 +165,7 @@ + // Register Vanilla commands into builtRoot as before + // Paper start - Perf: Async command map building + // Copy root children to avoid concurrent modification during building -+ final Collection> commandNodes = new java.util.ArrayList<>(this.dispatcher.getRoot().getChildren()); ++ final java.util.Collection> commandNodes = new java.util.ArrayList<>(this.dispatcher.getRoot().getChildren()); + COMMAND_SENDING_POOL.execute(() -> this.sendAsync(player, commandNodes)); + } + @@ -195,7 +180,7 @@ + new java.util.concurrent.ThreadPoolExecutor.DiscardPolicy() + ); + -+ private void sendAsync(ServerPlayer player, Collection> dispatcherRootChildren) { ++ private void sendAsync(ServerPlayer player, java.util.Collection> dispatcherRootChildren) { + // Paper end - Perf: Async command map building + Map, CommandNode> map = Maps.newIdentityHashMap(); // Use identity to prevent aliasing issues + // Paper - brigadier API removes the need to fill the map twice @@ -204,7 +189,7 @@ - this.fillUsableCommands(this.dispatcher.getRoot(), rootCommandNode, player.createCommandSourceStack(), map); + this.fillUsableCommands(dispatcherRootChildren, rootCommandNode, player.createCommandSourceStack(), map); // Paper - Perf: Async command map building; pass copy of children + -+ Collection bukkit = new LinkedHashSet<>(); ++ java.util.Collection bukkit = new java.util.LinkedHashSet<>(); + for (CommandNode node : rootCommandNode.getChildren()) { + bukkit.add(node.getName()); + } @@ -215,10 +200,10 @@ + }); + } + -+ private void runSync(ServerPlayer player, Collection bukkit, RootCommandNode rootCommandNode) { ++ private void runSync(ServerPlayer player, java.util.Collection bukkit, RootCommandNode rootCommandNode) { + // Paper end - Perf: Async command map building + new com.destroystokyo.paper.event.brigadier.AsyncPlayerSendCommandsEvent(player.getBukkitEntity(), (RootCommandNode) rootCommandNode, true).callEvent(); // Paper - Brigadier API -+ PlayerCommandSendEvent event = new PlayerCommandSendEvent(player.getBukkitEntity(), new LinkedHashSet<>(bukkit)); ++ org.bukkit.event.player.PlayerCommandSendEvent event = new org.bukkit.event.player.PlayerCommandSendEvent(player.getBukkitEntity(), new java.util.LinkedHashSet<>(bukkit)); + event.getPlayer().getServer().getPluginManager().callEvent(event); + + // Remove labels that were removed during the event @@ -234,7 +219,7 @@ private void fillUsableCommands( - CommandNode rootCommandSource, -+ Collection> children, // Paper - Perf: Async command map building; pass copy of children ++ java.util.Collection> children, // Paper - Perf: Async command map building; pass copy of children CommandNode rootSuggestion, CommandSourceStack source, Map, CommandNode> commandNodeToSuggestionNode diff --git a/paper-server/patches/sources/net/minecraft/core/dispenser/DispenseItemBehavior.java.patch b/paper-server/patches/sources/net/minecraft/core/dispenser/DispenseItemBehavior.java.patch index 687221251f..fed8dc6488 100644 --- a/paper-server/patches/sources/net/minecraft/core/dispenser/DispenseItemBehavior.java.patch +++ b/paper-server/patches/sources/net/minecraft/core/dispenser/DispenseItemBehavior.java.patch @@ -1,15 +1,5 @@ --- a/net/minecraft/core/dispenser/DispenseItemBehavior.java +++ b/net/minecraft/core/dispenser/DispenseItemBehavior.java -@@ -43,7 +_,9 @@ - import net.minecraft.world.level.block.CandleCakeBlock; - import net.minecraft.world.level.block.CarvedPumpkinBlock; - import net.minecraft.world.level.block.DispenserBlock; -+import net.minecraft.world.level.block.LiquidBlockContainer; - import net.minecraft.world.level.block.RespawnAnchorBlock; -+import net.minecraft.world.level.block.SaplingBlock; - import net.minecraft.world.level.block.ShulkerBoxBlock; - import net.minecraft.world.level.block.SkullBlock; - import net.minecraft.world.level.block.TntBlock; @@ -82,16 +_,48 @@ Direction direction = blockSource.state().getValue(DispenserBlock.FACING); EntityType type = ((SpawnEggItem)item.getItem()).getType(blockSource.level().registryAccess(), item); @@ -195,7 +185,7 @@ + /* Taken from SolidBucketItem#emptyContents */ + boolean willEmptyContentsSolidBucketItem = dispensibleContainerItem instanceof net.minecraft.world.item.SolidBucketItem && level.isInWorldBounds(blockPos) && iblockdata.isAir(); + /* Taken from BucketItem#emptyContents */ -+ boolean willEmptyBucketItem = dispensibleContainerItem instanceof final net.minecraft.world.item.BucketItem bucketItem && bucketItem.content instanceof net.minecraft.world.level.material.FlowingFluid && (iblockdata.isAir() || iblockdata.canBeReplaced(bucketItem.content) || (iblockdata.getBlock() instanceof LiquidBlockContainer liquidBlockContainer && liquidBlockContainer.canPlaceLiquid(null, level, blockPos, iblockdata, bucketItem.content))); ++ boolean willEmptyBucketItem = dispensibleContainerItem instanceof final net.minecraft.world.item.BucketItem bucketItem && bucketItem.content instanceof net.minecraft.world.level.material.FlowingFluid && (iblockdata.isAir() || iblockdata.canBeReplaced(bucketItem.content) || (iblockdata.getBlock() instanceof net.minecraft.world.level.block.LiquidBlockContainer liquidBlockContainer && liquidBlockContainer.canPlaceLiquid(null, level, blockPos, iblockdata, bucketItem.content))); + if (willEmptyContentsSolidBucketItem || willEmptyBucketItem) { + // Paper end - correctly check if the bucket place will succeed + org.bukkit.block.Block block = org.bukkit.craftbukkit.block.CraftBlock.at(level, blockSource.pos()); @@ -357,8 +347,8 @@ + // CraftBukkit start + level.captureTreeGeneration = false; + if (level.capturedBlockStates.size() > 0) { -+ org.bukkit.TreeType treeType = SaplingBlock.treeType; -+ SaplingBlock.treeType = null; ++ org.bukkit.TreeType treeType = net.minecraft.world.level.block.SaplingBlock.treeType; ++ net.minecraft.world.level.block.SaplingBlock.treeType = null; + org.bukkit.Location location = org.bukkit.craftbukkit.util.CraftLocation.toBukkit(blockPos, level.getWorld()); + List blocks = new java.util.ArrayList<>(level.capturedBlockStates.values()); + level.capturedBlockStates.clear(); diff --git a/paper-server/patches/sources/net/minecraft/server/Bootstrap.java.patch b/paper-server/patches/sources/net/minecraft/server/Bootstrap.java.patch index b1ee24c3e7..701d502fec 100644 --- a/paper-server/patches/sources/net/minecraft/server/Bootstrap.java.patch +++ b/paper-server/patches/sources/net/minecraft/server/Bootstrap.java.patch @@ -1,15 +1,5 @@ --- a/net/minecraft/server/Bootstrap.java +++ b/net/minecraft/server/Bootstrap.java -@@ -17,6 +_,9 @@ - import net.minecraft.core.dispenser.DispenseItemBehavior; - import net.minecraft.core.registries.BuiltInRegistries; - import net.minecraft.locale.Language; -+import net.minecraft.util.datafix.fixes.BlockStateData; -+import net.minecraft.util.datafix.fixes.ItemIdFix; -+import net.minecraft.util.datafix.fixes.ItemSpawnEggFix; - import net.minecraft.world.effect.MobEffect; - import net.minecraft.world.entity.EntityType; - import net.minecraft.world.entity.ai.attributes.Attribute; @@ -43,6 +_,7 @@ if (!isBootstrapped) { isBootstrapped = true; @@ -32,67 +22,67 @@ bootstrapDuration.set(Duration.between(instant, Instant.now()).toMillis()); } + // CraftBukkit start - easier than fixing the decompile -+ BlockStateData.register(1008, "{Name:'minecraft:oak_sign',Properties:{rotation:'0'}}", "{Name:'minecraft:standing_sign',Properties:{rotation:'0'}}"); -+ BlockStateData.register(1009, "{Name:'minecraft:oak_sign',Properties:{rotation:'1'}}", "{Name:'minecraft:standing_sign',Properties:{rotation:'1'}}"); -+ BlockStateData.register(1010, "{Name:'minecraft:oak_sign',Properties:{rotation:'2'}}", "{Name:'minecraft:standing_sign',Properties:{rotation:'2'}}"); -+ BlockStateData.register(1011, "{Name:'minecraft:oak_sign',Properties:{rotation:'3'}}", "{Name:'minecraft:standing_sign',Properties:{rotation:'3'}}"); -+ BlockStateData.register(1012, "{Name:'minecraft:oak_sign',Properties:{rotation:'4'}}", "{Name:'minecraft:standing_sign',Properties:{rotation:'4'}}"); -+ BlockStateData.register(1013, "{Name:'minecraft:oak_sign',Properties:{rotation:'5'}}", "{Name:'minecraft:standing_sign',Properties:{rotation:'5'}}"); -+ BlockStateData.register(1014, "{Name:'minecraft:oak_sign',Properties:{rotation:'6'}}", "{Name:'minecraft:standing_sign',Properties:{rotation:'6'}}"); -+ BlockStateData.register(1015, "{Name:'minecraft:oak_sign',Properties:{rotation:'7'}}", "{Name:'minecraft:standing_sign',Properties:{rotation:'7'}}"); -+ BlockStateData.register(1016, "{Name:'minecraft:oak_sign',Properties:{rotation:'8'}}", "{Name:'minecraft:standing_sign',Properties:{rotation:'8'}}"); -+ BlockStateData.register(1017, "{Name:'minecraft:oak_sign',Properties:{rotation:'9'}}", "{Name:'minecraft:standing_sign',Properties:{rotation:'9'}}"); -+ BlockStateData.register(1018, "{Name:'minecraft:oak_sign',Properties:{rotation:'10'}}", "{Name:'minecraft:standing_sign',Properties:{rotation:'10'}}"); -+ BlockStateData.register(1019, "{Name:'minecraft:oak_sign',Properties:{rotation:'11'}}", "{Name:'minecraft:standing_sign',Properties:{rotation:'11'}}"); -+ BlockStateData.register(1020, "{Name:'minecraft:oak_sign',Properties:{rotation:'12'}}", "{Name:'minecraft:standing_sign',Properties:{rotation:'12'}}"); -+ BlockStateData.register(1021, "{Name:'minecraft:oak_sign',Properties:{rotation:'13'}}", "{Name:'minecraft:standing_sign',Properties:{rotation:'13'}}"); -+ BlockStateData.register(1022, "{Name:'minecraft:oak_sign',Properties:{rotation:'14'}}", "{Name:'minecraft:standing_sign',Properties:{rotation:'14'}}"); -+ BlockStateData.register(1023, "{Name:'minecraft:oak_sign',Properties:{rotation:'15'}}", "{Name:'minecraft:standing_sign',Properties:{rotation:'15'}}"); -+ ItemIdFix.ITEM_NAMES.put(323, "minecraft:oak_sign"); ++ net.minecraft.util.datafix.fixes.BlockStateData.register(1008, "{Name:'minecraft:oak_sign',Properties:{rotation:'0'}}", "{Name:'minecraft:standing_sign',Properties:{rotation:'0'}}"); ++ net.minecraft.util.datafix.fixes.BlockStateData.register(1009, "{Name:'minecraft:oak_sign',Properties:{rotation:'1'}}", "{Name:'minecraft:standing_sign',Properties:{rotation:'1'}}"); ++ net.minecraft.util.datafix.fixes.BlockStateData.register(1010, "{Name:'minecraft:oak_sign',Properties:{rotation:'2'}}", "{Name:'minecraft:standing_sign',Properties:{rotation:'2'}}"); ++ net.minecraft.util.datafix.fixes.BlockStateData.register(1011, "{Name:'minecraft:oak_sign',Properties:{rotation:'3'}}", "{Name:'minecraft:standing_sign',Properties:{rotation:'3'}}"); ++ net.minecraft.util.datafix.fixes.BlockStateData.register(1012, "{Name:'minecraft:oak_sign',Properties:{rotation:'4'}}", "{Name:'minecraft:standing_sign',Properties:{rotation:'4'}}"); ++ net.minecraft.util.datafix.fixes.BlockStateData.register(1013, "{Name:'minecraft:oak_sign',Properties:{rotation:'5'}}", "{Name:'minecraft:standing_sign',Properties:{rotation:'5'}}"); ++ net.minecraft.util.datafix.fixes.BlockStateData.register(1014, "{Name:'minecraft:oak_sign',Properties:{rotation:'6'}}", "{Name:'minecraft:standing_sign',Properties:{rotation:'6'}}"); ++ net.minecraft.util.datafix.fixes.BlockStateData.register(1015, "{Name:'minecraft:oak_sign',Properties:{rotation:'7'}}", "{Name:'minecraft:standing_sign',Properties:{rotation:'7'}}"); ++ net.minecraft.util.datafix.fixes.BlockStateData.register(1016, "{Name:'minecraft:oak_sign',Properties:{rotation:'8'}}", "{Name:'minecraft:standing_sign',Properties:{rotation:'8'}}"); ++ net.minecraft.util.datafix.fixes.BlockStateData.register(1017, "{Name:'minecraft:oak_sign',Properties:{rotation:'9'}}", "{Name:'minecraft:standing_sign',Properties:{rotation:'9'}}"); ++ net.minecraft.util.datafix.fixes.BlockStateData.register(1018, "{Name:'minecraft:oak_sign',Properties:{rotation:'10'}}", "{Name:'minecraft:standing_sign',Properties:{rotation:'10'}}"); ++ net.minecraft.util.datafix.fixes.BlockStateData.register(1019, "{Name:'minecraft:oak_sign',Properties:{rotation:'11'}}", "{Name:'minecraft:standing_sign',Properties:{rotation:'11'}}"); ++ net.minecraft.util.datafix.fixes.BlockStateData.register(1020, "{Name:'minecraft:oak_sign',Properties:{rotation:'12'}}", "{Name:'minecraft:standing_sign',Properties:{rotation:'12'}}"); ++ net.minecraft.util.datafix.fixes.BlockStateData.register(1021, "{Name:'minecraft:oak_sign',Properties:{rotation:'13'}}", "{Name:'minecraft:standing_sign',Properties:{rotation:'13'}}"); ++ net.minecraft.util.datafix.fixes.BlockStateData.register(1022, "{Name:'minecraft:oak_sign',Properties:{rotation:'14'}}", "{Name:'minecraft:standing_sign',Properties:{rotation:'14'}}"); ++ net.minecraft.util.datafix.fixes.BlockStateData.register(1023, "{Name:'minecraft:oak_sign',Properties:{rotation:'15'}}", "{Name:'minecraft:standing_sign',Properties:{rotation:'15'}}"); ++ net.minecraft.util.datafix.fixes.ItemIdFix.ITEM_NAMES.put(323, "minecraft:oak_sign"); + -+ BlockStateData.register(1440, "{Name:\'minecraft:portal\',Properties:{axis:\'x\'}}", new String[]{"{Name:\'minecraft:portal\',Properties:{axis:\'x\'}}"}); ++ net.minecraft.util.datafix.fixes.BlockStateData.register(1440, "{Name:\'minecraft:portal\',Properties:{axis:\'x\'}}", new String[]{"{Name:\'minecraft:portal\',Properties:{axis:\'x\'}}"}); + -+ ItemIdFix.ITEM_NAMES.put(409, "minecraft:prismarine_shard"); -+ ItemIdFix.ITEM_NAMES.put(410, "minecraft:prismarine_crystals"); -+ ItemIdFix.ITEM_NAMES.put(411, "minecraft:rabbit"); -+ ItemIdFix.ITEM_NAMES.put(412, "minecraft:cooked_rabbit"); -+ ItemIdFix.ITEM_NAMES.put(413, "minecraft:rabbit_stew"); -+ ItemIdFix.ITEM_NAMES.put(414, "minecraft:rabbit_foot"); -+ ItemIdFix.ITEM_NAMES.put(415, "minecraft:rabbit_hide"); -+ ItemIdFix.ITEM_NAMES.put(416, "minecraft:armor_stand"); ++ net.minecraft.util.datafix.fixes.ItemIdFix.ITEM_NAMES.put(409, "minecraft:prismarine_shard"); ++ net.minecraft.util.datafix.fixes.ItemIdFix.ITEM_NAMES.put(410, "minecraft:prismarine_crystals"); ++ net.minecraft.util.datafix.fixes.ItemIdFix.ITEM_NAMES.put(411, "minecraft:rabbit"); ++ net.minecraft.util.datafix.fixes.ItemIdFix.ITEM_NAMES.put(412, "minecraft:cooked_rabbit"); ++ net.minecraft.util.datafix.fixes.ItemIdFix.ITEM_NAMES.put(413, "minecraft:rabbit_stew"); ++ net.minecraft.util.datafix.fixes.ItemIdFix.ITEM_NAMES.put(414, "minecraft:rabbit_foot"); ++ net.minecraft.util.datafix.fixes.ItemIdFix.ITEM_NAMES.put(415, "minecraft:rabbit_hide"); ++ net.minecraft.util.datafix.fixes.ItemIdFix.ITEM_NAMES.put(416, "minecraft:armor_stand"); + -+ ItemIdFix.ITEM_NAMES.put(423, "minecraft:mutton"); -+ ItemIdFix.ITEM_NAMES.put(424, "minecraft:cooked_mutton"); -+ ItemIdFix.ITEM_NAMES.put(425, "minecraft:banner"); -+ ItemIdFix.ITEM_NAMES.put(426, "minecraft:end_crystal"); -+ ItemIdFix.ITEM_NAMES.put(427, "minecraft:spruce_door"); -+ ItemIdFix.ITEM_NAMES.put(428, "minecraft:birch_door"); -+ ItemIdFix.ITEM_NAMES.put(429, "minecraft:jungle_door"); -+ ItemIdFix.ITEM_NAMES.put(430, "minecraft:acacia_door"); -+ ItemIdFix.ITEM_NAMES.put(431, "minecraft:dark_oak_door"); -+ ItemIdFix.ITEM_NAMES.put(432, "minecraft:chorus_fruit"); -+ ItemIdFix.ITEM_NAMES.put(433, "minecraft:chorus_fruit_popped"); -+ ItemIdFix.ITEM_NAMES.put(434, "minecraft:beetroot"); -+ ItemIdFix.ITEM_NAMES.put(435, "minecraft:beetroot_seeds"); -+ ItemIdFix.ITEM_NAMES.put(436, "minecraft:beetroot_soup"); -+ ItemIdFix.ITEM_NAMES.put(437, "minecraft:dragon_breath"); -+ ItemIdFix.ITEM_NAMES.put(438, "minecraft:splash_potion"); -+ ItemIdFix.ITEM_NAMES.put(439, "minecraft:spectral_arrow"); -+ ItemIdFix.ITEM_NAMES.put(440, "minecraft:tipped_arrow"); -+ ItemIdFix.ITEM_NAMES.put(441, "minecraft:lingering_potion"); -+ ItemIdFix.ITEM_NAMES.put(442, "minecraft:shield"); -+ ItemIdFix.ITEM_NAMES.put(443, "minecraft:elytra"); -+ ItemIdFix.ITEM_NAMES.put(444, "minecraft:spruce_boat"); -+ ItemIdFix.ITEM_NAMES.put(445, "minecraft:birch_boat"); -+ ItemIdFix.ITEM_NAMES.put(446, "minecraft:jungle_boat"); -+ ItemIdFix.ITEM_NAMES.put(447, "minecraft:acacia_boat"); -+ ItemIdFix.ITEM_NAMES.put(448, "minecraft:dark_oak_boat"); -+ ItemIdFix.ITEM_NAMES.put(449, "minecraft:totem_of_undying"); -+ ItemIdFix.ITEM_NAMES.put(450, "minecraft:shulker_shell"); -+ ItemIdFix.ITEM_NAMES.put(452, "minecraft:iron_nugget"); -+ ItemIdFix.ITEM_NAMES.put(453, "minecraft:knowledge_book"); ++ net.minecraft.util.datafix.fixes.ItemIdFix.ITEM_NAMES.put(423, "minecraft:mutton"); ++ net.minecraft.util.datafix.fixes.ItemIdFix.ITEM_NAMES.put(424, "minecraft:cooked_mutton"); ++ net.minecraft.util.datafix.fixes.ItemIdFix.ITEM_NAMES.put(425, "minecraft:banner"); ++ net.minecraft.util.datafix.fixes.ItemIdFix.ITEM_NAMES.put(426, "minecraft:end_crystal"); ++ net.minecraft.util.datafix.fixes.ItemIdFix.ITEM_NAMES.put(427, "minecraft:spruce_door"); ++ net.minecraft.util.datafix.fixes.ItemIdFix.ITEM_NAMES.put(428, "minecraft:birch_door"); ++ net.minecraft.util.datafix.fixes.ItemIdFix.ITEM_NAMES.put(429, "minecraft:jungle_door"); ++ net.minecraft.util.datafix.fixes.ItemIdFix.ITEM_NAMES.put(430, "minecraft:acacia_door"); ++ net.minecraft.util.datafix.fixes.ItemIdFix.ITEM_NAMES.put(431, "minecraft:dark_oak_door"); ++ net.minecraft.util.datafix.fixes.ItemIdFix.ITEM_NAMES.put(432, "minecraft:chorus_fruit"); ++ net.minecraft.util.datafix.fixes.ItemIdFix.ITEM_NAMES.put(433, "minecraft:chorus_fruit_popped"); ++ net.minecraft.util.datafix.fixes.ItemIdFix.ITEM_NAMES.put(434, "minecraft:beetroot"); ++ net.minecraft.util.datafix.fixes.ItemIdFix.ITEM_NAMES.put(435, "minecraft:beetroot_seeds"); ++ net.minecraft.util.datafix.fixes.ItemIdFix.ITEM_NAMES.put(436, "minecraft:beetroot_soup"); ++ net.minecraft.util.datafix.fixes.ItemIdFix.ITEM_NAMES.put(437, "minecraft:dragon_breath"); ++ net.minecraft.util.datafix.fixes.ItemIdFix.ITEM_NAMES.put(438, "minecraft:splash_potion"); ++ net.minecraft.util.datafix.fixes.ItemIdFix.ITEM_NAMES.put(439, "minecraft:spectral_arrow"); ++ net.minecraft.util.datafix.fixes.ItemIdFix.ITEM_NAMES.put(440, "minecraft:tipped_arrow"); ++ net.minecraft.util.datafix.fixes.ItemIdFix.ITEM_NAMES.put(441, "minecraft:lingering_potion"); ++ net.minecraft.util.datafix.fixes.ItemIdFix.ITEM_NAMES.put(442, "minecraft:shield"); ++ net.minecraft.util.datafix.fixes.ItemIdFix.ITEM_NAMES.put(443, "minecraft:elytra"); ++ net.minecraft.util.datafix.fixes.ItemIdFix.ITEM_NAMES.put(444, "minecraft:spruce_boat"); ++ net.minecraft.util.datafix.fixes.ItemIdFix.ITEM_NAMES.put(445, "minecraft:birch_boat"); ++ net.minecraft.util.datafix.fixes.ItemIdFix.ITEM_NAMES.put(446, "minecraft:jungle_boat"); ++ net.minecraft.util.datafix.fixes.ItemIdFix.ITEM_NAMES.put(447, "minecraft:acacia_boat"); ++ net.minecraft.util.datafix.fixes.ItemIdFix.ITEM_NAMES.put(448, "minecraft:dark_oak_boat"); ++ net.minecraft.util.datafix.fixes.ItemIdFix.ITEM_NAMES.put(449, "minecraft:totem_of_undying"); ++ net.minecraft.util.datafix.fixes.ItemIdFix.ITEM_NAMES.put(450, "minecraft:shulker_shell"); ++ net.minecraft.util.datafix.fixes.ItemIdFix.ITEM_NAMES.put(452, "minecraft:iron_nugget"); ++ net.minecraft.util.datafix.fixes.ItemIdFix.ITEM_NAMES.put(453, "minecraft:knowledge_book"); + -+ ItemSpawnEggFix.ID_TO_ENTITY[23] = "Arrow"; ++ net.minecraft.util.datafix.fixes.ItemSpawnEggFix.ID_TO_ENTITY[23] = "Arrow"; + // CraftBukkit end } } diff --git a/paper-server/patches/sources/net/minecraft/server/Main.java.patch b/paper-server/patches/sources/net/minecraft/server/Main.java.patch index 001042f60c..f166107df6 100644 --- a/paper-server/patches/sources/net/minecraft/server/Main.java.patch +++ b/paper-server/patches/sources/net/minecraft/server/Main.java.patch @@ -1,13 +1,5 @@ --- a/net/minecraft/server/Main.java +++ b/net/minecraft/server/Main.java -@@ -37,6 +_,7 @@ - import net.minecraft.server.dedicated.DedicatedServerProperties; - import net.minecraft.server.dedicated.DedicatedServerSettings; - import net.minecraft.server.level.progress.LoggerChunkProgressListener; -+import net.minecraft.server.packs.PackType; - import net.minecraft.server.packs.repository.PackRepository; - import net.minecraft.server.packs.repository.ServerPacksSource; - import net.minecraft.util.Mth; @@ -67,8 +_,9 @@ reason = "System.out needed before bootstrap" ) @@ -144,7 +136,7 @@ + com.google.common.io.Files.write("{\n" + + " \"pack\": {\n" + + " \"description\": \"Data pack for resources provided by Bukkit plugins\",\n" -+ + " \"pack_format\": " + SharedConstants.getCurrentVersion().getPackVersion(PackType.SERVER_DATA) + "\n" ++ + " \"pack_format\": " + SharedConstants.getCurrentVersion().getPackVersion(net.minecraft.server.packs.PackType.SERVER_DATA) + "\n" + + " }\n" + + "}\n", mcMeta, com.google.common.base.Charsets.UTF_8); + } catch (java.io.IOException ex) { diff --git a/paper-server/patches/sources/net/minecraft/server/commands/TeleportCommand.java.patch b/paper-server/patches/sources/net/minecraft/server/commands/TeleportCommand.java.patch index 4513244012..52f25acba1 100644 --- a/paper-server/patches/sources/net/minecraft/server/commands/TeleportCommand.java.patch +++ b/paper-server/patches/sources/net/minecraft/server/commands/TeleportCommand.java.patch @@ -1,13 +1,5 @@ --- a/net/minecraft/server/commands/TeleportCommand.java +++ b/net/minecraft/server/commands/TeleportCommand.java -@@ -20,6 +_,7 @@ - import net.minecraft.core.BlockPos; - import net.minecraft.network.chat.Component; - import net.minecraft.server.level.ServerLevel; -+import net.minecraft.server.level.ServerPlayer; - import net.minecraft.util.Mth; - import net.minecraft.world.entity.Entity; - import net.minecraft.world.entity.LivingEntity; @@ -290,7 +_,31 @@ float f1 = relatives.contains(Relative.X_ROT) ? xRot - target.getXRot() : xRot; float f2 = Mth.wrapDegrees(f); @@ -15,7 +7,7 @@ - if (target.teleportTo(level, d, d1, d2, relatives, f2, f3, true)) { + // CraftBukkit start - Teleport event + boolean result; -+ if (target instanceof ServerPlayer player) { ++ if (target instanceof final net.minecraft.server.level.ServerPlayer player) { + result = player.teleportTo(level, d, d1, d2, relatives, f2, f3, true, org.bukkit.event.player.PlayerTeleportEvent.TeleportCause.COMMAND); + } else { + org.bukkit.Location to = new org.bukkit.Location(level.getWorld(), d, d1, d2, f2, f3); diff --git a/paper-server/patches/sources/net/minecraft/server/level/ServerPlayer.java.patch b/paper-server/patches/sources/net/minecraft/server/level/ServerPlayer.java.patch index afffdcd318..f74c99f4ac 100644 --- a/paper-server/patches/sources/net/minecraft/server/level/ServerPlayer.java.patch +++ b/paper-server/patches/sources/net/minecraft/server/level/ServerPlayer.java.patch @@ -1,33 +1,5 @@ --- a/net/minecraft/server/level/ServerPlayer.java +++ b/net/minecraft/server/level/ServerPlayer.java -@@ -135,10 +_,12 @@ - import net.minecraft.world.entity.projectile.ThrownEnderpearl; - import net.minecraft.world.entity.vehicle.AbstractBoat; - import net.minecraft.world.entity.vehicle.AbstractMinecart; -+import net.minecraft.world.food.FoodData; - import net.minecraft.world.inventory.AbstractContainerMenu; - import net.minecraft.world.inventory.ContainerListener; - import net.minecraft.world.inventory.ContainerSynchronizer; - import net.minecraft.world.inventory.HorseInventoryMenu; -+import net.minecraft.world.inventory.InventoryMenu; - import net.minecraft.world.inventory.ResultSlot; - import net.minecraft.world.inventory.Slot; - import net.minecraft.world.item.Item; -@@ -158,12 +_,14 @@ - import net.minecraft.world.level.biome.BiomeManager; - import net.minecraft.world.level.block.BedBlock; - import net.minecraft.world.level.block.Block; -+import net.minecraft.world.level.block.ChestBlock; - import net.minecraft.world.level.block.HorizontalDirectionalBlock; - import net.minecraft.world.level.block.RespawnAnchorBlock; - import net.minecraft.world.level.block.entity.BlockEntity; - import net.minecraft.world.level.block.entity.CommandBlockEntity; - import net.minecraft.world.level.block.entity.SignBlockEntity; - import net.minecraft.world.level.block.state.BlockState; -+import net.minecraft.world.level.dimension.LevelStem; - import net.minecraft.world.level.gameevent.GameEvent; - import net.minecraft.world.level.portal.TeleportTransition; - import net.minecraft.world.level.saveddata.maps.MapId; @@ -223,7 +_,8 @@ private int levitationStartTime; private boolean disconnected; @@ -152,7 +124,7 @@ + this.containerMenu.findSlot(this.getInventory(), this.getInventory().selected).ifPresent(s -> { + this.containerSynchronizer.sendSlotChange(this.containerMenu, s, this.getMainHandItem()); + }); -+ this.containerSynchronizer.sendSlotChange(this.inventoryMenu, InventoryMenu.SHIELD_SLOT, this.getOffhandItem()); ++ this.containerSynchronizer.sendSlotChange(this.inventoryMenu, net.minecraft.world.inventory.InventoryMenu.SHIELD_SLOT, this.getOffhandItem()); + } + + // Yes, this doesn't match Vanilla, but it's the best we can do for now. @@ -699,7 +671,7 @@ ServerLevel serverLevel = this.serverLevel(); - ResourceKey resourceKey = serverLevel.dimension(); + // CraftBukkit start -+ ResourceKey resourceKey = serverLevel.getTypeKey(); ++ ResourceKey resourceKey = serverLevel.getTypeKey(); + + org.bukkit.Location enter = this.getBukkitEntity().getLocation(); + PositionMoveRotation absolutePosition = PositionMoveRotation.calculateAbsolute(PositionMoveRotation.of(this), PositionMoveRotation.of(teleportTransition), teleportTransition.relatives()); @@ -758,7 +730,7 @@ ProfilerFiller profilerFiller = Profiler.get(); profilerFiller.push("moving"); - if (resourceKey == Level.OVERWORLD && level.dimension() == Level.NETHER) { -+ if (level != null && resourceKey == LevelStem.OVERWORLD && level.getTypeKey() == LevelStem.NETHER) { // CraftBukkit - empty to fall through to null to event ++ if (level != null && resourceKey == net.minecraft.world.level.dimension.LevelStem.OVERWORLD && level.getTypeKey() == net.minecraft.world.level.dimension.LevelStem.NETHER) { // CraftBukkit - empty to fall through to null to event this.enteredNetherPosition = this.position(); } @@ -998,9 +970,9 @@ + // SPIGOT-5263 - close chest if cancelled + if (menu instanceof Container) { + ((Container) menu).stopOpen(this); -+ } else if (menu instanceof ChestBlock.DoubleInventory) { ++ } else if (menu instanceof net.minecraft.world.level.block.ChestBlock.DoubleInventory doubleInventory) { + // SPIGOT-5355 - double chests too :( -+ ((ChestBlock.DoubleInventory) menu).inventorylargechest.stopOpen(this); ++ doubleInventory.inventorylargechest.stopOpen(this); + // Paper start - Fix InventoryOpenEvent cancellation + } else if (!this.enderChestInventory.isActiveChest(null)) { + this.enderChestInventory.stopOpen(this); @@ -1653,7 +1625,7 @@ + this.setAirSupply(this.getMaxAirSupply()); // Paper - Reset players airTicks on respawn + this.setRemainingFireTicks(0); + this.fallDistance = 0; -+ this.foodData = new FoodData(); ++ this.foodData = new net.minecraft.world.food.FoodData(); + this.experienceLevel = this.newLevel; + this.totalExperience = this.newTotalExp; + this.experienceProgress = 0; diff --git a/paper-server/patches/sources/net/minecraft/server/level/ServerPlayerGameMode.java.patch b/paper-server/patches/sources/net/minecraft/server/level/ServerPlayerGameMode.java.patch index eac24793a9..a889ac8c79 100644 --- a/paper-server/patches/sources/net/minecraft/server/level/ServerPlayerGameMode.java.patch +++ b/paper-server/patches/sources/net/minecraft/server/level/ServerPlayerGameMode.java.patch @@ -1,13 +1,5 @@ --- a/net/minecraft/server/level/ServerPlayerGameMode.java +++ b/net/minecraft/server/level/ServerPlayerGameMode.java -@@ -13,6 +_,7 @@ - import net.minecraft.world.InteractionResult; - import net.minecraft.world.MenuProvider; - import net.minecraft.world.entity.EquipmentSlot; -+import net.minecraft.world.item.DoubleHighBlockItem; - import net.minecraft.world.item.ItemStack; - import net.minecraft.world.item.context.UseOnContext; - import net.minecraft.world.item.enchantment.EnchantmentHelper; @@ -41,6 +_,8 @@ private BlockPos delayedDestroyPos = BlockPos.ZERO; private int delayedTickStart; @@ -392,7 +384,7 @@ + // Paper end - Don't resync blocks + } else if (blockState.getBlock() instanceof net.minecraft.world.level.block.CakeBlock) { + player.getBukkitEntity().sendHealthUpdate(); // SPIGOT-1341 - reset health for cake -+ } else if (this.interactItemStack.getItem() instanceof DoubleHighBlockItem) { ++ } else if (this.interactItemStack.getItem() instanceof net.minecraft.world.item.DoubleHighBlockItem) { + // send a correcting update to the client, as it already placed the upper half of the bisected item + //player.connection.send(new ClientboundBlockUpdatePacket(world, blockposition.relative(hitResult.getDirection()).above())); // Paper - Don't resync blocks + diff --git a/paper-server/patches/sources/net/minecraft/server/network/ServerCommonPacketListenerImpl.java.patch b/paper-server/patches/sources/net/minecraft/server/network/ServerCommonPacketListenerImpl.java.patch index 43bacc9139..81c6160738 100644 --- a/paper-server/patches/sources/net/minecraft/server/network/ServerCommonPacketListenerImpl.java.patch +++ b/paper-server/patches/sources/net/minecraft/server/network/ServerCommonPacketListenerImpl.java.patch @@ -1,26 +1,11 @@ --- a/net/minecraft/server/network/ServerCommonPacketListenerImpl.java +++ b/net/minecraft/server/network/ServerCommonPacketListenerImpl.java -@@ -27,30 +_,82 @@ +@@ -27,30 +_,67 @@ import net.minecraft.util.profiling.Profiler; import org.slf4j.Logger; -public abstract class ServerCommonPacketListenerImpl implements ServerCommonPacketListener { -+// CraftBukkit start -+import io.netty.buffer.ByteBuf; -+import java.util.concurrent.ExecutionException; -+import net.minecraft.network.ConnectionProtocol; -+import net.minecraft.network.protocol.common.custom.DiscardedPayload; -+import net.minecraft.network.protocol.game.ClientboundSetDefaultSpawnPositionPacket; -+import net.minecraft.resources.ResourceLocation; -+import net.minecraft.server.level.ServerPlayer; -+import org.bukkit.craftbukkit.entity.CraftPlayer; -+import org.bukkit.craftbukkit.util.CraftLocation; -+import org.bukkit.craftbukkit.util.Waitable; -+import org.bukkit.event.player.PlayerKickEvent; -+import org.bukkit.event.player.PlayerResourcePackStatusEvent; -+ -+public abstract class ServerCommonPacketListenerImpl implements ServerCommonPacketListener, CraftPlayer.TransferCookieConnection { -+ // CraftBukkit end ++public abstract class ServerCommonPacketListenerImpl implements ServerCommonPacketListener, org.bukkit.craftbukkit.entity.CraftPlayer.TransferCookieConnection { // CraftBukkit private static final Logger LOGGER = LogUtils.getLogger(); public static final int LATENCY_CHECK_INTERVAL = 15000; private static final int CLOSED_LISTENER_TIMEOUT = 15000; @@ -39,16 +24,16 @@ private int latency; private volatile boolean suspendFlushingOnServerThread = false; + // CraftBukkit start -+ protected final ServerPlayer player; ++ protected final net.minecraft.server.level.ServerPlayer player; + protected final org.bukkit.craftbukkit.CraftServer cserver; + public boolean processedDisconnect; + // CraftBukkit end + public final java.util.Map packCallbacks = new java.util.concurrent.ConcurrentHashMap<>(); // Paper - adventure resource pack callbacks + private static final long KEEPALIVE_LIMIT = Long.getLong("paper.playerconnection.keepalive", 30) * 1000; // Paper - provide property to set keepalive limit -+ protected static final ResourceLocation MINECRAFT_BRAND = ResourceLocation.withDefaultNamespace("brand"); // Paper - Brand support ++ protected static final net.minecraft.resources.ResourceLocation MINECRAFT_BRAND = net.minecraft.resources.ResourceLocation.withDefaultNamespace("brand"); // Paper - Brand support - public ServerCommonPacketListenerImpl(MinecraftServer server, Connection connection, CommonListenerCookie cookie) { -+ public ServerCommonPacketListenerImpl(MinecraftServer server, Connection connection, CommonListenerCookie cookie, ServerPlayer player) { // CraftBukkit ++ public ServerCommonPacketListenerImpl(MinecraftServer server, Connection connection, CommonListenerCookie cookie, net.minecraft.server.level.ServerPlayer player) { // CraftBukkit this.server = server; this.connection = connection; this.keepAliveTime = Util.getMillis(); @@ -61,7 +46,7 @@ + this.cserver = server.server; + } + -+ public CraftPlayer getCraftPlayer() { ++ public org.bukkit.craftbukkit.entity.CraftPlayer getCraftPlayer() { + return this.player == null ? null : this.player.getBukkitEntity(); + } + @@ -71,7 +56,7 @@ + } + + @Override -+ public ConnectionProtocol getProtocol() { ++ public net.minecraft.network.ConnectionProtocol getProtocol() { + return this.protocol(); + } + @@ -106,7 +91,7 @@ this.keepAlivePending = false; } else if (!this.isSingleplayerOwner()) { - this.disconnect(TIMEOUT_DISCONNECTION_MESSAGE); -+ this.disconnectAsync(TIMEOUT_DISCONNECTION_MESSAGE, PlayerKickEvent.Cause.TIMEOUT); // Paper - add proper async disconnect ++ this.disconnectAsync(TIMEOUT_DISCONNECTION_MESSAGE, org.bukkit.event.player.PlayerKickEvent.Cause.TIMEOUT); // Paper - add proper async disconnect } } @@ -114,8 +99,8 @@ public void handlePong(ServerboundPongPacket packet) { } -+ private static final ResourceLocation CUSTOM_REGISTER = ResourceLocation.withDefaultNamespace("register"); // CraftBukkit -+ private static final ResourceLocation CUSTOM_UNREGISTER = ResourceLocation.withDefaultNamespace("unregister"); // CraftBukkit ++ private static final net.minecraft.resources.ResourceLocation CUSTOM_REGISTER = net.minecraft.resources.ResourceLocation.withDefaultNamespace("register"); // CraftBukkit ++ private static final net.minecraft.resources.ResourceLocation CUSTOM_UNREGISTER = net.minecraft.resources.ResourceLocation.withDefaultNamespace("unregister"); // CraftBukkit + @Override public void handleCustomPayload(ServerboundCustomPayloadPacket packet) { @@ -126,12 +111,12 @@ + this.player.clientBrandName = brand; + } + // Paper end - Brand support -+ if (!(packet.payload() instanceof DiscardedPayload)) { ++ if (!(packet.payload() instanceof net.minecraft.network.protocol.common.custom.DiscardedPayload)) { + return; + } + PacketUtils.ensureRunningOnSameThread(packet, this, this.player.serverLevel()); -+ ResourceLocation identifier = packet.payload().type().id(); -+ ByteBuf payload = ((DiscardedPayload)packet.payload()).data(); ++ net.minecraft.resources.ResourceLocation identifier = packet.payload().type().id(); ++ io.netty.buffer.ByteBuf payload = ((net.minecraft.network.protocol.common.custom.DiscardedPayload)packet.payload()).data(); + + if (identifier.equals(ServerCommonPacketListenerImpl.CUSTOM_REGISTER)) { + try { @@ -141,7 +126,7 @@ + } + } catch (Exception ex) { + ServerGamePacketListenerImpl.LOGGER.error("Couldn't register custom payload", ex); -+ this.disconnect(Component.literal("Invalid payload REGISTER!"), PlayerKickEvent.Cause.INVALID_PAYLOAD); // Paper - kick event cause ++ this.disconnect(Component.literal("Invalid payload REGISTER!"), org.bukkit.event.player.PlayerKickEvent.Cause.INVALID_PAYLOAD); // Paper - kick event cause + } + } else if (identifier.equals(ServerCommonPacketListenerImpl.CUSTOM_UNREGISTER)) { + try { @@ -151,7 +136,7 @@ + } + } catch (Exception ex) { + ServerGamePacketListenerImpl.LOGGER.error("Couldn't unregister custom payload", ex); -+ this.disconnect(Component.literal("Invalid payload UNREGISTER!"), PlayerKickEvent.Cause.INVALID_PAYLOAD); // Paper - kick event cause ++ this.disconnect(Component.literal("Invalid payload UNREGISTER!"), org.bukkit.event.player.PlayerKickEvent.Cause.INVALID_PAYLOAD); // Paper - kick event cause + } + } else { + try { @@ -169,7 +154,7 @@ + this.cserver.getMessenger().dispatchIncomingMessage(this.player.getBukkitEntity(), identifier.toString(), data); + } catch (Exception ex) { + ServerGamePacketListenerImpl.LOGGER.error("Couldn't dispatch custom payload", ex); -+ this.disconnect(Component.literal("Invalid custom payload!"), PlayerKickEvent.Cause.INVALID_PAYLOAD); // Paper - kick event cause ++ this.disconnect(Component.literal("Invalid custom payload!"), org.bukkit.event.player.PlayerKickEvent.Cause.INVALID_PAYLOAD); // Paper - kick event cause + } + } + } @@ -186,7 +171,7 @@ LOGGER.info("Disconnecting {} due to resource pack {} rejection", this.playerProfile().getName(), packet.id()); - this.disconnect(Component.translatable("multiplayer.requiredTexturePrompt.disconnect")); - } -+ this.disconnect(Component.translatable("multiplayer.requiredTexturePrompt.disconnect"), PlayerKickEvent.Cause.RESOURCE_PACK_REJECTION); // Paper - kick event cause ++ this.disconnect(Component.translatable("multiplayer.requiredTexturePrompt.disconnect"), org.bukkit.event.player.PlayerKickEvent.Cause.RESOURCE_PACK_REJECTION); // Paper - kick event cause + } + // Paper start - adventure pack callbacks + // call the callbacks before the previously-existing event so the event has final say @@ -201,9 +186,9 @@ + } + // Paper end + // Paper start - store last pack status -+ PlayerResourcePackStatusEvent.Status packStatus = PlayerResourcePackStatusEvent.Status.values()[packet.action().ordinal()]; ++ org.bukkit.event.player.PlayerResourcePackStatusEvent.Status packStatus = org.bukkit.event.player.PlayerResourcePackStatusEvent.Status.values()[packet.action().ordinal()]; + this.player.getBukkitEntity().resourcePackStatus = packStatus; -+ this.cserver.getPluginManager().callEvent(new PlayerResourcePackStatusEvent(this.getCraftPlayer(), packet.id(), packStatus)); // CraftBukkit ++ this.cserver.getPluginManager().callEvent(new org.bukkit.event.player.PlayerResourcePackStatusEvent(this.getCraftPlayer(), packet.id(), packStatus)); // CraftBukkit + // Paper end - store last pack status } @@ -216,7 +201,7 @@ + return; + } + // CraftBukkit end -+ this.disconnect(DISCONNECT_UNEXPECTED_QUERY, PlayerKickEvent.Cause.INVALID_COOKIE); // Paper - kick event cause ++ this.disconnect(DISCONNECT_UNEXPECTED_QUERY, org.bukkit.event.player.PlayerKickEvent.Cause.INVALID_COOKIE); // Paper - kick event cause } protected void keepConnectionAlive() { @@ -232,7 +217,7 @@ + long elapsedTime = currentTime - this.keepAliveTime; + if (!this.isSingleplayerOwner() && elapsedTime >= 15000L) { // Paper - use vanilla's 15000L between keep alive packets + if (this.keepAlivePending && !this.processedDisconnect && elapsedTime >= KEEPALIVE_LIMIT) { // Paper - check keepalive limit, don't fire if already disconnected -+ this.disconnect(TIMEOUT_DISCONNECTION_MESSAGE, PlayerKickEvent.Cause.TIMEOUT); // Paper - kick event cause ++ this.disconnect(TIMEOUT_DISCONNECTION_MESSAGE, org.bukkit.event.player.PlayerKickEvent.Cause.TIMEOUT); // Paper - kick event cause + } else if (this.checkIfClosed(currentTime)) { // Paper this.keepAlivePending = true; - this.keepAliveTime = millis; @@ -251,7 +236,7 @@ if (this.closed) { if (time - this.closedListenerTime >= 15000L) { - this.disconnect(TIMEOUT_DISCONNECTION_MESSAGE); -+ this.disconnect(TIMEOUT_DISCONNECTION_MESSAGE, PlayerKickEvent.Cause.TIMEOUT); // Paper - kick event cause ++ this.disconnect(TIMEOUT_DISCONNECTION_MESSAGE, org.bukkit.event.player.PlayerKickEvent.Cause.TIMEOUT); // Paper - kick event cause } return false; @@ -262,8 +247,8 @@ + // CraftBukkit start + if (packet == null || this.processedDisconnect) { // Spigot + return; -+ } else if (packet instanceof ClientboundSetDefaultSpawnPositionPacket defaultSpawnPositionPacket) { -+ this.player.compassTarget = CraftLocation.toBukkit(defaultSpawnPositionPacket.getPos(), this.getCraftPlayer().getWorld()); ++ } else if (packet instanceof net.minecraft.network.protocol.game.ClientboundSetDefaultSpawnPositionPacket defaultSpawnPositionPacket) { ++ this.player.compassTarget = org.bukkit.craftbukkit.util.CraftLocation.toBukkit(defaultSpawnPositionPacket.getPos(), this.getCraftPlayer().getWorld()); + } + // CraftBukkit end if (packet.isTerminal()) { @@ -275,10 +260,10 @@ + // Paper start - adventure + public void disconnect(final net.kyori.adventure.text.Component reason) { -+ this.disconnect(reason, PlayerKickEvent.Cause.UNKNOWN); ++ this.disconnect(reason, org.bukkit.event.player.PlayerKickEvent.Cause.UNKNOWN); + } + -+ public void disconnect(final net.kyori.adventure.text.Component reason, PlayerKickEvent.Cause cause) { ++ public void disconnect(final net.kyori.adventure.text.Component reason, org.bukkit.event.player.PlayerKickEvent.Cause cause) { + this.disconnect(io.papermc.paper.adventure.PaperAdventure.asVanilla(reason), cause); + } + // Paper end - adventure @@ -290,21 +275,21 @@ - - public void disconnect(DisconnectionDetails disconnectionDetails) { + // Paper start - kick event causes -+ this.disconnect(reason, PlayerKickEvent.Cause.UNKNOWN); ++ this.disconnect(reason, org.bukkit.event.player.PlayerKickEvent.Cause.UNKNOWN); + } + -+ public void disconnect(final Component reason, PlayerKickEvent.Cause cause) { ++ public void disconnect(final Component reason, org.bukkit.event.player.PlayerKickEvent.Cause cause) { + this.disconnect(new DisconnectionDetails(reason), cause); + // Paper end - kick event causes + } + -+ public void disconnect(DisconnectionDetails disconnectionDetails, PlayerKickEvent.Cause cause) { // Paper - kick event cause ++ public void disconnect(DisconnectionDetails disconnectionDetails, org.bukkit.event.player.PlayerKickEvent.Cause cause) { // Paper - kick event cause + // CraftBukkit start - fire PlayerKickEvent + if (this.processedDisconnect) { + return; + } + if (!this.cserver.isPrimaryThread()) { -+ Waitable waitable = new Waitable() { ++ org.bukkit.craftbukkit.util.Waitable waitable = new org.bukkit.craftbukkit.util.Waitable() { + @Override + protected Object evaluate() { + ServerCommonPacketListenerImpl.this.disconnect(disconnectionDetails, cause); // Paper - kick event causes @@ -318,7 +303,7 @@ + waitable.get(); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); -+ } catch (ExecutionException e) { ++ } catch (java.util.concurrent.ExecutionException e) { + throw new RuntimeException(e); + } + return; @@ -326,7 +311,7 @@ + + net.kyori.adventure.text.Component leaveMessage = net.kyori.adventure.text.Component.translatable("multiplayer.player.left", net.kyori.adventure.text.format.NamedTextColor.YELLOW, io.papermc.paper.configuration.GlobalConfiguration.get().messages.useDisplayNameInQuitMessage ? this.player.getBukkitEntity().displayName() : net.kyori.adventure.text.Component.text(this.player.getScoreboardName())); // Paper - Adventure + -+ PlayerKickEvent event = new PlayerKickEvent(this.player.getBukkitEntity(), io.papermc.paper.adventure.PaperAdventure.asAdventure(disconnectionDetails.reason()), leaveMessage, cause); // Paper - adventure & kick event causes ++ org.bukkit.event.player.PlayerKickEvent event = new org.bukkit.event.player.PlayerKickEvent(this.player.getBukkitEntity(), io.papermc.paper.adventure.PaperAdventure.asAdventure(disconnectionDetails.reason()), leaveMessage, cause); // Paper - adventure & kick event causes + + if (this.cserver.getServer().isRunning()) { + this.cserver.getPluginManager().callEvent(event); @@ -358,15 +343,15 @@ + } + + // Paper start - add proper async disconnect -+ public void disconnectAsync(net.kyori.adventure.text.Component reason, PlayerKickEvent.Cause cause) { ++ public void disconnectAsync(net.kyori.adventure.text.Component reason, org.bukkit.event.player.PlayerKickEvent.Cause cause) { + this.disconnectAsync(io.papermc.paper.adventure.PaperAdventure.asVanilla(reason), cause); + } + -+ public void disconnectAsync(Component reason, PlayerKickEvent.Cause cause) { ++ public void disconnectAsync(Component reason, org.bukkit.event.player.PlayerKickEvent.Cause cause) { + this.disconnectAsync(new DisconnectionDetails(reason), cause); + } + -+ public void disconnectAsync(DisconnectionDetails disconnectionInfo, PlayerKickEvent.Cause cause) { ++ public void disconnectAsync(DisconnectionDetails disconnectionInfo, org.bukkit.event.player.PlayerKickEvent.Cause cause) { + if (this.cserver.isPrimaryThread()) { + this.disconnect(disconnectionInfo, cause); + return; diff --git a/paper-server/src/main/java/org/spigotmc/ActivationRange.java b/paper-server/src/main/java/org/spigotmc/ActivationRange.java index 607e2edb5c..d2d43209ac 100644 --- a/paper-server/src/main/java/org/spigotmc/ActivationRange.java +++ b/paper-server/src/main/java/org/spigotmc/ActivationRange.java @@ -29,11 +29,12 @@ import net.minecraft.world.entity.raid.Raider; import net.minecraft.world.level.Level; import net.minecraft.world.phys.AABB; -public class ActivationRange -{ +public final class ActivationRange { - public enum ActivationType - { + private ActivationRange() { + } + + public enum ActivationType { WATER, // Paper FLYING_MONSTER, // Paper VILLAGER, // Paper @@ -42,10 +43,10 @@ public class ActivationRange RAIDER, MISC; - AABB boundingBox = new AABB( 0, 0, 0, 0, 0, 0 ); + AABB boundingBox = new AABB(0, 0, 0, 0, 0, 0); } - static AABB maxBB = new AABB( 0, 0, 0, 0, 0, 0 ); + static AABB maxBB = new AABB(0, 0, 0, 0, 0, 0); /** * Initializes an entities type on construction to specify what group this @@ -54,19 +55,14 @@ public class ActivationRange * @param entity * @return group id */ - public static ActivationType initializeEntityActivationType(Entity entity) - { - if ( entity instanceof Raider ) - { + public static ActivationType initializeEntityActivationType(final Entity entity) { + if (entity instanceof Raider) { return ActivationType.RAIDER; - } else if ( entity instanceof Monster || entity instanceof Slime ) - { + } else if (entity instanceof Monster || entity instanceof Slime) { return ActivationType.MONSTER; - } else if ( entity instanceof PathfinderMob || entity instanceof AmbientCreature ) - { + } else if (entity instanceof PathfinderMob || entity instanceof AmbientCreature) { return ActivationType.ANIMAL; - } else - { + } else { return ActivationType.MISC; } } @@ -78,31 +74,25 @@ public class ActivationRange * @param config * @return boolean If it should always tick. */ - public static boolean initializeEntityActivationState(Entity entity, SpigotWorldConfig config) - { - if ( ( entity.activationType == ActivationType.MISC && config.miscActivationRange == 0 ) - || ( entity.activationType == ActivationType.RAIDER && config.raiderActivationRange == 0 ) - || ( entity.activationType == ActivationType.ANIMAL && config.animalActivationRange == 0 ) - || ( entity.activationType == ActivationType.MONSTER && config.monsterActivationRange == 0 ) - || entity instanceof Player - || entity instanceof ThrowableProjectile - || entity instanceof EnderDragon - || entity instanceof EnderDragonPart - || entity instanceof WitherBoss - || entity instanceof AbstractHurtingProjectile - || entity instanceof LightningBolt - || entity instanceof PrimedTnt - || entity instanceof net.minecraft.world.entity.item.FallingBlockEntity // Paper - Always tick falling blocks - || entity instanceof net.minecraft.world.entity.vehicle.AbstractMinecart // Paper - || entity instanceof net.minecraft.world.entity.vehicle.AbstractBoat // Paper - || entity instanceof EndCrystal - || entity instanceof FireworkRocketEntity - || entity instanceof ThrownTrident ) - { - return true; - } - - return false; + public static boolean initializeEntityActivationState(final Entity entity, final SpigotWorldConfig config) { + return (entity.activationType == ActivationType.MISC && config.miscActivationRange == 0) + || (entity.activationType == ActivationType.RAIDER && config.raiderActivationRange == 0) + || (entity.activationType == ActivationType.ANIMAL && config.animalActivationRange == 0) + || (entity.activationType == ActivationType.MONSTER && config.monsterActivationRange == 0) + || entity instanceof Player + || entity instanceof ThrowableProjectile + || entity instanceof EnderDragon + || entity instanceof EnderDragonPart + || entity instanceof WitherBoss + || entity instanceof AbstractHurtingProjectile + || entity instanceof LightningBolt + || entity instanceof PrimedTnt + || entity instanceof net.minecraft.world.entity.item.FallingBlockEntity // Paper - Always tick falling blocks + || entity instanceof net.minecraft.world.entity.vehicle.AbstractMinecart // Paper + || entity instanceof net.minecraft.world.entity.vehicle.AbstractBoat // Paper + || entity instanceof EndCrystal + || entity instanceof FireworkRocketEntity + || entity instanceof ThrownTrident; } /** @@ -111,31 +101,28 @@ public class ActivationRange * * @param world */ - public static void activateEntities(Level world) - { + public static void activateEntities(final Level world) { final int miscActivationRange = world.spigotConfig.miscActivationRange; final int raiderActivationRange = world.spigotConfig.raiderActivationRange; final int animalActivationRange = world.spigotConfig.animalActivationRange; final int monsterActivationRange = world.spigotConfig.monsterActivationRange; - int maxRange = Math.max( monsterActivationRange, animalActivationRange ); - maxRange = Math.max( maxRange, raiderActivationRange ); - maxRange = Math.max( maxRange, miscActivationRange ); - maxRange = Math.min( ( world.spigotConfig.simulationDistance << 4 ) - 8, maxRange ); + int maxRange = Math.max(monsterActivationRange, animalActivationRange); + maxRange = Math.max(maxRange, raiderActivationRange); + maxRange = Math.max(maxRange, miscActivationRange); + maxRange = Math.min((world.spigotConfig.simulationDistance << 4) - 8, maxRange); - for ( Player player : world.players() ) - { + for (final Player player : world.players()) { player.activatedTick = MinecraftServer.currentTick; - if ( world.spigotConfig.ignoreSpectatorActivation && player.isSpectator() ) - { + if (world.spigotConfig.ignoreSpectatorActivation && player.isSpectator()) { continue; } - ActivationRange.maxBB = player.getBoundingBox().inflate( maxRange, 256, maxRange ); - ActivationType.MISC.boundingBox = player.getBoundingBox().inflate( miscActivationRange, 256, miscActivationRange ); - ActivationType.RAIDER.boundingBox = player.getBoundingBox().inflate( raiderActivationRange, 256, raiderActivationRange ); - ActivationType.ANIMAL.boundingBox = player.getBoundingBox().inflate( animalActivationRange, 256, animalActivationRange ); - ActivationType.MONSTER.boundingBox = player.getBoundingBox().inflate( monsterActivationRange, 256, monsterActivationRange ); + ActivationRange.maxBB = player.getBoundingBox().inflate(maxRange, 256, maxRange); + ActivationType.MISC.boundingBox = player.getBoundingBox().inflate(miscActivationRange, 256, miscActivationRange); + ActivationType.RAIDER.boundingBox = player.getBoundingBox().inflate(raiderActivationRange, 256, raiderActivationRange); + ActivationType.ANIMAL.boundingBox = player.getBoundingBox().inflate(animalActivationRange, 256, animalActivationRange); + ActivationType.MONSTER.boundingBox = player.getBoundingBox().inflate(monsterActivationRange, 256, monsterActivationRange); world.getEntities().get(ActivationRange.maxBB, ActivationRange::activateEntity); } @@ -146,17 +133,13 @@ public class ActivationRange * * @param entity */ - private static void activateEntity(Entity entity) - { - if ( MinecraftServer.currentTick > entity.activatedTick ) - { - if ( entity.defaultActivationState ) - { + private static void activateEntity(final Entity entity) { + if (MinecraftServer.currentTick > entity.activatedTick) { + if (entity.defaultActivationState) { entity.activatedTick = MinecraftServer.currentTick; return; } - if ( entity.activationType.boundingBox.intersects( entity.getBoundingBox() ) ) - { + if (entity.activationType.boundingBox.intersects(entity.getBoundingBox())) { entity.activatedTick = MinecraftServer.currentTick; } } @@ -169,60 +152,43 @@ public class ActivationRange * @param entity * @return */ - public static boolean checkEntityImmunities(Entity entity) - { + public static boolean checkEntityImmunities(final Entity entity) { // quick checks. - if ( entity.isInWater() || entity.getRemainingFireTicks() > 0 ) - { + if (entity.isInWater() || entity.getRemainingFireTicks() > 0) { return true; } - if ( !( entity instanceof AbstractArrow ) ) - { - if ( !entity.onGround() || !entity.getPassengers().isEmpty() || entity.isPassenger() ) - { + if (!(entity instanceof final AbstractArrow abstractArrow)) { + if (!entity.onGround() || !entity.getPassengers().isEmpty() || entity.isPassenger()) { return true; } - } else if ( !( (AbstractArrow) entity ).isInGround() ) - { + } else if (!abstractArrow.isInGround()) { return true; } // special cases. - if ( entity instanceof LivingEntity ) - { - LivingEntity living = (LivingEntity) entity; - if ( /*TODO: Missed mapping? living.attackTicks > 0 || */ living.hurtTime > 0 || living.activeEffects.size() > 0 ) - { + if (entity instanceof final LivingEntity living) { + if ( /*TODO: Missed mapping? living.attackTicks > 0 || */ living.hurtTime > 0 || !living.activeEffects.isEmpty()) { return true; } - if ( entity instanceof PathfinderMob && ( (PathfinderMob) entity ).getTarget() != null ) - { + if (entity instanceof final PathfinderMob pathfinderMob && pathfinderMob.getTarget() != null) { return true; } - if ( entity instanceof Villager && ( (Villager) entity ).canBreed() ) - { + if (entity instanceof final Villager villager && villager.canBreed()) { return true; } - if ( entity instanceof Animal ) - { - Animal animal = (Animal) entity; - if ( animal.isBaby() || animal.isInLove() ) - { + if (entity instanceof final Animal animal) { + if (animal.isBaby() || animal.isInLove()) { return true; } - if ( entity instanceof Sheep && ( (Sheep) entity ).isSheared() ) - { + if (entity instanceof final Sheep sheep && sheep.isSheared()) { return true; } } - if (entity instanceof Creeper && ((Creeper) entity).isIgnited()) { // isExplosive + if (entity instanceof final Creeper creeper && creeper.isIgnited()) { // isExplosive return true; } } // SPIGOT-6644: Otherwise the target refresh tick will be missed - if (entity instanceof ExperienceOrb) { - return true; - } - return false; + return entity instanceof ExperienceOrb; } /** @@ -231,8 +197,7 @@ public class ActivationRange * @param entity * @return */ - public static boolean checkIfActive(Entity entity) - { + public static boolean checkIfActive(final Entity entity) { // Never safe to skip fireworks or item gravity if (entity instanceof FireworkRocketEntity || (entity instanceof ItemEntity && (entity.tickCount + entity.getId()) % 4 == 0)) { // Paper - Needed for item gravity, see ItemEntity tick return true; @@ -241,13 +206,10 @@ public class ActivationRange boolean isActive = entity.activatedTick >= MinecraftServer.currentTick || entity.defaultActivationState; // Should this entity tick? - if ( !isActive ) - { - if ( ( MinecraftServer.currentTick - entity.activatedTick - 1 ) % 20 == 0 ) - { + if (!isActive) { + if ((MinecraftServer.currentTick - entity.activatedTick - 1) % 20 == 0) { // Check immunities every 20 ticks. - if ( ActivationRange.checkEntityImmunities( entity ) ) - { + if (ActivationRange.checkEntityImmunities(entity)) { // Triggered some sort of immunity, give 20 full ticks before we check again. entity.activatedTick = MinecraftServer.currentTick + 20; } diff --git a/paper-server/src/main/java/org/spigotmc/TrackingRange.java b/paper-server/src/main/java/org/spigotmc/TrackingRange.java index bb06f89a29..039f8abeb5 100644 --- a/paper-server/src/main/java/org/spigotmc/TrackingRange.java +++ b/paper-server/src/main/java/org/spigotmc/TrackingRange.java @@ -8,8 +8,10 @@ import net.minecraft.world.entity.decoration.ItemFrame; import net.minecraft.world.entity.decoration.Painting; import net.minecraft.world.entity.item.ItemEntity; -public class TrackingRange -{ +public final class TrackingRange { + + private TrackingRange() { + } /** * Gets the range an entity should be 'tracked' by players and visible in @@ -19,17 +21,14 @@ public class TrackingRange * @param defaultRange Default range defined by Mojang * @return */ - public static int getEntityTrackingRange(Entity entity, int defaultRange) - { - if ( defaultRange == 0 ) - { + public static int getEntityTrackingRange(final Entity entity, final int defaultRange) { + if (defaultRange == 0) { return defaultRange; } - SpigotWorldConfig config = entity.level().spigotConfig; - if ( entity instanceof ServerPlayer ) - { + final SpigotWorldConfig config = entity.level().spigotConfig; + if (entity instanceof ServerPlayer) { return config.playerTrackingRange; - // Paper start - Simplify and set water mobs to animal tracking range + // Paper start - Simplify and set water mobs to animal tracking range } switch (entity.activationType) { case RAIDER: @@ -42,16 +41,15 @@ public class TrackingRange return config.animalTrackingRange; case MISC: } - if ( entity instanceof ItemFrame || entity instanceof Painting || entity instanceof ItemEntity || entity instanceof ExperienceOrb ) + if (entity instanceof ItemFrame || entity instanceof Painting || entity instanceof ItemEntity || entity instanceof ExperienceOrb) { // Paper end - { return config.miscTrackingRange; - } else if ( entity instanceof Display ) - { + } else if (entity instanceof Display) { return config.displayTrackingRange; - } else - { - if (entity instanceof net.minecraft.world.entity.boss.enderdragon.EnderDragon) return ((net.minecraft.server.level.ServerLevel)(entity.getCommandSenderWorld())).getChunkSource().chunkMap.serverViewDistance; // Paper - enderdragon is exempt + } else { + if (entity instanceof net.minecraft.world.entity.boss.enderdragon.EnderDragon) { + return ((net.minecraft.server.level.ServerLevel) (entity.getCommandSenderWorld())).getChunkSource().chunkMap.serverViewDistance; // Paper - enderdragon is exempt + } return config.otherTrackingRange; } }