1 Commits

Author SHA1 Message Date
7777777-4547
348145c456 Branch develop/1.19.3 backup
2023/1/14
2023-01-27 18:49:11 +08:00
36 changed files with 1050 additions and 2536 deletions

View File

@@ -1,10 +1,11 @@
<img src="https://user-images.githubusercontent.com/83630775/196994084-2c53ac23-f4be-4b90-b6fc-1b0ba65ea1b8.png" alt="KeYi's logo" align="right" width="400">
<div align="left">
<h4>Also available in: <a href="https://github.com/KeYiMC/KeYi/blob/develop/1.19.3/README_ZH.md">中文</a></h4>
<h4>Also available in <a href="https://github.com/KeYiMC/KeYi/blob/develop/1.19.3/README_ZH.md">中文</a></h4>
<h1>KeYi</h1>
<h3>⚡ The next generation Minecraft server software aims to the balance of performance and stability.</h3>
<h3>⚡ The next generation Minecraft server software that aims to keep the balance between performance and stability.</h3>
<h5>This project is still under heavy development, use it at your own risk!</h5>
<i><h5>KeYi, is the Chinese word "可以", means some thing is very OK!</h5></i>
<i><h5>KeYi, which is from a Chinese word "可以", means some thing is very OK!</h5></i>
[![Discord](https://img.shields.io/discord/1030133252134027304?color=%235865f2&label=Discord&logo=discord&logoColor=white&style=for-the-badge)](https://discord.gg/Sm2NsY5dpV)
[![Tencent QQ](https://img.shields.io/badge/Tencent%23QQ-%2312B7F5?style=for-the-badge&logo=tencentqq&logoColor=white)](https://jq.qq.com/?_wv=1027&k=tNDYZa7z)
@@ -14,27 +15,27 @@
The answer is quite simple.
The existing forks doesn't meet up what our requires, so we made up a small team and created this fork.
The existing forks don't meet up what we requires, so we made up a small team and created this fork.
# Roadmap
As you can see, this fork is designed to be stable and well supported Purpur fork, but also gain some performance improvements.
As you can see, this fork is designed to be stable and well supported Purpur fork, but it also gain some performance improvements.
The improvements of the API is also being valued, so we will try our best to work on it.
# Versioning
| Version | Support Status | Download |
| ------- | ------------------------------- | ------------------------------------------------------------ |
| 1.18.2 | ❌ | Not exists. |
| 1.19.2 | ✔️ LTS version, will be end at 2023-2-1. | [main](https://github.com/KeYiMC/KeYi/releases/tag/main-1.19.2), [develop](https://github.com/KeYiMC/KeYi/releases/tag/develop-1.19.2). |
| 1.19.3 | ✔️ | [main](https://github.com/KeYiMC/KeYi/releases/tag/main-1.19.3), [develop](https://github.com/KeYiMC/KeYi/releases/tag/develop-1.19.3). |
| Version | Support Status | Download |
| ------- | ------------------------------------------------------ | ------------------------------------------------------------ |
| 1.18.2 | ❌ | Not exists. |
| 1.19.2 | ✔️ LTS version, will end being supported at 2023-02-01. | [main](https://github.com/KeYiMC/KeYi/releases/tag/main-1.19.2), [develop](https://github.com/KeYiMC/KeYi/releases/tag/develop-1.19.2). |
| 1.19.3 | ✔️ | [main](https://github.com/KeYiMC/KeYi/releases/tag/main-1.19.3), [develop](https://github.com/KeYiMC/KeYi/releases/tag/develop-1.19.3). |
# API
### Maven
#### Adding repository
#### Add repository
```xml
<repository>
@@ -43,7 +44,7 @@ The improvements of the API is also being valued, so we will try our best to wor
</repository>
```
#### Adding dependency
#### Add dependency
```xml
<dependency>
@@ -56,7 +57,7 @@ The improvements of the API is also being valued, so we will try our best to wor
### Gradle
#### Adding repository
#### Add repository
```groovy
repositories {
@@ -64,7 +65,7 @@ repositories {
}
```
#### Adding dependency
#### Add dependency
```groovy
dependencies {
@@ -76,4 +77,10 @@ dependencies {
Unfortunately, the rules of our community haven't been finished yet.
So at this time, if you want to contribute, you need to talk with us on Discord or Tencent QQ.
So at this time, if you want to contribute, you have to communicate with us on Discord or Tencent QQ.
# Special Thanks To
[<img src="https://user-images.githubusercontent.com/21148213/121807008-8ffc6700-cc52-11eb-96a7-2f6f260f8fda.png" alt="" width="150">](https://www.jetbrains.com)
[JetBrains](https://www.jetbrains.com/), creators of the IntelliJ IDEA, supports KeYi with one of their [Open Source Licenses](https://www.jetbrains.com/opensource/). IntelliJ IDEA is the recommended IDE for working with KeYi, and most of the KeYi team uses it.

View File

@@ -4,7 +4,7 @@ plugins {
java
`maven-publish`
id("com.github.johnrengelman.shadow") version "7.1.2" apply false
id("io.papermc.paperweight.patcher") version "1.3.11"
id("io.papermc.paperweight.patcher") version "1.4.1"
}
val paperMavenPublicUrl = "https://repo.papermc.io/repository/maven-public/"

View File

@@ -1,7 +1,7 @@
group = cc.keyimc.keyi
version = 1.19.3-R0.1-SNAPSHOT
purpurCommit = 78e9a806d3fb2e17bf85f5457e2004a2478ed747
purpurCommit = 970670bb08755a49371efc6b0c917b64175917ed
org.gradle.caching = true
org.gradle.parallel = true

View File

@@ -7,7 +7,7 @@ Original code by lynxplay, licensed under GNU General Public License v3.0
You can find the original code on https://github.com/lynxplay/ktp
diff --git a/src/main/java/org/bukkit/plugin/RegisteredListener.java b/src/main/java/org/bukkit/plugin/RegisteredListener.java
index 419aec56b0e3fa8bcec2ea7f340caa3456b57d00..8530d926931a54ed1300c40cd1e0908b2d9b594d 100644
index 3b3d9642a8d63798dc28f2f8df77f0466451cbff..8d3605f25e97a375971705c737bc7bacbac045cd 100644
--- a/src/main/java/org/bukkit/plugin/RegisteredListener.java
+++ b/src/main/java/org/bukkit/plugin/RegisteredListener.java
@@ -62,8 +62,10 @@ public class RegisteredListener {
@@ -24,10 +24,10 @@ index 419aec56b0e3fa8bcec2ea7f340caa3456b57d00..8530d926931a54ed1300c40cd1e0908b
}
}
diff --git a/src/main/java/org/bukkit/plugin/SimplePluginManager.java b/src/main/java/org/bukkit/plugin/SimplePluginManager.java
index 6bb115923767c4bd65b18e67eeff5408f2894ab0..b0e11ed48e06abd585bd9dded52945562a8c6830 100644
index 75be5cdfeb30732975bbc38dc7aab52a0cdead9c..37b42f155f7e1f743ea49d957123f2dc05f3b3fd 100644
--- a/src/main/java/org/bukkit/plugin/SimplePluginManager.java
+++ b/src/main/java/org/bukkit/plugin/SimplePluginManager.java
@@ -660,11 +660,15 @@ public final class SimplePluginManager implements PluginManager {
@@ -662,11 +662,15 @@ public final class SimplePluginManager implements PluginManager {
@Override
public void callEvent(@NotNull Event event) {
// Paper - replace callEvent by merging to below method

View File

@@ -1,7 +1,7 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: nostalgic853 <yuu8583@proton.me>
Date: Mon, 24 Oct 2022 23:28:31 +0800
Subject: [PATCH] Revert purpur "Remove Timings"
Subject: [PATCH] Revert purpur "Remove Profilers"
This reverts commit 0004242a19885c29a4cf68c510411ed70cf6e439.

View File

@@ -5,10 +5,10 @@ Subject: [PATCH] Maven publishing
diff --git a/build.gradle.kts b/build.gradle.kts
index 051b2db3548d1b24f591f05eece0c8241475e9bf..85e30cd20f0f8534724ce4e309e28ef0031f683c 100644
index 5c8dd4d3313a791d1fee00ec5d4bc595b76b7d6d..4d09fbd6e8205469cc438e922088e293a5dc6851 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
@@ -145,3 +145,24 @@ tasks.check {
@@ -153,3 +153,24 @@ tasks.check {
dependsOn(scanJar)
}
// Paper end

View File

@@ -5,7 +5,7 @@ Subject: [PATCH] Player Skull API
diff --git a/src/main/java/org/bukkit/entity/Player.java b/src/main/java/org/bukkit/entity/Player.java
index d13f8f7f5afb772514804ef78e2c704964c3cbd8..52dc40bc7cea12e657885b011a002cb89db00f33 100644
index f65a860d09d9f1d5045b2af63a80109e7c1c4ddf..0b275a9d5a3977d44fc79011de8a5c98bdc0cbef 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;
@@ -18,7 +18,7 @@ index d13f8f7f5afb772514804ef78e2c704964c3cbd8..52dc40bc7cea12e657885b011a002cb8
import com.destroystokyo.paper.ClientOption; // Paper
import com.destroystokyo.paper.Title; // Paper
import net.kyori.adventure.text.Component;
@@ -3071,4 +3074,22 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
@@ -3063,4 +3066,22 @@ public interface Player extends HumanEntity, Conversable, OfflinePlayer, PluginM
*/
void sendDeathScreen(@NotNull Component message, @Nullable Entity killer);
// Purpur end

View File

@@ -1,12 +1,12 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: nostalgic853 <yuu8583@proton.me>
Date: Fri, 9 Dec 2022 23:13:43 +0800
Subject: [PATCH] Revert "Spark Profiler"
Subject: [PATCH] Remove "Spark Profiler"
This reverts commit 2f3f630834d34ee625be79fac6bc429d0e10d929.
diff --git a/src/main/java/org/bukkit/plugin/SimplePluginManager.java b/src/main/java/org/bukkit/plugin/SimplePluginManager.java
index 2843545c6281da1f47e24431023c56e9592cef16..08f5892f175b898e3aa5cfc7de6639b818330927 100644
index 37b42f155f7e1f743ea49d957123f2dc05f3b3fd..ba869354adc59db2fc547c481c1ed4d5d0af23b7 100644
--- a/src/main/java/org/bukkit/plugin/SimplePluginManager.java
+++ b/src/main/java/org/bukkit/plugin/SimplePluginManager.java
@@ -167,12 +167,6 @@ public final class SimplePluginManager implements PluginManager {

View File

@@ -1,116 +0,0 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: MartijnMuijsers <martijnmuijsers@live.nl>
Date: Tue, 29 Nov 2022 12:35:35 +0100
Subject: [PATCH] Add centralized AsyncExecutor
This patch was taken from Gale.
diff --git a/src/main/java/org/galemc/gale/concurrent/AsyncExecutor.java b/src/main/java/org/galemc/gale/concurrent/AsyncExecutor.java
new file mode 100644
index 0000000000000000000000000000000000000000..de182b9473963b95085fa612f70884a56765ae43
--- /dev/null
+++ b/src/main/java/org/galemc/gale/concurrent/AsyncExecutor.java
@@ -0,0 +1,103 @@
+// Gale - centralized async execution
+
+package org.galemc.gale.concurrent;
+
+import com.google.common.util.concurrent.ThreadFactoryBuilder;
+import net.minecraft.Util;
+import org.galemc.gale.util.CPUCoresEstimation;
+
+import java.util.concurrent.BlockingQueue;
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.locks.Condition;
+import java.util.concurrent.locks.ReentrantLock;
+
+/**
+ * An executor for tasks that can run asynchronously. This executor uses a fixed thread pool, and as such
+ * is not appropriate for tasks that block.
+ * <br>
+ * It can be paused when all CPU cores may be needed for something else.
+ *
+ * @author Martijn Muijsers
+ */
+public final class AsyncExecutor extends ThreadPoolExecutor {
+
+ /**
+ * The fixed number of threads that will be used by this {@link AsyncExecutor}.
+ * <br>
+ * By default, we do not use two cores, so that there is always a core for the main thread that we do not use,
+ * and another core that we do not use to run other important threads such as garbage collection on.
+ * <br>
+ * This value is at least 1.
+ */
+ public static final int parallelism;
+ static {
+ int parallelismByEnvironmentVariable = Integer.getInteger("gale.threads.async", -1);
+ parallelism = Math.max(1, parallelismByEnvironmentVariable > 0 ? parallelismByEnvironmentVariable : CPUCoresEstimation.get() - 2);
+ }
+
+ /**
+ * The queue of tasks in the {@link AsyncExecutor} singleton instance.
+ * This queue can be accessed externally to steal work from the executor.
+ */
+ public static final BlockingQueue<Runnable> queue = new LinkedBlockingQueue<>();
+
+ /**
+ * Singleton {@link AsyncExecutor} instance.
+ */
+ public static final AsyncExecutor instance = new AsyncExecutor();
+
+ private static volatile boolean isPaused = false;
+ private static final ReentrantLock pauseLock = new ReentrantLock();
+ private static final Condition pauseCondition = pauseLock.newCondition();
+
+ private AsyncExecutor() {
+ super(parallelism, parallelism, 0L, TimeUnit.MILLISECONDS, queue, new ThreadFactoryBuilder()
+ .setNameFormat("Async Executor Thread - %1$d")
+ .setPriority(Thread.NORM_PRIORITY - 1) // Deprioritize over main
+ .setUncaughtExceptionHandler(Util::onThreadException)
+ .build());
+ }
+
+ @Override
+ protected void beforeExecute(Thread t, Runnable r) {
+ super.beforeExecute(t, r);
+ pauseLock.lock();
+ try {
+ while (isPaused) pauseCondition.await();
+ } catch (InterruptedException ie) {
+ t.interrupt();
+ } finally {
+ pauseLock.unlock();
+ }
+ }
+
+ /**
+ * Pauses the {@link AsyncExecutor} from starting to run any new task until {@link #resume()} is called.
+ * <br>
+ * This does not affect execution of tasks that are already being performed when this method is called.
+ */
+ public static void pause() {
+ pauseLock.lock();
+ try {
+ isPaused = true;
+ } finally {
+ pauseLock.unlock();
+ }
+ }
+
+ /**
+ * Resumes the {@link AsyncExecutor} singleton instance after it has been paused using {@link #pause()}.
+ */
+ public static void resume() {
+ pauseLock.lock();
+ try {
+ isPaused = false;
+ pauseCondition.signalAll();
+ } finally {
+ pauseLock.unlock();
+ }
+ }
+
+}

View File

@@ -1,70 +0,0 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: MartijnMuijsers <martijnmuijsers@live.nl>
Date: Tue, 29 Nov 2022 13:10:20 +0100
Subject: [PATCH] Remove Paper async executor
License: AGPL-3.0 (https://www.gnu.org/licenses/agpl-3.0.html)
This patch was taken from Gale.
diff --git a/src/main/java/io/papermc/paper/util/MCUtil.java b/src/main/java/io/papermc/paper/util/MCUtil.java
index b5d4c53bf1046fa52da5398491258b94f1e0fcd0..d5f6fc421bea74b711f99fc14ff916643bfe071a 100644
--- a/src/main/java/io/papermc/paper/util/MCUtil.java
+++ b/src/main/java/io/papermc/paper/util/MCUtil.java
@@ -34,6 +34,7 @@ import org.bukkit.Location;
import org.bukkit.block.BlockFace;
import org.bukkit.craftbukkit.CraftWorld;
import org.bukkit.craftbukkit.util.Waitable;
+import org.galemc.gale.concurrent.AsyncExecutor;
import org.spigotmc.AsyncCatcher;
import javax.annotation.Nonnull;
@@ -45,6 +46,7 @@ import java.util.Queue;
import java.util.Set;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Executor;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
@@ -55,14 +57,7 @@ import java.util.function.Consumer;
import java.util.function.Supplier;
public final class MCUtil {
- public static final ThreadPoolExecutor asyncExecutor = new ThreadPoolExecutor(
- 0, 2, 60L, TimeUnit.SECONDS,
- new LinkedBlockingQueue<>(),
- new ThreadFactoryBuilder()
- .setNameFormat("Paper Async Task Handler Thread - %1$d")
- .setUncaughtExceptionHandler(new net.minecraft.DefaultUncaughtExceptionHandlerWithName(MinecraftServer.LOGGER))
- .build()
- );
+ public static final Executor asyncExecutor = AsyncExecutor.instance; // Gale - centralized async execution - remove Paper async executor
public static final ThreadPoolExecutor cleanerExecutor = new ThreadPoolExecutor(
1, 1, 0L, TimeUnit.SECONDS,
new LinkedBlockingQueue<>(),
diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java
index ae95e3af64811f6f149a01b9715d8fdd2c2583fa..462689f5c35c5379a0281fe61ad91ae3288d279d 100644
--- a/src/main/java/net/minecraft/server/MinecraftServer.java
+++ b/src/main/java/net/minecraft/server/MinecraftServer.java
@@ -155,6 +155,7 @@ import net.minecraft.world.phys.Vec2;
import net.minecraft.world.phys.Vec3;
import org.apache.commons.lang3.Validate;
import org.slf4j.Logger;
+import org.galemc.gale.concurrent.AsyncExecutor; // Gale
// CraftBukkit start
import com.mojang.serialization.DynamicOps;
@@ -993,8 +994,10 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
MinecraftServer.LOGGER.error("Failed to unlock level {}", this.storageSource.getLevelId(), ioexception1);
}
// Spigot start
- io.papermc.paper.util.MCUtil.asyncExecutor.shutdown(); // Paper
- try { io.papermc.paper.util.MCUtil.asyncExecutor.awaitTermination(30, java.util.concurrent.TimeUnit.SECONDS); // Paper
+ // Gale start - centralized async execution - remove Paper async executor
+ AsyncExecutor.instance.shutdown(); // Paper
+ try { AsyncExecutor.instance.awaitTermination(30, java.util.concurrent.TimeUnit.SECONDS); // Paper
+ // Gale end - centralized async execution - remove Paper async executor
} catch (java.lang.InterruptedException ignored) {} // Paper
if (org.spigotmc.SpigotConfig.saveUserCacheOnStopOnly) {
MinecraftServer.LOGGER.info("Saving usercache.json");

View File

@@ -1,29 +0,0 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: MartijnMuijsers <martijnmuijsers@live.nl>
Date: Tue, 29 Nov 2022 13:11:58 +0100
Subject: [PATCH] Remove Paper cleaner executor
License: AGPL-3.0 (https://www.gnu.org/licenses/agpl-3.0.html)
This patch was taken from Gale.
diff --git a/src/main/java/io/papermc/paper/util/MCUtil.java b/src/main/java/io/papermc/paper/util/MCUtil.java
index d5f6fc421bea74b711f99fc14ff916643bfe071a..c6c1b194fdee8841a7745b5ee3ef14e416df02d3 100644
--- a/src/main/java/io/papermc/paper/util/MCUtil.java
+++ b/src/main/java/io/papermc/paper/util/MCUtil.java
@@ -58,14 +58,7 @@ import java.util.function.Supplier;
public final class MCUtil {
public static final Executor asyncExecutor = AsyncExecutor.instance; // Gale - centralized async execution - remove Paper async executor
- public static final ThreadPoolExecutor cleanerExecutor = new ThreadPoolExecutor(
- 1, 1, 0L, TimeUnit.SECONDS,
- new LinkedBlockingQueue<>(),
- new ThreadFactoryBuilder()
- .setNameFormat("Paper Object Cleaner")
- .setUncaughtExceptionHandler(new net.minecraft.DefaultUncaughtExceptionHandlerWithName(MinecraftServer.LOGGER))
- .build()
- );
+ public static final Executor cleanerExecutor = AsyncExecutor.instance; // Gale - centralized async execution - remove Paper cleaner executor
public static final long INVALID_CHUNK_KEY = getCoordinateKey(Integer.MAX_VALUE, Integer.MAX_VALUE);

View File

@@ -1,80 +0,0 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: MartijnMuijsers <martijnmuijsers@live.nl>
Date: Tue, 29 Nov 2022 14:21:44 +0100
Subject: [PATCH] Remove background executor
License: AGPL-3.0 (https://www.gnu.org/licenses/agpl-3.0.html)
This patch was taken from Gale.
diff --git a/src/main/java/net/minecraft/Util.java b/src/main/java/net/minecraft/Util.java
index 6b7943e8348b0a41ca69fb56ccfd5f1c1484eb07..e14245a77b40fca4bacf82295ad390339aba08a9 100644
--- a/src/main/java/net/minecraft/Util.java
+++ b/src/main/java/net/minecraft/Util.java
@@ -72,6 +72,7 @@ import net.minecraft.util.RandomSource;
import net.minecraft.util.TimeSource;
import net.minecraft.util.datafix.DataFixers;
import net.minecraft.world.level.block.state.properties.Property;
+import org.galemc.gale.concurrent.AsyncExecutor;
import org.slf4j.Logger;
public class Util {
@@ -80,7 +81,7 @@ public class Util {
private static final String MAX_THREADS_SYSTEM_PROPERTY = "max.bg.threads";
private static final AtomicInteger WORKER_COUNT = new AtomicInteger(1);
private static final ExecutorService BOOTSTRAP_EXECUTOR = makeExecutor("Bootstrap", -2); // Paper - add -2 priority
- private static final ExecutorService BACKGROUND_EXECUTOR = makeExecutor("Main", -1); // Paper - add -1 priority
+ private static final ExecutorService BACKGROUND_EXECUTOR = AsyncExecutor.instance; // Gale - centralized async execution - remove background executor
// Paper start - don't submit BLOCKING PROFILE LOOKUPS to the world gen thread
public static final ExecutorService PROFILE_EXECUTOR = Executors.newFixedThreadPool(2, new java.util.concurrent.ThreadFactory() {
@@ -219,7 +220,6 @@ public class Util {
}
public static void shutdownExecutors() {
- shutdownExecutor(BACKGROUND_EXECUTOR);
shutdownExecutor(IO_POOL);
}
diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java
index 462689f5c35c5379a0281fe61ad91ae3288d279d..b77b1bc9a5ce1373ff5c5aacc3f4c68c1c735849 100644
--- a/src/main/java/net/minecraft/server/MinecraftServer.java
+++ b/src/main/java/net/minecraft/server/MinecraftServer.java
@@ -994,11 +994,6 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
MinecraftServer.LOGGER.error("Failed to unlock level {}", this.storageSource.getLevelId(), ioexception1);
}
// Spigot start
- // Gale start - centralized async execution - remove Paper async executor
- AsyncExecutor.instance.shutdown(); // Paper
- try { AsyncExecutor.instance.awaitTermination(30, java.util.concurrent.TimeUnit.SECONDS); // Paper
- // Gale end - centralized async execution - remove Paper async executor
- } catch (java.lang.InterruptedException ignored) {} // Paper
if (org.spigotmc.SpigotConfig.saveUserCacheOnStopOnly) {
MinecraftServer.LOGGER.info("Saving usercache.json");
this.getProfileCache().save(false); // Paper
@@ -1008,6 +1003,13 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
LOGGER.info("Flushing Chunk IO");
io.papermc.paper.chunk.system.io.RegionFileIOThread.close(true); // Paper // Paper - rewrite chunk system
LOGGER.info("Closing Thread Pool");
+ // Gale start - centralized async execution - remove Paper async executor, remove background executor
+ AsyncExecutor.instance.shutdown(); // Paper
+ try {
+ AsyncExecutor.instance.awaitTermination(30, java.util.concurrent.TimeUnit.SECONDS); // Paper
+ // Gale end - centralized async execution - remove Paper async executor
+ } catch (java.lang.InterruptedException ignored) {} // Paper
+ // Gale start - centralized async execution - remove background executor
Util.shutdownExecutors(); // Paper
LOGGER.info("Closing Server");
try {
diff --git a/src/main/java/org/galemc/gale/concurrent/AsyncExecutor.java b/src/main/java/org/galemc/gale/concurrent/AsyncExecutor.java
index de182b9473963b95085fa612f70884a56765ae43..fff4549d86e672dc7b9959ac5dd51fd04d4d62c3 100644
--- a/src/main/java/org/galemc/gale/concurrent/AsyncExecutor.java
+++ b/src/main/java/org/galemc/gale/concurrent/AsyncExecutor.java
@@ -34,6 +34,7 @@ public final class AsyncExecutor extends ThreadPoolExecutor {
public static final int parallelism;
static {
int parallelismByEnvironmentVariable = Integer.getInteger("gale.threads.async", -1);
+ parallelismByEnvironmentVariable = Math.max(parallelismByEnvironmentVariable, Integer.getInteger("Paper.WorkerThreadCount", -1)); // Gale - centralized async execution - remove background executor
parallelism = Math.max(1, parallelismByEnvironmentVariable > 0 ? parallelismByEnvironmentVariable : CPUCoresEstimation.get() - 2);
}

View File

@@ -1,29 +0,0 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: MartijnMuijsers <martijnmuijsers@live.nl>
Date: Tue, 29 Nov 2022 01:23:49 +0100
Subject: [PATCH] Remove bootstrap executor
License: GPL-3.0 (https://www.gnu.org/licenses/gpl-3.0.html)
This patch was taken from Gale.
This patch is based on the following patch:
"completely remove bootstrapExecutor"
By: foss-mc <69294560+foss-mc@users.noreply.github.com>
As part of: Patina (https://github.com/PatinaMC/Patina)
Licensed under: GPL-3.0 (https://www.gnu.org/licenses/gpl-3.0.html)
diff --git a/src/main/java/net/minecraft/Util.java b/src/main/java/net/minecraft/Util.java
index e14245a77b40fca4bacf82295ad390339aba08a9..d84c721ed64cf927ccc9884235b22414298ce3ed 100644
--- a/src/main/java/net/minecraft/Util.java
+++ b/src/main/java/net/minecraft/Util.java
@@ -80,8 +80,8 @@ public class Util {
private static final int DEFAULT_MAX_THREADS = 255;
private static final String MAX_THREADS_SYSTEM_PROPERTY = "max.bg.threads";
private static final AtomicInteger WORKER_COUNT = new AtomicInteger(1);
- private static final ExecutorService BOOTSTRAP_EXECUTOR = makeExecutor("Bootstrap", -2); // Paper - add -2 priority
private static final ExecutorService BACKGROUND_EXECUTOR = AsyncExecutor.instance; // Gale - centralized async execution - remove background executor
+ private static final ExecutorService BOOTSTRAP_EXECUTOR = BACKGROUND_EXECUTOR; // Gale - Patina - remove bootstrap executor
// Paper start - don't submit BLOCKING PROFILE LOOKUPS to the world gen thread
public static final ExecutorService PROFILE_EXECUTOR = Executors.newFixedThreadPool(2, new java.util.concurrent.ThreadFactory() {

View File

@@ -1,41 +0,0 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: MartijnMuijsers <martijnmuijsers@live.nl>
Date: Tue, 29 Nov 2022 14:44:23 +0100
Subject: [PATCH] Remove world upgrade executors
License: AGPL-3.0 (https://www.gnu.org/licenses/agpl-3.0.html)
This patch was taken from Gale.
diff --git a/src/main/java/io/papermc/paper/world/ThreadedWorldUpgrader.java b/src/main/java/io/papermc/paper/world/ThreadedWorldUpgrader.java
index 95cac7edae8ac64811fc6a2f6b97dd4a0fceb0b0..29a33ec067b9f47a7a86cce90316e1837d7d8612 100644
--- a/src/main/java/io/papermc/paper/world/ThreadedWorldUpgrader.java
+++ b/src/main/java/io/papermc/paper/world/ThreadedWorldUpgrader.java
@@ -18,6 +18,8 @@ import net.minecraft.world.level.storage.DimensionDataStorage;
import net.minecraft.world.level.storage.LevelStorageSource;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
+import org.galemc.gale.concurrent.AsyncExecutor;
+
import java.io.File;
import java.io.IOException;
import java.text.DecimalFormat;
@@ -46,6 +48,10 @@ public class ThreadedWorldUpgrader {
this.dimensionType = dimensionType;
this.worldName = worldName;
this.worldDir = worldDir;
+ // Gale start - centralized async execution - remove world upgrade executors
+ this.threadPool = AsyncExecutor.instance;
+ /*
+ // Gale end - centralized async execution - remove world upgrade executors
this.threadPool = Executors.newFixedThreadPool(Math.max(1, threads), new ThreadFactory() {
private final AtomicInteger threadCounter = new AtomicInteger();
@@ -61,6 +67,7 @@ public class ThreadedWorldUpgrader {
return ret;
}
});
+ */ // Gale - centralized async execution - remove world upgrade executors
this.dataFixer = dataFixer;
this.generatorKey = generatorKey;
this.removeCaches = removeCaches;

View File

@@ -1,31 +0,0 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: MartijnMuijsers <martijnmuijsers@live.nl>
Date: Tue, 29 Nov 2022 14:58:26 +0100
Subject: [PATCH] Remove tab complete executor
License: AGPL-3.0 (https://www.gnu.org/licenses/agpl-3.0.html)
This patch was taken from Gale.
diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
index 103616e0dd5f7a5517eb20529263ac3ca06dd786..5a5d3b810f259725329dd90112d74c7f2d093c47 100644
--- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
+++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
@@ -186,6 +186,7 @@ import net.minecraft.world.phys.shapes.Shapes;
import net.minecraft.world.phys.shapes.VoxelShape;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
+import org.galemc.gale.concurrent.AsyncExecutor; // Gale
// CraftBukkit start
import io.papermc.paper.adventure.ChatProcessor; // Paper
@@ -907,8 +908,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic
}
// Paper start
- private static final java.util.concurrent.ExecutorService TAB_COMPLETE_EXECUTOR = java.util.concurrent.Executors.newFixedThreadPool(4,
- new com.google.common.util.concurrent.ThreadFactoryBuilder().setDaemon(true).setNameFormat("Async Tab Complete Thread - #%d").setUncaughtExceptionHandler(new net.minecraft.DefaultUncaughtExceptionHandlerWithName(net.minecraft.server.MinecraftServer.LOGGER)).build());
+ private static final java.util.concurrent.ExecutorService TAB_COMPLETE_EXECUTOR = AsyncExecutor.instance; // Gale - centralized async execution - remove tab complete executor
// Paper end
@Override
public void handleCustomCommandSuggestions(ServerboundCommandSuggestionPacket packet) {

View File

@@ -1,30 +0,0 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: MartijnMuijsers <martijnmuijsers@live.nl>
Date: Tue, 29 Nov 2022 15:15:10 +0100
Subject: [PATCH] Remove text filter executor
License: AGPL-3.0 (https://www.gnu.org/licenses/agpl-3.0.html)
This patch was taken from Gale.
diff --git a/src/main/java/net/minecraft/server/network/TextFilterClient.java b/src/main/java/net/minecraft/server/network/TextFilterClient.java
index 92a60fc35145b7dd5fe17ea9b6823a919f483945..5922f569dcb6ecdacc9862749b393386a82c69fb 100644
--- a/src/main/java/net/minecraft/server/network/TextFilterClient.java
+++ b/src/main/java/net/minecraft/server/network/TextFilterClient.java
@@ -32,6 +32,7 @@ import net.minecraft.Util;
import net.minecraft.network.chat.FilterMask;
import net.minecraft.util.GsonHelper;
import net.minecraft.util.thread.ProcessorMailbox;
+import org.galemc.gale.concurrent.AsyncExecutor;
import org.slf4j.Logger;
public class TextFilterClient implements AutoCloseable {
@@ -62,7 +63,7 @@ public class TextFilterClient implements AutoCloseable {
this.joinEncoder = joinEncoder;
this.leaveEndpoint = leaveEndpoint;
this.leaveEncoder = leaveEncoder;
- this.workerPool = Executors.newFixedThreadPool(parallelism, THREAD_FACTORY);
+ this.workerPool = AsyncExecutor.instance; // Gale - centralized async execution - remove text filter executor
}
private static URL getEndpoint(URI root, @Nullable JsonObject endpoints, String key, String fallback) throws MalformedURLException {

View File

@@ -1,417 +0,0 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: nostalgic853 <yuu8583@proton.me>
Date: Thu, 20 Oct 2022 14:43:33 +0800
Subject: [PATCH] Use our logo instead of Purpur's
diff --git a/src/main/resources/logo.png b/src/main/resources/logo.png
index 35ae7a94cebd4a9a16fc9112ccc248fa3cac5f32..91b436cf7e6e17b8e64edfe858034d068ac63a4f 100644
GIT binary patch
literal 3948
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
JIe%fnzW@s>?*RY+
literal 17292
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
SDfV^%0000<MNUMnLSTXhlS0b?

View File

@@ -5,7 +5,7 @@ Subject: [PATCH] Rebrand
diff --git a/build.gradle.kts b/build.gradle.kts
index 7de4b51cb4afdcbdfb8d1dc32f56252d997e23a8..3ffa404efaac294d60c8430266f47dcbfb6d1592 100644
index d5b7458f6b79addf1a12eb82443ba5bdbe2ea5d3..0cc1db1138e2d34eaee62ec60c506d03497d3613 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
@@ -7,7 +7,7 @@ plugins {
@@ -14,10 +14,10 @@ index 7de4b51cb4afdcbdfb8d1dc32f56252d997e23a8..3ffa404efaac294d60c8430266f47dcb
dependencies {
- implementation(project(":purpur-api")) // Purpur
+ implementation(project(":keyi-api")) // Purpur // KeYi
// Pufferfish start
implementation("io.papermc.paper:paper-mojangapi:1.19.3-R0.1-SNAPSHOT") {
exclude("io.papermc.paper", "paper-api")
}
@@ -60,13 +60,13 @@ tasks.jar {
@@ -77,13 +77,13 @@ tasks.jar {
manifest {
val git = Git(rootProject.layout.projectDirectory.path)
val gitHash = git("rev-parse", "--short=7", "HEAD").getText().trim()
@@ -34,7 +34,7 @@ index 7de4b51cb4afdcbdfb8d1dc32f56252d997e23a8..3ffa404efaac294d60c8430266f47dcb
"Specification-Title" to "Bukkit",
"Specification-Version" to project.version,
diff --git a/src/main/java/com/destroystokyo/paper/Metrics.java b/src/main/java/com/destroystokyo/paper/Metrics.java
index acd95cf1dc7f009b63e44e4404e1736283fd458e..3436a377f9c11d8f2a39af65c3370861fedb1b87 100644
index 9713263c3bd34ab8a3bfc0a8797ba0b1b88ed733..16a2186222209876785d53ce7dcf6d601bf2f746 100644
--- a/src/main/java/com/destroystokyo/paper/Metrics.java
+++ b/src/main/java/com/destroystokyo/paper/Metrics.java
@@ -593,7 +593,7 @@ public class Metrics {
@@ -50,8 +50,8 @@ index acd95cf1dc7f009b63e44e4404e1736283fd458e..3436a377f9c11d8f2a39af65c3370861
metrics.addCustomChart(new Metrics.SingleLineChart("players", () -> Bukkit.getOnlinePlayers().size()));
metrics.addCustomChart(new Metrics.SimplePie("online_mode", () -> Bukkit.getOnlineMode() ? "online" : (io.papermc.paper.configuration.GlobalConfiguration.get().proxies.isProxyOnlineMode() ? "bungee" : "offline"))); // Purpur
- metrics.addCustomChart(new Metrics.SimplePie("purpur_version", () -> (Metrics.class.getPackage().getImplementationVersion() != null) ? Metrics.class.getPackage().getImplementationVersion() : "unknown")); // Purpur
+ metrics.addCustomChart(new Metrics.SimplePie("keyi_version", () -> (Metrics.class.getPackage().getImplementationVersion() != null) ? Metrics.class.getPackage().getImplementationVersion() : "unknown")); // Purpur // KeYi
- metrics.addCustomChart(new Metrics.SimplePie("purpur_version", () -> (org.bukkit.craftbukkit.Main.class.getPackage().getImplementationVersion() != null) ? org.bukkit.craftbukkit.Main.class.getPackage().getImplementationVersion() : "unknown")); // Purpur
+ metrics.addCustomChart(new Metrics.SimplePie("keyi_version", () -> (org.bukkit.craftbukkit.Main.class.getPackage().getImplementationVersion() != null) ? org.bukkit.craftbukkit.Main.class.getPackage().getImplementationVersion() : "unknown")); // Purpur // KeYi
metrics.addCustomChart(new Metrics.DrilldownPie("java_version", () -> {
Map<String, Map<String, Integer>> map = new HashMap<>();
@@ -166,7 +166,7 @@ index fba5dbdb7bcbb55400ef18342c9b54612972a718..005983d56b283e54e2cf450f1e9f985a
private static int fetchDistanceFromSiteApi(int jenkinsBuild, @Nullable String siteApiVersion) {
diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
index 80d4167edd7c87240ce02ae122153976015d548a..120b798742b1a4524eefa4b5387a8ffc203e523c 100644
index b69634a5cf57e4086e644819f68638d6a2ab897c..4af2cc1f0df04cb4e1b44ac5a9f6391da0641d07 100644
--- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java
+++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
@@ -262,7 +262,7 @@ import javax.annotation.Nullable; // Paper
@@ -192,11 +192,11 @@ index fb87620c742ff7912f5e8ccd2a7930dd605576d9..d779212cbb719a1d923a24823135c5d3
if (stream != null) {
diff --git a/src/main/java/org/purpurmc/purpur/PurpurConfig.java b/src/main/java/org/purpurmc/purpur/PurpurConfig.java
index 76cbfb7e900bf2698776f54cfe498f4b42965221..cd60f79acdd2307bdae48a11d4f5ec3ff3fa225a 100644
index c7c0ed8dfe58c841faf684a1fe228eeda6cd57b7..0675f0633006c6e76294b7bb7e73c589510c97dd 100644
--- a/src/main/java/org/purpurmc/purpur/PurpurConfig.java
+++ b/src/main/java/org/purpurmc/purpur/PurpurConfig.java
@@ -244,7 +244,7 @@ public class PurpurConfig {
if (!TimingsManager.hiddenConfigs.contains("settings.seed")) TimingsManager.hiddenConfigs.add("settings.seed");
@@ -227,7 +227,7 @@ public class PurpurConfig {
deathMessageOnlyBroadcastToAffectedPlayer = getBoolean("settings.broadcasts.death.only-broadcast-to-affected-player", deathMessageOnlyBroadcastToAffectedPlayer);
}
- public static String serverModName = "Purpur";

View File

@@ -240,12 +240,12 @@ index 0000000000000000000000000000000000000000..510eea6066fb0743a9c561eb577de9d9
+ }
+}
diff --git a/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java b/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java
index 5b44f7512f21dba3f3306c7f42fa2d78e600847a..8fe0a9c2989016821ff673838c0041b38aff8fb2 100644
index 46858fb57f122033a68aeb4ad3943132a677fb46..5dde53bd71e7768ea898acca02fb18ce66ea2dff 100644
--- a/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java
+++ b/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java
@@ -232,6 +232,16 @@ public class DedicatedServer extends MinecraftServer implements ServerInterface
// Paper end
// gg.pufferfish.pufferfish.PufferfishConfig.pufferfishFile = (java.io.File) options.valueOf("pufferfish-settings"); // Purpur
@@ -234,6 +234,16 @@ public class DedicatedServer extends MinecraftServer implements ServerInterface
gg.pufferfish.pufferfish.PufferfishConfig.load(); // Pufferfish
gg.pufferfish.pufferfish.PufferfishCommand.init(); // Pufferfish
+ // KeYi start - init config
+ try {
@@ -261,7 +261,7 @@ index 5b44f7512f21dba3f3306c7f42fa2d78e600847a..8fe0a9c2989016821ff673838c0041b3
this.setFlightAllowed(dedicatedserverproperties.allowFlight);
this.setMotd(dedicatedserverproperties.motd);
diff --git a/src/main/java/org/bukkit/craftbukkit/Main.java b/src/main/java/org/bukkit/craftbukkit/Main.java
index 72810905cc50af204161a02872d599af4aba8dbb..175d75a929d219f24c78cabe1558b4ebd22e1235 100644
index 082d0516c80cf231dd7ceb454508bb77407c499b..9cf35ea1393ba68a2e6d1bb808d6be6497bc48f5 100644
--- a/src/main/java/org/bukkit/craftbukkit/Main.java
+++ b/src/main/java/org/bukkit/craftbukkit/Main.java
@@ -180,6 +180,14 @@ public class Main {

View File

@@ -14,10 +14,10 @@ doing questionable/buggy ones, and claiming breathtaking performance improvement
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 64b91d72fca05f2e74bcaf83bccf061a25a0c868..b0bb07c57e6219a21003bfce72b6909680ac78e5 100644
index 6b0e44f77c11e51a570de71b537f75c0dd942006..5d0f23a49658f3a260511f25d91c6c9180fef589 100644
--- a/src/main/java/net/minecraft/world/entity/Entity.java
+++ b/src/main/java/net/minecraft/world/entity/Entity.java
@@ -1163,7 +1163,14 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource {
@@ -1196,7 +1196,14 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource {
}
this.tryCheckInsideBlocks();

View File

@@ -30,7 +30,7 @@ index bc9403d002ef24e71be67a962d099f5d73db9540..5582c15a37fbbf74d2039ba15d67684f
}
\ No newline at end of file
diff --git a/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java b/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java
index 8fe0a9c2989016821ff673838c0041b38aff8fb2..c2dab0da201010395b9367c8812115b34176fa36 100644
index 5dde53bd71e7768ea898acca02fb18ce66ea2dff..9f4a087c6b75e00a14e15dd23d0ce13b7cb2eb56 100644
--- a/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java
+++ b/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java
@@ -180,7 +180,7 @@ public class DedicatedServer extends MinecraftServer implements ServerInterface
@@ -42,7 +42,7 @@ index 8fe0a9c2989016821ff673838c0041b38aff8fb2..c2dab0da201010395b9367c8812115b3
DedicatedServer.LOGGER.warn("****************************");
DedicatedServer.LOGGER.warn("YOU ARE RUNNING THIS SERVER AS AN ADMINISTRATIVE OR ROOT USER. THIS IS NOT ADVISED.");
DedicatedServer.LOGGER.warn("YOU ARE OPENING YOURSELF UP TO POTENTIAL RISKS WHEN DOING THIS.");
@@ -319,10 +319,15 @@ public class DedicatedServer extends MinecraftServer implements ServerInterface
@@ -321,10 +321,15 @@ public class DedicatedServer extends MinecraftServer implements ServerInterface
// CraftBukkit end
if (!this.usesAuthentication()) {
@@ -61,7 +61,7 @@ index 8fe0a9c2989016821ff673838c0041b38aff8fb2..c2dab0da201010395b9367c8812115b3
DedicatedServer.LOGGER.warn("Whilst this makes it possible to use BungeeCord or Velocity, unless access to your server is properly restricted, it also opens up the ability for hackers to connect with any username they choose."); // Purpur
DedicatedServer.LOGGER.warn("Please see http://www.spigotmc.org/wiki/firewall-guide/ for further information.");
} else {
@@ -330,7 +335,6 @@ public class DedicatedServer extends MinecraftServer implements ServerInterface
@@ -332,7 +337,6 @@ public class DedicatedServer extends MinecraftServer implements ServerInterface
DedicatedServer.LOGGER.warn("You will not be offered any support as long as the server allows offline-mode players to join."); // Purpur
}
// Spigot end

View File

@@ -21,10 +21,10 @@ index 8884a2471b4b7c5cabf1c0c767710ba69c7ae4ec..4f08f2e40f5bc3bc5a87bf3a34945afd
}
\ No newline at end of file
diff --git a/src/main/java/net/minecraft/world/entity/item/ItemEntity.java b/src/main/java/net/minecraft/world/entity/item/ItemEntity.java
index ee5ec376cf7495ed99ee822a7b26978c3c107098..a85cef2b26cf876025c9436606eee24a3354f4da 100644
index 9c3db8f774e5c11df18d2c317c874e8ac26e7f8e..2bcdd7232377784c548c228e4768697ef6918f2b 100644
--- a/src/main/java/net/minecraft/world/entity/item/ItemEntity.java
+++ b/src/main/java/net/minecraft/world/entity/item/ItemEntity.java
@@ -288,7 +288,7 @@ public class ItemEntity extends Entity {
@@ -294,7 +294,7 @@ public class ItemEntity extends Entity {
ItemStack itemstack1 = other.getItem();
if (Objects.equals(this.getOwner(), other.getOwner()) && ItemEntity.areMergable(itemstack, itemstack1)) {

View File

@@ -7,10 +7,10 @@ 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 7f2a811505c2aeaad6e1a91a0719613a6694f77a..6890e3598d769d6dbfb5b665153b17cb5493a84a 100644
index d62bf95fb067c2e2a4fc9b2757c636bd4ee75bea..c6d03c97bb12a74b2e46600019ba6feb10ceb66b 100644
--- a/src/main/java/net/minecraft/server/level/ServerPlayer.java
+++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java
@@ -398,7 +398,7 @@ public class ServerPlayer extends Player {
@@ -396,7 +396,7 @@ public class ServerPlayer extends Player {
long l = k * k;
int i1 = l > 2147483647L ? Integer.MAX_VALUE : (int) l;
int j1 = this.getCoprime(i1);
@@ -19,7 +19,7 @@ index 7f2a811505c2aeaad6e1a91a0719613a6694f77a..6890e3598d769d6dbfb5b665153b17cb
for (int l1 = 0; l1 < i1; ++l1) {
int i2 = (k1 + j1 * l1) % i1;
@@ -435,7 +435,7 @@ public class ServerPlayer extends Player {
@@ -433,7 +433,7 @@ public class ServerPlayer extends Player {
long l = k * k;
int i1 = l > 2147483647L ? Integer.MAX_VALUE : (int) l;
int j1 = this.getCoprime(i1);

View File

@@ -9,18 +9,18 @@ Original code by RelativityMC, licensed under MIT
You can find the original code on https://github.com/RelativityMC/VMP-fabric (Yarn mappings)
diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java
index b0bb07c57e6219a21003bfce72b6909680ac78e5..6f9c8bfea4ef60aec040064ce976bb1f03770d04 100644
index 73325488e138c8dca81d06c5d8759401f376d273..85542015ef7376baf0cfaa090265c1286459788b 100644
--- a/src/main/java/net/minecraft/world/entity/Entity.java
+++ b/src/main/java/net/minecraft/world/entity/Entity.java
@@ -399,6 +399,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
public @Nullable Boolean immuneToFire = null; // Purpur - Fire immune API
+ private boolean boundingBoxChanged = false; // KeYi
public void setOrigin(@javax.annotation.Nonnull Location location) {
this.origin = location.toVector();
@@ -1003,6 +1004,13 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource {
@@ -1036,6 +1037,13 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource {
// Paper end - detailed watchdog information
public void move(MoverType movementType, Vec3 movement) {
@@ -34,7 +34,7 @@ index b0bb07c57e6219a21003bfce72b6909680ac78e5..6f9c8bfea4ef60aec040064ce976bb1f
// Paper start - detailed watchdog information
io.papermc.paper.util.TickThread.ensureTickThread("Cannot move an entity off-main");
synchronized (this.posLock) {
@@ -3804,6 +3812,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource {
@@ -3853,6 +3861,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource {
}
public final void setBoundingBox(AABB boundingBox) {

View File

@@ -424,7 +424,7 @@ 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 09e357833f9bbe26da7fa7142875daf2733d6420..2850b4fac2bf28b751cd6412e2effb99c60a3d74 100644
index 79bf9c277fe98df176113de39360fb34ad917577..9168e70d7d478254ad45e913885d79391a2338ae 100644
--- a/src/main/java/net/minecraft/world/level/chunk/LevelChunk.java
+++ b/src/main/java/net/minecraft/world/level/chunk/LevelChunk.java
@@ -53,6 +53,10 @@ import net.minecraft.world.level.material.Fluids;
@@ -438,7 +438,7 @@ index 09e357833f9bbe26da7fa7142875daf2733d6420..2850b4fac2bf28b751cd6412e2effb99
public class LevelChunk extends ChunkAccess {
@@ -919,7 +923,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 // Purpur
this.needsDecoration = false;
@@ -469,7 +469,7 @@ index dcfe090c269d4cbcc2eb1b6f85392848bb34656c..ef8909c9c13c8f46ec6d452f0d14c9a1
}
diff --git a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java
index 069bb67d1f79e63dce85cba347a1fd67a4781043..840657e9fa7adaa20753b54d86a68d83e5b0eaf1 100644
index 804f81c478c09a5b6d0b10a78dc2b7ae0b88cc18..278bda4058462ac331b67bc9ea297a30b296ce11 100644
--- a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java
+++ b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java
@@ -134,6 +134,7 @@ import org.bukkit.util.Consumer;

View File

@@ -5,7 +5,7 @@ Subject: [PATCH] Player Skull API
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
index 82697576db752e3dad908e389035ec66c728f0ec..d41d91914b8e7b29b7f92692faa9f7a5a5cbd080 100644
index ed5ee1f76aad6c27e742cb421a8e94990ebb7c59..ec0a9488f3f81977eed17f0abc6f4fd1b4dbe5a6 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;
@@ -26,7 +26,7 @@ index 82697576db752e3dad908e389035ec66c728f0ec..d41d91914b8e7b29b7f92692faa9f7a5
import org.bukkit.map.MapCursor;
import org.bukkit.map.MapView;
import org.bukkit.metadata.MetadataValue;
@@ -3138,4 +3142,28 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
@@ -3147,4 +3151,28 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
this.getHandle().connection.send(packet);
}
// Purpur end

View File

@@ -10,10 +10,10 @@ 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/LivingEntity.java b/src/main/java/net/minecraft/world/entity/LivingEntity.java
index ee87227269b36ff758dceb8dcf20b9367470d6df..01168bb3727399cac73fbf8aa9ae2316a702586d 100644
index 3fd8e115319e24d31f0b81e88633b83969a41b4b..3b21adfec2ad31a23cc317c973a93af2f2dd0d05 100644
--- a/src/main/java/net/minecraft/world/entity/LivingEntity.java
+++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java
@@ -1027,23 +1027,25 @@ public abstract class LivingEntity extends Entity {
@@ -1026,23 +1026,25 @@ public abstract class LivingEntity extends Entity {
}
if (entity != null) {
@@ -45,10 +45,10 @@ index ee87227269b36ff758dceb8dcf20b9367470d6df..01168bb3727399cac73fbf8aa9ae2316
// Purpur start
if (entity instanceof LivingEntity entityliving) {
diff --git a/src/main/java/net/minecraft/world/entity/Mob.java b/src/main/java/net/minecraft/world/entity/Mob.java
index db23506c44de328c74eb509caf6cc4d8d91cbc52..caf2fc594bc5143e8ead8c574963224f63b3bc7a 100644
index 7bd4e95fcaf3855a4fe412b5898a97d7992caad3..f6891970aebfe0095e37cca532fd6b971f5d1ee7 100644
--- a/src/main/java/net/minecraft/world/entity/Mob.java
+++ b/src/main/java/net/minecraft/world/entity/Mob.java
@@ -900,10 +900,10 @@ public abstract class Mob extends LivingEntity {
@@ -902,10 +902,10 @@ public abstract class Mob extends LivingEntity {
return;
}
// Paper end

View File

@@ -1,12 +1,12 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: nostalgic853 <yuu8583@proton.me>
Date: Fri, 9 Dec 2022 23:09:09 +0800
Subject: [PATCH] Revert "Spark Profiler"
Subject: [PATCH] Remove "Spark Profiler"
This reverts commit 00657e75cfec6d86bbdcb1126aabcf7177bec31a.
diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
index 120b798742b1a4524eefa4b5387a8ffc203e523c..5e56cc967f09fc29f1fa4976765a8a837e3087cf 100644
index e35453e1b105489db6715c3885cee88097ef4e97..973d40c8c25856f093f11a9c986e0325b4b48fff 100644
--- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java
+++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
@@ -448,38 +448,7 @@ public final class CraftServer implements Server {

View File

@@ -1,7 +1,7 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: nostalgic853 <yuu8583@proton.me>
Date: Fri, 9 Dec 2022 23:13:01 +0800
Subject: [PATCH] Remove Timings
Subject: [PATCH] Revert purpur "Remove Profilers"
diff --git a/src/main/java/io/papermc/paper/chunk/system/scheduling/ChunkHolderManager.java b/src/main/java/io/papermc/paper/chunk/system/scheduling/ChunkHolderManager.java
@@ -43,46 +43,44 @@ index e42eb93fd9f6f51ff5bb4b14a2304d4ffcdd8441..8013dd333e27aa5fd0beb431fa32491e
return executedUnloadTask | canSaveChunk | canSaveEntities | canSavePOI ? new SaveStat(executedUnloadTask || canSaveChunk, canSaveEntities, canSavePOI): null;
}
diff --git a/src/main/java/io/papermc/paper/configuration/GlobalConfiguration.java b/src/main/java/io/papermc/paper/configuration/GlobalConfiguration.java
index 6d6be46b30e518f9b9483100583ef318b30ee3f7..63ec2ebb71aa0e0dbb64bbce7cd3c9494e9ce2e7 100644
index 6bf14183a3fcd2b3d166752ce33240d2ff1ffa7c..01bdf134fc21220ab7ecca51f2dcd51c0b466bba 100644
--- a/src/main/java/io/papermc/paper/configuration/GlobalConfiguration.java
+++ b/src/main/java/io/papermc/paper/configuration/GlobalConfiguration.java
@@ -64,7 +64,6 @@ public class GlobalConfiguration extends ConfigurationPart {
@@ -67,14 +67,14 @@ public class GlobalConfiguration extends ConfigurationPart {
@Override
public void postProcess() {
- // Purpur - diff on change
- /*// Pufferfish start // Purpur
+ // Pufferfish start
if (enabled && !reallyEnabled) {
Bukkit.getLogger().log(Level.WARNING, "[Pufferfish] To improve performance, timings have been disabled by default");
Bukkit.getLogger().log(Level.WARNING, "[Pufferfish] You can still use timings by using /timings on, but they will not start on server startup unless you set timings.really-enabled to true in paper.yml");
Bukkit.getLogger().log(Level.WARNING, "[Pufferfish] If you would like to disable this message, either set timings.really-enabled to true or timings.enabled to false.");
}
enabled = reallyEnabled;
- */// Pufferfish end // Purpur
+ // Pufferfish end
MinecraftTimings.processConfig(this);
}
}
diff --git a/src/main/java/net/minecraft/network/protocol/PacketUtils.java b/src/main/java/net/minecraft/network/protocol/PacketUtils.java
index 767623a35dda71d77c65602e10ef2b3f0ae743f1..27d4aa45e585842c04491839826d405d6f447f0e 100644
index b693a26ac6a5729bf91aca9ca0ae332b904d436f..27d4aa45e585842c04491839826d405d6f447f0e 100644
--- a/src/main/java/net/minecraft/network/protocol/PacketUtils.java
+++ b/src/main/java/net/minecraft/network/protocol/PacketUtils.java
@@ -47,9 +47,8 @@ public class PacketUtils {
@@ -47,7 +47,7 @@ public class PacketUtils {
if (MinecraftServer.getServer().hasStopped() || (listener instanceof ServerGamePacketListenerImpl && ((ServerGamePacketListenerImpl) listener).processedDisconnect)) return; // CraftBukkit, MC-142590
if (listener.getConnection().isConnected()) {
co.aikar.timings.Timing timing = co.aikar.timings.MinecraftTimings.getPacketTiming(packet); // Paper - timings
- //try (co.aikar.timings.Timing ignored = timing.startTiming()) { // Paper - timings // Purpur
- try { // Paper - timings // Purpur
+ try (co.aikar.timings.Timing ignored = timing.startTiming()) { // Paper - timings
packet.handle(listener);
- /* // Purpur
} catch (Exception exception) {
net.minecraft.network.Connection networkmanager = listener.getConnection();
String playerIP = io.papermc.paper.configuration.GlobalConfiguration.get().logging.logPlayerIpAddresses ? String.valueOf(networkmanager.getRemoteAddress()) : "<ip address withheld>"; // Paper
@@ -61,7 +60,7 @@ public class PacketUtils {
net.minecraft.network.chat.Component error = net.minecraft.network.chat.Component.literal("Packet processing error");
networkmanager.send(new net.minecraft.network.protocol.game.ClientboundDisconnectPacket(error), net.minecraft.network.PacketSendListener.thenRun(() -> networkmanager.disconnect(error)));
networkmanager.setReadOnly();
- } */ // Purpur
+ }
} else {
PacketUtils.LOGGER.debug("Ignoring packet due to disconnection: {}", packet);
}
diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java
index b915e6a13a518f05d109c707142efa3946892f0c..029f4bf955e690621e3862e078f7474b6c2fb750 100644
index cea4447aad2d64db56a76e4ba180dc7326d2e13b..8adb0f0c5ff56e578786437afdb07668955fe7c0 100644
--- a/src/main/java/net/minecraft/server/MinecraftServer.java
+++ b/src/main/java/net/minecraft/server/MinecraftServer.java
@@ -337,13 +337,13 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
@@ -339,13 +339,13 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
public MinecraftServer(OptionSet options, WorldLoader.DataLoadContext worldLoader, Thread thread, LevelStorageSource.LevelStorageAccess convertable_conversionsession, PackRepository resourcepackrepository, WorldStem worldstem, Proxy proxy, DataFixer datafixer, Services services, ChunkProgressListenerFactory worldloadlistenerfactory) {
super("Server");
SERVER = this; // Paper - better singleton
@@ -102,7 +100,7 @@ index b915e6a13a518f05d109c707142efa3946892f0c..029f4bf955e690621e3862e078f7474b
this.status = new ServerStatus();
this.random = RandomSource.create();
this.port = -1;
@@ -935,9 +935,9 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
@@ -937,9 +937,9 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
}
// Paper end
// CraftBukkit end
@@ -114,7 +112,7 @@ index b915e6a13a518f05d109c707142efa3946892f0c..029f4bf955e690621e3862e078f7474b
MinecraftServer.LOGGER.info("Stopping server");
Commands.COMMAND_SENDING_POOL.shutdownNow(); // Paper - Shutdown and don't bother finishing
@@ -1179,18 +1179,18 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
@@ -1181,18 +1181,18 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
}
// Spigot end
@@ -138,7 +136,7 @@ index b915e6a13a518f05d109c707142efa3946892f0c..029f4bf955e690621e3862e078f7474b
this.mayHaveDelayedTasks = true;
// Purpur start - tps catchup
if (org.purpurmc.purpur.PurpurConfig.tpsCatchup) {
@@ -1200,8 +1200,8 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
@@ -1202,8 +1202,8 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
}
// Purpur end - tps catchup
this.waitUntilNextTick();
@@ -149,7 +147,7 @@ index b915e6a13a518f05d109c707142efa3946892f0c..029f4bf955e690621e3862e078f7474b
this.isReady = true;
JvmProfiler.INSTANCE.onServerTick(this.averageTickTime);
}
@@ -1362,7 +1362,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
@@ -1364,7 +1364,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
}
public void doRunTask(TickTask ticktask) { // CraftBukkit - decompile error
@@ -158,7 +156,7 @@ index b915e6a13a518f05d109c707142efa3946892f0c..029f4bf955e690621e3862e078f7474b
super.doRunTask(ticktask);
}
@@ -1406,15 +1406,15 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
@@ -1408,15 +1408,15 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
public void onServerExit() {}
public void tickServer(BooleanSupplier shouldKeepTicking) {
@@ -177,7 +175,7 @@ index b915e6a13a518f05d109c707142efa3946892f0c..029f4bf955e690621e3862e078f7474b
// Paper end
new com.destroystokyo.paper.event.server.ServerTickStartEvent(this.tickCount+1).callEvent(); // Paper
@@ -1447,7 +1447,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
@@ -1449,7 +1449,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
if (playerSaveInterval < 0) {
playerSaveInterval = autosavePeriod;
}
@@ -186,7 +184,7 @@ index b915e6a13a518f05d109c707142efa3946892f0c..029f4bf955e690621e3862e078f7474b
final boolean fullSave = autosavePeriod > 0 && this.tickCount % autosavePeriod == 0;
try {
this.isSaving = true;
@@ -1462,20 +1462,20 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
@@ -1464,20 +1464,20 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
} finally {
this.isSaving = false;
}
@@ -211,7 +209,7 @@ index b915e6a13a518f05d109c707142efa3946892f0c..029f4bf955e690621e3862e078f7474b
long l = this.tickTimes[this.tickCount % 100] = Util.getNanos() - i;
this.averageTickTime = this.averageTickTime * 0.8F + (float) l / 1000000.0F * 0.19999999F;
@@ -1488,31 +1488,31 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
@@ -1490,31 +1490,31 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
// Paper end
this.frameTimer.logFrameDuration(i1 - i);
@@ -254,7 +252,7 @@ index b915e6a13a518f05d109c707142efa3946892f0c..029f4bf955e690621e3862e078f7474b
// Send time updates to everyone, it will get the right time from the world the player is in.
// Paper start - optimize time updates
for (final ServerLevel world : this.getAllLevels()) {
@@ -1532,10 +1532,9 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
@@ -1534,10 +1534,9 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
}
}
// Paper end
@@ -266,7 +264,7 @@ index b915e6a13a518f05d109c707142efa3946892f0c..029f4bf955e690621e3862e078f7474b
Iterator iterator = this.getAllLevels().iterator(); // Paper - move down
while (iterator.hasNext()) {
ServerLevel worldserver = (ServerLevel) iterator.next();
@@ -1544,28 +1543,28 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
@@ -1546,28 +1545,28 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
worldserver.hasRidableMoveEvent = org.purpurmc.purpur.event.entity.RidableMoveEvent.getHandlerList().getRegisteredListeners().length > 0; // Purpur
net.minecraft.world.level.block.entity.HopperBlockEntity.skipHopperEvents = worldserver.paperConfig().hopper.disableMoveEvent || org.bukkit.event.inventory.InventoryMoveItemEvent.getHandlerList().getRegisteredListeners().length == 0; // Paper
@@ -302,7 +300,7 @@ index b915e6a13a518f05d109c707142efa3946892f0c..029f4bf955e690621e3862e078f7474b
} catch (Throwable throwable) {
// Spigot Start
CrashReport crashreport;
@@ -1581,33 +1580,33 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
@@ -1583,33 +1582,33 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
throw new ReportedException(crashreport);
}
@@ -348,15 +346,7 @@ index b915e6a13a518f05d109c707142efa3946892f0c..029f4bf955e690621e3862e078f7474b
}
public boolean isNetherEnabled() {
@@ -2261,7 +2260,6 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
}
public ProfilerFiller getProfiler() {
- // Purpur - diff on change
return this.profiler;
}
@@ -2501,7 +2499,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
@@ -2503,7 +2502,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
// CraftBukkit end
private void startMetricsRecordingTick() {
@@ -365,7 +355,7 @@ index b915e6a13a518f05d109c707142efa3946892f0c..029f4bf955e690621e3862e078f7474b
this.metricsRecorder = ActiveMetricsRecorder.createStarted(new ServerMetricsSamplersProvider(Util.timeSource, this.isDedicatedServer()), Util.timeSource, Util.ioPool(), new MetricsPersister("server"), this.onMetricsRecordingStopped, (path) -> {
this.executeBlocking(() -> {
this.saveDebugReport(path.resolve("server"));
@@ -2511,40 +2509,40 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
@@ -2513,40 +2512,40 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
this.willStartRecordingMetrics = false;
}
@@ -418,7 +408,7 @@ index b915e6a13a518f05d109c707142efa3946892f0c..029f4bf955e690621e3862e078f7474b
}
public Path getWorldPath(LevelResource worldSavePath) {
@@ -2593,15 +2591,15 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
@@ -2595,15 +2594,15 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
}
public boolean isTimeProfilerRunning() {
@@ -437,7 +427,7 @@ index b915e6a13a518f05d109c707142efa3946892f0c..029f4bf955e690621e3862e078f7474b
return EmptyProfileResults.EMPTY;
} else {
ProfileResults methodprofilerresults = this.debugCommandProfiler.stop(Util.getNanos(), this.tickCount);
@@ -2774,7 +2772,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
@@ -2776,7 +2775,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
return;
}
@@ -446,7 +436,7 @@ index b915e6a13a518f05d109c707142efa3946892f0c..029f4bf955e690621e3862e078f7474b
try {
for (;;) {
boolean moreTasks = this.tickMidTickTasks();
@@ -2801,7 +2799,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
@@ -2803,7 +2802,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
}
}
} finally {
@@ -469,10 +459,10 @@ index 8645313e646e6d5278e285f7449447761d7aae29..848f2ff87ff7ae87143ed30da7abf491
i = this.context.runTopCommand(function, source);
} finally {
diff --git a/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java b/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java
index c2dab0da201010395b9367c8812115b34176fa36..f664f4e5a49ade081cd53c71e0760e344a39468a 100644
index 9f4a087c6b75e00a14e15dd23d0ce13b7cb2eb56..8aeb2aa9ccba986163441cc428c2804de438288c 100644
--- a/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java
+++ b/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java
@@ -529,7 +529,7 @@ public class DedicatedServer extends MinecraftServer implements ServerInterface
@@ -534,7 +534,7 @@ public class DedicatedServer extends MinecraftServer implements ServerInterface
}
public void handleConsoleInputs() {
@@ -481,7 +471,7 @@ index c2dab0da201010395b9367c8812115b34176fa36..f664f4e5a49ade081cd53c71e0760e34
// Paper start - use proper queue
ConsoleInput servercommand;
while ((servercommand = this.serverCommandQueue.poll()) != null) {
@@ -546,7 +546,7 @@ public class DedicatedServer extends MinecraftServer implements ServerInterface
@@ -551,7 +551,7 @@ public class DedicatedServer extends MinecraftServer implements ServerInterface
// CraftBukkit end
}
@@ -491,7 +481,7 @@ index c2dab0da201010395b9367c8812115b34176fa36..f664f4e5a49ade081cd53c71e0760e34
@Override
diff --git a/src/main/java/net/minecraft/server/level/ChunkMap.java b/src/main/java/net/minecraft/server/level/ChunkMap.java
index 7276a5b8d22924240d78f732d53d678c7468bcb9..b3516a1b13b325385c4cfddb481c6e3eb6805ae1 100644
index 75965afd7b4bed23a5ecf618c7f91ff5e7ffd92f..3d78c10a5442bfa5d4beae2546378b3822f0465d 100644
--- a/src/main/java/net/minecraft/server/level/ChunkMap.java
+++ b/src/main/java/net/minecraft/server/level/ChunkMap.java
@@ -618,20 +618,20 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
@@ -583,10 +573,10 @@ index 7276a5b8d22924240d78f732d53d678c7468bcb9..b3516a1b13b325385c4cfddb481c6e3e
}
diff --git a/src/main/java/net/minecraft/server/level/ServerChunkCache.java b/src/main/java/net/minecraft/server/level/ServerChunkCache.java
index 105cdab3a1c912299dbcfb670ace810b9202731c..ca84eddbdb1e198b899750e5f6b3eafd25ce970f 100644
index 0ae45cf5a084fd412305e8b2f5dabe608b4eb1c1..c6f5d6756fa0e068a462d9c0ded12e0771abba37 100644
--- a/src/main/java/net/minecraft/server/level/ServerChunkCache.java
+++ b/src/main/java/net/minecraft/server/level/ServerChunkCache.java
@@ -428,16 +428,16 @@ public class ServerChunkCache extends ChunkSource {
@@ -431,16 +431,16 @@ public class ServerChunkCache extends ChunkSource {
return ifLoaded;
}
// Paper end
@@ -606,7 +596,7 @@ index 105cdab3a1c912299dbcfb670ace810b9202731c..ca84eddbdb1e198b899750e5f6b3eafd
CompletableFuture<Either<ChunkAccess, ChunkHolder.ChunkLoadingFailure>> completablefuture = this.getChunkFutureMainThread(x, z, leastStatus, create, true); // Paper
ServerChunkCache.MainThreadExecutor chunkproviderserver_b = this.mainThreadProcessor;
@@ -447,10 +447,10 @@ public class ServerChunkCache extends ChunkSource {
@@ -450,10 +450,10 @@ public class ServerChunkCache extends ChunkSource {
io.papermc.paper.chunk.system.scheduling.ChunkTaskScheduler.pushChunkWait(this.level, x1, z1); // Paper - rewrite chunk system
// Paper end
com.destroystokyo.paper.io.SyncLoadFinder.logSyncLoad(this.level, x1, z1); // Paper - sync load info
@@ -619,7 +609,7 @@ index 105cdab3a1c912299dbcfb670ace810b9202731c..ca84eddbdb1e198b899750e5f6b3eafd
} // Paper
ichunkaccess = (ChunkAccess) ((Either) completablefuture.join()).map((ichunkaccess1) -> {
return ichunkaccess1;
@@ -598,17 +598,17 @@ public class ServerChunkCache extends ChunkSource {
@@ -601,17 +601,17 @@ public class ServerChunkCache extends ChunkSource {
public void save(boolean flush) {
this.runDistanceManagerUpdates();
@@ -641,7 +631,7 @@ index 105cdab3a1c912299dbcfb670ace810b9202731c..ca84eddbdb1e198b899750e5f6b3eafd
}
// Paper end
@@ -625,36 +625,36 @@ public class ServerChunkCache extends ChunkSource {
@@ -628,36 +628,36 @@ public class ServerChunkCache extends ChunkSource {
// CraftBukkit start - modelled on below
public void purgeUnload() {
if (true) return; // Paper - tickets will be removed later, this behavior isn't really well accounted for by the chunk system
@@ -691,7 +681,7 @@ index 105cdab3a1c912299dbcfb670ace810b9202731c..ca84eddbdb1e198b899750e5f6b3eafd
this.clearCache();
}
@@ -700,14 +700,14 @@ public class ServerChunkCache extends ChunkSource {
@@ -703,15 +703,15 @@ public class ServerChunkCache extends ChunkSource {
}
// Paper end - optimize isOutisdeRange
LevelData worlddata = this.level.getLevelData();
@@ -700,6 +690,7 @@ index 105cdab3a1c912299dbcfb670ace810b9202731c..ca84eddbdb1e198b899750e5f6b3eafd
- //gameprofilerfiller.push("pollingChunks"); // Purpur
+ gameprofilerfiller.push("pollingChunks");
this.level.resetIceAndSnowTick(); // Pufferfish - reset ice & snow tick random
int k = this.level.getGameRules().getInt(GameRules.RULE_RANDOMTICKING);
boolean flag1 = level.ticksPerSpawnCategory.getLong(org.bukkit.entity.SpawnCategory.ANIMAL) != 0L && worlddata.getGameTime() % level.ticksPerSpawnCategory.getLong(org.bukkit.entity.SpawnCategory.ANIMAL) == 0L; // CraftBukkit
@@ -710,14 +701,14 @@ index 105cdab3a1c912299dbcfb670ace810b9202731c..ca84eddbdb1e198b899750e5f6b3eafd
int l = this.distanceManager.getNaturalSpawnChunkCount();
// Paper start - per player mob spawning
NaturalSpawner.SpawnState spawnercreature_d; // moved down
@@ -721,16 +721,16 @@ public class ServerChunkCache extends ChunkSource {
spawnercreature_d = NaturalSpawner.createState(l, this.level.getAllEntities(), this::getFullChunk, this.chunkMap.playerMobDistanceMap == null ? new LocalMobCapCalculator(this.chunkMap) : null, false);
@@ -732,16 +732,16 @@ public class ServerChunkCache extends ChunkSource {
// Pufferfish end
}
// Paper end
- //this.level.timings.countNaturalMobs.stopTiming(); // Paper - timings // Purpur
+ this.level.timings.countNaturalMobs.stopTiming(); // Paper - timings
this.lastSpawnState = spawnercreature_d;
//this.lastSpawnState = spawnercreature_d; // Pufferfish - this is managed asynchronously
- //gameprofilerfiller.popPush("filteringLoadedChunks"); // Purpur
+ gameprofilerfiller.popPush("filteringLoadedChunks");
// Paper - moved down
@@ -731,7 +722,7 @@ index 105cdab3a1c912299dbcfb670ace810b9202731c..ca84eddbdb1e198b899750e5f6b3eafd
boolean flag2 = this.level.getGameRules().getBoolean(GameRules.RULE_DOMOBSPAWNING) && !this.level.players().isEmpty(); // CraftBukkit
// Paper - only shuffle if per-player mob spawning is disabled
@@ -780,17 +780,17 @@ public class ServerChunkCache extends ChunkSource {
@@ -791,17 +791,17 @@ public class ServerChunkCache extends ChunkSource {
}
}
// Paper end - optimise chunk tick iteration
@@ -756,7 +747,7 @@ index 105cdab3a1c912299dbcfb670ace810b9202731c..ca84eddbdb1e198b899750e5f6b3eafd
if (!this.chunkMap.needsChangeBroadcasting.isEmpty()) {
ReferenceOpenHashSet<ChunkHolder> copy = this.chunkMap.needsChangeBroadcasting.clone();
this.chunkMap.needsChangeBroadcasting.clear();
@@ -802,8 +802,8 @@ public class ServerChunkCache extends ChunkSource {
@@ -813,8 +813,8 @@ public class ServerChunkCache extends ChunkSource {
}
}
}
@@ -767,7 +758,7 @@ index 105cdab3a1c912299dbcfb670ace810b9202731c..ca84eddbdb1e198b899750e5f6b3eafd
// Paper end - use set of chunks requiring updates, rather than iterating every single one loaded
// Paper start - controlled flush for entity tracker packets
List<net.minecraft.network.Connection> disabledFlushes = new java.util.ArrayList<>(this.level.players.size());
@@ -994,7 +994,7 @@ public class ServerChunkCache extends ChunkSource {
@@ -1029,7 +1029,7 @@ public class ServerChunkCache extends ChunkSource {
@Override
protected void doRunTask(Runnable task) {
@@ -777,10 +768,10 @@ index 105cdab3a1c912299dbcfb670ace810b9202731c..ca84eddbdb1e198b899750e5f6b3eafd
}
diff --git a/src/main/java/net/minecraft/server/level/ServerLevel.java b/src/main/java/net/minecraft/server/level/ServerLevel.java
index e21559ebc4d5ffcf10fc50f5bcc31ccff3b8394f..8fd3511d484cfd2b56238530aea95c84effcd1f1 100644
index b396a329e753f42b3878736b6b14bafda02d3744..077ff3d7620e3c48aca59a92014dbdb7de15e79a 100644
--- a/src/main/java/net/minecraft/server/level/ServerLevel.java
+++ b/src/main/java/net/minecraft/server/level/ServerLevel.java
@@ -656,12 +656,12 @@ public class ServerLevel extends Level implements WorldGenLevel {
@@ -654,12 +654,12 @@ public class ServerLevel extends Level implements WorldGenLevel {
}
}
// Paper end - optimise checkDespawn
@@ -796,7 +787,7 @@ index e21559ebc4d5ffcf10fc50f5bcc31ccff3b8394f..8fd3511d484cfd2b56238530aea95c84
this.advanceWeatherCycle();
int i = this.getGameRules().getInt(GameRules.RULE_PLAYERS_SLEEPING_PERCENTAGE);
long j;
@@ -688,32 +688,32 @@ public class ServerLevel extends Level implements WorldGenLevel {
@@ -686,32 +686,32 @@ public class ServerLevel extends Level implements WorldGenLevel {
this.updateSkyBrightness();
this.tickTime();
@@ -845,7 +836,7 @@ index e21559ebc4d5ffcf10fc50f5bcc31ccff3b8394f..8fd3511d484cfd2b56238530aea95c84
boolean flag = true || !this.players.isEmpty() || !this.getForcedChunks().isEmpty(); // CraftBukkit - this prevents entity cleanup, other issues on servers with no players
if (flag) {
@@ -721,24 +721,24 @@ public class ServerLevel extends Level implements WorldGenLevel {
@@ -719,25 +719,25 @@ public class ServerLevel extends Level implements WorldGenLevel {
}
if (flag || this.emptyTime++ < 300) {
@@ -865,6 +856,7 @@ index e21559ebc4d5ffcf10fc50f5bcc31ccff3b8394f..8fd3511d484cfd2b56238530aea95c84
- //timings.entityTick.startTiming(); // Spigot // Purpur
+ timings.entityTick.startTiming(); // Spigot
this.entityTickList.forEach((entity) -> {
entity.activatedPriorityReset = false; // Pufferfish - DAB
if (!entity.isRemoved()) {
if (false && this.shouldDiscardEntity(entity)) { // CraftBukkit - We prevent spawning in general, so this butchering is not needed
entity.discard();
@@ -877,13 +869,19 @@ index e21559ebc4d5ffcf10fc50f5bcc31ccff3b8394f..8fd3511d484cfd2b56238530aea95c84
if (true || this.chunkSource.chunkMap.getDistanceManager().inEntityTickingRange(entity.chunkPosition().toLong())) { // Paper - now always true if in the ticking list
Entity entity1 = entity.getVehicle();
@@ -750,21 +750,22 @@ public class ServerLevel extends Level implements WorldGenLevel {
@@ -749,7 +749,7 @@ public class ServerLevel extends Level implements WorldGenLevel {
entity.stopRiding();
}
- //gameprofilerfiller.push("tick"); // Purpur
+ gameprofilerfiller.push("tick");
this.guardEntityTick(this::tickNonPassenger, entity);
// Pufferfish start - copied from this.guardEntityTick
try {
this.tickNonPassenger(entity); // Pufferfish - changed
@@ -764,19 +764,20 @@ public class ServerLevel extends Level implements WorldGenLevel {
// Paper end
}
// Pufferfish end
- //gameprofilerfiller.pop(); // Purpur
+ gameprofilerfiller.pop();
}
@@ -906,7 +904,7 @@ index e21559ebc4d5ffcf10fc50f5bcc31ccff3b8394f..8fd3511d484cfd2b56238530aea95c84
}
@Override
@@ -844,9 +845,9 @@ public class ServerLevel extends Level implements WorldGenLevel {
@@ -858,9 +859,9 @@ public class ServerLevel extends Level implements WorldGenLevel {
boolean flag = this.isRaining();
int j = chunkcoordintpair.getMinBlockX();
int k = chunkcoordintpair.getMinBlockZ();
@@ -917,8 +915,8 @@ index e21559ebc4d5ffcf10fc50f5bcc31ccff3b8394f..8fd3511d484cfd2b56238530aea95c84
+ gameprofilerfiller.push("thunder");
final BlockPos.MutableBlockPos blockposition = this.chunkTickMutablePosition; // Paper - use mutable to reduce allocation rate, final to force compile fail on change
if (!this.paperConfig().environment.disableThunder && flag && this.isThundering() && this.spigotConfig.thunderChance > 0 && this.random.nextInt(this.spigotConfig.thunderChance) == 0) { // Spigot // Paper - disable thunder
@@ -884,7 +885,7 @@ public class ServerLevel extends Level implements WorldGenLevel {
if (!this.paperConfig().environment.disableThunder && flag && this.isThundering() && this.spigotConfig.thunderChance > 0 && /*this.random.nextInt(this.spigotConfig.thunderChance) == 0 &&*/ chunk.shouldDoLightning(this.random)) { // Spigot // Paper - disable thunder // Pufferfish - replace random with shouldDoLightning
@@ -898,7 +899,7 @@ public class ServerLevel extends Level implements WorldGenLevel {
}
}
@@ -926,8 +924,8 @@ index e21559ebc4d5ffcf10fc50f5bcc31ccff3b8394f..8fd3511d484cfd2b56238530aea95c84
+ gameprofilerfiller.popPush("iceandsnow");
int l;
if (!this.paperConfig().environment.disableIceAndSnow && this.random.nextInt(16) == 0) { // Paper - Disable ice and snow
@@ -936,8 +937,8 @@ public class ServerLevel extends Level implements WorldGenLevel {
if (!this.paperConfig().environment.disableIceAndSnow && (this.currentIceAndSnowTick++ & 15) == 0) { // Paper - Disable ice and snow // Paper - optimise random ticking // Pufferfish - optimize further random ticking
@@ -950,8 +951,8 @@ public class ServerLevel extends Level implements WorldGenLevel {
}
// Paper start - optimise random block ticking
@@ -938,7 +936,7 @@ index e21559ebc4d5ffcf10fc50f5bcc31ccff3b8394f..8fd3511d484cfd2b56238530aea95c84
if (randomTickSpeed > 0) {
LevelChunkSection[] sections = chunk.getSections();
int minSection = io.papermc.paper.util.WorldUtil.getMinSection(this);
@@ -971,8 +972,8 @@ public class ServerLevel extends Level implements WorldGenLevel {
@@ -985,8 +986,8 @@ public class ServerLevel extends Level implements WorldGenLevel {
}
}
// Paper end - optimise random block ticking
@@ -949,7 +947,7 @@ index e21559ebc4d5ffcf10fc50f5bcc31ccff3b8394f..8fd3511d484cfd2b56238530aea95c84
}
public Optional<BlockPos> findLightningRod(BlockPos pos) {
@@ -1264,24 +1265,24 @@ public class ServerLevel extends Level implements WorldGenLevel {
@@ -1278,24 +1279,24 @@ public class ServerLevel extends Level implements WorldGenLevel {
// Spigot end
// Paper start- timings
final boolean isActive = org.spigotmc.ActivationRange.checkIfActive(entity);
@@ -982,7 +980,7 @@ index e21559ebc4d5ffcf10fc50f5bcc31ccff3b8394f..8fd3511d484cfd2b56238530aea95c84
Iterator iterator = entity.getPassengers().iterator();
while (iterator.hasNext()) {
@@ -1304,17 +1305,17 @@ public class ServerLevel extends Level implements WorldGenLevel {
@@ -1318,17 +1319,17 @@ public class ServerLevel extends Level implements WorldGenLevel {
if (passenger instanceof Player || this.entityTickList.contains(passenger)) {
// Paper - EAR 2
final boolean isActive = org.spigotmc.ActivationRange.checkIfActive(passenger);
@@ -1006,7 +1004,7 @@ index e21559ebc4d5ffcf10fc50f5bcc31ccff3b8394f..8fd3511d484cfd2b56238530aea95c84
// Paper start - EAR 2
if (isActive) {
passenger.rideTick();
@@ -1326,7 +1327,7 @@ public class ServerLevel extends Level implements WorldGenLevel {
@@ -1340,7 +1341,7 @@ public class ServerLevel extends Level implements WorldGenLevel {
vehicle.positionRider(passenger);
}
// Paper end - EAR 2
@@ -1015,7 +1013,7 @@ index e21559ebc4d5ffcf10fc50f5bcc31ccff3b8394f..8fd3511d484cfd2b56238530aea95c84
Iterator iterator = passenger.getPassengers().iterator();
while (iterator.hasNext()) {
@@ -1335,7 +1336,7 @@ public class ServerLevel extends Level implements WorldGenLevel {
@@ -1349,7 +1350,7 @@ public class ServerLevel extends Level implements WorldGenLevel {
this.tickPassenger(passenger, entity2);
}
@@ -1024,7 +1022,7 @@ index e21559ebc4d5ffcf10fc50f5bcc31ccff3b8394f..8fd3511d484cfd2b56238530aea95c84
}
} else {
passenger.stopRiding();
@@ -1355,14 +1356,14 @@ public class ServerLevel extends Level implements WorldGenLevel {
@@ -1369,14 +1370,14 @@ public class ServerLevel extends Level implements WorldGenLevel {
org.bukkit.Bukkit.getPluginManager().callEvent(new org.bukkit.event.world.WorldSaveEvent(getWorld()));
}
@@ -1042,7 +1040,7 @@ index e21559ebc4d5ffcf10fc50f5bcc31ccff3b8394f..8fd3511d484cfd2b56238530aea95c84
// Copied from save()
// CraftBukkit start - moved from MinecraftServer.saveChunks
@@ -1374,7 +1375,7 @@ public class ServerLevel extends Level implements WorldGenLevel {
@@ -1388,7 +1389,7 @@ public class ServerLevel extends Level implements WorldGenLevel {
this.convertable.saveDataTag(this.server.registryAccess(), this.serverLevelData, this.server.getPlayerList().getSingleplayerData());
}
// CraftBukkit end
@@ -1051,7 +1049,7 @@ index e21559ebc4d5ffcf10fc50f5bcc31ccff3b8394f..8fd3511d484cfd2b56238530aea95c84
}
// Paper end
@@ -1388,7 +1389,7 @@ public class ServerLevel extends Level implements WorldGenLevel {
@@ -1402,7 +1403,7 @@ public class ServerLevel extends Level implements WorldGenLevel {
if (!savingDisabled) {
org.bukkit.Bukkit.getPluginManager().callEvent(new org.bukkit.event.world.WorldSaveEvent(getWorld())); // CraftBukkit
@@ -1060,7 +1058,7 @@ index e21559ebc4d5ffcf10fc50f5bcc31ccff3b8394f..8fd3511d484cfd2b56238530aea95c84
if (progressListener != null) {
progressListener.progressStartNoAbort(Component.translatable("menu.savingLevel"));
}
@@ -1398,11 +1399,11 @@ public class ServerLevel extends Level implements WorldGenLevel {
@@ -1412,11 +1413,11 @@ public class ServerLevel extends Level implements WorldGenLevel {
progressListener.progressStage(Component.translatable("menu.savingChunks"));
}
@@ -1076,7 +1074,7 @@ index e21559ebc4d5ffcf10fc50f5bcc31ccff3b8394f..8fd3511d484cfd2b56238530aea95c84
} else if (close) { chunkproviderserver.close(false); } // Paper - rewrite chunk system
diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
index e69348724dc1b98a91f93af18dde6e6231068b61..45bdc5afa8b51ef381ac3c41c57cf0ad271658d0 100644
index a8e205af936efe0909c94575e3b7f8ca50cead2f..25bb1b1938c260d531f21037507122c85c440ddf 100644
--- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
+++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
@@ -2586,7 +2586,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic
@@ -1107,10 +1105,10 @@ index e69348724dc1b98a91f93af18dde6e6231068b61..45bdc5afa8b51ef381ac3c41c57cf0ad
}
// CraftBukkit end
diff --git a/src/main/java/net/minecraft/server/players/PlayerList.java b/src/main/java/net/minecraft/server/players/PlayerList.java
index 9cfe4f2ab57f6d17a64eda2c48fb59ab7aa14367..23cea7dd67dd1890a8fd34c294d140b30e89f59c 100644
index b0fa557e756d1e30097ad5a72e679d8844b34cd9..47a2c5eb799580501f5b31c85a569fa342646d8b 100644
--- a/src/main/java/net/minecraft/server/players/PlayerList.java
+++ b/src/main/java/net/minecraft/server/players/PlayerList.java
@@ -1297,7 +1297,7 @@ public abstract class PlayerList {
@@ -1226,7 +1226,7 @@ public abstract class PlayerList {
public void saveAll(int interval) {
io.papermc.paper.util.MCUtil.ensureMain("Save Players" , () -> { // Paper - Ensure main
@@ -1119,7 +1117,7 @@ index 9cfe4f2ab57f6d17a64eda2c48fb59ab7aa14367..23cea7dd67dd1890a8fd34c294d140b3
int numSaved = 0;
long now = MinecraftServer.currentTick;
for (int i = 0; i < this.players.size(); ++i) {
@@ -1308,7 +1308,7 @@ public abstract class PlayerList {
@@ -1237,7 +1237,7 @@ public abstract class PlayerList {
}
// Paper end
}
@@ -1178,10 +1176,10 @@ index 7094701d213c73ba47ace806962244c10fdf4dda..fcdb9bde8e1605e30dde3e580491522d
}
diff --git a/src/main/java/net/minecraft/world/level/Level.java b/src/main/java/net/minecraft/world/level/Level.java
index 3778ad438b3a5f6cdbc465c7356bf9e11340753e..730a6e8bac4436a62c4ef5a122f55fc92432ae6a 100644
index a9289072b048095330ea32d7c965e8dda61a36fc..7a3640ee04db1d90e2672019f6b3660271718440 100644
--- a/src/main/java/net/minecraft/world/level/Level.java
+++ b/src/main/java/net/minecraft/world/level/Level.java
@@ -608,9 +608,9 @@ public abstract class Level implements LevelAccessor, AutoCloseable {
@@ -711,9 +711,9 @@ public abstract class Level implements LevelAccessor, AutoCloseable {
BlockState iblockdata2 = this.getBlockState(pos);
if ((flags & 128) == 0 && iblockdata2 != iblockdata1 && (iblockdata2.getLightBlock(this, pos) != iblockdata1.getLightBlock(this, pos) || iblockdata2.getLightEmission() != iblockdata1.getLightEmission() || iblockdata2.useShapeForLightOcclusion() || iblockdata1.useShapeForLightOcclusion())) {
@@ -1193,7 +1191,7 @@ index 3778ad438b3a5f6cdbc465c7356bf9e11340753e..730a6e8bac4436a62c4ef5a122f55fc9
}
/*
@@ -909,18 +909,18 @@ public abstract class Level implements LevelAccessor, AutoCloseable {
@@ -1012,18 +1012,18 @@ public abstract class Level implements LevelAccessor, AutoCloseable {
}
protected void tickBlockEntities() {
@@ -1217,7 +1215,7 @@ index 3778ad438b3a5f6cdbc465c7356bf9e11340753e..730a6e8bac4436a62c4ef5a122f55fc9
// Spigot start
// Iterator iterator = this.blockEntityTickers.iterator();
int tilesThisCycle = 0;
@@ -953,10 +953,10 @@ public abstract class Level implements LevelAccessor, AutoCloseable {
@@ -1056,10 +1056,10 @@ public abstract class Level implements LevelAccessor, AutoCloseable {
}
this.blockEntityTickers.removeAll(toRemove);
@@ -1230,7 +1228,7 @@ index 3778ad438b3a5f6cdbc465c7356bf9e11340753e..730a6e8bac4436a62c4ef5a122f55fc9
spigotConfig.currentPrimedTnt = 0; // Spigot
}
@@ -1149,7 +1149,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable {
@@ -1252,7 +1252,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable {
@Override
public List<Entity> getEntities(@Nullable Entity except, AABB box, Predicate<? super Entity> predicate) {
@@ -1239,7 +1237,7 @@ index 3778ad438b3a5f6cdbc465c7356bf9e11340753e..730a6e8bac4436a62c4ef5a122f55fc9
List<Entity> list = Lists.newArrayList();
((ServerLevel)this).getEntityLookup().getEntities(except, box, list, predicate); // Paper - optimise this call
return list;
@@ -1168,7 +1168,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable {
@@ -1271,7 +1271,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable {
}
public <T extends Entity> void getEntities(EntityTypeTest<Entity, T> filter, AABB box, Predicate<? super T> predicate, List<? super T> result, int limit) {
@@ -1248,16 +1246,8 @@ index 3778ad438b3a5f6cdbc465c7356bf9e11340753e..730a6e8bac4436a62c4ef5a122f55fc9
// Paper start - optimise this call
//TODO use limit
if (filter instanceof net.minecraft.world.entity.EntityType entityTypeTest) {
@@ -1497,7 +1497,6 @@ public abstract class Level implements LevelAccessor, AutoCloseable {
}
public ProfilerFiller getProfiler() {
- // Purpur - diff on change
return (ProfilerFiller) this.profiler.get();
}
diff --git a/src/main/java/net/minecraft/world/level/NaturalSpawner.java b/src/main/java/net/minecraft/world/level/NaturalSpawner.java
index decf30b590658a627d47cb688531ec1cc24ba001..01b21f520ef1c834b9bafc3de85c1fa4fcf539d6 100644
index 81ba3c4fa9502cdd2a5c58b0ff51fea6b7553f4a..5521418fa307b3eeb4f02a10c39f05b360d1d06e 100644
--- a/src/main/java/net/minecraft/world/level/NaturalSpawner.java
+++ b/src/main/java/net/minecraft/world/level/NaturalSpawner.java
@@ -132,8 +132,8 @@ public final class NaturalSpawner {
@@ -1292,7 +1282,7 @@ index decf30b590658a627d47cb688531ec1cc24ba001..01b21f520ef1c834b9bafc3de85c1fa4
if (entityhuman != null) {
double d2 = entityhuman.distanceToSqr(d0, (double) i, d1);
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 2850b4fac2bf28b751cd6412e2effb99c60a3d74..28e4b302284f955a73e75d0f4276d55fb51826f5 100644
index 9168e70d7d478254ad45e913885d79391a2338ae..aa327e549949052b5babf4101cc2fc9a37868fa8 100644
--- a/src/main/java/net/minecraft/world/level/chunk/LevelChunk.java
+++ b/src/main/java/net/minecraft/world/level/chunk/LevelChunk.java
@@ -53,10 +53,6 @@ import net.minecraft.world.level.material.Fluids;
@@ -1306,7 +1296,7 @@ index 2850b4fac2bf28b751cd6412e2effb99c60a3d74..28e4b302284f955a73e75d0f4276d55f
public class LevelChunk extends ChunkAccess {
@@ -921,9 +917,9 @@ public class LevelChunk extends ChunkAccess {
@@ -934,9 +930,9 @@ public class LevelChunk extends ChunkAccess {
this.chunkHolder.getEntityChunk().callEntitiesLoadEvent(); // Paper - rewrite chunk system
if (this.needsDecoration) {
@@ -1318,7 +1308,7 @@ index 2850b4fac2bf28b751cd6412e2effb99c60a3d74..28e4b302284f955a73e75d0f4276d55f
random.setSeed(this.level.getSeed());
long xRand = random.nextLong() / 2L * 2L + 1L;
long zRand = random.nextLong() / 2L * 2L + 1L;
@@ -941,7 +937,7 @@ public class LevelChunk extends ChunkAccess {
@@ -954,7 +950,7 @@ public class LevelChunk extends ChunkAccess {
}
}
server.getPluginManager().callEvent(new org.bukkit.event.world.ChunkPopulateEvent(this.bukkitChunk));
@@ -1327,7 +1317,7 @@ index 2850b4fac2bf28b751cd6412e2effb99c60a3d74..28e4b302284f955a73e75d0f4276d55f
}
}
}
@@ -1298,10 +1294,10 @@ public class LevelChunk extends ChunkAccess {
@@ -1311,10 +1307,10 @@ public class LevelChunk extends ChunkAccess {
if (LevelChunk.this.isTicking(blockposition)) {
try {
@@ -1341,7 +1331,7 @@ index 2850b4fac2bf28b751cd6412e2effb99c60a3d74..28e4b302284f955a73e75d0f4276d55f
BlockState iblockdata = LevelChunk.this.getBlockState(blockposition);
if (this.blockEntity.getType().isValid(iblockdata)) {
@@ -1312,7 +1308,7 @@ public class LevelChunk extends ChunkAccess {
@@ -1325,7 +1321,7 @@ public class LevelChunk extends ChunkAccess {
LevelChunk.LOGGER.warn("Block entity {} @ {} state {} invalid for ticking:", new Object[]{LogUtils.defer(this::getType), LogUtils.defer(this::getPos), iblockdata});
}
@@ -1350,7 +1340,7 @@ index 2850b4fac2bf28b751cd6412e2effb99c60a3d74..28e4b302284f955a73e75d0f4276d55f
} catch (Throwable throwable) {
if (throwable instanceof ThreadDeath) throw throwable; // Paper
// Paper start - Prevent tile entity and entity crashes
@@ -1323,7 +1319,7 @@ public class LevelChunk extends ChunkAccess {
@@ -1336,7 +1332,7 @@ public class LevelChunk extends ChunkAccess {
// Paper end
// Spigot start
} finally {
@@ -1437,10 +1427,10 @@ index a6e9e503a496c18e2501b03ec84f4600c134a50c..138407c2d4b0bc55ddb9aac5d2aa3eda
// Paper end - add timings for scoreboard search
}
diff --git a/src/main/java/org/spigotmc/ActivationRange.java b/src/main/java/org/spigotmc/ActivationRange.java
index 43d962f634c25da159c4935a3c5c8994a3a4930e..3783186d0c3f2f7b241d38f8ee011e8a5c172980 100644
index 665625c69b93a2568b1f2218a0db39da435d8c99..00744aceb25ddc689b8c5ed90ae27e1ea28057ad 100644
--- a/src/main/java/org/spigotmc/ActivationRange.java
+++ b/src/main/java/org/spigotmc/ActivationRange.java
@@ -166,7 +166,7 @@ public class ActivationRange
@@ -170,7 +170,7 @@ public class ActivationRange
*/
public static void activateEntities(Level world)
{
@@ -1449,7 +1439,7 @@ index 43d962f634c25da159c4935a3c5c8994a3a4930e..3783186d0c3f2f7b241d38f8ee011e8a
final int miscActivationRange = world.spigotConfig.miscActivationRange;
final int raiderActivationRange = world.spigotConfig.raiderActivationRange;
final int animalActivationRange = world.spigotConfig.animalActivationRange;
@@ -221,7 +221,7 @@ public class ActivationRange
@@ -244,7 +244,7 @@ public class ActivationRange
}
// Paper end
}

View File

@@ -0,0 +1,338 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: nostalgic853 <yuu8583@proton.me>
Date: Sat, 17 Dec 2022 21:08:21 +0800
Subject: [PATCH] Use our logo instead of Paper's
diff --git a/src/main/resources/logo.png b/src/main/resources/logo.png
index a7d785f60c884ee4ee487cc364402d66c3dc2ecc..a2ea1098539e494d2482a7e814e4e9a76173ded2 100644
GIT binary patch
literal 2638
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
literal 14310
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%0ABLt+m?son?j
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
WX&3$!%>|s_1IbA#OV)^+1pg1OmmZn`

View File

@@ -0,0 +1,269 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: nostalgic853 <yuu8583@proton.me>
Date: Sat, 17 Dec 2022 22:12:03 +0800
Subject: [PATCH] New KeYi config system
diff --git a/build.gradle.kts b/build.gradle.kts
index 0cc1db1138e2d34eaee62ec60c506d03497d3613..5491526aa4728a253cbb4000336bed131456f1ce 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
@@ -60,6 +60,8 @@ dependencies {
testImplementation("org.hamcrest:hamcrest-library:1.3")
implementation("io.netty:netty-all:4.1.77.Final"); // Paper - Bump netty
+
+ implementation("com.electronwill.night-config:toml:3.6.0") // KeYi - nightconfig
}
val craftbukkitPackageVersion = "1_19_R2" // Paper
diff --git a/src/main/java/cc/keyimc/keyi/KeyiCommand.java b/src/main/java/cc/keyimc/keyi/KeyiCommand.java
index 5ec7a427abba42de2fdcb480586cc17e74bc5c52..09290d8a7d846be5645e27eecce261a1f4172e01 100644
--- a/src/main/java/cc/keyimc/keyi/KeyiCommand.java
+++ b/src/main/java/cc/keyimc/keyi/KeyiCommand.java
@@ -1,5 +1,6 @@
package cc.keyimc.keyi;
+import cc.keyimc.keyi.config.KGlobalConfig;
import cc.keyimc.keyi.utils.TextUtil;
import net.minecraft.server.MinecraftServer;
import org.bukkit.Bukkit;
@@ -45,7 +46,7 @@ public final class KeyiCommand extends Command {
}
if (args[0].equalsIgnoreCase("reload")) {
- KeyiConfig.reload();
+ KGlobalConfig.getInstance().init();
sender.sendMessage(TextUtil.deserialize("<#00f898>Reload completed!"));
var minecraftServer = MinecraftServer.getServer();
diff --git a/src/main/java/cc/keyimc/keyi/KeyiConfig.java b/src/main/java/cc/keyimc/keyi/abandoned/KeyiConfig.java
similarity index 99%
rename from src/main/java/cc/keyimc/keyi/KeyiConfig.java
rename to src/main/java/cc/keyimc/keyi/abandoned/KeyiConfig.java
index 4f08f2e40f5bc3bc5a87bf3a34945afdec65f288..ffb825bf9eda4fffebb4ea8e64eefa966f7a4051 100644
--- a/src/main/java/cc/keyimc/keyi/KeyiConfig.java
+++ b/src/main/java/cc/keyimc/keyi/abandoned/KeyiConfig.java
@@ -1,5 +1,5 @@
-package cc.keyimc.keyi;
+package cc.keyimc.keyi.abandoned;
import com.google.common.base.Throwables;
import com.google.common.collect.ImmutableMap;
diff --git a/src/main/java/cc/keyimc/keyi/abandoned/package-info.java b/src/main/java/cc/keyimc/keyi/abandoned/package-info.java
new file mode 100644
index 0000000000000000000000000000000000000000..7b731c9307eb9f2a7ffa629f1716cda26b00d5f2
--- /dev/null
+++ b/src/main/java/cc/keyimc/keyi/abandoned/package-info.java
@@ -0,0 +1,6 @@
+package cc.keyimc.keyi.abandoned;
+
+/**
+ * Classes in these package are abandoned!
+ * We won't use it anymore, so we moved them to here as a backup.
+ */
\ No newline at end of file
diff --git a/src/main/java/cc/keyimc/keyi/config/KGlobalConfig.java b/src/main/java/cc/keyimc/keyi/config/KGlobalConfig.java
new file mode 100644
index 0000000000000000000000000000000000000000..72720a4893fc010c2076476a0f239cd625ac3175
--- /dev/null
+++ b/src/main/java/cc/keyimc/keyi/config/KGlobalConfig.java
@@ -0,0 +1,105 @@
+package cc.keyimc.keyi.config;
+
+import com.electronwill.nightconfig.core.file.CommentedFileConfig;
+
+import java.io.File;
+import java.io.IOException;
+
+public class KGlobalConfig {
+ private static final KGlobalConfig INSTANCE;
+
+ private File file;
+ private CommentedFileConfig fileConfig;
+
+ static {
+ INSTANCE = new KGlobalConfig();
+ }
+
+ public static KGlobalConfig getInstance() {
+ return INSTANCE;
+ }
+
+ private KGlobalConfig() {
+ }
+
+ public void init() {
+ File folder = new File("." + File.separator + "/keyi/");
+
+ if (!folder.exists()) {
+ folder.mkdirs();
+ }
+
+ file = new File(folder, "keyi_config.toml");
+
+ if (!file.exists()) {
+ try {
+ file.createNewFile();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
+ fileConfig = CommentedFileConfig.ofConcurrent(file);
+
+ fileConfig.load();
+ initValues();
+ fileConfig.save();
+ }
+
+ private <T> T get(String key, T defaultValue) {
+ if (fileConfig.contains(key)) {
+ return fileConfig.get(key);
+ }
+ fileConfig.set(key, defaultValue);
+ return defaultValue;
+ }
+
+ // Basic values
+ public int version = 2;
+ public boolean verbose = false;
+
+ // Performance settings
+ public boolean spigotDropsMergingMechanism = true;
+
+ // Bug-fixes settings
+ public boolean fixTripwireDuping = true;
+
+ // Misc settings
+ public boolean rootUserWarning = true;
+ public boolean offlineModeWarning = true;
+ public boolean proxyUnsafeWarning = true;
+
+ private void initValues() {
+ verbose = get("verbose", verbose);
+ version = get("dont-touch-these-values-down-below.version", version);
+
+ // Performance settings
+ spigotDropsMergingMechanism = get("performance.use-spigot-drops-merging-mechanism", spigotDropsMergingMechanism);
+
+ // Bug-fixes settings
+ fixTripwireDuping = get("bug-fixes.fix-tripwire-duping", fixTripwireDuping);
+
+ // Misc settings
+ rootUserWarning = get("misc.root-user-warning", rootUserWarning);
+ offlineModeWarning = get("misc.offline-mode-warning", offlineModeWarning);
+ proxyUnsafeWarning = get("misc.proxy-unsafe-warning", proxyUnsafeWarning);
+
+ initComments();
+ }
+
+ private void initComments() {
+ fileConfig.setComment("verbose", " Should debug output be enabled? You don't need to change this unless you really know what you need.");
+ fileConfig.setComment("dont-touch-these-values-down-below.version", " DO NOT TOUCH THIS!!!");
+
+ // Performance settings
+ fileConfig.setComment("performance.use-spigot-drops-merging-mechanism", " Should large drops stack should be merged into smaller drops stack?");
+
+ // Bug-fixes settings
+ fileConfig.setComment("bug-fixes.fix-tripwire-duping", " Should Paper's tripwire duping fix be enabled? By disabling this you are able to duping tripwires!");
+
+ // Misc settings
+ fileConfig.setComment("misc.root-user-warning", " Should display warnings while this server is running on a root/administrator user?");
+ fileConfig.setComment("misc.offline-mode-warning", " Should display warnings while this server is running in offline/insecure mode?");
+ fileConfig.setComment("misc.proxy-unsafe-warning", " Should display warnings while this server is running in proxy mode?");
+ }
+}
diff --git a/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java b/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java
index 8aeb2aa9ccba986163441cc428c2804de438288c..b217cb396b3f6e79c968a5614cce0459bb818445 100644
--- a/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java
+++ b/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java
@@ -63,6 +63,7 @@ import org.bukkit.event.server.ServerCommandEvent;
import org.bukkit.craftbukkit.util.Waitable;
import org.bukkit.event.server.RemoteServerCommandEvent;
// CraftBukkit end
+import cc.keyimc.keyi.config.KGlobalConfig; // KeYi
public class DedicatedServer extends MinecraftServer implements ServerInterface {
@@ -180,7 +181,7 @@ public class DedicatedServer extends MinecraftServer implements ServerInterface
}
// Paper start - detect running as root
- if (io.papermc.paper.util.ServerEnvironment.userIsRootOrAdmin() && cc.keyimc.keyi.KeyiConfig.enableRootUserWarning) { // KeYi start - let user decide if we should warn
+ if (io.papermc.paper.util.ServerEnvironment.userIsRootOrAdmin() && KGlobalConfig.getInstance().rootUserWarning) { // KeYi start - let user decide if we should warn
DedicatedServer.LOGGER.warn("****************************");
DedicatedServer.LOGGER.warn("YOU ARE RUNNING THIS SERVER AS AN ADMINISTRATIVE OR ROOT USER. THIS IS NOT ADVISED.");
DedicatedServer.LOGGER.warn("YOU ARE OPENING YOURSELF UP TO POTENTIAL RISKS WHEN DOING THIS.");
@@ -236,9 +237,9 @@ public class DedicatedServer extends MinecraftServer implements ServerInterface
// KeYi start - init config
try {
- cc.keyimc.keyi.KeyiConfig.init((java.io.File) options.valueOf("keyi-settings"));
+ KGlobalConfig.getInstance().init();
}catch (Exception e) {
- LOGGER.error("Failed to load keyi.yml!", e);
+ logger.log(Level.ERROR, "Failed to load KeYi config!", e);
}
// KeYi end
@@ -322,14 +323,14 @@ public class DedicatedServer extends MinecraftServer implements ServerInterface
if (!this.usesAuthentication()) {
// KeYi start - let users choose if we should warn while running in offline mode
- if (cc.keyimc.keyi.KeyiConfig.enableOfflineModeWarning) {
+ if (KGlobalConfig.getInstance().offlineModeWarning) {
DedicatedServer.LOGGER.warn("**** SERVER IS RUNNING IN OFFLINE/INSECURE MODE!");
DedicatedServer.LOGGER.warn("The server will make no attempt to authenticate usernames. Beware.");
DedicatedServer.LOGGER.warn("To change this, set \"online-mode\" to \"true\" in the server.properties file."); // KeYi - move up
}
// KeYi end
// Spigot start
- if (io.papermc.paper.configuration.GlobalConfiguration.get().proxies.isProxyOnlineMode() && cc.keyimc.keyi.KeyiConfig.enableProxyUnsafeWarning) { // Purpur // KeYi - Let users decide if we should warn while running in proxy mode
+ if (io.papermc.paper.configuration.GlobalConfiguration.get().proxies.isProxyOnlineMode() && KGlobalConfig.getInstance().proxyUnsafeWarning) { // Purpur // KeYi - Let users decide if we should warn while running in proxy mode
DedicatedServer.LOGGER.warn("Whilst this makes it possible to use BungeeCord or Velocity, unless access to your server is properly restricted, it also opens up the ability for hackers to connect with any username they choose."); // Purpur
DedicatedServer.LOGGER.warn("Please see http://www.spigotmc.org/wiki/firewall-guide/ for further information.");
} else {
diff --git a/src/main/java/net/minecraft/world/entity/item/ItemEntity.java b/src/main/java/net/minecraft/world/entity/item/ItemEntity.java
index 2bcdd7232377784c548c228e4768697ef6918f2b..cf2b1232ab704e485695cb33ce8be05a3fcc678e 100644
--- a/src/main/java/net/minecraft/world/entity/item/ItemEntity.java
+++ b/src/main/java/net/minecraft/world/entity/item/ItemEntity.java
@@ -35,6 +35,7 @@ import org.bukkit.event.entity.EntityPickupItemEvent;
import org.bukkit.event.player.PlayerPickupItemEvent;
// CraftBukkit end
import org.bukkit.event.player.PlayerAttemptPickupItemEvent; // Paper
+import cc.keyimc.keyi.config.KGlobalConfig; // KeYi
public class ItemEntity extends Entity {
@@ -294,7 +295,7 @@ public class ItemEntity extends Entity {
ItemStack itemstack1 = other.getItem();
if (Objects.equals(this.getOwner(), other.getOwner()) && ItemEntity.areMergable(itemstack, itemstack1)) {
- if (cc.keyimc.keyi.KeyiConfig.useSpigotItemMergingMechanism || itemstack1.getCount() < itemstack.getCount()) { // Spigot // KeYi
+ if (KGlobalConfig.getInstance().spigotDropsMergingMechanism || itemstack1.getCount() < itemstack.getCount()) { // Spigot // KeYi
ItemEntity.merge(this, itemstack, other, itemstack1);
} else {
ItemEntity.merge(other, itemstack1, this, itemstack);
diff --git a/src/main/java/net/minecraft/world/level/block/TripWireHookBlock.java b/src/main/java/net/minecraft/world/level/block/TripWireHookBlock.java
index b37a5d643dc07eaa0808b972f43281f2e24d3394..02b3d90227f37190d327b5530d5aafd687d123b9 100644
--- a/src/main/java/net/minecraft/world/level/block/TripWireHookBlock.java
+++ b/src/main/java/net/minecraft/world/level/block/TripWireHookBlock.java
@@ -27,6 +27,7 @@ import net.minecraft.world.level.gameevent.GameEvent;
import net.minecraft.world.phys.shapes.CollisionContext;
import net.minecraft.world.phys.shapes.VoxelShape;
import org.bukkit.event.block.BlockRedstoneEvent; // CraftBukkit
+import cc.keyimc.keyi.config.KGlobalConfig;// KeYi
public class TripWireHookBlock extends Block {
@@ -147,7 +148,7 @@ public class TripWireHookBlock extends Block {
boolean flag7 = (Boolean) iblockdata2.getValue(TripWireBlock.POWERED);
flag5 |= flag6 && flag7;
- if (k != i || !tripWireBeingRemoved || !flag6 || cc.keyimc.keyi.KeyiConfig.fixTripwireDuping) // Paper - don't update the tripwire again if being removed and not disarmed // KeYi
+ if (k != i || !tripWireBeingRemoved || !flag6 || KGlobalConfig.getInstance().fixTripwireDuping) // Paper - don't update the tripwire again if being removed and not disarmed // KeYi
aiblockdata[k] = iblockdata2;
if (k == i) {
world.scheduleTick(pos, (Block) this, 10);

View File

@@ -0,0 +1,81 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: nostalgic853 <yuu8583@proton.me>
Date: Wed, 21 Dec 2022 17:05:01 +0800
Subject: [PATCH] Low active POI finding for entities in vehicle
Airplane
Copyright (C) 2020 Technove LLC
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
diff --git a/src/main/java/cc/keyimc/keyi/config/KGlobalConfig.java b/src/main/java/cc/keyimc/keyi/config/KGlobalConfig.java
index 3a82d6bcd92c497ce21e5fd3cf569d5794aedb2e..9f6a8841390b6982efb3ebb21ced137c780e5d1d 100644
--- a/src/main/java/cc/keyimc/keyi/config/KGlobalConfig.java
+++ b/src/main/java/cc/keyimc/keyi/config/KGlobalConfig.java
@@ -60,6 +60,7 @@ public class KGlobalConfig {
// Performance settings
public boolean spigotDropsMergingMechanism = true;
+ public boolean lowActivePoiFindingForEntitiesInVehicle = true;
// Bug-fixes settings
public boolean fixTripwireDuping = true;
@@ -75,6 +76,7 @@ public class KGlobalConfig {
// Performance settings
spigotDropsMergingMechanism = get("performance.use-spigot-drops-merging-mechanism", spigotDropsMergingMechanism);
+ lowActivePoiFindingForEntitiesInVehicle = get("performance.low-active-poi-finding-for-entities-in-vehicle", lowActivePoiFindingForEntitiesInVehicle);
// Bug-fixes settings
fixTripwireDuping = get("bug-fixes.fix-tripwire-duping", fixTripwireDuping);
@@ -93,6 +95,7 @@ public class KGlobalConfig {
// Performance settings
fileConfig.setComment("performance.use-spigot-drops-merging-mechanism", " Should large drops stack should be merged into smaller drops stack?");
+ fileConfig.setComment("performance.low-active-poi-finding-for-entities-in-vehicle", " Should the server wait more 10s to do POI finding of entities stuck in a vehicle?");
// Bug-fixes settings
fileConfig.setComment("bug-fixes.fix-tripwire-duping", " Should Paper's tripwire duping fix be enabled? By disabling this you are able to duping tripwires!");
diff --git a/src/main/java/net/minecraft/world/entity/ai/behavior/AcquirePoi.java b/src/main/java/net/minecraft/world/entity/ai/behavior/AcquirePoi.java
index fe502445a77afe7e3807afae48d7bf03f370e290..1c555f6c10740506242b12775304c6a310cc1f25 100644
--- a/src/main/java/net/minecraft/world/entity/ai/behavior/AcquirePoi.java
+++ b/src/main/java/net/minecraft/world/entity/ai/behavior/AcquirePoi.java
@@ -7,7 +7,6 @@ import java.util.HashSet;
import java.util.Optional;
import java.util.Set;
import java.util.function.Predicate;
-import java.util.stream.Collectors;
import javax.annotation.Nullable;
import net.minecraft.core.BlockPos;
import net.minecraft.core.GlobalPos;
@@ -22,6 +21,7 @@ import net.minecraft.world.entity.ai.village.poi.PoiManager;
import net.minecraft.world.entity.ai.village.poi.PoiType;
import net.minecraft.world.level.pathfinder.Path;
import org.apache.commons.lang3.mutable.MutableLong;
+import cc.keyimc.keyi.config.KGlobalConfig; // KeYi
public class AcquirePoi {
public static final int SCAN_RANGE = 48;
@@ -47,6 +47,11 @@ public class AcquirePoi {
return false;
} else {
mutableLong.setValue(time + 20L + (long)world.getRandom().nextInt(20));
+ // KeYi start - Airplane: wait an additional 10s to check again if they're stuck
+ if (entity.getNavigation().isStuck() && KGlobalConfig.getInstance().lowActivePoiFindingForEntitiesInVehicle) {
+ mutableLong.add(200);
+ }
+ // KeYi end
if (entity.getNavigation().isStuck()) mutableLong.add(200); // Pufferfish - wait an additional 10s to check again if they're stuck
PoiManager poiManager = world.getPoiManager();
long2ObjectMap.long2ObjectEntrySet().removeIf((entry) -> {

View File

@@ -0,0 +1,57 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: nostalgic853 <yuu8583@proton.me>
Date: Wed, 21 Dec 2022 17:21:04 +0800
Subject: [PATCH] Fast item merging raytracing
diff --git a/src/main/java/cc/keyimc/keyi/config/KGlobalConfig.java b/src/main/java/cc/keyimc/keyi/config/KGlobalConfig.java
index 9f6a8841390b6982efb3ebb21ced137c780e5d1d..0e3db3ab79b3712704350aefbbf07f966a3fb083 100644
--- a/src/main/java/cc/keyimc/keyi/config/KGlobalConfig.java
+++ b/src/main/java/cc/keyimc/keyi/config/KGlobalConfig.java
@@ -61,6 +61,7 @@ public class KGlobalConfig {
// Performance settings
public boolean spigotDropsMergingMechanism = true;
public boolean lowActivePoiFindingForEntitiesInVehicle = true;
+ public boolean useFastItemMergingRaytracing = true;
// Bug-fixes settings
public boolean fixTripwireDuping = true;
@@ -77,6 +78,7 @@ public class KGlobalConfig {
// Performance settings
spigotDropsMergingMechanism = get("performance.use-spigot-drops-merging-mechanism", spigotDropsMergingMechanism);
lowActivePoiFindingForEntitiesInVehicle = get("performance.low-active-poi-finding-for-entities-in-vehicle", lowActivePoiFindingForEntitiesInVehicle);
+ useFastItemMergingRaytracing = get("performance.use-fast-item-merge-raytracing", useFastItemMergingRaytracing);
// Bug-fixes settings
fixTripwireDuping = get("bug-fixes.fix-tripwire-duping", fixTripwireDuping);
@@ -96,6 +98,7 @@ public class KGlobalConfig {
// Performance settings
fileConfig.setComment("performance.use-spigot-drops-merging-mechanism", " Should large drops stack should be merged into smaller drops stack?");
fileConfig.setComment("performance.low-active-poi-finding-for-entities-in-vehicle", " Should the server wait more 10s to do POI finding of entities stuck in a vehicle?");
+ fileConfig.setComment("performance.use-fast-item-merge-raytracing", " Skip some allocations to make some operations faster.");
// Bug-fixes settings
fileConfig.setComment("bug-fixes.fix-tripwire-duping", " Should Paper's tripwire duping fix be enabled? By disabling this you are able to duping tripwires!");
diff --git a/src/main/java/net/minecraft/world/entity/item/ItemEntity.java b/src/main/java/net/minecraft/world/entity/item/ItemEntity.java
index cf2b1232ab704e485695cb33ce8be05a3fcc678e..fbde463c789d728150f7963ab1598a811c2522c1 100644
--- a/src/main/java/net/minecraft/world/entity/item/ItemEntity.java
+++ b/src/main/java/net/minecraft/world/entity/item/ItemEntity.java
@@ -263,12 +263,12 @@ public class ItemEntity extends Entity {
// Paper Start - Fix items merging through walls
if (this.level.paperConfig().fixes.fixItemsMergingThroughWalls) {
// Pufferfish start - skip the allocations
- /*
- net.minecraft.world.level.ClipContext rayTrace = new net.minecraft.world.level.ClipContext(this.position(), entityitem.position(),
- net.minecraft.world.level.ClipContext.Block.COLLIDER, net.minecraft.world.level.ClipContext.Fluid.NONE, this);
- net.minecraft.world.phys.BlockHitResult rayTraceResult = level.clip(rayTrace);
- if (rayTraceResult.getType() == net.minecraft.world.phys.HitResult.Type.BLOCK) continue;
- */
+ if (!KGlobalConfig.getInstance().useFastItemMergingRaytracing) {
+ net.minecraft.world.level.ClipContext rayTrace = new net.minecraft.world.level.ClipContext(this.position(), entityitem.position(),
+ net.minecraft.world.level.ClipContext.Block.COLLIDER, net.minecraft.world.level.ClipContext.Fluid.NONE, this);
+ net.minecraft.world.phys.BlockHitResult rayTraceResult = level.clip(rayTrace);
+ if (rayTraceResult.getType() == net.minecraft.world.phys.HitResult.Type.BLOCK) continue;
+ }
if (level.rayTraceDirect(this.position(), entityitem.position(), net.minecraft.world.phys.shapes.CollisionContext.of(this)) ==
net.minecraft.world.phys.HitResult.Type.BLOCK) continue;
// Pufferfish end

View File

@@ -1,17 +1,17 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: astei <andrew@steinborn.me>
Date: Sat, 1 Oct 2022 09:56:47 +0200
Subject: [PATCH] PaperPR Optimize VarInts
Subject: [PATCH] Optimize VarInts
Original license: GPLv3
Original project: https://github.com/PaperMC/Velocity
Paper pull request: https://github.com/PaperMC/Paper/pull/8418
diff --git a/src/main/java/net/minecraft/network/FriendlyByteBuf.java b/src/main/java/net/minecraft/network/FriendlyByteBuf.java
index a7b6e22daf64abca311bc5771192a3c09368537f..c264aa4c8db4d68c75364206893e6aff7f2e483e 100644
index 314318a21b6fa9e827945d8996c6ed0f9679a4eb..2e1cf850f1b26f25ea09178941f4c789d65d851f 100644
--- a/src/main/java/net/minecraft/network/FriendlyByteBuf.java
+++ b/src/main/java/net/minecraft/network/FriendlyByteBuf.java
@@ -89,15 +89,18 @@ public class FriendlyByteBuf extends ByteBuf {
@@ -95,15 +95,18 @@ public class FriendlyByteBuf extends ByteBuf {
this.source = parent;
}
@@ -37,7 +37,7 @@ index a7b6e22daf64abca311bc5771192a3c09368537f..c264aa4c8db4d68c75364206893e6aff
public static int getVarLongSize(long value) {
for (int j = 1; j < 10; ++j) {
@@ -505,7 +508,22 @@ public class FriendlyByteBuf extends ByteBuf {
@@ -567,7 +570,22 @@ public class FriendlyByteBuf extends ByteBuf {
return new UUID(this.readLong(), this.readLong());
}

View File

@@ -0,0 +1,129 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: nostalgic853 <yuu8583@proton.me>
Date: Sun, 15 Jan 2023 03:00:29 +0800
Subject: [PATCH] Make things more configurable
diff --git a/src/main/java/cc/keyimc/keyi/config/KGlobalConfig.java b/src/main/java/cc/keyimc/keyi/config/KGlobalConfig.java
index 5e01dfe18789ce3815ce1c36233ef89265584d44..ed2d911f5393abb6c398c909c4667867034aaf87 100644
--- a/src/main/java/cc/keyimc/keyi/config/KGlobalConfig.java
+++ b/src/main/java/cc/keyimc/keyi/config/KGlobalConfig.java
@@ -62,6 +62,9 @@ public class KGlobalConfig {
public boolean spigotDropsMergingMechanism = true;
public boolean lowActivePoiFindingForEntitiesInVehicle = true;
public boolean useFastItemMergingRaytracing = true;
+ public boolean useOptimizedVarInts = true;
+ public boolean saveFirework = false;
+ public boolean fastSpeedCheck = true;
// Bug-fixes settings
public boolean fixTripwireDuping = true;
@@ -79,6 +82,9 @@ public class KGlobalConfig {
spigotDropsMergingMechanism = get("performance.use-spigot-drops-merging-mechanism", spigotDropsMergingMechanism);
lowActivePoiFindingForEntitiesInVehicle = get("performance.low-active-poi-finding-for-entities-in-vehicle", lowActivePoiFindingForEntitiesInVehicle);
useFastItemMergingRaytracing = get("performance.use-fast-item-merge-raytracing", useFastItemMergingRaytracing);
+ useOptimizedVarInts = get("performance.use-optimized-var-ints", useOptimizedVarInts);
+ saveFirework = get("performance.save-firework", saveFirework);
+ fastSpeedCheck = get("performance.fast-speed-check", fastSpeedCheck);
// Bug-fixes settings
fixTripwireDuping = get("bug-fixes.fix-tripwire-duping", fixTripwireDuping);
@@ -99,6 +105,9 @@ public class KGlobalConfig {
fileConfig.setComment("performance.use-spigot-drops-merging-mechanism", " Should large drops stack should be merged into smaller drops stack?");
fileConfig.setComment("performance.low-active-poi-finding-for-entities-in-vehicle", " Should the server wait more 10s to do POI finding of entities stuck in a vehicle?");
fileConfig.setComment("performance.use-fast-item-merge-raytracing", " Skip some allocations to make some operations faster.");
+ fileConfig.setComment("performance.use-optimized-var-ints", " Use an optimized var ints method from Paper's unmerged PR.");
+ fileConfig.setComment("performance.save-firework", " Should fireworks to be saved?");
+ fileConfig.setComment("performance.fast-speed-check", " Use a faster speed check method.");
// Bug-fixes settings
fileConfig.setComment("bug-fixes.fix-tripwire-duping", " Should Paper's tripwire duping fix be enabled? By disabling this you are able to duping tripwires!");
diff --git a/src/main/java/net/minecraft/network/FriendlyByteBuf.java b/src/main/java/net/minecraft/network/FriendlyByteBuf.java
index 2e1cf850f1b26f25ea09178941f4c789d65d851f..6a303f47e33c128d6de299f4ea2d49049baeb08e 100644
--- a/src/main/java/net/minecraft/network/FriendlyByteBuf.java
+++ b/src/main/java/net/minecraft/network/FriendlyByteBuf.java
@@ -1,5 +1,6 @@
package net.minecraft.network;
+import cc.keyimc.keyi.config.KGlobalConfig;
import com.google.common.annotations.VisibleForTesting;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
@@ -98,13 +99,25 @@ public class FriendlyByteBuf extends ByteBuf {
// Paper start - Optimize VarInts
private static final int[] VARINT_EXACT_BYTE_LENGTHS = new int[33];
static {
- for (int i = 0; i <= 32; ++i) {
- VARINT_EXACT_BYTE_LENGTHS[i] = (int) Math.ceil((31d - (i - 1)) / 7d);
+ if (KGlobalConfig.getInstance().useOptimizedVarInts) {
+ for (int i = 0; i <= 32; ++i) {
+ VARINT_EXACT_BYTE_LENGTHS[i] = (int) Math.ceil((31d - (i - 1)) / 7d);
+ }
+ VARINT_EXACT_BYTE_LENGTHS[32] = 1; // Special case for the number 0.
}
- VARINT_EXACT_BYTE_LENGTHS[32] = 1; // Special case for the number 0.
}
public static int getVarIntSize(int value) {
- return VARINT_EXACT_BYTE_LENGTHS[Integer.numberOfLeadingZeros(value)]; // Paper - Optimize VarInts
+ if (KGlobalConfig.getInstance().useOptimizedVarInts) {
+ return VARINT_EXACT_BYTE_LENGTHS[Integer.numberOfLeadingZeros(value)]; // Paper - Optimize VarInts
+ } else {
+ for (int j = 1; j < 5; ++j) {
+ if ((value & -1 << j * 7) == 0) {
+ return j;
+ }
+ }
+
+ return 5;
+ }
}
// Paper end - Optimize VarInts
diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java
index 85542015ef7376baf0cfaa090265c1286459788b..af5addc0b647ebb0033048fdc48866071a13f829 100644
--- a/src/main/java/net/minecraft/world/entity/Entity.java
+++ b/src/main/java/net/minecraft/world/entity/Entity.java
@@ -1,5 +1,6 @@
package net.minecraft.world.entity;
+import cc.keyimc.keyi.config.KGlobalConfig;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableList.Builder;
import com.google.common.collect.Iterables;
@@ -1206,8 +1207,12 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource {
this.tryCheckInsideBlocks();
// KeYi start - Fast speed check
float f2;
- if (this.getDeltaMovement().x == 0 && this.getDeltaMovement().z == 0) {
- f2 = 1;
+ if (KGlobalConfig.getInstance().fastSpeedCheck) {
+ if (this.getDeltaMovement().x == 0 && this.getDeltaMovement().z == 0) {
+ f2 = 1;
+ } else {
+ f2 = this.getBlockSpeedFactor();
+ }
} else {
f2 = this.getBlockSpeedFactor();
}
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 0b664dfef68b1e3905c9d8451602abf9cd9eafe6..0cd2b587ee4c2c565d660a5e04c77ecec9d597b5 100644
--- a/src/main/java/net/minecraft/world/entity/projectile/FireworkRocketEntity.java
+++ b/src/main/java/net/minecraft/world/entity/projectile/FireworkRocketEntity.java
@@ -4,6 +4,8 @@ import java.util.Iterator;
import java.util.List;
import java.util.OptionalInt;
import javax.annotation.Nullable;
+
+import cc.keyimc.keyi.config.KGlobalConfig;
import net.minecraft.core.BlockPos;
import net.minecraft.core.particles.ParticleTypes;
import net.minecraft.nbt.CompoundTag;
@@ -362,7 +364,7 @@ public class FireworkRocketEntity extends Projectile implements ItemSupplier {
// KeYi start
@Override
public boolean shouldBeSaved() {
- return false;
+ return KGlobalConfig.getInstance().saveFirework;
}
// KeYi end
}