[Major] Ensures no concurrent tick one world

This commit is contained in:
Sotr
2018-06-09 00:30:36 +08:00
parent 2d2c87f0f7
commit 4830d3a842
2 changed files with 7 additions and 5 deletions

View File

@@ -1,9 +1,6 @@
package io.akarin.server.core; package io.akarin.server.core;
import org.bukkit.entity.Player;
import io.akarin.api.Akari; import io.akarin.api.Akari;
import net.minecraft.server.ChatMessage;
import net.minecraft.server.EntityPlayer; import net.minecraft.server.EntityPlayer;
import net.minecraft.server.MinecraftServer; import net.minecraft.server.MinecraftServer;
import net.minecraft.server.PacketPlayOutKeepAlive; import net.minecraft.server.PacketPlayOutKeepAlive;

View File

@@ -140,15 +140,20 @@ public class MixinMinecraftServer {
Akari.silentTiming = true; // Disable timings Akari.silentTiming = true; // Disable timings
Akari.STAGE_TICK.submit(() -> { Akari.STAGE_TICK.submit(() -> {
// Never tick one world concurrently! // Never tick one world concurrently!
// TODO better treat world index
for (int i = 1; i <= worlds.size(); ++i) { for (int i = 1; i <= worlds.size(); ++i) {
WorldServer world = worlds.get(i < worlds.size() ? i : 0); WorldServer world = worlds.get(i < worlds.size() ? i : 0);
tickEntities(world); synchronized (world.tickLock) {
tickEntities(world);
}
} }
}, null); }, null);
for (int i = 0; i < worlds.size(); ++i) { for (int i = 0; i < worlds.size(); ++i) {
WorldServer world = worlds.get(i); WorldServer world = worlds.get(i);
tickWorld(world); synchronized (world.tickLock) {
tickWorld(world);
}
} }
Akari.STAGE_TICK.take(); Akari.STAGE_TICK.take();