Skip to content

Commit

Permalink
Merge remote-tracking branch 'refs/remotes/upstream/master' into feat…
Browse files Browse the repository at this point in the history
…ure/1.21.4

# Conflicts:
#	core/src/main/java/org/geysermc/geyser/registry/populator/BlockRegistryPopulator.java
#	core/src/main/java/org/geysermc/geyser/registry/populator/ItemRegistryPopulator.java
#	gradle/libs.versions.toml
  • Loading branch information
onebeastchris committed Dec 5, 2024
2 parents b469a61 + 2019e53 commit abf14e6
Show file tree
Hide file tree
Showing 22 changed files with 52 additions and 96 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -178,9 +178,8 @@ private void workAroundWeirdBug(GeyserBootstrap bootstrap) {
MinecraftProtocol protocol = new MinecraftProtocol();
LocalSession session = new LocalSession(bootstrap.getGeyserConfig().getRemote().address(),
bootstrap.getGeyserConfig().getRemote().port(), this.serverSocketAddress,
InetAddress.getLoopbackAddress().getHostAddress(), protocol, protocol.createHelper());
InetAddress.getLoopbackAddress().getHostAddress(), protocol, Runnable::run);
session.connect();
session.disconnect("");
}

@Override
Expand Down
3 changes: 0 additions & 3 deletions core/src/main/java/org/geysermc/geyser/GeyserImpl.java
Original file line number Diff line number Diff line change
Expand Up @@ -414,9 +414,6 @@ private void startInstance() {
}
}

// Ensure that PacketLib does not create an event loop for handling packets; we'll do that ourselves
TcpSession.USE_EVENT_LOOP_FOR_PACKETS = false;

pendingMicrosoftAuthentication = new PendingMicrosoftAuthentication(config.getPendingAuthenticationTimeout());

