mirror of
https://github.com/PaperMC/Paper.git
synced 2024-11-30 04:02:50 +01:00
bc127ea819
Upstream has released updates that appear to apply and compile correctly. This update has not been tested by PaperMC and as with ANY update, please do your own testing Bukkit Changes: eec4aab0 SPIGOT-6657: Add getPlayer to SheepDyeWoolEvent 205213c6 SPIGOT-6656: CauldronLevelChangeEvent is not fired correctly when dripstone fills the cauldron CraftBukkit Changes: b8c522d5 SPIGOT-6657: Add getPlayer to SheepDyeWoolEvent f04a77dc SPIGOT-6656: CauldronLevelChangeEvent is not fired correctly when dripstone fills the cauldron d1dbcebc SPIGOT-6653: Canceling snow bucket placement removes snow from bucket 4f34a67b #891: Fix scheduler task ID overflow and duplication issues Spigot Changes: d03d7f12 BUILDTOOLS-604: Rebuild patches
72 lines
4 KiB
Diff
72 lines
4 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Callahan <mr.callahhh@gmail.com>
|
|
Date: Wed, 8 Apr 2020 02:42:14 -0500
|
|
Subject: [PATCH] Async command map building
|
|
|
|
|
|
diff --git a/src/main/java/net/minecraft/commands/Commands.java b/src/main/java/net/minecraft/commands/Commands.java
|
|
index 780f46c8fdbaafaca6babfa34ebd97f420d0d612..81146c07dad098a88d8bd3867d0aaf5c15e33961 100644
|
|
--- a/src/main/java/net/minecraft/commands/Commands.java
|
|
+++ b/src/main/java/net/minecraft/commands/Commands.java
|
|
@@ -29,6 +29,7 @@ import net.minecraft.network.chat.MutableComponent;
|
|
import net.minecraft.network.chat.TextComponent;
|
|
import net.minecraft.network.chat.TranslatableComponent;
|
|
import net.minecraft.network.protocol.game.ClientboundCommandsPacket;
|
|
+import net.minecraft.server.MinecraftServer;
|
|
import net.minecraft.server.commands.AdvancementCommands;
|
|
import net.minecraft.server.commands.AttributeCommand;
|
|
import net.minecraft.server.commands.BanIpCommands;
|
|
@@ -335,25 +336,40 @@ public class Commands {
|
|
if ( org.spigotmc.SpigotConfig.tabComplete < 0 ) return; // Spigot
|
|
// CraftBukkit start
|
|
// Register Vanilla commands into builtRoot as before
|
|
+ // Paper start - Async command map building
|
|
+ java.util.concurrent.ForkJoinPool.commonPool().execute(() -> {
|
|
+ sendAsync(player);
|
|
+ });
|
|
+ }
|
|
+
|
|
+ private void sendAsync(ServerPlayer entityplayer) {
|
|
+ // Paper end - Async command map building
|
|
Map<CommandNode<CommandSourceStack>, CommandNode<SharedSuggestionProvider>> map = Maps.newIdentityHashMap(); // Use identity to prevent aliasing issues
|
|
RootCommandNode vanillaRoot = new RootCommandNode();
|
|
|
|
- RootCommandNode<CommandSourceStack> vanilla = player.server.vanillaCommandDispatcher.getDispatcher().getRoot();
|
|
+ RootCommandNode<CommandSourceStack> vanilla = entityplayer.server.vanillaCommandDispatcher.getDispatcher().getRoot();
|
|
map.put(vanilla, vanillaRoot);
|
|
- this.fillUsableCommands(vanilla, vanillaRoot, player.createCommandSourceStack(), (Map) map);
|
|
+ this.fillUsableCommands(vanilla, vanillaRoot, entityplayer.createCommandSourceStack(), (Map) map);
|
|
|
|
// Now build the global commands in a second pass
|
|
RootCommandNode<SharedSuggestionProvider> rootcommandnode = new RootCommandNode();
|
|
|
|
map.put(this.dispatcher.getRoot(), rootcommandnode);
|
|
- this.fillUsableCommands(this.dispatcher.getRoot(), rootcommandnode, player.createCommandSourceStack(), (Map) map);
|
|
+ this.fillUsableCommands(this.dispatcher.getRoot(), rootcommandnode, entityplayer.createCommandSourceStack(), (Map) map);
|
|
|
|
Collection<String> bukkit = new LinkedHashSet<>();
|
|
for (CommandNode node : rootcommandnode.getChildren()) {
|
|
bukkit.add(node.getName());
|
|
}
|
|
+ // Paper start - Async command map building
|
|
+ MinecraftServer.getServer().execute(() -> {
|
|
+ runSync(entityplayer, bukkit, rootcommandnode);
|
|
+ });
|
|
+ }
|
|
|
|
- PlayerCommandSendEvent event = new PlayerCommandSendEvent(player.getBukkitEntity(), new LinkedHashSet<>(bukkit));
|
|
+ private void runSync(ServerPlayer entityplayer, Collection<String> bukkit, RootCommandNode<SharedSuggestionProvider> rootcommandnode) {
|
|
+ // Paper end - Async command map building
|
|
+ PlayerCommandSendEvent event = new PlayerCommandSendEvent(entityplayer.getBukkitEntity(), new LinkedHashSet<>(bukkit));
|
|
event.getPlayer().getServer().getPluginManager().callEvent(event);
|
|
|
|
// Remove labels that were removed during the event
|
|
@@ -363,7 +379,7 @@ public class Commands {
|
|
}
|
|
}
|
|
// CraftBukkit end
|
|
- player.connection.send(new ClientboundCommandsPacket(rootcommandnode));
|
|
+ entityplayer.connection.send(new ClientboundCommandsPacket(rootcommandnode));
|
|
}
|
|
|
|
private void fillUsableCommands(CommandNode<CommandSourceStack> tree, CommandNode<SharedSuggestionProvider> result, CommandSourceStack source, Map<CommandNode<CommandSourceStack>, CommandNode<SharedSuggestionProvider>> resultNodes) {
|