mirror of
https://github.com/YatopiaMC/Yatopia.git
synced 2024-12-02 23:53:50 +01:00
f33511fdd2
so we see if this patch is necessary first. then we will reimplement it properly, as the current patch is not race condition safe.
199 lines
9.9 KiB
Diff
199 lines
9.9 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..f9e97d28ab182ff1b9e216b2c451642855d52738 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 net.yatopia.server.list.GlueList<>();
|
|
+ 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 net.yatopia.server.list.GlueList<>();
|
|
+ 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 5cf7699f439eb7ef310f0ab02b120836c4a56bfc..9fa597b49f156be49777a5b51e7c231c7728a42f 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() {
|
|
@@ -1883,6 +1884,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 da95d52943550de946d85261bf0e20f9a43ea438..54682f927088c8017ab0718df9bfb6c2fa3c844b 100644
|
|
--- a/src/main/java/net/minecraft/server/MinecraftServer.java
|
|
+++ b/src/main/java/net/minecraft/server/MinecraftServer.java
|
|
@@ -1960,6 +1960,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.aM()) {
|
|
PlayerList playerlist = commandlistenerwrapper.getServer().getPlayerList();
|