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

feat: expose list order in TabListEntry #1451

Merged
merged 3 commits into from
Nov 9, 2024
Merged
Show file tree
Hide file tree
Changes from all 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
Original file line number Diff line number Diff line change
Expand Up @@ -168,6 +168,25 @@ default TabListEntry buildEntry(GameProfile profile, @Nullable Component display
* @deprecated Internal usage. Use {@link TabListEntry.Builder} instead.
*/
@Deprecated
default TabListEntry buildEntry(GameProfile profile, @Nullable Component displayName, int latency,
int gameMode, @Nullable ChatSession chatSession, boolean listed) {
return buildEntry(profile, displayName, latency, gameMode, chatSession, listed, 0);
}

/**
* Represents an entry in a {@link Player}'s tab list.
*
* @param profile the profile
* @param displayName the display name
* @param latency the latency
* @param gameMode the game mode
* @param chatSession the chat session
* @param listed the visible status of entry
* @param listOrder the order/priority of entry in the tab list
* @return the entry
* @deprecated Internal usage. Use {@link TabListEntry.Builder} instead.
*/
@Deprecated
TabListEntry buildEntry(GameProfile profile, @Nullable Component displayName, int latency,
int gameMode, @Nullable ChatSession chatSession, boolean listed);
int gameMode, @Nullable ChatSession chatSession, boolean listed, int listOrder);
}
Original file line number Diff line number Diff line change
Expand Up @@ -139,6 +139,27 @@ default TabListEntry setListed(boolean listed) {
return this;
}

/**
* Returns the order/priority of this entry in the tab list.
*
* @return order of this entry
* @sinceMinecraft 1.21.2
*/
default int getListOrder() {
return 0;
}

/**
* Sets the order/priority of this entry in the tab list.
*
* @param order order of this entry
* @return {@code this}, for chaining
* @sinceMinecraft 1.21.2
*/
default TabListEntry setListOrder(int order) {
return this;
}

/**
* Returns a {@link Builder} to create a {@link TabListEntry}.
*
Expand All @@ -161,6 +182,7 @@ class Builder {
private int latency = 0;
private int gameMode = 0;
private boolean listed = true;
private int listOrder = 0;

private @Nullable ChatSession chatSession;

Expand Down Expand Up @@ -243,7 +265,7 @@ public Builder gameMode(int gameMode) {
}

/**
* Sets wether this entry should be visible.
* Sets whether this entry should be visible.
*
* @param listed to set
* @return ${code this}, for chaining
Expand All @@ -254,6 +276,19 @@ public Builder listed(boolean listed) {
return this;
}

/**
* Sets the order/priority of this entry in the tab list.
*
* @param order to set
* @return ${code this}, for chaining
* @sinceMinecraft 1.21.2
* @see TabListEntry#getListOrder()
*/
public Builder listOrder(int order) {
this.listOrder = order;
return this;
}

