Merge branch 'master' into new-block-api

This commit is contained in:
TheMode 2021-07-09 00:29:31 +02:00
commit 295b3e24dd
4 changed files with 59 additions and 58 deletions

View File

@ -13,10 +13,11 @@ jobs:
steps: steps:
- uses: actions/checkout@v2 - uses: actions/checkout@v2
- name: Set up JDK 11 - name: Set up JDK 16
uses: actions/setup-java@v1 uses: actions/setup-java@v2
with: with:
java-version: 11 distribution: 'adopt'
java-version: 16
- name: Grant execute permission for gradlew - name: Grant execute permission for gradlew
run: chmod +x gradlew run: chmod +x gradlew
- name: Setup gradle cache - name: Setup gradle cache

View File

@ -15,6 +15,7 @@ import org.jetbrains.annotations.NotNull;
import java.util.List; import java.util.List;
import java.util.Queue; import java.util.Queue;
import java.util.concurrent.*; import java.util.concurrent.*;
import java.util.concurrent.locks.LockSupport;
import java.util.function.Consumer; import java.util.function.Consumer;
import java.util.function.LongConsumer; import java.util.function.LongConsumer;
@ -25,9 +26,6 @@ import java.util.function.LongConsumer;
*/ */
public final class UpdateManager { public final class UpdateManager {
private final ScheduledExecutorService updateExecutionService = Executors.newSingleThreadScheduledExecutor(r ->
new Thread(r, MinecraftServer.THREAD_NAME_TICK_SCHEDULER));
private volatile boolean stopRequested; private volatile boolean stopRequested;
// TODO make configurable // TODO make configurable
@ -49,54 +47,52 @@ public final class UpdateManager {
protected void start() { protected void start() {
final ConnectionManager connectionManager = MinecraftServer.getConnectionManager(); final ConnectionManager connectionManager = MinecraftServer.getConnectionManager();
updateExecutionService.scheduleAtFixedRate(() -> { new Thread(() -> {
try { while (!stopRequested) {
if (stopRequested) { try {
updateExecutionService.shutdown(); long currentTime = System.nanoTime();
return; final long tickStart = System.currentTimeMillis();
// Tick start callbacks
doTickCallback(tickStartCallbacks, tickStart);
// Waiting players update (newly connected clients waiting to get into the server)
connectionManager.updateWaitingPlayers();
// Keep Alive Handling
connectionManager.handleKeepAlive(tickStart);
// Server tick (chunks/entities)
serverTick(tickStart);
// the time that the tick took in nanoseconds
final long tickTime = System.nanoTime() - currentTime;
// Tick end callbacks
doTickCallback(tickEndCallbacks, tickTime);
// Monitoring
if (!tickMonitors.isEmpty()) {
final double acquisitionTimeMs = Acquirable.getAcquiringTime() / 1e6D;
final double tickTimeMs = tickTime / 1e6D;
final TickMonitor tickMonitor = new TickMonitor(tickTimeMs, acquisitionTimeMs);
this.tickMonitors.forEach(consumer -> consumer.accept(tickMonitor));
Acquirable.resetAcquiringTime();
}
// Flush all waiting packets
AsyncUtils.runAsync(() -> connectionManager.getOnlinePlayers().parallelStream()
.filter(player -> player.getPlayerConnection() instanceof NettyPlayerConnection)
.map(player -> (NettyPlayerConnection) player.getPlayerConnection())
.forEach(NettyPlayerConnection::flush));
// Disable thread until next tick
LockSupport.parkNanos((long) ((MinecraftServer.TICK_MS * 1e6) - tickTime));
} catch (Exception e) {
MinecraftServer.getExceptionManager().handleException(e);
} }
long currentTime = System.nanoTime();
final long tickStart = System.currentTimeMillis();
// Tick start callbacks
doTickCallback(tickStartCallbacks, tickStart);
// Waiting players update (newly connected clients waiting to get into the server)
connectionManager.updateWaitingPlayers();
// Keep Alive Handling
connectionManager.handleKeepAlive(tickStart);
// Server tick (chunks/entities)
serverTick(tickStart);
// the time that the tick took in nanoseconds
final long tickTime = System.nanoTime() - currentTime;
// Tick end callbacks
doTickCallback(tickEndCallbacks, tickTime);
// Monitoring
if (!tickMonitors.isEmpty()) {
final double acquisitionTimeMs = Acquirable.getAcquiringTime() / 1e6D;
final double tickTimeMs = tickTime / 1e6D;
final TickMonitor tickMonitor = new TickMonitor(tickTimeMs, acquisitionTimeMs);
this.tickMonitors.forEach(consumer -> consumer.accept(tickMonitor));
Acquirable.resetAcquiringTime();
}
// Flush all waiting packets
AsyncUtils.runAsync(() -> connectionManager.getOnlinePlayers().parallelStream()
.filter(player -> player.getPlayerConnection() instanceof NettyPlayerConnection)
.map(player -> (NettyPlayerConnection) player.getPlayerConnection())
.forEach(NettyPlayerConnection::flush));
} catch (Exception e) {
MinecraftServer.getExceptionManager().handleException(e);
} }
}, 0, MinecraftServer.TICK_MS, TimeUnit.MILLISECONDS); }, MinecraftServer.THREAD_NAME_TICK_SCHEDULER).start();
} }
/** /**

View File

@ -36,7 +36,7 @@ public class ExplosionPacket implements ServerPacket {
y = reader.readFloat(); y = reader.readFloat();
z = reader.readFloat(); z = reader.readFloat();
radius = reader.readFloat(); radius = reader.readFloat();
int recordCount = reader.readInt() * 3; int recordCount = reader.readVarInt() * 3;
records = reader.readBytes(recordCount); records = reader.readBytes(recordCount);
playerMotionX = reader.readFloat(); playerMotionX = reader.readFloat();
playerMotionY = reader.readFloat(); playerMotionY = reader.readFloat();

View File

@ -73,11 +73,15 @@ public class MapDataPacket implements ComponentHoldingServerPacket {
locked = reader.readBoolean(); locked = reader.readBoolean();
trackingPosition = reader.readBoolean(); trackingPosition = reader.readBoolean();
int iconCount = reader.readVarInt(); if (trackingPosition) {
icons = new Icon[iconCount]; int iconCount = reader.readVarInt();
for (int i = 0; i < iconCount; i++) { icons = new Icon[iconCount];
icons[i] = new Icon(); for (int i = 0; i < iconCount; i++) {
icons[i].read(reader); icons[i] = new Icon();
icons[i].read(reader);
}
} else {
icons = new Icon[0];
} }
columns = reader.readByte(); columns = reader.readByte();