From c4451ae6cdc80b39cb7a24298d59c6428cde4c02 Mon Sep 17 00:00:00 2001 From: Ben Kerllenevich Date: Fri, 4 Mar 2022 07:11:14 -0500 Subject: [PATCH] Updated Upstream (Paper & Pufferfish) Upstream has released updates that appear to apply and compile correctly Paper Changes: PaperMC/Paper@753bf2c Update paperweight to 1.3.5 PaperMC/Paper@15b6b3d Add StructuresLocateEvent as replacement for StructureLocateEvent (#7524) PaperMC/Paper@c09365a Fix deadlock on watchdog crash (#7535) PaperMC/Paper@719daa8 Updated Upstream (CraftBukkit) PaperMC/Paper@b9f26bb Add printPaperVersion task PaperMC/Paper@63aa4d3 Clarify exception messages for invalid view distances (#7510) Pufferfish Changes: pufferfish-gg/Pufferfish@a786526 Updated Upstream (Paper) pufferfish-gg/Pufferfish@e0075db 1.18.2 - Updated Upstream (Paper) --- gradle.properties | 2 +- .../0001-Pufferfish-Server-Changes.patch | 394 ++++++++++-------- patches/server/0002-Rebrand.patch | 14 +- patches/server/0006-Ridables.patch | 8 +- .../0013-Configurable-server-mod-name.patch | 4 +- patches/server/0015-Lagging-threshold.patch | 6 +- .../0052-Configurable-TPS-Catchup.patch | 4 +- ...0066-Add-5-second-tps-average-in-tps.patch | 8 +- .../0105-Configurable-daylight-cycle.patch | 6 +- patches/server/0127-Implement-TPSBar.patch | 4 +- .../server/0237-UPnP-Port-Forwarding.patch | 4 +- ...counts-in-beehives-to-Purpur-clients.patch | 4 +- patches/server/0271-Fix-compile-errors.patch | 77 ---- 13 files changed, 260 insertions(+), 275 deletions(-) delete mode 100644 patches/server/0271-Fix-compile-errors.patch diff --git a/gradle.properties b/gradle.properties index d15b9491e..5ecc802e9 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,7 +1,7 @@ group = org.purpurmc.purpur version = 1.18.2-R0.1-SNAPSHOT -paperCommit = d33cdcf2e6ee53b28cabe99f417c7995bd9b7bc3 +paperCommit = 63aa4d33194cae156d1bed840868336cda6bc52b org.gradle.caching = true org.gradle.parallel = true diff --git a/patches/server/0001-Pufferfish-Server-Changes.patch b/patches/server/0001-Pufferfish-Server-Changes.patch index 4df6f1dcf..691dfd071 100644 --- a/patches/server/0001-Pufferfish-Server-Changes.patch +++ b/patches/server/0001-Pufferfish-Server-Changes.patch @@ -20,7 +20,7 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . diff --git a/build.gradle.kts b/build.gradle.kts -index 4beb35d1e5b013395f5df101e843f41c2ce174ad..27c18ced1ce6d38c9cd05eb4269f25a9d6520030 100644 +index 4beb35d1e5b013395f5df101e843f41c2ce174ad..ecb65e75d19d2f7b72410c89251e56566b7b6dc0 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -18,8 +18,12 @@ repositories { @@ -31,7 +31,7 @@ index 4beb35d1e5b013395f5df101e843f41c2ce174ad..27c18ced1ce6d38c9cd05eb4269f25a9 - implementation(project(":paper-mojangapi")) + implementation(project(":pufferfish-api")) // Pufferfish // Paper + // Pufferfish start -+ implementation("io.papermc.paper:paper-mojangapi:1.18.1-R0.1-SNAPSHOT") { ++ implementation("io.papermc.paper:paper-mojangapi:1.18.2-R0.1-SNAPSHOT") { + exclude("io.papermc.paper", "paper-api") + } + // Pufferfish end @@ -555,7 +555,7 @@ index 0000000000000000000000000000000000000000..a7f297ebb569f7c1f205e967ca485be7 +} diff --git a/src/main/java/gg/pufferfish/pufferfish/PufferfishCommand.java b/src/main/java/gg/pufferfish/pufferfish/PufferfishCommand.java new file mode 100644 -index 0000000000000000000000000000000000000000..020368da69b9a492155f6de6297f74732f4ab6ea +index 0000000000000000000000000000000000000000..e164237e749bcc43466d4ed7aeada5ab9fddf8a6 --- /dev/null +++ b/src/main/java/gg/pufferfish/pufferfish/PufferfishCommand.java @@ -0,0 +1,68 @@ @@ -583,7 +583,7 @@ index 0000000000000000000000000000000000000000..020368da69b9a492155f6de6297f7473 + this.usageMessage = "/pufferfish [reload | version]"; + this.setPermission("bukkit.command.pufferfish"); + } -+ ++ + public static void init() { + MinecraftServer.getServer().server.getCommandMap().register("pufferfish", "Pufferfish", new PufferfishCommand()); + } @@ -629,7 +629,7 @@ index 0000000000000000000000000000000000000000..020368da69b9a492155f6de6297f7473 +} diff --git a/src/main/java/gg/pufferfish/pufferfish/PufferfishConfig.java b/src/main/java/gg/pufferfish/pufferfish/PufferfishConfig.java new file mode 100644 -index 0000000000000000000000000000000000000000..56330536c52fa327ef89d7a08e72557c6633c8bb +index 0000000000000000000000000000000000000000..cd03fed32807fd943fdeee8571c1648b8bd567d0 --- /dev/null +++ b/src/main/java/gg/pufferfish/pufferfish/PufferfishConfig.java @@ -0,0 +1,291 @@ @@ -665,10 +665,10 @@ index 0000000000000000000000000000000000000000..56330536c52fa327ef89d7a08e72557c +import java.util.Collections; + +public class PufferfishConfig { -+ ++ + private static final YamlFile config = new YamlFile(); + private static int updates = 0; -+ ++ + private static ConfigurationSection convertToBukkit(org.simpleyaml.configuration.ConfigurationSection section) { + ConfigurationSection newSection = new MemoryConfiguration(); + for (String key : section.getKeys(false)) { @@ -680,18 +680,18 @@ index 0000000000000000000000000000000000000000..56330536c52fa327ef89d7a08e72557c + } + return newSection; + } -+ ++ + public static ConfigurationSection getConfigCopy() { + return convertToBukkit(config); + } -+ ++ + public static int getUpdates() { + return updates; + } -+ ++ + public static void load() throws IOException { + File configFile = new File("pufferfish.yml"); -+ ++ + if (configFile.exists()) { + try { + config.load(configFile); @@ -699,14 +699,14 @@ index 0000000000000000000000000000000000000000..56330536c52fa327ef89d7a08e72557c + throw new IOException(e); + } + } -+ ++ + getString("info.version", "1.0"); + setComment("info", + "Pufferfish Configuration", + "Check out Pufferfish Host for maximum performance server hosting: https://pufferfish.host", + "Join our Discord for support: https://discord.gg/reZw4vQV9H", + "Download new builds at https://ci.pufferfish.host/job/Pufferfish"); -+ ++ + for (Method method : PufferfishConfig.class.getDeclaredMethods()) { + if (Modifier.isStatic(method.getModifiers()) && Modifier.isPrivate(method.getModifiers()) && method.getParameterCount() == 0 && + method.getReturnType() == Void.TYPE && !method.getName().startsWith("lambda")) { @@ -718,17 +718,17 @@ index 0000000000000000000000000000000000000000..56330536c52fa327ef89d7a08e72557c + } + } + } -+ ++ + updates++; -+ ++ + config.save(configFile); -+ ++ + // Attempt to detect vectorization + try { + SIMDDetection.isEnabled = SIMDDetection.canEnable(); + SIMDDetection.versionLimited = SIMDDetection.getJavaVersion() != 17; + } catch (NoClassDefFoundError | Exception ignored) {} -+ ++ + if (SIMDDetection.isEnabled) { + PufferfishLogger.LOGGER.info("SIMD operations detected as functional. Will replace some operations with faster versions."); + } else if (SIMDDetection.versionLimited) { @@ -738,76 +738,76 @@ index 0000000000000000000000000000000000000000..56330536c52fa327ef89d7a08e72557c + PufferfishLogger.LOGGER.warning("To enable additional optimizations, add \"--add-modules=jdk.incubator.vector\" to your startup flags, BEFORE the \"-jar\"."); + } + } -+ ++ + private static void setComment(String key, String... comment) { + if (config.contains(key)) { + config.setComment(key, String.join("\n", comment), CommentType.BLOCK); + } + } -+ ++ + private static void ensureDefault(String key, Object defaultValue, String... comment) { + if (!config.contains(key)) { + config.set(key, defaultValue); + config.setComment(key, String.join("\n", comment), CommentType.BLOCK); + } + } -+ ++ + private static boolean getBoolean(String key, boolean defaultValue, String... comment) { + return getBoolean(key, null, defaultValue, comment); + } -+ ++ + private static boolean getBoolean(String key, @Nullable String oldKey, boolean defaultValue, String... comment) { + ensureDefault(key, defaultValue, comment); + return config.getBoolean(key, defaultValue); + } -+ ++ + private static int getInt(String key, int defaultValue, String... comment) { + return getInt(key, null, defaultValue, comment); + } -+ ++ + private static int getInt(String key, @Nullable String oldKey, int defaultValue, String... comment) { + ensureDefault(key, defaultValue, comment); + return config.getInt(key, defaultValue); + } -+ ++ + private static double getDouble(String key, double defaultValue, String... comment) { + return getDouble(key, null, defaultValue, comment); + } -+ ++ + private static double getDouble(String key, @Nullable String oldKey, double defaultValue, String... comment) { + ensureDefault(key, defaultValue, comment); + return config.getDouble(key, defaultValue); + } -+ ++ + private static String getString(String key, String defaultValue, String... comment) { + return getOldString(key, null, defaultValue, comment); + } -+ ++ + private static String getOldString(String key, @Nullable String oldKey, String defaultValue, String... comment) { + ensureDefault(key, defaultValue, comment); + return config.getString(key, defaultValue); + } -+ ++ + private static List getStringList(String key, List defaultValue, String... comment) { + return getStringList(key, null, defaultValue, comment); + } -+ ++ + private static List getStringList(String key, @Nullable String oldKey, List defaultValue, String... comment) { + ensureDefault(key, defaultValue, comment); + return config.getStringList(key); + } -+ ++ + public static String sentryDsn; + private static void sentry() { + String sentryEnvironment = System.getenv("SENTRY_DSN"); + String sentryConfig = getString("sentry-dsn", "", "Sentry DSN for improved error logging, leave blank to disable", "Obtain from https://sentry.io/"); -+ ++ + sentryDsn = sentryEnvironment == null ? sentryConfig : sentryEnvironment; + if (sentryDsn != null && !sentryDsn.isBlank()) { + gg.pufferfish.pufferfish.sentry.SentryManager.init(); + } + } -+ ++ + public static boolean enableBooks; + private static void books() { + enableBooks = getBoolean("enable-books", true, @@ -816,7 +816,7 @@ index 0000000000000000000000000000000000000000..56330536c52fa327ef89d7a08e72557c + "disabling this option.", + "This can be overridden per-player with the permission pufferfish.usebooks"); + } -+ ++ + public static boolean enableSuffocationOptimization; + private static void suffocationOptimization() { + enableSuffocationOptimization = getBoolean("enable-suffocation-optimization", true, @@ -825,7 +825,7 @@ index 0000000000000000000000000000000000000000..56330536c52fa327ef89d7a08e72557c + "be left enabled on most servers, but is provided as a", + "configuration option if the vanilla deviation is undesirable."); + } -+ ++ + public static boolean enableAsyncMobSpawning; + public static boolean asyncMobSpawningInitialized; + private static void asyncMobSpawning() { @@ -835,14 +835,14 @@ index 0000000000000000000000000000000000000000..56330536c52fa327ef89d7a08e72557c + "paper's per-player-mob-spawns setting set to true for this to work.", + "One quick note - this does not actually spawn mobs async (that would be very unsafe).", + "This just offloads some expensive calculations that are required for mob spawning."); -+ ++ + // This prevents us from changing the value during a reload. + if (!asyncMobSpawningInitialized) { + asyncMobSpawningInitialized = true; + enableAsyncMobSpawning = temp; + } + } -+ ++ + public static int maxProjectileLoadsPerTick; + public static int maxProjectileLoadsPerProjectile; + private static void projectileLoading() { @@ -884,7 +884,7 @@ index 0000000000000000000000000000000000000000..56330536c52fa327ef89d7a08e72557c + + setComment("dab", "Optimizes entity brains when", "they're far away from the player"); + } -+ ++ + public static boolean throttleInactiveGoalSelectorTick; + private static void inactiveGoalSelectorThrottle() { + getBoolean("inactive-goal-selector-throttle", "inactive-goal-selector-disable", true, @@ -948,7 +948,7 @@ index 0000000000000000000000000000000000000000..53f2df00c6809618a9ee3d2ea72e85e8 +} diff --git a/src/main/java/gg/pufferfish/pufferfish/PufferfishVersionFetcher.java b/src/main/java/gg/pufferfish/pufferfish/PufferfishVersionFetcher.java new file mode 100644 -index 0000000000000000000000000000000000000000..adafc4fd661cf080b004b86c3eaed231a0133101 +index 0000000000000000000000000000000000000000..461022af9ad85fe00329678f0f61d684d291c628 --- /dev/null +++ b/src/main/java/gg/pufferfish/pufferfish/PufferfishVersionFetcher.java @@ -0,0 +1,136 @@ @@ -980,46 +980,46 @@ index 0000000000000000000000000000000000000000..adafc4fd661cf080b004b86c3eaed231 +import org.jetbrains.annotations.Nullable; + +public class PufferfishVersionFetcher implements VersionFetcher { -+ ++ + private static final Logger LOGGER = Logger.getLogger("PufferfishVersionFetcher"); + private static final HttpClient client = HttpClient.newHttpClient(); -+ ++ + private static final URI JENKINS_URI = URI.create("https://ci.pufferfish.host/job/Pufferfish-1.18/lastSuccessfulBuild/buildNumber"); + private static final String GITHUB_FORMAT = "https://api.github.com/repos/pufferfish-gg/Pufferfish/compare/ver/1.18...%s"; -+ ++ + private static final HttpResponse.BodyHandler JSON_OBJECT_BODY_HANDLER = responseInfo -> HttpResponse.BodySubscribers + .mapping( + HttpResponse.BodySubscribers.ofString(StandardCharsets.UTF_8), + string -> new Gson().fromJson(string, JsonObject.class) + ); -+ ++ + @Override + public long getCacheTime() { + return TimeUnit.MINUTES.toMillis(30); + } -+ ++ + @Override + public @NotNull Component getVersionMessage(final @NotNull String serverVersion) { + final String[] parts = CraftServer.class.getPackage().getImplementationVersion().split("-"); + @NotNull Component component; -+ ++ + if (parts.length != 3) { + component = text("Unknown server version.", RED); + } else { + final String versionString = parts[2]; -+ ++ + try { + component = this.fetchJenkinsVersion(Integer.parseInt(versionString)); + } catch (NumberFormatException e) { + component = this.fetchGithubVersion(versionString.substring(1, versionString.length() - 1)); + } + } -+ ++ + final @Nullable Component history = this.getHistory(); + return history != null ? Component + .join(JoinConfiguration.noSeparators(), component, Component.newline(), this.getHistory()) : component; + } -+ ++ + private @NotNull Component fetchJenkinsVersion(final int versionNumber) { + final HttpRequest request = HttpRequest.newBuilder(JENKINS_URI).build(); + try { @@ -1027,7 +1027,7 @@ index 0000000000000000000000000000000000000000..adafc4fd661cf080b004b86c3eaed231 + if (response.statusCode() != 200) { + return text("Received invalid status code (" + response.statusCode() + ") from server.", RED); + } -+ ++ + int latestVersionNumber; + try { + latestVersionNumber = Integer.parseInt(response.body()); @@ -1035,7 +1035,7 @@ index 0000000000000000000000000000000000000000..adafc4fd661cf080b004b86c3eaed231 + LOGGER.log(Level.WARNING, "Received invalid response from Jenkins \"" + response.body() + "\"."); + return text("Received invalid response from server.", RED); + } -+ ++ + final int versionDiff = latestVersionNumber - versionNumber; + return this.getResponseMessage(versionDiff); + } catch (IOException | InterruptedException e) { @@ -1043,7 +1043,7 @@ index 0000000000000000000000000000000000000000..adafc4fd661cf080b004b86c3eaed231 + return text("Failed to retrieve version from server.", RED); + } + } -+ ++ + // Based off code contributed by Techcable in Paper/GH-65 + private @NotNull Component fetchGithubVersion(final @NotNull String hash) { + final URI uri = URI.create(String.format(GITHUB_FORMAT, hash)); @@ -1053,17 +1053,17 @@ index 0000000000000000000000000000000000000000..adafc4fd661cf080b004b86c3eaed231 + if (response.statusCode() != 200) { + return text("Received invalid status code (" + response.statusCode() + ") from server.", RED); + } -+ ++ + final JsonObject obj = response.body(); + final int versionDiff = obj.get("behind_by").getAsInt(); -+ ++ + return this.getResponseMessage(versionDiff); + } catch (IOException | InterruptedException e) { + LOGGER.log(Level.WARNING, "Failed to look up version from GitHub", e); + return text("Failed to retrieve version from server.", RED); + } + } -+ ++ + private @NotNull Component getResponseMessage(final int versionDiff) { + return switch (Math.max(-1, Math.min(1, versionDiff))) { + case -1 -> text("You are running an unsupported version of Pufferfish.", RED); @@ -1073,18 +1073,18 @@ index 0000000000000000000000000000000000000000..adafc4fd661cf080b004b86c3eaed231 + RED); + }; + } -+ ++ + private @Nullable Component getHistory() { + final VersionHistoryManager.VersionData data = VersionHistoryManager.INSTANCE.getVersionData(); + if (data == null) { + return null; + } -+ ++ + final String oldVersion = data.getOldVersion(); + if (oldVersion == null) { + return null; + } -+ ++ + return Component.text("Previous version: " + oldVersion, NamedTextColor.GRAY, TextDecoration.ITALIC); + } +} @@ -1784,7 +1784,7 @@ index 0000000000000000000000000000000000000000..db15d3fbe2b65fc8035573f5fdbea382 +} diff --git a/src/main/java/gg/pufferfish/pufferfish/sentry/PufferfishSentryAppender.java b/src/main/java/gg/pufferfish/pufferfish/sentry/PufferfishSentryAppender.java new file mode 100644 -index 0000000000000000000000000000000000000000..731ef11c7a025ae95ed8a757b530d834733d0621 +index 0000000000000000000000000000000000000000..d04a8a4336566dbe6e1b9ec0d574cff43e003fa8 --- /dev/null +++ b/src/main/java/gg/pufferfish/pufferfish/sentry/PufferfishSentryAppender.java @@ -0,0 +1,135 @@ @@ -1808,14 +1808,14 @@ index 0000000000000000000000000000000000000000..731ef11c7a025ae95ed8a757b530d834 +import org.apache.logging.log4j.core.filter.AbstractFilter; + +public class PufferfishSentryAppender extends AbstractAppender { -+ ++ + private static final org.apache.logging.log4j.Logger logger = LogManager.getLogger(PufferfishSentryAppender.class); + private static final Gson GSON = new Gson(); -+ ++ + public PufferfishSentryAppender() { + super("PufferfishSentryAdapter", new SentryFilter(), null); + } -+ ++ + @Override + public void append(LogEvent logEvent) { + if (logEvent.getThrown() != null && logEvent.getLevel().isMoreSpecificThan(Level.WARN)) { @@ -1832,55 +1832,55 @@ index 0000000000000000000000000000000000000000..731ef11c7a025ae95ed8a757b530d834 + } + } + } -+ ++ + private void logException(LogEvent e) { + SentryEvent event = new SentryEvent(e.getThrown()); -+ ++ + Message sentryMessage = new Message(); + sentryMessage.setMessage(e.getMessage().getFormattedMessage()); -+ ++ + event.setThrowable(e.getThrown()); + event.setLevel(getLevel(e.getLevel())); + event.setLogger(e.getLoggerName()); + event.setTransaction(e.getLoggerName()); + event.setExtra("thread_name", e.getThreadName()); -+ ++ + boolean hasContext = e.getContextData() != null; -+ ++ + if (hasContext && e.getContextData().containsKey("pufferfishsentry_playerid")) { + User user = new User(); + user.setId(e.getContextData().getValue("pufferfishsentry_playerid")); + user.setUsername(e.getContextData().getValue("pufferfishsentry_playername")); + event.setUser(user); + } -+ ++ + if (hasContext && e.getContextData().containsKey("pufferfishsentry_pluginname")) { + event.setExtra("plugin.name", e.getContextData().getValue("pufferfishsentry_pluginname")); + event.setExtra("plugin.version", e.getContextData().getValue("pufferfishsentry_pluginversion")); + event.setTransaction(e.getContextData().getValue("pufferfishsentry_pluginname")); + } -+ ++ + if (hasContext && e.getContextData().containsKey("pufferfishsentry_eventdata")) { + Map eventFields = GSON.fromJson((String) e.getContextData().getValue("pufferfishsentry_eventdata"), new TypeToken>() {}.getType()); + if (eventFields != null) { + event.setExtra("event", eventFields); + } + } -+ ++ + Sentry.captureEvent(event); + } -+ ++ + private void logBreadcrumb(LogEvent e) { + Breadcrumb breadcrumb = new Breadcrumb(); -+ ++ + breadcrumb.setLevel(getLevel(e.getLevel())); + breadcrumb.setCategory(e.getLoggerName()); + breadcrumb.setType(e.getLoggerName()); + breadcrumb.setMessage(e.getMessage().getFormattedMessage()); -+ ++ + Sentry.addBreadcrumb(breadcrumb); + } -+ ++ + private SentryLevel getLevel(Level level) { + switch (level.getStandardLevel()) { + case TRACE: @@ -1897,35 +1897,35 @@ index 0000000000000000000000000000000000000000..731ef11c7a025ae95ed8a757b530d834 + return SentryLevel.INFO; + } + } -+ ++ + private static class SentryFilter extends AbstractFilter { -+ ++ + @Override + public Result filter(Logger logger, org.apache.logging.log4j.Level level, Marker marker, String msg, + Object... params) { + return this.filter(logger.getName()); + } -+ ++ + @Override + public Result filter(Logger logger, org.apache.logging.log4j.Level level, Marker marker, Object msg, Throwable t) { + return this.filter(logger.getName()); + } -+ ++ + @Override + public Result filter(LogEvent event) { + return this.filter(event == null ? null : event.getLoggerName()); + } -+ ++ + private Result filter(String loggerName) { + return loggerName != null && loggerName.startsWith("gg.castaway.pufferfish.sentry") ? Result.DENY + : Result.NEUTRAL; + } -+ ++ + } +} diff --git a/src/main/java/gg/pufferfish/pufferfish/sentry/SentryManager.java b/src/main/java/gg/pufferfish/pufferfish/sentry/SentryManager.java new file mode 100644 -index 0000000000000000000000000000000000000000..1b29210ad0bbb4ada150f23357f0c80d331c996d +index 0000000000000000000000000000000000000000..b011abbeb80b42de6be3785e47c7ba3c0f6dc161 --- /dev/null +++ b/src/main/java/gg/pufferfish/pufferfish/sentry/SentryManager.java @@ -0,0 +1,40 @@ @@ -1937,27 +1937,27 @@ index 0000000000000000000000000000000000000000..1b29210ad0bbb4ada150f23357f0c80d +import org.apache.logging.log4j.Logger; + +public class SentryManager { -+ ++ + private static final Logger logger = LogManager.getLogger(SentryManager.class); -+ ++ + private SentryManager() { -+ ++ + } -+ ++ + private static boolean initialized = false; -+ ++ + public static synchronized void init() { + if (initialized) { + return; + } + try { + initialized = true; -+ ++ + Sentry.init(options -> { + options.setDsn(PufferfishConfig.sentryDsn); + options.setMaxBreadcrumbs(100); + }); -+ ++ + PufferfishSentryAppender appender = new PufferfishSentryAppender(); + appender.start(); + ((org.apache.logging.log4j.core.Logger) LogManager.getRootLogger()).addAppender(appender); @@ -1967,11 +1967,11 @@ index 0000000000000000000000000000000000000000..1b29210ad0bbb4ada150f23357f0c80d + initialized = false; + } + } -+ ++ +} diff --git a/src/main/java/gg/pufferfish/pufferfish/util/AsyncExecutor.java b/src/main/java/gg/pufferfish/pufferfish/util/AsyncExecutor.java new file mode 100644 -index 0000000000000000000000000000000000000000..9d6dc2c80945bec9bea74714c657c7a2e0bdde9e +index 0000000000000000000000000000000000000000..0772fbc77a198b3571b4ed1e8cc85e90ccd6e38a --- /dev/null +++ b/src/main/java/gg/pufferfish/pufferfish/util/AsyncExecutor.java @@ -0,0 +1,51 @@ @@ -1985,29 +1985,29 @@ index 0000000000000000000000000000000000000000..9d6dc2c80945bec9bea74714c657c7a2 +import java.util.logging.Level; + +public class AsyncExecutor implements Runnable { -+ ++ + private Queue jobs = Queues.newConcurrentLinkedQueue(); + private final Thread thread; + private final BooleanSupplier shouldRun; + private volatile boolean killswitch = false; -+ ++ + public AsyncExecutor(String threadName, BooleanSupplier shouldRun) { + this.thread = new Thread(this, threadName); + this.shouldRun = shouldRun; + } -+ ++ + public void start() { + thread.start(); + } -+ ++ + public void kill() { + killswitch = true; + } -+ ++ + public void submit(Runnable runnable) { + jobs.offer(runnable); + } -+ ++ + @Override + public void run() { + while (!killswitch) { @@ -2024,11 +2024,11 @@ index 0000000000000000000000000000000000000000..9d6dc2c80945bec9bea74714c657c7a2 + LockSupport.parkNanos("executing tasks", 1000L); + } + } -+ ++ +} diff --git a/src/main/java/gg/pufferfish/pufferfish/util/AsyncPlayerAreaMap.java b/src/main/java/gg/pufferfish/pufferfish/util/AsyncPlayerAreaMap.java new file mode 100644 -index 0000000000000000000000000000000000000000..fdcb62d12164024a5f354d60cc863821a18d1b2a +index 0000000000000000000000000000000000000000..a93ee99c2399def1e221260547a3e6bce2d621fa --- /dev/null +++ b/src/main/java/gg/pufferfish/pufferfish/util/AsyncPlayerAreaMap.java @@ -0,0 +1,31 @@ @@ -2040,22 +2040,22 @@ index 0000000000000000000000000000000000000000..fdcb62d12164024a5f354d60cc863821 +import net.minecraft.server.level.ServerPlayer; + +public final class AsyncPlayerAreaMap extends PlayerAreaMap { -+ ++ + public AsyncPlayerAreaMap() { + super(); + this.areaMap = new Long2ObjectOpenHashMapWrapper<>(new ConcurrentHashMap<>(1024, 0.7f)); + } -+ ++ + public AsyncPlayerAreaMap(final PooledLinkedHashSets pooledHashSets) { + super(pooledHashSets); + this.areaMap = new Long2ObjectOpenHashMapWrapper<>(new ConcurrentHashMap<>(1024, 0.7f)); + } -+ ++ + public AsyncPlayerAreaMap(final PooledLinkedHashSets pooledHashSets, final ChangeCallback addCallback, + final ChangeCallback removeCallback) { + this(pooledHashSets, addCallback, removeCallback, null); + } -+ ++ + public AsyncPlayerAreaMap(final PooledLinkedHashSets pooledHashSets, final ChangeCallback addCallback, + final ChangeCallback removeCallback, final ChangeSourceCallback changeSourceCallback) { + super(pooledHashSets, addCallback, removeCallback, changeSourceCallback); @@ -2091,7 +2091,7 @@ index 0000000000000000000000000000000000000000..c1929840254a3e6d721816f4a20415be +} diff --git a/src/main/java/gg/pufferfish/pufferfish/util/Long2ObjectOpenHashMapWrapper.java b/src/main/java/gg/pufferfish/pufferfish/util/Long2ObjectOpenHashMapWrapper.java new file mode 100644 -index 0000000000000000000000000000000000000000..facd55463d44cb7e3d2ca6892982f5497b8dded1 +index 0000000000000000000000000000000000000000..42cdc43d6b739973a0944f502089757247ee6c61 --- /dev/null +++ b/src/main/java/gg/pufferfish/pufferfish/util/Long2ObjectOpenHashMapWrapper.java @@ -0,0 +1,40 @@ @@ -2102,34 +2102,34 @@ index 0000000000000000000000000000000000000000..facd55463d44cb7e3d2ca6892982f549 +import org.jetbrains.annotations.Nullable; + +public class Long2ObjectOpenHashMapWrapper extends Long2ObjectOpenHashMap { -+ ++ + private final Map backingMap; -+ ++ + public Long2ObjectOpenHashMapWrapper(Map map) { + backingMap = map; + } -+ ++ + @Override + public V put(Long key, V value) { + return backingMap.put(key, value); + } -+ ++ + @Override + public V get(Object key) { + return backingMap.get(key); + } -+ ++ + @Override + public V remove(Object key) { + return backingMap.remove(key); + } -+ ++ + @Nullable + @Override + public V putIfAbsent(Long key, V value) { + return backingMap.putIfAbsent(key, value); + } -+ ++ + @Override + public int size() { + return backingMap.size(); @@ -2149,19 +2149,19 @@ index 7bddc7517356cc74104dcc5c7c55522a53f2596f..d6a57cdad2c92521a800cb18d060d9d6 public static long getCoordinateKey(final ChunkPos pair) { diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java -index 3a9c27ece0ad18b2c4686164766794c56fcea268..9bd03a9ca4d1a5332738b943493c2b7bb339b698 100644 +index 07c382f30ed3736ed15b5b71f48dc4a1de958242..a6d8f128ac1c2eacf662ee40a04275d45d6754ca 100644 --- a/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/src/main/java/net/minecraft/server/MinecraftServer.java -@@ -310,6 +310,8 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop true); // Pufferfish - optimize mob spawning ++ public gg.pufferfish.pufferfish.util.AsyncExecutor mobSpawnExecutor = new gg.pufferfish.pufferfish.util.AsyncExecutor("MobSpawning", () -> true); // Pufferfish - optimize mob spawning ++ public static S spin(Function serverFactory) { AtomicReference atomicreference = new AtomicReference(); -@@ -1685,7 +1687,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop { +@@ -1683,7 +1685,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop loadedChunkMap = new it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap<>(8192, 0.5f); +@@ -75,6 +75,9 @@ public class ServerChunkCache extends ChunkSource { private final LevelChunk[] lastLoadedChunks = new LevelChunk[4 * 4]; -+ + + public boolean firstRunSpawnCounts = true; // Pufferfish + public final java.util.concurrent.atomic.AtomicBoolean _pufferfish_spawnCountsReady = new java.util.concurrent.atomic.AtomicBoolean(false); // Pufferfish - optimize countmobs - ++ private static int getChunkCacheKey(int x, int z) { return x & 3 | ((z & 3) << 2); + } @@ -969,6 +972,7 @@ public class ServerChunkCache extends ChunkSource { ProfilerFiller gameprofilerfiller = this.level.getProfiler(); @@ -2320,7 +2320,7 @@ index 5793154c0deca7fc570bbe858c6bea0d640db941..f33ae29fd86fbfb2a94748fbf9515e3b } // Paper end - controlled flush for entity tracker packets } -+ ++ + // Pufferfish start - optimize mob spawning + if (gg.pufferfish.pufferfish.PufferfishConfig.enableAsyncMobSpawning) { + for (ServerPlayer player : this.level.players) { @@ -2368,7 +2368,7 @@ index 1092ba200a945d8d70e48f956535f56e2743302d..937a93d134dc986fe23e5676d58f7619 this.wasOnGround = this.entity.isOnGround(); this.teleportDelay = 0; diff --git a/src/main/java/net/minecraft/server/level/ServerLevel.java b/src/main/java/net/minecraft/server/level/ServerLevel.java -index b5b56d4549e97abbbe9e91d881b9bca8428f1eec..ce0787be675a1dedec626ae25ffd5bf5ff6a7d69 100644 +index b5b56d4549e97abbbe9e91d881b9bca8428f1eec..5e9ad7c828a196e6fe85bb3e32aa23b95c83b39d 100644 --- a/src/main/java/net/minecraft/server/level/ServerLevel.java +++ b/src/main/java/net/minecraft/server/level/ServerLevel.java @@ -670,7 +670,20 @@ public class ServerLevel extends Level implements WorldGenLevel { @@ -2420,7 +2420,7 @@ index b5b56d4549e97abbbe9e91d881b9bca8428f1eec..ce0787be675a1dedec626ae25ffd5bf5 gameprofilerfiller.popPush("iceandsnow"); - if (!this.paperConfig.disableIceAndSnow && this.random.nextInt(16) == 0) { // Paper - Disable ice and snow -+ if (!this.paperConfig.disableIceAndSnow && (this.currentIceAndSnowTick++ & 15) == 0) { // Paper - Disable ice and snow // Pufferfish - optimize further random ticking ++ if (!this.paperConfig.disableIceAndSnow && (this.currentIceAndSnowTick++ & 15) == 0) { // Paper - Disable ice and snow // Paper - optimise random ticking // Pufferfish - optimize further random ticking // Paper start - optimise chunk ticking this.getRandomBlockPosition(j, 0, k, 15, blockposition); int normalY = chunk.getHeight(Heightmap.Types.MOTION_BLOCKING, blockposition.getX() & 15, blockposition.getZ() & 15) + 1; @@ -2549,7 +2549,7 @@ index 7437f01ca8f416e2c9150250e324af4725a4efb6..7ac51dbfce18a2bc52faa7a915abeccc int LARGE_MAX_STACK_SIZE = 64; diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java -index 84fce7dccf9232209f939a32acfc3131e62eb27c..59ec3d56e88cf6cee218422481457b944ff25998 100644 +index 84fce7dccf9232209f939a32acfc3131e62eb27c..c9c444c119a010112d4176f095eee57f0ac888f9 100644 --- a/src/main/java/net/minecraft/world/entity/Entity.java +++ b/src/main/java/net/minecraft/world/entity/Entity.java @@ -230,7 +230,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, i @@ -2569,7 +2569,7 @@ index 84fce7dccf9232209f939a32acfc3131e62eb27c..59ec3d56e88cf6cee218422481457b94 + public int activatedPriority = gg.pufferfish.pufferfish.PufferfishConfig.maximumActivationPrio; // golf score + public final BlockPos.MutableBlockPos cachedBlockPos = new BlockPos.MutableBlockPos(); // used where needed + // Pufferfish end -+ ++ public float getBukkitYaw() { return this.yRot; } @@ -3389,12 +3389,12 @@ index 798afc145c54306fcf0838d8daef2bdf17763da9..e67d5012bc7af629d05bceb1b1e22162 final String id; private final GameRules.Category category; diff --git a/src/main/java/net/minecraft/world/level/Level.java b/src/main/java/net/minecraft/world/level/Level.java -index 160c0f37aa3aaf7598f852acf9bd444f79444c97..d1521394eaf38ab4e3ee55452149458911a3030b 100644 +index 160c0f37aa3aaf7598f852acf9bd444f79444c97..8026e8ca528071bf80fecb5e96370d1d2ae799db 100644 --- a/src/main/java/net/minecraft/world/level/Level.java +++ b/src/main/java/net/minecraft/world/level/Level.java -@@ -259,6 +259,15 @@ public abstract class Level implements LevelAccessor, AutoCloseable { - } - // Paper end - optimise checkDespawn +@@ -261,6 +261,15 @@ public abstract class Level implements LevelAccessor, AutoCloseable { + + public abstract ResourceKey getTypeKey(); + // Pufferfish start - ensure these get inlined + private final int minBuildHeight, minSection, height, maxBuildHeight, maxSection; @@ -3405,17 +3405,17 @@ index 160c0f37aa3aaf7598f852acf9bd444f79444c97..d1521394eaf38ab4e3ee554521494589 + @Override public final int getHeight() { return this.height; } + // Pufferfish end + - public abstract ResourceKey getTypeKey(); - protected Level(WritableLevelData worlddatamutable, ResourceKey resourcekey, Holder holder, Supplier supplier, boolean flag, boolean flag1, long i, org.bukkit.generator.ChunkGenerator gen, org.bukkit.generator.BiomeProvider biomeProvider, org.bukkit.World.Environment env, java.util.concurrent.Executor executor) { // Paper - Async-Anti-Xray - Pass executor + this.spigotConfig = new org.spigotmc.SpigotWorldConfig(((net.minecraft.world.level.storage.PrimaryLevelData) worlddatamutable).getLevelName()); // Spigot + this.paperConfig = new com.destroystokyo.paper.PaperWorldConfig(((net.minecraft.world.level.storage.PrimaryLevelData) worlddatamutable).getLevelName(), this.spigotConfig); // Paper @@ -279,6 +288,13 @@ public abstract class Level implements LevelAccessor, AutoCloseable { this.levelData = worlddatamutable; this.dimensionTypeRegistration = holder; this.dimensionType = (DimensionType) holder.value(); + // Pufferfish start -+ this.minBuildHeight = this.dimensionType.minY(); ++ this.minBuildHeight = dimensionType.minY(); + this.minSection = SectionPos.blockToSectionCoord(this.minBuildHeight); -+ this.height = this.dimensionType.height(); ++ this.height = dimensionType.height(); + this.maxBuildHeight = this.minBuildHeight + this.height; + this.maxSection = SectionPos.blockToSectionCoord(this.maxBuildHeight - 1) + 1; + // Pufferfish end @@ -3560,10 +3560,47 @@ index 13eded53a64d0f36f8c9bce2077de4f1c1ed2d56..303ad9eab2e0a9b73597ca4ee9d70bea return new BlockPos(i, l, j); } diff --git a/src/main/java/net/minecraft/world/level/biome/Biome.java b/src/main/java/net/minecraft/world/level/biome/Biome.java -index 0422d787593cc65aadcae9f7517ec67a52f1f72b..74b446bde17ff023fb19c422d15993fb1f4b3d69 100644 +index 0422d787593cc65aadcae9f7517ec67a52f1f72b..248da8962a460fe41876bbe8670e8909864b40bc 100644 --- a/src/main/java/net/minecraft/world/level/biome/Biome.java +++ b/src/main/java/net/minecraft/world/level/biome/Biome.java -@@ -52,14 +52,20 @@ public final class Biome { +@@ -37,6 +37,36 @@ import net.minecraft.world.level.material.Fluids; + public final class Biome { + public static final Codec DIRECT_CODEC; + public static final Codec NETWORK_CODEC; ++ ++ // Pufferfish start - decompile fixes ++ static { ++ DIRECT_CODEC = RecordCodecBuilder.create((instance) -> { ++ return instance.group(Biome.ClimateSettings.CODEC.forGetter((biome) -> { ++ return biome.climateSettings; ++ }), Biome.BiomeCategory.CODEC.fieldOf("category").forGetter((biome) -> { ++ return biome.biomeCategory; ++ }), BiomeSpecialEffects.CODEC.fieldOf("effects").forGetter((biome) -> { ++ return biome.specialEffects; ++ }), BiomeGenerationSettings.CODEC.forGetter((biome) -> { ++ return biome.generationSettings; ++ }), MobSpawnSettings.CODEC.forGetter((biome) -> { ++ return biome.mobSettings; ++ })).apply(instance, Biome::new); ++ }); ++ NETWORK_CODEC = RecordCodecBuilder.create((instance) -> { ++ return instance.group(Biome.ClimateSettings.CODEC.forGetter((biome) -> { ++ return biome.climateSettings; ++ }), Biome.BiomeCategory.CODEC.fieldOf("category").forGetter((biome) -> { ++ return biome.biomeCategory; ++ }), BiomeSpecialEffects.CODEC.fieldOf("effects").forGetter((biome) -> { ++ return biome.specialEffects; ++ })).apply(instance, (weather, category, effects) -> { ++ return new Biome(weather, category, effects, BiomeGenerationSettings.EMPTY, MobSpawnSettings.EMPTY); ++ }); ++ }); ++ } ++ // Pufferfish end ++ + public static final Codec> CODEC = RegistryFileCodec.create(Registry.BIOME_REGISTRY, DIRECT_CODEC); + public static final Codec> LIST_CODEC = RegistryCodecs.homogeneousList(Registry.BIOME_REGISTRY, DIRECT_CODEC); + private static final PerlinSimplexNoise TEMPERATURE_NOISE = new PerlinSimplexNoise(new WorldgenRandom(new LegacyRandomSource(1234L)), ImmutableList.of(0)); +@@ -52,14 +82,20 @@ public final class Biome { private final MobSpawnSettings mobSettings; private final Biome.BiomeCategory biomeCategory; private final BiomeSpecialEffects specialEffects; @@ -3585,7 +3622,7 @@ index 0422d787593cc65aadcae9f7517ec67a52f1f72b..74b446bde17ff023fb19c422d15993fb }); }); -@@ -101,17 +107,15 @@ public final class Biome { +@@ -101,17 +137,15 @@ public final class Biome { @Deprecated public float getTemperature(BlockPos blockPos) { long l = blockPos.asLong(); @@ -3608,6 +3645,24 @@ index 0422d787593cc65aadcae9f7517ec67a52f1f72b..74b446bde17ff023fb19c422d15993fb return g; } } +@@ -253,6 +287,8 @@ public final class Biome { + return biomeEntry.value().getBiomeCategory(); + } + ++ // Pufferfish - decompile fixes (what the fuck) ++ /* + static { + DIRECT_CODEC = RecordCodecBuilder.create((instance) -> { + return instance.group(Biome.ClimateSettings.CODEC.forGetter((biome) -> { +@@ -279,6 +315,8 @@ public final class Biome { + }); + }); + } ++ */ ++ // Pufferfish end + + public static class BiomeBuilder { + @Nullable diff --git a/src/main/java/net/minecraft/world/level/block/entity/ChestBlockEntity.java b/src/main/java/net/minecraft/world/level/block/entity/ChestBlockEntity.java index e56f7d76b501dab7d549efd2fafd514a9625c24e..066f43deb5df6f79428eb0f325c2abfb31ea9254 100644 --- a/src/main/java/net/minecraft/world/level/block/entity/ChestBlockEntity.java @@ -3852,20 +3907,18 @@ index d4ce71d98c5071cd3567c772a0853ca86550bad5..5d91f00e81864a981ca457fc4fa88f01 public org.bukkit.Chunk bukkitChunk; diff --git a/src/main/java/net/minecraft/world/level/chunk/LevelChunkSection.java b/src/main/java/net/minecraft/world/level/chunk/LevelChunkSection.java -index b11ad90c0956ac1b8ee069fa3f4553a2b4ce88e9..a32a90056acf37150b90f2941ce5b87b6ca8d162 100644 +index b11ad90c0956ac1b8ee069fa3f4553a2b4ce88e9..d69fe40d3af983144999963ec25b32500237e515 100644 --- a/src/main/java/net/minecraft/world/level/chunk/LevelChunkSection.java +++ b/src/main/java/net/minecraft/world/level/chunk/LevelChunkSection.java -@@ -26,6 +26,9 @@ public class LevelChunkSection { +@@ -26,6 +26,7 @@ public class LevelChunkSection { private short tickingFluidCount; public final PalettedContainer states; private final PalettedContainer> biomes; -+ // Pufferfish start -+ public short fluidStateCount; -+ // Pufferfish end ++ public short fluidStateCount; // Pufferfish public final com.destroystokyo.paper.util.maplist.IBlockDataList tickingList = new com.destroystokyo.paper.util.maplist.IBlockDataList(); // Paper public LevelChunkSection(int chunkPos, PalettedContainer blockStateContainer, PalettedContainer> biomeContainer) { -@@ -196,6 +199,7 @@ public class LevelChunkSection { +@@ -196,6 +197,7 @@ public class LevelChunkSection { if (!fluid.isEmpty()) { --this.tickingFluidCount; @@ -3873,7 +3926,7 @@ index b11ad90c0956ac1b8ee069fa3f4553a2b4ce88e9..a32a90056acf37150b90f2941ce5b87b } if (!state.isAir()) { -@@ -210,6 +214,7 @@ public class LevelChunkSection { +@@ -210,6 +212,7 @@ public class LevelChunkSection { if (!fluid1.isEmpty()) { ++this.tickingFluidCount; @@ -3881,7 +3934,7 @@ index b11ad90c0956ac1b8ee069fa3f4553a2b4ce88e9..a32a90056acf37150b90f2941ce5b87b } this.updateKnownBlockInfo(x | (z << 4) | (y << 8), iblockdata1, state); // Paper -@@ -258,6 +263,7 @@ public class LevelChunkSection { +@@ -258,6 +261,7 @@ public class LevelChunkSection { if (fluid.isRandomlyTicking()) { this.tickingFluidCount = (short) (this.tickingFluidCount + 1); } @@ -4035,44 +4088,53 @@ index 05b64f2730bfe836bd1d72dcfccd9f536908a099..d33af84300db18ea2b71dba2c9ed4339 public boolean hasParam(LootContextParam parameter) { diff --git a/src/main/java/net/minecraft/world/phys/shapes/EntityCollisionContext.java b/src/main/java/net/minecraft/world/phys/shapes/EntityCollisionContext.java -index b1992ed5136cc7dcf04219868b94b3c37ae36b4b..7d494a050d1dac79c7bae5a7464fccabfdc6066d 100644 +index b1992ed5136cc7dcf04219868b94b3c37ae36b4b..5b5339cba819368f4d6b7eaf404fa59bca4c0518 100644 --- a/src/main/java/net/minecraft/world/phys/shapes/EntityCollisionContext.java +++ b/src/main/java/net/minecraft/world/phys/shapes/EntityCollisionContext.java -@@ -19,47 +19,68 @@ public class EntityCollisionContext implements CollisionContext { +@@ -19,47 +19,66 @@ public class EntityCollisionContext implements CollisionContext { return defaultValue; } }; +- private final boolean descending; +- private final double entityBottom; +- private final ItemStack heldItem; +- private final Predicate canStandOnFluid; + // Pufferfish start - remove these and pray no plugin uses them -+ /* - private final boolean descending; - private final double entityBottom; - private final ItemStack heldItem; - private final Predicate canStandOnFluid; -+ */ ++ // private final boolean descending; ++ // private final double entityBottom; ++ // private final ItemStack heldItem; ++ // private final Predicate canStandOnFluid; ++ // Pufferfish end @Nullable private final Entity entity; protected EntityCollisionContext(boolean descending, double minY, ItemStack heldItem, Predicate walkOnFluidPredicate, @Nullable Entity entity) { -+ /* - this.descending = descending; - this.entityBottom = minY; - this.heldItem = heldItem; - this.canStandOnFluid = walkOnFluidPredicate; -+ */ +- this.descending = descending; +- this.entityBottom = minY; +- this.heldItem = heldItem; +- this.canStandOnFluid = walkOnFluidPredicate; ++ // Pufferfish start - remove these ++ // this.descending = descending; ++ // this.entityBottom = minY; ++ // this.heldItem = heldItem; ++ // this.canStandOnFluid = walkOnFluidPredicate; ++ // Pufferfish end this.entity = entity; } /** @deprecated */ @Deprecated protected EntityCollisionContext(Entity entity) { -+ /* - this(entity.isDescending(), entity.getY(), entity instanceof LivingEntity ? ((LivingEntity)entity).getMainHandItem() : ItemStack.EMPTY, entity instanceof LivingEntity ? ((LivingEntity)entity)::canStandOnFluid : (fluidState) -> { - return false; - }, entity); -+ */ +- this(entity.isDescending(), entity.getY(), entity instanceof LivingEntity ? ((LivingEntity)entity).getMainHandItem() : ItemStack.EMPTY, entity instanceof LivingEntity ? ((LivingEntity)entity)::canStandOnFluid : (fluidState) -> { +- return false; +- }, entity); ++ // Pufferfish start - remove this ++ // this(entity.isDescending(), entity.getY(), entity instanceof LivingEntity ? ((LivingEntity)entity).getMainHandItem() : ItemStack.EMPTY, entity instanceof LivingEntity ? ((LivingEntity)entity)::canStandOnFluid : (fluidState) -> { ++ // return false; ++ // }, entity); ++ // Pufferfish end + this.entity = entity; } -+ // Pufferfish end @Override public boolean isHoldingItem(Item item) { @@ -4112,7 +4174,7 @@ index b1992ed5136cc7dcf04219868b94b3c37ae36b4b..7d494a050d1dac79c7bae5a7464fccab @Nullable diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java -index 5a6290e5d7b82dbc069d159ea53292e4dbc94d03..118b9aed39dfaa3780905bb38738ba8b131fc0e4 100644 +index 7343bd96a4a15f4abc081e565175db8df930a470..cc88eb1247bafb65999e1ca5624c87b038b27866 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java @@ -248,7 +248,7 @@ import javax.annotation.Nullable; // Paper @@ -4186,7 +4248,7 @@ index 909b2c98e7a9117d2f737245e4661792ffafb744..0d9e2b3728f9ab500bd5e44702718535 @Override diff --git a/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java b/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java -index d50661d29608e2e805c24a9eb3dd5ce72134a14e..8197dc85f5b8d5965c2f8edacc853fc7f7daf22c 100644 +index 41e7ca100073052b99c82fa6a82f8168e0135499..7e06f263cf618b82f77101ef86d819d5dc37a24e 100644 --- a/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java +++ b/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java @@ -430,7 +430,7 @@ public final class CraftMagicNumbers implements UnsafeValues { diff --git a/patches/server/0002-Rebrand.patch b/patches/server/0002-Rebrand.patch index 42bed78a3..4355806d8 100644 --- a/patches/server/0002-Rebrand.patch +++ b/patches/server/0002-Rebrand.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Rebrand diff --git a/build.gradle.kts b/build.gradle.kts -index 27c18ced1ce6d38c9cd05eb4269f25a9d6520030..58948319c004d89a90052d061f9c9293375b9c88 100644 +index ecb65e75d19d2f7b72410c89251e56566b7b6dc0..bd5d784ad6fb9786e03bd614baa40954b9fe6090 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -18,7 +18,7 @@ repositories { @@ -15,7 +15,7 @@ index 27c18ced1ce6d38c9cd05eb4269f25a9d6520030..58948319c004d89a90052d061f9c9293 - implementation(project(":pufferfish-api")) // Pufferfish // Paper + implementation(project(":purpur-api")) // Pufferfish // Paper // Purpur // Pufferfish start - implementation("io.papermc.paper:paper-mojangapi:1.18.1-R0.1-SNAPSHOT") { + implementation("io.papermc.paper:paper-mojangapi:1.18.2-R0.1-SNAPSHOT") { exclude("io.papermc.paper", "paper-api") @@ -54,6 +54,8 @@ dependencies { isTransitive = false @@ -167,10 +167,10 @@ index 1a859fef0848cf23a672012e9764965ae1c07ec5..14ed740609b14242c2a8d377a78b2f71 stringbuilder.append(CrashReport.getErrorComment()); stringbuilder.append("\n\n"); diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java -index 9bd03a9ca4d1a5332738b943493c2b7bb339b698..631e2e9bee442a185b3423594e9065e39458bba6 100644 +index a6d8f128ac1c2eacf662ee40a04275d45d6754ca..4633f75991dc5e261fb96bd707cca7bf304fcc13 100644 --- a/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/src/main/java/net/minecraft/server/MinecraftServer.java -@@ -960,7 +960,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop 0; // Paper worldserver.hasEntityMoveEvent = io.papermc.paper.event.entity.EntityMoveEvent.getHandlerList().getRegisteredListeners().length > 0; // Paper @@ -34,7 +34,7 @@ index 2f24119ed147b7952f671dbac21d05cf38960cc0..0fec369bd64aeebebf5702a15090982b this.profiler.push(() -> { diff --git a/src/main/java/net/minecraft/server/level/ServerLevel.java b/src/main/java/net/minecraft/server/level/ServerLevel.java -index a154761eecb4911f8b646cccbb9b713e0fcc693e..291ec6d665daf222150f05ccdf759b8166a718a9 100644 +index 5e9ad7c828a196e6fe85bb3e32aa23b95c83b39d..25d66a6d717c21602318e23f417658c2aeebeb18 100644 --- a/src/main/java/net/minecraft/server/level/ServerLevel.java +++ b/src/main/java/net/minecraft/server/level/ServerLevel.java @@ -212,6 +212,7 @@ public class ServerLevel extends Level implements WorldGenLevel { @@ -79,7 +79,7 @@ index 353848667006bc386fe5d3fceb61ac58be20a941..d61e30e19c1144a3610f92028c047e0f if ((entity instanceof Bucketable && entity instanceof LivingEntity && origItem != null && origItem.asItem() == Items.WATER_BUCKET) && (event.isCancelled() || ServerGamePacketListenerImpl.this.player.getInventory().getSelected() == null || ServerGamePacketListenerImpl.this.player.getInventory().getSelected().getItem() != origItem)) { ServerGamePacketListenerImpl.this.send(new ClientboundAddMobPacket((LivingEntity) entity)); diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java -index 8e7d8482f44799d2df6ebea380dc4ff47fd66c3d..b630e2a4decc750474f4c9dc6669ecb420a9ceaf 100644 +index 3522b7b81eae07ac010c5f9fd056210ff80d5b7d..a798d5ea72bc06395e27199c57be86b407311e50 100644 --- a/src/main/java/net/minecraft/world/entity/Entity.java +++ b/src/main/java/net/minecraft/world/entity/Entity.java @@ -300,7 +300,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource, i diff --git a/patches/server/0013-Configurable-server-mod-name.patch b/patches/server/0013-Configurable-server-mod-name.patch index e73729c4c..fb0a8edf0 100644 --- a/patches/server/0013-Configurable-server-mod-name.patch +++ b/patches/server/0013-Configurable-server-mod-name.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Configurable server mod name diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java -index 0fec369bd64aeebebf5702a15090982b32dcd7a7..e741c1b1d34d85c69cde76f43283728219c188ff 100644 +index 40ec9dc096f292707bfe93dde0bc727dbff4de88..3290702916f6ee8dca3d5a79ddad90b1db3d76a0 100644 --- a/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/src/main/java/net/minecraft/server/MinecraftServer.java -@@ -1688,7 +1688,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop -Date: Tue, 1 Mar 2022 17:03:44 -0600 -Subject: [PATCH] Fix compile errors - - -diff --git a/src/main/java/net/minecraft/world/level/biome/Biome.java b/src/main/java/net/minecraft/world/level/biome/Biome.java -index 74b446bde17ff023fb19c422d15993fb1f4b3d69..e23d835557b02a1a882cfc8ae59e7d767e5ffe12 100644 ---- a/src/main/java/net/minecraft/world/level/biome/Biome.java -+++ b/src/main/java/net/minecraft/world/level/biome/Biome.java -@@ -37,6 +37,32 @@ import net.minecraft.world.level.material.Fluids; - public final class Biome { - public static final Codec DIRECT_CODEC; - public static final Codec NETWORK_CODEC; -+ static { -+ DIRECT_CODEC = RecordCodecBuilder.create((instance) -> { -+ return instance.group(Biome.ClimateSettings.CODEC.forGetter((biome) -> { -+ return biome.climateSettings; -+ }), Biome.BiomeCategory.CODEC.fieldOf("category").forGetter((biome) -> { -+ return biome.biomeCategory; -+ }), BiomeSpecialEffects.CODEC.fieldOf("effects").forGetter((biome) -> { -+ return biome.specialEffects; -+ }), BiomeGenerationSettings.CODEC.forGetter((biome) -> { -+ return biome.generationSettings; -+ }), MobSpawnSettings.CODEC.forGetter((biome) -> { -+ return biome.mobSettings; -+ })).apply(instance, Biome::new); -+ }); -+ NETWORK_CODEC = RecordCodecBuilder.create((instance) -> { -+ return instance.group(Biome.ClimateSettings.CODEC.forGetter((biome) -> { -+ return biome.climateSettings; -+ }), Biome.BiomeCategory.CODEC.fieldOf("category").forGetter((biome) -> { -+ return biome.biomeCategory; -+ }), BiomeSpecialEffects.CODEC.fieldOf("effects").forGetter((biome) -> { -+ return biome.specialEffects; -+ })).apply(instance, (weather, category, effects) -> { -+ return new Biome(weather, category, effects, BiomeGenerationSettings.EMPTY, MobSpawnSettings.EMPTY); -+ }); -+ }); -+ } - public static final Codec> CODEC = RegistryFileCodec.create(Registry.BIOME_REGISTRY, DIRECT_CODEC); - public static final Codec> LIST_CODEC = RegistryCodecs.homogeneousList(Registry.BIOME_REGISTRY, DIRECT_CODEC); - private static final PerlinSimplexNoise TEMPERATURE_NOISE = new PerlinSimplexNoise(new WorldgenRandom(new LegacyRandomSource(1234L)), ImmutableList.of(0)); -@@ -257,33 +283,6 @@ public final class Biome { - return biomeEntry.value().getBiomeCategory(); - } - -- static { -- DIRECT_CODEC = RecordCodecBuilder.create((instance) -> { -- return instance.group(Biome.ClimateSettings.CODEC.forGetter((biome) -> { -- return biome.climateSettings; -- }), Biome.BiomeCategory.CODEC.fieldOf("category").forGetter((biome) -> { -- return biome.biomeCategory; -- }), BiomeSpecialEffects.CODEC.fieldOf("effects").forGetter((biome) -> { -- return biome.specialEffects; -- }), BiomeGenerationSettings.CODEC.forGetter((biome) -> { -- return biome.generationSettings; -- }), MobSpawnSettings.CODEC.forGetter((biome) -> { -- return biome.mobSettings; -- })).apply(instance, Biome::new); -- }); -- NETWORK_CODEC = RecordCodecBuilder.create((instance) -> { -- return instance.group(Biome.ClimateSettings.CODEC.forGetter((biome) -> { -- return biome.climateSettings; -- }), Biome.BiomeCategory.CODEC.fieldOf("category").forGetter((biome) -> { -- return biome.biomeCategory; -- }), BiomeSpecialEffects.CODEC.fieldOf("effects").forGetter((biome) -> { -- return biome.specialEffects; -- })).apply(instance, (weather, category, effects) -> { -- return new Biome(weather, category, effects, BiomeGenerationSettings.EMPTY, MobSpawnSettings.EMPTY); -- }); -- }); -- } -- - public static class BiomeBuilder { - @Nullable - private Biome.Precipitation precipitation;