this.newsHandler = new NewsHandler(BRANCH, this.buildNumber());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@
import org.checkerframework.checker.nullness.qual.Nullable;
import org.cloudburstmc.protocol.bedrock.codec.BedrockCodec;
import org.cloudburstmc.protocol.bedrock.codec.v748.Bedrock_v748;
import org.cloudburstmc.protocol.bedrock.codec.v765.Bedrock_v765;
import org.cloudburstmc.protocol.bedrock.codec.v766.Bedrock_v766;
import org.cloudburstmc.protocol.bedrock.netty.codec.packet.BedrockPacketCodec;
import org.geysermc.mcprotocollib.protocol.codec.MinecraftCodec;
import org.geysermc.mcprotocollib.protocol.codec.PacketCodec;
Expand All @@ -46,9 +46,8 @@ public final class GameProtocol {
* Default Bedrock codec that should act as a fallback. Should represent the latest available
* release of the game that Geyser supports.
*/
public static final BedrockCodec DEFAULT_BEDROCK_CODEC = CodecProcessor.processCodec(Bedrock_v765.CODEC.toBuilder()
public static final BedrockCodec DEFAULT_BEDROCK_CODEC = CodecProcessor.processCodec(Bedrock_v766.CODEC.toBuilder()
.minecraftVersion("1.21.50")
.protocolVersion(766)
.build());

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -96,7 +96,7 @@ public UpstreamPacketHandler(GeyserImpl geyser, GeyserSession session) {
}

private PacketSignal translateAndDefault(BedrockPacket packet) {
Registries.BEDROCK_PACKET_TRANSLATORS.translate(packet.getClass(), packet, session);
Registries.BEDROCK_PACKET_TRANSLATORS.translate(packet.getClass(), packet, session, false);
return PacketSignal.HANDLED; // PacketSignal.UNHANDLED will log a WARN publicly
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,7 @@
import java.net.InetSocketAddress;
import java.net.SocketAddress;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.Executor;
import java.util.concurrent.TimeUnit;

/**
Expand All @@ -72,11 +73,11 @@ public final class LocalSession extends TcpSession {
private final String clientIp;
private final PacketCodecHelper codecHelper;

public LocalSession(String host, int port, SocketAddress targetAddress, String clientIp, PacketProtocol protocol, MinecraftCodecHelper codecHelper) {
super(host, port, protocol);
public LocalSession(String host, int port, SocketAddress targetAddress, String clientIp, PacketProtocol protocol, Executor packetHandlerExecutor) {
super(host, port, protocol, packetHandlerExecutor);
this.targetAddress = targetAddress;
this.clientIp = clientIp;
this.codecHelper = codecHelper;
this.codecHelper = protocol.createHelper();
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -56,15 +56,15 @@ protected PacketTranslatorRegistry() {
}

@SuppressWarnings("unchecked")
public <P extends T> boolean translate(Class<? extends P> clazz, P packet, GeyserSession session) {
public <P extends T> boolean translate(Class<? extends P> clazz, P packet, GeyserSession session, boolean canRunImmediately) {
if (session.getUpstream().isClosed() || session.isClosed()) {
return false;
}

PacketTranslator<P> translator = (PacketTranslator<P>) this.mappings.get(clazz);
if (translator != null) {
EventLoop eventLoop = session.getEventLoop();
if (!translator.shouldExecuteInEventLoop() || eventLoop.inEventLoop()) {
EventLoop eventLoop = session.getTickEventLoop();
if (canRunImmediately || !translator.shouldExecuteInEventLoop() || eventLoop.inEventLoop()) {
translate0(session, translator, packet);
} else {
eventLoop.execute(() -> translate0(session, translator, packet));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@
import org.cloudburstmc.nbt.NbtType;
import org.cloudburstmc.nbt.NbtUtils;
import org.cloudburstmc.protocol.bedrock.codec.v748.Bedrock_v748;
import org.cloudburstmc.protocol.bedrock.codec.v765.Bedrock_v765;
import org.cloudburstmc.protocol.bedrock.codec.v766.Bedrock_v766;
import org.cloudburstmc.protocol.bedrock.data.BlockPropertyData;
import org.cloudburstmc.protocol.bedrock.data.definitions.BlockDefinition;
import org.geysermc.geyser.GeyserImpl;
Expand Down Expand Up @@ -124,7 +124,7 @@ private static void nullifyBlocksNbt() {
private static void registerBedrockBlocks() {
var blockMappers = ImmutableMap.<ObjectIntPair<String>, Remapper>builder()
.put(ObjectIntPair.of("1_21_40", Bedrock_v748.CODEC.getProtocolVersion()), Conversion766_748::remapBlock)
.put(ObjectIntPair.of("1_21_50", Bedrock_v765.CODEC.getProtocolVersion()), tag -> tag)
.put(ObjectIntPair.of("1_21_50", Bedrock_v766.CODEC.getProtocolVersion()), tag -> tag)
.build();

// We can keep this strong as nothing should be garbage collected
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@
import org.cloudburstmc.nbt.NbtType;
import org.cloudburstmc.nbt.NbtUtils;
import org.cloudburstmc.protocol.bedrock.codec.v748.Bedrock_v748;
import org.cloudburstmc.protocol.bedrock.codec.v765.Bedrock_v765;
import org.cloudburstmc.protocol.bedrock.codec.v766.Bedrock_v766;
import org.cloudburstmc.protocol.bedrock.data.definitions.BlockDefinition;
import org.cloudburstmc.protocol.bedrock.data.definitions.ItemDefinition;
import org.cloudburstmc.protocol.bedrock.data.definitions.SimpleItemDefinition;
Expand Down Expand Up @@ -108,7 +108,6 @@ interface Remapper {
}

public static void populate() {

Map<Item, Item> itemFallbacks = new HashMap<>();
itemFallbacks.put(Items.PALE_OAK_PLANKS, Items.BIRCH_PLANKS);
itemFallbacks.put(Items.PALE_OAK_FENCE, Items.BIRCH_FENCE);
Expand Down Expand Up @@ -147,7 +146,7 @@ public static void populate() {

List<PaletteVersion> paletteVersions = new ArrayList<>(2);
paletteVersions.add(new PaletteVersion("1_21_40", Bedrock_v748.CODEC.getProtocolVersion(), itemFallbacks, (item, mapping) -> mapping));
paletteVersions.add(new PaletteVersion("1_21_50", Bedrock_v765.CODEC.getProtocolVersion()));
paletteVersions.add(new PaletteVersion("1_21_50", Bedrock_v766.CODEC.getProtocolVersion()));

GeyserBootstrap bootstrap = GeyserImpl.getInstance().getBootstrap();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@
import it.unimi.dsi.fastutil.objects.Object2ObjectOpenCustomHashMap;
import it.unimi.dsi.fastutil.objects.ObjectIntPair;
import org.cloudburstmc.protocol.bedrock.codec.v748.Bedrock_v748;
import org.cloudburstmc.protocol.bedrock.codec.v765.Bedrock_v765;
import org.cloudburstmc.protocol.bedrock.codec.v766.Bedrock_v766;
import org.geysermc.geyser.GeyserBootstrap;
import org.geysermc.geyser.GeyserImpl;
import org.geysermc.geyser.item.type.Item;
Expand Down Expand Up @@ -68,7 +68,7 @@ public boolean equals(int[] a, int[] b) {

List<ObjectIntPair<String>> paletteVersions = List.of(
ObjectIntPair.of("1_21_40", Bedrock_v748.CODEC.getProtocolVersion()),
ObjectIntPair.of("1_21_50", Bedrock_v765.CODEC.getProtocolVersion())
ObjectIntPair.of("1_21_50", Bedrock_v766.CODEC.getProtocolVersion())
);
Type type = new TypeToken<Map<String, List<String>>>() {}.getType();

Expand Down
49 changes: 24 additions & 25 deletions core/src/main/java/org/geysermc/geyser/session/GeyserSession.java
Original file line number Diff line number Diff line change
Expand Up @@ -253,7 +253,7 @@ public class GeyserSession implements GeyserConnection, GeyserCommandSource {
* The loop where all packets and ticking is processed to prevent concurrency issues.
* If this is manually called, ensure that any exceptions are properly handled.
*/
private final EventLoop eventLoop;
private final EventLoop tickEventLoop;
@Setter
private AuthData authData;
private BedrockClientData clientData;
Expand Down Expand Up @@ -658,10 +658,10 @@ public class GeyserSession implements GeyserConnection, GeyserCommandSource {

private MinecraftProtocol protocol;

public GeyserSession(GeyserImpl geyser, BedrockServerSession bedrockServerSession, EventLoop eventLoop) {
public GeyserSession(GeyserImpl geyser, BedrockServerSession bedrockServerSession, EventLoop tickEventLoop) {
this.geyser = geyser;
this.upstream = new UpstreamSession(bedrockServerSession);
this.eventLoop = eventLoop;
this.tickEventLoop = tickEventLoop;

this.erosionHandler = new GeyserboundHandshakePacketHandler(this);

Expand Down Expand Up @@ -952,17 +952,17 @@ private void connectDownstream() {
boolean floodgate = this.remoteServer.authType() == AuthType.FLOODGATE;

// Start ticking
tickThread = eventLoop.scheduleAtFixedRate(this::tick, 50, 50, TimeUnit.MILLISECONDS);
tickThread = tickEventLoop.scheduleAtFixedRate(this::tick, 50, 50, TimeUnit.MILLISECONDS);

TcpSession downstream;
if (geyser.getBootstrap().getSocketAddress() != null) {
// We're going to connect through the JVM and not through TCP
downstream = new LocalSession(this.remoteServer.address(), this.remoteServer.port(),
geyser.getBootstrap().getSocketAddress(), upstream.getAddress().getAddress().getHostAddress(),
this.protocol, this.protocol.createHelper());
this.protocol, tickEventLoop);
this.downstream = new DownstreamSession(downstream);
} else {
downstream = new TcpClientSession(this.remoteServer.address(), this.remoteServer.port(), this.protocol);
downstream = new TcpClientSession(this.remoteServer.address(), this.remoteServer.port(), "0.0.0.0", 0, this.protocol, null, tickEventLoop);
this.downstream = new DownstreamSession(downstream);

boolean resolveSrv = false;
Expand Down Expand Up @@ -1148,7 +1148,7 @@ public void disconnected(DisconnectedEvent event) {

@Override
public void packetReceived(Session session, Packet packet) {
Registries.JAVA_PACKET_TRANSLATORS.translate(packet.getClass(), packet, GeyserSession.this);
Registries.JAVA_PACKET_TRANSLATORS.translate(packet.getClass(), packet, GeyserSession.this, true);
}

@Override
Expand Down Expand Up @@ -1218,26 +1218,19 @@ public void disconnect(String reason) {
* Moves task to the session event loop if already not in it. Otherwise, the task is automatically ran.
*/
public void ensureInEventLoop(Runnable runnable) {
if (eventLoop.inEventLoop()) {
runnable.run();
if (tickEventLoop.inEventLoop()) {
executeRunnable(runnable);
return;
}

executeInEventLoop(runnable);
}

/**
* Executes a task and prints a stack trace if an error occurs.
*/
public void executeInEventLoop(Runnable runnable) {
eventLoop.execute(() -> {
try {
runnable.run();
} catch (ErosionCancellationException e) {
geyser.getLogger().debug("Caught ErosionCancellationException");
} catch (Throwable e) {
geyser.getLogger().error("Error thrown in " + this.bedrockUsername() + "'s event loop!", e);
}
});
tickEventLoop.execute(() -> executeRunnable(runnable));
}

/**
Expand All @@ -1246,19 +1239,25 @@ public void executeInEventLoop(Runnable runnable) {
* The task will not run if the session is closed.
*/
public ScheduledFuture<?> scheduleInEventLoop(Runnable runnable, long duration, TimeUnit timeUnit) {
return eventLoop.schedule(() -> {
try {
return tickEventLoop.schedule(() -> {
executeRunnable(() -> {
if (!closed) {
runnable.run();
}
} catch (ErosionCancellationException e) {
geyser.getLogger().debug("Caught ErosionCancellationException");
} catch (Throwable e) {
geyser.getLogger().error("Error thrown in " + this.bedrockUsername() + "'s event loop!", e);
}
});
}, duration, timeUnit);
}

private void executeRunnable(Runnable runnable) {
try {
runnable.run();
} catch (ErosionCancellationException e) {
geyser.getLogger().debug("Caught ErosionCancellationException");
} catch (Throwable e) {
geyser.getLogger().error("Error thrown in " + this.bedrockUsername() + "'s event loop!", e);
}
}

/**
* Called every 50 milliseconds - one Minecraft tick.
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -131,11 +131,8 @@ private static UUID getUUID(NbtMap profile) {
session.getGeyser().getLogger().debug("Custom skull with invalid profile tag: " + blockPosition + " " + javaNbt);
return;
}
if (session.getEventLoop().inEventLoop()) {
putSkull(session, blockPosition, uuid, texturesProperty, blockState);
} else {
session.executeInEventLoop(() -> putSkull(session, blockPosition, uuid, texturesProperty, blockState));
}

session.ensureInEventLoop(() -> putSkull(session, blockPosition, uuid, texturesProperty, blockState));
});

// We don't have the textures yet, so we can't determine if a custom block was defined for this skull
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ public abstract class PacketTranslator<T> {
/**
* Determines if this packet should be handled in the session's event loop. This should generally be true -
* only when the packet has to be executed immediately should it be false.
* This method is only used for bedrock packets, java packets have a more sophisticated system through MCProtocolLib.
*/
public boolean shouldExecuteInEventLoop() {
return true;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -61,11 +61,8 @@ public void translate(GeyserSession session, EmotePacket packet) {
for (GeyserSession otherSession : session.getGeyser().getSessionManager().getSessions().values()) {
if (otherSession != session) {
if (otherSession.isClosed()) continue;
if (otherSession.getEventLoop().inEventLoop()) {
playEmote(otherSession, javaId, xuid, emote);
} else {
otherSession.executeInEventLoop(() -> playEmote(otherSession, javaId, xuid, emote));
}

otherSession.ensureInEventLoop(() -> playEmote(otherSession, javaId, xuid, emote));
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -140,10 +140,4 @@ public void translate(GeyserSession session, ClientboundCustomPayloadPacket pack
});
}
}

@Override
public boolean shouldExecuteInEventLoop() {
// For Erosion packets
return false;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -38,9 +38,4 @@ public class JavaDisconnectTranslator extends PacketTranslator<ClientboundDiscon
public void translate(GeyserSession session, ClientboundDisconnectPacket packet) {
session.disconnect(MessageTranslator.convertMessage(packet.getReason(), session.locale()));
}

@Override
public boolean shouldExecuteInEventLoop() {
return false;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -67,9 +67,4 @@ public void translate(GeyserSession session, ClientboundKeepAlivePacket packet)
latencyPacket.setTimestamp(timestamp);
session.sendUpstreamPacketImmediately(latencyPacket);
}

@Override
public boolean shouldExecuteInEventLoop() {
return false;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -98,9 +98,4 @@ private boolean testForOutdatedServer(Component disconnectReason) {
private boolean testForMissingProfilePublicKey(Component disconnectReason) {
return disconnectReason instanceof TranslatableComponent component && "multiplayer.disconnect.missing_public_key".equals(component.key());
}

@Override
public boolean shouldExecuteInEventLoop() {
return false;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -59,10 +59,4 @@ public void translate(GeyserSession session, ClientboundSelectKnownPacks packet)
}
session.sendDownstreamPacket(new ServerboundSelectKnownPacks(knownPacks));
}

@Override
public boolean shouldExecuteInEventLoop() {
// This technically isn't correct behavior, but it prevents race conditions between MCProtocolLib's packet handler and ours.
return false;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -43,10 +43,4 @@ public void translate(GeyserSession session, ClientboundStartConfigurationPacket
erosionHandler.close();
}
}

@Override
public boolean shouldExecuteInEventLoop() {
// Execute outside of event loop to cancel any pending erosion futures
return false;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,6 @@ public class JavaTeleportEntityTranslator extends PacketTranslator<ClientboundTe

@Override
public void translate(GeyserSession session, ClientboundTeleportEntityPacket packet) {
session.getGeyser().getLogger().info(packet.toString());
session.getGeyser().getLogger().debug(packet.toString());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -28,8 +28,8 @@
import org.geysermc.geyser.session.GeyserSession;
import org.geysermc.geyser.translator.protocol.PacketTranslator;
import org.geysermc.geyser.translator.protocol.Translator;
import org.geysermc.mcprotocollib.protocol.packet.common.clientbound.ClientboundCookieRequestPacket;
import org.geysermc.mcprotocollib.protocol.packet.common.clientbound.ServerboundCookieResponsePacket;
import org.geysermc.mcprotocollib.protocol.packet.cookie.clientbound.ClientboundCookieRequestPacket;
import org.geysermc.mcprotocollib.protocol.packet.cookie.serverbound.ServerboundCookieResponsePacket;

@Translator(packet = ClientboundCookieRequestPacket.class)
public class JavaCookieRequestTranslator extends PacketTranslator<ClientboundCookieRequestPacket> {
Expand Down
Loading

0 comments on commit abf14e6

Please sign in to comment.