Move players info update to slack service w/ config changes

This commit is contained in:
Sotr
2018-06-18 02:09:29 +08:00
parent 1e93929534
commit fb7bf16869
4 changed files with 1974 additions and 13 deletions

View File

@@ -170,19 +170,19 @@ public class AkarinGlobalConfig {
legacyWorldTimings = getBoolean("alternative.legacy-world-timings-required", false); legacyWorldTimings = getBoolean("alternative.legacy-world-timings-required", false);
} }
public static int timeUpdateInterval; public static long timeUpdateInterval;
private static void timeUpdateInterval() { private static void timeUpdateInterval() {
timeUpdateInterval = getSeconds(getString("core.world-time-update-interval", "1s")); timeUpdateInterval = getSeconds(getString("core.tick-rate.world-time-update-interval", "1s")) * 10;
} }
public static int keepAliveSendInterval; public static long keepAliveSendInterval;
private static void keepAliveSendInterval() { private static void keepAliveSendInterval() {
keepAliveSendInterval = getSeconds(getString("core.keep-alive-packet-send-interval", "15s")); keepAliveSendInterval = getSeconds(getString("core.tick-rate.keep-alive-packet-send-interval", "15s")) * 1000;
} }
public static int keepAliveTimeout; public static long keepAliveTimeout;
private static void keepAliveTimeout() { private static void keepAliveTimeout() {
keepAliveTimeout = getSeconds(getString("core.keep-alive-response-timeout", "30s")); keepAliveTimeout = getSeconds(getString("core.keep-alive-response-timeout", "30s")) * 1000;
} }
public static int asyncLightingThreads; public static int asyncLightingThreads;
@@ -289,4 +289,9 @@ public class AkarinGlobalConfig {
private static void primaryThreadPriority() { private static void primaryThreadPriority() {
primaryThreadPriority = getInt("core.primary-thread-priority", 7); primaryThreadPriority = getInt("core.primary-thread-priority", 7);
} }
public static long playersInfoUpdateInterval;
private static void playersInfoUpdateInterval() {
playersInfoUpdateInterval = getSeconds(getString("core.tick-rate.players-info-update-interval", "30s")) * 10;
}
} }

View File

@@ -1,10 +1,14 @@
package io.akarin.server.core; package io.akarin.server.core;
import com.google.common.base.Predicate;
import com.google.common.collect.Iterables;
import io.akarin.api.internal.Akari; import io.akarin.api.internal.Akari;
import net.minecraft.server.EntityPlayer; import net.minecraft.server.EntityPlayer;
import net.minecraft.server.EnumDifficulty; import net.minecraft.server.EnumDifficulty;
import net.minecraft.server.MinecraftServer; import net.minecraft.server.MinecraftServer;
import net.minecraft.server.PacketPlayOutKeepAlive; import net.minecraft.server.PacketPlayOutKeepAlive;
import net.minecraft.server.PacketPlayOutPlayerInfo;
import net.minecraft.server.PacketPlayOutUpdateTime; import net.minecraft.server.PacketPlayOutUpdateTime;
import net.minecraft.server.PlayerConnection; import net.minecraft.server.PlayerConnection;
import net.minecraft.server.WorldServer; import net.minecraft.server.WorldServer;
@@ -26,7 +30,11 @@ public class AkarinSlackScheduler extends Thread {
private static final AkarinSlackScheduler instance = new AkarinSlackScheduler(); private static final AkarinSlackScheduler instance = new AkarinSlackScheduler();
} }
/*
* Timers
*/
private long updateTime; private long updateTime;
private long resendPlayersInfo;
@Override @Override
public void run() { public void run() {
@@ -34,7 +42,7 @@ public class AkarinSlackScheduler extends Thread {
while (server.isRunning()) { while (server.isRunning()) {
// Send time updates to everyone, it will get the right time from the world the player is in. // Send time updates to everyone, it will get the right time from the world the player is in.
if (++updateTime >= AkarinGlobalConfig.timeUpdateInterval * 10) { if (++updateTime >= AkarinGlobalConfig.timeUpdateInterval) {
for (EntityPlayer player : server.getPlayerList().players) { 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 player.playerConnection.sendPacket(new PacketPlayOutUpdateTime(player.world.getTime(), player.getPlayerTime(), player.world.getGameRules().getBoolean("doDaylightCycle"))); // Add support for per player time
} }
@@ -49,14 +57,14 @@ public class AkarinSlackScheduler extends Thread {
long elapsedTime = currentTime - conn.getLastPing(); long elapsedTime = currentTime - conn.getLastPing();
if (conn.isPendingPing()) { if (conn.isPendingPing()) {
// We're pending a ping from the client // We're pending a ping from the client
if (!conn.processedDisconnect && elapsedTime >= AkarinGlobalConfig.keepAliveTimeout * 1000L) { // check keepalive limit, don't fire if already disconnected if (!conn.processedDisconnect && elapsedTime >= AkarinGlobalConfig.keepAliveTimeout) { // check keepalive limit, don't fire if already disconnected
Akari.callbackQueue.add(() -> { Akari.callbackQueue.add(() -> {
Akari.logger.warn("{} was kicked due to keepalive timeout!", conn.player.getName()); // more info Akari.logger.warn("{} was kicked due to keepalive timeout!", conn.player.getName()); // more info
conn.disconnect("disconnect.timeout"); conn.disconnect("disconnect.timeout");
}); });
} }
} else { } else {
if (elapsedTime >= AkarinGlobalConfig.keepAliveSendInterval * 1000L) { // 15 seconds default if (elapsedTime >= AkarinGlobalConfig.keepAliveSendInterval) { // 15 seconds default
conn.setPendingPing(true); conn.setPendingPing(true);
conn.setLastPing(currentTime); conn.setLastPing(currentTime);
conn.setKeepAliveID(currentTime); conn.setKeepAliveID(currentTime);
@@ -71,6 +79,18 @@ public class AkarinSlackScheduler extends Thread {
} }
} }
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<EntityPlayer>() {
@Override
public boolean apply(EntityPlayer input) {
return target.getBukkitEntity().canSee(input.getBukkitEntity());
}
})));
}
resendPlayersInfo = 0;
}
try { try {
Thread.sleep(100); Thread.sleep(100);
} catch (InterruptedException ex) { } catch (InterruptedException ex) {

View File

@@ -193,10 +193,6 @@ public abstract class MixinMinecraftServer {
this.an().c(); this.an().c();
MinecraftTimings.connectionTimer.stopTiming(); MinecraftTimings.connectionTimer.stopTiming();
MinecraftTimings.playerListTimer.startTiming();
this.v.tick();
MinecraftTimings.playerListTimer.stopTiming();
MinecraftTimings.commandFunctionsTimer.startTiming(); MinecraftTimings.commandFunctionsTimer.startTiming();
this.aL().e(); this.aL().e();
MinecraftTimings.commandFunctionsTimer.stopTiming(); MinecraftTimings.commandFunctionsTimer.stopTiming();

File diff suppressed because it is too large Load Diff