/**
* Constructs the {@link TabListEntry} specified by {@code this} {@link Builder}.
*
Expand All @@ -266,7 +301,7 @@ public TabListEntry build() {
if (profile == null) {
throw new IllegalStateException("The GameProfile must be set when building a TabListEntry");
}
return tabList.buildEntry(profile, displayName, latency, gameMode, chatSession, listed);
return tabList.buildEntry(profile, displayName, latency, gameMode, chatSession, listed, listOrder);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -159,12 +159,17 @@ public TabListEntry buildEntry(GameProfile profile,

@Override
public TabListEntry buildEntry(GameProfile profile, @Nullable Component displayName, int latency,
int gameMode,
@Nullable ChatSession chatSession, boolean listed) {
int gameMode, @Nullable ChatSession chatSession, boolean listed) {
return new KeyedVelocityTabListEntry(this, profile, displayName, latency, gameMode,
chatSession == null ? null : chatSession.getIdentifiedKey());
}

@Override
public TabListEntry buildEntry(GameProfile profile, @Nullable Component displayName, int latency,
int gameMode, @Nullable ChatSession chatSession, boolean listed, int listOrder) {
return buildEntry(profile, displayName, latency, gameMode, chatSession, listed);
}

@Override
public void processLegacy(LegacyPlayerListItemPacket packet) {
// Packets are already forwarded on, so no need to do that here
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@

import com.google.common.base.Preconditions;
import com.google.common.collect.Maps;
import com.velocitypowered.api.network.ProtocolVersion;
import com.velocitypowered.api.proxy.Player;
import com.velocitypowered.api.proxy.player.ChatSession;
import com.velocitypowered.api.proxy.player.TabListEntry;
Expand Down Expand Up @@ -89,7 +90,7 @@ public void addEntry(TabListEntry entry1) {
} else {
entry = new VelocityTabListEntry(this, entry1.getProfile(),
entry1.getDisplayNameComponent().orElse(null),
entry1.getLatency(), entry1.getGameMode(), entry1.getChatSession(), entry1.isListed());
entry1.getLatency(), entry1.getGameMode(), entry1.getChatSession(), entry1.isListed(), entry1.getListOrder());
}

EnumSet<UpsertPlayerInfoPacket.Action> actions = EnumSet
Expand Down Expand Up @@ -128,6 +129,11 @@ public void addEntry(TabListEntry entry1) {
actions.add(UpsertPlayerInfoPacket.Action.UPDATE_LISTED);
playerInfoEntry.setListed(entry.isListed());
}
if (!Objects.equals(previousEntry.getListOrder(), entry.getListOrder())
&& player.getProtocolVersion().noLessThan(ProtocolVersion.MINECRAFT_1_21_2)) {
actions.add(UpsertPlayerInfoPacket.Action.UPDATE_LIST_ORDER);
playerInfoEntry.setListOrder(entry.getListOrder());
}
if (!Objects.equals(previousEntry.getChatSession(), entry.getChatSession())) {
ChatSession from = entry.getChatSession();
if (from != null) {
Expand Down Expand Up @@ -162,6 +168,11 @@ public void addEntry(TabListEntry entry1) {
}
playerInfoEntry.setLatency(entry.getLatency());
playerInfoEntry.setListed(entry.isListed());
if (entry.getListOrder() != 0
&& player.getProtocolVersion().noLessThan(ProtocolVersion.MINECRAFT_1_21_2)) {
actions.add(UpsertPlayerInfoPacket.Action.UPDATE_LIST_ORDER);
playerInfoEntry.setListOrder(entry.getListOrder());
}
}
return entry;
});
Expand Down Expand Up @@ -207,9 +218,9 @@ public void clearAllSilent() {
@Override
public TabListEntry buildEntry(GameProfile profile, @Nullable Component displayName, int latency,
int gameMode,
@Nullable ChatSession chatSession, boolean listed) {
@Nullable ChatSession chatSession, boolean listed, int listOrder) {
return new VelocityTabListEntry(this, profile, displayName, latency, gameMode, chatSession,
listed);
listed, listOrder);
}

@Override
Expand Down Expand Up @@ -246,7 +257,8 @@ private void processUpsert(EnumSet<UpsertPlayerInfoPacket.Action> actions,
0,
-1,
null,
false
false,
0
)
);
} else {
Expand Down Expand Up @@ -274,6 +286,9 @@ private void processUpsert(EnumSet<UpsertPlayerInfoPacket.Action> actions,
if (actions.contains(UpsertPlayerInfoPacket.Action.UPDATE_LISTED)) {
currentEntry.setListedWithoutUpdate(entry.isListed());
}
if (actions.contains(UpsertPlayerInfoPacket.Action.UPDATE_LIST_ORDER)) {
currentEntry.setListOrderWithoutUpdate(entry.getListOrder());
}
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@

package com.velocitypowered.proxy.tablist;

import com.velocitypowered.api.network.ProtocolVersion;
import com.velocitypowered.api.proxy.player.ChatSession;
import com.velocitypowered.api.proxy.player.TabList;
import com.velocitypowered.api.proxy.player.TabListEntry;
Expand All @@ -38,21 +39,23 @@ public class VelocityTabListEntry implements TabListEntry {
private int latency;
private int gameMode;
private boolean listed;
private int listOrder;
private @Nullable ChatSession session;

/**
* Constructs the instance.
*/
public VelocityTabListEntry(VelocityTabList tabList, GameProfile profile, Component displayName,
int latency,
int gameMode, @Nullable ChatSession session, boolean listed) {
int gameMode, @Nullable ChatSession session, boolean listed, int listOrder) {
this.tabList = tabList;
this.profile = profile;
this.displayName = displayName;
this.latency = latency;
this.gameMode = gameMode;
this.session = session;
this.listed = listed;
this.listOrder = listOrder;
}

@Override
Expand Down Expand Up @@ -150,4 +153,24 @@ public VelocityTabListEntry setListed(boolean listed) {
void setListedWithoutUpdate(boolean listed) {
this.listed = listed;
}

@Override
public int getListOrder() {
return listOrder;
}

@Override
public VelocityTabListEntry setListOrder(int listOrder) {
this.listOrder = listOrder;
if (tabList.getPlayer().getProtocolVersion().noLessThan(ProtocolVersion.MINECRAFT_1_21_2)) {
UpsertPlayerInfoPacket.Entry upsertEntry = this.tabList.createRawEntry(this);
upsertEntry.setListOrder(listOrder);
tabList.emitActionRaw(UpsertPlayerInfoPacket.Action.UPDATE_LIST_ORDER, upsertEntry);
}
return this;
}

void setListOrderWithoutUpdate(int listOrder) {
this.listOrder = listOrder;
}
}