Skip to content

Commit ff1546d

Browse files
committed
Add support for initial inbound connections on velocity
1 parent 14a6b51 commit ff1546d

File tree

2 files changed

+122
-3
lines changed

2 files changed

+122
-3
lines changed
Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
package dev.simplix.protocolize.velocity.player;
2+
3+
import com.velocitypowered.proxy.connection.MinecraftConnection;
4+
import com.velocitypowered.proxy.connection.client.InitialInboundConnection;
5+
import dev.simplix.protocolize.api.*;
6+
import dev.simplix.protocolize.api.inventory.Inventory;
7+
import dev.simplix.protocolize.api.inventory.PlayerInventory;
8+
import dev.simplix.protocolize.api.packet.AbstractPacket;
9+
import dev.simplix.protocolize.api.player.ProtocolizePlayer;
10+
import dev.simplix.protocolize.api.providers.ProtocolRegistrationProvider;
11+
import dev.simplix.protocolize.velocity.packet.VelocityProtocolizePacket;
12+
import lombok.extern.slf4j.Slf4j;
13+
14+
import java.lang.reflect.Field;
15+
import java.util.Collections;
16+
import java.util.Map;
17+
import java.util.UUID;
18+
import java.util.function.Consumer;
19+
20+
@Slf4j
21+
public class InitialInboundConnectionProtocolizePlayer implements ProtocolizePlayer {
22+
23+
private static final ProtocolRegistrationProvider REGISTRATION_PROVIDER = Protocolize.protocolRegistration();
24+
private static Field connectionField;
25+
26+
static {
27+
try {
28+
connectionField = InitialInboundConnection.class.getDeclaredField("connection");
29+
connectionField.setAccessible(true);
30+
} catch (ReflectiveOperationException e) {
31+
log.error("Unable to initialize InitialInboundConnectionProtocolizePlayer. Maybe your velocity version is unsupported.", e);
32+
}
33+
}
34+
35+
private final InitialInboundConnection connection;
36+
37+
public InitialInboundConnectionProtocolizePlayer(InitialInboundConnection connection) {
38+
this.connection = connection;
39+
}
40+
41+
@Override
42+
public UUID uniqueId() {
43+
throw new IllegalStateException("Not possible for initial inbound connections");
44+
}
45+
46+
@Override
47+
public PlayerInventory proxyInventory() {
48+
throw new IllegalStateException("Not possible for initial inbound connections");
49+
}
50+
51+
@Override
52+
public void sendPacket(Object packet) {
53+
if (packet instanceof AbstractPacket) {
54+
VelocityProtocolizePacket pack = (VelocityProtocolizePacket) REGISTRATION_PROVIDER.createPacket((Class<? extends AbstractPacket>) packet.getClass(),
55+
Protocol.STATUS, PacketDirection.CLIENTBOUND, protocolVersion());
56+
if (pack == null) {
57+
throw new IllegalStateException("Cannot send " + packet.getClass().getName() + " to players with protocol version " + protocolVersion());
58+
}
59+
pack.wrapper((AbstractPacket) packet);
60+
packet = pack;
61+
}
62+
Object finalPacket = packet;
63+
try {
64+
MinecraftConnection minecraftConnection = (MinecraftConnection) connectionField.get(connection);
65+
minecraftConnection.write(finalPacket);
66+
} catch (IllegalAccessException e) {
67+
log.error("Unable to send packet to InitialInboundConnectionProtocolizePlayer. Maybe your velocity version is unsupported.", e);
68+
}
69+
}
70+
71+
@Override
72+
public void sendPacketToServer(Object packet) {
73+
throw new IllegalStateException("Not possible for initial inbound connections");
74+
}
75+
76+
@Override
77+
public Map<Integer, Inventory> registeredInventories() {
78+
return Collections.emptyMap();
79+
}
80+
81+
@Override
82+
public int generateWindowId() {
83+
throw new IllegalStateException("Not possible for initial inbound connections");
84+
}
85+
86+
@Override
87+
public int protocolVersion() {
88+
return connection.getProtocolVersion().getProtocol();
89+
}
90+
91+
@Override
92+
public <T> T handle() {
93+
return (T) connection;
94+
}
95+
96+
@Override
97+
public Location location() {
98+
throw new IllegalStateException("Not possible for initial inbound connections");
99+
}
100+
101+
@Override
102+
public void onInteract(Consumer<PlayerInteract> interactConsumer) {
103+
throw new IllegalStateException("Not possible for initial inbound connections");
104+
}
105+
106+
@Override
107+
public void handleInteract(PlayerInteract interact) {
108+
throw new IllegalStateException("Not possible for initial inbound connections");
109+
}
110+
}

protocolize-velocity/src/main/java/dev/simplix/protocolize/velocity/providers/VelocityPacketListenerProvider.java

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import com.velocitypowered.api.proxy.Player;
77
import com.velocitypowered.api.proxy.ServerConnection;
88
import com.velocitypowered.api.proxy.server.ServerInfo;
9+
import com.velocitypowered.proxy.connection.client.InitialInboundConnection;
910
import com.velocitypowered.proxy.protocol.MinecraftPacket;
1011
import com.velocitypowered.proxy.protocol.StateRegistry;
1112
import dev.simplix.protocolize.api.Direction;
@@ -19,6 +20,7 @@
1920
import dev.simplix.protocolize.api.providers.ProtocolizePlayerProvider;
2021
import dev.simplix.protocolize.api.util.ReflectionUtil;
2122
import dev.simplix.protocolize.velocity.packet.VelocityProtocolizePacket;
23+
import dev.simplix.protocolize.velocity.player.InitialInboundConnectionProtocolizePlayer;
2224
import io.netty.util.collection.IntObjectMap;
2325
import lombok.SneakyThrows;
2426
import lombok.extern.slf4j.Slf4j;
@@ -249,9 +251,16 @@ private PacketSendEvent<?> createSendEvent(InboundConnection connection, ServerC
249251
Player player = serverConnection.getPlayer();
250252
return new PacketSendEvent<>(player != null ? PLAYER_PROVIDER.player(player.getUniqueId()) : null, serverConnection.getServerInfo(), apiPacket, false);
251253
} else if (connection != null) {
252-
Player player = (Player) connection;
253-
ServerInfo info = player.getCurrentServer().isPresent() ? player.getCurrentServer().get().getServerInfo() : null;
254-
return new PacketSendEvent<>(PLAYER_PROVIDER.player(player.getUniqueId()), info, apiPacket, false);
254+
if (connection instanceof Player) {
255+
Player player = (Player) connection;
256+
ServerInfo info = player.getCurrentServer().isPresent() ? player.getCurrentServer().get().getServerInfo() : null;
257+
return new PacketSendEvent<>(PLAYER_PROVIDER.player(player.getUniqueId()), info, apiPacket, false);
258+
} else if (connection instanceof InitialInboundConnection) {
259+
return new PacketSendEvent<>(new InitialInboundConnectionProtocolizePlayer((InitialInboundConnection) connection),
260+
null, apiPacket, false);
261+
} else {
262+
throw new IllegalArgumentException("Unsupported connection type: " + connection.getClass().getName());
263+
}
255264
} else {
256265
return new PacketSendEvent<>(null, null, apiPacket, false);
257266
}

0 commit comments

Comments
 (0)