Merge branch 'master' into ping

This commit is contained in:
Andrew Steinborn
2018-08-25 12:45:07 -04:00
committed by GitHub
11 changed files with 203 additions and 27 deletions

View File

@@ -12,16 +12,12 @@ import com.velocitypowered.proxy.protocol.remap.EntityIdRemapper;
import com.velocitypowered.proxy.protocol.util.PluginMessageUtil;
import com.velocitypowered.proxy.util.ThrowableUtils;
import io.netty.buffer.ByteBuf;
import io.netty.channel.EventLoop;
import net.kyori.text.TextComponent;
import net.kyori.text.format.TextColor;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import java.util.*;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.ThreadLocalRandom;
import java.util.concurrent.TimeUnit;
/**
* Handles communication with the connected Minecraft client. This is effectively the primary nerve center that
@@ -68,7 +64,7 @@ public class ClientPlaySessionHandler implements MinecraftSessionHandler {
}
if (packet instanceof ClientSettings) {
player.setClientSettings((ClientSettings) packet);
player.setPlayerSettings((ClientSettings) packet);
// forward it on
}

View File

@@ -0,0 +1,56 @@
package com.velocitypowered.proxy.connection.client;
import com.velocitypowered.api.playersettings.PlayerSettings;
import com.velocitypowered.api.playersettings.SkinParts;
import com.velocitypowered.proxy.protocol.packet.ClientSettings;
import java.util.Locale;
public class ClientSettingsWrapper implements PlayerSettings {
public static PlayerSettings DEFAULT = new ClientSettingsWrapper(new ClientSettings("en_US", (byte) 10, 0, true, (short)127, 1));
private final ClientSettings settings;
private final SkinParts parts;
private Locale locale = null;
public ClientSettingsWrapper(ClientSettings settings) {
this.settings = settings;
this.parts = new SkinParts((byte) settings.getSkinParts());
}
@Override
public Locale getLocale() {
return locale == null ? locale = Locale.forLanguageTag(settings.getLocale().replaceAll("_", "-")) : locale; //Will throw error if locale not found
}
@Override
public byte getViewDistance() {
return settings.getViewDistance();
}
@Override
public ChatMode getChatMode() {
int chat = settings.getChatVisibility();
if (chat < 0 || chat > 2) {
return ChatMode.SHOWN;
}
return ChatMode.values()[chat];
}
@Override
public boolean hasChatColors() {
return settings.isChatColors();
}
@Override
public SkinParts getSkinParts() {
return parts;
}
@Override
public MainHand getMainHand() {
return settings.getMainHand() == 1 ? MainHand.RIGHT : MainHand.LEFT;
}
}

View File

@@ -2,9 +2,11 @@ package com.velocitypowered.proxy.connection.client;
import com.google.common.base.Preconditions;
import com.google.gson.JsonObject;
import com.velocitypowered.api.event.player.PlayerSettingsChangedEvent;
import com.velocitypowered.api.event.player.ServerPreConnectEvent;
import com.velocitypowered.api.permission.PermissionFunction;
import com.velocitypowered.api.permission.PermissionProvider;
import com.velocitypowered.api.playersettings.PlayerSettings;
import com.velocitypowered.api.proxy.ConnectionRequestBuilder;
import com.velocitypowered.api.proxy.ServerConnection;
import com.velocitypowered.api.proxy.messages.ChannelIdentifier;
@@ -56,7 +58,8 @@ public class ConnectedPlayer implements MinecraftConnectionAssociation, Player {
private VelocityServerConnection connectedServer;
private ClientSettings clientSettings;
private VelocityServerConnection connectionInFlight;
private PlayerSettings settings;
public ConnectedPlayer(GameProfile profile, MinecraftConnection connection, InetSocketAddress virtualHost) {
this.profile = profile;
this.connection = connection;
@@ -95,6 +98,15 @@ public class ConnectedPlayer implements MinecraftConnectionAssociation, Player {
this.ping = ping;
}
public PlayerSettings getPlayerSettings() {
return settings == null ? ClientSettingsWrapper.DEFAULT : this.settings;
}
public void setPlayerSettings(ClientSettings settings) {
this.settings = new ClientSettingsWrapper(settings);
VelocityServer.getServer().getEventManager().fireAndForget(new PlayerSettingsChangedEvent(this, this.settings));
}
@Override
public InetSocketAddress getRemoteAddress() {
return (InetSocketAddress) connection.getChannel().remoteAddress();
@@ -172,10 +184,6 @@ public class ConnectedPlayer implements MinecraftConnectionAssociation, Player {
return clientSettings;
}
public void setClientSettings(ClientSettings clientSettings) {
this.clientSettings = clientSettings;
}
public void handleConnectionException(ServerInfo info, Throwable throwable) {
String error = ThrowableUtils.briefDescription(throwable);
String userMessage;

View File

@@ -6,6 +6,7 @@ import com.velocitypowered.proxy.protocol.ProtocolUtils;
import io.netty.buffer.ByteBuf;
public class ClientSettings implements MinecraftPacket {
private String locale;
private byte viewDistance;
private int chatVisibility;
@@ -13,6 +14,18 @@ public class ClientSettings implements MinecraftPacket {
private short skinParts;
private int mainHand;
public ClientSettings() {
}
public ClientSettings(String locale, byte viewDistance, int chatVisibility, boolean chatColors, short skinParts, int mainHand) {
this.locale = locale;
this.viewDistance = viewDistance;
this.chatVisibility = chatVisibility;
this.chatColors = chatColors;
this.skinParts = skinParts;
this.mainHand = mainHand;
}
public String getLocale() {
return locale;
}
@@ -63,14 +76,14 @@ public class ClientSettings implements MinecraftPacket {
@Override
public String toString() {
return "ClientSettings{" +
"locale='" + locale + '\'' +
", viewDistance=" + viewDistance +
", chatVisibility=" + chatVisibility +
", chatColors=" + chatColors +
", skinParts=" + skinParts +
", mainHand=" + mainHand +
'}';
return "ClientSettings{"
+ "locale='" + locale + '\''
+ ", viewDistance=" + viewDistance
+ ", chatVisibility=" + chatVisibility
+ ", chatColors=" + chatColors
+ ", skinParts=" + skinParts
+ ", mainHand=" + mainHand
+ '}';
}
@Override

View File

@@ -1,9 +1,11 @@
package com.velocitypowered.proxy.protocol.packet;
import com.google.common.collect.ImmutableList;
import com.velocitypowered.api.proxy.server.ServerPing;
import net.kyori.text.serializer.ComponentSerializers;
public class LegacyPingResponse {
private static final ServerPing.Players FAKE_PLAYERS = new ServerPing.Players(0, 0, ImmutableList.of());
private int protocolVersion;
private String serverVersion;
private String motd;
@@ -76,7 +78,7 @@ public class LegacyPingResponse {
return new LegacyPingResponse(ping.getVersion().getProtocol(),
ping.getVersion().getName(),
ComponentSerializers.LEGACY.serialize(ping.getDescription()),
ping.getPlayers().getOnline(),
ping.getPlayers().getMax());
ping.getPlayers().orElse(FAKE_PLAYERS).getOnline(),
ping.getPlayers().orElse(FAKE_PLAYERS).getMax());
}
}