2020-09-22 09:17:38 +02:00
|
|
|
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
|
2020-12-01 03:08:41 +01:00
|
|
|
index 893d2c1c74ed28dcdb83b71762ccdcbfd50a8f9d..107091a4cae0e4eaba93f69ae91239ab891a90d9 100644
|
2020-09-22 09:17:38 +02:00
|
|
|
--- 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;
|
|
|
|
}
|
|
|
|
+ */
|
2020-12-01 03:08:41 +01:00
|
|
|
+ java.util.List<WhiteListEntry> toAdd = new java.util.ArrayList<>();
|
2020-09-22 09:17:38 +02:00
|
|
|
+ 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;
|
|
|
|
}
|
|
|
|
+ */
|
2020-12-01 03:08:41 +01:00
|
|
|
+ java.util.List<JsonListEntry<GameProfile>> toRemove = new java.util.ArrayList<>();
|
2020-09-22 09:17:38 +02:00
|
|
|
+ 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
|
2021-01-24 16:52:19 +01:00
|
|
|
index 91c2756a8708a2f4154905baec20b9ae484fea0d..7a6d5521e42a31723b4f006d0fcf618fd42050e4 100644
|
2020-09-22 09:17:38 +02:00
|
|
|
--- a/src/main/java/net/minecraft/server/EntityHuman.java
|
|
|
|
+++ b/src/main/java/net/minecraft/server/EntityHuman.java
|
2021-01-21 11:58:52 +01:00
|
|
|
@@ -78,6 +78,7 @@ public abstract class EntityHuman extends EntityLiving {
|
2020-09-22 09:17:38 +02:00
|
|
|
// CraftBukkit start
|
|
|
|
public boolean fauxSleeping;
|
|
|
|
public int oldLevel = -1;
|
|
|
|
+ private String nameLowercase = null; // Yatopia
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public CraftHumanEntity getBukkitEntity() {
|
2021-01-21 11:58:52 +01:00
|
|
|
@@ -1923,6 +1924,15 @@ public abstract class EntityHuman extends EntityLiving {
|
2020-09-22 09:17:38 +02:00
|
|
|
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
|
2021-01-25 20:22:51 +01:00
|
|
|
index 99580abac1ff30c784b6792d69c9d4cad12c1b1f..1daeb9571663a128a749c735a70f6e92603ffeda 100644
|
2020-09-22 09:17:38 +02:00
|
|
|
--- a/src/main/java/net/minecraft/server/JsonList.java
|
|
|
|
+++ b/src/main/java/net/minecraft/server/JsonList.java
|
2020-10-02 16:54:16 +02:00
|
|
|
@@ -66,6 +66,20 @@ public abstract class JsonList<K, V extends JsonListEntry<K>> {
|
2020-09-22 09:17:38 +02:00
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
+ // 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
|
2020-10-02 16:54:16 +02:00
|
|
|
@@ -96,6 +110,20 @@ public abstract class JsonList<K, V extends JsonListEntry<K>> {
|
2020-09-22 09:17:38 +02:00
|
|
|
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
|
2021-01-21 11:58:52 +01:00
|
|
|
index 240e230725ca685389fe39dfa60ac3ca22d3faa0..9a6bb7b6cb4d4aabae6f7e7915f993e4ebd6f77f 100644
|
2020-09-22 09:17:38 +02:00
|
|
|
--- a/src/main/java/net/minecraft/server/MinecraftServer.java
|
|
|
|
+++ b/src/main/java/net/minecraft/server/MinecraftServer.java
|
2021-01-21 11:58:52 +01:00
|
|
|
@@ -1983,6 +1983,7 @@ public abstract class MinecraftServer extends IAsyncTaskHandlerReentrant<TickTas
|
2020-09-22 09:17:38 +02:00
|
|
|
return new DataPackConfiguration(list, list1);
|
|
|
|
}
|
|
|
|
|
|
|
|
+ public final void kickNotWhitelisted(CommandListenerWrapper sender) { a(sender); } // Yatopia - OBFHELPER
|
|
|
|
public void a(CommandListenerWrapper commandlistenerwrapper) {
|
2020-11-07 08:02:33 +01:00
|
|
|
if (this.aN()) {
|
2020-09-22 09:17:38 +02:00
|
|
|
PlayerList playerlist = commandlistenerwrapper.getServer().getPlayerList();
|