Skip to content

Commit

Permalink
Don't block Velocity event threads, made the Bungee variant work
Browse files Browse the repository at this point in the history
  • Loading branch information
Tim203 committed May 18, 2024
1 parent 3f18321 commit be2a94d
Show file tree
Hide file tree
Showing 4 changed files with 49 additions and 56 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -39,14 +39,14 @@
import net.md_5.bungee.api.event.PostLoginEvent;
import net.md_5.bungee.api.event.PreLoginEvent;
import net.md_5.bungee.api.plugin.Listener;
import net.md_5.bungee.api.plugin.Plugin;
import net.md_5.bungee.connection.InitialHandler;
import net.md_5.bungee.event.EventHandler;
import net.md_5.bungee.event.EventPriority;
import net.md_5.bungee.netty.ChannelWrapper;
import org.geysermc.floodgate.api.ProxyFloodgateApi;
import org.geysermc.floodgate.api.logger.FloodgateLogger;
import org.geysermc.floodgate.api.player.FloodgatePlayer;
import org.geysermc.floodgate.config.ProxyFloodgateConfig;
import org.geysermc.floodgate.skin.SkinApplier;
import org.geysermc.floodgate.skin.SkinDataImpl;
import org.geysermc.floodgate.util.LanguageManager;
Expand All @@ -67,7 +67,7 @@ public final class BungeeListener implements Listener {
checkNotNull(PLAYER_NAME, "Initial name field cannot be null");
}

