remove more imports and cleanup

This commit is contained in:
Jake Potrebic 2024-12-15 12:51:34 -08:00
parent 6dcb4a33b6
commit acd43900f5
No known key found for this signature in database
GPG key ID: ECE0B3C133C016C5
12 changed files with 205 additions and 363 deletions

View file

@ -1,26 +1,10 @@
--- a/com/mojang/brigadier/tree/CommandNode.java --- a/com/mojang/brigadier/tree/CommandNode.java
+++ b/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<S> implements Comparable<CommandNode<S>> {
private final Map<String, CommandNode<S>> children = new LinkedHashMap<>();
@@ -32,6 +_,16 @@ @@ -32,6 +_,16 @@
private final RedirectModifier<S> modifier; private final RedirectModifier<S> modifier;
private final boolean forks; private final boolean forks;
private Command<S> command; private Command<S> command;
+ public CommandNode<CommandSourceStack> clientNode; // Paper - Brigadier API + public CommandNode<net.minecraft.commands.CommandSourceStack> clientNode; // Paper - Brigadier API
+ public CommandNode<io.papermc.paper.command.brigadier.CommandSourceStack> unwrappedCached = null; // Paper - Brigadier Command API + public CommandNode<io.papermc.paper.command.brigadier.CommandSourceStack> unwrappedCached = null; // Paper - Brigadier Command API
+ public CommandNode<io.papermc.paper.command.brigadier.CommandSourceStack> wrappedCached = null; // Paper - Brigadier Command API + public CommandNode<io.papermc.paper.command.brigadier.CommandSourceStack> wrappedCached = null; // Paper - Brigadier Command API
+ // CraftBukkit start + // CraftBukkit start
@ -40,12 +24,12 @@
- public boolean canUse(final S source) { - public boolean canUse(final S source) {
+ // CraftBukkit start + // CraftBukkit start
+ public synchronized boolean canUse(final S source) { + public synchronized boolean canUse(final S source) {
+ if (source instanceof CommandSourceStack) { + if (source instanceof final net.minecraft.commands.CommandSourceStack css) {
+ try { + 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); + return this.requirement.test(source);
+ } finally { + } 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 + // CraftBukkit end
@ -72,11 +56,11 @@
- final LiteralCommandNode<S> literal = literals.get(text); - final LiteralCommandNode<S> literal = literals.get(text);
+ // Paper start - prioritize mc commands in function parsing + // Paper start - prioritize mc commands in function parsing
+ LiteralCommandNode<S> literal = null; + LiteralCommandNode<S> 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(":")) { + if (!text.contains(":")) {
+ literal = this.literals.get("minecraft:" + text); + 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(":")) { + if (css.getServer().server.getCommandBlockOverride(text) && !text.contains(":")) {
+ literal = this.literals.get("minecraft:" + text); + literal = this.literals.get("minecraft:" + text);
+ } + }

View file

@ -5,23 +5,23 @@
public abstract class SimpleCriterionTrigger<T extends SimpleCriterionTrigger.SimpleInstance> implements CriterionTrigger<T> { public abstract class SimpleCriterionTrigger<T extends SimpleCriterionTrigger.SimpleInstance> implements CriterionTrigger<T> {
- private final Map<PlayerAdvancements, Set<CriterionTrigger.Listener<T>>> players = Maps.newIdentityHashMap(); - private final Map<PlayerAdvancements, Set<CriterionTrigger.Listener<T>>> players = Maps.newIdentityHashMap();
+ // private final Map<PlayerAdvancements, Set<CriterionTrigger.Listener<T>>> players = Maps.newIdentityHashMap(); // Paper - fix AdvancementDataPlayer leak; moved into AdvancementDataPlayer to fix memory leak + // private final Map<PlayerAdvancements, Set<CriterionTrigger.Listener<T>>> players = Maps.newIdentityHashMap(); // Paper - fix PlayerAdvancements leak; moved into PlayerAdvancements to fix memory leak
@Override @Override
public final void addPlayerListener(PlayerAdvancements playerAdvancements, CriterionTrigger.Listener<T> listener) { public final void addPlayerListener(PlayerAdvancements playerAdvancements, CriterionTrigger.Listener<T> listener) {
- this.players.computeIfAbsent(playerAdvancements, advancements -> Sets.newHashSet()).add(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 @Override
public final void removePlayerListener(PlayerAdvancements playerAdvancements, CriterionTrigger.Listener<T> listener) { public final void removePlayerListener(PlayerAdvancements playerAdvancements, CriterionTrigger.Listener<T> listener) {
- Set<CriterionTrigger.Listener<T>> set = this.players.get(playerAdvancements); - Set<CriterionTrigger.Listener<T>> set = this.players.get(playerAdvancements);
+ Set<CriterionTrigger.Listener<T>> set = (Set) playerAdvancements.criterionData.get(this); // Paper - fix AdvancementDataPlayer leak + Set<CriterionTrigger.Listener<T>> set = (Set) playerAdvancements.criterionData.get(this); // Paper - fix PlayerAdvancements leak
if (set != null) { if (set != null) {
set.remove(listener); set.remove(listener);
if (set.isEmpty()) { if (set.isEmpty()) {
- this.players.remove(playerAdvancements); - 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 @Override
public final void removePlayerListeners(PlayerAdvancements playerAdvancements) { public final void removePlayerListeners(PlayerAdvancements playerAdvancements) {
- this.players.remove(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<T> testTrigger) { protected void trigger(ServerPlayer player, Predicate<T> testTrigger) {
PlayerAdvancements advancements = player.getAdvancements(); PlayerAdvancements advancements = player.getAdvancements();
- Set<CriterionTrigger.Listener<T>> set = this.players.get(advancements); - Set<CriterionTrigger.Listener<T>> set = this.players.get(advancements);
+ Set<CriterionTrigger.Listener<T>> set = (Set) advancements.criterionData.get(this); // Paper - fix AdvancementDataPlayer leak + Set<CriterionTrigger.Listener<T>> set = (Set) advancements.criterionData.get(this); // Paper - fix PlayerAdvancements leak
if (set != null && !set.isEmpty()) { if (set != null && !set.isEmpty()) {
- LootContext lootContext = EntityPredicate.createContext(player, player); - LootContext lootContext = EntityPredicate.createContext(player, player);
+ LootContext lootContext = null; // EntityPredicate.createContext(player, player); // Paper - Perf: lazily create LootContext for criterions + LootContext lootContext = null; // EntityPredicate.createContext(player, player); // Paper - Perf: lazily create LootContext for criterions

View file

@ -1,20 +1,5 @@
--- a/net/minecraft/commands/Commands.java --- a/net/minecraft/commands/Commands.java
+++ b/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<ExecutionContext<CommandSourceStack>> CURRENT_EXECUTION_CONTEXT = new ThreadLocal<>();
private static final Logger LOGGER = LogUtils.getLogger();
@@ -251,6 +_,30 @@ @@ -251,6 +_,30 @@
PublishCommand.register(this.dispatcher); PublishCommand.register(this.dispatcher);
} }
@ -52,12 +37,12 @@
+ // CraftBukkit start + // CraftBukkit start
+ public void dispatchServerCommand(CommandSourceStack sender, String command) { + 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("/")) { + if (command.startsWith("/")) {
+ command = command.substring(1); + 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); + org.bukkit.Bukkit.getPluginManager().callEvent(event);
+ if (event.isCancelled()) { + if (event.isCancelled()) {
+ return; + return;
@ -135,7 +120,7 @@
+ // Paper start - Add UnknownCommandEvent + // Paper start - Add UnknownCommandEvent
+ final net.kyori.adventure.text.TextComponent.Builder builder = net.kyori.adventure.text.Component.text(); + final net.kyori.adventure.text.TextComponent.Builder builder = net.kyori.adventure.text.Component.text();
+ // source.sendFailure(ComponentUtils.fromMessage(var7.getRawMessage())); + // 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 + // Paper end - Add UnknownCommandEvent
if (var7.getInput() != null && var7.getCursor() >= 0) { if (var7.getInput() != null && var7.getCursor() >= 0) {
int min = Math.min(var7.getInput().length(), var7.getCursor()); int min = Math.min(var7.getInput().length(), var7.getCursor());
@ -180,7 +165,7 @@
+ // Register Vanilla commands into builtRoot as before + // Register Vanilla commands into builtRoot as before
+ // Paper start - Perf: Async command map building + // Paper start - Perf: Async command map building
+ // Copy root children to avoid concurrent modification during building + // Copy root children to avoid concurrent modification during building
+ final Collection<CommandNode<CommandSourceStack>> commandNodes = new java.util.ArrayList<>(this.dispatcher.getRoot().getChildren()); + final java.util.Collection<CommandNode<CommandSourceStack>> commandNodes = new java.util.ArrayList<>(this.dispatcher.getRoot().getChildren());
+ COMMAND_SENDING_POOL.execute(() -> this.sendAsync(player, commandNodes)); + COMMAND_SENDING_POOL.execute(() -> this.sendAsync(player, commandNodes));
+ } + }
+ +
@ -195,7 +180,7 @@
+ new java.util.concurrent.ThreadPoolExecutor.DiscardPolicy() + new java.util.concurrent.ThreadPoolExecutor.DiscardPolicy()
+ ); + );
+ +
+ private void sendAsync(ServerPlayer player, Collection<CommandNode<CommandSourceStack>> dispatcherRootChildren) { + private void sendAsync(ServerPlayer player, java.util.Collection<CommandNode<CommandSourceStack>> dispatcherRootChildren) {
+ // Paper end - Perf: Async command map building + // Paper end - Perf: Async command map building
+ Map<CommandNode<CommandSourceStack>, CommandNode<SharedSuggestionProvider>> map = Maps.newIdentityHashMap(); // Use identity to prevent aliasing issues + Map<CommandNode<CommandSourceStack>, CommandNode<SharedSuggestionProvider>> map = Maps.newIdentityHashMap(); // Use identity to prevent aliasing issues
+ // Paper - brigadier API removes the need to fill the map twice + // 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(this.dispatcher.getRoot(), rootCommandNode, player.createCommandSourceStack(), map);
+ this.fillUsableCommands(dispatcherRootChildren, rootCommandNode, player.createCommandSourceStack(), map); // Paper - Perf: Async command map building; pass copy of children + this.fillUsableCommands(dispatcherRootChildren, rootCommandNode, player.createCommandSourceStack(), map); // Paper - Perf: Async command map building; pass copy of children
+ +
+ Collection<String> bukkit = new LinkedHashSet<>(); + java.util.Collection<String> bukkit = new java.util.LinkedHashSet<>();
+ for (CommandNode node : rootCommandNode.getChildren()) { + for (CommandNode node : rootCommandNode.getChildren()) {
+ bukkit.add(node.getName()); + bukkit.add(node.getName());
+ } + }
@ -215,10 +200,10 @@
+ }); + });
+ } + }
+ +
+ private void runSync(ServerPlayer player, Collection<String> bukkit, RootCommandNode<SharedSuggestionProvider> rootCommandNode) { + private void runSync(ServerPlayer player, java.util.Collection<String> bukkit, RootCommandNode<SharedSuggestionProvider> rootCommandNode) {
+ // Paper end - Perf: Async command map building + // Paper end - Perf: Async command map building
+ new com.destroystokyo.paper.event.brigadier.AsyncPlayerSendCommandsEvent<CommandSourceStack>(player.getBukkitEntity(), (RootCommandNode) rootCommandNode, true).callEvent(); // Paper - Brigadier API + new com.destroystokyo.paper.event.brigadier.AsyncPlayerSendCommandsEvent<CommandSourceStack>(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); + event.getPlayer().getServer().getPluginManager().callEvent(event);
+ +
+ // Remove labels that were removed during the event + // Remove labels that were removed during the event
@ -234,7 +219,7 @@
private void fillUsableCommands( private void fillUsableCommands(
- CommandNode<CommandSourceStack> rootCommandSource, - CommandNode<CommandSourceStack> rootCommandSource,
+ Collection<CommandNode<CommandSourceStack>> children, // Paper - Perf: Async command map building; pass copy of children + java.util.Collection<CommandNode<CommandSourceStack>> children, // Paper - Perf: Async command map building; pass copy of children
CommandNode<SharedSuggestionProvider> rootSuggestion, CommandNode<SharedSuggestionProvider> rootSuggestion,
CommandSourceStack source, CommandSourceStack source,
Map<CommandNode<CommandSourceStack>, CommandNode<SharedSuggestionProvider>> commandNodeToSuggestionNode Map<CommandNode<CommandSourceStack>, CommandNode<SharedSuggestionProvider>> commandNodeToSuggestionNode

View file

@ -1,15 +1,5 @@
--- a/net/minecraft/core/dispenser/DispenseItemBehavior.java --- a/net/minecraft/core/dispenser/DispenseItemBehavior.java
+++ b/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 @@ @@ -82,16 +_,48 @@
Direction direction = blockSource.state().getValue(DispenserBlock.FACING); Direction direction = blockSource.state().getValue(DispenserBlock.FACING);
EntityType<?> type = ((SpawnEggItem)item.getItem()).getType(blockSource.level().registryAccess(), item); EntityType<?> type = ((SpawnEggItem)item.getItem()).getType(blockSource.level().registryAccess(), item);
@ -195,7 +185,7 @@
+ /* Taken from SolidBucketItem#emptyContents */ + /* Taken from SolidBucketItem#emptyContents */
+ boolean willEmptyContentsSolidBucketItem = dispensibleContainerItem instanceof net.minecraft.world.item.SolidBucketItem && level.isInWorldBounds(blockPos) && iblockdata.isAir(); + boolean willEmptyContentsSolidBucketItem = dispensibleContainerItem instanceof net.minecraft.world.item.SolidBucketItem && level.isInWorldBounds(blockPos) && iblockdata.isAir();
+ /* Taken from BucketItem#emptyContents */ + /* 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) { + if (willEmptyContentsSolidBucketItem || willEmptyBucketItem) {
+ // Paper end - correctly check if the bucket place will succeed + // Paper end - correctly check if the bucket place will succeed
+ org.bukkit.block.Block block = org.bukkit.craftbukkit.block.CraftBlock.at(level, blockSource.pos()); + org.bukkit.block.Block block = org.bukkit.craftbukkit.block.CraftBlock.at(level, blockSource.pos());
@ -357,8 +347,8 @@
+ // CraftBukkit start + // CraftBukkit start
+ level.captureTreeGeneration = false; + level.captureTreeGeneration = false;
+ if (level.capturedBlockStates.size() > 0) { + if (level.capturedBlockStates.size() > 0) {
+ org.bukkit.TreeType treeType = SaplingBlock.treeType; + org.bukkit.TreeType treeType = net.minecraft.world.level.block.SaplingBlock.treeType;
+ SaplingBlock.treeType = null; + net.minecraft.world.level.block.SaplingBlock.treeType = null;
+ org.bukkit.Location location = org.bukkit.craftbukkit.util.CraftLocation.toBukkit(blockPos, level.getWorld()); + org.bukkit.Location location = org.bukkit.craftbukkit.util.CraftLocation.toBukkit(blockPos, level.getWorld());
+ List<org.bukkit.block.BlockState> blocks = new java.util.ArrayList<>(level.capturedBlockStates.values()); + List<org.bukkit.block.BlockState> blocks = new java.util.ArrayList<>(level.capturedBlockStates.values());
+ level.capturedBlockStates.clear(); + level.capturedBlockStates.clear();

View file

@ -1,15 +1,5 @@
--- a/net/minecraft/server/Bootstrap.java --- a/net/minecraft/server/Bootstrap.java
+++ b/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 @@ @@ -43,6 +_,7 @@
if (!isBootstrapped) { if (!isBootstrapped) {
isBootstrapped = true; isBootstrapped = true;
@ -32,67 +22,67 @@
bootstrapDuration.set(Duration.between(instant, Instant.now()).toMillis()); bootstrapDuration.set(Duration.between(instant, Instant.now()).toMillis());
} }
+ // CraftBukkit start - easier than fixing the decompile + // CraftBukkit start - easier than fixing the decompile
+ BlockStateData.register(1008, "{Name:'minecraft:oak_sign',Properties:{rotation:'0'}}", "{Name:'minecraft:standing_sign',Properties:{rotation:'0'}}"); + net.minecraft.util.datafix.fixes.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'}}"); + net.minecraft.util.datafix.fixes.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'}}"); + net.minecraft.util.datafix.fixes.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'}}"); + net.minecraft.util.datafix.fixes.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'}}"); + net.minecraft.util.datafix.fixes.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'}}"); + net.minecraft.util.datafix.fixes.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'}}"); + net.minecraft.util.datafix.fixes.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'}}"); + net.minecraft.util.datafix.fixes.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'}}"); + net.minecraft.util.datafix.fixes.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'}}"); + net.minecraft.util.datafix.fixes.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'}}"); + net.minecraft.util.datafix.fixes.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'}}"); + net.minecraft.util.datafix.fixes.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'}}"); + net.minecraft.util.datafix.fixes.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'}}"); + net.minecraft.util.datafix.fixes.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'}}"); + net.minecraft.util.datafix.fixes.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'}}"); + net.minecraft.util.datafix.fixes.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.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"); + net.minecraft.util.datafix.fixes.ItemIdFix.ITEM_NAMES.put(409, "minecraft:prismarine_shard");
+ ItemIdFix.ITEM_NAMES.put(410, "minecraft:prismarine_crystals"); + net.minecraft.util.datafix.fixes.ItemIdFix.ITEM_NAMES.put(410, "minecraft:prismarine_crystals");
+ ItemIdFix.ITEM_NAMES.put(411, "minecraft:rabbit"); + net.minecraft.util.datafix.fixes.ItemIdFix.ITEM_NAMES.put(411, "minecraft:rabbit");
+ ItemIdFix.ITEM_NAMES.put(412, "minecraft:cooked_rabbit"); + net.minecraft.util.datafix.fixes.ItemIdFix.ITEM_NAMES.put(412, "minecraft:cooked_rabbit");
+ ItemIdFix.ITEM_NAMES.put(413, "minecraft:rabbit_stew"); + net.minecraft.util.datafix.fixes.ItemIdFix.ITEM_NAMES.put(413, "minecraft:rabbit_stew");
+ ItemIdFix.ITEM_NAMES.put(414, "minecraft:rabbit_foot"); + net.minecraft.util.datafix.fixes.ItemIdFix.ITEM_NAMES.put(414, "minecraft:rabbit_foot");
+ ItemIdFix.ITEM_NAMES.put(415, "minecraft:rabbit_hide"); + net.minecraft.util.datafix.fixes.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(416, "minecraft:armor_stand");
+ +
+ ItemIdFix.ITEM_NAMES.put(423, "minecraft:mutton"); + net.minecraft.util.datafix.fixes.ItemIdFix.ITEM_NAMES.put(423, "minecraft:mutton");
+ ItemIdFix.ITEM_NAMES.put(424, "minecraft:cooked_mutton"); + net.minecraft.util.datafix.fixes.ItemIdFix.ITEM_NAMES.put(424, "minecraft:cooked_mutton");
+ ItemIdFix.ITEM_NAMES.put(425, "minecraft:banner"); + net.minecraft.util.datafix.fixes.ItemIdFix.ITEM_NAMES.put(425, "minecraft:banner");
+ ItemIdFix.ITEM_NAMES.put(426, "minecraft:end_crystal"); + net.minecraft.util.datafix.fixes.ItemIdFix.ITEM_NAMES.put(426, "minecraft:end_crystal");
+ ItemIdFix.ITEM_NAMES.put(427, "minecraft:spruce_door"); + net.minecraft.util.datafix.fixes.ItemIdFix.ITEM_NAMES.put(427, "minecraft:spruce_door");
+ ItemIdFix.ITEM_NAMES.put(428, "minecraft:birch_door"); + net.minecraft.util.datafix.fixes.ItemIdFix.ITEM_NAMES.put(428, "minecraft:birch_door");
+ ItemIdFix.ITEM_NAMES.put(429, "minecraft:jungle_door"); + net.minecraft.util.datafix.fixes.ItemIdFix.ITEM_NAMES.put(429, "minecraft:jungle_door");
+ ItemIdFix.ITEM_NAMES.put(430, "minecraft:acacia_door"); + net.minecraft.util.datafix.fixes.ItemIdFix.ITEM_NAMES.put(430, "minecraft:acacia_door");
+ ItemIdFix.ITEM_NAMES.put(431, "minecraft:dark_oak_door"); + net.minecraft.util.datafix.fixes.ItemIdFix.ITEM_NAMES.put(431, "minecraft:dark_oak_door");
+ ItemIdFix.ITEM_NAMES.put(432, "minecraft:chorus_fruit"); + net.minecraft.util.datafix.fixes.ItemIdFix.ITEM_NAMES.put(432, "minecraft:chorus_fruit");
+ ItemIdFix.ITEM_NAMES.put(433, "minecraft:chorus_fruit_popped"); + net.minecraft.util.datafix.fixes.ItemIdFix.ITEM_NAMES.put(433, "minecraft:chorus_fruit_popped");
+ ItemIdFix.ITEM_NAMES.put(434, "minecraft:beetroot"); + net.minecraft.util.datafix.fixes.ItemIdFix.ITEM_NAMES.put(434, "minecraft:beetroot");
+ ItemIdFix.ITEM_NAMES.put(435, "minecraft:beetroot_seeds"); + net.minecraft.util.datafix.fixes.ItemIdFix.ITEM_NAMES.put(435, "minecraft:beetroot_seeds");
+ ItemIdFix.ITEM_NAMES.put(436, "minecraft:beetroot_soup"); + net.minecraft.util.datafix.fixes.ItemIdFix.ITEM_NAMES.put(436, "minecraft:beetroot_soup");
+ ItemIdFix.ITEM_NAMES.put(437, "minecraft:dragon_breath"); + net.minecraft.util.datafix.fixes.ItemIdFix.ITEM_NAMES.put(437, "minecraft:dragon_breath");
+ ItemIdFix.ITEM_NAMES.put(438, "minecraft:splash_potion"); + net.minecraft.util.datafix.fixes.ItemIdFix.ITEM_NAMES.put(438, "minecraft:splash_potion");
+ ItemIdFix.ITEM_NAMES.put(439, "minecraft:spectral_arrow"); + net.minecraft.util.datafix.fixes.ItemIdFix.ITEM_NAMES.put(439, "minecraft:spectral_arrow");
+ ItemIdFix.ITEM_NAMES.put(440, "minecraft:tipped_arrow"); + net.minecraft.util.datafix.fixes.ItemIdFix.ITEM_NAMES.put(440, "minecraft:tipped_arrow");
+ ItemIdFix.ITEM_NAMES.put(441, "minecraft:lingering_potion"); + net.minecraft.util.datafix.fixes.ItemIdFix.ITEM_NAMES.put(441, "minecraft:lingering_potion");
+ ItemIdFix.ITEM_NAMES.put(442, "minecraft:shield"); + net.minecraft.util.datafix.fixes.ItemIdFix.ITEM_NAMES.put(442, "minecraft:shield");
+ ItemIdFix.ITEM_NAMES.put(443, "minecraft:elytra"); + net.minecraft.util.datafix.fixes.ItemIdFix.ITEM_NAMES.put(443, "minecraft:elytra");
+ ItemIdFix.ITEM_NAMES.put(444, "minecraft:spruce_boat"); + net.minecraft.util.datafix.fixes.ItemIdFix.ITEM_NAMES.put(444, "minecraft:spruce_boat");
+ ItemIdFix.ITEM_NAMES.put(445, "minecraft:birch_boat"); + net.minecraft.util.datafix.fixes.ItemIdFix.ITEM_NAMES.put(445, "minecraft:birch_boat");
+ ItemIdFix.ITEM_NAMES.put(446, "minecraft:jungle_boat"); + net.minecraft.util.datafix.fixes.ItemIdFix.ITEM_NAMES.put(446, "minecraft:jungle_boat");
+ ItemIdFix.ITEM_NAMES.put(447, "minecraft:acacia_boat"); + net.minecraft.util.datafix.fixes.ItemIdFix.ITEM_NAMES.put(447, "minecraft:acacia_boat");
+ ItemIdFix.ITEM_NAMES.put(448, "minecraft:dark_oak_boat"); + net.minecraft.util.datafix.fixes.ItemIdFix.ITEM_NAMES.put(448, "minecraft:dark_oak_boat");
+ ItemIdFix.ITEM_NAMES.put(449, "minecraft:totem_of_undying"); + net.minecraft.util.datafix.fixes.ItemIdFix.ITEM_NAMES.put(449, "minecraft:totem_of_undying");
+ ItemIdFix.ITEM_NAMES.put(450, "minecraft:shulker_shell"); + net.minecraft.util.datafix.fixes.ItemIdFix.ITEM_NAMES.put(450, "minecraft:shulker_shell");
+ ItemIdFix.ITEM_NAMES.put(452, "minecraft:iron_nugget"); + net.minecraft.util.datafix.fixes.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(453, "minecraft:knowledge_book");
+ +
+ ItemSpawnEggFix.ID_TO_ENTITY[23] = "Arrow"; + net.minecraft.util.datafix.fixes.ItemSpawnEggFix.ID_TO_ENTITY[23] = "Arrow";
+ // CraftBukkit end + // CraftBukkit end
} }
} }

View file

@ -1,13 +1,5 @@
--- a/net/minecraft/server/Main.java --- a/net/minecraft/server/Main.java
+++ b/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 @@ @@ -67,8 +_,9 @@
reason = "System.out needed before bootstrap" reason = "System.out needed before bootstrap"
) )
@ -144,7 +136,7 @@
+ com.google.common.io.Files.write("{\n" + com.google.common.io.Files.write("{\n"
+ + " \"pack\": {\n" + + " \"pack\": {\n"
+ + " \"description\": \"Data pack for resources provided by Bukkit plugins\",\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"
+ + "}\n", mcMeta, com.google.common.base.Charsets.UTF_8); + + "}\n", mcMeta, com.google.common.base.Charsets.UTF_8);
+ } catch (java.io.IOException ex) { + } catch (java.io.IOException ex) {

View file

@ -1,13 +1,5 @@
--- a/net/minecraft/server/commands/TeleportCommand.java --- a/net/minecraft/server/commands/TeleportCommand.java
+++ b/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 @@ @@ -290,7 +_,31 @@
float f1 = relatives.contains(Relative.X_ROT) ? xRot - target.getXRot() : xRot; float f1 = relatives.contains(Relative.X_ROT) ? xRot - target.getXRot() : xRot;
float f2 = Mth.wrapDegrees(f); float f2 = Mth.wrapDegrees(f);
@ -15,7 +7,7 @@
- if (target.teleportTo(level, d, d1, d2, relatives, f2, f3, true)) { - if (target.teleportTo(level, d, d1, d2, relatives, f2, f3, true)) {
+ // CraftBukkit start - Teleport event + // CraftBukkit start - Teleport event
+ boolean result; + 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); + result = player.teleportTo(level, d, d1, d2, relatives, f2, f3, true, org.bukkit.event.player.PlayerTeleportEvent.TeleportCause.COMMAND);
+ } else { + } else {
+ org.bukkit.Location to = new org.bukkit.Location(level.getWorld(), d, d1, d2, f2, f3); + org.bukkit.Location to = new org.bukkit.Location(level.getWorld(), d, d1, d2, f2, f3);

View file

@ -1,33 +1,5 @@
--- a/net/minecraft/server/level/ServerPlayer.java --- a/net/minecraft/server/level/ServerPlayer.java
+++ b/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 @@ @@ -223,7 +_,8 @@
private int levitationStartTime; private int levitationStartTime;
private boolean disconnected; private boolean disconnected;
@ -152,7 +124,7 @@
+ this.containerMenu.findSlot(this.getInventory(), this.getInventory().selected).ifPresent(s -> { + this.containerMenu.findSlot(this.getInventory(), this.getInventory().selected).ifPresent(s -> {
+ this.containerSynchronizer.sendSlotChange(this.containerMenu, s, this.getMainHandItem()); + 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. + // Yes, this doesn't match Vanilla, but it's the best we can do for now.
@ -699,7 +671,7 @@
ServerLevel serverLevel = this.serverLevel(); ServerLevel serverLevel = this.serverLevel();
- ResourceKey<Level> resourceKey = serverLevel.dimension(); - ResourceKey<Level> resourceKey = serverLevel.dimension();
+ // CraftBukkit start + // CraftBukkit start
+ ResourceKey<LevelStem> resourceKey = serverLevel.getTypeKey(); + ResourceKey<net.minecraft.world.level.dimension.LevelStem> resourceKey = serverLevel.getTypeKey();
+ +
+ org.bukkit.Location enter = this.getBukkitEntity().getLocation(); + org.bukkit.Location enter = this.getBukkitEntity().getLocation();
+ PositionMoveRotation absolutePosition = PositionMoveRotation.calculateAbsolute(PositionMoveRotation.of(this), PositionMoveRotation.of(teleportTransition), teleportTransition.relatives()); + PositionMoveRotation absolutePosition = PositionMoveRotation.calculateAbsolute(PositionMoveRotation.of(this), PositionMoveRotation.of(teleportTransition), teleportTransition.relatives());
@ -758,7 +730,7 @@
ProfilerFiller profilerFiller = Profiler.get(); ProfilerFiller profilerFiller = Profiler.get();
profilerFiller.push("moving"); profilerFiller.push("moving");
- if (resourceKey == Level.OVERWORLD && level.dimension() == Level.NETHER) { - 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(); this.enteredNetherPosition = this.position();
} }
@ -998,9 +970,9 @@
+ // SPIGOT-5263 - close chest if cancelled + // SPIGOT-5263 - close chest if cancelled
+ if (menu instanceof Container) { + if (menu instanceof Container) {
+ ((Container) menu).stopOpen(this); + ((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 :( + // SPIGOT-5355 - double chests too :(
+ ((ChestBlock.DoubleInventory) menu).inventorylargechest.stopOpen(this); + doubleInventory.inventorylargechest.stopOpen(this);
+ // Paper start - Fix InventoryOpenEvent cancellation + // Paper start - Fix InventoryOpenEvent cancellation
+ } else if (!this.enderChestInventory.isActiveChest(null)) { + } else if (!this.enderChestInventory.isActiveChest(null)) {
+ this.enderChestInventory.stopOpen(this); + this.enderChestInventory.stopOpen(this);
@ -1653,7 +1625,7 @@
+ this.setAirSupply(this.getMaxAirSupply()); // Paper - Reset players airTicks on respawn + this.setAirSupply(this.getMaxAirSupply()); // Paper - Reset players airTicks on respawn
+ this.setRemainingFireTicks(0); + this.setRemainingFireTicks(0);
+ this.fallDistance = 0; + this.fallDistance = 0;
+ this.foodData = new FoodData(); + this.foodData = new net.minecraft.world.food.FoodData();
+ this.experienceLevel = this.newLevel; + this.experienceLevel = this.newLevel;
+ this.totalExperience = this.newTotalExp; + this.totalExperience = this.newTotalExp;
+ this.experienceProgress = 0; + this.experienceProgress = 0;

View file

@ -1,13 +1,5 @@
--- a/net/minecraft/server/level/ServerPlayerGameMode.java --- a/net/minecraft/server/level/ServerPlayerGameMode.java
+++ b/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 @@ @@ -41,6 +_,8 @@
private BlockPos delayedDestroyPos = BlockPos.ZERO; private BlockPos delayedDestroyPos = BlockPos.ZERO;
private int delayedTickStart; private int delayedTickStart;
@ -392,7 +384,7 @@
+ // Paper end - Don't resync blocks + // Paper end - Don't resync blocks
+ } else if (blockState.getBlock() instanceof net.minecraft.world.level.block.CakeBlock) { + } else if (blockState.getBlock() instanceof net.minecraft.world.level.block.CakeBlock) {
+ player.getBukkitEntity().sendHealthUpdate(); // SPIGOT-1341 - reset health for cake + 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 + // 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 + //player.connection.send(new ClientboundBlockUpdatePacket(world, blockposition.relative(hitResult.getDirection()).above())); // Paper - Don't resync blocks
+ +

View file

@ -1,26 +1,11 @@
--- a/net/minecraft/server/network/ServerCommonPacketListenerImpl.java --- a/net/minecraft/server/network/ServerCommonPacketListenerImpl.java
+++ b/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 net.minecraft.util.profiling.Profiler;
import org.slf4j.Logger; import org.slf4j.Logger;
-public abstract class ServerCommonPacketListenerImpl implements ServerCommonPacketListener { -public abstract class ServerCommonPacketListenerImpl implements ServerCommonPacketListener {
+// CraftBukkit start +public abstract class ServerCommonPacketListenerImpl implements ServerCommonPacketListener, org.bukkit.craftbukkit.entity.CraftPlayer.TransferCookieConnection { // CraftBukkit
+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
private static final Logger LOGGER = LogUtils.getLogger(); private static final Logger LOGGER = LogUtils.getLogger();
public static final int LATENCY_CHECK_INTERVAL = 15000; public static final int LATENCY_CHECK_INTERVAL = 15000;
private static final int CLOSED_LISTENER_TIMEOUT = 15000; private static final int CLOSED_LISTENER_TIMEOUT = 15000;
@ -39,16 +24,16 @@
private int latency; private int latency;
private volatile boolean suspendFlushingOnServerThread = false; private volatile boolean suspendFlushingOnServerThread = false;
+ // CraftBukkit start + // CraftBukkit start
+ protected final ServerPlayer player; + protected final net.minecraft.server.level.ServerPlayer player;
+ protected final org.bukkit.craftbukkit.CraftServer cserver; + protected final org.bukkit.craftbukkit.CraftServer cserver;
+ public boolean processedDisconnect; + public boolean processedDisconnect;
+ // CraftBukkit end + // CraftBukkit end
+ public final java.util.Map<java.util.UUID, net.kyori.adventure.resource.ResourcePackCallback> packCallbacks = new java.util.concurrent.ConcurrentHashMap<>(); // Paper - adventure resource pack callbacks + public final java.util.Map<java.util.UUID, net.kyori.adventure.resource.ResourcePackCallback> 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 + 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) {
+ 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.server = server;
this.connection = connection; this.connection = connection;
this.keepAliveTime = Util.getMillis(); this.keepAliveTime = Util.getMillis();
@ -61,7 +46,7 @@
+ this.cserver = server.server; + this.cserver = server.server;
+ } + }
+ +
+ public CraftPlayer getCraftPlayer() { + public org.bukkit.craftbukkit.entity.CraftPlayer getCraftPlayer() {
+ return this.player == null ? null : this.player.getBukkitEntity(); + return this.player == null ? null : this.player.getBukkitEntity();
+ } + }
+ +
@ -71,7 +56,7 @@
+ } + }
+ +
+ @Override + @Override
+ public ConnectionProtocol getProtocol() { + public net.minecraft.network.ConnectionProtocol getProtocol() {
+ return this.protocol(); + return this.protocol();
+ } + }
+ +
@ -106,7 +91,7 @@
this.keepAlivePending = false; this.keepAlivePending = false;
} else if (!this.isSingleplayerOwner()) { } else if (!this.isSingleplayerOwner()) {
- this.disconnect(TIMEOUT_DISCONNECTION_MESSAGE); - 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) { public void handlePong(ServerboundPongPacket packet) {
} }
+ private static final ResourceLocation CUSTOM_REGISTER = ResourceLocation.withDefaultNamespace("register"); // CraftBukkit + private static final net.minecraft.resources.ResourceLocation CUSTOM_REGISTER = net.minecraft.resources.ResourceLocation.withDefaultNamespace("register"); // CraftBukkit
+ private static final ResourceLocation CUSTOM_UNREGISTER = ResourceLocation.withDefaultNamespace("unregister"); // CraftBukkit + private static final net.minecraft.resources.ResourceLocation CUSTOM_UNREGISTER = net.minecraft.resources.ResourceLocation.withDefaultNamespace("unregister"); // CraftBukkit
+ +
@Override @Override
public void handleCustomPayload(ServerboundCustomPayloadPacket packet) { public void handleCustomPayload(ServerboundCustomPayloadPacket packet) {
@ -126,12 +111,12 @@
+ this.player.clientBrandName = brand; + this.player.clientBrandName = brand;
+ } + }
+ // Paper end - Brand support + // Paper end - Brand support
+ if (!(packet.payload() instanceof DiscardedPayload)) { + if (!(packet.payload() instanceof net.minecraft.network.protocol.common.custom.DiscardedPayload)) {
+ return; + return;
+ } + }
+ PacketUtils.ensureRunningOnSameThread(packet, this, this.player.serverLevel()); + PacketUtils.ensureRunningOnSameThread(packet, this, this.player.serverLevel());
+ ResourceLocation identifier = packet.payload().type().id(); + net.minecraft.resources.ResourceLocation identifier = packet.payload().type().id();
+ ByteBuf payload = ((DiscardedPayload)packet.payload()).data(); + io.netty.buffer.ByteBuf payload = ((net.minecraft.network.protocol.common.custom.DiscardedPayload)packet.payload()).data();
+ +
+ if (identifier.equals(ServerCommonPacketListenerImpl.CUSTOM_REGISTER)) { + if (identifier.equals(ServerCommonPacketListenerImpl.CUSTOM_REGISTER)) {
+ try { + try {
@ -141,7 +126,7 @@
+ } + }
+ } catch (Exception ex) { + } catch (Exception ex) {
+ ServerGamePacketListenerImpl.LOGGER.error("Couldn't register custom payload", 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)) { + } else if (identifier.equals(ServerCommonPacketListenerImpl.CUSTOM_UNREGISTER)) {
+ try { + try {
@ -151,7 +136,7 @@
+ } + }
+ } catch (Exception ex) { + } catch (Exception ex) {
+ ServerGamePacketListenerImpl.LOGGER.error("Couldn't unregister custom payload", 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 { + } else {
+ try { + try {
@ -169,7 +154,7 @@
+ this.cserver.getMessenger().dispatchIncomingMessage(this.player.getBukkitEntity(), identifier.toString(), data); + this.cserver.getMessenger().dispatchIncomingMessage(this.player.getBukkitEntity(), identifier.toString(), data);
+ } catch (Exception ex) { + } catch (Exception ex) {
+ ServerGamePacketListenerImpl.LOGGER.error("Couldn't dispatch custom payload", 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()); 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"));
- } - }
+ 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 + // Paper start - adventure pack callbacks
+ // call the callbacks before the previously-existing event so the event has final say + // call the callbacks before the previously-existing event so the event has final say
@ -201,9 +186,9 @@
+ } + }
+ // Paper end + // Paper end
+ // Paper start - store last pack status + // 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.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 + // Paper end - store last pack status
} }
@ -216,7 +201,7 @@
+ return; + return;
+ } + }
+ // CraftBukkit end + // 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() { protected void keepConnectionAlive() {
@ -232,7 +217,7 @@
+ long elapsedTime = currentTime - this.keepAliveTime; + long elapsedTime = currentTime - this.keepAliveTime;
+ if (!this.isSingleplayerOwner() && elapsedTime >= 15000L) { // Paper - use vanilla's 15000L between keep alive packets + 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 + 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 + } else if (this.checkIfClosed(currentTime)) { // Paper
this.keepAlivePending = true; this.keepAlivePending = true;
- this.keepAliveTime = millis; - this.keepAliveTime = millis;
@ -251,7 +236,7 @@
if (this.closed) { if (this.closed) {
if (time - this.closedListenerTime >= 15000L) { if (time - this.closedListenerTime >= 15000L) {
- this.disconnect(TIMEOUT_DISCONNECTION_MESSAGE); - 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; return false;
@ -262,8 +247,8 @@
+ // CraftBukkit start + // CraftBukkit start
+ if (packet == null || this.processedDisconnect) { // Spigot + if (packet == null || this.processedDisconnect) { // Spigot
+ return; + return;
+ } else if (packet instanceof ClientboundSetDefaultSpawnPositionPacket defaultSpawnPositionPacket) { + } else if (packet instanceof net.minecraft.network.protocol.game.ClientboundSetDefaultSpawnPositionPacket defaultSpawnPositionPacket) {
+ this.player.compassTarget = CraftLocation.toBukkit(defaultSpawnPositionPacket.getPos(), this.getCraftPlayer().getWorld()); + this.player.compassTarget = org.bukkit.craftbukkit.util.CraftLocation.toBukkit(defaultSpawnPositionPacket.getPos(), this.getCraftPlayer().getWorld());
+ } + }
+ // CraftBukkit end + // CraftBukkit end
if (packet.isTerminal()) { if (packet.isTerminal()) {
@ -275,10 +260,10 @@
+ // Paper start - adventure + // Paper start - adventure
+ public void disconnect(final net.kyori.adventure.text.Component reason) { + 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); + this.disconnect(io.papermc.paper.adventure.PaperAdventure.asVanilla(reason), cause);
+ } + }
+ // Paper end - adventure + // Paper end - adventure
@ -290,21 +275,21 @@
- -
- public void disconnect(DisconnectionDetails disconnectionDetails) { - public void disconnect(DisconnectionDetails disconnectionDetails) {
+ // Paper start - kick event causes + // 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); + this.disconnect(new DisconnectionDetails(reason), cause);
+ // Paper end - kick event causes + // 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 + // CraftBukkit start - fire PlayerKickEvent
+ if (this.processedDisconnect) { + if (this.processedDisconnect) {
+ return; + return;
+ } + }
+ if (!this.cserver.isPrimaryThread()) { + if (!this.cserver.isPrimaryThread()) {
+ Waitable waitable = new Waitable() { + org.bukkit.craftbukkit.util.Waitable waitable = new org.bukkit.craftbukkit.util.Waitable() {
+ @Override + @Override
+ protected Object evaluate() { + protected Object evaluate() {
+ ServerCommonPacketListenerImpl.this.disconnect(disconnectionDetails, cause); // Paper - kick event causes + ServerCommonPacketListenerImpl.this.disconnect(disconnectionDetails, cause); // Paper - kick event causes
@ -318,7 +303,7 @@
+ waitable.get(); + waitable.get();
+ } catch (InterruptedException e) { + } catch (InterruptedException e) {
+ Thread.currentThread().interrupt(); + Thread.currentThread().interrupt();
+ } catch (ExecutionException e) { + } catch (java.util.concurrent.ExecutionException e) {
+ throw new RuntimeException(e); + throw new RuntimeException(e);
+ } + }
+ return; + 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 + 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()) { + if (this.cserver.getServer().isRunning()) {
+ this.cserver.getPluginManager().callEvent(event); + this.cserver.getPluginManager().callEvent(event);
@ -358,15 +343,15 @@
+ } + }
+ +
+ // Paper start - add proper async disconnect + // 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); + 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); + 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()) { + if (this.cserver.isPrimaryThread()) {
+ this.disconnect(disconnectionInfo, cause); + this.disconnect(disconnectionInfo, cause);
+ return; + return;

View file

@ -29,11 +29,12 @@ import net.minecraft.world.entity.raid.Raider;
import net.minecraft.world.level.Level; import net.minecraft.world.level.Level;
import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.AABB;
public class ActivationRange public final class ActivationRange {
{
public enum ActivationType private ActivationRange() {
{ }
public enum ActivationType {
WATER, // Paper WATER, // Paper
FLYING_MONSTER, // Paper FLYING_MONSTER, // Paper
VILLAGER, // Paper VILLAGER, // Paper
@ -42,10 +43,10 @@ public class ActivationRange
RAIDER, RAIDER,
MISC; 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 * Initializes an entities type on construction to specify what group this
@ -54,19 +55,14 @@ public class ActivationRange
* @param entity * @param entity
* @return group id * @return group id
*/ */
public static ActivationType initializeEntityActivationType(Entity entity) public static ActivationType initializeEntityActivationType(final Entity entity) {
{ if (entity instanceof Raider) {
if ( entity instanceof Raider )
{
return ActivationType.RAIDER; return ActivationType.RAIDER;
} else if ( entity instanceof Monster || entity instanceof Slime ) } else if (entity instanceof Monster || entity instanceof Slime) {
{
return ActivationType.MONSTER; return ActivationType.MONSTER;
} else if ( entity instanceof PathfinderMob || entity instanceof AmbientCreature ) } else if (entity instanceof PathfinderMob || entity instanceof AmbientCreature) {
{
return ActivationType.ANIMAL; return ActivationType.ANIMAL;
} else } else {
{
return ActivationType.MISC; return ActivationType.MISC;
} }
} }
@ -78,31 +74,25 @@ public class ActivationRange
* @param config * @param config
* @return boolean If it should always tick. * @return boolean If it should always tick.
*/ */
public static boolean initializeEntityActivationState(Entity entity, SpigotWorldConfig config) public static boolean initializeEntityActivationState(final Entity entity, final SpigotWorldConfig config) {
{ return (entity.activationType == ActivationType.MISC && config.miscActivationRange == 0)
if ( ( entity.activationType == ActivationType.MISC && config.miscActivationRange == 0 ) || (entity.activationType == ActivationType.RAIDER && config.raiderActivationRange == 0)
|| ( entity.activationType == ActivationType.RAIDER && config.raiderActivationRange == 0 ) || (entity.activationType == ActivationType.ANIMAL && config.animalActivationRange == 0)
|| ( entity.activationType == ActivationType.ANIMAL && config.animalActivationRange == 0 ) || (entity.activationType == ActivationType.MONSTER && config.monsterActivationRange == 0)
|| ( entity.activationType == ActivationType.MONSTER && config.monsterActivationRange == 0 ) || entity instanceof Player
|| entity instanceof Player || entity instanceof ThrowableProjectile
|| entity instanceof ThrowableProjectile || entity instanceof EnderDragon
|| entity instanceof EnderDragon || entity instanceof EnderDragonPart
|| entity instanceof EnderDragonPart || entity instanceof WitherBoss
|| entity instanceof WitherBoss || entity instanceof AbstractHurtingProjectile
|| entity instanceof AbstractHurtingProjectile || entity instanceof LightningBolt
|| entity instanceof LightningBolt || entity instanceof PrimedTnt
|| entity instanceof PrimedTnt || entity instanceof net.minecraft.world.entity.item.FallingBlockEntity // Paper - Always tick falling blocks
|| 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.AbstractMinecart // Paper || entity instanceof net.minecraft.world.entity.vehicle.AbstractBoat // Paper
|| entity instanceof net.minecraft.world.entity.vehicle.AbstractBoat // Paper || entity instanceof EndCrystal
|| entity instanceof EndCrystal || entity instanceof FireworkRocketEntity
|| entity instanceof FireworkRocketEntity || entity instanceof ThrownTrident;
|| entity instanceof ThrownTrident )
{
return true;
}
return false;
} }
/** /**
@ -111,31 +101,28 @@ public class ActivationRange
* *
* @param world * @param world
*/ */
public static void activateEntities(Level world) public static void activateEntities(final Level world) {
{
final int miscActivationRange = world.spigotConfig.miscActivationRange; final int miscActivationRange = world.spigotConfig.miscActivationRange;
final int raiderActivationRange = world.spigotConfig.raiderActivationRange; final int raiderActivationRange = world.spigotConfig.raiderActivationRange;
final int animalActivationRange = world.spigotConfig.animalActivationRange; final int animalActivationRange = world.spigotConfig.animalActivationRange;
final int monsterActivationRange = world.spigotConfig.monsterActivationRange; final int monsterActivationRange = world.spigotConfig.monsterActivationRange;
int maxRange = Math.max( monsterActivationRange, animalActivationRange ); int maxRange = Math.max(monsterActivationRange, animalActivationRange);
maxRange = Math.max( maxRange, raiderActivationRange ); maxRange = Math.max(maxRange, raiderActivationRange);
maxRange = Math.max( maxRange, miscActivationRange ); maxRange = Math.max(maxRange, miscActivationRange);
maxRange = Math.min( ( world.spigotConfig.simulationDistance << 4 ) - 8, maxRange ); maxRange = Math.min((world.spigotConfig.simulationDistance << 4) - 8, maxRange);
for ( Player player : world.players() ) for (final Player player : world.players()) {
{
player.activatedTick = MinecraftServer.currentTick; player.activatedTick = MinecraftServer.currentTick;
if ( world.spigotConfig.ignoreSpectatorActivation && player.isSpectator() ) if (world.spigotConfig.ignoreSpectatorActivation && player.isSpectator()) {
{
continue; continue;
} }
ActivationRange.maxBB = player.getBoundingBox().inflate( maxRange, 256, maxRange ); ActivationRange.maxBB = player.getBoundingBox().inflate(maxRange, 256, maxRange);
ActivationType.MISC.boundingBox = player.getBoundingBox().inflate( miscActivationRange, 256, miscActivationRange ); ActivationType.MISC.boundingBox = player.getBoundingBox().inflate(miscActivationRange, 256, miscActivationRange);
ActivationType.RAIDER.boundingBox = player.getBoundingBox().inflate( raiderActivationRange, 256, raiderActivationRange ); ActivationType.RAIDER.boundingBox = player.getBoundingBox().inflate(raiderActivationRange, 256, raiderActivationRange);
ActivationType.ANIMAL.boundingBox = player.getBoundingBox().inflate( animalActivationRange, 256, animalActivationRange ); ActivationType.ANIMAL.boundingBox = player.getBoundingBox().inflate(animalActivationRange, 256, animalActivationRange);
ActivationType.MONSTER.boundingBox = player.getBoundingBox().inflate( monsterActivationRange, 256, monsterActivationRange ); ActivationType.MONSTER.boundingBox = player.getBoundingBox().inflate(monsterActivationRange, 256, monsterActivationRange);
world.getEntities().get(ActivationRange.maxBB, ActivationRange::activateEntity); world.getEntities().get(ActivationRange.maxBB, ActivationRange::activateEntity);
} }
@ -146,17 +133,13 @@ public class ActivationRange
* *
* @param entity * @param entity
*/ */
private static void activateEntity(Entity entity) private static void activateEntity(final Entity entity) {
{ if (MinecraftServer.currentTick > entity.activatedTick) {
if ( MinecraftServer.currentTick > entity.activatedTick ) if (entity.defaultActivationState) {
{
if ( entity.defaultActivationState )
{
entity.activatedTick = MinecraftServer.currentTick; entity.activatedTick = MinecraftServer.currentTick;
return; return;
} }
if ( entity.activationType.boundingBox.intersects( entity.getBoundingBox() ) ) if (entity.activationType.boundingBox.intersects(entity.getBoundingBox())) {
{
entity.activatedTick = MinecraftServer.currentTick; entity.activatedTick = MinecraftServer.currentTick;
} }
} }
@ -169,60 +152,43 @@ public class ActivationRange
* @param entity * @param entity
* @return * @return
*/ */
public static boolean checkEntityImmunities(Entity entity) public static boolean checkEntityImmunities(final Entity entity) {
{
// quick checks. // quick checks.
if ( entity.isInWater() || entity.getRemainingFireTicks() > 0 ) if (entity.isInWater() || entity.getRemainingFireTicks() > 0) {
{
return true; return true;
} }
if ( !( entity instanceof AbstractArrow ) ) if (!(entity instanceof final AbstractArrow abstractArrow)) {
{ if (!entity.onGround() || !entity.getPassengers().isEmpty() || entity.isPassenger()) {
if ( !entity.onGround() || !entity.getPassengers().isEmpty() || entity.isPassenger() )
{
return true; return true;
} }
} else if ( !( (AbstractArrow) entity ).isInGround() ) } else if (!abstractArrow.isInGround()) {
{
return true; return true;
} }
// special cases. // special cases.
if ( entity instanceof LivingEntity ) if (entity instanceof final LivingEntity living) {
{ if ( /*TODO: Missed mapping? living.attackTicks > 0 || */ living.hurtTime > 0 || !living.activeEffects.isEmpty()) {
LivingEntity living = (LivingEntity) entity;
if ( /*TODO: Missed mapping? living.attackTicks > 0 || */ living.hurtTime > 0 || living.activeEffects.size() > 0 )
{
return true; return true;
} }
if ( entity instanceof PathfinderMob && ( (PathfinderMob) entity ).getTarget() != null ) if (entity instanceof final PathfinderMob pathfinderMob && pathfinderMob.getTarget() != null) {
{
return true; return true;
} }
if ( entity instanceof Villager && ( (Villager) entity ).canBreed() ) if (entity instanceof final Villager villager && villager.canBreed()) {
{
return true; return true;
} }
if ( entity instanceof Animal ) if (entity instanceof final Animal animal) {
{ if (animal.isBaby() || animal.isInLove()) {
Animal animal = (Animal) entity;
if ( animal.isBaby() || animal.isInLove() )
{
return true; return true;
} }
if ( entity instanceof Sheep && ( (Sheep) entity ).isSheared() ) if (entity instanceof final Sheep sheep && sheep.isSheared()) {
{
return true; return true;
} }
} }
if (entity instanceof Creeper && ((Creeper) entity).isIgnited()) { // isExplosive if (entity instanceof final Creeper creeper && creeper.isIgnited()) { // isExplosive
return true; return true;
} }
} }
// SPIGOT-6644: Otherwise the target refresh tick will be missed // SPIGOT-6644: Otherwise the target refresh tick will be missed
if (entity instanceof ExperienceOrb) { return entity instanceof ExperienceOrb;
return true;
}
return false;
} }
/** /**
@ -231,8 +197,7 @@ public class ActivationRange
* @param entity * @param entity
* @return * @return
*/ */
public static boolean checkIfActive(Entity entity) public static boolean checkIfActive(final Entity entity) {
{
// Never safe to skip fireworks or item gravity // 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 if (entity instanceof FireworkRocketEntity || (entity instanceof ItemEntity && (entity.tickCount + entity.getId()) % 4 == 0)) { // Paper - Needed for item gravity, see ItemEntity tick
return true; return true;
@ -241,13 +206,10 @@ public class ActivationRange
boolean isActive = entity.activatedTick >= MinecraftServer.currentTick || entity.defaultActivationState; boolean isActive = entity.activatedTick >= MinecraftServer.currentTick || entity.defaultActivationState;
// Should this entity tick? // Should this entity tick?
if ( !isActive ) if (!isActive) {
{ if ((MinecraftServer.currentTick - entity.activatedTick - 1) % 20 == 0) {
if ( ( MinecraftServer.currentTick - entity.activatedTick - 1 ) % 20 == 0 )
{
// Check immunities every 20 ticks. // 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. // Triggered some sort of immunity, give 20 full ticks before we check again.
entity.activatedTick = MinecraftServer.currentTick + 20; entity.activatedTick = MinecraftServer.currentTick + 20;
} }

View file

@ -8,8 +8,10 @@ import net.minecraft.world.entity.decoration.ItemFrame;
import net.minecraft.world.entity.decoration.Painting; import net.minecraft.world.entity.decoration.Painting;
import net.minecraft.world.entity.item.ItemEntity; 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 * 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 * @param defaultRange Default range defined by Mojang
* @return * @return
*/ */
public static int getEntityTrackingRange(Entity entity, int defaultRange) public static int getEntityTrackingRange(final Entity entity, final int defaultRange) {
{ if (defaultRange == 0) {
if ( defaultRange == 0 )
{
return defaultRange; return defaultRange;
} }
SpigotWorldConfig config = entity.level().spigotConfig; final SpigotWorldConfig config = entity.level().spigotConfig;
if ( entity instanceof ServerPlayer ) if (entity instanceof ServerPlayer) {
{
return config.playerTrackingRange; 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) { switch (entity.activationType) {
case RAIDER: case RAIDER:
@ -42,16 +41,15 @@ public class TrackingRange
return config.animalTrackingRange; return config.animalTrackingRange;
case MISC: 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 // Paper end
{
return config.miscTrackingRange; return config.miscTrackingRange;
} else if ( entity instanceof Display ) } else if (entity instanceof Display) {
{
return config.displayTrackingRange; return config.displayTrackingRange;
} else } else {
{ if (entity instanceof net.minecraft.world.entity.boss.enderdragon.EnderDragon) {
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 ((net.minecraft.server.level.ServerLevel) (entity.getCommandSenderWorld())).getChunkSource().chunkMap.serverViewDistance; // Paper - enderdragon is exempt
}
return config.otherTrackingRange; return config.otherTrackingRange;
} }
} }