Avoid twice thread check for #13 w/ Fixes double player updating
This commit is contained in:
@@ -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<EntityPlayer>() {
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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 <T extends PacketListener> void ensureMainThread(final Packet<T> 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
@@ -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",
|
||||
|
||||
Reference in New Issue
Block a user