Skip to content

Commit 291087f

Browse files
Merge pull request #31 from FTBTeam/1.19/dev
1.19/dev
2 parents 4fc7015 + a3d2866 commit 291087f

24 files changed

+440
-244
lines changed

CHANGELOG.md

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,22 @@ All notable changes to this project will be documented in this file.
44
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
55
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
66

7+
## [1902.2.12]
8+
9+
### Added
10+
* Team properties can now include properties which are lists of string (required by new FTB Chunks builds)
11+
12+
### Fixed
13+
* Major improvements in efficiency of server->client sync for team data
14+
* Should greatly reduce network traffic and load for busy servers (many players & teams) in particular
15+
* A few GUI and logic fixes related to handling invites for team members and allies
16+
* Allow players to be added as allies of your team even when they are a member of a different team
17+
* Don't allow invitations to be sent to players who are already in a different team (they couldn't actually be added, but a useless invitation was being sent)
18+
* Only show the GUI "Manage Allies" and "Invite Players" buttons for party teams
19+
* Don't show "Disband Party" context menu entry in the GUI for non-party teams
20+
* Don't allow server teams to be created with names shorter than 3 characters
21+
* Converted a couple of more messages into translations
22+
723
## [1902.2.11]
824

925
### Fixes

common/src/main/java/dev/ftb/mods/ftbteams/client/AllyScreen.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ public AllyScreen() {
3030
@Override
3131
protected boolean shouldIncludePlayer(KnownClientPlayer player) {
3232
// any player who isn't in our team is a valid potential or actual ally
33-
return player.isValid() && !ClientTeamManager.INSTANCE.selfTeam.isMember(player.uuid);
33+
return player.online && !ClientTeamManager.INSTANCE.selfTeam.isMember(player.uuid);
3434
}
3535

3636
@Override

common/src/main/java/dev/ftb/mods/ftbteams/client/CreatePartyScreen.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,7 @@ public void onClicked(MouseButton mouseButton) {
139139
});
140140

