diff --git a/sources/src/main/java/io/akarin/server/core/AkarinSlackScheduler.java b/sources/src/main/java/io/akarin/server/core/AkarinSlackScheduler.java index 5f1fecdd6..5ccec230b 100644 --- a/sources/src/main/java/io/akarin/server/core/AkarinSlackScheduler.java +++ b/sources/src/main/java/io/akarin/server/core/AkarinSlackScheduler.java @@ -42,6 +42,7 @@ public class AkarinSlackScheduler extends Thread { while (server.isRunning()) { // Send time updates to everyone, it will get the right time from the world the player is in. + // Time update, from MinecraftServer#D if (++updateTime >= AkarinGlobalConfig.timeUpdateInterval) { for (EntityPlayer player : server.getPlayerList().players) { player.playerConnection.sendPacket(new PacketPlayOutUpdateTime(player.world.getTime(), player.getPlayerTime(), player.world.getGameRules().getBoolean("doDaylightCycle"))); // Add support for per player time @@ -49,6 +50,7 @@ public class AkarinSlackScheduler extends Thread { updateTime = 0; } + // Keep alive, from PlayerConnection#e for (EntityPlayer player : server.getPlayerList().players) { PlayerConnection conn = player.playerConnection; // Paper - give clients a longer time to respond to pings as per pre 1.12.2 timings @@ -73,12 +75,14 @@ public class AkarinSlackScheduler extends Thread { } } + // Force hardcore difficulty, from WorldServer#doTick for (WorldServer world : server.worlds) { if (world.getWorldData().isHardcore() && world.getDifficulty() != EnumDifficulty.HARD) { world.getWorldData().setDifficulty(EnumDifficulty.HARD); } } + // Update player info, from PlayerList#tick if (++resendPlayersInfo > AkarinGlobalConfig.playersInfoUpdateInterval) { for (EntityPlayer target : server.getPlayerList().players) { target.playerConnection.sendPacket(new PacketPlayOutPlayerInfo(PacketPlayOutPlayerInfo.EnumPlayerInfoAction.UPDATE_LATENCY, Iterables.filter(server.getPlayerList().players, new Predicate() { diff --git a/sources/src/main/java/io/akarin/server/mixin/core/MixinMinecraftServer.java b/sources/src/main/java/io/akarin/server/mixin/core/MixinMinecraftServer.java index 038b81001..b546cd866 100644 --- a/sources/src/main/java/io/akarin/server/mixin/core/MixinMinecraftServer.java +++ b/sources/src/main/java/io/akarin/server/mixin/core/MixinMinecraftServer.java @@ -175,10 +175,6 @@ public abstract class MixinMinecraftServer { @Overwrite public void D() throws InterruptedException { Runnable runnable; - Akari.callbackTiming.startTiming(); - while ((runnable = Akari.callbackQueue.poll()) != null) runnable.run(); - Akari.callbackTiming.stopTiming(); - MinecraftTimings.bukkitSchedulerTimer.startTiming(); this.server.getScheduler().mainThreadHeartbeat(this.ticks); MinecraftTimings.bukkitSchedulerTimer.stopTiming(); @@ -251,6 +247,10 @@ public abstract class MixinMinecraftServer { serverConnection().c(); MinecraftTimings.connectionTimer.stopTiming(); + Akari.callbackTiming.startTiming(); + while ((runnable = Akari.callbackQueue.poll()) != null) runnable.run(); + Akari.callbackTiming.stopTiming(); + MinecraftTimings.commandFunctionsTimer.startTiming(); functionManager().e(); MinecraftTimings.commandFunctionsTimer.stopTiming(); diff --git a/sources/src/main/java/io/akarin/server/mixin/core/MixinPlayerConnectionUtils.java b/sources/src/main/java/io/akarin/server/mixin/core/MixinPlayerConnectionUtils.java new file mode 100644 index 000000000..e95e84f74 --- /dev/null +++ b/sources/src/main/java/io/akarin/server/mixin/core/MixinPlayerConnectionUtils.java @@ -0,0 +1,29 @@ +package io.akarin.server.mixin.core; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Overwrite; +import co.aikar.timings.MinecraftTimings; +import co.aikar.timings.Timing; +import io.akarin.api.internal.Akari; +import net.minecraft.server.CancelledPacketHandleException; +import net.minecraft.server.IAsyncTaskHandler; +import net.minecraft.server.Packet; +import net.minecraft.server.PacketListener; +import net.minecraft.server.PlayerConnectionUtils; + +@Mixin(value = PlayerConnectionUtils.class, remap = false) +public abstract class MixinPlayerConnectionUtils { + @Overwrite + public static void ensureMainThread(final Packet packet, final T listener, IAsyncTaskHandler iasynctaskhandler) throws CancelledPacketHandleException { + if (!iasynctaskhandler.isMainThread()) { + Timing timing = MinecraftTimings.getPacketTiming(packet); + // MinecraftServer#postToMainThread inlined thread check, no twice + Akari.callbackQueue.add(() -> { + try (Timing ignored = timing.startTiming()) { + packet.a(listener); + } + }); + throw CancelledPacketHandleException.INSTANCE; + } + } +} diff --git a/sources/src/main/java/io/akarin/server/mixin/core/MixinPlayerList.java b/sources/src/main/java/io/akarin/server/mixin/core/MixinPlayerList.java new file mode 100644 index 000000000..3a3e775c6 --- /dev/null +++ b/sources/src/main/java/io/akarin/server/mixin/core/MixinPlayerList.java @@ -0,0 +1,12 @@ +package io.akarin.server.mixin.core; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Overwrite; + +import net.minecraft.server.PlayerList; + +@Mixin(value = PlayerList.class, remap = false) +public abstract class MixinPlayerList { + @Overwrite + public void tick() {} // Migrated to slack service +} diff --git a/sources/src/main/resources/mixins.akarin.core.json b/sources/src/main/resources/mixins.akarin.core.json index 42013fd7d..2b3b586df 100644 --- a/sources/src/main/resources/mixins.akarin.core.json +++ b/sources/src/main/resources/mixins.akarin.core.json @@ -15,6 +15,7 @@ "core.MixinWorld", "core.MixinMCUtil", + "core.MixinPlayerList", "core.MixinCommandBan", "core.MixinCommandKick", "core.MixinCraftServer", @@ -27,6 +28,7 @@ "core.MixinVersionCommand", "core.MixinMinecraftServer", "core.MixinChunkIOExecutor", + "core.MixinPlayerConnectionUtils", "cps.MixinCraftWorld", "cps.MixinChunkProviderServer",