Yatopia/patches/server/0034-Optimize-whitelist-command-for-multiple-additions-re.patch
Simon Gardling 61f261ee2a
Updated Upstream and Sidestream(s) (Paper/Airplane/Purpur/Empirecraft/Origami) (#474)
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:
b8020379c Extract Adventure Version into a variable, add reminder to update the linked JD on the homepage (#5422)
809466f2e Fix anchor respawn acting as a bed respawn when using the end portal (#5540)
d219fd642 [Auto] Updated Upstream (Bukkit/CraftBukkit)
db464b099 Implement methods to convert between Component and Brigadier's Message (#5542)
4047cffca Add PlayerBedFailEnterEvent (#4935)
70d697e6e Update Paperpclip
5ed771591 [CI-SKIP] Remove bad null annotation (#5538)
454a4c78e More World API (#3850)
869e02304 Add PlayerDeepSleepEvent (#5525)
fb56fc35e fix non-dummy objectives not updating
dc859a61f [CI-SKIP] [Auto] Rebuild Patches
7d1689f1a  Add missing checkReachable check for shulker boxes (#5453)
ba8eb3d4b Add missing Javadoc for COLORABLE MaterialTag (#5376)
db801cbf3 Fix PlayerItemHeldEvent firing twice (#5534)
14de2b795 fix PigZombieAngerEvent cancellation (fixes #5319) (v2) (#5329)
86d684ad1 Add get-set drop chance to EntityEquipment (#5528)
33fb8cf63 Add consumeFuel to FurnaceBurnEvent (#5532)
9957f4630 Fix duplicating /give items on item drop cancel (#5536)
d94882043 Fix legacyComposer not using AsyncChatEvent messages (#5509)
053bd82cc Don't print spawn load time when not loading spawn (#5467)
a6d78caae Add isDeeplySleeping to HumanEntity (#5470)
711b7a80b Expose more Adventure serializers through PaperComponents (#5443)
3f63bde0c Set Area Effect Cloud Rotation (#5462)
3523f0fda Remove useless check on player interact cancellation (#5448)
6574d1aa8 fix #5526 - use correct type when sending message to clients
dbfa833ec don't throw when loading TE with invalid keys
a9525a6f7 Do not schedule poi task for each block write on chunk gen

Airplane Changes:
f5fb024 Temporarily revert patch
3c728a7 Oops, these 2 too
37a93e5 Your daily dose of 1-3% optimization patches
bbd689a Remove useless check
d8bdbc5 Reduce allocations for fire spreading
41051fd Redo reduction of entity chunk ticking check patch
31272d8 Flare Update
8f32713 Remove criterion patch
0fed2df Various patches that need to be reorganized later
f78856b Updated Upstream (Tuinity)
f7d6382 Flare Update
71d0799 Update gradle configuration
0f79774 Updated Upstream (Tuinity)

Purpur Changes:
3dce975 Updated Upstream (Paper & Airplane) (#298)
eb07368 Run GitHub Actions for pull requests
e97d062 Updated Upstream (Paper, Tuinity, & Airplane)

Empirecraft Changes:
2a021ede Updated Paper
e963bb2c Add Paper MojangAPI to pom
6f5bf24e Updated Paper

Origami Changes:
73ecdf1 Update Paper
73a3735 Item and exp merge improvements
2021-04-27 12:40:55 -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 854dd6b63bdffa0d79befb36aa55bad408302283..fb8c99ba46fe883a67598de313767be0cb2ca12b 100644
--- a/src/main/java/net/minecraft/server/MinecraftServer.java
+++ b/src/main/java/net/minecraft/server/MinecraftServer.java
@@ -2117,6 +2117,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 5a2678cf3a8441344629b6a0bf4b6be538baae4f..74e433616536216d346c092e9c60094cb7918a49 100644
--- a/src/main/java/net/minecraft/world/entity/player/EntityHuman.java
+++ b/src/main/java/net/minecraft/world/entity/player/EntityHuman.java
@@ -176,6 +176,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() {
@@ -2040,6 +2041,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) {