141141
for (KnownClientPlayer player : manager.knownPlayers.values().stream().sorted().toList()) {
142-
if (player != manager.selfKnownPlayer) {
142+
if (player.isOnlineAndNotInParty() && player != manager.selfKnownPlayer) {
143143
add(new InvitedButton(this, CreatePartyScreen.this, player));
144144
}
145145
}

common/src/main/java/dev/ftb/mods/ftbteams/client/InviteScreen.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ public InviteScreen() {
1414
@Override
1515
protected boolean shouldIncludePlayer(KnownClientPlayer player) {
1616
// any player who is online and not in a team
17-
return player.online && player.isValid() && player.isInternalTeam() && player != ClientTeamManager.INSTANCE.selfKnownPlayer;
17+
return player.isOnlineAndNotInParty() && player != ClientTeamManager.INSTANCE.selfKnownPlayer;
1818
}
1919

2020
@Override

common/src/main/java/dev/ftb/mods/ftbteams/client/InvitedButton.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ public class InvitedButton extends NordButton {
2828
screen = s;
2929
player = p;
3030

31-
if (!player.isValid()) {
31+
if (!player.online) {
3232
title = title.copy().withStyle(Style.EMPTY.withColor(TextColor.fromRgb(NordColors.POLAR_NIGHT_0.rgb())));
3333
}
3434
}
@@ -51,7 +51,7 @@ public void drawIcon(PoseStack matrixStack, Theme theme, int x, int y, int w, in
5151

5252
@Override
5353
public void onClicked(MouseButton button) {
54-
if (player.isValid()) {
54+
if (player.online) {
5555
GameProfile profile = player.getProfile();
5656
boolean invited = screen.isInvited(profile);
5757
screen.setInvited(profile, !invited);

common/src/main/java/dev/ftb/mods/ftbteams/client/MemberButton.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,13 +44,15 @@ public void drawIcon(PoseStack matrixStack, Theme theme, int x, int y, int w, in
4444

4545
@Override
4646
public void onClicked(MouseButton button) {
47-
if (ClientTeamManager.INSTANCE.selfKnownPlayer == null) return;
47+
if (ClientTeamManager.INSTANCE.selfKnownPlayer == null || ClientTeamManager.INSTANCE.selfTeam == null) return;
4848

4949
KnownClientPlayer self = ClientTeamManager.INSTANCE.selfKnownPlayer;
5050
ClientTeam selfTeam = ClientTeamManager.INSTANCE.selfTeam;
5151
TeamRank selfRank = selfTeam.getHighestRank(self.uuid);
5252
TeamRank playerRank = selfTeam.getHighestRank(player.uuid);
5353

54+
if (selfTeam.getType() != TeamType.PARTY) return;
55+
5456
List<ContextMenuItem> items0 = new ArrayList<>();
5557
if (player.uuid.equals(self.uuid)) {
5658
if (selfRank.is(TeamRank.OWNER)) {

common/src/main/java/dev/ftb/mods/ftbteams/client/MyTeamScreen.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ public static void refreshIfOpen() {
5050
if (mts.getManager().selfTeam.getId().equals(mts.teamID)) {
5151
mts.refreshWidgets();
5252
} else {
53-
// team has changed (player left or got kicked?)
53+
// team has changed (player left or got kicked from party?)
5454
mts.closeGui(false);
5555
}
5656
}
@@ -176,6 +176,9 @@ public InviteButton(Panel panel) {
176176

177177
@Override
178178
public boolean isEnabled() {
179+
if (ClientTeamManager.INSTANCE.selfTeam.getType() != TeamType.PARTY) {
180+
return false;
181+
}
179182
KnownClientPlayer knownPlayer = ClientTeamManager.INSTANCE.selfKnownPlayer;
180183
return knownPlayer != null && ClientTeamManager.INSTANCE.selfTeam.isOfficer(knownPlayer.uuid);
181184
}
@@ -194,6 +197,9 @@ public AllyButton(Panel panel) {
194197

195198
@Override
196199
public boolean isEnabled() {
200+
if (ClientTeamManager.INSTANCE.selfTeam.getType() != TeamType.PARTY) {
201+
return false;
202+
}
197203
KnownClientPlayer knownPlayer = ClientTeamManager.INSTANCE.selfKnownPlayer;
198204
return knownPlayer != null && ClientTeamManager.INSTANCE.selfTeam.isOfficer(knownPlayer.uuid);
199205
}
@@ -277,7 +283,7 @@ public MemberPanel() {
277283
@Override
278284
public void addWidgets() {
279285
ClientTeamManager manager = getManager();
280-
if (manager == null || manager.invalid) return;
286+
if (manager == null || manager.isInvalid()) return;
281287

282288
PARTY_RANKS.stream()
283289
.flatMap(rank -> manager.selfTeam.getRanked(rank).entrySet().stream()

common/src/main/java/dev/ftb/mods/ftbteams/data/ClientTeam.java

Lines changed: 37 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,50 @@
11
package dev.ftb.mods.ftbteams.data;
22

3+
import dev.ftb.mods.ftbteams.property.TeamProperty;
34
import net.minecraft.Util;
45
import net.minecraft.network.FriendlyByteBuf;
56

7+
import java.util.List;
68
import java.util.Map;
79
import java.util.UUID;
810

911
public class ClientTeam extends TeamBase {
12+
private static List<TeamProperty> SYNCABLE_PROPS = List.of(DISPLAY_NAME, COLOR);
13+
1014
public final ClientTeamManager manager;
1115
public boolean invalid;
1216
TeamType type;
1317
private final UUID ownerID;
1418

15-
public ClientTeam(ClientTeamManager m, FriendlyByteBuf buffer, long now) {
19+
public static ClientTeam invalidTeam(ClientTeamManager m, Team team) {
20+
return new ClientTeam(m, team.getId());
21+
}
22+
23+
private ClientTeam(ClientTeamManager m, UUID id) {
24+
super();
25+
this.id = id;
26+
manager = m;
27+
ownerID = Util.NIL_UUID;
28+
invalid = true;
29+
type = TeamType.PARTY;
30+
}
31+
32+
public ClientTeam(ClientTeamManager m, FriendlyByteBuf buffer) {
1633
manager = m;
1734
id = buffer.readUUID();
18-
type = TeamType.VALUES[buffer.readByte()];
35+
type = buffer.readEnum(TeamType.class);
1936
properties.read(buffer);
2037

2138
int rs = buffer.readVarInt();
22-
2339
for (int i = 0; i < rs; i++) {
24-
ranks.put(buffer.readUUID(), TeamRank.VALUES[buffer.readByte()]);
40+
ranks.put(buffer.readUUID(), buffer.readEnum(TeamRank.class));
2541
}
2642

2743
extraData = buffer.readNbt();
2844

2945
ownerID = buffer.readBoolean() ? buffer.readUUID() : Util.NIL_UUID;
46+
47+
invalid = buffer.readBoolean();
3048
}
3149

3250
public ClientTeam(ClientTeamManager m, Team team) {
@@ -49,23 +67,29 @@ public boolean isValid() {
4967
return manager.teamMap.containsKey(id);
5068
}
5169

52-
public void write(FriendlyByteBuf buffer, long now) {
70+
public void write(FriendlyByteBuf buffer, boolean writeAllProperties) {
5371
buffer.writeUUID(id);
54-
buffer.writeByte(type.ordinal());
55-
properties.write(buffer);
72+
buffer.writeEnum(type);
73+
if (writeAllProperties) {
74+
properties.write(buffer);
75+
} else {
76+
properties.writeSyncableOnly(buffer, SYNCABLE_PROPS);
77+
}
5678

5779
buffer.writeVarInt(ranks.size());
5880

5981
for (Map.Entry<UUID, TeamRank> entry : ranks.entrySet()) {
6082
buffer.writeUUID(entry.getKey());
61-
buffer.writeByte(entry.getValue().ordinal());
83+
buffer.writeEnum(entry.getValue());
6284
}
6385

6486
buffer.writeNbt(extraData);
6587

6688
boolean hasOwner = !ownerID.equals(Util.NIL_UUID);
6789
buffer.writeBoolean(hasOwner);
6890
if (hasOwner) buffer.writeUUID(ownerID);
91+
92+
buffer.writeBoolean(invalid);
6993
}
7094

7195
public boolean isSelf() {
@@ -75,4 +99,9 @@ public boolean isSelf() {
7599
public UUID getOwnerID() {
76100
return ownerID;
77101
}
102+
103+
public void setMessageHistory(List<TeamMessage> messages) {
104+
messageHistory.clear();
105+
messageHistory.addAll(messages);
106+
}
78107
}
Lines changed: 63 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package dev.ftb.mods.ftbteams.data;
22

33
import dev.ftb.mods.ftbteams.FTBTeams;
4-
import net.fabricmc.loader.impl.util.log.Log;
54
import net.minecraft.ChatFormatting;
65
import net.minecraft.Util;
76
import net.minecraft.client.Minecraft;
@@ -10,68 +9,70 @@
109
import org.jetbrains.annotations.Nullable;
1110

1211
import java.util.HashMap;
13-
import java.util.List;
1412
import java.util.Map;
1513
import java.util.UUID;
1614

15+
/**
16+
* Represents the teams and known players that the client knows about; one global instance exists on the client.
17+
* Instances are also created server-side for when changes need to be sync'd to the client; the server side instance
18+
* will usually not have a complete list of client teams, but just those that needed to be added/updated/removed
19+
* on the client.
20+
*/
1721
public class ClientTeamManager {
18-
public static ClientTeamManager INSTANCE;
22+
public static ClientTeamManager INSTANCE; // instantiated when initial team data is sync'd on player login
1923

20-
public boolean invalid;
21-
private final UUID id;
24+
private final UUID managerId;
25+
private boolean invalid;
2226
public final Map<UUID, ClientTeam> teamMap;
2327
public final Map<UUID, KnownClientPlayer> knownPlayers;
2428
public ClientTeam selfTeam;
2529
public KnownClientPlayer selfKnownPlayer;
2630

27-
public ClientTeamManager(UUID i) {
31+
public ClientTeamManager(UUID managerId) {
32+
this.managerId = managerId;
2833
invalid = false;
29-
id = i;
3034
teamMap = new HashMap<>();
3135
knownPlayers = new HashMap<>();
3236
}
3337

34-
public ClientTeamManager(FriendlyByteBuf buffer, long now) {
38+
public ClientTeamManager(FriendlyByteBuf buffer) {
3539
this(buffer.readUUID());
3640

37-
int ts = buffer.readVarInt();
38-
39-
for (int i = 0; i < ts; i++) {
40-
ClientTeam t = new ClientTeam(this, buffer, now);
41+
int nTeams = buffer.readVarInt();
42+
for (int i = 0; i < nTeams; i++) {
43+
ClientTeam t = new ClientTeam(this, buffer);
4144
teamMap.put(t.getId(), t);
4245
}
4346

44-
int ps = buffer.readVarInt();
45-
46-
for (int i = 0; i < ps; i++) {
47+
int nPlayers = buffer.readVarInt();
48+
for (int i = 0; i < nPlayers; i++) {
4749
KnownClientPlayer knownClientPlayer = new KnownClientPlayer(buffer);
4850
knownPlayers.put(knownClientPlayer.uuid, knownClientPlayer);
4951
}
5052
}
5153

52-
public UUID getId() {
53-
return id;
54+
public UUID getManagerId() {
55+
return managerId;
5456
}
5557

56-
public void write(FriendlyByteBuf buffer, long now) {
57-
buffer.writeUUID(getId());
58+
public boolean isInvalid() {
59+
return invalid;
60+
}
5861

59-
buffer.writeVarInt(teamMap.size());
62+
public void write(FriendlyByteBuf buffer, UUID selfTeamID) {
63+
buffer.writeUUID(getManagerId());
6064

61-
for (ClientTeam t : teamMap.values()) {
62-
t.write(buffer, now);
63-
}
65+
buffer.writeVarInt(teamMap.size());
66+
teamMap.values().forEach(clientTeam -> clientTeam.write(buffer, selfTeamID.equals(clientTeam.getId())));
6467

6568
buffer.writeVarInt(knownPlayers.size());
66-
6769
for (KnownClientPlayer knownClientPlayer : knownPlayers.values()) {
6870
knownClientPlayer.write(buffer);
6971
}
7072
}
7173

72-
public void init(UUID self, List<TeamMessage> messages) {
73-
selfTeam = teamMap.get(self);
74-
selfTeam.addMessages(messages);
74+
public void initSelfDetails(UUID selfTeamID) {
75+
selfTeam = teamMap.get(selfTeamID);
7576
UUID userId = Minecraft.getInstance().getUser().getGameProfile().getId();
7677
selfKnownPlayer = knownPlayers.get(userId);
7778
if (selfKnownPlayer == null) {
@@ -98,4 +99,39 @@ public Component getName(@Nullable UUID id) {
9899
KnownClientPlayer p = knownPlayers.get(id);
99100
return Component.literal(p == null ? "Unknown" : p.name).withStyle(ChatFormatting.YELLOW);
100101
}
102+
103+
public void invalidate() {
104+
teamMap.values().forEach(team -> team.invalid = true);
105+
invalid = true;
106+
}
107+
108+
public static void syncFromServer(ClientTeamManager syncedData, UUID selfTeamID, boolean fullSync) {
109+
if (fullSync) {
110+
// complete live team manager invalidation and replacement
111+
syncedData.initSelfDetails(selfTeamID);
112+
if (INSTANCE != null) {
113+
INSTANCE.invalidate();
114+
}
115+
INSTANCE = syncedData;
116+
} else if (ClientTeamManager.INSTANCE != null) {
117+
// just copy the sync'd team(s) into the live client team manager
118+
syncedData.teamMap.forEach((teamID, clientTeam) -> {
119+
if (clientTeam.invalid) {
120+
FTBTeams.LOGGER.debug("remove {} from client team map", teamID);
121+
INSTANCE.teamMap.remove(teamID);
122+
} else {
123+
ClientTeam existing = INSTANCE.teamMap.get(teamID);
124+
if (existing != null) {
125+
FTBTeams.LOGGER.debug("update {} in client team map", teamID);
126+
} else {
127+
FTBTeams.LOGGER.debug("insert {} into client team map", teamID);
128+
}
129+
INSTANCE.teamMap.put(teamID, clientTeam);
130+
}
131+
});
132+
INSTANCE.knownPlayers.putAll(syncedData.knownPlayers);
133+
INSTANCE.initSelfDetails(selfTeamID);
134+
}
135+
136+
}
101137
}

common/src/main/java/dev/ftb/mods/ftbteams/data/KnownClientPlayer.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ public boolean isInternalTeam() {
5858
return teamId.equals(uuid);
5959
}
6060

61-
public boolean isValid() {
61+
public boolean isOnlineAndNotInParty() {
6262
return online && isInternalTeam();
6363
}
6464

@@ -68,7 +68,7 @@ public CompoundTag getExtraData() {
6868

6969
@Override
7070
public int compareTo(KnownClientPlayer o) {
71-
int i = Boolean.compare(o.isValid(), isValid());
71+
int i = Boolean.compare(o.isOnlineAndNotInParty(), isOnlineAndNotInParty());
7272
return i == 0 ? name.compareToIgnoreCase(o.name) : i;
7373
}
7474
}

0 commit comments

Comments
 (0)