diff --git a/.github/workflows/build-1216.yml b/.github/workflows/build-1217.yml
similarity index 85%
rename from .github/workflows/build-1216.yml
rename to .github/workflows/build-1217.yml
index e903cae1..8ddcc0b1 100644
--- a/.github/workflows/build-1216.yml
+++ b/.github/workflows/build-1217.yml
@@ -1,8 +1,8 @@
-name: Build Leaf 1.21.6
+name: Build Leaf 1.21.7
on:
push:
- branches: [ "ver/1.21.6" ]
+ branches: [ "ver/1.21.7" ]
workflow_dispatch:
jobs:
@@ -13,12 +13,12 @@ jobs:
GRADLE_MEMORY: "-Xmx4g -XX:MaxMetaspaceSize=2g"
steps:
- name: Checkout repository
- uses: actions/checkout@v4.2.2
+ uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Setup Gradle Cache
- uses: useblacksmith/cache@v5.0.2
+ uses: useblacksmith/cache@v5
with:
path: |
~/.gradle/caches/modules-2
@@ -40,7 +40,7 @@ jobs:
find ~/.gradle/caches -name "*.lock" -type f -delete || echo "No lock files found"
- name: Setup java
- uses: useblacksmith/setup-java@v5.0.1
+ uses: useblacksmith/setup-java@v5
with:
distribution: 'temurin'
java-version: '21'
@@ -91,17 +91,17 @@ jobs:
BUILD_NUMBER: ${{ env.BUILD_NUMBER }}
- name: Upload Leaf
- uses: actions/upload-artifact@v4.6.2
+ uses: actions/upload-artifact@v4
with:
- name: Leaf 1.21.6
- path: ./leaf-1.21.6-${{ env.BUILD_NUMBER }}.jar
+ name: Leaf 1.21.7
+ path: ./leaf-1.21.7-${{ env.BUILD_NUMBER }}.jar
- name: Release Leaf
- uses: softprops/action-gh-release@v2.3.2
+ uses: softprops/action-gh-release@v2
with:
- name: "Leaf 1.21.6"
- tag_name: "ver-1.21.6"
- files: "./leaf-1.21.6-${{ env.BUILD_NUMBER }}.jar"
+ name: "Leaf 1.21.7"
+ tag_name: "ver-1.21.7"
+ files: "./leaf-1.21.7-${{ env.BUILD_NUMBER }}.jar"
body_path: "./release_notes.md"
token: "${{ secrets.GITHUB_TOKEN }}"
target_commitish: "${{ github.sha }}"
@@ -111,21 +111,21 @@ jobs:
- name: Calculate SHA-256
id: hash
run: |
- FILE_NAME="leaf-1.21.6-${{ env.BUILD_NUMBER }}.jar"
+ FILE_NAME="leaf-1.21.7-${{ env.BUILD_NUMBER }}.jar"
HASH=$(sha256sum "$FILE_NAME" | awk '{ print $1 }')
echo "sha256=$HASH" >> $GITHUB_OUTPUT
- name: Upload JAR to download API
- uses: appleboy/scp-action@v1.0.0
+ uses: appleboy/scp-action@v1
with:
host: ${{ secrets.API_HOST }}
username: ${{ secrets.API_USER }}
password: ${{ secrets.API_PASS }}
- source: "./leaf-1.21.6-${{ env.BUILD_NUMBER }}.jar"
+ source: "./leaf-1.21.7-${{ env.BUILD_NUMBER }}.jar"
target: "~/api/uploads/"
- name: Insert build to download API
- uses: appleboy/ssh-action@v1.2.2
+ uses: appleboy/ssh-action@v1
with:
host: ${{ secrets.API_HOST }}
username: ${{ secrets.API_USER }}
@@ -141,11 +141,11 @@ jobs:
node insertBuild.js \
--projectName leaf \
--projectFriendlyName "Leaf" \
- --version 1.21.6 \
- --versionGroupName 1.21.6 \
- --versionName 1.21.6 \
+ --version 1.21.7 \
+ --versionGroupName 1.21.7 \
+ --versionName 1.21.7 \
--build-number ${{ env.BUILD_NUMBER }} \
--repositoryPath "$REPO_DIR" \
--storagePath /root/api/storage \
- --download "primary:/root/api/uploads/leaf-1.21.6-${{ env.BUILD_NUMBER }}.jar:${{ steps.hash.outputs.sha256 }}" \
+ --download "primary:/root/api/uploads/leaf-1.21.7-${{ env.BUILD_NUMBER }}.jar:${{ steps.hash.outputs.sha256 }}" \
--buildChannel default
diff --git a/.github/workflows/build-pr.yml b/.github/workflows/build-pr.yml
index 33b9e6ca..aacd9364 100644
--- a/.github/workflows/build-pr.yml
+++ b/.github/workflows/build-pr.yml
@@ -2,7 +2,7 @@ name: Build Pull Request
on:
pull_request:
- branches: [ "ver/1.21.6" ]
+ branches: [ "ver/1.21.7" ]
jobs:
build:
@@ -12,7 +12,7 @@ jobs:
steps:
- name: Checkout repository
- uses: actions/checkout@main
+ uses: actions/checkout@v4
- name: Setup java
uses: useblacksmith/setup-java@v5
@@ -34,9 +34,9 @@ jobs:
- name: Rename Paperclip JARs
run: |
- mv leaf-server/build/libs/leaf-paperclip-1.21.6-R0.1-SNAPSHOT-mojmap.jar ./leaf-1.21.6.jar
+ mv leaf-server/build/libs/leaf-paperclip-1.21.7-R0.1-SNAPSHOT-mojmap.jar ./leaf-1.21.7.jar
- name: Upload Leaf as build artifact
- uses: actions/upload-artifact@main
+ uses: actions/upload-artifact@v4
with:
- name: Leaf 1.21.6
- path: ./leaf-1.21.6.jar
+ name: Leaf 1.21.7
+ path: ./leaf-1.21.7.jar
diff --git a/.github/workflows/publish-api.yml b/.github/workflows/publish-api.yml
index 3efd3633..07d6cd88 100644
--- a/.github/workflows/publish-api.yml
+++ b/.github/workflows/publish-api.yml
@@ -1,7 +1,8 @@
name: Publish API
+
on:
push:
- branches: [ "ver/1.21.6" ]
+ branches: [ "ver/1.21.7" ]
jobs:
build:
@@ -11,12 +12,12 @@ jobs:
GRADLE_MEMORY: "-Xmx4g -XX:MaxMetaspaceSize=2g"
steps:
- name: Checkout repository
- uses: actions/checkout@main
+ uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Set up GraalVM JDK 21
- uses: graalvm/setup-graalvm@main
+ uses: graalvm/setup-graalvm@v1
with:
java-version: 21
github-token: "${{ secrets.GITHUB_TOKEN }}"
diff --git a/README.md b/README.md
index 60715a88..a2a9ba37 100644
--- a/README.md
+++ b/README.md
@@ -2,7 +2,7 @@
[](https://www.leafmc.one/download)⠀
-[](https://github.com/Winds-Studio/Leaf/actions)⠀
+[](https://github.com/Winds-Studio/Leaf/actions)⠀
[](https://discord.gg/gfgAwdSEuM)
[](https://www.leafmc.one/docs)
@@ -65,7 +65,7 @@ Building a Paperclip JAR for distribution:
cn.dreeam.leaf
leaf-api
- 1.21.6-R0.1-SNAPSHOT
+ 1.21.7-R0.1-SNAPSHOT
provided
```
@@ -78,7 +78,7 @@ repositories {
}
dependencies {
- compileOnly("cn.dreeam.leaf:leaf-api:1.21.6-R0.1-SNAPSHOT")
+ compileOnly("cn.dreeam.leaf:leaf-api:1.21.7-R0.1-SNAPSHOT")
}
java {
diff --git a/gradle.properties b/gradle.properties
index 4d2ec30e..3a4a3017 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -1,8 +1,8 @@
group=cn.dreeam.leaf
-mcVersion=1.21.6
-version=1.21.6-R0.1-SNAPSHOT
+mcVersion=1.21.7
+version=1.21.7-R0.1-SNAPSHOT
-paperCommit=4d854e66b80dad9898d71a0f0b1f83cd39b97119
+paperCommit=51d28af8fa2c60464e2f5c84810c1744be164f00
org.gradle.configuration-cache=true
org.gradle.caching=true
diff --git a/leaf-api/paper-patches/features/0004-Vectorized-map-color-conversion.patch b/leaf-api/paper-patches/features/0004-Vectorized-map-color-conversion.patch
index 43f990e0..95fdc34c 100644
--- a/leaf-api/paper-patches/features/0004-Vectorized-map-color-conversion.patch
+++ b/leaf-api/paper-patches/features/0004-Vectorized-map-color-conversion.patch
@@ -110,7 +110,7 @@ index 0000000000000000000000000000000000000000..00b16e4aacba50996b81fac81c3f78b6
+
+}
diff --git a/src/main/java/org/bukkit/map/MapPalette.java b/src/main/java/org/bukkit/map/MapPalette.java
-index fd6f3bce50a66004687b08fd80568543f814747a..2d6d7bc800a7c2c0f29b2d7f2512f2d27aaa9439 100644
+index 2b9e4aa8cf35e7106e510e547954ee7e1bcf3d81..794ae24eee9a20c6db4690b527f5e005d5ca3f00 100644
--- a/src/main/java/org/bukkit/map/MapPalette.java
+++ b/src/main/java/org/bukkit/map/MapPalette.java
@@ -35,7 +35,7 @@ public final class MapPalette {
@@ -120,7 +120,7 @@ index fd6f3bce50a66004687b08fd80568543f814747a..2d6d7bc800a7c2c0f29b2d7f2512f2d2
- static final Color[] colors = {
+ public static final Color[] colors = { // Gale - Pufferfish - vectorized map color conversion - package -> public
// Start generate - MapPalette#colors
- // @GeneratedFrom 1.21.6
+ // @GeneratedFrom 1.21.7
new Color(0x00000000, true),
@@ -395,9 +395,15 @@ public final class MapPalette {
temp.getRGB(0, 0, temp.getWidth(), temp.getHeight(), pixels, 0, temp.getWidth());
diff --git a/leaf-api/paper-patches/features/0006-Player-canSee-by-entity-UUID.patch b/leaf-api/paper-patches/features/0006-Player-canSee-by-entity-UUID.patch
index 0f992e0c..d97e64a1 100644
--- a/leaf-api/paper-patches/features/0006-Player-canSee-by-entity-UUID.patch
+++ b/leaf-api/paper-patches/features/0006-Player-canSee-by-entity-UUID.patch
@@ -37,10 +37,10 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
diff --git a/src/main/java/org/bukkit/entity/Player.java b/src/main/java/org/bukkit/entity/Player.java
-index d34419693fc78b3f7e8f6bbf115f17f29e5e3377..c44453789834c544b0e78b52bb9b09ffbd5958fb 100644
+index 3584ca0a89f59e391ab6d5be8f2274a6801d025f..cc663ca87a6f64ea891984c72554796f25bb308f 100644
--- a/src/main/java/org/bukkit/entity/Player.java
+++ b/src/main/java/org/bukkit/entity/Player.java
-@@ -2129,6 +2129,16 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
+@@ -2128,6 +2128,16 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
boolean listPlayer(Player other);
// Paper end
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 d1852bba..b23074dc 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: a112b6aca718e4500a6d48ca9d7158faf0f4adf9
+Commit: 591baf2648d0f75ffecc52f1d169348af35246dd
Patches listed below are removed in this patch, They exists in Gale or Leaf:
* "co/aikar/timings/TimedEventExecutor.java.patch"
@@ -21,7 +21,7 @@ Patches listed below are removed in this patch, They exists in Gale or Leaf:
* "org/spigotmc/CustomTimingsHandler.java.patch"
diff --git a/src/generated/java/com/destroystokyo/paper/entity/ai/VanillaGoal.java b/src/generated/java/com/destroystokyo/paper/entity/ai/VanillaGoal.java
-index e4729256f444168dc8cb7121f66cae0df054692b..0db0e11f4e18a280f699004dc660ce211b7f895f 100644
+index b7fae62ca1807031c62148505ae54c0fb7b87780..3b6580c3679e9c325dd8deb302dbfe6a062bd291 100644
--- a/src/generated/java/com/destroystokyo/paper/entity/ai/VanillaGoal.java
+++ b/src/generated/java/com/destroystokyo/paper/entity/ai/VanillaGoal.java
@@ -446,6 +446,26 @@ public interface VanillaGoal
extends Goal {
@@ -290,10 +290,10 @@ index 918a045165cdcde264bc24082b7afebb407271de..f283bcabff7fe6eede6cf4344537e430
+ // Purpur end - ChatColor conveniences
}
diff --git a/src/main/java/org/bukkit/Material.java b/src/main/java/org/bukkit/Material.java
-index ac8d14010940d55e2d885e75ce6ff436c46e2d69..8f45823ea89c8208374115f8ed9c5a535a64c017 100644
+index 899c288e12b423b9f8fe84e113fd4d996a98de94..7f488cc432ded1ec0e99c65bea5fd9897c8efbb4 100644
--- a/src/main/java/org/bukkit/Material.java
+++ b/src/main/java/org/bukkit/Material.java
-@@ -3636,4 +3636,40 @@ public enum Material implements Keyed, Translatable, net.kyori.adventure.transla
+@@ -3633,4 +3633,40 @@ public enum Material implements Keyed, Translatable, net.kyori.adventure.transla
return this.asItemType().getDefaultDataTypes();
}
// Paper end - data component API
@@ -700,10 +700,10 @@ index 739911cda33b373f99df627a3a378b37d7d461aa..58e16c12b06fa11d30b67f5038844ff9
* Add an entity to the block.
*
diff --git a/src/main/java/org/bukkit/command/SimpleCommandMap.java b/src/main/java/org/bukkit/command/SimpleCommandMap.java
-index 4acda947b7d69ab4133b4cc94e76d945e4d148d5..613a0bad5c07cf14098218652eba1f4deaf77c6d 100644
+index ad1330d87223dfcf3c9da40aa5ece8c21141f0d6..e3f0605d375dcbb43ae40dac48acdeb2bd458e54 100644
--- a/src/main/java/org/bukkit/command/SimpleCommandMap.java
+++ b/src/main/java/org/bukkit/command/SimpleCommandMap.java
-@@ -146,6 +146,19 @@ public class SimpleCommandMap implements CommandMap {
+@@ -148,6 +148,19 @@ public class SimpleCommandMap implements CommandMap {
return false;
}
@@ -723,7 +723,7 @@ index 4acda947b7d69ab4133b4cc94e76d945e4d148d5..613a0bad5c07cf14098218652eba1f4d
// Paper start - Plugins do weird things to workaround normal registration
if (target.timings == null) {
target.timings = co.aikar.timings.TimingsManager.getCommandTiming(null, target);
-@@ -155,7 +168,7 @@ public class SimpleCommandMap implements CommandMap {
+@@ -157,7 +170,7 @@ public class SimpleCommandMap implements CommandMap {
try {
try (co.aikar.timings.Timing ignored = target.timings.startTiming()) { // Paper - use try with resources
// Note: we don't return the result of target.execute as thats success / failure, we return handled (true) or not handled (false)
@@ -1008,13 +1008,13 @@ index bc84b892cae5fe7019a3ad481e9da79956efa1fe..48eb5b00c460cccde29d327cef1d63fc
+ // Purpur end
}
diff --git a/src/main/java/org/bukkit/entity/Player.java b/src/main/java/org/bukkit/entity/Player.java
-index c44453789834c544b0e78b52bb9b09ffbd5958fb..d4082cd6dae07958ace3b9e9769ccb7da4c2a828 100644
+index cc663ca87a6f64ea891984c72554796f25bb308f..747e943d98a385346b79897a5261d41cfc9572df 100644
--- a/src/main/java/org/bukkit/entity/Player.java
+++ b/src/main/java/org/bukkit/entity/Player.java
-@@ -3935,4 +3935,123 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
- * @param score New death screen score of player
+@@ -3942,4 +3942,123 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
*/
- void setDeathScreenScore(int score);
+ @ApiStatus.Experimental
+ PlayerGameConnection getConnection();
+
+ // Purpur start
+ /**
@@ -1161,7 +1161,7 @@ index 7fbfdb07585c7b28acea1f0c1f58ada0cc744441..21fcca092e2e31baa5ece0de9e44e3fa
+ // Purpur end
}
diff --git a/src/main/java/org/bukkit/entity/Villager.java b/src/main/java/org/bukkit/entity/Villager.java
-index 1be07639143cd80bd4fb304d6f3bbced58887617..120159852cae3b1a71c6c7ce949cadb386023095 100644
+index 4048add2433ebe39d3df995296daaff4bfadce47..8da18f023f6b18f6be58e08f37c2d873bc0c97d2 100644
--- a/src/main/java/org/bukkit/entity/Villager.java
+++ b/src/main/java/org/bukkit/entity/Villager.java
@@ -408,4 +408,13 @@ public interface Villager extends AbstractVillager {
@@ -1204,7 +1204,7 @@ index 11ae1b3ad8c215f9245945d223c52f4a62ac47d9..7f23eb5a60ff08fb31e8ba3731a43bd7
+ // Purpur end
}
diff --git a/src/main/java/org/bukkit/entity/Wolf.java b/src/main/java/org/bukkit/entity/Wolf.java
-index d0a64457e4bf40f2a78ffe90c2d402adc154e327..ea51840e4f40733a48ca34f7a8fcf17dc963d659 100644
+index 98ed584f801a35253a9a5a2af3c73dbbc49bcb06..8708ab27e38e3906b13d103ad45224c89e239117 100644
--- a/src/main/java/org/bukkit/entity/Wolf.java
+++ b/src/main/java/org/bukkit/entity/Wolf.java
@@ -163,4 +163,20 @@ public interface Wolf extends Tameable, Sittable, io.papermc.paper.entity.Collar
@@ -1260,10 +1260,10 @@ index 22e14ba522510d659c191d72536cde895458d9ed..d45d781975a6026022712a217c154e31
* When a player gets bad omen after killing a patrol captain.
*
diff --git a/src/main/java/org/bukkit/event/inventory/InventoryType.java b/src/main/java/org/bukkit/event/inventory/InventoryType.java
-index 81118a91c2e22e02a1f774d1cc4d3e97064087ce..6640df827e354cc32cea5fc71b9e464443202708 100644
+index 54ff294e64abd692c0f64ba2db7341c9c71436d0..49e458e453486dcf48d1ab920da176723d7ef3f4 100644
--- a/src/main/java/org/bukkit/event/inventory/InventoryType.java
+++ b/src/main/java/org/bukkit/event/inventory/InventoryType.java
-@@ -164,7 +164,7 @@ public enum InventoryType {
+@@ -166,7 +166,7 @@ public enum InventoryType {
SMITHING_NEW(4, "Upgrade Gear", MenuType.SMITHING),
;
diff --git a/leaf-api/paper-patches/features/0012-Remove-Timings.patch b/leaf-api/paper-patches/features/0012-Remove-Timings.patch
index 02d4eaa1..66d312ff 100644
--- a/leaf-api/paper-patches/features/0012-Remove-Timings.patch
+++ b/leaf-api/paper-patches/features/0012-Remove-Timings.patch
@@ -2892,18 +2892,18 @@ index 59fada9b1eb78238d280c6bbb711f52facba52c6..eb4d78c6111a530d015a0b91d14c40ad
return i >= j && i <= k;
}
diff --git a/src/main/java/org/bukkit/command/SimpleCommandMap.java b/src/main/java/org/bukkit/command/SimpleCommandMap.java
-index 613a0bad5c07cf14098218652eba1f4deaf77c6d..25a0414cc9482925ad0426dde57e65012d62e637 100644
+index e3f0605d375dcbb43ae40dac48acdeb2bd458e54..83e7175927e8adb90208bebbd7ddc37cb186d1dc 100644
--- a/src/main/java/org/bukkit/command/SimpleCommandMap.java
+++ b/src/main/java/org/bukkit/command/SimpleCommandMap.java
-@@ -32,7 +32,6 @@ public class SimpleCommandMap implements CommandMap {
-
- private void setDefaultCommands() {
- register("bukkit", new ReloadCommand("reload"));
+@@ -34,7 +34,6 @@ public class SimpleCommandMap implements CommandMap {
+ final ReloadCommand reload = new ReloadCommand("reload");
+ this.knownCommands.put("bukkit:reload", reload);
+ this.knownCommands.put("bukkit:rl", reload);
- register("bukkit", new co.aikar.timings.TimingsCommand("timings"));
}
public void setFallbackCommands() {
-@@ -64,7 +63,6 @@ public class SimpleCommandMap implements CommandMap {
+@@ -66,7 +65,6 @@ public class SimpleCommandMap implements CommandMap {
*/
@Override
public boolean register(@NotNull String label, @NotNull String fallbackPrefix, @NotNull Command command) {
@@ -2911,7 +2911,7 @@ index 613a0bad5c07cf14098218652eba1f4deaf77c6d..25a0414cc9482925ad0426dde57e6501
label = label.toLowerCase(Locale.ROOT).trim();
fallbackPrefix = fallbackPrefix.toLowerCase(Locale.ROOT).trim();
boolean registered = register(label, command, false, fallbackPrefix);
-@@ -159,23 +157,13 @@ public class SimpleCommandMap implements CommandMap {
+@@ -161,23 +159,13 @@ public class SimpleCommandMap implements CommandMap {
parsedArgs = event.getArgs();
// Purpur end - ExecuteCommandEvent
diff --git a/leaf-api/paper-patches/features/0013-KeYi-Player-Skull-API.patch b/leaf-api/paper-patches/features/0013-KeYi-Player-Skull-API.patch
index 24bb7dec..d22ea959 100644
--- a/leaf-api/paper-patches/features/0013-KeYi-Player-Skull-API.patch
+++ b/leaf-api/paper-patches/features/0013-KeYi-Player-Skull-API.patch
@@ -7,10 +7,10 @@ Original license: MIT
Original project: https://github.com/KeYiMC/KeYi
diff --git a/src/main/java/org/bukkit/entity/Player.java b/src/main/java/org/bukkit/entity/Player.java
-index d4082cd6dae07958ace3b9e9769ccb7da4c2a828..d17f7881e55d61c2137f29d0b903016958b05b5d 100644
+index 747e943d98a385346b79897a5261d41cfc9572df..66fc9a061d0d5f030ecf8df94acf7357a4cf9eaa 100644
--- a/src/main/java/org/bukkit/entity/Player.java
+++ b/src/main/java/org/bukkit/entity/Player.java
-@@ -4054,4 +4054,23 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
+@@ -4061,4 +4061,23 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
sendDeathScreen(message);
}
// Purpur end
diff --git a/leaf-api/paper-patches/features/0014-Slice-Smooth-Teleports.patch b/leaf-api/paper-patches/features/0014-Slice-Smooth-Teleports.patch
index 97fe3d3d..9793c77b 100644
--- a/leaf-api/paper-patches/features/0014-Slice-Smooth-Teleports.patch
+++ b/leaf-api/paper-patches/features/0014-Slice-Smooth-Teleports.patch
@@ -9,10 +9,10 @@ Original project: https://github.com/Cryptite/Slice
Co-authored-by: HaHaWTH <102713261+HaHaWTH@users.noreply.github.com>
diff --git a/src/main/java/org/bukkit/entity/Player.java b/src/main/java/org/bukkit/entity/Player.java
-index d17f7881e55d61c2137f29d0b903016958b05b5d..09f70aa4d206a1b7fc5f3274f34c6885a9e2d60d 100644
+index 66fc9a061d0d5f030ecf8df94acf7357a4cf9eaa..9ee5ef2ea93fdf91abf8c312ec2a39b36d096152 100644
--- a/src/main/java/org/bukkit/entity/Player.java
+++ b/src/main/java/org/bukkit/entity/Player.java
-@@ -3716,6 +3716,33 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
+@@ -3715,6 +3715,33 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
String getClientBrandName();
// Paper end
diff --git a/leaf-server/build.gradle.kts.patch b/leaf-server/build.gradle.kts.patch
index 2e94181d..1ba6ed84 100644
--- a/leaf-server/build.gradle.kts.patch
+++ b/leaf-server/build.gradle.kts.patch
@@ -7,7 +7,7 @@
+val leafMavenPublicUrl = "https://maven.nostal.ink/repository/maven-snapshots/" // Leaf - project setup - Add publish repo
dependencies {
- mache("io.papermc:mache:1.21.6+build.1")
+ mache("io.papermc:mache:1.21.7+build.1")
- 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")
@@ -32,7 +32,7 @@
+
spigot {
enabled = true
- buildDataRef = "281ac0de7a76d808753ede97d11b034bc801b63d"
+ buildDataRef = "436eac9815c211be1a2a6ca0702615f995e81c44"
@@ -49,6 +_,7 @@
libraryRepositories.addAll(
"https://repo.maven.apache.org/maven2/",
diff --git a/leaf-server/minecraft-patches/features/0005-Remove-vanilla-profiler.patch b/leaf-server/minecraft-patches/features/0005-Remove-vanilla-profiler.patch
index 767f061a..7eeac1c8 100644
--- a/leaf-server/minecraft-patches/features/0005-Remove-vanilla-profiler.patch
+++ b/leaf-server/minecraft-patches/features/0005-Remove-vanilla-profiler.patch
@@ -1079,7 +1079,7 @@ index b4c983216cd839d793a09e327bb2f15ab90cbff8..1413511500ce8ae25cc4af1d54fc33c8
for (Entity entity : passengerEntity.getPassengers()) {
this.tickPassenger(passengerEntity, entity, isActive); // Paper - EAR 2
diff --git a/net/minecraft/server/level/ServerPlayer.java b/net/minecraft/server/level/ServerPlayer.java
-index b1fba7be059247bc4ba4e652f730e026e837b608..5a4b6005de28f62c98ac8172890689d3150fd4da 100644
+index 21ae237a94232090029539652310f7d1e4aba381..4132ebc316af92aedd3b5f21d291e7d57560e985 100644
--- a/net/minecraft/server/level/ServerPlayer.java
+++ b/net/minecraft/server/level/ServerPlayer.java
@@ -106,8 +106,6 @@ import net.minecraft.util.HashOps;
@@ -1091,7 +1091,7 @@ index b1fba7be059247bc4ba4e652f730e026e837b608..5a4b6005de28f62c98ac8172890689d3
import net.minecraft.world.Container;
import net.minecraft.world.Difficulty;
import net.minecraft.world.InteractionHand;
-@@ -1471,14 +1469,10 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc
+@@ -1405,14 +1403,10 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc
this.unsetRemoved();
*/
// CraftBukkit end
@@ -1106,7 +1106,7 @@ index b1fba7be059247bc4ba4e652f730e026e837b608..5a4b6005de28f62c98ac8172890689d3
// CraftBukkit start
this.isChangingDimension = true; // CraftBukkit - Set teleport invulnerability only if player changing worlds
LevelData worlddata = level.getLevelData();
-@@ -1495,7 +1489,6 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc
+@@ -1429,7 +1423,6 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc
this.connection.internalTeleport(PositionMoveRotation.of(teleportTransition), teleportTransition.relatives()); // CraftBukkit - use internal teleport without event
this.connection.resetPosition();
level.addDuringTeleport(this);
@@ -1115,7 +1115,7 @@ index b1fba7be059247bc4ba4e652f730e026e837b608..5a4b6005de28f62c98ac8172890689d3
this.stopUsingItem();
this.connection.send(new ClientboundPlayerAbilitiesPacket(this.getAbilities()));
diff --git a/net/minecraft/server/network/ServerCommonPacketListenerImpl.java b/net/minecraft/server/network/ServerCommonPacketListenerImpl.java
-index 43f70a5561d6cc62aaeba6d1e39598ecb382e369..ccbf60f546974692c2c840f4bce87e2c95d1866c 100644
+index 16962ccab91d0941e428a2e53aa37e9ca975f62f..911ce7fcdb7b60880e5502b1a6c9f5bd07c04fd1 100644
--- a/net/minecraft/server/network/ServerCommonPacketListenerImpl.java
+++ b/net/minecraft/server/network/ServerCommonPacketListenerImpl.java
@@ -26,7 +26,6 @@ import net.minecraft.network.protocol.cookie.ServerboundCookieResponsePacket;
@@ -1125,8 +1125,8 @@ index 43f70a5561d6cc62aaeba6d1e39598ecb382e369..ccbf60f546974692c2c840f4bce87e2c
-import net.minecraft.util.profiling.Profiler;
import org.slf4j.Logger;
- public abstract class ServerCommonPacketListenerImpl implements ServerCommonPacketListener, org.bukkit.craftbukkit.entity.CraftPlayer.TransferCookieConnection { // CraftBukkit
-@@ -273,7 +272,6 @@ public abstract class ServerCommonPacketListenerImpl implements ServerCommonPack
+ public abstract class ServerCommonPacketListenerImpl implements ServerCommonPacketListener {
+@@ -176,7 +175,6 @@ public abstract class ServerCommonPacketListenerImpl implements ServerCommonPack
}
protected void keepConnectionAlive() {
@@ -1134,7 +1134,7 @@ index 43f70a5561d6cc62aaeba6d1e39598ecb382e369..ccbf60f546974692c2c840f4bce87e2c
long millis = Util.getMillis();
// Paper start - improve keepalives
if (this.checkIfClosed(millis) && !this.processedDisconnect) {
-@@ -294,8 +292,6 @@ public abstract class ServerCommonPacketListenerImpl implements ServerCommonPack
+@@ -197,8 +195,6 @@ public abstract class ServerCommonPacketListenerImpl implements ServerCommonPack
// Paper end - improve keepalives
}
}
@@ -1664,10 +1664,10 @@ index c569074403b1d8b443aaa98ba9cf9bbd0e98bd2d..b1aa7294f9479f45fcde77c5ea46db9f
this.seen.add(id);
} else {
diff --git a/net/minecraft/world/entity/animal/HappyGhast.java b/net/minecraft/world/entity/animal/HappyGhast.java
-index 24fdfda487bf5348c32707022719ec9907debc80..4e74d5b3076f50f9294553b453f5903ef32f1e8a 100644
+index 272f57aca640e045efca64dd018b221335c667ee..f07dcf7d45b1b717faeae0c4129fb00a22fb7d57 100644
--- a/net/minecraft/world/entity/animal/HappyGhast.java
+++ b/net/minecraft/world/entity/animal/HappyGhast.java
-@@ -13,8 +13,6 @@ import net.minecraft.sounds.SoundEvents;
+@@ -14,8 +14,6 @@ import net.minecraft.sounds.SoundEvents;
import net.minecraft.sounds.SoundSource;
import net.minecraft.tags.ItemTags;
import net.minecraft.util.Mth;
@@ -1676,7 +1676,7 @@ index 24fdfda487bf5348c32707022719ec9907debc80..4e74d5b3076f50f9294553b453f5903e
import net.minecraft.world.InteractionHand;
import net.minecraft.world.InteractionResult;
import net.minecraft.world.damagesource.DamageSource;
-@@ -379,13 +377,8 @@ public class HappyGhast extends Animal {
+@@ -385,13 +383,8 @@ public class HappyGhast extends Animal {
@Override
protected void customServerAiStep(ServerLevel level) {
if (this.isBaby()) {
@@ -2077,7 +2077,7 @@ index 4a4cc7f9c95d4f4b6ad4948e3ed3504efbbcef15..dd6666bd8b8df4148a1557627ce2a6dd
if ((this.tickCount + this.getId()) % 120 == 0) {
applyDarknessAround(level, this.position(), this, 20);
diff --git a/net/minecraft/world/entity/npc/Villager.java b/net/minecraft/world/entity/npc/Villager.java
-index 43f16df230f87a43e249a58fc10ef2da517f22ee..532618ae4acd548129006a6c42c62a5b046dbd7e 100644
+index e1e2bdb35866a8f32a41f6efd24ad77cf916b2e9..6cf2af33d22d3df8374746f5926f3f2d5093431d 100644
--- a/net/minecraft/world/entity/npc/Villager.java
+++ b/net/minecraft/world/entity/npc/Villager.java
@@ -35,8 +35,6 @@ import net.minecraft.stats.Stats;
@@ -2089,7 +2089,7 @@ index 43f16df230f87a43e249a58fc10ef2da517f22ee..532618ae4acd548129006a6c42c62a5b
import net.minecraft.world.Difficulty;
import net.minecraft.world.DifficultyInstance;
import net.minecraft.world.InteractionHand;
-@@ -295,10 +293,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler
+@@ -294,10 +292,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler
}
protected void customServerAiStep(ServerLevel level, final boolean inactive) {
// Paper end - EAR 2
diff --git a/leaf-server/minecraft-patches/features/0022-Make-book-writing-configurable.patch b/leaf-server/minecraft-patches/features/0022-Make-book-writing-configurable.patch
index 6167db18..5903e0dd 100644
--- a/leaf-server/minecraft-patches/features/0022-Make-book-writing-configurable.patch
+++ b/leaf-server/minecraft-patches/features/0022-Make-book-writing-configurable.patch
@@ -22,10 +22,10 @@ you to easily disable books, should you want to preemptively remove this
functionality before additional exploits are found.
diff --git a/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/net/minecraft/server/network/ServerGamePacketListenerImpl.java
-index aeb43902a09ef9c1b137964065780be3e87648f4..383652f0bd32fca3551db85fb6ac42a0e326836e 100644
+index 04c991964364a9bcf87d9f6a8d3ef0a0dd8f1deb..128fd9c5a44f05d3556f280f43151695da0665b8 100644
--- a/net/minecraft/server/network/ServerGamePacketListenerImpl.java
+++ b/net/minecraft/server/network/ServerGamePacketListenerImpl.java
-@@ -1255,6 +1255,11 @@ public class ServerGamePacketListenerImpl
+@@ -1257,6 +1257,11 @@ public class ServerGamePacketListenerImpl
@Override
public void handleEditBook(ServerboundEditBookPacket packet) {
diff --git a/leaf-server/minecraft-patches/features/0030-Do-not-process-chat-commands-before-player-has-joine.patch b/leaf-server/minecraft-patches/features/0030-Do-not-process-chat-commands-before-player-has-joine.patch
index ec2db5e7..6428b836 100644
--- a/leaf-server/minecraft-patches/features/0030-Do-not-process-chat-commands-before-player-has-joine.patch
+++ b/leaf-server/minecraft-patches/features/0030-Do-not-process-chat-commands-before-player-has-joine.patch
@@ -13,22 +13,22 @@ As part of: EmpireCraft (https://github.com/starlis/empirecraft)
Licensed under: MIT (https://opensource.org/licenses/MIT)
diff --git a/net/minecraft/server/level/ServerPlayer.java b/net/minecraft/server/level/ServerPlayer.java
-index ffae3e45ba88e8b733e77b87a45cc27b9ecf8c19..684a15babe984c84703e2c6af7a461f75959312d 100644
+index 4132ebc316af92aedd3b5f21d291e7d57560e985..8df0dbadca1dc72ac8d267654414044eb988ee43 100644
--- a/net/minecraft/server/level/ServerPlayer.java
+++ b/net/minecraft/server/level/ServerPlayer.java
-@@ -425,6 +425,7 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc
+@@ -424,6 +424,7 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc
public boolean sentListPacket = false;
public boolean supressTrackerForLogin = false; // Paper - Fire PlayerJoinEvent when Player is actually ready
// CraftBukkit end
+ public boolean didPlayerJoinEvent = false; // Gale - EMC - do not process chat/commands before player has joined
public boolean isRealPlayer; // Paper
public @Nullable com.destroystokyo.paper.event.entity.PlayerNaturallySpawnCreaturesEvent playerNaturallySpawnedEvent; // Paper - PlayerNaturallySpawnCreaturesEvent
- public @Nullable String clientBrandName = null; // Paper - Brand support
+ public @Nullable org.bukkit.event.player.PlayerQuitEvent.QuitReason quitReason = null; // Paper - Add API for quit reason; there are a lot of changes to do if we change all methods leading to the event
diff --git a/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/net/minecraft/server/network/ServerGamePacketListenerImpl.java
-index 383652f0bd32fca3551db85fb6ac42a0e326836e..29466047936ed44f57cb4bcb8f1bff0bdad81827 100644
+index 128fd9c5a44f05d3556f280f43151695da0665b8..ab0598fffccaf1ea628ab38c68d75399d73d897e 100644
--- a/net/minecraft/server/network/ServerGamePacketListenerImpl.java
+++ b/net/minecraft/server/network/ServerGamePacketListenerImpl.java
-@@ -2433,7 +2433,7 @@ public class ServerGamePacketListenerImpl
+@@ -2431,7 +2431,7 @@ public class ServerGamePacketListenerImpl
this.disconnectAsync(Component.translatable("multiplayer.disconnect.illegal_characters"), org.bukkit.event.player.PlayerKickEvent.Cause.ILLEGAL_CHARACTERS); // Paper - add proper async disconnect
} else if (this.player.isRemoved() || this.player.getChatVisibility() == ChatVisiblity.HIDDEN) { // CraftBukkit - dead men tell no tales
this.send(new ClientboundSystemChatPacket(Component.translatable("chat.disabled.options").withStyle(ChatFormatting.RED), false));
@@ -38,7 +38,7 @@ index 383652f0bd32fca3551db85fb6ac42a0e326836e..29466047936ed44f57cb4bcb8f1bff0b
// CraftBukkit start
if (sync) {
diff --git a/net/minecraft/server/players/PlayerList.java b/net/minecraft/server/players/PlayerList.java
-index 898d9ab963a6cf1db8edf4657a65335d15f271c4..77dbd115d99d8f8e2c01ea69ca297ced06b19c12 100644
+index b09c1735acb57b6230225f88e0fc710ad61af119..39b977927a22956634b7c31818df0544814004fc 100644
--- a/net/minecraft/server/players/PlayerList.java
+++ b/net/minecraft/server/players/PlayerList.java
@@ -335,6 +335,8 @@ public abstract class PlayerList {
diff --git a/leaf-server/minecraft-patches/features/0032-Do-not-log-empty-message-warnings.patch b/leaf-server/minecraft-patches/features/0032-Do-not-log-empty-message-warnings.patch
index b337d1d7..501dcddb 100644
--- a/leaf-server/minecraft-patches/features/0032-Do-not-log-empty-message-warnings.patch
+++ b/leaf-server/minecraft-patches/features/0032-Do-not-log-empty-message-warnings.patch
@@ -7,10 +7,10 @@ License: GPL-3.0 (https://www.gnu.org/licenses/gpl-3.0.html)
Gale - https://galemc.org
diff --git a/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/net/minecraft/server/network/ServerGamePacketListenerImpl.java
-index 29466047936ed44f57cb4bcb8f1bff0bdad81827..767dfc71ad9aafffa01ed27fdeac2c19bbba6f37 100644
+index ab0598fffccaf1ea628ab38c68d75399d73d897e..5dba2bdd91e5dc775e0727b99aff02c892eff733 100644
--- a/net/minecraft/server/network/ServerGamePacketListenerImpl.java
+++ b/net/minecraft/server/network/ServerGamePacketListenerImpl.java
-@@ -2515,7 +2515,7 @@ public class ServerGamePacketListenerImpl
+@@ -2513,7 +2513,7 @@ public class ServerGamePacketListenerImpl
// CraftBukkit start
String rawMessage = message.signedContent();
if (rawMessage.isEmpty()) {
diff --git a/leaf-server/minecraft-patches/features/0037-Do-not-log-Not-Secure-marker.patch b/leaf-server/minecraft-patches/features/0037-Do-not-log-Not-Secure-marker.patch
index fdc2b986..54e8a909 100644
--- a/leaf-server/minecraft-patches/features/0037-Do-not-log-Not-Secure-marker.patch
+++ b/leaf-server/minecraft-patches/features/0037-Do-not-log-Not-Secure-marker.patch
@@ -7,10 +7,10 @@ License: GPL-3.0 (https://www.gnu.org/licenses/gpl-3.0.html)
Gale - https://galemc.org
diff --git a/net/minecraft/server/players/PlayerList.java b/net/minecraft/server/players/PlayerList.java
-index 8017266123a91e5bd46ae0d39a35cf2e6cbb390f..c5ab58c890c7c55f2ad75560269663d3fd5a6aa3 100644
+index 39b977927a22956634b7c31818df0544814004fc..d0b12d91686592149a8a3e33677eb2e26e19624e 100644
--- a/net/minecraft/server/players/PlayerList.java
+++ b/net/minecraft/server/players/PlayerList.java
-@@ -1274,7 +1274,7 @@ public abstract class PlayerList {
+@@ -1258,7 +1258,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);
diff --git a/leaf-server/minecraft-patches/features/0038-Do-not-log-disconnections-with-null-id.patch b/leaf-server/minecraft-patches/features/0038-Do-not-log-disconnections-with-null-id.patch
index cd604663..b5c0489c 100644
--- a/leaf-server/minecraft-patches/features/0038-Do-not-log-disconnections-with-null-id.patch
+++ b/leaf-server/minecraft-patches/features/0038-Do-not-log-disconnections-with-null-id.patch
@@ -17,10 +17,10 @@ Licensed under: GPL-3.0 (https://www.gnu.org/licenses/gpl-3.0.html)
This can help to hide annoying scanning bots from showing up in console.
diff --git a/net/minecraft/server/network/ServerLoginPacketListenerImpl.java b/net/minecraft/server/network/ServerLoginPacketListenerImpl.java
-index 7950f4f88d8a83ed5610b7af4e134557d32da3f0..27fa7bbfc64dd103b7cd1c1216482af3719e3dbb 100644
+index ebf4d4516233c002b33084f1679044b23869d848..5bac1c0ba691e516f2d603583971df7fe7ac212c 100644
--- a/net/minecraft/server/network/ServerLoginPacketListenerImpl.java
+++ b/net/minecraft/server/network/ServerLoginPacketListenerImpl.java
-@@ -145,6 +145,15 @@ public class ServerLoginPacketListenerImpl implements ServerLoginPacketListener,
+@@ -124,6 +124,15 @@ public class ServerLoginPacketListenerImpl implements ServerLoginPacketListener,
public void disconnect(Component reason) {
try {
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 a45f86c4..d021899b 100644
--- a/leaf-server/minecraft-patches/features/0046-Reduce-array-allocations.patch
+++ b/leaf-server/minecraft-patches/features/0046-Reduce-array-allocations.patch
@@ -152,10 +152,10 @@ index a9c2f419200483673f6743ed94af110a8e875e71..617eb1b9d30d499124576c5d7cb51525
return ret;
}
diff --git a/net/minecraft/server/level/ServerPlayer.java b/net/minecraft/server/level/ServerPlayer.java
-index 45e4a7356e51e9c50d440782b55d1cbfc4b76f96..f752dceea48ed8264ae4cb60fdf2390f0e5019e1 100644
+index 8df0dbadca1dc72ac8d267654414044eb988ee43..784a08d0aed30fd0362e408aaa5772003021c0ad 100644
--- a/net/minecraft/server/level/ServerPlayer.java
+++ b/net/minecraft/server/level/ServerPlayer.java
-@@ -1166,7 +1166,7 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc
+@@ -1100,7 +1100,7 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc
this.getInventory().getNonEquipmentItems().set(i, net.minecraft.world.item.ItemStack.EMPTY);
}
}
@@ -165,10 +165,10 @@ index 45e4a7356e51e9c50d440782b55d1cbfc4b76f96..f752dceea48ed8264ae4cb60fdf2390f
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 f953fa6adb112bc9da34cfb72045975f87c5f021..a07310aebd8406af27864358e15715fcc7694329 100644
+index 5dba2bdd91e5dc775e0727b99aff02c892eff733..38376506f8b886ed66ec48b1a78dede2a7cabe99 100644
--- a/net/minecraft/server/network/ServerGamePacketListenerImpl.java
+++ b/net/minecraft/server/network/ServerGamePacketListenerImpl.java
-@@ -2784,7 +2784,7 @@ public class ServerGamePacketListenerImpl
+@@ -2782,7 +2782,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(
diff --git a/leaf-server/minecraft-patches/features/0071-Spread-out-sending-all-player-info.patch b/leaf-server/minecraft-patches/features/0071-Spread-out-sending-all-player-info.patch
index da79e576..669f2bf3 100644
--- a/leaf-server/minecraft-patches/features/0071-Spread-out-sending-all-player-info.patch
+++ b/leaf-server/minecraft-patches/features/0071-Spread-out-sending-all-player-info.patch
@@ -37,7 +37,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
diff --git a/net/minecraft/server/players/PlayerList.java b/net/minecraft/server/players/PlayerList.java
-index 186e0a6e565d29572f5d4771a68e4a9cb2bd45de..91d4a5f7685296e397c1c341813542fd13eaf168 100644
+index edefdd4be2b3af69c416ad32e2574865fa27da34..537d433dd7c301444b15327104b0c605d5833448 100644
--- a/net/minecraft/server/players/PlayerList.java
+++ b/net/minecraft/server/players/PlayerList.java
@@ -113,6 +113,7 @@ public abstract class PlayerList {
@@ -64,7 +64,7 @@ index 186e0a6e565d29572f5d4771a68e4a9cb2bd45de..91d4a5f7685296e397c1c341813542fd
this.server.getCustomBossEvents().onPlayerDisconnect(player);
UUID uuid = player.getUUID();
ServerPlayer serverPlayer = this.playersByUUID.get(uuid);
-@@ -720,6 +723,7 @@ public abstract class PlayerList {
+@@ -687,6 +690,7 @@ public abstract class PlayerList {
player.stopRiding(); // CraftBukkit
this.players.remove(player);
this.playersByName.remove(player.getScoreboardName().toLowerCase(java.util.Locale.ROOT)); // Spigot
@@ -72,7 +72,7 @@ index 186e0a6e565d29572f5d4771a68e4a9cb2bd45de..91d4a5f7685296e397c1c341813542fd
player.level().removePlayerImmediately(player, reason);
// TeleportTransition teleportTransition = player.findRespawnPositionAndUseSpawnBlock(!keepInventory, TeleportTransition.DO_NOTHING);
// ServerLevel level = teleportTransition.newLevel();
-@@ -798,6 +802,7 @@ public abstract class PlayerList {
+@@ -765,6 +769,7 @@ public abstract class PlayerList {
this.players.add(serverPlayer);
this.playersByName.put(serverPlayer.getScoreboardName().toLowerCase(java.util.Locale.ROOT), serverPlayer); // Spigot
this.playersByUUID.put(serverPlayer.getUUID(), serverPlayer);
@@ -80,7 +80,7 @@ index 186e0a6e565d29572f5d4771a68e4a9cb2bd45de..91d4a5f7685296e397c1c341813542fd
}
// serverPlayer.initInventoryMenu();
serverPlayer.setHealth(serverPlayer.getHealth());
-@@ -900,18 +905,58 @@ public abstract class PlayerList {
+@@ -867,18 +872,58 @@ public abstract class PlayerList {
}
public void tick() {
diff --git a/leaf-server/minecraft-patches/features/0072-Optimize-player-list-for-sending-player-info.patch b/leaf-server/minecraft-patches/features/0072-Optimize-player-list-for-sending-player-info.patch
index 9f290372..8e5a5365 100644
--- a/leaf-server/minecraft-patches/features/0072-Optimize-player-list-for-sending-player-info.patch
+++ b/leaf-server/minecraft-patches/features/0072-Optimize-player-list-for-sending-player-info.patch
@@ -37,10 +37,10 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
diff --git a/net/minecraft/server/players/PlayerList.java b/net/minecraft/server/players/PlayerList.java
-index 91d4a5f7685296e397c1c341813542fd13eaf168..8e7c77174750807bc0e925b100ff73a7bedd76e9 100644
+index 537d433dd7c301444b15327104b0c605d5833448..920ab7be58f9fcbc181690ef7b386b9bacfa5d5f 100644
--- a/net/minecraft/server/players/PlayerList.java
+++ b/net/minecraft/server/players/PlayerList.java
-@@ -909,10 +909,19 @@ public abstract class PlayerList {
+@@ -876,10 +876,19 @@ public abstract class PlayerList {
ServerPlayer[] sendAllPlayerInfoBucket = this.sendAllPlayerInfoBuckets[this.sendAllPlayerInfoIn];
if (sendAllPlayerInfoBucket != null) {
diff --git a/leaf-server/minecraft-patches/features/0074-Send-multiple-keep-alive-packets.patch b/leaf-server/minecraft-patches/features/0074-Send-multiple-keep-alive-packets.patch
index 085254bb..2ba0d431 100644
--- a/leaf-server/minecraft-patches/features/0074-Send-multiple-keep-alive-packets.patch
+++ b/leaf-server/minecraft-patches/features/0074-Send-multiple-keep-alive-packets.patch
@@ -37,7 +37,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
diff --git a/net/minecraft/server/network/ServerCommonPacketListenerImpl.java b/net/minecraft/server/network/ServerCommonPacketListenerImpl.java
-index ccbf60f546974692c2c840f4bce87e2c95d1866c..ddc89e8960f7dc2f75f0e03ccbe6eda96a0499e2 100644
+index 911ce7fcdb7b60880e5502b1a6c9f5bd07c04fd1..31091dd52172d447f98497097d8dabdfef720362 100644
--- a/net/minecraft/server/network/ServerCommonPacketListenerImpl.java
+++ b/net/minecraft/server/network/ServerCommonPacketListenerImpl.java
@@ -38,10 +38,11 @@ public abstract class ServerCommonPacketListenerImpl implements ServerCommonPack
@@ -51,8 +51,8 @@ index ccbf60f546974692c2c840f4bce87e2c95d1866c..ddc89e8960f7dc2f75f0e03ccbe6eda9
private boolean closed = false;
+ private it.unimi.dsi.fastutil.longs.LongList keepAlives = new it.unimi.dsi.fastutil.longs.LongArrayList(); // Gale - Purpur - send multiple keep-alive packets
private volatile int latency; // Paper - improve keepalives - make volatile
+ private final io.papermc.paper.util.KeepAlive keepAlive; // Paper - improve keepalives
private volatile boolean suspendFlushingOnServerThread = false;
- // CraftBukkit start
@@ -50,7 +51,10 @@ public abstract class ServerCommonPacketListenerImpl implements ServerCommonPack
public boolean processedDisconnect;
// CraftBukkit end
@@ -63,12 +63,12 @@ index ccbf60f546974692c2c840f4bce87e2c95d1866c..ddc89e8960f7dc2f75f0e03ccbe6eda9
+ private static final long KEEPALIVE_LIMIT = KEEPALIVE_LIMIT_IN_SECONDS * 1000;
+ // Gale end - Purpur - send multiple keep-alive packets
protected static final net.minecraft.resources.ResourceLocation MINECRAFT_BRAND = net.minecraft.resources.ResourceLocation.withDefaultNamespace("brand"); // Paper - Brand support
+ public @Nullable String playerBrand; // Paper
- public ServerCommonPacketListenerImpl(MinecraftServer server, Connection connection, CommonListenerCookie cookie, net.minecraft.server.level.ServerPlayer player) { // CraftBukkit
-@@ -122,6 +126,18 @@ public abstract class ServerCommonPacketListenerImpl implements ServerCommonPack
+@@ -93,6 +97,18 @@ public abstract class ServerCommonPacketListenerImpl implements ServerCommonPack
// Paper start - improve keepalives
long now = System.nanoTime();
- net.minecraft.server.level.ServerPlayer.PendingKeepAlive pending = this.player.pendingKeepAlives.peek();
+ io.papermc.paper.util.KeepAlive.PendingKeepAlive pending = this.keepAlive.pendingKeepAlives.peek();
+ // Gale start - Purpur - send multiple keep-alive packets
+ if (org.galemc.gale.configuration.GaleGlobalConfiguration.get().misc.keepalive.sendMultiple) {
+ if (this.keepAlivePending && !keepAlives.isEmpty() && keepAlives.contains(packet.getId())) {
@@ -82,17 +82,17 @@ index ccbf60f546974692c2c840f4bce87e2c95d1866c..ddc89e8960f7dc2f75f0e03ccbe6eda9
+ } else {
+ // Gale end - Purpur - send multiple keep-alive packets
if (pending != null && pending.challengeId() == packet.getId()) {
- this.player.pendingKeepAlives.remove(pending);
+ this.keepAlive.pendingKeepAlives.remove(pending);
-@@ -133,6 +149,7 @@ public abstract class ServerCommonPacketListenerImpl implements ServerCommonPack
- this.latency = this.player.pingCalculator5s.getAvgLatencyMS();
+@@ -104,6 +120,7 @@ public abstract class ServerCommonPacketListenerImpl implements ServerCommonPack
+ this.latency = this.keepAlive.pingCalculator5s.getAvgLatencyMS();
return;
}
+ } // Gale - Purpur - send multiple keep-alive packets
- for (java.util.Iterator itr = this.player.pendingKeepAlives.iterator(); itr.hasNext();) {
- net.minecraft.server.level.ServerPlayer.PendingKeepAlive ka = itr.next();
-@@ -274,6 +291,23 @@ public abstract class ServerCommonPacketListenerImpl implements ServerCommonPack
+ for (java.util.Iterator itr = this.keepAlive.pendingKeepAlives.iterator(); itr.hasNext();) {
+ io.papermc.paper.util.KeepAlive.PendingKeepAlive ka = itr.next();
+@@ -177,6 +194,23 @@ public abstract class ServerCommonPacketListenerImpl implements ServerCommonPack
protected void keepConnectionAlive() {
long millis = Util.getMillis();
// Paper start - improve keepalives
@@ -100,10 +100,10 @@ index ccbf60f546974692c2c840f4bce87e2c95d1866c..ddc89e8960f7dc2f75f0e03ccbe6eda9
+ if (org.galemc.gale.configuration.GaleGlobalConfiguration.get().misc.keepalive.sendMultiple) {
+ if (this.checkIfClosed(millis) && !this.processedDisconnect) {
+ long currTime = System.nanoTime();
-+ if ((currTime - this.player.lastKeepAliveTx) >= java.util.concurrent.TimeUnit.SECONDS.toNanos(1L)) { // 1 second
-+ this.player.lastKeepAliveTx = currTime;
++ if ((currTime - this.keepAlive.lastKeepAliveTx) >= java.util.concurrent.TimeUnit.SECONDS.toNanos(1L)) { // 1 second
++ this.keepAlive.lastKeepAliveTx = currTime;
+ if (this.keepAlivePending && !this.processedDisconnect && keepAlives.size() * 1000L >= KEEPALIVE_LIMIT) {
-+ this.disconnect(ServerCommonPacketListenerImpl.TIMEOUT_DISCONNECTION_MESSAGE, org.bukkit.event.player.PlayerKickEvent.Cause.TIMEOUT);
++ this.disconnect(TIMEOUT_DISCONNECTION_MESSAGE, io.papermc.paper.connection.DisconnectionReason.TIMEOUT);
+ } else if (this.checkIfClosed(millis)) {
+ this.keepAlivePending = true;
+ this.keepAlives.add(millis); // currentTime is ID
@@ -116,7 +116,7 @@ index ccbf60f546974692c2c840f4bce87e2c95d1866c..ddc89e8960f7dc2f75f0e03ccbe6eda9
if (this.checkIfClosed(millis) && !this.processedDisconnect) {
long currTime = System.nanoTime();
-@@ -292,6 +326,7 @@ public abstract class ServerCommonPacketListenerImpl implements ServerCommonPack
+@@ -195,6 +229,7 @@ public abstract class ServerCommonPacketListenerImpl implements ServerCommonPack
// Paper end - improve keepalives
}
}
@@ -124,3 +124,10 @@ index ccbf60f546974692c2c840f4bce87e2c95d1866c..ddc89e8960f7dc2f75f0e03ccbe6eda9
}
private boolean checkIfClosed(long time) {
+@@ -372,4 +407,4 @@ public abstract class ServerCommonPacketListenerImpl implements ServerCommonPack
+ protected CommonListenerCookie createCookie(ClientInformation clientInformation) {
+ return new CommonListenerCookie(this.playerProfile(), this.latency, clientInformation, this.transferred, this.playerBrand, this.keepAlive); // Paper
+ }
+-}
+\ No newline at end of file
++}
diff --git a/leaf-server/minecraft-patches/features/0075-Make-slow-login-timeout-configurable.patch b/leaf-server/minecraft-patches/features/0075-Make-slow-login-timeout-configurable.patch
index e011ea6a..ae37bf19 100644
--- a/leaf-server/minecraft-patches/features/0075-Make-slow-login-timeout-configurable.patch
+++ b/leaf-server/minecraft-patches/features/0075-Make-slow-login-timeout-configurable.patch
@@ -7,17 +7,16 @@ License: GPL-3.0 (https://www.gnu.org/licenses/gpl-3.0.html)
Gale - https://galemc.org
diff --git a/net/minecraft/server/network/ServerLoginPacketListenerImpl.java b/net/minecraft/server/network/ServerLoginPacketListenerImpl.java
-index 27fa7bbfc64dd103b7cd1c1216482af3719e3dbb..dc225eaa0daf238e091a0cf63a42158a30ecb7f0 100644
+index 5bac1c0ba691e516f2d603583971df7fe7ac212c..f9fad100d3e5e4b44a5b0f88e288e6fac7a250f7 100644
--- a/net/minecraft/server/network/ServerLoginPacketListenerImpl.java
+++ b/net/minecraft/server/network/ServerLoginPacketListenerImpl.java
-@@ -126,7 +126,11 @@ public class ServerLoginPacketListenerImpl implements ServerLoginPacketListener,
- this.finishLoginAndWaitForClient(this.authenticatedProfile);
- }
-
+@@ -105,7 +105,10 @@ public class ServerLoginPacketListenerImpl implements ServerLoginPacketListener,
+ }
+ public void tickTimeout() {
+ // Paper end - login cookie API
- if (this.tick++ == 600) {
+ // Gale start - make slow login timeout configurable
+ int slowLoginTimeout = org.galemc.gale.configuration.GaleGlobalConfiguration.get().misc.premiumAccountSlowLoginTimeout;
-+
+ if (this.tick++ >= (slowLoginTimeout < 1 ? MAX_TICKS_BEFORE_LOGIN : slowLoginTimeout)) {
+ // Gale end - make slow login timeout configurable
this.disconnect(Component.translatable("multiplayer.disconnect.slow_login"));
diff --git a/leaf-server/minecraft-patches/features/0078-Broadcast-crit-animations-as-the-entity-being-critte.patch b/leaf-server/minecraft-patches/features/0078-Broadcast-crit-animations-as-the-entity-being-critte.patch
index f1edc252..b27da753 100644
--- a/leaf-server/minecraft-patches/features/0078-Broadcast-crit-animations-as-the-entity-being-critte.patch
+++ b/leaf-server/minecraft-patches/features/0078-Broadcast-crit-animations-as-the-entity-being-critte.patch
@@ -13,10 +13,10 @@ As part of: MultiPaper (https://github.com/MultiPaper/MultiPaper)
Licensed under: GPL-3.0 (https://www.gnu.org/licenses/gpl-3.0.html)
diff --git a/net/minecraft/server/level/ServerPlayer.java b/net/minecraft/server/level/ServerPlayer.java
-index f752dceea48ed8264ae4cb60fdf2390f0e5019e1..9b715b5848b33dd023feccfa93c08924c92fbe13 100644
+index 784a08d0aed30fd0362e408aaa5772003021c0ad..bbe123fd18fe97ae93bf562f32af73cdde722f70 100644
--- a/net/minecraft/server/level/ServerPlayer.java
+++ b/net/minecraft/server/level/ServerPlayer.java
-@@ -2181,12 +2181,18 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc
+@@ -2115,12 +2115,18 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc
@Override
public void crit(Entity entityHit) {
diff --git a/leaf-server/minecraft-patches/features/0091-Reduce-RandomSource-instances.patch b/leaf-server/minecraft-patches/features/0091-Reduce-RandomSource-instances.patch
index dac5e4e2..1b56313e 100644
--- a/leaf-server/minecraft-patches/features/0091-Reduce-RandomSource-instances.patch
+++ b/leaf-server/minecraft-patches/features/0091-Reduce-RandomSource-instances.patch
@@ -26,10 +26,10 @@ index 92a820d48057ffe2ef35919341b6cdf605ca939e..b9b1bf351070cd2a744cdb683974fb2a
double d1 = center.y - maxRange;
double d2 = center.x + maxRange;
diff --git a/net/minecraft/server/level/ServerPlayer.java b/net/minecraft/server/level/ServerPlayer.java
-index 9b715b5848b33dd023feccfa93c08924c92fbe13..99eaa04bfcd2d37d3e49513e20bb5037119ef84d 100644
+index bbe123fd18fe97ae93bf562f32af73cdde722f70..feb4f7c70220e9c48a17a815631298bcb8366ded 100644
--- a/net/minecraft/server/level/ServerPlayer.java
+++ b/net/minecraft/server/level/ServerPlayer.java
-@@ -562,7 +562,7 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc
+@@ -496,7 +496,7 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc
long l1 = l * l;
int i = l1 > 2147483647L ? Integer.MAX_VALUE : (int)l1;
int coprime = this.getCoprime(i);
diff --git a/leaf-server/minecraft-patches/features/0096-Pufferfish-Dynamic-Activation-of-Brain.patch b/leaf-server/minecraft-patches/features/0096-Pufferfish-Dynamic-Activation-of-Brain.patch
index 71c0dcd7..91e17e8f 100644
--- a/leaf-server/minecraft-patches/features/0096-Pufferfish-Dynamic-Activation-of-Brain.patch
+++ b/leaf-server/minecraft-patches/features/0096-Pufferfish-Dynamic-Activation-of-Brain.patch
@@ -85,7 +85,7 @@ index ad114ca013e0d09d40755acbe916586868a519ed..3f70fca36f67fa421314ff92d372a971
if (!tickRateManager.isEntityFrozen(entity)) {
entity.checkDespawn();
diff --git a/net/minecraft/world/entity/Entity.java b/net/minecraft/world/entity/Entity.java
-index e457dc20f76d813c32225733af0b29646d501202..57e669eeb2a05805b8ed81311344bc27292608f3 100644
+index 96341ee17591135d77d78c94814313b66eed4c3d..28e2ad1238651b8adb47b77763b0c8ae8172fe8a 100644
--- a/net/minecraft/world/entity/Entity.java
+++ b/net/minecraft/world/entity/Entity.java
@@ -364,6 +364,8 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess
@@ -98,7 +98,7 @@ index e457dc20f76d813c32225733af0b29646d501202..57e669eeb2a05805b8ed81311344bc27
// Paper start - EAR 2
public final boolean defaultActivationState;
diff --git a/net/minecraft/world/entity/EntityType.java b/net/minecraft/world/entity/EntityType.java
-index b87c6da5272becfa1159e8352f5be5491824f66f..9dc5a7e9fdb83d98c3554fea064b06f022da4496 100644
+index 96e1f8f40a0af4350155f192ac2126b523c9f0f5..388689c44cf63ade939e271d490051c9b3fe8034 100644
--- a/net/minecraft/world/entity/EntityType.java
+++ b/net/minecraft/world/entity/EntityType.java
@@ -1085,6 +1085,7 @@ public class EntityType implements FeatureElement, EntityTypeT
@@ -299,10 +299,10 @@ index dd6666bd8b8df4148a1557627ce2a6ddab245ed6..6a9d3b749e251d3dac6fda13318bf5a0
super.customServerAiStep(level);
if ((this.tickCount + this.getId()) % 120 == 0) {
diff --git a/net/minecraft/world/entity/npc/Villager.java b/net/minecraft/world/entity/npc/Villager.java
-index 73214ccad93ccd186c149e8ce8913eb0e3fa324a..9b9514362f32ab79816678ce4be25a4a87fe49aa 100644
+index 6cf2af33d22d3df8374746f5926f3f2d5093431d..f37759161b2a682612c6676cdd0d15908259776c 100644
--- a/net/minecraft/world/entity/npc/Villager.java
+++ b/net/minecraft/world/entity/npc/Villager.java
-@@ -178,6 +178,8 @@ public class Villager extends AbstractVillager implements ReputationEventHandler
+@@ -177,6 +177,8 @@ public class Villager extends AbstractVillager implements ReputationEventHandler
(villager, poiType) -> poiType.is(PoiTypes.MEETING)
);
@@ -311,7 +311,7 @@ index 73214ccad93ccd186c149e8ce8913eb0e3fa324a..9b9514362f32ab79816678ce4be25a4a
public Villager(EntityType extends Villager> entityType, Level level) {
this(entityType, level, VillagerType.PLAINS);
}
-@@ -286,6 +288,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler
+@@ -285,6 +287,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler
}
// Paper end - EAR 2
@@ -319,7 +319,7 @@ index 73214ccad93ccd186c149e8ce8913eb0e3fa324a..9b9514362f32ab79816678ce4be25a4a
@Override
protected void customServerAiStep(ServerLevel level) {
// Paper start - EAR 2
-@@ -293,7 +296,11 @@ public class Villager extends AbstractVillager implements ReputationEventHandler
+@@ -292,7 +295,11 @@ public class Villager extends AbstractVillager implements ReputationEventHandler
}
protected void customServerAiStep(ServerLevel level, final boolean inactive) {
// Paper end - EAR 2
diff --git a/leaf-server/minecraft-patches/features/0098-Purpur-Server-Minecraft-Changes.patch b/leaf-server/minecraft-patches/features/0098-Purpur-Server-Minecraft-Changes.patch
index 41a80b3b..7580ae7c 100644
--- a/leaf-server/minecraft-patches/features/0098-Purpur-Server-Minecraft-Changes.patch
+++ b/leaf-server/minecraft-patches/features/0098-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: a112b6aca718e4500a6d48ca9d7158faf0f4adf9
+Commit: 591baf2648d0f75ffecc52f1d169348af35246dd
Patches listed below are removed in this patch, They exists in Gale or Leaf:
* "net/minecraft/CrashReport.java.patch"
@@ -278,10 +278,10 @@ index 17f33a309ead525975a3090514a6367260f0af09..f4360d9472ba344f2e7afd6d798d313d
Commands.literal("export")
.then(
diff --git a/net/minecraft/network/Connection.java b/net/minecraft/network/Connection.java
-index 34524dc5a503bebcec99ada0d9560d6f4df48cdf..1014ab2aeb5e496124c99c938538e88d75561cd5 100644
+index 8bab2c26e10e8495fd39be470bcb02917fe56f40..e72eda830644851656fae3118c513d7bd701be45 100644
--- a/net/minecraft/network/Connection.java
+++ b/net/minecraft/network/Connection.java
-@@ -578,11 +578,20 @@ public class Connection extends SimpleChannelInboundHandler> {
+@@ -579,11 +579,20 @@ public class Connection extends SimpleChannelInboundHandler> {
private static final int MAX_PER_TICK = io.papermc.paper.configuration.GlobalConfiguration.get().misc.maxJoinsPerTick; // Paper - Buffer joins to world
private static int joinAttemptsThisTick; // Paper - Buffer joins to world
private static int currTick; // Paper - Buffer joins to world
@@ -478,7 +478,7 @@ index 9da9ab3b835a8dcc7e1da286be1de88a3f0240fa..4b8c9aaf1d143bc38f52f646e4e73b56
for (ServerPlayer serverPlayer : players) {
diff --git a/net/minecraft/server/commands/GiveCommand.java b/net/minecraft/server/commands/GiveCommand.java
-index ea9db57a1fe2f11739ceb062ea7cce15776f959a..a919d91eeaaeef0f79190cc5e78e4f8b2fb468dd 100644
+index adba92a9ebef64561147427d1339f70e2701d93c..cbe614bb66679f9bda3ecb13a034432fbac7317d 100644
--- a/net/minecraft/server/commands/GiveCommand.java
+++ b/net/minecraft/server/commands/GiveCommand.java
@@ -69,6 +69,7 @@ public class GiveCommand {
@@ -487,7 +487,7 @@ index ea9db57a1fe2f11739ceb062ea7cce15776f959a..a919d91eeaaeef0f79190cc5e78e4f8b
boolean flag = serverPlayer.getInventory().add(itemStack1);
+ if (org.purpurmc.purpur.PurpurConfig.disableGiveCommandDrops) continue; // Purpur - add config option for toggling give command dropping
if (flag && itemStack1.isEmpty()) {
- ItemEntity itemEntity = serverPlayer.drop(itemStack, false);
+ ItemEntity itemEntity = serverPlayer.drop(itemStack, false, false, false, null); // Paper - do not fire PlayerDropItemEvent for /give command
if (itemEntity != null) {
diff --git a/net/minecraft/server/dedicated/DedicatedServer.java b/net/minecraft/server/dedicated/DedicatedServer.java
index ca1406178cfb1a5a10947872585e2dcf3059b460..87fc8861948b50361ec04c5a23406d3abdec6eac 100644
@@ -925,12 +925,12 @@ index 3f70fca36f67fa421314ff92d372a97112a19025..95c128f028c3cce7d0b37821a6e75208
}
// Paper end - Fix merchant inventory not closing on entity removal
diff --git a/net/minecraft/server/level/ServerPlayer.java b/net/minecraft/server/level/ServerPlayer.java
-index 99eaa04bfcd2d37d3e49513e20bb5037119ef84d..c6fafc3cb31d0a3dbbeaf8a9493d70de502110cc 100644
+index feb4f7c70220e9c48a17a815631298bcb8366ded..e217410145f7889ab4141947fc32d9d576a20326 100644
--- a/net/minecraft/server/level/ServerPlayer.java
+++ b/net/minecraft/server/level/ServerPlayer.java
-@@ -430,6 +430,10 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc
+@@ -428,6 +428,10 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc
+ public boolean isRealPlayer; // Paper
public @Nullable com.destroystokyo.paper.event.entity.PlayerNaturallySpawnCreaturesEvent playerNaturallySpawnedEvent; // Paper - PlayerNaturallySpawnCreaturesEvent
- public @Nullable String clientBrandName = null; // Paper - Brand support
public @Nullable org.bukkit.event.player.PlayerQuitEvent.QuitReason quitReason = null; // Paper - Add API for quit reason; there are a lot of changes to do if we change all methods leading to the event
+ public boolean purpurClient = false; // Purpur - Purpur client support
+ private boolean tpsBar = false; // Purpur - Implement TPSBar
@@ -939,7 +939,7 @@ index 99eaa04bfcd2d37d3e49513e20bb5037119ef84d..c6fafc3cb31d0a3dbbeaf8a9493d70de
// Paper start - rewrite chunk system
private ca.spottedleaf.moonrise.patches.chunk_system.player.RegionizedPlayerChunkLoader.PlayerChunkLoaderData chunkLoader;
-@@ -627,6 +631,10 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc
+@@ -561,6 +565,10 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc
this.respawnConfig = input.read("respawn", ServerPlayer.RespawnConfig.CODEC).orElse(null);
this.spawnExtraParticlesOnFall = input.getBooleanOr("spawn_extra_particles_on_fall", false);
this.raidOmenPosition = input.read("raid_omen_position", BlockPos.CODEC).orElse(null);
@@ -950,7 +950,7 @@ index 99eaa04bfcd2d37d3e49513e20bb5037119ef84d..c6fafc3cb31d0a3dbbeaf8a9493d70de
}
@Override
-@@ -644,6 +652,9 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc
+@@ -578,6 +586,9 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc
output.storeNullable("raid_omen_position", BlockPos.CODEC, this.raidOmenPosition);
this.saveEnderPearls(output);
this.getBukkitEntity().setExtraData(output); // CraftBukkit
@@ -960,7 +960,7 @@ index 99eaa04bfcd2d37d3e49513e20bb5037119ef84d..c6fafc3cb31d0a3dbbeaf8a9493d70de
}
private void saveParentVehicle(ValueOutput output) {
-@@ -849,6 +860,15 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc
+@@ -783,6 +794,15 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc
this.trackEnteredOrExitedLavaOnVehicle();
this.updatePlayerAttributes();
this.advancements.flushDirty(this, true);
@@ -976,7 +976,7 @@ index 99eaa04bfcd2d37d3e49513e20bb5037119ef84d..c6fafc3cb31d0a3dbbeaf8a9493d70de
}
private void updatePlayerAttributes() {
-@@ -1140,6 +1160,7 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc
+@@ -1074,6 +1094,7 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc
// Paper - moved up to sendClientboundPlayerCombatKillPacket()
sendClientboundPlayerCombatKillPacket(event.getShowDeathMessages(), deathScreenMessage); // Paper - Expand PlayerDeathEvent
Team team = this.getTeam();
@@ -984,7 +984,7 @@ index 99eaa04bfcd2d37d3e49513e20bb5037119ef84d..c6fafc3cb31d0a3dbbeaf8a9493d70de
if (team == null || team.getDeathMessageVisibility() == Team.Visibility.ALWAYS) {
this.server.getPlayerList().broadcastSystemMessage(deathMessage, false);
} else if (team.getDeathMessageVisibility() == Team.Visibility.HIDE_FOR_OTHER_TEAMS) {
-@@ -1246,6 +1267,18 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc
+@@ -1180,6 +1201,18 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc
if (this.isInvulnerableTo(level, damageSource)) {
return false;
} else {
@@ -1003,7 +1003,7 @@ index 99eaa04bfcd2d37d3e49513e20bb5037119ef84d..c6fafc3cb31d0a3dbbeaf8a9493d70de
Entity entity = damageSource.getEntity();
if (!( // Paper - split the if statement. If below statement is false, hurtServer would not have been evaluated. Return false.
!(entity instanceof Player player && !this.canHarmPlayer(player))
-@@ -1486,6 +1519,7 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc
+@@ -1420,6 +1453,7 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc
serverLevel.removePlayerImmediately(this, Entity.RemovalReason.CHANGED_DIMENSION);
this.unsetRemoved();
// CraftBukkit end
@@ -1011,7 +1011,7 @@ index 99eaa04bfcd2d37d3e49513e20bb5037119ef84d..c6fafc3cb31d0a3dbbeaf8a9493d70de
this.setServerLevel(level);
this.connection.internalTeleport(PositionMoveRotation.of(teleportTransition), teleportTransition.relatives()); // CraftBukkit - use internal teleport without event
this.connection.resetPosition();
-@@ -1601,7 +1635,7 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc
+@@ -1535,7 +1569,7 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc
new AABB(vec3.x() - 8.0, vec3.y() - 5.0, vec3.z() - 8.0, vec3.x() + 8.0, vec3.y() + 5.0, vec3.z() + 8.0),
monster -> monster.isPreventingPlayerRest(this.level(), this)
);
@@ -1020,7 +1020,7 @@ index 99eaa04bfcd2d37d3e49513e20bb5037119ef84d..c6fafc3cb31d0a3dbbeaf8a9493d70de
return Either.left(Player.BedSleepingProblem.NOT_SAFE);
}
}
-@@ -1638,7 +1672,19 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc
+@@ -1572,7 +1606,19 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc
CriteriaTriggers.SLEPT_IN_BED.trigger(this);
});
if (!this.level().canSleepThroughNights()) {
@@ -1041,7 +1041,7 @@ index 99eaa04bfcd2d37d3e49513e20bb5037119ef84d..c6fafc3cb31d0a3dbbeaf8a9493d70de
}
this.level().updateSleepingPlayerList();
-@@ -1730,6 +1776,7 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc
+@@ -1664,6 +1710,7 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc
@Override
public void openTextEdit(SignBlockEntity signEntity, boolean isFrontText) {
@@ -1049,7 +1049,7 @@ index 99eaa04bfcd2d37d3e49513e20bb5037119ef84d..c6fafc3cb31d0a3dbbeaf8a9493d70de
this.connection.send(new ClientboundBlockUpdatePacket(this.level(), signEntity.getBlockPos()));
this.connection.send(new ClientboundOpenSignEditorPacket(signEntity.getBlockPos(), isFrontText));
}
-@@ -2039,6 +2086,26 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc
+@@ -1973,6 +2020,26 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc
this.lastSentExp = -1; // CraftBukkit - Added to reset
}
@@ -1076,7 +1076,7 @@ index 99eaa04bfcd2d37d3e49513e20bb5037119ef84d..c6fafc3cb31d0a3dbbeaf8a9493d70de
@Override
public void displayClientMessage(Component chatComponent, boolean actionBar) {
this.sendSystemMessage(chatComponent, actionBar);
-@@ -2263,6 +2330,20 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc
+@@ -2197,6 +2264,20 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc
);
}
@@ -1097,7 +1097,7 @@ index 99eaa04bfcd2d37d3e49513e20bb5037119ef84d..c6fafc3cb31d0a3dbbeaf8a9493d70de
public void sendSystemMessage(Component mesage) {
this.sendSystemMessage(mesage, false);
}
-@@ -2401,8 +2482,68 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc
+@@ -2335,8 +2416,68 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc
public void resetLastActionTime() {
this.lastActionTime = Util.getMillis();
@@ -1166,7 +1166,7 @@ index 99eaa04bfcd2d37d3e49513e20bb5037119ef84d..c6fafc3cb31d0a3dbbeaf8a9493d70de
public ServerStatsCounter getStats() {
return this.stats;
}
-@@ -3029,4 +3170,56 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc
+@@ -2963,4 +3104,56 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc
return (org.bukkit.craftbukkit.entity.CraftPlayer) super.getBukkitEntity();
}
// CraftBukkit end
@@ -1272,36 +1272,23 @@ index 6734756d7a51e635a50a47577f9e6b6f8111db51..c4a4f08272b34f72dea4feaaeb66d153
+ // Purpur end - Shift right click to use exp for mending
}
diff --git a/net/minecraft/server/network/ServerCommonPacketListenerImpl.java b/net/minecraft/server/network/ServerCommonPacketListenerImpl.java
-index ddc89e8960f7dc2f75f0e03ccbe6eda96a0499e2..8a4c8e2fb86274b5bf95bda510029f4c5077d836 100644
+index 31091dd52172d447f98497097d8dabdfef720362..eb725c1b6da0c5ef48fa07d79070950f2b45e30e 100644
--- a/net/minecraft/server/network/ServerCommonPacketListenerImpl.java
+++ b/net/minecraft/server/network/ServerCommonPacketListenerImpl.java
-@@ -56,6 +56,7 @@ public abstract class ServerCommonPacketListenerImpl implements ServerCommonPack
- private static final long KEEPALIVE_LIMIT = KEEPALIVE_LIMIT_IN_SECONDS * 1000;
+@@ -57,6 +57,7 @@ public abstract class ServerCommonPacketListenerImpl implements ServerCommonPack
// Gale end - Purpur - send multiple keep-alive packets
protected static final net.minecraft.resources.ResourceLocation MINECRAFT_BRAND = net.minecraft.resources.ResourceLocation.withDefaultNamespace("brand"); // Paper - Brand support
+ public @Nullable String playerBrand; // Paper
+ protected static final net.minecraft.resources.ResourceLocation PURPUR_CLIENT = net.minecraft.resources.ResourceLocation.fromNamespaceAndPath("purpur", "client"); // Purpur - Purpur client support
- public ServerCommonPacketListenerImpl(MinecraftServer server, Connection connection, CommonListenerCookie cookie, net.minecraft.server.level.ServerPlayer player) { // CraftBukkit
+ public ServerCommonPacketListenerImpl(MinecraftServer server, Connection connection, CommonListenerCookie cookie) {
this.server = server;
-@@ -215,6 +216,12 @@ public abstract class ServerCommonPacketListenerImpl implements ServerCommonPack
- return;
- }
-
-+ // Purpur start - Purpur client support
-+ if (identifier.equals(PURPUR_CLIENT)) {
-+ this.player.purpurClient = true;
-+ }
-+ // Purpur end - Purpur client support
-+
- if (identifier.equals(MINECRAFT_BRAND)) {
- this.player.clientBrandName = 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 a07310aebd8406af27864358e15715fcc7694329..acb1eda4a4b10006e1dd641ee41ee77ebf11d142 100644
+index 38376506f8b886ed66ec48b1a78dede2a7cabe99..e4114d44d089f8434461f2653a787ff0d3595a04 100644
--- a/net/minecraft/server/network/ServerGamePacketListenerImpl.java
+++ b/net/minecraft/server/network/ServerGamePacketListenerImpl.java
-@@ -324,6 +324,20 @@ public class ServerGamePacketListenerImpl
- this.tickEndEvent = new io.papermc.paper.event.packet.ClientTickEndEvent(player.getBukkitEntity()); // Paper - add client tick end event
+@@ -326,6 +326,20 @@ public class ServerGamePacketListenerImpl
+ this.playerGameConnection = new io.papermc.paper.connection.PaperPlayerGameConnection(this); // Paper
}
+ // Purpur start - AFK API
@@ -1321,7 +1308,7 @@ index a07310aebd8406af27864358e15715fcc7694329..acb1eda4a4b10006e1dd641ee41ee77e
@Override
public void tick() {
if (this.ackBlockChangesUpTo > -1) {
-@@ -382,6 +396,12 @@ public class ServerGamePacketListenerImpl
+@@ -384,6 +398,12 @@ public class ServerGamePacketListenerImpl
if (this.player.getLastActionTime() > 0L
&& this.server.getPlayerIdleTimeout() > 0
&& Util.getMillis() - this.player.getLastActionTime() > this.server.getPlayerIdleTimeout() * 1000L * 60L && !this.player.wonGame) { // Paper - Prevent AFK kick while watching end credits
@@ -1334,7 +1321,7 @@ index a07310aebd8406af27864358e15715fcc7694329..acb1eda4a4b10006e1dd641ee41ee77e
this.player.resetLastActionTime(); // CraftBukkit - SPIGOT-854
this.disconnect(Component.translatable("multiplayer.disconnect.idling"), org.bukkit.event.player.PlayerKickEvent.Cause.IDLING); // Paper - kick event cause
}
-@@ -651,6 +671,8 @@ public class ServerGamePacketListenerImpl
+@@ -653,6 +673,8 @@ public class ServerGamePacketListenerImpl
this.lastYaw = to.getYaw();
this.lastPitch = to.getPitch();
@@ -1343,7 +1330,7 @@ index a07310aebd8406af27864358e15715fcc7694329..acb1eda4a4b10006e1dd641ee41ee77e
Location oldTo = to.clone();
PlayerMoveEvent event = new PlayerMoveEvent(player, from, to);
this.cserver.getPluginManager().callEvent(event);
-@@ -730,6 +752,7 @@ public class ServerGamePacketListenerImpl
+@@ -732,6 +754,7 @@ public class ServerGamePacketListenerImpl
PacketUtils.ensureRunningOnSameThread(packet, this, this.player.level());
if (packet.getId() == this.awaitingTeleport) {
if (this.awaitingPositionFromClient == null) {
@@ -1351,7 +1338,7 @@ index a07310aebd8406af27864358e15715fcc7694329..acb1eda4a4b10006e1dd641ee41ee77e
this.disconnect(Component.translatable("multiplayer.disconnect.invalid_player_movement"), org.bukkit.event.player.PlayerKickEvent.Cause.INVALID_PLAYER_MOVEMENT); // Paper - kick event cause
return;
}
-@@ -1268,6 +1291,10 @@ public class ServerGamePacketListenerImpl
+@@ -1270,6 +1293,10 @@ public class ServerGamePacketListenerImpl
final int maxBookPageSize = pageMax.intValue();
final double multiplier = Math.clamp(io.papermc.paper.configuration.GlobalConfiguration.get().itemValidation.bookSize.totalMultiplier, 0.3D, 1D);
long byteAllowed = maxBookPageSize;
@@ -1362,7 +1349,7 @@ index a07310aebd8406af27864358e15715fcc7694329..acb1eda4a4b10006e1dd641ee41ee77e
for (final String page : pageList) {
final int byteLength = page.getBytes(java.nio.charset.StandardCharsets.UTF_8).length;
byteTotal += byteLength;
-@@ -1292,7 +1319,8 @@ public class ServerGamePacketListenerImpl
+@@ -1294,7 +1321,8 @@ public class ServerGamePacketListenerImpl
}
if (byteTotal > byteAllowed) {
@@ -1372,7 +1359,7 @@ index a07310aebd8406af27864358e15715fcc7694329..acb1eda4a4b10006e1dd641ee41ee77e
this.disconnectAsync(Component.literal("Book too large!"), org.bukkit.event.player.PlayerKickEvent.Cause.ILLEGAL_ACTION); // Paper - kick event cause // Paper - add proper async disconnect
return;
}
-@@ -1311,31 +1339,45 @@ public class ServerGamePacketListenerImpl
+@@ -1313,31 +1341,45 @@ public class ServerGamePacketListenerImpl
Optional optional = packet.title();
optional.ifPresent(list::add);
list.addAll(packet.pages());
@@ -1422,7 +1409,7 @@ index a07310aebd8406af27864358e15715fcc7694329..acb1eda4a4b10006e1dd641ee41ee77e
itemStack.set(
DataComponents.WRITTEN_BOOK_CONTENT,
new WrittenBookContent(this.filterableFromOutgoing(title), this.player.getName().getString(), 0, list, true)
-@@ -1349,6 +1391,16 @@ public class ServerGamePacketListenerImpl
+@@ -1351,6 +1393,16 @@ public class ServerGamePacketListenerImpl
return this.player.isTextFilteringEnabled() ? Filterable.passThrough(filteredText.filteredOrEmpty()) : Filterable.from(filteredText);
}
@@ -1439,7 +1426,7 @@ index a07310aebd8406af27864358e15715fcc7694329..acb1eda4a4b10006e1dd641ee41ee77e
@Override
public void handleEntityTagQuery(ServerboundEntityTagQueryPacket packet) {
PacketUtils.ensureRunningOnSameThread(packet, this, this.player.level());
-@@ -1388,7 +1440,15 @@ public class ServerGamePacketListenerImpl
+@@ -1390,7 +1442,15 @@ public class ServerGamePacketListenerImpl
@Override
public void handleMovePlayer(ServerboundMovePlayerPacket packet) {
PacketUtils.ensureRunningOnSameThread(packet, this, this.player.level());
@@ -1456,7 +1443,7 @@ index a07310aebd8406af27864358e15715fcc7694329..acb1eda4a4b10006e1dd641ee41ee77e
this.disconnect(Component.translatable("multiplayer.disconnect.invalid_player_movement"), org.bukkit.event.player.PlayerKickEvent.Cause.INVALID_PLAYER_MOVEMENT); // Paper - kick event cause
} else {
ServerLevel serverLevel = this.player.level();
-@@ -1570,7 +1630,7 @@ public class ServerGamePacketListenerImpl
+@@ -1572,7 +1632,7 @@ public class ServerGamePacketListenerImpl
movedWrongly = true;
if (event.getLogWarning())
// Paper end
@@ -1465,7 +1452,7 @@ index a07310aebd8406af27864358e15715fcc7694329..acb1eda4a4b10006e1dd641ee41ee77e
} // Paper
}
-@@ -1635,6 +1695,8 @@ public class ServerGamePacketListenerImpl
+@@ -1637,6 +1697,8 @@ public class ServerGamePacketListenerImpl
this.lastYaw = to.getYaw();
this.lastPitch = to.getPitch();
@@ -1474,7 +1461,7 @@ index a07310aebd8406af27864358e15715fcc7694329..acb1eda4a4b10006e1dd641ee41ee77e
Location oldTo = to.clone();
PlayerMoveEvent event = new PlayerMoveEvent(player, from, to);
this.cserver.getPluginManager().callEvent(event);
-@@ -1690,6 +1752,13 @@ public class ServerGamePacketListenerImpl
+@@ -1692,6 +1754,13 @@ public class ServerGamePacketListenerImpl
this.player.tryResetCurrentImpulseContext();
}
@@ -1488,7 +1475,7 @@ index a07310aebd8406af27864358e15715fcc7694329..acb1eda4a4b10006e1dd641ee41ee77e
this.player.checkMovementStatistics(this.player.getX() - x, this.player.getY() - y, this.player.getZ() - z);
this.lastGoodX = this.player.getX();
this.lastGoodY = this.player.getY();
-@@ -1707,6 +1776,17 @@ public class ServerGamePacketListenerImpl
+@@ -1709,6 +1778,17 @@ public class ServerGamePacketListenerImpl
}
}
@@ -1506,7 +1493,7 @@ index a07310aebd8406af27864358e15715fcc7694329..acb1eda4a4b10006e1dd641ee41ee77e
private boolean shouldCheckPlayerMovement(boolean isElytraMovement) {
if (this.isSingleplayerOwner()) {
return false;
-@@ -2104,6 +2184,7 @@ public class ServerGamePacketListenerImpl
+@@ -2106,6 +2186,7 @@ public class ServerGamePacketListenerImpl
boolean cancelled;
if (hitResult == null || hitResult.getType() != HitResult.Type.BLOCK) {
@@ -1514,7 +1501,7 @@ index a07310aebd8406af27864358e15715fcc7694329..acb1eda4a4b10006e1dd641ee41ee77e
org.bukkit.event.player.PlayerInteractEvent event = CraftEventFactory.callPlayerInteractEvent(this.player, Action.RIGHT_CLICK_AIR, itemInHand, hand);
cancelled = event.useItemInHand() == Event.Result.DENY;
} else {
-@@ -2755,6 +2836,7 @@ public class ServerGamePacketListenerImpl
+@@ -2753,6 +2834,7 @@ public class ServerGamePacketListenerImpl
AABB boundingBox = target.getBoundingBox();
if (this.player.canInteractWithEntity(boundingBox, io.papermc.paper.configuration.GlobalConfiguration.get().misc.clientInteractionLeniencyDistance.or(3.0))) { // Paper - configurable lenience value for interact range
@@ -1522,7 +1509,7 @@ index a07310aebd8406af27864358e15715fcc7694329..acb1eda4a4b10006e1dd641ee41ee77e
packet.dispatch(
new ServerboundInteractPacket.Handler() {
private void performInteraction(InteractionHand hand, ServerGamePacketListenerImpl.EntityInteraction entityInteraction, PlayerInteractEntityEvent event) { // CraftBukkit
-@@ -2767,6 +2849,8 @@ public class ServerGamePacketListenerImpl
+@@ -2765,6 +2847,8 @@ public class ServerGamePacketListenerImpl
ServerGamePacketListenerImpl.this.cserver.getPluginManager().callEvent(event);
@@ -1531,7 +1518,7 @@ index a07310aebd8406af27864358e15715fcc7694329..acb1eda4a4b10006e1dd641ee41ee77e
// Entity in bucket - SPIGOT-4048 and SPIGOT-6859a
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))) {
target.resendPossiblyDesyncedEntityData(ServerGamePacketListenerImpl.this.player); // Paper - The entire mob gets deleted, so resend it
-@@ -3543,7 +3627,7 @@ public class ServerGamePacketListenerImpl
+@@ -3541,7 +3625,7 @@ public class ServerGamePacketListenerImpl
@Override
public void handleChangeGameMode(ServerboundChangeGameModePacket packet) {
PacketUtils.ensureRunningOnSameThread(packet, this, this.player.level());
@@ -1540,11 +1527,24 @@ index a07310aebd8406af27864358e15715fcc7694329..acb1eda4a4b10006e1dd641ee41ee77e
LOGGER.warn(
"Player {} tried to change game mode to {} without required permissions",
this.player.getGameProfile().getName(),
+@@ -3753,6 +3837,12 @@ public class ServerGamePacketListenerImpl
+ return;
+ }
+
++ // Purpur start - Purpur client support
++ if (identifier.equals(PURPUR_CLIENT)) {
++ this.player.purpurClient = true;
++ }
++ // Purpur end - Purpur client support
++
+ if (identifier.equals(MINECRAFT_BRAND)) {
+ this.player.connection.playerBrand = new net.minecraft.network.FriendlyByteBuf(io.netty.buffer.Unpooled.wrappedBuffer(data)).readUtf(256);
+ }
diff --git a/net/minecraft/server/network/ServerLoginPacketListenerImpl.java b/net/minecraft/server/network/ServerLoginPacketListenerImpl.java
-index dc225eaa0daf238e091a0cf63a42158a30ecb7f0..c61a94a08486cdeba84ccfbc58ef3cabd4a461d8 100644
+index f9fad100d3e5e4b44a5b0f88e288e6fac7a250f7..6d320ed179393e47398c44f2ba2b2285016f349e 100644
--- a/net/minecraft/server/network/ServerLoginPacketListenerImpl.java
+++ b/net/minecraft/server/network/ServerLoginPacketListenerImpl.java
-@@ -319,7 +319,7 @@ public class ServerLoginPacketListenerImpl implements ServerLoginPacketListener,
+@@ -285,7 +285,7 @@ public class ServerLoginPacketListenerImpl implements ServerLoginPacketListener,
ServerLoginPacketListenerImpl.LOGGER.warn("Failed to verify username but will let them in anyway!");
ServerLoginPacketListenerImpl.this.startClientVerification(ServerLoginPacketListenerImpl.this.createOfflineProfile(string1)); // Spigot
} else {
@@ -1554,7 +1554,7 @@ index dc225eaa0daf238e091a0cf63a42158a30ecb7f0..c61a94a08486cdeba84ccfbc58ef3cab
}
} catch (AuthenticationUnavailableException var4) {
diff --git a/net/minecraft/server/players/PlayerList.java b/net/minecraft/server/players/PlayerList.java
-index 0acfb86df4a350e41ea1646a38dad14d43f2cb1d..0f02eef9bcae59bf3df6471b10dbfa8252337140 100644
+index 1dad0f73adf361348466b3f0a0eb31143006b0e9..195e972dd9b3b5d29866c28cc88c80bae31916b4 100644
--- a/net/minecraft/server/players/PlayerList.java
+++ b/net/minecraft/server/players/PlayerList.java
@@ -412,6 +412,7 @@ public abstract class PlayerList {
@@ -1573,16 +1573,7 @@ index 0acfb86df4a350e41ea1646a38dad14d43f2cb1d..0f02eef9bcae59bf3df6471b10dbfa82
ServerLevel serverLevel = player.level();
player.awardStat(Stats.LEAVE_GAME);
// CraftBukkit start - Quitting must be before we do final save of data, in case plugins need to modify it
-@@ -684,7 +686,7 @@ public abstract class PlayerList {
- // return this.players.size() >= this.maxPlayers && !this.canBypassPlayerLimit(gameProfile)
- // ? Component.translatable("multiplayer.disconnect.server_full")
- // : null;
-- if (this.players.size() >= this.maxPlayers && !this.canBypassPlayerLimit(gameProfile)) {
-+ if (this.players.size() >= this.maxPlayers && !(player.hasPermission("purpur.joinfullserver") || this.canBypassPlayerLimit(gameProfile))) { // Purpur - Allow player join full server by permission
- event.disallow(org.bukkit.event.player.PlayerLoginEvent.Result.KICK_FULL, net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer.legacySection().deserialize(org.spigotmc.SpigotConfig.serverFullMessage)); // Spigot // Paper - Adventure
- }
- }
-@@ -997,6 +999,20 @@ public abstract class PlayerList {
+@@ -964,6 +966,20 @@ public abstract class PlayerList {
}
}
@@ -1603,7 +1594,7 @@ index 0acfb86df4a350e41ea1646a38dad14d43f2cb1d..0f02eef9bcae59bf3df6471b10dbfa82
public void broadcastAll(Packet> packet, ResourceKey dimension) {
for (ServerPlayer serverPlayer : this.players) {
if (serverPlayer.level().dimension() == dimension) {
-@@ -1081,6 +1097,7 @@ public abstract class PlayerList {
+@@ -1048,6 +1064,7 @@ public abstract class PlayerList {
} else {
b = (byte)(24 + permLevel);
}
@@ -1611,7 +1602,7 @@ index 0acfb86df4a350e41ea1646a38dad14d43f2cb1d..0f02eef9bcae59bf3df6471b10dbfa82
player.connection.send(new ClientboundEntityEventPacket(player, b));
}
-@@ -1089,6 +1106,27 @@ public abstract class PlayerList {
+@@ -1056,11 +1073,32 @@ public abstract class PlayerList {
player.getBukkitEntity().recalculatePermissions(); // CraftBukkit
this.server.getCommands().sendCommands(player);
} // Paper - Add sendOpLevel API
@@ -1638,7 +1629,13 @@ index 0acfb86df4a350e41ea1646a38dad14d43f2cb1d..0f02eef9bcae59bf3df6471b10dbfa82
+ // Purpur end - Barrels and enderchests 6 rows
}
- public boolean isWhiteListed(GameProfile profile) {
+ // Paper start - whitelist verify event / login event
+ public LoginResult canBypassFullServerLogin(final GameProfile profile, final LoginResult currentResult) {
+- final boolean shouldKick = this.players.size() >= this.maxPlayers && !this.canBypassPlayerLimit(profile);
++ final boolean shouldKick = this.players.size() >= this.maxPlayers && !(/*player.hasPermission("purpur.joinfullserver") || */this.canBypassPlayerLimit(profile)); // Purpur - Allow player join full server by permission TODO: this hasn't worked for a while, so comment it out until we can reliably check perms of the player joining
+ final io.papermc.paper.event.player.PlayerServerFullCheckEvent fullCheckEvent = new io.papermc.paper.event.player.PlayerServerFullCheckEvent(
+ com.destroystokyo.paper.profile.CraftPlayerProfile.asBukkitMirror(profile),
+ io.papermc.paper.adventure.PaperAdventure.asAdventure(currentResult.message),
diff --git a/net/minecraft/server/players/SleepStatus.java b/net/minecraft/server/players/SleepStatus.java
index 2a7ae521654ad5c9f392baa5562e64bb71b13097..3a3e6992563236141db687084aeec9684437a7db 100644
--- a/net/minecraft/server/players/SleepStatus.java
@@ -4598,10 +4595,10 @@ index 517c546cfc8eca2191df57289e6a22ac64fc867c..8964bb5098c0dc36741af3656af6bc0b
}
}
diff --git a/net/minecraft/world/entity/animal/HappyGhast.java b/net/minecraft/world/entity/animal/HappyGhast.java
-index 4e74d5b3076f50f9294553b453f5903ef32f1e8a..e04da94daced96a7eb9fdb01c551bea667b72d76 100644
+index f07dcf7d45b1b717faeae0c4129fb00a22fb7d57..9763a5e24e0fed9b49b6ac59911f6c9f8e893db5 100644
--- a/net/minecraft/world/entity/animal/HappyGhast.java
+++ b/net/minecraft/world/entity/animal/HappyGhast.java
-@@ -118,6 +118,47 @@ public class HappyGhast extends Animal {
+@@ -124,6 +124,47 @@ public class HappyGhast extends Animal {
this.removeAllGoals(goal -> true);
}
@@ -4649,7 +4646,7 @@ index 4e74d5b3076f50f9294553b453f5903ef32f1e8a..e04da94daced96a7eb9fdb01c551bea6
@Override
protected void ageBoundaryReached() {
if (this.isBaby()) {
-@@ -141,7 +182,7 @@ public class HappyGhast extends Animal {
+@@ -147,7 +188,7 @@ public class HappyGhast extends Animal {
@Override
protected float sanitizeScale(float scale) {
@@ -11304,10 +11301,10 @@ index a621e08fe4f88fcfa8da83bc44b23fc2ffaa5918..ab320cf5a8c68fd239e81172a2f3909a
Vec3 deltaMovement = Vex.this.getDeltaMovement();
Vex.this.setYRot(-((float)Mth.atan2(deltaMovement.x, deltaMovement.z)) * (180.0F / (float)Math.PI));
diff --git a/net/minecraft/world/entity/monster/Vindicator.java b/net/minecraft/world/entity/monster/Vindicator.java
-index e12643c0a1aa9608c34cab96d5c04abc60428322..df95c6be4469eeefa248e5ef18cfaba3d4cdeea6 100644
+index 835b522a77fc4e1ec84bd5134e12233a02b66a66..7f70b2387842f65da4632f1a27669a02d4e0402d 100644
--- a/net/minecraft/world/entity/monster/Vindicator.java
+++ b/net/minecraft/world/entity/monster/Vindicator.java
-@@ -57,15 +57,56 @@ public class Vindicator extends AbstractIllager {
+@@ -56,15 +56,56 @@ public class Vindicator extends AbstractIllager {
super(entityType, level);
}
@@ -11364,7 +11361,7 @@ index e12643c0a1aa9608c34cab96d5c04abc60428322..df95c6be4469eeefa248e5ef18cfaba3
this.targetSelector.addGoal(1, new HurtByTargetGoal(this, Raider.class).setAlertOthers());
this.targetSelector.addGoal(2, new NearestAttackableTargetGoal<>(this, Player.class, true));
this.targetSelector.addGoal(3, new NearestAttackableTargetGoal<>(this, AbstractVillager.class, true));
-@@ -132,6 +173,11 @@ public class Vindicator extends AbstractIllager {
+@@ -131,6 +172,11 @@ public class Vindicator extends AbstractIllager {
RandomSource random = level.getRandom();
this.populateDefaultEquipmentSlots(random, difficulty);
this.populateDefaultEquipmentEnchantments(level, random, difficulty);
@@ -12348,10 +12345,10 @@ index e282b6ab6d0d1c11ee40f5f436bd50fa90ddc88b..d6ae13c19481ce33bfa0b6c9db632830
this.spawnCat(pos, level, true);
}
diff --git a/net/minecraft/world/entity/npc/Villager.java b/net/minecraft/world/entity/npc/Villager.java
-index 6ecd99adc1c22681553714ff23e557b8f7854737..165d0f50e7818b6daf834507033feaa2fabcaf19 100644
+index f37759161b2a682612c6676cdd0d15908259776c..014bb5b6e82bb11b756430999522f4b8f9356d9f 100644
--- a/net/minecraft/world/entity/npc/Villager.java
+++ b/net/minecraft/world/entity/npc/Villager.java
-@@ -179,6 +179,8 @@ public class Villager extends AbstractVillager implements ReputationEventHandler
+@@ -178,6 +178,8 @@ public class Villager extends AbstractVillager implements ReputationEventHandler
);
public long nextGolemPanic = -1; // Pufferfish
@@ -12360,7 +12357,7 @@ index 6ecd99adc1c22681553714ff23e557b8f7854737..165d0f50e7818b6daf834507033feaa2
public Villager(EntityType extends Villager> entityType, Level level) {
this(entityType, level, VillagerType.PLAINS);
-@@ -197,6 +199,103 @@ public class Villager extends AbstractVillager implements ReputationEventHandler
+@@ -196,6 +198,103 @@ public class Villager extends AbstractVillager implements ReputationEventHandler
this.setVillagerData(this.getVillagerData().withType(villagerType).withProfession(level.registryAccess(), VillagerProfession.NONE));
}
@@ -12464,7 +12461,7 @@ index 6ecd99adc1c22681553714ff23e557b8f7854737..165d0f50e7818b6daf834507033feaa2
@Override
public Brain getBrain() {
return (Brain)super.getBrain();
-@@ -230,7 +329,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler
+@@ -229,7 +328,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler
villagerBrain.setSchedule(Schedule.VILLAGER_DEFAULT);
villagerBrain.addActivityWithConditions(
Activity.WORK,
@@ -12473,7 +12470,7 @@ index 6ecd99adc1c22681553714ff23e557b8f7854737..165d0f50e7818b6daf834507033feaa2
ImmutableSet.of(Pair.of(MemoryModuleType.JOB_SITE, MemoryStatus.VALUE_PRESENT))
);
}
-@@ -262,7 +361,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler
+@@ -261,7 +360,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler
}
public static AttributeSupplier.Builder createAttributes() {
@@ -12482,7 +12479,7 @@ index 6ecd99adc1c22681553714ff23e557b8f7854737..165d0f50e7818b6daf834507033feaa2
}
public boolean assignProfessionWhenSpawned() {
-@@ -294,12 +393,21 @@ public class Villager extends AbstractVillager implements ReputationEventHandler
+@@ -293,12 +392,21 @@ public class Villager extends AbstractVillager implements ReputationEventHandler
// Paper start - EAR 2
this.customServerAiStep(level, false);
}
@@ -12506,7 +12503,7 @@ index 6ecd99adc1c22681553714ff23e557b8f7854737..165d0f50e7818b6daf834507033feaa2
// Pufferfish end
if (this.assignProfessionWhenSpawned) {
this.assignProfessionWhenSpawned = false;
-@@ -355,7 +463,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler
+@@ -354,7 +462,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler
return super.mobInteract(player, hand);
} else if (this.isBaby()) {
this.setUnhappy();
@@ -12515,7 +12512,7 @@ index 6ecd99adc1c22681553714ff23e557b8f7854737..165d0f50e7818b6daf834507033feaa2
} else {
if (!this.level().isClientSide) {
boolean isEmpty = this.getOffers().isEmpty();
-@@ -368,9 +476,12 @@ public class Villager extends AbstractVillager implements ReputationEventHandler
+@@ -367,9 +475,12 @@ public class Villager extends AbstractVillager implements ReputationEventHandler
}
if (isEmpty) {
@@ -12529,7 +12526,7 @@ index 6ecd99adc1c22681553714ff23e557b8f7854737..165d0f50e7818b6daf834507033feaa2
this.startTrading(player);
}
-@@ -507,7 +618,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler
+@@ -506,7 +617,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler
public void updateDemand() {
for (MerchantOffer merchantOffer : this.getOffers()) {
@@ -12538,7 +12535,7 @@ index 6ecd99adc1c22681553714ff23e557b8f7854737..165d0f50e7818b6daf834507033feaa2
}
}
-@@ -700,7 +811,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler
+@@ -699,7 +810,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler
@Override
public boolean canBreed() {
@@ -12547,7 +12544,7 @@ index 6ecd99adc1c22681553714ff23e557b8f7854737..165d0f50e7818b6daf834507033feaa2
}
private boolean hungry() {
-@@ -867,7 +978,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler
+@@ -866,7 +977,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler
}
public boolean hasFarmSeeds() {
@@ -12556,7 +12553,7 @@ index 6ecd99adc1c22681553714ff23e557b8f7854737..165d0f50e7818b6daf834507033feaa2
}
@Override
-@@ -922,6 +1033,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler
+@@ -921,6 +1032,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler
}
public void spawnGolemIfNeeded(ServerLevel serverLevel, long gameTime, int minVillagerAmount) {
@@ -12564,7 +12561,7 @@ index 6ecd99adc1c22681553714ff23e557b8f7854737..165d0f50e7818b6daf834507033feaa2
if (this.wantsToSpawnGolem(gameTime)) {
AABB aabb = this.getBoundingBox().inflate(10.0, 10.0, 10.0);
List entitiesOfClass = serverLevel.getEntitiesOfClass(Villager.class, aabb);
-@@ -995,6 +1107,12 @@ public class Villager extends AbstractVillager implements ReputationEventHandler
+@@ -994,6 +1106,12 @@ public class Villager extends AbstractVillager implements ReputationEventHandler
@Override
public void startSleeping(BlockPos pos) {
@@ -14238,7 +14235,7 @@ index 3acc2ae8533f19a6f9b2b6a1d96271f1047384a4..793c0a380b84d246db748be7e8807f1c
return this.getOrDefault(DataComponents.ENCHANTMENTS, ItemEnchantments.EMPTY);
}
diff --git a/net/minecraft/world/item/Items.java b/net/minecraft/world/item/Items.java
-index cb27584b484c5103feb85e139a3dbf95a23a1236..b309312491bf822582d8cc182d609f7b74399ae8 100644
+index b89a7fae0321cbce09faf1503ddc57ca5acaa148..4d5a0b1bc794a3029b0724c6dddeffa6f549a7d5 100644
--- a/net/minecraft/world/item/Items.java
+++ b/net/minecraft/world/item/Items.java
@@ -383,7 +383,7 @@ public class Items {
@@ -14250,7 +14247,7 @@ index cb27584b484c5103feb85e139a3dbf95a23a1236..b309312491bf822582d8cc182d609f7b
public static final Item CREAKING_HEART = registerBlock(Blocks.CREAKING_HEART);
public static final Item CHEST = registerBlock(Blocks.CHEST, properties -> properties.component(DataComponents.CONTAINER, ItemContainerContents.EMPTY));
public static final Item CRAFTING_TABLE = registerBlock(Blocks.CRAFTING_TABLE);
-@@ -2089,7 +2089,7 @@ public class Items {
+@@ -2092,7 +2092,7 @@ public class Items {
"sweet_berries", createBlockItemWithCustomItemName(Blocks.SWEET_BERRY_BUSH), new Item.Properties().food(Foods.SWEET_BERRIES)
);
public static final Item GLOW_BERRIES = registerItem(
diff --git a/leaf-server/minecraft-patches/features/0099-Fix-Pufferfish-and-Purpur-patches.patch b/leaf-server/minecraft-patches/features/0099-Fix-Pufferfish-and-Purpur-patches.patch
index 7d30f106..dba3119d 100644
--- a/leaf-server/minecraft-patches/features/0099-Fix-Pufferfish-and-Purpur-patches.patch
+++ b/leaf-server/minecraft-patches/features/0099-Fix-Pufferfish-and-Purpur-patches.patch
@@ -5,7 +5,7 @@ Subject: [PATCH] Fix Pufferfish and Purpur patches
diff --git a/net/minecraft/server/MinecraftServer.java b/net/minecraft/server/MinecraftServer.java
-index db1f0031a6ae6ba1b9ea265043b87817e2c746f8..1aab4d41054f8e780e6c0ccdb96affee19068311 100644
+index f05fa801f35f4afcc93fcace6a98cee0fa3ec531..b567eed9e07e281c56ff707ad938661f37f4ee3f 100644
--- a/net/minecraft/server/MinecraftServer.java
+++ b/net/minecraft/server/MinecraftServer.java
@@ -277,7 +277,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop byteAllowed) {
@@ -78,7 +78,7 @@ index 5031e4e9b59a1e013152f788b20c58646b30770f..1aaa94a2800687faa4d86698a4e1ad72
this.disconnectAsync(Component.literal("Book too large!"), org.bukkit.event.player.PlayerKickEvent.Cause.ILLEGAL_ACTION); // Paper - kick event cause // Paper - add proper async disconnect
return;
diff --git a/net/minecraft/world/entity/Entity.java b/net/minecraft/world/entity/Entity.java
-index d8209037e988bc7a68f634a6650930bd1082c4d1..a2a4ad515a4ef0fa24948d0f47c5bd78ec7e6555 100644
+index fb387919e51504beafd2e7947faa41795df18100..0cdd3eb97e74aa3955f014a1f8f6a7d1580d323f 100644
--- a/net/minecraft/world/entity/Entity.java
+++ b/net/minecraft/world/entity/Entity.java
@@ -543,23 +543,36 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess
@@ -128,7 +128,7 @@ index d8209037e988bc7a68f634a6650930bd1082c4d1..a2a4ad515a4ef0fa24948d0f47c5bd78
public Entity(EntityType> entityType, Level level) {
this.type = entityType;
diff --git a/net/minecraft/world/entity/LivingEntity.java b/net/minecraft/world/entity/LivingEntity.java
-index d7d6e0543dc26694891e4a9049b8162caadbf5e6..d59caf13e9066f2171c360e07a26122a540380a0 100644
+index dd5343287503e2818e083696a17362091d94e652..b536461c672c608aeeb690f41ea457fc57768e4f 100644
--- a/net/minecraft/world/entity/LivingEntity.java
+++ b/net/minecraft/world/entity/LivingEntity.java
@@ -1049,13 +1049,13 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin
diff --git a/leaf-server/minecraft-patches/features/0102-Remove-vanilla-username-check.patch b/leaf-server/minecraft-patches/features/0102-Remove-vanilla-username-check.patch
index a7e15204..a2c641da 100644
--- a/leaf-server/minecraft-patches/features/0102-Remove-vanilla-username-check.patch
+++ b/leaf-server/minecraft-patches/features/0102-Remove-vanilla-username-check.patch
@@ -5,10 +5,10 @@ Subject: [PATCH] Remove vanilla username check
diff --git a/net/minecraft/server/network/ServerLoginPacketListenerImpl.java b/net/minecraft/server/network/ServerLoginPacketListenerImpl.java
-index c61a94a08486cdeba84ccfbc58ef3cabd4a461d8..37bc11ba3746808307bc6a8c87cea392146c55b1 100644
+index 6d320ed179393e47398c44f2ba2b2285016f349e..79534beb5f4a3427078541fda287d9c950999c96 100644
--- a/net/minecraft/server/network/ServerLoginPacketListenerImpl.java
+++ b/net/minecraft/server/network/ServerLoginPacketListenerImpl.java
-@@ -184,7 +184,8 @@ public class ServerLoginPacketListenerImpl implements ServerLoginPacketListener,
+@@ -163,7 +163,8 @@ public class ServerLoginPacketListenerImpl implements ServerLoginPacketListener,
public void handleHello(ServerboundHelloPacket packet) {
Validate.validState(this.state == ServerLoginPacketListenerImpl.State.HELLO, "Unexpected hello packet");
// Paper start - Validate usernames
diff --git a/leaf-server/minecraft-patches/features/0104-Remove-UseItemOnPacket-Too-Far-check.patch b/leaf-server/minecraft-patches/features/0104-Remove-UseItemOnPacket-Too-Far-check.patch
index f45c3b83..957f5d01 100644
--- a/leaf-server/minecraft-patches/features/0104-Remove-UseItemOnPacket-Too-Far-check.patch
+++ b/leaf-server/minecraft-patches/features/0104-Remove-UseItemOnPacket-Too-Far-check.patch
@@ -7,10 +7,10 @@ This Check is added in 1.17.x -> 1.18.x that updated by Mojang.
By removing this check, it gives ability for hackers to use some modules of hack clients.
diff --git a/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/net/minecraft/server/network/ServerGamePacketListenerImpl.java
-index 1aaa94a2800687faa4d86698a4e1ad72bdaf15f3..d1245f54d55e4a3c406feef3cc2d5e25bb6346ce 100644
+index 4674760a18926e2e83c481defccf1a06df358b7d..6f7094004e2d38d3471c3582b3a10dfc7fce3b32 100644
--- a/net/minecraft/server/network/ServerGamePacketListenerImpl.java
+++ b/net/minecraft/server/network/ServerGamePacketListenerImpl.java
-@@ -2108,8 +2108,13 @@ public class ServerGamePacketListenerImpl
+@@ -2110,8 +2110,13 @@ public class ServerGamePacketListenerImpl
BlockPos blockPos = hitResult.getBlockPos();
if (this.player.canInteractWithBlock(blockPos, 1.0)) {
Vec3 vec3 = location.subtract(Vec3.atCenterOf(blockPos));
diff --git a/leaf-server/minecraft-patches/features/0110-Slice-Smooth-Teleports.patch b/leaf-server/minecraft-patches/features/0110-Slice-Smooth-Teleports.patch
index e9a42a6f..0231077b 100644
--- a/leaf-server/minecraft-patches/features/0110-Slice-Smooth-Teleports.patch
+++ b/leaf-server/minecraft-patches/features/0110-Slice-Smooth-Teleports.patch
@@ -9,10 +9,10 @@ Original project: https://github.com/Cryptite/Slice
Co-authored-by: HaHaWTH <102713261+HaHaWTH@users.noreply.github.com>
diff --git a/net/minecraft/server/level/ServerPlayer.java b/net/minecraft/server/level/ServerPlayer.java
-index 6d453bdf4f265c23e7e349d07d766553ef0a4fad..737cba1729e980f58afa5e5aa83908c64c3a1a45 100644
+index e217410145f7889ab4141947fc32d9d576a20326..1096bd9f5561f3bedd7939345844b03bbc895938 100644
--- a/net/minecraft/server/level/ServerPlayer.java
+++ b/net/minecraft/server/level/ServerPlayer.java
-@@ -434,6 +434,7 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc
+@@ -432,6 +432,7 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc
private boolean tpsBar = false; // Purpur - Implement TPSBar
private boolean compassBar = false; // Purpur - Add compass command
private boolean ramBar = false; // Purpur - Implement rambar commands
@@ -21,10 +21,10 @@ index 6d453bdf4f265c23e7e349d07d766553ef0a4fad..737cba1729e980f58afa5e5aa83908c6
// Paper start - rewrite chunk system
private ca.spottedleaf.moonrise.patches.chunk_system.player.RegionizedPlayerChunkLoader.PlayerChunkLoaderData chunkLoader;
diff --git a/net/minecraft/server/players/PlayerList.java b/net/minecraft/server/players/PlayerList.java
-index 7fdcdc311e5a3236df0c7d479d0e206e2fa15dd0..2f00e7899c36a2a34f810fc6083846eb3883131f 100644
+index 195e972dd9b3b5d29866c28cc88c80bae31916b4..bdc912f5330896e967cbef4e3e545ff5182e591e 100644
--- a/net/minecraft/server/players/PlayerList.java
+++ b/net/minecraft/server/players/PlayerList.java
-@@ -794,11 +794,11 @@ public abstract class PlayerList {
+@@ -761,11 +761,11 @@ public abstract class PlayerList {
byte b = (byte)(keepInventory ? 1 : 0);
ServerLevel serverLevel = serverPlayer.level();
LevelData levelData = serverLevel.getLevelData();
@@ -38,7 +38,7 @@ index 7fdcdc311e5a3236df0c7d479d0e206e2fa15dd0..2f00e7899c36a2a34f810fc6083846eb
serverPlayer.connection.send(new ClientboundSetDefaultSpawnPositionPacket(level.getSharedSpawnPos(), level.getSharedSpawnAngle()));
serverPlayer.connection.send(new ClientboundChangeDifficultyPacket(levelData.getDifficulty(), levelData.isDifficultyLocked()));
serverPlayer.connection
-@@ -886,6 +886,8 @@ public abstract class PlayerList {
+@@ -853,6 +853,8 @@ public abstract class PlayerList {
return serverPlayer;
}
diff --git a/leaf-server/minecraft-patches/features/0112-Leaves-Protocol-Core.patch b/leaf-server/minecraft-patches/features/0112-Leaves-Protocol-Core.patch
index 63fd221a..4466ec0d 100644
--- a/leaf-server/minecraft-patches/features/0112-Leaves-Protocol-Core.patch
+++ b/leaf-server/minecraft-patches/features/0112-Leaves-Protocol-Core.patch
@@ -69,10 +69,10 @@ index 54bb75a2a128e7747ab01cb0d40c81fb4340ffd1..0fed0f181c4d1f31d01bdaa5dc9417cc
this.tickables.get(i).run();
}
diff --git a/net/minecraft/server/level/ServerPlayer.java b/net/minecraft/server/level/ServerPlayer.java
-index 799aa6e869a9e471a2aa415904efb7e29be213c6..e2edd7b6c6f4c9bb0e42ea9332b96d7537bc801a 100644
+index 1096bd9f5561f3bedd7939345844b03bbc895938..900075e85f2085378389a974e500fc8acd25747e 100644
--- a/net/minecraft/server/level/ServerPlayer.java
+++ b/net/minecraft/server/level/ServerPlayer.java
-@@ -440,6 +440,8 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc
+@@ -438,6 +438,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();
@@ -81,11 +81,11 @@ index 799aa6e869a9e471a2aa415904efb7e29be213c6..e2edd7b6c6f4c9bb0e42ea9332b96d75
@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 8a4c8e2fb86274b5bf95bda510029f4c5077d836..169d039a00339fc8eeb697ba03808f321ed4ad4c 100644
---- a/net/minecraft/server/network/ServerCommonPacketListenerImpl.java
-+++ b/net/minecraft/server/network/ServerCommonPacketListenerImpl.java
-@@ -183,6 +183,18 @@ public abstract class ServerCommonPacketListenerImpl implements ServerCommonPack
+diff --git a/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/net/minecraft/server/network/ServerGamePacketListenerImpl.java
+index 6f7094004e2d38d3471c3582b3a10dfc7fce3b32..76ad04e021b840b1595bfe01d07f1d7943937281 100644
+--- a/net/minecraft/server/network/ServerGamePacketListenerImpl.java
++++ b/net/minecraft/server/network/ServerGamePacketListenerImpl.java
+@@ -3809,6 +3809,18 @@ public class ServerGamePacketListenerImpl
@Override
public void handleCustomPayload(ServerboundCustomPayloadPacket packet) {
@@ -103,8 +103,8 @@ index 8a4c8e2fb86274b5bf95bda510029f4c5077d836..169d039a00339fc8eeb697ba03808f32
+
// Paper start
if (packet.payload() instanceof net.minecraft.network.protocol.common.custom.BrandPayload(String brand)) {
- this.player.clientBrandName = brand;
-@@ -242,6 +254,7 @@ public abstract class ServerCommonPacketListenerImpl implements ServerCommonPack
+ this.playerBrand = brand;
+@@ -3868,6 +3880,7 @@ public class ServerGamePacketListenerImpl
final String channel = new String(data, from, length, java.nio.charset.StandardCharsets.US_ASCII);
if (register) {
this.getCraftPlayer().addChannel(channel);
@@ -113,7 +113,7 @@ index 8a4c8e2fb86274b5bf95bda510029f4c5077d836..169d039a00339fc8eeb697ba03808f32
this.getCraftPlayer().removeChannel(channel);
}
diff --git a/net/minecraft/server/players/PlayerList.java b/net/minecraft/server/players/PlayerList.java
-index fe44069de549acc81a6037426a405d6fddb87897..0ed45220ce029e5ef538b86f89509f2d2156cbb9 100644
+index bdc912f5330896e967cbef4e3e545ff5182e591e..e3898b41c2d19940e08b60cdac28ab07161d3c50 100644
--- a/net/minecraft/server/players/PlayerList.java
+++ b/net/minecraft/server/players/PlayerList.java
@@ -346,6 +346,9 @@ public abstract class PlayerList {
@@ -134,15 +134,7 @@ index fe44069de549acc81a6037426a405d6fddb87897..0ed45220ce029e5ef538b86f89509f2d
// 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();
-@@ -651,6 +655,7 @@ public abstract class PlayerList {
- SocketAddress socketAddress = loginlistener.connection.getRemoteAddress();
-
- ServerPlayer entity = new ServerPlayer(this.server, this.server.getLevel(Level.OVERWORLD), gameProfile, net.minecraft.server.level.ClientInformation.createDefault());
-+ entity.internalConnection = loginlistener.connection; // Leaves - protocol core
- entity.transferCookieConnection = loginlistener;
- org.bukkit.entity.Player player = entity.getBukkitEntity();
- org.bukkit.event.player.PlayerLoginEvent event = new org.bukkit.event.player.PlayerLoginEvent(player, loginlistener.connection.hostname, ((java.net.InetSocketAddress) socketAddress).getAddress(), ((java.net.InetSocketAddress) loginlistener.connection.channel.remoteAddress()).getAddress());
-@@ -1523,6 +1528,7 @@ public abstract class PlayerList {
+@@ -1507,6 +1511,7 @@ public abstract class PlayerList {
serverPlayer.connection.send(clientboundUpdateRecipesPacket);
serverPlayer.getRecipeBook().sendInitialRecipeBook(serverPlayer);
}
diff --git a/leaf-server/minecraft-patches/features/0114-Leaves-Xaero-Map-Protocol.patch b/leaf-server/minecraft-patches/features/0114-Leaves-Xaero-Map-Protocol.patch
index 9fa20f7d..da71c325 100644
--- a/leaf-server/minecraft-patches/features/0114-Leaves-Xaero-Map-Protocol.patch
+++ b/leaf-server/minecraft-patches/features/0114-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 e547d6c9ee9ad3438cc839389db26a3417cc4ba4..4de0da41eaa71edd0ec7c6829dce424795a63dd8 100644
+index e3898b41c2d19940e08b60cdac28ab07161d3c50..22c551e8cfc6ab5822d4e6610033cc2d1aafd6c3 100644
--- a/net/minecraft/server/players/PlayerList.java
+++ b/net/minecraft/server/players/PlayerList.java
-@@ -1235,6 +1235,7 @@ public abstract class PlayerList {
+@@ -1218,6 +1218,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/0115-Leaves-Syncmatica-Protocol.patch b/leaf-server/minecraft-patches/features/0115-Leaves-Syncmatica-Protocol.patch
index 111a1626..71a418cb 100644
--- a/leaf-server/minecraft-patches/features/0115-Leaves-Syncmatica-Protocol.patch
+++ b/leaf-server/minecraft-patches/features/0115-Leaves-Syncmatica-Protocol.patch
@@ -9,13 +9,13 @@ Original project: https://github.com/LeavesMC/Leaves
This patch is Powered by Syncmatica (https://github.com/End-Tech/syncmatica)
diff --git a/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/net/minecraft/server/network/ServerGamePacketListenerImpl.java
-index d1245f54d55e4a3c406feef3cc2d5e25bb6346ce..8e0e119b41ca1e49d7e3f7874c5fb3c2b434e737 100644
+index 76ad04e021b840b1595bfe01d07f1d7943937281..f8572720e4bf7b2b0b64fbe39a5a068d715b6e01 100644
--- a/net/minecraft/server/network/ServerGamePacketListenerImpl.java
+++ b/net/minecraft/server/network/ServerGamePacketListenerImpl.java
-@@ -322,8 +322,11 @@ public class ServerGamePacketListenerImpl
- this.signedMessageDecoder = SignedMessageChain.Decoder.unsigned(player.getUUID(), server::enforceSecureProfile);
+@@ -324,8 +324,11 @@ public class ServerGamePacketListenerImpl
this.chatMessageChain = new FutureChain(server.chatExecutor); // CraftBukkit - async chat
this.tickEndEvent = new io.papermc.paper.event.packet.ClientTickEndEvent(player.getBukkitEntity()); // Paper - add client tick end event
+ this.playerGameConnection = new io.papermc.paper.connection.PaperPlayerGameConnection(this); // Paper
+ this.exchangeTarget = new org.leavesmc.leaves.protocol.syncmatica.exchange.ExchangeTarget(this); // Leaves - Syncmatica Protocol
}
diff --git a/leaf-server/minecraft-patches/features/0116-Leaves-Replay-Mod-API.patch b/leaf-server/minecraft-patches/features/0116-Leaves-Replay-Mod-API.patch
index d3a6da08..bf2779c3 100644
--- a/leaf-server/minecraft-patches/features/0116-Leaves-Replay-Mod-API.patch
+++ b/leaf-server/minecraft-patches/features/0116-Leaves-Replay-Mod-API.patch
@@ -92,7 +92,7 @@ index b305ba9bab617bf4e52d0e6ddf160bacc5751a94..bbaf1a29f86a9bfc13795249d545b6f7
if (players.size() >= resultLimit) {
return players;
diff --git a/net/minecraft/server/MinecraftServer.java b/net/minecraft/server/MinecraftServer.java
-index 3a1822e0f37c86dfad56ae06c14fffb960ff99ec..32c934a489df7a06892265c6d762e88c3716a5c6 100644
+index 0fed0f181c4d1f31d01bdaa5dc9417ccd68b3f03..534082a0441dcde9115652cb67dbc8310529ecee 100644
--- a/net/minecraft/server/MinecraftServer.java
+++ b/net/minecraft/server/MinecraftServer.java
@@ -1642,7 +1642,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop= this.maxPlayers && !this.canBypassPlayerLimit(gameProfile)
- // ? Component.translatable("multiplayer.disconnect.server_full")
- // : null;
-- if (this.players.size() >= this.maxPlayers && !(player.hasPermission("purpur.joinfullserver") || this.canBypassPlayerLimit(gameProfile))) { // Purpur - Allow player join full server by permission
-+ if (this.realPlayers.size() >= this.maxPlayers && !(player.hasPermission("purpur.joinfullserver") || this.canBypassPlayerLimit(gameProfile))) { // Purpur - Allow player join full server by permission // Leaves - only real player
- event.disallow(org.bukkit.event.player.PlayerLoginEvent.Result.KICK_FULL, net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer.legacySection().deserialize(org.spigotmc.SpigotConfig.serverFullMessage)); // Spigot // Paper - Adventure
- }
- }
+@@ -1104,7 +1250,7 @@ public abstract class PlayerList {
+
+ // Paper start - whitelist verify event / login event
+ public LoginResult canBypassFullServerLogin(final GameProfile profile, final LoginResult currentResult) {
+- final boolean shouldKick = this.players.size() >= this.maxPlayers && !(/*player.hasPermission("purpur.joinfullserver") || */this.canBypassPlayerLimit(profile)); // Purpur - Allow player join full server by permission TODO: this hasn't worked for a while, so comment it out until we can reliably check perms of the player joining
++ final boolean shouldKick = this.realPlayers.size() >= this.maxPlayers && !(/*player.hasPermission("purpur.joinfullserver") || */this.canBypassPlayerLimit(profile)); // Purpur - Allow player join full server by permission TODO: this hasn't worked for a while, so comment it out until we can reliably check perms of the player joining // Leaves - only real player
+ final io.papermc.paper.event.player.PlayerServerFullCheckEvent fullCheckEvent = new io.papermc.paper.event.player.PlayerServerFullCheckEvent(
+ com.destroystokyo.paper.profile.CraftPlayerProfile.asBukkitMirror(profile),
+ io.papermc.paper.adventure.PaperAdventure.asAdventure(currentResult.message),
diff --git a/leaf-server/minecraft-patches/features/0122-Faster-sequencing-of-futures-for-chunk-structure-gen.patch b/leaf-server/minecraft-patches/features/0122-Faster-sequencing-of-futures-for-chunk-structure-gen.patch
index 9fe50807..59aa73b8 100644
--- a/leaf-server/minecraft-patches/features/0122-Faster-sequencing-of-futures-for-chunk-structure-gen.patch
+++ b/leaf-server/minecraft-patches/features/0122-Faster-sequencing-of-futures-for-chunk-structure-gen.patch
@@ -7,10 +7,10 @@ Replace `thenApply` with `thenCompose`. Once one task is completed then the next
to prevent blocking threads while waiting to complete all tasks. But may cause the sequence of future compose disorder.
diff --git a/net/minecraft/Util.java b/net/minecraft/Util.java
-index 0a69469c79aaa2466cda04f6acefed18e421d555..82ee6c27ebc2718ad88b640775d949ec6d7cfed2 100644
+index 138a58c5e5698b926b01e0170733dc3dbc5589ec..64372e0fd4eb7018fc36d0feb667c296ea48f927 100644
--- a/net/minecraft/Util.java
+++ b/net/minecraft/Util.java
-@@ -620,17 +620,39 @@ public class Util {
+@@ -625,17 +625,39 @@ public class Util {
return Maps.transformValues(map, mapper);
}
diff --git a/leaf-server/minecraft-patches/features/0124-Plazma-Add-some-missing-Pufferfish-configurations.patch b/leaf-server/minecraft-patches/features/0124-Plazma-Add-some-missing-Pufferfish-configurations.patch
index 0792ac16..6a63b0ce 100644
--- a/leaf-server/minecraft-patches/features/0124-Plazma-Add-some-missing-Pufferfish-configurations.patch
+++ b/leaf-server/minecraft-patches/features/0124-Plazma-Add-some-missing-Pufferfish-configurations.patch
@@ -10,10 +10,10 @@ Add Pufferfish DAB support for Camel, Sniffer
https://github.com/pufferfish-gg/Pufferfish/issues/83
diff --git a/net/minecraft/world/entity/animal/HappyGhast.java b/net/minecraft/world/entity/animal/HappyGhast.java
-index e04da94daced96a7eb9fdb01c551bea667b72d76..e53773e086a589ee5fd83fde0bee1881ff43e926 100644
+index 9763a5e24e0fed9b49b6ac59911f6c9f8e893db5..b7306bcc60c2986b7f9b054d217a2b8cd76b118e 100644
--- a/net/minecraft/world/entity/animal/HappyGhast.java
+++ b/net/minecraft/world/entity/animal/HappyGhast.java
-@@ -415,9 +415,11 @@ public class HappyGhast extends Animal {
+@@ -421,9 +421,11 @@ public class HappyGhast extends Animal {
return HappyGhastAi.makeBrain(this.brainProvider().makeBrain(dynamic));
}
diff --git a/leaf-server/minecraft-patches/features/0132-Remove-useless-creating-stats-json-bases-on-player-n.patch b/leaf-server/minecraft-patches/features/0132-Remove-useless-creating-stats-json-bases-on-player-n.patch
index 43e479e1..c12f7c80 100644
--- a/leaf-server/minecraft-patches/features/0132-Remove-useless-creating-stats-json-bases-on-player-n.patch
+++ b/leaf-server/minecraft-patches/features/0132-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 70d394d8a257390af20bdea5895f7d8a74b16dec..f0c66fce913af9433d53572a3dd3fc31d512346b 100644
+index 1920e0ce0c70f4bf10635754819bbdf6a4d275ff..430c5f02cb0f52a7a655a1b8bd23db8bf93fb43d 100644
--- a/net/minecraft/server/players/PlayerList.java
+++ b/net/minecraft/server/players/PlayerList.java
-@@ -1574,6 +1574,8 @@ public abstract class PlayerList {
+@@ -1557,6 +1557,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 70d394d8a257390af20bdea5895f7d8a74b16dec..f0c66fce913af9433d53572a3dd3fc31
if (!file1.exists()) {
File file2 = new File(file, displayName + ".json"); // CraftBukkit
Path path = file2.toPath();
-@@ -1581,6 +1583,8 @@ public abstract class PlayerList {
+@@ -1564,6 +1566,8 @@ public abstract class PlayerList {
file2.renameTo(file1);
}
}
diff --git a/leaf-server/minecraft-patches/features/0133-Improve-Purpur-AFK-system.patch b/leaf-server/minecraft-patches/features/0133-Improve-Purpur-AFK-system.patch
index 8d495cb6..35b73b66 100644
--- a/leaf-server/minecraft-patches/features/0133-Improve-Purpur-AFK-system.patch
+++ b/leaf-server/minecraft-patches/features/0133-Improve-Purpur-AFK-system.patch
@@ -19,10 +19,10 @@ index 1dc009e85403fe0b6a68daefecfe5cb25ad263cd..de450f9ef03944b101b483126af6a778
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 8dabe3ca6f5c5b0cd5f5a3801e1cbd853520738e..b71b4db16ac8b42c0061f15db05d4315dd7fecb4 100644
+index b53b989bd6efd747d1ee93dedfc59cbc758fcda3..0df36e136fb0ce928a207f8f58dfe10839be8507 100644
--- a/net/minecraft/server/level/ServerPlayer.java
+++ b/net/minecraft/server/level/ServerPlayer.java
-@@ -2490,6 +2490,10 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc
+@@ -2424,6 +2424,10 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc
// Purpur start - AFK API
private boolean isAfk = false;
@@ -33,7 +33,7 @@ index 8dabe3ca6f5c5b0cd5f5a3801e1cbd853520738e..b71b4db16ac8b42c0061f15db05d4315
@Override
public void setAfk(boolean afk) {
-@@ -2527,6 +2531,18 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc
+@@ -2461,6 +2465,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,10 +53,10 @@ index 8dabe3ca6f5c5b0cd5f5a3801e1cbd853520738e..b71b4db16ac8b42c0061f15db05d4315
} else {
getBukkitEntity().setPlayerListName(prefix + scoreboardName + suffix, true);
diff --git a/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/net/minecraft/server/network/ServerGamePacketListenerImpl.java
-index 2eecf924618192e1b8cf3971ac6cc3c95ec7f235..1306f920b5908731d04004e1b180c3ac4ad0745d 100644
+index f8572720e4bf7b2b0b64fbe39a5a068d715b6e01..c038ceb441897157a0c240a9970e676a297e40c3 100644
--- a/net/minecraft/server/network/ServerGamePacketListenerImpl.java
+++ b/net/minecraft/server/network/ServerGamePacketListenerImpl.java
-@@ -2361,6 +2361,7 @@ public class ServerGamePacketListenerImpl
+@@ -2359,6 +2359,7 @@ public class ServerGamePacketListenerImpl
@Override
public void handleChatCommand(ServerboundChatCommandPacket packet) {
@@ -64,7 +64,7 @@ index 2eecf924618192e1b8cf3971ac6cc3c95ec7f235..1306f920b5908731d04004e1b180c3ac
this.tryHandleChat(packet.command(), () -> {
// CraftBukkit start - SPIGOT-7346: Prevent disconnected players from executing commands
if (this.player.hasDisconnected()) {
-@@ -2369,7 +2370,7 @@ public class ServerGamePacketListenerImpl
+@@ -2367,7 +2368,7 @@ public class ServerGamePacketListenerImpl
// CraftBukkit end
this.performUnsignedChatCommand(packet.command());
this.detectRateSpam("/" + packet.command()); // Spigot
@@ -73,7 +73,7 @@ index 2eecf924618192e1b8cf3971ac6cc3c95ec7f235..1306f920b5908731d04004e1b180c3ac
}
private void performUnsignedChatCommand(String command) {
-@@ -2402,6 +2403,7 @@ public class ServerGamePacketListenerImpl
+@@ -2400,6 +2401,7 @@ public class ServerGamePacketListenerImpl
public void handleSignedChatCommand(ServerboundChatCommandSignedPacket packet) {
Optional optional = this.unpackAndApplyLastSeen(packet.lastSeenMessages());
if (!optional.isEmpty()) {
@@ -81,7 +81,7 @@ index 2eecf924618192e1b8cf3971ac6cc3c95ec7f235..1306f920b5908731d04004e1b180c3ac
this.tryHandleChat(packet.command(), () -> {
// CraftBukkit start - SPIGOT-7346: Prevent disconnected players from executing commands
if (this.player.hasDisconnected()) {
-@@ -2410,7 +2412,7 @@ public class ServerGamePacketListenerImpl
+@@ -2408,7 +2410,7 @@ public class ServerGamePacketListenerImpl
// CraftBukkit end
this.performSignedChatCommand(packet, optional.get());
this.detectRateSpam("/" + packet.command()); // Spigot
@@ -90,7 +90,7 @@ index 2eecf924618192e1b8cf3971ac6cc3c95ec7f235..1306f920b5908731d04004e1b180c3ac
}
}
-@@ -2517,12 +2519,17 @@ public class ServerGamePacketListenerImpl
+@@ -2515,12 +2517,17 @@ public class ServerGamePacketListenerImpl
return dispatcher.parse(command, this.player.createCommandSourceStack());
}
@@ -110,7 +110,7 @@ index 2eecf924618192e1b8cf3971ac6cc3c95ec7f235..1306f920b5908731d04004e1b180c3ac
this.player.resetLastActionTime();
// CraftBukkit start
if (sync) {
-@@ -2534,6 +2541,40 @@ public class ServerGamePacketListenerImpl
+@@ -2532,6 +2539,40 @@ public class ServerGamePacketListenerImpl
}
}
@@ -152,7 +152,7 @@ index 2eecf924618192e1b8cf3971ac6cc3c95ec7f235..1306f920b5908731d04004e1b180c3ac
synchronized (this.lastSeenMessages) {
Optional var10000;
diff --git a/net/minecraft/server/players/PlayerList.java b/net/minecraft/server/players/PlayerList.java
-index f0c66fce913af9433d53572a3dd3fc31d512346b..84914c3245de053ba07b105e44f9d838fa3efc4c 100644
+index 430c5f02cb0f52a7a655a1b8bd23db8bf93fb43d..56876236505d17663900857e4b6777f1778538a6 100644
--- a/net/minecraft/server/players/PlayerList.java
+++ b/net/minecraft/server/players/PlayerList.java
@@ -676,6 +676,7 @@ public abstract class PlayerList {
diff --git a/leaf-server/minecraft-patches/features/0135-Virtual-thread-for-user-authenticator.patch b/leaf-server/minecraft-patches/features/0135-Virtual-thread-for-user-authenticator.patch
index 0c13c97f..7193b2ad 100644
--- a/leaf-server/minecraft-patches/features/0135-Virtual-thread-for-user-authenticator.patch
+++ b/leaf-server/minecraft-patches/features/0135-Virtual-thread-for-user-authenticator.patch
@@ -5,11 +5,11 @@ Subject: [PATCH] Virtual thread for user authenticator
diff --git a/net/minecraft/server/network/ServerLoginPacketListenerImpl.java b/net/minecraft/server/network/ServerLoginPacketListenerImpl.java
-index 37bc11ba3746808307bc6a8c87cea392146c55b1..9dce1d22c7de3a3dd0e0e8f117cfbb54d1b15042 100644
+index 79534beb5f4a3427078541fda287d9c950999c96..f68923c5f6fbecd8f1c10a30dbd06ed0dfee8b84 100644
--- a/net/minecraft/server/network/ServerLoginPacketListenerImpl.java
+++ b/net/minecraft/server/network/ServerLoginPacketListenerImpl.java
-@@ -54,7 +54,7 @@ public class ServerLoginPacketListenerImpl implements ServerLoginPacketListener,
- // CraftBukkit end
+@@ -53,7 +53,7 @@ import org.bukkit.event.player.PlayerPreLoginEvent;
+ public class ServerLoginPacketListenerImpl implements ServerLoginPacketListener, TickablePacketListener {
private static final AtomicInteger UNIQUE_THREAD_ID = new AtomicInteger(0);
static final Logger LOGGER = LogUtils.getLogger();
- private static final java.util.concurrent.ExecutorService authenticatorPool = java.util.concurrent.Executors.newCachedThreadPool(new com.google.common.util.concurrent.ThreadFactoryBuilder().setNameFormat("User Authenticator #%d").setUncaughtExceptionHandler(new DefaultUncaughtExceptionHandler(LOGGER)).build()); // Paper - Cache authenticator threads
diff --git a/leaf-server/minecraft-patches/features/0136-Mirai-Configurable-chat-message-signatures.patch b/leaf-server/minecraft-patches/features/0136-Mirai-Configurable-chat-message-signatures.patch
index 3ade01e5..50affb1b 100644
--- a/leaf-server/minecraft-patches/features/0136-Mirai-Configurable-chat-message-signatures.patch
+++ b/leaf-server/minecraft-patches/features/0136-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 169d039a00339fc8eeb697ba03808f321ed4ad4c..23fefdc7122ff8e195c27651dc3a83000f62a95e 100644
+index eb725c1b6da0c5ef48fa07d79070950f2b45e30e..5f7bd65caf9ea8707674e243e9fedf84adde5913 100644
--- a/net/minecraft/server/network/ServerCommonPacketListenerImpl.java
+++ b/net/minecraft/server/network/ServerCommonPacketListenerImpl.java
-@@ -371,10 +371,30 @@ public abstract class ServerCommonPacketListenerImpl implements ServerCommonPack
+@@ -255,10 +255,30 @@ public abstract class ServerCommonPacketListenerImpl implements ServerCommonPack
}
public void send(Packet> packet) {
@@ -138,10 +138,10 @@ index 169d039a00339fc8eeb697ba03808f321ed4ad4c..23fefdc7122ff8e195c27651dc3a8300
if (packet == null || this.processedDisconnect) { // Spigot
return;
diff --git a/net/minecraft/server/players/PlayerList.java b/net/minecraft/server/players/PlayerList.java
-index 84914c3245de053ba07b105e44f9d838fa3efc4c..e4543611016a648314459144e43565300153f0fe 100644
+index 56876236505d17663900857e4b6777f1778538a6..f439712ec2cc021360583b2ae70f837e2a9417ac 100644
--- a/net/minecraft/server/players/PlayerList.java
+++ b/net/minecraft/server/players/PlayerList.java
-@@ -1534,7 +1534,7 @@ public abstract class PlayerList {
+@@ -1517,7 +1517,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 84914c3245de053ba07b105e44f9d838fa3efc4c..e4543611016a648314459144e4356530
OutgoingChatMessage outgoingChatMessage = OutgoingChatMessage.create(message);
boolean flag1 = false;
-@@ -1559,6 +1559,7 @@ public abstract class PlayerList {
+@@ -1542,6 +1542,7 @@ public abstract class PlayerList {
}
public boolean verifyChatTrusted(PlayerChatMessage message) {
diff --git a/leaf-server/minecraft-patches/features/0137-Cache-player-profileResult.patch b/leaf-server/minecraft-patches/features/0137-Cache-player-profileResult.patch
index b73d51c8..8d2fd25c 100644
--- a/leaf-server/minecraft-patches/features/0137-Cache-player-profileResult.patch
+++ b/leaf-server/minecraft-patches/features/0137-Cache-player-profileResult.patch
@@ -22,13 +22,13 @@ See the License for the specific language governing permissions and
limitations under the License.
diff --git a/net/minecraft/server/network/ServerLoginPacketListenerImpl.java b/net/minecraft/server/network/ServerLoginPacketListenerImpl.java
-index 9dce1d22c7de3a3dd0e0e8f117cfbb54d1b15042..6b0b0ccc18a5da05685867656705e1fcf94b5891 100644
+index f68923c5f6fbecd8f1c10a30dbd06ed0dfee8b84..2e014cd543a6a790a0023835199b0e956e49fd1f 100644
--- a/net/minecraft/server/network/ServerLoginPacketListenerImpl.java
+++ b/net/minecraft/server/network/ServerLoginPacketListenerImpl.java
-@@ -70,6 +70,14 @@ public class ServerLoginPacketListenerImpl implements ServerLoginPacketListener,
- private net.minecraft.server.level.ServerPlayer player; // CraftBukkit
- public boolean iKnowThisMayNotBeTheBestIdeaButPleaseDisableUsernameValidation = false; // Paper - username validation overriding
- private int velocityLoginMessageId = -1; // Paper - Add Velocity IP Forwarding Support
+@@ -71,6 +71,14 @@ public class ServerLoginPacketListenerImpl implements ServerLoginPacketListener,
+ public @Nullable java.util.UUID requestedUuid; // Paper
+ private final io.papermc.paper.connection.PaperPlayerLoginConnection paperLoginConnection; // Paper - Config API
+ private volatile boolean disconnecting = false; // Paper - Fix disconnect still ticking login
+ // Leaf start - Cache player profileResult
+ private static final com.github.benmanes.caffeine.cache.Cache playerProfileResultCache = com.github.benmanes.caffeine.cache.Caffeine.newBuilder()
+ .expireAfterWrite(org.dreeam.leaf.config.modules.misc.Cache.cachePlayerProfileResultTimeout, java.util.concurrent.TimeUnit.MINUTES)
@@ -40,7 +40,7 @@ index 9dce1d22c7de3a3dd0e0e8f117cfbb54d1b15042..6b0b0ccc18a5da05685867656705e1fc
public ServerLoginPacketListenerImpl(MinecraftServer server, Connection connection, boolean transferred) {
this.server = server;
-@@ -303,9 +311,30 @@ public class ServerLoginPacketListenerImpl implements ServerLoginPacketListener,
+@@ -269,9 +277,30 @@ public class ServerLoginPacketListenerImpl implements ServerLoginPacketListener,
String string1 = Objects.requireNonNull(ServerLoginPacketListenerImpl.this.requestedUsername, "Player name not initialized");
try {
@@ -74,7 +74,7 @@ index 9dce1d22c7de3a3dd0e0e8f117cfbb54d1b15042..6b0b0ccc18a5da05685867656705e1fc
if (profileResult != null) {
GameProfile gameProfile = profileResult.profile();
// CraftBukkit start - fire PlayerPreLoginEvent
-@@ -350,6 +379,20 @@ public class ServerLoginPacketListenerImpl implements ServerLoginPacketListener,
+@@ -316,6 +345,20 @@ public class ServerLoginPacketListenerImpl implements ServerLoginPacketListener,
// Paper end - Cache authenticator threads
}
diff --git a/leaf-server/minecraft-patches/features/0143-Configurable-connection-message.patch b/leaf-server/minecraft-patches/features/0143-Configurable-connection-message.patch
index 4fd491fe..13fc5264 100644
--- a/leaf-server/minecraft-patches/features/0143-Configurable-connection-message.patch
+++ b/leaf-server/minecraft-patches/features/0143-Configurable-connection-message.patch
@@ -5,7 +5,7 @@ Subject: [PATCH] Configurable connection message
diff --git a/net/minecraft/server/players/PlayerList.java b/net/minecraft/server/players/PlayerList.java
-index e4543611016a648314459144e43565300153f0fe..70bec2fc50c1e6a928e450e617e76dd4434172f9 100644
+index f439712ec2cc021360583b2ae70f837e2a9417ac..511bddf252e1ae34a07171f1baf069d97efaa758 100644
--- a/net/minecraft/server/players/PlayerList.java
+++ b/net/minecraft/server/players/PlayerList.java
@@ -439,7 +439,7 @@ public abstract class PlayerList {
@@ -35,7 +35,7 @@ index e4543611016a648314459144e43565300153f0fe..70bec2fc50c1e6a928e450e617e76dd4
this.cserver.getPluginManager().callEvent(playerQuitEvent);
player.getBukkitEntity().disconnect(playerQuitEvent.getQuitMessage());
-@@ -1687,4 +1687,40 @@ public abstract class PlayerList {
+@@ -1670,4 +1670,40 @@ public abstract class PlayerList {
public boolean isAllowCommandsForAllPlayers() {
return this.allowCommandsForAllPlayers;
}
diff --git a/leaf-server/minecraft-patches/features/0161-Use-caffeine-cache-for-kickPermission-instead-of-usi.patch b/leaf-server/minecraft-patches/features/0161-Use-caffeine-cache-for-kickPermission-instead-of-usi.patch
index a2bb1019..794eac97 100644
--- a/leaf-server/minecraft-patches/features/0161-Use-caffeine-cache-for-kickPermission-instead-of-usi.patch
+++ b/leaf-server/minecraft-patches/features/0161-Use-caffeine-cache-for-kickPermission-instead-of-usi.patch
@@ -23,10 +23,10 @@ See the License for the specific language governing permissions and
limitations under the License.
diff --git a/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/net/minecraft/server/network/ServerGamePacketListenerImpl.java
-index 1306f920b5908731d04004e1b180c3ac4ad0745d..faa135c3eb1bfc8f52c90e6f88411fdf48ed9ee1 100644
+index c038ceb441897157a0c240a9970e676a297e40c3..3173922dbb478e46f892304fb17b0f662fe62b40 100644
--- a/net/minecraft/server/network/ServerGamePacketListenerImpl.java
+++ b/net/minecraft/server/network/ServerGamePacketListenerImpl.java
-@@ -328,17 +328,12 @@ public class ServerGamePacketListenerImpl
+@@ -330,17 +330,12 @@ public class ServerGamePacketListenerImpl
public final org.leavesmc.leaves.protocol.syncmatica.exchange.ExchangeTarget exchangeTarget; // Leaves - Syncmatica Protocol
// Purpur start - AFK API
@@ -48,7 +48,7 @@ index 1306f920b5908731d04004e1b180c3ac4ad0745d..faa135c3eb1bfc8f52c90e6f88411fdf
// Purpur end - AFK API
@Override
-@@ -401,7 +396,7 @@ public class ServerGamePacketListenerImpl
+@@ -403,7 +398,7 @@ public class ServerGamePacketListenerImpl
&& Util.getMillis() - this.player.getLastActionTime() > this.server.getPlayerIdleTimeout() * 1000L * 60L && !this.player.wonGame) { // Paper - Prevent AFK kick while watching end credits
// Purpur start - AFK API
this.player.setAfk(true);
diff --git a/leaf-server/minecraft-patches/features/0162-Do-not-place-player-if-the-server-is-full.patch b/leaf-server/minecraft-patches/features/0162-Do-not-place-player-if-the-server-is-full.patch
index f83eb8b9..f12ece1e 100644
--- a/leaf-server/minecraft-patches/features/0162-Do-not-place-player-if-the-server-is-full.patch
+++ b/leaf-server/minecraft-patches/features/0162-Do-not-place-player-if-the-server-is-full.patch
@@ -6,7 +6,7 @@ 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 70bec2fc50c1e6a928e450e617e76dd4434172f9..3cd9b0df617715d0b3e70a6096e52bb5d22ab426 100644
+index 511bddf252e1ae34a07171f1baf069d97efaa758..ef283ec7934d143eeab482d99bf6fa8f327d2fe9 100644
--- a/net/minecraft/server/players/PlayerList.java
+++ b/net/minecraft/server/players/PlayerList.java
@@ -343,6 +343,13 @@ public abstract class PlayerList {
@@ -14,7 +14,7 @@ index 70bec2fc50c1e6a928e450e617e76dd4434172f9..3cd9b0df617715d0b3e70a6096e52bb5
}
// Gale end - MultiPaper - do not place player in world if kicked before being spawned in
+ // Leaf start - Do not place player if the server is full - copied from canPlayerLogin
-+ if (org.dreeam.leaf.config.modules.fixes.DontPlacePlayerIfFull.enabled && this.realPlayers.size() >= this.maxPlayers && !(player.getBukkitEntity().hasPermission("purpur.joinfullserver") || this.canBypassPlayerLimit(gameProfile))) { // Purpur - Allow player join full server by permission // Leaves - only real player
++ if (org.dreeam.leaf.config.modules.fixes.DontPlacePlayerIfFull.enabled && this.realPlayers.size() >= this.maxPlayers && !(/*player.hasPermission("purpur.joinfullserver") || */this.canBypassPlayerLimit(gameProfile))) { // Purpur - Allow player join full server by permission TODO: this hasn't worked for a while, so comment it out until we can reliably check perms of the player joining // Leaves - only real player // Leaf - Do not place player if the server is full
+ connection.disconnect(io.papermc.paper.adventure.PaperAdventure.asVanilla(net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer.legacySection().deserialize(org.spigotmc.SpigotConfig.serverFullMessage)));
+ //playerconnection.disconnect(io.papermc.paper.adventure.PaperAdventure.asVanilla(net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer.legacySection().deserialize(org.spigotmc.SpigotConfig.serverFullMessage)), org.bukkit.event.player.PlayerKickEvent.Cause.TIMEOUT);
+ return;
@@ -23,12 +23,12 @@ index 70bec2fc50c1e6a928e450e617e76dd4434172f9..3cd9b0df617715d0b3e70a6096e52bb5
org.bukkit.Location loc = ev.getSpawnLocation();
serverLevel = ((org.bukkit.craftbukkit.CraftWorld) loc.getWorld()).getHandle();
-@@ -838,7 +845,7 @@ public abstract class PlayerList {
- // return this.players.size() >= this.maxPlayers && !this.canBypassPlayerLimit(gameProfile)
- // ? Component.translatable("multiplayer.disconnect.server_full")
- // : null;
-- if (this.realPlayers.size() >= this.maxPlayers && !(player.hasPermission("purpur.joinfullserver") || this.canBypassPlayerLimit(gameProfile))) { // Purpur - Allow player join full server by permission // Leaves - only real player
-+ if (this.realPlayers.size() >= this.maxPlayers && !(player.hasPermission("purpur.joinfullserver") || this.canBypassPlayerLimit(gameProfile))) { // Purpur - Allow player join full server by permission // Leaves - only real player // Leaf - Do not place player if the server is full - diff on change
- event.disallow(org.bukkit.event.player.PlayerLoginEvent.Result.KICK_FULL, net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer.legacySection().deserialize(org.spigotmc.SpigotConfig.serverFullMessage)); // Spigot // Paper - Adventure
- }
- }
+@@ -1251,7 +1258,7 @@ public abstract class PlayerList {
+
+ // Paper start - whitelist verify event / login event
+ public LoginResult canBypassFullServerLogin(final GameProfile profile, final LoginResult currentResult) {
+- final boolean shouldKick = this.realPlayers.size() >= this.maxPlayers && !(/*player.hasPermission("purpur.joinfullserver") || */this.canBypassPlayerLimit(profile)); // Purpur - Allow player join full server by permission TODO: this hasn't worked for a while, so comment it out until we can reliably check perms of the player joining // Leaves - only real player
++ final boolean shouldKick = this.realPlayers.size() >= this.maxPlayers && !(/*player.hasPermission("purpur.joinfullserver") || */this.canBypassPlayerLimit(profile)); // Purpur - Allow player join full server by permission TODO: this hasn't worked for a while, so comment it out until we can reliably check perms of the player joining // Leaves - only real player // Leaf - Do not place player if the server is full - diff on change
+ final io.papermc.paper.event.player.PlayerServerFullCheckEvent fullCheckEvent = new io.papermc.paper.event.player.PlayerServerFullCheckEvent(
+ com.destroystokyo.paper.profile.CraftPlayerProfile.asBukkitMirror(profile),
+ io.papermc.paper.adventure.PaperAdventure.asAdventure(currentResult.message),
diff --git a/leaf-server/minecraft-patches/features/0165-Fix-MC-119417.patch b/leaf-server/minecraft-patches/features/0165-Fix-MC-119417.patch
index 891198f4..47be26a1 100644
--- a/leaf-server/minecraft-patches/features/0165-Fix-MC-119417.patch
+++ b/leaf-server/minecraft-patches/features/0165-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 b71b4db16ac8b42c0061f15db05d4315dd7fecb4..fdce25cdfdd91938a97dc381e4ada1744e64c931 100644
+index 0df36e136fb0ce928a207f8f58dfe10839be8507..54acc0d45edbbbb2423b5fa477e3d895aeb3149d 100644
--- a/net/minecraft/server/level/ServerPlayer.java
+++ b/net/minecraft/server/level/ServerPlayer.java
-@@ -2294,6 +2294,7 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc
+@@ -2228,6 +2228,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/0168-Paper-PR-Skip-AI-during-inactive-ticks-for-non-aware.patch b/leaf-server/minecraft-patches/features/0168-Paper-PR-Skip-AI-during-inactive-ticks-for-non-aware.patch
index b4134699..6172b35d 100644
--- a/leaf-server/minecraft-patches/features/0168-Paper-PR-Skip-AI-during-inactive-ticks-for-non-aware.patch
+++ b/leaf-server/minecraft-patches/features/0168-Paper-PR-Skip-AI-during-inactive-ticks-for-non-aware.patch
@@ -24,10 +24,10 @@ index a6be753d1284167e090c40e6dcfbaa56b4e3d774..867353500482247bbec79f407246902c
if (this.goalSelector.inactiveTick(this.activatedPriority, true) && !isThrottled) { // Pufferfish - pass activated priroity // Pufferfish - throttle inactive goal selector ticking
this.goalSelector.tick();
diff --git a/net/minecraft/world/entity/npc/Villager.java b/net/minecraft/world/entity/npc/Villager.java
-index 165d0f50e7818b6daf834507033feaa2fabcaf19..5106013430c17d4a55f666163d0cb1e4c0497302 100644
+index 014bb5b6e82bb11b756430999522f4b8f9356d9f..174c37fca6b2b03a6eb36d8c7c17b6e8ec49f1cd 100644
--- a/net/minecraft/world/entity/npc/Villager.java
+++ b/net/minecraft/world/entity/npc/Villager.java
-@@ -375,7 +375,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler
+@@ -374,7 +374,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler
if (this.getUnhappyCounter() > 0) {
this.setUnhappyCounter(this.getUnhappyCounter() - 1);
}
diff --git a/leaf-server/minecraft-patches/features/0172-Multithreaded-Tracker.patch b/leaf-server/minecraft-patches/features/0172-Multithreaded-Tracker.patch
index da1c1a18..85ee7739 100644
--- a/leaf-server/minecraft-patches/features/0172-Multithreaded-Tracker.patch
+++ b/leaf-server/minecraft-patches/features/0172-Multithreaded-Tracker.patch
@@ -400,10 +400,10 @@ index 08d12a1acc3a672a77daa15f82392cd603c30283..c5949a0e852ca6de84e8dd12e3d4ed85
}
}
diff --git a/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/net/minecraft/server/network/ServerGamePacketListenerImpl.java
-index faa135c3eb1bfc8f52c90e6f88411fdf48ed9ee1..0dec7852a4f225b9e9e94debf9259faea625028f 100644
+index 3173922dbb478e46f892304fb17b0f662fe62b40..baa703a89583f72fab0ebbc40c85399022185c29 100644
--- a/net/minecraft/server/network/ServerGamePacketListenerImpl.java
+++ b/net/minecraft/server/network/ServerGamePacketListenerImpl.java
-@@ -1914,7 +1914,7 @@ public class ServerGamePacketListenerImpl
+@@ -1916,7 +1916,7 @@ public class ServerGamePacketListenerImpl
}
public void internalTeleport(PositionMoveRotation posMoveRotation, Set relatives) {
@@ -413,7 +413,7 @@ index faa135c3eb1bfc8f52c90e6f88411fdf48ed9ee1..0dec7852a4f225b9e9e94debf9259fae
if (this.player.isRemoved()) {
LOGGER.info("Attempt to teleport removed player {} restricted", player.getScoreboardName());
diff --git a/net/minecraft/world/entity/LivingEntity.java b/net/minecraft/world/entity/LivingEntity.java
-index 6c9ce4a979c084c9024a954d8315424cb7be27c7..19881624b91f44c9332ad4ba147a66837864da06 100644
+index d81d1303fc3d23b35dbc177dd6a4c7f489eb5381..78c212fb8a8a8ffefe6fc860f1e06d16ba09bb40 100644
--- a/net/minecraft/world/entity/LivingEntity.java
+++ b/net/minecraft/world/entity/LivingEntity.java
@@ -1342,13 +1342,13 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin
diff --git a/leaf-server/minecraft-patches/features/0200-Remove-stream-in-villagers.patch b/leaf-server/minecraft-patches/features/0200-Remove-stream-in-villagers.patch
index 5813f2a4..0a79ce25 100644
--- a/leaf-server/minecraft-patches/features/0200-Remove-stream-in-villagers.patch
+++ b/leaf-server/minecraft-patches/features/0200-Remove-stream-in-villagers.patch
@@ -41,10 +41,10 @@ index 72cca4897f9697573fd6987a5f0d2df52761b8c3..04eea77cf84aaeb781608e48f2aa32f3
private static void throwHalfStack(Villager villager, Set- stack, LivingEntity entity) {
diff --git a/net/minecraft/world/entity/npc/Villager.java b/net/minecraft/world/entity/npc/Villager.java
-index 5106013430c17d4a55f666163d0cb1e4c0497302..377e98469328f08db751c0f6a6f434b03f63c225 100644
+index 174c37fca6b2b03a6eb36d8c7c17b6e8ec49f1cd..a3040736384e54f26794db2bc938d63734f9614d 100644
--- a/net/minecraft/world/entity/npc/Villager.java
+++ b/net/minecraft/world/entity/npc/Villager.java
-@@ -974,7 +974,17 @@ public class Villager extends AbstractVillager implements ReputationEventHandler
+@@ -973,7 +973,17 @@ public class Villager extends AbstractVillager implements ReputationEventHandler
private int countFoodPointsInInventory() {
SimpleContainer inventory = this.getInventory();
diff --git a/leaf-server/minecraft-patches/features/0204-Cache-eligible-players-for-despawn-checks.patch b/leaf-server/minecraft-patches/features/0204-Cache-eligible-players-for-despawn-checks.patch
index 227ba4e5..d0565fd8 100644
--- a/leaf-server/minecraft-patches/features/0204-Cache-eligible-players-for-despawn-checks.patch
+++ b/leaf-server/minecraft-patches/features/0204-Cache-eligible-players-for-despawn-checks.patch
@@ -38,10 +38,10 @@ index 0f311e603c8df175576a33d5d20369cbcda2be55..3a31f9132a7271ea476cc85c5a10ea7f
.forEach(
entity -> {
diff --git a/net/minecraft/server/level/ServerPlayer.java b/net/minecraft/server/level/ServerPlayer.java
-index fdce25cdfdd91938a97dc381e4ada1744e64c931..4c1786201a4044db61e99c148fca4714e2b172ad 100644
+index 54acc0d45edbbbb2423b5fa477e3d895aeb3149d..df8732fc451d8aafa46a7980c5e51b6347f0f1ad 100644
--- a/net/minecraft/server/level/ServerPlayer.java
+++ b/net/minecraft/server/level/ServerPlayer.java
-@@ -1613,6 +1613,13 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc
+@@ -1547,6 +1547,13 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc
this.containerMenu.broadcastChanges();
}
diff --git a/leaf-server/minecraft-patches/features/0214-SparklyPaper-Parallel-world-ticking.patch b/leaf-server/minecraft-patches/features/0214-SparklyPaper-Parallel-world-ticking.patch
index 4aca18e5..0232efb3 100644
--- a/leaf-server/minecraft-patches/features/0214-SparklyPaper-Parallel-world-ticking.patch
+++ b/leaf-server/minecraft-patches/features/0214-SparklyPaper-Parallel-world-ticking.patch
@@ -651,27 +651,19 @@ index 3a31f9132a7271ea476cc85c5a10ea7f327256bf..58ec5cfb21d4834c3aaa74f76ca8a536
// 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 4c1786201a4044db61e99c148fca4714e2b172ad..163ac7b4b6fefb0c4594548dfffc0ea6f24f0765 100644
+index df8732fc451d8aafa46a7980c5e51b6347f0f1ad..f9664926de5706eda918b457301174734b0b0300 100644
--- a/net/minecraft/server/level/ServerPlayer.java
+++ b/net/minecraft/server/level/ServerPlayer.java
-@@ -467,6 +467,7 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc
- return this.viewDistanceHolder;
+@@ -466,6 +466,8 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc
}
// Paper end - rewrite chunk system
-+
- // Paper start - improve keepalives
- public long lastKeepAliveTx = System.nanoTime();
- public static final record KeepAliveResponse(long txTimeNS, long rxTimeNS) {
-@@ -532,6 +533,8 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc
- }
- // Paper end - improve keepalives
+ public boolean hasTickedAtLeastOnceInNewWorld = false; // SparklyPaper - parallel world ticking (fixes bug in DreamResourceReset where the inventory is opened AFTER the player has changed worlds, if you click with the quick tp torch in a chest, because the inventory is opened AFTER the player has teleported)
+
public ServerPlayer(MinecraftServer server, ServerLevel level, GameProfile gameProfile, ClientInformation clientInformation) {
super(level, gameProfile);
this.textFilter = server.createTextFilterForPlayer(this);
-@@ -818,6 +821,7 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc
+@@ -752,6 +754,7 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc
@Override
public void tick() {
@@ -679,7 +671,7 @@ index 4c1786201a4044db61e99c148fca4714e2b172ad..163ac7b4b6fefb0c4594548dfffc0ea6
// CraftBukkit start
if (this.joining) {
this.joining = false;
-@@ -1494,6 +1498,8 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc
+@@ -1428,6 +1431,8 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc
teleportTransition.postTeleportTransition().onTransition(this);
return this;
} else {
@@ -688,7 +680,7 @@ index 4c1786201a4044db61e99c148fca4714e2b172ad..163ac7b4b6fefb0c4594548dfffc0ea6
// CraftBukkit start
/*
this.isChangingDimension = true;
-@@ -1847,6 +1853,12 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc
+@@ -1781,6 +1786,12 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc
return OptionalInt.empty();
} else {
// CraftBukkit start
@@ -701,7 +693,7 @@ index 4c1786201a4044db61e99c148fca4714e2b172ad..163ac7b4b6fefb0c4594548dfffc0ea6
this.containerMenu = abstractContainerMenu; // Moved up
if (!this.isImmobile())
this.connection
-@@ -1911,6 +1923,11 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc
+@@ -1845,6 +1856,11 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc
}
@Override
public void closeContainer(org.bukkit.event.inventory.InventoryCloseEvent.Reason reason) {
@@ -714,7 +706,7 @@ index 4c1786201a4044db61e99c148fca4714e2b172ad..163ac7b4b6fefb0c4594548dfffc0ea6
// 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 3cd9b0df617715d0b3e70a6096e52bb5d22ab426..f1002643589f67adce26667b1750a1296c1fb67d 100644
+index ef283ec7934d143eeab482d99bf6fa8f327d2fe9..1b3a21ef16426234e782b1a297cd2e5c2505c666 100644
--- a/net/minecraft/server/players/PlayerList.java
+++ b/net/minecraft/server/players/PlayerList.java
@@ -251,6 +251,8 @@ public abstract class PlayerList {
@@ -726,7 +718,7 @@ index 3cd9b0df617715d0b3e70a6096e52bb5d22ab426..f1002643589f67adce26667b1750a129
player.isRealPlayer = true; // Paper
player.loginTime = System.currentTimeMillis(); // Paper - Replace OfflinePlayer#getLastPlayed
GameProfile gameProfile = player.getGameProfile();
-@@ -888,6 +890,15 @@ public abstract class PlayerList {
+@@ -854,6 +856,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) {
@@ -742,7 +734,7 @@ index 3cd9b0df617715d0b3e70a6096e52bb5d22ab426..f1002643589f67adce26667b1750a129
player.stopRiding(); // CraftBukkit
this.players.remove(player);
this.playersByName.remove(player.getScoreboardName().toLowerCase(java.util.Locale.ROOT)); // Spigot
-@@ -899,6 +910,7 @@ public abstract class PlayerList {
+@@ -865,6 +876,7 @@ public abstract class PlayerList {
ServerPlayer serverPlayer = player;
Level fromWorld = player.level();
player.wonGame = false;
@@ -1018,10 +1010,10 @@ index 3614551856c594f3c0cfee984fcf03fad672b007..f4577f908ca9f279b72d89e5b0822d34
});
entity.getBrain().eraseMemory(MemoryModuleType.POTENTIAL_JOB_SITE);
diff --git a/net/minecraft/world/entity/npc/Villager.java b/net/minecraft/world/entity/npc/Villager.java
-index 377e98469328f08db751c0f6a6f434b03f63c225..743c0c956ddd9e35d3c9c7b45fa8d36490d648dd 100644
+index a3040736384e54f26794db2bc938d63734f9614d..f456a44deac3645c44366ca1704ae25419baf52c 100644
--- a/net/minecraft/world/entity/npc/Villager.java
+++ b/net/minecraft/world/entity/npc/Villager.java
-@@ -797,13 +797,21 @@ public class Villager extends AbstractVillager implements ReputationEventHandler
+@@ -796,13 +796,21 @@ public class Villager extends AbstractVillager implements ReputationEventHandler
this.brain.getMemory(moduleType).ifPresent(pos -> {
ServerLevel level = server.getLevel(pos.dimension());
if (level != null) {
diff --git a/leaf-server/minecraft-patches/features/0229-Optimise-non-flush-packet-sending.patch b/leaf-server/minecraft-patches/features/0229-Optimise-non-flush-packet-sending.patch
index aebd9f16..47abf69a 100644
--- a/leaf-server/minecraft-patches/features/0229-Optimise-non-flush-packet-sending.patch
+++ b/leaf-server/minecraft-patches/features/0229-Optimise-non-flush-packet-sending.patch
@@ -26,18 +26,18 @@ Locally this patch drops the entity tracker tick by a full 1.5x.
Co-authored-by: Quang Tran <3d7777456@gmail.com>
diff --git a/net/minecraft/network/Connection.java b/net/minecraft/network/Connection.java
-index 1014ab2aeb5e496124c99c938538e88d75561cd5..2fda4bf1aeecba183ba6301f83f582ae34f5a3da 100644
+index e72eda830644851656fae3118c513d7bd701be45..01fb1bf0eba70b740b12731c79feadefc8fe96f0 100644
--- a/net/minecraft/network/Connection.java
+++ b/net/minecraft/network/Connection.java
-@@ -147,6 +147,7 @@ public class Connection extends SimpleChannelInboundHandler> {
- @Nullable public SocketAddress haProxyAddress; // Paper - Add API to get player's proxy address
+@@ -148,6 +148,7 @@ public class Connection extends SimpleChannelInboundHandler> {
+ public @Nullable net.minecraft.server.level.ServerPlayer savedPlayerForLoginEventLegacy; // Paper - playerloginevent
// Paper start - Optimize network
public boolean isPending = true;
+ private io.netty.channel.SingleThreadEventLoop eventLoop; // Paper - optimise packets that are not flushed
public boolean queueImmunity;
// Paper end - Optimize network
-@@ -158,6 +159,7 @@ public class Connection extends SimpleChannelInboundHandler> {
+@@ -159,6 +160,7 @@ public class Connection extends SimpleChannelInboundHandler> {
public void channelActive(ChannelHandlerContext context) throws Exception {
super.channelActive(context);
this.channel = context.channel();
@@ -45,7 +45,7 @@ index 1014ab2aeb5e496124c99c938538e88d75561cd5..2fda4bf1aeecba183ba6301f83f582ae
this.address = this.channel.remoteAddress();
this.preparing = false; // Spigot
if (this.delayedDisconnect != null) {
-@@ -472,6 +474,11 @@ public class Connection extends SimpleChannelInboundHandler> {
+@@ -473,6 +475,11 @@ public class Connection extends SimpleChannelInboundHandler> {
if (this.channel.eventLoop().inEventLoop()) {
this.doSendPacket(packet, channelFutureListener, flag);
} else {
diff --git a/leaf-server/minecraft-patches/features/0240-Protocol-Core.patch b/leaf-server/minecraft-patches/features/0240-Protocol-Core.patch
index 541e4333..09c445d6 100644
--- a/leaf-server/minecraft-patches/features/0240-Protocol-Core.patch
+++ b/leaf-server/minecraft-patches/features/0240-Protocol-Core.patch
@@ -34,10 +34,10 @@ index 42dbd6d9e82130cfc5ae4669c460373631061451..b3356ad173027afafba931f31952c5b5
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 163ac7b4b6fefb0c4594548dfffc0ea6f24f0765..479884c829a7550d39508bf37a2551f2ef52fcd1 100644
+index f9664926de5706eda918b457301174734b0b0300..8423a1cacf23e86eeb9b277b11e21c84bc298ab6 100644
--- a/net/minecraft/server/level/ServerPlayer.java
+++ b/net/minecraft/server/level/ServerPlayer.java
-@@ -876,6 +876,7 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc
+@@ -809,6 +809,7 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc
}
}
// Purpur end - Ridables
@@ -45,11 +45,11 @@ index 163ac7b4b6fefb0c4594548dfffc0ea6f24f0765..479884c829a7550d39508bf37a2551f2
}
private void updatePlayerAttributes() {
-diff --git a/net/minecraft/server/network/ServerCommonPacketListenerImpl.java b/net/minecraft/server/network/ServerCommonPacketListenerImpl.java
-index 23fefdc7122ff8e195c27651dc3a83000f62a95e..f90fc120d448ed2e3978682b189d4c955bc37051 100644
---- a/net/minecraft/server/network/ServerCommonPacketListenerImpl.java
-+++ b/net/minecraft/server/network/ServerCommonPacketListenerImpl.java
-@@ -206,6 +206,8 @@ public abstract class ServerCommonPacketListenerImpl implements ServerCommonPack
+diff --git a/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/net/minecraft/server/network/ServerGamePacketListenerImpl.java
+index baa703a89583f72fab0ebbc40c85399022185c29..983f2b1c12d2e64c099ba7c717b9d2bc7f1770ce 100644
+--- a/net/minecraft/server/network/ServerGamePacketListenerImpl.java
++++ b/net/minecraft/server/network/ServerGamePacketListenerImpl.java
+@@ -3871,6 +3871,8 @@ public class ServerGamePacketListenerImpl
PacketUtils.ensureRunningOnSameThread(packet, this, this.player.level());
@@ -59,7 +59,7 @@ index 23fefdc7122ff8e195c27651dc3a83000f62a95e..f90fc120d448ed2e3978682b189d4c95
final byte[] data = discardedPayload.data();
try {
diff --git a/net/minecraft/server/players/PlayerList.java b/net/minecraft/server/players/PlayerList.java
-index 1a03bf5184b1b85d4cea97dc73795e8725bf2613..58e1b90132898e30aa15ed08c76b53165473999a 100644
+index 6c61c11f655002359fe8791b9a1704d354b8f993..daf2410db29adad3751da1b08fa1774d84190aff 100644
--- a/net/minecraft/server/players/PlayerList.java
+++ b/net/minecraft/server/players/PlayerList.java
@@ -690,6 +690,7 @@ public abstract class PlayerList {
diff --git a/leaf-server/minecraft-patches/features/0241-Reduce-PlayerChunk-Updates.patch b/leaf-server/minecraft-patches/features/0241-Reduce-PlayerChunk-Updates.patch
index bc1077de..076fdaa1 100644
--- a/leaf-server/minecraft-patches/features/0241-Reduce-PlayerChunk-Updates.patch
+++ b/leaf-server/minecraft-patches/features/0241-Reduce-PlayerChunk-Updates.patch
@@ -5,10 +5,10 @@ Subject: [PATCH] Reduce PlayerChunk Updates
diff --git a/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/net/minecraft/server/network/ServerGamePacketListenerImpl.java
-index 0dec7852a4f225b9e9e94debf9259faea625028f..c5b2033c323695f71009d765b64e7ed8f94b9258 100644
+index 983f2b1c12d2e64c099ba7c717b9d2bc7f1770ce..6dc940aa6ee513e5c87b6058ccaa90bba91bade9 100644
--- a/net/minecraft/server/network/ServerGamePacketListenerImpl.java
+++ b/net/minecraft/server/network/ServerGamePacketListenerImpl.java
-@@ -1455,6 +1455,8 @@ public class ServerGamePacketListenerImpl
+@@ -1457,6 +1457,8 @@ public class ServerGamePacketListenerImpl
this.resetPosition();
}
@@ -17,7 +17,7 @@ index 0dec7852a4f225b9e9e94debf9259faea625028f..c5b2033c323695f71009d765b64e7ed8
if (this.player.hasClientLoaded()) {
float f = Mth.wrapDegrees(packet.getYRot(this.player.getYRot())); final float toYaw = f; // Paper - OBFHELPER
float f1 = Mth.wrapDegrees(packet.getXRot(this.player.getXRot())); final float toPitch = f1; // Paper - OBFHELPER
-@@ -1732,7 +1734,7 @@ public class ServerGamePacketListenerImpl
+@@ -1734,7 +1736,7 @@ public class ServerGamePacketListenerImpl
&& !isFallFlying
&& !isAutoSpinAttack
&& this.noBlocksAround(this.player);
diff --git a/leaf-server/minecraft-patches/features/0242-Async-switch-connection-state.patch b/leaf-server/minecraft-patches/features/0242-Async-switch-connection-state.patch
index 9e04f829..3b066ff2 100644
--- a/leaf-server/minecraft-patches/features/0242-Async-switch-connection-state.patch
+++ b/leaf-server/minecraft-patches/features/0242-Async-switch-connection-state.patch
@@ -5,10 +5,10 @@ Subject: [PATCH] Async switch connection state
diff --git a/net/minecraft/network/Connection.java b/net/minecraft/network/Connection.java
-index 2fda4bf1aeecba183ba6301f83f582ae34f5a3da..df012a4c67d474125fafa01b1677d9220fc817ae 100644
+index 01fb1bf0eba70b740b12731c79feadefc8fe96f0..a6077984e139be5cbcc00f8f0828f1992d3604a6 100644
--- a/net/minecraft/network/Connection.java
+++ b/net/minecraft/network/Connection.java
-@@ -342,6 +342,11 @@ public class Connection extends SimpleChannelInboundHandler> {
+@@ -343,6 +343,11 @@ public class Connection extends SimpleChannelInboundHandler> {
if (protocolInfo.flow() != this.getReceiving()) {
throw new IllegalStateException("Invalid inbound protocol: " + protocolInfo.id());
} else {
@@ -20,7 +20,7 @@ index 2fda4bf1aeecba183ba6301f83f582ae34f5a3da..df012a4c67d474125fafa01b1677d922
this.packetListener = packetInfo;
this.disconnectListener = null;
UnconfiguredPipelineHandler.InboundConfigurationTask inboundConfigurationTask = UnconfiguredPipelineHandler.setupInboundProtocol(protocolInfo);
-@@ -351,7 +356,14 @@ public class Connection extends SimpleChannelInboundHandler> {
+@@ -352,7 +357,14 @@ public class Connection extends SimpleChannelInboundHandler> {
inboundConfigurationTask = inboundConfigurationTask.andThen(context -> context.pipeline().addAfter("decoder", "bundler", packetBundlePacker));
}
@@ -36,7 +36,7 @@ index 2fda4bf1aeecba183ba6301f83f582ae34f5a3da..df012a4c67d474125fafa01b1677d922
}
}
-@@ -373,6 +385,31 @@ public class Connection extends SimpleChannelInboundHandler> {
+@@ -374,6 +386,31 @@ public class Connection extends SimpleChannelInboundHandler> {
}
}
@@ -69,7 +69,7 @@ index 2fda4bf1aeecba183ba6301f83f582ae34f5a3da..df012a4c67d474125fafa01b1677d922
if (this.packetListener != null) {
throw new IllegalStateException("Listener already set");
diff --git a/net/minecraft/server/network/ServerConfigurationPacketListenerImpl.java b/net/minecraft/server/network/ServerConfigurationPacketListenerImpl.java
-index b57f4e2528d73c3ba949cb7e5dce73871049968c..6b6a51af0198db0e157ee4cf5bd6b7751b69d3e5 100644
+index 91ca446e6e1d895d818fc7f844375101be6af5e8..8e24d76e24ad9788868934909a3c5e53823a5b13 100644
--- a/net/minecraft/server/network/ServerConfigurationPacketListenerImpl.java
+++ b/net/minecraft/server/network/ServerConfigurationPacketListenerImpl.java
@@ -140,11 +140,34 @@ public class ServerConfigurationPacketListenerImpl extends ServerCommonPacketLis
@@ -110,10 +110,10 @@ index b57f4e2528d73c3ba949cb7e5dce73871049968c..6b6a51af0198db0e157ee4cf5bd6b775
try {
PlayerList playerList = this.server.getPlayerList();
diff --git a/net/minecraft/server/network/ServerLoginPacketListenerImpl.java b/net/minecraft/server/network/ServerLoginPacketListenerImpl.java
-index 6b0b0ccc18a5da05685867656705e1fcf94b5891..889bab9613fb32d239bb0613db4a900a442116a3 100644
+index 2e014cd543a6a790a0023835199b0e956e49fd1f..72115a4d2c54834f9edef02c83ed79f0fe380e78 100644
--- a/net/minecraft/server/network/ServerLoginPacketListenerImpl.java
+++ b/net/minecraft/server/network/ServerLoginPacketListenerImpl.java
-@@ -493,11 +493,31 @@ public class ServerLoginPacketListenerImpl implements ServerLoginPacketListener,
+@@ -459,11 +459,31 @@ public class ServerLoginPacketListenerImpl implements ServerLoginPacketListener,
this.disconnect(ServerCommonPacketListenerImpl.DISCONNECT_UNEXPECTED_QUERY);
}
@@ -145,4 +145,4 @@ index 6b0b0ccc18a5da05685867656705e1fcf94b5891..889bab9613fb32d239bb0613db4a900a
+ if (!org.dreeam.leaf.config.modules.network.AlternativeJoin.enabled) this.connection.setupOutboundProtocol(ConfigurationProtocols.CLIENTBOUND); // Leaf - Async switch connection state
CommonListenerCookie commonListenerCookie = CommonListenerCookie.createInitial(Objects.requireNonNull(this.authenticatedProfile), this.transferred);
ServerConfigurationPacketListenerImpl serverConfigurationPacketListenerImpl = new ServerConfigurationPacketListenerImpl(
- this.server, this.connection, commonListenerCookie, this.player // CraftBukkit
+ this.server, this.connection, commonListenerCookie
diff --git a/leaf-server/minecraft-patches/features/0246-Only-tick-items-at-hand.patch b/leaf-server/minecraft-patches/features/0246-Only-tick-items-at-hand.patch
index 8444eb7e..b42981b1 100644
--- a/leaf-server/minecraft-patches/features/0246-Only-tick-items-at-hand.patch
+++ b/leaf-server/minecraft-patches/features/0246-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 479884c829a7550d39508bf37a2551f2ef52fcd1..6d8c500839062ca0cad2ffc58dad0de1626c0eb9 100644
+index 8423a1cacf23e86eeb9b277b11e21c84bc298ab6..fcd6d892b96d3e82ebb1aecf9a7a595f7dbd757c 100644
--- a/net/minecraft/server/level/ServerPlayer.java
+++ b/net/minecraft/server/level/ServerPlayer.java
-@@ -914,12 +914,19 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc
+@@ -847,12 +847,19 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc
super.tick();
}
diff --git a/leaf-server/minecraft-patches/features/0252-Add-configurable-death-item-drop-knockback-settings.patch b/leaf-server/minecraft-patches/features/0252-Add-configurable-death-item-drop-knockback-settings.patch
index 79338f3d..6972f264 100644
--- a/leaf-server/minecraft-patches/features/0252-Add-configurable-death-item-drop-knockback-settings.patch
+++ b/leaf-server/minecraft-patches/features/0252-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 6d8c500839062ca0cad2ffc58dad0de1626c0eb9..cc015575efcb0c3d56d33510a1f43f40996eab1a 100644
+index fcd6d892b96d3e82ebb1aecf9a7a595f7dbd757c..9c84df53473a58a182a544fd9dd27491c0dc3638 100644
--- a/net/minecraft/server/level/ServerPlayer.java
+++ b/net/minecraft/server/level/ServerPlayer.java
-@@ -1133,7 +1133,7 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc
+@@ -1066,7 +1066,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)) {
diff --git a/leaf-server/minecraft-patches/features/0255-Optimize-isEyeInFluid.patch b/leaf-server/minecraft-patches/features/0255-Optimize-isEyeInFluid.patch
index b2cd7da4..1c6c48f7 100644
--- a/leaf-server/minecraft-patches/features/0255-Optimize-isEyeInFluid.patch
+++ b/leaf-server/minecraft-patches/features/0255-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 cc015575efcb0c3d56d33510a1f43f40996eab1a..672301fcfe89dda6fb20bc0cd18d18fc26cd2efa 100644
+index 9c84df53473a58a182a544fd9dd27491c0dc3638..02e02aaa81921802ff61c35505acf7bb39f733c3 100644
--- a/net/minecraft/server/level/ServerPlayer.java
+++ b/net/minecraft/server/level/ServerPlayer.java
-@@ -1979,7 +1979,7 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc
+@@ -1912,7 +1912,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
}
@@ -175,7 +175,7 @@ index c8354d46ed909090f7c15f396863bf7d73afcefa..3ee788b172240ccf38cb31385dff1336
} else if (!flag) {
this.applyGravity();
diff --git a/net/minecraft/world/entity/LivingEntity.java b/net/minecraft/world/entity/LivingEntity.java
-index f95792b8642dc86a4d88e1d756de65d6cae2fa98..be8cc4aceafc183808a6d0f7278ef8378c4265e0 100644
+index f1975e5ab19da6dd1d8b94503924471e3efab921..6f57a8de40a398312e14282ff6764a633a949049 100644
--- a/net/minecraft/world/entity/LivingEntity.java
+++ b/net/minecraft/world/entity/LivingEntity.java
@@ -463,7 +463,7 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin
diff --git a/leaf-server/minecraft-patches/features/0266-Use-UUID-for-cure-reputation.patch b/leaf-server/minecraft-patches/features/0266-Use-UUID-for-cure-reputation.patch
index 96ebf276..feaeb4a9 100644
--- a/leaf-server/minecraft-patches/features/0266-Use-UUID-for-cure-reputation.patch
+++ b/leaf-server/minecraft-patches/features/0266-Use-UUID-for-cure-reputation.patch
@@ -22,10 +22,10 @@ index 22c1545a0329d56e0ec41ae4da1e1922aa1f9737..e89e4c26c40cbb3ef002022f22886d5f
}
diff --git a/net/minecraft/world/entity/npc/Villager.java b/net/minecraft/world/entity/npc/Villager.java
-index 743c0c956ddd9e35d3c9c7b45fa8d36490d648dd..c029256175b27bb5f0d30e3fa7371f04c2069fd6 100644
+index f456a44deac3645c44366ca1704ae25419baf52c..db23240fed3fb8b9bc2a7f670d7bfd8ab80ffcd6 100644
--- a/net/minecraft/world/entity/npc/Villager.java
+++ b/net/minecraft/world/entity/npc/Villager.java
-@@ -1095,6 +1095,21 @@ public class Villager extends AbstractVillager implements ReputationEventHandler
+@@ -1094,6 +1094,21 @@ public class Villager extends AbstractVillager implements ReputationEventHandler
}
}
diff --git a/leaf-server/minecraft-patches/features/0271-Paw-optimization.patch b/leaf-server/minecraft-patches/features/0271-Paw-optimization.patch
index a5949d54..2337ae64 100644
--- a/leaf-server/minecraft-patches/features/0271-Paw-optimization.patch
+++ b/leaf-server/minecraft-patches/features/0271-Paw-optimization.patch
@@ -11,7 +11,7 @@ Some random optimizations
- Secret patches (WIP)
diff --git a/net/minecraft/Util.java b/net/minecraft/Util.java
-index 1f4208388a923f9a1667dc13d937955ac233d88e..6e3bd3944b56010c3eabcdcd11424518bbb980fa 100644
+index 9f7288223bc1f13e3664d82d2e883336f527e5e2..ed51fd7c4c9f26dbcc348e6aefcafd367b1dd7bc 100644
--- a/net/minecraft/Util.java
+++ b/net/minecraft/Util.java
@@ -96,7 +96,7 @@ public class Util {
@@ -33,10 +33,10 @@ index 1f4208388a923f9a1667dc13d937955ac233d88e..6e3bd3944b56010c3eabcdcd11424518
public static void shutdownExecutors() {
diff --git a/net/minecraft/network/Connection.java b/net/minecraft/network/Connection.java
-index df012a4c67d474125fafa01b1677d9220fc817ae..7992df93f4eebb9ca41b9bca2784aec718d4efb8 100644
+index a6077984e139be5cbcc00f8f0828f1992d3604a6..4142ef85071b13427f99808482a1f1344ee976d3 100644
--- a/net/minecraft/network/Connection.java
+++ b/net/minecraft/network/Connection.java
-@@ -644,13 +644,7 @@ public class Connection extends SimpleChannelInboundHandler> {
+@@ -645,13 +645,7 @@ public class Connection extends SimpleChannelInboundHandler> {
if (!(this.packetListener instanceof net.minecraft.server.network.ServerLoginPacketListenerImpl loginPacketListener)
|| loginPacketListener.state != net.minecraft.server.network.ServerLoginPacketListenerImpl.State.VERIFYING
|| Connection.joinAttemptsThisTick++ < MAX_PER_TICK) {
@@ -100,7 +100,7 @@ index 4535858701b2bb232b9d2feb2af6551526232ddc..e65c62dbe4c1560ae153e4c4344e9194
- // Paper end - detailed watchdog information
}
diff --git a/net/minecraft/server/level/ServerLevel.java b/net/minecraft/server/level/ServerLevel.java
-index c49d2f7314a35763831285d7d46d34dade2f0085..79f2b26bc466238ec83cd049f38d257b0000028d 100644
+index 08c6f93bcc028c876e17870681382aa9fa2ba3ee..58a77b5aa49cb56eea33757e982ba1852bbfb679 100644
--- a/net/minecraft/server/level/ServerLevel.java
+++ b/net/minecraft/server/level/ServerLevel.java
@@ -1518,13 +1518,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
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 da17c325..14d0749b 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: a112b6aca718e4500a6d48ca9d7158faf0f4adf9
+Commit: 591baf2648d0f75ffecc52f1d169348af35246dd
Patches listed below are removed in this patch, They exists in Gale or Leaf:
* "Rebrand.patch"
@@ -127,7 +127,7 @@ index 0000000000000000000000000000000000000000..15a226e3854d731f7724025ea3459c8a
+ }
+}
diff --git a/src/main/java/com/destroystokyo/paper/entity/ai/MobGoalHelper.java b/src/main/java/com/destroystokyo/paper/entity/ai/MobGoalHelper.java
-index 94bf04bb1c646ec5ba1d42f4b7b3e6c200707beb..3e41a308cf92b841b5375250d1380d16af3d0309 100644
+index e6ad63a56dc0fc969dbf3ed5bdc36b4187331e30..f99ee5383bb9f33c1ebdbc74a640c2f7dc20a046 100644
--- a/src/main/java/com/destroystokyo/paper/entity/ai/MobGoalHelper.java
+++ b/src/main/java/com/destroystokyo/paper/entity/ai/MobGoalHelper.java
@@ -142,6 +142,10 @@ public class MobGoalHelper {
@@ -1068,10 +1068,10 @@ index 02deb9c37250144be9afa0fe55df2a49017a7070..dfb597fcb8d01ed6cf20eae57e260949
+ // Purpur end - Llama API
}
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
-index 3e18819ae23ab5ecd866d61cd0fd62ce1324109e..7f17c5025f25e44a917f5d6a65b8d958a982b301 100644
+index 3ea6d207b2189fa6bebe101bfc98093c2c6b19c7..7f5eca8f32ae1afe3e6d2544b76cf0bbe131109f 100644
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
-@@ -625,10 +625,15 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
+@@ -575,10 +575,15 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
@Override
public void setPlayerListName(String name) {
@@ -1088,7 +1088,7 @@ index 3e18819ae23ab5ecd866d61cd0fd62ce1324109e..7f17c5025f25e44a917f5d6a65b8d958
if (this.getHandle().connection == null) return; // Paper - Updates are possible before the player has fully joined
for (ServerPlayer player : (List) this.server.getHandle().players) {
if (player.getBukkitEntity().canSee(this)) {
-@@ -1442,6 +1447,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
+@@ -1392,6 +1397,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
// Paper start - Teleport passenger API
// Don't allow teleporting between worlds while keeping passengers
if (ignorePassengers && entity.isVehicle() && location.getWorld() != this.getWorld()) {
@@ -1096,7 +1096,7 @@ index 3e18819ae23ab5ecd866d61cd0fd62ce1324109e..7f17c5025f25e44a917f5d6a65b8d958
return false;
}
-@@ -1463,6 +1469,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
+@@ -1413,6 +1419,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
}
if (entity.isVehicle() && !ignorePassengers) { // Paper - Teleport API
@@ -1104,7 +1104,7 @@ index 3e18819ae23ab5ecd866d61cd0fd62ce1324109e..7f17c5025f25e44a917f5d6a65b8d958
return false;
}
-@@ -2726,6 +2733,28 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
+@@ -2676,6 +2683,28 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
return this.getHandle().getAbilities().walkingSpeed * 2f;
}
@@ -1133,9 +1133,9 @@ index 3e18819ae23ab5ecd866d61cd0fd62ce1324109e..7f17c5025f25e44a917f5d6a65b8d958
private void validateSpeed(float value) {
Preconditions.checkArgument(value <= 1f && value >= -1f, "Speed value (%s) need to be between -1f and 1f", value);
}
-@@ -3569,4 +3598,76 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
- public void setDeathScreenScore(final int score) {
- getHandle().setScore(score);
+@@ -3524,4 +3553,76 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
+ public PlayerGameConnection getConnection() {
+ return this.getHandle().connection.playerGameConnection;
}
+
+ // Purpur start - Purpur client support
@@ -1292,10 +1292,10 @@ index 33866c5a5591150de4c1d8f4c175122db3bd5bd4..5fd656f43985e3972c9f572d5b05bf5c
+ // Purpur end - Configurable chance for wolves to spawn rabid
}
diff --git a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java
-index c5daefa56597bd13fe227fa014ca5225c00a2a2d..98b766d115856dbf3ea11a983c1304591032f1b0 100644
+index 1d112510093d5eb5117adf16b92dd3411a610a4a..a162440a583801671787163d998d6b9546ef7e61 100644
--- a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java
+++ b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java
-@@ -515,6 +515,15 @@ public class CraftEventFactory {
+@@ -525,6 +525,15 @@ public class CraftEventFactory {
}
craftServer.getPluginManager().callEvent(event);
@@ -1311,7 +1311,7 @@ index c5daefa56597bd13fe227fa014ca5225c00a2a2d..98b766d115856dbf3ea11a983c130459
return event;
}
-@@ -1047,6 +1056,7 @@ public class CraftEventFactory {
+@@ -1057,6 +1066,7 @@ public class CraftEventFactory {
EntityDamageEvent event;
if (damager != null) {
event = new EntityDamageByEntityEvent(damager.getBukkitEntity(), damagee.getBukkitEntity(), cause, bukkitDamageSource, modifiers, modifierFunctions, critical);
@@ -1320,10 +1320,10 @@ index c5daefa56597bd13fe227fa014ca5225c00a2a2d..98b766d115856dbf3ea11a983c130459
event = new EntityDamageEvent(damagee.getBukkitEntity(), cause, bukkitDamageSource, modifiers, modifierFunctions);
}
diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftContainer.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftContainer.java
-index c00ddfe41439954fa0fd87c0933f274c8a752eb6..5fde4c71915f55f100cd30406803d6fca5b573dc 100644
+index 2f41a92465b9da28e026297cc3528898bb1c8412..83ae4b40e33e0dc58e0fd6aacf22e22ae0cd3684 100644
--- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftContainer.java
+++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftContainer.java
-@@ -150,8 +150,19 @@ public class CraftContainer extends AbstractContainerMenu {
+@@ -148,8 +148,19 @@ public class CraftContainer extends AbstractContainerMenu {
case PLAYER:
case CHEST:
case ENDER_CHEST:
diff --git a/leaf-server/paper-patches/features/0027-KeYi-Player-Skull-API.patch b/leaf-server/paper-patches/features/0027-KeYi-Player-Skull-API.patch
index 421702ca..c7613aef 100644
--- a/leaf-server/paper-patches/features/0027-KeYi-Player-Skull-API.patch
+++ b/leaf-server/paper-patches/features/0027-KeYi-Player-Skull-API.patch
@@ -7,10 +7,10 @@ Original license: MIT
Original project: https://github.com/KeYiMC/KeYi
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
-index 7f17c5025f25e44a917f5d6a65b8d958a982b301..94efaf127c22b6bb722982bf1ccc63bfd6458153 100644
+index 7f5eca8f32ae1afe3e6d2544b76cf0bbe131109f..571b1337b5a4dcbe0fe09b86198c8ed068a4e81b 100644
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
-@@ -3670,4 +3670,31 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
+@@ -3625,4 +3625,31 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
this.getHandle().connection.send(new net.minecraft.network.protocol.game.ClientboundPlayerCombatKillPacket(getEntityId(), io.papermc.paper.adventure.PaperAdventure.asVanilla(message)));
}
// Purpur end - Death screen API
diff --git a/leaf-server/paper-patches/features/0028-Slice-Smooth-Teleports.patch b/leaf-server/paper-patches/features/0028-Slice-Smooth-Teleports.patch
index cc81f824..749a5d2d 100644
--- a/leaf-server/paper-patches/features/0028-Slice-Smooth-Teleports.patch
+++ b/leaf-server/paper-patches/features/0028-Slice-Smooth-Teleports.patch
@@ -9,10 +9,10 @@ Original project: https://github.com/Cryptite/Slice
Co-authored-by: HaHaWTH <102713261+HaHaWTH@users.noreply.github.com>
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
-index 94efaf127c22b6bb722982bf1ccc63bfd6458153..c5da43af18b507d348dae8fa46852c1d1af65742 100644
+index 571b1337b5a4dcbe0fe09b86198c8ed068a4e81b..d612623cf25f454cc535c5d395758ed510d345f6 100644
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
-@@ -1392,6 +1392,25 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
+@@ -1342,6 +1342,25 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
// Paper end - Teleportation API
}
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 69ed4958..30e4f235 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
@@ -73,10 +73,10 @@ index 476eefebace887064b728f08af40c746b6f70787..beae8a57a0ce9b8e7d81619efe4c39d9
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 c5da43af18b507d348dae8fa46852c1d1af65742..4fcc231b0acbb536f3f6466454555845fe54a815 100644
+index d612623cf25f454cc535c5d395758ed510d345f6..d8dcb28810668b26b538a6d26038e295d10019e4 100644
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
-@@ -2294,7 +2294,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
+@@ -2244,7 +2244,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
@Override
public boolean canSee(Player player) {
diff --git a/leaf-server/paper-patches/features/0032-SparklyPaper-Optimize-canSee-checks.patch b/leaf-server/paper-patches/features/0032-SparklyPaper-Optimize-canSee-checks.patch
index 90880432..caa2953a 100644
--- a/leaf-server/paper-patches/features/0032-SparklyPaper-Optimize-canSee-checks.patch
+++ b/leaf-server/paper-patches/features/0032-SparklyPaper-Optimize-canSee-checks.patch
@@ -16,10 +16,10 @@ This seems stupid, but it does seem that it improves the performance a bit, and
We also create a "canSee" method tailored for "ChunkMap#updatePlayer()", a method without the equals check (the "updatePlayer()" already checks if the entity is the same entity) because the CraftPlayer's `equals()` check is a *bit* expensive compared to only checking the object's identity, and because the identity has already been check, we don't need to check it twice.
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
-index 4fcc231b0acbb536f3f6466454555845fe54a815..a6d89e3e6dcdfac785111706dfceabffa0a52cbf 100644
+index d8dcb28810668b26b538a6d26038e295d10019e4..384b11fdf3606f0ee59ea1e58a3a312e3898fce6 100644
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
-@@ -227,7 +227,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
+@@ -228,7 +228,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
private boolean hasPlayedBefore = false;
private final ConversationTracker conversationTracker = new ConversationTracker();
private final Set channels = new HashSet();
@@ -28,7 +28,7 @@ index 4fcc231b0acbb536f3f6466454555845fe54a815..a6d89e3e6dcdfac785111706dfceabff
private final Set unlistedEntities = new HashSet<>(); // Paper - Add Listing API for Player
private static final WeakHashMap> pluginWeakReferences = new WeakHashMap<>();
private int hash = 0;
-@@ -2299,9 +2299,16 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
+@@ -2249,9 +2249,16 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
@Override
public boolean canSee(org.bukkit.entity.Entity entity) {
diff --git a/leaf-server/paper-patches/features/0042-Multithreaded-Tracker.patch b/leaf-server/paper-patches/features/0042-Multithreaded-Tracker.patch
index 41b4bc4f..e9fff02f 100644
--- a/leaf-server/paper-patches/features/0042-Multithreaded-Tracker.patch
+++ b/leaf-server/paper-patches/features/0042-Multithreaded-Tracker.patch
@@ -72,10 +72,10 @@ index beae8a57a0ce9b8e7d81619efe4c39d908869319..6b1926080eddf61ff9c0156a6846f7f0
}
return set;
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
-index a6d89e3e6dcdfac785111706dfceabffa0a52cbf..66d555e97177e340ee1c07ae389a6c52855dd3d9 100644
+index 384b11fdf3606f0ee59ea1e58a3a312e3898fce6..15d549931183e0c9a7dc54737fc2947af58934b0 100644
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
-@@ -2895,7 +2895,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
+@@ -2845,7 +2845,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
Iterator iterator = collection.iterator();
while (iterator.hasNext()) {
AttributeInstance genericInstance = iterator.next();
@@ -85,10 +85,10 @@ index a6d89e3e6dcdfac785111706dfceabffa0a52cbf..66d555e97177e340ee1c07ae389a6c52
break;
}
diff --git a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java
-index 98b766d115856dbf3ea11a983c1304591032f1b0..62cefed7674a6938698a57f5f89750d120461e9c 100644
+index a162440a583801671787163d998d6b9546ef7e61..5e73db484a5526f4c39c7cc2de5ddc3ff037d2e4 100644
--- a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java
+++ b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java
-@@ -1798,6 +1798,26 @@ public class CraftEventFactory {
+@@ -1808,6 +1808,26 @@ public class CraftEventFactory {
}
public static boolean handleBlockFormEvent(Level world, BlockPos pos, net.minecraft.world.level.block.state.BlockState state, int flags, @Nullable Entity entity, boolean checkSetResult) {
diff --git a/leaf-server/paper-patches/features/0049-SparklyPaper-Parallel-world-ticking.patch b/leaf-server/paper-patches/features/0049-SparklyPaper-Parallel-world-ticking.patch
index 710d0d3a..994660a6 100644
--- a/leaf-server/paper-patches/features/0049-SparklyPaper-Parallel-world-ticking.patch
+++ b/leaf-server/paper-patches/features/0049-SparklyPaper-Parallel-world-ticking.patch
@@ -1508,7 +1508,7 @@ index 196835bdf95ba0e149b2977e9ef41698971f501f..eb7e63d4549e672ff1206055d2d75439
net.minecraft.world.item.ItemStack nms = org.bukkit.craftbukkit.inventory.CraftItemStack.asNMSCopy(item);
diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftBlockStates.java b/src/main/java/org/bukkit/craftbukkit/block/CraftBlockStates.java
-index eb51cfce4069035664d2d1e3d30ab681e917dee6..aea45592a3e870b9474e64317c329c55ffbebfdb 100644
+index db71a9fc02bfac7799b58f07da044e53b2273e98..842713df01a0bde562b2bef366af7d5429497bae 100644
--- a/src/main/java/org/bukkit/craftbukkit/block/CraftBlockStates.java
+++ b/src/main/java/org/bukkit/craftbukkit/block/CraftBlockStates.java
@@ -195,14 +195,14 @@ public final class CraftBlockStates {
@@ -1530,10 +1530,10 @@ index eb51cfce4069035664d2d1e3d30ab681e917dee6..aea45592a3e870b9474e64317c329c55
}
diff --git a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java
-index 62cefed7674a6938698a57f5f89750d120461e9c..3c21b9701e0266bc56e6d3fc855bf49ed381441c 100644
+index 5e73db484a5526f4c39c7cc2de5ddc3ff037d2e4..acb5182a59859f65653cd309ca85b8301ace5383 100644
--- a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java
+++ b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java
-@@ -819,6 +819,28 @@ public class CraftEventFactory {
+@@ -829,6 +829,28 @@ public class CraftEventFactory {
}
public static BlockPos sourceBlockOverride = null; // SPIGOT-7068: Add source block override, not the most elegant way but better than passing down a BlockPos up to five methods deep.
@@ -1562,7 +1562,7 @@ index 62cefed7674a6938698a57f5f89750d120461e9c..3c21b9701e0266bc56e6d3fc855bf49e
public static boolean handleBlockSpreadEvent(LevelAccessor world, BlockPos source, BlockPos target, net.minecraft.world.level.block.state.BlockState state, int flags) {
return handleBlockSpreadEvent(world, source, target, state, flags, false);
-@@ -834,7 +856,10 @@ public class CraftEventFactory {
+@@ -844,7 +866,10 @@ public class CraftEventFactory {
CraftBlockState snapshot = CraftBlockStates.getBlockState(world, target);
snapshot.setData(state);
diff --git a/public/readme/README_CN.md b/public/readme/README_CN.md
index 0fd85368..f7ea6159 100644
--- a/public/readme/README_CN.md
+++ b/public/readme/README_CN.md
@@ -2,7 +2,7 @@
[](https://www.leafmc.one/zh/download)⠀
-[](https://github.com/Winds-Studio/Leaf/actions)⠀
+[](https://github.com/Winds-Studio/Leaf/actions)⠀

[](https://www.leafmc.one/zh/docs)
@@ -65,7 +65,7 @@
cn.dreeam.leaf
leaf-api
- 1.21.6-R0.1-SNAPSHOT
+ 1.21.7-R0.1-SNAPSHOT
provided
```
@@ -78,7 +78,7 @@ repositories {
}
dependencies {
- compileOnly("cn.dreeam.leaf:leaf-api:1.21.6-R0.1-SNAPSHOT")
+ compileOnly("cn.dreeam.leaf:leaf-api:1.21.7-R0.1-SNAPSHOT")
}
java {
diff --git a/scripts/prepareRelease.sh b/scripts/prepareRelease.sh
index a495fee4..f9c8a3af 100755
--- a/scripts/prepareRelease.sh
+++ b/scripts/prepareRelease.sh
@@ -2,15 +2,15 @@
set -e
IS_EOL=false
-IS_UNSUPPORTED=true
+IS_UNSUPPORTED=false
IS_DEV=false
-JAR_NAME="leaf-1.21.6"
-CURRENT_TAG="ver-1.21.6"
+JAR_NAME="leaf-1.21.7"
+CURRENT_TAG="ver-1.21.7"
RELEASE_NOTES="release_notes.md"
# Rename Leaf jar
-mv ./leaf-server/build/libs/leaf-paperclip-1.21.6-R0.1-SNAPSHOT-mojmap.jar ./$JAR_NAME-${BUILD_NUMBER}.jar
+mv ./leaf-server/build/libs/leaf-paperclip-1.21.7-R0.1-SNAPSHOT-mojmap.jar ./$JAR_NAME-${BUILD_NUMBER}.jar
# Branch name
CURRENT_BRANCH=$(git rev-parse --abbrev-ref HEAD)
diff --git a/scripts/upstreamCommit.sh b/scripts/upstreamCommit.sh
index 0f6ea255..01720684 100755
--- a/scripts/upstreamCommit.sh
+++ b/scripts/upstreamCommit.sh
@@ -64,7 +64,7 @@ fi
# Purpur updates
if [ -n "$purpurHash" ]; then
- purpur=$(getCommits "PurpurMC/Purpur" "$purpurHash" "ver/1.21.6") # Update this on every version update
+ purpur=$(getCommits "PurpurMC/Purpur" "$purpurHash" "ver/1.21.7") # Update this on every version update
# Updates found
if [ -n "$purpur" ]; then