geforkt von Mirrors/Velocity
Merge pull request #52 from Leymooo/header-footer
Add Header and Footer. Resolves #50
Dieser Commit ist enthalten in:
Commit
6ccf16cee4
@ -1,7 +1,6 @@
|
|||||||
package com.velocitypowered.api.event;
|
package com.velocitypowered.api.event;
|
||||||
|
|
||||||
import com.google.common.base.Preconditions;
|
import com.google.common.base.Preconditions;
|
||||||
|
|
||||||
import net.kyori.text.Component;
|
import net.kyori.text.Component;
|
||||||
import net.kyori.text.serializer.ComponentSerializers;
|
import net.kyori.text.serializer.ComponentSerializers;
|
||||||
import org.checkerframework.checker.nullness.qual.NonNull;
|
import org.checkerframework.checker.nullness.qual.NonNull;
|
||||||
|
@ -1,16 +1,13 @@
|
|||||||
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.event.connection.LoginEvent;
|
|
||||||
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.server.ServerInfo;
|
import com.velocitypowered.api.server.ServerInfo;
|
||||||
import com.velocitypowered.api.util.GameProfile.Property;
|
|
||||||
import com.velocitypowered.api.util.MessagePosition;
|
import com.velocitypowered.api.util.MessagePosition;
|
||||||
import net.kyori.text.Component;
|
import net.kyori.text.Component;
|
||||||
import org.checkerframework.checker.nullness.qual.NonNull;
|
import org.checkerframework.checker.nullness.qual.NonNull;
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
@ -58,5 +55,21 @@ public interface Player extends CommandSource, InboundConnection, ChannelMessage
|
|||||||
*/
|
*/
|
||||||
ConnectionRequestBuilder createConnectionRequest(@NonNull ServerInfo info);
|
ConnectionRequestBuilder createConnectionRequest(@NonNull ServerInfo info);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets a header and footer to the player
|
||||||
|
* @param header component with header
|
||||||
|
* @param footer component with footer
|
||||||
|
*/
|
||||||
|
void setHeaderAndFooter(Component header, Component footer);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Clears a header and footer for the player
|
||||||
|
*/
|
||||||
|
void clearHeaderAndFooter();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Disconnects the player with the reason
|
||||||
|
* @param reason component with the reason
|
||||||
|
*/
|
||||||
void disconnect(Component reason);
|
void disconnect(Component reason);
|
||||||
}
|
}
|
||||||
|
@ -25,7 +25,7 @@ public class GameProfile {
|
|||||||
public UUID idAsUuid() {
|
public UUID idAsUuid() {
|
||||||
return UuidUtils.fromUndashed(id);
|
return UuidUtils.fromUndashed(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getName() {
|
public String getName() {
|
||||||
return name;
|
return name;
|
||||||
}
|
}
|
||||||
|
@ -9,14 +9,12 @@ 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;
|
||||||
import com.velocitypowered.api.util.MessagePosition;
|
import com.velocitypowered.api.util.MessagePosition;
|
||||||
import com.velocitypowered.api.util.UuidUtils;
|
|
||||||
import com.velocitypowered.api.proxy.Player;
|
import com.velocitypowered.api.proxy.Player;
|
||||||
import com.velocitypowered.proxy.VelocityServer;
|
import com.velocitypowered.proxy.VelocityServer;
|
||||||
import com.velocitypowered.proxy.connection.MinecraftConnectionAssociation;
|
import com.velocitypowered.proxy.connection.MinecraftConnectionAssociation;
|
||||||
import com.velocitypowered.proxy.connection.util.ConnectionMessages;
|
import com.velocitypowered.proxy.connection.util.ConnectionMessages;
|
||||||
import com.velocitypowered.proxy.connection.util.ConnectionRequestResults;
|
import com.velocitypowered.proxy.connection.util.ConnectionRequestResults;
|
||||||
import com.velocitypowered.api.util.GameProfile;
|
import com.velocitypowered.api.util.GameProfile;
|
||||||
import com.velocitypowered.proxy.protocol.StateRegistry;
|
|
||||||
import com.velocitypowered.proxy.protocol.packet.Chat;
|
import com.velocitypowered.proxy.protocol.packet.Chat;
|
||||||
import com.velocitypowered.proxy.connection.MinecraftConnection;
|
import com.velocitypowered.proxy.connection.MinecraftConnection;
|
||||||
import com.velocitypowered.proxy.connection.backend.VelocityServerConnection;
|
import com.velocitypowered.proxy.connection.backend.VelocityServerConnection;
|
||||||
@ -25,6 +23,8 @@ import com.velocitypowered.proxy.protocol.packet.PluginMessage;
|
|||||||
import com.velocitypowered.proxy.util.ThrowableUtils;
|
import com.velocitypowered.proxy.util.ThrowableUtils;
|
||||||
import com.velocitypowered.api.server.ServerInfo;
|
import com.velocitypowered.api.server.ServerInfo;
|
||||||
import com.velocitypowered.proxy.protocol.packet.Disconnect;
|
import com.velocitypowered.proxy.protocol.packet.Disconnect;
|
||||||
|
import com.velocitypowered.proxy.protocol.packet.HeaderAndFooter;
|
||||||
|
|
||||||
import net.kyori.text.Component;
|
import net.kyori.text.Component;
|
||||||
import net.kyori.text.TextComponent;
|
import net.kyori.text.TextComponent;
|
||||||
import net.kyori.text.TranslatableComponent;
|
import net.kyori.text.TranslatableComponent;
|
||||||
@ -137,6 +137,18 @@ public class ConnectedPlayer implements MinecraftConnectionAssociation, Player {
|
|||||||
return new ConnectionRequestBuilderImpl(info);
|
return new ConnectionRequestBuilderImpl(info);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setHeaderAndFooter(@NonNull Component header, @NonNull Component footer) {
|
||||||
|
Preconditions.checkNotNull(header, "header");
|
||||||
|
Preconditions.checkNotNull(footer, "footer");
|
||||||
|
connection.write(HeaderAndFooter.create(header, footer));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void clearHeaderAndFooter() {
|
||||||
|
connection.write(HeaderAndFooter.reset());
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void disconnect(Component reason) {
|
public void disconnect(Component reason) {
|
||||||
connection.closeWith(Disconnect.create(reason));
|
connection.closeWith(Disconnect.create(reason));
|
||||||
|
@ -10,7 +10,6 @@ import com.velocitypowered.api.proxy.InboundConnection;
|
|||||||
import com.velocitypowered.api.server.ServerInfo;
|
import com.velocitypowered.api.server.ServerInfo;
|
||||||
import com.velocitypowered.proxy.connection.VelocityConstants;
|
import com.velocitypowered.proxy.connection.VelocityConstants;
|
||||||
import com.velocitypowered.api.util.GameProfile;
|
import com.velocitypowered.api.util.GameProfile;
|
||||||
import com.velocitypowered.api.util.UuidUtils;
|
|
||||||
import com.velocitypowered.proxy.protocol.MinecraftPacket;
|
import com.velocitypowered.proxy.protocol.MinecraftPacket;
|
||||||
import com.velocitypowered.proxy.protocol.ProtocolConstants;
|
import com.velocitypowered.proxy.protocol.ProtocolConstants;
|
||||||
import com.velocitypowered.proxy.protocol.StateRegistry;
|
import com.velocitypowered.proxy.protocol.StateRegistry;
|
||||||
@ -100,14 +99,14 @@ public class LoginSessionHandler implements MinecraftSessionHandler {
|
|||||||
// The player disconnected after we authenticated them.
|
// The player disconnected after we authenticated them.
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
inbound.enableEncryption(decryptedSharedSecret);
|
inbound.enableEncryption(decryptedSharedSecret);
|
||||||
} catch (GeneralSecurityException e) {
|
} catch (GeneralSecurityException e) {
|
||||||
throw new RuntimeException(e);
|
throw new RuntimeException(e);
|
||||||
}
|
}
|
||||||
|
|
||||||
initializePlayer(VelocityServer.GSON.fromJson(profileResponse, GameProfile.class), true);
|
initializePlayer(VelocityServer.GSON.fromJson(profileResponse, GameProfile.class), true);
|
||||||
|
|
||||||
}, inbound.getChannel().eventLoop())
|
}, inbound.getChannel().eventLoop())
|
||||||
.exceptionally(exception -> {
|
.exceptionally(exception -> {
|
||||||
logger.error("Unable to enable encryption", exception);
|
logger.error("Unable to enable encryption", exception);
|
||||||
@ -137,7 +136,7 @@ public class LoginSessionHandler implements MinecraftSessionHandler {
|
|||||||
inbound.closeWith(Disconnect.create(event.getResult().getReason().get()));
|
inbound.closeWith(Disconnect.create(event.getResult().getReason().get()));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (VelocityServer.getServer().getConfiguration().isOnlineMode() || result.isOnlineModeAllowed()) {
|
if (VelocityServer.getServer().getConfiguration().isOnlineMode() || result.isOnlineModeAllowed()) {
|
||||||
// Request encryption.
|
// Request encryption.
|
||||||
EncryptionRequest request = generateRequest();
|
EncryptionRequest request = generateRequest();
|
||||||
|
@ -106,6 +106,13 @@ public enum StateRegistry {
|
|||||||
map(0x34, MINECRAFT_1_12, true),
|
map(0x34, MINECRAFT_1_12, true),
|
||||||
map(0x35, MINECRAFT_1_12_2, true),
|
map(0x35, MINECRAFT_1_12_2, true),
|
||||||
map(0x38, MINECRAFT_1_13, true));
|
map(0x38, MINECRAFT_1_13, true));
|
||||||
|
CLIENTBOUND.register(HeaderAndFooter.class, HeaderAndFooter::new,
|
||||||
|
map(0x47, MINECRAFT_1_8, true),
|
||||||
|
map(0x48, MINECRAFT_1_9, true),
|
||||||
|
map(0x47, MINECRAFT_1_9_4, true),
|
||||||
|
map(0x49, MINECRAFT_1_12, true),
|
||||||
|
map(0x4A, MINECRAFT_1_12_1, true),
|
||||||
|
map(0x4E, MINECRAFT_1_13, true));
|
||||||
CLIENTBOUND.register(ScoreboardDisplay.class, ScoreboardDisplay::new,
|
CLIENTBOUND.register(ScoreboardDisplay.class, ScoreboardDisplay::new,
|
||||||
map(0x3D, MINECRAFT_1_8, true),
|
map(0x3D, MINECRAFT_1_8, true),
|
||||||
map(0x38, MINECRAFT_1_9, true),
|
map(0x38, MINECRAFT_1_9, true),
|
||||||
|
@ -0,0 +1,62 @@
|
|||||||
|
package com.velocitypowered.proxy.protocol.packet;
|
||||||
|
|
||||||
|
import com.velocitypowered.proxy.protocol.MinecraftPacket;
|
||||||
|
import com.velocitypowered.proxy.protocol.ProtocolConstants.Direction;
|
||||||
|
import static com.velocitypowered.proxy.protocol.ProtocolUtils.writeString;
|
||||||
|
|
||||||
|
import io.netty.buffer.ByteBuf;
|
||||||
|
import net.kyori.text.Component;
|
||||||
|
import net.kyori.text.serializer.ComponentSerializer;
|
||||||
|
import net.kyori.text.serializer.ComponentSerializers;
|
||||||
|
|
||||||
|
public class HeaderAndFooter implements MinecraftPacket {
|
||||||
|
|
||||||
|
private static final HeaderAndFooter RESET = new HeaderAndFooter("{\"translate\":\"\"}", "{\"translate\":\"\"}");
|
||||||
|
|
||||||
|
private String header;
|
||||||
|
private String footer;
|
||||||
|
|
||||||
|
public HeaderAndFooter() {
|
||||||
|
}
|
||||||
|
|
||||||
|
public HeaderAndFooter(String header, String footer) {
|
||||||
|
this.header = header;
|
||||||
|
this.footer = footer;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getHeader() {
|
||||||
|
return header;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setHeader(String header) {
|
||||||
|
this.header = header;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getFooter() {
|
||||||
|
return footer;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setFooter(String footer) {
|
||||||
|
this.footer = footer;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void decode(ByteBuf buf, Direction direction, int protocolVersion) {
|
||||||
|
throw new UnsupportedOperationException("Decode is not implemented");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void encode(ByteBuf buf, Direction direction, int protocolVersion) {
|
||||||
|
writeString(buf, header);
|
||||||
|
writeString(buf, footer);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static HeaderAndFooter create(Component header, Component footer) {
|
||||||
|
ComponentSerializer<Component, Component, String> json = ComponentSerializers.JSON;
|
||||||
|
return new HeaderAndFooter(json.serialize(header), json.serialize(footer));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static HeaderAndFooter reset() {
|
||||||
|
return RESET;
|
||||||
|
}
|
||||||
|
}
|
Laden…
In neuem Issue referenzieren
Einen Benutzer sperren