Async saving persistent collection

This commit is contained in:
Sotr
2018-06-18 17:29:53 +08:00
parent 8a9ad35a57
commit 93588656d1
3 changed files with 50 additions and 0 deletions

View File

@@ -7,6 +7,7 @@ import org.spongepowered.asm.mixin.Shadow;
import io.akarin.api.internal.Akari; import io.akarin.api.internal.Akari;
import io.akarin.server.core.AkarinGlobalConfig; import io.akarin.server.core.AkarinGlobalConfig;
import net.minecraft.server.PersistentCollection;
@Mixin(value = AsyncCatcher.class, remap = false) @Mixin(value = AsyncCatcher.class, remap = false)
public abstract class MixinAsyncCatcher { public abstract class MixinAsyncCatcher {
@@ -22,6 +23,7 @@ public abstract class MixinAsyncCatcher {
} else { } else {
Akari.logger.warn("Asynchronous " + reason + "!"); Akari.logger.warn("Asynchronous " + reason + "!");
Thread.dumpStack(); Thread.dumpStack();
PersistentCollection.class.getName();
} }
} }
} }

View File

@@ -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
}
}

View File

@@ -36,6 +36,7 @@
"optimization.WeakEnchantmentManager", "optimization.WeakEnchantmentManager",
"optimization.MixinEntityHorseAbstract", "optimization.MixinEntityHorseAbstract",
"optimization.MixinEntityTameableAnimal", "optimization.MixinEntityTameableAnimal",
"optimization.MixinPersistentCollection",
"optimization.MixinTileEntityEnchantTable" "optimization.MixinTileEntityEnchantTable"
] ]
} }