geforkt von Mirrors/Velocity
Merge branch 'master' into ping
Dieser Commit ist enthalten in:
Commit
86461c2b60
@ -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;
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
@ -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
|
||||||
|
}
|
||||||
|
}
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
@ -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
|
||||||
|
@ -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() {
|
||||||
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
@ -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;
|
||||||
|
@ -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
|
||||||
|
@ -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());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Laden…
In neuem Issue referenzieren
Einen Benutzer sperren