@Inject private ProxyFloodgateConfig config;
@Inject private Plugin plugin;
@Inject private ProxyFloodgateApi api;
@Inject private LanguageManager languageManager;
@Inject private FloodgateLogger logger;
Expand Down Expand Up @@ -130,29 +130,28 @@ public void onLogin(LoginEvent event) {

@EventHandler(priority = EventPriority.LOWEST)
public void onPostLogin(PostLoginEvent event) {
if (!config.isSendFloodgateData()) {
FloodgatePlayer player = api.getPlayer(event.getPlayer().getUniqueId());

if (player == null) {
return;
}

// Floodgate players are seen as offline mode players, meaning we have to look up
// the linked player's textures ourselves

if (!player.isLinked()) {
skinApplier.applySkin(player, SkinDataImpl.DEFAULT_SKIN);
return;
}

mojangUtils.asyncSkinFor(player.getJavaUniqueId())
.thenAccept(skin -> skinApplier.applySkin(player, skin))
.exceptionally(exception -> {
logger.debug("Failed to get skin for player " + player.getJavaUniqueId() + ", applying default.", exception);
skinApplier.applySkin(player, SkinDataImpl.DEFAULT_SKIN);
return null;
});
FloodgatePlayer player = api.getPlayer(event.getPlayer().getUniqueId());

// Skin look up would result in it failing, apply a default skin
if (!player.isLinked()) {
skinApplier.applySkin(player, SkinDataImpl.DEFAULT_SKIN);
return;
}

// Floodgate players are seen as offline mode players, meaning we have to look up
// the linked player's textures ourselves

event.registerIntent(plugin);

mojangUtils.skinFor(player.getJavaUniqueId())
.exceptionally(exception -> {
logger.debug("Unexpected skin fetch error for " + player.getJavaUniqueId(), exception);
return SkinDataImpl.DEFAULT_SKIN;
})
.thenAccept(skin -> {
skinApplier.applySkin(player, skin);
event.completeIntent(plugin);
});
}

@EventHandler(priority = EventPriority.HIGHEST)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -92,8 +92,6 @@ public void applySkin(@NonNull FloodgatePlayer floodgatePlayer, @NonNull SkinDat
SkinData currentSkin = currentSkin(properties);

SkinApplyEvent event = new SkinApplyEventImpl(floodgatePlayer, currentSkin, skinData);
event.setCancelled(floodgatePlayer.isLinked());

eventBus.fire(event);

if (event.isCancelled()) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -55,11 +55,7 @@ public class MojangUtils {
@Named("commonPool")
private ExecutorService commonPool;

public @NonNull SkinData skinFor(UUID playerId) throws ExecutionException {
return SKIN_CACHE.get(playerId, () -> fetchSkinFor(playerId));
}

public CompletableFuture<@NonNull SkinData> asyncSkinFor(UUID playerId) {
public CompletableFuture<@NonNull SkinData> skinFor(UUID playerId) {
return CompletableFuture.supplyAsync(() -> {
try {
return SKIN_CACHE.get(playerId, () -> fetchSkinFor(playerId));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@
import com.google.common.cache.CacheBuilder;
import com.google.inject.Inject;
import com.google.inject.name.Named;
import com.velocitypowered.api.event.Continuation;
import com.velocitypowered.api.event.PostOrder;
import com.velocitypowered.api.event.Subscribe;
import com.velocitypowered.api.event.connection.DisconnectEvent;
Expand All @@ -48,17 +49,15 @@
import io.netty.channel.Channel;
import io.netty.util.AttributeKey;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import net.kyori.adventure.text.Component;
import org.geysermc.floodgate.api.ProxyFloodgateApi;
import org.geysermc.floodgate.api.event.skin.SkinApplyEvent.SkinData;
import org.geysermc.floodgate.api.logger.FloodgateLogger;
import org.geysermc.floodgate.api.player.FloodgatePlayer;
import org.geysermc.floodgate.config.ProxyFloodgateConfig;
import org.geysermc.floodgate.skin.SkinDataImpl;
import org.geysermc.floodgate.util.Constants;
import org.geysermc.floodgate.util.LanguageManager;
import org.geysermc.floodgate.util.MojangUtils;
Expand Down Expand Up @@ -154,34 +153,35 @@ public void onPreLogin(PreLoginEvent event) {
}

@Subscribe(order = PostOrder.EARLY)
public void onGameProfileRequest(GameProfileRequestEvent event) {
public void onGameProfileRequest(GameProfileRequestEvent event, Continuation continuation) {
FloodgatePlayer player = playerCache.getIfPresent(event.getConnection());
if (player != null) {
playerCache.invalidate(event.getConnection());

List<Property> properties = new ArrayList<>();

if (player.isLinked()) {
// Floodgate players are seen as offline mode players, meaning we have to look up
// the linked player's textures ourselves
try {
SkinData skin = mojangUtils.skinFor(player.getJavaUniqueId());
properties.add(new Property("textures", skin.value(), skin.signature()));
} catch (ExecutionException exception) {
logger.debug("Failed to get skin for player " + player.getJavaUniqueId() + ", applying default.", exception);
}
if (!player.isLinked()) {
event.setGameProfile(new GameProfile(
player.getCorrectUniqueId(),
player.getCorrectUsername(),
List.of(DEFAULT_TEXTURE_PROPERTY)
));
return;
}

// either the player isn't linked or it failed to look up the skin
if (properties.isEmpty()) {
properties.add(DEFAULT_TEXTURE_PROPERTY);
}

event.setGameProfile(new GameProfile(
player.getCorrectUniqueId(),
player.getCorrectUsername(),
properties
));
// Floodgate players are seen as offline mode players, meaning we have to look up
// the linked player's textures ourselves

mojangUtils.skinFor(player.getJavaUniqueId())
.exceptionally(exception -> {
logger.debug("Unexpected skin fetch error for " + player.getJavaUniqueId(), exception);
return SkinDataImpl.DEFAULT_SKIN;
}).thenAccept(skin -> {
event.setGameProfile(new GameProfile(
player.getCorrectUniqueId(),
player.getCorrectUsername(),
List.of(new Property("textures", skin.value(), skin.signature()))
));
continuation.resume();
});
}
}

Expand Down

0 comments on commit be2a94d

Please sign in to comment.