Async send keep alive packet
This commit is contained in:
@@ -1,9 +1,14 @@
|
||||
package io.akarin.server.core;
|
||||
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import io.akarin.api.Akari;
|
||||
import net.minecraft.server.ChatMessage;
|
||||
import net.minecraft.server.EntityPlayer;
|
||||
import net.minecraft.server.MinecraftServer;
|
||||
import net.minecraft.server.PacketPlayOutKeepAlive;
|
||||
import net.minecraft.server.PacketPlayOutUpdateTime;
|
||||
import net.minecraft.server.PlayerConnection;
|
||||
|
||||
public class AkarinSlackScheduler extends Thread {
|
||||
public static AkarinSlackScheduler get() {
|
||||
@@ -21,18 +26,47 @@ public class AkarinSlackScheduler extends Thread {
|
||||
private static class Singleton {
|
||||
private static final AkarinSlackScheduler instance = new AkarinSlackScheduler();
|
||||
}
|
||||
|
||||
private long updateTime;
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
MinecraftServer server = MinecraftServer.getServer();
|
||||
|
||||
// Send time updates to everyone, it will get the right time from the world the player is in.
|
||||
if (++updateTime == 10) {
|
||||
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
|
||||
}
|
||||
updateTime = 0;
|
||||
}
|
||||
|
||||
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
|
||||
PlayerConnection conn = player.playerConnection;
|
||||
// Paper - give clients a longer time to respond to pings as per pre 1.12.2 timings
|
||||
// This should effectively place the keepalive handling back to "as it was" before 1.12.2
|
||||
long currentTime = System.currentTimeMillis();
|
||||
long elapsedTime = currentTime - conn.getLastPing();
|
||||
if (conn.isPendingPing()) {
|
||||
// We're pending a ping from the client
|
||||
if (!conn.processedDisconnect && elapsedTime >= PlayerConnection.KEEPALIVE_LIMIT) { // check keepalive limit, don't fire if already disconnected
|
||||
Akari.callbackQueue.add(() -> {
|
||||
Akari.logger.warn("{} was kicked due to keepalive timeout!", conn.player.getName()); // more info
|
||||
conn.disconnect("disconnect.timeout");
|
||||
});
|
||||
}
|
||||
} else {
|
||||
if (elapsedTime >= 15000L) { // 15 seconds
|
||||
conn.setPendingPing(true);
|
||||
conn.setLastPing(currentTime);
|
||||
conn.setKeepAliveID(currentTime);
|
||||
conn.sendPacket(new PacketPlayOutKeepAlive(conn.getKeepAliveID()));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
Thread.sleep(1000);
|
||||
Thread.sleep(100);
|
||||
} catch (InterruptedException ex) {
|
||||
Akari.logger.warn("Slack scheduler thread was interrupted unexpectly!");
|
||||
ex.printStackTrace();
|
||||
|
||||
@@ -105,6 +105,11 @@ public 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();
|
||||
@@ -117,7 +122,6 @@ public class MixinMinecraftServer {
|
||||
}
|
||||
MinecraftTimings.minecraftSchedulerTimer.stopTiming();
|
||||
|
||||
Runnable runnable;
|
||||
MinecraftTimings.processQueueTimer.startTiming();
|
||||
while ((runnable = processQueue.poll()) != null) runnable.run();
|
||||
MinecraftTimings.processQueueTimer.stopTiming();
|
||||
|
||||
2753
sources/src/main/java/net/minecraft/server/PlayerConnection.java
Normal file
2753
sources/src/main/java/net/minecraft/server/PlayerConnection.java
Normal file
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user