From 1b3cb0dc53a998da5431cbb83e2ebd4e6ee2bdd0 Mon Sep 17 00:00:00 2001 From: AlphaKR93 Date: Wed, 10 Jan 2024 18:14:57 +0900 Subject: [PATCH] Add some optimizations --- .../0035-Save-Json-list-asynchronously.patch | 55 + patches/server/0036-Lithium-HashedList.patch | 306 ++++ .../0037-Improve-SwingTime-ticking.patch | 18 + .../server/0040-Reduce-allocations.patch | 1383 ----------------- 4 files changed, 379 insertions(+), 1383 deletions(-) create mode 100644 patches/server/0035-Save-Json-list-asynchronously.patch create mode 100644 patches/server/0036-Lithium-HashedList.patch create mode 100644 patches/server/0037-Improve-SwingTime-ticking.patch delete mode 100644 patches/unapplied/server/0040-Reduce-allocations.patch diff --git a/patches/server/0035-Save-Json-list-asynchronously.patch b/patches/server/0035-Save-Json-list-asynchronously.patch new file mode 100644 index 0000000..bd770f5 --- /dev/null +++ b/patches/server/0035-Save-Json-list-asynchronously.patch @@ -0,0 +1,55 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: AlphaKR93 +Date: Wed, 10 Jan 2024 17:49:55 +0900 +Subject: [PATCH] Save Json list asynchronously + + +diff --git a/src/main/java/net/minecraft/server/players/StoredUserList.java b/src/main/java/net/minecraft/server/players/StoredUserList.java +index 34b7c5421da93f14050425b0fc16bbc27e5f3eba..b3d4f579fab96f572811ed0e33ecbb5204475391 100644 +--- a/src/main/java/net/minecraft/server/players/StoredUserList.java ++++ b/src/main/java/net/minecraft/server/players/StoredUserList.java +@@ -142,7 +142,10 @@ public abstract class StoredUserList> { + return this.map.values(); + } + +- public void save() throws IOException { ++ // Plazma start - Save Json list asynchronously ++ public void save()/* throws IOException*/ { ++ io.papermc.paper.util.MCUtil.scheduleAsyncTask(() -> { ++ + this.removeExpired(); // Paper - remove expired values before saving + JsonArray jsonarray = new JsonArray(); + Stream stream = this.map.values().stream().map((jsonlistentry) -> { // CraftBukkit - decompile error +@@ -154,27 +157,16 @@ public abstract class StoredUserList> { + + Objects.requireNonNull(jsonarray); + stream.forEach(jsonarray::add); +- BufferedWriter bufferedwriter = Files.newWriter(this.file, StandardCharsets.UTF_8); + +- try { ++ try (BufferedWriter bufferedwriter = Files.newWriter(this.file, StandardCharsets.UTF_8)) { + StoredUserList.GSON.toJson(jsonarray, bufferedwriter); +- } catch (Throwable throwable) { +- if (bufferedwriter != null) { +- try { +- bufferedwriter.close(); +- } catch (Throwable throwable1) { +- throwable.addSuppressed(throwable1); +- } +- } +- +- throw throwable; +- } +- +- if (bufferedwriter != null) { +- bufferedwriter.close(); ++ } catch (IOException e) { ++ StoredUserList.LOGGER.warn("Failed to asynchronously save file " + this.file, e); + } + ++ }); + } ++ // Plazma end + + public void load() throws IOException { + if (this.file.exists()) { diff --git a/patches/server/0036-Lithium-HashedList.patch b/patches/server/0036-Lithium-HashedList.patch new file mode 100644 index 0000000..b91f19a --- /dev/null +++ b/patches/server/0036-Lithium-HashedList.patch @@ -0,0 +1,306 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: AlphaKR93 +Date: Wed, 10 Jan 2024 18:08:59 +0900 +Subject: [PATCH] Lithium - HashedList + + +diff --git a/src/main/java/me/jellysquid/mods/lithium/common/util/collections/HashedReferenceList.java b/src/main/java/me/jellysquid/mods/lithium/common/util/collections/HashedReferenceList.java +new file mode 100644 +index 0000000000000000000000000000000000000000..d11579075e653868a43fe826bdf9b41ddc031b85 +--- /dev/null ++++ b/src/main/java/me/jellysquid/mods/lithium/common/util/collections/HashedReferenceList.java +@@ -0,0 +1,277 @@ ++package me.jellysquid.mods.lithium.common.util.collections; ++ ++import it.unimi.dsi.fastutil.objects.Reference2IntOpenHashMap; ++import it.unimi.dsi.fastutil.objects.ReferenceArrayList; ++import it.unimi.dsi.fastutil.objects.ReferenceOpenHashSet; ++import org.jetbrains.annotations.NotNull; ++ ++import java.util.*; ++ ++/** ++ * Wraps a {@link List} with a hash table which provides O(1) lookups for {@link Collection#contains(Object)}. The type ++ * contained by this list must use reference-equality semantics. ++ */ ++@SuppressWarnings("SuspiciousMethodCalls") ++public class HashedReferenceList implements List { ++ private final ReferenceArrayList list; ++ private final Reference2IntOpenHashMap counter; ++ ++ public HashedReferenceList(List list) { ++ this.list = new ReferenceArrayList<>(); ++ this.list.addAll(list); ++ ++ this.counter = new Reference2IntOpenHashMap<>(); ++ this.counter.defaultReturnValue(0); ++ ++ for (T obj : this.list) { ++ this.counter.addTo(obj, 1); ++ } ++ } ++ ++ @Override ++ public int size() { ++ return this.list.size(); ++ } ++ ++ @Override ++ public boolean isEmpty() { ++ return this.list.isEmpty(); ++ } ++ ++ @Override ++ public boolean contains(Object o) { ++ return this.counter.containsKey(o); ++ } ++ ++ @Override ++ public @NotNull Iterator iterator() { ++ return this.listIterator(); ++ } ++ ++ @Override ++ public Object @NotNull [] toArray() { ++ return this.list.toArray(); ++ } ++ ++ @Override ++ public T1 @NotNull [] toArray(T1 @NotNull [] a) { ++ return this.list.toArray(a); ++ } ++ ++ @Override ++ public boolean add(T t) { ++ this.trackReferenceAdded(t); ++ ++ return this.list.add(t); ++ } ++ ++ @Override ++ public boolean remove(Object o) { ++ this.trackReferenceRemoved(o); ++ ++ return this.list.remove(o); ++ } ++ ++ @Override ++ public boolean containsAll(Collection c) { ++ for (Object obj : c) { ++ if (!this.counter.containsKey(obj)) { ++ return false; ++ } ++ } ++ ++ return true; ++ } ++ ++ @Override ++ public boolean addAll(Collection c) { ++ for (T obj : c) { ++ this.trackReferenceAdded(obj); ++ } ++ ++ return this.list.addAll(c); ++ } ++ ++ @Override ++ public boolean addAll(int index, Collection c) { ++ for (T obj : c) { ++ this.trackReferenceAdded(obj); ++ } ++ ++ return this.list.addAll(index, c); ++ } ++ ++ @Override ++ public boolean removeAll(@NotNull Collection c) { ++ if (this.size() >= 2 && c.size() > 4 && c instanceof List) { ++ //HashReferenceList uses reference equality, so using ReferenceOpenHashSet is fine ++ c = new ReferenceOpenHashSet<>(c); ++ } ++ this.counter.keySet().removeAll(c); ++ return this.list.removeAll(c); ++ } ++ ++ @Override ++ public boolean retainAll(@NotNull Collection c) { ++ this.counter.keySet().retainAll(c); ++ return this.list.retainAll(c); ++ } ++ ++ @Override ++ public void clear() { ++ this.counter.clear(); ++ this.list.clear(); ++ } ++ ++ @Override ++ public T get(int index) { ++ return this.list.get(index); ++ } ++ ++ @Override ++ public T set(int index, T element) { ++ T prev = this.list.set(index, element); ++ ++ if (prev != element) { ++ if (prev != null) { ++ this.trackReferenceRemoved(prev); ++ } ++ ++ this.trackReferenceAdded(element); ++ } ++ ++ return prev; ++ } ++ ++ @Override ++ public void add(int index, T element) { ++ this.trackReferenceAdded(element); ++ ++ this.list.add(index, element); ++ } ++ ++ @Override ++ public T remove(int index) { ++ T prev = this.list.remove(index); ++ ++ if (prev != null) { ++ this.trackReferenceRemoved(prev); ++ } ++ ++ return prev; ++ } ++ ++ @Override ++ public int indexOf(Object o) { ++ return this.list.indexOf(o); ++ } ++ ++ @Override ++ public int lastIndexOf(Object o) { ++ return this.list.lastIndexOf(o); ++ } ++ ++ @Override ++ public @NotNull ListIterator listIterator() { ++ return this.listIterator(0); ++ } ++ ++ @Override ++ public @NotNull ListIterator listIterator(int index) { ++ return new ListIterator<>() { ++ private final ListIterator inner = HashedReferenceList.this.list.listIterator(index); ++ ++ @Override ++ public boolean hasNext() { ++ return this.inner.hasNext(); ++ } ++ ++ @Override ++ public T next() { ++ return this.inner.next(); ++ } ++ ++ @Override ++ public boolean hasPrevious() { ++ return this.inner.hasPrevious(); ++ } ++ ++ @Override ++ public T previous() { ++ return this.inner.previous(); ++ } ++ ++ @Override ++ public int nextIndex() { ++ return this.inner.nextIndex(); ++ } ++ ++ @Override ++ public int previousIndex() { ++ return this.inner.previousIndex(); ++ } ++ ++ @Override ++ public void remove() { ++ int last = this.previousIndex(); ++ ++ if (last == -1) { ++ throw new NoSuchElementException(); ++ } ++ ++ T prev = HashedReferenceList.this.get(last); ++ ++ if (prev != null) { ++ HashedReferenceList.this.trackReferenceRemoved(prev); ++ } ++ ++ this.inner.remove(); ++ } ++ ++ @Override ++ public void set(T t) { ++ int last = this.previousIndex(); ++ ++ if (last == -1) { ++ throw new NoSuchElementException(); ++ } ++ ++ T prev = HashedReferenceList.this.get(last); ++ ++ if (prev != t) { ++ if (prev != null) { ++ HashedReferenceList.this.trackReferenceRemoved(prev); ++ } ++ ++ HashedReferenceList.this.trackReferenceAdded(t); ++ } ++ ++ this.inner.remove(); ++ } ++ ++ @Override ++ public void add(T t) { ++ HashedReferenceList.this.trackReferenceAdded(t); ++ ++ this.inner.add(t); ++ } ++ }; ++ } ++ ++ @Override ++ public @NotNull List subList(int fromIndex, int toIndex) { ++ return this.list.subList(fromIndex, toIndex); ++ } ++ ++ private void trackReferenceAdded(T t) { ++ this.counter.addTo(t, 1); ++ } ++ ++ @SuppressWarnings("unchecked") ++ private void trackReferenceRemoved(Object o) { ++ if (this.counter.addTo((T) o, -1) <= 1) { ++ this.counter.removeInt(o); ++ } ++ } ++ ++} +diff --git a/src/main/java/net/minecraft/util/random/WeightedRandomList.java b/src/main/java/net/minecraft/util/random/WeightedRandomList.java +index 1bcb5a58b945cdb3dc94efb314d7ba41fbb38e07..34beb1b0af10877b3388e6f44913253eb51e7a51 100644 +--- a/src/main/java/net/minecraft/util/random/WeightedRandomList.java ++++ b/src/main/java/net/minecraft/util/random/WeightedRandomList.java +@@ -8,10 +8,10 @@ import net.minecraft.util.RandomSource; + + public class WeightedRandomList { + private final int totalWeight; +- private final ImmutableList items; ++ private final List items; // Plazma - Lithium: collections.mob_spawning + + WeightedRandomList(List entries) { +- this.items = ImmutableList.copyOf(entries); ++ this.items = entries.size() > 4 ? ImmutableList.copyOf(entries) : java.util.Collections.unmodifiableList(new me.jellysquid.mods.lithium.common.util.collections.HashedReferenceList<>(entries));// Plazma - Lithium: collections.mob_spawning + this.totalWeight = WeightedRandom.getTotalWeight(entries); + } + diff --git a/patches/server/0037-Improve-SwingTime-ticking.patch b/patches/server/0037-Improve-SwingTime-ticking.patch new file mode 100644 index 0000000..bba7e37 --- /dev/null +++ b/patches/server/0037-Improve-SwingTime-ticking.patch @@ -0,0 +1,18 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: AlphaKR93 +Date: Wed, 10 Jan 2024 18:11:03 +0900 +Subject: [PATCH] Improve SwingTime ticking + + +diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/main/java/net/minecraft/world/entity/LivingEntity.java +index 7fdb4d5eb1ab6c45c88ca18112d5b1b26bfd5947..57b1f741609193eced5e5ab1d45f18bea005eeb7 100644 +--- a/src/main/java/net/minecraft/world/entity/LivingEntity.java ++++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java +@@ -2602,6 +2602,7 @@ public abstract class LivingEntity extends Entity implements Attackable { + } + + protected void updateSwingTime() { ++ if (!this.swinging && this.swingTime == 0) return; // Plazma - de-sisyphus :skull: + int i = this.getCurrentSwingDuration(); + + if (this.swinging) { diff --git a/patches/unapplied/server/0040-Reduce-allocations.patch b/patches/unapplied/server/0040-Reduce-allocations.patch deleted file mode 100644 index dc4008d..0000000 --- a/patches/unapplied/server/0040-Reduce-allocations.patch +++ /dev/null @@ -1,1383 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: AlphaKR93 -Date: Thu, 6 Jul 2023 23:56:45 +0900 -Subject: [PATCH] Reduce allocations - - -diff --git a/src/main/java/ca/spottedleaf/starlight/common/light/StarLightEngine.java b/src/main/java/ca/spottedleaf/starlight/common/light/StarLightEngine.java -index ad1eeebe6de219143492b94da309cb54ae9e0a5b..9c5cd176f9e7c525877c9fd219a4b8d3e2e6231d 100644 ---- a/src/main/java/ca/spottedleaf/starlight/common/light/StarLightEngine.java -+++ b/src/main/java/ca/spottedleaf/starlight/common/light/StarLightEngine.java -@@ -1088,13 +1088,14 @@ public abstract class StarLightEngine { - - protected static final AxisDirection[][] OLD_CHECK_DIRECTIONS = new AxisDirection[1 << 6][]; - protected static final int ALL_DIRECTIONS_BITSET = (1 << 6) - 1; -+ private static final AxisDirection[] EMPTY_DIRECTION = new AxisDirection[0]; // Plazma - static { - for (int i = 0; i < OLD_CHECK_DIRECTIONS.length; ++i) { - final List directions = new ArrayList<>(); - for (int bitset = i, len = Integer.bitCount(i), index = 0; index < len; ++index, bitset ^= IntegerUtil.getTrailingBit(bitset)) { - directions.add(AXIS_DIRECTIONS[IntegerUtil.trailingZeros(bitset)]); - } -- OLD_CHECK_DIRECTIONS[i] = directions.toArray(new AxisDirection[0]); -+ OLD_CHECK_DIRECTIONS[i] = directions.toArray(EMPTY_DIRECTION); // Plazma - } - } - -diff --git a/src/main/java/com/destroystokyo/paper/antixray/ChunkPacketBlockControllerAntiXray.java b/src/main/java/com/destroystokyo/paper/antixray/ChunkPacketBlockControllerAntiXray.java -index 42fdce97d99618a53f2e9c51804ff2205b574f69..20ad001e6418606d0d33f9a1148cbec86f0d4a3a 100644 ---- a/src/main/java/com/destroystokyo/paper/antixray/ChunkPacketBlockControllerAntiXray.java -+++ b/src/main/java/com/destroystokyo/paper/antixray/ChunkPacketBlockControllerAntiXray.java -@@ -92,8 +92,8 @@ public final class ChunkPacketBlockControllerAntiXray extends ChunkPacketBlockCo - Set presetBlockStateSet = new LinkedHashSet<>(); - // Therefore addAll(Collection) is used, which guarantees this order in the doc - presetBlockStateSet.addAll(presetBlockStateList); -- presetBlockStates = presetBlockStateSet.isEmpty() ? new BlockState[]{Blocks.DIAMOND_ORE.defaultBlockState()} : presetBlockStateSet.toArray(new BlockState[0]); -- presetBlockStatesFull = presetBlockStateSet.isEmpty() ? new BlockState[]{Blocks.DIAMOND_ORE.defaultBlockState()} : presetBlockStateList.toArray(new BlockState[0]); -+ presetBlockStates = presetBlockStateSet.isEmpty() ? new BlockState[]{Blocks.DIAMOND_ORE.defaultBlockState()} : presetBlockStateSet.toArray(org.plazmamc.plazma.EmptyConstants.BLOCK_STATE); // Plazma -+ presetBlockStatesFull = presetBlockStateSet.isEmpty() ? new BlockState[]{Blocks.DIAMOND_ORE.defaultBlockState()} : presetBlockStateList.toArray(org.plazmamc.plazma.EmptyConstants.BLOCK_STATE); // Plazma - presetBlockStatesStone = null; - presetBlockStatesDeepslate = null; - presetBlockStatesNetherrack = null; -diff --git a/src/main/java/com/destroystokyo/paper/util/maplist/EntityList.java b/src/main/java/com/destroystokyo/paper/util/maplist/EntityList.java -index 0133ea6feb1ab88f021f66855669f58367e7420b..628e8e7c982d498b1a8297bebbe35ea1879fe5b8 100644 ---- a/src/main/java/com/destroystokyo/paper/util/maplist/EntityList.java -+++ b/src/main/java/com/destroystokyo/paper/util/maplist/EntityList.java -@@ -17,9 +17,9 @@ public final class EntityList implements Iterable { - this.entityToIndex.defaultReturnValue(Integer.MIN_VALUE); - } - -- protected static final Entity[] EMPTY_LIST = new Entity[0]; -+ //protected static final Entity[] EMPTY_LIST = new Entity[0]; // Plazma - -- protected Entity[] entities = EMPTY_LIST; -+ protected Entity[] entities = org.plazmamc.plazma.EmptyConstants.ENTITY; // Plazma - protected int count; - - public int size() { -diff --git a/src/main/java/com/destroystokyo/paper/util/maplist/IBlockDataList.java b/src/main/java/com/destroystokyo/paper/util/maplist/IBlockDataList.java -index 277cfd9d1e8fff5d9b5e534b75c3c5162d58b0b7..8656dfe589cdfc80207f42cef09684ba637f1700 100644 ---- a/src/main/java/com/destroystokyo/paper/util/maplist/IBlockDataList.java -+++ b/src/main/java/com/destroystokyo/paper/util/maplist/IBlockDataList.java -@@ -20,9 +20,9 @@ public final class IBlockDataList { - this.map.defaultReturnValue(Long.MAX_VALUE); - } - -- private static final long[] EMPTY_LIST = new long[0]; -+ //private static final long[] EMPTY_LIST = new long[0]; // Plazma - -- private long[] byIndex = EMPTY_LIST; -+ private long[] byIndex = org.plazmamc.plazma.EmptyConstants.LONG; // Plazma - private int size; - - public static int getLocationKey(final int x, final int y, final int z) { -diff --git a/src/main/java/com/destroystokyo/paper/util/maplist/ReferenceList.java b/src/main/java/com/destroystokyo/paper/util/maplist/ReferenceList.java -index 190c5f0b02a3d99054704ae1afbffb3498ddffe1..98a3a2ab266e88f2d21664f4d0f4b33a2247d6f7 100644 ---- a/src/main/java/com/destroystokyo/paper/util/maplist/ReferenceList.java -+++ b/src/main/java/com/destroystokyo/paper/util/maplist/ReferenceList.java -@@ -15,9 +15,9 @@ public final class ReferenceList implements Iterable { - this.referenceToIndex.defaultReturnValue(Integer.MIN_VALUE); - } - -- protected static final Object[] EMPTY_LIST = new Object[0]; -+ //protected static final Object[] EMPTY_LIST = new Object[0]; // Plazma - -- protected Object[] references = EMPTY_LIST; -+ protected Object[] references = org.plazmamc.plazma.EmptyConstants.OBJECT; // Plazma - protected int count; - - public int size() { -diff --git a/src/main/java/io/papermc/paper/chunk/system/scheduling/ChunkTaskScheduler.java b/src/main/java/io/papermc/paper/chunk/system/scheduling/ChunkTaskScheduler.java -index f975cb93716e137d973ff2f9011acdbef58859a2..7b0ac438d00de2c7a27ec8aefc1d280e9c2aef8b 100644 ---- a/src/main/java/io/papermc/paper/chunk/system/scheduling/ChunkTaskScheduler.java -+++ b/src/main/java/io/papermc/paper/chunk/system/scheduling/ChunkTaskScheduler.java -@@ -849,9 +849,10 @@ public final class ChunkTaskScheduler { - } - } - -+ private static final ChunkInfo[] EMPTY_CHUNK_INFO = new ChunkInfo[0]; // Plazma - public static ChunkInfo[] getChunkInfos() { - synchronized (WAITING_CHUNKS) { -- return WAITING_CHUNKS.toArray(new ChunkInfo[0]); -+ return WAITING_CHUNKS.toArray(EMPTY_CHUNK_INFO); // Plazma - } - } - -diff --git a/src/main/java/io/papermc/paper/command/subcommands/VersionCommand.java b/src/main/java/io/papermc/paper/command/subcommands/VersionCommand.java -index ae60bd96b5284d54676d8e7e4dd5d170b526ec1e..e955582b928085af032170467be015a3e857ec28 100644 ---- a/src/main/java/io/papermc/paper/command/subcommands/VersionCommand.java -+++ b/src/main/java/io/papermc/paper/command/subcommands/VersionCommand.java -@@ -14,7 +14,7 @@ public final class VersionCommand implements PaperSubcommand { - public boolean execute(final CommandSender sender, final String subCommand, final String[] args) { - final @Nullable Command ver = MinecraftServer.getServer().server.getCommandMap().getCommand("version"); - if (ver != null) { -- ver.execute(sender, "paper", new String[0]); -+ ver.execute(sender, "paper", org.plazmamc.plazma.EmptyConstants.STRING); // Plazma - } - return true; - } -diff --git a/src/main/java/io/papermc/paper/plugin/manager/PaperPluginInstanceManager.java b/src/main/java/io/papermc/paper/plugin/manager/PaperPluginInstanceManager.java -index 9c7552968b8c017c71a7a77557a66a03ed89f125..38d31c03db38235a47400c99dbc08b2d03f20532 100644 ---- a/src/main/java/io/papermc/paper/plugin/manager/PaperPluginInstanceManager.java -+++ b/src/main/java/io/papermc/paper/plugin/manager/PaperPluginInstanceManager.java -@@ -67,8 +67,9 @@ class PaperPluginInstanceManager { - return this.lookupNames.get(name.replace(' ', '_').toLowerCase(java.util.Locale.ENGLISH)); // Paper - } - -+ private static final Plugin[] EMPTY_PLUGIN = new Plugin[0]; // Plazma - public @NotNull Plugin[] getPlugins() { -- return this.plugins.toArray(new Plugin[0]); -+ return this.plugins.toArray(EMPTY_PLUGIN); // Plazma - } - - public boolean isPluginEnabled(@NotNull String name) { -@@ -125,6 +126,7 @@ class PaperPluginInstanceManager { - } - - // The behavior of this is that all errors are logged instead of being thrown -+ private static final JavaPlugin[] EMPTY_JAVA_PLUGIN = new JavaPlugin[0]; // Plazma - public @NotNull Plugin[] loadPlugins(@NotNull Path directory) { - Preconditions.checkArgument(Files.isDirectory(directory), "Directory must be a directory"); // Avoid creating a directory if it doesn't exist - -@@ -137,7 +139,7 @@ class PaperPluginInstanceManager { - this.server.getLogger().log(Level.SEVERE, "Unknown error occurred while loading plugins through PluginManager.", e); - } - -- return runtimePluginEntrypointHandler.getPluginProviderStorage().getLoaded().toArray(new JavaPlugin[0]); -+ return runtimePluginEntrypointHandler.getPluginProviderStorage().getLoaded().toArray(EMPTY_JAVA_PLUGIN); // Plazma - } - - // Plugins are disabled in order like this inorder to "rougly" prevent -diff --git a/src/main/java/io/papermc/paper/world/ChunkEntitySlices.java b/src/main/java/io/papermc/paper/world/ChunkEntitySlices.java -index 7e8dc9e8f381abfdcce2746edc93122d623622d1..9c2ccf975c476db4bf71298d08ffce2c323d43e0 100644 ---- a/src/main/java/io/papermc/paper/world/ChunkEntitySlices.java -+++ b/src/main/java/io/papermc/paper/world/ChunkEntitySlices.java -@@ -303,7 +303,7 @@ public final class ChunkEntitySlices { - - protected static final class BasicEntityList { - -- protected static final Entity[] EMPTY = new Entity[0]; -+ protected static final Entity[] EMPTY = org.plazmamc.plazma.EmptyConstants.ENTITY; // Plazma - protected static final int DEFAULT_CAPACITY = 4; - - protected E[] storage; -diff --git a/src/main/java/net/minecraft/CrashReport.java b/src/main/java/net/minecraft/CrashReport.java -index c468733f44ccb3ff4ba3c20921a4ec52658f0689..52dd6bf580f22081a530aee1277276e64270c91b 100644 ---- a/src/main/java/net/minecraft/CrashReport.java -+++ b/src/main/java/net/minecraft/CrashReport.java -@@ -28,7 +28,7 @@ public class CrashReport { - private final List details = Lists.newArrayList(); - private File saveFile; - private boolean trackingStackTrace = true; -- private StackTraceElement[] uncategorizedStackTrace = new StackTraceElement[0]; -+ private StackTraceElement[] uncategorizedStackTrace = org.plazmamc.plazma.EmptyConstants.STACK_TRACE_ELEMENT; // Plazma - private final SystemReport systemReport = new SystemReport(); - - public CrashReport(String message, Throwable cause) { -diff --git a/src/main/java/net/minecraft/CrashReportCategory.java b/src/main/java/net/minecraft/CrashReportCategory.java -index b54ddd0ba0b001fbcb1838a838ca4890df936f1b..a49ce64ea944f5cab83ba1bee5ab4c749950af9e 100644 ---- a/src/main/java/net/minecraft/CrashReportCategory.java -+++ b/src/main/java/net/minecraft/CrashReportCategory.java -@@ -12,7 +12,7 @@ import net.minecraft.world.level.block.state.BlockState; - public class CrashReportCategory { - private final String title; - private final List entries = Lists.newArrayList(); -- private StackTraceElement[] stackTrace = new StackTraceElement[0]; -+ private StackTraceElement[] stackTrace = org.plazmamc.plazma.EmptyConstants.STACK_TRACE_ELEMENT; // Plazma - - public CrashReportCategory(String title) { - this.title = title; -diff --git a/src/main/java/net/minecraft/Util.java b/src/main/java/net/minecraft/Util.java -index c60c73d9f998260f3abe6fe445255c6e7c38b0c3..cf0d0b75b3e5833406d84aaa7b432d80314970d4 100644 ---- a/src/main/java/net/minecraft/Util.java -+++ b/src/main/java/net/minecraft/Util.java -@@ -401,7 +401,7 @@ public class Util { - } else if (futures.size() == 1) { - return futures.get(0).thenApply(List::of); - } else { -- CompletableFuture completableFuture = CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])); -+ CompletableFuture completableFuture = CompletableFuture.allOf(futures.toArray(org.plazmamc.plazma.EmptyConstants.COMPLETABLE_FUTURES)); // Plazma - return completableFuture.thenApply((void_) -> { - return futures.stream().map(CompletableFuture::join).toList(); - }); -diff --git a/src/main/java/net/minecraft/advancements/AdvancementRewards.java b/src/main/java/net/minecraft/advancements/AdvancementRewards.java -index 1cf85f7920023331c325822046edb33f310acd20..1f937dab74d368a0f75687ba696c9a9424163051 100644 ---- a/src/main/java/net/minecraft/advancements/AdvancementRewards.java -+++ b/src/main/java/net/minecraft/advancements/AdvancementRewards.java -@@ -24,7 +24,8 @@ import net.minecraft.world.level.storage.loot.parameters.LootContextParamSets; - import net.minecraft.world.level.storage.loot.parameters.LootContextParams; - - public class AdvancementRewards { -- public static final AdvancementRewards EMPTY = new AdvancementRewards(0, new ResourceLocation[0], new ResourceLocation[0], CommandFunction.CacheableFunction.NONE); -+ private static final ResourceLocation[] EMPTY_LOCATION = new ResourceLocation[0]; // Plazma -+ public static final AdvancementRewards EMPTY = new AdvancementRewards(0, EMPTY_LOCATION, EMPTY_LOCATION, CommandFunction.CacheableFunction.NONE); // Plazma - private final int experience; - private final ResourceLocation[] loot; - private final ResourceLocation[] recipes; -diff --git a/src/main/java/net/minecraft/advancements/RequirementsStrategy.java b/src/main/java/net/minecraft/advancements/RequirementsStrategy.java -index 051c1fb81d79c40be683edb86579bb975643bcb3..f22dec61e0cc1db80ad435d168b8e877bba3695d 100644 ---- a/src/main/java/net/minecraft/advancements/RequirementsStrategy.java -+++ b/src/main/java/net/minecraft/advancements/RequirementsStrategy.java -@@ -14,7 +14,7 @@ public interface RequirementsStrategy { - return strings; - }; - RequirementsStrategy OR = (criteriaNames) -> { -- return new String[][]{criteriaNames.toArray(new String[0])}; -+ return new String[][]{criteriaNames.toArray(org.plazmamc.plazma.EmptyConstants.STRING)}; // Plazma - }; - - String[][] createRequirements(Collection criteriaNames); -diff --git a/src/main/java/net/minecraft/advancements/critereon/ContextAwarePredicate.java b/src/main/java/net/minecraft/advancements/critereon/ContextAwarePredicate.java -index bb1f97878f1fbf192207576cc515981f696294c3..2a89d13bd21bc549e498ea718cc8c88ab7460885 100644 ---- a/src/main/java/net/minecraft/advancements/critereon/ContextAwarePredicate.java -+++ b/src/main/java/net/minecraft/advancements/critereon/ContextAwarePredicate.java -@@ -11,7 +11,7 @@ import net.minecraft.world.level.storage.loot.predicates.LootItemCondition; - import net.minecraft.world.level.storage.loot.predicates.LootItemConditions; - - public class ContextAwarePredicate { -- public static final ContextAwarePredicate ANY = new ContextAwarePredicate(new LootItemCondition[0]); -+ public static final ContextAwarePredicate ANY = new ContextAwarePredicate(org.plazmamc.plazma.EmptyConstants.LOOT_ITEM_CONDITIONS); // Plazma - private final LootItemCondition[] conditions; - private final Predicate compositePredicates; - -diff --git a/src/main/java/net/minecraft/advancements/critereon/EntityPredicate.java b/src/main/java/net/minecraft/advancements/critereon/EntityPredicate.java -index 9304f85ac41a89b39db59ef4b6e363d0f46cdbec..a2bf13d895456566bc0938b6931fb61a9606f129 100644 ---- a/src/main/java/net/minecraft/advancements/critereon/EntityPredicate.java -+++ b/src/main/java/net/minecraft/advancements/critereon/EntityPredicate.java -@@ -88,7 +88,7 @@ public class EntityPredicate { - - return contextAwarePredicates; - } else { -- return new ContextAwarePredicate[0]; -+ return org.plazmamc.plazma.EmptyConstants.CONTEXT_AWARE_PREDICATES; // Plazma - } - } - -diff --git a/src/main/java/net/minecraft/advancements/critereon/ItemPredicate.java b/src/main/java/net/minecraft/advancements/critereon/ItemPredicate.java -index e6960637aafdcd8ad9fa20991d57f9c9c4998036..79145d941c2750b799c3bf5eff3010a426a58153 100644 ---- a/src/main/java/net/minecraft/advancements/critereon/ItemPredicate.java -+++ b/src/main/java/net/minecraft/advancements/critereon/ItemPredicate.java -@@ -213,7 +213,7 @@ public class ItemPredicate { - - return itemPredicates; - } else { -- return new ItemPredicate[0]; -+ return org.plazmamc.plazma.EmptyConstants.ITEM_PREDICATES; // Plazma - } - } - -diff --git a/src/main/java/net/minecraft/advancements/critereon/KilledByCrossbowTrigger.java b/src/main/java/net/minecraft/advancements/critereon/KilledByCrossbowTrigger.java -index 818fd4b06c804e9640e3efb63f1e1b34dd73c636..318a7a0a161c0f73c4565e593ee1d66fbadab041 100644 ---- a/src/main/java/net/minecraft/advancements/critereon/KilledByCrossbowTrigger.java -+++ b/src/main/java/net/minecraft/advancements/critereon/KilledByCrossbowTrigger.java -@@ -64,7 +64,7 @@ public class KilledByCrossbowTrigger extends SimpleCriterionTrigger { - } - - public void clear() { -- this.data = new byte[0]; -+ this.data = org.plazmamc.plazma.EmptyConstants.BYTE; // Plazma - } - - @Override -diff --git a/src/main/java/net/minecraft/nbt/CompoundTag.java b/src/main/java/net/minecraft/nbt/CompoundTag.java -index 7e94ebe06fc62293e665d6db19e42d947e7eb30f..bfe9fcc1f1ccc663672f6220aeb2d9244164cd8f 100644 ---- a/src/main/java/net/minecraft/nbt/CompoundTag.java -+++ b/src/main/java/net/minecraft/nbt/CompoundTag.java -@@ -379,7 +379,7 @@ public class CompoundTag implements Tag { - throw new ReportedException(this.createReport(key, ByteArrayTag.TYPE, var3)); - } - -- return new byte[0]; -+ return org.plazmamc.plazma.EmptyConstants.BYTE; // Plazma - } - - public int[] getIntArray(String key) { -@@ -391,7 +391,7 @@ public class CompoundTag implements Tag { - throw new ReportedException(this.createReport(key, IntArrayTag.TYPE, var3)); - } - -- return new int[0]; -+ return org.plazmamc.plazma.EmptyConstants.INT; // Plazma - } - - public long[] getLongArray(String key) { -@@ -403,7 +403,7 @@ public class CompoundTag implements Tag { - throw new ReportedException(this.createReport(key, LongArrayTag.TYPE, var3)); - } - -- return new long[0]; -+ return org.plazmamc.plazma.EmptyConstants.LONG; // Plazma - } - - public CompoundTag getCompound(String key) { -diff --git a/src/main/java/net/minecraft/nbt/IntArrayTag.java b/src/main/java/net/minecraft/nbt/IntArrayTag.java -index 25ad2c6ff968f4a6b16b4dea3f67341a4261f2a4..435bdec39b9f744eb8a7ad327c7facf40c08d612 100644 ---- a/src/main/java/net/minecraft/nbt/IntArrayTag.java -+++ b/src/main/java/net/minecraft/nbt/IntArrayTag.java -@@ -189,7 +189,7 @@ public class IntArrayTag extends CollectionTag { - } - - public void clear() { -- this.data = new int[0]; -+ this.data = org.plazmamc.plazma.EmptyConstants.INT; // Plazma - } - - @Override -diff --git a/src/main/java/net/minecraft/nbt/ListTag.java b/src/main/java/net/minecraft/nbt/ListTag.java -index b74b77ec2fd45c7a44e4f2696c4f57075c3d4080..f55dd4d1e094b0ccda307d83e9c3b5f180236547 100644 ---- a/src/main/java/net/minecraft/nbt/ListTag.java -+++ b/src/main/java/net/minecraft/nbt/ListTag.java -@@ -230,7 +230,7 @@ public class ListTag extends CollectionTag { - } - } - -- return new int[0]; -+ return org.plazmamc.plazma.EmptyConstants.INT; // Plazma - } - - public long[] getLongArray(int index) { -@@ -241,7 +241,7 @@ public class ListTag extends CollectionTag { - } - } - -- return new long[0]; -+ return org.plazmamc.plazma.EmptyConstants.LONG; // Plazma - } - - public double getDouble(int index) { -diff --git a/src/main/java/net/minecraft/nbt/LongArrayTag.java b/src/main/java/net/minecraft/nbt/LongArrayTag.java -index bdc0adc652228328ebe8fe2455c73c257a89d3c5..22f5b4ddde241436962aef4abe013541c7184493 100644 ---- a/src/main/java/net/minecraft/nbt/LongArrayTag.java -+++ b/src/main/java/net/minecraft/nbt/LongArrayTag.java -@@ -193,7 +193,7 @@ public class LongArrayTag extends CollectionTag { - - @Override - public void clear() { -- this.data = new long[0]; -+ this.data = org.plazmamc.plazma.EmptyConstants.LONG; // Plazma - } - - @Override -diff --git a/src/main/java/net/minecraft/network/CipherBase.java b/src/main/java/net/minecraft/network/CipherBase.java -index a2920b8a9eff77d9c5d1d7f70ad3abdacba8f0fa..50d620fc893ca010b7ecb43b7a4617d67510d03f 100644 ---- a/src/main/java/net/minecraft/network/CipherBase.java -+++ b/src/main/java/net/minecraft/network/CipherBase.java -@@ -7,8 +7,8 @@ import javax.crypto.ShortBufferException; - - public class CipherBase { - private final Cipher cipher; -- private byte[] heapIn = new byte[0]; -- private byte[] heapOut = new byte[0]; -+ private byte[] heapIn = org.plazmamc.plazma.EmptyConstants.BYTE; // Plazma -+ private byte[] heapOut = org.plazmamc.plazma.EmptyConstants.BYTE; // Plazma - - protected CipherBase(Cipher cipher) { - this.cipher = cipher; -diff --git a/src/main/java/net/minecraft/network/Connection.java b/src/main/java/net/minecraft/network/Connection.java -index 13144ea01bc27db95a13b267d39529b012a4c9c4..9a6d6f947f33481e8a7aa09469955218d31e194a 100644 ---- a/src/main/java/net/minecraft/network/Connection.java -+++ b/src/main/java/net/minecraft/network/Connection.java -@@ -325,7 +325,7 @@ public class Connection extends SimpleChannelInboundHandler> { - } - - public void setListener(PacketListener listener) { -- Validate.notNull(listener, "packetListener", new Object[0]); -+ Validate.notNull(listener, "packetListener", org.plazmamc.plazma.EmptyConstants.OBJECT); // Plazma - this.packetListener = listener; - } - // Paper start -diff --git a/src/main/java/net/minecraft/network/chat/contents/TranslatableContents.java b/src/main/java/net/minecraft/network/chat/contents/TranslatableContents.java -index 8a68baf6bd46b59cf57c94ffe5651d47a7cae99c..6a979d584b1f27d6838332318488814d3db89a47 100644 ---- a/src/main/java/net/minecraft/network/chat/contents/TranslatableContents.java -+++ b/src/main/java/net/minecraft/network/chat/contents/TranslatableContents.java -@@ -21,7 +21,7 @@ import net.minecraft.network.chat.Style; - import net.minecraft.world.entity.Entity; - - public class TranslatableContents implements ComponentContents { -- public static final Object[] NO_ARGS = new Object[0]; -+ public static final Object[] NO_ARGS = org.plazmamc.plazma.EmptyConstants.OBJECT; // Plazma - private static final FormattedText TEXT_PERCENT = FormattedText.of("%"); - private static final FormattedText TEXT_NULL = FormattedText.of("null"); - private final String key; -diff --git a/src/main/java/net/minecraft/network/protocol/game/ClientboundSectionBlocksUpdatePacket.java b/src/main/java/net/minecraft/network/protocol/game/ClientboundSectionBlocksUpdatePacket.java -index e3f355c85eb7cc8c1683e3009502c10a5ed32daa..50bc08280120ceaa321e30482358b3f4dbe8b3bd 100644 ---- a/src/main/java/net/minecraft/network/protocol/game/ClientboundSectionBlocksUpdatePacket.java -+++ b/src/main/java/net/minecraft/network/protocol/game/ClientboundSectionBlocksUpdatePacket.java -@@ -63,7 +63,7 @@ public class ClientboundSectionBlocksUpdatePacket implements Packet blockChanges) { - this.sectionPos = sectionPos; - this.positions = blockChanges.keySet().toShortArray(); -- this.states = blockChanges.values().toArray(new BlockState[0]); -+ this.states = blockChanges.values().toArray(org.plazmamc.plazma.EmptyConstants.BLOCK_STATE); // Plazma - } - // Paper end - -diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java -index 93ff3ef401d4212cede5290990528988c7ca3a0c..6e13d11d685930acad1c3a80571b73258a6f6f9d 100644 ---- a/src/main/java/net/minecraft/server/MinecraftServer.java -+++ b/src/main/java/net/minecraft/server/MinecraftServer.java -@@ -1369,10 +1369,10 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop loadStatusIcon() { - Optional optional = Optional.of(this.getFile("server-icon.png").toPath()).filter((path) -> { -- return Files.isRegularFile(path, new LinkOption[0]); -+ return Files.isRegularFile(path, org.plazmamc.plazma.EmptyConstants.LINK_OPTION); // Plazma - }).or(() -> { - return this.storageSource.getIconFile().filter((path) -> { -- return Files.isRegularFile(path, new LinkOption[0]); -+ return Files.isRegularFile(path, org.plazmamc.plazma.EmptyConstants.LINK_OPTION); // Plazma - }); - }); - -diff --git a/src/main/java/net/minecraft/server/PlayerAdvancements.java b/src/main/java/net/minecraft/server/PlayerAdvancements.java -index 69d349613f01ab0ac1890734657da52984704f29..1c5ba90fcd291b68fbdf9cecc5c3b1f39e266305 100644 ---- a/src/main/java/net/minecraft/server/PlayerAdvancements.java -+++ b/src/main/java/net/minecraft/server/PlayerAdvancements.java -@@ -124,7 +124,7 @@ public class PlayerAdvancements { - } - - private void load(ServerAdvancementManager advancementLoader) { -- if (Files.isRegularFile(this.playerSavePath, new LinkOption[0])) { -+ if (Files.isRegularFile(this.playerSavePath, org.plazmamc.plazma.EmptyConstants.LINK_OPTION)) { // Plazma - try { - JsonReader jsonreader = new JsonReader(Files.newBufferedReader(this.playerSavePath, StandardCharsets.UTF_8)); - -diff --git a/src/main/java/net/minecraft/server/RunningOnDifferentThreadException.java b/src/main/java/net/minecraft/server/RunningOnDifferentThreadException.java -index 0f52e8a61ca7e57e9f52473dceb9cc3464c0c86d..9ee75ed89b2034d1654680f32ec05948c0bfac41 100644 ---- a/src/main/java/net/minecraft/server/RunningOnDifferentThreadException.java -+++ b/src/main/java/net/minecraft/server/RunningOnDifferentThreadException.java -@@ -4,12 +4,12 @@ public final class RunningOnDifferentThreadException extends RuntimeException { - public static final RunningOnDifferentThreadException RUNNING_ON_DIFFERENT_THREAD = new RunningOnDifferentThreadException(); - - private RunningOnDifferentThreadException() { -- this.setStackTrace(new StackTraceElement[0]); -+ this.setStackTrace(org.plazmamc.plazma.EmptyConstants.STACK_TRACE_ELEMENT); // Plazma - } - - @Override - public synchronized Throwable fillInStackTrace() { -- this.setStackTrace(new StackTraceElement[0]); -+ this.setStackTrace(org.plazmamc.plazma.EmptyConstants.STACK_TRACE_ELEMENT); // Plazma - return this; - } - } -diff --git a/src/main/java/net/minecraft/server/ServerFunctionLibrary.java b/src/main/java/net/minecraft/server/ServerFunctionLibrary.java -index 975422a57b83a31e63a600bb4ff9c4e2baaf6da7..b80dff95660314e4dd27e2ada94aa31598883b4e 100644 ---- a/src/main/java/net/minecraft/server/ServerFunctionLibrary.java -+++ b/src/main/java/net/minecraft/server/ServerFunctionLibrary.java -@@ -81,7 +81,7 @@ public class ServerFunctionLibrary implements PreparableReloadListener { - }, prepareExecutor)); - } - -- CompletableFuture[] completableFutures = map.values().toArray(new CompletableFuture[0]); -+ CompletableFuture[] completableFutures = map.values().toArray(org.plazmamc.plazma.EmptyConstants.COMPLETABLE_FUTURES); // Plazma - return CompletableFuture.allOf(completableFutures).handle((unused, ex) -> { - return map; - }); -diff --git a/src/main/java/net/minecraft/server/level/ChunkMap.java b/src/main/java/net/minecraft/server/level/ChunkMap.java -index 3a7c694ff0e248df3f4d168a5e2e883c0e3cb167..e139d15eda25c47292da549e2d4603a5056788bd 100644 ---- a/src/main/java/net/minecraft/server/level/ChunkMap.java -+++ b/src/main/java/net/minecraft/server/level/ChunkMap.java -@@ -1454,6 +1454,7 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider - private final int range; - SectionPos lastSectionPos; - public final Set seenBy = new ReferenceOpenHashSet<>(); // Paper - optimise map impl -+ private static final ServerPlayerConnection[] EMPTY_CONNECTION = new ServerPlayerConnection[0]; // Plazma - - public TrackedEntity(Entity entity, int i, int j, boolean flag) { - this.serverEntity = new ServerEntity(ChunkMap.this.level, entity, j, flag, this::broadcast, this.seenBy); // CraftBukkit -@@ -1490,7 +1491,7 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider - // stuff could have been removed, so we need to check the trackedPlayers set - // for players that were removed - -- for (ServerPlayerConnection conn : this.seenBy.toArray(new ServerPlayerConnection[0])) { // avoid CME -+ for (ServerPlayerConnection conn : this.seenBy.toArray(EMPTY_CONNECTION)) { // avoid CME // Plazma - if (newTrackerCandidates == null || !newTrackerCandidates.contains(conn.getPlayer())) { - this.updatePlayer(conn.getPlayer()); - } -diff --git a/src/main/java/net/minecraft/server/level/ServerLevel.java b/src/main/java/net/minecraft/server/level/ServerLevel.java -index e009dba395779e2c89a36fe4524e5d40474a29e6..c4cafcc1fb0f3b6bc17b7907ee7c6c034d4bf005 100644 ---- a/src/main/java/net/minecraft/server/level/ServerLevel.java -+++ b/src/main/java/net/minecraft/server/level/ServerLevel.java -@@ -1392,7 +1392,7 @@ public class ServerLevel extends Level implements WorldGenLevel { - - public static List getCurrentlyTickingEntities() { - Entity ticking = currentlyTickingEntity.get(); -- List ret = java.util.Arrays.asList(ticking == null ? new Entity[0] : new Entity[] { ticking }); -+ List ret = java.util.Arrays.asList(ticking == null ? org.plazmamc.plazma.EmptyConstants.ENTITY : new Entity[] { ticking }); // Plazma - - return ret; - } -diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -index 93666cc703b349cbd7752c8c59c980da11e5d34c..2314b39ad62c6d8332ddec6c902dba5aacebfa76 100644 ---- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -+++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java -@@ -436,7 +436,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic - if (this.keepAlivePending) { - if (!this.processedDisconnect && elapsedTime >= 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(Component.translatable("disconnect.timeout", new Object[0]), org.bukkit.event.player.PlayerKickEvent.Cause.TIMEOUT); // Paper - kick event cause -+ this.disconnect(Component.translatable("disconnect.timeout", org.plazmamc.plazma.EmptyConstants.OBJECT), org.bukkit.event.player.PlayerKickEvent.Cause.TIMEOUT); // Paper - kick event cause // Plazma - } - } else { - if (elapsedTime >= 15000L) { // 15 seconds -@@ -924,13 +924,13 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic - // PacketUtils.ensureRunningOnSameThread(packet, this, this.player.serverLevel()); // Paper - run this async - // CraftBukkit start - if (this.chatSpamTickCount.addAndGet(io.papermc.paper.configuration.GlobalConfiguration.get().spamLimiter.tabSpamIncrement) > io.papermc.paper.configuration.GlobalConfiguration.get().spamLimiter.tabSpamLimit && !this.server.getPlayerList().isOp(this.player.getGameProfile())) { // Paper start - split and make configurable -- server.scheduleOnMain(() -> this.disconnect(Component.translatable("disconnect.spam", new Object[0]), org.bukkit.event.player.PlayerKickEvent.Cause.SPAM)); // Paper - kick event cause -+ server.scheduleOnMain(() -> this.disconnect(Component.translatable("disconnect.spam", org.plazmamc.plazma.EmptyConstants.OBJECT), org.bukkit.event.player.PlayerKickEvent.Cause.SPAM)); // Paper - kick event cause // Plazma - return; - } - // Paper start - String str = packet.getCommand(); int index = -1; - if (str.length() > 64 && ((index = str.indexOf(' ')) == -1 || index >= 64)) { -- server.scheduleOnMain(() -> this.disconnect(Component.translatable("disconnect.spam", new Object[0]), org.bukkit.event.player.PlayerKickEvent.Cause.SPAM)); // Paper -+ server.scheduleOnMain(() -> this.disconnect(Component.translatable("disconnect.spam", org.plazmamc.plazma.EmptyConstants.OBJECT), org.bukkit.event.player.PlayerKickEvent.Cause.SPAM)); // Paper // Plazma - return; - } - // Paper end -@@ -3434,7 +3434,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic - // Paper start - if (!org.bukkit.Bukkit.isPrimaryThread()) { - if (this.recipeSpamPackets.addAndGet(io.papermc.paper.configuration.GlobalConfiguration.get().spamLimiter.recipeSpamIncrement) > io.papermc.paper.configuration.GlobalConfiguration.get().spamLimiter.recipeSpamLimit) { -- this.server.scheduleOnMain(() -> this.disconnect(net.minecraft.network.chat.Component.translatable("disconnect.spam", new Object[0]), org.bukkit.event.player.PlayerKickEvent.Cause.SPAM)); // Paper - kick event cause -+ this.server.scheduleOnMain(() -> this.disconnect(net.minecraft.network.chat.Component.translatable("disconnect.spam", org.plazmamc.plazma.EmptyConstants.OBJECT), org.bukkit.event.player.PlayerKickEvent.Cause.SPAM)); // Paper - kick event cause // Plazma - return; - } - } -diff --git a/src/main/java/net/minecraft/server/network/ServerLoginPacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerLoginPacketListenerImpl.java -index 0f1ebdc20460da22c1ff2fee2ff6428654139969..85b8007f0da3b7d77d1caff64000e4fc174f73bf 100644 ---- a/src/main/java/net/minecraft/server/network/ServerLoginPacketListenerImpl.java -+++ b/src/main/java/net/minecraft/server/network/ServerLoginPacketListenerImpl.java -@@ -239,8 +239,8 @@ public class ServerLoginPacketListenerImpl implements ServerLoginPacketListener, - - @Override - public void handleHello(ServerboundHelloPacket packet) { -- Validate.validState(this.state == ServerLoginPacketListenerImpl.State.HELLO, "Unexpected hello packet", new Object[0]); -- if (!org.plazmamc.plazma.configurations.GlobalConfiguration.get().player.allowAnyUsername) Validate.validState(ServerLoginPacketListenerImpl.isValidUsername(packet.name()), "Invalid characters in username", new Object[0]); // Plazma -+ Validate.validState(this.state == ServerLoginPacketListenerImpl.State.HELLO, "Unexpected hello packet", org.plazmamc.plazma.EmptyConstants.OBJECT); // Plazma -+ if (!org.plazmamc.plazma.configurations.GlobalConfiguration.get().player.allowAnyUsername) Validate.validState(ServerLoginPacketListenerImpl.isValidUsername(packet.name()), "Invalid characters in username", org.plazmamc.plazma.EmptyConstants.OBJECT); // Plazma // Plazma - again - // Paper start - validate usernames - if (io.papermc.paper.configuration.GlobalConfiguration.get().proxies.isProxyOnlineMode() && io.papermc.paper.configuration.GlobalConfiguration.get().unsupportedSettings.performUsernameValidation) { - if (!this.iKnowThisMayNotBeTheBestIdeaButPleaseDisableUsernameValidation && !validateUsername(packet.name())) { -@@ -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", org.plazmamc.plazma.EmptyConstants.OBJECT); // Plazma - - 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 b711efca8a834adaf0db902fab34c3c80c9cbad6..4c793f4f7b79e35c4c42d330bb63d29c0ef32124 100644 ---- a/src/main/java/net/minecraft/server/players/PlayerList.java -+++ b/src/main/java/net/minecraft/server/players/PlayerList.java -@@ -710,7 +710,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(Component.translatable("multiplayer.disconnect.duplicate_login", new Object[0]), org.bukkit.event.player.PlayerKickEvent.Cause.DUPLICATE_LOGIN); // Paper - kick event cause -+ entityplayer.connection.disconnect(Component.translatable("multiplayer.disconnect.duplicate_login", org.plazmamc.plazma.EmptyConstants.OBJECT), org.bukkit.event.player.PlayerKickEvent.Cause.DUPLICATE_LOGIN); // Paper - kick event cause // Plazma - } - - // Instead of kicking then returning, we need to store the kick reason -diff --git a/src/main/java/net/minecraft/server/players/StoredUserList.java b/src/main/java/net/minecraft/server/players/StoredUserList.java -index 9e8112fbc40a1d89c0f73ea4452e0fa1bb459bf4..5a9fc24037c92fb17ba4baec79e4f344e16a4128 100644 ---- a/src/main/java/net/minecraft/server/players/StoredUserList.java -+++ b/src/main/java/net/minecraft/server/players/StoredUserList.java -@@ -96,7 +96,7 @@ public abstract class StoredUserList> { - } - - public String[] getUserList() { -- return (String[]) this.map.keySet().toArray(new String[0]); -+ return (String[]) this.map.keySet().toArray(org.plazmamc.plazma.EmptyConstants.STRING); // Plazma - } - - public boolean isEmpty() { -diff --git a/src/main/java/net/minecraft/util/MemoryReserve.java b/src/main/java/net/minecraft/util/MemoryReserve.java -index 0ee04fe6ff6a4d09754f326526ae04fe7226bab2..79046f2d1803eb346d1f184004e6cb09d2a91a36 100644 ---- a/src/main/java/net/minecraft/util/MemoryReserve.java -+++ b/src/main/java/net/minecraft/util/MemoryReserve.java -@@ -11,6 +11,6 @@ public class MemoryReserve { - } - - public static void release() { -- reserve = new byte[0]; -+ reserve = org.plazmamc.plazma.EmptyConstants.BYTE; // Plazma - } - } -diff --git a/src/main/java/net/minecraft/util/ZeroBitStorage.java b/src/main/java/net/minecraft/util/ZeroBitStorage.java -index 311625277a26c9c187025a1036978229241b965f..04a1b316cd6d612a0948d845d7851d3622e4c2af 100644 ---- a/src/main/java/net/minecraft/util/ZeroBitStorage.java -+++ b/src/main/java/net/minecraft/util/ZeroBitStorage.java -@@ -5,7 +5,7 @@ import java.util.function.IntConsumer; - import org.apache.commons.lang3.Validate; - - public class ZeroBitStorage implements BitStorage { -- public static final long[] RAW = new long[0]; -+ //public static final long[] RAW = new long[0]; // Plazma - private final int size; - - public ZeroBitStorage(int size) { -@@ -33,7 +33,7 @@ public class ZeroBitStorage implements BitStorage { - - @Override - public long[] getRaw() { -- return RAW; -+ return org.plazmamc.plazma.EmptyConstants.LONG; // Plazma - } - - @Override -diff --git a/src/main/java/net/minecraft/util/monitoring/jmx/MinecraftServerStatistics.java b/src/main/java/net/minecraft/util/monitoring/jmx/MinecraftServerStatistics.java -index 8d227c8a1e7e8fa21a8d673e8c9acc38104c6fb0..71dc96d2dacde1dc958f8547fc44df8c1a91853c 100644 ---- a/src/main/java/net/minecraft/util/monitoring/jmx/MinecraftServerStatistics.java -+++ b/src/main/java/net/minecraft/util/monitoring/jmx/MinecraftServerStatistics.java -@@ -35,12 +35,13 @@ public final class MinecraftServerStatistics implements DynamicMBean { - return entry.name; - }, Function.identity())); - -+ private static final MBeanNotificationInfo[] EMPTY_INFO = new MBeanNotificationInfo[0]; // Plazma - private MinecraftServerStatistics(MinecraftServer server) { - this.server = server; - MBeanAttributeInfo[] mBeanAttributeInfos = this.attributeDescriptionByName.values().stream().map(MinecraftServerStatistics.AttributeDescription::asMBeanAttributeInfo).toArray((i) -> { - return new MBeanAttributeInfo[i]; - }); -- this.mBeanInfo = new MBeanInfo(MinecraftServerStatistics.class.getSimpleName(), "metrics for dedicated server", mBeanAttributeInfos, (MBeanConstructorInfo[])null, (MBeanOperationInfo[])null, new MBeanNotificationInfo[0]); -+ this.mBeanInfo = new MBeanInfo(MinecraftServerStatistics.class.getSimpleName(), "metrics for dedicated server", mBeanAttributeInfos, (MBeanConstructorInfo[])null, (MBeanOperationInfo[])null, EMPTY_INFO); // Plazma - } - - public static void registerJmxMonitoring(MinecraftServer server) { -diff --git a/src/main/java/net/minecraft/world/entity/animal/Bee.java b/src/main/java/net/minecraft/world/entity/animal/Bee.java -index 6c04c8e7776b2830ac368229da834532e8ce163e..e0200f84270068612e67671cb027cc0c5145bdf9 100644 ---- a/src/main/java/net/minecraft/world/entity/animal/Bee.java -+++ b/src/main/java/net/minecraft/world/entity/animal/Bee.java -@@ -251,7 +251,7 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { - this.goalSelector.addGoal(8, new Bee.BeeWanderGoal()); - this.goalSelector.addGoal(9, new FloatGoal(this)); - this.targetSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur -- this.targetSelector.addGoal(1, (new Bee.BeeHurtByOtherGoal(this)).setAlertOthers(new Class[0])); -+ this.targetSelector.addGoal(1, (new Bee.BeeHurtByOtherGoal(this)).setAlertOthers(org.plazmamc.plazma.EmptyConstants.CLASS)); // Plazma - this.targetSelector.addGoal(2, new Bee.BeeBecomeAngryTargetGoal(this)); - this.targetSelector.addGoal(3, new ResetUniversalAngerTargetGoal<>(this, true)); - } -diff --git a/src/main/java/net/minecraft/world/entity/animal/IronGolem.java b/src/main/java/net/minecraft/world/entity/animal/IronGolem.java -index 64aba511e615983988cdb6a0fd45b7d9d4f2f16d..bb6d976bfc942d42b0ebb672246b795c9f6fce98 100644 ---- a/src/main/java/net/minecraft/world/entity/animal/IronGolem.java -+++ b/src/main/java/net/minecraft/world/entity/animal/IronGolem.java -@@ -122,7 +122,7 @@ public class IronGolem extends AbstractGolem implements NeutralMob { - this.goalSelector.addGoal(8, new RandomLookAroundGoal(this)); - this.targetSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur - this.targetSelector.addGoal(1, new DefendVillageTargetGoal(this)); -- this.targetSelector.addGoal(2, new HurtByTargetGoal(this, new Class[0])); -+ this.targetSelector.addGoal(2, new HurtByTargetGoal(this, org.plazmamc.plazma.EmptyConstants.CLASS)); // Plazma - this.targetSelector.addGoal(3, new NearestAttackableTargetGoal<>(this, Player.class, 10, true, false, this::isAngryAt)); - this.targetSelector.addGoal(3, new NearestAttackableTargetGoal<>(this, Mob.class, 5, false, false, (entityliving) -> { - return entityliving instanceof Enemy && !(entityliving instanceof Creeper); -diff --git a/src/main/java/net/minecraft/world/entity/animal/Panda.java b/src/main/java/net/minecraft/world/entity/animal/Panda.java -index bd7c5f6768a54a3d8ffd585d91414e65936991da..82464cba4f582596252e2b18a09b860e9c3b330c 100644 ---- a/src/main/java/net/minecraft/world/entity/animal/Panda.java -+++ b/src/main/java/net/minecraft/world/entity/animal/Panda.java -@@ -336,7 +336,7 @@ public class Panda extends Animal { - this.goalSelector.addGoal(13, new FollowParentGoal(this, 1.25D)); - this.goalSelector.addGoal(14, new WaterAvoidingRandomStrollGoal(this, 1.0D)); - this.targetSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur -- this.targetSelector.addGoal(1, (new Panda.PandaHurtByTargetGoal(this, new Class[0])).setAlertOthers(new Class[0])); -+ this.targetSelector.addGoal(1, (new Panda.PandaHurtByTargetGoal(this, org.plazmamc.plazma.EmptyConstants.CLASS)).setAlertOthers(org.plazmamc.plazma.EmptyConstants.CLASS)); // Plazma - } - - public static AttributeSupplier.Builder createAttributes() { -diff --git a/src/main/java/net/minecraft/world/entity/animal/Rabbit.java b/src/main/java/net/minecraft/world/entity/animal/Rabbit.java -index 81a33954aedffd18fcfa96babeaf6388715ab3f3..a85da190d9c51303296f4bbf16f26eb2e454e211 100644 ---- a/src/main/java/net/minecraft/world/entity/animal/Rabbit.java -+++ b/src/main/java/net/minecraft/world/entity/animal/Rabbit.java -@@ -460,7 +460,7 @@ public class Rabbit extends Animal implements VariantHolder { - if (variant == Rabbit.Variant.EVIL) { - this.getAttribute(Attributes.ARMOR).setBaseValue(8.0D); - this.goalSelector.addGoal(4, new Rabbit.EvilRabbitAttackGoal(this)); -- this.targetSelector.addGoal(1, (new HurtByTargetGoal(this, new Class[0])).setAlertOthers()); -+ this.targetSelector.addGoal(1, (new HurtByTargetGoal(this, org.plazmamc.plazma.EmptyConstants.CLASS)).setAlertOthers()); // Plazma - this.targetSelector.addGoal(2, new NearestAttackableTargetGoal<>(this, Player.class, true)); - this.targetSelector.addGoal(2, new NearestAttackableTargetGoal<>(this, Wolf.class, true)); - if (!this.hasCustomName()) { -diff --git a/src/main/java/net/minecraft/world/entity/animal/Wolf.java b/src/main/java/net/minecraft/world/entity/animal/Wolf.java -index 64bceae4d06b35fcbecb0daca2496ba30e39d995..805d2027fcb6c06537b3357fe104742a05391224 100644 ---- a/src/main/java/net/minecraft/world/entity/animal/Wolf.java -+++ b/src/main/java/net/minecraft/world/entity/animal/Wolf.java -@@ -239,7 +239,7 @@ public class Wolf extends TamableAnimal implements NeutralMob { - this.targetSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur - this.targetSelector.addGoal(1, new OwnerHurtByTargetGoal(this)); - this.targetSelector.addGoal(2, new OwnerHurtTargetGoal(this)); -- this.targetSelector.addGoal(3, (new HurtByTargetGoal(this, new Class[0])).setAlertOthers()); -+ this.targetSelector.addGoal(3, (new HurtByTargetGoal(this, org.plazmamc.plazma.EmptyConstants.CLASS)).setAlertOthers()); // Plazma - this.targetSelector.addGoal(4, new NearestAttackableTargetGoal<>(this, Player.class, 10, true, false, this::isAngryAt)); - // this.targetSelector.addGoal(5, new NonTameRandomTargetGoal<>(this, Animal.class, false, Wolf.PREY_SELECTOR)); // Purpur - moved to updatePathfinders() - this.targetSelector.addGoal(6, new NonTameRandomTargetGoal<>(this, Turtle.class, false, Turtle.BABY_ON_LAND_SELECTOR)); -diff --git a/src/main/java/net/minecraft/world/entity/boss/wither/WitherBoss.java b/src/main/java/net/minecraft/world/entity/boss/wither/WitherBoss.java -index c94a1b75593ad01e7f79fdc84818ea8ec269e124..b45c1d611ccd80c3b1405aaef153c37bd046f083 100644 ---- a/src/main/java/net/minecraft/world/entity/boss/wither/WitherBoss.java -+++ b/src/main/java/net/minecraft/world/entity/boss/wither/WitherBoss.java -@@ -254,7 +254,7 @@ public class WitherBoss extends Monster implements PowerableMob, RangedAttackMob - this.goalSelector.addGoal(6, new LookAtPlayerGoal(this, Player.class, 8.0F)); - this.goalSelector.addGoal(7, new RandomLookAroundGoal(this)); - this.targetSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur -- this.targetSelector.addGoal(1, new HurtByTargetGoal(this, new Class[0])); -+ this.targetSelector.addGoal(1, new HurtByTargetGoal(this, org.plazmamc.plazma.EmptyConstants.CLASS)); // Plazma - this.targetSelector.addGoal(2, new NearestAttackableTargetGoal<>(this, LivingEntity.class, 0, false, false, WitherBoss.LIVING_ENTITY_SELECTOR)); - } - -diff --git a/src/main/java/net/minecraft/world/entity/monster/AbstractSkeleton.java b/src/main/java/net/minecraft/world/entity/monster/AbstractSkeleton.java -index 917648c2cc52790f40123b27b1cafa3fc3ba4b3f..c765ee642c4b77bfb3f21163c9e7a24b366e0a70 100644 ---- a/src/main/java/net/minecraft/world/entity/monster/AbstractSkeleton.java -+++ b/src/main/java/net/minecraft/world/entity/monster/AbstractSkeleton.java -@@ -79,7 +79,7 @@ public abstract class AbstractSkeleton extends Monster implements RangedAttackMo - this.goalSelector.addGoal(6, new LookAtPlayerGoal(this, Player.class, 8.0F)); - this.goalSelector.addGoal(6, new RandomLookAroundGoal(this)); - this.targetSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur -- this.targetSelector.addGoal(1, new HurtByTargetGoal(this, new Class[0])); -+ this.targetSelector.addGoal(1, new HurtByTargetGoal(this, org.plazmamc.plazma.EmptyConstants.CLASS)); // Plazma - this.targetSelector.addGoal(2, new NearestAttackableTargetGoal<>(this, Player.class, true)); - this.targetSelector.addGoal(3, new NearestAttackableTargetGoal<>(this, IronGolem.class, true)); - this.targetSelector.addGoal(3, new NearestAttackableTargetGoal<>(this, Turtle.class, 10, true, false, Turtle.BABY_ON_LAND_SELECTOR)); -diff --git a/src/main/java/net/minecraft/world/entity/monster/Creeper.java b/src/main/java/net/minecraft/world/entity/monster/Creeper.java -index 304ea7fdcd410a7c88ec61143364e14de8db0b0c..3eea42997caa1b66ac4d9d8da65e3bfe2f67cd0f 100644 ---- a/src/main/java/net/minecraft/world/entity/monster/Creeper.java -+++ b/src/main/java/net/minecraft/world/entity/monster/Creeper.java -@@ -153,7 +153,7 @@ public class Creeper extends Monster implements PowerableMob { - this.goalSelector.addGoal(6, new RandomLookAroundGoal(this)); - this.targetSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur - this.targetSelector.addGoal(1, new NearestAttackableTargetGoal<>(this, Player.class, true)); -- this.targetSelector.addGoal(2, new HurtByTargetGoal(this, new Class[0])); -+ this.targetSelector.addGoal(2, new HurtByTargetGoal(this, org.plazmamc.plazma.EmptyConstants.CLASS)); // Plazma - } - - public static AttributeSupplier.Builder createAttributes() { -diff --git a/src/main/java/net/minecraft/world/entity/monster/EnderMan.java b/src/main/java/net/minecraft/world/entity/monster/EnderMan.java -index 44331be61edffd5afadf3e637dd181bff1133d4f..ff6d4b73cd84c44908315080714d57fef1b5614c 100644 ---- a/src/main/java/net/minecraft/world/entity/monster/EnderMan.java -+++ b/src/main/java/net/minecraft/world/entity/monster/EnderMan.java -@@ -136,7 +136,7 @@ public class EnderMan extends Monster implements NeutralMob { - this.goalSelector.addGoal(11, new EnderMan.EndermanTakeBlockGoal(this)); - this.targetSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur - this.targetSelector.addGoal(1, new EnderMan.EndermanLookForPlayerGoal(this, this::isAngryAt)); -- this.targetSelector.addGoal(2, new HurtByTargetGoal(this, new Class[0])); -+ this.targetSelector.addGoal(2, new HurtByTargetGoal(this, org.plazmamc.plazma.EmptyConstants.CLASS)); // Plazma - this.targetSelector.addGoal(3, new NearestAttackableTargetGoal<>(this, Endermite.class, 10, true, false, (entityliving) -> entityliving.level().purpurConfig.endermanAggroEndermites && entityliving instanceof Endermite endermite && (!entityliving.level().purpurConfig.endermanAggroEndermitesOnlyIfPlayerSpawned || endermite.isPlayerSpawned()))); // Purpur - this.targetSelector.addGoal(4, new ResetUniversalAngerTargetGoal<>(this, false)); - } -diff --git a/src/main/java/net/minecraft/world/entity/monster/Silverfish.java b/src/main/java/net/minecraft/world/entity/monster/Silverfish.java -index 83641c7cf51453e98809900e23f44a68018555ff..b03d42939d55607c74b747ce6704d2fbcf780834 100644 ---- a/src/main/java/net/minecraft/world/entity/monster/Silverfish.java -+++ b/src/main/java/net/minecraft/world/entity/monster/Silverfish.java -@@ -87,7 +87,7 @@ public class Silverfish extends Monster { - this.goalSelector.addGoal(4, new MeleeAttackGoal(this, 1.0D, false)); - this.goalSelector.addGoal(5, new Silverfish.SilverfishMergeWithStoneGoal(this)); - this.targetSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur -- this.targetSelector.addGoal(1, (new HurtByTargetGoal(this, new Class[0])).setAlertOthers()); -+ this.targetSelector.addGoal(1, (new HurtByTargetGoal(this, org.plazmamc.plazma.EmptyConstants.CLASS)).setAlertOthers()); // Plazma - this.targetSelector.addGoal(2, new NearestAttackableTargetGoal<>(this, Player.class, true)); - } - -diff --git a/src/main/java/net/minecraft/world/entity/monster/Spider.java b/src/main/java/net/minecraft/world/entity/monster/Spider.java -index b3ab0f8cdbd678970e39e89c2062772374466b67..0e7a4ef59b01b5cc6ba89ff4f986604ba9aebe45 100644 ---- a/src/main/java/net/minecraft/world/entity/monster/Spider.java -+++ b/src/main/java/net/minecraft/world/entity/monster/Spider.java -@@ -93,7 +93,7 @@ public class Spider extends Monster { - this.goalSelector.addGoal(6, new LookAtPlayerGoal(this, Player.class, 8.0F)); - this.goalSelector.addGoal(6, new RandomLookAroundGoal(this)); - this.targetSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur -- this.targetSelector.addGoal(1, new HurtByTargetGoal(this, new Class[0])); -+ this.targetSelector.addGoal(1, new HurtByTargetGoal(this, org.plazmamc.plazma.EmptyConstants.CLASS)); // Plazma - this.targetSelector.addGoal(2, new Spider.SpiderTargetGoal<>(this, Player.class)); - this.targetSelector.addGoal(3, new Spider.SpiderTargetGoal<>(this, IronGolem.class)); - } -diff --git a/src/main/java/net/minecraft/world/entity/monster/Zombie.java b/src/main/java/net/minecraft/world/entity/monster/Zombie.java -index 7c5efb5582f43d9f333f926ad7dba1ed9920333a..3780f752ec2df3a43746dd3f0107ab37cbd226de 100644 ---- a/src/main/java/net/minecraft/world/entity/monster/Zombie.java -+++ b/src/main/java/net/minecraft/world/entity/monster/Zombie.java -@@ -165,7 +165,7 @@ public class Zombie extends Monster { - this.goalSelector.addGoal(2, new ZombieAttackGoal(this, 1.0D, false)); - this.goalSelector.addGoal(6, new MoveThroughVillageGoal(this, 1.0D, true, 4, this::canBreakDoors)); - this.goalSelector.addGoal(7, new WaterAvoidingRandomStrollGoal(this, 1.0D)); -- this.targetSelector.addGoal(1, (new HurtByTargetGoal(this, new Class[0])).setAlertOthers(ZombifiedPiglin.class)); -+ this.targetSelector.addGoal(1, (new HurtByTargetGoal(this, org.plazmamc.plazma.EmptyConstants.CLASS)).setAlertOthers(ZombifiedPiglin.class)); // Plazma - this.targetSelector.addGoal(2, new NearestAttackableTargetGoal<>(this, Player.class, true)); - // Purpur start - if ( this.level().spigotConfig.zombieAggressiveTowardsVillager ) this.targetSelector.addGoal(3, new NearestAttackableTargetGoal<>(this, AbstractVillager.class, false) { // Spigot -diff --git a/src/main/java/net/minecraft/world/entity/monster/ZombifiedPiglin.java b/src/main/java/net/minecraft/world/entity/monster/ZombifiedPiglin.java -index 7bb99d7fd8e05805e0cac7bec0b2771990057f58..393de8e7abc323f922bfc968fe3fe7a991a2ecd4 100644 ---- a/src/main/java/net/minecraft/world/entity/monster/ZombifiedPiglin.java -+++ b/src/main/java/net/minecraft/world/entity/monster/ZombifiedPiglin.java -@@ -124,7 +124,7 @@ public class ZombifiedPiglin extends Zombie implements NeutralMob { - protected void addBehaviourGoals() { - this.goalSelector.addGoal(2, new ZombieAttackGoal(this, 1.0D, false)); - this.goalSelector.addGoal(7, new WaterAvoidingRandomStrollGoal(this, 1.0D)); -- this.targetSelector.addGoal(1, pathfinderGoalHurtByTarget = (new HurtByTargetGoal(this, new Class[0])).setAlertOthers()); // Paper - assign field -+ this.targetSelector.addGoal(1, pathfinderGoalHurtByTarget = (new HurtByTargetGoal(this, org.plazmamc.plazma.EmptyConstants.CLASS)).setAlertOthers()); // Paper - assign field // Plazma - this.targetSelector.addGoal(2, new NearestAttackableTargetGoal<>(this, Player.class, 10, true, false, this::isAngryAt)); - this.targetSelector.addGoal(3, new ResetUniversalAngerTargetGoal<>(this, true)); - } -diff --git a/src/main/java/net/minecraft/world/item/crafting/ShapedRecipe.java b/src/main/java/net/minecraft/world/item/crafting/ShapedRecipe.java -index 6693dd51440da3f0fc338c4e2cb67d3222eed182..a7849d3d669929ea9a25d688ea6247a6299b0bdf 100644 ---- a/src/main/java/net/minecraft/world/item/crafting/ShapedRecipe.java -+++ b/src/main/java/net/minecraft/world/item/crafting/ShapedRecipe.java -@@ -263,7 +263,7 @@ public class ShapedRecipe extends io.papermc.paper.inventory.recipe.RecipeBookEx - } - - if (pattern.length == l) { -- return new String[0]; -+ return org.plazmamc.plazma.EmptyConstants.STRING; // Plazma - } else { - String[] astring1 = new String[pattern.length - l - k]; - -diff --git a/src/main/java/net/minecraft/world/item/crafting/ShapelessRecipe.java b/src/main/java/net/minecraft/world/item/crafting/ShapelessRecipe.java -index 565318c2afaa1661ed9963453a6354dff499f47a..abd5df5a47d6cc5de0018ad7207232be5bd01d53 100644 ---- a/src/main/java/net/minecraft/world/item/crafting/ShapelessRecipe.java -+++ b/src/main/java/net/minecraft/world/item/crafting/ShapelessRecipe.java -@@ -87,10 +87,11 @@ public class ShapelessRecipe extends io.papermc.paper.inventory.recipe.RecipeBoo - return this.ingredients; - } - -+ private static final Ingredient[] EMPTY_INGREDIENT = new Ingredient[0]; // Plazma - public boolean matches(CraftingContainer inventory, Level world) { - // Pufferfish start - if (!this.isBukkit) { -- java.util.List ingredients = com.google.common.collect.Lists.newArrayList(this.ingredients.toArray(new Ingredient[0])); -+ java.util.List ingredients = com.google.common.collect.Lists.newArrayList(this.ingredients.toArray(EMPTY_INGREDIENT)); // Plazma - - inventory: for (int index = 0; index < inventory.getContainerSize(); index++) { - ItemStack itemStack = inventory.getItem(index); -diff --git a/src/main/java/net/minecraft/world/level/block/ComposterBlock.java b/src/main/java/net/minecraft/world/level/block/ComposterBlock.java -index 596b77306f690a2298835f0f0fea1abee2a7c85d..e781b38bd0925f0250a93222c729a1754ee780bc 100644 ---- a/src/main/java/net/minecraft/world/level/block/ComposterBlock.java -+++ b/src/main/java/net/minecraft/world/level/block/ComposterBlock.java -@@ -443,7 +443,7 @@ public class ComposterBlock extends Block implements WorldlyContainerHolder { - - @Override - public int[] getSlotsForFace(Direction side) { -- return side == Direction.DOWN ? new int[]{0} : new int[0]; -+ return side == Direction.DOWN ? org.plazmamc.plazma.EmptyConstants.ZERO_INT : org.plazmamc.plazma.EmptyConstants.INT; // Plazma - } - - @Override -@@ -492,7 +492,7 @@ public class ComposterBlock extends Block implements WorldlyContainerHolder { - - @Override - public int[] getSlotsForFace(Direction side) { -- return side == Direction.UP ? new int[]{0} : new int[0]; -+ return side == Direction.UP ? org.plazmamc.plazma.EmptyConstants.ZERO_INT : org.plazmamc.plazma.EmptyConstants.INT; // Plazma - } - - @Override -@@ -534,7 +534,7 @@ public class ComposterBlock extends Block implements WorldlyContainerHolder { - - @Override - public int[] getSlotsForFace(Direction side) { -- return new int[0]; -+ return org.plazmamc.plazma.EmptyConstants.INT; // Plazma - } - - @Override -diff --git a/src/main/java/net/minecraft/world/level/block/entity/HopperBlockEntity.java b/src/main/java/net/minecraft/world/level/block/entity/HopperBlockEntity.java -index f03608a133338b0f5522a07239e06fd2245db1e5..31f2f322e7018a264719cc916f70fc8c28e91811 100644 ---- a/src/main/java/net/minecraft/world/level/block/entity/HopperBlockEntity.java -+++ b/src/main/java/net/minecraft/world/level/block/entity/HopperBlockEntity.java -@@ -758,7 +758,7 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen - - // Paper start - optimize hopper item suck in - static final AABB HOPPER_ITEM_SUCK_OVERALL = Hopper.SUCK.bounds(); -- static final AABB[] HOPPER_ITEM_SUCK_INDIVIDUAL = Hopper.SUCK.toAabbs().toArray(new AABB[0]); -+ static final AABB[] HOPPER_ITEM_SUCK_INDIVIDUAL = Hopper.SUCK.toAabbs().toArray(new AABB[0]); // Plazma - // Paper end - optimize hopper item suck in - - public static List getItemsAtAndAbove(Level world, Hopper hopper) { -diff --git a/src/main/java/net/minecraft/world/level/chunk/storage/RegionFile.java b/src/main/java/net/minecraft/world/level/chunk/storage/RegionFile.java -index 0c5ac12b1f395bba8b7fc50baf8e825ba6488f6c..ea60ec1bfb4f709921b9328d2f4fa21bec1723b3 100644 ---- a/src/main/java/net/minecraft/world/level/chunk/storage/RegionFile.java -+++ b/src/main/java/net/minecraft/world/level/chunk/storage/RegionFile.java -@@ -445,7 +445,7 @@ public class RegionFile implements AutoCloseable { - initOversizedState(); // Paper - this.usedSectors = new RegionBitmap(); - this.version = outputChunkStreamVersion; -- if (!Files.isDirectory(directory, new LinkOption[0])) { -+ if (!Files.isDirectory(directory, org.plazmamc.plazma.EmptyConstants.LINK_OPTION)) { // Plazma - throw new IllegalArgumentException("Expected directory, got " + directory.toAbsolutePath()); - } else { - this.externalFileDir = directory; -@@ -701,7 +701,7 @@ public class RegionFile implements AutoCloseable { - private DataInputStream createExternalChunkInputStream(ChunkPos pos, byte flags) throws IOException { - Path path = this.getExternalChunkPath(pos); - -- if (!Files.isRegularFile(path, new LinkOption[0])) { -+ if (!Files.isRegularFile(path, org.plazmamc.plazma.EmptyConstants.LINK_OPTION)) { // Plazma - RegionFile.LOGGER.error("External chunk path {} is not file", path); - return null; - } else { -@@ -753,7 +753,7 @@ public class RegionFile implements AutoCloseable { - return false; - } - -- if (!Files.isRegularFile(this.getExternalChunkPath(pos), new LinkOption[0])) { -+ if (!Files.isRegularFile(this.getExternalChunkPath(pos), org.plazmamc.plazma.EmptyConstants.LINK_OPTION)) { // Plazma - return false; - } - } else { -diff --git a/src/main/java/net/minecraft/world/level/levelgen/DebugLevelSource.java b/src/main/java/net/minecraft/world/level/levelgen/DebugLevelSource.java -index c68736b023127c7b395835f4fa82d9062110697b..bee65f019e35dd44e6754755c99ff113849176da 100644 ---- a/src/main/java/net/minecraft/world/level/levelgen/DebugLevelSource.java -+++ b/src/main/java/net/minecraft/world/level/levelgen/DebugLevelSource.java -@@ -88,7 +88,7 @@ public class DebugLevelSource extends ChunkGenerator { - - @Override - public NoiseColumn getBaseColumn(int x, int z, LevelHeightAccessor world, RandomState noiseConfig) { -- return new NoiseColumn(0, new BlockState[0]); -+ return new NoiseColumn(0, org.plazmamc.plazma.EmptyConstants.BLOCK_STATE); // Plazma - } - - @Override -diff --git a/src/main/java/net/minecraft/world/level/pathfinder/Path.java b/src/main/java/net/minecraft/world/level/pathfinder/Path.java -index 2a335f277bd0e4b8ad0f60d8226eb8aaa80a871f..c4395df154e8c7066d213316f300d62db9231e5c 100644 ---- a/src/main/java/net/minecraft/world/level/pathfinder/Path.java -+++ b/src/main/java/net/minecraft/world/level/pathfinder/Path.java -@@ -13,8 +13,11 @@ import net.minecraft.world.phys.Vec3; - - public class Path { - public final List nodes; -- private Node[] openSet = new Node[0]; -- private Node[] closedSet = new Node[0]; -+ // Plazma start -+ private static final Node[] EMPTY_NODE = new Node[0]; -+ private Node[] openSet = EMPTY_NODE; -+ private Node[] closedSet = EMPTY_NODE; -+ // Plazma end - @Nullable - private Set targetNodes; - private int nextNodeIndex; -diff --git a/src/main/java/net/minecraft/world/level/storage/LevelStorageSource.java b/src/main/java/net/minecraft/world/level/storage/LevelStorageSource.java -index ef8b794d1a017f02f90368a48cec2ea7bb57f218..52bf65c0ec0651a24fc3ee187d99451ef640f996 100644 ---- a/src/main/java/net/minecraft/world/level/storage/LevelStorageSource.java -+++ b/src/main/java/net/minecraft/world/level/storage/LevelStorageSource.java -@@ -101,7 +101,7 @@ public class LevelStorageSource { - } - - public static DirectoryValidator parseValidator(Path allowedSymlinksFile) { -- if (Files.exists(allowedSymlinksFile, new LinkOption[0])) { -+ if (Files.exists(allowedSymlinksFile, org.plazmamc.plazma.EmptyConstants.LINK_OPTION)) { // Plazma - try { - BufferedReader bufferedreader = Files.newBufferedReader(allowedSymlinksFile); - -@@ -171,7 +171,7 @@ public class LevelStorageSource { - } - - public LevelStorageSource.LevelCandidates findLevelCandidates() throws LevelStorageException { -- if (!Files.isDirectory(this.baseDir, new LinkOption[0])) { -+ if (!Files.isDirectory(this.baseDir, org.plazmamc.plazma.EmptyConstants.LINK_OPTION)) { // Plazma - throw new LevelStorageException(Component.translatable("selectWorld.load_folder_access")); - } else { - try { -@@ -181,9 +181,9 @@ public class LevelStorageSource { - - try { - List list = stream.filter((path) -> { -- return Files.isDirectory(path, new LinkOption[0]); -+ return Files.isDirectory(path, org.plazmamc.plazma.EmptyConstants.LINK_OPTION); // Plazma - }).map(LevelStorageSource.LevelDirectory::new).filter((convertable_b) -> { -- return Files.isRegularFile(convertable_b.dataFile(), new LinkOption[0]) || Files.isRegularFile(convertable_b.oldDataFile(), new LinkOption[0]); -+ return Files.isRegularFile(convertable_b.dataFile(), org.plazmamc.plazma.EmptyConstants.LINK_OPTION) || Files.isRegularFile(convertable_b.oldDataFile(), org.plazmamc.plazma.EmptyConstants.LINK_OPTION); // Plazma - }).toList(); - - convertable_a = new LevelStorageSource.LevelCandidates(list); -@@ -255,12 +255,12 @@ public class LevelStorageSource { - - @Nullable - T readLevelData(LevelStorageSource.LevelDirectory levelSave, BiFunction levelDataParser) { -- if (!Files.exists(levelSave.path(), new LinkOption[0])) { -+ if (!Files.exists(levelSave.path(), org.plazmamc.plazma.EmptyConstants.LINK_OPTION)) { // Plazma - return null; - } else { - Path path = levelSave.dataFile(); - -- if (Files.exists(path, new LinkOption[0])) { -+ if (Files.exists(path, org.plazmamc.plazma.EmptyConstants.LINK_OPTION)) { // Plazma - T t0 = levelDataParser.apply(path, this.fixerUpper); - - if (t0 != null) { -@@ -269,7 +269,7 @@ public class LevelStorageSource { - } - - path = levelSave.oldDataFile(); -- return Files.exists(path, new LinkOption[0]) ? levelDataParser.apply(path, this.fixerUpper) : null; -+ return Files.exists(path, org.plazmamc.plazma.EmptyConstants.LINK_OPTION) ? levelDataParser.apply(path, this.fixerUpper) : null; // Plazma - } - } - -@@ -400,7 +400,7 @@ public class LevelStorageSource { - } - - public boolean levelExists(String name) { -- return Files.isDirectory(this.getLevelPath(name), new LinkOption[0]); -+ return Files.isDirectory(this.getLevelPath(name), org.plazmamc.plazma.EmptyConstants.LINK_OPTION); // Plazma - } - - private Path getLevelPath(String name) { -@@ -645,7 +645,7 @@ public class LevelStorageSource { - this.checkLock(); - Path path = this.levelDirectory.dataFile(); - -- if (Files.exists(path, new LinkOption[0])) { -+ if (Files.exists(path, org.plazmamc.plazma.EmptyConstants.LINK_OPTION)) { // Plazma - CompoundTag nbttagcompound = NbtIo.readCompressed(path.toFile()); - CompoundTag nbttagcompound1 = nbttagcompound.getCompound("Data"); - -diff --git a/src/main/java/net/minecraft/world/level/storage/PlayerDataStorage.java b/src/main/java/net/minecraft/world/level/storage/PlayerDataStorage.java -index 039c952f0c157cba6e79fa9b976958bd1763a922..1899e5a1421ef98cc27199490e3c946e03c75f9f 100644 ---- a/src/main/java/net/minecraft/world/level/storage/PlayerDataStorage.java -+++ b/src/main/java/net/minecraft/world/level/storage/PlayerDataStorage.java -@@ -120,7 +120,7 @@ public class PlayerDataStorage { - String[] astring = this.playerDir.list(); - - if (astring == null) { -- astring = new String[0]; -+ astring = org.plazmamc.plazma.EmptyConstants.STRING; // Plazma - } - - for (int i = 0; i < astring.length; ++i) { -diff --git a/src/main/java/net/minecraft/world/level/storage/loot/LootPool.java b/src/main/java/net/minecraft/world/level/storage/loot/LootPool.java -index fad524f8b032174cee0c68da7c68e020ee3cd619..6175eee025d98f4a7ab78042afef32fb45586045 100644 ---- a/src/main/java/net/minecraft/world/level/storage/loot/LootPool.java -+++ b/src/main/java/net/minecraft/world/level/storage/loot/LootPool.java -@@ -160,7 +160,7 @@ public class LootPool { - if (this.rolls == null) { - throw new IllegalArgumentException("Rolls not set"); - } else { -- return new LootPool(this.entries.toArray(new LootPoolEntryContainer[0]), this.conditions.toArray(new LootItemCondition[0]), this.functions.toArray(new LootItemFunction[0]), this.rolls, this.bonusRolls); -+ return new LootPool(this.entries.toArray(org.plazmamc.plazma.EmptyConstants.LOOT_POOL_ENTRY_CONTAINERS), this.conditions.toArray(org.plazmamc.plazma.EmptyConstants.LOOT_ITEM_CONDITIONS), this.functions.toArray(org.plazmamc.plazma.EmptyConstants.LOOT_ITEM_FUNCTION), this.rolls, this.bonusRolls); // Plazma - } - } - } -@@ -170,8 +170,8 @@ public class LootPool { - public LootPool deserialize(JsonElement jsonElement, Type type, JsonDeserializationContext jsonDeserializationContext) throws JsonParseException { - JsonObject jsonObject = GsonHelper.convertToJsonObject(jsonElement, "loot pool"); - LootPoolEntryContainer[] lootPoolEntryContainers = GsonHelper.getAsObject(jsonObject, "entries", jsonDeserializationContext, LootPoolEntryContainer[].class); -- LootItemCondition[] lootItemConditions = GsonHelper.getAsObject(jsonObject, "conditions", new LootItemCondition[0], jsonDeserializationContext, LootItemCondition[].class); -- LootItemFunction[] lootItemFunctions = GsonHelper.getAsObject(jsonObject, "functions", new LootItemFunction[0], jsonDeserializationContext, LootItemFunction[].class); -+ LootItemCondition[] lootItemConditions = GsonHelper.getAsObject(jsonObject, "conditions", org.plazmamc.plazma.EmptyConstants.LOOT_ITEM_CONDITIONS, jsonDeserializationContext, LootItemCondition[].class); // Plazma -+ LootItemFunction[] lootItemFunctions = GsonHelper.getAsObject(jsonObject, "functions", org.plazmamc.plazma.EmptyConstants.LOOT_ITEM_FUNCTION, jsonDeserializationContext, LootItemFunction[].class); // Plazma - NumberProvider numberProvider = GsonHelper.getAsObject(jsonObject, "rolls", jsonDeserializationContext, NumberProvider.class); - NumberProvider numberProvider2 = GsonHelper.getAsObject(jsonObject, "bonus_rolls", ConstantValue.exactly(0.0F), jsonDeserializationContext, NumberProvider.class); - return new LootPool(lootPoolEntryContainers, lootItemConditions, lootItemFunctions, numberProvider, numberProvider2); -diff --git a/src/main/java/net/minecraft/world/level/storage/loot/LootTable.java b/src/main/java/net/minecraft/world/level/storage/loot/LootTable.java -index e46a0afa45ee771a0114703acc314d7cf8e8ffed..687a7de03846bceeee4e1db2459d6c9cafb5f3b6 100644 ---- a/src/main/java/net/minecraft/world/level/storage/loot/LootTable.java -+++ b/src/main/java/net/minecraft/world/level/storage/loot/LootTable.java -@@ -44,7 +44,7 @@ import org.bukkit.event.world.LootGenerateEvent; - public class LootTable { - - static final Logger LOGGER = LogUtils.getLogger(); -- public static final LootTable EMPTY = new LootTable(LootContextParamSets.EMPTY, (ResourceLocation) null, new LootPool[0], new LootItemFunction[0]); -+ public static final LootTable EMPTY = new LootTable(LootContextParamSets.EMPTY, (ResourceLocation) null, org.plazmamc.plazma.EmptyConstants.LOOT_POOL, org.plazmamc.plazma.EmptyConstants.LOOT_ITEM_FUNCTION); // Plazma - public static final LootContextParamSet DEFAULT_PARAM_SET = LootContextParamSets.ALL_PARAMS; - final LootContextParamSet paramSet; - @Nullable -@@ -285,7 +285,7 @@ public class LootTable { - } - - public LootTable build() { -- return new LootTable(this.paramSet, this.randomSequence, (LootPool[]) this.pools.toArray(new LootPool[0]), (LootItemFunction[]) this.functions.toArray(new LootItemFunction[0])); -+ return new LootTable(this.paramSet, this.randomSequence, (LootPool[]) this.pools.toArray(org.plazmamc.plazma.EmptyConstants.LOOT_POOL), (LootItemFunction[]) this.functions.toArray(org.plazmamc.plazma.EmptyConstants.LOOT_ITEM_FUNCTION)); // Plazma - } - } - -@@ -295,7 +295,7 @@ public class LootTable { - - public LootTable deserialize(JsonElement jsonelement, Type type, JsonDeserializationContext jsondeserializationcontext) throws JsonParseException { - JsonObject jsonobject = GsonHelper.convertToJsonObject(jsonelement, "loot table"); -- LootPool[] alootselector = (LootPool[]) GsonHelper.getAsObject(jsonobject, "pools", new LootPool[0], jsondeserializationcontext, LootPool[].class); -+ LootPool[] alootselector = (LootPool[]) GsonHelper.getAsObject(jsonobject, "pools", org.plazmamc.plazma.EmptyConstants.LOOT_POOL, jsondeserializationcontext, LootPool[].class); // Plazma - LootContextParamSet lootcontextparameterset = null; - - if (jsonobject.has("type")) { -@@ -314,7 +314,7 @@ public class LootTable { - minecraftkey = null; - } - -- LootItemFunction[] alootitemfunction = (LootItemFunction[]) GsonHelper.getAsObject(jsonobject, "functions", new LootItemFunction[0], jsondeserializationcontext, LootItemFunction[].class); -+ LootItemFunction[] alootitemfunction = (LootItemFunction[]) GsonHelper.getAsObject(jsonobject, "functions", org.plazmamc.plazma.EmptyConstants.LOOT_ITEM_FUNCTION, jsondeserializationcontext, LootItemFunction[].class); // Plazma - - return new LootTable(lootcontextparameterset != null ? lootcontextparameterset : LootContextParamSets.ALL_PARAMS, minecraftkey, alootselector, alootitemfunction); - } -diff --git a/src/main/java/net/minecraft/world/level/storage/loot/entries/AlternativesEntry.java b/src/main/java/net/minecraft/world/level/storage/loot/entries/AlternativesEntry.java -index d63d8323290625bb0246a6965fc06f29a800750c..b0b104de5d378b6618b392dcc032fe1f5083fa9d 100644 ---- a/src/main/java/net/minecraft/world/level/storage/loot/entries/AlternativesEntry.java -+++ b/src/main/java/net/minecraft/world/level/storage/loot/entries/AlternativesEntry.java -@@ -85,7 +85,7 @@ public class AlternativesEntry extends CompositeEntryBase { - - @Override - public LootPoolEntryContainer build() { -- return new AlternativesEntry(this.entries.toArray(new LootPoolEntryContainer[0]), this.getConditions()); -+ return new AlternativesEntry(this.entries.toArray(org.plazmamc.plazma.EmptyConstants.LOOT_POOL_ENTRY_CONTAINERS), this.getConditions()); // Plazma - } - } - } -diff --git a/src/main/java/net/minecraft/world/level/storage/loot/entries/EntryGroup.java b/src/main/java/net/minecraft/world/level/storage/loot/entries/EntryGroup.java -index da1b5c6b68f14969b85472826d3d36ca673a0e5a..0af74b3442ed73ce2157e9003ce9f1eacf4431c0 100644 ---- a/src/main/java/net/minecraft/world/level/storage/loot/entries/EntryGroup.java -+++ b/src/main/java/net/minecraft/world/level/storage/loot/entries/EntryGroup.java -@@ -67,7 +67,7 @@ public class EntryGroup extends CompositeEntryBase { - - @Override - public LootPoolEntryContainer build() { -- return new EntryGroup(this.entries.toArray(new LootPoolEntryContainer[0]), this.getConditions()); -+ return new EntryGroup(this.entries.toArray(org.plazmamc.plazma.EmptyConstants.LOOT_POOL_ENTRY_CONTAINERS), this.getConditions()); // Plazma - } - } - } -diff --git a/src/main/java/net/minecraft/world/level/storage/loot/entries/LootPoolEntryContainer.java b/src/main/java/net/minecraft/world/level/storage/loot/entries/LootPoolEntryContainer.java -index 3bea85eab6f0a3b460b060579c73e90b83be7de4..6233448b253f02b1e3f82984960c027bca5ca150 100644 ---- a/src/main/java/net/minecraft/world/level/storage/loot/entries/LootPoolEntryContainer.java -+++ b/src/main/java/net/minecraft/world/level/storage/loot/entries/LootPoolEntryContainer.java -@@ -53,7 +53,7 @@ public abstract class LootPoolEntryContainer implements ComposableEntryContainer - } - - protected LootItemCondition[] getConditions() { -- return this.conditions.toArray(new LootItemCondition[0]); -+ return this.conditions.toArray(org.plazmamc.plazma.EmptyConstants.LOOT_ITEM_CONDITIONS); // Plazma - } - - public AlternativesEntry.Builder otherwise(LootPoolEntryContainer.Builder builder) { -@@ -83,7 +83,7 @@ public abstract class LootPoolEntryContainer implements ComposableEntryContainer - - @Override - public final T deserialize(JsonObject jsonObject, JsonDeserializationContext jsonDeserializationContext) { -- LootItemCondition[] lootItemConditions = GsonHelper.getAsObject(jsonObject, "conditions", new LootItemCondition[0], jsonDeserializationContext, LootItemCondition[].class); -+ LootItemCondition[] lootItemConditions = GsonHelper.getAsObject(jsonObject, "conditions", org.plazmamc.plazma.EmptyConstants.LOOT_ITEM_CONDITIONS, jsonDeserializationContext, LootItemCondition[].class); // Plazma - return this.deserializeCustom(jsonObject, jsonDeserializationContext, lootItemConditions); - } - -diff --git a/src/main/java/net/minecraft/world/level/storage/loot/entries/LootPoolSingletonContainer.java b/src/main/java/net/minecraft/world/level/storage/loot/entries/LootPoolSingletonContainer.java -index d125b5a470be0f4c56c2c1f229fc5c83fc4d2f3b..63ae04cbdd556788675d1a0db4c3309b3c84c0fa 100644 ---- a/src/main/java/net/minecraft/world/level/storage/loot/entries/LootPoolSingletonContainer.java -+++ b/src/main/java/net/minecraft/world/level/storage/loot/entries/LootPoolSingletonContainer.java -@@ -78,7 +78,7 @@ public abstract class LootPoolSingletonContainer extends LootPoolEntryContainer - } - - protected LootItemFunction[] getFunctions() { -- return this.functions.toArray(new LootItemFunction[0]); -+ return this.functions.toArray(org.plazmamc.plazma.EmptyConstants.LOOT_ITEM_FUNCTION); // Plazma - } - - public T setWeight(int weight) { -@@ -169,7 +169,7 @@ public abstract class LootPoolSingletonContainer extends LootPoolEntryContainer - public final T deserializeCustom(JsonObject jsonObject, JsonDeserializationContext jsonDeserializationContext, LootItemCondition[] lootItemConditions) { - int i = GsonHelper.getAsInt(jsonObject, "weight", 1); - int j = GsonHelper.getAsInt(jsonObject, "quality", 0); -- LootItemFunction[] lootItemFunctions = GsonHelper.getAsObject(jsonObject, "functions", new LootItemFunction[0], jsonDeserializationContext, LootItemFunction[].class); -+ LootItemFunction[] lootItemFunctions = GsonHelper.getAsObject(jsonObject, "functions", org.plazmamc.plazma.EmptyConstants.LOOT_ITEM_FUNCTION, jsonDeserializationContext, LootItemFunction[].class); // Plazma - return this.deserialize(jsonObject, jsonDeserializationContext, i, j, lootItemConditions, lootItemFunctions); - } - -diff --git a/src/main/java/net/minecraft/world/level/storage/loot/entries/SequentialEntry.java b/src/main/java/net/minecraft/world/level/storage/loot/entries/SequentialEntry.java -index 28ee59e7745ef0c98b13ae3e32f52dc7defe0bcd..d43f00901bac86cbb6e210cca223c8663b440847 100644 ---- a/src/main/java/net/minecraft/world/level/storage/loot/entries/SequentialEntry.java -+++ b/src/main/java/net/minecraft/world/level/storage/loot/entries/SequentialEntry.java -@@ -63,7 +63,7 @@ public class SequentialEntry extends CompositeEntryBase { - - @Override - public LootPoolEntryContainer build() { -- return new SequentialEntry(this.entries.toArray(new LootPoolEntryContainer[0]), this.getConditions()); -+ return new SequentialEntry(this.entries.toArray(org.plazmamc.plazma.EmptyConstants.LOOT_POOL_ENTRY_CONTAINERS), this.getConditions()); // Plazma - } - } - } -diff --git a/src/main/java/net/minecraft/world/level/storage/loot/functions/LootItemConditionalFunction.java b/src/main/java/net/minecraft/world/level/storage/loot/functions/LootItemConditionalFunction.java -index 5c67ae93a18f246d2bffd2c0b92f9ad82294b81e..31f365f26f008ef67b0dbe47743163a420c59b91 100644 ---- a/src/main/java/net/minecraft/world/level/storage/loot/functions/LootItemConditionalFunction.java -+++ b/src/main/java/net/minecraft/world/level/storage/loot/functions/LootItemConditionalFunction.java -@@ -63,7 +63,7 @@ public abstract class LootItemConditionalFunction implements LootItemFunction { - protected abstract T getThis(); - - protected LootItemCondition[] getConditions() { -- return this.conditions.toArray(new LootItemCondition[0]); -+ return this.conditions.toArray(org.plazmamc.plazma.EmptyConstants.LOOT_ITEM_CONDITIONS); // Plazma - } - } - -@@ -96,7 +96,7 @@ public abstract class LootItemConditionalFunction implements LootItemFunction { - - @Override - public final T deserialize(JsonObject jsonObject, JsonDeserializationContext jsonDeserializationContext) { -- LootItemCondition[] lootItemConditions = GsonHelper.getAsObject(jsonObject, "conditions", new LootItemCondition[0], jsonDeserializationContext, LootItemCondition[].class); -+ LootItemCondition[] lootItemConditions = GsonHelper.getAsObject(jsonObject, "conditions", org.plazmamc.plazma.EmptyConstants.LOOT_ITEM_CONDITIONS, jsonDeserializationContext, LootItemCondition[].class); // Plazma - return this.deserialize(jsonObject, jsonDeserializationContext, lootItemConditions); - } - -diff --git a/src/main/java/net/minecraft/world/level/storage/loot/functions/SetAttributesFunction.java b/src/main/java/net/minecraft/world/level/storage/loot/functions/SetAttributesFunction.java -index c5e7caf78049d8a6d18676f19dedf0b688802eab..375665a588c19cfa470fb20b5e502eea8ebb55f0 100644 ---- a/src/main/java/net/minecraft/world/level/storage/loot/functions/SetAttributesFunction.java -+++ b/src/main/java/net/minecraft/world/level/storage/loot/functions/SetAttributesFunction.java -@@ -216,6 +216,7 @@ public class SetAttributesFunction extends LootItemConditionalFunction { - @Nullable - private UUID id; - private final Set slots = EnumSet.noneOf(EquipmentSlot.class); -+ private static final EquipmentSlot[] EMPTY_SLOT = new EquipmentSlot[0]; // Plazma - - public ModifierBuilder(String name, Attribute attribute, AttributeModifier.Operation operation, NumberProvider amount) { - this.name = name; -@@ -235,7 +236,7 @@ public class SetAttributesFunction extends LootItemConditionalFunction { - } - - public SetAttributesFunction.Modifier build() { -- return new SetAttributesFunction.Modifier(this.name, this.attribute, this.operation, this.amount, this.slots.toArray(new EquipmentSlot[0]), this.id); -+ return new SetAttributesFunction.Modifier(this.name, this.attribute, this.operation, this.amount, this.slots.toArray(EMPTY_SLOT), this.id); // Plazma - } - } - -diff --git a/src/main/java/net/minecraft/world/scores/Team.java b/src/main/java/net/minecraft/world/scores/Team.java -index 16d2aa4556bc9f32a2def7f9ca282aa3fa23fb87..4886624aea43c1af7ed02da336cc0d25d38cdb8d 100644 ---- a/src/main/java/net/minecraft/world/scores/Team.java -+++ b/src/main/java/net/minecraft/world/scores/Team.java -@@ -80,7 +80,7 @@ public abstract class Team { - public final int id; - - public static String[] getAllNames() { -- return BY_NAME.keySet().toArray(new String[0]); -+ return BY_NAME.keySet().toArray(org.plazmamc.plazma.EmptyConstants.STRING); // Plazma - } - - @Nullable -diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -index 720a81da72a8002ff02cc39e5fca42354519c742..e10e07c89c1c79c22d82af6b76b948a4a5955a87 100644 ---- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -@@ -455,7 +455,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player { - public void sendTitle(Title title) { - Preconditions.checkNotNull(title, "Title is null"); - setTitleTimes(title.getFadeIn(), title.getStay(), title.getFadeOut()); -- setSubtitle(title.getSubtitle() == null ? new BaseComponent[0] : title.getSubtitle()); -+ setSubtitle(title.getSubtitle() == null ? org.plazmamc.plazma.EmptyConstants.BASE_COMPONENT : title.getSubtitle()); // Plazma - showTitle(title.getTitle()); - } - -diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaBook.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaBook.java -index 88c899e323eb554febe191ac7df678bbdfde08dc..a7ce24d3fce8490a8cd4e7cf28eb6be6138f4bd8 100644 ---- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaBook.java -+++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaBook.java -@@ -609,7 +609,7 @@ public class CraftMetaBook extends CraftMetaItem implements BookMeta { - throw new IllegalArgumentException("Invalid page number " + page + "/" + CraftMetaBook.this.getPageCount()); - } - -- BaseComponent[] newText = text == null ? new BaseComponent[0] : text; -+ BaseComponent[] newText = text == null ? org.plazmamc.plazma.EmptyConstants.BASE_COMPONENT : text; // Plazma - CraftMetaBook.this.pages.set(page - 1, this.componentsToPage(newText)); - } - -@@ -622,7 +622,7 @@ public class CraftMetaBook extends CraftMetaItem implements BookMeta { - public void addPage(final BaseComponent[]... pages) { - for (BaseComponent[] page : pages) { - if (page == null) { -- page = new BaseComponent[0]; -+ page = org.plazmamc.plazma.EmptyConstants.BASE_COMPONENT; // Plazma - } - - CraftMetaBook.this.internalAddPage(this.componentsToPage(page)); -diff --git a/src/main/java/org/bukkit/craftbukkit/util/WeakCollection.java b/src/main/java/org/bukkit/craftbukkit/util/WeakCollection.java -index bbacf58740f3faea0d555e4012fe2b15fb46ed50..032ec7a2e8afcbf70c86ced7c591bba555ffa17e 100644 ---- a/src/main/java/org/bukkit/craftbukkit/util/WeakCollection.java -+++ b/src/main/java/org/bukkit/craftbukkit/util/WeakCollection.java -@@ -164,7 +164,7 @@ public final class WeakCollection implements Collection { - - @Override - public Object[] toArray() { -- return this.toArray(new Object[0]); -+ return this.toArray(org.plazmamc.plazma.EmptyConstants.OBJECT); // Plazma - } - - @Override -diff --git a/src/main/java/org/plazmamc/plazma/EmptyConstants.java b/src/main/java/org/plazmamc/plazma/EmptyConstants.java -new file mode 100644 -index 0000000000000000000000000000000000000000..11602bcc9ea39130138bff67bf52b4f01c0b6c88 ---- /dev/null -+++ b/src/main/java/org/plazmamc/plazma/EmptyConstants.java -@@ -0,0 +1,29 @@ -+package org.plazmamc.plazma; -+ -+public class EmptyConstants { -+ -+ public static final byte[] BYTE = new byte[0]; -+ public static final int[] INT = new int[0]; -+ public static final int[] ZERO_INT = new int[]{0}; -+ public static final long[] LONG = new long[0]; -+ -+ public static final Class[] CLASS = new Class[0]; -+ public static final Object[] OBJECT = new Object[0]; -+ public static final StackTraceElement[] STACK_TRACE_ELEMENT = new StackTraceElement[0]; -+ public static final String[] STRING = new String[0]; -+ -+ public static final java.nio.file.LinkOption[] LINK_OPTION = new java.nio.file.LinkOption[0]; -+ public static final java.util.concurrent.CompletableFuture[] COMPLETABLE_FUTURES = new java.util.concurrent.CompletableFuture[0]; -+ -+ public static final net.minecraft.advancements.critereon.ContextAwarePredicate[] CONTEXT_AWARE_PREDICATES = new net.minecraft.advancements.critereon.ContextAwarePredicate[0]; -+ public static final net.minecraft.advancements.critereon.ItemPredicate[] ITEM_PREDICATES = new net.minecraft.advancements.critereon.ItemPredicate[0]; -+ public static final net.minecraft.world.entity.Entity[] ENTITY = new net.minecraft.world.entity.Entity[0]; -+ public static final net.minecraft.world.level.block.state.BlockState[] BLOCK_STATE = new net.minecraft.world.level.block.state.BlockState[0]; -+ public static final net.minecraft.world.level.storage.loot.LootPool[] LOOT_POOL = new net.minecraft.world.level.storage.loot.LootPool[0]; -+ public static final net.minecraft.world.level.storage.loot.entries.LootPoolEntryContainer[] LOOT_POOL_ENTRY_CONTAINERS = new net.minecraft.world.level.storage.loot.entries.LootPoolEntryContainer[0]; -+ public static final net.minecraft.world.level.storage.loot.functions.LootItemFunction[] LOOT_ITEM_FUNCTION = new net.minecraft.world.level.storage.loot.functions.LootItemFunction[0]; -+ public static final net.minecraft.world.level.storage.loot.predicates.LootItemCondition[] LOOT_ITEM_CONDITIONS = new net.minecraft.world.level.storage.loot.predicates.LootItemCondition[0]; -+ -+ public static final net.md_5.bungee.api.chat.BaseComponent[] BASE_COMPONENT = new net.md_5.bungee.api.chat.BaseComponent[0]; -+ -+} -diff --git a/src/main/java/org/plazmamc/plazma/commands/subcommands/VersionCommand.java b/src/main/java/org/plazmamc/plazma/commands/subcommands/VersionCommand.java -index 85002144e0b350c4ae044e1a4a4c1734cc27c059..776e5b5676749a05d29138afb070c9243cbe920c 100644 ---- a/src/main/java/org/plazmamc/plazma/commands/subcommands/VersionCommand.java -+++ b/src/main/java/org/plazmamc/plazma/commands/subcommands/VersionCommand.java -@@ -9,7 +9,7 @@ public class VersionCommand implements PlazmaSubCommand { - @Override - public boolean execute(CommandSender sender, String subCommand, String[] args) { - final @Nullable Command ver = MinecraftServer.getServer().server.getCommandMap().getCommand("version"); -- if (ver != null) ver.execute(sender, "plazma", new String[0]); -+ if (ver != null) ver.execute(sender, "plazma", org.plazmamc.plazma.EmptyConstants.STRING); // Plazma - return true; - } - } -diff --git a/src/main/java/org/purpurmc/purpur/command/PurpurCommand.java b/src/main/java/org/purpurmc/purpur/command/PurpurCommand.java -index 2621e54879e9ab0029a875f1d09eee67878b90d5..5ebcdcec49d5c54a31d8ca516fa16bba7fc574c7 100644 ---- a/src/main/java/org/purpurmc/purpur/command/PurpurCommand.java -+++ b/src/main/java/org/purpurmc/purpur/command/PurpurCommand.java -@@ -57,7 +57,7 @@ public class PurpurCommand extends Command { - } else if (args[0].equalsIgnoreCase("version")) { - Command verCmd = org.bukkit.Bukkit.getServer().getCommandMap().getCommand("version"); - if (verCmd != null) { -- return verCmd.execute(sender, commandLabel, new String[0]); -+ return verCmd.execute(sender, commandLabel, org.plazmamc.plazma.EmptyConstants.STRING); // Plazma - } - } -