feat: expose list order in TabListEntry (#1451)

* feat: expose list order in TabListEntry

* fix: address comment (from github)

* fix: address another comment (from github)
This commit is contained in:
Timon 2024-11-10 00:03:34 +01:00 committed by GitHub
parent 08a42b3723
commit cefa3b272e
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 107 additions and 10 deletions

View File

@ -168,6 +168,25 @@ public interface TabList {
* @deprecated Internal usage. Use {@link TabListEntry.Builder} instead. * @deprecated Internal usage. Use {@link TabListEntry.Builder} instead.
*/ */
@Deprecated @Deprecated
TabListEntry buildEntry(GameProfile profile, @Nullable Component displayName, int latency, default TabListEntry buildEntry(GameProfile profile, @Nullable Component displayName, int latency,
int gameMode, @Nullable ChatSession chatSession, boolean listed); 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 listOrder);
} }

View File

@ -139,6 +139,27 @@ public interface TabListEntry extends KeyIdentifiable {
return this; 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}. * Returns a {@link Builder} to create a {@link TabListEntry}.
* *
@ -161,6 +182,7 @@ public interface TabListEntry extends KeyIdentifiable {
private int latency = 0; private int latency = 0;
private int gameMode = 0; private int gameMode = 0;
private boolean listed = true; private boolean listed = true;
private int listOrder = 0;
private @Nullable ChatSession chatSession; private @Nullable ChatSession chatSession;
@ -243,7 +265,7 @@ public interface TabListEntry extends KeyIdentifiable {
} }
/** /**
* Sets wether this entry should be visible. * Sets whether this entry should be visible.
* *
* @param listed to set * @param listed to set
* @return ${code this}, for chaining * @return ${code this}, for chaining
@ -254,6 +276,19 @@ public interface TabListEntry extends KeyIdentifiable {
return this; 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}. * Constructs the {@link TabListEntry} specified by {@code this} {@link Builder}.
* *
@ -266,7 +301,7 @@ public interface TabListEntry extends KeyIdentifiable {
if (profile == null) { if (profile == null) {
throw new IllegalStateException("The GameProfile must be set when building a TabListEntry"); 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);
} }
} }
} }

View File

@ -159,12 +159,17 @@ public class KeyedVelocityTabList implements InternalTabList {
@Override @Override
public TabListEntry buildEntry(GameProfile profile, @Nullable Component displayName, int latency, public TabListEntry buildEntry(GameProfile profile, @Nullable Component displayName, int latency,
int gameMode, int gameMode, @Nullable ChatSession chatSession, boolean listed) {
@Nullable ChatSession chatSession, boolean listed) {
return new KeyedVelocityTabListEntry(this, profile, displayName, latency, gameMode, return new KeyedVelocityTabListEntry(this, profile, displayName, latency, gameMode,
chatSession == null ? null : chatSession.getIdentifiedKey()); 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 @Override
public void processLegacy(LegacyPlayerListItemPacket packet) { public void processLegacy(LegacyPlayerListItemPacket packet) {
// Packets are already forwarded on, so no need to do that here // Packets are already forwarded on, so no need to do that here

View File

@ -19,6 +19,7 @@ package com.velocitypowered.proxy.tablist;
import com.google.common.base.Preconditions; import com.google.common.base.Preconditions;
import com.google.common.collect.Maps; import com.google.common.collect.Maps;
import com.velocitypowered.api.network.ProtocolVersion;
import com.velocitypowered.api.proxy.Player; import com.velocitypowered.api.proxy.Player;
import com.velocitypowered.api.proxy.player.ChatSession; import com.velocitypowered.api.proxy.player.ChatSession;
import com.velocitypowered.api.proxy.player.TabListEntry; import com.velocitypowered.api.proxy.player.TabListEntry;
@ -89,7 +90,7 @@ public class VelocityTabList implements InternalTabList {
} else { } else {
entry = new VelocityTabListEntry(this, entry1.getProfile(), entry = new VelocityTabListEntry(this, entry1.getProfile(),
entry1.getDisplayNameComponent().orElse(null), 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 EnumSet<UpsertPlayerInfoPacket.Action> actions = EnumSet
@ -128,6 +129,11 @@ public class VelocityTabList implements InternalTabList {
actions.add(UpsertPlayerInfoPacket.Action.UPDATE_LISTED); actions.add(UpsertPlayerInfoPacket.Action.UPDATE_LISTED);
playerInfoEntry.setListed(entry.isListed()); 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())) { if (!Objects.equals(previousEntry.getChatSession(), entry.getChatSession())) {
ChatSession from = entry.getChatSession(); ChatSession from = entry.getChatSession();
if (from != null) { if (from != null) {
@ -162,6 +168,11 @@ public class VelocityTabList implements InternalTabList {
} }
playerInfoEntry.setLatency(entry.getLatency()); playerInfoEntry.setLatency(entry.getLatency());
playerInfoEntry.setListed(entry.isListed()); 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; return entry;
}); });
@ -207,9 +218,9 @@ public class VelocityTabList implements InternalTabList {
@Override @Override
public TabListEntry buildEntry(GameProfile profile, @Nullable Component displayName, int latency, public TabListEntry buildEntry(GameProfile profile, @Nullable Component displayName, int latency,
int gameMode, int gameMode,
@Nullable ChatSession chatSession, boolean listed) { @Nullable ChatSession chatSession, boolean listed, int listOrder) {
return new VelocityTabListEntry(this, profile, displayName, latency, gameMode, chatSession, return new VelocityTabListEntry(this, profile, displayName, latency, gameMode, chatSession,
listed); listed, listOrder);
} }
@Override @Override
@ -246,7 +257,8 @@ public class VelocityTabList implements InternalTabList {
0, 0,
-1, -1,
null, null,
false false,
0
) )
); );
} else { } else {
@ -274,6 +286,9 @@ public class VelocityTabList implements InternalTabList {
if (actions.contains(UpsertPlayerInfoPacket.Action.UPDATE_LISTED)) { if (actions.contains(UpsertPlayerInfoPacket.Action.UPDATE_LISTED)) {
currentEntry.setListedWithoutUpdate(entry.isListed()); currentEntry.setListedWithoutUpdate(entry.isListed());
} }
if (actions.contains(UpsertPlayerInfoPacket.Action.UPDATE_LIST_ORDER)) {
currentEntry.setListOrderWithoutUpdate(entry.getListOrder());
}
} }
@Override @Override

View File

@ -17,6 +17,7 @@
package com.velocitypowered.proxy.tablist; package com.velocitypowered.proxy.tablist;
import com.velocitypowered.api.network.ProtocolVersion;
import com.velocitypowered.api.proxy.player.ChatSession; import com.velocitypowered.api.proxy.player.ChatSession;
import com.velocitypowered.api.proxy.player.TabList; import com.velocitypowered.api.proxy.player.TabList;
import com.velocitypowered.api.proxy.player.TabListEntry; import com.velocitypowered.api.proxy.player.TabListEntry;
@ -38,6 +39,7 @@ public class VelocityTabListEntry implements TabListEntry {
private int latency; private int latency;
private int gameMode; private int gameMode;
private boolean listed; private boolean listed;
private int listOrder;
private @Nullable ChatSession session; private @Nullable ChatSession session;
/** /**
@ -45,7 +47,7 @@ public class VelocityTabListEntry implements TabListEntry {
*/ */
public VelocityTabListEntry(VelocityTabList tabList, GameProfile profile, Component displayName, public VelocityTabListEntry(VelocityTabList tabList, GameProfile profile, Component displayName,
int latency, int latency,
int gameMode, @Nullable ChatSession session, boolean listed) { int gameMode, @Nullable ChatSession session, boolean listed, int listOrder) {
this.tabList = tabList; this.tabList = tabList;
this.profile = profile; this.profile = profile;
this.displayName = displayName; this.displayName = displayName;
@ -53,6 +55,7 @@ public class VelocityTabListEntry implements TabListEntry {
this.gameMode = gameMode; this.gameMode = gameMode;
this.session = session; this.session = session;
this.listed = listed; this.listed = listed;
this.listOrder = listOrder;
} }
@Override @Override
@ -150,4 +153,24 @@ public class VelocityTabListEntry implements TabListEntry {
void setListedWithoutUpdate(boolean listed) { void setListedWithoutUpdate(boolean listed) {
this.listed = 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;
}
} }