From f0e1e58914a2c1aa129ec3143419944e6707101d Mon Sep 17 00:00:00 2001 From: IPECTER Date: Tue, 30 May 2023 16:35:02 +0900 Subject: [PATCH] Reduce allocations removed all array allocations except two! --- patches/server/0003-MC-Dev-fixes.patch | 60 + ...{0003-Rebrand.patch => 0004-Rebrand.patch} | 0 ...and-Logo.patch => 0005-Rebrand-Logo.patch} | 0 ...patch => 0006-Plazma-Configurations.patch} | 0 ...rics.patch => 0007-Add-more-metrics.patch} | 0 ...008-Optimize-Default-Configurations.patch} | 0 ... => 0009-ChunkSending-Configuration.patch} | 0 ...atch => 0010-Implement-ChunkSending.patch} | 0 ...h => 0011-Console-Log-Configuration.patch} | 0 ...ks.patch => 0012-Console-log-tweaks.patch} | 0 ...> 0013-Player-configuration-section.patch} | 0 ...4-Add-option-to-allow-any-usernames.patch} | 0 ...to-bypass-reducedDebugInfo-gamerule.patch} | 2 +- ...issing-purpur-configuration-options.patch} | 0 ...tch => 0017-Structure-Configuration.patch} | 0 ...018-Configurable-nether-portal-size.patch} | 0 ...on.patch => 0019-Misc-configuration.patch} | 0 ... 0020-Reduce-create-random-instance.patch} | 0 ....patch => 0021-Entity-Configuration.patch} | 0 ...patch => 0022-Various-Optimizations.patch} | 0 ...-to-disable-moved-to-quickly-check-.patch} | 0 ...m.patch => 0024-Apply-faster-random.patch} | 0 ...-Do-not-send-useless-entity-packets.patch} | 0 ... 0026-No-Chat-Reports-Configuration.patch} | 0 ...h => 0027-Implement-No-Chat-Reports.patch} | 2 +- ...h => 0028-FixMySpawnR-Configuration.patch} | 0 ...patch => 0029-Implement-FixMySpawnR.patch} | 0 ...tch => 0030-Implement-MemoryLeakFix.patch} | 0 ...rk.patch => 0031-Reduce-Sensor-Work.patch} | 0 ...ch => 0032-Configurable-Sensor-Tick.patch} | 0 ...Ints.patch => 0033-Optimize-VarInts.patch} | 0 ...034-Variable-Entity-WakeUp-Duration.patch} | 0 ... => 0035-More-Optimise-State-Lookup.patch} | 0 ...Suppress-Error-From-DirtyAttributes.patch} | 0 ...patch => 0037-Implement-FerriteCore.patch} | 0 ...> 0038-Let-Me-Despawn-Configuration.patch} | 0 ...ch => 0039-Implement-Let-Me-Despawn.patch} | 2 +- patches/server/0040-Reduce-allocations.patch | 1235 +++++++++++++++++ patches/todo/0040-Reduce-allocations.patch | 1032 ++++++++++++++ patches/todo/0041-Reduce-allocations2.patch | 196 +++ patches/todo/0042-213.patch | 19 + 41 files changed, 2545 insertions(+), 3 deletions(-) create mode 100644 patches/server/0003-MC-Dev-fixes.patch rename patches/server/{0003-Rebrand.patch => 0004-Rebrand.patch} (100%) rename patches/server/{0004-Rebrand-Logo.patch => 0005-Rebrand-Logo.patch} (100%) rename patches/server/{0005-Plazma-Configurations.patch => 0006-Plazma-Configurations.patch} (100%) rename patches/server/{0006-Add-more-metrics.patch => 0007-Add-more-metrics.patch} (100%) rename patches/server/{0007-Optimize-Default-Configurations.patch => 0008-Optimize-Default-Configurations.patch} (100%) rename patches/server/{0008-ChunkSending-Configuration.patch => 0009-ChunkSending-Configuration.patch} (100%) rename patches/server/{0009-Implement-ChunkSending.patch => 0010-Implement-ChunkSending.patch} (100%) rename patches/server/{0010-Console-Log-Configuration.patch => 0011-Console-Log-Configuration.patch} (100%) rename patches/server/{0011-Console-log-tweaks.patch => 0012-Console-log-tweaks.patch} (100%) rename patches/server/{0012-Player-configuration-section.patch => 0013-Player-configuration-section.patch} (100%) rename patches/server/{0013-Add-option-to-allow-any-usernames.patch => 0014-Add-option-to-allow-any-usernames.patch} (100%) rename patches/server/{0014-Add-permission-to-bypass-reducedDebugInfo-gamerule.patch => 0015-Add-permission-to-bypass-reducedDebugInfo-gamerule.patch} (96%) rename patches/server/{0015-Add-missing-purpur-configuration-options.patch => 0016-Add-missing-purpur-configuration-options.patch} (100%) rename patches/server/{0016-Structure-Configuration.patch => 0017-Structure-Configuration.patch} (100%) rename patches/server/{0017-Configurable-nether-portal-size.patch => 0018-Configurable-nether-portal-size.patch} (100%) rename patches/server/{0018-Misc-configuration.patch => 0019-Misc-configuration.patch} (100%) rename patches/server/{0019-Reduce-create-random-instance.patch => 0020-Reduce-create-random-instance.patch} (100%) rename patches/server/{0020-Entity-Configuration.patch => 0021-Entity-Configuration.patch} (100%) rename patches/server/{0021-Various-Optimizations.patch => 0022-Various-Optimizations.patch} (100%) rename patches/server/{0022-Add-configuration-to-disable-moved-to-quickly-check-.patch => 0023-Add-configuration-to-disable-moved-to-quickly-check-.patch} (100%) rename patches/server/{0023-Apply-faster-random.patch => 0024-Apply-faster-random.patch} (100%) rename patches/server/{0024-Do-not-send-useless-entity-packets.patch => 0025-Do-not-send-useless-entity-packets.patch} (100%) rename patches/server/{0025-No-Chat-Reports-Configuration.patch => 0026-No-Chat-Reports-Configuration.patch} (100%) rename patches/server/{0026-Implement-No-Chat-Reports.patch => 0027-Implement-No-Chat-Reports.patch} (98%) rename patches/server/{0027-FixMySpawnR-Configuration.patch => 0028-FixMySpawnR-Configuration.patch} (100%) rename patches/server/{0028-Implement-FixMySpawnR.patch => 0029-Implement-FixMySpawnR.patch} (100%) rename patches/server/{0029-Implement-MemoryLeakFix.patch => 0030-Implement-MemoryLeakFix.patch} (100%) rename patches/server/{0030-Reduce-Sensor-Work.patch => 0031-Reduce-Sensor-Work.patch} (100%) rename patches/server/{0031-Configurable-Sensor-Tick.patch => 0032-Configurable-Sensor-Tick.patch} (100%) rename patches/server/{0032-Optimize-VarInts.patch => 0033-Optimize-VarInts.patch} (100%) rename patches/server/{0033-Variable-Entity-WakeUp-Duration.patch => 0034-Variable-Entity-WakeUp-Duration.patch} (100%) rename patches/server/{0034-More-Optimise-State-Lookup.patch => 0035-More-Optimise-State-Lookup.patch} (100%) rename patches/server/{0035-Suppress-Error-From-DirtyAttributes.patch => 0036-Suppress-Error-From-DirtyAttributes.patch} (100%) rename patches/server/{0036-Implement-FerriteCore.patch => 0037-Implement-FerriteCore.patch} (100%) rename patches/server/{0037-Let-Me-Despawn-Configuration.patch => 0038-Let-Me-Despawn-Configuration.patch} (100%) rename patches/server/{0038-Implement-Let-Me-Despawn.patch => 0039-Implement-Let-Me-Despawn.patch} (97%) create mode 100644 patches/server/0040-Reduce-allocations.patch create mode 100644 patches/todo/0040-Reduce-allocations.patch create mode 100644 patches/todo/0041-Reduce-allocations2.patch create mode 100644 patches/todo/0042-213.patch diff --git a/patches/server/0003-MC-Dev-fixes.patch b/patches/server/0003-MC-Dev-fixes.patch new file mode 100644 index 0000000..89037ab --- /dev/null +++ b/patches/server/0003-MC-Dev-fixes.patch @@ -0,0 +1,60 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: IPECTER +Date: Tue, 30 May 2023 12:12:29 +0900 +Subject: [PATCH] MC-Dev-fixes + + +diff --git a/src/main/java/net/minecraft/util/datafix/fixes/LeavesFix.java b/src/main/java/net/minecraft/util/datafix/fixes/LeavesFix.java +index 75f1d1f06978d836aab5ebbfe8f7d1e0ca5a95b6..89d70a992e0bcc8e7292c4f736470eafd8747b24 100644 +--- a/src/main/java/net/minecraft/util/datafix/fixes/LeavesFix.java ++++ b/src/main/java/net/minecraft/util/datafix/fixes/LeavesFix.java +@@ -71,14 +71,14 @@ public class LeavesFix extends DataFix { + return this.fixTypeEverywhereTyped("Leaves fix", type, (typed) -> { + return typed.updateTyped(opticFinder, (typedx) -> { + int[] is = new int[]{0}; +- Typed typed2 = typedx.updateTyped(opticFinder2, (typed) -> { +- Int2ObjectMap int2ObjectMap = new Int2ObjectOpenHashMap<>(typed.getAllTyped(opticFinder3).stream().map((typedx) -> { +- return new LeavesFix.LeavesSection(typedx, this.getInputSchema()); ++ Typed typed2 = typedx.updateTyped(opticFinder2, (typed2x) -> { ++ Int2ObjectMap int2ObjectMap = new Int2ObjectOpenHashMap<>(typed2x.getAllTyped(opticFinder3).stream().map((typedx2) -> { ++ return new LeavesFix.LeavesSection(typedx2, this.getInputSchema()); + }).collect(Collectors.toMap(LeavesFix.Section::getIndex, (leavesSection) -> { + return leavesSection; + }))); + if (int2ObjectMap.values().stream().allMatch(LeavesFix.Section::isSkippable)) { +- return typed; ++ return typed2x; + } else { + List list = Lists.newArrayList(); + +@@ -134,8 +134,8 @@ public class LeavesFix extends DataFix { + } + } + +- return typed.updateTyped(opticFinder3, (typedx) -> { +- return int2ObjectMap.get(typedx.get(DSL.remainderFinder()).get("Y").asInt(0)).write(typedx); ++ return typed.updateTyped(opticFinder3, (typedx2) -> { ++ return int2ObjectMap.get(typedx2.get(DSL.remainderFinder()).get("Y").asInt(0)).write(typedx2); + }); + } + }); +@@ -298,8 +298,8 @@ public class LeavesFix extends DataFix { + throw new IllegalStateException("Block state type is not what was expected."); + } else { + Optional>>> optional = typed.getOptional(this.paletteFinder); +- this.palette = optional.map((list) -> { +- return list.stream().map(Pair::getSecond).collect(Collectors.toList()); ++ this.palette = (java.util.List)optional.map((list) -> { ++ return (java.util.List)list.stream().map(Pair::getSecond).collect(Collectors.toList()); + }).orElse(ImmutableList.of()); + Dynamic dynamic = typed.get(DSL.remainderFinder()); + this.index = dynamic.get("Y").asInt(0); +@@ -321,7 +321,7 @@ public class LeavesFix extends DataFix { + public Typed write(Typed typed) { + return this.isSkippable() ? typed : typed.update(DSL.remainderFinder(), (dynamic) -> { + return dynamic.set("BlockStates", dynamic.createLongList(Arrays.stream(this.storage.getRaw()))); +- }).set(this.paletteFinder, this.palette.stream().map((dynamic) -> { ++ }).set(this.paletteFinder, (java.util.List)this.palette.stream().map((dynamic) -> { + return Pair.of(References.BLOCK_STATE.typeName(), dynamic); + }).collect(Collectors.toList())); + } diff --git a/patches/server/0003-Rebrand.patch b/patches/server/0004-Rebrand.patch similarity index 100% rename from patches/server/0003-Rebrand.patch rename to patches/server/0004-Rebrand.patch diff --git a/patches/server/0004-Rebrand-Logo.patch b/patches/server/0005-Rebrand-Logo.patch similarity index 100% rename from patches/server/0004-Rebrand-Logo.patch rename to patches/server/0005-Rebrand-Logo.patch diff --git a/patches/server/0005-Plazma-Configurations.patch b/patches/server/0006-Plazma-Configurations.patch similarity index 100% rename from patches/server/0005-Plazma-Configurations.patch rename to patches/server/0006-Plazma-Configurations.patch diff --git a/patches/server/0006-Add-more-metrics.patch b/patches/server/0007-Add-more-metrics.patch similarity index 100% rename from patches/server/0006-Add-more-metrics.patch rename to patches/server/0007-Add-more-metrics.patch diff --git a/patches/server/0007-Optimize-Default-Configurations.patch b/patches/server/0008-Optimize-Default-Configurations.patch similarity index 100% rename from patches/server/0007-Optimize-Default-Configurations.patch rename to patches/server/0008-Optimize-Default-Configurations.patch diff --git a/patches/server/0008-ChunkSending-Configuration.patch b/patches/server/0009-ChunkSending-Configuration.patch similarity index 100% rename from patches/server/0008-ChunkSending-Configuration.patch rename to patches/server/0009-ChunkSending-Configuration.patch diff --git a/patches/server/0009-Implement-ChunkSending.patch b/patches/server/0010-Implement-ChunkSending.patch similarity index 100% rename from patches/server/0009-Implement-ChunkSending.patch rename to patches/server/0010-Implement-ChunkSending.patch diff --git a/patches/server/0010-Console-Log-Configuration.patch b/patches/server/0011-Console-Log-Configuration.patch similarity index 100% rename from patches/server/0010-Console-Log-Configuration.patch rename to patches/server/0011-Console-Log-Configuration.patch diff --git a/patches/server/0011-Console-log-tweaks.patch b/patches/server/0012-Console-log-tweaks.patch similarity index 100% rename from patches/server/0011-Console-log-tweaks.patch rename to patches/server/0012-Console-log-tweaks.patch diff --git a/patches/server/0012-Player-configuration-section.patch b/patches/server/0013-Player-configuration-section.patch similarity index 100% rename from patches/server/0012-Player-configuration-section.patch rename to patches/server/0013-Player-configuration-section.patch diff --git a/patches/server/0013-Add-option-to-allow-any-usernames.patch b/patches/server/0014-Add-option-to-allow-any-usernames.patch similarity index 100% rename from patches/server/0013-Add-option-to-allow-any-usernames.patch rename to patches/server/0014-Add-option-to-allow-any-usernames.patch diff --git a/patches/server/0014-Add-permission-to-bypass-reducedDebugInfo-gamerule.patch b/patches/server/0015-Add-permission-to-bypass-reducedDebugInfo-gamerule.patch similarity index 96% rename from patches/server/0014-Add-permission-to-bypass-reducedDebugInfo-gamerule.patch rename to patches/server/0015-Add-permission-to-bypass-reducedDebugInfo-gamerule.patch index 7f6248c..81b53aa 100644 --- a/patches/server/0014-Add-permission-to-bypass-reducedDebugInfo-gamerule.patch +++ b/patches/server/0015-Add-permission-to-bypass-reducedDebugInfo-gamerule.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Add permission to bypass reducedDebugInfo gamerule diff --git a/src/main/java/net/minecraft/server/players/PlayerList.java b/src/main/java/net/minecraft/server/players/PlayerList.java -index c27e455321951e76e4818fec0e64301f5620dbf6..7bfba4d638cd42cdd98a22d87effe9a3be005315 100644 +index ff56981a03b55f9ee1ec8ad36adaf9849b2c914b..b22b86d7f226e0e24d6be27ea33ec9d690f8f238 100644 --- a/src/main/java/net/minecraft/server/players/PlayerList.java +++ b/src/main/java/net/minecraft/server/players/PlayerList.java @@ -275,7 +275,7 @@ public abstract class PlayerList { diff --git a/patches/server/0015-Add-missing-purpur-configuration-options.patch b/patches/server/0016-Add-missing-purpur-configuration-options.patch similarity index 100% rename from patches/server/0015-Add-missing-purpur-configuration-options.patch rename to patches/server/0016-Add-missing-purpur-configuration-options.patch diff --git a/patches/server/0016-Structure-Configuration.patch b/patches/server/0017-Structure-Configuration.patch similarity index 100% rename from patches/server/0016-Structure-Configuration.patch rename to patches/server/0017-Structure-Configuration.patch diff --git a/patches/server/0017-Configurable-nether-portal-size.patch b/patches/server/0018-Configurable-nether-portal-size.patch similarity index 100% rename from patches/server/0017-Configurable-nether-portal-size.patch rename to patches/server/0018-Configurable-nether-portal-size.patch diff --git a/patches/server/0018-Misc-configuration.patch b/patches/server/0019-Misc-configuration.patch similarity index 100% rename from patches/server/0018-Misc-configuration.patch rename to patches/server/0019-Misc-configuration.patch diff --git a/patches/server/0019-Reduce-create-random-instance.patch b/patches/server/0020-Reduce-create-random-instance.patch similarity index 100% rename from patches/server/0019-Reduce-create-random-instance.patch rename to patches/server/0020-Reduce-create-random-instance.patch diff --git a/patches/server/0020-Entity-Configuration.patch b/patches/server/0021-Entity-Configuration.patch similarity index 100% rename from patches/server/0020-Entity-Configuration.patch rename to patches/server/0021-Entity-Configuration.patch diff --git a/patches/server/0021-Various-Optimizations.patch b/patches/server/0022-Various-Optimizations.patch similarity index 100% rename from patches/server/0021-Various-Optimizations.patch rename to patches/server/0022-Various-Optimizations.patch diff --git a/patches/server/0022-Add-configuration-to-disable-moved-to-quickly-check-.patch b/patches/server/0023-Add-configuration-to-disable-moved-to-quickly-check-.patch similarity index 100% rename from patches/server/0022-Add-configuration-to-disable-moved-to-quickly-check-.patch rename to patches/server/0023-Add-configuration-to-disable-moved-to-quickly-check-.patch diff --git a/patches/server/0023-Apply-faster-random.patch b/patches/server/0024-Apply-faster-random.patch similarity index 100% rename from patches/server/0023-Apply-faster-random.patch rename to patches/server/0024-Apply-faster-random.patch diff --git a/patches/server/0024-Do-not-send-useless-entity-packets.patch b/patches/server/0025-Do-not-send-useless-entity-packets.patch similarity index 100% rename from patches/server/0024-Do-not-send-useless-entity-packets.patch rename to patches/server/0025-Do-not-send-useless-entity-packets.patch diff --git a/patches/server/0025-No-Chat-Reports-Configuration.patch b/patches/server/0026-No-Chat-Reports-Configuration.patch similarity index 100% rename from patches/server/0025-No-Chat-Reports-Configuration.patch rename to patches/server/0026-No-Chat-Reports-Configuration.patch diff --git a/patches/server/0026-Implement-No-Chat-Reports.patch b/patches/server/0027-Implement-No-Chat-Reports.patch similarity index 98% rename from patches/server/0026-Implement-No-Chat-Reports.patch rename to patches/server/0027-Implement-No-Chat-Reports.patch index f86e635..8b2ebc9 100644 --- a/patches/server/0026-Implement-No-Chat-Reports.patch +++ b/patches/server/0027-Implement-No-Chat-Reports.patch @@ -103,7 +103,7 @@ index 8f911f589bf04902e38e2c625d84ba0c47cbd9ee..b15de37a06c3efb1c4bc790ccb23ebff if (packet == null || this.processedDisconnect) { // Spigot return; diff --git a/src/main/java/net/minecraft/server/players/PlayerList.java b/src/main/java/net/minecraft/server/players/PlayerList.java -index 7bfba4d638cd42cdd98a22d87effe9a3be005315..f89d66d65b39324011718068840295bb77d2a3e2 100644 +index b22b86d7f226e0e24d6be27ea33ec9d690f8f238..022da50912d357581b2132cf57e1a767e436022c 100644 --- a/src/main/java/net/minecraft/server/players/PlayerList.java +++ b/src/main/java/net/minecraft/server/players/PlayerList.java @@ -1464,7 +1464,7 @@ public abstract class PlayerList { diff --git a/patches/server/0027-FixMySpawnR-Configuration.patch b/patches/server/0028-FixMySpawnR-Configuration.patch similarity index 100% rename from patches/server/0027-FixMySpawnR-Configuration.patch rename to patches/server/0028-FixMySpawnR-Configuration.patch diff --git a/patches/server/0028-Implement-FixMySpawnR.patch b/patches/server/0029-Implement-FixMySpawnR.patch similarity index 100% rename from patches/server/0028-Implement-FixMySpawnR.patch rename to patches/server/0029-Implement-FixMySpawnR.patch diff --git a/patches/server/0029-Implement-MemoryLeakFix.patch b/patches/server/0030-Implement-MemoryLeakFix.patch similarity index 100% rename from patches/server/0029-Implement-MemoryLeakFix.patch rename to patches/server/0030-Implement-MemoryLeakFix.patch diff --git a/patches/server/0030-Reduce-Sensor-Work.patch b/patches/server/0031-Reduce-Sensor-Work.patch similarity index 100% rename from patches/server/0030-Reduce-Sensor-Work.patch rename to patches/server/0031-Reduce-Sensor-Work.patch diff --git a/patches/server/0031-Configurable-Sensor-Tick.patch b/patches/server/0032-Configurable-Sensor-Tick.patch similarity index 100% rename from patches/server/0031-Configurable-Sensor-Tick.patch rename to patches/server/0032-Configurable-Sensor-Tick.patch diff --git a/patches/server/0032-Optimize-VarInts.patch b/patches/server/0033-Optimize-VarInts.patch similarity index 100% rename from patches/server/0032-Optimize-VarInts.patch rename to patches/server/0033-Optimize-VarInts.patch diff --git a/patches/server/0033-Variable-Entity-WakeUp-Duration.patch b/patches/server/0034-Variable-Entity-WakeUp-Duration.patch similarity index 100% rename from patches/server/0033-Variable-Entity-WakeUp-Duration.patch rename to patches/server/0034-Variable-Entity-WakeUp-Duration.patch diff --git a/patches/server/0034-More-Optimise-State-Lookup.patch b/patches/server/0035-More-Optimise-State-Lookup.patch similarity index 100% rename from patches/server/0034-More-Optimise-State-Lookup.patch rename to patches/server/0035-More-Optimise-State-Lookup.patch diff --git a/patches/server/0035-Suppress-Error-From-DirtyAttributes.patch b/patches/server/0036-Suppress-Error-From-DirtyAttributes.patch similarity index 100% rename from patches/server/0035-Suppress-Error-From-DirtyAttributes.patch rename to patches/server/0036-Suppress-Error-From-DirtyAttributes.patch diff --git a/patches/server/0036-Implement-FerriteCore.patch b/patches/server/0037-Implement-FerriteCore.patch similarity index 100% rename from patches/server/0036-Implement-FerriteCore.patch rename to patches/server/0037-Implement-FerriteCore.patch diff --git a/patches/server/0037-Let-Me-Despawn-Configuration.patch b/patches/server/0038-Let-Me-Despawn-Configuration.patch similarity index 100% rename from patches/server/0037-Let-Me-Despawn-Configuration.patch rename to patches/server/0038-Let-Me-Despawn-Configuration.patch diff --git a/patches/server/0038-Implement-Let-Me-Despawn.patch b/patches/server/0039-Implement-Let-Me-Despawn.patch similarity index 97% rename from patches/server/0038-Implement-Let-Me-Despawn.patch rename to patches/server/0039-Implement-Let-Me-Despawn.patch index 395f61e..801dd17 100644 --- a/patches/server/0038-Implement-Let-Me-Despawn.patch +++ b/patches/server/0039-Implement-Let-Me-Despawn.patch @@ -7,7 +7,7 @@ Original: frikinjay/let-me-despawn Copyright (C) 2023 frikinjay diff --git a/src/main/java/net/minecraft/world/entity/Mob.java b/src/main/java/net/minecraft/world/entity/Mob.java -index 3a365d7efd439cb8ddb99381bd714fb48896f4d2..e440cba3c4cd169e9771cc2f3c19b4c9861a640e 100644 +index 3a365d7efd439cb8ddb99381bd714fb48896f4d2..b6d27332eb151bdf408909b241c493da54841c8e 100644 --- a/src/main/java/net/minecraft/world/entity/Mob.java +++ b/src/main/java/net/minecraft/world/entity/Mob.java @@ -885,7 +885,7 @@ public abstract class Mob extends LivingEntity implements Targeting { diff --git a/patches/server/0040-Reduce-allocations.patch b/patches/server/0040-Reduce-allocations.patch new file mode 100644 index 0000000..14cbaca --- /dev/null +++ b/patches/server/0040-Reduce-allocations.patch @@ -0,0 +1,1235 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: IPECTER +Date: Tue, 30 May 2023 11:33:01 +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 1b0d92c68407cdb09ed8aac271b625d92db87017..8b48be5e2ea8815c152d182aa010eba0da84c562 100644 +--- a/src/main/java/ca/spottedleaf/starlight/common/light/StarLightEngine.java ++++ b/src/main/java/ca/spottedleaf/starlight/common/light/StarLightEngine.java +@@ -39,7 +39,7 @@ public abstract class StarLightEngine { + AxisDirection.POSITIVE_Z, AxisDirection.NEGATIVE_Z + }; + +- protected static enum AxisDirection { ++ public static enum AxisDirection { // Plazma - protected -> public + + // Declaration order is important and relied upon. Do not change without modifying propagation code. + POSITIVE_X(1, 0, 0), NEGATIVE_X(-1, 0, 0), +@@ -1094,7 +1094,7 @@ public abstract class StarLightEngine { + 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(org.plazmamc.plazma.util.Constants.STARLIGHT_AXIS_DIRECTION); + } + } + +diff --git a/src/main/java/com/destroystokyo/paper/antixray/ChunkPacketBlockControllerAntiXray.java b/src/main/java/com/destroystokyo/paper/antixray/ChunkPacketBlockControllerAntiXray.java +index cab91880a08c6fdc545804911d295e0f24f4d983..ca2ca7f3b5b0ea5862011c6b4beab4b2ab540792 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.util.Constants.BLOCK_STATE); ++ presetBlockStatesFull = presetBlockStateSet.isEmpty() ? new BlockState[]{Blocks.DIAMOND_ORE.defaultBlockState()} : presetBlockStateList.toArray(org.plazmamc.plazma.util.Constants.BLOCK_STATE); + presetBlockStatesStone = null; + presetBlockStatesDeepslate = null; + presetBlockStatesNetherrack = null; +diff --git a/src/main/java/com/destroystokyo/paper/util/maplist/ChunkList.java b/src/main/java/com/destroystokyo/paper/util/maplist/ChunkList.java +index 554f4d4e63c1431721989e6f502a32ccc53a8807..237cc1927c237fe4e87d5cbf74c6d1faae1d67f2 100644 +--- a/src/main/java/com/destroystokyo/paper/util/maplist/ChunkList.java ++++ b/src/main/java/com/destroystokyo/paper/util/maplist/ChunkList.java +@@ -17,7 +17,7 @@ public final class ChunkList implements Iterable { + this.chunkToIndex.defaultReturnValue(Integer.MIN_VALUE); + } + +- protected static final LevelChunk[] EMPTY_LIST = new LevelChunk[0]; ++ protected static final LevelChunk[] EMPTY_LIST = org.plazmamc.plazma.util.Constants.LEVEL_CHUNK; + + protected LevelChunk[] chunks = EMPTY_LIST; + protected int count; +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..5bf288af5d2855c2287a297abedb2cf9358b8b3c 100644 +--- a/src/main/java/com/destroystokyo/paper/util/maplist/EntityList.java ++++ b/src/main/java/com/destroystokyo/paper/util/maplist/EntityList.java +@@ -17,7 +17,7 @@ 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 = org.plazmamc.plazma.util.Constants.ENTITY; + + protected Entity[] entities = EMPTY_LIST; + protected int count; +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..d552f9fe1bfb8c9a25f27117cb6896c11b05a0c3 100644 +--- a/src/main/java/com/destroystokyo/paper/util/maplist/IBlockDataList.java ++++ b/src/main/java/com/destroystokyo/paper/util/maplist/IBlockDataList.java +@@ -20,7 +20,7 @@ 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 = org.plazmamc.plazma.util.Constants.EMPTY_LONG; + + private long[] byIndex = EMPTY_LIST; + private int size; +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..a5460fc96ebc6f1356e4cec1ee7ef14879ab3b2a 100644 +--- a/src/main/java/com/destroystokyo/paper/util/maplist/ReferenceList.java ++++ b/src/main/java/com/destroystokyo/paper/util/maplist/ReferenceList.java +@@ -15,7 +15,7 @@ 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 = org.plazmamc.plazma.util.Constants.EMPTY_OBJECT; + + protected Object[] references = EMPTY_LIST; + protected int count; +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 84cc9397237fa0c17aa1012dfb5683c90eb6d3b8..aec83ebe4038b73a9c69dd86029e466f6d6e52d5 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 +@@ -751,7 +751,7 @@ public final class ChunkTaskScheduler { + + public static ChunkInfo[] getChunkInfos() { + synchronized (WAITING_CHUNKS) { +- return WAITING_CHUNKS.toArray(new ChunkInfo[0]); ++ return WAITING_CHUNKS.toArray(org.plazmamc.plazma.util.Constants.CHUNK_INFO); + } + } + +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..e678d1bf61a2238967c3bd999dfba4adbdf315cc 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.util.Constants.EMPTY_STRING); + } + return true; + } +diff --git a/src/main/java/io/papermc/paper/world/ChunkEntitySlices.java b/src/main/java/io/papermc/paper/world/ChunkEntitySlices.java +index f597d65d56964297eeeed6c7e77703764178fee0..15240fe6ca5fd3f9bbbcc4499c0bf26bb35803c0 100644 +--- a/src/main/java/io/papermc/paper/world/ChunkEntitySlices.java ++++ b/src/main/java/io/papermc/paper/world/ChunkEntitySlices.java +@@ -81,7 +81,7 @@ public final class ChunkEntitySlices { + } + } + +- return ret.toArray(new org.bukkit.entity.Entity[0]); ++ return ret.toArray(org.plazmamc.plazma.util.Constants.BUKKIT_ENTITY); + } + + public CompoundTag save() { +@@ -298,7 +298,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.util.Constants.ENTITY; + 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..7e124979a2843b7f0a365e51d23192731747e6bf 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.util.Constants.STACK_TRACE_ELEMENT; + 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..61f63791ddda4fd84298d18be3dbb6c44b3462da 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.util.Constants.STACK_TRACE_ELEMENT; + + 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 4c90a6ee734451fe404b2255d21090b669da1aa1..ae8b26aa9ceff07a79b1dbfd310123ca61a97a3d 100644 +--- a/src/main/java/net/minecraft/Util.java ++++ b/src/main/java/net/minecraft/Util.java +@@ -400,7 +400,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.util.Constants.COMPLETABLE_FUTURE)); + 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 9e20a870a9c9c295b32cfa591eb52625125a5439..30473930bf3acf0ae74f3ff5e500f6e1374c11da 100644 +--- a/src/main/java/net/minecraft/advancements/AdvancementRewards.java ++++ b/src/main/java/net/minecraft/advancements/AdvancementRewards.java +@@ -24,7 +24,7 @@ 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); ++ public static final AdvancementRewards EMPTY = new AdvancementRewards(0, org.plazmamc.plazma.util.Constants.RESOURCE_LOCATION, org.plazmamc.plazma.util.Constants.RESOURCE_LOCATION, CommandFunction.CacheableFunction.NONE); + private final int experience; + private final ResourceLocation[] loot; + private final ResourceLocation[] recipes; +@@ -187,7 +187,7 @@ public class AdvancementRewards { + } + + public AdvancementRewards build() { +- return new AdvancementRewards(this.experience, this.loot.toArray(new ResourceLocation[0]), this.recipes.toArray(new ResourceLocation[0]), this.function == null ? CommandFunction.CacheableFunction.NONE : new CommandFunction.CacheableFunction(this.function)); ++ return new AdvancementRewards(this.experience, this.loot.toArray(org.plazmamc.plazma.util.Constants.RESOURCE_LOCATION), this.recipes.toArray(org.plazmamc.plazma.util.Constants.RESOURCE_LOCATION), this.function == null ? CommandFunction.CacheableFunction.NONE : new CommandFunction.CacheableFunction(this.function)); + } + } + } +diff --git a/src/main/java/net/minecraft/advancements/RequirementsStrategy.java b/src/main/java/net/minecraft/advancements/RequirementsStrategy.java +index 051c1fb81d79c40be683edb86579bb975643bcb3..469c34c773e3257d0edfc807cb882b4cbfc3c53f 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.util.Constants.EMPTY_STRING)}; + }; + + String[][] createRequirements(Collection criteriaNames); +diff --git a/src/main/java/net/minecraft/nbt/ByteArrayTag.java b/src/main/java/net/minecraft/nbt/ByteArrayTag.java +index 163b1895bcbd16e93d36cd60d03e6b21df51cba7..4d47adb914399de94f725f53b938588051919ebe 100644 +--- a/src/main/java/net/minecraft/nbt/ByteArrayTag.java ++++ b/src/main/java/net/minecraft/nbt/ByteArrayTag.java +@@ -175,7 +175,7 @@ public class ByteArrayTag extends CollectionTag { + } + + public void clear() { +- this.data = new byte[0]; ++ this.data = org.plazmamc.plazma.util.Constants.EMPTY_BYTE; + } + + @Override +diff --git a/src/main/java/net/minecraft/nbt/CompoundTag.java b/src/main/java/net/minecraft/nbt/CompoundTag.java +index 7e94ebe06fc62293e665d6db19e42d947e7eb30f..6f41b334efc4a540cd8efcc782f5d5c8862b7476 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.util.Constants.EMPTY_BYTE; + } + + 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.util.Constants.EMPTY_INT; + } + + 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.util.Constants.EMPTY_LONG; + } + + 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..4dec198d867b9d95572e6a93b219f6c46357f3cf 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.util.Constants.EMPTY_INT; + } + + @Override +diff --git a/src/main/java/net/minecraft/nbt/ListTag.java b/src/main/java/net/minecraft/nbt/ListTag.java +index 749d3e67a877d7d1ed47b5fef511a604ee6589b6..0529814353ba82d6083a88531f06e73377ab5aaf 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.util.Constants.EMPTY_INT; + } + + public long[] getLongArray(int index) { +@@ -241,7 +241,7 @@ public class ListTag extends CollectionTag { + } + } + +- return new long[0]; ++ return org.plazmamc.plazma.util.Constants.EMPTY_LONG; + } + + 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..122d4b9391ddaae2631db213230f57a829d1c943 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.util.Constants.EMPTY_LONG; + } + + @Override +diff --git a/src/main/java/net/minecraft/network/CipherBase.java b/src/main/java/net/minecraft/network/CipherBase.java +index a2920b8a9eff77d9c5d1d7f70ad3abdacba8f0fa..c1c97cc8fa5e0d8349655f90392382a0a878c95f 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.util.Constants.EMPTY_BYTE; ++ private byte[] heapOut = org.plazmamc.plazma.util.Constants.EMPTY_BYTE; + + 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 323416311f14f5ad887f05183ad3b4921981aecd..7ef5055d7d6d7576cefdbc80ede4f4ce28e15c1b 100644 +--- a/src/main/java/net/minecraft/network/Connection.java ++++ b/src/main/java/net/minecraft/network/Connection.java +@@ -318,7 +318,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.util.Constants.EMPTY_OBJECT); + 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..c732299c908622e3b6262cd942a7397b3f34b8e9 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.util.Constants.EMPTY_OBJECT; + 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 7c6a6693760638a07b7c7c330aaeffd9fa454845..d4a7157d2b2c5f25ed00b706d0adbf195e5e6977 100644 +--- a/src/main/java/net/minecraft/network/protocol/game/ClientboundSectionBlocksUpdatePacket.java ++++ b/src/main/java/net/minecraft/network/protocol/game/ClientboundSectionBlocksUpdatePacket.java +@@ -67,7 +67,7 @@ public class ClientboundSectionBlocksUpdatePacket implements Packet blockChanges, boolean suppressLightUpdates) { + this.sectionPos = sectionPos; + this.positions = blockChanges.keySet().toShortArray(); +- this.states = blockChanges.values().toArray(new BlockState[0]); ++ this.states = blockChanges.values().toArray(org.plazmamc.plazma.util.Constants.BLOCK_STATE); + this.suppressLightUpdates = suppressLightUpdates; + } + // Paper end +diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java +index 3c80e14392ee7a6bf5040d7cb81b7d894e162eff..a358a821e2ed71fdb2e85c71b75fda00fdad7f9b 100644 +--- a/src/main/java/net/minecraft/server/MinecraftServer.java ++++ b/src/main/java/net/minecraft/server/MinecraftServer.java +@@ -1373,10 +1373,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.util.Constants.LINK_OPTION); + }).or(() -> { + return this.storageSource.getIconFile().filter((path) -> { +- return Files.isRegularFile(path, new LinkOption[0]); ++ return Files.isRegularFile(path, org.plazmamc.plazma.util.Constants.LINK_OPTION); + }); + }); + +diff --git a/src/main/java/net/minecraft/server/PlayerAdvancements.java b/src/main/java/net/minecraft/server/PlayerAdvancements.java +index 3919d9c193abcfd8b97dfb0ceb38638440f60fbe..31129b7a4e325649830089a5422e3ccf9b5875a5 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.util.Constants.LINK_OPTION)) { + 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..857c3609b3cd965e1c10caa8fc5682baae999820 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.util.Constants.STACK_TRACE_ELEMENT); + } + + @Override + public synchronized Throwable fillInStackTrace() { +- this.setStackTrace(new StackTraceElement[0]); ++ this.setStackTrace(org.plazmamc.plazma.util.Constants.STACK_TRACE_ELEMENT); + return this; + } + } +diff --git a/src/main/java/net/minecraft/server/ServerFunctionLibrary.java b/src/main/java/net/minecraft/server/ServerFunctionLibrary.java +index 975422a57b83a31e63a600bb4ff9c4e2baaf6da7..64d8935c18f3e92ec35b3b160443700e350a72fa 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.util.Constants.COMPLETABLE_FUTURE); + 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 57fdef8b16e1ed9a4693356144b4685bbcea285c..d41086166c39fedf8da29ac9010c501ef5fe3131 100644 +--- a/src/main/java/net/minecraft/server/level/ChunkMap.java ++++ b/src/main/java/net/minecraft/server/level/ChunkMap.java +@@ -1550,7 +1550,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(org.plazmamc.plazma.util.Constants.SERVER_PLAYER_CONNECTION)) { // avoid CME + 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 ebbf462835e5a14fe1413c724d4985635207a897..c2030d2e936fc5582e3fd1c753e1d0a40b905bab 100644 +--- a/src/main/java/net/minecraft/server/level/ServerLevel.java ++++ b/src/main/java/net/minecraft/server/level/ServerLevel.java +@@ -1250,7 +1250,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.util.Constants.ENTITY : new Entity[] { ticking }); + + 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 b15de37a06c3efb1c4bc790ccb23ebff3c97d54d..d76bff083c0ecd49dfd82dd8ccffae86820308ce 100644 +--- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java ++++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java +@@ -434,7 +434,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.util.Constants.EMPTY_OBJECT), org.bukkit.event.player.PlayerKickEvent.Cause.TIMEOUT); // Paper - kick event cause + } + } else { + if (elapsedTime >= 15000L) { // 15 seconds +@@ -915,13 +915,13 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic + // PacketUtils.ensureRunningOnSameThread(packet, this, this.player.getLevel()); // 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.util.Constants.EMPTY_OBJECT), org.bukkit.event.player.PlayerKickEvent.Cause.SPAM)); // Paper - kick event cause + return; + } + // Paper start + String str = packet.getCommand(); int index = -1; + if (str.length() > 64 && ((index = str.indexOf(' ')) == -1 || index >= 64)) { +- server.scheduleOnMain(() -> this.disconnect(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.util.Constants.EMPTY_OBJECT), org.bukkit.event.player.PlayerKickEvent.Cause.SPAM)); // Paper - kick event cause + return; + } + // Paper end +@@ -3391,7 +3391,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic + // Paper start + if (!org.bukkit.Bukkit.isPrimaryThread()) { + if (recipeSpamPackets.addAndGet(io.papermc.paper.configuration.GlobalConfiguration.get().spamLimiter.recipeSpamIncrement) > io.papermc.paper.configuration.GlobalConfiguration.get().spamLimiter.recipeSpamLimit) { +- 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 ++ server.scheduleOnMain(() -> this.disconnect(net.minecraft.network.chat.Component.translatable("disconnect.spam", org.plazmamc.plazma.util.Constants.EMPTY_OBJECT), org.bukkit.event.player.PlayerKickEvent.Cause.SPAM)); // Paper - kick event cause + return; + } + } +diff --git a/src/main/java/net/minecraft/server/network/ServerLoginPacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerLoginPacketListenerImpl.java +index 06ff5dd9e39e2be8dd8397a764813111019ceaed..6a17b2b1d2fc75b87b2683ffe033fdc111e5750c 100644 +--- a/src/main/java/net/minecraft/server/network/ServerLoginPacketListenerImpl.java ++++ b/src/main/java/net/minecraft/server/network/ServerLoginPacketListenerImpl.java +@@ -238,8 +238,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.util.Constants.EMPTY_OBJECT); ++ if (!org.plazmamc.plazma.configurations.GlobalConfiguration.get().player.allowAnyUsername) Validate.validState(ServerLoginPacketListenerImpl.isValidUsername(packet.name()), "Invalid characters in username", org.plazmamc.plazma.util.Constants.EMPTY_OBJECT); // Plazma + // 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())) { +@@ -298,7 +298,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.util.Constants.EMPTY_OBJECT); + + 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 022da50912d357581b2132cf57e1a767e436022c..555472cad13c6453090b6f15133bbf2b90014a74 100644 +--- a/src/main/java/net/minecraft/server/players/PlayerList.java ++++ b/src/main/java/net/minecraft/server/players/PlayerList.java +@@ -695,7 +695,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.util.Constants.EMPTY_OBJECT), org.bukkit.event.player.PlayerKickEvent.Cause.DUPLICATE_LOGIN); // Paper - kick event cause + } + + // Instead of kicking then returning, we need to store the kick reason +diff --git a/src/main/java/net/minecraft/server/players/StoredUserList.java b/src/main/java/net/minecraft/server/players/StoredUserList.java +index 4fd709a550bf8da1e996894a1ca6b91206c31e9e..d676116150e5a741b2050e26c76c19bccc8a95dc 100644 +--- a/src/main/java/net/minecraft/server/players/StoredUserList.java ++++ b/src/main/java/net/minecraft/server/players/StoredUserList.java +@@ -95,7 +95,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.util.Constants.EMPTY_STRING); + } + + // CraftBukkit start +diff --git a/src/main/java/net/minecraft/util/MemoryReserve.java b/src/main/java/net/minecraft/util/MemoryReserve.java +index 0ee04fe6ff6a4d09754f326526ae04fe7226bab2..0efc5682210e6cd3e0ee03a5e4340614869a8575 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.util.Constants.EMPTY_BYTE; + } + } +diff --git a/src/main/java/net/minecraft/util/ZeroBitStorage.java b/src/main/java/net/minecraft/util/ZeroBitStorage.java +index 5d8e9bdf5538b19681f21949368d862fab8a89ad..2d5aa26dc700d08caa856b6b287b35ed8b99a390 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 = org.plazmamc.plazma.util.Constants.EMPTY_LONG; + private final int size; + + public ZeroBitStorage(int size) { +diff --git a/src/main/java/net/minecraft/util/datafix/fixes/LeavesFix.java b/src/main/java/net/minecraft/util/datafix/fixes/LeavesFix.java +index 89d70a992e0bcc8e7292c4f736470eafd8747b24..a3f071101fbd10272373f99ebd2c76c0805d0d25 100644 +--- a/src/main/java/net/minecraft/util/datafix/fixes/LeavesFix.java ++++ b/src/main/java/net/minecraft/util/datafix/fixes/LeavesFix.java +@@ -70,7 +70,7 @@ public class LeavesFix extends DataFix { + OpticFinder opticFinder3 = DSL.typeFinder(type3); + return this.fixTypeEverywhereTyped("Leaves fix", type, (typed) -> { + return typed.updateTyped(opticFinder, (typedx) -> { +- int[] is = new int[]{0}; ++ int[] is = org.plazmamc.plazma.util.Constants.ZERO_INT; + Typed typed2 = typedx.updateTyped(opticFinder2, (typed2x) -> { + Int2ObjectMap int2ObjectMap = new Int2ObjectOpenHashMap<>(typed2x.getAllTyped(opticFinder3).stream().map((typedx2) -> { + return new LeavesFix.LeavesSection(typedx2, this.getInputSchema()); +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 d47dc0c3fe8c2b80d7b7eb828a12af6eb32145e4..71d2649e4046323250a85f3b071e98f58a161302 100644 +--- a/src/main/java/net/minecraft/world/entity/animal/Bee.java ++++ b/src/main/java/net/minecraft/world/entity/animal/Bee.java +@@ -267,7 +267,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.util.Constants.EMPTY_CLASS)); + 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 b5f445750a5ccbe7658396bdcc9648dc41f39ced..d8853726b9925c085e10d1e091cf275f708dd080 100644 +--- a/src/main/java/net/minecraft/world/entity/animal/IronGolem.java ++++ b/src/main/java/net/minecraft/world/entity/animal/IronGolem.java +@@ -125,7 +125,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.util.Constants.EMPTY_CLASS)); + 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 d1e45052fc96b6f81a331c6c73cb68ff96238359..2bd536243eca0c93c787260848d8b8862de3c996 100644 +--- a/src/main/java/net/minecraft/world/entity/animal/Panda.java ++++ b/src/main/java/net/minecraft/world/entity/animal/Panda.java +@@ -333,7 +333,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.util.Constants.EMPTY_CLASS)).setAlertOthers(org.plazmamc.plazma.util.Constants.EMPTY_CLASS)); + } + + 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 3395bc1d9140ab5496ad998343a963ae12f630d6..5933576c3f6cd8927fafa003fa30163137c25b20 100644 +--- a/src/main/java/net/minecraft/world/entity/animal/Rabbit.java ++++ b/src/main/java/net/minecraft/world/entity/animal/Rabbit.java +@@ -457,7 +457,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.util.Constants.EMPTY_CLASS)).setAlertOthers()); + 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 e0ca657b0aea52ab6a91c256c1bfad1e5028f6e0..92ff2445dafdc5423e9da5941aee2c9d196e8202 100644 +--- a/src/main/java/net/minecraft/world/entity/animal/Wolf.java ++++ b/src/main/java/net/minecraft/world/entity/animal/Wolf.java +@@ -238,7 +238,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.util.Constants.EMPTY_CLASS)).setAlertOthers()); + 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/animal/allay/Allay.java b/src/main/java/net/minecraft/world/entity/animal/allay/Allay.java +index 86c9b549e3e75adf9bd5562c4c8d303cf2080e45..d686cee5601280c3970c7c4e9df2aa2a3bb32a6f 100644 +--- a/src/main/java/net/minecraft/world/entity/animal/allay/Allay.java ++++ b/src/main/java/net/minecraft/world/entity/animal/allay/Allay.java +@@ -86,7 +86,7 @@ public class Allay extends PathfinderMob implements InventoryCarrier { + private static final EntityDataAccessor DATA_DANCING = SynchedEntityData.defineId(Allay.class, EntityDataSerializers.BOOLEAN); + private static final EntityDataAccessor DATA_CAN_DUPLICATE = SynchedEntityData.defineId(Allay.class, EntityDataSerializers.BOOLEAN); + protected static final ImmutableList>> SENSOR_TYPES = ImmutableList.of(SensorType.NEAREST_LIVING_ENTITIES, SensorType.NEAREST_PLAYERS, SensorType.HURT_BY, SensorType.NEAREST_ITEMS); +- protected static final ImmutableList> MEMORY_TYPES = ImmutableList.of(MemoryModuleType.PATH, MemoryModuleType.LOOK_TARGET, MemoryModuleType.NEAREST_VISIBLE_LIVING_ENTITIES, MemoryModuleType.WALK_TARGET, MemoryModuleType.CANT_REACH_WALK_TARGET_SINCE, MemoryModuleType.HURT_BY, MemoryModuleType.NEAREST_VISIBLE_WANTED_ITEM, MemoryModuleType.LIKED_PLAYER, MemoryModuleType.LIKED_NOTEBLOCK_POSITION, MemoryModuleType.LIKED_NOTEBLOCK_COOLDOWN_TICKS, MemoryModuleType.ITEM_PICKUP_COOLDOWN_TICKS, MemoryModuleType.IS_PANICKING, new MemoryModuleType[0]); ++ protected static final ImmutableList> MEMORY_TYPES = ImmutableList.of(MemoryModuleType.PATH, MemoryModuleType.LOOK_TARGET, MemoryModuleType.NEAREST_VISIBLE_LIVING_ENTITIES, MemoryModuleType.WALK_TARGET, MemoryModuleType.CANT_REACH_WALK_TARGET_SINCE, MemoryModuleType.HURT_BY, MemoryModuleType.NEAREST_VISIBLE_WANTED_ITEM, MemoryModuleType.LIKED_PLAYER, MemoryModuleType.LIKED_NOTEBLOCK_POSITION, MemoryModuleType.LIKED_NOTEBLOCK_COOLDOWN_TICKS, MemoryModuleType.ITEM_PICKUP_COOLDOWN_TICKS, MemoryModuleType.IS_PANICKING, org.plazmamc.plazma.util.Constants.MEMORY_MODULE_TYPE); + public static final ImmutableList THROW_SOUND_PITCHES = ImmutableList.of(0.5625F, 0.625F, 0.75F, 0.9375F, 1.0F, 1.0F, 1.125F, 1.25F, 1.5F, 1.875F, 2.0F, 2.25F, new Float[]{2.5F, 3.0F, 3.75F, 4.0F}); + private final DynamicGameEventListener dynamicVibrationListener; + private final VibrationListener.VibrationListenerConfig vibrationListenerConfig; +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 4781bdd3b6c7d6b686f2fe6af530e82861385342..4bdf023ea780cfe6507d26a00332067194140de5 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 +@@ -265,7 +265,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.util.Constants.EMPTY_CLASS)); + 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 9c8713ef3aeb2ff203bd0328d15d80c2d78d09e9..e6169c6d1608f7765f3383dd6c2c8b40c2b690da 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.util.Constants.EMPTY_CLASS)); + 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 c32eda28be3eb2c6a6933463d496ea7b6510f27e..75103823a200b242070d2634c2b2dbdc07aa53be 100644 +--- a/src/main/java/net/minecraft/world/entity/monster/Creeper.java ++++ b/src/main/java/net/minecraft/world/entity/monster/Creeper.java +@@ -184,7 +184,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.util.Constants.EMPTY_CLASS)); + } + + 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 7c26e1979cdae52e2e94d24dd8c3164e815226ab..5faf3a1da09417236a65f13637d09de913207437 100644 +--- a/src/main/java/net/minecraft/world/entity/monster/EnderMan.java ++++ b/src/main/java/net/minecraft/world/entity/monster/EnderMan.java +@@ -132,7 +132,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.util.Constants.EMPTY_CLASS)); + 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 202fe776c9275571138aabd230bec2fa0a985bb1..f95b46f6df814a9eb6b1d920ea9afa5782c2bfaf 100644 +--- a/src/main/java/net/minecraft/world/entity/monster/Silverfish.java ++++ b/src/main/java/net/minecraft/world/entity/monster/Silverfish.java +@@ -84,7 +84,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.util.Constants.EMPTY_CLASS)).setAlertOthers()); + 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 8e071a0922164970e033029c12058db9e8da261a..0c7580f5f648713b781ff6288ec0000809c15dbf 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.util.Constants.EMPTY_CLASS)); + 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 36d37e544e342e1bc584374580dbb5c883523204..11a4a8462723b82367afdfd5776286a0896375d1 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.util.Constants.EMPTY_CLASS)).setAlertOthers(ZombifiedPiglin.class)); + this.targetSelector.addGoal(2, new NearestAttackableTargetGoal<>(this, Player.class, true)); + // Purpur start + if ( 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 d3bcfa017967db0a20c18c65e27c2a0471d2214e..9da90fd6c828fe5fe3a153cd1fda93ce6e54e482 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.util.Constants.EMPTY_CLASS)).setAlertOthers()); // Paper - assign field + 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 117a376f99b1d26c5ffa64c8551ac1e666b15888..62edc084153bdf0c7e4d43a9ab2bb8069a8a60e9 100644 +--- a/src/main/java/net/minecraft/world/item/crafting/ShapedRecipe.java ++++ b/src/main/java/net/minecraft/world/item/crafting/ShapedRecipe.java +@@ -262,7 +262,7 @@ public class ShapedRecipe implements CraftingRecipe { + } + + if (pattern.length == l) { +- return new String[0]; ++ return org.plazmamc.plazma.util.Constants.EMPTY_STRING; + } 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 8da06f8bea0239c5206d5d4f4ff48bdeb0a89f9d..0f612bb7ed955ee966ec9f779a075bdc8d5fcbc8 100644 +--- a/src/main/java/net/minecraft/world/item/crafting/ShapelessRecipe.java ++++ b/src/main/java/net/minecraft/world/item/crafting/ShapelessRecipe.java +@@ -89,7 +89,7 @@ public class ShapelessRecipe implements CraftingRecipe { + 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(org.plazmamc.plazma.util.Constants.INGREDIENT)); + + inventory: for (int index = 0; index < inventory.getContainerSize(); index++) { + ItemStack itemStack = inventory.getItem(index); +diff --git a/src/main/java/net/minecraft/world/level/Level.java b/src/main/java/net/minecraft/world/level/Level.java +index cf0ad841267cac84ed058dee6cdd62a835325feb..24756bb1913eb1f00dc367dd9c9741a3805ef3b4 100644 +--- a/src/main/java/net/minecraft/world/level/Level.java ++++ b/src/main/java/net/minecraft/world/level/Level.java +@@ -1654,7 +1654,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable { + public org.bukkit.entity.Entity[] getChunkEntities(int chunkX, int chunkZ) { + io.papermc.paper.world.ChunkEntitySlices slices = ((ServerLevel)this).getEntityLookup().getChunk(chunkX, chunkZ); + if (slices == null) { +- return new org.bukkit.entity.Entity[0]; ++ return org.plazmamc.plazma.util.Constants.BUKKIT_ENTITY; + } + return slices.getChunkEntities(); + } +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 f085a669e2f2645e8c4f7a7e5a3c958f13809744..279531a360cc1408ad8dd1e668a1e9f05753d676 100644 +--- a/src/main/java/net/minecraft/world/level/block/ComposterBlock.java ++++ b/src/main/java/net/minecraft/world/level/block/ComposterBlock.java +@@ -441,7 +441,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.util.Constants.ZERO_INT : org.plazmamc.plazma.util.Constants.EMPTY_INT; + } + + @Override +@@ -490,7 +490,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.util.Constants.ZERO_INT : org.plazmamc.plazma.util.Constants.EMPTY_INT; + } + + @Override +@@ -532,7 +532,7 @@ public class ComposterBlock extends Block implements WorldlyContainerHolder { + + @Override + public int[] getSlotsForFace(Direction side) { +- return new int[0]; ++ return org.plazmamc.plazma.util.Constants.EMPTY_INT; + } + + @Override +diff --git a/src/main/java/net/minecraft/world/level/block/entity/AbstractFurnaceBlockEntity.java b/src/main/java/net/minecraft/world/level/block/entity/AbstractFurnaceBlockEntity.java +index 5cd7b4e7065070bf9fcc34b621dba2ccba99a573..082129fc5febd78063f1b6de5f13671b429d5865 100644 +--- a/src/main/java/net/minecraft/world/level/block/entity/AbstractFurnaceBlockEntity.java ++++ b/src/main/java/net/minecraft/world/level/block/entity/AbstractFurnaceBlockEntity.java +@@ -66,7 +66,7 @@ public abstract class AbstractFurnaceBlockEntity extends BaseContainerBlockEntit + protected static final int SLOT_FUEL = 1; + protected static final int SLOT_RESULT = 2; + public static final int DATA_LIT_TIME = 0; +- private static final int[] SLOTS_FOR_UP = new int[]{0}; ++ private static final int[] SLOTS_FOR_UP = org.plazmamc.plazma.util.Constants.ZERO_INT; + private static final int[] SLOTS_FOR_DOWN = new int[]{2, 1}; + private static final int[] SLOTS_FOR_SIDES = new int[]{1}; + public static final int DATA_LIT_DURATION = 1; +diff --git a/src/main/java/net/minecraft/world/level/chunk/ChunkStatus.java b/src/main/java/net/minecraft/world/level/chunk/ChunkStatus.java +index 71df7c590e31932f2b8fc26a2afaaa54f52674ac..071847225a94697a26eacb34f22aac0dca436af9 100644 +--- a/src/main/java/net/minecraft/world/level/chunk/ChunkStatus.java ++++ b/src/main/java/net/minecraft/world/level/chunk/ChunkStatus.java +@@ -195,7 +195,7 @@ public class ChunkStatus { + }, (chunkstatus, worldserver, structuretemplatemanager, lightenginethreaded, function, ichunkaccess) -> { + return (CompletableFuture) function.apply(ichunkaccess); + }); +- private static final List STATUS_BY_RANGE = ImmutableList.of(ChunkStatus.FULL, ChunkStatus.FEATURES, ChunkStatus.LIQUID_CARVERS, ChunkStatus.BIOMES, ChunkStatus.STRUCTURE_STARTS, ChunkStatus.STRUCTURE_STARTS, ChunkStatus.STRUCTURE_STARTS, ChunkStatus.STRUCTURE_STARTS, ChunkStatus.STRUCTURE_STARTS, ChunkStatus.STRUCTURE_STARTS, ChunkStatus.STRUCTURE_STARTS, ChunkStatus.STRUCTURE_STARTS, new ChunkStatus[0]); ++ private static final List STATUS_BY_RANGE = ImmutableList.of(ChunkStatus.FULL, ChunkStatus.FEATURES, ChunkStatus.LIQUID_CARVERS, ChunkStatus.BIOMES, ChunkStatus.STRUCTURE_STARTS, ChunkStatus.STRUCTURE_STARTS, ChunkStatus.STRUCTURE_STARTS, ChunkStatus.STRUCTURE_STARTS, ChunkStatus.STRUCTURE_STARTS, ChunkStatus.STRUCTURE_STARTS, ChunkStatus.STRUCTURE_STARTS, ChunkStatus.STRUCTURE_STARTS, org.plazmamc.plazma.util.Constants.CHUNK_STATUS); + private static final IntList RANGE_BY_STATUS = (IntList) Util.make(new IntArrayList(ChunkStatus.getStatusList().size()), (intarraylist) -> { + int i = 0; + +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 dcfe090c269d4cbcc2eb1b6f85392848bb34656c..d1b3863df59115899494b9d662ba6beba2f15353 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.util.Constants.LINK_OPTION)) { + 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.util.Constants.LINK_OPTION)) { + 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.util.Constants.LINK_OPTION)) { + 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..bd88f27db229d1e34b69bcd9e975bec502d8226b 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.util.Constants.BLOCK_STATE); + } + + @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..c5597c9b902857ed83b54fd74fcd9463749e3dbc 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,8 @@ 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]; ++ private Node[] openSet = org.plazmamc.plazma.util.Constants.EMPTY_NODE; ++ private Node[] closedSet = org.plazmamc.plazma.util.Constants.EMPTY_NODE; + @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 f212a78d9d32e9b59f16f03e07d2dd4789ad8080..cd894e9ba08efed114efd76126a888cf3c4f9327 100644 +--- a/src/main/java/net/minecraft/world/level/storage/LevelStorageSource.java ++++ b/src/main/java/net/minecraft/world/level/storage/LevelStorageSource.java +@@ -125,14 +125,14 @@ 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.util.Constants.LINK_OPTION)) { + throw new LevelStorageException(Component.translatable("selectWorld.load_folder_access")); + } else { + try { + List list = Files.list(this.baseDir).filter((path) -> { +- return Files.isDirectory(path, new LinkOption[0]); ++ return Files.isDirectory(path, org.plazmamc.plazma.util.Constants.LINK_OPTION); + }).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.util.Constants.LINK_OPTION) || Files.isRegularFile(convertable_b.oldDataFile(), org.plazmamc.plazma.util.Constants.LINK_OPTION); + }).toList(); + + return new LevelStorageSource.LevelCandidates(list); +@@ -187,12 +187,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.util.Constants.LINK_OPTION)) { + return null; + } else { + Path path = levelSave.dataFile(); + +- if (Files.exists(path, new LinkOption[0])) { ++ if (Files.exists(path, org.plazmamc.plazma.util.Constants.LINK_OPTION)) { + T t0 = levelDataParser.apply(path, this.fixerUpper); + + if (t0 != null) { +@@ -201,7 +201,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.util.Constants.LINK_OPTION) ? levelDataParser.apply(path, this.fixerUpper) : null; + } + } + +@@ -322,7 +322,7 @@ public class LevelStorageSource { + } + + public boolean levelExists(String name) { +- return Files.isDirectory(this.baseDir.resolve(name), new LinkOption[0]); ++ return Files.isDirectory(this.baseDir.resolve(name), org.plazmamc.plazma.util.Constants.LINK_OPTION); + } + + public Path getBaseDir() { +@@ -546,7 +546,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.util.Constants.LINK_OPTION)) { + 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..e9db2ee5819f6b81973472ea74bc0708612e30be 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.util.Constants.EMPTY_STRING; + } + + 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..92fe0ca7c16134701f72ea263d9aa933185978d3 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(new LootPoolEntryContainer[0]), this.conditions.toArray(new LootItemCondition[0]), this.functions.toArray(org.plazmamc.plazma.util.Constants.LOOT_ITEM_FUNCTION), this.rolls, this.bonusRolls); + } + } + } +@@ -171,7 +171,7 @@ public class LootPool { + 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); ++ LootItemFunction[] lootItemFunctions = GsonHelper.getAsObject(jsonObject, "functions", org.plazmamc.plazma.util.Constants.LOOT_ITEM_FUNCTION, jsonDeserializationContext, LootItemFunction[].class); + 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 3bc13092873609af9c6f412190dd989d39f1df23..10654d926a60510e7449903e3ab864bc1e289b4c 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 +@@ -42,7 +42,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, new LootPool[0], new LootItemFunction[0]); ++ public static final LootTable EMPTY = new LootTable(LootContextParamSets.EMPTY, org.plazmamc.plazma.util.Constants.LOOT_POOL, org.plazmamc.plazma.util.Constants.LOOT_ITEM_FUNCTION); + public static final LootContextParamSet DEFAULT_PARAM_SET = LootContextParamSets.ALL_PARAMS; + final LootContextParamSet paramSet; + final LootPool[] pools; +@@ -257,7 +257,7 @@ public class LootTable { + } + + public LootTable build() { +- return new LootTable(this.paramSet, (LootPool[]) this.pools.toArray(new LootPool[0]), (LootItemFunction[]) this.functions.toArray(new LootItemFunction[0])); ++ return new LootTable(this.paramSet, (LootPool[]) this.pools.toArray(org.plazmamc.plazma.util.Constants.LOOT_POOL), (LootItemFunction[]) this.functions.toArray(org.plazmamc.plazma.util.Constants.LOOT_ITEM_FUNCTION)); + } + } + +@@ -267,7 +267,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.util.Constants.LOOT_POOL, jsondeserializationcontext, LootPool[].class); + LootContextParamSet lootcontextparameterset = null; + + if (jsonobject.has("type")) { +@@ -276,7 +276,7 @@ public class LootTable { + lootcontextparameterset = LootContextParamSets.get(new ResourceLocation(s)); + } + +- LootItemFunction[] alootitemfunction = (LootItemFunction[]) GsonHelper.getAsObject(jsonobject, "functions", new LootItemFunction[0], jsondeserializationcontext, LootItemFunction[].class); ++ LootItemFunction[] alootitemfunction = (LootItemFunction[]) GsonHelper.getAsObject(jsonobject, "functions", org.plazmamc.plazma.util.Constants.LOOT_ITEM_FUNCTION, jsondeserializationcontext, LootItemFunction[].class); + + return new LootTable(lootcontextparameterset != null ? lootcontextparameterset : LootContextParamSets.ALL_PARAMS, alootselector, alootitemfunction); + } +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..ebb598eab6ae185b7a4e126cc59637b0cf878fee 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.util.Constants.LOOT_ITEM_FUNCTION); + } + + 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.util.Constants.LOOT_ITEM_FUNCTION, jsonDeserializationContext, LootItemFunction[].class); + return this.deserialize(jsonObject, jsonDeserializationContext, i, j, lootItemConditions, lootItemFunctions); + } + +diff --git a/src/main/java/net/minecraft/world/scores/Team.java b/src/main/java/net/minecraft/world/scores/Team.java +index 16d2aa4556bc9f32a2def7f9ca282aa3fa23fb87..c9b266246a83e3d7f5ce61306f291ceff902079d 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.util.Constants.EMPTY_STRING); + } + + @Nullable +diff --git a/src/main/java/org/bukkit/craftbukkit/bootstrap/Main.java b/src/main/java/org/bukkit/craftbukkit/bootstrap/Main.java +index 9a2ec50be757dfa3780a49ec96942fed89ed530c..d5b904a36d7c0a9d0f8787eccc770fd47a03430f 100644 +--- a/src/main/java/org/bukkit/craftbukkit/bootstrap/Main.java ++++ b/src/main/java/org/bukkit/craftbukkit/bootstrap/Main.java +@@ -50,7 +50,7 @@ public class Main { + System.exit(0); + } + +- URLClassLoader classLoader = new URLClassLoader(extractedUrls.toArray(new URL[0])); ++ URLClassLoader classLoader = new URLClassLoader(extractedUrls.toArray(org.plazmamc.plazma.util.Constants.URL)); + + System.out.println("Starting server"); + Thread runThread = new Thread(() -> { +diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +index f4a341f72d727bbffa4cfcf72eda8ed0c8945c9e..ca5b436821c9d5e070ab271fc91a29cf53834a89 100644 +--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java ++++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +@@ -471,7 +471,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.util.Constants.BASE_COMPONENT : title.getSubtitle()); + 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 a5d7fae348b0b262a0a8a5e8e76f1bc75ca52a16..8b9b267e226ab1645fd8c57e1f8196276008345e 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.util.Constants.BASE_COMPONENT : text; + 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.util.Constants.BASE_COMPONENT; + } + + CraftMetaBook.this.internalAddPage(this.componentsToPage(page)); +diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaItem.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaItem.java +index 936f8babf74b2be6240e5dbc2d0a84f8badada2e..ab9f71a45a4f2a9781ad1a12f8dda4ac9179c72f 100644 +--- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaItem.java ++++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaItem.java +@@ -880,7 +880,7 @@ class CraftMetaItem implements ItemMeta, Damageable, Repairable, BlockDataMeta { + // Paper start + @Override + public net.md_5.bungee.api.chat.BaseComponent[] getDisplayNameComponent() { +- return displayName == null ? new net.md_5.bungee.api.chat.BaseComponent[0] : net.md_5.bungee.chat.ComponentSerializer.parse(displayName); ++ return displayName == null ? org.plazmamc.plazma.util.Constants.BASE_COMPONENT : net.md_5.bungee.chat.ComponentSerializer.parse(displayName); + } + // Paper end + @Override +diff --git a/src/main/java/org/bukkit/craftbukkit/util/WeakCollection.java b/src/main/java/org/bukkit/craftbukkit/util/WeakCollection.java +index 049d750d3af991dd14ac8cf644330404e74b2151..c2d41e133bbbaf1b445388829769e898b0ae67da 100644 +--- a/src/main/java/org/bukkit/craftbukkit/util/WeakCollection.java ++++ b/src/main/java/org/bukkit/craftbukkit/util/WeakCollection.java +@@ -166,7 +166,7 @@ public final class WeakCollection implements Collection { + + @Override + public Object[] toArray() { +- return this.toArray(new Object[0]); ++ return this.toArray(org.plazmamc.plazma.util.Constants.EMPTY_OBJECT); + } + + @Override +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..d4f5a0e49eebd2e02790a10a87166836ee6c3c09 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.util.Constants.EMPTY_STRING); + return true; + } + } +diff --git a/src/main/java/org/plazmamc/plazma/util/Constants.java b/src/main/java/org/plazmamc/plazma/util/Constants.java +new file mode 100644 +index 0000000000000000000000000000000000000000..be3d3a62b966b1d09ca417c4339757fb8c2bb710 +--- /dev/null ++++ b/src/main/java/org/plazmamc/plazma/util/Constants.java +@@ -0,0 +1,40 @@ ++package org.plazmamc.plazma.util; ++ ++public final class Constants { ++ ++ public static final Object[] EMPTY_OBJECT = new Object[0]; ++ public static final byte[] EMPTY_BYTE = new byte[0]; ++ public static final int[] EMPTY_INT = new int[0]; ++ public static final int[] ZERO_INT = new int[]{0}; ++ public static final long[] EMPTY_LONG = new long[0]; ++ public static final String[] EMPTY_STRING = new String[0]; ++ public static final StackTraceElement[] STACK_TRACE_ELEMENT = new StackTraceElement[0]; ++ public static final Class[] EMPTY_CLASS = new Class[0]; ++ ++ public static final java.util.concurrent.CompletableFuture[] COMPLETABLE_FUTURE = new java.util.concurrent.CompletableFuture[0]; ++ public static final java.nio.file.LinkOption[] LINK_OPTION = new java.nio.file.LinkOption[0]; ++ public static final java.net.URL[] URL = new java.net.URL[0]; ++ ++ public static final com.mojang.authlib.GameProfile[] GAME_PROFILE = new com.mojang.authlib.GameProfile[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.chunk.LevelChunk[] LEVEL_CHUNK = new net.minecraft.world.level.chunk.LevelChunk[0]; ++ public static final net.minecraft.resources.ResourceLocation[] RESOURCE_LOCATION = new net.minecraft.resources.ResourceLocation[0]; ++ public static final net.minecraft.server.network.ServerPlayerConnection[] SERVER_PLAYER_CONNECTION = new net.minecraft.server.network.ServerPlayerConnection[0]; ++ public static final net.minecraft.world.entity.ai.memory.MemoryModuleType[] MEMORY_MODULE_TYPE = new net.minecraft.world.entity.ai.memory.MemoryModuleType[0]; ++ public static final net.minecraft.world.item.crafting.Ingredient[] INGREDIENT = new net.minecraft.world.item.crafting.Ingredient[0]; ++ public static final net.minecraft.world.level.chunk.ChunkStatus[] CHUNK_STATUS = new net.minecraft.world.level.chunk.ChunkStatus[0]; ++ public static final net.minecraft.world.level.pathfinder.Node[] EMPTY_NODE = new net.minecraft.world.level.pathfinder.Node[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.functions.LootItemFunction[] LOOT_ITEM_FUNCTION = new net.minecraft.world.level.storage.loot.functions.LootItemFunction[0]; ++ ++ public static final net.md_5.bungee.api.chat.BaseComponent[] BASE_COMPONENT = new net.md_5.bungee.api.chat.BaseComponent[0]; ++ ++ public static final io.papermc.paper.chunk.system.scheduling.ChunkTaskScheduler.ChunkInfo[] CHUNK_INFO = new io.papermc.paper.chunk.system.scheduling.ChunkTaskScheduler.ChunkInfo[0]; ++ ++ public static final ca.spottedleaf.starlight.common.light.StarLightEngine.AxisDirection[] STARLIGHT_AXIS_DIRECTION = new ca.spottedleaf.starlight.common.light.StarLightEngine.AxisDirection[0]; ++ ++ public static final org.bukkit.entity.Entity[] BUKKIT_ENTITY = new org.bukkit.entity.Entity[0]; ++ ++} +\ No newline at end of file +diff --git a/src/main/java/org/purpurmc/purpur/command/PurpurCommand.java b/src/main/java/org/purpurmc/purpur/command/PurpurCommand.java +index 2621e54879e9ab0029a875f1d09eee67878b90d5..6fdb80b1b3cbc0b4f8e50ccbf5f5104496860100 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.util.Constants.EMPTY_STRING); + } + } + diff --git a/patches/todo/0040-Reduce-allocations.patch b/patches/todo/0040-Reduce-allocations.patch new file mode 100644 index 0000000..f0bbd9c --- /dev/null +++ b/patches/todo/0040-Reduce-allocations.patch @@ -0,0 +1,1032 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: IPECTER +Date: Tue, 30 May 2023 11:33:01 +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 1b0d92c68407cdb09ed8aac271b625d92db87017..8b48be5e2ea8815c152d182aa010eba0da84c562 100644 +--- a/src/main/java/ca/spottedleaf/starlight/common/light/StarLightEngine.java ++++ b/src/main/java/ca/spottedleaf/starlight/common/light/StarLightEngine.java +@@ -39,7 +39,7 @@ public abstract class StarLightEngine { + AxisDirection.POSITIVE_Z, AxisDirection.NEGATIVE_Z + }; + +- protected static enum AxisDirection { ++ public static enum AxisDirection { // Plazma - protected -> public + + // Declaration order is important and relied upon. Do not change without modifying propagation code. + POSITIVE_X(1, 0, 0), NEGATIVE_X(-1, 0, 0), +@@ -1094,7 +1094,7 @@ public abstract class StarLightEngine { + 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(org.plazmamc.plazma.util.Constants.STARLIGHT_AXIS_DIRECTION); + } + } + +diff --git a/src/main/java/com/destroystokyo/paper/antixray/ChunkPacketBlockControllerAntiXray.java b/src/main/java/com/destroystokyo/paper/antixray/ChunkPacketBlockControllerAntiXray.java +index cab91880a08c6fdc545804911d295e0f24f4d983..ca2ca7f3b5b0ea5862011c6b4beab4b2ab540792 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.util.Constants.BLOCK_STATE); ++ presetBlockStatesFull = presetBlockStateSet.isEmpty() ? new BlockState[]{Blocks.DIAMOND_ORE.defaultBlockState()} : presetBlockStateList.toArray(org.plazmamc.plazma.util.Constants.BLOCK_STATE); + presetBlockStatesStone = null; + presetBlockStatesDeepslate = null; + presetBlockStatesNetherrack = null; +diff --git a/src/main/java/com/destroystokyo/paper/util/maplist/ChunkList.java b/src/main/java/com/destroystokyo/paper/util/maplist/ChunkList.java +index 554f4d4e63c1431721989e6f502a32ccc53a8807..237cc1927c237fe4e87d5cbf74c6d1faae1d67f2 100644 +--- a/src/main/java/com/destroystokyo/paper/util/maplist/ChunkList.java ++++ b/src/main/java/com/destroystokyo/paper/util/maplist/ChunkList.java +@@ -17,7 +17,7 @@ public final class ChunkList implements Iterable { + this.chunkToIndex.defaultReturnValue(Integer.MIN_VALUE); + } + +- protected static final LevelChunk[] EMPTY_LIST = new LevelChunk[0]; ++ protected static final LevelChunk[] EMPTY_LIST = org.plazmamc.plazma.util.Constants.LEVEL_CHUNK; + + protected LevelChunk[] chunks = EMPTY_LIST; + protected int count; +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..5bf288af5d2855c2287a297abedb2cf9358b8b3c 100644 +--- a/src/main/java/com/destroystokyo/paper/util/maplist/EntityList.java ++++ b/src/main/java/com/destroystokyo/paper/util/maplist/EntityList.java +@@ -17,7 +17,7 @@ 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 = org.plazmamc.plazma.util.Constants.ENTITY; + + protected Entity[] entities = EMPTY_LIST; + protected int count; +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..d552f9fe1bfb8c9a25f27117cb6896c11b05a0c3 100644 +--- a/src/main/java/com/destroystokyo/paper/util/maplist/IBlockDataList.java ++++ b/src/main/java/com/destroystokyo/paper/util/maplist/IBlockDataList.java +@@ -20,7 +20,7 @@ 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 = org.plazmamc.plazma.util.Constants.EMPTY_LONG; + + private long[] byIndex = EMPTY_LIST; + private int size; +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..a5460fc96ebc6f1356e4cec1ee7ef14879ab3b2a 100644 +--- a/src/main/java/com/destroystokyo/paper/util/maplist/ReferenceList.java ++++ b/src/main/java/com/destroystokyo/paper/util/maplist/ReferenceList.java +@@ -15,7 +15,7 @@ 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 = org.plazmamc.plazma.util.Constants.EMPTY_OBJECT; + + protected Object[] references = EMPTY_LIST; + protected int count; +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 84cc9397237fa0c17aa1012dfb5683c90eb6d3b8..aec83ebe4038b73a9c69dd86029e466f6d6e52d5 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 +@@ -751,7 +751,7 @@ public final class ChunkTaskScheduler { + + public static ChunkInfo[] getChunkInfos() { + synchronized (WAITING_CHUNKS) { +- return WAITING_CHUNKS.toArray(new ChunkInfo[0]); ++ return WAITING_CHUNKS.toArray(org.plazmamc.plazma.util.Constants.CHUNK_INFO); + } + } + +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..e678d1bf61a2238967c3bd999dfba4adbdf315cc 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.util.Constants.EMPTY_STRING); + } + return true; + } +diff --git a/src/main/java/io/papermc/paper/world/ChunkEntitySlices.java b/src/main/java/io/papermc/paper/world/ChunkEntitySlices.java +index f597d65d56964297eeeed6c7e77703764178fee0..15240fe6ca5fd3f9bbbcc4499c0bf26bb35803c0 100644 +--- a/src/main/java/io/papermc/paper/world/ChunkEntitySlices.java ++++ b/src/main/java/io/papermc/paper/world/ChunkEntitySlices.java +@@ -81,7 +81,7 @@ public final class ChunkEntitySlices { + } + } + +- return ret.toArray(new org.bukkit.entity.Entity[0]); ++ return ret.toArray(org.plazmamc.plazma.util.Constants.BUKKIT_ENTITY); + } + + public CompoundTag save() { +@@ -298,7 +298,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.util.Constants.ENTITY; + 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..7e124979a2843b7f0a365e51d23192731747e6bf 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.util.Constants.STACK_TRACE_ELEMENT; + 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..61f63791ddda4fd84298d18be3dbb6c44b3462da 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.util.Constants.STACK_TRACE_ELEMENT; + + 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 4c90a6ee734451fe404b2255d21090b669da1aa1..ae8b26aa9ceff07a79b1dbfd310123ca61a97a3d 100644 +--- a/src/main/java/net/minecraft/Util.java ++++ b/src/main/java/net/minecraft/Util.java +@@ -400,7 +400,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.util.Constants.COMPLETABLE_FUTURE)); + return completableFuture.thenApply((void_) -> { + return futures.stream().map(CompletableFuture::join).toList(); + }); +diff --git a/src/main/java/net/minecraft/nbt/ByteArrayTag.java b/src/main/java/net/minecraft/nbt/ByteArrayTag.java +index 163b1895bcbd16e93d36cd60d03e6b21df51cba7..4d47adb914399de94f725f53b938588051919ebe 100644 +--- a/src/main/java/net/minecraft/nbt/ByteArrayTag.java ++++ b/src/main/java/net/minecraft/nbt/ByteArrayTag.java +@@ -175,7 +175,7 @@ public class ByteArrayTag extends CollectionTag { + } + + public void clear() { +- this.data = new byte[0]; ++ this.data = org.plazmamc.plazma.util.Constants.EMPTY_BYTE; + } + + @Override +diff --git a/src/main/java/net/minecraft/nbt/CompoundTag.java b/src/main/java/net/minecraft/nbt/CompoundTag.java +index 7e94ebe06fc62293e665d6db19e42d947e7eb30f..6f41b334efc4a540cd8efcc782f5d5c8862b7476 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.util.Constants.EMPTY_BYTE; + } + + 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.util.Constants.EMPTY_INT; + } + + 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.util.Constants.EMPTY_LONG; + } + + 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..4dec198d867b9d95572e6a93b219f6c46357f3cf 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.util.Constants.EMPTY_INT; + } + + @Override +diff --git a/src/main/java/net/minecraft/network/Connection.java b/src/main/java/net/minecraft/network/Connection.java +index 323416311f14f5ad887f05183ad3b4921981aecd..7ef5055d7d6d7576cefdbc80ede4f4ce28e15c1b 100644 +--- a/src/main/java/net/minecraft/network/Connection.java ++++ b/src/main/java/net/minecraft/network/Connection.java +@@ -318,7 +318,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.util.Constants.EMPTY_OBJECT); + this.packetListener = listener; + } + // Paper start +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 7c6a6693760638a07b7c7c330aaeffd9fa454845..d4a7157d2b2c5f25ed00b706d0adbf195e5e6977 100644 +--- a/src/main/java/net/minecraft/network/protocol/game/ClientboundSectionBlocksUpdatePacket.java ++++ b/src/main/java/net/minecraft/network/protocol/game/ClientboundSectionBlocksUpdatePacket.java +@@ -67,7 +67,7 @@ public class ClientboundSectionBlocksUpdatePacket implements Packet blockChanges, boolean suppressLightUpdates) { + this.sectionPos = sectionPos; + this.positions = blockChanges.keySet().toShortArray(); +- this.states = blockChanges.values().toArray(new BlockState[0]); ++ this.states = blockChanges.values().toArray(org.plazmamc.plazma.util.Constants.BLOCK_STATE); + this.suppressLightUpdates = suppressLightUpdates; + } + // Paper end +diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java +index 3c80e14392ee7a6bf5040d7cb81b7d894e162eff..a358a821e2ed71fdb2e85c71b75fda00fdad7f9b 100644 +--- a/src/main/java/net/minecraft/server/MinecraftServer.java ++++ b/src/main/java/net/minecraft/server/MinecraftServer.java +@@ -1373,10 +1373,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.util.Constants.LINK_OPTION); + }).or(() -> { + return this.storageSource.getIconFile().filter((path) -> { +- return Files.isRegularFile(path, new LinkOption[0]); ++ return Files.isRegularFile(path, org.plazmamc.plazma.util.Constants.LINK_OPTION); + }); + }); + +diff --git a/src/main/java/net/minecraft/server/PlayerAdvancements.java b/src/main/java/net/minecraft/server/PlayerAdvancements.java +index 3919d9c193abcfd8b97dfb0ceb38638440f60fbe..31129b7a4e325649830089a5422e3ccf9b5875a5 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.util.Constants.LINK_OPTION)) { + try { + JsonReader jsonreader = new JsonReader(Files.newBufferedReader(this.playerSavePath, StandardCharsets.UTF_8)); + +diff --git a/src/main/java/net/minecraft/server/level/ChunkMap.java b/src/main/java/net/minecraft/server/level/ChunkMap.java +index 57fdef8b16e1ed9a4693356144b4685bbcea285c..d41086166c39fedf8da29ac9010c501ef5fe3131 100644 +--- a/src/main/java/net/minecraft/server/level/ChunkMap.java ++++ b/src/main/java/net/minecraft/server/level/ChunkMap.java +@@ -1550,7 +1550,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(org.plazmamc.plazma.util.Constants.SERVER_PLAYER_CONNECTION)) { // avoid CME + 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 ebbf462835e5a14fe1413c724d4985635207a897..c2030d2e936fc5582e3fd1c753e1d0a40b905bab 100644 +--- a/src/main/java/net/minecraft/server/level/ServerLevel.java ++++ b/src/main/java/net/minecraft/server/level/ServerLevel.java +@@ -1250,7 +1250,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.util.Constants.ENTITY : new Entity[] { ticking }); + + 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 b15de37a06c3efb1c4bc790ccb23ebff3c97d54d..d76bff083c0ecd49dfd82dd8ccffae86820308ce 100644 +--- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java ++++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java +@@ -434,7 +434,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.util.Constants.EMPTY_OBJECT), org.bukkit.event.player.PlayerKickEvent.Cause.TIMEOUT); // Paper - kick event cause + } + } else { + if (elapsedTime >= 15000L) { // 15 seconds +@@ -915,13 +915,13 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic + // PacketUtils.ensureRunningOnSameThread(packet, this, this.player.getLevel()); // 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.util.Constants.EMPTY_OBJECT), org.bukkit.event.player.PlayerKickEvent.Cause.SPAM)); // Paper - kick event cause + return; + } + // Paper start + String str = packet.getCommand(); int index = -1; + if (str.length() > 64 && ((index = str.indexOf(' ')) == -1 || index >= 64)) { +- server.scheduleOnMain(() -> this.disconnect(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.util.Constants.EMPTY_OBJECT), org.bukkit.event.player.PlayerKickEvent.Cause.SPAM)); // Paper - kick event cause + return; + } + // Paper end +@@ -3391,7 +3391,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic + // Paper start + if (!org.bukkit.Bukkit.isPrimaryThread()) { + if (recipeSpamPackets.addAndGet(io.papermc.paper.configuration.GlobalConfiguration.get().spamLimiter.recipeSpamIncrement) > io.papermc.paper.configuration.GlobalConfiguration.get().spamLimiter.recipeSpamLimit) { +- 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 ++ server.scheduleOnMain(() -> this.disconnect(net.minecraft.network.chat.Component.translatable("disconnect.spam", org.plazmamc.plazma.util.Constants.EMPTY_OBJECT), org.bukkit.event.player.PlayerKickEvent.Cause.SPAM)); // Paper - kick event cause + return; + } + } +diff --git a/src/main/java/net/minecraft/server/network/ServerLoginPacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerLoginPacketListenerImpl.java +index 06ff5dd9e39e2be8dd8397a764813111019ceaed..6a17b2b1d2fc75b87b2683ffe033fdc111e5750c 100644 +--- a/src/main/java/net/minecraft/server/network/ServerLoginPacketListenerImpl.java ++++ b/src/main/java/net/minecraft/server/network/ServerLoginPacketListenerImpl.java +@@ -238,8 +238,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.util.Constants.EMPTY_OBJECT); ++ if (!org.plazmamc.plazma.configurations.GlobalConfiguration.get().player.allowAnyUsername) Validate.validState(ServerLoginPacketListenerImpl.isValidUsername(packet.name()), "Invalid characters in username", org.plazmamc.plazma.util.Constants.EMPTY_OBJECT); // Plazma + // 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())) { +@@ -298,7 +298,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.util.Constants.EMPTY_OBJECT); + + 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 022da50912d357581b2132cf57e1a767e436022c..555472cad13c6453090b6f15133bbf2b90014a74 100644 +--- a/src/main/java/net/minecraft/server/players/PlayerList.java ++++ b/src/main/java/net/minecraft/server/players/PlayerList.java +@@ -695,7 +695,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.util.Constants.EMPTY_OBJECT), org.bukkit.event.player.PlayerKickEvent.Cause.DUPLICATE_LOGIN); // Paper - kick event cause + } + + // Instead of kicking then returning, we need to store the kick reason +diff --git a/src/main/java/net/minecraft/server/players/StoredUserList.java b/src/main/java/net/minecraft/server/players/StoredUserList.java +index 4fd709a550bf8da1e996894a1ca6b91206c31e9e..d676116150e5a741b2050e26c76c19bccc8a95dc 100644 +--- a/src/main/java/net/minecraft/server/players/StoredUserList.java ++++ b/src/main/java/net/minecraft/server/players/StoredUserList.java +@@ -95,7 +95,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.util.Constants.EMPTY_STRING); + } + + // CraftBukkit start +diff --git a/src/main/java/net/minecraft/util/ZeroBitStorage.java b/src/main/java/net/minecraft/util/ZeroBitStorage.java +index 5d8e9bdf5538b19681f21949368d862fab8a89ad..2d5aa26dc700d08caa856b6b287b35ed8b99a390 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 = org.plazmamc.plazma.util.Constants.EMPTY_LONG; + private final int size; + + public ZeroBitStorage(int size) { +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 d47dc0c3fe8c2b80d7b7eb828a12af6eb32145e4..71d2649e4046323250a85f3b071e98f58a161302 100644 +--- a/src/main/java/net/minecraft/world/entity/animal/Bee.java ++++ b/src/main/java/net/minecraft/world/entity/animal/Bee.java +@@ -267,7 +267,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.util.Constants.EMPTY_CLASS)); + 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 b5f445750a5ccbe7658396bdcc9648dc41f39ced..d8853726b9925c085e10d1e091cf275f708dd080 100644 +--- a/src/main/java/net/minecraft/world/entity/animal/IronGolem.java ++++ b/src/main/java/net/minecraft/world/entity/animal/IronGolem.java +@@ -125,7 +125,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.util.Constants.EMPTY_CLASS)); + 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 d1e45052fc96b6f81a331c6c73cb68ff96238359..2bd536243eca0c93c787260848d8b8862de3c996 100644 +--- a/src/main/java/net/minecraft/world/entity/animal/Panda.java ++++ b/src/main/java/net/minecraft/world/entity/animal/Panda.java +@@ -333,7 +333,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.util.Constants.EMPTY_CLASS)).setAlertOthers(org.plazmamc.plazma.util.Constants.EMPTY_CLASS)); + } + + 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 3395bc1d9140ab5496ad998343a963ae12f630d6..5933576c3f6cd8927fafa003fa30163137c25b20 100644 +--- a/src/main/java/net/minecraft/world/entity/animal/Rabbit.java ++++ b/src/main/java/net/minecraft/world/entity/animal/Rabbit.java +@@ -457,7 +457,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.util.Constants.EMPTY_CLASS)).setAlertOthers()); + 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 e0ca657b0aea52ab6a91c256c1bfad1e5028f6e0..92ff2445dafdc5423e9da5941aee2c9d196e8202 100644 +--- a/src/main/java/net/minecraft/world/entity/animal/Wolf.java ++++ b/src/main/java/net/minecraft/world/entity/animal/Wolf.java +@@ -238,7 +238,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.util.Constants.EMPTY_CLASS)).setAlertOthers()); + 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/animal/allay/Allay.java b/src/main/java/net/minecraft/world/entity/animal/allay/Allay.java +index 86c9b549e3e75adf9bd5562c4c8d303cf2080e45..d686cee5601280c3970c7c4e9df2aa2a3bb32a6f 100644 +--- a/src/main/java/net/minecraft/world/entity/animal/allay/Allay.java ++++ b/src/main/java/net/minecraft/world/entity/animal/allay/Allay.java +@@ -86,7 +86,7 @@ public class Allay extends PathfinderMob implements InventoryCarrier { + private static final EntityDataAccessor DATA_DANCING = SynchedEntityData.defineId(Allay.class, EntityDataSerializers.BOOLEAN); + private static final EntityDataAccessor DATA_CAN_DUPLICATE = SynchedEntityData.defineId(Allay.class, EntityDataSerializers.BOOLEAN); + protected static final ImmutableList>> SENSOR_TYPES = ImmutableList.of(SensorType.NEAREST_LIVING_ENTITIES, SensorType.NEAREST_PLAYERS, SensorType.HURT_BY, SensorType.NEAREST_ITEMS); +- protected static final ImmutableList> MEMORY_TYPES = ImmutableList.of(MemoryModuleType.PATH, MemoryModuleType.LOOK_TARGET, MemoryModuleType.NEAREST_VISIBLE_LIVING_ENTITIES, MemoryModuleType.WALK_TARGET, MemoryModuleType.CANT_REACH_WALK_TARGET_SINCE, MemoryModuleType.HURT_BY, MemoryModuleType.NEAREST_VISIBLE_WANTED_ITEM, MemoryModuleType.LIKED_PLAYER, MemoryModuleType.LIKED_NOTEBLOCK_POSITION, MemoryModuleType.LIKED_NOTEBLOCK_COOLDOWN_TICKS, MemoryModuleType.ITEM_PICKUP_COOLDOWN_TICKS, MemoryModuleType.IS_PANICKING, new MemoryModuleType[0]); ++ protected static final ImmutableList> MEMORY_TYPES = ImmutableList.of(MemoryModuleType.PATH, MemoryModuleType.LOOK_TARGET, MemoryModuleType.NEAREST_VISIBLE_LIVING_ENTITIES, MemoryModuleType.WALK_TARGET, MemoryModuleType.CANT_REACH_WALK_TARGET_SINCE, MemoryModuleType.HURT_BY, MemoryModuleType.NEAREST_VISIBLE_WANTED_ITEM, MemoryModuleType.LIKED_PLAYER, MemoryModuleType.LIKED_NOTEBLOCK_POSITION, MemoryModuleType.LIKED_NOTEBLOCK_COOLDOWN_TICKS, MemoryModuleType.ITEM_PICKUP_COOLDOWN_TICKS, MemoryModuleType.IS_PANICKING, org.plazmamc.plazma.util.Constants.MEMORY_MODULE_TYPE); + public static final ImmutableList THROW_SOUND_PITCHES = ImmutableList.of(0.5625F, 0.625F, 0.75F, 0.9375F, 1.0F, 1.0F, 1.125F, 1.25F, 1.5F, 1.875F, 2.0F, 2.25F, new Float[]{2.5F, 3.0F, 3.75F, 4.0F}); + private final DynamicGameEventListener dynamicVibrationListener; + private final VibrationListener.VibrationListenerConfig vibrationListenerConfig; +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 4781bdd3b6c7d6b686f2fe6af530e82861385342..4bdf023ea780cfe6507d26a00332067194140de5 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 +@@ -265,7 +265,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.util.Constants.EMPTY_CLASS)); + 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 9c8713ef3aeb2ff203bd0328d15d80c2d78d09e9..e6169c6d1608f7765f3383dd6c2c8b40c2b690da 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.util.Constants.EMPTY_CLASS)); + 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 c32eda28be3eb2c6a6933463d496ea7b6510f27e..75103823a200b242070d2634c2b2dbdc07aa53be 100644 +--- a/src/main/java/net/minecraft/world/entity/monster/Creeper.java ++++ b/src/main/java/net/minecraft/world/entity/monster/Creeper.java +@@ -184,7 +184,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.util.Constants.EMPTY_CLASS)); + } + + 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 7c26e1979cdae52e2e94d24dd8c3164e815226ab..5faf3a1da09417236a65f13637d09de913207437 100644 +--- a/src/main/java/net/minecraft/world/entity/monster/EnderMan.java ++++ b/src/main/java/net/minecraft/world/entity/monster/EnderMan.java +@@ -132,7 +132,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.util.Constants.EMPTY_CLASS)); + 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 202fe776c9275571138aabd230bec2fa0a985bb1..f95b46f6df814a9eb6b1d920ea9afa5782c2bfaf 100644 +--- a/src/main/java/net/minecraft/world/entity/monster/Silverfish.java ++++ b/src/main/java/net/minecraft/world/entity/monster/Silverfish.java +@@ -84,7 +84,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.util.Constants.EMPTY_CLASS)).setAlertOthers()); + 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 8e071a0922164970e033029c12058db9e8da261a..0c7580f5f648713b781ff6288ec0000809c15dbf 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.util.Constants.EMPTY_CLASS)); + 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 36d37e544e342e1bc584374580dbb5c883523204..11a4a8462723b82367afdfd5776286a0896375d1 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.util.Constants.EMPTY_CLASS)).setAlertOthers(ZombifiedPiglin.class)); + this.targetSelector.addGoal(2, new NearestAttackableTargetGoal<>(this, Player.class, true)); + // Purpur start + if ( 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 d3bcfa017967db0a20c18c65e27c2a0471d2214e..9da90fd6c828fe5fe3a153cd1fda93ce6e54e482 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.util.Constants.EMPTY_CLASS)).setAlertOthers()); // Paper - assign field + 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 117a376f99b1d26c5ffa64c8551ac1e666b15888..62edc084153bdf0c7e4d43a9ab2bb8069a8a60e9 100644 +--- a/src/main/java/net/minecraft/world/item/crafting/ShapedRecipe.java ++++ b/src/main/java/net/minecraft/world/item/crafting/ShapedRecipe.java +@@ -262,7 +262,7 @@ public class ShapedRecipe implements CraftingRecipe { + } + + if (pattern.length == l) { +- return new String[0]; ++ return org.plazmamc.plazma.util.Constants.EMPTY_STRING; + } 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 8da06f8bea0239c5206d5d4f4ff48bdeb0a89f9d..0f612bb7ed955ee966ec9f779a075bdc8d5fcbc8 100644 +--- a/src/main/java/net/minecraft/world/item/crafting/ShapelessRecipe.java ++++ b/src/main/java/net/minecraft/world/item/crafting/ShapelessRecipe.java +@@ -89,7 +89,7 @@ public class ShapelessRecipe implements CraftingRecipe { + 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(org.plazmamc.plazma.util.Constants.INGREDIENT)); + + inventory: for (int index = 0; index < inventory.getContainerSize(); index++) { + ItemStack itemStack = inventory.getItem(index); +diff --git a/src/main/java/net/minecraft/world/level/Level.java b/src/main/java/net/minecraft/world/level/Level.java +index cf0ad841267cac84ed058dee6cdd62a835325feb..24756bb1913eb1f00dc367dd9c9741a3805ef3b4 100644 +--- a/src/main/java/net/minecraft/world/level/Level.java ++++ b/src/main/java/net/minecraft/world/level/Level.java +@@ -1654,7 +1654,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable { + public org.bukkit.entity.Entity[] getChunkEntities(int chunkX, int chunkZ) { + io.papermc.paper.world.ChunkEntitySlices slices = ((ServerLevel)this).getEntityLookup().getChunk(chunkX, chunkZ); + if (slices == null) { +- return new org.bukkit.entity.Entity[0]; ++ return org.plazmamc.plazma.util.Constants.BUKKIT_ENTITY; + } + return slices.getChunkEntities(); + } +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 f085a669e2f2645e8c4f7a7e5a3c958f13809744..279531a360cc1408ad8dd1e668a1e9f05753d676 100644 +--- a/src/main/java/net/minecraft/world/level/block/ComposterBlock.java ++++ b/src/main/java/net/minecraft/world/level/block/ComposterBlock.java +@@ -441,7 +441,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.util.Constants.ZERO_INT : org.plazmamc.plazma.util.Constants.EMPTY_INT; + } + + @Override +@@ -490,7 +490,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.util.Constants.ZERO_INT : org.plazmamc.plazma.util.Constants.EMPTY_INT; + } + + @Override +@@ -532,7 +532,7 @@ public class ComposterBlock extends Block implements WorldlyContainerHolder { + + @Override + public int[] getSlotsForFace(Direction side) { +- return new int[0]; ++ return org.plazmamc.plazma.util.Constants.EMPTY_INT; + } + + @Override +diff --git a/src/main/java/net/minecraft/world/level/block/entity/AbstractFurnaceBlockEntity.java b/src/main/java/net/minecraft/world/level/block/entity/AbstractFurnaceBlockEntity.java +index 5cd7b4e7065070bf9fcc34b621dba2ccba99a573..082129fc5febd78063f1b6de5f13671b429d5865 100644 +--- a/src/main/java/net/minecraft/world/level/block/entity/AbstractFurnaceBlockEntity.java ++++ b/src/main/java/net/minecraft/world/level/block/entity/AbstractFurnaceBlockEntity.java +@@ -66,7 +66,7 @@ public abstract class AbstractFurnaceBlockEntity extends BaseContainerBlockEntit + protected static final int SLOT_FUEL = 1; + protected static final int SLOT_RESULT = 2; + public static final int DATA_LIT_TIME = 0; +- private static final int[] SLOTS_FOR_UP = new int[]{0}; ++ private static final int[] SLOTS_FOR_UP = org.plazmamc.plazma.util.Constants.ZERO_INT; + private static final int[] SLOTS_FOR_DOWN = new int[]{2, 1}; + private static final int[] SLOTS_FOR_SIDES = new int[]{1}; + public static final int DATA_LIT_DURATION = 1; +diff --git a/src/main/java/net/minecraft/world/level/chunk/ChunkStatus.java b/src/main/java/net/minecraft/world/level/chunk/ChunkStatus.java +index 71df7c590e31932f2b8fc26a2afaaa54f52674ac..071847225a94697a26eacb34f22aac0dca436af9 100644 +--- a/src/main/java/net/minecraft/world/level/chunk/ChunkStatus.java ++++ b/src/main/java/net/minecraft/world/level/chunk/ChunkStatus.java +@@ -195,7 +195,7 @@ public class ChunkStatus { + }, (chunkstatus, worldserver, structuretemplatemanager, lightenginethreaded, function, ichunkaccess) -> { + return (CompletableFuture) function.apply(ichunkaccess); + }); +- private static final List STATUS_BY_RANGE = ImmutableList.of(ChunkStatus.FULL, ChunkStatus.FEATURES, ChunkStatus.LIQUID_CARVERS, ChunkStatus.BIOMES, ChunkStatus.STRUCTURE_STARTS, ChunkStatus.STRUCTURE_STARTS, ChunkStatus.STRUCTURE_STARTS, ChunkStatus.STRUCTURE_STARTS, ChunkStatus.STRUCTURE_STARTS, ChunkStatus.STRUCTURE_STARTS, ChunkStatus.STRUCTURE_STARTS, ChunkStatus.STRUCTURE_STARTS, new ChunkStatus[0]); ++ private static final List STATUS_BY_RANGE = ImmutableList.of(ChunkStatus.FULL, ChunkStatus.FEATURES, ChunkStatus.LIQUID_CARVERS, ChunkStatus.BIOMES, ChunkStatus.STRUCTURE_STARTS, ChunkStatus.STRUCTURE_STARTS, ChunkStatus.STRUCTURE_STARTS, ChunkStatus.STRUCTURE_STARTS, ChunkStatus.STRUCTURE_STARTS, ChunkStatus.STRUCTURE_STARTS, ChunkStatus.STRUCTURE_STARTS, ChunkStatus.STRUCTURE_STARTS, org.plazmamc.plazma.util.Constants.CHUNK_STATUS); + private static final IntList RANGE_BY_STATUS = (IntList) Util.make(new IntArrayList(ChunkStatus.getStatusList().size()), (intarraylist) -> { + int i = 0; + +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 dcfe090c269d4cbcc2eb1b6f85392848bb34656c..d1b3863df59115899494b9d662ba6beba2f15353 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.util.Constants.LINK_OPTION)) { + 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.util.Constants.LINK_OPTION)) { + 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.util.Constants.LINK_OPTION)) { + return false; + } + } else { +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..c5597c9b902857ed83b54fd74fcd9463749e3dbc 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,8 @@ 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]; ++ private Node[] openSet = org.plazmamc.plazma.util.Constants.EMPTY_NODE; ++ private Node[] closedSet = org.plazmamc.plazma.util.Constants.EMPTY_NODE; + @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 f212a78d9d32e9b59f16f03e07d2dd4789ad8080..cd894e9ba08efed114efd76126a888cf3c4f9327 100644 +--- a/src/main/java/net/minecraft/world/level/storage/LevelStorageSource.java ++++ b/src/main/java/net/minecraft/world/level/storage/LevelStorageSource.java +@@ -125,14 +125,14 @@ 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.util.Constants.LINK_OPTION)) { + throw new LevelStorageException(Component.translatable("selectWorld.load_folder_access")); + } else { + try { + List list = Files.list(this.baseDir).filter((path) -> { +- return Files.isDirectory(path, new LinkOption[0]); ++ return Files.isDirectory(path, org.plazmamc.plazma.util.Constants.LINK_OPTION); + }).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.util.Constants.LINK_OPTION) || Files.isRegularFile(convertable_b.oldDataFile(), org.plazmamc.plazma.util.Constants.LINK_OPTION); + }).toList(); + + return new LevelStorageSource.LevelCandidates(list); +@@ -187,12 +187,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.util.Constants.LINK_OPTION)) { + return null; + } else { + Path path = levelSave.dataFile(); + +- if (Files.exists(path, new LinkOption[0])) { ++ if (Files.exists(path, org.plazmamc.plazma.util.Constants.LINK_OPTION)) { + T t0 = levelDataParser.apply(path, this.fixerUpper); + + if (t0 != null) { +@@ -201,7 +201,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.util.Constants.LINK_OPTION) ? levelDataParser.apply(path, this.fixerUpper) : null; + } + } + +@@ -322,7 +322,7 @@ public class LevelStorageSource { + } + + public boolean levelExists(String name) { +- return Files.isDirectory(this.baseDir.resolve(name), new LinkOption[0]); ++ return Files.isDirectory(this.baseDir.resolve(name), org.plazmamc.plazma.util.Constants.LINK_OPTION); + } + + public Path getBaseDir() { +@@ -546,7 +546,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.util.Constants.LINK_OPTION)) { + 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..e9db2ee5819f6b81973472ea74bc0708612e30be 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.util.Constants.EMPTY_STRING; + } + + for (int i = 0; i < astring.length; ++i) { +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 3bc13092873609af9c6f412190dd989d39f1df23..10654d926a60510e7449903e3ab864bc1e289b4c 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 +@@ -42,7 +42,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, new LootPool[0], new LootItemFunction[0]); ++ public static final LootTable EMPTY = new LootTable(LootContextParamSets.EMPTY, org.plazmamc.plazma.util.Constants.LOOT_POOL, org.plazmamc.plazma.util.Constants.LOOT_ITEM_FUNCTION); + public static final LootContextParamSet DEFAULT_PARAM_SET = LootContextParamSets.ALL_PARAMS; + final LootContextParamSet paramSet; + final LootPool[] pools; +@@ -257,7 +257,7 @@ public class LootTable { + } + + public LootTable build() { +- return new LootTable(this.paramSet, (LootPool[]) this.pools.toArray(new LootPool[0]), (LootItemFunction[]) this.functions.toArray(new LootItemFunction[0])); ++ return new LootTable(this.paramSet, (LootPool[]) this.pools.toArray(org.plazmamc.plazma.util.Constants.LOOT_POOL), (LootItemFunction[]) this.functions.toArray(org.plazmamc.plazma.util.Constants.LOOT_ITEM_FUNCTION)); + } + } + +@@ -267,7 +267,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.util.Constants.LOOT_POOL, jsondeserializationcontext, LootPool[].class); + LootContextParamSet lootcontextparameterset = null; + + if (jsonobject.has("type")) { +@@ -276,7 +276,7 @@ public class LootTable { + lootcontextparameterset = LootContextParamSets.get(new ResourceLocation(s)); + } + +- LootItemFunction[] alootitemfunction = (LootItemFunction[]) GsonHelper.getAsObject(jsonobject, "functions", new LootItemFunction[0], jsondeserializationcontext, LootItemFunction[].class); ++ LootItemFunction[] alootitemfunction = (LootItemFunction[]) GsonHelper.getAsObject(jsonobject, "functions", org.plazmamc.plazma.util.Constants.LOOT_ITEM_FUNCTION, jsondeserializationcontext, LootItemFunction[].class); + + return new LootTable(lootcontextparameterset != null ? lootcontextparameterset : LootContextParamSets.ALL_PARAMS, alootselector, alootitemfunction); + } +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..ebb598eab6ae185b7a4e126cc59637b0cf878fee 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.util.Constants.LOOT_ITEM_FUNCTION); + } + + 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.util.Constants.LOOT_ITEM_FUNCTION, jsonDeserializationContext, LootItemFunction[].class); + return this.deserialize(jsonObject, jsonDeserializationContext, i, j, lootItemConditions, lootItemFunctions); + } + +diff --git a/src/main/java/org/bukkit/craftbukkit/bootstrap/Main.java b/src/main/java/org/bukkit/craftbukkit/bootstrap/Main.java +index 9a2ec50be757dfa3780a49ec96942fed89ed530c..d5b904a36d7c0a9d0f8787eccc770fd47a03430f 100644 +--- a/src/main/java/org/bukkit/craftbukkit/bootstrap/Main.java ++++ b/src/main/java/org/bukkit/craftbukkit/bootstrap/Main.java +@@ -50,7 +50,7 @@ public class Main { + System.exit(0); + } + +- URLClassLoader classLoader = new URLClassLoader(extractedUrls.toArray(new URL[0])); ++ URLClassLoader classLoader = new URLClassLoader(extractedUrls.toArray(org.plazmamc.plazma.util.Constants.URL)); + + System.out.println("Starting server"); + Thread runThread = new Thread(() -> { +diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +index f4a341f72d727bbffa4cfcf72eda8ed0c8945c9e..ca5b436821c9d5e070ab271fc91a29cf53834a89 100644 +--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java ++++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +@@ -471,7 +471,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.util.Constants.BASE_COMPONENT : title.getSubtitle()); + 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 a5d7fae348b0b262a0a8a5e8e76f1bc75ca52a16..8b9b267e226ab1645fd8c57e1f8196276008345e 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.util.Constants.BASE_COMPONENT : text; + 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.util.Constants.BASE_COMPONENT; + } + + CraftMetaBook.this.internalAddPage(this.componentsToPage(page)); +diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaItem.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaItem.java +index 936f8babf74b2be6240e5dbc2d0a84f8badada2e..ab9f71a45a4f2a9781ad1a12f8dda4ac9179c72f 100644 +--- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaItem.java ++++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaItem.java +@@ -880,7 +880,7 @@ class CraftMetaItem implements ItemMeta, Damageable, Repairable, BlockDataMeta { + // Paper start + @Override + public net.md_5.bungee.api.chat.BaseComponent[] getDisplayNameComponent() { +- return displayName == null ? new net.md_5.bungee.api.chat.BaseComponent[0] : net.md_5.bungee.chat.ComponentSerializer.parse(displayName); ++ return displayName == null ? org.plazmamc.plazma.util.Constants.BASE_COMPONENT : net.md_5.bungee.chat.ComponentSerializer.parse(displayName); + } + // Paper end + @Override +diff --git a/src/main/java/org/bukkit/craftbukkit/util/WeakCollection.java b/src/main/java/org/bukkit/craftbukkit/util/WeakCollection.java +index 049d750d3af991dd14ac8cf644330404e74b2151..c2d41e133bbbaf1b445388829769e898b0ae67da 100644 +--- a/src/main/java/org/bukkit/craftbukkit/util/WeakCollection.java ++++ b/src/main/java/org/bukkit/craftbukkit/util/WeakCollection.java +@@ -166,7 +166,7 @@ public final class WeakCollection implements Collection { + + @Override + public Object[] toArray() { +- return this.toArray(new Object[0]); ++ return this.toArray(org.plazmamc.plazma.util.Constants.EMPTY_OBJECT); + } + + @Override +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..d4f5a0e49eebd2e02790a10a87166836ee6c3c09 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.util.Constants.EMPTY_STRING); + return true; + } + } +diff --git a/src/main/java/org/plazmamc/plazma/util/Constants.java b/src/main/java/org/plazmamc/plazma/util/Constants.java +new file mode 100644 +index 0000000000000000000000000000000000000000..be3d3a62b966b1d09ca417c4339757fb8c2bb710 +--- /dev/null ++++ b/src/main/java/org/plazmamc/plazma/util/Constants.java +@@ -0,0 +1,40 @@ ++package org.plazmamc.plazma.util; ++ ++public final class Constants { ++ ++ public static final Object[] EMPTY_OBJECT = new Object[0]; ++ public static final byte[] EMPTY_BYTE = new byte[0]; ++ public static final int[] EMPTY_INT = new int[0]; ++ public static final int[] ZERO_INT = new int[]{0}; ++ public static final long[] EMPTY_LONG = new long[0]; ++ public static final String[] EMPTY_STRING = new String[0]; ++ public static final StackTraceElement[] STACK_TRACE_ELEMENT = new StackTraceElement[0]; ++ public static final Class[] EMPTY_CLASS = new Class[0]; ++ ++ public static final java.util.concurrent.CompletableFuture[] COMPLETABLE_FUTURE = new java.util.concurrent.CompletableFuture[0]; ++ public static final java.nio.file.LinkOption[] LINK_OPTION = new java.nio.file.LinkOption[0]; ++ public static final java.net.URL[] URL = new java.net.URL[0]; ++ ++ public static final com.mojang.authlib.GameProfile[] GAME_PROFILE = new com.mojang.authlib.GameProfile[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.chunk.LevelChunk[] LEVEL_CHUNK = new net.minecraft.world.level.chunk.LevelChunk[0]; ++ public static final net.minecraft.resources.ResourceLocation[] RESOURCE_LOCATION = new net.minecraft.resources.ResourceLocation[0]; ++ public static final net.minecraft.server.network.ServerPlayerConnection[] SERVER_PLAYER_CONNECTION = new net.minecraft.server.network.ServerPlayerConnection[0]; ++ public static final net.minecraft.world.entity.ai.memory.MemoryModuleType[] MEMORY_MODULE_TYPE = new net.minecraft.world.entity.ai.memory.MemoryModuleType[0]; ++ public static final net.minecraft.world.item.crafting.Ingredient[] INGREDIENT = new net.minecraft.world.item.crafting.Ingredient[0]; ++ public static final net.minecraft.world.level.chunk.ChunkStatus[] CHUNK_STATUS = new net.minecraft.world.level.chunk.ChunkStatus[0]; ++ public static final net.minecraft.world.level.pathfinder.Node[] EMPTY_NODE = new net.minecraft.world.level.pathfinder.Node[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.functions.LootItemFunction[] LOOT_ITEM_FUNCTION = new net.minecraft.world.level.storage.loot.functions.LootItemFunction[0]; ++ ++ public static final net.md_5.bungee.api.chat.BaseComponent[] BASE_COMPONENT = new net.md_5.bungee.api.chat.BaseComponent[0]; ++ ++ public static final io.papermc.paper.chunk.system.scheduling.ChunkTaskScheduler.ChunkInfo[] CHUNK_INFO = new io.papermc.paper.chunk.system.scheduling.ChunkTaskScheduler.ChunkInfo[0]; ++ ++ public static final ca.spottedleaf.starlight.common.light.StarLightEngine.AxisDirection[] STARLIGHT_AXIS_DIRECTION = new ca.spottedleaf.starlight.common.light.StarLightEngine.AxisDirection[0]; ++ ++ public static final org.bukkit.entity.Entity[] BUKKIT_ENTITY = new org.bukkit.entity.Entity[0]; ++ ++} +\ No newline at end of file +diff --git a/src/main/java/org/purpurmc/purpur/command/PurpurCommand.java b/src/main/java/org/purpurmc/purpur/command/PurpurCommand.java +index 2621e54879e9ab0029a875f1d09eee67878b90d5..6fdb80b1b3cbc0b4f8e50ccbf5f5104496860100 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.util.Constants.EMPTY_STRING); + } + } + diff --git a/patches/todo/0041-Reduce-allocations2.patch b/patches/todo/0041-Reduce-allocations2.patch new file mode 100644 index 0000000..2f2fbdc --- /dev/null +++ b/patches/todo/0041-Reduce-allocations2.patch @@ -0,0 +1,196 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: IPECTER +Date: Tue, 30 May 2023 11:57:07 +0900 +Subject: [PATCH] Reduce-allocations2 + + +diff --git a/src/main/java/net/minecraft/advancements/AdvancementRewards.java b/src/main/java/net/minecraft/advancements/AdvancementRewards.java +index 9e20a870a9c9c295b32cfa591eb52625125a5439..30473930bf3acf0ae74f3ff5e500f6e1374c11da 100644 +--- a/src/main/java/net/minecraft/advancements/AdvancementRewards.java ++++ b/src/main/java/net/minecraft/advancements/AdvancementRewards.java +@@ -24,7 +24,7 @@ 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); ++ public static final AdvancementRewards EMPTY = new AdvancementRewards(0, org.plazmamc.plazma.util.Constants.RESOURCE_LOCATION, org.plazmamc.plazma.util.Constants.RESOURCE_LOCATION, CommandFunction.CacheableFunction.NONE); + private final int experience; + private final ResourceLocation[] loot; + private final ResourceLocation[] recipes; +@@ -187,7 +187,7 @@ public class AdvancementRewards { + } + + public AdvancementRewards build() { +- return new AdvancementRewards(this.experience, this.loot.toArray(new ResourceLocation[0]), this.recipes.toArray(new ResourceLocation[0]), this.function == null ? CommandFunction.CacheableFunction.NONE : new CommandFunction.CacheableFunction(this.function)); ++ return new AdvancementRewards(this.experience, this.loot.toArray(org.plazmamc.plazma.util.Constants.RESOURCE_LOCATION), this.recipes.toArray(org.plazmamc.plazma.util.Constants.RESOURCE_LOCATION), this.function == null ? CommandFunction.CacheableFunction.NONE : new CommandFunction.CacheableFunction(this.function)); + } + } + } +diff --git a/src/main/java/net/minecraft/advancements/RequirementsStrategy.java b/src/main/java/net/minecraft/advancements/RequirementsStrategy.java +index 051c1fb81d79c40be683edb86579bb975643bcb3..469c34c773e3257d0edfc807cb882b4cbfc3c53f 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.util.Constants.EMPTY_STRING)}; + }; + + String[][] createRequirements(Collection criteriaNames); +diff --git a/src/main/java/net/minecraft/nbt/ListTag.java b/src/main/java/net/minecraft/nbt/ListTag.java +index 749d3e67a877d7d1ed47b5fef511a604ee6589b6..0529814353ba82d6083a88531f06e73377ab5aaf 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.util.Constants.EMPTY_INT; + } + + public long[] getLongArray(int index) { +@@ -241,7 +241,7 @@ public class ListTag extends CollectionTag { + } + } + +- return new long[0]; ++ return org.plazmamc.plazma.util.Constants.EMPTY_LONG; + } + + 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..122d4b9391ddaae2631db213230f57a829d1c943 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.util.Constants.EMPTY_LONG; + } + + @Override +diff --git a/src/main/java/net/minecraft/network/CipherBase.java b/src/main/java/net/minecraft/network/CipherBase.java +index a2920b8a9eff77d9c5d1d7f70ad3abdacba8f0fa..c1c97cc8fa5e0d8349655f90392382a0a878c95f 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.util.Constants.EMPTY_BYTE; ++ private byte[] heapOut = org.plazmamc.plazma.util.Constants.EMPTY_BYTE; + + protected CipherBase(Cipher cipher) { + this.cipher = cipher; +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..c732299c908622e3b6262cd942a7397b3f34b8e9 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.util.Constants.EMPTY_OBJECT; + 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/server/RunningOnDifferentThreadException.java b/src/main/java/net/minecraft/server/RunningOnDifferentThreadException.java +index 0f52e8a61ca7e57e9f52473dceb9cc3464c0c86d..857c3609b3cd965e1c10caa8fc5682baae999820 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.util.Constants.STACK_TRACE_ELEMENT); + } + + @Override + public synchronized Throwable fillInStackTrace() { +- this.setStackTrace(new StackTraceElement[0]); ++ this.setStackTrace(org.plazmamc.plazma.util.Constants.STACK_TRACE_ELEMENT); + return this; + } + } +diff --git a/src/main/java/net/minecraft/server/ServerFunctionLibrary.java b/src/main/java/net/minecraft/server/ServerFunctionLibrary.java +index 975422a57b83a31e63a600bb4ff9c4e2baaf6da7..64d8935c18f3e92ec35b3b160443700e350a72fa 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.util.Constants.COMPLETABLE_FUTURE); + return CompletableFuture.allOf(completableFutures).handle((unused, ex) -> { + return map; + }); +diff --git a/src/main/java/net/minecraft/util/MemoryReserve.java b/src/main/java/net/minecraft/util/MemoryReserve.java +index 0ee04fe6ff6a4d09754f326526ae04fe7226bab2..0efc5682210e6cd3e0ee03a5e4340614869a8575 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.util.Constants.EMPTY_BYTE; + } + } +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..bd88f27db229d1e34b69bcd9e975bec502d8226b 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.util.Constants.BLOCK_STATE); + } + + @Override +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..92fe0ca7c16134701f72ea263d9aa933185978d3 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(new LootPoolEntryContainer[0]), this.conditions.toArray(new LootItemCondition[0]), this.functions.toArray(org.plazmamc.plazma.util.Constants.LOOT_ITEM_FUNCTION), this.rolls, this.bonusRolls); + } + } + } +@@ -171,7 +171,7 @@ public class LootPool { + 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); ++ LootItemFunction[] lootItemFunctions = GsonHelper.getAsObject(jsonObject, "functions", org.plazmamc.plazma.util.Constants.LOOT_ITEM_FUNCTION, jsonDeserializationContext, LootItemFunction[].class); + 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/scores/Team.java b/src/main/java/net/minecraft/world/scores/Team.java +index 16d2aa4556bc9f32a2def7f9ca282aa3fa23fb87..c9b266246a83e3d7f5ce61306f291ceff902079d 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.util.Constants.EMPTY_STRING); + } + + @Nullable diff --git a/patches/todo/0042-213.patch b/patches/todo/0042-213.patch new file mode 100644 index 0000000..4f1411e --- /dev/null +++ b/patches/todo/0042-213.patch @@ -0,0 +1,19 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: IPECTER +Date: Tue, 30 May 2023 12:17:59 +0900 +Subject: [PATCH] 213 + + +diff --git a/src/main/java/net/minecraft/util/datafix/fixes/LeavesFix.java b/src/main/java/net/minecraft/util/datafix/fixes/LeavesFix.java +index 89d70a992e0bcc8e7292c4f736470eafd8747b24..a3f071101fbd10272373f99ebd2c76c0805d0d25 100644 +--- a/src/main/java/net/minecraft/util/datafix/fixes/LeavesFix.java ++++ b/src/main/java/net/minecraft/util/datafix/fixes/LeavesFix.java +@@ -70,7 +70,7 @@ public class LeavesFix extends DataFix { + OpticFinder opticFinder3 = DSL.typeFinder(type3); + return this.fixTypeEverywhereTyped("Leaves fix", type, (typed) -> { + return typed.updateTyped(opticFinder, (typedx) -> { +- int[] is = new int[]{0}; ++ int[] is = org.plazmamc.plazma.util.Constants.ZERO_INT; + Typed typed2 = typedx.updateTyped(opticFinder2, (typed2x) -> { + Int2ObjectMap int2ObjectMap = new Int2ObjectOpenHashMap<>(typed2x.getAllTyped(opticFinder3).stream().map((typedx2) -> { + return new LeavesFix.LeavesSection(typedx2, this.getInputSchema());