diff --git a/build-data/divinemc.at b/build-data/divinemc.at index 7239a5d..262146c 100644 --- a/build-data/divinemc.at +++ b/build-data/divinemc.at @@ -1,5 +1,6 @@ # This file is auto generated, any changes may be overridden! # See CONTRIBUTING.md on how to add access transformers. +public net.minecraft.world.entity.projectile.AbstractArrow startFalling()V public net.minecraft.world.level.block.state.pattern.BlockPattern matches(Lnet/minecraft/core/BlockPos;Lnet/minecraft/core/Direction;Lnet/minecraft/core/Direction;Lcom/google/common/cache/LoadingCache;)Lnet/minecraft/world/level/block/state/pattern/BlockPattern$BlockPatternMatch; public net.minecraft.world.level.chunk.storage.RegionFile getOversizedData(II)Lnet/minecraft/nbt/CompoundTag; public net.minecraft.world.level.chunk.storage.RegionFile isOversized(II)Z diff --git a/divinemc-server/minecraft-patches/features/0006-Fix-MC-65198.patch b/divinemc-server/minecraft-patches/features/0006-Fix-MC-65198.patch index 3ef08f2..e6dd975 100644 --- a/divinemc-server/minecraft-patches/features/0006-Fix-MC-65198.patch +++ b/divinemc-server/minecraft-patches/features/0006-Fix-MC-65198.patch @@ -40,7 +40,7 @@ index 01b8d73b1be9b41d6f51d11a0bead37a7bd9023f..d3865b375293e29162f08aa447bd91f9 if (this.container instanceof RecipeCraftingHolder recipeCraftingHolder) { diff --git a/net/minecraft/world/inventory/StonecutterMenu.java b/net/minecraft/world/inventory/StonecutterMenu.java -index d6854d0ebe5cb4205963e879d71eb3940d54de1f..dbc4ca21120daf3a63750274db8cff671d12fcd2 100644 +index d6854d0ebe5cb4205963e879d71eb3940d54de1f..39d00670c4fbfd6646af34cbd598117f07fc41ac 100644 --- a/net/minecraft/world/inventory/StonecutterMenu.java +++ b/net/minecraft/world/inventory/StonecutterMenu.java @@ -238,6 +238,7 @@ public class StonecutterMenu extends AbstractContainerMenu { @@ -51,15 +51,12 @@ index d6854d0ebe5cb4205963e879d71eb3940d54de1f..dbc4ca21120daf3a63750274db8cff67 if (index == 1) { item1.onCraftedBy(item, player.level(), player); if (!this.moveItemStackTo(item, 2, 38, true)) { -@@ -270,9 +271,9 @@ public class StonecutterMenu extends AbstractContainerMenu { +@@ -270,7 +271,7 @@ public class StonecutterMenu extends AbstractContainerMenu { return ItemStack.EMPTY; } - slot.onTake(player, item); + slot.onTake(player, itemStack2); // DivineMC - Fix MC-65198 if (index == 1) { -- player.drop(item, false); -+ player.drop(itemStack2, false); // DivineMC - Fix MC-65198 + player.drop(item, false); } - - this.broadcastChanges(); diff --git a/divinemc-server/minecraft-patches/features/0016-Async-data-saving.patch b/divinemc-server/minecraft-patches/features/0016-Async-data-saving.patch new file mode 100644 index 0000000..a6ae09c --- /dev/null +++ b/divinemc-server/minecraft-patches/features/0016-Async-data-saving.patch @@ -0,0 +1,53 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: NONPLAYT <76615486+NONPLAYT@users.noreply.github.com> +Date: Sun, 19 Jan 2025 18:01:27 +0300 +Subject: [PATCH] Async data saving + + +diff --git a/net/minecraft/world/level/storage/LevelStorageSource.java b/net/minecraft/world/level/storage/LevelStorageSource.java +index de43e54698125ce9f319d4889dd49f7029fe95e0..38a36da1d6e064b538b7b95c46994772d079a9ca 100644 +--- a/net/minecraft/world/level/storage/LevelStorageSource.java ++++ b/net/minecraft/world/level/storage/LevelStorageSource.java +@@ -514,7 +514,10 @@ public class LevelStorageSource { + CompoundTag compoundTag = serverConfiguration.createTag(registries, hostPlayerNBT); + CompoundTag compoundTag1 = new CompoundTag(); + compoundTag1.put("Data", compoundTag); +- this.saveLevelData(compoundTag1); ++ // DivineMC start - Async data saving ++ Runnable runnable = () -> this.saveLevelData(compoundTag1); ++ space.bxteam.divinemc.util.AsyncDataSaving.saveAsync(runnable); ++ // DivineMC end - Async data saving + } + + private void saveLevelData(CompoundTag tag) { +@@ -601,7 +604,10 @@ public class LevelStorageSource { + this.checkLock(); + CompoundTag levelDataTagRaw = LevelStorageSource.readLevelDataTagRaw(this.levelDirectory.dataFile()); + modifier.accept(levelDataTagRaw.getCompound("Data")); +- this.saveLevelData(levelDataTagRaw); ++ // DivineMC start - Async data saving ++ Runnable runnable = () -> this.saveLevelData(levelDataTagRaw); ++ space.bxteam.divinemc.util.AsyncDataSaving.saveAsync(runnable); ++ // DivineMC end - Async data saving + } + + public long makeWorldBackup() throws IOException { +diff --git a/net/minecraft/world/level/storage/PlayerDataStorage.java b/net/minecraft/world/level/storage/PlayerDataStorage.java +index c44110b123ba5912af18faf0065e9ded780da9b7..339efaaf92fbec457759235f91e9a03d5d5d2e4f 100644 +--- a/net/minecraft/world/level/storage/PlayerDataStorage.java ++++ b/net/minecraft/world/level/storage/PlayerDataStorage.java +@@ -32,7 +32,14 @@ public class PlayerDataStorage { + this.playerDir.mkdirs(); + } + ++ // DivineMC start - Async playerdata save + public void save(Player player) { ++ Runnable runnable = () -> saveInternal(player); ++ space.bxteam.divinemc.util.AsyncDataSaving.saveAsync(runnable); ++ } ++ ++ private void saveInternal(Player player) { ++ // DivineMC end - Async playerdata save + if (org.spigotmc.SpigotConfig.disablePlayerDataSaving) return; // Spigot + try { + CompoundTag compoundTag = player.saveWithoutId(new CompoundTag()); diff --git a/divinemc-server/minecraft-patches/sources/net/minecraft/world/entity/projectile/AbstractArrow.java.patch b/divinemc-server/minecraft-patches/sources/net/minecraft/world/entity/projectile/AbstractArrow.java.patch deleted file mode 100644 index beef79f..0000000 --- a/divinemc-server/minecraft-patches/sources/net/minecraft/world/entity/projectile/AbstractArrow.java.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- a/net/minecraft/world/entity/projectile/AbstractArrow.java -+++ b/net/minecraft/world/entity/projectile/AbstractArrow.java -@@ -344,7 +_,7 @@ - return this.isInGround() && this.level().noCollision(new AABB(this.position(), this.position()).inflate(0.06)); - } - -- private void startFalling() { -+ public void startFalling() { // DivineMC - private -> public - AbstractArrow#startFalling - this.setInGround(false); - Vec3 deltaMovement = this.getDeltaMovement(); - this.setDeltaMovement(deltaMovement.multiply(this.random.nextFloat() * 0.2F, this.random.nextFloat() * 0.2F, this.random.nextFloat() * 0.2F)); diff --git a/divinemc-server/src/main/java/space/bxteam/divinemc/configuration/DivineConfig.java b/divinemc-server/src/main/java/space/bxteam/divinemc/configuration/DivineConfig.java index fc81ae5..62d2e00 100644 --- a/divinemc-server/src/main/java/space/bxteam/divinemc/configuration/DivineConfig.java +++ b/divinemc-server/src/main/java/space/bxteam/divinemc/configuration/DivineConfig.java @@ -162,11 +162,13 @@ public class DivineConfig { public static boolean removeVanillaUsernameCheck = false; public static boolean disableMovedWronglyThreshold = false; public static boolean enableSecureSeed = false; + public static boolean asyncPlayerDataSaveEnabled = false; private static void miscSettings() { disableNonEditableSignWarning = getBoolean("settings.misc.disable-non-editable-sign-warning", disableNonEditableSignWarning); removeVanillaUsernameCheck = getBoolean("settings.misc.remove-vanilla-username-check", removeVanillaUsernameCheck); disableMovedWronglyThreshold = getBoolean("settings.misc.disable-moved-wrongly-threshold", disableMovedWronglyThreshold); enableSecureSeed = getBoolean("settings.misc.enable-secure-seed", enableSecureSeed); + asyncPlayerDataSaveEnabled = getBoolean("settings.misc.experimental.async-player-data-save-enabled", asyncPlayerDataSaveEnabled); } public static int linearFlushFrequency = 5; diff --git a/divinemc-server/src/main/java/space/bxteam/divinemc/util/AsyncDataSaving.java b/divinemc-server/src/main/java/space/bxteam/divinemc/util/AsyncDataSaving.java new file mode 100644 index 0000000..e93d85c --- /dev/null +++ b/divinemc-server/src/main/java/space/bxteam/divinemc/util/AsyncDataSaving.java @@ -0,0 +1,22 @@ +package space.bxteam.divinemc.util; + +import net.minecraft.Util; +import space.bxteam.divinemc.configuration.DivineConfig; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutorService; + +public class AsyncDataSaving { + private AsyncDataSaving() { + throw new IllegalStateException("This class cannot be instantiated"); + } + + public static void saveAsync(Runnable runnable) { + if (!DivineConfig.asyncPlayerDataSaveEnabled) { + runnable.run(); + return; + } + + ExecutorService ioExecutor = Util.backgroundExecutor().service(); + CompletableFuture.runAsync(runnable, ioExecutor); + } +} diff --git a/gradle.properties b/gradle.properties index fbad130..1420324 100644 --- a/gradle.properties +++ b/gradle.properties @@ -2,7 +2,7 @@ group = space.bxteam.divinemc mcVersion=1.21.4 version=1.21.4-R0.1-SNAPSHOT -purpurRef=a9bcd9f0c8b66ad84f9ca6005d425902c9cd0442 +purpurRef=4b74604c1f9f84e87f91dd390c83850f088a736b experimental=false org.gradle.configuration-cache=true diff --git a/scripts/releaseInfo.sh b/scripts/releaseInfo.sh index db04edf..d227747 100644 --- a/scripts/releaseInfo.sh +++ b/scripts/releaseInfo.sh @@ -43,6 +43,7 @@ mv divinemc-server/build/libs/divinemc-paperclip-"$version"-mojmap.jar "$jarName echo "=====" echo "" if [ "$experimental" = "true" ]; then + echo "> [!WARNING]" echo "> This is an early, experimental build. It is only recommended for usage on test servers and should be used with caution." echo "> **Backups are mandatory!**" echo ""