From 703978e227ebf264cb257f772a0ede80b15c04ff Mon Sep 17 00:00:00 2001 From: KennyTV Date: Wed, 26 May 2021 21:35:28 +0200 Subject: [PATCH] Don't require UserConnection holding class in stored objects --- .../api/connection/StorableObject.java | 32 +++++++++++++++++++ .../api/connection/StoredObject.java | 2 +- .../api/connection/UserConnection.java | 10 +++--- .../api/minecraft/metadata/Metadata.java | 2 +- .../metadata/types/MetaType1_17.java | 3 +- .../bungee/handlers/BungeeServerHandler.java | 6 ++-- .../bungee/storage/BungeeStorage.java | 8 ++--- .../connection/UserConnectionImpl.java | 12 +++---- .../Protocol1_10To1_9_3_4.java | 2 +- .../storage/ResourcePackTracker.java | 9 ++---- .../Protocol1_13To1_12_2.java | 6 ++-- .../TabCompleteThread.java | 2 +- .../storage/BlockConnectionStorage.java | 9 ++---- .../storage/BlockStorage.java | 9 ++---- .../storage/TabCompleteTracker.java | 12 +++---- .../Protocol1_16To1_15_2.java | 2 +- .../storage/InventoryTracker1_16.java | 8 ++--- .../storage/ClientWorld.java | 4 +-- .../protocol1_9to1_8/Protocol1_9To1_8.java | 6 ++-- .../packets/InventoryPackets.java | 2 +- .../storage/ClientChunks.java | 4 +-- .../storage/CommandBlockStorage.java | 9 ++---- .../storage/InventoryTracker.java | 12 +++---- .../storage/MovementTracker.java | 9 ++---- .../velocity/storage/VelocityStorage.java | 8 ++--- 25 files changed, 90 insertions(+), 98 deletions(-) create mode 100644 api/src/main/java/com/viaversion/viaversion/api/connection/StorableObject.java diff --git a/api/src/main/java/com/viaversion/viaversion/api/connection/StorableObject.java b/api/src/main/java/com/viaversion/viaversion/api/connection/StorableObject.java new file mode 100644 index 000000000..6e56967a0 --- /dev/null +++ b/api/src/main/java/com/viaversion/viaversion/api/connection/StorableObject.java @@ -0,0 +1,32 @@ +/* + * This file is part of ViaVersion - https://github.com/ViaVersion/ViaVersion + * Copyright (C) 2016-2021 ViaVersion and contributors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package com.viaversion.viaversion.api.connection; + +/** + * Dummy interface used to explicitly identify objects storable in user connections. + * + * @see UserConnection#get(Class) + * @see UserConnection#put(StorableObject) + */ +public interface StorableObject { +} diff --git a/api/src/main/java/com/viaversion/viaversion/api/connection/StoredObject.java b/api/src/main/java/com/viaversion/viaversion/api/connection/StoredObject.java index 7c8bfd11c..bcbac2c83 100644 --- a/api/src/main/java/com/viaversion/viaversion/api/connection/StoredObject.java +++ b/api/src/main/java/com/viaversion/viaversion/api/connection/StoredObject.java @@ -22,7 +22,7 @@ */ package com.viaversion.viaversion.api.connection; -public abstract class StoredObject { +public abstract class StoredObject implements StorableObject { private final UserConnection user; protected StoredObject(UserConnection user) { diff --git a/api/src/main/java/com/viaversion/viaversion/api/connection/UserConnection.java b/api/src/main/java/com/viaversion/viaversion/api/connection/UserConnection.java index aa918e600..19fb593e0 100644 --- a/api/src/main/java/com/viaversion/viaversion/api/connection/UserConnection.java +++ b/api/src/main/java/com/viaversion/viaversion/api/connection/UserConnection.java @@ -48,7 +48,7 @@ public interface UserConnection { * @param The type of the class you want to get. * @return The requested object */ - @Nullable T get(Class objectClass); + @Nullable T get(Class objectClass); /** * Check if the storage has an object. @@ -56,14 +56,14 @@ public interface UserConnection { * @param objectClass The object class to check * @return True if the object is in the storage */ - boolean has(Class objectClass); + boolean has(Class objectClass); /** * Put an object into the stored objects based on class. * * @param object The object to store. */ - void put(StoredObject object); + void put(StorableObject object); /** * Returns a collection of entity trackers currently registered. @@ -266,9 +266,9 @@ public interface UserConnection { * @return map of stored objects * @see #has(Class) * @see #get(Class) - * @see #put(StoredObject) + * @see #put(StorableObject) */ - Map, StoredObject> getStoredObjects(); + Map, StorableObject> getStoredObjects(); /** * Returns whether the connection has protocols other than the base protocol applied. diff --git a/api/src/main/java/com/viaversion/viaversion/api/minecraft/metadata/Metadata.java b/api/src/main/java/com/viaversion/viaversion/api/minecraft/metadata/Metadata.java index 0bb54b28b..41ded9288 100644 --- a/api/src/main/java/com/viaversion/viaversion/api/minecraft/metadata/Metadata.java +++ b/api/src/main/java/com/viaversion/viaversion/api/minecraft/metadata/Metadata.java @@ -70,7 +70,7 @@ public final class Metadata { this.metaType = metaType; } - public T value() { + public @Nullable T value() { return (T) value; } diff --git a/api/src/main/java/com/viaversion/viaversion/api/minecraft/metadata/types/MetaType1_17.java b/api/src/main/java/com/viaversion/viaversion/api/minecraft/metadata/types/MetaType1_17.java index c495b1368..6c66f6a6d 100644 --- a/api/src/main/java/com/viaversion/viaversion/api/minecraft/metadata/types/MetaType1_17.java +++ b/api/src/main/java/com/viaversion/viaversion/api/minecraft/metadata/types/MetaType1_17.java @@ -47,6 +47,7 @@ public enum MetaType1_17 implements MetaType { OPT_VAR_INT(17, Type.OPTIONAL_VAR_INT), POSE(18, Type.VAR_INT); + private static final MetaType1_17[] VALUES = values(); private final int typeId; private final Type type; @@ -56,7 +57,7 @@ public enum MetaType1_17 implements MetaType { } public static MetaType1_17 byId(int id) { - return values()[id]; + return VALUES[id]; } @Override diff --git a/bungee/src/main/java/com/viaversion/viaversion/bungee/handlers/BungeeServerHandler.java b/bungee/src/main/java/com/viaversion/viaversion/bungee/handlers/BungeeServerHandler.java index 013a05bc5..d5e13288a 100644 --- a/bungee/src/main/java/com/viaversion/viaversion/bungee/handlers/BungeeServerHandler.java +++ b/bungee/src/main/java/com/viaversion/viaversion/bungee/handlers/BungeeServerHandler.java @@ -19,7 +19,7 @@ package com.viaversion.viaversion.bungee.handlers; import com.viaversion.viaversion.api.Via; import com.viaversion.viaversion.api.connection.ProtocolInfo; -import com.viaversion.viaversion.api.connection.StoredObject; +import com.viaversion.viaversion.api.connection.StorableObject; import com.viaversion.viaversion.api.connection.UserConnection; import com.viaversion.viaversion.api.data.entity.ClientEntityIdChangeListener; import com.viaversion.viaversion.api.data.entity.EntityTracker; @@ -90,7 +90,7 @@ public class BungeeServerHandler implements Listener { UserConnection user = Via.getManager().getConnectionManager().getConnectedClient(e.getPlayer().getUniqueId()); if (user == null) return; if (!user.has(BungeeStorage.class)) { - user.put(new BungeeStorage(user, e.getPlayer())); + user.put(new BungeeStorage(e.getPlayer())); } int protocolId = ProtocolDetectorService.getProtocolId(e.getTarget().getName()); @@ -132,7 +132,7 @@ public class BungeeServerHandler implements Listener { } // For ViaRewind - for (StoredObject object : userConnection.getStoredObjects().values()) { + for (StorableObject object : userConnection.getStoredObjects().values()) { if (object instanceof ClientEntityIdChangeListener) { ((ClientEntityIdChangeListener) object).setClientEntityId(playerId); } diff --git a/bungee/src/main/java/com/viaversion/viaversion/bungee/storage/BungeeStorage.java b/bungee/src/main/java/com/viaversion/viaversion/bungee/storage/BungeeStorage.java index c0f9486bf..487743421 100644 --- a/bungee/src/main/java/com/viaversion/viaversion/bungee/storage/BungeeStorage.java +++ b/bungee/src/main/java/com/viaversion/viaversion/bungee/storage/BungeeStorage.java @@ -17,8 +17,7 @@ */ package com.viaversion.viaversion.bungee.storage; -import com.viaversion.viaversion.api.connection.StoredObject; -import com.viaversion.viaversion.api.connection.UserConnection; +import com.viaversion.viaversion.api.connection.StorableObject; import net.md_5.bungee.api.connection.ProxiedPlayer; import java.lang.reflect.Field; @@ -26,7 +25,7 @@ import java.util.Objects; import java.util.Set; import java.util.UUID; -public class BungeeStorage extends StoredObject { +public class BungeeStorage implements StorableObject { private static Field bossField; static { @@ -45,8 +44,7 @@ public class BungeeStorage extends StoredObject { private String currentServer; private Set bossbar; - public BungeeStorage(UserConnection user, ProxiedPlayer player) { - super(user); + public BungeeStorage(ProxiedPlayer player) { this.player = player; this.currentServer = ""; diff --git a/common/src/main/java/com/viaversion/viaversion/connection/UserConnectionImpl.java b/common/src/main/java/com/viaversion/viaversion/connection/UserConnectionImpl.java index 67235f96f..04c678ad0 100644 --- a/common/src/main/java/com/viaversion/viaversion/connection/UserConnectionImpl.java +++ b/common/src/main/java/com/viaversion/viaversion/connection/UserConnectionImpl.java @@ -20,7 +20,7 @@ package com.viaversion.viaversion.connection; import com.google.common.cache.CacheBuilder; import com.viaversion.viaversion.api.Via; import com.viaversion.viaversion.api.connection.ProtocolInfo; -import com.viaversion.viaversion.api.connection.StoredObject; +import com.viaversion.viaversion.api.connection.StorableObject; import com.viaversion.viaversion.api.connection.UserConnection; import com.viaversion.viaversion.api.data.entity.EntityTracker; import com.viaversion.viaversion.api.protocol.Protocol; @@ -51,7 +51,7 @@ import java.util.function.Function; public class UserConnectionImpl implements UserConnection { private static final AtomicLong IDS = new AtomicLong(); private final long id = IDS.incrementAndGet(); - private final Map, StoredObject> storedObjects = new ConcurrentHashMap<>(); + private final Map, StorableObject> storedObjects = new ConcurrentHashMap<>(); private final Map, EntityTracker> entityTrackers = new HashMap<>(); private final PacketTracker packetTracker = new PacketTracker(this); private final Set passthroughTokens = Collections.newSetFromMap(CacheBuilder.newBuilder() @@ -82,17 +82,17 @@ public class UserConnectionImpl implements UserConnection { } @Override - public @Nullable T get(Class objectClass) { + public @Nullable T get(Class objectClass) { return (T) storedObjects.get(objectClass); } @Override - public boolean has(Class objectClass) { + public boolean has(Class objectClass) { return storedObjects.containsKey(objectClass); } @Override - public void put(StoredObject object) { + public void put(StorableObject object) { storedObjects.put(object.getClass(), object); } @@ -306,7 +306,7 @@ public class UserConnectionImpl implements UserConnection { } @Override - public Map, StoredObject> getStoredObjects() { + public Map, StorableObject> getStoredObjects() { return storedObjects; } diff --git a/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_10to1_9_3/Protocol1_10To1_9_3_4.java b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_10to1_9_3/Protocol1_10To1_9_3_4.java index e9e6888f1..443986fa1 100644 --- a/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_10to1_9_3/Protocol1_10To1_9_3_4.java +++ b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_10to1_9_3/Protocol1_10To1_9_3_4.java @@ -194,6 +194,6 @@ public class Protocol1_10To1_9_3_4 extends AbstractProtocol fastUtilLongObjectHashMap; @@ -56,10 +55,6 @@ public class BlockConnectionStorage extends StoredObject { } } - public BlockConnectionStorage(UserConnection user) { - super(user); - } - public void store(int x, int y, int z, int blockState) { short mapping = REVERSE_BLOCK_MAPPINGS[blockState]; if (mapping == -1) return; diff --git a/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_13to1_12_2/storage/BlockStorage.java b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_13to1_12_2/storage/BlockStorage.java index 0d0e1b93d..e27ee3cba 100644 --- a/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_13to1_12_2/storage/BlockStorage.java +++ b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_13to1_12_2/storage/BlockStorage.java @@ -17,8 +17,7 @@ */ package com.viaversion.viaversion.protocols.protocol1_13to1_12_2.storage; -import com.viaversion.viaversion.api.connection.StoredObject; -import com.viaversion.viaversion.api.connection.UserConnection; +import com.viaversion.viaversion.api.connection.StorableObject; import com.viaversion.viaversion.api.minecraft.Position; import it.unimi.dsi.fastutil.ints.IntOpenHashSet; import it.unimi.dsi.fastutil.ints.IntSet; @@ -26,7 +25,7 @@ import it.unimi.dsi.fastutil.ints.IntSet; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; -public class BlockStorage extends StoredObject { +public class BlockStorage implements StorableObject { private static final IntSet WHITELIST = new IntOpenHashSet(46, 1F); private final Map blocks = new ConcurrentHashMap<>(); @@ -55,10 +54,6 @@ public class BlockStorage extends StoredObject { } } - public BlockStorage(UserConnection user) { - super(user); - } - public void store(Position position, int block) { store(position, block, -1); } diff --git a/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_13to1_12_2/storage/TabCompleteTracker.java b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_13to1_12_2/storage/TabCompleteTracker.java index 170672b9e..ee06d8fa4 100644 --- a/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_13to1_12_2/storage/TabCompleteTracker.java +++ b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_13to1_12_2/storage/TabCompleteTracker.java @@ -17,25 +17,21 @@ */ package com.viaversion.viaversion.protocols.protocol1_13to1_12_2.storage; -import com.viaversion.viaversion.api.connection.StoredObject; +import com.viaversion.viaversion.api.connection.StorableObject; import com.viaversion.viaversion.api.connection.UserConnection; import com.viaversion.viaversion.api.protocol.packet.PacketWrapper; import com.viaversion.viaversion.api.type.Type; import com.viaversion.viaversion.protocols.protocol1_13to1_12_2.Protocol1_13To1_12_2; -public class TabCompleteTracker extends StoredObject { +public class TabCompleteTracker implements StorableObject { private int transactionId; private String input; private String lastTabComplete; private long timeToSend; - public TabCompleteTracker(UserConnection user) { - super(user); - } - - public void sendPacketToServer() { + public void sendPacketToServer(UserConnection connection) { if (lastTabComplete == null || timeToSend > System.currentTimeMillis()) return; - PacketWrapper wrapper = PacketWrapper.create(0x01, null, getUser()); + PacketWrapper wrapper = PacketWrapper.create(0x01, null, connection); wrapper.write(Type.STRING, lastTabComplete); wrapper.write(Type.BOOLEAN, false); wrapper.write(Type.OPTIONAL_POSITION, null); diff --git a/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_16to1_15_2/Protocol1_16To1_15_2.java b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_16to1_15_2/Protocol1_16To1_15_2.java index 4b7f1ec24..ad57a776d 100644 --- a/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_16to1_15_2/Protocol1_16To1_15_2.java +++ b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_16to1_15_2/Protocol1_16To1_15_2.java @@ -274,7 +274,7 @@ public class Protocol1_16To1_15_2 extends AbstractProtocol loadedChunks = Sets.newConcurrentHashSet(); private final Set bulkChunks = Sets.newConcurrentHashSet(); - public ClientChunks(UserConnection user) { - super(user); + public ClientChunks(UserConnection connection) { + super(connection); } public static long toLong(int msw, int lsw) { diff --git a/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_9to1_8/storage/CommandBlockStorage.java b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_9to1_8/storage/CommandBlockStorage.java index d2c09288f..237524ad0 100644 --- a/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_9to1_8/storage/CommandBlockStorage.java +++ b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_9to1_8/storage/CommandBlockStorage.java @@ -19,8 +19,7 @@ package com.viaversion.viaversion.protocols.protocol1_9to1_8.storage; import com.github.steveice10.opennbt.tag.builtin.ByteTag; import com.github.steveice10.opennbt.tag.builtin.CompoundTag; -import com.viaversion.viaversion.api.connection.StoredObject; -import com.viaversion.viaversion.api.connection.UserConnection; +import com.viaversion.viaversion.api.connection.StorableObject; import com.viaversion.viaversion.api.minecraft.Position; import com.viaversion.viaversion.util.Pair; @@ -28,14 +27,10 @@ import java.util.Map; import java.util.Optional; import java.util.concurrent.ConcurrentHashMap; -public class CommandBlockStorage extends StoredObject { +public class CommandBlockStorage implements StorableObject { private final Map, Map> storedCommandBlocks = new ConcurrentHashMap<>(); private boolean permissions = false; - public CommandBlockStorage(UserConnection user) { - super(user); - } - public void unloadChunk(int x, int z) { Pair chunkPos = new Pair<>(x, z); storedCommandBlocks.remove(chunkPos); diff --git a/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_9to1_8/storage/InventoryTracker.java b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_9to1_8/storage/InventoryTracker.java index 68e54c7bf..205216588 100644 --- a/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_9to1_8/storage/InventoryTracker.java +++ b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_9to1_8/storage/InventoryTracker.java @@ -17,24 +17,20 @@ */ package com.viaversion.viaversion.protocols.protocol1_9to1_8.storage; -import com.viaversion.viaversion.api.connection.StoredObject; +import com.viaversion.viaversion.api.connection.StorableObject; import com.viaversion.viaversion.api.connection.UserConnection; import com.viaversion.viaversion.protocols.protocol1_9to1_8.Protocol1_9To1_8; import java.util.HashMap; import java.util.Map; -public class InventoryTracker extends StoredObject { +public class InventoryTracker implements StorableObject { private String inventory; private final Map> windowItemCache = new HashMap<>(); private int itemIdInCursor = 0; private boolean dragging = false; - public InventoryTracker(UserConnection user) { - super(user); - } - public String getInventory() { return inventory; } @@ -83,8 +79,8 @@ public class InventoryTracker extends StoredObject { * @param hoverSlot The slot number of the current mouse position * @param button The button to use in the click */ - public void handleWindowClick(short windowId, byte mode, short hoverSlot, byte button) { - EntityTracker1_9 entityTracker = getUser().getEntityTracker(Protocol1_9To1_8.class); + public void handleWindowClick(UserConnection user, short windowId, byte mode, short hoverSlot, byte button) { + EntityTracker1_9 entityTracker = user.getEntityTracker(Protocol1_9To1_8.class); // Skip inventory background clicks if (hoverSlot == -1) { diff --git a/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_9to1_8/storage/MovementTracker.java b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_9to1_8/storage/MovementTracker.java index 259d2d0ee..8b7aa57d3 100644 --- a/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_9to1_8/storage/MovementTracker.java +++ b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_9to1_8/storage/MovementTracker.java @@ -17,19 +17,14 @@ */ package com.viaversion.viaversion.protocols.protocol1_9to1_8.storage; -import com.viaversion.viaversion.api.connection.StoredObject; -import com.viaversion.viaversion.api.connection.UserConnection; +import com.viaversion.viaversion.api.connection.StorableObject; -public class MovementTracker extends StoredObject { +public class MovementTracker implements StorableObject { private static final long IDLE_PACKET_DELAY = 50L; // Update every 50ms (20tps) private static final long IDLE_PACKET_LIMIT = 20; // Max 20 ticks behind private long nextIdlePacket = 0L; private boolean ground = true; - public MovementTracker(UserConnection user) { - super(user); - } - public void incrementIdlePacket() { // Notify of next update // Allow a maximum lag spike of 1 second (20 ticks/updates) diff --git a/velocity/src/main/java/com/viaversion/viaversion/velocity/storage/VelocityStorage.java b/velocity/src/main/java/com/viaversion/viaversion/velocity/storage/VelocityStorage.java index ea2bf5a6c..e33326ee4 100644 --- a/velocity/src/main/java/com/viaversion/viaversion/velocity/storage/VelocityStorage.java +++ b/velocity/src/main/java/com/viaversion/viaversion/velocity/storage/VelocityStorage.java @@ -18,8 +18,7 @@ package com.viaversion.viaversion.velocity.storage; import com.velocitypowered.api.proxy.Player; -import com.viaversion.viaversion.api.connection.StoredObject; -import com.viaversion.viaversion.api.connection.UserConnection; +import com.viaversion.viaversion.api.connection.StorableObject; import com.viaversion.viaversion.util.ReflectionUtil; import java.lang.reflect.InvocationTargetException; @@ -28,7 +27,7 @@ import java.util.List; import java.util.Objects; import java.util.UUID; -public class VelocityStorage extends StoredObject { +public class VelocityStorage implements StorableObject { private final Player player; private String currentServer; private List cachedBossbar; @@ -48,8 +47,7 @@ public class VelocityStorage extends StoredObject { } } - public VelocityStorage(UserConnection user, Player player) { - super(user); + public VelocityStorage(Player player) { this.player = player; this.currentServer = ""; }