From 3b9d8feb039cd0184eabe277344906dcb9bf985c Mon Sep 17 00:00:00 2001 From: Dreeam <61569423+Dreeam-qwq@users.noreply.github.com> Date: Thu, 24 Jul 2025 20:18:23 +0800 Subject: [PATCH] Updated Upstream (Paper/Purpur/Leaves) Upstream has released updates that appear to apply and compile correctly Paper Changes: PaperMC/Paper@a5f2f614 Fix offhand item desync on cancelling interact events (#12828) PaperMC/Paper@10318775 [ci/skip] Update mache for codebook 1.0.15 (#12887) Purpur Changes: PurpurMC/Purpur@c4e5604c Updated Upstream (Paper) PurpurMC/Purpur@c130b18e Updated Upstream (Paper) PurpurMC/Purpur@60bdf1c7 Final Paper Upstream PurpurMC/Purpur@a39c4cb0 Updated Upstream (Paper) PurpurMC/Purpur@ea7b18ab Updated Upstream (Paper) PurpurMC/Purpur@0f82c210 Updated Upstream (Paper) PurpurMC/Purpur@8de15d66 this is important for the build to not fail.. PurpurMC/Purpur@5053eb0c use a different method for dropping lapis, closes #1692 Leaves Changes: LeavesMC/Leaves@df8397c7 Fix bot invulnerable LeavesMC/Leaves@e1c21d3f Movable Budding Amethyst bind carpet rule (#561) LeavesMC/Leaves@550dba49 Configurable item damage check and good shear behavior (#559) LeavesMC/Leaves@cb64df44 Old Throwable Projectile tick order (#520) LeavesMC/Leaves@b5793e80 Fix bot infinity desync (#584) LeavesMC/Leaves@c5ecbe85 1.21.7/8 (#587) LeavesMC/Leaves@5497dfb4 Fix CI LeavesMC/Leaves@2f8255bd Fix LitematicaEasyPlaceProtocol LeavesMC/Leaves@a416f476 Fix bot use actions (#606) (#605) LeavesMC/Leaves@bfde470a fix: revert Configurable-collision-behavior patch (#607) LeavesMC/Leaves@aaa2323d Fix Syncmatica file name --- gradle.properties | 2 +- .../features/0011-Purpur-API-Changes.patch | 2 +- .../features/0017-Leaves-Replay-Mod-API.patch | 4 +- .../{ => photographer}/Photographer.java | 2 +- .../PhotographerManager.java | 2 +- .../leaves/protocol}/ChatImageIndex.java | 2 + .../leaves/protocol/ChatImageProtocol.java | 2 + leaf-server/build.gradle.kts.patch | 2 +- .../0046-Reduce-array-allocations.patch | 10 +- ...0095-Purpur-Server-Minecraft-Changes.patch | 51 ++++------ .../features/0109-Leaves-Protocol-Core.patch | 94 ++++++++----------- .../0111-Leaves-Xaero-Map-Protocol.patch | 4 +- .../features/0113-Leaves-Replay-Mod-API.patch | 33 +++---- ...reating-stats-json-bases-on-player-n.patch | 6 +- .../0130-Improve-Purpur-AFK-system.patch | 12 +-- ...Configurable-chat-message-signatures.patch | 10 +- ...0140-Configurable-connection-message.patch | 10 +- ...t-place-player-if-the-server-is-full.patch | 6 +- .../features/0162-Fix-MC-119417.patch | 4 +- ...-SparklyPaper-Parallel-world-ticking.patch | 26 ++--- ...224-Remove-streams-on-PlayerDetector.patch | 4 +- ...et-on-player-join-to-avoid-chunk-loa.patch | 6 +- .../features/0237-Protocol-Core.patch | 12 +-- .../0242-Only-tick-items-at-hand.patch | 6 +- ...e-death-item-drop-knockback-settings.patch | 6 +- .../features/0251-Optimize-isEyeInFluid.patch | 6 +- .../features/0277-Op-lock.patch | 6 +- .../0009-Purpur-Server-Paper-Changes.patch | 2 +- .../features/0029-Leaves-Protocol-Core.patch | 2 +- .../features/0030-Leaves-Replay-Mod-API.patch | 18 ++-- .../{ => photographer}/CraftPhotographer.java | 2 +- .../CraftPhotographerManager.java | 2 +- .../leaves/protocol/AppleSkinProtocol.java | 19 ++-- .../protocol/chatimage/ChatImageProtocol.java | 72 ++++++++++++++ .../chatimage/DownloadFileChannelPayload.java | 18 ++++ .../chatimage/FileChannelPayload.java | 18 ++++ .../chatimage/FileInfoChannelPayload.java | 18 ++++ .../protocol/chatimage/ServerBlockCache.java | 65 +++++++++++++ .../leaves/protocol/core/Context.java | 9 ++ .../protocol/core/IdentifierSelector.java | 11 +++ .../protocol/core/LeavesProtocolManager.java | 33 ++----- .../leaves/protocol/core/ProtocolHandler.java | 23 +++++ .../leaves/protocol/core/ProtocolUtils.java | 33 ++++++- .../core/invoker/AbstractInvokerHolder.java | 4 +- .../invoker/BytebufReceiverInvokerHolder.java | 8 +- .../MinecraftRegisterInvokerHolder.java | 8 +- .../invoker/PayloadReceiverInvokerHolder.java | 8 +- .../leaves/protocol/jade/JadeProtocol.java | 2 +- .../protocol/jade/accessor/Accessor.java | 4 +- .../protocol/jade/accessor/AccessorImpl.java | 8 +- .../protocol/jade/accessor/BlockAccessor.java | 4 +- .../jade/accessor/BlockAccessorImpl.java | 6 +- .../jade/accessor/EntityAccessor.java | 4 +- .../jade/accessor/EntityAccessorImpl.java | 6 +- .../jade/payload/ServerHandshakePayload.java | 7 +- .../ItemStorageExtensionProvider.java | 7 +- .../block/MobSpawnerCooldownProvider.java | 2 +- .../protocol/jade/util/ItemCollector.java | 4 +- .../protocol/jade/util/ItemIterator.java | 10 +- .../protocol/syncmatica/ServerPlacement.java | 10 +- .../syncmatica/SyncmaticaProtocol.java | 10 +- .../leaves/replay/ServerPhotographer.java | 8 +- 62 files changed, 518 insertions(+), 277 deletions(-) rename leaf-api/src/main/java/org/leavesmc/leaves/entity/{ => photographer}/Photographer.java (91%) rename leaf-api/src/main/java/org/leavesmc/leaves/entity/{ => photographer}/PhotographerManager.java (94%) rename {leaf-server/src/main/java/org/leavesmc/leaves/protocol/chatimage => leaf-archived-patches/removed/1.21.8/src/leavesmc/leaves/protocol}/ChatImageIndex.java (79%) rename leaf-archived-patches/{unapplied/src/main/java/org => removed/1.21.8/src}/leavesmc/leaves/protocol/ChatImageProtocol.java (98%) rename leaf-server/src/main/java/org/leavesmc/leaves/entity/{ => photographer}/CraftPhotographer.java (97%) rename leaf-server/src/main/java/org/leavesmc/leaves/entity/{ => photographer}/CraftPhotographerManager.java (98%) create mode 100644 leaf-server/src/main/java/org/leavesmc/leaves/protocol/chatimage/ChatImageProtocol.java create mode 100644 leaf-server/src/main/java/org/leavesmc/leaves/protocol/chatimage/DownloadFileChannelPayload.java create mode 100644 leaf-server/src/main/java/org/leavesmc/leaves/protocol/chatimage/FileChannelPayload.java create mode 100644 leaf-server/src/main/java/org/leavesmc/leaves/protocol/chatimage/FileInfoChannelPayload.java create mode 100644 leaf-server/src/main/java/org/leavesmc/leaves/protocol/chatimage/ServerBlockCache.java create mode 100644 leaf-server/src/main/java/org/leavesmc/leaves/protocol/core/Context.java create mode 100644 leaf-server/src/main/java/org/leavesmc/leaves/protocol/core/IdentifierSelector.java diff --git a/gradle.properties b/gradle.properties index 8851d16d..deb36db8 100644 --- a/gradle.properties +++ b/gradle.properties @@ -2,7 +2,7 @@ group=cn.dreeam.leaf mcVersion=1.21.8 version=1.21.8-R0.1-SNAPSHOT -paperCommit=c8a8c0ef8910c809913a00e2d9bdffaec51ff1f4 +paperCommit=103187750e29fd982b84b2bab114fe5af98a82e5 org.gradle.configuration-cache=true org.gradle.caching=true diff --git a/leaf-api/paper-patches/features/0011-Purpur-API-Changes.patch b/leaf-api/paper-patches/features/0011-Purpur-API-Changes.patch index b516a742..e637e5ae 100644 --- a/leaf-api/paper-patches/features/0011-Purpur-API-Changes.patch +++ b/leaf-api/paper-patches/features/0011-Purpur-API-Changes.patch @@ -6,7 +6,7 @@ Subject: [PATCH] Purpur API Changes Original license: MIT Original project: https://github.com/PurpurMC/Purpur -Commit: 11c030a8f81b2f845a9f2749790692c2d152f284 +Commit: 5053eb0c5dc9662ffb39ae7c39c6ca08c013d898 Patches listed below are removed in this patch, They exists in Gale or Leaf: * "co/aikar/timings/TimedEventExecutor.java.patch" diff --git a/leaf-api/paper-patches/features/0017-Leaves-Replay-Mod-API.patch b/leaf-api/paper-patches/features/0017-Leaves-Replay-Mod-API.patch index aaeb9364..969ffc07 100644 --- a/leaf-api/paper-patches/features/0017-Leaves-Replay-Mod-API.patch +++ b/leaf-api/paper-patches/features/0017-Leaves-Replay-Mod-API.patch @@ -20,7 +20,7 @@ index f04f42832a098836bf41e98787c2db35d154c892..b7782de2fb8e636e82a6ef89a62edeec // Purpur end - Debug Marker API + + // Leaves start - Photographer API -+ public static @NotNull org.leavesmc.leaves.entity.PhotographerManager getPhotographerManager() { ++ public static @NotNull org.leavesmc.leaves.entity.photographer.PhotographerManager getPhotographerManager() { + return server.getPhotographerManager(); + } + // Leaves end - Photographer API @@ -35,6 +35,6 @@ index cc12db46d30c2499dea87f953ef6bf1fa18900c9..0d8463905bc15382c284fc31a1be6fbb // Purpur end - Debug Marker API + + // Leaves start - Photographer API -+ @NotNull org.leavesmc.leaves.entity.PhotographerManager getPhotographerManager(); ++ @NotNull org.leavesmc.leaves.entity.photographer.PhotographerManager getPhotographerManager(); + // Leaves end - Photographer API } diff --git a/leaf-api/src/main/java/org/leavesmc/leaves/entity/Photographer.java b/leaf-api/src/main/java/org/leavesmc/leaves/entity/photographer/Photographer.java similarity index 91% rename from leaf-api/src/main/java/org/leavesmc/leaves/entity/Photographer.java rename to leaf-api/src/main/java/org/leavesmc/leaves/entity/photographer/Photographer.java index 6cc611c7..0ca2a193 100644 --- a/leaf-api/src/main/java/org/leavesmc/leaves/entity/Photographer.java +++ b/leaf-api/src/main/java/org/leavesmc/leaves/entity/photographer/Photographer.java @@ -1,4 +1,4 @@ -package org.leavesmc.leaves.entity; +package org.leavesmc.leaves.entity.photographer; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; diff --git a/leaf-api/src/main/java/org/leavesmc/leaves/entity/PhotographerManager.java b/leaf-api/src/main/java/org/leavesmc/leaves/entity/photographer/PhotographerManager.java similarity index 94% rename from leaf-api/src/main/java/org/leavesmc/leaves/entity/PhotographerManager.java rename to leaf-api/src/main/java/org/leavesmc/leaves/entity/photographer/PhotographerManager.java index 4a2b67f1..144a089c 100644 --- a/leaf-api/src/main/java/org/leavesmc/leaves/entity/PhotographerManager.java +++ b/leaf-api/src/main/java/org/leavesmc/leaves/entity/photographer/PhotographerManager.java @@ -1,4 +1,4 @@ -package org.leavesmc.leaves.entity; +package org.leavesmc.leaves.entity.photographer; import org.bukkit.Location; import org.jetbrains.annotations.NotNull; diff --git a/leaf-server/src/main/java/org/leavesmc/leaves/protocol/chatimage/ChatImageIndex.java b/leaf-archived-patches/removed/1.21.8/src/leavesmc/leaves/protocol/ChatImageIndex.java similarity index 79% rename from leaf-server/src/main/java/org/leavesmc/leaves/protocol/chatimage/ChatImageIndex.java rename to leaf-archived-patches/removed/1.21.8/src/leavesmc/leaves/protocol/ChatImageIndex.java index e4b55c5b..6af9e26e 100644 --- a/leaf-server/src/main/java/org/leavesmc/leaves/protocol/chatimage/ChatImageIndex.java +++ b/leaf-archived-patches/removed/1.21.8/src/leavesmc/leaves/protocol/ChatImageIndex.java @@ -1,3 +1,5 @@ +// Removed since Leaf 1.21.5, replaced by Leaves's ChatImage protocol support since Leaf 1.21.8 + package org.leavesmc.leaves.protocol.chatimage; public class ChatImageIndex { diff --git a/leaf-archived-patches/unapplied/src/main/java/org/leavesmc/leaves/protocol/ChatImageProtocol.java b/leaf-archived-patches/removed/1.21.8/src/leavesmc/leaves/protocol/ChatImageProtocol.java similarity index 98% rename from leaf-archived-patches/unapplied/src/main/java/org/leavesmc/leaves/protocol/ChatImageProtocol.java rename to leaf-archived-patches/removed/1.21.8/src/leavesmc/leaves/protocol/ChatImageProtocol.java index 0bb760bd..ac42d3b7 100644 --- a/leaf-archived-patches/unapplied/src/main/java/org/leavesmc/leaves/protocol/ChatImageProtocol.java +++ b/leaf-archived-patches/removed/1.21.8/src/leavesmc/leaves/protocol/ChatImageProtocol.java @@ -1,3 +1,5 @@ +// Removed since Leaf 1.21.5, replaced by Leaves's ChatImage protocol support since Leaf 1.21.8 + package org.leavesmc.leaves.protocol; import com.google.common.collect.Lists; diff --git a/leaf-server/build.gradle.kts.patch b/leaf-server/build.gradle.kts.patch index 877e5c39..62d12921 100644 --- a/leaf-server/build.gradle.kts.patch +++ b/leaf-server/build.gradle.kts.patch @@ -7,7 +7,7 @@ +val leafMavenPublicUrl = "https://maven.leafmc.one/snapshots/" // Leaf - project setup - Add publish repo dependencies { - mache("io.papermc:mache:1.21.8+build.1") + mache("io.papermc:mache:1.21.8+build.2") - paperclip("io.papermc:paperclip:3.0.3") + paperclip("cn.dreeam:quantumleaper:1.0.0-SNAPSHOT") // Leaf - project setup - Use own paperclip fork testRuntimeOnly("org.junit.platform:junit-platform-launcher") diff --git a/leaf-server/minecraft-patches/features/0046-Reduce-array-allocations.patch b/leaf-server/minecraft-patches/features/0046-Reduce-array-allocations.patch index 4f0bf100..dd2be552 100644 --- a/leaf-server/minecraft-patches/features/0046-Reduce-array-allocations.patch +++ b/leaf-server/minecraft-patches/features/0046-Reduce-array-allocations.patch @@ -152,7 +152,7 @@ index a9c2f419200483673f6743ed94af110a8e875e71..617eb1b9d30d499124576c5d7cb51525 return ret; } diff --git a/net/minecraft/server/level/ServerPlayer.java b/net/minecraft/server/level/ServerPlayer.java -index bb1d7467b3fe01762c8ef28f1f9f6563e18a6195..af726d261f8d27ba95daa2657abd26a7461903ac 100644 +index a92be63160f35c67a4e9513c6b5445d84c80c27c..80b41d65e350a7ac4feb5d861c6c911096648b49 100644 --- a/net/minecraft/server/level/ServerPlayer.java +++ b/net/minecraft/server/level/ServerPlayer.java @@ -1100,7 +1100,7 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc @@ -165,10 +165,10 @@ index bb1d7467b3fe01762c8ef28f1f9f6563e18a6195..af726d261f8d27ba95daa2657abd26a7 this.getInventory().equipment.set(value, net.minecraft.world.item.ItemStack.EMPTY); } diff --git a/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/net/minecraft/server/network/ServerGamePacketListenerImpl.java -index 83ab47fead8c07c70a96d5794baa04cd1444fb8f..3f1f68ed20ec6c944f031afc74052e63594e84e6 100644 +index 5cd1b9d87f395872e1f51169130bfe2a7143c1a6..bcf5f7845d4b2ba6aa91c02dc4b99d357a9caec6 100644 --- a/net/minecraft/server/network/ServerGamePacketListenerImpl.java +++ b/net/minecraft/server/network/ServerGamePacketListenerImpl.java -@@ -2794,7 +2794,7 @@ public class ServerGamePacketListenerImpl +@@ -2795,7 +2795,7 @@ public class ServerGamePacketListenerImpl // SPIGOT-7136 - Allays if (target instanceof net.minecraft.world.entity.animal.allay.Allay || target instanceof net.minecraft.world.entity.animal.horse.AbstractHorse) { // Paper - Fix horse armor desync ServerGamePacketListenerImpl.this.send(new net.minecraft.network.protocol.game.ClientboundSetEquipmentPacket( @@ -217,7 +217,7 @@ index 3eea236bd1fd401fefdf7c5cc553a3db335029c7..3739272cbc73b7c4f15a2fbe874905cf if (!itemBySlot.isEmpty()) { newMob.setItemSlot(equipmentSlot, itemBySlot.copyAndClear()); diff --git a/net/minecraft/world/entity/Entity.java b/net/minecraft/world/entity/Entity.java -index 397bf42ef1d83cc242ca8228cd28e5f862da72d7..584403a056350b05da0108ea668a1583db2ee943 100644 +index c941e144667f04e8710da9dacc3f5e02731303bd..977198e485053847b051b9e9ae60c6d8be6600cc 100644 --- a/net/minecraft/world/entity/Entity.java +++ b/net/minecraft/world/entity/Entity.java @@ -3076,7 +3076,7 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess @@ -310,7 +310,7 @@ index bfda76974ea8d4397e2c2ebf5bdcb5d7e5f0bab5..cabbc93409ca99180d115e2f23419ee1 String[] strings = new String[pattern.size() - i3 - i2]; diff --git a/net/minecraft/world/level/Level.java b/net/minecraft/world/level/Level.java -index b62ee276e2176da439ac2f4da4501861da746004..97d227249405c8648b8b5e9bcca5a3f202f7b903 100644 +index a0254e85fccebb66ce02bd58f9d461addd8ad73d..1f7b3db02e59c4cbc93bc0e4e42bd20e0031c4bd 100644 --- a/net/minecraft/world/level/Level.java +++ b/net/minecraft/world/level/Level.java @@ -1825,7 +1825,7 @@ public abstract class Level implements LevelAccessor, UUIDLookup, AutoCl diff --git a/leaf-server/minecraft-patches/features/0095-Purpur-Server-Minecraft-Changes.patch b/leaf-server/minecraft-patches/features/0095-Purpur-Server-Minecraft-Changes.patch index 46173c2e..6c37dc31 100644 --- a/leaf-server/minecraft-patches/features/0095-Purpur-Server-Minecraft-Changes.patch +++ b/leaf-server/minecraft-patches/features/0095-Purpur-Server-Minecraft-Changes.patch @@ -6,7 +6,7 @@ Subject: [PATCH] Purpur Server Minecraft Changes Original license: MIT Original project: https://github.com/PurpurMC/Purpur -Commit: 11c030a8f81b2f845a9f2749790692c2d152f284 +Commit: 5053eb0c5dc9662ffb39ae7c39c6ca08c013d898 Patches listed below are removed in this patch, They exists in Gale or Leaf: * "net/minecraft/CrashReport.java.patch" @@ -1313,7 +1313,7 @@ index de630a692291926c52a0947f9943e59433ab130a..ca9ba2a2535eab66622230778efdf941 this.playerBrand = new net.minecraft.network.FriendlyByteBuf(io.netty.buffer.Unpooled.wrappedBuffer(data)).readUtf(256); } diff --git a/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/net/minecraft/server/network/ServerGamePacketListenerImpl.java -index 04d6647ca0d9c69054bc2f1fdacc80497e0a7804..51e2aad2034c289e7f6838cb7ac6686593072903 100644 +index bcf5f7845d4b2ba6aa91c02dc4b99d357a9caec6..98ee4250e6b893861c8312e22ec9427d0af6998b 100644 --- a/net/minecraft/server/network/ServerGamePacketListenerImpl.java +++ b/net/minecraft/server/network/ServerGamePacketListenerImpl.java @@ -338,6 +338,20 @@ public class ServerGamePacketListenerImpl @@ -1538,16 +1538,16 @@ index 04d6647ca0d9c69054bc2f1fdacc80497e0a7804..51e2aad2034c289e7f6838cb7ac66865 packet.dispatch( new ServerboundInteractPacket.Handler() { private void performInteraction(InteractionHand hand, ServerGamePacketListenerImpl.EntityInteraction entityInteraction, PlayerInteractEntityEvent event) { // CraftBukkit -@@ -2777,6 +2859,8 @@ public class ServerGamePacketListenerImpl - +@@ -2778,6 +2860,8 @@ public class ServerGamePacketListenerImpl ServerGamePacketListenerImpl.this.cserver.getPluginManager().callEvent(event); + final boolean resendData = event.isCancelled() || !ServerGamePacketListenerImpl.this.player.getItemInHand(hand).is(itemType); + player.processClick(hand); // Purpur - Ridables + // Entity in bucket - SPIGOT-4048 and SPIGOT-6859 - if ((target instanceof net.minecraft.world.entity.animal.Bucketable && target instanceof LivingEntity && origItem != null && origItem == Items.WATER_BUCKET) && (event.isCancelled() || ServerGamePacketListenerImpl.this.player.getInventory().getSelectedItem().isEmpty() || !ServerGamePacketListenerImpl.this.player.getInventory().getSelectedItem().is(origItem))) { + if (itemType == Items.WATER_BUCKET && target instanceof net.minecraft.world.entity.animal.Bucketable && target instanceof LivingEntity && resendData) { target.resendPossiblyDesyncedEntityData(ServerGamePacketListenerImpl.this.player); // Paper - The entire mob gets deleted, so resend it -@@ -3495,7 +3579,7 @@ public class ServerGamePacketListenerImpl +@@ -3496,7 +3580,7 @@ public class ServerGamePacketListenerImpl @Override public void handleChangeGameMode(ServerboundChangeGameModePacket packet) { PacketUtils.ensureRunningOnSameThread(packet, this, this.player.level()); @@ -1923,7 +1923,7 @@ index 1fc9e1ad541c46124183a401b2a7d99aea69cecf..881271f0bc77a8a8a7d31daad9a8188b } diff --git a/net/minecraft/world/entity/Entity.java b/net/minecraft/world/entity/Entity.java -index 9ee1ce59ee5612a0793ad76c4635af63c315657a..5b6c8d4caac3fca20e5994e24267f04cb59c27dd 100644 +index a8fd1554acbe14ac74cba718ceddc9f65057bcc7..53a0d464c1eb68ee2eff7f93c5c745ee4667093a 100644 --- a/net/minecraft/world/entity/Entity.java +++ b/net/minecraft/world/entity/Entity.java @@ -146,6 +146,7 @@ import org.jetbrains.annotations.Contract; @@ -14651,7 +14651,7 @@ index 966ca1e0e828e4176e12cbcf8c4a6b16489708de..e4ac7ee4e39b609aa70d6d4b766962a4 return this.getRule(key).get(); } diff --git a/net/minecraft/world/level/Level.java b/net/minecraft/world/level/Level.java -index 97d227249405c8648b8b5e9bcca5a3f202f7b903..dd8c7afecd62edc2ab3933034bf469aea729be53 100644 +index 1f7b3db02e59c4cbc93bc0e4e42bd20e0031c4bd..bee67a32c63df0901b9a9b6b3f6e7a35bb87025e 100644 --- a/net/minecraft/world/level/Level.java +++ b/net/minecraft/world/level/Level.java @@ -164,12 +164,56 @@ public abstract class Level implements LevelAccessor, UUIDLookup, AutoCl @@ -14736,7 +14736,7 @@ index 97d227249405c8648b8b5e9bcca5a3f202f7b903..dd8c7afecd62edc2ab3933034bf469ae + // Purpur end - Add allow water in end world option } diff --git a/net/minecraft/world/level/NaturalSpawner.java b/net/minecraft/world/level/NaturalSpawner.java -index ec32d77447dd250857a2af1d8cc3e6e233aa3e6e..345d4b80bd4383e0fb66d744d87bc8ef4100fd32 100644 +index ccbeda714085118b4dddf9fac6f3de2ed7a6426e..102d88fc2989f80a39826e50ee706d853bfb2c5e 100644 --- a/net/minecraft/world/level/NaturalSpawner.java +++ b/net/minecraft/world/level/NaturalSpawner.java @@ -254,7 +254,7 @@ public final class NaturalSpawner { @@ -15369,27 +15369,6 @@ index 5c2f10486e3aed090c6545a86276e6927e424cb2..9ed7ffb10e0a172fe5f3dd4613922428 WorldBorder worldBorder = level.getWorldBorder(); for (int i = 0; i < 1000; i++) { -diff --git a/net/minecraft/world/level/block/EnchantingTableBlock.java b/net/minecraft/world/level/block/EnchantingTableBlock.java -index 523082c69aad8269cd058ad6864184c3ab51dbeb..4f4e81a845c4d3dc0e7d82ba323a8595581535e2 100644 ---- a/net/minecraft/world/level/block/EnchantingTableBlock.java -+++ b/net/minecraft/world/level/block/EnchantingTableBlock.java -@@ -119,4 +119,16 @@ public class EnchantingTableBlock extends BaseEntityBlock { - protected boolean isPathfindable(BlockState state, PathComputationType pathComputationType) { - return false; - } -+ -+ // Purpur start - Enchantment Table Persists Lapis -+ @Override -+ protected void affectNeighborsAfterRemoval(BlockState state, net.minecraft.server.level.ServerLevel level, BlockPos pos, boolean movedByPiston) { -+ BlockEntity blockEntity = level.getBlockEntity(pos); -+ -+ if (level.purpurConfig.enchantmentTableLapisPersists && blockEntity instanceof EnchantingTableBlockEntity enchantmentTable) { -+ net.minecraft.world.Containers.dropItemStack(level, pos.getX(), pos.getY(), pos.getZ(), new net.minecraft.world.item.ItemStack(net.minecraft.world.item.Items.LAPIS_LAZULI, enchantmentTable.getLapis())); -+ net.minecraft.world.Containers.updateNeighboursAfterDestroy(state, level, pos); -+ } -+ } -+ // Purpur end - Enchantment Table Persists Lapis - } diff --git a/net/minecraft/world/level/block/EndGatewayBlock.java b/net/minecraft/world/level/block/EndGatewayBlock.java index 68914268ca9350a6c1d794e011e1f9a8aecd609c..8e53b45dbf740de6c6fe499ef424d11b2b15f9d8 100644 --- a/net/minecraft/world/level/block/EndGatewayBlock.java @@ -16542,7 +16521,7 @@ index 0e87d20639c382be2221d73c7498480d21ebeafb..3ea9fe4c936f024c15a6bba6e7c5d960 private static void animationTick(Level level, BlockPos pos, List positions, @Nullable Entity entity, int tickCount) { diff --git a/net/minecraft/world/level/block/entity/EnchantingTableBlockEntity.java b/net/minecraft/world/level/block/entity/EnchantingTableBlockEntity.java -index 5dd044c13e09423af43330df565bfe6ce88a883c..93f34bbfae6f8f02ff4ea92d6745cd1d288c8dbd 100644 +index 5dd044c13e09423af43330df565bfe6ce88a883c..39a45a32b1c82e6d7641a1609384a902d0414659 100644 --- a/net/minecraft/world/level/block/entity/EnchantingTableBlockEntity.java +++ b/net/minecraft/world/level/block/entity/EnchantingTableBlockEntity.java @@ -30,6 +30,7 @@ public class EnchantingTableBlockEntity extends BlockEntity implements Nameable @@ -16568,7 +16547,7 @@ index 5dd044c13e09423af43330df565bfe6ce88a883c..93f34bbfae6f8f02ff4ea92d6745cd1d } public static void bookAnimationTick(Level level, BlockPos pos, BlockState state, EnchantingTableBlockEntity enchantingTable) { -@@ -136,4 +139,14 @@ public class EnchantingTableBlockEntity extends BlockEntity implements Nameable +@@ -136,4 +139,22 @@ public class EnchantingTableBlockEntity extends BlockEntity implements Nameable public void removeComponentsFromTag(ValueOutput output) { output.discard("CustomName"); } @@ -16581,6 +16560,14 @@ index 5dd044c13e09423af43330df565bfe6ce88a883c..93f34bbfae6f8f02ff4ea92d6745cd1d + public void setLapis(int lapis) { + this.lapis = lapis; + } ++ ++ @Override ++ public void preRemoveSideEffects(BlockPos pos, BlockState state) { ++ super.preRemoveSideEffects(pos, state); ++ if (this.level != null && this.level.purpurConfig.enchantmentTableLapisPersists) { ++ net.minecraft.world.Containers.dropItemStack(this.level, pos.getX(), pos.getY(), pos.getZ(), new net.minecraft.world.item.ItemStack(net.minecraft.world.item.Items.LAPIS_LAZULI, this.getLapis())); ++ } ++ } + // Purpur end - Enchantment Table Persists Lapis } diff --git a/net/minecraft/world/level/block/entity/SignBlockEntity.java b/net/minecraft/world/level/block/entity/SignBlockEntity.java diff --git a/leaf-server/minecraft-patches/features/0109-Leaves-Protocol-Core.patch b/leaf-server/minecraft-patches/features/0109-Leaves-Protocol-Core.patch index 37612ba9..71f81d99 100644 --- a/leaf-server/minecraft-patches/features/0109-Leaves-Protocol-Core.patch +++ b/leaf-server/minecraft-patches/features/0109-Leaves-Protocol-Core.patch @@ -6,7 +6,7 @@ Subject: [PATCH] Leaves: Protocol Core Original license: GPLv3 Original project: https://github.com/LeavesMC/Leaves -Commit: 3187d77f57058a81bc04ce7eaac1224f58b03c25 +Commit: aaa2323d60912b65b64c16e7583c5d55f8b4c7c9 diff --git a/net/minecraft/network/protocol/common/custom/CustomPacketPayload.java b/net/minecraft/network/protocol/common/custom/CustomPacketPayload.java index fb263fa1f30a7dfcb7ec2656abfb38e5fe88eac9..56fd1ed7ccaf96e7eedea60fbdbf7f934939d563 100644 @@ -36,25 +36,6 @@ index fb263fa1f30a7dfcb7ec2656abfb38e5fe88eac9..56fd1ed7ccaf96e7eedea60fbdbf7f93 } }; } -diff --git a/net/minecraft/network/protocol/common/custom/DiscardedPayload.java b/net/minecraft/network/protocol/common/custom/DiscardedPayload.java -index 62b9d9486c15a1ec6527f786df4e9fc483390bcb..5384bbc6bb3dbe5481f9d8cb10282551a0f78ec1 100644 ---- a/net/minecraft/network/protocol/common/custom/DiscardedPayload.java -+++ b/net/minecraft/network/protocol/common/custom/DiscardedPayload.java -@@ -4,12 +4,12 @@ import net.minecraft.network.FriendlyByteBuf; - import net.minecraft.network.codec.StreamCodec; - import net.minecraft.resources.ResourceLocation; - --public record DiscardedPayload(ResourceLocation id, byte[] data) implements CustomPacketPayload { // Paper - store data -+public record DiscardedPayload(ResourceLocation id, byte @org.jetbrains.annotations.Nullable [] data) implements CustomPacketPayload { // Paper - store data // Leaves - nullable - public static StreamCodec codec(ResourceLocation id, int maxSize) { - return CustomPacketPayload.codec((value, output) -> { - // Paper start - // Always write data -- output.writeBytes(value.data); -+ if (value.data != null) output.writeBytes(value.data); // Leaves - nullable - }, buffer -> { - int i = buffer.readableBytes(); - if (i >= 0 && i <= maxSize) { diff --git a/net/minecraft/server/MinecraftServer.java b/net/minecraft/server/MinecraftServer.java index 12e697a626ce68127ac2157fca0e5408beb13f0b..46118a63b721d445623c4d831881652d845df96d 100644 --- a/net/minecraft/server/MinecraftServer.java @@ -68,68 +49,67 @@ index 12e697a626ce68127ac2157fca0e5408beb13f0b..46118a63b721d445623c4d831881652d for (int i = 0; i < this.tickables.size(); i++) { this.tickables.get(i).run(); } -diff --git a/net/minecraft/server/level/ServerPlayer.java b/net/minecraft/server/level/ServerPlayer.java -index 940d6c2b5610e7bda00267db4108866d5cba3d8a..1105b9e12600b8fc0df664bfd2fa53c7ade78da2 100644 ---- a/net/minecraft/server/level/ServerPlayer.java -+++ b/net/minecraft/server/level/ServerPlayer.java -@@ -437,6 +437,8 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc - private ca.spottedleaf.moonrise.patches.chunk_system.player.RegionizedPlayerChunkLoader.PlayerChunkLoaderData chunkLoader; - private final ca.spottedleaf.moonrise.patches.chunk_system.player.RegionizedPlayerChunkLoader.ViewDistanceHolder viewDistanceHolder = new ca.spottedleaf.moonrise.patches.chunk_system.player.RegionizedPlayerChunkLoader.ViewDistanceHolder(); - -+ public net.minecraft.network.Connection internalConnection; // Leaves - protocol core -+ - @Override - public final boolean moonrise$isRealPlayer() { - return this.isRealPlayer; diff --git a/net/minecraft/server/network/ServerCommonPacketListenerImpl.java b/net/minecraft/server/network/ServerCommonPacketListenerImpl.java -index ca9ba2a2535eab66622230778efdf941f540f6d2..95f89a415f7f7b9d4d7823744cb6bcc6b3886aa5 100644 +index ca9ba2a2535eab66622230778efdf941f540f6d2..fa6095200243fafa796e49df3930c6d7ab2dcd84 100644 --- a/net/minecraft/server/network/ServerCommonPacketListenerImpl.java +++ b/net/minecraft/server/network/ServerCommonPacketListenerImpl.java -@@ -234,6 +234,7 @@ public abstract class ServerCommonPacketListenerImpl implements ServerCommonPack - final String channel = new String(data, from, length, java.nio.charset.StandardCharsets.US_ASCII); - if (register) { - bridge.addChannel(channel); -+ org.leavesmc.leaves.protocol.core.LeavesProtocolManager.handleMinecraftRegister(channel, bridge); // Leaves - protocol - } else { - bridge.removeChannel(channel); - } -diff --git a/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/net/minecraft/server/network/ServerGamePacketListenerImpl.java -index 7abe38f2c3939a2074b72f1d664ba5ad24fc591f..16e546fab3c7a025de7d04147b5b64d77b30c5a8 100644 ---- a/net/minecraft/server/network/ServerGamePacketListenerImpl.java -+++ b/net/minecraft/server/network/ServerGamePacketListenerImpl.java -@@ -3677,6 +3677,17 @@ public class ServerGamePacketListenerImpl +@@ -64,6 +64,7 @@ public abstract class ServerCommonPacketListenerImpl implements ServerCommonPack + public @Nullable String playerBrand; + public final java.util.Set pluginMessagerChannels; + // Paper end - retain certain values ++ public final GameProfile profile; // Leaves - protocol core + + public ServerCommonPacketListenerImpl(MinecraftServer server, Connection connection, CommonListenerCookie cookie) { + this.server = server; +@@ -77,6 +78,7 @@ public abstract class ServerCommonPacketListenerImpl implements ServerCommonPack + this.pluginMessagerChannels = cookie.channels(); + this.keepAlive = cookie.keepAlive(); + // Paper end ++ this.profile = cookie.gameProfile(); // Leaves - protocol core + } + + // Paper start - configuration phase API +@@ -169,6 +171,18 @@ public abstract class ServerCommonPacketListenerImpl implements ServerCommonPack @Override public void handleCustomPayload(ServerboundCustomPayloadPacket packet) { + // Leaves start - protocol + if (packet.payload() instanceof org.leavesmc.leaves.protocol.core.LeavesCustomPayload leavesPayload) { -+ org.leavesmc.leaves.protocol.core.LeavesProtocolManager.handlePayload(player, leavesPayload); ++ org.leavesmc.leaves.protocol.core.LeavesProtocolManager.handlePayload(org.leavesmc.leaves.protocol.core.ProtocolUtils.createSelector(this), leavesPayload); + return; + } + if (packet.payload() instanceof net.minecraft.network.protocol.common.custom.DiscardedPayload(net.minecraft.resources.ResourceLocation id, byte[] data)) { -+ if (org.leavesmc.leaves.protocol.core.LeavesProtocolManager.handleBytebuf(player, id, io.netty.buffer.Unpooled.wrappedBuffer(data))) { ++ if (org.leavesmc.leaves.protocol.core.LeavesProtocolManager.handleBytebuf(org.leavesmc.leaves.protocol.core.ProtocolUtils.createSelector(this), id, io.netty.buffer.Unpooled.wrappedBuffer(data))) { + return; + } + } + // Leaves end - protocol - super.handleCustomPayload(packet); // Paper - } - ++ + // Paper start + if (!(packet.payload() instanceof final net.minecraft.network.protocol.common.custom.DiscardedPayload discardedPayload)) { + return; +@@ -234,6 +248,7 @@ public abstract class ServerCommonPacketListenerImpl implements ServerCommonPack + final String channel = new String(data, from, length, java.nio.charset.StandardCharsets.US_ASCII); + if (register) { + bridge.addChannel(channel); ++ org.leavesmc.leaves.protocol.core.LeavesProtocolManager.handleMinecraftRegister(channel, org.leavesmc.leaves.protocol.core.ProtocolUtils.createSelector(this)); // Leaves - protocol + } else { + bridge.removeChannel(channel); + } diff --git a/net/minecraft/server/players/PlayerList.java b/net/minecraft/server/players/PlayerList.java -index b290d228fc3d71aee6db3c4915e96d675097c870..908a39c6cb0ebc68eb08886f2199e6b6cd7aa422 100644 +index 22f0c1911a169b39c06d45483cded017be275a38..c6da3135d4473c8d3c410254474712bbcd2bd4b0 100644 --- a/net/minecraft/server/players/PlayerList.java +++ b/net/minecraft/server/players/PlayerList.java -@@ -346,6 +346,9 @@ public abstract class PlayerList { +@@ -346,6 +346,8 @@ public abstract class PlayerList { player.didPlayerJoinEvent = true; // Gale - EMC - do not process chat/commands before player has joined -+ if (player.internalConnection == null) player.internalConnection = connection; // Leaf - Leaves - protocol + org.leavesmc.leaves.protocol.core.LeavesProtocolManager.handlePlayerJoin(player); // Leaves - protocol + final net.kyori.adventure.text.Component jm = playerJoinEvent.joinMessage(); if (jm != null && !jm.equals(net.kyori.adventure.text.Component.empty())) { // Paper - Adventure -@@ -525,6 +528,7 @@ public abstract class PlayerList { +@@ -525,6 +527,7 @@ public abstract class PlayerList { return this.remove(player, net.kyori.adventure.text.Component.translatable("multiplayer.player.left", net.kyori.adventure.text.format.NamedTextColor.YELLOW, io.papermc.paper.configuration.GlobalConfiguration.get().messages.useDisplayNameInQuitMessage ? player.getBukkitEntity().displayName() : io.papermc.paper.adventure.PaperAdventure.asAdventure(player.getDisplayName()))); } public @Nullable net.kyori.adventure.text.Component remove(ServerPlayer player, net.kyori.adventure.text.Component leaveMessage) { @@ -137,7 +117,7 @@ index b290d228fc3d71aee6db3c4915e96d675097c870..908a39c6cb0ebc68eb08886f2199e6b6 // Paper end - Fix kick event leave message not being sent org.purpurmc.purpur.task.BossBarTask.removeFromAll(player.getBukkitEntity()); // Purpur - Implement TPSBar ServerLevel serverLevel = player.level(); -@@ -1507,6 +1511,7 @@ public abstract class PlayerList { +@@ -1507,6 +1510,7 @@ public abstract class PlayerList { serverPlayer.connection.send(clientboundUpdateRecipesPacket); serverPlayer.getRecipeBook().sendInitialRecipeBook(serverPlayer); } diff --git a/leaf-server/minecraft-patches/features/0111-Leaves-Xaero-Map-Protocol.patch b/leaf-server/minecraft-patches/features/0111-Leaves-Xaero-Map-Protocol.patch index 0af98682..f2ef4110 100644 --- a/leaf-server/minecraft-patches/features/0111-Leaves-Xaero-Map-Protocol.patch +++ b/leaf-server/minecraft-patches/features/0111-Leaves-Xaero-Map-Protocol.patch @@ -9,10 +9,10 @@ Original project: https://github.com/LeavesMC/Leaves This patch is Powered by Xaero Map diff --git a/net/minecraft/server/players/PlayerList.java b/net/minecraft/server/players/PlayerList.java -index 908a39c6cb0ebc68eb08886f2199e6b6cd7aa422..8338644be256b4c0978adb2b6cb90f3decd4076c 100644 +index c6da3135d4473c8d3c410254474712bbcd2bd4b0..5cbb5d366258104968f7858f6462f9a83053d87e 100644 --- a/net/minecraft/server/players/PlayerList.java +++ b/net/minecraft/server/players/PlayerList.java -@@ -1218,6 +1218,7 @@ public abstract class PlayerList { +@@ -1217,6 +1217,7 @@ public abstract class PlayerList { player.connection.send(new ClientboundInitializeBorderPacket(worldBorder)); player.connection.send(new ClientboundSetTimePacket(level.getGameTime(), level.getDayTime(), level.getGameRules().getBoolean(GameRules.RULE_DAYLIGHT))); player.connection.send(new ClientboundSetDefaultSpawnPositionPacket(level.getSharedSpawnPos(), level.getSharedSpawnAngle())); diff --git a/leaf-server/minecraft-patches/features/0113-Leaves-Replay-Mod-API.patch b/leaf-server/minecraft-patches/features/0113-Leaves-Replay-Mod-API.patch index db4c4af6..5f1cc83c 100644 --- a/leaf-server/minecraft-patches/features/0113-Leaves-Replay-Mod-API.patch +++ b/leaf-server/minecraft-patches/features/0113-Leaves-Replay-Mod-API.patch @@ -178,7 +178,7 @@ index 95c128f028c3cce7d0b37821a6e75208323fb4e9..2cf0fa70ae3d7675cac3cf7a0002097b ServerLevel.this.updateSleepingPlayerList(); } diff --git a/net/minecraft/server/level/ServerPlayer.java b/net/minecraft/server/level/ServerPlayer.java -index 849428f5ad870ac93f29cec8bc7d3d335550cf14..77ca4f505dc0a1aa6292cfcd957b734ab107f657 100644 +index fbf78c7cf012353cf6549c13ccd8ffc1e0f0b28a..783af6b9857405a05cb5837bf3c0f416d1edf7a8 100644 --- a/net/minecraft/server/level/ServerPlayer.java +++ b/net/minecraft/server/level/ServerPlayer.java @@ -216,7 +216,7 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc @@ -191,7 +191,7 @@ index 849428f5ad870ac93f29cec8bc7d3d335550cf14..77ca4f505dc0a1aa6292cfcd957b734a private final PlayerAdvancements advancements; private final ServerStatsCounter stats; diff --git a/net/minecraft/server/players/PlayerList.java b/net/minecraft/server/players/PlayerList.java -index 8338644be256b4c0978adb2b6cb90f3decd4076c..90d32e8f55b21e1f2b67db8bb2a4575d91438fea 100644 +index 5cbb5d366258104968f7858f6462f9a83053d87e..ed22e35855c0a3e6a65b9f016bf43e9c07476d91 100644 --- a/net/minecraft/server/players/PlayerList.java +++ b/net/minecraft/server/players/PlayerList.java @@ -131,6 +131,7 @@ public abstract class PlayerList { @@ -202,7 +202,7 @@ index 8338644be256b4c0978adb2b6cb90f3decd4076c..90d32e8f55b21e1f2b67db8bb2a4575d // CraftBukkit start private org.bukkit.craftbukkit.CraftServer cserver; -@@ -149,6 +150,106 @@ public abstract class PlayerList { +@@ -149,6 +150,112 @@ public abstract class PlayerList { abstract public void loadAndSaveFiles(); // Paper - fix converting txt to json file; moved from DedicatedPlayerList constructor @@ -271,6 +271,12 @@ index 8338644be256b4c0978adb2b6cb90f3decd4076c..90d32e8f55b21e1f2b67db8bb2a4575d + continue; + } + ++ // Leaves start - skip photographer ++ if (entityplayer1 instanceof org.leavesmc.leaves.replay.ServerPhotographer) { ++ continue; ++ } ++ // Leaves end - skip photographer ++ + onlinePlayers.add(entityplayer1); + } + if (!onlinePlayers.isEmpty()) { @@ -309,7 +315,7 @@ index 8338644be256b4c0978adb2b6cb90f3decd4076c..90d32e8f55b21e1f2b67db8bb2a4575d public void placeNewPlayer(Connection connection, ServerPlayer player, CommonListenerCookie cookie) { player.isRealPlayer = true; // Paper player.loginTime = System.currentTimeMillis(); // Paper - Replace OfflinePlayer#getLastPlayed -@@ -318,6 +419,7 @@ public abstract class PlayerList { +@@ -318,6 +425,7 @@ public abstract class PlayerList { // player.connection.send(ClientboundPlayerInfoUpdatePacket.createPlayerInitializing(this.players)); // CraftBukkit - replaced with loop below this.players.add(player); @@ -317,20 +323,7 @@ index 8338644be256b4c0978adb2b6cb90f3decd4076c..90d32e8f55b21e1f2b67db8bb2a4575d this.playersByName.put(player.getScoreboardName().toLowerCase(java.util.Locale.ROOT), player); // Spigot this.playersByUUID.put(player.getUUID(), player); this.addToSendAllPlayerInfoBuckets(player); // Gale - Purpur - spread out sending all player info -@@ -380,6 +482,12 @@ public abstract class PlayerList { - continue; - } - -+ // Leaves start - skip photographer -+ if (entityplayer1 instanceof org.leavesmc.leaves.replay.ServerPhotographer) { -+ continue; -+ } -+ // Leaves end - skip photographer -+ - onlinePlayers.add(entityplayer1); // Paper - Use single player info update packet on join - } - // Paper start - Use single player info update packet on join -@@ -523,6 +631,43 @@ public abstract class PlayerList { +@@ -522,6 +630,43 @@ public abstract class PlayerList { } } @@ -374,7 +367,7 @@ index 8338644be256b4c0978adb2b6cb90f3decd4076c..90d32e8f55b21e1f2b67db8bb2a4575d public @Nullable net.kyori.adventure.text.Component remove(ServerPlayer player) { // CraftBukkit - return string // Paper - return Component // Paper start - Fix kick event leave message not being sent return this.remove(player, net.kyori.adventure.text.Component.translatable("multiplayer.player.left", net.kyori.adventure.text.format.NamedTextColor.YELLOW, io.papermc.paper.configuration.GlobalConfiguration.get().messages.useDisplayNameInQuitMessage ? player.getBukkitEntity().displayName() : io.papermc.paper.adventure.PaperAdventure.asAdventure(player.getDisplayName()))); -@@ -599,6 +744,7 @@ public abstract class PlayerList { +@@ -598,6 +743,7 @@ public abstract class PlayerList { player.retireScheduler(); // Paper - Folia schedulers player.getAdvancements().stopListening(); this.players.remove(player); @@ -382,7 +375,7 @@ index 8338644be256b4c0978adb2b6cb90f3decd4076c..90d32e8f55b21e1f2b67db8bb2a4575d this.playersByName.remove(player.getScoreboardName().toLowerCase(java.util.Locale.ROOT)); // Spigot this.removeFromSendAllPlayerInfoBuckets(player); // Gale - Purpur - spread out sending all player info this.server.getCustomBossEvents().onPlayerDisconnect(player); -@@ -1104,7 +1250,7 @@ public abstract class PlayerList { +@@ -1103,7 +1249,7 @@ public abstract class PlayerList { // Paper start - whitelist verify event / login event public LoginResult canBypassFullServerLogin(final GameProfile profile, final LoginResult currentResult) { diff --git a/leaf-server/minecraft-patches/features/0129-Remove-useless-creating-stats-json-bases-on-player-n.patch b/leaf-server/minecraft-patches/features/0129-Remove-useless-creating-stats-json-bases-on-player-n.patch index e07cd1c9..36fed0b2 100644 --- a/leaf-server/minecraft-patches/features/0129-Remove-useless-creating-stats-json-bases-on-player-n.patch +++ b/leaf-server/minecraft-patches/features/0129-Remove-useless-creating-stats-json-bases-on-player-n.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Remove useless creating stats json bases on player name logic diff --git a/net/minecraft/server/players/PlayerList.java b/net/minecraft/server/players/PlayerList.java -index 90d32e8f55b21e1f2b67db8bb2a4575d91438fea..e999ce4ed3a1bba81f61085ead2565f2d3e90cfa 100644 +index ed22e35855c0a3e6a65b9f016bf43e9c07476d91..a31d9b3ee78ce0ddbe4f5d2ffca1505bed555f0f 100644 --- a/net/minecraft/server/players/PlayerList.java +++ b/net/minecraft/server/players/PlayerList.java -@@ -1557,6 +1557,8 @@ public abstract class PlayerList { +@@ -1556,6 +1556,8 @@ public abstract class PlayerList { if (serverStatsCounter == null) { File file = this.server.getWorldPath(LevelResource.PLAYER_STATS_DIR).toFile(); File file1 = new File(file, uuid + ".json"); @@ -17,7 +17,7 @@ index 90d32e8f55b21e1f2b67db8bb2a4575d91438fea..e999ce4ed3a1bba81f61085ead2565f2 if (!file1.exists()) { File file2 = new File(file, displayName + ".json"); // CraftBukkit Path path = file2.toPath(); -@@ -1564,6 +1566,8 @@ public abstract class PlayerList { +@@ -1563,6 +1565,8 @@ public abstract class PlayerList { file2.renameTo(file1); } } diff --git a/leaf-server/minecraft-patches/features/0130-Improve-Purpur-AFK-system.patch b/leaf-server/minecraft-patches/features/0130-Improve-Purpur-AFK-system.patch index 98bc0ad8..b467fb08 100644 --- a/leaf-server/minecraft-patches/features/0130-Improve-Purpur-AFK-system.patch +++ b/leaf-server/minecraft-patches/features/0130-Improve-Purpur-AFK-system.patch @@ -19,10 +19,10 @@ index 287c0936930ff4f3ca6dc2a4cbfc796a120fe4c0..3f32da75ee0a8a993b54e4156f7e4be9 org.purpurmc.purpur.command.DemoCommand.register(this.dispatcher); // Purpur - Add demo command org.purpurmc.purpur.command.PingCommand.register(this.dispatcher); // Purpur - Add ping command diff --git a/net/minecraft/server/level/ServerPlayer.java b/net/minecraft/server/level/ServerPlayer.java -index d129bfa0e350119f55fc6cf9a60921cf2296d2c4..46dcfd09cc01cdf5aca43ef100e0307ae1b72e0d 100644 +index 783af6b9857405a05cb5837bf3c0f416d1edf7a8..5775b0568dd90075539698b04ff185e10c3b3f75 100644 --- a/net/minecraft/server/level/ServerPlayer.java +++ b/net/minecraft/server/level/ServerPlayer.java -@@ -2432,6 +2432,10 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc +@@ -2430,6 +2430,10 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc // Purpur start - AFK API private boolean isAfk = false; @@ -33,7 +33,7 @@ index d129bfa0e350119f55fc6cf9a60921cf2296d2c4..46dcfd09cc01cdf5aca43ef100e0307a @Override public void setAfk(boolean afk) { -@@ -2469,6 +2473,18 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc +@@ -2467,6 +2471,18 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc String prefix = (split.length > 0 ? split[0] : "").replace(org.purpurmc.purpur.PurpurConfig.afkTabListPrefix, ""); String suffix = (split.length > 1 ? split[1] : "").replace(org.purpurmc.purpur.PurpurConfig.afkTabListSuffix, ""); if (afk) { @@ -53,7 +53,7 @@ index d129bfa0e350119f55fc6cf9a60921cf2296d2c4..46dcfd09cc01cdf5aca43ef100e0307a } else { getBukkitEntity().setPlayerListName(prefix + scoreboardName + suffix, true); diff --git a/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/net/minecraft/server/network/ServerGamePacketListenerImpl.java -index a08351fc29a06f1db491b2aa8b79f1850bc8cb19..b3f45d5e8ff92c50adfc4885349ec0d29992037d 100644 +index 5e005e8f341e83bbc1a4cc6de781ed9407bdf8ef..f5c609fb2df079a2c5970b0d5882b402478a7e82 100644 --- a/net/minecraft/server/network/ServerGamePacketListenerImpl.java +++ b/net/minecraft/server/network/ServerGamePacketListenerImpl.java @@ -2371,6 +2371,7 @@ public class ServerGamePacketListenerImpl @@ -152,10 +152,10 @@ index a08351fc29a06f1db491b2aa8b79f1850bc8cb19..b3f45d5e8ff92c50adfc4885349ec0d2 synchronized (this.lastSeenMessages) { Optional var10000; diff --git a/net/minecraft/server/players/PlayerList.java b/net/minecraft/server/players/PlayerList.java -index e999ce4ed3a1bba81f61085ead2565f2d3e90cfa..9026b45b6ee7f53f3a3872cda1a8c3f96eb5b2a7 100644 +index a31d9b3ee78ce0ddbe4f5d2ffca1505bed555f0f..d196ad81b6d9b22d63f7bfebb7aba090e668824b 100644 --- a/net/minecraft/server/players/PlayerList.java +++ b/net/minecraft/server/players/PlayerList.java -@@ -676,6 +676,7 @@ public abstract class PlayerList { +@@ -675,6 +675,7 @@ public abstract class PlayerList { org.leavesmc.leaves.protocol.core.LeavesProtocolManager.handlePlayerLeave(player); // Leaves - protocol // Paper end - Fix kick event leave message not being sent org.purpurmc.purpur.task.BossBarTask.removeFromAll(player.getBukkitEntity()); // Purpur - Implement TPSBar diff --git a/leaf-server/minecraft-patches/features/0133-Mirai-Configurable-chat-message-signatures.patch b/leaf-server/minecraft-patches/features/0133-Mirai-Configurable-chat-message-signatures.patch index 56bcb4d2..6feb0838 100644 --- a/leaf-server/minecraft-patches/features/0133-Mirai-Configurable-chat-message-signatures.patch +++ b/leaf-server/minecraft-patches/features/0133-Mirai-Configurable-chat-message-signatures.patch @@ -103,10 +103,10 @@ index 87fc8861948b50361ec04c5a23406d3abdec6eac..77f11179836636424927843f5f10c3fd // Paper start - Add setting for proxy online mode status return properties.enforceSecureProfile diff --git a/net/minecraft/server/network/ServerCommonPacketListenerImpl.java b/net/minecraft/server/network/ServerCommonPacketListenerImpl.java -index 95f89a415f7f7b9d4d7823744cb6bcc6b3886aa5..7f4257870c5fca902403e246b9ce569b20dbb364 100644 +index fa6095200243fafa796e49df3930c6d7ab2dcd84..84030c40f2f91b433b3ccd21e0367d2f8b7c97b6 100644 --- a/net/minecraft/server/network/ServerCommonPacketListenerImpl.java +++ b/net/minecraft/server/network/ServerCommonPacketListenerImpl.java -@@ -349,10 +349,30 @@ public abstract class ServerCommonPacketListenerImpl implements ServerCommonPack +@@ -363,10 +363,30 @@ public abstract class ServerCommonPacketListenerImpl implements ServerCommonPack } public void send(Packet packet) { @@ -138,10 +138,10 @@ index 95f89a415f7f7b9d4d7823744cb6bcc6b3886aa5..7f4257870c5fca902403e246b9ce569b if (packet == null || this.processedDisconnect) { // Spigot return; diff --git a/net/minecraft/server/players/PlayerList.java b/net/minecraft/server/players/PlayerList.java -index 9026b45b6ee7f53f3a3872cda1a8c3f96eb5b2a7..df532c61dcfedcafd8c6a75bd0f12a58acb9ca00 100644 +index d196ad81b6d9b22d63f7bfebb7aba090e668824b..bee2ede3cecac11862b8fa56fdb89d06e741c272 100644 --- a/net/minecraft/server/players/PlayerList.java +++ b/net/minecraft/server/players/PlayerList.java -@@ -1517,7 +1517,7 @@ public abstract class PlayerList { +@@ -1516,7 +1516,7 @@ public abstract class PlayerList { public void broadcastChatMessage(PlayerChatMessage message, Predicate shouldFilterMessageTo, @Nullable ServerPlayer sender, ChatType.Bound boundChatType, @Nullable Function unsignedFunction) { // Paper end boolean flag = this.verifyChatTrusted(message); @@ -150,7 +150,7 @@ index 9026b45b6ee7f53f3a3872cda1a8c3f96eb5b2a7..df532c61dcfedcafd8c6a75bd0f12a58 OutgoingChatMessage outgoingChatMessage = OutgoingChatMessage.create(message); boolean flag1 = false; -@@ -1542,6 +1542,7 @@ public abstract class PlayerList { +@@ -1541,6 +1541,7 @@ public abstract class PlayerList { } public boolean verifyChatTrusted(PlayerChatMessage message) { diff --git a/leaf-server/minecraft-patches/features/0140-Configurable-connection-message.patch b/leaf-server/minecraft-patches/features/0140-Configurable-connection-message.patch index c7f91380..816f374e 100644 --- a/leaf-server/minecraft-patches/features/0140-Configurable-connection-message.patch +++ b/leaf-server/minecraft-patches/features/0140-Configurable-connection-message.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Configurable connection message diff --git a/net/minecraft/server/players/PlayerList.java b/net/minecraft/server/players/PlayerList.java -index df532c61dcfedcafd8c6a75bd0f12a58acb9ca00..528042f0aee2ec18835b72b931a64b7c37b9504d 100644 +index bee2ede3cecac11862b8fa56fdb89d06e741c272..416cfcf8585b6db26431a51fa356eef59c17325a 100644 --- a/net/minecraft/server/players/PlayerList.java +++ b/net/minecraft/server/players/PlayerList.java -@@ -439,7 +439,7 @@ public abstract class PlayerList { +@@ -445,7 +445,7 @@ public abstract class PlayerList { // Ensure that player inventory is populated with its viewer player.containerMenu.transferTo(player.containerMenu, bukkitPlayer); @@ -17,7 +17,7 @@ index df532c61dcfedcafd8c6a75bd0f12a58acb9ca00..528042f0aee2ec18835b72b931a64b7c this.cserver.getPluginManager().callEvent(playerJoinEvent); if (!player.connection.isAcceptingMessages()) { -@@ -453,7 +453,7 @@ public abstract class PlayerList { +@@ -458,7 +458,7 @@ public abstract class PlayerList { final net.kyori.adventure.text.Component jm = playerJoinEvent.joinMessage(); @@ -26,7 +26,7 @@ index df532c61dcfedcafd8c6a75bd0f12a58acb9ca00..528042f0aee2ec18835b72b931a64b7c joinMessage = io.papermc.paper.adventure.PaperAdventure.asVanilla(jm); // Paper - Adventure this.server.getPlayerList().broadcastSystemMessage(joinMessage, false); // Paper - Adventure } -@@ -685,7 +685,7 @@ public abstract class PlayerList { +@@ -684,7 +684,7 @@ public abstract class PlayerList { player.closeContainer(org.bukkit.event.inventory.InventoryCloseEvent.Reason.DISCONNECT); // Paper - Inventory close reason } @@ -35,7 +35,7 @@ index df532c61dcfedcafd8c6a75bd0f12a58acb9ca00..528042f0aee2ec18835b72b931a64b7c this.cserver.getPluginManager().callEvent(playerQuitEvent); player.getBukkitEntity().disconnect(playerQuitEvent.getQuitMessage()); -@@ -1670,4 +1670,40 @@ public abstract class PlayerList { +@@ -1669,4 +1669,40 @@ public abstract class PlayerList { public boolean isAllowCommandsForAllPlayers() { return this.allowCommandsForAllPlayers; } diff --git a/leaf-server/minecraft-patches/features/0159-Do-not-place-player-if-the-server-is-full.patch b/leaf-server/minecraft-patches/features/0159-Do-not-place-player-if-the-server-is-full.patch index 60ea89d4..372f9881 100644 --- a/leaf-server/minecraft-patches/features/0159-Do-not-place-player-if-the-server-is-full.patch +++ b/leaf-server/minecraft-patches/features/0159-Do-not-place-player-if-the-server-is-full.patch @@ -6,10 +6,10 @@ Subject: [PATCH] Do not place player if the server is full Fix https://github.com/PaperMC/Paper/issues/10668 diff --git a/net/minecraft/server/players/PlayerList.java b/net/minecraft/server/players/PlayerList.java -index 528042f0aee2ec18835b72b931a64b7c37b9504d..9dbc73b7d5406c7e82b8f1dd2d60d144d24d5220 100644 +index 416cfcf8585b6db26431a51fa356eef59c17325a..704fbb08d5c1768c3024a7dbd6d7e34da4ab6be7 100644 --- a/net/minecraft/server/players/PlayerList.java +++ b/net/minecraft/server/players/PlayerList.java -@@ -343,6 +343,13 @@ public abstract class PlayerList { +@@ -349,6 +349,13 @@ public abstract class PlayerList { return; } // Gale end - MultiPaper - do not place player in world if kicked before being spawned in @@ -23,7 +23,7 @@ index 528042f0aee2ec18835b72b931a64b7c37b9504d..9dbc73b7d5406c7e82b8f1dd2d60d144 org.bukkit.Location loc = ev.getSpawnLocation(); serverLevel = ((org.bukkit.craftbukkit.CraftWorld) loc.getWorld()).getHandle(); -@@ -1251,7 +1258,7 @@ public abstract class PlayerList { +@@ -1250,7 +1257,7 @@ public abstract class PlayerList { // Paper start - whitelist verify event / login event public LoginResult canBypassFullServerLogin(final GameProfile profile, final LoginResult currentResult) { diff --git a/leaf-server/minecraft-patches/features/0162-Fix-MC-119417.patch b/leaf-server/minecraft-patches/features/0162-Fix-MC-119417.patch index 5e206697..eeff0f7f 100644 --- a/leaf-server/minecraft-patches/features/0162-Fix-MC-119417.patch +++ b/leaf-server/minecraft-patches/features/0162-Fix-MC-119417.patch @@ -6,10 +6,10 @@ Subject: [PATCH] Fix MC-119417 Related MC issue: https://bugs.mojang.com/browse/MC/issues/MC-119417 diff --git a/net/minecraft/server/level/ServerPlayer.java b/net/minecraft/server/level/ServerPlayer.java -index 46dcfd09cc01cdf5aca43ef100e0307ae1b72e0d..567187499c29fbd159b472278665a824dbb1cfd6 100644 +index 5775b0568dd90075539698b04ff185e10c3b3f75..72ab1e2ea7571b5fde4c3769249e950b67dc9c82 100644 --- a/net/minecraft/server/level/ServerPlayer.java +++ b/net/minecraft/server/level/ServerPlayer.java -@@ -2236,6 +2236,7 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc +@@ -2234,6 +2234,7 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc this.connection.send(new ClientboundGameEventPacket(ClientboundGameEventPacket.CHANGE_GAME_MODE, gameMode.getId())); if (gameMode == GameType.SPECTATOR) { this.removeEntitiesOnShoulder(); diff --git a/leaf-server/minecraft-patches/features/0211-SparklyPaper-Parallel-world-ticking.patch b/leaf-server/minecraft-patches/features/0211-SparklyPaper-Parallel-world-ticking.patch index 62548aac..6d22d08c 100644 --- a/leaf-server/minecraft-patches/features/0211-SparklyPaper-Parallel-world-ticking.patch +++ b/leaf-server/minecraft-patches/features/0211-SparklyPaper-Parallel-world-ticking.patch @@ -424,7 +424,7 @@ index 8f41326fda8c5f9f6926038508be6c6529b051bc..46e171ca454253c32e22c0c18587e9a7 } } diff --git a/net/minecraft/server/level/ServerLevel.java b/net/minecraft/server/level/ServerLevel.java -index 5b7b05ab3224e3dbc0957589e8d9bb20cd2e0158..c181fc4f895d0ea1e7b61919cc5e6fe90d6a62ae 100644 +index 91752678f887559132921cff61697478e5f44e3d..0b26940e3f1645b6b8d5bd92be4d10fbe17fda58 100644 --- a/net/minecraft/server/level/ServerLevel.java +++ b/net/minecraft/server/level/ServerLevel.java @@ -180,7 +180,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe @@ -664,10 +664,10 @@ index 5b7b05ab3224e3dbc0957589e8d9bb20cd2e0158..c181fc4f895d0ea1e7b61919cc5e6fe9 // Paper start - extra debug info if (entity.valid) { diff --git a/net/minecraft/server/level/ServerPlayer.java b/net/minecraft/server/level/ServerPlayer.java -index 567187499c29fbd159b472278665a824dbb1cfd6..4b359856e2981cfb52f43bab8c088e0e273dad93 100644 +index 72ab1e2ea7571b5fde4c3769249e950b67dc9c82..0314abb98efa62c16363bfc60a24c5db62dc3736 100644 --- a/net/minecraft/server/level/ServerPlayer.java +++ b/net/minecraft/server/level/ServerPlayer.java -@@ -465,6 +465,8 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc +@@ -463,6 +463,8 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc } // Paper end - rewrite chunk system @@ -676,7 +676,7 @@ index 567187499c29fbd159b472278665a824dbb1cfd6..4b359856e2981cfb52f43bab8c088e0e public ServerPlayer(MinecraftServer server, ServerLevel level, GameProfile gameProfile, ClientInformation clientInformation) { super(level, gameProfile); this.textFilter = server.createTextFilterForPlayer(this); -@@ -751,6 +753,7 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc +@@ -749,6 +751,7 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc @Override public void tick() { @@ -684,7 +684,7 @@ index 567187499c29fbd159b472278665a824dbb1cfd6..4b359856e2981cfb52f43bab8c088e0e // CraftBukkit start if (this.joining) { this.joining = false; -@@ -1436,6 +1439,8 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc +@@ -1434,6 +1437,8 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc teleportTransition.postTeleportTransition().onTransition(this); return this; } else { @@ -693,7 +693,7 @@ index 567187499c29fbd159b472278665a824dbb1cfd6..4b359856e2981cfb52f43bab8c088e0e // CraftBukkit start /* this.isChangingDimension = true; -@@ -1782,6 +1787,12 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc +@@ -1780,6 +1785,12 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc return OptionalInt.empty(); } else { // CraftBukkit start @@ -706,7 +706,7 @@ index 567187499c29fbd159b472278665a824dbb1cfd6..4b359856e2981cfb52f43bab8c088e0e this.containerMenu = abstractContainerMenu; // Moved up if (!this.isImmobile()) this.connection -@@ -1846,6 +1857,11 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc +@@ -1844,6 +1855,11 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc } @Override public void closeContainer(org.bukkit.event.inventory.InventoryCloseEvent.Reason reason) { @@ -719,10 +719,10 @@ index 567187499c29fbd159b472278665a824dbb1cfd6..4b359856e2981cfb52f43bab8c088e0e // Paper end - Inventory close reason this.connection.send(new ClientboundContainerClosePacket(this.containerMenu.containerId)); diff --git a/net/minecraft/server/players/PlayerList.java b/net/minecraft/server/players/PlayerList.java -index ff3798fd384679fd8324d4d47e71095024209fe2..8b72f2612c6968c4602a4cb72f3d1160d9679e36 100644 +index 704fbb08d5c1768c3024a7dbd6d7e34da4ab6be7..a478d3f7c8a90682decc5e853d7bbe6f896c02e4 100644 --- a/net/minecraft/server/players/PlayerList.java +++ b/net/minecraft/server/players/PlayerList.java -@@ -251,6 +251,8 @@ public abstract class PlayerList { +@@ -257,6 +257,8 @@ public abstract class PlayerList { // Leaves end - replay mod api public void placeNewPlayer(Connection connection, ServerPlayer player, CommonListenerCookie cookie) { @@ -731,7 +731,7 @@ index ff3798fd384679fd8324d4d47e71095024209fe2..8b72f2612c6968c4602a4cb72f3d1160 player.isRealPlayer = true; // Paper player.loginTime = System.currentTimeMillis(); // Paper - Replace OfflinePlayer#getLastPlayed GameProfile gameProfile = player.getGameProfile(); -@@ -854,6 +856,15 @@ public abstract class PlayerList { +@@ -853,6 +855,15 @@ public abstract class PlayerList { } public ServerPlayer respawn(ServerPlayer player, boolean keepInventory, Entity.RemovalReason reason, @Nullable org.bukkit.event.player.PlayerRespawnEvent.RespawnReason eventReason, @Nullable org.bukkit.Location location) { @@ -747,7 +747,7 @@ index ff3798fd384679fd8324d4d47e71095024209fe2..8b72f2612c6968c4602a4cb72f3d1160 player.stopRiding(); // CraftBukkit this.players.remove(player); this.playersByName.remove(player.getScoreboardName().toLowerCase(java.util.Locale.ROOT)); // Spigot -@@ -865,6 +876,7 @@ public abstract class PlayerList { +@@ -864,6 +875,7 @@ public abstract class PlayerList { ServerPlayer serverPlayer = player; Level fromWorld = player.level(); player.wonGame = false; @@ -849,7 +849,7 @@ index f9e7532f86122a379692561a639a209a126e8bba..fab317d6c9a1c914f19bae11846cb576 if (isLocatorBarEnabledFor(player)) { if (!connection.isBroken()) { diff --git a/net/minecraft/world/entity/Entity.java b/net/minecraft/world/entity/Entity.java -index 129248da7e1bfa5edc1c1a43c98a400f697e735f..4be8e90dfe99663ea84dae04d9bb2b0e3bb01098 100644 +index b87a1a2452cd236b4bdf7a7f12cae03f58833ccd..d3b4c193b82accd424a4201eee2a25b81315ef0c 100644 --- a/net/minecraft/world/entity/Entity.java +++ b/net/minecraft/world/entity/Entity.java @@ -3509,15 +3509,40 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess @@ -1124,7 +1124,7 @@ index 8c713d90e81df61d65fa6770516afc4704bbbb6f..f5ca3d6b29b11475ac56cd206464577b serverLevel.capturedBlockStates.clear(); org.bukkit.event.world.StructureGrowEvent structureEvent = null; diff --git a/net/minecraft/world/level/Level.java b/net/minecraft/world/level/Level.java -index ca39e3bd93f896d5c7b1fc3b9264f64555be5d50..54f03ad9b7f62bf717f32376e81a49bbf600385c 100644 +index 4ba44c325c7a29d398ed10335108bc5c9556e109..93be887352ac5995672a18b7289e5f4d0ca25870 100644 --- a/net/minecraft/world/level/Level.java +++ b/net/minecraft/world/level/Level.java @@ -165,6 +165,7 @@ public abstract class Level implements LevelAccessor, UUIDLookup, AutoCl diff --git a/leaf-server/minecraft-patches/features/0224-Remove-streams-on-PlayerDetector.patch b/leaf-server/minecraft-patches/features/0224-Remove-streams-on-PlayerDetector.patch index 4f74c6be..2e53dbc6 100644 --- a/leaf-server/minecraft-patches/features/0224-Remove-streams-on-PlayerDetector.patch +++ b/leaf-server/minecraft-patches/features/0224-Remove-streams-on-PlayerDetector.patch @@ -6,7 +6,7 @@ Subject: [PATCH] Remove streams on PlayerDetector Dreeam TODO: Merge to single loop diff --git a/net/minecraft/world/level/block/entity/trialspawner/PlayerDetector.java b/net/minecraft/world/level/block/entity/trialspawner/PlayerDetector.java -index 774d4028f0be7c388abb47f8eb97011341f50f59..81d2dfdd8bd2a8b205e4b617911c277a366f0369 100644 +index 438b269e53915f7f00ff894697096157f68cdff8..6e27472deabe86e899d0227d2963d30926a3b114 100644 --- a/net/minecraft/world/level/block/entity/trialspawner/PlayerDetector.java +++ b/net/minecraft/world/level/block/entity/trialspawner/PlayerDetector.java @@ -21,28 +21,45 @@ import net.minecraft.world.phys.Vec3; @@ -72,7 +72,7 @@ index 774d4028f0be7c388abb47f8eb97011341f50f59..81d2dfdd8bd2a8b205e4b617911c277a }; + // Leaf end - Remove streams on PlayerDetector - List detect(ServerLevel level, PlayerDetector.EntitySelector entitySelector, BlockPos pos, double maxDistance, boolean flag); + List detect(ServerLevel level, PlayerDetector.EntitySelector entitySelector, BlockPos pos, double maxDistance, boolean requireLineOfSight); @@ -78,14 +95,31 @@ public interface PlayerDetector { return new PlayerDetector.EntitySelector() { diff --git a/leaf-server/minecraft-patches/features/0235-PaperPR-Add-ticket-on-player-join-to-avoid-chunk-loa.patch b/leaf-server/minecraft-patches/features/0235-PaperPR-Add-ticket-on-player-join-to-avoid-chunk-loa.patch index 1f029592..499024dd 100644 --- a/leaf-server/minecraft-patches/features/0235-PaperPR-Add-ticket-on-player-join-to-avoid-chunk-loa.patch +++ b/leaf-server/minecraft-patches/features/0235-PaperPR-Add-ticket-on-player-join-to-avoid-chunk-loa.patch @@ -15,7 +15,7 @@ The delay is currently set to 2 seconds, however, we may want to adjust this bef fixes Paper#9581 diff --git a/ca/spottedleaf/moonrise/patches/chunk_system/player/RegionizedPlayerChunkLoader.java b/ca/spottedleaf/moonrise/patches/chunk_system/player/RegionizedPlayerChunkLoader.java -index 98054ab2be3fecc5f6a111a11cfe94f1a10419c1..d144a4db620dfdd0dcc803d05b37ad3c32732cf0 100644 +index 19b5e4856d471ebfa49335ed19ced767e57df771..bf33e4d17b076aaf68de4023dd4106efb0a37b7c 100644 --- a/ca/spottedleaf/moonrise/patches/chunk_system/player/RegionizedPlayerChunkLoader.java +++ b/ca/spottedleaf/moonrise/patches/chunk_system/player/RegionizedPlayerChunkLoader.java @@ -48,6 +48,7 @@ public final class RegionizedPlayerChunkLoader { @@ -27,10 +27,10 @@ index 98054ab2be3fecc5f6a111a11cfe94f1a10419c1..d144a4db620dfdd0dcc803d05b37ad3c public static final int GENERATED_TICKET_LEVEL = ChunkHolderManager.FULL_LOADED_TICKET_LEVEL; public static final int LOADED_TICKET_LEVEL = ChunkTaskScheduler.getTicketLevel(ChunkStatus.EMPTY); diff --git a/net/minecraft/server/players/PlayerList.java b/net/minecraft/server/players/PlayerList.java -index 283115b85ba910f7b155354dd536146bb57e378e..5a471d847a483ad4e8eb0d752c40a9cbd004cade 100644 +index a478d3f7c8a90682decc5e853d7bbe6f896c02e4..bdc3ee44125ab070fb432a90cf1b02b009ba31ad 100644 --- a/net/minecraft/server/players/PlayerList.java +++ b/net/minecraft/server/players/PlayerList.java -@@ -435,6 +435,13 @@ public abstract class PlayerList { +@@ -441,6 +441,13 @@ public abstract class PlayerList { // this.broadcastAll(ClientboundPlayerInfoUpdatePacket.createPlayerInitializing(List.of(player))); // CraftBukkit - replaced with loop below // Paper start - Fire PlayerJoinEvent when Player is actually ready; correctly register player BEFORE PlayerJoinEvent, so the entity is valid and doesn't require tick delay hacks player.supressTrackerForLogin = true; diff --git a/leaf-server/minecraft-patches/features/0237-Protocol-Core.patch b/leaf-server/minecraft-patches/features/0237-Protocol-Core.patch index dd213097..501ef890 100644 --- a/leaf-server/minecraft-patches/features/0237-Protocol-Core.patch +++ b/leaf-server/minecraft-patches/features/0237-Protocol-Core.patch @@ -34,10 +34,10 @@ index 9a68042d1efb0da915fc2a302641c9ea6d92f582..225d1604baa2a2c974de5c3ae45d3afd for (int i = 0; i < this.tickables.size(); i++) { this.tickables.get(i).run(); diff --git a/net/minecraft/server/level/ServerPlayer.java b/net/minecraft/server/level/ServerPlayer.java -index bf50cc20f0254ad4115a9db8ca633e219dcfbaa0..20e90a7a57ef25622cd22dcd76e06a0a69c5f42b 100644 +index 0314abb98efa62c16363bfc60a24c5db62dc3736..7c3cb3374e0827021b7accf2235ce9d410eaa1d6 100644 --- a/net/minecraft/server/level/ServerPlayer.java +++ b/net/minecraft/server/level/ServerPlayer.java -@@ -808,6 +808,7 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc +@@ -806,6 +806,7 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc } } // Purpur end - Ridables @@ -46,10 +46,10 @@ index bf50cc20f0254ad4115a9db8ca633e219dcfbaa0..20e90a7a57ef25622cd22dcd76e06a0a private void updatePlayerAttributes() { diff --git a/net/minecraft/server/network/ServerCommonPacketListenerImpl.java b/net/minecraft/server/network/ServerCommonPacketListenerImpl.java -index 7f4257870c5fca902403e246b9ce569b20dbb364..70eb3ea8094bbbd460452935f62579b027a7925f 100644 +index 84030c40f2f91b433b3ccd21e0367d2f8b7c97b6..03cd2af813c3cca167b07115f03f6b5eae6d4185 100644 --- a/net/minecraft/server/network/ServerCommonPacketListenerImpl.java +++ b/net/minecraft/server/network/ServerCommonPacketListenerImpl.java -@@ -176,6 +176,12 @@ public abstract class ServerCommonPacketListenerImpl implements ServerCommonPack +@@ -190,6 +190,12 @@ public abstract class ServerCommonPacketListenerImpl implements ServerCommonPack net.minecraft.network.protocol.PacketUtils.ensureRunningOnSameThread(packet, this, this.server); @@ -63,10 +63,10 @@ index 7f4257870c5fca902403e246b9ce569b20dbb364..70eb3ea8094bbbd460452935f62579b0 final byte[] data = discardedPayload.data(); try { diff --git a/net/minecraft/server/players/PlayerList.java b/net/minecraft/server/players/PlayerList.java -index 5a471d847a483ad4e8eb0d752c40a9cbd004cade..17c173ba83ab8bb7c797923ae06599af20a1eed3 100644 +index bdc3ee44125ab070fb432a90cf1b02b009ba31ad..fd6e21416bb0b82ae6b1f602a168069558f9ad93 100644 --- a/net/minecraft/server/players/PlayerList.java +++ b/net/minecraft/server/players/PlayerList.java -@@ -690,6 +690,7 @@ public abstract class PlayerList { +@@ -689,6 +689,7 @@ public abstract class PlayerList { } public @Nullable net.kyori.adventure.text.Component remove(ServerPlayer player, net.kyori.adventure.text.Component leaveMessage) { org.leavesmc.leaves.protocol.core.LeavesProtocolManager.handlePlayerLeave(player); // Leaves - protocol diff --git a/leaf-server/minecraft-patches/features/0242-Only-tick-items-at-hand.patch b/leaf-server/minecraft-patches/features/0242-Only-tick-items-at-hand.patch index e44a4176..a5d16e04 100644 --- a/leaf-server/minecraft-patches/features/0242-Only-tick-items-at-hand.patch +++ b/leaf-server/minecraft-patches/features/0242-Only-tick-items-at-hand.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Only tick items at hand diff --git a/net/minecraft/server/level/ServerPlayer.java b/net/minecraft/server/level/ServerPlayer.java -index 7eb59771ac977aeeca33abd8d359b180a22215c5..4a39b4ee1ea860a8a47bdad67ac79c74157b6d07 100644 +index 7c3cb3374e0827021b7accf2235ce9d410eaa1d6..8036e3c06f76a1b546c6eae645f27e316315c66e 100644 --- a/net/minecraft/server/level/ServerPlayer.java +++ b/net/minecraft/server/level/ServerPlayer.java -@@ -846,12 +846,19 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc +@@ -844,12 +844,19 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc super.tick(); } @@ -29,7 +29,7 @@ index 7eb59771ac977aeeca33abd8d359b180a22215c5..4a39b4ee1ea860a8a47bdad67ac79c74 if (this.getHealth() != this.lastSentHealth || this.lastSentFood != this.foodData.getFoodLevel() diff --git a/net/minecraft/world/entity/player/Player.java b/net/minecraft/world/entity/player/Player.java -index 2dcc4446f898124dfc9134f9fae892167256d724..34fefafa3d3ed9a336dd57c51d6549b470c22b3a 100644 +index 731f50fa6786557db0a1745442b2ad61a6685375..2f450aa1c9e98fc03071d55b181909f06cb11899 100644 --- a/net/minecraft/world/entity/player/Player.java +++ b/net/minecraft/world/entity/player/Player.java @@ -648,7 +648,14 @@ public abstract class Player extends LivingEntity { diff --git a/leaf-server/minecraft-patches/features/0248-Add-configurable-death-item-drop-knockback-settings.patch b/leaf-server/minecraft-patches/features/0248-Add-configurable-death-item-drop-knockback-settings.patch index cb87482a..a3240b4e 100644 --- a/leaf-server/minecraft-patches/features/0248-Add-configurable-death-item-drop-knockback-settings.patch +++ b/leaf-server/minecraft-patches/features/0248-Add-configurable-death-item-drop-knockback-settings.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Add configurable death item drop knockback settings diff --git a/net/minecraft/server/level/ServerPlayer.java b/net/minecraft/server/level/ServerPlayer.java -index 4a39b4ee1ea860a8a47bdad67ac79c74157b6d07..9ec5f1ebc013b427e92f92d6df722b42aa7f73d7 100644 +index 8036e3c06f76a1b546c6eae645f27e316315c66e..8cb7fa08f442d2d6b87261d3cc9546e31d1ec02b 100644 --- a/net/minecraft/server/level/ServerPlayer.java +++ b/net/minecraft/server/level/ServerPlayer.java -@@ -1065,7 +1065,7 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc +@@ -1063,7 +1063,7 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc if (!keepInventory) { for (ItemStack item : this.getInventory().getContents()) { if (!item.isEmpty() && !EnchantmentHelper.has(item, net.minecraft.world.item.enchantment.EnchantmentEffectComponents.PREVENT_EQUIPMENT_DROP)) { @@ -18,7 +18,7 @@ index 4a39b4ee1ea860a8a47bdad67ac79c74157b6d07..9ec5f1ebc013b427e92f92d6df722b42 } } diff --git a/net/minecraft/world/entity/LivingEntity.java b/net/minecraft/world/entity/LivingEntity.java -index 0ebc6dcb8d76de33dfae2f17e580df2364580359..762dc374d77f615f2a2a4fff9158a9de41d8ab17 100644 +index b19d2066b921d27f03b2c0af06fbf76fcb8d87b5..67d78dccd74eb25fa63619159764210cb8137164 100644 --- a/net/minecraft/world/entity/LivingEntity.java +++ b/net/minecraft/world/entity/LivingEntity.java @@ -4157,9 +4157,9 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin diff --git a/leaf-server/minecraft-patches/features/0251-Optimize-isEyeInFluid.patch b/leaf-server/minecraft-patches/features/0251-Optimize-isEyeInFluid.patch index 47619efa..e11ffdb8 100644 --- a/leaf-server/minecraft-patches/features/0251-Optimize-isEyeInFluid.patch +++ b/leaf-server/minecraft-patches/features/0251-Optimize-isEyeInFluid.patch @@ -79,10 +79,10 @@ index 6c7edbbf3935c40ccb78bee680ea75431718b9bd..fd2f79d976c9587b00380f8b8f784b32 public String toString() { return "Reference{" + this.key + "=" + this.value + "}"; diff --git a/net/minecraft/server/level/ServerPlayer.java b/net/minecraft/server/level/ServerPlayer.java -index 158859a2c87d242d5c51e7ca10362d78c5c46c1f..a16607c165965a7c325909ded75a3cf65440f6f7 100644 +index 8cb7fa08f442d2d6b87261d3cc9546e31d1ec02b..b0e4a7066ab12a0f7890e529f12027b330f0518b 100644 --- a/net/minecraft/server/level/ServerPlayer.java +++ b/net/minecraft/server/level/ServerPlayer.java -@@ -1913,7 +1913,7 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc +@@ -1911,7 +1911,7 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc this.awardStat(Stats.SWIM_ONE_CM, rounded); this.causeFoodExhaustion(this.level().spigotConfig.swimMultiplier * (float) rounded * 0.01F, org.bukkit.event.entity.EntityExhaustionEvent.ExhaustionReason.SWIM); // CraftBukkit - EntityExhaustionEvent // Spigot } @@ -92,7 +92,7 @@ index 158859a2c87d242d5c51e7ca10362d78c5c46c1f..a16607c165965a7c325909ded75a3cf6 if (rounded > 0) { this.awardStat(Stats.WALK_UNDER_WATER_ONE_CM, rounded); diff --git a/net/minecraft/world/entity/Entity.java b/net/minecraft/world/entity/Entity.java -index dc591c4f10ab527af5e5da51fc5ced8afe6364f7..bdac75d6c9805af0363d2d183330318ca2ff82da 100644 +index ab0cf0bff7b477327fd92a20e6c7bc7d62f418d2..ceede6519645cb488ea4152842e00751eef53a6c 100644 --- a/net/minecraft/world/entity/Entity.java +++ b/net/minecraft/world/entity/Entity.java @@ -288,7 +288,14 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess diff --git a/leaf-server/minecraft-patches/features/0277-Op-lock.patch b/leaf-server/minecraft-patches/features/0277-Op-lock.patch index bcd47f94..6ef2de2f 100644 --- a/leaf-server/minecraft-patches/features/0277-Op-lock.patch +++ b/leaf-server/minecraft-patches/features/0277-Op-lock.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Op lock diff --git a/net/minecraft/server/players/PlayerList.java b/net/minecraft/server/players/PlayerList.java -index 570602e0fb00465eed1dcfb923775807c600a7bb..27763ca0ae77d271aa30a3feea76728cad5b4990 100644 +index fd6e21416bb0b82ae6b1f602a168069558f9ad93..bd263adfbd86ee1be674c6bfa26dec40f7c5d307 100644 --- a/net/minecraft/server/players/PlayerList.java +++ b/net/minecraft/server/players/PlayerList.java -@@ -1213,6 +1213,9 @@ public abstract class PlayerList { +@@ -1212,6 +1212,9 @@ public abstract class PlayerList { } public void op(GameProfile profile) { @@ -18,7 +18,7 @@ index 570602e0fb00465eed1dcfb923775807c600a7bb..27763ca0ae77d271aa30a3feea76728c this.ops.add(new ServerOpListEntry(profile, this.server.getOperatorUserPermissionLevel(), this.ops.canBypassPlayerLimit(profile))); ServerPlayer player = this.getPlayer(profile.getId()); if (player != null) { -@@ -1221,6 +1224,9 @@ public abstract class PlayerList { +@@ -1220,6 +1223,9 @@ public abstract class PlayerList { } public void deop(GameProfile profile) { diff --git a/leaf-server/paper-patches/features/0009-Purpur-Server-Paper-Changes.patch b/leaf-server/paper-patches/features/0009-Purpur-Server-Paper-Changes.patch index a985421f..3e163742 100644 --- a/leaf-server/paper-patches/features/0009-Purpur-Server-Paper-Changes.patch +++ b/leaf-server/paper-patches/features/0009-Purpur-Server-Paper-Changes.patch @@ -6,7 +6,7 @@ Subject: [PATCH] Purpur Server Paper Changes Original license: MIT Original project: https://github.com/PurpurMC/Purpur -Commit: 11c030a8f81b2f845a9f2749790692c2d152f284 +Commit: 5053eb0c5dc9662ffb39ae7c39c6ca08c013d898 Patches listed below are removed in this patch, They exists in Gale or Leaf: * "Rebrand.patch" diff --git a/leaf-server/paper-patches/features/0029-Leaves-Protocol-Core.patch b/leaf-server/paper-patches/features/0029-Leaves-Protocol-Core.patch index 257cc1a6..db00ea96 100644 --- a/leaf-server/paper-patches/features/0029-Leaves-Protocol-Core.patch +++ b/leaf-server/paper-patches/features/0029-Leaves-Protocol-Core.patch @@ -6,7 +6,7 @@ Subject: [PATCH] Leaves: Protocol Core Original license: GPLv3 Original project: https://github.com/LeavesMC/Leaves -Commit: 3187d77f57058a81bc04ce7eaac1224f58b03c25 +Commit: aaa2323d60912b65b64c16e7583c5d55f8b4c7c9 diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java index e7d9035c54ef8224f9cca52eb23c5d02ec952c73..4ea1ceac80bd4676bb2c59bc4219903850cc7213 100644 diff --git a/leaf-server/paper-patches/features/0030-Leaves-Replay-Mod-API.patch b/leaf-server/paper-patches/features/0030-Leaves-Replay-Mod-API.patch index 4c07f979..b418ebf5 100644 --- a/leaf-server/paper-patches/features/0030-Leaves-Replay-Mod-API.patch +++ b/leaf-server/paper-patches/features/0030-Leaves-Replay-Mod-API.patch @@ -11,7 +11,7 @@ Original project: https://github.com/LeavesMC/Leaves This patch is Powered by ReplayMod(https://github.com/ReplayMod) diff --git a/src/main/java/io/papermc/paper/plugin/manager/PaperEventManager.java b/src/main/java/io/papermc/paper/plugin/manager/PaperEventManager.java -index 4c003acccdd2dd17918b15316001e52e7670123e..780f3a48152fef6a06dc67bf7fbd1965b13bc4fa 100644 +index 4c003acccdd2dd17918b15316001e52e7670123e..99662395fef09017ff0843da6c482815dd4456d3 100644 --- a/src/main/java/io/papermc/paper/plugin/manager/PaperEventManager.java +++ b/src/main/java/io/papermc/paper/plugin/manager/PaperEventManager.java @@ -40,6 +40,11 @@ class PaperEventManager { @@ -19,7 +19,7 @@ index 4c003acccdd2dd17918b15316001e52e7670123e..780f3a48152fef6a06dc67bf7fbd1965 throw new IllegalStateException(event.getEventName() + " may only be triggered synchronously."); } + // Leaves start - skip photographer -+ if (event instanceof org.bukkit.event.player.PlayerEvent playerEvent && playerEvent.getPlayer() instanceof org.leavesmc.leaves.entity.Photographer) { ++ if (event instanceof org.bukkit.event.player.PlayerEvent playerEvent && playerEvent.getPlayer() instanceof org.leavesmc.leaves.entity.photographer.Photographer) { + return; + } + // Leaves end - skip photographer @@ -27,14 +27,14 @@ index 4c003acccdd2dd17918b15316001e52e7670123e..780f3a48152fef6a06dc67bf7fbd1965 HandlerList handlers = event.getHandlers(); RegisteredListener[] listeners = handlers.getRegisteredListeners(); diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -index 4ea1ceac80bd4676bb2c59bc4219903850cc7213..745f3915afdf22fbbc816bd2be30c274e306ee1d 100644 +index 4ea1ceac80bd4676bb2c59bc4219903850cc7213..b7d2d8395e820076dbf5bf2a68a058b999819b7d 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java @@ -316,6 +316,7 @@ public final class CraftServer implements Server { private final io.papermc.paper.potion.PaperPotionBrewer potionBrewer; public final io.papermc.paper.SparksFly spark; private final ServerConfiguration serverConfig = new PaperServerConfiguration(); -+ private final org.leavesmc.leaves.entity.CraftPhotographerManager photographerManager = new org.leavesmc.leaves.entity.CraftPhotographerManager(); // Leaves ++ private final org.leavesmc.leaves.entity.photographer.CraftPhotographerManager photographerManager = new org.leavesmc.leaves.entity.photographer.CraftPhotographerManager(); // Leaves - replay api // Paper start - Folia region threading API private final io.papermc.paper.threadedregions.scheduler.FallbackRegionScheduler regionizedScheduler = new io.papermc.paper.threadedregions.scheduler.FallbackRegionScheduler(); @@ -54,26 +54,26 @@ index 4ea1ceac80bd4676bb2c59bc4219903850cc7213..745f3915afdf22fbbc816bd2be30c274 + + // Leaves start - replay mod api + @Override -+ public org.leavesmc.leaves.entity.CraftPhotographerManager getPhotographerManager() { ++ public org.leavesmc.leaves.entity.photographer.CraftPhotographerManager getPhotographerManager() { + return photographerManager; + } + // Leaves end - replay mod api } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java -index 476eefebace887064b728f08af40c746b6f70787..beae8a57a0ce9b8e7d81619efe4c39d908869319 100644 +index 476eefebace887064b728f08af40c746b6f70787..cf1a1eb731083ba56cdb9ad857255b1a55e31717 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java @@ -140,6 +140,8 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity { return new CraftHumanEntity(server, (net.minecraft.world.entity.player.Player) entity); } -+ if (entity instanceof org.leavesmc.leaves.replay.ServerPhotographer photographer) { return new org.leavesmc.leaves.entity.CraftPhotographer(server, photographer); } // Leaves - replay mod api ++ if (entity instanceof org.leavesmc.leaves.replay.ServerPhotographer photographer) { return new org.leavesmc.leaves.entity.photographer.CraftPhotographer(server, photographer); } // Leaves - replay mod api + // Special case complex part, since there is no extra entity type for them if (entity instanceof EnderDragonPart complexPart) { if (complexPart.parentMob instanceof EnderDragon) { diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -index 7fb60f68ffb5e8d880d3c8395f64585461d7f5c9..17bea636bd3ce09a01a5358a6a7f9d8c799c1f23 100644 +index 7fb60f68ffb5e8d880d3c8395f64585461d7f5c9..9fd4ee415c4e5ea6f818ff6956c41f59f171d82e 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java @@ -2356,7 +2356,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player, PluginMessa @@ -81,7 +81,7 @@ index 7fb60f68ffb5e8d880d3c8395f64585461d7f5c9..17bea636bd3ce09a01a5358a6a7f9d8c @Override public boolean canSee(Player player) { - return this.canSee((org.bukkit.entity.Entity) player); -+ return !(player instanceof org.leavesmc.leaves.entity.Photographer) && this.canSee((org.bukkit.entity.Entity) player); // Leaves - skip photographer ++ return !(player instanceof org.leavesmc.leaves.entity.photographer.Photographer) && this.canSee((org.bukkit.entity.Entity) player); // Leaves - skip photographer } @Override diff --git a/leaf-server/src/main/java/org/leavesmc/leaves/entity/CraftPhotographer.java b/leaf-server/src/main/java/org/leavesmc/leaves/entity/photographer/CraftPhotographer.java similarity index 97% rename from leaf-server/src/main/java/org/leavesmc/leaves/entity/CraftPhotographer.java rename to leaf-server/src/main/java/org/leavesmc/leaves/entity/photographer/CraftPhotographer.java index fed2005c..1b4d7f72 100644 --- a/leaf-server/src/main/java/org/leavesmc/leaves/entity/CraftPhotographer.java +++ b/leaf-server/src/main/java/org/leavesmc/leaves/entity/photographer/CraftPhotographer.java @@ -1,4 +1,4 @@ -package org.leavesmc.leaves.entity; +package org.leavesmc.leaves.entity.photographer; import net.minecraft.server.level.ServerPlayer; import org.bukkit.craftbukkit.CraftServer; diff --git a/leaf-server/src/main/java/org/leavesmc/leaves/entity/CraftPhotographerManager.java b/leaf-server/src/main/java/org/leavesmc/leaves/entity/photographer/CraftPhotographerManager.java similarity index 98% rename from leaf-server/src/main/java/org/leavesmc/leaves/entity/CraftPhotographerManager.java rename to leaf-server/src/main/java/org/leavesmc/leaves/entity/photographer/CraftPhotographerManager.java index e87d1e72..797d2941 100644 --- a/leaf-server/src/main/java/org/leavesmc/leaves/entity/CraftPhotographerManager.java +++ b/leaf-server/src/main/java/org/leavesmc/leaves/entity/photographer/CraftPhotographerManager.java @@ -1,4 +1,4 @@ -package org.leavesmc.leaves.entity; +package org.leavesmc.leaves.entity.photographer; import com.google.common.collect.Lists; import org.bukkit.Location; diff --git a/leaf-server/src/main/java/org/leavesmc/leaves/protocol/AppleSkinProtocol.java b/leaf-server/src/main/java/org/leavesmc/leaves/protocol/AppleSkinProtocol.java index 41fa5c07..9a22da10 100644 --- a/leaf-server/src/main/java/org/leavesmc/leaves/protocol/AppleSkinProtocol.java +++ b/leaf-server/src/main/java/org/leavesmc/leaves/protocol/AppleSkinProtocol.java @@ -8,6 +8,7 @@ import net.minecraft.world.level.GameRules; import org.dreeam.leaf.config.modules.network.ProtocolSupport; import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.NotNull; +import org.leavesmc.leaves.protocol.core.Context; import org.leavesmc.leaves.protocol.core.LeavesProtocol; import org.leavesmc.leaves.protocol.core.ProtocolHandler; import org.leavesmc.leaves.protocol.core.ProtocolUtils; @@ -16,6 +17,7 @@ import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; +import java.util.UUID; @LeavesProtocol.Register(namespace = "appleskin") public class AppleSkinProtocol implements LeavesProtocol { @@ -32,7 +34,7 @@ public class AppleSkinProtocol implements LeavesProtocol { private static final Map previousExhaustionLevels = new HashMap<>(); private static final Map previousNaturalRegeneration = new HashMap<>(); - private static final Map> subscribedChannels = new HashMap<>(); + private static final Map> subscribedChannels = new HashMap<>(); @Contract("_ -> new") public static ResourceLocation id(String path) { @@ -46,21 +48,24 @@ public class AppleSkinProtocol implements LeavesProtocol { @ProtocolHandler.PlayerLeave public static void onPlayerLoggedOut(@NotNull ServerPlayer player) { - subscribedChannels.remove(player); + subscribedChannels.remove(player.getUUID()); resetPlayerData(player); } @ProtocolHandler.MinecraftRegister(onlyNamespace = true) - public static void onPlayerSubscribed(@NotNull ServerPlayer player, ResourceLocation id) { - subscribedChannels.computeIfAbsent(player, k -> new HashSet<>()).add(id.getPath()); + public static void onPlayerSubscribed(@NotNull Context context, ResourceLocation id) { + subscribedChannels.computeIfAbsent(context.profile().getId(), k -> new HashSet<>()).add(id.getPath()); } @ProtocolHandler.Ticker public static void tick() { - for (Map.Entry> entry : subscribedChannels.entrySet()) { - ServerPlayer player = entry.getKey(); - FoodData data = player.getFoodData(); + for (Map.Entry> entry : subscribedChannels.entrySet()) { + ServerPlayer player = MinecraftServer.getServer().getPlayerList().getPlayer(entry.getKey()); + if (player == null) { + continue; + } + FoodData data = player.getFoodData(); for (String channel : entry.getValue()) { switch (channel) { case "saturation" -> { diff --git a/leaf-server/src/main/java/org/leavesmc/leaves/protocol/chatimage/ChatImageProtocol.java b/leaf-server/src/main/java/org/leavesmc/leaves/protocol/chatimage/ChatImageProtocol.java new file mode 100644 index 00000000..c90207bb --- /dev/null +++ b/leaf-server/src/main/java/org/leavesmc/leaves/protocol/chatimage/ChatImageProtocol.java @@ -0,0 +1,72 @@ +package org.leavesmc.leaves.protocol.chatimage; + +import com.google.gson.Gson; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.level.ServerPlayer; +import org.dreeam.leaf.config.modules.network.ProtocolSupport; +import org.jetbrains.annotations.Contract; +import org.leavesmc.leaves.protocol.core.LeavesProtocol; +import org.leavesmc.leaves.protocol.core.ProtocolHandler; +import org.leavesmc.leaves.protocol.core.ProtocolUtils; + +import java.util.List; +import java.util.Map; +import java.util.UUID; + +import static org.leavesmc.leaves.protocol.chatimage.ServerBlockCache.SERVER_BLOCK_CACHE; + +@LeavesProtocol.Register(namespace = "chatimage") +public class ChatImageProtocol implements LeavesProtocol { + + public static final String PROTOCOL_ID = "chatimage"; + public static final Gson gson = new Gson(); + + @Contract("_ -> new") + public static ResourceLocation id(String path) { + return ResourceLocation.tryBuild(PROTOCOL_ID, path); + } + + @ProtocolHandler.PayloadReceiver(payload = FileChannelPayload.class) + public void serverFileChannelReceived(ServerPlayer player, FileChannelPayload payload) { + MinecraftServer server = MinecraftServer.getServer(); + String res = payload.message(); + ChatImageIndex title = gson.fromJson(res, ChatImageIndex.class); + Map blocks = SERVER_BLOCK_CACHE.createBlock(title, res); + if (title.total != blocks.size()) { + return; + } + List names = SERVER_BLOCK_CACHE.getUsers(title.url); + if (names == null || player == null) { + return; + } + for (UUID uuid : names) { + ServerPlayer serverPlayer = server.getPlayerList().getPlayer(uuid); + if (serverPlayer != null) { + ProtocolUtils.sendPayloadPacket(serverPlayer, new FileInfoChannelPayload("true->" + title.url)); + } + } + } + + @ProtocolHandler.PayloadReceiver(payload = FileInfoChannelPayload.class) + public void serverGetFileChannelReceived(ServerPlayer player, FileInfoChannelPayload packet) { + String url = packet.message(); + Map list = SERVER_BLOCK_CACHE.getBlock(url); + if (list == null) { + ProtocolUtils.sendPayloadPacket(player, new FileInfoChannelPayload("null->" + url)); + SERVER_BLOCK_CACHE.tryAddUser(url, player.getUUID()); + return; + } + for (Map.Entry entry : list.entrySet()) { + ProtocolUtils.sendPayloadPacket(player, new DownloadFileChannelPayload(entry.getValue())); + } + } + + @Override + public boolean isActive() { + return ProtocolSupport.chatImageProtocol; + } + + public record ChatImageIndex(int index, int total, String url, String bytes) { + } +} diff --git a/leaf-server/src/main/java/org/leavesmc/leaves/protocol/chatimage/DownloadFileChannelPayload.java b/leaf-server/src/main/java/org/leavesmc/leaves/protocol/chatimage/DownloadFileChannelPayload.java new file mode 100644 index 00000000..fe40ca62 --- /dev/null +++ b/leaf-server/src/main/java/org/leavesmc/leaves/protocol/chatimage/DownloadFileChannelPayload.java @@ -0,0 +1,18 @@ +package org.leavesmc.leaves.protocol.chatimage; + +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.ByteBufCodecs; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.resources.ResourceLocation; +import org.leavesmc.leaves.protocol.core.LeavesCustomPayload; + +public record DownloadFileChannelPayload(String message) implements LeavesCustomPayload { + + @ID + private static final ResourceLocation ID = ChatImageProtocol.id("download_file_channel"); + + @Codec + private static final StreamCodec CODEC = StreamCodec.composite( + ByteBufCodecs.STRING_UTF8, DownloadFileChannelPayload::message, DownloadFileChannelPayload::new + ); +} diff --git a/leaf-server/src/main/java/org/leavesmc/leaves/protocol/chatimage/FileChannelPayload.java b/leaf-server/src/main/java/org/leavesmc/leaves/protocol/chatimage/FileChannelPayload.java new file mode 100644 index 00000000..8413f6b4 --- /dev/null +++ b/leaf-server/src/main/java/org/leavesmc/leaves/protocol/chatimage/FileChannelPayload.java @@ -0,0 +1,18 @@ +package org.leavesmc.leaves.protocol.chatimage; + +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.ByteBufCodecs; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.resources.ResourceLocation; +import org.leavesmc.leaves.protocol.core.LeavesCustomPayload; + +public record FileChannelPayload(String message) implements LeavesCustomPayload { + + @ID + private static final ResourceLocation ID = ChatImageProtocol.id("get_file_channel"); + + @Codec + private static final StreamCodec CODEC = StreamCodec.composite( + ByteBufCodecs.STRING_UTF8, FileChannelPayload::message, FileChannelPayload::new + ); +} \ No newline at end of file diff --git a/leaf-server/src/main/java/org/leavesmc/leaves/protocol/chatimage/FileInfoChannelPayload.java b/leaf-server/src/main/java/org/leavesmc/leaves/protocol/chatimage/FileInfoChannelPayload.java new file mode 100644 index 00000000..6c54506f --- /dev/null +++ b/leaf-server/src/main/java/org/leavesmc/leaves/protocol/chatimage/FileInfoChannelPayload.java @@ -0,0 +1,18 @@ +package org.leavesmc.leaves.protocol.chatimage; + +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.codec.ByteBufCodecs; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.resources.ResourceLocation; +import org.leavesmc.leaves.protocol.core.LeavesCustomPayload; + +public record FileInfoChannelPayload(String message) implements LeavesCustomPayload { + + @ID + private static final ResourceLocation ID = ChatImageProtocol.id("file_info"); + + @Codec + private static final StreamCodec CODEC = StreamCodec.composite( + ByteBufCodecs.STRING_UTF8, FileInfoChannelPayload::message, FileInfoChannelPayload::new + ); +} \ No newline at end of file diff --git a/leaf-server/src/main/java/org/leavesmc/leaves/protocol/chatimage/ServerBlockCache.java b/leaf-server/src/main/java/org/leavesmc/leaves/protocol/chatimage/ServerBlockCache.java new file mode 100644 index 00000000..de169073 --- /dev/null +++ b/leaf-server/src/main/java/org/leavesmc/leaves/protocol/chatimage/ServerBlockCache.java @@ -0,0 +1,65 @@ +package org.leavesmc.leaves.protocol.chatimage; + +import com.google.common.cache.Cache; +import com.google.common.cache.CacheBuilder; +import com.google.common.collect.Lists; +import org.leavesmc.leaves.LeavesLogger; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.UUID; +import java.util.concurrent.TimeUnit; + +public class ServerBlockCache { + + public static final ServerBlockCache SERVER_BLOCK_CACHE = new ServerBlockCache(); + + public Cache> userCache = CacheBuilder.newBuilder().expireAfterAccess(60, TimeUnit.SECONDS).build(); + public Cache> blockCache = CacheBuilder.newBuilder().expireAfterAccess(60, TimeUnit.SECONDS).build(); + public Cache fileCount = CacheBuilder.newBuilder().expireAfterAccess(60, TimeUnit.SECONDS).build(); + + public Map createBlock(ChatImageProtocol.ChatImageIndex title, String imgBytes) { + try { + Map blocks = this.blockCache.get(title.url(), HashMap::new); + blocks.put(title.index(), imgBytes); + this.blockCache.put(title.url(), blocks); + this.fileCount.put(title.url(), title.total()); + return blocks; + } catch (Exception e) { + LeavesLogger.LOGGER.warning("Failed to create block for title " + title.url() + ": " + e); + return null; + } + } + + public Map getBlock(String url) { + Map list; + Integer total; + if ((list = this.blockCache.getIfPresent(url)) != null && (total = this.fileCount.getIfPresent(url)) != null) { + if (total == list.size()) { + return list; + } + } + return null; + } + + public void tryAddUser(String url, UUID uuid) { + try { + List names = this.userCache.get(url, Lists::newArrayList); + names.add(uuid); + this.userCache.put(url, names); + } catch (Exception e) { + LeavesLogger.LOGGER.warning("Failed to add user " + uuid + ": " + e); + } + } + + public List getUsers(String url) { + List names; + if ((names = this.userCache.getIfPresent(url)) != null) { + this.userCache.put(url, Lists.newArrayList()); + return names; + } else { + return null; + } + } +} \ No newline at end of file diff --git a/leaf-server/src/main/java/org/leavesmc/leaves/protocol/core/Context.java b/leaf-server/src/main/java/org/leavesmc/leaves/protocol/core/Context.java new file mode 100644 index 00000000..ca17fdb0 --- /dev/null +++ b/leaf-server/src/main/java/org/leavesmc/leaves/protocol/core/Context.java @@ -0,0 +1,9 @@ +package org.leavesmc.leaves.protocol.core; + +import com.mojang.authlib.GameProfile; +import net.minecraft.network.Connection; +import org.jetbrains.annotations.NotNull; + +public record Context(@NotNull GameProfile profile, Connection connection) { + +} diff --git a/leaf-server/src/main/java/org/leavesmc/leaves/protocol/core/IdentifierSelector.java b/leaf-server/src/main/java/org/leavesmc/leaves/protocol/core/IdentifierSelector.java new file mode 100644 index 00000000..3fe9d894 --- /dev/null +++ b/leaf-server/src/main/java/org/leavesmc/leaves/protocol/core/IdentifierSelector.java @@ -0,0 +1,11 @@ +package org.leavesmc.leaves.protocol.core; + +import net.minecraft.server.level.ServerPlayer; +import org.jetbrains.annotations.Nullable; + +public record IdentifierSelector(@Nullable Context context, @Nullable ServerPlayer player) { + + public Object select(ProtocolHandler.Stage stage) { + return stage == ProtocolHandler.Stage.CONFIGURATION ? context : player; + } +} \ No newline at end of file diff --git a/leaf-server/src/main/java/org/leavesmc/leaves/protocol/core/LeavesProtocolManager.java b/leaf-server/src/main/java/org/leavesmc/leaves/protocol/core/LeavesProtocolManager.java index 9a51fae0..cf17fc48 100644 --- a/leaf-server/src/main/java/org/leavesmc/leaves/protocol/core/LeavesProtocolManager.java +++ b/leaf-server/src/main/java/org/leavesmc/leaves/protocol/core/LeavesProtocolManager.java @@ -1,7 +1,6 @@ package org.leavesmc.leaves.protocol.core; import io.netty.buffer.ByteBuf; -import io.papermc.paper.connection.PluginMessageBridgeImpl; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.codec.StreamCodec; @@ -15,9 +14,6 @@ import org.leavesmc.leaves.protocol.core.invoker.MinecraftRegisterInvokerHolder; import org.leavesmc.leaves.protocol.core.invoker.PayloadReceiverInvokerHolder; import org.leavesmc.leaves.protocol.core.invoker.PlayerInvokerHolder; -import org.bukkit.Bukkit; -import org.bukkit.craftbukkit.entity.CraftPlayer; - import java.io.File; import java.io.IOException; import java.lang.reflect.Constructor; @@ -238,27 +234,27 @@ public class LeavesProtocolManager { codec.encode(ProtocolUtils.decorate(buf), payload); } - public static void handlePayload(ServerPlayer player, LeavesCustomPayload payload) { + public static void handlePayload(IdentifierSelector selector, LeavesCustomPayload payload) { PayloadReceiverInvokerHolder holder; if ((holder = PAYLOAD_RECEIVERS.get(payload.getClass())) != null) { - holder.invoke(player, payload); + holder.invoke(selector, payload); } } - public static boolean handleBytebuf(ServerPlayer player, ResourceLocation location, ByteBuf buf) { + public static boolean handleBytebuf(IdentifierSelector selector, ResourceLocation location, ByteBuf buf) { RegistryFriendlyByteBuf buf1 = ProtocolUtils.decorate(buf); BytebufReceiverInvokerHolder holder; if ((holder = STRICT_BYTEBUF_RECEIVERS.get(location.toString())) != null) { - holder.invoke(player, buf1); + holder.invoke(selector, buf1); return true; } if ((holder = NAMESPACED_BYTEBUF_RECEIVERS.get(location.getNamespace())) != null) { - if (holder.invoke(player, buf1)) { + if (holder.invoke(selector, buf1)) { return true; } } for (var holder1 : GENERIC_BYTEBUF_RECEIVERS) { - if (holder1.invoke(player, buf1)) { + if (holder1.invoke(selector, buf1)) { return true; } } @@ -298,31 +294,22 @@ public class LeavesProtocolManager { } } - public static void handleMinecraftRegister(String channelId, PluginMessageBridgeImpl bridge) { - ServerPlayer player = null; - if (bridge instanceof CraftPlayer craftPlayer) { - player = craftPlayer.getHandle(); - } - - if (player == null) { - return; - } - + public static void handleMinecraftRegister(String channelId, IdentifierSelector selector) { ResourceLocation location = ResourceLocation.tryParse(channelId); if (location == null) { return; } for (var wildHolder : WILD_MINECRAFT_REGISTER) { - wildHolder.invoke(player, location); + wildHolder.invoke(selector, location); } MinecraftRegisterInvokerHolder holder; if ((holder = STRICT_MINECRAFT_REGISTER.get(location.toString())) != null) { - holder.invoke(player, location); + holder.invoke(selector, location); } if ((holder = NAMESPACED_MINECRAFT_REGISTER.get(location.getNamespace())) != null) { - holder.invoke(player, location); + holder.invoke(selector, location); } } diff --git a/leaf-server/src/main/java/org/leavesmc/leaves/protocol/core/ProtocolHandler.java b/leaf-server/src/main/java/org/leavesmc/leaves/protocol/core/ProtocolHandler.java index 0a36db38..5aefe65d 100644 --- a/leaf-server/src/main/java/org/leavesmc/leaves/protocol/core/ProtocolHandler.java +++ b/leaf-server/src/main/java/org/leavesmc/leaves/protocol/core/ProtocolHandler.java @@ -1,5 +1,7 @@ package org.leavesmc.leaves.protocol.core; +import net.minecraft.server.level.ServerPlayer; + import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @@ -16,6 +18,8 @@ public class ProtocolHandler { @Retention(RetentionPolicy.RUNTIME) public @interface PayloadReceiver { Class payload(); + + Stage stage() default Stage.GAME; } @Target(ElementType.METHOD) @@ -24,6 +28,8 @@ public class ProtocolHandler { String key() default ""; boolean onlyNamespace() default false; + + Stage stage() default Stage.GAME; } @Target(ElementType.METHOD) @@ -53,10 +59,27 @@ public class ProtocolHandler { String key() default ""; boolean onlyNamespace() default false; + + Stage stage() default Stage.CONFIGURATION; } @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface ReloadDataPack { } + + public enum Stage { + CONFIGURATION(Context.class), + GAME(ServerPlayer.class); + + private final Class identifier; + + Stage(Class identifier) { + this.identifier = identifier; + } + + public Class identifier() { + return identifier; + } + } } \ No newline at end of file diff --git a/leaf-server/src/main/java/org/leavesmc/leaves/protocol/core/ProtocolUtils.java b/leaf-server/src/main/java/org/leavesmc/leaves/protocol/core/ProtocolUtils.java index 361660c6..ec6771d7 100644 --- a/leaf-server/src/main/java/org/leavesmc/leaves/protocol/core/ProtocolUtils.java +++ b/leaf-server/src/main/java/org/leavesmc/leaves/protocol/core/ProtocolUtils.java @@ -11,7 +11,10 @@ import net.minecraft.network.protocol.common.custom.DiscardedPayload; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.MinecraftServer; import net.minecraft.server.level.ServerPlayer; +import net.minecraft.server.network.ServerCommonPacketListenerImpl; +import net.minecraft.server.network.ServerGamePacketListenerImpl; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.function.Consumer; import java.util.function.Function; @@ -19,26 +22,50 @@ import java.util.function.Function; public class ProtocolUtils { private static final Function bufDecorator = buf -> buf instanceof RegistryFriendlyByteBuf registry ? registry : new RegistryFriendlyByteBuf(buf, MinecraftServer.getServer().registryAccess()); + private static final byte[] EMPTY = new byte[0]; public static String buildProtocolVersion(String protocol) { return protocol + "-leaves-" + ServerBuildInfo.buildInfo().asString(ServerBuildInfo.StringRepresentation.VERSION_SIMPLE); } public static void sendEmptyPacket(ServerPlayer player, ResourceLocation id) { - player.internalConnection.send(new ClientboundCustomPayloadPacket(new DiscardedPayload(id, null))); + player.connection.send(new ClientboundCustomPayloadPacket(new DiscardedPayload(id, EMPTY))); } public static void sendBytebufPacket(@NotNull ServerPlayer player, ResourceLocation id, Consumer consumer) { RegistryFriendlyByteBuf buf = decorate(Unpooled.buffer()); consumer.accept(buf); - player.internalConnection.send(new ClientboundCustomPayloadPacket(new DiscardedPayload(id, ByteBufUtil.getBytes(buf)))); + player.connection.send(new ClientboundCustomPayloadPacket(new DiscardedPayload(id, ByteBufUtil.getBytes(buf)))); } public static void sendPayloadPacket(ServerPlayer player, CustomPacketPayload payload) { - player.internalConnection.send(new ClientboundCustomPayloadPacket(payload)); + player.connection.send(new ClientboundCustomPayloadPacket(payload)); + } + + public static void sendEmptyPacket(Context context, ResourceLocation id) { + context.connection().send(new ClientboundCustomPayloadPacket(new DiscardedPayload(id, EMPTY))); + } + + public static void sendBytebufPacket(@NotNull Context context, ResourceLocation id, Consumer consumer) { + RegistryFriendlyByteBuf buf = decorate(Unpooled.buffer()); + consumer.accept(buf); + context.connection().send(new ClientboundCustomPayloadPacket(new DiscardedPayload(id, ByteBufUtil.getBytes(buf)))); + } + + public static void sendPayloadPacket(Context context, CustomPacketPayload payload) { + context.connection().send(new ClientboundCustomPayloadPacket(payload)); } public static RegistryFriendlyByteBuf decorate(ByteBuf buf) { return bufDecorator.apply(buf); } + + public static IdentifierSelector createSelector(ServerCommonPacketListenerImpl common) { + ServerPlayer player = common instanceof ServerGamePacketListenerImpl game ? game.getPlayer() : null; + return new IdentifierSelector(new Context(common.profile, common.connection), player); + } + + public static ByteBuf wrapNullable(byte @Nullable [] data) { + return data == null ? Unpooled.wrappedBuffer(EMPTY) : Unpooled.wrappedBuffer(data); + } } diff --git a/leaf-server/src/main/java/org/leavesmc/leaves/protocol/core/invoker/AbstractInvokerHolder.java b/leaf-server/src/main/java/org/leavesmc/leaves/protocol/core/invoker/AbstractInvokerHolder.java index 1cac9120..1e974b1b 100644 --- a/leaf-server/src/main/java/org/leavesmc/leaves/protocol/core/invoker/AbstractInvokerHolder.java +++ b/leaf-server/src/main/java/org/leavesmc/leaves/protocol/core/invoker/AbstractInvokerHolder.java @@ -14,6 +14,7 @@ public abstract class AbstractInvokerHolder { protected final T handler; protected final Class returnType; protected final Class[] parameterTypes; + protected final boolean isStatic; protected AbstractInvokerHolder(LeavesProtocol owner, Method invoker, T handler, @Nullable Class returnType, @NotNull Class... parameterTypes) { this.owner = owner; @@ -21,6 +22,7 @@ public abstract class AbstractInvokerHolder { this.handler = handler; this.returnType = returnType; this.parameterTypes = parameterTypes; + this.isStatic = Modifier.isStatic(invoker.getModifiers()); validateMethodSignature(); } @@ -58,7 +60,7 @@ public abstract class AbstractInvokerHolder { return null; } try { - if (Modifier.isStatic(invoker.getModifiers())) { + if (isStatic) { return invoker.invoke(null, args); } else { return invoker.invoke(owner, args); diff --git a/leaf-server/src/main/java/org/leavesmc/leaves/protocol/core/invoker/BytebufReceiverInvokerHolder.java b/leaf-server/src/main/java/org/leavesmc/leaves/protocol/core/invoker/BytebufReceiverInvokerHolder.java index e2c01b8e..577b630e 100644 --- a/leaf-server/src/main/java/org/leavesmc/leaves/protocol/core/invoker/BytebufReceiverInvokerHolder.java +++ b/leaf-server/src/main/java/org/leavesmc/leaves/protocol/core/invoker/BytebufReceiverInvokerHolder.java @@ -1,7 +1,7 @@ package org.leavesmc.leaves.protocol.core.invoker; import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.server.level.ServerPlayer; +import org.leavesmc.leaves.protocol.core.IdentifierSelector; import org.leavesmc.leaves.protocol.core.LeavesProtocol; import org.leavesmc.leaves.protocol.core.ProtocolHandler; @@ -9,10 +9,10 @@ import java.lang.reflect.Method; public class BytebufReceiverInvokerHolder extends AbstractInvokerHolder { public BytebufReceiverInvokerHolder(LeavesProtocol owner, Method invoker, ProtocolHandler.BytebufReceiver handler) { - super(owner, invoker, handler, null, ServerPlayer.class, FriendlyByteBuf.class); + super(owner, invoker, handler, null, handler.stage().identifier(), FriendlyByteBuf.class); } - public boolean invoke(ServerPlayer player, FriendlyByteBuf buf) { - return invoke0(false, player, buf) instanceof Boolean b && b; + public boolean invoke(IdentifierSelector selector, FriendlyByteBuf buf) { + return invoke0(false, selector.select(handler.stage()), buf) instanceof Boolean b && b; } } diff --git a/leaf-server/src/main/java/org/leavesmc/leaves/protocol/core/invoker/MinecraftRegisterInvokerHolder.java b/leaf-server/src/main/java/org/leavesmc/leaves/protocol/core/invoker/MinecraftRegisterInvokerHolder.java index c6766bc7..5960042d 100644 --- a/leaf-server/src/main/java/org/leavesmc/leaves/protocol/core/invoker/MinecraftRegisterInvokerHolder.java +++ b/leaf-server/src/main/java/org/leavesmc/leaves/protocol/core/invoker/MinecraftRegisterInvokerHolder.java @@ -1,7 +1,7 @@ package org.leavesmc.leaves.protocol.core.invoker; import net.minecraft.resources.ResourceLocation; -import net.minecraft.server.level.ServerPlayer; +import org.leavesmc.leaves.protocol.core.IdentifierSelector; import org.leavesmc.leaves.protocol.core.LeavesProtocol; import org.leavesmc.leaves.protocol.core.ProtocolHandler; @@ -9,10 +9,10 @@ import java.lang.reflect.Method; public class MinecraftRegisterInvokerHolder extends AbstractInvokerHolder { public MinecraftRegisterInvokerHolder(LeavesProtocol owner, Method invoker, ProtocolHandler.MinecraftRegister handler) { - super(owner, invoker, handler, null, ServerPlayer.class, ResourceLocation.class); + super(owner, invoker, handler, null, handler.stage().identifier(), ResourceLocation.class); } - public void invoke(ServerPlayer player, ResourceLocation id) { - invoke0(false, player, id); + public void invoke(IdentifierSelector selector, ResourceLocation id) { + invoke0(false, selector.select(handler.stage()), id); } } diff --git a/leaf-server/src/main/java/org/leavesmc/leaves/protocol/core/invoker/PayloadReceiverInvokerHolder.java b/leaf-server/src/main/java/org/leavesmc/leaves/protocol/core/invoker/PayloadReceiverInvokerHolder.java index bed868b5..2801bff1 100644 --- a/leaf-server/src/main/java/org/leavesmc/leaves/protocol/core/invoker/PayloadReceiverInvokerHolder.java +++ b/leaf-server/src/main/java/org/leavesmc/leaves/protocol/core/invoker/PayloadReceiverInvokerHolder.java @@ -1,6 +1,6 @@ package org.leavesmc.leaves.protocol.core.invoker; -import net.minecraft.server.level.ServerPlayer; +import org.leavesmc.leaves.protocol.core.IdentifierSelector; import org.leavesmc.leaves.protocol.core.LeavesCustomPayload; import org.leavesmc.leaves.protocol.core.LeavesProtocol; import org.leavesmc.leaves.protocol.core.ProtocolHandler; @@ -9,10 +9,10 @@ import java.lang.reflect.Method; public class PayloadReceiverInvokerHolder extends AbstractInvokerHolder { public PayloadReceiverInvokerHolder(LeavesProtocol owner, Method invoker, ProtocolHandler.PayloadReceiver handler) { - super(owner, invoker, handler, null, ServerPlayer.class, handler.payload()); + super(owner, invoker, handler, null, handler.stage().identifier(), handler.payload()); } - public void invoke(ServerPlayer player, LeavesCustomPayload payload) { - invoke0(false, player, payload); + public void invoke(IdentifierSelector selector, LeavesCustomPayload payload) { + invoke0(false, selector.select(handler.stage()), payload); } } diff --git a/leaf-server/src/main/java/org/leavesmc/leaves/protocol/jade/JadeProtocol.java b/leaf-server/src/main/java/org/leavesmc/leaves/protocol/jade/JadeProtocol.java index bbee5f77..fecc29c5 100644 --- a/leaf-server/src/main/java/org/leavesmc/leaves/protocol/jade/JadeProtocol.java +++ b/leaf-server/src/main/java/org/leavesmc/leaves/protocol/jade/JadeProtocol.java @@ -92,7 +92,7 @@ import java.util.Set; public class JadeProtocol implements LeavesProtocol { public static final String PROTOCOL_ID = "jade"; - public static final String PROTOCOL_VERSION = "7"; + public static final String PROTOCOL_VERSION = "8"; public static final HierarchyLookup> entityDataProviders = new HierarchyLookup<>(Entity.class); public static final PairHierarchyLookup> blockDataProviders = new PairHierarchyLookup<>(new HierarchyLookup<>(Block.class), new HierarchyLookup<>(BlockEntity.class)); public static final WrappedHierarchyLookup> itemStorageProviders = WrappedHierarchyLookup.forAccessor(); diff --git a/leaf-server/src/main/java/org/leavesmc/leaves/protocol/jade/accessor/Accessor.java b/leaf-server/src/main/java/org/leavesmc/leaves/protocol/jade/accessor/Accessor.java index 6bc22532..7ea35779 100644 --- a/leaf-server/src/main/java/org/leavesmc/leaves/protocol/jade/accessor/Accessor.java +++ b/leaf-server/src/main/java/org/leavesmc/leaves/protocol/jade/accessor/Accessor.java @@ -3,13 +3,13 @@ package org.leavesmc.leaves.protocol.jade.accessor; import net.minecraft.nbt.Tag; import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.codec.StreamEncoder; +import net.minecraft.server.level.ServerLevel; import net.minecraft.world.entity.player.Player; -import net.minecraft.world.level.Level; import net.minecraft.world.phys.HitResult; import org.jetbrains.annotations.Nullable; public interface Accessor { - Level getLevel(); + ServerLevel getLevel(); Player getPlayer(); diff --git a/leaf-server/src/main/java/org/leavesmc/leaves/protocol/jade/accessor/AccessorImpl.java b/leaf-server/src/main/java/org/leavesmc/leaves/protocol/jade/accessor/AccessorImpl.java index a6d91d97..c6e7829a 100644 --- a/leaf-server/src/main/java/org/leavesmc/leaves/protocol/jade/accessor/AccessorImpl.java +++ b/leaf-server/src/main/java/org/leavesmc/leaves/protocol/jade/accessor/AccessorImpl.java @@ -5,8 +5,8 @@ import net.minecraft.nbt.ByteArrayTag; import net.minecraft.nbt.Tag; import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.codec.StreamEncoder; +import net.minecraft.server.level.ServerLevel; import net.minecraft.world.entity.player.Player; -import net.minecraft.world.level.Level; import net.minecraft.world.phys.HitResult; import org.apache.commons.lang3.ArrayUtils; @@ -14,20 +14,20 @@ import java.util.function.Supplier; public abstract class AccessorImpl implements Accessor { - private final Level level; + private final ServerLevel level; private final Player player; private final Supplier hit; protected boolean verify; private RegistryFriendlyByteBuf buffer; - public AccessorImpl(Level level, Player player, Supplier hit) { + public AccessorImpl(ServerLevel level, Player player, Supplier hit) { this.level = level; this.player = player; this.hit = hit; } @Override - public Level getLevel() { + public ServerLevel getLevel() { return level; } diff --git a/leaf-server/src/main/java/org/leavesmc/leaves/protocol/jade/accessor/BlockAccessor.java b/leaf-server/src/main/java/org/leavesmc/leaves/protocol/jade/accessor/BlockAccessor.java index 133415a3..b981cdd0 100644 --- a/leaf-server/src/main/java/org/leavesmc/leaves/protocol/jade/accessor/BlockAccessor.java +++ b/leaf-server/src/main/java/org/leavesmc/leaves/protocol/jade/accessor/BlockAccessor.java @@ -1,8 +1,8 @@ package org.leavesmc.leaves.protocol.jade.accessor; import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerLevel; import net.minecraft.world.entity.player.Player; -import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.state.BlockState; @@ -23,7 +23,7 @@ public interface BlockAccessor extends Accessor { @ApiStatus.NonExtendable interface Builder { - Builder level(Level level); + Builder level(ServerLevel level); Builder player(Player player); diff --git a/leaf-server/src/main/java/org/leavesmc/leaves/protocol/jade/accessor/BlockAccessorImpl.java b/leaf-server/src/main/java/org/leavesmc/leaves/protocol/jade/accessor/BlockAccessorImpl.java index a94bb9eb..cfcf71b1 100644 --- a/leaf-server/src/main/java/org/leavesmc/leaves/protocol/jade/accessor/BlockAccessorImpl.java +++ b/leaf-server/src/main/java/org/leavesmc/leaves/protocol/jade/accessor/BlockAccessorImpl.java @@ -6,10 +6,10 @@ import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.codec.ByteBufCodecs; import net.minecraft.network.codec.StreamCodec; +import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.entity.BlockEntity; @@ -61,14 +61,14 @@ public class BlockAccessorImpl extends AccessorImpl implements B } public static class Builder implements BlockAccessor.Builder { - private Level level; + private ServerLevel level; private Player player; private BlockHitResult hit; private BlockState blockState = Blocks.AIR.defaultBlockState(); private Supplier blockEntity; @Override - public Builder level(Level level) { + public Builder level(ServerLevel level) { this.level = level; return this; } diff --git a/leaf-server/src/main/java/org/leavesmc/leaves/protocol/jade/accessor/EntityAccessor.java b/leaf-server/src/main/java/org/leavesmc/leaves/protocol/jade/accessor/EntityAccessor.java index 00fd87b7..f46108cf 100644 --- a/leaf-server/src/main/java/org/leavesmc/leaves/protocol/jade/accessor/EntityAccessor.java +++ b/leaf-server/src/main/java/org/leavesmc/leaves/protocol/jade/accessor/EntityAccessor.java @@ -1,8 +1,8 @@ package org.leavesmc.leaves.protocol.jade.accessor; +import net.minecraft.server.level.ServerLevel; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.player.Player; -import net.minecraft.world.level.Level; import net.minecraft.world.phys.EntityHitResult; import org.jetbrains.annotations.ApiStatus; @@ -19,7 +19,7 @@ public interface EntityAccessor extends Accessor { @ApiStatus.NonExtendable interface Builder { - Builder level(Level level); + Builder level(ServerLevel level); Builder player(Player player); diff --git a/leaf-server/src/main/java/org/leavesmc/leaves/protocol/jade/accessor/EntityAccessorImpl.java b/leaf-server/src/main/java/org/leavesmc/leaves/protocol/jade/accessor/EntityAccessorImpl.java index 56166c62..6486f4e9 100644 --- a/leaf-server/src/main/java/org/leavesmc/leaves/protocol/jade/accessor/EntityAccessorImpl.java +++ b/leaf-server/src/main/java/org/leavesmc/leaves/protocol/jade/accessor/EntityAccessorImpl.java @@ -4,10 +4,10 @@ import com.google.common.base.Suppliers; import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.codec.ByteBufCodecs; import net.minecraft.network.codec.StreamCodec; +import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.player.Player; -import net.minecraft.world.level.Level; import net.minecraft.world.phys.EntityHitResult; import net.minecraft.world.phys.Vec3; import org.jetbrains.annotations.NotNull; @@ -41,13 +41,13 @@ public class EntityAccessorImpl extends AccessorImpl implements } public static class Builder implements EntityAccessor.Builder { - private Level level; + private ServerLevel level; private Player player; private Supplier hit; private Supplier entity; @Override - public Builder level(Level level) { + public Builder level(ServerLevel level) { this.level = level; return this; } diff --git a/leaf-server/src/main/java/org/leavesmc/leaves/protocol/jade/payload/ServerHandshakePayload.java b/leaf-server/src/main/java/org/leavesmc/leaves/protocol/jade/payload/ServerHandshakePayload.java index 4955e0e1..3a12a8cc 100644 --- a/leaf-server/src/main/java/org/leavesmc/leaves/protocol/jade/payload/ServerHandshakePayload.java +++ b/leaf-server/src/main/java/org/leavesmc/leaves/protocol/jade/payload/ServerHandshakePayload.java @@ -17,7 +17,12 @@ import java.util.Map; import static org.leavesmc.leaves.protocol.jade.util.JadeCodec.PRIMITIVE_STREAM_CODEC; -public record ServerHandshakePayload(Map serverConfig, List shearableBlocks, List blockProviderIds, List entityProviderIds) implements LeavesCustomPayload { +public record ServerHandshakePayload( + Map serverConfig, + List shearableBlocks, + List blockProviderIds, + List entityProviderIds +) implements LeavesCustomPayload { @ID private static final ResourceLocation PACKET_SERVER_HANDSHAKE = JadeProtocol.id("server_handshake"); diff --git a/leaf-server/src/main/java/org/leavesmc/leaves/protocol/jade/provider/ItemStorageExtensionProvider.java b/leaf-server/src/main/java/org/leavesmc/leaves/protocol/jade/provider/ItemStorageExtensionProvider.java index 2999e795..24f88873 100644 --- a/leaf-server/src/main/java/org/leavesmc/leaves/protocol/jade/provider/ItemStorageExtensionProvider.java +++ b/leaf-server/src/main/java/org/leavesmc/leaves/protocol/jade/provider/ItemStorageExtensionProvider.java @@ -13,7 +13,6 @@ import net.minecraft.world.entity.vehicle.ContainerEntity; import net.minecraft.world.inventory.PlayerEnderChestContainer; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.ChestBlock; -import net.minecraft.world.level.block.EnderChestBlock; import net.minecraft.world.level.block.entity.BaseContainerBlockEntity; import net.minecraft.world.level.block.entity.ChestBlockEntity; import net.minecraft.world.level.block.entity.EnderChestBlockEntity; @@ -58,7 +57,11 @@ public enum ItemStorageExtensionProvider implements IServerExtensionProvider { return null; } long currentVersion = iterator.getVersion(container); - long gameTime = request.getLevel().getGameTime(); + long gameTime = request.getLevel().getServer().getTickCount(); if (mergedResult != null && iterator.isFinished()) { if (version == currentVersion) { return mergedResult; // content not changed @@ -73,7 +73,7 @@ public class ItemCollector { items.addTo(def, stack.getCount()); } }); - iterator.afterPopulate(count.get()); + iterator.afterPopulate(container, count.get()); if (mergedResult != null && !iterator.isFinished()) { updateCollectingProgress(mergedResult.getFirst()); return mergedResult; diff --git a/leaf-server/src/main/java/org/leavesmc/leaves/protocol/jade/util/ItemIterator.java b/leaf-server/src/main/java/org/leavesmc/leaves/protocol/jade/util/ItemIterator.java index 4d65e9a8..08ebca52 100644 --- a/leaf-server/src/main/java/org/leavesmc/leaves/protocol/jade/util/ItemIterator.java +++ b/leaf-server/src/main/java/org/leavesmc/leaves/protocol/jade/util/ItemIterator.java @@ -15,6 +15,7 @@ public abstract class ItemIterator { protected final int fromIndex; protected boolean finished; protected int currentIndex; + protected float progress; protected ItemIterator(Function containerFinder, int fromIndex) { this.containerFinder = containerFinder; @@ -35,16 +36,19 @@ public abstract class ItemIterator { public abstract Stream populate(T container); + protected abstract int getSlotCount(T container); + public void reset() { currentIndex = fromIndex; finished = false; } - public void afterPopulate(int count) { + public void afterPopulate(T container, int count) { currentIndex += count; if (count == 0 || currentIndex >= 10000) { finished = true; } + progress = (float) (currentIndex - fromIndex) / (getSlotCount(container) - fromIndex); } public float getCollectingProgress() { @@ -52,14 +56,11 @@ public abstract class ItemIterator { } public static abstract class SlottedItemIterator extends ItemIterator { - protected float progress; public SlottedItemIterator(Function containerFinder, int fromIndex) { super(containerFinder, fromIndex); } - protected abstract int getSlotCount(T container); - protected abstract ItemStack getItemInSlot(T container, int slot); @Override @@ -70,7 +71,6 @@ public abstract class ItemIterator { toIndex = slotCount; finished = true; } - progress = (float) (currentIndex - fromIndex) / (slotCount - fromIndex); return IntStream.range(currentIndex, toIndex).mapToObj(slot -> getItemInSlot(container, slot)); } diff --git a/leaf-server/src/main/java/org/leavesmc/leaves/protocol/syncmatica/ServerPlacement.java b/leaf-server/src/main/java/org/leavesmc/leaves/protocol/syncmatica/ServerPlacement.java index 2c7ca6c1..d75bd86b 100644 --- a/leaf-server/src/main/java/org/leavesmc/leaves/protocol/syncmatica/ServerPlacement.java +++ b/leaf-server/src/main/java/org/leavesmc/leaves/protocol/syncmatica/ServerPlacement.java @@ -28,12 +28,20 @@ public class ServerPlacement { public ServerPlacement(final UUID id, final String fileName, final UUID hashValue, final PlayerIdentifier owner) { this.id = id; - this.fileName = fileName; + this.fileName = removeExtension(fileName); this.hashValue = hashValue; this.owner = owner; lastModifiedBy = owner; } + private static String removeExtension(final String fileName) { + final int pos = fileName.lastIndexOf("."); + if (pos < 0) { + return fileName; + } + return fileName.substring(0, pos); + } + @Nullable public static ServerPlacement fromJson(final @NotNull JsonObject obj) { if (obj.has("id") diff --git a/leaf-server/src/main/java/org/leavesmc/leaves/protocol/syncmatica/SyncmaticaProtocol.java b/leaf-server/src/main/java/org/leavesmc/leaves/protocol/syncmatica/SyncmaticaProtocol.java index c3a04132..e7430473 100644 --- a/leaf-server/src/main/java/org/leavesmc/leaves/protocol/syncmatica/SyncmaticaProtocol.java +++ b/leaf-server/src/main/java/org/leavesmc/leaves/protocol/syncmatica/SyncmaticaProtocol.java @@ -1,5 +1,6 @@ package org.leavesmc.leaves.protocol.syncmatica; +import org.apache.commons.io.FilenameUtils; import org.dreeam.leaf.config.modules.network.ProtocolSupport; import org.jetbrains.annotations.NotNull; @@ -81,11 +82,16 @@ public class SyncmaticaProtocol { @NotNull public static String sanitizeFileName(final @NotNull String badFileName) { + String input = badFileName; + try { + input = FilenameUtils.getName(input); + } catch (Exception ignored) { + } final StringBuilder sanitized = new StringBuilder(); - final int len = badFileName.codePointCount(0, badFileName.length()); + final int len = input.codePointCount(0, input.length()); for (int i = 0; i < len; i++) { - final int c = badFileName.codePointAt(i); + final int c = input.codePointAt(i); if (Arrays.binarySearch(ILLEGAL_CHARS, c) < 0) { sanitized.appendCodePoint(c); if (sanitized.length() == 255) { diff --git a/leaf-server/src/main/java/org/leavesmc/leaves/replay/ServerPhotographer.java b/leaf-server/src/main/java/org/leavesmc/leaves/replay/ServerPhotographer.java index 592b5d5f..bb45d241 100644 --- a/leaf-server/src/main/java/org/leavesmc/leaves/replay/ServerPhotographer.java +++ b/leaf-server/src/main/java/org/leavesmc/leaves/replay/ServerPhotographer.java @@ -14,8 +14,8 @@ import org.bukkit.craftbukkit.CraftWorld; import org.jetbrains.annotations.NotNull; import org.leavesmc.leaves.LeavesLogger; import org.leavesmc.leaves.bot.BotStatsCounter; -import org.leavesmc.leaves.entity.CraftPhotographer; -import org.leavesmc.leaves.entity.Photographer; +import org.leavesmc.leaves.entity.photographer.CraftPhotographer; +import org.leavesmc.leaves.entity.photographer.Photographer; import java.io.File; import java.io.IOException; @@ -77,7 +77,7 @@ public class ServerPhotographer extends ServerPlayer { super.tick(); super.doTick(); - if (this.server.getTickCount() % 10 == 0) { + if (this.getServer().getTickCount() % 10 == 0) { connection.resetPosition(); this.level().chunkSource.move(this); } @@ -129,7 +129,7 @@ public class ServerPhotographer extends ServerPlayer { super.remove(RemovalReason.KILLED); photographers.remove(this); this.recorder.stop(); - this.server.getPlayerList().removePhotographer(this); + this.getServer().getPlayerList().removePhotographer(this); LeavesLogger.LOGGER.info("Photographer " + createState.id + " removed");