Improve tag parser handling, move hunks out of chunk system patch
This commit is contained in:
@@ -261,8 +261,8 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
|
|||||||
// PacketUtils.ensureRunningOnSameThread(packet, this, this.player.serverLevel()); // Paper - AsyncTabCompleteEvent; run this async
|
// PacketUtils.ensureRunningOnSameThread(packet, this, this.player.serverLevel()); // Paper - AsyncTabCompleteEvent; run this async
|
||||||
// CraftBukkit start
|
// CraftBukkit start
|
||||||
if (this.chatSpamTickCount.addAndGet(io.papermc.paper.configuration.GlobalConfiguration.get().spamLimiter.tabSpamIncrement) > io.papermc.paper.configuration.GlobalConfiguration.get().spamLimiter.tabSpamLimit && !this.server.getPlayerList().isOp(this.player.getGameProfile())) { // Paper - configurable tab spam limits
|
if (this.chatSpamTickCount.addAndGet(io.papermc.paper.configuration.GlobalConfiguration.get().spamLimiter.tabSpamIncrement) > io.papermc.paper.configuration.GlobalConfiguration.get().spamLimiter.tabSpamLimit && !this.server.getPlayerList().isOp(this.player.getGameProfile())) { // Paper - configurable tab spam limits
|
||||||
- server.scheduleOnMain(() -> this.disconnect(Component.translatable("disconnect.spam"))); // Paper - AsyncTabCompleteEvent
|
- this.disconnect(Component.translatable("disconnect.spam"));
|
||||||
+ server.scheduleOnMain(() -> this.disconnect(Component.translatable("disconnect.spam"), org.bukkit.event.player.PlayerKickEvent.Cause.SPAM)); // Paper - AsyncTabCompleteEvent & kick event cause
|
+ this.disconnect(Component.translatable("disconnect.spam"), org.bukkit.event.player.PlayerKickEvent.Cause.SPAM); // Paper - Kick event cause
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// CraftBukkit end
|
// CraftBukkit end
|
||||||
|
|||||||
@@ -33,59 +33,52 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
|
|||||||
+ // PacketUtils.ensureRunningOnSameThread(packet, this, this.player.serverLevel()); // Paper - AsyncTabCompleteEvent; run this async
|
+ // PacketUtils.ensureRunningOnSameThread(packet, this, this.player.serverLevel()); // Paper - AsyncTabCompleteEvent; run this async
|
||||||
// CraftBukkit start
|
// CraftBukkit start
|
||||||
if (this.chatSpamTickCount.addAndGet(1) > 500 && !this.server.getPlayerList().isOp(this.player.getGameProfile())) {
|
if (this.chatSpamTickCount.addAndGet(1) > 500 && !this.server.getPlayerList().isOp(this.player.getGameProfile())) {
|
||||||
- this.disconnect(Component.translatable("disconnect.spam"));
|
this.disconnect(Component.translatable("disconnect.spam"));
|
||||||
+ server.scheduleOnMain(() -> this.disconnect(Component.translatable("disconnect.spam"))); // Paper - AsyncTabCompleteEvent
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// CraftBukkit end
|
// CraftBukkit end
|
||||||
+ // Paper start - AsyncTabCompleteEvent
|
+ // Paper start - AsyncTabCompleteEvent
|
||||||
+ TAB_COMPLETE_EXECUTOR.execute(() -> {
|
+ TAB_COMPLETE_EXECUTOR.execute(() -> this.handleCustomCommandSuggestions0(packet));
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ private void handleCustomCommandSuggestions0(final ServerboundCommandSuggestionPacket packet) {
|
||||||
StringReader stringreader = new StringReader(packet.getCommand());
|
StringReader stringreader = new StringReader(packet.getCommand());
|
||||||
|
|
||||||
if (stringreader.canRead() && stringreader.peek() == '/') {
|
if (stringreader.canRead() && stringreader.peek() == '/') {
|
||||||
stringreader.skip();
|
stringreader.skip();
|
||||||
}
|
}
|
||||||
-
|
|
||||||
- ParseResults<CommandSourceStack> parseresults = this.server.getCommands().getDispatcher().parse(stringreader, this.player.createCommandSourceStack());
|
+ final com.destroystokyo.paper.event.server.AsyncTabCompleteEvent event = new com.destroystokyo.paper.event.server.AsyncTabCompleteEvent(this.getCraftPlayer(), packet.getCommand(), true, null);
|
||||||
-
|
|
||||||
- this.server.getCommands().getDispatcher().getCompletionSuggestions(parseresults).thenAccept((suggestions) -> {
|
|
||||||
- if (suggestions.isEmpty()) return; // CraftBukkit - don't send through empty suggestions - prevents [<args>] from showing for plugins with nothing more to offer
|
|
||||||
- this.send(new ClientboundCommandSuggestionsPacket(packet.getId(), suggestions));
|
|
||||||
+ final String command = packet.getCommand();
|
|
||||||
+ final com.destroystokyo.paper.event.server.AsyncTabCompleteEvent event = new com.destroystokyo.paper.event.server.AsyncTabCompleteEvent(this.getCraftPlayer(), command, true, null);
|
|
||||||
+ event.callEvent();
|
+ event.callEvent();
|
||||||
+ final java.util.List<com.destroystokyo.paper.event.server.AsyncTabCompleteEvent.Completion> completions = event.isCancelled() ? com.google.common.collect.ImmutableList.of() : event.completions();
|
+ final List<com.destroystokyo.paper.event.server.AsyncTabCompleteEvent.Completion> completions = event.isCancelled() ? com.google.common.collect.ImmutableList.of() : event.completions();
|
||||||
+ // If the event isn't handled, we can assume that we have no completions, and so we'll ask the server
|
+ // If the event isn't handled, we can assume that we have no completions, and so we'll ask the server
|
||||||
+ if (!event.isHandled()) {
|
+ if (!event.isHandled()) {
|
||||||
+ if (!event.isCancelled()) {
|
+ if (event.isCancelled()) {
|
||||||
+
|
+ return;
|
||||||
+ this.server.scheduleOnMain(() -> { // This needs to be on main
|
|
||||||
+ ParseResults<CommandSourceStack> parseresults = this.server.getCommands().getDispatcher().parse(stringreader, this.player.createCommandSourceStack());
|
|
||||||
+
|
|
||||||
+ this.server.getCommands().getDispatcher().getCompletionSuggestions(parseresults).thenAccept((suggestions) -> {
|
|
||||||
+ if (suggestions.isEmpty()) return; // CraftBukkit - don't send through empty suggestions - prevents [<args>] from showing for plugins with nothing more to offer
|
|
||||||
+ this.connection.send(new ClientboundCommandSuggestionsPacket(packet.getId(), suggestions));
|
|
||||||
+ });
|
|
||||||
+ });
|
|
||||||
+ }
|
+ }
|
||||||
|
+
|
||||||
|
+ // This needs to be on main
|
||||||
|
+ this.server.scheduleOnMain(() -> this.sendServerSuggestions(packet, stringreader));
|
||||||
+ } else if (!completions.isEmpty()) {
|
+ } else if (!completions.isEmpty()) {
|
||||||
+ final com.mojang.brigadier.suggestion.SuggestionsBuilder builder0 = new com.mojang.brigadier.suggestion.SuggestionsBuilder(command, stringreader.getTotalLength());
|
+ final com.mojang.brigadier.suggestion.SuggestionsBuilder builder0 = new com.mojang.brigadier.suggestion.SuggestionsBuilder(packet.getCommand(), stringreader.getTotalLength());
|
||||||
+ final com.mojang.brigadier.suggestion.SuggestionsBuilder builder = builder0.createOffset(builder0.getInput().lastIndexOf(' ') + 1);
|
+ final com.mojang.brigadier.suggestion.SuggestionsBuilder builder = builder0.createOffset(builder0.getInput().lastIndexOf(' ') + 1);
|
||||||
+ completions.forEach(completion -> {
|
+ for (final com.destroystokyo.paper.event.server.AsyncTabCompleteEvent.Completion completion : completions) {
|
||||||
+ final Integer intSuggestion = com.google.common.primitives.Ints.tryParse(completion.suggestion());
|
+ final Integer intSuggestion = com.google.common.primitives.Ints.tryParse(completion.suggestion());
|
||||||
+ if (intSuggestion != null) {
|
+ if (intSuggestion != null) {
|
||||||
+ builder.suggest(intSuggestion, PaperAdventure.asVanilla(completion.tooltip()));
|
+ builder.suggest(intSuggestion, PaperAdventure.asVanilla(completion.tooltip()));
|
||||||
+ } else {
|
+ } else {
|
||||||
+ builder.suggest(completion.suggestion(), PaperAdventure.asVanilla(completion.tooltip()));
|
+ builder.suggest(completion.suggestion(), PaperAdventure.asVanilla(completion.tooltip()));
|
||||||
+ }
|
+ }
|
||||||
+ });
|
|
||||||
+ player.connection.send(new ClientboundCommandSuggestionsPacket(packet.getId(), builder.buildFuture().join()));
|
|
||||||
+ }
|
+ }
|
||||||
});
|
+ this.connection.send(new ClientboundCommandSuggestionsPacket(packet.getId(), builder.buildFuture().join()));
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ private void sendServerSuggestions(final ServerboundCommandSuggestionPacket packet, final StringReader stringreader) {
|
||||||
+ // Paper end - AsyncTabCompleteEvent
|
+ // Paper end - AsyncTabCompleteEvent
|
||||||
}
|
ParseResults<CommandSourceStack> parseresults = this.server.getCommands().getDispatcher().parse(stringreader, this.player.createCommandSourceStack());
|
||||||
|
|
||||||
@Override
|
this.server.getCommands().getDispatcher().getCompletionSuggestions(parseresults).thenAccept((suggestions) -> {
|
||||||
diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
|
diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
|
||||||
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
|
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
|
||||||
--- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java
|
--- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java
|
||||||
|
|||||||
@@ -47,6 +47,6 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
|
|||||||
// CraftBukkit start
|
// CraftBukkit start
|
||||||
- if (this.chatSpamTickCount.addAndGet(1) > 500 && !this.server.getPlayerList().isOp(this.player.getGameProfile())) {
|
- if (this.chatSpamTickCount.addAndGet(1) > 500 && !this.server.getPlayerList().isOp(this.player.getGameProfile())) {
|
||||||
+ if (this.chatSpamTickCount.addAndGet(io.papermc.paper.configuration.GlobalConfiguration.get().spamLimiter.tabSpamIncrement) > io.papermc.paper.configuration.GlobalConfiguration.get().spamLimiter.tabSpamLimit && !this.server.getPlayerList().isOp(this.player.getGameProfile())) { // Paper - configurable tab spam limits
|
+ if (this.chatSpamTickCount.addAndGet(io.papermc.paper.configuration.GlobalConfiguration.get().spamLimiter.tabSpamIncrement) > io.papermc.paper.configuration.GlobalConfiguration.get().spamLimiter.tabSpamLimit && !this.server.getPlayerList().isOp(this.player.getGameProfile())) { // Paper - configurable tab spam limits
|
||||||
server.scheduleOnMain(() -> this.disconnect(Component.translatable("disconnect.spam"))); // Paper - AsyncTabCompleteEvent
|
this.disconnect(Component.translatable("disconnect.spam"));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -134,36 +134,38 @@ diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListener
|
|||||||
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
|
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
|
||||||
--- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
|
--- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
|
||||||
+++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
|
+++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
|
||||||
|
@@ -0,0 +0,0 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
|
||||||
|
builder.suggest(completion.suggestion(), PaperAdventure.asVanilla(completion.tooltip()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
- this.connection.send(new ClientboundCommandSuggestionsPacket(packet.getId(), builder.buildFuture().join()));
|
||||||
|
+ // Paper start - Brigadier API
|
||||||
|
+ com.mojang.brigadier.suggestion.Suggestions suggestions = builder.buildFuture().join();
|
||||||
|
+ com.destroystokyo.paper.event.brigadier.AsyncPlayerSendSuggestionsEvent suggestEvent = new com.destroystokyo.paper.event.brigadier.AsyncPlayerSendSuggestionsEvent(this.getCraftPlayer(), suggestions, packet.getCommand());
|
||||||
|
+ suggestEvent.setCancelled(suggestions.isEmpty());
|
||||||
|
+ if (suggestEvent.callEvent()) {
|
||||||
|
+ this.connection.send(new ClientboundCommandSuggestionsPacket(packet.getId(), suggestEvent.getSuggestions()));
|
||||||
|
+ }
|
||||||
|
+ // Paper end - Brigadier API
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +0,0 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
|
@@ -0,0 +0,0 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
|
||||||
ParseResults<CommandSourceStack> parseresults = this.server.getCommands().getDispatcher().parse(stringreader, this.player.createCommandSourceStack());
|
ParseResults<CommandSourceStack> parseresults = this.server.getCommands().getDispatcher().parse(stringreader, this.player.createCommandSourceStack());
|
||||||
|
|
||||||
this.server.getCommands().getDispatcher().getCompletionSuggestions(parseresults).thenAccept((suggestions) -> {
|
this.server.getCommands().getDispatcher().getCompletionSuggestions(parseresults).thenAccept((suggestions) -> {
|
||||||
- if (suggestions.isEmpty()) return; // CraftBukkit - don't send through empty suggestions - prevents [<args>] from showing for plugins with nothing more to offer
|
- if (suggestions.isEmpty()) return; // CraftBukkit - don't send through empty suggestions - prevents [<args>] from showing for plugins with nothing more to offer
|
||||||
- this.connection.send(new ClientboundCommandSuggestionsPacket(packet.getId(), suggestions));
|
- this.send(new ClientboundCommandSuggestionsPacket(packet.getId(), suggestions));
|
||||||
+ // Paper start - Brigadier API
|
+ // Paper start - Brigadier API
|
||||||
+ com.destroystokyo.paper.event.brigadier.AsyncPlayerSendSuggestionsEvent suggestEvent = new com.destroystokyo.paper.event.brigadier.AsyncPlayerSendSuggestionsEvent(this.getCraftPlayer(), suggestions, command);
|
+ com.destroystokyo.paper.event.brigadier.AsyncPlayerSendSuggestionsEvent suggestEvent = new com.destroystokyo.paper.event.brigadier.AsyncPlayerSendSuggestionsEvent(this.getCraftPlayer(), suggestions, packet.getCommand());
|
||||||
+ suggestEvent.setCancelled(suggestions.isEmpty());
|
+ suggestEvent.setCancelled(suggestions.isEmpty());
|
||||||
+ if (!suggestEvent.callEvent()) return;
|
+ if (suggestEvent.callEvent()) {
|
||||||
+ this.connection.send(new ClientboundCommandSuggestionsPacket(packet.getId(), suggestEvent.getSuggestions()));
|
+ this.send(new ClientboundCommandSuggestionsPacket(packet.getId(), suggestEvent.getSuggestions()));
|
||||||
|
+ }
|
||||||
+ // Paper end - Brigadier API
|
+ // Paper end - Brigadier API
|
||||||
});
|
});
|
||||||
});
|
|
||||||
}
|
}
|
||||||
@@ -0,0 +0,0 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
|
|
||||||
builder.suggest(completion.suggestion(), PaperAdventure.asVanilla(completion.tooltip()));
|
|
||||||
}
|
|
||||||
});
|
|
||||||
- player.connection.send(new ClientboundCommandSuggestionsPacket(packet.getId(), builder.buildFuture().join()));
|
|
||||||
+ // Paper start - Brigadier API
|
|
||||||
+ com.mojang.brigadier.suggestion.Suggestions suggestions = builder.buildFuture().join();
|
|
||||||
+ com.destroystokyo.paper.event.brigadier.AsyncPlayerSendSuggestionsEvent suggestEvent = new com.destroystokyo.paper.event.brigadier.AsyncPlayerSendSuggestionsEvent(this.getCraftPlayer(), suggestions, command);
|
|
||||||
+ suggestEvent.setCancelled(suggestions.isEmpty());
|
|
||||||
+ if (!suggestEvent.callEvent()) return;
|
|
||||||
+ this.connection.send(new ClientboundCommandSuggestionsPacket(packet.getId(), suggestEvent.getSuggestions()));
|
|
||||||
+ // Paper end - Brigadier API
|
|
||||||
}
|
|
||||||
});
|
|
||||||
// Paper end - AsyncTabCompleteEvent
|
|
||||||
diff --git a/src/main/java/org/bukkit/craftbukkit/command/BukkitCommandWrapper.java b/src/main/java/org/bukkit/craftbukkit/command/BukkitCommandWrapper.java
|
diff --git a/src/main/java/org/bukkit/craftbukkit/command/BukkitCommandWrapper.java b/src/main/java/org/bukkit/craftbukkit/command/BukkitCommandWrapper.java
|
||||||
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
|
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
|
||||||
--- a/src/main/java/org/bukkit/craftbukkit/command/BukkitCommandWrapper.java
|
--- a/src/main/java/org/bukkit/craftbukkit/command/BukkitCommandWrapper.java
|
||||||
|
|||||||
@@ -19,5 +19,5 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
|
|||||||
+ }
|
+ }
|
||||||
+ // Paper end - Don't suggest if tab-complete is disabled
|
+ // Paper end - Don't suggest if tab-complete is disabled
|
||||||
// Paper start - AsyncTabCompleteEvent
|
// Paper start - AsyncTabCompleteEvent
|
||||||
TAB_COMPLETE_EXECUTOR.execute(() -> {
|
TAB_COMPLETE_EXECUTOR.execute(() -> this.handleCustomCommandSuggestions0(packet));
|
||||||
StringReader stringreader = new StringReader(packet.getCommand());
|
}
|
||||||
|
|||||||
@@ -24,5 +24,5 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
|
|||||||
+ }
|
+ }
|
||||||
+ // Paper end - Don't tab-complete namespaced commands if send-namespaced is false
|
+ // Paper end - Don't tab-complete namespaced commands if send-namespaced is false
|
||||||
// Paper start - Brigadier API
|
// Paper start - Brigadier API
|
||||||
com.destroystokyo.paper.event.brigadier.AsyncPlayerSendSuggestionsEvent suggestEvent = new com.destroystokyo.paper.event.brigadier.AsyncPlayerSendSuggestionsEvent(this.getCraftPlayer(), suggestions, command);
|
com.destroystokyo.paper.event.brigadier.AsyncPlayerSendSuggestionsEvent suggestEvent = new com.destroystokyo.paper.event.brigadier.AsyncPlayerSendSuggestionsEvent(this.getCraftPlayer(), suggestions, packet.getCommand());
|
||||||
suggestEvent.setCancelled(suggestions.isEmpty());
|
suggestEvent.setCancelled(suggestions.isEmpty());
|
||||||
|
|||||||
143
patches/server/Improve-tag-parser-handling.patch
Normal file
143
patches/server/Improve-tag-parser-handling.patch
Normal file
@@ -0,0 +1,143 @@
|
|||||||
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Nassim Jahnke <nassim@njahnke.dev>
|
||||||
|
Date: Mon, 5 Feb 2024 11:54:04 +0100
|
||||||
|
Subject: [PATCH] Improve tag parser handling
|
||||||
|
|
||||||
|
|
||||||
|
diff --git a/src/main/java/com/mojang/brigadier/CommandDispatcher.java b/src/main/java/com/mojang/brigadier/CommandDispatcher.java
|
||||||
|
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
|
||||||
|
--- a/src/main/java/com/mojang/brigadier/CommandDispatcher.java
|
||||||
|
+++ b/src/main/java/com/mojang/brigadier/CommandDispatcher.java
|
||||||
|
@@ -0,0 +0,0 @@ public class CommandDispatcher<S> {
|
||||||
|
try {
|
||||||
|
try {
|
||||||
|
child.parse(reader, context);
|
||||||
|
+ // Paper start - Handle non-reoverable exceptions; Rethrow NbtAccounterException so it can be caught properly and immediately
|
||||||
|
+ } catch (final net.minecraft.nbt.NbtAccounterException e) {
|
||||||
|
+ throw e;
|
||||||
|
+ // Paper end - Handle non-reoverable exceptions
|
||||||
|
} catch (final RuntimeException ex) {
|
||||||
|
throw CommandSyntaxException.BUILT_IN_EXCEPTIONS.dispatcherParseException().createWithContext(reader, ex.getMessage());
|
||||||
|
}
|
||||||
|
diff --git a/src/main/java/net/minecraft/nbt/TagParser.java b/src/main/java/net/minecraft/nbt/TagParser.java
|
||||||
|
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
|
||||||
|
--- a/src/main/java/net/minecraft/nbt/TagParser.java
|
||||||
|
+++ b/src/main/java/net/minecraft/nbt/TagParser.java
|
||||||
|
@@ -0,0 +0,0 @@ public class TagParser {
|
||||||
|
}
|
||||||
|
}, CompoundTag::toString);
|
||||||
|
private final StringReader reader;
|
||||||
|
+ private int depth; // Paper
|
||||||
|
|
||||||
|
public static CompoundTag parseTag(String string) throws CommandSyntaxException {
|
||||||
|
return (new TagParser(new StringReader(string))).readSingleStruct();
|
||||||
|
@@ -0,0 +0,0 @@ public class TagParser {
|
||||||
|
|
||||||
|
public CompoundTag readStruct() throws CommandSyntaxException {
|
||||||
|
this.expect('{');
|
||||||
|
+ this.increaseDepth(); // Paper
|
||||||
|
CompoundTag compoundTag = new CompoundTag();
|
||||||
|
this.reader.skipWhitespace();
|
||||||
|
|
||||||
|
@@ -0,0 +0,0 @@ public class TagParser {
|
||||||
|
}
|
||||||
|
|
||||||
|
this.expect('}');
|
||||||
|
+ this.depth--; // Paper
|
||||||
|
return compoundTag;
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -0,0 +0,0 @@ public class TagParser {
|
||||||
|
if (!this.reader.canRead()) {
|
||||||
|
throw ERROR_EXPECTED_VALUE.createWithContext(this.reader);
|
||||||
|
} else {
|
||||||
|
+ this.increaseDepth(); // Paper
|
||||||
|
ListTag listTag = new ListTag();
|
||||||
|
TagType<?> tagType = null;
|
||||||
|
|
||||||
|
@@ -0,0 +0,0 @@ public class TagParser {
|
||||||
|
}
|
||||||
|
|
||||||
|
this.expect(']');
|
||||||
|
+ this.depth--; // Paper
|
||||||
|
return listTag;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@@ -0,0 +0,0 @@ public class TagParser {
|
||||||
|
}
|
||||||
|
|
||||||
|
if (typeReader == ByteTag.TYPE) {
|
||||||
|
- list.add((T)((NumericTag)tag).getAsByte());
|
||||||
|
+ list.add((T)((NumericTag)tag).getAsNumber()); // Paper - decompile fix
|
||||||
|
} else if (typeReader == LongTag.TYPE) {
|
||||||
|
- list.add((T)((NumericTag)tag).getAsLong());
|
||||||
|
+ list.add((T)((NumericTag)tag).getAsNumber()); // Paper - decompile fix
|
||||||
|
} else {
|
||||||
|
- list.add((T)((NumericTag)tag).getAsInt());
|
||||||
|
+ list.add((T)((NumericTag)tag).getAsNumber()); // Paper - decompile fix
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.hasElementSeparator()) {
|
||||||
|
@@ -0,0 +0,0 @@ public class TagParser {
|
||||||
|
this.reader.skipWhitespace();
|
||||||
|
this.reader.expect(c);
|
||||||
|
}
|
||||||
|
+
|
||||||
|
+ private void increaseDepth() {
|
||||||
|
+ this.depth++;
|
||||||
|
+ if (this.depth > 512) {
|
||||||
|
+ throw new net.minecraft.nbt.NbtAccounterException("NBT tag is too complex, depth > 512");
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
diff --git a/src/main/java/net/minecraft/network/protocol/game/ServerboundCommandSuggestionPacket.java b/src/main/java/net/minecraft/network/protocol/game/ServerboundCommandSuggestionPacket.java
|
||||||
|
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
|
||||||
|
--- a/src/main/java/net/minecraft/network/protocol/game/ServerboundCommandSuggestionPacket.java
|
||||||
|
+++ b/src/main/java/net/minecraft/network/protocol/game/ServerboundCommandSuggestionPacket.java
|
||||||
|
@@ -0,0 +0,0 @@ public class ServerboundCommandSuggestionPacket implements Packet<ServerGamePack
|
||||||
|
|
||||||
|
public ServerboundCommandSuggestionPacket(FriendlyByteBuf buf) {
|
||||||
|
this.id = buf.readVarInt();
|
||||||
|
- this.command = buf.readUtf(32500);
|
||||||
|
+ this.command = buf.readUtf(2048); // Paper
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
|
||||||
|
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
|
||||||
|
--- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
|
||||||
|
+++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
|
||||||
|
@@ -0,0 +0,0 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// Paper end - Don't suggest if tab-complete is disabled
|
||||||
|
+ // Paper start
|
||||||
|
+ final int index;
|
||||||
|
+ if (packet.getCommand().length() > 64 && ((index = packet.getCommand().indexOf(' ')) == -1 || index >= 64)) {
|
||||||
|
+ this.disconnect(Component.translatable("disconnect.spam"), org.bukkit.event.player.PlayerKickEvent.Cause.SPAM);
|
||||||
|
+ return;
|
||||||
|
+ }
|
||||||
|
+ // Paper end
|
||||||
|
// Paper start - AsyncTabCompleteEvent
|
||||||
|
TAB_COMPLETE_EXECUTOR.execute(() -> this.handleCustomCommandSuggestions0(packet));
|
||||||
|
}
|
||||||
|
@@ -0,0 +0,0 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
|
||||||
|
|
||||||
|
private void sendServerSuggestions(final ServerboundCommandSuggestionPacket packet, final StringReader stringreader) {
|
||||||
|
// Paper end - AsyncTabCompleteEvent
|
||||||
|
- ParseResults<CommandSourceStack> parseresults = this.server.getCommands().getDispatcher().parse(stringreader, this.player.createCommandSourceStack());
|
||||||
|
+ // Paper start - Handle non-reoverable exceptions
|
||||||
|
+ ParseResults<CommandSourceStack> parseresults;
|
||||||
|
+ try {
|
||||||
|
+ parseresults = this.server.getCommands().getDispatcher().parse(stringreader, this.player.createCommandSourceStack());
|
||||||
|
+ } catch (final Throwable e) { // This is fine:tm:
|
||||||
|
+ if (LOGGER.isDebugEnabled()) {
|
||||||
|
+ LOGGER.error("Exception parsing command", e);
|
||||||
|
+ }
|
||||||
|
+ this.disconnect(Component.translatable("disconnect.spam"), org.bukkit.event.player.PlayerKickEvent.Cause.SPAM);
|
||||||
|
+ return;
|
||||||
|
+ }
|
||||||
|
+ // Paper end - Handle non-reoverable exceptions
|
||||||
|
|
||||||
|
this.server.getCommands().getDispatcher().getCompletionSuggestions(parseresults).thenAccept((suggestions) -> {
|
||||||
|
// Paper start - Don't tab-complete namespaced commands if send-namespaced is false
|
||||||
@@ -15506,19 +15506,6 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
|
|||||||
+ }
|
+ }
|
||||||
+ }
|
+ }
|
||||||
+}
|
+}
|
||||||
diff --git a/src/main/java/net/minecraft/network/protocol/game/ServerboundCommandSuggestionPacket.java b/src/main/java/net/minecraft/network/protocol/game/ServerboundCommandSuggestionPacket.java
|
|
||||||
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
|
|
||||||
--- a/src/main/java/net/minecraft/network/protocol/game/ServerboundCommandSuggestionPacket.java
|
|
||||||
+++ b/src/main/java/net/minecraft/network/protocol/game/ServerboundCommandSuggestionPacket.java
|
|
||||||
@@ -0,0 +0,0 @@ public class ServerboundCommandSuggestionPacket implements Packet<ServerGamePack
|
|
||||||
|
|
||||||
public ServerboundCommandSuggestionPacket(FriendlyByteBuf buf) {
|
|
||||||
this.id = buf.readVarInt();
|
|
||||||
- this.command = buf.readUtf(32500);
|
|
||||||
+ this.command = buf.readUtf(2048);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
diff --git a/src/main/java/net/minecraft/server/Main.java b/src/main/java/net/minecraft/server/Main.java
|
diff --git a/src/main/java/net/minecraft/server/Main.java b/src/main/java/net/minecraft/server/Main.java
|
||||||
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
|
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
|
||||||
--- a/src/main/java/net/minecraft/server/Main.java
|
--- a/src/main/java/net/minecraft/server/Main.java
|
||||||
@@ -19235,24 +19222,6 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
|
|||||||
--this.unacknowledgedBatches;
|
--this.unacknowledgedBatches;
|
||||||
this.desiredChunksPerTick = Double.isNaN((double)desiredBatchSize) ? 0.01F : Mth.clamp(desiredBatchSize, 0.01F, 64.0F);
|
this.desiredChunksPerTick = Double.isNaN((double)desiredBatchSize) ? 0.01F : Mth.clamp(desiredBatchSize, 0.01F, 64.0F);
|
||||||
if (this.unacknowledgedBatches == 0) {
|
if (this.unacknowledgedBatches == 0) {
|
||||||
diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
|
|
||||||
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
|
|
||||||
--- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
|
|
||||||
+++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
|
|
||||||
@@ -0,0 +0,0 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
// Paper end - Don't suggest if tab-complete is disabled
|
|
||||||
+ // Paper start - rewrite chunk system
|
|
||||||
+ int index;
|
|
||||||
+ if (packet.getCommand().length() > 64 && ((index = packet.getCommand().indexOf(' ')) == -1 || index >= 64)) {
|
|
||||||
+ server.scheduleOnMain(() -> this.disconnect(Component.translatable("disconnect.spam"), org.bukkit.event.player.PlayerKickEvent.Cause.SPAM));
|
|
||||||
+ return;
|
|
||||||
+ }
|
|
||||||
+ // Paper end - rewrite chunk system
|
|
||||||
// Paper start - AsyncTabCompleteEvent
|
|
||||||
TAB_COMPLETE_EXECUTOR.execute(() -> {
|
|
||||||
StringReader stringreader = new StringReader(packet.getCommand());
|
|
||||||
diff --git a/src/main/java/net/minecraft/server/players/PlayerList.java b/src/main/java/net/minecraft/server/players/PlayerList.java
|
diff --git a/src/main/java/net/minecraft/server/players/PlayerList.java b/src/main/java/net/minecraft/server/players/PlayerList.java
|
||||||
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
|
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
|
||||||
--- a/src/main/java/net/minecraft/server/players/PlayerList.java
|
--- a/src/main/java/net/minecraft/server/players/PlayerList.java
|
||||||
|
|||||||
Reference in New Issue
Block a user