refactor: use time updates from the server for second tick

This commit is contained in:
ChomeNS
2025-04-26 11:11:33 +07:00
parent 896b75c40f
commit 76b7df54e2
6 changed files with 35 additions and 18 deletions

View File

@@ -1 +1 @@
2936
2938

View File

@@ -31,6 +31,7 @@ public interface Listener {
default void onTick () { }
default void onAlwaysTick () { }
default void onSecondTick () { }
default void onLocalSecondTick () { }
// core
default void onCoreReady () { }

View File

@@ -91,7 +91,7 @@ public class CommandHandlerPlugin implements Listener {
}
@Override
public void onSecondTick () {
public void onLocalSecondTick () {
commandPerSecond = 0;
}

View File

@@ -30,7 +30,7 @@ public class FilterManagerPlugin implements Listener {
}
@Override
public void onSecondTick () {
public void onLocalSecondTick () {
removeLeftPlayers();
}

View File

@@ -6,12 +6,9 @@ import me.chayapak1.chomens_bot.data.listener.Listener;
import me.chayapak1.chomens_bot.util.MathUtilities;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.format.NamedTextColor;
import org.geysermc.mcprotocollib.network.Session;
import org.geysermc.mcprotocollib.network.packet.Packet;
import org.geysermc.mcprotocollib.network.event.session.ConnectedEvent;
import org.geysermc.mcprotocollib.protocol.data.game.BossBarColor;
import org.geysermc.mcprotocollib.protocol.data.game.BossBarDivision;
import org.geysermc.mcprotocollib.protocol.packet.ingame.clientbound.ClientboundLoginPacket;
import org.geysermc.mcprotocollib.protocol.packet.ingame.clientbound.level.ClientboundSetTimePacket;
import java.text.DecimalFormat;
import java.util.Arrays;
@@ -116,13 +113,9 @@ public class TPSPlugin implements Listener {
else return BossBarColor.PURPLE;
}
// this is the server time update tick, sent straight from server, not local!
@Override
public void packetReceived (final Session session, final Packet packet) {
if (packet instanceof final ClientboundSetTimePacket t_packet) packetReceived(t_packet);
else if (packet instanceof final ClientboundLoginPacket t_packet) packetReceived(t_packet);
}
private void packetReceived (final ClientboundSetTimePacket ignoredPacket) {
public void onSecondTick () {
final long now = System.currentTimeMillis();
final float timeElapsed = (float) (now - timeLastTimeUpdate) / 1000.0F;
tickRates[nextIndex] = MathUtilities.clamp(20.0f / timeElapsed, 0.0f, 20.0f);
@@ -130,7 +123,8 @@ public class TPSPlugin implements Listener {
timeLastTimeUpdate = now;
}
private void packetReceived (final ClientboundLoginPacket ignoredPacket) {
@Override
public void connected (final ConnectedEvent event) {
Arrays.fill(tickRates, 0);
nextIndex = 0;
timeGameJoined = timeLastTimeUpdate = System.currentTimeMillis();

View File

@@ -1,11 +1,15 @@
package me.chayapak1.chomens_bot.plugins;
import me.chayapak1.chomens_bot.Bot;
import me.chayapak1.chomens_bot.data.listener.Listener;
import org.geysermc.mcprotocollib.network.Session;
import org.geysermc.mcprotocollib.network.packet.Packet;
import org.geysermc.mcprotocollib.protocol.packet.ingame.clientbound.level.ClientboundSetTimePacket;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicLong;
public class TickPlugin {
public class TickPlugin implements Listener {
private final Bot bot;
public final AtomicLong lastTickTime = new AtomicLong();
@@ -14,8 +18,10 @@ public class TickPlugin {
public TickPlugin (final Bot bot) {
this.bot = bot;
bot.listener.addListener(this);
bot.executor.scheduleAtFixedRate(this::tick, 0, 50, TimeUnit.MILLISECONDS);
bot.executor.scheduleAtFixedRate(this::tickSecond, 0, 1, TimeUnit.SECONDS);
bot.executor.scheduleAtFixedRate(this::tickLocalSecond, 0, 1, TimeUnit.SECONDS);
}
private void tick () {
@@ -42,14 +48,30 @@ public class TickPlugin {
lastTickTime.set(System.currentTimeMillis());
}
private void tickSecond () {
private void tickLocalSecond () {
if (!bot.loggedIn) return;
bot.listener.dispatch(listener -> {
try {
listener.onLocalSecondTick();
} catch (final Throwable e) {
bot.logger.error("Caught exception in a local second tick listener!");
bot.logger.error(e);
}
});
}
@Override
public void packetReceived (final Session session, final Packet packet) {
if (packet instanceof final ClientboundSetTimePacket t_packet) packetReceived(t_packet);
}
private void packetReceived (final ClientboundSetTimePacket ignoredPacket) {
bot.listener.dispatch(listener -> {
try {
listener.onSecondTick();
} catch (final Throwable e) {
bot.logger.error("Caught exception in a second tick listener!");
bot.logger.error("Caught exception in a server time update listener!");
bot.logger.error(e);
}
});