@Override public void registerMap() { map(Type.VAR_INT); // 0 - Client Protocol Version map(Type.STRING); // 1 - Server Address map(Type.UNSIGNED_SHORT); // 2 - Server Port map(Type.VAR_INT); // 3 - Next State handler(new PacketHandler() { @Override public void handle(PacketWrapper wrapper) throws Exception {
registerIncoming(State.HANDSHAKE, 0x00, 0x00, new PacketRemapper() { @Override public void registerMap() {
registerOutgoing(State.STATUS, 0x00, 0x00, new PacketRemapper() { // Status Response Packet @Override public void registerMap() { registerOutgoing(State.STATUS, 0x01, 0x01); // Status Pong Packet registerOutgoing(State.LOGIN, 0x00, 0x00); // Login Disconnect Packet registerOutgoing(State.LOGIN, 0x01, 0x01); // Encryption Request Packet registerOutgoing(State.LOGIN, 0x02, 0x02, new PacketRemapper() { @Override public void registerMap() { registerOutgoing(State.LOGIN, 0x03, 0x03); // Login Set Compression Packet registerIncoming(State.LOGIN, 0x04, 0x04); // Plugin Request (1.13) registerIncoming(State.STATUS, 0x00, 0x00); // Status Request Packet registerIncoming(State.STATUS, 0x01, 0x01); // Status Ping Packet registerIncoming(State.LOGIN, 0x00, 0x00, new PacketRemapper() { @Override public void registerMap() { registerIncoming(State.LOGIN, 0x01, 0x01); // Encryption Response Packet registerIncoming(State.LOGIN, 0x02, 0x02); // Plugin Response (1.13)
@Override public int getPlayerVersion(@NonNull UUID uuid) { if (!isPorted(uuid)) return ProtocolRegistry.SERVER_PROTOCOL; return getPortedPlayers().get(uuid).get(ProtocolInfo.class).getProtocolVersion(); }
/** * Checks if the UUID is on the selected pipe * * @param uuid UUID Object * @return True if on pipe */ protected boolean isOnPipe(UUID uuid) { UserConnection userConnection = getUserConnection(uuid); return userConnection != null && userConnection.get(ProtocolInfo.class).getPipeline().contains(requiredPipeline); }
public static UUID getUUID(UserConnection user) { return user.get(ProtocolInfo.class).getUuid(); } }
public void sendPlayer(UserConnection userConnection) { if (userConnection.get(ProtocolInfo.class).getState() == State.PLAY) { PacketWrapper wrapper = new PacketWrapper(0x03, null, userConnection); wrapper.write(Type.BOOLEAN, userConnection.get(MovementTracker.class).isGround()); try { wrapper.sendToServer(Protocol1_9TO1_8.class); } catch (Exception e) { e.printStackTrace(); } // PlayerPackets will increment idle } } }
@Override protected byte getStates(UserConnection user, Position position, int blockState) { byte states = super.getStates(user, position, blockState); return states == 0 && user.get(ProtocolInfo.class).getServerProtocolVersion() <= 47 && user.get(ProtocolInfo.class).getServerProtocolVersion() != -1 ? 0xF : states; } }
@Override public void init(UserConnection userConnection) { this.userConnection = userConnection; ProtocolInfo protocolInfo = new ProtocolInfo(userConnection); protocolInfo.setPipeline(this); userConnection.put(protocolInfo); /* Init through all our pipes */ for (Protocol protocol : protocolList) { protocol.init(userConnection); } }
@Override protected void register(ViaProviders providers) { providers.register(VersionProvider.class, new VersionProvider()); }
@Override public int getPlayerVersion(@NonNull UUID uuid) { if (!isPorted(uuid)) { return VelocityPlugin.PROXY.getPlayer(uuid) .map(InboundConnection::getProtocolVersion) .map(ProtocolVersion::getProtocol) .orElse(ProtocolRegistry.SERVER_PROTOCOL); } return getPortedPlayers().get(uuid).get(ProtocolInfo.class).getProtocolVersion(); }
@Override protected void encode(ChannelHandlerContext ctx, Object o, List list) throws Exception { // Split chunks bulk packet up in to single chunks packets before it reached the encoder. // This will prevent issues with several plugins and other protocol handlers due to the chunks being sent twice. // It also sends the chunks in the right order possible resolving some issues with added chunks/block/entity data. if (!(o instanceof ByteBuf)) { info.setLastPacket(o); /* This transformer is more for fixing issues which we find hard at packet level :) */ if (info.isActive()) { if (info.get(ProtocolInfo.class).getPipeline().filter(o, list)) { return; } } } list.add(o); } }
public void addPortedClient(UserConnection info) { portedPlayers.put(info.get(ProtocolInfo.class).getUuid(), info); }
public void sendPlayer(UserConnection userConnection) { if (userConnection.get(ProtocolInfo.class).getState() == State.PLAY) { PacketWrapper wrapper = new PacketWrapper(0x03, null, userConnection); wrapper.write(Type.BOOLEAN, userConnection.get(MovementTracker.class).isGround()); try { wrapper.sendToServer(Protocol1_9TO1_8.class); } catch (Exception e) { e.printStackTrace(); } // PlayerPackets will increment idle } } }
@Override public int getPlayerVersion(@NonNull Player player) { if (!isPorted(player)) return getExternalVersion(player); return getPortedPlayers().get(player.getUniqueId()).get(ProtocolInfo.class).getProtocolVersion(); }
@Override protected void encode(ChannelHandlerContext ctx, Object o, List list) throws Exception { // Split chunks bulk packet up in to single chunks packets before it reached the encoder. // This will prevent issues with several plugins and other protocol handlers due to the chunks being sent twice. // It also sends the chunks in the right order possible resolving some issues with added chunks/block/entity data. if (!(o instanceof ByteBuf)) { info.setLastPacket(o); /* This transformer is more for fixing issues which we find hard at packet level :) */ if (info.isActive()) { if (info.get(ProtocolInfo.class).getPipeline().filter(o, list)) { return; } } } list.add(o); } }
@Override public Set<UUID> getPlayers() { return Collections.singleton(connection.get(ProtocolInfo.class).getUuid()); }
@Override public int getPlayerVersion(@NonNull Player player) { if (!isPorted(player.getUniqueId())) return ProtocolRegistry.SERVER_PROTOCOL; return getPortedPlayers().get(player.getUniqueId()).get(ProtocolInfo.class).getProtocolVersion(); }
@Override public Item getHandItem(final UserConnection info) { if (HandItemCache.CACHE) { return HandItemCache.getHandItem(info.get(ProtocolInfo.class).getUuid()); } else { return super.getHandItem(info); // TODO: On API Docs write about this } } });
@Override public int getPlayerVersion(@NonNull UUID uuid) { if (!isPorted(uuid)) return getExternalVersion(Bukkit.getPlayer(uuid)); return getPortedPlayers().get(uuid).get(ProtocolInfo.class).getProtocolVersion(); }