Skip to content

Commit

Permalink
don't pass mutable entries lists to packets
Browse files Browse the repository at this point in the history
fixes some invalid packets being sent
  • Loading branch information
vytskalt committed Aug 6, 2024
1 parent cb391dd commit 2e06fc1
Show file tree
Hide file tree
Showing 11 changed files with 41 additions and 32 deletions.
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package net.megavex.scoreboardlibrary.implementation.sidebar.line.locale;

import com.google.common.collect.ImmutableList;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer;
import net.megavex.scoreboardlibrary.implementation.packetAdapter.ImmutableTeamProperties;
Expand Down Expand Up @@ -33,7 +34,7 @@ public LegacyLocaleLine(GlobalLineInfo info, SidebarLineHandler handler) {
this.handler = handler;
this.player = info.player();
this.packetAdapter = info.packetAdapter().createLegacyTeamDisplayAdapter(this);
packetAdapter.updateTeamPackets(syncedEntries());
packetAdapter.updateTeamPackets();
}

public @NotNull GlobalLineInfo info() {
Expand All @@ -57,7 +58,7 @@ public LegacyLocaleLine(GlobalLineInfo info, SidebarLineHandler handler) {

@Override
public @NotNull Collection<String> syncedEntries() {
return Collections.singleton(player);
return ImmutableList.of(player);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package net.megavex.scoreboardlibrary.implementation.sidebar.line.locale;

import com.google.common.collect.ImmutableList;
import net.kyori.adventure.text.Component;
import net.megavex.scoreboardlibrary.implementation.packetAdapter.ImmutableTeamProperties;
import net.megavex.scoreboardlibrary.implementation.packetAdapter.PropertiesPacketType;
Expand All @@ -10,7 +11,6 @@
import org.jetbrains.annotations.NotNull;

import java.util.Collection;
import java.util.Collections;

import static net.kyori.adventure.text.Component.empty;

Expand All @@ -24,9 +24,9 @@ public class ModernLocaleLine implements LocaleLine, ImmutableTeamProperties<Com
public ModernLocaleLine(GlobalLineInfo info, SidebarLineHandler handler) {
this.info = info;
this.handler = handler;
this.entries = Collections.singleton(info.player());
this.entries = ImmutableList.of(info.player());
this.packetAdapter = info.packetAdapter().createTeamDisplayAdapter(this);
packetAdapter.updateTeamPackets(entries);
packetAdapter.updateTeamPackets();
}

@Override
Expand All @@ -40,7 +40,7 @@ public void value(@NotNull Component renderedComponent) {

@Override
public void updateTeam() {
packetAdapter.updateTeamPackets(entries);
packetAdapter.updateTeamPackets();
packetAdapter.sendProperties(PropertiesPacketType.UPDATE, handler.players());
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ public class TeamDisplayImpl implements TeamDisplay, ImmutableTeamProperties<Com
public TeamDisplayImpl(@NotNull ScoreboardTeamImpl team) {
this.team = team;
this.packetAdapter = team.packetAdapter().createTeamDisplayAdapter(this);
packetAdapter.updateTeamPackets(syncedEntries);
packetAdapter.updateTeamPackets();
}

@Override
Expand Down Expand Up @@ -218,19 +218,21 @@ public boolean canSeeFriendlyInvisibles() {
return players;
}

public void handleUpdateTeamDisplay() {
packetAdapter.updateTeamPackets(syncedEntries);
public void handleUpdateDisplay() {
packetAdapter.updateTeamPackets();
packetAdapter().sendProperties(PropertiesPacketType.UPDATE, players());
}

public void handleAddEntries(@NotNull Collection<String> newEntries) {
packetAdapter.sendEntries(EntriesPacketType.ADD, players(), newEntries);
syncedEntries.addAll(newEntries);
packetAdapter.updateTeamPackets();
}

public void handleRemoveEntries(@NotNull Collection<String> oldEntries) {
packetAdapter.sendEntries(EntriesPacketType.REMOVE, players(), oldEntries);
syncedEntries.removeAll(oldEntries);
packetAdapter.updateTeamPackets();
}

private void scheduleUpdate() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -224,7 +224,7 @@ public boolean tick() {
} else if (task instanceof TeamManagerTask.UpdateTeamDisplay) {
TeamManagerTask.UpdateTeamDisplay updateTeamDisplayTask = (TeamManagerTask.UpdateTeamDisplay) task;
@NotNull TeamDisplayImpl teamDisplay = updateTeamDisplayTask.teamDisplay();
teamDisplay.handleUpdateTeamDisplay();
teamDisplay.handleUpdateDisplay();
} else if (task instanceof TeamManagerTask.AddEntries) {
TeamManagerTask.AddEntries addEntriesTask = (TeamManagerTask.AddEntries) task;
@NotNull TeamDisplayImpl teamDisplay = addEntriesTask.teamDisplay();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,8 @@ public final class PacketAccessors {

public static final ConstructorAccessor<ClientboundSetPlayerTeamPacket> TEAM_PACKET_CONSTRUCTOR =
ReflectUtil.findConstructorOrThrow(ClientboundSetPlayerTeamPacket.class, String.class, int.class, Optional.class, Collection.class);
public static final PacketConstructor<ClientboundSetPlayerTeamPacket.Parameters> PARAMETERS_CONSTRUCTOR =
ReflectUtil.getEmptyConstructor(ClientboundSetPlayerTeamPacket.Parameters.class);
public static final FieldAccessor<ClientboundSetPlayerTeamPacket.Parameters, Component> DISPLAY_NAME_FIELD =
ReflectUtil.findField(ClientboundSetPlayerTeamPacket.Parameters.class, 0, net.minecraft.network.chat.Component.class);
public static final FieldAccessor<ClientboundSetPlayerTeamPacket.Parameters, net.minecraft.network.chat.Component> PREFIX_FIELD =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,6 @@
import net.megavex.scoreboardlibrary.implementation.packetAdapter.team.TeamConstants;
import net.megavex.scoreboardlibrary.implementation.packetAdapter.team.TeamDisplayPacketAdapter;
import net.megavex.scoreboardlibrary.implementation.packetAdapter.team.TeamsPacketAdapter;
import net.megavex.scoreboardlibrary.implementation.packetAdapter.util.reflect.PacketConstructor;
import net.megavex.scoreboardlibrary.implementation.packetAdapter.util.reflect.ReflectUtil;
import net.minecraft.ChatFormatting;
import net.minecraft.network.protocol.Packet;
import net.minecraft.network.protocol.game.ClientboundSetPlayerTeamPacket;
Expand All @@ -21,12 +19,12 @@
import org.jetbrains.annotations.Nullable;
import org.jetbrains.annotations.UnknownNullability;

import java.util.*;
import java.util.Collection;
import java.util.Collections;
import java.util.Locale;
import java.util.Optional;

public abstract class AbstractTeamsPacketAdapterImpl implements TeamsPacketAdapter {
static final PacketConstructor<Parameters> parametersConstructor =
ReflectUtil.getEmptyConstructor(Parameters.class);

protected final PacketSender<Packet<?>> sender;
protected final ComponentProvider componentProvider;
protected final String teamName;
Expand Down Expand Up @@ -72,10 +70,6 @@ public void sendEntries(@NotNull EntriesPacketType packetType, @NotNull Collecti
sender.sendPacket(players, createTeamsPacket(TeamConstants.mode(packetType), teamName, null, entries));
}

protected void fillTeamPacket(ClientboundSetPlayerTeamPacket packet, Collection<String> entries) {
PacketAccessors.ENTRIES_FIELD.set(packet, entries);
}

protected void fillParameters(@NotNull Parameters parameters, @UnknownNullability Locale locale) {
String nameTagVisibilityKey = properties.nameTagVisibility().key();
PacketAccessors.NAME_TAG_VISIBILITY_FIELD.set(parameters, nameTagVisibilityKey);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package net.megavex.scoreboardlibrary.implementation.packetAdapter.modern.team;

import com.google.common.collect.ImmutableList;
import net.kyori.adventure.text.Component;
import net.megavex.scoreboardlibrary.implementation.packetAdapter.ImmutableTeamProperties;
import net.megavex.scoreboardlibrary.implementation.packetAdapter.PacketSender;
Expand Down Expand Up @@ -29,24 +30,30 @@ public PaperTeamsPacketAdapterImpl(@NotNull PacketSender<Packet<?>> sender, @Not
}

private class TeamDisplayPacketAdapterImpl extends AbstractTeamsPacketAdapterImpl.TeamDisplayPacketAdapterImpl {
private final ClientboundSetPlayerTeamPacket.Parameters parameters = parametersConstructor.invoke();
private final ClientboundSetPlayerTeamPacket createPacket = createTeamsPacket(TeamConstants.MODE_CREATE, teamName, parameters, null);
private final ClientboundSetPlayerTeamPacket updatePacket = createTeamsPacket(TeamConstants.MODE_UPDATE, teamName, parameters, null);
private final ClientboundSetPlayerTeamPacket.Parameters parameters = PacketAccessors.PARAMETERS_CONSTRUCTOR.invoke();
private ClientboundSetPlayerTeamPacket createPacket = null;
private ClientboundSetPlayerTeamPacket updatePacket = null;
private Component displayName, prefix, suffix;

public TeamDisplayPacketAdapterImpl(@NotNull ImmutableTeamProperties<Component> properties) {
super(properties);
}

@Override
public void updateTeamPackets(@NotNull Collection<String> entries) {
public void updateTeamPackets() {
fillParameters(parameters, null);
fillTeamPacket(createPacket, entries);
fillTeamPacket(updatePacket, entries);
createPacket = null;
updatePacket = null;
}

@Override
public void sendProperties(@NotNull PropertiesPacketType packetType, @NotNull Collection<Player> players) {
if (createPacket == null || updatePacket == null) {
Collection<String> entries = ImmutableList.copyOf(properties.syncedEntries());
createPacket = createTeamsPacket(TeamConstants.MODE_CREATE, teamName, parameters, entries);
updatePacket = createTeamsPacket(TeamConstants.MODE_UPDATE, teamName, parameters, entries);
}

switch (packetType) {
case CREATE:
sender.sendPacket(players, createPacket);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package net.megavex.scoreboardlibrary.implementation.packetAdapter.modern.team;

import com.google.common.collect.ImmutableList;
import net.kyori.adventure.text.Component;
import net.megavex.scoreboardlibrary.implementation.packetAdapter.ImmutableTeamProperties;
import net.megavex.scoreboardlibrary.implementation.packetAdapter.PacketSender;
Expand Down Expand Up @@ -35,13 +36,14 @@ public TeamDisplayPacketAdapterImpl(ImmutableTeamProperties<Component> propertie

@Override
public void sendProperties(@NotNull PropertiesPacketType packetType, @NotNull Collection<Player> players) {
Collection<String> entries = ImmutableList.copyOf(properties.syncedEntries());
LocalePacketUtil.sendLocalePackets(
sender,
players,
locale -> {
ClientboundSetPlayerTeamPacket.@NotNull Parameters parameters = parametersConstructor.invoke();
ClientboundSetPlayerTeamPacket.@NotNull Parameters parameters = PacketAccessors.PARAMETERS_CONSTRUCTOR.invoke();
fillParameters(parameters, locale);
return createTeamsPacket(TeamConstants.mode(packetType), teamName, parameters, properties.syncedEntries());
return createTeamsPacket(TeamConstants.mode(packetType), teamName, parameters, entries);
}
);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,17 +1,17 @@
package net.megavex.scoreboardlibrary.implementation.packetAdapter;

import com.google.common.collect.ImmutableList;
import net.kyori.adventure.text.format.NamedTextColor;
import net.megavex.scoreboardlibrary.api.team.enums.CollisionRule;
import net.megavex.scoreboardlibrary.api.team.enums.NameTagVisibility;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

import java.util.Collection;
import java.util.Collections;

public interface ImmutableTeamProperties<T> {
default @NotNull Collection<String> syncedEntries() {
return Collections.emptySet();
return ImmutableList.of();
}

@NotNull T displayName();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
import java.util.Collection;

public interface TeamDisplayPacketAdapter {
default void updateTeamPackets(@NotNull Collection<String> entries) {
default void updateTeamPackets() {
}

void sendEntries(@NotNull EntriesPacketType packetType, @NotNull Collection<Player> players, @NotNull Collection<String> entries);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package net.megavex.scoreboardlibrary.implementation.packetAdapter.v1_8_R3;

import com.google.common.collect.ImmutableList;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.format.NamedTextColor;
import net.megavex.scoreboardlibrary.implementation.commons.LegacyFormatUtil;
Expand Down Expand Up @@ -96,7 +97,7 @@ public void sendProperties(@NotNull PropertiesPacketType packetType, @NotNull Co

PacketAccessors.TEAM_RULES_FIELD.set(packet, properties.packOptions());
if (packetType == PropertiesPacketType.CREATE) {
PacketAccessors.TEAM_ENTRIES_FIELD.set(packet, properties.syncedEntries());
PacketAccessors.TEAM_ENTRIES_FIELD.set(packet, ImmutableList.copyOf(properties.syncedEntries()));
}

return packet;
Expand Down

0 comments on commit 2e06fc1

Please sign in to comment.