Don't run movement transmitter provider in netty thread

This commit is contained in:
FlorianMichael 2025-09-03 21:01:00 +02:00 committed by Nassim Jahnke
parent 16ba011243
commit 695534e8a8
No known key found for this signature in database
GPG Key ID: EF6771C01F6EF02F
3 changed files with 43 additions and 26 deletions

View File

@ -114,14 +114,23 @@ public class BukkitViaMovementTransmitter extends MovementTransmitterProvider {
}
} else {
ChannelHandlerContext context = PipelineUtil.getContextBefore("decoder", info.getChannel().pipeline());
if (context != null) {
if (info.get(MovementTracker.class).isGround()) {
if (context == null) {
return;
}
info.getChannel().eventLoop().execute(() -> {
MovementTracker movementTracker = info.get(MovementTracker.class);
if (movementTracker == null) {
return;
}
if (movementTracker.isGround()) {
context.fireChannelRead(getGroundPacket());
} else {
context.fireChannelRead(getFlyingPacket());
}
info.get(MovementTracker.class).incrementIdlePacket();
}
movementTracker.incrementIdlePacket();
});
}
}
}

View File

@ -31,19 +31,21 @@ import java.util.logging.Level;
public class MovementTransmitterProvider implements Provider {
public void sendPlayer(UserConnection userConnection) {
if (userConnection.getProtocolInfo().getClientState() != State.PLAY || !userConnection.getEntityTracker(Protocol1_8To1_9.class).hasClientEntityId()) {
return;
}
userConnection.getChannel().eventLoop().execute(() -> {
if (userConnection.getProtocolInfo().getClientState() != State.PLAY || !userConnection.getEntityTracker(Protocol1_8To1_9.class).hasClientEntityId()) {
return;
}
final MovementTracker movementTracker = userConnection.get(MovementTracker.class);
movementTracker.incrementIdlePacket();
final MovementTracker movementTracker = userConnection.get(MovementTracker.class);
movementTracker.incrementIdlePacket();
try {
final PacketWrapper playerMovement = PacketWrapper.create(ServerboundPackets1_8.MOVE_PLAYER_STATUS_ONLY, userConnection);
playerMovement.write(Types.BOOLEAN, movementTracker.isGround()); // on ground
playerMovement.sendToServer(Protocol1_8To1_9.class);
} catch (Throwable e) {
Via.getPlatform().getLogger().log(Level.WARNING, "Failed to send player movement packet", e);
}
try {
final PacketWrapper playerMovement = PacketWrapper.create(ServerboundPackets1_8.MOVE_PLAYER_STATUS_ONLY, userConnection);
playerMovement.write(Types.BOOLEAN, movementTracker.isGround()); // on ground
playerMovement.sendToServer(Protocol1_8To1_9.class);
} catch (Throwable e) {
Via.getPlatform().getLogger().log(Level.WARNING, "Failed to send player movement packet", e);
}
});
}
}

View File

@ -19,21 +19,27 @@ package com.viaversion.viaversion.protocols.v1_8to1_9.task;
import com.viaversion.viaversion.api.Via;
import com.viaversion.viaversion.api.connection.UserConnection;
import com.viaversion.viaversion.connection.StorableObjectTask;
import com.viaversion.viaversion.protocols.v1_8to1_9.provider.MovementTransmitterProvider;
import com.viaversion.viaversion.protocols.v1_8to1_9.storage.MovementTracker;
public final class IdlePacketTask extends StorableObjectTask<MovementTracker> {
public IdlePacketTask() {
super(MovementTracker.class);
}
public final class IdlePacketTask implements Runnable {
@Override
public void run(final UserConnection connection, final MovementTracker storableObject) {
final long nextIdleUpdate = storableObject.getNextIdlePacket();
if (nextIdleUpdate <= System.currentTimeMillis()) {
Via.getManager().getProviders().get(MovementTransmitterProvider.class).sendPlayer(connection);
public void run() {
for (final UserConnection connection : Via.getManager().getConnectionManager().getConnections()) {
if (!connection.isActive()) {
continue;
}
final MovementTracker tracker = connection.get(MovementTracker.class);
if (tracker == null) {
continue;
}
final long nextIdleUpdate = tracker.getNextIdlePacket();
if (nextIdleUpdate <= System.currentTimeMillis()) {
Via.getManager().getProviders().get(MovementTransmitterProvider.class).sendPlayer(connection);
}
}
}
}