Skip to content

Commit

Permalink
My attempts to fix FSB and Figura backend incompats
Browse files Browse the repository at this point in the history
  • Loading branch information
lexize committed Oct 30, 2024
1 parent d1b130b commit f479e65
Show file tree
Hide file tree
Showing 5 changed files with 22 additions and 7 deletions.
3 changes: 2 additions & 1 deletion common/src/main/java/org/figuramc/figura/backend2/FSB.java
Original file line number Diff line number Diff line change
Expand Up @@ -111,11 +111,12 @@ public void equipAvatar(List<Pair<String, Hash>> avatars) {
public void onDisconnect() {
s2CHandshake = null;
state = State.Uninitialized;
handshakeTick = 0;
handshakeAttempts = 0;
inputStreams.clear();
outputStreams.clear();
nextInputId = 0;
nextOutputId = 0;
NetworkStuff.backendStatus = 1;
// TODO: Handling disconnecting properly, closing all incoming/outcoming streams, etc.
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@ public class NetworkStuff {
private static final ConcurrentLinkedQueue<Request<HttpAPI>> API_REQUESTS = new ConcurrentLinkedQueue<>();
private static final ConcurrentLinkedQueue<Request<WebSocket>> WS_REQUESTS = new ConcurrentLinkedQueue<>();
private static final List<UUID> SUBSCRIPTIONS = new ArrayList<>();
private static final ArrayList<AvatarEquipInstruction> AVATAR_EQUIP_INSTRUCTIONS = new ArrayList<>();
private static CompletableFuture<Void> tasks;

private static final int RECONNECT = 6000; //5 min
Expand Down Expand Up @@ -109,6 +110,13 @@ else if (!checkWS())
//pings counter
if (lastPing > 0 && FiguraMod.ticks - lastPing >= 20)
lastPing = pingsSent = pingsReceived = 0;

if (!fsb().connected()) {
for (AvatarEquipInstruction instruction: AVATAR_EQUIP_INSTRUCTIONS) {
instruction.avatar.loadData(instruction.avatars(), instruction.bitPair());
}
}
AVATAR_EQUIP_INSTRUCTIONS.clear();
}

private static void tickSubscriptions() {
Expand Down Expand Up @@ -350,7 +358,8 @@ public static void getUser(UserData user) {
if (cat != null) PermissionManager.setDefaultFor(user.id, cat);
}

if (!fsb().connected()) user.loadData(avatars, badgesPair);
// Async breaks a lot of stuff
AVATAR_EQUIP_INSTRUCTIONS.add(new AvatarEquipInstruction(user, avatars, badgesPair));
});
}

Expand Down Expand Up @@ -597,4 +606,6 @@ public boolean equals(Object o) {
return o instanceof Request request && owner.equals(request.owner);
}
}

private record AvatarEquipInstruction(UserData avatar, ArrayList<Pair<String, Pair<String, UUID>>> avatars, Pair<BitSet, BitSet> bitPair) {}
}
Original file line number Diff line number Diff line change
Expand Up @@ -178,10 +178,6 @@ public void replaceOrAddOwnedAvatar(String avatarId, Hash hash, Hash ehash) {
public void replaceOrAddEquippedAvatar(String avatarId, Hash hash, Hash ehash) {
equippedAvatars.put(avatarId, new EHashPair(hash, ehash));
FiguraServer.getInstance().avatarManager().getAvatarMetadata(hash).equipped().put(uuid(), ehash);
FiguraServer.getInstance().userManager().forEachUser(user -> {
if (user != this)
user.sendDeferredPacket(CompletableFuture.supplyAsync(() -> new S2CNotifyPacket(this.uuid())));
});
}

public int getAvatarsCountWithId(String avatarId) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,11 @@
import org.figuramc.figura.server.FiguraServer;
import org.figuramc.figura.server.FiguraUser;
import org.figuramc.figura.server.packets.c2s.C2SEquipAvatarsPacket;
import org.figuramc.figura.server.packets.s2c.S2CNotifyPacket;
import org.figuramc.figura.server.utils.IFriendlyByteBuf;

import java.util.concurrent.CompletableFuture;

public class C2SEquipAvatarPacketHandler extends AuthorizedC2SPacketHandler<C2SEquipAvatarsPacket> {
public C2SEquipAvatarPacketHandler(FiguraServer parent) {
super(parent);
Expand All @@ -13,6 +16,10 @@ public C2SEquipAvatarPacketHandler(FiguraServer parent) {
@Override
protected void handle(FiguraUser sender, C2SEquipAvatarsPacket packet) {
packet.avatars().forEach((id, pair) -> sender.replaceOrAddEquippedAvatar(id, pair.hash(), pair.ehash()));
FiguraServer.getInstance().userManager().forEachUser(user -> {
if (user != sender)
user.sendPacket(new S2CNotifyPacket(sender.uuid()));
});
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
public class FiguraSpigot extends JavaPlugin implements Listener {
private FiguraServerSpigot srv;
private BukkitTask tickTask;
public static final boolean DEBUG = false;
public static final boolean DEBUG = true;
@Override
public void onEnable() {
srv = new FiguraServerSpigot(this);
Expand Down

0 comments on commit f479e65

Please sign in to comment.