From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Ivan Pekov 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 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 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 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 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> 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 81f7d5bc581b42289a79121da15868999ab9feef..7ee038e24cf696b7a32c5c67d4b0dd46c1e60118 100644 --- a/src/main/java/net/minecraft/server/EntityHuman.java +++ b/src/main/java/net/minecraft/server/EntityHuman.java @@ -76,6 +76,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() { @@ -1904,6 +1905,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 d683e3e509cc21d007d3e32f68235cfad007d0d0..83109fb0ad57eef2b24b5c3cb5875535e0a8e67f 100644 --- a/src/main/java/net/minecraft/server/JsonList.java +++ b/src/main/java/net/minecraft/server/JsonList.java @@ -64,6 +64,20 @@ public abstract class JsonList> { } + // Yatopia start + public void addAll(Iterable 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 @@ -94,6 +108,20 @@ public abstract class JsonList> { this.remove(jsonlistentry.getKey()); } + // Yatopia start + public void removeAll(Iterable> values) { + for (JsonListEntry 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 ada93970e324c44aba4f3e817ccaec8a44fa4af3..2d6f650c98a8254c722eb851d73b42d7066c8f17 100644 --- a/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/src/main/java/net/minecraft/server/MinecraftServer.java @@ -1984,6 +1984,7 @@ public abstract class MinecraftServer extends IAsyncTaskHandlerReentrant