geforkt von Mirrors/Velocity
Create a specific Forge-related package
Dieser Commit ist enthalten in:
Ursprung
b7d7e3cc89
Commit
51c402e3d3
@ -7,9 +7,4 @@ public class VelocityConstants {
|
|||||||
|
|
||||||
public static final String VELOCITY_IP_FORWARDING_CHANNEL = "velocity:player_info";
|
public static final String VELOCITY_IP_FORWARDING_CHANNEL = "velocity:player_info";
|
||||||
|
|
||||||
public static final String FORGE_LEGACY_HANDSHAKE_CHANNEL = "FML|HS";
|
|
||||||
public static final String FORGE_LEGACY_CHANNEL = "FML";
|
|
||||||
public static final String FORGE_MULTIPART_LEGACY_CHANNEL = "FML|MP";
|
|
||||||
|
|
||||||
public static final byte[] FORGE_LEGACY_HANDSHAKE_RESET_DATA = new byte[] { -2, 0 };
|
|
||||||
}
|
}
|
||||||
|
@ -5,14 +5,13 @@ import com.velocitypowered.api.event.player.ServerConnectedEvent;
|
|||||||
import com.velocitypowered.api.proxy.messages.ChannelIdentifier;
|
import com.velocitypowered.api.proxy.messages.ChannelIdentifier;
|
||||||
import com.velocitypowered.proxy.VelocityServer;
|
import com.velocitypowered.proxy.VelocityServer;
|
||||||
import com.velocitypowered.proxy.connection.MinecraftSessionHandler;
|
import com.velocitypowered.proxy.connection.MinecraftSessionHandler;
|
||||||
import com.velocitypowered.proxy.connection.VelocityConstants;
|
|
||||||
import com.velocitypowered.proxy.connection.client.ClientPlaySessionHandler;
|
import com.velocitypowered.proxy.connection.client.ClientPlaySessionHandler;
|
||||||
|
import com.velocitypowered.proxy.connection.forge.ForgeUtil;
|
||||||
import com.velocitypowered.proxy.connection.util.ConnectionMessages;
|
import com.velocitypowered.proxy.connection.util.ConnectionMessages;
|
||||||
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.packet.*;
|
import com.velocitypowered.proxy.protocol.packet.*;
|
||||||
import com.velocitypowered.proxy.protocol.util.PluginMessageUtil;
|
import com.velocitypowered.proxy.protocol.util.PluginMessageUtil;
|
||||||
import com.velocitypowered.proxy.tablist.VelocityTabList;
|
|
||||||
import io.netty.buffer.ByteBuf;
|
import io.netty.buffer.ByteBuf;
|
||||||
|
|
||||||
public class BackendPlaySessionHandler implements MinecraftSessionHandler {
|
public class BackendPlaySessionHandler implements MinecraftSessionHandler {
|
||||||
@ -85,7 +84,7 @@ public class BackendPlaySessionHandler implements MinecraftSessionHandler {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!serverConn.hasCompletedJoin() && packet.getChannel().equals(VelocityConstants.FORGE_LEGACY_HANDSHAKE_CHANNEL)) {
|
if (!serverConn.hasCompletedJoin() && packet.getChannel().equals(ForgeUtil.FORGE_LEGACY_HANDSHAKE_CHANNEL)) {
|
||||||
if (!serverConn.isLegacyForge()) {
|
if (!serverConn.isLegacyForge()) {
|
||||||
serverConn.setLegacyForge(true);
|
serverConn.setLegacyForge(true);
|
||||||
|
|
||||||
@ -174,7 +173,7 @@ public class BackendPlaySessionHandler implements MinecraftSessionHandler {
|
|||||||
boolean isMCOrFMLMessage;
|
boolean isMCOrFMLMessage;
|
||||||
if (serverConn.getConnection().getProtocolVersion() <= ProtocolConstants.MINECRAFT_1_12_2) {
|
if (serverConn.getConnection().getProtocolVersion() <= ProtocolConstants.MINECRAFT_1_12_2) {
|
||||||
String channel = message.getChannel();
|
String channel = message.getChannel();
|
||||||
isMCOrFMLMessage = channel.startsWith("MC|") || channel.startsWith(VelocityConstants.FORGE_LEGACY_HANDSHAKE_CHANNEL);
|
isMCOrFMLMessage = channel.startsWith("MC|") || channel.startsWith(ForgeUtil.FORGE_LEGACY_HANDSHAKE_CHANNEL);
|
||||||
} else {
|
} else {
|
||||||
isMCOrFMLMessage = message.getChannel().startsWith("minecraft:");
|
isMCOrFMLMessage = message.getChannel().startsWith("minecraft:");
|
||||||
}
|
}
|
||||||
|
@ -6,8 +6,8 @@ import com.velocitypowered.api.proxy.messages.ChannelIdentifier;
|
|||||||
import com.velocitypowered.api.util.ModInfo;
|
import com.velocitypowered.api.util.ModInfo;
|
||||||
import com.velocitypowered.proxy.VelocityServer;
|
import com.velocitypowered.proxy.VelocityServer;
|
||||||
import com.velocitypowered.proxy.connection.MinecraftSessionHandler;
|
import com.velocitypowered.proxy.connection.MinecraftSessionHandler;
|
||||||
import com.velocitypowered.proxy.connection.VelocityConstants;
|
|
||||||
import com.velocitypowered.proxy.connection.backend.VelocityServerConnection;
|
import com.velocitypowered.proxy.connection.backend.VelocityServerConnection;
|
||||||
|
import com.velocitypowered.proxy.connection.forge.ForgeUtil;
|
||||||
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.packet.*;
|
import com.velocitypowered.proxy.protocol.packet.*;
|
||||||
@ -144,9 +144,9 @@ public class ClientPlaySessionHandler implements MinecraftSessionHandler {
|
|||||||
} else if (PluginMessageUtil.isMCBrand(packet)) {
|
} else if (PluginMessageUtil.isMCBrand(packet)) {
|
||||||
player.getConnectedServer().getConnection().write(PluginMessageUtil.rewriteMCBrand(packet));
|
player.getConnectedServer().getConnection().write(PluginMessageUtil.rewriteMCBrand(packet));
|
||||||
} else if (player.getConnectedServer().isLegacyForge() && !player.getConnectedServer().hasCompletedJoin()) {
|
} else if (player.getConnectedServer().isLegacyForge() && !player.getConnectedServer().hasCompletedJoin()) {
|
||||||
if (packet.getChannel().equals(VelocityConstants.FORGE_LEGACY_HANDSHAKE_CHANNEL)) {
|
if (packet.getChannel().equals(ForgeUtil.FORGE_LEGACY_HANDSHAKE_CHANNEL)) {
|
||||||
if (!player.getModInfo().isPresent()) {
|
if (!player.getModInfo().isPresent()) {
|
||||||
PluginMessageUtil.readModList(packet).ifPresent(mods -> player.setModInfo(new ModInfo("FML", mods)));
|
ForgeUtil.readModList(packet).ifPresent(mods -> player.setModInfo(new ModInfo("FML", mods)));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Always forward the FML handshake to the remote server.
|
// Always forward the FML handshake to the remote server.
|
||||||
|
@ -25,8 +25,8 @@ import com.velocitypowered.api.util.title.Titles;
|
|||||||
import com.velocitypowered.proxy.VelocityServer;
|
import com.velocitypowered.proxy.VelocityServer;
|
||||||
import com.velocitypowered.proxy.connection.MinecraftConnection;
|
import com.velocitypowered.proxy.connection.MinecraftConnection;
|
||||||
import com.velocitypowered.proxy.connection.MinecraftConnectionAssociation;
|
import com.velocitypowered.proxy.connection.MinecraftConnectionAssociation;
|
||||||
import com.velocitypowered.proxy.connection.VelocityConstants;
|
|
||||||
import com.velocitypowered.proxy.connection.backend.VelocityServerConnection;
|
import com.velocitypowered.proxy.connection.backend.VelocityServerConnection;
|
||||||
|
import com.velocitypowered.proxy.connection.forge.ForgeUtil;
|
||||||
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.proxy.protocol.ProtocolConstants;
|
import com.velocitypowered.proxy.protocol.ProtocolConstants;
|
||||||
@ -400,8 +400,8 @@ public class ConnectedPlayer implements MinecraftConnectionAssociation, Player {
|
|||||||
public void sendLegacyForgeHandshakeResetPacket() {
|
public void sendLegacyForgeHandshakeResetPacket() {
|
||||||
if (connection.canSendLegacyFMLResetPacket()) {
|
if (connection.canSendLegacyFMLResetPacket()) {
|
||||||
PluginMessage resetPacket = new PluginMessage();
|
PluginMessage resetPacket = new PluginMessage();
|
||||||
resetPacket.setChannel(VelocityConstants.FORGE_LEGACY_HANDSHAKE_CHANNEL);
|
resetPacket.setChannel(ForgeUtil.FORGE_LEGACY_HANDSHAKE_CHANNEL);
|
||||||
resetPacket.setData(VelocityConstants.FORGE_LEGACY_HANDSHAKE_RESET_DATA);
|
resetPacket.setData(ForgeUtil.FORGE_LEGACY_HANDSHAKE_RESET_DATA);
|
||||||
connection.write(resetPacket);
|
connection.write(resetPacket);
|
||||||
connection.setCanSendLegacyFMLResetPacket(false);
|
connection.setCanSendLegacyFMLResetPacket(false);
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,4 @@
|
|||||||
|
package com.velocitypowered.proxy.connection.forge;
|
||||||
|
|
||||||
|
public class ForgeConstants {
|
||||||
|
}
|
@ -0,0 +1,51 @@
|
|||||||
|
package com.velocitypowered.proxy.connection.forge;
|
||||||
|
|
||||||
|
import com.google.common.base.Preconditions;
|
||||||
|
import com.google.common.collect.ImmutableList;
|
||||||
|
import com.velocitypowered.api.util.ModInfo;
|
||||||
|
import com.velocitypowered.proxy.protocol.ProtocolUtils;
|
||||||
|
import com.velocitypowered.proxy.protocol.packet.PluginMessage;
|
||||||
|
import io.netty.buffer.ByteBuf;
|
||||||
|
import io.netty.buffer.Unpooled;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
|
public class ForgeUtil {
|
||||||
|
public static final String FORGE_LEGACY_HANDSHAKE_CHANNEL = "FML|HS";
|
||||||
|
public static final String FORGE_LEGACY_CHANNEL = "FML";
|
||||||
|
public static final String FORGE_MULTIPART_LEGACY_CHANNEL = "FML|MP";
|
||||||
|
public static final byte[] FORGE_LEGACY_HANDSHAKE_RESET_DATA = new byte[] { -2, 0 };
|
||||||
|
|
||||||
|
private ForgeUtil() {
|
||||||
|
throw new AssertionError();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Optional<List<ModInfo.Mod>> readModList(PluginMessage message) {
|
||||||
|
Preconditions.checkNotNull(message, "message");
|
||||||
|
Preconditions.checkArgument(message.getChannel().equals(FORGE_LEGACY_HANDSHAKE_CHANNEL),
|
||||||
|
"message is not a FML HS plugin message");
|
||||||
|
|
||||||
|
ByteBuf byteBuf = Unpooled.wrappedBuffer(message.getData());
|
||||||
|
try {
|
||||||
|
byte discriminator = byteBuf.readByte();
|
||||||
|
|
||||||
|
if (discriminator == 2) {
|
||||||
|
ImmutableList.Builder<ModInfo.Mod> mods = ImmutableList.builder();
|
||||||
|
int modCount = ProtocolUtils.readVarInt(byteBuf);
|
||||||
|
|
||||||
|
for (int index = 0; index < modCount; index++) {
|
||||||
|
String id = ProtocolUtils.readString(byteBuf);
|
||||||
|
String version = ProtocolUtils.readString(byteBuf);
|
||||||
|
mods.add(new ModInfo.Mod(id, version));
|
||||||
|
}
|
||||||
|
|
||||||
|
return Optional.of(mods.build());
|
||||||
|
}
|
||||||
|
|
||||||
|
return Optional.empty();
|
||||||
|
} finally {
|
||||||
|
byteBuf.release();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -81,31 +81,4 @@ public class PluginMessageUtil {
|
|||||||
return newMsg;
|
return newMsg;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Optional<List<ModInfo.Mod>> readModList(PluginMessage message) {
|
|
||||||
Preconditions.checkNotNull(message, "message");
|
|
||||||
Preconditions.checkArgument(message.getChannel().equals(VelocityConstants.FORGE_LEGACY_HANDSHAKE_CHANNEL),
|
|
||||||
"message is not a FML HS plugin message");
|
|
||||||
|
|
||||||
ByteBuf byteBuf = Unpooled.wrappedBuffer(message.getData());
|
|
||||||
try {
|
|
||||||
byte discriminator = byteBuf.readByte();
|
|
||||||
|
|
||||||
if (discriminator == 2) {
|
|
||||||
ImmutableList.Builder<ModInfo.Mod> mods = ImmutableList.builder();
|
|
||||||
int modCount = ProtocolUtils.readVarInt(byteBuf);
|
|
||||||
|
|
||||||
for (int index = 0; index < modCount; index++) {
|
|
||||||
String id = ProtocolUtils.readString(byteBuf);
|
|
||||||
String version = ProtocolUtils.readString(byteBuf);
|
|
||||||
mods.add(new ModInfo.Mod(id, version));
|
|
||||||
}
|
|
||||||
|
|
||||||
return Optional.of(mods.build());
|
|
||||||
}
|
|
||||||
|
|
||||||
return Optional.empty();
|
|
||||||
} finally {
|
|
||||||
byteBuf.release();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
Laden…
In neuem Issue referenzieren
Einen Benutzer sperren