diff --git a/sources/src/main/java/io/akarin/server/mixin/core/MixinAsyncCatcher.java b/sources/src/main/java/io/akarin/server/mixin/core/MixinAsyncCatcher.java index bf329d5a1..3255877e1 100644 --- a/sources/src/main/java/io/akarin/server/mixin/core/MixinAsyncCatcher.java +++ b/sources/src/main/java/io/akarin/server/mixin/core/MixinAsyncCatcher.java @@ -7,6 +7,7 @@ import org.spongepowered.asm.mixin.Shadow; import io.akarin.api.internal.Akari; import io.akarin.server.core.AkarinGlobalConfig; +import net.minecraft.server.PersistentCollection; @Mixin(value = AsyncCatcher.class, remap = false) public abstract class MixinAsyncCatcher { @@ -22,6 +23,7 @@ public abstract class MixinAsyncCatcher { } else { Akari.logger.warn("Asynchronous " + reason + "!"); Thread.dumpStack(); + PersistentCollection.class.getName(); } } } diff --git a/sources/src/main/java/io/akarin/server/mixin/optimization/MixinPersistentCollection.java b/sources/src/main/java/io/akarin/server/mixin/optimization/MixinPersistentCollection.java new file mode 100644 index 000000000..ad972c276 --- /dev/null +++ b/sources/src/main/java/io/akarin/server/mixin/optimization/MixinPersistentCollection.java @@ -0,0 +1,47 @@ +package io.akarin.server.mixin.optimization; + +import java.io.File; +import java.io.FileOutputStream; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Overwrite; +import org.spongepowered.asm.mixin.Shadow; + +import com.destroystokyo.paper.exception.ServerInternalException; + +import net.minecraft.server.IDataManager; +import net.minecraft.server.MCUtil; +import net.minecraft.server.NBTCompressedStreamTools; +import net.minecraft.server.NBTTagCompound; +import net.minecraft.server.PersistentBase; +import net.minecraft.server.PersistentCollection; + +@Mixin(value = PersistentCollection.class, remap = false) +public abstract class MixinPersistentCollection { + @Shadow(aliases = "b") @Final private IDataManager dataManager; + + @Overwrite + private void a(PersistentBase persistentbase) { + if (this.dataManager == null) return; + + File file = this.dataManager.getDataFile(persistentbase.id); + if (file == null) return; + + NBTTagCompound nbttagcompound = new NBTTagCompound(); + nbttagcompound.set("data", persistentbase.b(new NBTTagCompound())); + + // Akarin start + MCUtil.scheduleAsyncTask(() -> { + try { + FileOutputStream fileoutputstream = new FileOutputStream(file); + + NBTCompressedStreamTools.a(nbttagcompound, fileoutputstream); + fileoutputstream.close(); + } catch (Exception exception) { + exception.printStackTrace(); + ServerInternalException.reportInternalException(exception); // Paper + } + }); + // Akarin end + } +} diff --git a/sources/src/main/resources/mixins.akarin.core.json b/sources/src/main/resources/mixins.akarin.core.json index fd4432cc5..8fed6e538 100644 --- a/sources/src/main/resources/mixins.akarin.core.json +++ b/sources/src/main/resources/mixins.akarin.core.json @@ -36,6 +36,7 @@ "optimization.WeakEnchantmentManager", "optimization.MixinEntityHorseAbstract", "optimization.MixinEntityTameableAnimal", + "optimization.MixinPersistentCollection", "optimization.MixinTileEntityEnchantTable" ] } \ No newline at end of file