Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Improve/1.20.2 #1097

Merged
merged 7 commits into from
Oct 12, 2023
Merged
Show file tree
Hide file tree
Changes from 5 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 0 additions & 2 deletions api/src/main/java/com/velocitypowered/api/proxy/Player.java
Original file line number Diff line number Diff line change
Expand Up @@ -148,9 +148,7 @@ public interface Player extends
/**
* Clears the tab list header and footer for the player.
*
* @deprecated Use {@link TabList#clearHeaderAndFooter()}.
*/
@Deprecated
Gerrygames marked this conversation as resolved.
Show resolved Hide resolved
void clearHeaderAndFooter();

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
import com.velocitypowered.proxy.connection.MinecraftConnection;
import com.velocitypowered.proxy.connection.MinecraftSessionHandler;
import com.velocitypowered.proxy.connection.client.ClientConfigSessionHandler;
import com.velocitypowered.proxy.connection.client.ConnectedPlayer;
import com.velocitypowered.proxy.connection.player.VelocityResourcePackInfo;
import com.velocitypowered.proxy.connection.util.ConnectionMessages;
import com.velocitypowered.proxy.connection.util.ConnectionRequestResults;
Expand Down Expand Up @@ -152,22 +153,26 @@ public boolean handle(ResourcePackRequest packet) {
@Override
public boolean handle(FinishedUpdate packet) {
MinecraftConnection smc = serverConn.ensureConnected();
ConnectedPlayer player = serverConn.getPlayer();
ClientConfigSessionHandler configHandler =
(ClientConfigSessionHandler) serverConn.getPlayer().getConnection()
.getActiveSessionHandler();
(ClientConfigSessionHandler) player.getConnection().getActiveSessionHandler();

smc.setAutoReading(false);
// Even when not auto reading messages are still decoded. Decode them with the correct state
smc.getChannel().pipeline().get(MinecraftDecoder.class).setState(StateRegistry.PLAY);
configHandler.handleBackendFinishUpdate(serverConn).thenAcceptAsync((unused) -> {
if (serverConn == serverConn.getPlayer().getConnectedServer()) {
if (serverConn == player.getConnectedServer()) {
smc.setActiveSessionHandler(StateRegistry.PLAY);
player.sendPlayerListHeaderAndFooter(
player.getPlayerListHeader(), player.getPlayerListFooter());
// The client cleared the tab list. TODO: Restore changes done via TabList API
player.getTabList().clearAllSilent();
} else {
smc.setActiveSessionHandler(StateRegistry.PLAY,
new TransitionSessionHandler(server, serverConn, resultFuture));
}
if (serverConn.getPlayer().getAppliedResourcePack() == null && resourcePackToApply != null) {
serverConn.getPlayer().queueResourcePack(resourcePackToApply);
if (player.getAppliedResourcePack() == null && resourcePackToApply != null) {
player.queueResourcePack(resourcePackToApply);
}
smc.setAutoReading(true);
}, smc.eventLoop());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -156,22 +156,20 @@ public boolean handle(ServerLoginSuccess packet) {
smc.setActiveSessionHandler(StateRegistry.PLAY,
new TransitionSessionHandler(server, serverConn, resultFuture));
} else {
smc.setAutoReading(false);
CompletableFuture<Void> switchFuture;
if (serverConn.getPlayer().getConnection()
.getActiveSessionHandler() instanceof ClientPlaySessionHandler) {
switchFuture = ((ClientPlaySessionHandler) serverConn.getPlayer().getConnection()
.getActiveSessionHandler()).doSwitch();
} else {
switchFuture = CompletableFuture.completedFuture(null);
smc.write(new LoginAcknowledged());
smc.setActiveSessionHandler(StateRegistry.CONFIG,
new ConfigSessionHandler(server, serverConn, resultFuture));
ConnectedPlayer player = serverConn.getPlayer();
if (player.getClientSettingsPacket() != null) {
smc.write(player.getClientSettingsPacket());
}
if (player.getConnection().getActiveSessionHandler() instanceof ClientPlaySessionHandler) {
smc.setAutoReading(false);
((ClientPlaySessionHandler) player.getConnection()
.getActiveSessionHandler()).doSwitch().thenAcceptAsync((unused) -> {
smc.setAutoReading(true);
}, smc.eventLoop());
}
switchFuture.thenAcceptAsync((unused) -> {
smc.write(new LoginAcknowledged());
// Sync backend
smc.setActiveSessionHandler(StateRegistry.CONFIG,
new ConfigSessionHandler(server, serverConn, resultFuture));
smc.setAutoReading(true);
}, smc.eventLoop());
}

return true;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@

import com.velocitypowered.api.event.player.ServerConnectedEvent;
import com.velocitypowered.api.event.player.ServerPostConnectEvent;
import com.velocitypowered.api.network.ProtocolVersion;
import com.velocitypowered.api.proxy.server.RegisteredServer;
import com.velocitypowered.proxy.VelocityServer;
import com.velocitypowered.proxy.connection.ConnectionTypes;
Expand Down Expand Up @@ -143,7 +144,9 @@ public boolean handle(JoinGame packet) {
// Now set the connected server.
serverConn.getPlayer().setConnectedServer(serverConn);

if (player.getClientSettingsPacket() != null) {
// Send client settings. In 1.20.2+ this is done in the config state.
Gerrygames marked this conversation as resolved.
Show resolved Hide resolved
if (smc.getProtocolVersion().compareTo(ProtocolVersion.MINECRAFT_1_20_2) < 0
&& player.getClientSettingsPacket() != null) {
serverConn.ensureConnected().write(player.getClientSettingsPacket());
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -482,12 +482,13 @@ public CompletableFuture<Void> doSwitch() {
// Send keep alive to try to avoid timeouts
player.sendKeepAlive();

// Reset Tablist header and footer to prevent desync
player.clearHeaderAndFooter();
// Config state clears everything in the client. No need to clear later.
electronicboy marked this conversation as resolved.
Show resolved Hide resolved
spawned = false;
serverBossBars.clear();
player.clearHeaderAndFooterSilent();
player.getTabList().clearAllSilent();
}

spawned = false;

player.switchToConfigState();

return configSwitchFuture;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -545,7 +545,15 @@ public void setGameProfileProperties(List<GameProfile.Property> properties) {

@Override
public void clearHeaderAndFooter() {
tabList.clearHeaderAndFooter();
clearHeaderAndFooterSilent();
if (this.getProtocolVersion().compareTo(ProtocolVersion.MINECRAFT_1_8) >= 0) {
this.connection.write(HeaderAndFooter.reset());
}
}

public void clearHeaderAndFooterSilent() {
this.playerListHeader = Component.empty();
this.playerListFooter = Component.empty();
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,4 +35,6 @@ default void processUpdate(UpsertPlayerInfo infoPacket) {

default void processRemove(RemovePlayerInfo infoPacket) {
}

void clearAllSilent();
}
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,6 @@
import com.velocitypowered.api.util.GameProfile;
import com.velocitypowered.proxy.connection.MinecraftConnection;
import com.velocitypowered.proxy.connection.client.ConnectedPlayer;
import com.velocitypowered.proxy.protocol.packet.HeaderAndFooter;
import com.velocitypowered.proxy.protocol.packet.LegacyPlayerListItem;
import com.velocitypowered.proxy.protocol.packet.chat.RemoteChatSession;
import java.util.ArrayList;
Expand Down Expand Up @@ -70,7 +69,7 @@ public void setHeaderAndFooter(Component header, Component footer) {

@Override
public void clearHeaderAndFooter() {
connection.write(HeaderAndFooter.reset());
this.player.clearHeaderAndFooter();
}

@Override
Expand Down Expand Up @@ -131,10 +130,15 @@ public void clearAll() {
for (TabListEntry value : listEntries) {
items.add(LegacyPlayerListItem.Item.from(value));
}
entries.clear();
clearAllSilent();
connection.delayedWrite(new LegacyPlayerListItem(LegacyPlayerListItem.REMOVE_PLAYER, items));
}

@Override
public void clearAllSilent() {
entries.clear();
}

@Override
public Collection<TabListEntry> getEntries() {
return Collections.unmodifiableCollection(this.entries.values());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,6 @@
import com.velocitypowered.proxy.connection.MinecraftConnection;
import com.velocitypowered.proxy.connection.client.ConnectedPlayer;
import com.velocitypowered.proxy.console.VelocityConsole;
import com.velocitypowered.proxy.protocol.packet.HeaderAndFooter;
import com.velocitypowered.proxy.protocol.packet.RemovePlayerInfo;
import com.velocitypowered.proxy.protocol.packet.UpsertPlayerInfo;
import com.velocitypowered.proxy.protocol.packet.chat.RemoteChatSession;
Expand Down Expand Up @@ -74,7 +73,7 @@ public void setHeaderAndFooter(Component header, Component footer) {

@Override
public void clearHeaderAndFooter() {
connection.write(HeaderAndFooter.reset());
this.player.clearHeaderAndFooter();
}

@Override
Expand Down Expand Up @@ -175,6 +174,11 @@ public Collection<TabListEntry> getEntries() {
@Override
public void clearAll() {
this.connection.delayedWrite(new RemovePlayerInfo(new ArrayList<>(this.entries.keySet())));
clearAllSilent();
}

@Override
public void clearAllSilent() {
this.entries.clear();
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,11 @@ public void clearAll() {
connection.delayedWrite(new LegacyPlayerListItem(LegacyPlayerListItem.REMOVE_PLAYER,
Collections.singletonList(LegacyPlayerListItem.Item.from(value))));
}
clearAllSilent();
}

@Override
public void clearAllSilent() {
entries.clear();
nameMapping.clear();
}
Expand Down