Mirror von
https://github.com/ViaVersion/ViaVersion.git
synchronisiert 2024-11-20 15:00:09 +01:00
Minor optimizations in pipeline filling
Dieser Commit ist enthalten in:
Ursprung
144c24c276
Commit
d40ce9fc4a
@ -456,7 +456,8 @@ public class UserConnection {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns whether this is a client-side connection (a mod integrated into the client itself).
|
* Returns whether this is a client-side connection.
|
||||||
|
* This is a mod integrated into the client itself, or for example a backend Velocity connection.
|
||||||
*
|
*
|
||||||
* @return whether this is a client-side connection
|
* @return whether this is a client-side connection
|
||||||
*/
|
*/
|
||||||
|
@ -496,6 +496,15 @@ public abstract class Protocol<C1 extends ClientboundPacketType, C2 extends Clie
|
|||||||
return null; // Let the protocols hold the mappings to still have easy, static singleton access there
|
return null; // Let the protocols hold the mappings to still have easy, static singleton access there
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns whether this protocol is a base protocol.
|
||||||
|
*
|
||||||
|
* @return whether this represents a base protocol
|
||||||
|
*/
|
||||||
|
public boolean isBaseProtocol() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return "Protocol:" + getClass().getSimpleName();
|
return "Protocol:" + getClass().getSimpleName();
|
||||||
|
@ -46,10 +46,28 @@ public interface ProtocolManager {
|
|||||||
*/
|
*/
|
||||||
@Nullable Protocol getProtocol(Class<? extends Protocol> protocolClass);
|
@Nullable Protocol getProtocol(Class<? extends Protocol> protocolClass);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the base protocol handling incoming handshake packets.
|
||||||
|
*
|
||||||
|
* @return base protocol
|
||||||
|
*/
|
||||||
Protocol getBaseProtocol();
|
Protocol getBaseProtocol();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the base protocol for a specific server protocol version.
|
||||||
|
* The standard base protocols deal with status and login packets for userconnection initialization.
|
||||||
|
*
|
||||||
|
* @return base protocol for the given server protocol version
|
||||||
|
*/
|
||||||
Protocol getBaseProtocol(int serverVersion);
|
Protocol getBaseProtocol(int serverVersion);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns whether the given protocol is a base protocol.
|
||||||
|
*
|
||||||
|
* @param protocol protocol
|
||||||
|
* @return whether the protocol is a base protocol
|
||||||
|
* @see Protocol#isBaseProtocol()
|
||||||
|
*/
|
||||||
boolean isBaseProtocol(Protocol protocol);
|
boolean isBaseProtocol(Protocol protocol);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -76,6 +94,7 @@ public interface ProtocolManager {
|
|||||||
*
|
*
|
||||||
* @param baseProtocol base protocol to register
|
* @param baseProtocol base protocol to register
|
||||||
* @param supportedProtocols versions supported by the base protocol
|
* @param supportedProtocols versions supported by the base protocol
|
||||||
|
* @throws IllegalArgumentException if the protocol is not a base protocol as given by {@link Protocol#isBaseProtocol()}
|
||||||
*/
|
*/
|
||||||
void registerBaseProtocol(Protocol baseProtocol, Range<Integer> supportedProtocols);
|
void registerBaseProtocol(Protocol baseProtocol, Range<Integer> supportedProtocols);
|
||||||
|
|
||||||
|
@ -22,6 +22,7 @@
|
|||||||
*/
|
*/
|
||||||
package us.myles.ViaVersion.api.protocol;
|
package us.myles.ViaVersion.api.protocol;
|
||||||
|
|
||||||
|
import com.google.common.base.Preconditions;
|
||||||
import us.myles.ViaVersion.api.PacketWrapper;
|
import us.myles.ViaVersion.api.PacketWrapper;
|
||||||
import us.myles.ViaVersion.api.Via;
|
import us.myles.ViaVersion.api.Via;
|
||||||
import us.myles.ViaVersion.api.data.UserConnection;
|
import us.myles.ViaVersion.api.data.UserConnection;
|
||||||
@ -36,6 +37,9 @@ import java.util.concurrent.CopyOnWriteArrayList;
|
|||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
|
|
||||||
public class ProtocolPipeline extends SimpleProtocol {
|
public class ProtocolPipeline extends SimpleProtocol {
|
||||||
|
/**
|
||||||
|
* Protocol list ordered from client to server transforation with the base protocols at the end.
|
||||||
|
*/
|
||||||
private List<Protocol> protocolList;
|
private List<Protocol> protocolList;
|
||||||
private UserConnection userConnection;
|
private UserConnection userConnection;
|
||||||
|
|
||||||
@ -66,26 +70,55 @@ public class ProtocolPipeline extends SimpleProtocol {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Add a protocol to the current pipeline
|
* Adds a protocol to the current pipeline.
|
||||||
* This will call the {@link Protocol#init(UserConnection)} method.
|
* This will call the {@link Protocol#init(UserConnection)} method.
|
||||||
*
|
*
|
||||||
* @param protocol The protocol to add to the end
|
* @param protocol protocol to add to the end
|
||||||
*/
|
*/
|
||||||
public void add(Protocol protocol) {
|
public void add(Protocol protocol) {
|
||||||
if (protocolList != null) {
|
Preconditions.checkNotNull(protocolList, "Tried to add protocol too early");
|
||||||
|
|
||||||
protocolList.add(protocol);
|
protocolList.add(protocol);
|
||||||
protocol.init(userConnection);
|
protocol.init(userConnection);
|
||||||
|
|
||||||
|
if (!protocol.isBaseProtocol()) {
|
||||||
|
moveBaseProtocolsToTail();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds a list of protocols to the current pipeline.
|
||||||
|
* This will call the {@link Protocol#init(UserConnection)} method.
|
||||||
|
*
|
||||||
|
* @param protocols protocols to add to the end
|
||||||
|
*/
|
||||||
|
public void add(List<Protocol> protocols) {
|
||||||
|
Preconditions.checkNotNull(protocolList, "Tried to add protocol too early");
|
||||||
|
|
||||||
|
protocolList.addAll(protocols);
|
||||||
|
for (Protocol protocol : protocols) {
|
||||||
|
protocol.init(userConnection);
|
||||||
|
}
|
||||||
|
|
||||||
|
moveBaseProtocolsToTail();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void moveBaseProtocolsToTail() {
|
||||||
// Move base Protocols to the end, so the login packets can be modified by other protocols
|
// Move base Protocols to the end, so the login packets can be modified by other protocols
|
||||||
List<Protocol> toMove = new ArrayList<>();
|
List<Protocol> baseProtocols = null;
|
||||||
for (Protocol p : protocolList) {
|
for (Protocol protocol : protocolList) {
|
||||||
if (Via.getManager().getProtocolManager().isBaseProtocol(p)) {
|
if (protocol.isBaseProtocol()) {
|
||||||
toMove.add(p);
|
if (baseProtocols == null) {
|
||||||
|
baseProtocols = new ArrayList<>();
|
||||||
|
}
|
||||||
|
|
||||||
|
baseProtocols.add(protocol);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
protocolList.removeAll(toMove);
|
|
||||||
protocolList.addAll(toMove);
|
if (baseProtocols != null) {
|
||||||
} else {
|
protocolList.removeAll(baseProtocols);
|
||||||
throw new NullPointerException("Tried to add protocol too early");
|
protocolList.addAll(baseProtocols);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -47,6 +47,7 @@ import java.lang.reflect.Field;
|
|||||||
import java.lang.reflect.InvocationTargetException;
|
import java.lang.reflect.InvocationTargetException;
|
||||||
import java.lang.reflect.Method;
|
import java.lang.reflect.Method;
|
||||||
import java.nio.charset.StandardCharsets;
|
import java.nio.charset.StandardCharsets;
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
@ -175,17 +176,19 @@ public class BungeeServerHandler implements Listener {
|
|||||||
int previousServerProtocol = info.getServerProtocolVersion();
|
int previousServerProtocol = info.getServerProtocolVersion();
|
||||||
|
|
||||||
// Refresh the pipes
|
// Refresh the pipes
|
||||||
List<ProtocolPathEntry> protocols = Via.getManager().getProtocolManager().getProtocolPath(info.getProtocolVersion(), protocolId);
|
List<ProtocolPathEntry> protocolPath = Via.getManager().getProtocolManager().getProtocolPath(info.getProtocolVersion(), protocolId);
|
||||||
ProtocolPipeline pipeline = user.getProtocolInfo().getPipeline();
|
ProtocolPipeline pipeline = user.getProtocolInfo().getPipeline();
|
||||||
user.clearStoredObjects();
|
user.clearStoredObjects();
|
||||||
pipeline.cleanPipes();
|
pipeline.cleanPipes();
|
||||||
if (protocols == null) {
|
if (protocolPath == null) {
|
||||||
// TODO Check Bungee Supported Protocols? *shrugs*
|
// TODO Check Bungee Supported Protocols? *shrugs*
|
||||||
protocolId = info.getProtocolVersion();
|
protocolId = info.getProtocolVersion();
|
||||||
} else {
|
} else {
|
||||||
for (ProtocolPathEntry prot : protocols) {
|
List<Protocol> protocols = new ArrayList<>(protocolPath.size());
|
||||||
pipeline.add(prot.getProtocol());
|
for (ProtocolPathEntry entry : protocolPath) {
|
||||||
|
protocols.add(entry.getProtocol());
|
||||||
}
|
}
|
||||||
|
pipeline.add(protocols);
|
||||||
}
|
}
|
||||||
|
|
||||||
info.setServerProtocolVersion(protocolId);
|
info.setServerProtocolVersion(protocolId);
|
||||||
@ -230,7 +233,7 @@ public class BungeeServerHandler implements Listener {
|
|||||||
user.put(info);
|
user.put(info);
|
||||||
user.put(storage);
|
user.put(storage);
|
||||||
|
|
||||||
user.setActive(protocols != null);
|
user.setActive(protocolPath != null);
|
||||||
|
|
||||||
// Init all protocols TODO check if this can get moved up to the previous for loop, and doesn't require the pipeline to already exist.
|
// Init all protocols TODO check if this can get moved up to the previous for loop, and doesn't require the pipeline to already exist.
|
||||||
for (Protocol protocol : pipeline.pipes()) {
|
for (Protocol protocol : pipeline.pipes()) {
|
||||||
|
@ -80,7 +80,7 @@ import java.util.concurrent.locks.ReentrantReadWriteLock;
|
|||||||
import java.util.function.Function;
|
import java.util.function.Function;
|
||||||
|
|
||||||
public class ProtocolManagerImpl implements ProtocolManager {
|
public class ProtocolManagerImpl implements ProtocolManager {
|
||||||
public static final Protocol BASE_PROTOCOL = new BaseProtocol();
|
private static final Protocol BASE_PROTOCOL = new BaseProtocol();
|
||||||
|
|
||||||
// Input Version -> Output Version & Protocol (Allows fast lookup)
|
// Input Version -> Output Version & Protocol (Allows fast lookup)
|
||||||
private final Int2ObjectMap<Int2ObjectMap<Protocol>> registryMap = new Int2ObjectOpenHashMap<>(32);
|
private final Int2ObjectMap<Int2ObjectMap<Protocol>> registryMap = new Int2ObjectOpenHashMap<>(32);
|
||||||
@ -187,6 +187,7 @@ public class ProtocolManagerImpl implements ProtocolManager {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void registerBaseProtocol(Protocol baseProtocol, Range<Integer> supportedProtocols) {
|
public void registerBaseProtocol(Protocol baseProtocol, Range<Integer> supportedProtocols) {
|
||||||
|
Preconditions.checkArgument(baseProtocol.isBaseProtocol(), "Protocol is not a base protocol");
|
||||||
baseProtocols.add(new Pair<>(supportedProtocols, baseProtocol));
|
baseProtocols.add(new Pair<>(supportedProtocols, baseProtocol));
|
||||||
if (Via.getPlatform().isPluginEnabled()) {
|
if (Via.getPlatform().isPluginEnabled()) {
|
||||||
baseProtocol.register(Via.getManager().getProviders());
|
baseProtocol.register(Via.getManager().getProviders());
|
||||||
@ -297,12 +298,7 @@ public class ProtocolManagerImpl implements ProtocolManager {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean isBaseProtocol(Protocol protocol) {
|
public boolean isBaseProtocol(Protocol protocol) {
|
||||||
for (Pair<Range<Integer>, Protocol> p : baseProtocols) {
|
return protocol.isBaseProtocol();
|
||||||
if (p.getValue() == protocol) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -21,6 +21,7 @@ import us.myles.ViaVersion.api.PacketWrapper;
|
|||||||
import us.myles.ViaVersion.api.Via;
|
import us.myles.ViaVersion.api.Via;
|
||||||
import us.myles.ViaVersion.api.data.UserConnection;
|
import us.myles.ViaVersion.api.data.UserConnection;
|
||||||
import us.myles.ViaVersion.api.platform.providers.ViaProviders;
|
import us.myles.ViaVersion.api.platform.providers.ViaProviders;
|
||||||
|
import us.myles.ViaVersion.api.protocol.Protocol;
|
||||||
import us.myles.ViaVersion.api.protocol.ProtocolPathEntry;
|
import us.myles.ViaVersion.api.protocol.ProtocolPathEntry;
|
||||||
import us.myles.ViaVersion.api.protocol.ProtocolPipeline;
|
import us.myles.ViaVersion.api.protocol.ProtocolPipeline;
|
||||||
import us.myles.ViaVersion.api.protocol.ProtocolVersion;
|
import us.myles.ViaVersion.api.protocol.ProtocolVersion;
|
||||||
@ -30,6 +31,7 @@ import us.myles.ViaVersion.api.type.Type;
|
|||||||
import us.myles.ViaVersion.packets.Direction;
|
import us.myles.ViaVersion.packets.Direction;
|
||||||
import us.myles.ViaVersion.packets.State;
|
import us.myles.ViaVersion.packets.State;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
public class BaseProtocol extends SimpleProtocol {
|
public class BaseProtocol extends SimpleProtocol {
|
||||||
@ -59,21 +61,26 @@ public class BaseProtocol extends SimpleProtocol {
|
|||||||
// Choose the pipe
|
// Choose the pipe
|
||||||
int serverProtocol = Via.getManager().getProviders().get(VersionProvider.class).getClosestServerProtocol(wrapper.user());
|
int serverProtocol = Via.getManager().getProviders().get(VersionProvider.class).getClosestServerProtocol(wrapper.user());
|
||||||
info.setServerProtocolVersion(serverProtocol);
|
info.setServerProtocolVersion(serverProtocol);
|
||||||
List<ProtocolPathEntry> protocols = null;
|
List<ProtocolPathEntry> protocolPath = null;
|
||||||
|
|
||||||
// Only allow newer clients or (1.9.2 on 1.9.4 server if the server supports it)
|
// Only allow newer clients (or 1.9.2 on 1.9.4 server if the server supports it)
|
||||||
if (info.getProtocolVersion() >= serverProtocol || Via.getPlatform().isOldClientsAllowed()) {
|
if (info.getProtocolVersion() >= serverProtocol || Via.getPlatform().isOldClientsAllowed()) {
|
||||||
protocols = Via.getManager().getProtocolManager().getProtocolPath(info.getProtocolVersion(), serverProtocol);
|
protocolPath = Via.getManager().getProtocolManager().getProtocolPath(info.getProtocolVersion(), serverProtocol);
|
||||||
}
|
}
|
||||||
|
|
||||||
ProtocolPipeline pipeline = wrapper.user().getProtocolInfo().getPipeline();
|
ProtocolPipeline pipeline = wrapper.user().getProtocolInfo().getPipeline();
|
||||||
if (protocols != null) {
|
if (protocolPath != null) {
|
||||||
for (ProtocolPathEntry prot : protocols) {
|
List<Protocol> protocols = new ArrayList<>(protocolPath.size());
|
||||||
pipeline.add(prot.getProtocol());
|
for (ProtocolPathEntry entry : protocolPath) {
|
||||||
|
protocols.add(entry.getProtocol());
|
||||||
|
|
||||||
// Ensure mapping data has already been loaded
|
// Ensure mapping data has already been loaded
|
||||||
Via.getManager().getProtocolManager().completeMappingDataLoading(prot.getProtocol().getClass());
|
Via.getManager().getProtocolManager().completeMappingDataLoading(entry.getProtocol().getClass());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Add protocols to pipeline
|
||||||
|
pipeline.add(protocols);
|
||||||
|
|
||||||
// Set the original snapshot version if present
|
// Set the original snapshot version if present
|
||||||
ProtocolVersion protocol = ProtocolVersion.getProtocol(serverProtocol);
|
ProtocolVersion protocol = ProtocolVersion.getProtocol(serverProtocol);
|
||||||
wrapper.set(Type.VAR_INT, 0, protocol.getOriginalVersion());
|
wrapper.set(Type.VAR_INT, 0, protocol.getOriginalVersion());
|
||||||
@ -94,6 +101,11 @@ public class BaseProtocol extends SimpleProtocol {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isBaseProtocol() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void init(UserConnection userConnection) {
|
public void init(UserConnection userConnection) {
|
||||||
// Nothing gets added, ProtocolPipeline handles ProtocolInfo
|
// Nothing gets added, ProtocolPipeline handles ProtocolInfo
|
||||||
|
@ -199,6 +199,11 @@ public class BaseProtocol1_7 extends SimpleProtocol {
|
|||||||
registerIncoming(State.LOGIN, 0x02, 0x02); // Plugin Response (1.13)
|
registerIncoming(State.LOGIN, 0x02, 0x02); // Plugin Response (1.13)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isBaseProtocol() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
public static String addDashes(String trimmedUUID) {
|
public static String addDashes(String trimmedUUID) {
|
||||||
StringBuilder idBuff = new StringBuilder(trimmedUUID);
|
StringBuilder idBuff = new StringBuilder(trimmedUUID);
|
||||||
idBuff.insert(20, '-');
|
idBuff.insert(20, '-');
|
||||||
|
Laden…
In neuem Issue referenzieren
Einen Benutzer sperren