Yatopia/patches/server/0032-Optimize-whitelist-command-for-multiple-additions-re.patch
Simon Gardling 22be9f2d6f
Upstream (#502)
* Updated Upstream and Sidestream(s) (Paper/Purpur/Origami)

Upstream/An Sidestream has released updates that appears to apply and compile correctly
This update has NOT been tested by YatopiaMC and as with ANY update, please do your own testing.

Paper Changes:
2299159bb Add option to fix items merging through blocks (#5334)
d8c20ddc7 Fix PlayerBucketEmptyEvent result itemstack (#5698)
ceb3762fb Add PufferFishStateChangeEvent (#5606)
cd4defec0 [CI-SKIP] Update version checker to use V2 downloads API (#5728)
b9f2a673d Limit item frame cursors on maps (#5730)
81a537c1f Add PlayerKickEvent causes (#5648)
b7976b956 Add More Lidded Block API (#5707)

Purpur Changes:
b88aef3a Fix Paper#4748 - Shulkerbox allow oversized stacks
9fec1bae Updated Upstream (Paper)
2aacc766 Update Toothpick to 1.1.0-SNAPSHOT
a08d7470 Configurable anvil cumulative cost (#352)

Origami Changes:
3b8adab Fix importing of classes not working if their directory doesn't exist

* Updated Upstream and Sidestream(s) (Paper/Tuinity/Purpur/Empirecraft/Origami)

Upstream/An Sidestream has released updates that appears to apply and compile correctly
This update has NOT been tested by YatopiaMC and as with ANY update, please do your own testing.

Paper Changes:
525d0e3d3 fix beacon activate/deactivate events (#5646)
e403d6aaf [Auto] Updated Upstream (CraftBukkit)
6bcd8b57c Updated Upstream (CraftBukkit) (#5742)
501cc9448 Reset villager inventory on cancelled pickup event (#5738)
3f72a549b Exit with non-zero exit code when killed by watchdog (#5732)
a8d7ad099 Updated Upstream (Bukkit/CraftBukkit) (#5735)

Tuinity Changes:
e9c8348 Revert entity ticking chunk map for tracker

Purpur Changes:
687936be Updated Upstream (Paper)
4c2d7e56 Fix advancement triggers on entity death
49a0fb90 Fix oversized shulker box dupe
e92d259e Fix raid captains not giving voluntary exile advancement
a97fdc48 Config to broadcast the death message to the affected player (#363)
9bf8e165 Add burn in daylight API for LivingEntity (#331)
96460068 Fix dupe bug caused by SPIGOT-6452
2618c24f Revert "allow disabling offline mode message on an ONLINE MODE proxy"
aa79fa5c allow disabling offline mode message on an ONLINE MODE proxy
830141ca Bee can work when raining or at night (#365)
ae6ca468 Updated Upstream (Paper)
d99cc6e8 [ci-skip] Add better issue templates (#360)

Empirecraft Changes:
12009c31 Updated Paper
5305540d Updated Paper
1043bd94 Revert "Call EntityPickupItemEvent for villagers" CB commit
820b9bdf Updated Paper

Origami Changes:
64fba4f Fix importing of classes not working if their directory doesn't exist
3b8adab Fix importing of classes not working if their directory doesn't exist

* rebuild Patches
2021-05-29 19:17:00 -04:00

199 lines
10 KiB
Diff

From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Ivan Pekov <ivan@mrivanplays.com>
Date: Tue, 22 Sep 2020 10:09:08 +0300
Subject: [PATCH] Optimize whitelist command for multiple additions / removals
Previously the whitelist command was adding players 1 by 1. This caused massive overload
when you were adding multiple players due to the fact it saves every time a player was
added.
These changes aim to reduce that load whenever you are using the /whitelist command.
diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java
index 08d4a2ef671ff750305df9d4c0cac0f2e9c89006..c50e6c9199e6577a1a1a2b09f53b939e08589501 100644
--- a/src/main/java/net/minecraft/server/MinecraftServer.java
+++ b/src/main/java/net/minecraft/server/MinecraftServer.java
@@ -2121,6 +2121,7 @@ public abstract class MinecraftServer extends IAsyncTaskHandlerReentrant<TickTas
return new DataPackConfiguration(list, list1);
}
+ public final void kickNotWhitelisted(CommandListenerWrapper sender) { a(sender); } // Yatopia - OBFHELPER
public void a(CommandListenerWrapper commandlistenerwrapper) {
if (this.aN()) {
PlayerList playerlist = commandlistenerwrapper.getServer().getPlayerList();
diff --git a/src/main/java/net/minecraft/server/commands/CommandWhitelist.java b/src/main/java/net/minecraft/server/commands/CommandWhitelist.java
index cc256c6c6b39a1c16859242207042cb9c22098ed..dadec8d22341f955ddce91c3a36b111eaf36335c 100644
--- a/src/main/java/net/minecraft/server/commands/CommandWhitelist.java
+++ b/src/main/java/net/minecraft/server/commands/CommandWhitelist.java
@@ -21,8 +21,8 @@ public class CommandWhitelist {
private static final SimpleCommandExceptionType a = new SimpleCommandExceptionType(new ChatMessage("commands.whitelist.alreadyOn"));
private static final SimpleCommandExceptionType b = new SimpleCommandExceptionType(new ChatMessage("commands.whitelist.alreadyOff"));
- private static final SimpleCommandExceptionType c = new SimpleCommandExceptionType(new ChatMessage("commands.whitelist.add.failed"));
- private static final SimpleCommandExceptionType d = new SimpleCommandExceptionType(new ChatMessage("commands.whitelist.remove.failed"));
+ private static final SimpleCommandExceptionType c = new SimpleCommandExceptionType(new ChatMessage("commands.whitelist.add.failed")); private static final SimpleCommandExceptionType ADD_FAILED = c; // Yatopia - OBFHELPER
+ private static final SimpleCommandExceptionType d = new SimpleCommandExceptionType(new ChatMessage("commands.whitelist.remove.failed")); private static final SimpleCommandExceptionType REMOVE_FAILED = d; // Yatopia - OBFHELPER
public static void a(CommandDispatcher<CommandListenerWrapper> commanddispatcher) {
commanddispatcher.register((LiteralArgumentBuilder) ((LiteralArgumentBuilder) ((LiteralArgumentBuilder) ((LiteralArgumentBuilder) ((LiteralArgumentBuilder) ((LiteralArgumentBuilder) ((LiteralArgumentBuilder) net.minecraft.commands.CommandDispatcher.a("whitelist").requires((commandlistenerwrapper) -> {
@@ -36,11 +36,25 @@ public class CommandWhitelist {
}))).then(net.minecraft.commands.CommandDispatcher.a("add").then(net.minecraft.commands.CommandDispatcher.a("targets", (ArgumentType) ArgumentProfile.a()).suggests((commandcontext, suggestionsbuilder) -> {
PlayerList playerlist = ((CommandListenerWrapper) commandcontext.getSource()).getServer().getPlayerList();
+ // Yatopia start - optimize this
+ /*
return ICompletionProvider.b(playerlist.getPlayers().stream().filter((entityplayer) -> {
return !playerlist.getWhitelist().isWhitelisted(entityplayer.getProfile());
}).map((entityplayer) -> {
return entityplayer.getProfile().getName();
}), suggestionsbuilder);
+ */
+ for (net.minecraft.server.level.EntityPlayer player : playerlist.getPlayers()) {
+ if (!playerlist.getWhitelist().isWhitelisted(player.getProfile())) {
+ String remaining = suggestionsbuilder.getRemainingLowercase();
+ String playerName = player.getName();
+ if (ICompletionProvider.a(remaining, player.getNameLowercase())) {
+ suggestionsbuilder.suggest(playerName);
+ }
+ }
+ }
+ return suggestionsbuilder.buildFuture();
+ // Yatopia end
}).executes((commandcontext) -> {
return a((CommandListenerWrapper) commandcontext.getSource(), ArgumentProfile.a(commandcontext, "targets"));
})))).then(net.minecraft.commands.CommandDispatcher.a("remove").then(net.minecraft.commands.CommandDispatcher.a("targets", (ArgumentType) ArgumentProfile.a()).suggests((commandcontext, suggestionsbuilder) -> {
@@ -61,6 +75,8 @@ public class CommandWhitelist {
private static int a(CommandListenerWrapper commandlistenerwrapper, Collection<GameProfile> collection) throws CommandSyntaxException {
WhiteList whitelist = commandlistenerwrapper.getServer().getPlayerList().getWhitelist();
+ // Yatopia start - rewrite this
+ /*
int i = 0;
Iterator iterator = collection.iterator();
@@ -81,10 +97,27 @@ public class CommandWhitelist {
} else {
return i;
}
+ */
+ java.util.List<WhiteListEntry> toAdd = new java.util.ArrayList<>();
+ for (GameProfile profile : collection) {
+ if (!whitelist.isWhitelisted(profile)) {
+ toAdd.add(new WhiteListEntry(profile));
+ commandlistenerwrapper.sendMessage(new ChatMessage("commands.whitelist.add.success", ChatComponentUtils.a(profile)), true);
+ }
+ }
+ if (toAdd.isEmpty()) {
+ throw CommandWhitelist.ADD_FAILED.create();
+ } else {
+ whitelist.addAll(toAdd);
+ return toAdd.size();
+ }
+ // Yatopia end
}
private static int b(CommandListenerWrapper commandlistenerwrapper, Collection<GameProfile> collection) throws CommandSyntaxException {
WhiteList whitelist = commandlistenerwrapper.getServer().getPlayerList().getWhitelist();
+ // Yatopia start - rewrite this
+ /*
int i = 0;
Iterator iterator = collection.iterator();
@@ -106,6 +139,22 @@ public class CommandWhitelist {
commandlistenerwrapper.getServer().a(commandlistenerwrapper);
return i;
}
+ */
+ java.util.List<net.minecraft.server.players.JsonListEntry<GameProfile>> toRemove = new java.util.ArrayList<>();
+ for (GameProfile profile : collection) {
+ if (whitelist.isWhitelisted(profile)) {
+ toRemove.add(new WhiteListEntry(profile));
+ commandlistenerwrapper.sendMessage(new ChatMessage("commands.whitelist.remove.success", ChatComponentUtils.a(profile)), true);
+ }
+ }
+ if (toRemove.isEmpty()) {
+ throw CommandWhitelist.REMOVE_FAILED.create();
+ } else {
+ whitelist.removeAll(toRemove);
+ commandlistenerwrapper.getServer().kickNotWhitelisted(commandlistenerwrapper);
+ return toRemove.size();
+ }
+ // Yatopia end
}
private static int b(CommandListenerWrapper commandlistenerwrapper) throws CommandSyntaxException {
diff --git a/src/main/java/net/minecraft/server/players/JsonList.java b/src/main/java/net/minecraft/server/players/JsonList.java
index 96fbb1a3d216302aa937e07bf88fdb19c6ccc764..0521fa09488ef501cc5bcdf6c3134ac920a2e94a 100644
--- a/src/main/java/net/minecraft/server/players/JsonList.java
+++ b/src/main/java/net/minecraft/server/players/JsonList.java
@@ -66,6 +66,20 @@ public abstract class JsonList<K, V extends JsonListEntry<K>> {
}
+ // Yatopia start
+ public void addAll(Iterable<V> values) {
+ for (V value : values) {
+ d.put(getMappingKey(value.getKey()), value);
+ }
+
+ try {
+ this.save();
+ } catch (IOException io) {
+ JsonList.LOGGER.warn("Could not save the list after adding a user.", io);
+ }
+ }
+ // Yatopia end
+
@Nullable
public V get(K k0) {
// Paper start
@@ -96,6 +110,20 @@ public abstract class JsonList<K, V extends JsonListEntry<K>> {
this.remove(jsonlistentry.getKey());
}
+ // Yatopia start
+ public void removeAll(Iterable<JsonListEntry<K>> values) {
+ for (JsonListEntry<K> entry : values) {
+ this.d.remove(getMappingKey(entry.getKey()));
+ }
+
+ try {
+ this.save();
+ } catch (IOException io) {
+ JsonList.LOGGER.warn("Could not save the list after removing a user.", io);
+ }
+ }
+ // Yatopia end
+
public String[] getEntries() {
return (String[]) this.d.keySet().toArray(new String[this.d.size()]);
}
diff --git a/src/main/java/net/minecraft/world/entity/player/EntityHuman.java b/src/main/java/net/minecraft/world/entity/player/EntityHuman.java
index 0443aaa9fc4058cc4ce61977a89cdf6ea6452b65..1406a4edfe3f95ff8be5d5e430b505ae845b9516 100644
--- a/src/main/java/net/minecraft/world/entity/player/EntityHuman.java
+++ b/src/main/java/net/minecraft/world/entity/player/EntityHuman.java
@@ -175,6 +175,7 @@ public abstract class EntityHuman extends EntityLiving {
// CraftBukkit start
public boolean fauxSleeping;
public int oldLevel = -1;
+ private String nameLowercase = null; // Yatopia
@Override
public CraftHumanEntity getBukkitEntity() {
@@ -2085,6 +2086,15 @@ public abstract class EntityHuman extends EntityLiving {
return this.getProfile().getName();
}
+ // Yatopia start
+ public String getNameLowercase() {
+ if (nameLowercase == null) {
+ nameLowercase = getProfile().getName().toLowerCase(java.util.Locale.ROOT);
+ }
+ return nameLowercase;
+ }
+ // Yatopia end
+
@Override
public float b(EntityPose entitypose, EntitySize entitysize) {
switch (entitypose) {