From 132adc4fcf49bb7981d61266fbe9aa39ec110f7f Mon Sep 17 00:00:00 2001 From: Etil <81570777+etil2jz@users.noreply.github.com> Date: Thu, 6 Jan 2022 18:49:30 +0100 Subject: [PATCH] More reduce allocs I guess --- .../0089-Configurable-FastMath.round.patch | 1 - patches/server/0090-lithium-tag.patch | 74 +++--- ...Set-some-strings-to-use-new-String-0.patch | 224 ++++++++++++++++++ ...93-Add-new-Object-0-to-reduce-allocs.patch | 153 ++++++++++++ 4 files changed, 414 insertions(+), 38 deletions(-) create mode 100644 patches/server/0092-Set-some-strings-to-use-new-String-0.patch create mode 100644 patches/server/0093-Add-new-Object-0-to-reduce-allocs.patch diff --git a/patches/server/0089-Configurable-FastMath.round.patch b/patches/server/0089-Configurable-FastMath.round.patch index 309df2b..53dc543 100644 --- a/patches/server/0089-Configurable-FastMath.round.patch +++ b/patches/server/0089-Configurable-FastMath.round.patch @@ -357,7 +357,6 @@ index 0ecac76577eb440a0c3104ef4603acec826c474d..4813bd6de894d0566e8631d8c71915c3 } // Yatopia start - Last tick time API - diff --git a/src/main/java/wtf/etil/mirai/MiraiConfig.java b/src/main/java/wtf/etil/mirai/MiraiConfig.java index a8d9ef7a7fcdfcab468594664d352702ee25406e..3da87aeb0ea91096a00c9acd19ca8cbb4c209d53 100644 --- a/src/main/java/wtf/etil/mirai/MiraiConfig.java diff --git a/patches/server/0090-lithium-tag.patch b/patches/server/0090-lithium-tag.patch index 063e4ac..e0bdc52 100644 --- a/patches/server/0090-lithium-tag.patch +++ b/patches/server/0090-lithium-tag.patch @@ -1,37 +1,37 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: JellySquid -Date: Wed, 23 Sep 2020 16:33:58 +0200 -Subject: [PATCH] lithium: tag - -Original code by CaffeineMC, licensed under GNU Lesser General Public License v3.0 -You can find the original code on https://github.com/CaffeineMC/lithium-fabric (Yarn mappings) - -diff --git a/src/main/java/net/minecraft/tags/SetTag.java b/src/main/java/net/minecraft/tags/SetTag.java -index d0c4a1dd2b11cfdbd3972dec5b5622e2f013ab48..9444e3dcdf3fa307c93adb2f790876fcd9ad88e7 100644 ---- a/src/main/java/net/minecraft/tags/SetTag.java -+++ b/src/main/java/net/minecraft/tags/SetTag.java -@@ -3,6 +3,8 @@ package net.minecraft.tags; - import com.google.common.annotations.VisibleForTesting; - import com.google.common.collect.ImmutableList; - import com.google.common.collect.ImmutableSet; -+import it.unimi.dsi.fastutil.objects.ReferenceArraySet; // Mirai -+import it.unimi.dsi.fastutil.objects.ReferenceOpenHashSet; // Mirai - import java.util.List; - import java.util.Set; - -@@ -14,8 +16,14 @@ public class SetTag implements Tag { - - protected SetTag(Set values, Class type) { - this.closestCommonSuperType = type; -- this.values = values; - this.valuesList = ImmutableList.copyOf(values); -+ // Mirai start -+ if (values.size() <= 3) { -+ this.values = new ReferenceArraySet<>(values); -+ } else { -+ this.values = new ReferenceOpenHashSet<>(values); -+ } -+ // Mirai end - } - - public static SetTag empty() { +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: JellySquid +Date: Wed, 23 Sep 2020 16:33:58 +0200 +Subject: [PATCH] lithium: tag + +Original code by CaffeineMC, licensed under GNU Lesser General Public License v3.0 +You can find the original code on https://github.com/CaffeineMC/lithium-fabric (Yarn mappings) + +diff --git a/src/main/java/net/minecraft/tags/SetTag.java b/src/main/java/net/minecraft/tags/SetTag.java +index d0c4a1dd2b11cfdbd3972dec5b5622e2f013ab48..9444e3dcdf3fa307c93adb2f790876fcd9ad88e7 100644 +--- a/src/main/java/net/minecraft/tags/SetTag.java ++++ b/src/main/java/net/minecraft/tags/SetTag.java +@@ -3,6 +3,8 @@ package net.minecraft.tags; + import com.google.common.annotations.VisibleForTesting; + import com.google.common.collect.ImmutableList; + import com.google.common.collect.ImmutableSet; ++import it.unimi.dsi.fastutil.objects.ReferenceArraySet; // Mirai ++import it.unimi.dsi.fastutil.objects.ReferenceOpenHashSet; // Mirai + import java.util.List; + import java.util.Set; + +@@ -14,8 +16,14 @@ public class SetTag implements Tag { + + protected SetTag(Set values, Class type) { + this.closestCommonSuperType = type; +- this.values = values; + this.valuesList = ImmutableList.copyOf(values); ++ // Mirai start ++ if (values.size() <= 3) { ++ this.values = new ReferenceArraySet<>(values); ++ } else { ++ this.values = new ReferenceOpenHashSet<>(values); ++ } ++ // Mirai end + } + + public static SetTag empty() { diff --git a/patches/server/0092-Set-some-strings-to-use-new-String-0.patch b/patches/server/0092-Set-some-strings-to-use-new-String-0.patch new file mode 100644 index 0000000..fecf373 --- /dev/null +++ b/patches/server/0092-Set-some-strings-to-use-new-String-0.patch @@ -0,0 +1,224 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Etil <81570777+etil2jz@users.noreply.github.com> +Date: Thu, 6 Jan 2022 18:36:03 +0100 +Subject: [PATCH] Set some strings to use `new String[0]` + + +diff --git a/src/main/java/com/destroystokyo/paper/profile/PaperGameProfileRepository.java b/src/main/java/com/destroystokyo/paper/profile/PaperGameProfileRepository.java +index 08fdb681a68e8be6e4062af0630957ce3e524806..d53550918418a456d9112e0b04a7671161044862 100644 +--- a/src/main/java/com/destroystokyo/paper/profile/PaperGameProfileRepository.java ++++ b/src/main/java/com/destroystokyo/paper/profile/PaperGameProfileRepository.java +@@ -40,7 +40,7 @@ public class PaperGameProfileRepository extends YggdrasilGameProfileRepository { + + // Some things were not found.... Proceed to look up. + if (!unfoundNames.isEmpty()) { +- String[] namesArr = unfoundNames.toArray(new String[unfoundNames.size()]); ++ String[] namesArr = unfoundNames.toArray(me.titaniumtown.Constants.EMPTY_string_arr); + super.findProfilesByNames(namesArr, agent, new PreProfileLookupCallback(callback)); + } + } +diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java +index 4f8c0c69a7492ba183f436d4062df177d9c7a9ec..c4be1526230b4ea88d5fb4e9c0f1d0b79803254b 100644 +--- a/src/main/java/net/minecraft/server/MinecraftServer.java ++++ b/src/main/java/net/minecraft/server/MinecraftServer.java +@@ -1000,23 +1000,23 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop {}; + } +diff --git a/src/main/java/net/minecraft/server/level/ChunkMap.java b/src/main/java/net/minecraft/server/level/ChunkMap.java +index d2b103d94fd020295624da2eeb07653f585b586c..5d127532af7a318c3e17c407478f56247b842f23 100644 +--- a/src/main/java/net/minecraft/server/level/ChunkMap.java ++++ b/src/main/java/net/minecraft/server/level/ChunkMap.java +@@ -907,7 +907,7 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider + MutableBoolean mutableboolean = new MutableBoolean(); + + do { +- boolean isShuttingDown = level.getServer().hasStopped(); // Paper ++ //boolean isShuttingDown = level.getServer().hasStopped(); // Paper // Mirai - unused local variable + mutableboolean.setFalse(); + list.stream().map((playerchunk) -> { + CompletableFuture completablefuture; +diff --git a/src/main/java/net/minecraft/server/level/ServerLevel.java b/src/main/java/net/minecraft/server/level/ServerLevel.java +index 35c1604ff678a5344bc9de824eb2788561d2dcaf..f7e11cb3ef22d336cf14a6f0573e87426532cf94 100644 +--- a/src/main/java/net/minecraft/server/level/ServerLevel.java ++++ b/src/main/java/net/minecraft/server/level/ServerLevel.java +@@ -1512,9 +1512,6 @@ public class ServerLevel extends Level implements WorldGenLevel, IServerWorld { + ServerPlayer entityplayer = (ServerPlayer) iterator.next(); + + if (entityplayer != null && entityplayer.level == this && entityplayer.getId() != entityId) { +- double d0 = (double) pos.getX() - entityplayer.getX(); +- double d1 = (double) pos.getY() - entityplayer.getY(); +- double d2 = (double) pos.getZ() - entityplayer.getZ(); + + // CraftBukkit start + if (entityhuman != null && !entityplayer.getBukkitEntity().canSee(entityhuman.getBukkitEntity())) { +@@ -1522,6 +1519,11 @@ public class ServerLevel extends Level implements WorldGenLevel, IServerWorld { + } + // CraftBukkit end + ++ // Mirai - moved from above ++ double d0 = (double) pos.getX() - entityplayer.getX(); ++ double d1 = (double) pos.getY() - entityplayer.getY(); ++ double d2 = (double) pos.getZ() - entityplayer.getZ(); ++ + if (d0 * d0 + d1 * d1 + d2 * d2 < 1024.0D) { + entityplayer.connection.send(new ClientboundBlockDestructionPacket(entityId, pos, progress)); + } +diff --git a/src/main/java/net/minecraft/server/players/OldUsersConverter.java b/src/main/java/net/minecraft/server/players/OldUsersConverter.java +index 5445cb5910ec63408dc4379eec5e12d305182527..eefcf3f2073ba39ba8bba71850a48ae584224a57 100644 +--- a/src/main/java/net/minecraft/server/players/OldUsersConverter.java ++++ b/src/main/java/net/minecraft/server/players/OldUsersConverter.java +@@ -330,7 +330,7 @@ public class OldUsersConverter { + } + + try { +- final String[] astring = (String[]) list.toArray(new String[list.size()]); ++ final String[] astring = (String[]) list.toArray(me.titaniumtown.Constants.EMPTY_string_arr); + ProfileLookupCallback profilelookupcallback = new ProfileLookupCallback() { + public void onProfileLookupSucceeded(GameProfile gameprofile) { + minecraftServer.getProfileCache().add(gameprofile); +diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java +index 9d9d76c4f44a8c2421d560de9e3eac9ae26290cf..04efe836d6bfb874d4fb4eb53121d3a6fc8ec18a 100644 +--- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java ++++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java +@@ -1574,7 +1574,7 @@ public final class CraftServer implements Server { + commands = ImmutableList.of(section.getString(key)); + } + +- result.put(key, commands.toArray(new String[commands.size()])); ++ result.put(key, commands.toArray(me.titaniumtown.Constants.EMPTY_string_arr)); + } + } + +@@ -2027,7 +2027,7 @@ public final class CraftServer implements Server { + + players.addAll(this.getOnlinePlayers()); + +- return players.toArray(new OfflinePlayer[players.size()]); ++ return players.toArray(new OfflinePlayer[0]); // Mirai - use non-pre-sized array + } + + @Override +diff --git a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java +index 6a72d883029f4b69395afffcb3e2ac36fe41942a..96f443bb00ccc26e5d0652187dcd0448ea1e298c 100644 +--- a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java ++++ b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java +@@ -1809,7 +1809,7 @@ public class CraftWorld extends CraftRegionAccessor implements World { + + @Override + public String[] getGameRules() { +- return CraftWorld.getGameRulesNMS().keySet().toArray(new String[CraftWorld.getGameRulesNMS().size()]); ++ return CraftWorld.getGameRulesNMS().keySet().toArray(me.titaniumtown.Constants.EMPTY_string_arr); + } + + @Override +diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftHumanEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftHumanEntity.java +index b39117c4505926da0be9c8248964a233393e8e2d..c3bd2f966c5fc3ab51d36649f8f0b02ae9f1e18e 100644 +--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftHumanEntity.java ++++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftHumanEntity.java +@@ -5,6 +5,7 @@ import com.google.common.collect.ImmutableSet; + import java.util.ArrayList; + import java.util.Arrays; + import java.util.Collection; ++import java.util.Collections; // Mirai + import java.util.Optional; + import java.util.Set; + import net.minecraft.core.BlockPos; +@@ -622,7 +623,7 @@ public class CraftHumanEntity extends CraftLivingEntity implements HumanEntity { + + @Override + public boolean discoverRecipe(NamespacedKey recipe) { +- return this.discoverRecipes(Arrays.asList(recipe)) != 0; ++ return this.discoverRecipes(Collections.singletonList(recipe)) != 0; // Mirai - use singletonList + } + + @Override +@@ -632,7 +633,7 @@ public class CraftHumanEntity extends CraftLivingEntity implements HumanEntity { + + @Override + public boolean undiscoverRecipe(NamespacedKey recipe) { +- return this.undiscoverRecipes(Arrays.asList(recipe)) != 0; ++ return this.undiscoverRecipes(Collections.singletonList(recipe)) != 0; // Mirai - use singleton list + } + + @Override +diff --git a/src/main/java/org/bukkit/craftbukkit/help/MultipleCommandAliasHelpTopic.java b/src/main/java/org/bukkit/craftbukkit/help/MultipleCommandAliasHelpTopic.java +index 3233ffe920c961f04045713232d90249b950db67..10566f504bebbcdf861b4bc9abf4edc6e4c20545 100644 +--- a/src/main/java/org/bukkit/craftbukkit/help/MultipleCommandAliasHelpTopic.java ++++ b/src/main/java/org/bukkit/craftbukkit/help/MultipleCommandAliasHelpTopic.java +@@ -23,7 +23,7 @@ public class MultipleCommandAliasHelpTopic extends HelpTopic { + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < alias.getCommands().length; i++) { + if (i != 0) { +- sb.append(ChatColor.GOLD + " > " + ChatColor.WHITE); ++ sb.append(ChatColor.GOLD).append(" > ").append(ChatColor.WHITE); // Mirai - chain .append call instead of using + + } + sb.append("/"); + sb.append(alias.getCommands()[i].getLabel()); +diff --git a/src/main/java/org/bukkit/craftbukkit/util/CraftChatMessage.java b/src/main/java/org/bukkit/craftbukkit/util/CraftChatMessage.java +index 6e8edc80dd7dfa867901769fda82706746f1bcc5..2e346c516b1fabc23077250305218c48f9f2e0c2 100644 +--- a/src/main/java/org/bukkit/craftbukkit/util/CraftChatMessage.java ++++ b/src/main/java/org/bukkit/craftbukkit/util/CraftChatMessage.java +@@ -169,7 +169,7 @@ public final class CraftChatMessage { + this.appendNewComponent(message.length()); + } + +- this.output = this.list.toArray(new Component[this.list.size()]); ++ this.output = this.list.toArray(new Component[0]); // Mirai - use non-pre-sized array + } + + private void appendNewComponent(int index) { +diff --git a/src/main/java/org/bukkit/craftbukkit/util/WeakCollection.java b/src/main/java/org/bukkit/craftbukkit/util/WeakCollection.java +index 049d750d3af991dd14ac8cf644330404e74b2151..eaad5c3a4a7f2303bc7b1964eedfeeb3db6d70f0 100644 +--- a/src/main/java/org/bukkit/craftbukkit/util/WeakCollection.java ++++ b/src/main/java/org/bukkit/craftbukkit/util/WeakCollection.java +@@ -175,10 +175,6 @@ public final class WeakCollection implements Collection { + } + + private Collection toCollection() { +- ArrayList collection = new ArrayList(); +- for (T value : this) { +- collection.add(value); +- } +- return collection; ++ return new ArrayList<>(this); // Mirai - just clone + } + } diff --git a/patches/server/0093-Add-new-Object-0-to-reduce-allocs.patch b/patches/server/0093-Add-new-Object-0-to-reduce-allocs.patch new file mode 100644 index 0000000..f38a34f --- /dev/null +++ b/patches/server/0093-Add-new-Object-0-to-reduce-allocs.patch @@ -0,0 +1,153 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Etil <81570777+etil2jz@users.noreply.github.com> +Date: Thu, 6 Jan 2022 18:48:10 +0100 +Subject: [PATCH] Add `new Object[0]` to `reduce allocs` + + +diff --git a/src/main/java/me/titaniumtown/Constants.java b/src/main/java/me/titaniumtown/Constants.java +index 9ede2f067eacc1d418a8d6223f4052b81410d3b3..13a710a6d517a229b8c5679f40cffa3924dc791b 100644 +--- a/src/main/java/me/titaniumtown/Constants.java ++++ b/src/main/java/me/titaniumtown/Constants.java +@@ -19,4 +19,5 @@ public final class Constants { + public static final long[] EMPTY_long_arr = new long[0]; + public static final org.bukkit.entity.Entity[] EMPTY_bukkit_entity_arr = new org.bukkit.entity.Entity[0]; + public static final net.minecraft.world.entity.Entity[] EMPTY_entity_arr = new net.minecraft.world.entity.Entity[0]; ++ public static final Object[] EMPTY_object_arr = new Object[0]; + } +\ No newline at end of file +diff --git a/src/main/java/net/minecraft/network/Connection.java b/src/main/java/net/minecraft/network/Connection.java +index 81dde0efc1a06420c0791520b9e40b24dd1f0318..371dd89f91f5b53e7d31155e22a4f29be37f9f5f 100644 +--- a/src/main/java/net/minecraft/network/Connection.java ++++ b/src/main/java/net/minecraft/network/Connection.java +@@ -282,7 +282,7 @@ public class Connection extends SimpleChannelInboundHandler> { + } + + public void setListener(PacketListener listener) { +- Validate.notNull(listener, "packetListener", new Object[0]); ++ Validate.notNull(listener, "packetListener", me.titaniumtown.Constants.EMPTY_object_arr); + this.packetListener = listener; + } + // Paper start +diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java +index c4be1526230b4ea88d5fb4e9c0f1d0b79803254b..aa3ff176137a9dd68aa11389bcaaf3e43bb6e4e5 100644 +--- a/src/main/java/net/minecraft/server/MinecraftServer.java ++++ b/src/main/java/net/minecraft/server/MinecraftServer.java +@@ -1443,8 +1443,8 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop= KEEPALIVE_LIMIT) { // check keepalive limit, don't fire if already disconnected + ServerGamePacketListenerImpl.LOGGER.warn("{} was kicked due to keepalive timeout!", this.player.getScoreboardName()); // more info +- this.disconnect(new TranslatableComponent("disconnect.timeout", new Object[0]), org.bukkit.event.player.PlayerKickEvent.Cause.TIMEOUT); // Paper - kick event cause ++ this.disconnect(new TranslatableComponent("disconnect.timeout", me.titaniumtown.Constants.EMPTY_object_arr), org.bukkit.event.player.PlayerKickEvent.Cause.TIMEOUT); // Paper - kick event cause + } + } else { + if (elapsedTime >= 15000L) { // 15 seconds +@@ -815,13 +815,13 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Ser + // PlayerConnectionUtils.ensureMainThread(packetplayintabcomplete, this, this.player.getWorldServer()); // Paper - run this async + // CraftBukkit start + if (this.chatSpamTickCount.addAndGet(com.destroystokyo.paper.PaperConfig.tabSpamIncrement) > com.destroystokyo.paper.PaperConfig.tabSpamLimit && !this.server.getPlayerList().isOp(this.player.getGameProfile())) { // Paper start - split and make configurable +- server.scheduleOnMain(() -> this.disconnect(new TranslatableComponent("disconnect.spam", new Object[0]), org.bukkit.event.player.PlayerKickEvent.Cause.SPAM)); // Paper - kick event cause ++ server.scheduleOnMain(() -> this.disconnect(new TranslatableComponent("disconnect.spam", me.titaniumtown.Constants.EMPTY_object_arr), org.bukkit.event.player.PlayerKickEvent.Cause.SPAM)); // Paper - kick event cause + return; + } + // Paper start + String str = packet.getCommand(); int index = -1; + if (str.length() > 64 && ((index = str.indexOf(' ')) == -1 || index >= 64)) { +- server.scheduleOnMain(() -> this.disconnect(new TranslatableComponent("disconnect.spam", new Object[0]), org.bukkit.event.player.PlayerKickEvent.Cause.SPAM)); // Paper - kick event cause ++ server.scheduleOnMain(() -> this.disconnect(new TranslatableComponent("disconnect.spam", me.titaniumtown.Constants.EMPTY_object_arr), org.bukkit.event.player.PlayerKickEvent.Cause.SPAM)); // Paper - kick event cause + return; + } + // Paper end +@@ -2941,7 +2941,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Ser + // Paper start + if (!org.bukkit.Bukkit.isPrimaryThread()) { + if (recipeSpamPackets.addAndGet(com.destroystokyo.paper.PaperConfig.autoRecipeIncrement) > com.destroystokyo.paper.PaperConfig.autoRecipeLimit) { +- server.scheduleOnMain(() -> this.disconnect(new TranslatableComponent("disconnect.spam", new Object[0]), org.bukkit.event.player.PlayerKickEvent.Cause.SPAM)); // Paper - kick event cause ++ server.scheduleOnMain(() -> this.disconnect(new TranslatableComponent("disconnect.spam", me.titaniumtown.Constants.EMPTY_object_arr), org.bukkit.event.player.PlayerKickEvent.Cause.SPAM)); // Paper - kick event cause + return; + } + } +diff --git a/src/main/java/net/minecraft/server/network/ServerLoginPacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerLoginPacketListenerImpl.java +index 475f080d91c7f7cbb012ed5a28dabc0ccab5a22c..f7a8b42f0c1ced2232d4a74c46e8f265616aad43 100644 +--- a/src/main/java/net/minecraft/server/network/ServerLoginPacketListenerImpl.java ++++ b/src/main/java/net/minecraft/server/network/ServerLoginPacketListenerImpl.java +@@ -255,7 +255,7 @@ public class ServerLoginPacketListenerImpl implements ServerLoginPacketListener + + @Override + public void handleHello(ServerboundHelloPacket packet) { +- Validate.validState(this.state == ServerLoginPacketListenerImpl.State.HELLO, "Unexpected hello packet", new Object[0]); ++ Validate.validState(this.state == ServerLoginPacketListenerImpl.State.HELLO, "Unexpected hello packet", me.titaniumtown.Constants.EMPTY_object_arr); + this.gameProfile = packet.getGameProfile(); + // Paper start - validate usernames + if (com.destroystokyo.paper.PaperConfig.isProxyOnlineMode() && com.destroystokyo.paper.PaperConfig.performUsernameValidation) { +@@ -299,7 +299,7 @@ public class ServerLoginPacketListenerImpl implements ServerLoginPacketListener + + @Override + public void handleKey(ServerboundKeyPacket packet) { +- Validate.validState(this.state == ServerLoginPacketListenerImpl.State.KEY, "Unexpected key packet", new Object[0]); ++ Validate.validState(this.state == ServerLoginPacketListenerImpl.State.KEY, "Unexpected key packet", me.titaniumtown.Constants.EMPTY_object_arr); + PrivateKey privatekey = this.server.getKeyPair().getPrivate(); + + final String s; +diff --git a/src/main/java/net/minecraft/server/players/PlayerList.java b/src/main/java/net/minecraft/server/players/PlayerList.java +index da84ae21026acd54478ff23673a817361ad01afd..7f39d1b1c9cb6e3d83aaa61e3f5292e60bc98f5e 100644 +--- a/src/main/java/net/minecraft/server/players/PlayerList.java ++++ b/src/main/java/net/minecraft/server/players/PlayerList.java +@@ -312,7 +312,7 @@ public abstract class PlayerList { + } + + void disconnectPendingPlayer(ServerPlayer entityplayer) { +- TranslatableComponent msg = new TranslatableComponent("multiplayer.disconnect.duplicate_login", new Object[0]); ++ TranslatableComponent msg = new TranslatableComponent("multiplayer.disconnect.duplicate_login", me.titaniumtown.Constants.EMPTY_object_arr); + entityplayer.networkManager.send(new ClientboundDisconnectPacket(msg), (future) -> { + entityplayer.networkManager.disconnect(msg); + entityplayer.networkManager = null; +@@ -726,7 +726,7 @@ public abstract class PlayerList { + while (iterator.hasNext()) { + entityplayer = (ServerPlayer) iterator.next(); + this.save(entityplayer); // CraftBukkit - Force the player's inventory to be saved +- entityplayer.connection.disconnect(new TranslatableComponent("multiplayer.disconnect.duplicate_login", new Object[0]), org.bukkit.event.player.PlayerKickEvent.Cause.DUPLICATE_LOGIN); // Paper - kick event cause ++ entityplayer.connection.disconnect(new TranslatableComponent("multiplayer.disconnect.duplicate_login", me.titaniumtown.Constants.EMPTY_object_arr), org.bukkit.event.player.PlayerKickEvent.Cause.DUPLICATE_LOGIN); // Paper - kick event cause + } + + // Instead of kicking then returning, we need to store the kick reason +diff --git a/src/main/java/org/bukkit/craftbukkit/util/WeakCollection.java b/src/main/java/org/bukkit/craftbukkit/util/WeakCollection.java +index eaad5c3a4a7f2303bc7b1964eedfeeb3db6d70f0..c0fa412c0a320998fbb6d708d80349e5f0c75a88 100644 +--- a/src/main/java/org/bukkit/craftbukkit/util/WeakCollection.java ++++ b/src/main/java/org/bukkit/craftbukkit/util/WeakCollection.java +@@ -166,7 +166,7 @@ public final class WeakCollection implements Collection { + + @Override + public Object[] toArray() { +- return this.toArray(new Object[0]); ++ return this.toArray(me.titaniumtown.Constants.EMPTY_object_arr); + } + + @Override +diff --git a/src/test/java/org/bukkit/craftbukkit/inventory/ItemStackTest.java b/src/test/java/org/bukkit/craftbukkit/inventory/ItemStackTest.java +index bf4c622735bf1f4ae190329465426dac6d178c0d..a4b760c8e001545d519b977aeb474222c5bd2c66 100644 +--- a/src/test/java/org/bukkit/craftbukkit/inventory/ItemStackTest.java ++++ b/src/test/java/org/bukkit/craftbukkit/inventory/ItemStackTest.java +@@ -310,7 +310,7 @@ public class ItemStackTest extends AbstractTestingBase { + return ImmutableList.of(); // TODO, test basic durability issues + } + +- static final Object[][] EMPTY_ARRAY = new Object[0][]; ++ static final Object[][] EMPTY_ARRAY = me.titaniumtown.Constants.EMPTY_object_arr[]; + /** + * Materials that generate unique item meta types. + */