1
0
mirror of https://github.com/GeyserMC/Floodgate.git synced 2025-12-19 14:59:20 +00:00

Reduce session server lookups (#509)

* fix: add default skin to gameprofiles

* fix: add signatures by default to prevent issues

* cleanup

* no longer apply empty textures

* revert formatting change

* fix(spigot): linked player textures

* fix(velocity): linked player textures

* fix(bungeecord): apply linked textures

* Made the MojangUtils class instance based, removed some unneeded code

* Don't block Velocity event threads, made the Bungee variant work

* Add some comments

---------

Co-authored-by: bridge <haha@haha.com>
Co-authored-by: Tim203 <mctim203@gmail.com>
This commit is contained in:
Bridge
2024-05-18 15:01:55 +02:00
committed by GitHub
parent f8c84182d6
commit 00b8b1b636
8 changed files with 214 additions and 45 deletions

View File

@@ -29,6 +29,7 @@ import static org.geysermc.floodgate.util.ReflectionUtils.getCastedValue;
import static org.geysermc.floodgate.util.ReflectionUtils.setValue;
import com.mojang.authlib.GameProfile;
import com.mojang.authlib.properties.Property;
import io.netty.channel.Channel;
import io.netty.util.AttributeKey;
import java.lang.reflect.InvocationTargetException;
@@ -38,9 +39,16 @@ import org.geysermc.floodgate.config.FloodgateConfig;
import org.geysermc.floodgate.player.FloodgateHandshakeHandler;
import org.geysermc.floodgate.player.FloodgateHandshakeHandler.HandshakeResult;
import org.geysermc.floodgate.util.ClassNames;
import org.geysermc.floodgate.util.Constants;
import org.geysermc.floodgate.util.ProxyUtils;
public final class SpigotDataHandler extends CommonDataHandler {
private static final Property DEFAULT_TEXTURE_PROPERTY = new Property(
"textures",
Constants.DEFAULT_MINECRAFT_JAVA_SKIN_TEXTURE,
Constants.DEFAULT_MINECRAFT_JAVA_SKIN_SIGNATURE
);
private Object networkManager;
private FloodgatePlayer player;
private boolean proxyData;
@@ -171,6 +179,13 @@ public final class SpigotDataHandler extends CommonDataHandler {
player.getCorrectUniqueId(), player.getCorrectUsername()
);
if (!player.isLinked()) {
// Otherwise game server will try to fetch the skin from Mojang.
// No need to worry that this overrides proxy data, because those won't reach this
// method / are already removed (in the case of username validation)
gameProfile.getProperties().put("textures", DEFAULT_TEXTURE_PROPERTY);
}
// we have to fake the offline player (login) cycle
if (ClassNames.IS_PRE_1_20_2) {

View File

@@ -26,20 +26,24 @@
package org.geysermc.floodgate.listener;
import com.destroystokyo.paper.event.profile.PreFillProfileEvent;
import com.destroystokyo.paper.profile.PlayerProfile;
import com.destroystokyo.paper.profile.ProfileProperty;
import com.google.inject.Inject;
import java.util.HashSet;
import java.util.Set;
import java.util.UUID;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerJoinEvent;
import org.geysermc.floodgate.api.SimpleFloodgateApi;
import org.geysermc.floodgate.api.player.FloodgatePlayer;
import org.geysermc.floodgate.util.Constants;
public final class PaperProfileListener implements Listener {
private static final ProfileProperty DEFAULT_TEXTURE_PROPERTY = new ProfileProperty(
"textures",
Constants.DEFAULT_MINECRAFT_JAVA_SKIN_TEXTURE,
Constants.DEFAULT_MINECRAFT_JAVA_SKIN_SIGNATURE
);
@Inject private SimpleFloodgateApi api;
@EventHandler
@@ -62,26 +66,8 @@ public final class PaperProfileListener implements Listener {
}
Set<ProfileProperty> properties = new HashSet<>(event.getPlayerProfile().getProperties());
properties.add(new ProfileProperty("textures", "", ""));
properties.add(DEFAULT_TEXTURE_PROPERTY);
event.setProperties(properties);
}
@EventHandler
public void onPlayerJoin(PlayerJoinEvent event) {
Player bukkitPlayer = event.getPlayer();
FloodgatePlayer player = api.getPlayer(bukkitPlayer.getUniqueId());
if (player == null || player.isLinked()) {
return;
}
PlayerProfile profile = bukkitPlayer.getPlayerProfile();
if (profile.getProperties().stream().noneMatch(
prop -> "textures".equals(prop.getName()) && prop.getValue().isEmpty()
&& prop.getSignature() != null && prop.getSignature().isEmpty())) {
return;
}
profile.removeProperty("textures");
bukkitPlayer.setPlayerProfile(profile);
}
}