Yatopia/patches/server/0040-Optimize-whitelist-command-for-multiple-additions-re.patch
Ivan Pekov ea14d2c947
Updated Upstream and Sidestream(s) (Tuinity)
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.

Tuinity Changes:
076174a Updated Upstream (Paper)
2021-01-04 10:38:27 +02:00

199 lines
9.8 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/CommandWhitelist.java b/src/main/java/net/minecraft/server/CommandWhitelist.java
index 893d2c1c74ed28dcdb83b71762ccdcbfd50a8f9d..107091a4cae0e4eaba93f69ae91239ab891a90d9 100644
--- a/src/main/java/net/minecraft/server/CommandWhitelist.java
+++ b/src/main/java/net/minecraft/server/CommandWhitelist.java
@@ -12,8 +12,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(com.mojang.brigadier.CommandDispatcher<CommandListenerWrapper> com_mojang_brigadier_commanddispatcher) {
com_mojang_brigadier_commanddispatcher.register((LiteralArgumentBuilder) ((LiteralArgumentBuilder) ((LiteralArgumentBuilder) ((LiteralArgumentBuilder) ((LiteralArgumentBuilder) ((LiteralArgumentBuilder) ((LiteralArgumentBuilder) CommandDispatcher.a("whitelist").requires((commandlistenerwrapper) -> {
@@ -27,11 +27,25 @@ public class CommandWhitelist {
}))).then(CommandDispatcher.a("add").then(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 (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(CommandDispatcher.a("remove").then(CommandDispatcher.a("targets", (ArgumentType) ArgumentProfile.a()).suggests((commandcontext, suggestionsbuilder) -> {
@@ -52,6 +66,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();
@@ -72,10 +88,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();
@@ -97,6 +130,22 @@ public class CommandWhitelist {
commandlistenerwrapper.getServer().a(commandlistenerwrapper);
return i;
}
+ */
+ java.util.List<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/EntityHuman.java b/src/main/java/net/minecraft/server/EntityHuman.java
index 50ba26eafcfd5024e2795f13a0b04877b2cd6688..fea2e70a92bfd9798a4a8e256069dc20889e1259 100644
--- a/src/main/java/net/minecraft/server/EntityHuman.java
+++ b/src/main/java/net/minecraft/server/EntityHuman.java
@@ -77,6 +77,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() {
@@ -1890,6 +1891,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) {
diff --git a/src/main/java/net/minecraft/server/JsonList.java b/src/main/java/net/minecraft/server/JsonList.java
index 0224a6d0e47e836fa485b39e7b4ce5b83ea554bf..fe578d306575bbdc8ca4a993a648e889a4ec2111 100644
--- a/src/main/java/net/minecraft/server/JsonList.java
+++ b/src/main/java/net/minecraft/server/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/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java
index a342a13f387b4079bfc983d500a0fde534891196..156f350e8c4c3f9a8a59e4950e4bd03050dc3e62 100644
--- a/src/main/java/net/minecraft/server/MinecraftServer.java
+++ b/src/main/java/net/minecraft/server/MinecraftServer.java
@@ -1971,6 +1971,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();