Mirror von
https://github.com/PaperMC/Velocity.git
synchronisiert 2024-11-16 21:10:30 +01:00
Grab most of the low-hanging fruit.
Dieser Commit ist enthalten in:
Ursprung
f898b766f1
Commit
89bcc9a100
@ -1,6 +1,6 @@
|
||||
package com.velocitypowered.api.proxy.server;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.*;
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
|
||||
import com.google.common.collect.ImmutableList;
|
||||
import com.velocitypowered.api.proxy.server.QueryResponse.PluginInformation;
|
||||
|
@ -1,6 +1,6 @@
|
||||
package com.velocitypowered.api.proxy.server;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.*;
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
|
||||
import com.google.common.collect.ImmutableList;
|
||||
import com.velocitypowered.api.proxy.server.ServerPing.Players;
|
||||
|
@ -1,4 +1,8 @@
|
||||
checkstyle {
|
||||
toolVersion '8.14'
|
||||
configFile new File(project.rootDir, ['config', 'checkstyle', 'checkstyle.xml'].join(File.separator))
|
||||
|
||||
// The build should immediately fail if we have errors.
|
||||
maxErrors = 0
|
||||
maxWarnings = 0
|
||||
}
|
@ -20,6 +20,10 @@ jar {
|
||||
}
|
||||
}
|
||||
|
||||
tasks.withType(Checkstyle) {
|
||||
exclude('**/com/velocitypowered/proxy/protocol/packet/*.java')
|
||||
}
|
||||
|
||||
dependencies {
|
||||
// Note: we depend on the API twice, first the main sourceset, and then the annotation processor.
|
||||
compile project(':velocity-api')
|
||||
|
@ -123,6 +123,12 @@ public class VelocityCommandManager implements CommandManager {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Determines if the {@code source} has permission to run the {@code cmdLine}.
|
||||
* @param source the source to check against
|
||||
* @param cmdLine the command to run
|
||||
* @return {@code true} if the command can be run, otherwise {@code false}
|
||||
*/
|
||||
public boolean hasPermission(CommandSource source, String cmdLine) {
|
||||
Preconditions.checkNotNull(source, "source");
|
||||
Preconditions.checkNotNull(cmdLine, "cmdLine");
|
||||
|
@ -36,7 +36,10 @@ public abstract class AnnotatedConfig {
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
@Target({ElementType.FIELD, ElementType.TYPE})
|
||||
public @interface Table {
|
||||
|
||||
/**
|
||||
* The table's name.
|
||||
* @return the table's name
|
||||
*/
|
||||
String value();
|
||||
}
|
||||
|
||||
@ -46,7 +49,10 @@ public abstract class AnnotatedConfig {
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
@Target({ElementType.FIELD, ElementType.TYPE})
|
||||
public @interface Comment {
|
||||
|
||||
/**
|
||||
* The comments to include with this key. Each entry is considered a line.
|
||||
* @return the comments
|
||||
*/
|
||||
String[] value();
|
||||
}
|
||||
|
||||
@ -56,7 +62,10 @@ public abstract class AnnotatedConfig {
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
@Target({ElementType.FIELD, ElementType.TYPE})
|
||||
public @interface ConfigKey {
|
||||
|
||||
/**
|
||||
* The name of this field in the configuration.
|
||||
* @return the field's name
|
||||
*/
|
||||
String value();
|
||||
}
|
||||
|
||||
|
@ -356,6 +356,12 @@ public class VelocityConfiguration extends AnnotatedConfig implements ProxyConfi
|
||||
.toString();
|
||||
}
|
||||
|
||||
/**
|
||||
* Reads the Velocity configuration from {@code path}.
|
||||
* @param path the path to read from
|
||||
* @return the deserialized Velocity configuration
|
||||
* @throws IOException if we could not read from the {@code path}.
|
||||
*/
|
||||
public static VelocityConfiguration read(Path path) throws IOException {
|
||||
Toml toml;
|
||||
if (!path.toFile().exists()) {
|
||||
|
@ -5,8 +5,8 @@ import com.mojang.brigadier.builder.LiteralArgumentBuilder;
|
||||
import com.mojang.brigadier.builder.RequiredArgumentBuilder;
|
||||
import com.mojang.brigadier.tree.LiteralCommandNode;
|
||||
import com.velocitypowered.api.event.connection.PluginMessageEvent;
|
||||
import com.velocitypowered.api.proxy.messages.ChannelIdentifier;
|
||||
import com.velocitypowered.api.network.ProtocolVersion;
|
||||
import com.velocitypowered.api.proxy.messages.ChannelIdentifier;
|
||||
import com.velocitypowered.proxy.VelocityServer;
|
||||
import com.velocitypowered.proxy.connection.MinecraftConnection;
|
||||
import com.velocitypowered.proxy.connection.MinecraftSessionHandler;
|
||||
|
@ -53,6 +53,12 @@ public class VelocityServerConnection implements MinecraftConnectionAssociation,
|
||||
private long lastPingId;
|
||||
private long lastPingSent;
|
||||
|
||||
/**
|
||||
* Initializes a new server connection.
|
||||
* @param registeredServer the server to connect to
|
||||
* @param proxyPlayer the player connecting to the server
|
||||
* @param server the Velocity proxy instance
|
||||
*/
|
||||
public VelocityServerConnection(VelocityRegisteredServer registeredServer,
|
||||
ConnectedPlayer proxyPlayer, VelocityServer server) {
|
||||
this.registeredServer = registeredServer;
|
||||
@ -60,6 +66,11 @@ public class VelocityServerConnection implements MinecraftConnectionAssociation,
|
||||
this.server = server;
|
||||
}
|
||||
|
||||
/**
|
||||
* Connects to the server.
|
||||
* @return a {@link com.velocitypowered.api.proxy.ConnectionRequestBuilder.Result} representing
|
||||
* whether or not the connect succeeded
|
||||
*/
|
||||
public CompletableFuture<ConnectionRequestBuilder.Result> connect() {
|
||||
CompletableFuture<ConnectionRequestBuilder.Result> result = new CompletableFuture<>();
|
||||
server.initializeGenericBootstrap()
|
||||
@ -167,6 +178,9 @@ public class VelocityServerConnection implements MinecraftConnectionAssociation,
|
||||
return proxyPlayer;
|
||||
}
|
||||
|
||||
/**
|
||||
* Disconnects from the server.
|
||||
*/
|
||||
public void disconnect() {
|
||||
if (connection != null) {
|
||||
gracefulDisconnect = true;
|
||||
|
@ -188,7 +188,8 @@ public class ClientPlaySessionHandler implements MinecraftSessionHandler {
|
||||
MinecraftConnection backendConn = serverConn != null ? serverConn.getConnection() : null;
|
||||
if (serverConn != null && backendConn != null) {
|
||||
if (backendConn.getState() != StateRegistry.PLAY) {
|
||||
logger.warn("Plugin message was sent while the backend was in PLAY. Channel: {}. Packet discarded.");
|
||||
logger.warn("A plugin message was received while the backend server was not "
|
||||
+ "ready. Channel: {}. Packet discarded.", packet.getChannel());
|
||||
} else if (PluginMessageUtil.isRegister(packet)) {
|
||||
List<String> actuallyRegistered = new ArrayList<>();
|
||||
List<String> channels = PluginMessageUtil.getChannels(packet);
|
||||
|
@ -1,7 +1,7 @@
|
||||
package com.velocitypowered.proxy.connection.client;
|
||||
|
||||
import com.velocitypowered.api.proxy.InboundConnection;
|
||||
import com.velocitypowered.api.network.ProtocolVersion;
|
||||
import com.velocitypowered.api.proxy.InboundConnection;
|
||||
import com.velocitypowered.proxy.connection.MinecraftConnection;
|
||||
import com.velocitypowered.proxy.connection.MinecraftConnectionAssociation;
|
||||
import com.velocitypowered.proxy.protocol.packet.Disconnect;
|
||||
|
@ -2,10 +2,10 @@ package com.velocitypowered.proxy.connection.client;
|
||||
|
||||
import com.google.common.collect.ImmutableList;
|
||||
import com.velocitypowered.api.event.proxy.ProxyPingEvent;
|
||||
import com.velocitypowered.api.network.ProtocolVersion;
|
||||
import com.velocitypowered.api.proxy.InboundConnection;
|
||||
import com.velocitypowered.api.proxy.server.ServerPing;
|
||||
import com.velocitypowered.api.util.ModInfo;
|
||||
import com.velocitypowered.api.network.ProtocolVersion;
|
||||
import com.velocitypowered.proxy.VelocityServer;
|
||||
import com.velocitypowered.proxy.config.VelocityConfiguration;
|
||||
import com.velocitypowered.proxy.connection.MinecraftConnection;
|
||||
|
@ -14,7 +14,8 @@ public class LegacyForgeConnectionType extends ConnectionTypeImpl {
|
||||
new GameProfile.Property("forgeClient", "true", "");
|
||||
|
||||
public LegacyForgeConnectionType() {
|
||||
super(LegacyForgeHandshakeClientPhase.NOT_STARTED, LegacyForgeHandshakeBackendPhase.NOT_STARTED);
|
||||
super(LegacyForgeHandshakeClientPhase.NOT_STARTED,
|
||||
LegacyForgeHandshakeBackendPhase.NOT_STARTED);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -7,7 +7,7 @@ import com.velocitypowered.proxy.connection.backend.BackendConnectionPhase;
|
||||
import com.velocitypowered.proxy.connection.client.ClientConnectionPhase;
|
||||
|
||||
/**
|
||||
* Indicates the type of connection that has been made
|
||||
* Indicates the type of connection that has been made.
|
||||
*/
|
||||
public class ConnectionTypeImpl implements ConnectionType {
|
||||
|
||||
|
@ -1,5 +1,7 @@
|
||||
package com.velocitypowered.proxy.console;
|
||||
|
||||
import static com.velocitypowered.api.permission.PermissionFunction.*;
|
||||
|
||||
import com.velocitypowered.api.event.permission.PermissionsSetupEvent;
|
||||
import com.velocitypowered.api.permission.PermissionFunction;
|
||||
import com.velocitypowered.api.permission.Tristate;
|
||||
@ -26,7 +28,7 @@ public final class VelocityConsole extends SimpleTerminalConsole implements Cons
|
||||
private static final Logger logger = LogManager.getLogger(VelocityConsole.class);
|
||||
|
||||
private final VelocityServer server;
|
||||
private PermissionFunction permissionFunction = PermissionFunction.ALWAYS_TRUE;
|
||||
private PermissionFunction permissionFunction = ALWAYS_TRUE;
|
||||
|
||||
public VelocityConsole(VelocityServer server) {
|
||||
this.server = server;
|
||||
@ -43,20 +45,14 @@ public final class VelocityConsole extends SimpleTerminalConsole implements Cons
|
||||
}
|
||||
|
||||
public void setupStreams() {
|
||||
System.setOut(IoBuilder.forLogger(logger)
|
||||
.setLevel(Level.INFO)
|
||||
.buildPrintStream());
|
||||
System.setErr(IoBuilder.forLogger(logger)
|
||||
.setLevel(Level.ERROR)
|
||||
.buildPrintStream());
|
||||
System.setOut(IoBuilder.forLogger(logger).setLevel(Level.INFO).buildPrintStream());
|
||||
System.setErr(IoBuilder.forLogger(logger).setLevel(Level.ERROR).buildPrintStream());
|
||||
}
|
||||
|
||||
public void setupPermissions() {
|
||||
PermissionsSetupEvent event = new PermissionsSetupEvent(this,
|
||||
s -> PermissionFunction.ALWAYS_TRUE);
|
||||
this.server.getEventManager().fire(event)
|
||||
.join(); // this is called on startup, we can safely #join
|
||||
this.permissionFunction = event.createFunction(this);
|
||||
PermissionsSetupEvent event = new PermissionsSetupEvent(this, s -> ALWAYS_TRUE);
|
||||
// we can safely block here, this is before any listeners fire
|
||||
this.permissionFunction = this.server.getEventManager().fire(event).join().createFunction(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -20,6 +20,11 @@ public class ServerChannelInitializerHolder implements Supplier<ChannelInitializ
|
||||
return this.initializer;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the channel initializer.
|
||||
* @param initializer the new initializer to use
|
||||
* @deprecated Internal implementation detail
|
||||
*/
|
||||
@Deprecated
|
||||
public void set(final ChannelInitializer<Channel> initializer) {
|
||||
LOGGER.warn("The server channel initializer has been replaced by {}",
|
||||
|
@ -8,7 +8,7 @@ import com.velocitypowered.api.plugin.PluginDescription;
|
||||
import com.velocitypowered.api.plugin.PluginManager;
|
||||
import com.velocitypowered.api.plugin.meta.PluginDependency;
|
||||
import com.velocitypowered.proxy.VelocityServer;
|
||||
import com.velocitypowered.proxy.plugin.loader.JavaPluginLoader;
|
||||
import com.velocitypowered.proxy.plugin.loader.java.JavaPluginLoader;
|
||||
import com.velocitypowered.proxy.plugin.util.PluginDependencyUtils;
|
||||
import java.io.IOException;
|
||||
import java.nio.file.DirectoryStream;
|
||||
|
@ -1,4 +1,4 @@
|
||||
package com.velocitypowered.proxy.plugin.loader;
|
||||
package com.velocitypowered.proxy.plugin.loader.java;
|
||||
|
||||
import com.google.inject.Guice;
|
||||
import com.google.inject.Injector;
|
||||
@ -10,6 +10,9 @@ import com.velocitypowered.api.plugin.meta.PluginDependency;
|
||||
import com.velocitypowered.api.proxy.ProxyServer;
|
||||
import com.velocitypowered.proxy.VelocityServer;
|
||||
import com.velocitypowered.proxy.plugin.PluginClassLoader;
|
||||
import com.velocitypowered.proxy.plugin.loader.PluginLoader;
|
||||
import com.velocitypowered.proxy.plugin.loader.VelocityPluginContainer;
|
||||
import com.velocitypowered.proxy.plugin.loader.VelocityPluginDescription;
|
||||
import com.velocitypowered.proxy.plugin.loader.java.JavaVelocityPluginDescription;
|
||||
import com.velocitypowered.proxy.plugin.loader.java.VelocityPluginModule;
|
||||
import java.io.BufferedInputStream;
|
@ -9,11 +9,11 @@ import java.util.Collection;
|
||||
import java.util.List;
|
||||
import org.checkerframework.checker.nullness.qual.Nullable;
|
||||
|
||||
public class JavaVelocityPluginDescription extends VelocityPluginDescription {
|
||||
class JavaVelocityPluginDescription extends VelocityPluginDescription {
|
||||
|
||||
private final Class<?> mainClass;
|
||||
|
||||
public JavaVelocityPluginDescription(String id, @Nullable String name, @Nullable String version,
|
||||
JavaVelocityPluginDescription(String id, @Nullable String name, @Nullable String version,
|
||||
@Nullable String description, @Nullable String url,
|
||||
@Nullable List<String> authors, Collection<PluginDependency> dependencies, Path source,
|
||||
Class<?> mainClass) {
|
||||
@ -21,7 +21,7 @@ public class JavaVelocityPluginDescription extends VelocityPluginDescription {
|
||||
this.mainClass = checkNotNull(mainClass);
|
||||
}
|
||||
|
||||
public Class<?> getMainClass() {
|
||||
Class<?> getMainClass() {
|
||||
return mainClass;
|
||||
}
|
||||
}
|
||||
|
@ -12,13 +12,13 @@ import java.nio.file.Path;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
public class VelocityPluginModule implements Module {
|
||||
class VelocityPluginModule implements Module {
|
||||
|
||||
private final ProxyServer server;
|
||||
private final JavaVelocityPluginDescription description;
|
||||
private final Path basePluginPath;
|
||||
|
||||
public VelocityPluginModule(ProxyServer server, JavaVelocityPluginDescription description,
|
||||
VelocityPluginModule(ProxyServer server, JavaVelocityPluginDescription description,
|
||||
Path basePluginPath) {
|
||||
this.server = server;
|
||||
this.description = description;
|
||||
|
@ -83,6 +83,11 @@ public enum ProtocolUtils {
|
||||
return str;
|
||||
}
|
||||
|
||||
/**
|
||||
* Writes the specified {@code str} to the {@code buf} with a VarInt prefix.
|
||||
* @param buf the buffer to write to
|
||||
* @param str the string to write
|
||||
*/
|
||||
public static void writeString(ByteBuf buf, String str) {
|
||||
int size = ByteBufUtil.utf8Bytes(str);
|
||||
writeVarInt(buf, size);
|
||||
@ -93,6 +98,13 @@ public enum ProtocolUtils {
|
||||
return readByteArray(buf, DEFAULT_MAX_STRING_SIZE);
|
||||
}
|
||||
|
||||
/**
|
||||
* Reads a VarInt length-prefixed byte array from the {@code buf}, making sure to not go over
|
||||
* {@code cap} size.
|
||||
* @param buf the buffer to read from
|
||||
* @param cap the maximum size of the string, in UTF-8 character length
|
||||
* @return the byte array
|
||||
*/
|
||||
public static byte[] readByteArray(ByteBuf buf, int cap) {
|
||||
int length = readVarInt(buf);
|
||||
checkArgument(length <= cap, "Bad string size (got %s, maximum is %s)", length, cap);
|
||||
@ -109,6 +121,11 @@ public enum ProtocolUtils {
|
||||
buf.writeBytes(array);
|
||||
}
|
||||
|
||||
/**
|
||||
* Reads an VarInt-prefixed array of VarInt integers from the {@code buf}.
|
||||
* @param buf the buffer to read from
|
||||
* @return an array of integers
|
||||
*/
|
||||
public static int[] readIntegerArray(ByteBuf buf) {
|
||||
int len = readVarInt(buf);
|
||||
int[] array = new int[len];
|
||||
@ -118,13 +135,11 @@ public enum ProtocolUtils {
|
||||
return array;
|
||||
}
|
||||
|
||||
public static void writeIntegerArray(ByteBuf buf, int[] array) {
|
||||
writeVarInt(buf, array.length);
|
||||
for (int i : array) {
|
||||
writeVarInt(buf, i);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Reads an UUID from the {@code buf}.
|
||||
* @param buf the buffer to read from
|
||||
* @return the UUID from the buffer
|
||||
*/
|
||||
public static UUID readUuid(ByteBuf buf) {
|
||||
long msb = buf.readLong();
|
||||
long lsb = buf.readLong();
|
||||
@ -136,6 +151,11 @@ public enum ProtocolUtils {
|
||||
buf.writeLong(uuid.getLeastSignificantBits());
|
||||
}
|
||||
|
||||
/**
|
||||
* Writes a list of {@link com.velocitypowered.api.util.GameProfile.Property} to the buffer.
|
||||
* @param buf the buffer to write to
|
||||
* @param properties the properties to serialize
|
||||
*/
|
||||
public static void writeProperties(ByteBuf buf, List<GameProfile.Property> properties) {
|
||||
writeVarInt(buf, properties.size());
|
||||
for (GameProfile.Property property : properties) {
|
||||
@ -151,6 +171,11 @@ public enum ProtocolUtils {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Reads a list of {@link com.velocitypowered.api.util.GameProfile.Property} from the buffer.
|
||||
* @param buf the buffer to read from
|
||||
* @return the read properties
|
||||
*/
|
||||
public static List<GameProfile.Property> readProperties(ByteBuf buf) {
|
||||
List<GameProfile.Property> properties = new ArrayList<>();
|
||||
int size = readVarInt(buf);
|
||||
@ -172,9 +197,9 @@ public enum ProtocolUtils {
|
||||
CLIENTBOUND;
|
||||
|
||||
public StateRegistry.PacketRegistry.ProtocolRegistry getProtocolRegistry(StateRegistry state,
|
||||
ProtocolVersion protocolVersion) {
|
||||
ProtocolVersion version) {
|
||||
return (this == SERVERBOUND ? state.serverbound : state.clientbound)
|
||||
.getProtocolRegistry(protocolVersion);
|
||||
.getProtocolRegistry(version);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -50,7 +50,12 @@ import io.netty.util.collection.IntObjectMap;
|
||||
import it.unimi.dsi.fastutil.objects.Object2IntMap;
|
||||
import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap;
|
||||
|
||||
import java.util.*;
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.EnumMap;
|
||||
import java.util.EnumSet;
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
import java.util.function.Supplier;
|
||||
|
||||
import org.checkerframework.checker.nullness.qual.Nullable;
|
||||
@ -245,7 +250,7 @@ public enum StateRegistry {
|
||||
this.versions = Collections.unmodifiableMap(mutableVersions);
|
||||
}
|
||||
|
||||
public ProtocolRegistry getProtocolRegistry(final ProtocolVersion version) {
|
||||
ProtocolRegistry getProtocolRegistry(final ProtocolVersion version) {
|
||||
ProtocolRegistry registry = versions.get(version);
|
||||
if (registry == null) {
|
||||
if (fallback) {
|
||||
@ -256,7 +261,7 @@ public enum StateRegistry {
|
||||
return registry;
|
||||
}
|
||||
|
||||
public <P extends MinecraftPacket> void register(Class<P> clazz, Supplier<P> packetSupplier,
|
||||
<P extends MinecraftPacket> void register(Class<P> clazz, Supplier<P> packetSupplier,
|
||||
PacketMapping... mappings) {
|
||||
if (mappings.length == 0) {
|
||||
throw new IllegalArgumentException("At least one mapping must be provided.");
|
||||
@ -301,6 +306,11 @@ public enum StateRegistry {
|
||||
this.packetClassToId.defaultReturnValue(Integer.MIN_VALUE);
|
||||
}
|
||||
|
||||
/**
|
||||
* Attempts to create a packet from the specified {@code id}.
|
||||
* @param id the packet ID
|
||||
* @return the packet instance, or {@code null} if the ID is not registered
|
||||
*/
|
||||
public @Nullable MinecraftPacket createPacket(final int id) {
|
||||
final Supplier<? extends MinecraftPacket> supplier = this.packetIdToSupplier.get(id);
|
||||
if (supplier == null) {
|
||||
@ -309,6 +319,12 @@ public enum StateRegistry {
|
||||
return supplier.get();
|
||||
}
|
||||
|
||||
/**
|
||||
* Attempts to look up the packet ID for an {@code packet}.
|
||||
* @param packet the packet to look up
|
||||
* @return the packet ID
|
||||
* @throws IllegalArgumentException if the packet ID is not found
|
||||
*/
|
||||
public int getPacketId(final MinecraftPacket packet) {
|
||||
final int id = this.packetClassToId.getInt(packet.getClass());
|
||||
if (id == Integer.MIN_VALUE) {
|
||||
@ -328,7 +344,7 @@ public enum StateRegistry {
|
||||
private final ProtocolVersion protocolVersion;
|
||||
private final boolean encodeOnly;
|
||||
|
||||
public PacketMapping(int id, ProtocolVersion protocolVersion, boolean packetDecoding) {
|
||||
PacketMapping(int id, ProtocolVersion protocolVersion, boolean packetDecoding) {
|
||||
this.id = id;
|
||||
this.protocolVersion = protocolVersion;
|
||||
this.encodeOnly = packetDecoding;
|
||||
|
@ -65,7 +65,12 @@ public class VelocityTabList implements TabList {
|
||||
return Optional.ofNullable(entry);
|
||||
}
|
||||
|
||||
public void clearAll() { // Note: this method is called upon server switch
|
||||
/**
|
||||
* Clears all entries from the tab list. Note that the entries are written with
|
||||
* {@link MinecraftConnection#delayedWrite(Object)}, so make sure to do an explicit
|
||||
* {@link MinecraftConnection#flush()}.
|
||||
*/
|
||||
public void clearAll() {
|
||||
List<PlayerListItem.Item> items = new ArrayList<>();
|
||||
for (TabListEntry value : entries.values()) {
|
||||
items.add(PlayerListItem.Item.from(value));
|
||||
@ -85,6 +90,10 @@ public class VelocityTabList implements TabList {
|
||||
return new VelocityTabListEntry(this, profile, displayName, latency, gameMode);
|
||||
}
|
||||
|
||||
/**
|
||||
* Processes a tab list entry packet from the backend.
|
||||
* @param packet the packet to process
|
||||
*/
|
||||
public void processBackendPacket(PlayerListItem packet) {
|
||||
// Packets are already forwarded on, so no need to do that here
|
||||
for (PlayerListItem.Item item : packet.getItems()) {
|
||||
|
Laden…
In neuem Issue referenzieren
Einen Benutzer sperren