13
0
geforkt von Mirrors/Velocity

Merge branch 'master' into ping

Dieser Commit ist enthalten in:
Andrew Steinborn 2018-08-25 12:45:07 -04:00 committet von GitHub
Commit 86461c2b60
Es konnte kein GPG-Schlüssel zu dieser Signatur gefunden werden
GPG-Schlüssel-ID: 4AEE18F83AFDEB23
11 geänderte Dateien mit 203 neuen und 27 gelöschten Zeilen

Datei anzeigen

@ -1,4 +1,4 @@
/** /**
* Provides events for handling incoming connections to the proxy and loigns. * Provides events for handling incoming connections to the proxy and logins.
*/ */
package com.velocitypowered.api.event.connection; package com.velocitypowered.api.event.connection;

Datei anzeigen

@ -0,0 +1,24 @@
package com.velocitypowered.api.event.player;
import com.google.common.base.Preconditions;
import com.velocitypowered.api.playersettings.PlayerSettings;
import com.velocitypowered.api.proxy.Player;
public class PlayerSettingsChangedEvent {
private final Player player;
private final PlayerSettings playerSettings;
public PlayerSettingsChangedEvent(Player player, PlayerSettings playerSettings) {
this.player = Preconditions.checkNotNull(player, "player");
this.playerSettings = Preconditions.checkNotNull(playerSettings, "playerSettings");
}
public Player getPlayer() {
return player;
}
//New settings
public PlayerSettings getPlayerSettings() {
return playerSettings;
}
}

Datei anzeigen

@ -0,0 +1,29 @@
package com.velocitypowered.api.playersettings;
import java.util.Locale;
public interface PlayerSettings {
Locale getLocale();
byte getViewDistance();
ChatMode getChatMode();
boolean hasChatColors();
SkinParts getSkinParts();
MainHand getMainHand();
public enum ChatMode {
SHOWN,
COMMANDS_ONLY,
HIDDEN
}
public enum MainHand {
LEFT,
RIGHT
}
}

Datei anzeigen

@ -0,0 +1,39 @@
package com.velocitypowered.api.playersettings;
public class SkinParts {
static final SkinParts SKIN_SHOW_ALL = new SkinParts((byte) 127);
private final byte bitmask;
public SkinParts(byte skinBitmask) {
this.bitmask = skinBitmask;
}
public boolean hasCape() {
return ((bitmask >> 0) & 1) == 1;
}
public boolean hasJacket() {
return ((bitmask >> 1) & 1) == 1;
}
public boolean hasLeftSleeve() {
return ((bitmask >> 2) & 1) == 1;
}
public boolean hasRightSleeve() {
return ((bitmask >> 3) & 1) == 1;
}
public boolean hasLeftPants() {
return ((bitmask >> 4) & 1) == 1;
}
public boolean hasRightPants() {
return ((bitmask >> 5) & 1) == 1;
}
public boolean hasHat() {
return ((bitmask >> 6) & 1) == 1;
}
}

Datei anzeigen

@ -1,6 +1,7 @@
package com.velocitypowered.api.proxy; package com.velocitypowered.api.proxy;
import com.velocitypowered.api.command.CommandSource; import com.velocitypowered.api.command.CommandSource;
import com.velocitypowered.api.playersettings.PlayerSettings;
import com.velocitypowered.api.proxy.messages.ChannelMessageSink; import com.velocitypowered.api.proxy.messages.ChannelMessageSink;
import com.velocitypowered.api.proxy.messages.ChannelMessageSource; import com.velocitypowered.api.proxy.messages.ChannelMessageSource;
import com.velocitypowered.api.proxy.server.ServerInfo; import com.velocitypowered.api.proxy.server.ServerInfo;
@ -33,6 +34,8 @@ public interface Player extends CommandSource, InboundConnection, ChannelMessage
*/ */
Optional<ServerConnection> getCurrentServer(); Optional<ServerConnection> getCurrentServer();
PlayerSettings getPlayerSettings();
/** /**
* Returns the current player's ping * Returns the current player's ping
* @return the player's ping or -1 if ping information is currently unknown * @return the player's ping or -1 if ping information is currently unknown

Datei anzeigen

@ -18,9 +18,9 @@ public class ServerPing {
private final Component description; private final Component description;
private final @Nullable Favicon favicon; private final @Nullable Favicon favicon;
public ServerPing(@NonNull Version version, @NonNull Players players, @NonNull Component description, @Nullable Favicon favicon) { public ServerPing(Version version, @Nullable Players players, Component description, @Nullable Favicon favicon) {
this.version = Preconditions.checkNotNull(version, "version"); this.version = Preconditions.checkNotNull(version, "version");
this.players = Preconditions.checkNotNull(players, "players"); this.players = players;
this.description = Preconditions.checkNotNull(description, "description"); this.description = Preconditions.checkNotNull(description, "description");
this.favicon = favicon; this.favicon = favicon;
} }
@ -29,8 +29,8 @@ public class ServerPing {
return version; return version;
} }
public Players getPlayers() { public Optional<Players> getPlayers() {
return players; return Optional.ofNullable(players);
} }
public Component getDescription() { public Component getDescription() {
@ -76,6 +76,7 @@ public class ServerPing {
private final List<SamplePlayer> samplePlayers = new ArrayList<>(); private final List<SamplePlayer> samplePlayers = new ArrayList<>();
private Component description; private Component description;
private Favicon favicon; private Favicon favicon;
private boolean nullOutPlayers;
private Builder() { private Builder() {
@ -106,6 +107,11 @@ public class ServerPing {
return this; return this;
} }
public Builder nullPlayers() {
this.nullOutPlayers = true;
return this;
}
public Builder description(Component description) { public Builder description(Component description) {
this.description = Preconditions.checkNotNull(description, "description"); this.description = Preconditions.checkNotNull(description, "description");
return this; return this;
@ -117,7 +123,7 @@ public class ServerPing {
} }
public ServerPing build() { public ServerPing build() {
return new ServerPing(version, new Players(onlinePlayers, maximumPlayers, samplePlayers), description, favicon); return new ServerPing(version, nullOutPlayers ? null : new Players(onlinePlayers, maximumPlayers, samplePlayers), description, favicon);
} }
public Version getVersion() { public Version getVersion() {

Datei anzeigen

@ -12,16 +12,12 @@ import com.velocitypowered.proxy.protocol.remap.EntityIdRemapper;
import com.velocitypowered.proxy.protocol.util.PluginMessageUtil; import com.velocitypowered.proxy.protocol.util.PluginMessageUtil;
import com.velocitypowered.proxy.util.ThrowableUtils; import com.velocitypowered.proxy.util.ThrowableUtils;
import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBuf;
import io.netty.channel.EventLoop;
import net.kyori.text.TextComponent; import net.kyori.text.TextComponent;
import net.kyori.text.format.TextColor; import net.kyori.text.format.TextColor;
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
import java.util.*; 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 * 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) { if (packet instanceof ClientSettings) {
player.setClientSettings((ClientSettings) packet); player.setPlayerSettings((ClientSettings) packet);
// forward it on // forward it on
} }

Datei anzeigen

@ -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;
}
}

Datei anzeigen

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

Datei anzeigen

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

Datei anzeigen

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