diff --git a/README.md b/README.md
index 59c560ec..1bcf1a6d 100644
--- a/README.md
+++ b/README.md
@@ -6,12 +6,12 @@
[](https://github.com/Winds-Studio/Leaf/actions)
[](LICENSE)
-
Leaf is a drop-in replacement for Gale servers designed for fix some bugs and customize, and performance built on top of Gale.
+Leaf is a drop-in replacement for Pufferfish servers designed for fix some bugs and customize, and performance built on top of Pufferfish.
Logo created by NaixiNana
## Features
- - Fork of [Gale](https://github.com/GaleMC/Gale) for better performance.
+ - Fork of [Pufferfish](https://github.com/pufferfish-gg/Pufferfish) for better performance.
- Allowing all characters as username, including Chinese and other characters.
- Allowing players connect to backend server through proxy without enabling bunngecord mode.
- Allowing players use tripwire dupe.
@@ -52,7 +52,7 @@ Yes, this also includes all API provided by Paper, Spigot, and Bukkit.
Credits:
-------------
-- [Gale](https://github.com/GaleMC/Gale)
- [Pufferfish](https://github.com/pufferfish-gg/Pufferfish)
+- [Gale](https://github.com/GaleMC/Gale)
- [Purpur](https://github.com/PurpurMC/Purpur)
- [KeYi](https://github.com/KeYiMC/KeYi)
diff --git a/build.gradle.kts b/build.gradle.kts
index a09130d7..834f05f8 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
@@ -62,13 +62,13 @@ paperweight {
remapRepo.set("https://maven.fabricmc.net/")
decompileRepo.set("https://maven.quiltmc.org/")
- useStandardUpstream("Gale") {
- url.set(github("GaleMC", "Gale"))
- ref.set(providers.gradleProperty("GaleCommit"))
+ useStandardUpstream("Pufferfish") {
+ url.set(github("pufferfish-gg", "Pufferfish"))
+ ref.set(providers.gradleProperty("PufferfishCommit"))
withStandardPatcher {
- apiSourceDirPath.set("gale-api")
- serverSourceDirPath.set("gale-server")
+ apiSourceDirPath.set("pufferfish-api")
+ serverSourceDirPath.set("pufferfish-server")
apiPatchDir.set(layout.projectDirectory.dir("patches/api"))
apiOutputDir.set(layout.projectDirectory.dir("Leaf-API"))
diff --git a/gradle.properties b/gradle.properties
index f1a85a67..e7b56fa4 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -1,7 +1,7 @@
group = org.dreeam.leaf
version = 1.19.3-R0.1-SNAPSHOT
-GaleCommit = 9eec5eae111108ca5cd2ad7bfb562a11a15353b9
+PufferfishCommit = 15538a9d3c71687c733c4c6dd94f4b9855917401
org.gradle.caching = true
org.gradle.parallel = true
diff --git a/patches/api/0001-Leaf-config-files.patch b/patches/api/0001-Leaf-config-files.patch
index 4ad28a38..e1c0b1d2 100644
--- a/patches/api/0001-Leaf-config-files.patch
+++ b/patches/api/0001-Leaf-config-files.patch
@@ -5,11 +5,11 @@ Subject: [PATCH] Leaf config files
diff --git a/src/main/java/org/bukkit/Server.java b/src/main/java/org/bukkit/Server.java
-index 4c519dbd706cac728f31a7ccd99cc1e165812599..425ee736dbaacc0e633740b27723b9f62007be44 100644
+index 2204336d8800311b65e894739ab1b27273e7c6f2..39808c0cc23a97f707366378f28ba64b80e6acbb 100644
--- a/src/main/java/org/bukkit/Server.java
+++ b/src/main/java/org/bukkit/Server.java
-@@ -2014,6 +2014,14 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi
-
+@@ -1971,6 +1971,14 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi
+ }
// Paper end
+ // Leaf start
diff --git a/patches/api/0002-Bump-Dependencies.patch b/patches/api/0002-Bump-Dependencies.patch
index 81e1cf8e..3f3e623d 100644
--- a/patches/api/0002-Bump-Dependencies.patch
+++ b/patches/api/0002-Bump-Dependencies.patch
@@ -5,7 +5,7 @@ Subject: [PATCH] Bump Dependencies
diff --git a/build.gradle.kts b/build.gradle.kts
-index 33e7179c81310283e5e6efb5fd776a60ae669624..9a7e11e737e12f737d404c6c19e90f055d12d29e 100644
+index a995ecc3b1d6181c58d5b4a0a6a893178bdc40aa..63f4b9697415f073937ae08bafb6b8b0b85f174d 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
@@ -25,13 +25,13 @@ dependencies {
@@ -24,14 +24,16 @@ index 33e7179c81310283e5e6efb5fd776a60ae669624..9a7e11e737e12f737d404c6c19e90f05
apiAndDocs(platform("net.kyori:adventure-bom:$adventureVersion"))
apiAndDocs("net.kyori:adventure-api")
apiAndDocs("net.kyori:adventure-text-minimessage")
-@@ -39,17 +39,17 @@ dependencies {
+@@ -39,18 +39,18 @@ dependencies {
apiAndDocs("net.kyori:adventure-text-serializer-legacy")
apiAndDocs("net.kyori:adventure-text-serializer-plain")
apiAndDocs("net.kyori:adventure-text-logger-slf4j")
- api("org.apache.logging.log4j:log4j-api:2.17.1")
- api("org.slf4j:slf4j-api:1.8.0-beta4")
+- api("io.sentry:sentry:5.4.0") // Pufferfish
+ api("org.apache.logging.log4j:log4j-api:2.19.0")
+ api("org.slf4j:slf4j-api:1.8.0-beta4") // Leaf TODO - Bump later, need to fix breaking compatibility
++ api("io.sentry:sentry:6.10.0") // Pufferfish
- implementation("org.ow2.asm:asm:9.2")
- implementation("org.ow2.asm:asm-commons:9.2")
@@ -49,7 +51,7 @@ index 33e7179c81310283e5e6efb5fd776a60ae669624..9a7e11e737e12f737d404c6c19e90f05
val annotations = "org.jetbrains:annotations:23.0.0" // Paper - we don't want Java 5 annotations...
compileOnly(annotations)
-@@ -63,8 +63,8 @@ dependencies {
+@@ -64,8 +64,8 @@ dependencies {
testImplementation("org.apache.commons:commons-lang3:3.12.0")
testImplementation("junit:junit:4.13.2")
@@ -60,7 +62,7 @@ index 33e7179c81310283e5e6efb5fd776a60ae669624..9a7e11e737e12f737d404c6c19e90f05
}
configure {
-@@ -149,6 +149,9 @@ val scanJar = tasks.register("scanJarForBadCalls", io.papermc.paperweight.tasks.
+@@ -147,6 +147,9 @@ val scanJar = tasks.register("scanJarForBadCalls", io.papermc.paperweight.tasks.
jarToScan.set(tasks.jar.flatMap { it.archiveFile })
classpath.from(configurations.compileClasspath)
}
diff --git a/patches/api/0003-Purpur-Lagging-threshold.patch b/patches/api/0003-Purpur-Lagging-threshold.patch
index 8cc25bd7..a6b7dd8b 100644
--- a/patches/api/0003-Purpur-Lagging-threshold.patch
+++ b/patches/api/0003-Purpur-Lagging-threshold.patch
@@ -27,13 +27,14 @@ index ac9b690fcccb60b587e5345f12f1383afd0a73a1..0a4320b32485db84a0be16535b406f04
+ // Purpur end
}
diff --git a/src/main/java/org/bukkit/Server.java b/src/main/java/org/bukkit/Server.java
-index 425ee736dbaacc0e633740b27723b9f62007be44..1ac20245be32a3ab9a869fea7ec321b3de72a86d 100644
+index 39808c0cc23a97f707366378f28ba64b80e6acbb..8eb8a788dc3dbc0d5ac24089a57c730089fd8dbe 100644
--- a/src/main/java/org/bukkit/Server.java
+++ b/src/main/java/org/bukkit/Server.java
-@@ -2216,4 +2216,12 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi
- long getLastTickOversleepTime();
- // Gale end - YAPFA - last tick time - API
-
+@@ -2147,4 +2147,13 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi
+ */
+ @NotNull org.bukkit.potion.PotionBrewer getPotionBrewer();
+ // Paper end
++
+ // Purpur start
+ /**
+ * Check if server is lagging according to laggy threshold setting
@@ -41,5 +42,5 @@ index 425ee736dbaacc0e633740b27723b9f62007be44..1ac20245be32a3ab9a869fea7ec321b3
+ * @return True if lagging
+ */
+ boolean isLagging();
-+ // Purpur endd
++ // Purpur end
}
diff --git a/patches/api/0007-KTP-Optimize-Spigot-event-bus.patch b/patches/api/0007-KTP-Optimize-Spigot-event-bus.patch
index 59b71ac3..b994fbc2 100644
--- a/patches/api/0007-KTP-Optimize-Spigot-event-bus.patch
+++ b/patches/api/0007-KTP-Optimize-Spigot-event-bus.patch
@@ -24,12 +24,12 @@ index 3b3d9642a8d63798dc28f2f8df77f0466451cbff..8d3605f25e97a375971705c737bc7bac
}
}
diff --git a/src/main/java/org/bukkit/plugin/SimplePluginManager.java b/src/main/java/org/bukkit/plugin/SimplePluginManager.java
-index 7903554958f567c7b566a47fa4b49852a837898e..730394fd53fdaa90133ee399f86e76da8ccc08e6 100644
+index c077e7c883613fcb6e559b4e4776e794caa3b363..ba869354adc59db2fc547c481c1ed4d5d0af23b7 100644
--- a/src/main/java/org/bukkit/plugin/SimplePluginManager.java
+++ b/src/main/java/org/bukkit/plugin/SimplePluginManager.java
-@@ -662,11 +662,15 @@ public final class SimplePluginManager implements PluginManager {
- // Gale end - JettPack - skip events without listeners
-
+@@ -656,11 +656,15 @@ public final class SimplePluginManager implements PluginManager {
+ @Override
+ public void callEvent(@NotNull Event event) {
// Paper - replace callEvent by merging to below method
- if (event.isAsynchronous() && server.isPrimaryThread()) {
+ // KTP start - optimize spigot event bus
@@ -43,5 +43,5 @@ index 7903554958f567c7b566a47fa4b49852a837898e..730394fd53fdaa90133ee399f86e76da
}
+ // KTP end - optimize spigot event bus
- for (RegisteredListener registration : listeners) {
- if (!registration.getPlugin().isEnabled()) {
+ HandlerList handlers = event.getHandlers();
+ RegisteredListener[] listeners = handlers.getRegisteredListeners();
diff --git a/patches/api/0008-KeYi-Add-Java19-Support-for-SIMD.patch b/patches/api/0008-KeYi-Add-Java19-Support-for-SIMD.patch
index 98de7f6b..4f178a67 100644
--- a/patches/api/0008-KeYi-Add-Java19-Support-for-SIMD.patch
+++ b/patches/api/0008-KeYi-Add-Java19-Support-for-SIMD.patch
@@ -7,22 +7,21 @@ Original license: MIT
Original project: https://github.com/KeYiMC/KeYi
diff --git a/src/main/java/gg/pufferfish/pufferfish/simd/SIMDChecker.java b/src/main/java/gg/pufferfish/pufferfish/simd/SIMDChecker.java
-index 48312d416805697257e4cd3451b8d14bab7ea252..cfab520664df368cabcfbd925414d227cd352b57 100644
+index ab5fea0b03224bf249352ce340e94704ff713345..42288a065acee7e3181364bfadb26d3c1dc6fdc2 100644
--- a/src/main/java/gg/pufferfish/pufferfish/simd/SIMDChecker.java
+++ b/src/main/java/gg/pufferfish/pufferfish/simd/SIMDChecker.java
-@@ -17,8 +17,7 @@ public class SIMDChecker {
- @Deprecated
- public static boolean canEnable(Logger logger, boolean logVectorSizesToConsole) {
- try {
-- int javaVersion = SIMDDetection.getJavaVersion();
-- if (!(javaVersion >= 17 && javaVersion <= 19)) {
-+ if (SIMDDetection.getJavaVersion() < 17) { // KeYi - Add Java19 Support for SIMD
- return false;
- } else {
- SIMDDetection.testRun = true;
-@@ -41,5 +40,4 @@ public class SIMDChecker {
- } catch (NoClassDefFoundError | Exception ignored) {} // Basically, we don't do anything. This lets us detect if it's not functional and disable it.
- return false;
- }
--
+@@ -15,7 +15,7 @@ public class SIMDChecker {
+ @Deprecated
+ public static boolean canEnable(Logger logger) {
+ try {
+- if (SIMDDetection.getJavaVersion() != 17 && SIMDDetection.getJavaVersion() != 18 && SIMDDetection.getJavaVersion() != 19) {
++ if (SIMDDetection.getJavaVersion() < 17) { // KeYi - Add Java19 Support for SIMD
+ return false;
+ } else {
+ SIMDDetection.testRun = true;
+@@ -36,5 +36,4 @@ public class SIMDChecker {
+ } catch (NoClassDefFoundError | Exception ignored) {} // Basically, we don't do anything. This lets us detect if it's not functional and disable it.
+ return false;
+ }
+-
}
diff --git a/patches/api/0009-KeYi-Player-Skull-API.patch b/patches/api/0009-KeYi-Player-Skull-API.patch
index 6e19e539..d33aaa03 100644
--- a/patches/api/0009-KeYi-Player-Skull-API.patch
+++ b/patches/api/0009-KeYi-Player-Skull-API.patch
@@ -7,7 +7,7 @@ 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 f0302931b082d9a70799d1984dfeb5b0e0973473..2064e3a7bd0fd2a44130999e54b2dcce7be15658 100644
+index 9f762cf670bf5db9138e468e72e57781d8d22f54..f8bcea8fa62a63d61fb16a51cf7c05cbe09fc825 100644
--- a/src/main/java/org/bukkit/entity/Player.java
+++ b/src/main/java/org/bukkit/entity/Player.java
@@ -3,6 +3,9 @@ package org.bukkit.entity;
@@ -20,7 +20,7 @@ index f0302931b082d9a70799d1984dfeb5b0e0973473..2064e3a7bd0fd2a44130999e54b2dcce
import com.destroystokyo.paper.ClientOption; // Paper
import com.destroystokyo.paper.Title; // Paper
import net.kyori.adventure.text.Component;
-@@ -2913,4 +2916,23 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
+@@ -2903,4 +2906,23 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
@Override
Spigot spigot();
// Spigot end
diff --git a/patches/server/0001-Rebrand.patch b/patches/server/0001-Rebrand.patch
index 512e47cd..8316e8d4 100644
--- a/patches/server/0001-Rebrand.patch
+++ b/patches/server/0001-Rebrand.patch
@@ -5,149 +5,147 @@ Subject: [PATCH] Rebrand
diff --git a/build.gradle.kts b/build.gradle.kts
-index f3287cea49ee7352a1065dc65927ab9922d0a9c4..4bd7e9d4344a3abade0d3d3dd1bc7d4005e620f6 100644
+index 04a1e3c9619b41f429bd598d55c9e0b5abaff920..c8f031712006d95c59027791be1bdcdc2bd836c4 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
-@@ -9,7 +9,7 @@ plugins {
+@@ -7,7 +7,7 @@ plugins {
+ }
+
dependencies {
- // Gale start - project setup
- // Depend on own API
-- implementation(project(":gale-api"))
-+ implementation(project(":leaf-api"))
- // Depend on Paper MojangAPI
- implementation("io.papermc.paper:paper-mojangapi:1.19.3-R0.1-SNAPSHOT") {
+- implementation(project(":pufferfish-api")) // Pufferfish // Paper
++ implementation(project(":leaf-api")) // Paper // Pufferfish // Leaf
+ // Pufferfish start
+ implementation("io.papermc.paper:paper-mojangapi:1.19.2-R0.1-SNAPSHOT") {
exclude("io.papermc.paper", "paper-api")
-@@ -78,7 +78,7 @@ tasks.jar {
+@@ -81,7 +81,7 @@ tasks.jar {
attributes(
"Main-Class" to "org.bukkit.craftbukkit.Main",
"Implementation-Title" to "CraftBukkit",
-- "Implementation-Version" to "git-Gale-$implementationVersion", // Gale - branding changes
-+ "Implementation-Version" to "git-Leaf-$implementationVersion", // Gale - branding changes // Leaf
+- "Implementation-Version" to "git-Pufferfish-$implementationVersion", // Pufferfish
++ "Implementation-Version" to "git-Leaf-$implementationVersion", // Pufferfish // Leaf
"Implementation-Vendor" to date, // Paper
"Specification-Title" to "Bukkit",
"Specification-Version" to project.version,
diff --git a/src/main/java/com/destroystokyo/paper/console/PaperConsole.java b/src/main/java/com/destroystokyo/paper/console/PaperConsole.java
-index e45e6b44b2a8f2cdae6e0048a812b92126aa17ca..b5f3f213da8a40d5184098af017c8e2669c3e58c 100644
+index c5d5648f4ca603ef2b1df723b58f9caf4dd3c722..bf670b956b20d670f84f1ef76badaae7f0c20e5b 100644
--- a/src/main/java/com/destroystokyo/paper/console/PaperConsole.java
+++ b/src/main/java/com/destroystokyo/paper/console/PaperConsole.java
@@ -17,7 +17,7 @@ public final class PaperConsole extends SimpleTerminalConsole {
@Override
protected LineReader buildReader(LineReaderBuilder builder) {
builder
-- .appName("Gale") // Gale - branding changes
-+ .appName("Leaf") // Gale - branding changes // Leaf
+- .appName("Paper")
++ .appName("Leaf") // Leaf
.variable(LineReader.HISTORY_FILE, java.nio.file.Paths.get(".console_history"))
.completer(new ConsoleCommandCompleter(this.server))
.option(LineReader.Option.COMPLETE_IN_WORD, true);
diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java
-index 60ed76588347f4d4c09d8df4952bf55501ed7c00..78c83a7976966dc5650d8f1e130636cb8c5e3e9f 100644
+index 68d16efaf9c2d997afabadcf1ee24c5de685b5b3..c69cb21f2ccf0f93a7ec17d4ee1ddb0ba5cfa5b2 100644
--- a/src/main/java/net/minecraft/server/MinecraftServer.java
+++ b/src/main/java/net/minecraft/server/MinecraftServer.java
-@@ -1044,7 +1044,7 @@ public abstract class MinecraftServer extends MinecraftServerBlockableEventLoop
- We do not want people to report thread issues to Paper,
- but we do want people to report thread issues to Gale.
- */
-- MinecraftServer.LOGGER.info("Stopping main thread (Ignore any thread death message you see! - DO NOT REPORT THREAD DEATH TO PAPER - If you think this is a Gale bug, please report it at https://github.com/GaleMC/Gale/issues )");
-+ MinecraftServer.LOGGER.info("Stopping main thread (Ignore any thread death message you see! - DO NOT REPORT THREAD DEATH TO PAPER - If you think this is a Leaf bug, please report it at https://github.com/Winds-Studio/Leaf/issues )"); // Leaf
- // Gale end - branding changes
- // Gale start - base thread pools
- while (serverThread.isAlive()) {
-@@ -1786,7 +1786,7 @@ public abstract class MinecraftServer extends MinecraftServerBlockableEventLoop
+@@ -924,7 +924,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop // Paper - Paper > // Spigot - Spigot > // CraftBukkit - cb > vanilla!
-+ return "Leaf"; // Leaf - Leaf > // Gale - branding changes - Gale > // Paper - Paper > // Spigot - Spigot > // CraftBukkit - cb > vanilla!
+- return "Pufferfish"; // Pufferfish - Pufferfish > // Paper - Paper > // Spigot - Spigot > // CraftBukkit - cb > vanilla!
++ return "Leaf"; // Leaf - Leaf > // Pufferfish - Pufferfish > // Paper - Paper > // Spigot - Spigot > // CraftBukkit - cb > vanilla!
}
public SystemReport fillSystemReport(SystemReport details) {
diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
-index 79f3a6174873834de61d7dc9fdbf6eb5a0fd6cd9..e69eca98f341688eca37ad18878c6080fda38563 100644
+index 277e8a03ab270eabb6b8c31d0076f3310c91eef2..07b40f503358987339937bb8db5a3ee54c1b08c8 100644
--- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java
+++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
-@@ -266,7 +266,7 @@ import javax.annotation.Nullable; // Paper
+@@ -261,7 +261,7 @@ import javax.annotation.Nullable; // Paper
import javax.annotation.Nonnull; // Paper
public final class CraftServer implements Server {
-- private final String serverName = "Gale"; // Paper // Gale - branding changes
-+ private final String serverName = "Leaf"; // Paper // Gale - branding changes // Leaf
+- private final String serverName = "Pufferfish"; // Paper // Pufferfish
++ private final String serverName = "Leaf"; // Paper // Pufferfish // Leaf
private final String serverVersion;
private final String bukkitVersion = Versioning.getBukkitVersion();
private final Logger logger = Logger.getLogger("Minecraft");
diff --git a/src/main/java/org/bukkit/craftbukkit/scheduler/CraftScheduler.java b/src/main/java/org/bukkit/craftbukkit/scheduler/CraftScheduler.java
-index 3997a7fec43e05b455644b4d58c68995fad541f4..1933207eb01305ff41822560c5987376b366133f 100644
+index cdefb2025eedea7e204d70d568adaf1c1ec4c03c..38920d680d9b0d81013dcf16ce3dd7271eeafe4c 100644
--- a/src/main/java/org/bukkit/craftbukkit/scheduler/CraftScheduler.java
+++ b/src/main/java/org/bukkit/craftbukkit/scheduler/CraftScheduler.java
@@ -504,7 +504,7 @@ public class CraftScheduler implements BukkitScheduler {
this.parsePending();
} else {
//this.debugTail = this.debugTail.setNext(new CraftAsyncDebugger(currentTick + CraftScheduler.RECENT_TICKS, task.getOwner(), task.getTaskClass())); // Paper
-- task.getOwner().getLogger().log(Level.SEVERE, "Unexpected Async Task in the Sync Scheduler. Report this to Gale"); // Paper // Gale - branding changes
-+ task.getOwner().getLogger().log(Level.SEVERE, "Unexpected Async Task in the Sync Scheduler. Report this to Leaf"); // Paper // Gale - branding changes // Leaf
+- task.getOwner().getLogger().log(Level.SEVERE, "Unexpected Async Task in the Sync Scheduler. Report this to Paper"); // Paper
++ task.getOwner().getLogger().log(Level.SEVERE, "Unexpected Async Task in the Sync Scheduler. Report this to Leaf"); // Paper // Leaf
// We don't need to parse pending
// (async tasks must live with race-conditions if they attempt to cancel between these few lines of code)
}
diff --git a/src/main/java/org/bukkit/craftbukkit/util/Versioning.java b/src/main/java/org/bukkit/craftbukkit/util/Versioning.java
-index 0b5979723bb30f9011ac64c36d894aa41713ec9b..17e3ee3a73a2347e9f0baa0ed1640a3b0e75ed16 100644
+index 80553face9c70c2a3d897681e7761df85b22d464..3e14c02c2ed3d687c866087bf7477918f45e3719 100644
--- a/src/main/java/org/bukkit/craftbukkit/util/Versioning.java
+++ b/src/main/java/org/bukkit/craftbukkit/util/Versioning.java
@@ -11,7 +11,7 @@ public final class Versioning {
public static String getBukkitVersion() {
String result = "Unknown-Version";
-- InputStream stream = Bukkit.class.getClassLoader().getResourceAsStream("META-INF/maven/org.galemc.gale/gale-api/pom.properties"); // Gale - branding changes
-+ InputStream stream = Bukkit.class.getClassLoader().getResourceAsStream("META-INF/maven/org.dreeam.leaf/leaf-api/pom.properties"); // Gale - branding changes // Leaf
+- InputStream stream = Bukkit.class.getClassLoader().getResourceAsStream("META-INF/maven/gg.pufferfish.pufferfish/pufferfish-api/pom.properties"); // Pufferfish
++ InputStream stream = Bukkit.class.getClassLoader().getResourceAsStream("META-INF/maven/org.dreeam.leaf/leaf-api/pom.properties"); // Pufferfish // Leaf
Properties properties = new Properties();
if (stream != null) {
diff --git a/src/main/java/org/spigotmc/WatchdogThread.java b/src/main/java/org/spigotmc/WatchdogThread.java
-index 8cd1b04dafc16dc96a6ad58fef7930b351c8f147..c25c1801bc0e29fdea5c6155925dda6567ed1ac3 100644
+index e9fa7faaa4451e36b3908cbcbbe0baf213abde96..6466e8bd54b38e4f432101c6d1a397db1066d341 100644
--- a/src/main/java/org/spigotmc/WatchdogThread.java
+++ b/src/main/java/org/spigotmc/WatchdogThread.java
-@@ -161,15 +161,15 @@ public final class WatchdogThread extends ServerThread // Paper - rewrite chunk
- We do not want people to report thread issues to Paper,
- but we do want people to report thread issues to Gale.
- */
-- log.log( Level.SEVERE, "The server has stopped responding! This is (probably) not a Paper bug. This could be a Gale bug." ); // Paper
-+ log.log( Level.SEVERE, "The server has stopped responding! This is (probably) not a Paper bug. This could be a Leaf bug." ); // Paper // Leaf
- // Gale end - branding changes
+@@ -155,14 +155,14 @@ public final class WatchdogThread extends io.papermc.paper.util.TickThread // Pa
+ if (isLongTimeout) {
+ // Paper end
+ log.log( Level.SEVERE, "------------------------------" );
+- log.log( Level.SEVERE, "The server has stopped responding! This is (probably) not a Paper bug." ); // Paper
++ log.log( Level.SEVERE, "The server has stopped responding! This is (probably) not a Leaf bug." ); // Paper // Leaf
log.log( Level.SEVERE, "If you see a plugin in the Server thread dump below, then please report it to that author" );
log.log( Level.SEVERE, "\t *Especially* if it looks like HTTP or MySQL operations are occurring" );
log.log( Level.SEVERE, "If you see a world save or edit, then it means you did far more than your server can handle at once" );
log.log( Level.SEVERE, "\t If this is the case, consider increasing timeout-time in spigot.yml but note that this will replace the crash with LARGE lag spikes" );
-- log.log( Level.SEVERE, "If you are unsure or think this is a Gale bug, please report this to https://github.com/GaleMC/Gale/issues - and if you think this is a Paper bug, please report this to https://github.com/PaperMC/Paper/issues" ); // Gale - branding changes
-+ log.log( Level.SEVERE, "If you are unsure or think this is a Leaf bug, please report this to https://github.com/Winds-Studio/Leaf/issues - and if you think this is a Paper bug, please report this to https://github.com/PaperMC/Paper/issues" ); // Gale - branding changes // Leaf
+- log.log( Level.SEVERE, "If you are unsure or still think this is a Paper bug, please report this to https://github.com/PaperMC/Paper/issues" );
++ log.log( Level.SEVERE, "If you are unsure or still think this is a Leaf bug, please report this to https://github.com/Winds-Studio/Leaf/issues" ); // Leaf
log.log( Level.SEVERE, "Be sure to include ALL relevant console errors and Minecraft crash reports" );
-- log.log( Level.SEVERE, "Gale version: " + Bukkit.getServer().getVersion() ); // Gale - branding changes
-+ log.log( Level.SEVERE, "Leaf version: " + Bukkit.getServer().getVersion() ); // Gale - branding changes // Leaf
+- log.log( Level.SEVERE, "Paper version: " + Bukkit.getServer().getVersion() );
++ log.log( Level.SEVERE, "Leaf version: " + Bukkit.getServer().getVersion() ); // Leaf
//
if ( net.minecraft.world.level.Level.lastPhysicsProblem != null )
{
-@@ -197,13 +197,13 @@ public final class WatchdogThread extends ServerThread // Paper - rewrite chunk
- We do not want people to report thread issues to Paper,
- but we do want people to report thread issues to Gale.
- */
-- log.log(Level.SEVERE, "--- DO NOT REPORT THIS TO PAPER - If you think this is a Gale bug, please report it at https://github.com/GaleMC/Gale/issues - THIS IS NOT A PAPER BUG OR CRASH - " + Bukkit.getServer().getVersion() + " ---");
-+ log.log(Level.SEVERE, "--- DO NOT REPORT THIS TO PAPER - If you think this is a Leaf bug, please report it at https://github.com/Winds-Studio/Leaf/issues - THIS IS NOT A PAPER BUG OR CRASH - " + Bukkit.getServer().getVersion() + " ---"); // Leaf
- // Gale end - branding changes
+@@ -185,12 +185,12 @@ public final class WatchdogThread extends io.papermc.paper.util.TickThread // Pa
+ // Paper end
+ } else
+ {
+- log.log(Level.SEVERE, "--- DO NOT REPORT THIS TO PAPER - THIS IS NOT A BUG OR A CRASH - " + Bukkit.getServer().getVersion() + " ---");
++ log.log(Level.SEVERE, "--- DO NOT REPORT THIS TO LEAF - THIS IS NOT A BUG OR A CRASH - " + Bukkit.getServer().getVersion() + " ---"); // Leaf
log.log(Level.SEVERE, "The server has not responded for " + (currentTime - lastTick) / 1000 + " seconds! Creating thread dump");
}
// Paper end - Different message for short timeout
log.log( Level.SEVERE, "------------------------------" );
-- log.log( Level.SEVERE, "Server thread dump (Look for plugins here before reporting to Gale!):" ); // Paper // Gale - branding changes
-+ log.log( Level.SEVERE, "Server thread dump (Look for plugins here before reporting to Leaf!):" ); // Paper // Gale - branding changes // Leaf
+- log.log( Level.SEVERE, "Server thread dump (Look for plugins here before reporting to Paper!):" ); // Paper
++ log.log( Level.SEVERE, "Server thread dump (Look for plugins here before reporting to Leaf!):" ); // Paper // Leaf
io.papermc.paper.chunk.system.scheduling.ChunkTaskScheduler.dumpAllChunkLoadInfo(isLongTimeout); // Paper // Paper - rewrite chunk system
this.dumpTickingInfo(); // Paper - log detailed tick information
- WatchdogThread.dumpThread( ManagementFactory.getThreadMXBean().getThreadInfo( MinecraftServer.serverThread.getId(), Integer.MAX_VALUE ), log ); // Gale - base thread pools
-@@ -224,7 +224,7 @@ public final class WatchdogThread extends ServerThread // Paper - rewrite chunk
- We do not want people to report thread issues to Paper,
- but we do want people to report thread issues to Gale.
- */
-- log.log(Level.SEVERE, "--- DO NOT REPORT THIS TO PAPER - If you think this is a Gale bug, please report it at https://github.com/GaleMC/Gale/issues - THIS IS NOT A PAPER BUG OR CRASH ---");
-+ log.log(Level.SEVERE, "--- DO NOT REPORT THIS TO PAPER - If you think this is a Leaf bug, please report it at https://github.com/Winds-Studio/Leaf/issues - THIS IS NOT A PAPER BUG OR CRASH ---"); // Leaf
- // Gale end - branding changes
+ WatchdogThread.dumpThread( ManagementFactory.getThreadMXBean().getThreadInfo( MinecraftServer.getServer().serverThread.getId(), Integer.MAX_VALUE ), log );
+@@ -206,7 +206,7 @@ public final class WatchdogThread extends io.papermc.paper.util.TickThread // Pa
+ WatchdogThread.dumpThread( thread, log );
+ }
+ } else {
+- log.log(Level.SEVERE, "--- DO NOT REPORT THIS TO PAPER - THIS IS NOT A BUG OR A CRASH ---");
++ log.log(Level.SEVERE, "--- DO NOT REPORT THIS TO LEAF - THIS IS NOT A BUG OR A CRASH ---"); // Leaf
}
+ log.log( Level.SEVERE, "------------------------------" );
diff --git a/src/main/resources/logo.png b/src/main/resources/logo.png
index a7d785f60c884ee4ee487cc364402d66c3dc2ecc..9597d58066bdbca302d790e6c195204b7d878011 100644
GIT binary patch
diff --git a/patches/server/0002-Leaf-Config.patch b/patches/server/0002-Leaf-Config.patch
index 9d6228a5..9b7686a7 100644
--- a/patches/server/0002-Leaf-Config.patch
+++ b/patches/server/0002-Leaf-Config.patch
@@ -4,54 +4,51 @@ Date: Wed, 12 Oct 2022 10:42:15 -0400
Subject: [PATCH] Leaf Config
-diff --git a/build.gradle.kts b/build.gradle.kts
-index 4bd7e9d4344a3abade0d3d3dd1bc7d4005e620f6..7a16fb14f43ff4cc8b1b733f924393e60b6978cd 100644
---- a/build.gradle.kts
-+++ b/build.gradle.kts
-@@ -52,6 +52,10 @@ dependencies {
- testImplementation("org.hamcrest:hamcrest-library:1.3")
-
- implementation("io.netty:netty-all:4.1.77.Final"); // Paper - Bump netty
-+ implementation("org.yaml:snakeyaml:1.33") // Leaf - Config
-+ implementation("me.carleslc.Simple-YAML:Simple-Yaml:1.8.3") {
-+ exclude(group = "org.yaml", module = "snakeyaml")
-+ }
- }
-
- val craftbukkitPackageVersion = "1_19_R2" // Paper
diff --git a/src/main/java/co/aikar/timings/TimingsExport.java b/src/main/java/co/aikar/timings/TimingsExport.java
-index 781fc0a92f73be73b9313e7bc4eeb2f2ed6ff8ea..b40c03e42e02bca29fe8b107d9382db6e49c1d1e 100644
+index 2cc44fbf8e5bd436b6d4e19f6c06b351e750cb31..00f30e047beefe914543718009947ecc60c21790 100644
--- a/src/main/java/co/aikar/timings/TimingsExport.java
+++ b/src/main/java/co/aikar/timings/TimingsExport.java
-@@ -307,8 +307,9 @@ public class TimingsExport extends Thread {
+@@ -242,7 +242,8 @@ public class TimingsExport extends Thread {
+ pair("spigot", mapAsJSON(Bukkit.spigot().getSpigotConfig(), null)),
pair("bukkit", mapAsJSON(Bukkit.spigot().getBukkitConfig(), null)),
- // Gale start - Gale configuration - include in timings
- pair("paper", mapAsJSON(Bukkit.spigot().getPaperConfig(), null)),
-- pair("gale", mapAsJSON(Bukkit.spigot().getGaleConfig(), null))
-+ pair("gale", mapAsJSON(Bukkit.spigot().getGaleConfig(), null)),
- // Gale end - Gale configuration - include in timings
+ pair("paper", mapAsJSON(Bukkit.spigot().getPaperConfig(), null)), // Pufferfish
+- pair("pufferfish", mapAsJSON(gg.pufferfish.pufferfish.PufferfishConfig.getConfigCopy(), null)) // Pufferfish
++ pair("pufferfish", mapAsJSON(gg.pufferfish.pufferfish.PufferfishConfig.getConfigCopy(), null)), // Pufferfish
+ pair("leaf", mapAsJSON(org.dreeam.leaf.LeafConfig.getConfigCopy(), null)) // Leaf
));
new TimingsExport(listeners, parent, history).start();
+diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java
+index c69cb21f2ccf0f93a7ec17d4ee1ddb0ba5cfa5b2..3bed5eb755e97149a9651ca007564275e0eaf2d1 100644
+--- a/src/main/java/net/minecraft/server/MinecraftServer.java
++++ b/src/main/java/net/minecraft/server/MinecraftServer.java
+@@ -1656,7 +1656,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop // Pufferfish - Pufferfish > // Paper - Paper > // Spigot - Spigot > // CraftBukkit - cb > vanilla!
++ return org.dreeam.leaf.LeafConfig.serverModName; // Leaf - Leaf > // Pufferfish - Pufferfish > // Paper - Paper > // Spigot - Spigot > // CraftBukkit - cb > vanilla!
+ }
+
+ public SystemReport fillSystemReport(SystemReport details) {
diff --git a/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java b/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java
-index 396258cb21a8e5488f0f456b65dc629ff895601e..290f0e317b75358a14c7c58e9d6e8e7340fd0721 100644
+index 673fb3955291407be37dc78be4eec9bf2018128b..a7023765e3c82e70574069af00227e3cf6f98e65 100644
--- a/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java
+++ b/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java
-@@ -248,6 +248,7 @@ public class DedicatedServer extends MinecraftServer implements ServerInterface
- LOGGER.warn("If you would like to disable this message, set simd.warn-if-disabled to false in gale-global.yml");
- }
- // Gale start - Pufferfish - SIMD support
+@@ -223,6 +223,7 @@ public class DedicatedServer extends MinecraftServer implements ServerInterface
+ // Paper end
+ gg.pufferfish.pufferfish.PufferfishConfig.load(); // Pufferfish
+ gg.pufferfish.pufferfish.PufferfishCommand.init(); // Pufferfish
+ org.dreeam.leaf.LeafConfig.load(); // Leaf
this.setPvpAllowed(dedicatedserverproperties.pvp);
this.setFlightAllowed(dedicatedserverproperties.allowFlight);
diff --git a/src/main/java/org/dreeam/leaf/LeafConfig.java b/src/main/java/org/dreeam/leaf/LeafConfig.java
new file mode 100644
-index 0000000000000000000000000000000000000000..2e6cc6ed30fc2ba0913913bd19bf1b83c40fcce5
+index 0000000000000000000000000000000000000000..770553ef8976d76067396276792ea23a7ab7d51d
--- /dev/null
+++ b/src/main/java/org/dreeam/leaf/LeafConfig.java
-@@ -0,0 +1,134 @@
+@@ -0,0 +1,139 @@
+package org.dreeam.leaf;
+
+import net.minecraft.server.MinecraftServer;
@@ -185,4 +182,9 @@ index 0000000000000000000000000000000000000000..2e6cc6ed30fc2ba0913913bd19bf1b83
+ ensureDefault(key, defaultValue, comment);
+ return config.getStringList(key);
+ }
++
++ public static String serverModName = "Leaf";
++ private static void serverModName() {
++ serverModName = getString("settings.server-mod-name", serverModName);
++ }
+}
diff --git a/patches/server/0003-Bump-Dependencies.patch b/patches/server/0003-Bump-Dependencies.patch
index cf3ea600..02ba6156 100644
--- a/patches/server/0003-Bump-Dependencies.patch
+++ b/patches/server/0003-Bump-Dependencies.patch
@@ -5,10 +5,10 @@ Subject: [PATCH] Bump Dependencies
diff --git a/build.gradle.kts b/build.gradle.kts
-index 7a16fb14f43ff4cc8b1b733f924393e60b6978cd..f00b459d52af011c8fcb86521e6a5e8486d92955 100644
+index c8f031712006d95c59027791be1bdcdc2bd836c4..99c0750dcc87f5f3b19c5e9e4e9067d49443732e 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
-@@ -24,13 +24,13 @@ dependencies {
+@@ -22,13 +22,13 @@ dependencies {
all its classes to check if they are plugins.
Scanning takes about 1-2 seconds so adding this speeds up the server start.
*/
@@ -27,7 +27,7 @@ index 7a16fb14f43ff4cc8b1b733f924393e60b6978cd..f00b459d52af011c8fcb86521e6a5e84
implementation("org.spongepowered:configurate-yaml:4.1.2") // Paper - config files
implementation("commons-lang:commons-lang:2.6")
implementation("net.fabricmc:mapping-io:0.3.0") // Paper - needed to read mappings for stacktrace deobfuscation
-@@ -39,19 +39,19 @@ dependencies {
+@@ -37,27 +37,27 @@ dependencies {
isTransitive = false
}
// Paper end
@@ -43,6 +43,16 @@ index 7a16fb14f43ff4cc8b1b733f924393e60b6978cd..f00b459d52af011c8fcb86521e6a5e84
+ runtimeOnly("org.apache.maven.resolver:maven-resolver-connector-basic:1.9.2")
+ runtimeOnly("org.apache.maven.resolver:maven-resolver-transport-http:1.9.2")
+ // Pufferfish start
+- implementation("org.yaml:snakeyaml:1.32")
+- implementation ("me.carleslc.Simple-YAML:Simple-Yaml:1.8.2") {
++ implementation("org.yaml:snakeyaml:1.33")
++ implementation ("me.carleslc.Simple-YAML:Simple-Yaml:1.8.3") {
+ exclude(group="org.yaml", module="snakeyaml")
+ }
+ // Pufferfish end
+ implementation("com.github.technove:Flare:34637f3f87") // Pufferfish - flare
+
- testImplementation("io.github.classgraph:classgraph:4.8.47") // Paper - mob goal test
+ testImplementation("io.github.classgraph:classgraph:4.8.152") // Paper - mob goal test
testImplementation("junit:junit:4.13.2")
@@ -51,10 +61,10 @@ index 7a16fb14f43ff4cc8b1b733f924393e60b6978cd..f00b459d52af011c8fcb86521e6a5e84
- implementation("io.netty:netty-all:4.1.77.Final"); // Paper - Bump netty
+ implementation("io.netty:netty-all:4.1.85.Final"); // Paper - Bump netty
- implementation("org.yaml:snakeyaml:1.33") // Leaf - Config
- implementation("me.carleslc.Simple-YAML:Simple-Yaml:1.8.3") {
- exclude(group = "org.yaml", module = "snakeyaml")
-@@ -207,3 +207,6 @@ tasks.registerRunTask("runDev") {
+ }
+
+ val craftbukkitPackageVersion = "1_19_R2" // Paper
+@@ -206,3 +206,6 @@ tasks.registerRunTask("runDev") {
description = "Spin up a non-relocated Mojang-mapped test server"
classpath(sourceSets.main.map { it.runtimeClasspath })
}
diff --git a/patches/server/0004-Remove-Mojang-username-check.patch b/patches/server/0004-Remove-Mojang-username-check.patch
index cb9ea949..5cddb3de 100644
--- a/patches/server/0004-Remove-Mojang-username-check.patch
+++ b/patches/server/0004-Remove-Mojang-username-check.patch
@@ -5,39 +5,45 @@ Subject: [PATCH] Remove Mojang username check
diff --git a/src/main/java/net/minecraft/server/network/ServerLoginPacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerLoginPacketListenerImpl.java
-index af96c170c58553f4ce0554c9bd24fea2ad96ed01..cefd1bcf16368c93462e7734d7195c3dffe5f59a 100644
+index f3b340fc6be9878d677a76673450aac3e0b73d4b..3011018c8fa221f515cf670dea9791f8c4ea1f69 100644
--- a/src/main/java/net/minecraft/server/network/ServerLoginPacketListenerImpl.java
+++ b/src/main/java/net/minecraft/server/network/ServerLoginPacketListenerImpl.java
-@@ -38,6 +38,7 @@ import net.minecraft.util.CryptException;
+@@ -36,6 +36,7 @@ import net.minecraft.util.Crypt;
+ import net.minecraft.util.CryptException;
import net.minecraft.util.RandomSource;
import org.apache.commons.lang3.Validate;
- import org.galemc.gale.configuration.GaleGlobalConfiguration;
+import org.dreeam.leaf.LeafConfig;
import org.slf4j.Logger;
// CraftBukkit start
-@@ -243,7 +244,7 @@ public class ServerLoginPacketListenerImpl implements ServerLoginPacketListener,
+@@ -237,7 +238,7 @@ public class ServerLoginPacketListenerImpl implements ServerLoginPacketListener,
+ @Override
public void handleHello(ServerboundHelloPacket packet) {
- // Gale start - JettPack - reduce array allocations
- Validate.validState(this.state == ServerLoginPacketListenerImpl.State.HELLO, "Unexpected hello packet", ArrayConstants.emptyObjectArray);
-- Validate.validState(ServerLoginPacketListenerImpl.isValidUsername(packet.name()), "Invalid characters in username", ArrayConstants.emptyObjectArray);
-+ if (!LeafConfig.removeMojangUsernameCheck) Validate.validState(ServerLoginPacketListenerImpl.isValidUsername(packet.name()), "Invalid characters in username", ArrayConstants.emptyObjectArray); // Leaf - Remove Mojang's username check
- // Gale end - JettPack - reduce array allocations
+ Validate.validState(this.state == ServerLoginPacketListenerImpl.State.HELLO, "Unexpected hello packet", new Object[0]);
+- Validate.validState(ServerLoginPacketListenerImpl.isValidUsername(packet.name()), "Invalid characters in username", new Object[0]);
++ if (!LeafConfig.removeMojangUsernameCheck) Validate.validState(ServerLoginPacketListenerImpl.isValidUsername(packet.name()), "Invalid characters in username", new Object[0]); // Leaf - Remove Mojang's username check
// Paper start - validate usernames
if (io.papermc.paper.configuration.GlobalConfiguration.get().proxies.isProxyOnlineMode() && io.papermc.paper.configuration.GlobalConfiguration.get().unsupportedSettings.performUsernameValidation) {
+ if (!this.iKnowThisMayNotBeTheBestIdeaButPleaseDisableUsernameValidation && !validateUsername(packet.name())) {
diff --git a/src/main/java/org/dreeam/leaf/LeafConfig.java b/src/main/java/org/dreeam/leaf/LeafConfig.java
-index 2e6cc6ed30fc2ba0913913bd19bf1b83c40fcce5..ecd5edfde838df1d8f9a58b153c9751bacd2b761 100644
+index 770553ef8976d76067396276792ea23a7ab7d51d..7870c85030144831936d692dde4fff7bedd692da 100644
--- a/src/main/java/org/dreeam/leaf/LeafConfig.java
+++ b/src/main/java/org/dreeam/leaf/LeafConfig.java
-@@ -131,4 +131,11 @@ public class LeafConfig {
- ensureDefault(key, defaultValue, comment);
+@@ -132,8 +132,17 @@ public class LeafConfig {
return config.getStringList(key);
}
+
++
+ public static String serverModName = "Leaf";
+ private static void serverModName() {
+ serverModName = getString("settings.server-mod-name", serverModName);
+ }
+
+ public static boolean removeMojangUsernameCheck;
+ private static void removeconfig() {
+ removeMojangUsernameCheck = getBoolean("remove-Mojang-username-check", true,
+ "Remove username check of Mojang",
+ "enabling all characters as username");
++
+ }
}
diff --git a/patches/server/0005-Remove-Spigot-Check-for-Broken-BungeeCord-Configurat.patch b/patches/server/0005-Remove-Spigot-Check-for-Broken-BungeeCord-Configurat.patch
index 09ae15c5..11584715 100644
--- a/patches/server/0005-Remove-Spigot-Check-for-Broken-BungeeCord-Configurat.patch
+++ b/patches/server/0005-Remove-Spigot-Check-for-Broken-BungeeCord-Configurat.patch
@@ -5,10 +5,10 @@ Subject: [PATCH] Remove Spigot Check for Broken BungeeCord Configurations
diff --git a/src/main/java/net/minecraft/server/network/ServerHandshakePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerHandshakePacketListenerImpl.java
-index 8e68d1373a519cc12bf83de6aadcb24cbbd34af6..a5776ef739b1bf8c8efed0a97d0939e271c8ba72 100644
+index e7ff7ad3bf4dd17fdd34202ec3aef8e9512bc36d..a00c7ba6d2161ce91ade78e3d53c8d57f86e9c99 100644
--- a/src/main/java/net/minecraft/server/network/ServerHandshakePacketListenerImpl.java
+++ b/src/main/java/net/minecraft/server/network/ServerHandshakePacketListenerImpl.java
-@@ -10,6 +10,7 @@ import net.minecraft.network.protocol.handshake.ClientIntentionPacket;
+@@ -9,6 +9,7 @@ import net.minecraft.network.protocol.handshake.ClientIntentionPacket;
import net.minecraft.network.protocol.handshake.ServerHandshakePacketListener;
import net.minecraft.network.protocol.login.ClientboundLoginDisconnectPacket;
import net.minecraft.server.MinecraftServer;
@@ -16,7 +16,7 @@ index 8e68d1373a519cc12bf83de6aadcb24cbbd34af6..a5776ef739b1bf8c8efed0a97d0939e2
// CraftBukkit start
import java.net.InetAddress;
-@@ -135,7 +136,9 @@ public class ServerHandshakePacketListenerImpl implements ServerHandshakePacketL
+@@ -139,7 +140,9 @@ public class ServerHandshakePacketListenerImpl implements ServerHandshakePacketL
{
connection.spoofedProfile = ServerHandshakePacketListenerImpl.gson.fromJson(split[3], com.mojang.authlib.properties.Property[].class);
}
@@ -28,10 +28,17 @@ index 8e68d1373a519cc12bf83de6aadcb24cbbd34af6..a5776ef739b1bf8c8efed0a97d0939e2
this.connection.send(new ClientboundLoginDisconnectPacket(chatmessage));
this.connection.disconnect(chatmessage);
diff --git a/src/main/java/org/dreeam/leaf/LeafConfig.java b/src/main/java/org/dreeam/leaf/LeafConfig.java
-index ecd5edfde838df1d8f9a58b153c9751bacd2b761..14bde244f306e0477cc002cf21868bd3f6783672 100644
+index 7870c85030144831936d692dde4fff7bedd692da..c107a0cab333b2b57931862073a4eb6832f755ab 100644
--- a/src/main/java/org/dreeam/leaf/LeafConfig.java
+++ b/src/main/java/org/dreeam/leaf/LeafConfig.java
-@@ -133,9 +133,13 @@ public class LeafConfig {
+@@ -132,17 +132,19 @@ public class LeafConfig {
+ return config.getStringList(key);
+ }
+
+-
+ public static String serverModName = "Leaf";
+ private static void serverModName() {
+ serverModName = getString("settings.server-mod-name", serverModName);
}
public static boolean removeMojangUsernameCheck;
@@ -40,6 +47,7 @@ index ecd5edfde838df1d8f9a58b153c9751bacd2b761..14bde244f306e0477cc002cf21868bd3
removeMojangUsernameCheck = getBoolean("remove-Mojang-username-check", true,
"Remove username check of Mojang",
"enabling all characters as username");
+-
+ removeSpigotCheckBungeeConfig = getBoolean("remove-Spigot-check-bungee-config", true,
+ "Enable player enter backend server through proxy",
+ "without backend server enabling its bungee mode");
diff --git a/patches/server/0007-Remove-UseItemOnPacket-Too-Far-Check.patch b/patches/server/0007-Remove-UseItemOnPacket-Too-Far-Check.patch
index 2dd91cf5..0dd48412 100644
--- a/patches/server/0007-Remove-UseItemOnPacket-Too-Far-Check.patch
+++ b/patches/server/0007-Remove-UseItemOnPacket-Too-Far-Check.patch
@@ -7,18 +7,18 @@ This Check is added in 1.17.x -> 1.18.x update by Mojang.
By removing this check, it enable hackers to use some modules of hack clients.
diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
-index deadeb7a98e5b64d7b9fae3a9e7858a4cd1d39e2..7643f8a3aa22c8d58ce74a18efe3d98f5017d04c 100644
+index 34540b4ebad2ec430fa12e1e5d9d6e4a79df91de..84cb548e89350d9127b18f69e47d1f7433bcb1ee 100644
--- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
+++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
-@@ -189,6 +189,7 @@ import org.apache.commons.lang3.StringUtils;
- import org.galemc.gale.configuration.GaleGlobalConfiguration;
- import org.galemc.gale.executor.queue.BaseTaskQueues;
- import org.galemc.gale.executor.queue.ScheduledServerThreadTaskQueues;
+@@ -182,6 +182,7 @@ import net.minecraft.world.phys.Vec3;
+ import net.minecraft.world.phys.shapes.BooleanOp;
+ import net.minecraft.world.phys.shapes.Shapes;
+ import net.minecraft.world.phys.shapes.VoxelShape;
+import org.dreeam.leaf.LeafConfig;
import org.slf4j.Logger;
// CraftBukkit start
-@@ -1980,7 +1981,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic
+@@ -1948,7 +1949,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic
Vec3 vec3d2 = vec3d.subtract(vec3d1);
double d0 = 1.0000001D;
@@ -28,10 +28,10 @@ index deadeb7a98e5b64d7b9fae3a9e7858a4cd1d39e2..7643f8a3aa22c8d58ce74a18efe3d98f
this.player.resetLastActionTime();
diff --git a/src/main/java/org/dreeam/leaf/LeafConfig.java b/src/main/java/org/dreeam/leaf/LeafConfig.java
-index 14bde244f306e0477cc002cf21868bd3f6783672..5922be781760baedfb3a770c9e1ca40a73dfbc55 100644
+index c107a0cab333b2b57931862073a4eb6832f755ab..a221affdf87d28991248a4b83224194e222423e6 100644
--- a/src/main/java/org/dreeam/leaf/LeafConfig.java
+++ b/src/main/java/org/dreeam/leaf/LeafConfig.java
-@@ -134,6 +134,8 @@ public class LeafConfig {
+@@ -139,6 +139,8 @@ public class LeafConfig {
public static boolean removeMojangUsernameCheck;
public static boolean removeSpigotCheckBungeeConfig;
@@ -40,7 +40,7 @@ index 14bde244f306e0477cc002cf21868bd3f6783672..5922be781760baedfb3a770c9e1ca40a
private static void removeconfig() {
removeMojangUsernameCheck = getBoolean("remove-Mojang-username-check", true,
"Remove username check of Mojang",
-@@ -141,5 +143,7 @@ public class LeafConfig {
+@@ -146,5 +148,7 @@ public class LeafConfig {
removeSpigotCheckBungeeConfig = getBoolean("remove-Spigot-check-bungee-config", true,
"Enable player enter backend server through proxy",
"without backend server enabling its bungee mode");
diff --git a/patches/server/0008-Purpur-Implement-TPSBar.patch b/patches/server/0008-Purpur-Implement-TPSBar.patch
index 048df0cf..1250d63d 100644
--- a/patches/server/0008-Purpur-Implement-TPSBar.patch
+++ b/patches/server/0008-Purpur-Implement-TPSBar.patch
@@ -54,10 +54,10 @@ index ae5dd08de75a7ed231295f306fd0974da3988249..b8d49f7607c646216d42f4e047997d47
if (this.source.acceptsSuccess() && !this.silent) {
this.source.sendSystemMessage(message);
diff --git a/src/main/java/net/minecraft/commands/Commands.java b/src/main/java/net/minecraft/commands/Commands.java
-index c7083450b3466d80611b5efdac78b31ac2e70cf5..0e8700ccc884957f08fa382723a3784d94da0f0e 100644
+index 330f6c79417378da855326b4da665f9d240e748d..564830a1d511716ab977923ba43fa38c475f484f 100644
--- a/src/main/java/net/minecraft/commands/Commands.java
+++ b/src/main/java/net/minecraft/commands/Commands.java
-@@ -214,6 +214,7 @@ public class Commands {
+@@ -215,6 +215,7 @@ public class Commands {
SetPlayerIdleTimeoutCommand.register(this.dispatcher);
StopCommand.register(this.dispatcher);
WhitelistCommand.register(this.dispatcher);
@@ -66,10 +66,10 @@ index c7083450b3466d80611b5efdac78b31ac2e70cf5..0e8700ccc884957f08fa382723a3784d
if (environment.includeIntegrated) {
diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java
-index 78c83a7976966dc5650d8f1e130636cb8c5e3e9f..d5e8de2fd68dbc43385ad71849294f20344385f5 100644
+index 3bed5eb755e97149a9651ca007564275e0eaf2d1..ab0a4a36241bee59b142df65736003c69dcb3dd4 100644
--- a/src/main/java/net/minecraft/server/MinecraftServer.java
+++ b/src/main/java/net/minecraft/server/MinecraftServer.java
-@@ -1141,6 +1141,7 @@ public abstract class MinecraftServer extends MinecraftServerBlockableEventLoop
+@@ -1022,6 +1022,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop cachedSingleHashSet; // Paper
public PlayerNaturallySpawnCreaturesEvent playerNaturallySpawnedEvent; // Paper
public org.bukkit.event.player.PlayerQuitEvent.QuitReason quitReason = null; // Paper - there are a lot of changes to do if we change all methods leading to the event
@@ -109,7 +109,7 @@ index e6c2eff84ac596825a11574cf89956e70a344562..66082298aea31d17c8e9a85e3cca1951
public ServerPlayer(MinecraftServer server, ServerLevel world, GameProfile profile) {
super(world, world.getSharedSpawnPos(), world.getSharedSpawnAngle(), profile);
-@@ -507,6 +508,7 @@ public class ServerPlayer extends Player {
+@@ -506,6 +507,7 @@ public class ServerPlayer extends Player {
}
}
@@ -117,7 +117,7 @@ index e6c2eff84ac596825a11574cf89956e70a344562..66082298aea31d17c8e9a85e3cca1951
}
@Override
-@@ -573,6 +575,7 @@ public class ServerPlayer extends Player {
+@@ -572,6 +574,7 @@ public class ServerPlayer extends Player {
}
this.getBukkitEntity().setExtraData(nbt); // CraftBukkit
@@ -125,7 +125,7 @@ index e6c2eff84ac596825a11574cf89956e70a344562..66082298aea31d17c8e9a85e3cca1951
}
// CraftBukkit start - World fallback code, either respawn location or global spawn
-@@ -2551,4 +2554,14 @@ public class ServerPlayer extends Player {
+@@ -2548,4 +2551,14 @@ public class ServerPlayer extends Player {
return (CraftPlayer) super.getBukkitEntity();
}
// CraftBukkit end
@@ -141,26 +141,26 @@ index e6c2eff84ac596825a11574cf89956e70a344562..66082298aea31d17c8e9a85e3cca1951
+ // Purpur end
}
diff --git a/src/main/java/net/minecraft/server/players/PlayerList.java b/src/main/java/net/minecraft/server/players/PlayerList.java
-index fe87ef6e0540bf81518fa01ca2c3516c95c2fb53..3bff74a3eef63debf61f76cc859e157f8ca59d7a 100644
+index c0b599b1835d28ddda3690b29f29bd8c6f03e215..8717915fdcfcf7220847a1391863a7a81f7d4738 100644
--- a/src/main/java/net/minecraft/server/players/PlayerList.java
+++ b/src/main/java/net/minecraft/server/players/PlayerList.java
-@@ -105,6 +105,7 @@ import net.minecraft.world.scores.Scoreboard; // Paper
+@@ -100,6 +100,7 @@ import net.minecraft.world.scores.Objective;
+ import net.minecraft.world.scores.PlayerTeam;
+ import net.minecraft.world.scores.Scoreboard; // Paper
import net.minecraft.world.scores.Team;
- import org.galemc.gale.configuration.GaleGlobalConfiguration;
- import org.galemc.gale.executor.queue.ScheduledServerThreadTaskQueues;
+import org.dreeam.leaf.tasks.BossBarTask;
import org.slf4j.Logger;
// CraftBukkit start
-@@ -515,6 +516,7 @@ public abstract class PlayerList {
+@@ -449,6 +450,7 @@ public abstract class PlayerList {
scoreboard.addPlayerToTeam(player.getScoreboardName(), collideRuleTeam);
}
// Paper end
+ BossBarTask.addToAll(player); // Purpur
// CraftBukkit - Moved from above, added world
- if (GaleGlobalConfiguration.get().logToConsole.playerLoginLocations) { // Gale - JettPack - make logging login location configurable
PlayerList.LOGGER.info("{}[{}] logged in with entity id {} at ([{}]{}, {}, {})", player.getName().getString(), s1, player.getId(), worldserver1.serverLevelData.getLevelName(), player.getX(), player.getY(), player.getZ());
-@@ -630,6 +632,8 @@ public abstract class PlayerList {
+ }
+@@ -558,6 +560,8 @@ public abstract class PlayerList {
}
public net.kyori.adventure.text.Component remove(ServerPlayer entityplayer, net.kyori.adventure.text.Component leaveMessage) {
// Paper end
@@ -182,7 +182,7 @@ index 6035af2cf08353b3d3801220d8116d8611a0cd37..7774ab6a2e553a40def4bb4dceea9e5f
final String commandName;
if (vanillaCommand.getRedirect() == null) {
diff --git a/src/main/java/org/dreeam/leaf/LeafConfig.java b/src/main/java/org/dreeam/leaf/LeafConfig.java
-index 5922be781760baedfb3a770c9e1ca40a73dfbc55..9cf4bbde93ad01da842f6b3b5f46f25f442f7d54 100644
+index a221affdf87d28991248a4b83224194e222423e6..a0bd1ec3f09959c7f72b484658c1c94a16818281 100644
--- a/src/main/java/org/dreeam/leaf/LeafConfig.java
+++ b/src/main/java/org/dreeam/leaf/LeafConfig.java
@@ -1,8 +1,10 @@
@@ -196,7 +196,7 @@ index 5922be781760baedfb3a770c9e1ca40a73dfbc55..9cf4bbde93ad01da842f6b3b5f46f25f
import org.jetbrains.annotations.Nullable;
import org.simpleyaml.configuration.comments.CommentType;
import org.simpleyaml.configuration.file.YamlFile;
-@@ -144,6 +146,36 @@ public class LeafConfig {
+@@ -149,6 +151,36 @@ public class LeafConfig {
"Enable player enter backend server through proxy",
"without backend server enabling its bungee mode");
removeUseItemOnPacketTooFar = getBoolean("remove-UseItemOnPacket-too-far-check", false,
diff --git a/patches/server/0009-Purpur-Add-compass-command.patch b/patches/server/0009-Purpur-Add-compass-command.patch
index 1c5b29ea..f158d811 100644
--- a/patches/server/0009-Purpur-Add-compass-command.patch
+++ b/patches/server/0009-Purpur-Add-compass-command.patch
@@ -7,10 +7,10 @@ Original license: MIT
Original project: https://github.com/PurpurMC/Purpur
diff --git a/src/main/java/net/minecraft/commands/Commands.java b/src/main/java/net/minecraft/commands/Commands.java
-index 0e8700ccc884957f08fa382723a3784d94da0f0e..66242833210ae89cbca7448cd4e7cf1fa774bcf0 100644
+index 564830a1d511716ab977923ba43fa38c475f484f..2c5afab3cc0c66a2e63c1f647a033ca1a58f9e39 100644
--- a/src/main/java/net/minecraft/commands/Commands.java
+++ b/src/main/java/net/minecraft/commands/Commands.java
-@@ -215,6 +215,7 @@ public class Commands {
+@@ -216,6 +216,7 @@ public class Commands {
StopCommand.register(this.dispatcher);
WhitelistCommand.register(this.dispatcher);
org.dreeam.leaf.commands.TPSBarCommand.register(this.dispatcher); // Purpur
@@ -19,10 +19,10 @@ index 0e8700ccc884957f08fa382723a3784d94da0f0e..66242833210ae89cbca7448cd4e7cf1f
if (environment.includeIntegrated) {
diff --git a/src/main/java/net/minecraft/server/level/ServerPlayer.java b/src/main/java/net/minecraft/server/level/ServerPlayer.java
-index 66082298aea31d17c8e9a85e3cca1951b2d53f87..d1fd3eb9e51ace68d3ffc24579cdf95ebdaea039 100644
+index d4ae8fc06ac5931273e6ced45158d8a3144a0bdf..336691038e2b1a68e1cd40d7015d42acceb2b069 100644
--- a/src/main/java/net/minecraft/server/level/ServerPlayer.java
+++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java
-@@ -270,6 +270,7 @@ public class ServerPlayer extends Player {
+@@ -269,6 +269,7 @@ public class ServerPlayer extends Player {
public PlayerNaturallySpawnCreaturesEvent playerNaturallySpawnedEvent; // Paper
public org.bukkit.event.player.PlayerQuitEvent.QuitReason quitReason = null; // Paper - there are a lot of changes to do if we change all methods leading to the event
private boolean tpsBar = false; // Purpur
@@ -30,7 +30,7 @@ index 66082298aea31d17c8e9a85e3cca1951b2d53f87..d1fd3eb9e51ace68d3ffc24579cdf95e
public ServerPlayer(MinecraftServer server, ServerLevel world, GameProfile profile) {
super(world, world.getSharedSpawnPos(), world.getSharedSpawnAngle(), profile);
-@@ -509,6 +510,7 @@ public class ServerPlayer extends Player {
+@@ -508,6 +509,7 @@ public class ServerPlayer extends Player {
}
if (nbt.contains("Purpur.TPSBar")) { this.tpsBar = nbt.getBoolean("Purpur.TPSBar"); } // Purpur
@@ -38,7 +38,7 @@ index 66082298aea31d17c8e9a85e3cca1951b2d53f87..d1fd3eb9e51ace68d3ffc24579cdf95e
}
@Override
-@@ -576,6 +578,7 @@ public class ServerPlayer extends Player {
+@@ -575,6 +577,7 @@ public class ServerPlayer extends Player {
this.getBukkitEntity().setExtraData(nbt); // CraftBukkit
nbt.putBoolean("Purpur.TPSBar", this.tpsBar); // Purpur
@@ -46,7 +46,7 @@ index 66082298aea31d17c8e9a85e3cca1951b2d53f87..d1fd3eb9e51ace68d3ffc24579cdf95e
}
// CraftBukkit start - World fallback code, either respawn location or global spawn
-@@ -2563,5 +2566,13 @@ public class ServerPlayer extends Player {
+@@ -2560,5 +2563,13 @@ public class ServerPlayer extends Player {
public void tpsBar(boolean tpsBar) {
this.tpsBar = tpsBar;
}
@@ -61,10 +61,10 @@ index 66082298aea31d17c8e9a85e3cca1951b2d53f87..d1fd3eb9e51ace68d3ffc24579cdf95e
// Purpur end
}
diff --git a/src/main/java/org/dreeam/leaf/LeafConfig.java b/src/main/java/org/dreeam/leaf/LeafConfig.java
-index 9cf4bbde93ad01da842f6b3b5f46f25f442f7d54..22ed437840fd189cc0c26b544b78a66c62ffbf3b 100644
+index a0bd1ec3f09959c7f72b484658c1c94a16818281..e56151fe0dbc0c867dff728a55daa35c7714d3a6 100644
--- a/src/main/java/org/dreeam/leaf/LeafConfig.java
+++ b/src/main/java/org/dreeam/leaf/LeafConfig.java
-@@ -165,6 +165,11 @@ public class LeafConfig {
+@@ -170,6 +170,11 @@ public class LeafConfig {
public static String commandTPSBarTextColorMedium = "";
public static String commandTPSBarTextColorLow = "";
public static int commandTPSBarTickInterval = 20;
@@ -76,7 +76,7 @@ index 9cf4bbde93ad01da842f6b3b5f46f25f442f7d54..22ed437840fd189cc0c26b544b78a66c
private static void commandSettings() {
commandTPSBarTitle = getString("settings.command.tpsbar.title", commandTPSBarTitle);
-@@ -177,5 +182,17 @@ public class LeafConfig {
+@@ -182,5 +187,17 @@ public class LeafConfig {
commandTPSBarTextColorMedium = getString("settings.command.tpsbar.text-color.medium", commandTPSBarTextColorMedium);
commandTPSBarTextColorLow = getString("settings.command.tpsbar.text-color.low", commandTPSBarTextColorLow);
commandTPSBarTickInterval = getInt("settings.command.tpsbar.tick-interval", commandTPSBarTickInterval);
diff --git a/patches/server/0010-Purpur-Implement-ram-and-rambar-commands.patch b/patches/server/0010-Purpur-Implement-ram-and-rambar-commands.patch
index a880f0c3..212eb831 100644
--- a/patches/server/0010-Purpur-Implement-ram-and-rambar-commands.patch
+++ b/patches/server/0010-Purpur-Implement-ram-and-rambar-commands.patch
@@ -7,10 +7,10 @@ Original license: MIT
Original project: https://github.com/PurpurMC/Purpur
diff --git a/src/main/java/net/minecraft/commands/Commands.java b/src/main/java/net/minecraft/commands/Commands.java
-index 66242833210ae89cbca7448cd4e7cf1fa774bcf0..ff19fcd83295c6936dd83c7780d5757071ca44a5 100644
+index 2c5afab3cc0c66a2e63c1f647a033ca1a58f9e39..8ee8ff15f4511684261ff7a9417baa2ccd313b69 100644
--- a/src/main/java/net/minecraft/commands/Commands.java
+++ b/src/main/java/net/minecraft/commands/Commands.java
-@@ -216,6 +216,8 @@ public class Commands {
+@@ -217,6 +217,8 @@ public class Commands {
WhitelistCommand.register(this.dispatcher);
org.dreeam.leaf.commands.TPSBarCommand.register(this.dispatcher); // Purpur
org.dreeam.leaf.commands.CompassCommand.register(this.dispatcher); // Purpur
@@ -20,10 +20,10 @@ index 66242833210ae89cbca7448cd4e7cf1fa774bcf0..ff19fcd83295c6936dd83c7780d57570
if (environment.includeIntegrated) {
diff --git a/src/main/java/net/minecraft/server/level/ServerPlayer.java b/src/main/java/net/minecraft/server/level/ServerPlayer.java
-index d1fd3eb9e51ace68d3ffc24579cdf95ebdaea039..1b92480529c4436efe3d3b293a7af1fa95457a9d 100644
+index 336691038e2b1a68e1cd40d7015d42acceb2b069..cdcd1358ab8781c261c97aec03bb96118eb577f7 100644
--- a/src/main/java/net/minecraft/server/level/ServerPlayer.java
+++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java
-@@ -271,6 +271,7 @@ public class ServerPlayer extends Player {
+@@ -270,6 +270,7 @@ public class ServerPlayer extends Player {
public org.bukkit.event.player.PlayerQuitEvent.QuitReason quitReason = null; // Paper - there are a lot of changes to do if we change all methods leading to the event
private boolean tpsBar = false; // Purpur
private boolean compassBar = false; // Purpur
@@ -31,7 +31,7 @@ index d1fd3eb9e51ace68d3ffc24579cdf95ebdaea039..1b92480529c4436efe3d3b293a7af1fa
public ServerPlayer(MinecraftServer server, ServerLevel world, GameProfile profile) {
super(world, world.getSharedSpawnPos(), world.getSharedSpawnAngle(), profile);
-@@ -509,6 +510,7 @@ public class ServerPlayer extends Player {
+@@ -508,6 +509,7 @@ public class ServerPlayer extends Player {
}
}
@@ -39,7 +39,7 @@ index d1fd3eb9e51ace68d3ffc24579cdf95ebdaea039..1b92480529c4436efe3d3b293a7af1fa
if (nbt.contains("Purpur.TPSBar")) { this.tpsBar = nbt.getBoolean("Purpur.TPSBar"); } // Purpur
if (nbt.contains("Purpur.CompassBar")) { this.compassBar = nbt.getBoolean("Purpur.CompassBar"); } // Purpur
}
-@@ -577,6 +579,7 @@ public class ServerPlayer extends Player {
+@@ -576,6 +578,7 @@ public class ServerPlayer extends Player {
}
this.getBukkitEntity().setExtraData(nbt); // CraftBukkit
@@ -47,7 +47,7 @@ index d1fd3eb9e51ace68d3ffc24579cdf95ebdaea039..1b92480529c4436efe3d3b293a7af1fa
nbt.putBoolean("Purpur.TPSBar", this.tpsBar); // Purpur
nbt.putBoolean("Purpur.CompassBar", this.compassBar); // Purpur
}
-@@ -2574,5 +2577,14 @@ public class ServerPlayer extends Player {
+@@ -2571,5 +2574,14 @@ public class ServerPlayer extends Player {
public void compassBar(boolean compassBar) {
this.compassBar = compassBar;
}
@@ -63,10 +63,10 @@ index d1fd3eb9e51ace68d3ffc24579cdf95ebdaea039..1b92480529c4436efe3d3b293a7af1fa
// Purpur end
}
diff --git a/src/main/java/org/dreeam/leaf/LeafConfig.java b/src/main/java/org/dreeam/leaf/LeafConfig.java
-index 22ed437840fd189cc0c26b544b78a66c62ffbf3b..84dfe93de52d81e8eef8fc6b9778e081c9abe899 100644
+index e56151fe0dbc0c867dff728a55daa35c7714d3a6..afdee99c7d5ecedf8d2f6856f0aa9271c6bbb23d 100644
--- a/src/main/java/org/dreeam/leaf/LeafConfig.java
+++ b/src/main/java/org/dreeam/leaf/LeafConfig.java
-@@ -170,6 +170,17 @@ public class LeafConfig {
+@@ -175,6 +175,17 @@ public class LeafConfig {
public static BossBar.Color commandCompassBarProgressColor = BossBar.Color.BLUE;
public static float commandCompassBarProgressPercent = 1.0F;
public static int commandCompassBarTickInterval = 5;
@@ -84,7 +84,7 @@ index 22ed437840fd189cc0c26b544b78a66c62ffbf3b..84dfe93de52d81e8eef8fc6b9778e081
private static void commandSettings() {
commandTPSBarTitle = getString("settings.command.tpsbar.title", commandTPSBarTitle);
-@@ -189,6 +200,17 @@ public class LeafConfig {
+@@ -194,6 +205,17 @@ public class LeafConfig {
commandCompassBarProgressPercent = (float) getDouble("settings.command.compass.percent", commandCompassBarProgressPercent);
commandCompassBarTickInterval = getInt("settings.command.compass.tick-interval", commandCompassBarTickInterval);
diff --git a/patches/server/0011-Purpur-Lagging-threshold.patch b/patches/server/0011-Purpur-Lagging-threshold.patch
index f697200e..515e666f 100644
--- a/patches/server/0011-Purpur-Lagging-threshold.patch
+++ b/patches/server/0011-Purpur-Lagging-threshold.patch
@@ -7,18 +7,18 @@ Original license: MIT
Original project: https://github.com/PurpurMC/Purpur
diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java
-index d5e8de2fd68dbc43385ad71849294f20344385f5..6a16837facde1e903cdf203329798f8386a328d3 100644
+index ab0a4a36241bee59b142df65736003c69dcb3dd4..411fae7132b1d1763712594a18cff10d612cef7e 100644
--- a/src/main/java/net/minecraft/server/MinecraftServer.java
+++ b/src/main/java/net/minecraft/server/MinecraftServer.java
-@@ -421,6 +421,7 @@ public abstract class MinecraftServer extends MinecraftServerBlockableEventLoop
+@@ -305,6 +305,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop= this.maxPlayers && !this.canBypassPlayerLimit(gameprofile) ? IChatBaseComponent.translatable("multiplayer.disconnect.server_full") : null;
diff --git a/patches/server/0018-Purpur-Halloween-options-and-optimizations.patch b/patches/server/0018-Purpur-Halloween-options-and-optimizations.patch
index ca6c66de..dbec437a 100644
--- a/patches/server/0018-Purpur-Halloween-options-and-optimizations.patch
+++ b/patches/server/0018-Purpur-Halloween-options-and-optimizations.patch
@@ -7,7 +7,7 @@ Original license: MIT
Original project: https://github.com/PurpurMC/Purpur
diff --git a/src/main/java/net/minecraft/world/entity/ambient/Bat.java b/src/main/java/net/minecraft/world/entity/ambient/Bat.java
-index bf62750c31ffba6c2aa4f6d17c1c71c62385e584..d3195be103d45ddf33cda3d817107321b535e495 100644
+index 1572a81ce1718964d795f2a2a411402f88901c73..ae2c84af8baaf1bba9b0debe3774321417d77413 100644
--- a/src/main/java/net/minecraft/world/entity/ambient/Bat.java
+++ b/src/main/java/net/minecraft/world/entity/ambient/Bat.java
@@ -246,7 +246,7 @@ public class Bat extends AmbientCreature {
@@ -19,14 +19,14 @@ index bf62750c31ffba6c2aa4f6d17c1c71c62385e584..d3195be103d45ddf33cda3d817107321
b0 = 7;
} else if (random.nextBoolean()) {
return false;
-@@ -292,6 +292,7 @@ public class Bat extends AmbientCreature {
-
- // Gale end - predict Halloween
-
+@@ -260,6 +260,7 @@ public class Bat extends AmbientCreature {
+ private static boolean isSpookySeason = false;
+ private static final int ONE_HOUR = 20 * 60 * 60;
+ private static int lastSpookyCheck = -ONE_HOUR;
+ public static boolean isHalloweenSeason(Level level) { return org.dreeam.leaf.LeafConfig.forceHalloweenSeason || isHalloween(); } // Purpur
private static boolean isHalloween() {
- // Gale start - predict Halloween
- long currentEpochMillis = System.currentTimeMillis();
+ if (net.minecraft.server.MinecraftServer.currentTick - lastSpookyCheck > ONE_HOUR) {
+ LocalDate localdate = LocalDate.now();
diff --git a/src/main/java/net/minecraft/world/entity/monster/AbstractSkeleton.java b/src/main/java/net/minecraft/world/entity/monster/AbstractSkeleton.java
index b8abee145fc92faddef98da913eca7715b6bfc03..41de63fdcfe48c2a77f2d04e5bffbca41c98afe3 100644
--- a/src/main/java/net/minecraft/world/entity/monster/AbstractSkeleton.java
@@ -62,10 +62,10 @@ index 9976205537cfe228735687f1e9c52c74ac025690..dfe4c6d2bf9bee2e019635d02f01dc08
this.armorDropChances[EquipmentSlot.HEAD.getIndex()] = 0.0F;
}
diff --git a/src/main/java/org/dreeam/leaf/LeafConfig.java b/src/main/java/org/dreeam/leaf/LeafConfig.java
-index fee7c2e2b2189e9b0751d2fa994a2acc9a27faff..22df3540dd06ba049640e9bac90c23c095a07384 100644
+index 040c1f584c525990ec844cba9f01df5b33fa2a37..2855f8c4684cb9afee1bd8a4c2ae82d45ef1ea2b 100644
--- a/src/main/java/org/dreeam/leaf/LeafConfig.java
+++ b/src/main/java/org/dreeam/leaf/LeafConfig.java
-@@ -251,4 +251,11 @@ public class LeafConfig {
+@@ -256,4 +256,11 @@ public class LeafConfig {
advancementOnlyBroadcastToAffectedPlayer = getBoolean("settings.broadcasts.advancement.only-broadcast-to-affected-player", advancementOnlyBroadcastToAffectedPlayer);
deathMessageOnlyBroadcastToAffectedPlayer = getBoolean("settings.broadcasts.death.only-broadcast-to-affected-player", deathMessageOnlyBroadcastToAffectedPlayer);
}
diff --git a/patches/server/0019-Purpur-Persistent-BlockEntity-Lore-and-DisplayName.patch b/patches/server/0019-Purpur-Persistent-BlockEntity-Lore-and-DisplayName.patch
index 6bd08be2..f62cbd51 100644
--- a/patches/server/0019-Purpur-Persistent-BlockEntity-Lore-and-DisplayName.patch
+++ b/patches/server/0019-Purpur-Persistent-BlockEntity-Lore-and-DisplayName.patch
@@ -40,10 +40,10 @@ index b0204af850ee182773ad458208cccd946ad148d5..f74e420b1791df528a30a1213bb0076b
@Nullable
diff --git a/src/main/java/net/minecraft/world/level/block/Block.java b/src/main/java/net/minecraft/world/level/block/Block.java
-index 39981cd0003eb7ee416d887ffec70fb049599320..a5a1773109123c3499d6b2b02b76805d66764ec5 100644
+index 7b71073027f4cf79736546500ededdfbb83d968e..98c9c1899a311e76179f72fa1c43830fb5b9c521 100644
--- a/src/main/java/net/minecraft/world/level/block/Block.java
+++ b/src/main/java/net/minecraft/world/level/block/Block.java
-@@ -65,6 +65,13 @@ import net.minecraft.world.phys.shapes.Shapes;
+@@ -63,6 +63,13 @@ import net.minecraft.world.phys.shapes.Shapes;
import net.minecraft.world.phys.shapes.VoxelShape;
import org.slf4j.Logger;
@@ -57,7 +57,7 @@ index 39981cd0003eb7ee416d887ffec70fb049599320..a5a1773109123c3499d6b2b02b76805d
public class Block extends BlockBehaviour implements ItemLike {
private static final Logger LOGGER = LogUtils.getLogger();
-@@ -328,7 +335,7 @@ public class Block extends BlockBehaviour implements ItemLike {
+@@ -325,7 +332,7 @@ public class Block extends BlockBehaviour implements ItemLike {
public static void dropResources(BlockState state, LevelAccessor world, BlockPos pos, @Nullable BlockEntity blockEntity) {
if (world instanceof ServerLevel) {
Block.getDrops(state, (ServerLevel) world, pos, blockEntity).forEach((itemstack) -> {
@@ -66,7 +66,7 @@ index 39981cd0003eb7ee416d887ffec70fb049599320..a5a1773109123c3499d6b2b02b76805d
});
state.spawnAfterBreak((ServerLevel) world, pos, ItemStack.EMPTY, true);
}
-@@ -344,7 +351,7 @@ public class Block extends BlockBehaviour implements ItemLike {
+@@ -341,7 +348,7 @@ public class Block extends BlockBehaviour implements ItemLike {
io.papermc.paper.event.block.BlockBreakBlockEvent event = new io.papermc.paper.event.block.BlockBreakBlockEvent(org.bukkit.craftbukkit.block.CraftBlock.at(world, pos), org.bukkit.craftbukkit.block.CraftBlock.at(world, source), items);
event.callEvent();
for (var drop : event.getDrops()) {
@@ -75,7 +75,7 @@ index 39981cd0003eb7ee416d887ffec70fb049599320..a5a1773109123c3499d6b2b02b76805d
}
state.spawnAfterBreak(world.getMinecraftWorld(), pos, ItemStack.EMPTY, true);
}
-@@ -355,13 +362,53 @@ public class Block extends BlockBehaviour implements ItemLike {
+@@ -352,13 +359,53 @@ public class Block extends BlockBehaviour implements ItemLike {
public static void dropResources(BlockState state, Level world, BlockPos pos, @Nullable BlockEntity blockEntity, Entity entity, ItemStack stack) {
if (world instanceof ServerLevel) {
Block.getDrops(state, (ServerLevel) world, pos, blockEntity, entity, stack).forEach((itemstack1) -> {
@@ -198,10 +198,10 @@ index 58986bc0677c5ea1ad54d7d6d4efa5c2ea233aea..59d616137088af46d4494171fe96ba01
+ // Purpur end
}
diff --git a/src/main/java/org/dreeam/leaf/LeafConfig.java b/src/main/java/org/dreeam/leaf/LeafConfig.java
-index 22df3540dd06ba049640e9bac90c23c095a07384..1fd40640460850c7c89187c0eb10f966c61f4279 100644
+index 2855f8c4684cb9afee1bd8a4c2ae82d45ef1ea2b..f87f4f19738dfe8b58d3dbf0c27933fd3ec93883 100644
--- a/src/main/java/org/dreeam/leaf/LeafConfig.java
+++ b/src/main/java/org/dreeam/leaf/LeafConfig.java
-@@ -258,4 +258,9 @@ public class LeafConfig {
+@@ -263,4 +263,9 @@ public class LeafConfig {
forceHalloweenSeason = getBoolean("gameplay-mechanics.halloween.force", forceHalloweenSeason);
chanceHeadHalloweenOnEntity = (float) getDouble("gameplay-mechanics.halloween.head-chance", chanceHeadHalloweenOnEntity);
}
diff --git a/patches/server/0020-Purpur-Add-more-logger-output-for-invalid-movement-k.patch b/patches/server/0020-Purpur-Add-more-logger-output-for-invalid-movement-k.patch
index 71796cbf..49170394 100644
--- a/patches/server/0020-Purpur-Add-more-logger-output-for-invalid-movement-k.patch
+++ b/patches/server/0020-Purpur-Add-more-logger-output-for-invalid-movement-k.patch
@@ -7,10 +7,10 @@ Original license: MIT
Original project: https://github.com/PurpurMC/Purpur
diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
-index 7643f8a3aa22c8d58ce74a18efe3d98f5017d04c..e7bea7ebffd78813282b42d8ba5f219c10cc8959 100644
+index 84cb548e89350d9127b18f69e47d1f7433bcb1ee..86e5e0caf3b341d5556665e5f5fd7d158d639118 100644
--- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
+++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
-@@ -838,6 +838,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic
+@@ -809,6 +809,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic
if (packet.getId() == this.awaitingTeleport) {
if (this.awaitingPositionFromClient == null) {
this.disconnect(Component.translatable("multiplayer.disconnect.invalid_player_movement"), org.bukkit.event.player.PlayerKickEvent.Cause.INVALID_PLAYER_MOVEMENT); // Paper - kick event cause
@@ -18,7 +18,7 @@ index 7643f8a3aa22c8d58ce74a18efe3d98f5017d04c..e7bea7ebffd78813282b42d8ba5f219c
return;
}
-@@ -1402,8 +1403,16 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic
+@@ -1370,8 +1371,16 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic
@Override
public void handleMovePlayer(ServerboundMovePlayerPacket packet) {
PacketUtils.ensureRunningOnSameThread(packet, this, this.player.getLevel());
diff --git a/patches/server/0021-Purpur-Log-skipped-entity-s-position.patch b/patches/server/0021-Purpur-Log-skipped-entity-s-position.patch
index 4aaafb79..949caedd 100644
--- a/patches/server/0021-Purpur-Log-skipped-entity-s-position.patch
+++ b/patches/server/0021-Purpur-Log-skipped-entity-s-position.patch
@@ -7,10 +7,10 @@ Original license: MIT
Original project: https://github.com/PurpurMC/Purpur
diff --git a/src/main/java/net/minecraft/world/entity/EntityType.java b/src/main/java/net/minecraft/world/entity/EntityType.java
-index e5cd4b7609243669c9d84ff8a4988c209e6101aa..5a8b693b6b808410bd5020fc337687bf4124baa4 100644
+index 4f3708f5f5dcb6af8225bda1cc9204a6d974665f..6bdef01513cf86d6bf578ca37b364eab70f07843 100644
--- a/src/main/java/net/minecraft/world/entity/EntityType.java
+++ b/src/main/java/net/minecraft/world/entity/EntityType.java
-@@ -574,6 +574,12 @@ public class EntityType implements FeatureElement, EntityTypeT
+@@ -576,6 +576,12 @@ public class EntityType implements FeatureElement, EntityTypeT
entity.load(nbt);
}, () -> {
EntityType.LOGGER.warn("Skipping Entity with id {}", nbt.getString("id"));
diff --git a/patches/server/0022-Purpur-Alternative-Keepalive-Handling.patch b/patches/server/0022-Purpur-Alternative-Keepalive-Handling.patch
new file mode 100644
index 00000000..48883698
--- /dev/null
+++ b/patches/server/0022-Purpur-Alternative-Keepalive-Handling.patch
@@ -0,0 +1,73 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: William Blake Galbreath
+Date: Fri, 11 Oct 2019 00:17:39 -0500
+Subject: [PATCH] Purpur: Alternative Keepalive Handling
+
+Original license: MIT
+Original project: https://github.com/PurpurMC/Purpur
+
+diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
+index 86e5e0caf3b341d5556665e5f5fd7d158d639118..42de344dffd678158030c722c0cc0fef3f8c3fc6 100644
+--- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
++++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
+@@ -260,6 +260,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic
+ private long keepAliveTime = Util.getMillis();
+ private boolean keepAlivePending;
+ private long keepAliveChallenge;
++ private it.unimi.dsi.fastutil.longs.LongList keepAlives = new it.unimi.dsi.fastutil.longs.LongArrayList(); // Purpur
+ // CraftBukkit start - multithreaded fields
+ private final AtomicInteger chatSpamTickCount = new AtomicInteger();
+ private final java.util.concurrent.atomic.AtomicInteger tabSpamLimiter = new java.util.concurrent.atomic.AtomicInteger(); // Paper - configurable tab spam limits
+@@ -397,6 +398,21 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic
+ long currentTime = Util.getMillis();
+ long elapsedTime = currentTime - this.keepAliveTime;
+
++ // Purpur start
++ if (org.dreeam.leaf.LeafConfig.useAlternateKeepAlive) {
++ if (elapsedTime >= 1000L) { // 1 second
++ if (!processedDisconnect && keepAlives.size() * 1000L >= KEEPALIVE_LIMIT) {
++ LOGGER.warn("{} was kicked due to keepalive timeout!", player.getName());
++ disconnect(Component.translatable("disconnect.timeout"), org.bukkit.event.player.PlayerKickEvent.Cause.TIMEOUT);
++ } else {
++ keepAliveTime = currentTime; // hijack this field for 1 second intervals
++ keepAlives.add(currentTime); // currentTime is ID
++ send(new ClientboundKeepAlivePacket(currentTime));
++ }
++ }
++ } else
++ // Purpur end
++
+ if (this.keepAlivePending) {
+ if (!this.processedDisconnect && elapsedTime >= KEEPALIVE_LIMIT) { // check keepalive limit, don't fire if already disconnected
+ ServerGamePacketListenerImpl.LOGGER.warn("{} was kicked due to keepalive timeout!", this.player.getScoreboardName()); // more info
+@@ -3463,6 +3479,16 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic
+
+ @Override
+ public void handleKeepAlive(ServerboundKeepAlivePacket packet) {
++ // Purpur start
++ if (org.dreeam.leaf.LeafConfig.useAlternateKeepAlive) {
++ long id = packet.getId();
++ if (keepAlives.size() > 0 && keepAlives.contains(id)) {
++ int ping = (int) (Util.getMillis() - id);
++ player.latency = (player.latency * 3 + ping) / 4;
++ keepAlives.clear(); // we got a valid response, lets roll with it and forget the rest
++ }
++ } else
++ // Purpur end
+ //PacketUtils.ensureRunningOnSameThread(packet, this, this.player.getLevel()); // CraftBukkit // Paper - This shouldn't be on the main thread
+ if (this.keepAlivePending && packet.getId() == this.keepAliveChallenge) {
+ int i = (int) (Util.getMillis() - this.keepAliveTime);
+diff --git a/src/main/java/org/dreeam/leaf/LeafConfig.java b/src/main/java/org/dreeam/leaf/LeafConfig.java
+index f87f4f19738dfe8b58d3dbf0c27933fd3ec93883..9403774691cb83a3b916b4e0dc603385aceb4f4d 100644
+--- a/src/main/java/org/dreeam/leaf/LeafConfig.java
++++ b/src/main/java/org/dreeam/leaf/LeafConfig.java
+@@ -268,4 +268,9 @@ public class LeafConfig {
+ private static void tileentitySetting() {
+ persistentTileEntityDisplayNames = getBoolean("gameplay-mechanics.persistent-tileentity-display-names-and-lore", persistentTileEntityDisplayNames);
+ }
++
++ public static boolean useAlternateKeepAlive = false;
++ private static void useAlternateKeepAlive() {
++ useAlternateKeepAlive = getBoolean("settings.use-alternate-keepalive", useAlternateKeepAlive);
++ }
+ }
diff --git a/patches/server/0023-Purpur-Skip-events-if-there-s-no-listeners.patch b/patches/server/0023-Purpur-Skip-events-if-there-s-no-listeners.patch
new file mode 100644
index 00000000..b0ad8848
--- /dev/null
+++ b/patches/server/0023-Purpur-Skip-events-if-there-s-no-listeners.patch
@@ -0,0 +1,28 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: William Blake Galbreath
+Date: Sat, 4 Apr 2020 03:07:59 -0500
+Subject: [PATCH] Purpur: Skip events if there's no listeners
+
+Original license: MIT
+Original project: https://github.com/PurpurMC/Purpur
+
+diff --git a/src/main/java/net/minecraft/commands/Commands.java b/src/main/java/net/minecraft/commands/Commands.java
+index 8ee8ff15f4511684261ff7a9417baa2ccd313b69..31e44f59bd34ae79dd1147263e446e6d6e9f8c66 100644
+--- a/src/main/java/net/minecraft/commands/Commands.java
++++ b/src/main/java/net/minecraft/commands/Commands.java
+@@ -429,6 +429,7 @@ public class Commands {
+ private void runSync(ServerPlayer player, Collection bukkit, RootCommandNode rootcommandnode) {
+ // Paper end - Async command map building
+ new com.destroystokyo.paper.event.brigadier.AsyncPlayerSendCommandsEvent(player.getBukkitEntity(), (RootCommandNode) rootcommandnode, false).callEvent(); // Paper
++ if (PlayerCommandSendEvent.getHandlerList().getRegisteredListeners().length > 0) { // Purpur - skip all this crap if there's nothing listening
+ PlayerCommandSendEvent event = new PlayerCommandSendEvent(player.getBukkitEntity(), new LinkedHashSet<>(bukkit));
+ event.getPlayer().getServer().getPluginManager().callEvent(event);
+
+@@ -439,6 +440,7 @@ public class Commands {
+ }
+ }
+ // CraftBukkit end
++ } // Purpur - skip event
+ player.connection.send(new ClientboundCommandsPacket(rootcommandnode));
+ }
+
diff --git a/patches/server/0024-Purpur-Add-toggle-for-sand-duping-fix.patch b/patches/server/0024-Purpur-Add-toggle-for-sand-duping-fix.patch
new file mode 100644
index 00000000..7c236cae
--- /dev/null
+++ b/patches/server/0024-Purpur-Add-toggle-for-sand-duping-fix.patch
@@ -0,0 +1,44 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: William Blake Galbreath
+Date: Fri, 4 Jun 2021 09:13:54 -0500
+Subject: [PATCH] Purpur: Add toggle for sand duping fix
+
+Original license: MIT
+Original project: https://github.com/PurpurMC/Purpur
+
+diff --git a/src/main/java/net/minecraft/world/entity/item/FallingBlockEntity.java b/src/main/java/net/minecraft/world/entity/item/FallingBlockEntity.java
+index 72f1866226269396ba0f0c1be269e237925d9322..fe813aea811d3b5c54978d33e7b766f7a9fd17ee 100644
+--- a/src/main/java/net/minecraft/world/entity/item/FallingBlockEntity.java
++++ b/src/main/java/net/minecraft/world/entity/item/FallingBlockEntity.java
+@@ -130,7 +130,7 @@ public class FallingBlockEntity extends Entity {
+ @Override
+ public void tick() {
+ // Paper start - fix sand duping
+- if (this.isRemoved()) {
++ if (org.dreeam.leaf.LeafConfig.fixSandDuping && this.isRemoved()) { // Purpur
+ return;
+ }
+ // Paper end - fix sand duping
+@@ -147,7 +147,7 @@ public class FallingBlockEntity extends Entity {
+ this.move(MoverType.SELF, this.getDeltaMovement());
+
+ // Paper start - fix sand duping
+- if (this.isRemoved()) {
++ if (org.dreeam.leaf.LeafConfig.fixSandDuping && this.isRemoved()) { // Purpur
+ return;
+ }
+ // Paper end - fix sand duping
+diff --git a/src/main/java/org/dreeam/leaf/LeafConfig.java b/src/main/java/org/dreeam/leaf/LeafConfig.java
+index 9403774691cb83a3b916b4e0dc603385aceb4f4d..1a2c32e6589de7705af26623a0c6badb9504324f 100644
+--- a/src/main/java/org/dreeam/leaf/LeafConfig.java
++++ b/src/main/java/org/dreeam/leaf/LeafConfig.java
+@@ -273,4 +273,9 @@ public class LeafConfig {
+ private static void useAlternateKeepAlive() {
+ useAlternateKeepAlive = getBoolean("settings.use-alternate-keepalive", useAlternateKeepAlive);
+ }
++
++ public static boolean fixSandDuping = true;
++ private static void sandSettings() {
++ fixSandDuping = getBoolean("blocks.sand.fix-duping", fixSandDuping);
++ }
+ }
diff --git a/patches/server/0022-Purpur-Lobotomize-stuck-villagers.patch b/patches/server/0025-Purpur-Lobotomize-stuck-villagers.patch
similarity index 83%
rename from patches/server/0022-Purpur-Lobotomize-stuck-villagers.patch
rename to patches/server/0025-Purpur-Lobotomize-stuck-villagers.patch
index 8079999e..72be9b18 100644
--- a/patches/server/0022-Purpur-Lobotomize-stuck-villagers.patch
+++ b/patches/server/0025-Purpur-Lobotomize-stuck-villagers.patch
@@ -7,18 +7,18 @@ Original license: MIT
Original project: https://github.com/PurpurMC/Purpur
diff --git a/src/main/java/net/minecraft/world/entity/npc/Villager.java b/src/main/java/net/minecraft/world/entity/npc/Villager.java
-index 7740adf7e852d860d08cdf15ab9d6b0fb6b68055..df301983ef9fd0f2dbd6ec30529e41f344272bd3 100644
+index 76a9da8209d557b913c49ccd281bf147b9ac4fa4..a39d038b5198c9244e2225e0fe383f3c96b49a08 100644
--- a/src/main/java/net/minecraft/world/entity/npc/Villager.java
+++ b/src/main/java/net/minecraft/world/entity/npc/Villager.java
-@@ -141,6 +141,8 @@ public class Villager extends AbstractVillager implements ReputationEventHandler
+@@ -139,6 +139,8 @@ public class Villager extends AbstractVillager implements ReputationEventHandler
}, MemoryModuleType.MEETING_POINT, (entityvillager, holder) -> {
return holder.is(PoiTypes.MEETING);
});
+ private boolean isLobotomized = false; public boolean isLobotomized() { return this.isLobotomized; } // Purpur
+ private int notLobotomizedCount = 0; // Purpur
- public Villager(EntityType extends Villager> entityType, Level world) {
- this(entityType, world, VillagerType.PLAINS);
+ public long nextGolemPanic = -1; // Pufferfish
+
@@ -155,6 +157,47 @@ public class Villager extends AbstractVillager implements ReputationEventHandler
this.setVillagerData(this.getVillagerData().setType(type).setProfession(VillagerProfession.NONE));
}
@@ -67,10 +67,10 @@ index 7740adf7e852d860d08cdf15ab9d6b0fb6b68055..df301983ef9fd0f2dbd6ec30529e41f3
@Override
public Brain getBrain() {
return (Brain) super.getBrain(); // CraftBukkit - decompile error
-@@ -249,6 +292,21 @@ public class Villager extends AbstractVillager implements ReputationEventHandler
+@@ -250,12 +293,27 @@ public class Villager extends AbstractVillager implements ReputationEventHandler
protected void customServerAiStep() { mobTick(false); }
protected void mobTick(boolean inactive) {
- if (!inactive) this.getBrain().tick((ServerLevel) this.level, this); // Paper
+ this.level.getProfiler().push("villagerBrain");
+ // Purpur start
+ if (org.dreeam.leaf.LeafConfig.villagerLobotomizeEnabled) {
+ // treat as inactive if lobotomized
@@ -80,15 +80,21 @@ index 7740adf7e852d860d08cdf15ab9d6b0fb6b68055..df301983ef9fd0f2dbd6ec30529e41f3
+ this.isLobotomized = false;
+ }
+ // Purpur end
+ // Pufferfish start
+ if (!inactive) {
+ if (this.behaviorTick++ % this.activatedPriority == 0) // Pufferfish
+ this.getBrain().tick((ServerLevel) this.level, this); // Paper
+ }
+ // Pufferfish end
+ // Purpur start
-+ if (this.isLobotomized && shouldRestock()) {
++ else if (this.isLobotomized && shouldRestock()) {
+ // make sure we restock if needed when lobotomized
+ restock();
+ }
+ // Purpur end
+ this.level.getProfiler().pop();
if (this.assignProfessionWhenSpawned) {
this.assignProfessionWhenSpawned = false;
- }
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftVillager.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftVillager.java
index a1a8ac55e572156671e47317ba061855be79e5ac..ec3fb8865211bd7625103c37af7b96df37163a07 100644
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftVillager.java
@@ -106,12 +112,12 @@ index a1a8ac55e572156671e47317ba061855be79e5ac..ec3fb8865211bd7625103c37af7b96df
+ // Purpur end
}
diff --git a/src/main/java/org/dreeam/leaf/LeafConfig.java b/src/main/java/org/dreeam/leaf/LeafConfig.java
-index 1fd40640460850c7c89187c0eb10f966c61f4279..94c890a609a8ce2a76d44eb365eeff1d7e7b13bf 100644
+index 1a2c32e6589de7705af26623a0c6badb9504324f..e3a2432c09871878c4c3981019d602a91fec3af7 100644
--- a/src/main/java/org/dreeam/leaf/LeafConfig.java
+++ b/src/main/java/org/dreeam/leaf/LeafConfig.java
-@@ -263,4 +263,11 @@ public class LeafConfig {
- private static void tileentitySetting() {
- persistentTileEntityDisplayNames = getBoolean("gameplay-mechanics.persistent-tileentity-display-names-and-lore", persistentTileEntityDisplayNames);
+@@ -278,4 +278,11 @@ public class LeafConfig {
+ private static void sandSettings() {
+ fixSandDuping = getBoolean("blocks.sand.fix-duping", fixSandDuping);
}
+
+ public static boolean villagerLobotomizeEnabled = false;
diff --git a/patches/server/0023-Purpur-Option-to-disable-kick-for-out-of-order-chat.patch b/patches/server/0026-Purpur-Option-to-disable-kick-for-out-of-order-chat.patch
similarity index 84%
rename from patches/server/0023-Purpur-Option-to-disable-kick-for-out-of-order-chat.patch
rename to patches/server/0026-Purpur-Option-to-disable-kick-for-out-of-order-chat.patch
index 425d6c21..18560d12 100644
--- a/patches/server/0023-Purpur-Option-to-disable-kick-for-out-of-order-chat.patch
+++ b/patches/server/0026-Purpur-Option-to-disable-kick-for-out-of-order-chat.patch
@@ -7,10 +7,10 @@ Original license: MIT
Original project: https://github.com/PurpurMC/Purpur
diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
-index e7bea7ebffd78813282b42d8ba5f219c10cc8959..5ce73d5b8a5885664f1e21743b8b31f842c0524c 100644
+index 42de344dffd678158030c722c0cc0fef3f8c3fc6..3dbe70385d4d22c5a9cea3c471519db8bcd301e7 100644
--- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
+++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
-@@ -2406,7 +2406,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic
+@@ -2383,7 +2383,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic
do {
instant1 = (Instant) this.lastChatTimeStamp.get();
if (timestamp.isBefore(instant1)) {
@@ -20,10 +20,10 @@ index e7bea7ebffd78813282b42d8ba5f219c10cc8959..5ce73d5b8a5885664f1e21743b8b31f8
} while (!this.lastChatTimeStamp.compareAndSet(instant1, timestamp));
diff --git a/src/main/java/org/dreeam/leaf/LeafConfig.java b/src/main/java/org/dreeam/leaf/LeafConfig.java
-index 94c890a609a8ce2a76d44eb365eeff1d7e7b13bf..abca2d4c4f25c9483019984001bb48d5f36e1ca8 100644
+index e3a2432c09871878c4c3981019d602a91fec3af7..519770e60a1986e00b9754bb375b621cf084ec88 100644
--- a/src/main/java/org/dreeam/leaf/LeafConfig.java
+++ b/src/main/java/org/dreeam/leaf/LeafConfig.java
-@@ -270,4 +270,9 @@ public class LeafConfig {
+@@ -285,4 +285,9 @@ public class LeafConfig {
villagerLobotomizeEnabled = getBoolean("mobs.villager.lobotomize.enabled", villagerLobotomizeEnabled);
villagerLobotomizeCheckInterval = getInt("mobs.villager.lobotomize.check-interval", villagerLobotomizeCheckInterval);
}
diff --git a/patches/server/0027-KeYi-Do-not-save-firework-entities-or-the-server-may.patch b/patches/server/0027-KeYi-Do-not-save-firework-entities-or-the-server-may.patch
new file mode 100644
index 00000000..f612fe7a
--- /dev/null
+++ b/patches/server/0027-KeYi-Do-not-save-firework-entities-or-the-server-may.patch
@@ -0,0 +1,25 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: nostalgic853
+Date: Mon, 24 Oct 2022 10:25:40 +0800
+Subject: [PATCH] KeYi: Do not save firework entities or the server may be
+ laggy
+
+Original license: MIT
+Original project: https://github.com/KeYiMC/KeYi
+
+diff --git a/src/main/java/net/minecraft/world/entity/projectile/FireworkRocketEntity.java b/src/main/java/net/minecraft/world/entity/projectile/FireworkRocketEntity.java
+index 5406925cd66f46ab8744123c670d72cea7bfc3a1..0b664dfef68b1e3905c9d8451602abf9cd9eafe6 100644
+--- a/src/main/java/net/minecraft/world/entity/projectile/FireworkRocketEntity.java
++++ b/src/main/java/net/minecraft/world/entity/projectile/FireworkRocketEntity.java
+@@ -358,4 +358,11 @@ public class FireworkRocketEntity extends Projectile implements ItemSupplier {
+ public boolean isAttackable() {
+ return false;
+ }
++
++ // KeYi start
++ @Override
++ public boolean shouldBeSaved() {
++ return false;
++ }
++ // KeYi end
+ }
diff --git a/patches/server/0026-KeYi-Use-a-faster-random-implementation.patch b/patches/server/0028-KeYi-Use-a-faster-random-implementation.patch
similarity index 97%
rename from patches/server/0026-KeYi-Use-a-faster-random-implementation.patch
rename to patches/server/0028-KeYi-Use-a-faster-random-implementation.patch
index aedae0dd..d03a7833 100644
--- a/patches/server/0026-KeYi-Use-a-faster-random-implementation.patch
+++ b/patches/server/0028-KeYi-Use-a-faster-random-implementation.patch
@@ -426,10 +426,10 @@ index e5ea9f27a1936ed9e329e74317c91c5df89b9fbd..89a41d396162a1c2eb2df5192b0d888b
private long lastFill = -1;
private long nextRefill = -1;
diff --git a/src/main/java/net/minecraft/world/level/chunk/LevelChunk.java b/src/main/java/net/minecraft/world/level/chunk/LevelChunk.java
-index bca581f2a192015f5461e5bf776234687e5ae9fc..87161a2a3f611abdefdb2ef475a3cb64261339b8 100644
+index de7a5f3812a017131fd1b32fbeff10e325b1cd2e..ebe2c0b17fc6e21a5ced4f35b594d466f9f573f5 100644
--- a/src/main/java/net/minecraft/world/level/chunk/LevelChunk.java
+++ b/src/main/java/net/minecraft/world/level/chunk/LevelChunk.java
-@@ -52,6 +52,10 @@ import net.minecraft.world.level.material.Fluids;
+@@ -53,6 +53,10 @@ import net.minecraft.world.level.material.Fluids;
import net.minecraft.world.ticks.LevelChunkTicks;
import net.minecraft.world.ticks.TickContainerAccess;
import org.slf4j.Logger;
@@ -440,7 +440,7 @@ index bca581f2a192015f5461e5bf776234687e5ae9fc..87161a2a3f611abdefdb2ef475a3cb64
public class LevelChunk extends ChunkAccess {
-@@ -931,7 +935,7 @@ public class LevelChunk extends ChunkAccess {
+@@ -932,7 +936,7 @@ public class LevelChunk extends ChunkAccess {
if (this.needsDecoration) {
try (co.aikar.timings.Timing ignored = this.level.timings.chunkLoadPopulate.startTiming()) { // Paper
this.needsDecoration = false;
@@ -471,18 +471,18 @@ index dcfe090c269d4cbcc2eb1b6f85392848bb34656c..ef8909c9c13c8f46ec6d452f0d14c9a1
}
diff --git a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java
-index a190bb9ce7b3701963f315452359f6f9c3aae329..97722fc6e49b47657cf901b05dfb76a4b2a23034 100644
+index f8d321e925bf2708e51590542325c1bdc67d5964..ace7e9f66c3583fc51f06bd9963ed55968d40c0f 100644
--- a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java
+++ b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java
-@@ -132,6 +132,7 @@ import org.bukkit.util.RayTraceResult;
+@@ -134,6 +134,7 @@ import org.bukkit.util.Consumer;
+ import org.bukkit.util.RayTraceResult;
import org.bukkit.util.StructureSearchResult;
import org.bukkit.util.Vector;
- import org.galemc.gale.executor.queue.ScheduledServerThreadTaskQueues;
+import cc.keyimc.keyi.utils.FastRandom; // KeYi
public class CraftWorld extends CraftRegionAccessor implements World {
public static final int CUSTOM_DIMENSION_OFFSET = 10;
-@@ -224,7 +225,7 @@ public class CraftWorld extends CraftRegionAccessor implements World {
+@@ -226,7 +227,7 @@ public class CraftWorld extends CraftRegionAccessor implements World {
}
// Paper end
diff --git a/patches/server/0027-KeYi-Player-Skull-API.patch b/patches/server/0029-KeYi-Player-Skull-API.patch
similarity index 92%
rename from patches/server/0027-KeYi-Player-Skull-API.patch
rename to patches/server/0029-KeYi-Player-Skull-API.patch
index d2a6a1e0..6604be98 100644
--- a/patches/server/0027-KeYi-Player-Skull-API.patch
+++ b/patches/server/0029-KeYi-Player-Skull-API.patch
@@ -7,7 +7,7 @@ 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 53a5464aa0261d50ce9a0b7528af56f9436e3c1c..554fe3cdc287dd06a2eefffba42eac86efda0d24 100644
+index 99bf1485ddecb5fc88850242e9c32850781c4b36..0813237d69ad1a9d4ed32772803fb5111a015dd4 100644
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
@@ -26,6 +26,9 @@ import java.util.Optional;
@@ -28,7 +28,7 @@ index 53a5464aa0261d50ce9a0b7528af56f9436e3c1c..554fe3cdc287dd06a2eefffba42eac86
import org.bukkit.map.MapCursor;
import org.bukkit.map.MapView;
import org.bukkit.metadata.MetadataValue;
-@@ -3010,4 +3014,28 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
+@@ -3003,4 +3007,28 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
return this.spigot;
}
// Spigot end
diff --git a/patches/server/0029-Revert-AI-goal-set-collection-optimization.patch b/patches/server/0029-Revert-AI-goal-set-collection-optimization.patch
deleted file mode 100644
index f9b39767..00000000
--- a/patches/server/0029-Revert-AI-goal-set-collection-optimization.patch
+++ /dev/null
@@ -1,28 +0,0 @@
-From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Dreeam <61569423+Dreeam-qwq@users.noreply.github.com>
-Date: Fri, 30 Dec 2022 00:36:09 -0500
-Subject: [PATCH] Revert AI goal set collection optimization
-
-
-diff --git a/src/main/java/net/minecraft/world/entity/ai/goal/GoalSelector.java b/src/main/java/net/minecraft/world/entity/ai/goal/GoalSelector.java
-index 86fc528551c2c90c78783d4d46a4a2c52e4efe41..ce2804271bb67803c60c9121aec6c8dc0e99a1d9 100644
---- a/src/main/java/net/minecraft/world/entity/ai/goal/GoalSelector.java
-+++ b/src/main/java/net/minecraft/world/entity/ai/goal/GoalSelector.java
-@@ -11,8 +11,6 @@ import java.util.Set;
- import java.util.function.Predicate;
- import java.util.function.Supplier;
- import java.util.stream.Stream;
--
--import it.unimi.dsi.fastutil.objects.ObjectLinkedOpenHashSet;
- import org.slf4j.Logger;
-
- public class GoalSelector {
-@@ -29,7 +27,7 @@ public class GoalSelector {
- }
- };
- private final Map lockedFlags = new EnumMap<>(Goal.Flag.class);
-- private final Set availableGoals = new ObjectLinkedOpenHashSet<>(); // Gale - Lithium - replace AI goal set with optimized collection
-+ private final Set availableGoals = Sets.newLinkedHashSet();
- private final EnumSet disabledFlags = EnumSet.noneOf(Goal.Flag.class); // Paper unused, but dummy to prevent plugins from crashing as hard. Theyll need to support paper in a special case if this is super important, but really doesn't seem like it would be.
- private final com.destroystokyo.paper.util.set.OptimizedSmallEnumSet goalTypes = new com.destroystokyo.paper.util.set.OptimizedSmallEnumSet<>(Goal.Flag.class); // Paper - remove streams from pathfindergoalselector
- private int tickCount;
diff --git a/patches/server/0024-Carpet-Fixes-Optimized-getBiome-method.patch b/patches/server/0030-Carpet-Fixes-Optimized-getBiome-method.patch
similarity index 100%
rename from patches/server/0024-Carpet-Fixes-Optimized-getBiome-method.patch
rename to patches/server/0030-Carpet-Fixes-Optimized-getBiome-method.patch
diff --git a/patches/server/0025-Carpet-Fixes-Use-optimized-RecipeManager.patch b/patches/server/0031-Carpet-Fixes-Use-optimized-RecipeManager.patch
similarity index 100%
rename from patches/server/0025-Carpet-Fixes-Use-optimized-RecipeManager.patch
rename to patches/server/0031-Carpet-Fixes-Use-optimized-RecipeManager.patch
diff --git a/patches/server/0032-Patina-Don-t-create-new-random-instance.patch b/patches/server/0032-Patina-Don-t-create-new-random-instance.patch
new file mode 100644
index 00000000..1e40716d
--- /dev/null
+++ b/patches/server/0032-Patina-Don-t-create-new-random-instance.patch
@@ -0,0 +1,46 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: foss-mc <69294560+foss-mc@users.noreply.github.com>
+Date: Thu, 1 Jul 2021 12:17:44 +0000
+Subject: [PATCH] Patina: Don't create new random instance
+
+Original license: GPL v3
+Original project: https://github.com/PatinaMC/Patina
+
+Original code by PatinaMC, licensed under GNU General Public License v3.0
+You can find the original code on https://github.com/PatinaMC/Patina
+
+diff --git a/src/main/java/net/minecraft/server/level/ServerPlayer.java b/src/main/java/net/minecraft/server/level/ServerPlayer.java
+index d46f33d9bc99484297270f88e68c1519922cb7db..46e5eaf8a6a4fef2c9b4d31665e8ec8589e6b31b 100644
+--- a/src/main/java/net/minecraft/server/level/ServerPlayer.java
++++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java
+@@ -393,7 +393,7 @@ public class ServerPlayer extends Player {
+ long l = k * k;
+ int i1 = l > 2147483647L ? Integer.MAX_VALUE : (int) l;
+ int j1 = this.getCoprime(i1);
+- int k1 = RandomSource.create().nextInt(i1);
++ int k1 = worldserver.random.nextInt(i1); // Patina - don't create new random instance
+
+ for (int l1 = 0; l1 < i1; ++l1) {
+ int i2 = (k1 + j1 * l1) % i1;
+@@ -430,7 +430,7 @@ public class ServerPlayer extends Player {
+ long l = k * k;
+ int i1 = l > 2147483647L ? Integer.MAX_VALUE : (int) l;
+ int j1 = this.getCoprime(i1);
+- int k1 = RandomSource.create().nextInt(i1);
++ int k1 = world.random.nextInt(i1); // Patina - don't create new random instance
+
+ for (int l1 = 0; l1 < i1; ++l1) {
+ int i2 = (k1 + j1 * l1) % i1;
+diff --git a/src/main/java/net/minecraft/server/rcon/thread/QueryThreadGs4.java b/src/main/java/net/minecraft/server/rcon/thread/QueryThreadGs4.java
+index 1ef089dbf83de35d875c00efdf468c397be56978..c345f10cbf7f3451edc604f97cdf959d70639e17 100644
+--- a/src/main/java/net/minecraft/server/rcon/thread/QueryThreadGs4.java
++++ b/src/main/java/net/minecraft/server/rcon/thread/QueryThreadGs4.java
+@@ -349,7 +349,7 @@ public class QueryThreadGs4 extends GenericThread {
+ this.identBytes[2] = bs[5];
+ this.identBytes[3] = bs[6];
+ this.ident = new String(this.identBytes, StandardCharsets.UTF_8);
+- this.challenge = RandomSource.create().nextInt(16777216);
++ this.challenge = java.util.concurrent.ThreadLocalRandom.current().nextInt(16777216); // Patina - don't create new random instance
+ this.challengeBytes = String.format(Locale.ROOT, "\t%s%d\u0000", this.ident, this.challenge).getBytes(StandardCharsets.UTF_8);
+ }
+
diff --git a/patches/server/0033-Yatopia-Smarter-statistics-ticking.patch b/patches/server/0033-Yatopia-Smarter-statistics-ticking.patch
new file mode 100644
index 00000000..8f69fb49
--- /dev/null
+++ b/patches/server/0033-Yatopia-Smarter-statistics-ticking.patch
@@ -0,0 +1,52 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Mykyta Komarnytskyy
+Date: Sat, 24 Oct 2020 21:03:53 -0500
+Subject: [PATCH] Yatopia: Smarter statistics ticking
+
+Original license: MIT
+Original project: https://github.com/YatopiaMC/Yatopia
+
+In vanilla, statistics that count time spent for an action (i.e. time played or sneak time) are incremented every tick. This is retarded. With this patch and a configured interval of 20, the statistics are only ticked every 20th tick and are incremented by 20 ticks at a time. This means a lot less ticking with the same accurate counting.
+With an interval of 20, this patch saves roughly 3ms per tick on a server w/ 80 players online.
+
+Original code by YatopiaMC, licensed under MIT
+You can find the original code on https://github.com/YatopiaMC/Yatopia
+
+diff --git a/src/main/java/net/minecraft/world/entity/player/Player.java b/src/main/java/net/minecraft/world/entity/player/Player.java
+index 0dcae10fd05a8fe963fdedda8199aa09dc717c9a..3bed0f2dea21761687e5692f7136ca085cfdbc63 100644
+--- a/src/main/java/net/minecraft/world/entity/player/Player.java
++++ b/src/main/java/net/minecraft/world/entity/player/Player.java
+@@ -277,19 +277,21 @@ public abstract class Player extends LivingEntity {
+ this.moveCloak();
+ if (!this.level.isClientSide) {
+ this.foodData.tick(this);
+- this.awardStat(Stats.PLAY_TIME);
+- this.awardStat(Stats.TOTAL_WORLD_TIME);
+- if (this.isAlive()) {
+- this.awardStat(Stats.TIME_SINCE_DEATH);
+- }
+-
+- if (this.isDiscrete()) {
+- this.awardStat(Stats.CROUCH_TIME);
+- }
+-
+- if (!this.isSleeping()) {
+- this.awardStat(Stats.TIME_SINCE_REST);
++ // Mirai start
++ if (tickCount % 20 == 0) {
++ this.awardStat(Stats.PLAY_TIME, 20);
++ this.awardStat(Stats.TOTAL_WORLD_TIME, 20);
++ if (this.isAlive()) {
++ this.awardStat(Stats.TIME_SINCE_DEATH, 20);
++ }
++ if (this.isDiscrete()) {
++ this.awardStat(Stats.CROUCH_TIME, 20);
++ }
++ if (!this.isSleeping()) {
++ this.awardStat(Stats.TIME_SINCE_REST, 20);
++ }
+ }
++ // Mirai end
+ }
+
+ int i = 29999999;
diff --git a/patches/server/0034-Mirai-Fast-speed-check.patch b/patches/server/0034-Mirai-Fast-speed-check.patch
new file mode 100644
index 00000000..bbf1b305
--- /dev/null
+++ b/patches/server/0034-Mirai-Fast-speed-check.patch
@@ -0,0 +1,38 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: nostalgic853
+Date: Sat, 22 Oct 2022 09:58:38 +0800
+Subject: [PATCH] Mirai: Fast speed check
+
+Original license: GPL v3
+Original project: https://github.com/etil2jz/Mirai
+
+Original code by NFT-Worlds, licensed under GNU General Public License v3.0
+You can find the original code on https://github.com/NFT-Worlds/Server
+
+This patch was took from Mirai. (https://github.com/etil2jz/Mirai)
+
+etil2jz's note:
+NFT-Worlds is related to Stellar devs, known for countless paid forks mostly taking open source patches,
+doing questionable/buggy ones, and claiming breathtaking performance improvements. Never ever pay for
+any of those Spigot forks!
+
+diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java
+index 3961f66a23508089df8c4ee7455e170cb870e9d0..fc6d90ec2e12cf5d12c6c0d9a45947218185ef3e 100644
+--- a/src/main/java/net/minecraft/world/entity/Entity.java
++++ b/src/main/java/net/minecraft/world/entity/Entity.java
+@@ -1194,7 +1194,14 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource {
+ }
+
+ this.tryCheckInsideBlocks();
+- float f2 = this.getBlockSpeedFactor();
++ // KeYi start - Fast speed check
++ float f2;
++ if (this.getDeltaMovement().x == 0 && this.getDeltaMovement().z == 0) {
++ f2 = 1;
++ } else {
++ f2 = this.getBlockSpeedFactor();
++ }
++ // KeYi end
+
+ this.setDeltaMovement(this.getDeltaMovement().multiply((double) f2, 1.0D, (double) f2));
+ // Paper start - remove expensive streams from here
diff --git a/patches/server/0035-VMP-Skip-entity-move-if-no-movement.patch b/patches/server/0035-VMP-Skip-entity-move-if-no-movement.patch
new file mode 100644
index 00000000..48448d89
--- /dev/null
+++ b/patches/server/0035-VMP-Skip-entity-move-if-no-movement.patch
@@ -0,0 +1,42 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: nostalgic853
+Date: Mon, 24 Oct 2022 11:01:36 +0800
+Subject: [PATCH] VMP: Skip entity move if no movement
+
+Original license: MIT
+Original project: https://github.com/RelativityMC/VMP-fabric
+
+diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java
+index fc6d90ec2e12cf5d12c6c0d9a45947218185ef3e..853e96c3f2e4dd5572743154074b770ba9a23aa5 100644
+--- a/src/main/java/net/minecraft/world/entity/Entity.java
++++ b/src/main/java/net/minecraft/world/entity/Entity.java
+@@ -398,6 +398,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource {
+ private UUID originWorld;
+ public boolean freezeLocked = false; // Paper - Freeze Tick Lock API
+ public boolean collidingWithWorldBorder; // Paper
++ private boolean boundingBoxChanged = false; // KeYi
+
+ public void setOrigin(@javax.annotation.Nonnull Location location) {
+ this.origin = location.toVector();
+@@ -1034,6 +1035,13 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource {
+ // Paper end - detailed watchdog information
+
+ public void move(MoverType movementType, Vec3 movement) {
++ // KeYi start
++ if (!boundingBoxChanged && movement.equals(Vec3.ZERO)) {
++ boundingBoxChanged = false;
++ return;
++ }
++ // KeYi end
++
+ // Paper start - detailed watchdog information
+ io.papermc.paper.util.TickThread.ensureTickThread("Cannot move an entity off-main");
+ synchronized (this.posLock) {
+@@ -3824,6 +3832,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource {
+ }
+
+ public final void setBoundingBox(AABB boundingBox) {
++ if (!this.bb.equals(boundingBox)) boundingBoxChanged = true; // KeYi
+ // CraftBukkit start - block invalid bounding boxes
+ double minX = boundingBox.minX,
+ minY = boundingBox.minY,
diff --git a/patches/server/0028-Petal-Reduce-sensor-work.patch b/patches/server/0036-Petal-Reduce-sensor-work.patch
similarity index 76%
rename from patches/server/0028-Petal-Reduce-sensor-work.patch
rename to patches/server/0036-Petal-Reduce-sensor-work.patch
index c2c5bf25..57cdc48c 100644
--- a/patches/server/0028-Petal-Reduce-sensor-work.patch
+++ b/patches/server/0036-Petal-Reduce-sensor-work.patch
@@ -10,17 +10,19 @@ this patch is focused around the sensors used for ai
delete the line of sight cache less often and use a faster nearby comparison
diff --git a/src/main/java/net/minecraft/world/entity/Mob.java b/src/main/java/net/minecraft/world/entity/Mob.java
-index 27fc50571305132c86497fcb1d5b1bb514610a4e..f1a33fd186fa9c10ac99b7b0e6379902a10dfb14 100644
+index 94b45579dc371ee980565aed2f5dee78ebd44427..48746d84f18cc8ee2f57785c65a5659ced454d39 100644
--- a/src/main/java/net/minecraft/world/entity/Mob.java
+++ b/src/main/java/net/minecraft/world/entity/Mob.java
-@@ -867,8 +867,8 @@ public abstract class Mob extends LivingEntity {
+@@ -873,10 +873,10 @@ public abstract class Mob extends LivingEntity {
return;
}
// Paper end
-- this.sensing.tick();
-- int i = this.level.getServer().getTickCount() + this.getId();
+ int i = this.level.getServer().getTickCount() + this.getId(); // petal - move up
+ this.level.getProfiler().push("sensing");
+- this.sensing.tick();
+ if (i % 10 == 0) this.sensing.tick(); // petal - only refresh line of sight cache every half second
+ this.level.getProfiler().pop();
+- int i = this.level.getServer().getTickCount() + this.getId();
if (i % 2 != 0 && this.tickCount > 1) {
- this.targetSelector.tickRunningGoals(false);
+ this.level.getProfiler().push("targetSelector");