From 53b8c2328e9b6427bcd94a7140c7d12e3fd8dfd3 Mon Sep 17 00:00:00 2001 From: KennyTV Date: Thu, 23 Apr 2020 20:17:09 +0200 Subject: [PATCH 1/8] Uncache UserConnection on channel close, fix memory leak --- .../multiversion/PlayerSneakListener.java | 2 +- .../bukkit/platform/BukkitViaLoader.java | 9 -- .../us/myles/ViaVersion/BungeePlugin.java | 27 ++-- .../ViaVersion/api/data/UserConnection.java | 124 ++++++++++++++++-- .../api/platform/ViaConnectionManager.java | 3 + .../protocols/base/ProtocolInfo.java | 11 ++ .../sponge/listeners/ClientLeaveListener.java | 12 -- .../sponge/platform/SpongeViaLoader.java | 3 - .../us/myles/ViaVersion/VelocityPlugin.java | 23 ++-- 9 files changed, 147 insertions(+), 67 deletions(-) delete mode 100644 sponge/src/main/java/us/myles/ViaVersion/sponge/listeners/ClientLeaveListener.java diff --git a/bukkit/src/main/java/us/myles/ViaVersion/bukkit/listeners/multiversion/PlayerSneakListener.java b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/listeners/multiversion/PlayerSneakListener.java index b1172b884..45a66eb9a 100644 --- a/bukkit/src/main/java/us/myles/ViaVersion/bukkit/listeners/multiversion/PlayerSneakListener.java +++ b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/listeners/multiversion/PlayerSneakListener.java @@ -27,7 +27,7 @@ public class PlayerSneakListener extends ViaBukkitListener { private final boolean is1_14Fix; private Map sneaking; // true = 1.14+, else false private Set sneakingUuids; - private Method getHandle; + private final Method getHandle; private Method setSize; private boolean useCache; diff --git a/bukkit/src/main/java/us/myles/ViaVersion/bukkit/platform/BukkitViaLoader.java b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/platform/BukkitViaLoader.java index 52cb7a638..7c80e7652 100644 --- a/bukkit/src/main/java/us/myles/ViaVersion/bukkit/platform/BukkitViaLoader.java +++ b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/platform/BukkitViaLoader.java @@ -2,10 +2,8 @@ package us.myles.ViaVersion.bukkit.platform; import org.bukkit.Bukkit; import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; import org.bukkit.event.HandlerList; import org.bukkit.event.Listener; -import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.scheduler.BukkitTask; import us.myles.ViaVersion.ViaVersionPlugin; import us.myles.ViaVersion.api.Via; @@ -73,13 +71,6 @@ public class BukkitViaLoader implements ViaPlatformLoader { // Add ProtocolSupport ConnectListener if necessary. ClassGenerator.registerPSConnectListener(plugin); - registerListener(new Listener() { - @EventHandler - public void onPlayerQuit(PlayerQuitEvent e) { - Via.getManager().handleDisconnect(e.getPlayer().getUniqueId()); - } - }); - /* 1.9 client to 1.8 server */ if (ProtocolRegistry.SERVER_PROTOCOL < ProtocolVersion.v1_9.getId()) { storeListener(new ArmorListener(plugin)).register(); diff --git a/bungee/src/main/java/us/myles/ViaVersion/BungeePlugin.java b/bungee/src/main/java/us/myles/ViaVersion/BungeePlugin.java index 2522d191c..55ed1227e 100644 --- a/bungee/src/main/java/us/myles/ViaVersion/BungeePlugin.java +++ b/bungee/src/main/java/us/myles/ViaVersion/BungeePlugin.java @@ -2,31 +2,34 @@ package us.myles.ViaVersion; import com.google.gson.JsonObject; import net.md_5.bungee.api.ProxyServer; -import net.md_5.bungee.api.chat.TextComponent; import net.md_5.bungee.api.connection.ProxiedPlayer; -import net.md_5.bungee.api.event.PlayerDisconnectEvent; import net.md_5.bungee.api.plugin.Listener; import net.md_5.bungee.api.plugin.Plugin; -import net.md_5.bungee.event.EventHandler; import net.md_5.bungee.protocol.ProtocolConstants; import us.myles.ViaVersion.api.Via; import us.myles.ViaVersion.api.ViaAPI; import us.myles.ViaVersion.api.command.ViaCommandSender; import us.myles.ViaVersion.api.configuration.ConfigurationProvider; import us.myles.ViaVersion.api.data.MappingDataLoader; -import us.myles.ViaVersion.api.data.UserConnection; import us.myles.ViaVersion.api.platform.TaskId; import us.myles.ViaVersion.api.platform.ViaConnectionManager; import us.myles.ViaVersion.api.platform.ViaPlatform; import us.myles.ViaVersion.bungee.commands.BungeeCommand; import us.myles.ViaVersion.bungee.commands.BungeeCommandHandler; import us.myles.ViaVersion.bungee.commands.BungeeCommandSender; -import us.myles.ViaVersion.bungee.platform.*; +import us.myles.ViaVersion.bungee.platform.BungeeTaskId; +import us.myles.ViaVersion.bungee.platform.BungeeViaAPI; +import us.myles.ViaVersion.bungee.platform.BungeeViaConfig; +import us.myles.ViaVersion.bungee.platform.BungeeViaInjector; +import us.myles.ViaVersion.bungee.platform.BungeeViaLoader; import us.myles.ViaVersion.bungee.service.ProtocolDetectorService; import us.myles.ViaVersion.dump.PluginInfo; import us.myles.ViaVersion.util.GsonUtil; -import java.util.*; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.UUID; import java.util.concurrent.TimeUnit; public class BungeePlugin extends Plugin implements ViaPlatform, Listener { @@ -193,16 +196,4 @@ public class BungeePlugin extends Plugin implements ViaPlatform, public ViaConnectionManager getConnectionManager() { return connectionManager; } - - @EventHandler - public void onQuit(PlayerDisconnectEvent e) { - UserConnection userConnection = getConnectionManager().getConnectedClient(e.getPlayer().getUniqueId()); - if (userConnection != null) { - // Only remove if the connection is disconnected (eg. relogin) - if (userConnection.getChannel() == null || !userConnection.getChannel().isOpen()) { - Via.getManager().handleDisconnect(e.getPlayer().getUniqueId()); - } - } - - } } diff --git a/common/src/main/java/us/myles/ViaVersion/api/data/UserConnection.java b/common/src/main/java/us/myles/ViaVersion/api/data/UserConnection.java index dab0fc13c..0221bd197 100644 --- a/common/src/main/java/us/myles/ViaVersion/api/data/UserConnection.java +++ b/common/src/main/java/us/myles/ViaVersion/api/data/UserConnection.java @@ -5,7 +5,6 @@ import io.netty.channel.Channel; import io.netty.channel.ChannelFuture; import io.netty.channel.ChannelHandler; import io.netty.channel.ChannelHandlerContext; -import lombok.Data; import net.md_5.bungee.api.ChatColor; import us.myles.ViaVersion.api.PacketWrapper; import us.myles.ViaVersion.api.Via; @@ -17,23 +16,25 @@ import us.myles.ViaVersion.util.PipelineUtil; import java.util.Map; import java.util.UUID; import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.atomic.AtomicLong; -@Data public class UserConnection { + private static final AtomicLong IDS = new AtomicLong(); + private final long id = IDS.incrementAndGet(); private final Channel channel; Map storedObjects = new ConcurrentHashMap<>(); private boolean active = true; - private boolean pendingDisconnect = false; + private boolean pendingDisconnect; private Object lastPacket; - private long sentPackets = 0L; - private long receivedPackets = 0L; + private long sentPackets; + private long receivedPackets; // Used for tracking pps - private long startTime = 0L; - private long intervalPackets = 0L; + private long startTime; + private long intervalPackets; private long packetsPerSecond = -1L; // Used for handling warnings (over time) - private int secondsObserved = 0; - private int warnings = 0; + private int secondsObserved; + private int warnings; public UserConnection(Channel channel) { this.channel = channel; @@ -242,4 +243,109 @@ public class UserConnection { public void sendRawPacketToServer(ByteBuf packet) { sendRawPacketToServer(packet, false); } + + public long getId() { + return id; + } + + public Channel getChannel() { + return channel; + } + + public Map getStoredObjects() { + return storedObjects; + } + + public boolean isActive() { + return active; + } + + public void setActive(boolean active) { + this.active = active; + } + + public boolean isPendingDisconnect() { + return pendingDisconnect; + } + + public void setPendingDisconnect(boolean pendingDisconnect) { + this.pendingDisconnect = pendingDisconnect; + } + + public Object getLastPacket() { + return lastPacket; + } + + public void setLastPacket(Object lastPacket) { + this.lastPacket = lastPacket; + } + + public long getSentPackets() { + return sentPackets; + } + + public void setSentPackets(long sentPackets) { + this.sentPackets = sentPackets; + } + + public long getReceivedPackets() { + return receivedPackets; + } + + public void setReceivedPackets(long receivedPackets) { + this.receivedPackets = receivedPackets; + } + + public long getStartTime() { + return startTime; + } + + public void setStartTime(long startTime) { + this.startTime = startTime; + } + + public long getIntervalPackets() { + return intervalPackets; + } + + public void setIntervalPackets(long intervalPackets) { + this.intervalPackets = intervalPackets; + } + + public long getPacketsPerSecond() { + return packetsPerSecond; + } + + public void setPacketsPerSecond(long packetsPerSecond) { + this.packetsPerSecond = packetsPerSecond; + } + + public int getSecondsObserved() { + return secondsObserved; + } + + public void setSecondsObserved(int secondsObserved) { + this.secondsObserved = secondsObserved; + } + + public int getWarnings() { + return warnings; + } + + public void setWarnings(int warnings) { + this.warnings = warnings; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + UserConnection that = (UserConnection) o; + return id == that.id; + } + + @Override + public int hashCode() { + return Long.hashCode(id); + } } diff --git a/common/src/main/java/us/myles/ViaVersion/api/platform/ViaConnectionManager.java b/common/src/main/java/us/myles/ViaVersion/api/platform/ViaConnectionManager.java index cb7ea10fe..77ac1b6e1 100644 --- a/common/src/main/java/us/myles/ViaVersion/api/platform/ViaConnectionManager.java +++ b/common/src/main/java/us/myles/ViaVersion/api/platform/ViaConnectionManager.java @@ -1,5 +1,6 @@ package us.myles.ViaVersion.api.platform; +import io.netty.channel.ChannelFutureListener; import us.myles.ViaVersion.api.data.UserConnection; import us.myles.ViaVersion.protocols.base.ProtocolInfo; @@ -18,6 +19,8 @@ public class ViaConnectionManager { UUID id = connection.get(ProtocolInfo.class).getUuid(); connections.add(connection); clients.put(id, connection); + + connection.getChannel().closeFuture().addListener((ChannelFutureListener) future -> onDisconnect(connection)); } public void onDisconnect(UserConnection connection) { diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/base/ProtocolInfo.java b/common/src/main/java/us/myles/ViaVersion/protocols/base/ProtocolInfo.java index 565eab34b..a2827538c 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/base/ProtocolInfo.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/base/ProtocolInfo.java @@ -66,4 +66,15 @@ public class ProtocolInfo extends StoredObject { public void setPipeline(ProtocolPipeline pipeline) { this.pipeline = pipeline; } + + @Override + public String toString() { + return "ProtocolInfo{" + + "state=" + state + + ", protocolVersion=" + protocolVersion + + ", serverProtocolVersion=" + serverProtocolVersion + + ", username='" + username + '\'' + + ", uuid=" + uuid + + '}'; + } } diff --git a/sponge/src/main/java/us/myles/ViaVersion/sponge/listeners/ClientLeaveListener.java b/sponge/src/main/java/us/myles/ViaVersion/sponge/listeners/ClientLeaveListener.java deleted file mode 100644 index 874ab3429..000000000 --- a/sponge/src/main/java/us/myles/ViaVersion/sponge/listeners/ClientLeaveListener.java +++ /dev/null @@ -1,12 +0,0 @@ -package us.myles.ViaVersion.sponge.listeners; - -import org.spongepowered.api.event.Listener; -import org.spongepowered.api.event.network.ClientConnectionEvent; -import us.myles.ViaVersion.api.Via; - -public class ClientLeaveListener { - @Listener - public void onDisconnect(ClientConnectionEvent.Disconnect disconnect) { - Via.getManager().handleDisconnect(disconnect.getTargetEntity().getUniqueId()); - } -} diff --git a/sponge/src/main/java/us/myles/ViaVersion/sponge/platform/SpongeViaLoader.java b/sponge/src/main/java/us/myles/ViaVersion/sponge/platform/SpongeViaLoader.java index cc8ecfe1d..e73a8b7df 100644 --- a/sponge/src/main/java/us/myles/ViaVersion/sponge/platform/SpongeViaLoader.java +++ b/sponge/src/main/java/us/myles/ViaVersion/sponge/platform/SpongeViaLoader.java @@ -13,7 +13,6 @@ import us.myles.ViaVersion.protocols.base.ProtocolInfo; import us.myles.ViaVersion.protocols.protocol1_9to1_8.providers.BulkChunkTranslatorProvider; import us.myles.ViaVersion.protocols.protocol1_9to1_8.providers.HandItemProvider; import us.myles.ViaVersion.protocols.protocol1_9to1_8.providers.MovementTransmitterProvider; -import us.myles.ViaVersion.sponge.listeners.ClientLeaveListener; import us.myles.ViaVersion.sponge.listeners.UpdateListener; import us.myles.ViaVersion.sponge.listeners.protocol1_9to1_8.BlockListener; import us.myles.ViaVersion.sponge.listeners.protocol1_9to1_8.DeathListener; @@ -50,8 +49,6 @@ public class SpongeViaLoader implements ViaPlatformLoader { public void load() { // Update Listener registerListener(new UpdateListener()); - /* Base Protocol */ - registerListener(new ClientLeaveListener()); /* 1.9 client to 1.8 server */ if (ProtocolRegistry.SERVER_PROTOCOL < ProtocolVersion.v1_9.getId()) { diff --git a/velocity/src/main/java/us/myles/ViaVersion/VelocityPlugin.java b/velocity/src/main/java/us/myles/ViaVersion/VelocityPlugin.java index 1637eecd1..70bbd800f 100644 --- a/velocity/src/main/java/us/myles/ViaVersion/VelocityPlugin.java +++ b/velocity/src/main/java/us/myles/ViaVersion/VelocityPlugin.java @@ -3,7 +3,6 @@ package us.myles.ViaVersion; import com.google.gson.JsonObject; import com.google.inject.Inject; import com.velocitypowered.api.event.Subscribe; -import com.velocitypowered.api.event.connection.DisconnectEvent; import com.velocitypowered.api.event.proxy.ProxyInitializeEvent; import com.velocitypowered.api.plugin.Plugin; import com.velocitypowered.api.plugin.PluginContainer; @@ -18,7 +17,6 @@ import us.myles.ViaVersion.api.Via; import us.myles.ViaVersion.api.command.ViaCommandSender; import us.myles.ViaVersion.api.configuration.ConfigurationProvider; import us.myles.ViaVersion.api.data.MappingDataLoader; -import us.myles.ViaVersion.api.data.UserConnection; import us.myles.ViaVersion.api.platform.TaskId; import us.myles.ViaVersion.api.platform.ViaConnectionManager; import us.myles.ViaVersion.api.platform.ViaPlatform; @@ -27,13 +25,19 @@ import us.myles.ViaVersion.util.GsonUtil; import us.myles.ViaVersion.velocity.VersionInfo; import us.myles.ViaVersion.velocity.command.VelocityCommandHandler; import us.myles.ViaVersion.velocity.command.VelocityCommandSender; -import us.myles.ViaVersion.velocity.platform.*; +import us.myles.ViaVersion.velocity.platform.VelocityTaskId; +import us.myles.ViaVersion.velocity.platform.VelocityViaAPI; +import us.myles.ViaVersion.velocity.platform.VelocityViaConfig; +import us.myles.ViaVersion.velocity.platform.VelocityViaInjector; +import us.myles.ViaVersion.velocity.platform.VelocityViaLoader; import us.myles.ViaVersion.velocity.service.ProtocolDetectorService; import us.myles.ViaVersion.velocity.util.LoggerWrapper; import java.io.File; import java.nio.file.Path; -import java.util.*; +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; import java.util.concurrent.TimeUnit; @Plugin( @@ -82,17 +86,6 @@ public class VelocityPlugin implements ViaPlatform { Via.getManager().init(); } - @Subscribe - public void onQuit(DisconnectEvent e) { - UserConnection userConnection = connectionManager.getConnectedClient(e.getPlayer().getUniqueId()); - if (userConnection != null) { - // Only remove if the connection is disconnected (eg. relogin) - if (userConnection.getChannel() == null || !userConnection.getChannel().isOpen()) { - Via.getManager().handleDisconnect(e.getPlayer().getUniqueId()); - } - } - } - @Override public String getPlatformName() { String proxyImpl = ProxyServer.class.getPackage().getImplementationTitle(); From 762c66ff42a8a0ad90589f4a6128b9860d5d1701 Mon Sep 17 00:00:00 2001 From: KennyTV Date: Thu, 23 Apr 2020 21:07:12 +0200 Subject: [PATCH 2/8] Farewell, lombok! --- .../bungee/platform/BungeeViaAPI.java | 6 +-- .../service/ProtocolDetectorService.java | 11 +++-- .../bungee/storage/BungeeStorage.java | 21 +++++++- .../java/us/myles/ViaVersion/ViaManager.java | 48 ++++++++++++++----- .../api/entities/Entity1_10Types.java | 36 +++++++++++--- .../api/entities/Entity1_11Types.java | 36 +++++++++++--- .../api/entities/Entity1_12Types.java | 36 +++++++++++--- .../api/entities/Entity1_13Types.java | 36 +++++++++++--- .../api/entities/Entity1_14Types.java | 19 ++++++-- .../api/entities/Entity1_15Types.java | 20 ++++++-- .../api/entities/Entity1_16Types.java | 20 ++++++-- .../metadata/types/MetaType1_12.java | 18 +++++-- .../metadata/types/MetaType1_13.java | 18 +++++-- .../metadata/types/MetaType1_13_2.java | 18 +++++-- .../metadata/types/MetaType1_14.java | 18 +++++-- .../minecraft/metadata/types/MetaType1_8.java | 19 ++++++-- .../minecraft/metadata/types/MetaType1_9.java | 18 +++++-- .../storage/EntityTracker1_14.java | 40 ++++++++++++---- .../myles/ViaVersion/util/ConcurrentList.java | 27 +++++++---- pom.xml | 8 ---- sponge/pom.xml | 11 ++++- .../sponge/platform/SpongeBossBar.java | 2 - .../velocity/storage/VelocityStorage.java | 21 +++++++- 23 files changed, 392 insertions(+), 115 deletions(-) diff --git a/bungee/src/main/java/us/myles/ViaVersion/bungee/platform/BungeeViaAPI.java b/bungee/src/main/java/us/myles/ViaVersion/bungee/platform/BungeeViaAPI.java index 65a3f5e75..c41583531 100644 --- a/bungee/src/main/java/us/myles/ViaVersion/bungee/platform/BungeeViaAPI.java +++ b/bungee/src/main/java/us/myles/ViaVersion/bungee/platform/BungeeViaAPI.java @@ -1,7 +1,6 @@ package us.myles.ViaVersion.bungee.platform; import io.netty.buffer.ByteBuf; -import lombok.NonNull; import net.md_5.bungee.api.ProxyServer; import net.md_5.bungee.api.config.ServerInfo; import net.md_5.bungee.api.connection.ProxiedPlayer; @@ -20,8 +19,9 @@ import java.util.TreeSet; import java.util.UUID; public class BungeeViaAPI implements ViaAPI { + @Override - public int getPlayerVersion(@NonNull ProxiedPlayer player) { + public int getPlayerVersion(ProxiedPlayer player) { UserConnection conn = Via.getManager().getConnection(player.getUniqueId()); if (conn == null) { return player.getPendingConnection().getVersion(); @@ -30,7 +30,7 @@ public class BungeeViaAPI implements ViaAPI { } @Override - public int getPlayerVersion(@NonNull UUID uuid) { + public int getPlayerVersion(UUID uuid) { return getPlayerVersion(ProxyServer.getInstance().getPlayer(uuid)); } diff --git a/bungee/src/main/java/us/myles/ViaVersion/bungee/service/ProtocolDetectorService.java b/bungee/src/main/java/us/myles/ViaVersion/bungee/service/ProtocolDetectorService.java index 6f5f6a909..e0d112b69 100644 --- a/bungee/src/main/java/us/myles/ViaVersion/bungee/service/ProtocolDetectorService.java +++ b/bungee/src/main/java/us/myles/ViaVersion/bungee/service/ProtocolDetectorService.java @@ -1,6 +1,5 @@ package us.myles.ViaVersion.bungee.service; -import lombok.Getter; import net.md_5.bungee.api.Callback; import net.md_5.bungee.api.ServerPing; import net.md_5.bungee.api.config.ServerInfo; @@ -15,9 +14,8 @@ import java.util.concurrent.ConcurrentHashMap; public class ProtocolDetectorService implements Runnable { private static final Map detectedProtocolIds = new ConcurrentHashMap<>(); - private BungeePlugin plugin; - @Getter private static ProtocolDetectorService instance; + private final BungeePlugin plugin; public ProtocolDetectorService(BungeePlugin plugin) { this.plugin = plugin; @@ -84,4 +82,11 @@ public class ProtocolDetectorService implements Runnable { return new HashMap<>(detectedProtocolIds); } + public static ProtocolDetectorService getInstance() { + return instance; + } + + public BungeePlugin getPlugin() { + return plugin; + } } diff --git a/bungee/src/main/java/us/myles/ViaVersion/bungee/storage/BungeeStorage.java b/bungee/src/main/java/us/myles/ViaVersion/bungee/storage/BungeeStorage.java index 592ec0f30..8723fa2a4 100644 --- a/bungee/src/main/java/us/myles/ViaVersion/bungee/storage/BungeeStorage.java +++ b/bungee/src/main/java/us/myles/ViaVersion/bungee/storage/BungeeStorage.java @@ -1,15 +1,14 @@ package us.myles.ViaVersion.bungee.storage; -import lombok.EqualsAndHashCode; import net.md_5.bungee.api.connection.ProxiedPlayer; import us.myles.ViaVersion.api.data.StoredObject; import us.myles.ViaVersion.api.data.UserConnection; import java.lang.reflect.Field; +import java.util.Objects; import java.util.Set; import java.util.UUID; -@EqualsAndHashCode(callSuper = true) public class BungeeStorage extends StoredObject { private static Field bossField; @@ -59,4 +58,22 @@ public class BungeeStorage extends StoredObject { public Set getBossbar() { return bossbar; } + + @Override + public boolean equals(final Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + BungeeStorage that = (BungeeStorage) o; + if (!Objects.equals(player, that.player)) return false; + if (!Objects.equals(currentServer, that.currentServer)) return false; + return Objects.equals(bossbar, that.bossbar); + } + + @Override + public int hashCode() { + int result = player != null ? player.hashCode() : 0; + result = 31 * result + (currentServer != null ? currentServer.hashCode() : 0); + result = 31 * result + (bossbar != null ? bossbar.hashCode() : 0); + return result; + } } diff --git a/common/src/main/java/us/myles/ViaVersion/ViaManager.java b/common/src/main/java/us/myles/ViaVersion/ViaManager.java index d1e523a70..c93b93856 100644 --- a/common/src/main/java/us/myles/ViaVersion/ViaManager.java +++ b/common/src/main/java/us/myles/ViaVersion/ViaManager.java @@ -1,6 +1,5 @@ package us.myles.ViaVersion; -import lombok.Builder; import us.myles.ViaVersion.api.Via; import us.myles.ViaVersion.api.data.UserConnection; import us.myles.ViaVersion.api.platform.ViaInjector; @@ -29,7 +28,6 @@ public class ViaManager { private final Set subPlatforms = new HashSet<>(); private boolean debug; - @Builder public ViaManager(ViaPlatform platform, ViaInjector injector, ViaCommandHandler commandHandler, ViaPlatformLoader loader) { this.platform = platform; this.injector = injector; @@ -37,6 +35,10 @@ public class ViaManager { this.loader = loader; } + public static ViaManagerBuilder builder() { + return new ViaManagerBuilder(); + } + public void init() { if (System.getProperty("ViaVersion") != null) { // Reload? @@ -136,17 +138,6 @@ public class ViaManager { platform.getConnectionManager().onLoginSuccess(info); } - public void handleDisconnect(UUID id) { - UserConnection connection = getConnection(id); - if (connection != null) { - handleDisconnect(connection); - } - } - - public void handleDisconnect(UserConnection info) { - platform.getConnectionManager().onDisconnect(info); - } - public ViaPlatform getPlatform() { return platform; } @@ -188,4 +179,35 @@ public class ViaManager { public UserConnection getConnection(UUID playerUUID) { return platform.getConnectionManager().getConnectedClient(playerUUID); } + + public static final class ViaManagerBuilder { + private ViaPlatform platform; + private ViaInjector injector; + private ViaCommandHandler commandHandler; + private ViaPlatformLoader loader; + + public ViaManagerBuilder platform(ViaPlatform platform) { + this.platform = platform; + return this; + } + + public ViaManagerBuilder injector(ViaInjector injector) { + this.injector = injector; + return this; + } + + public ViaManagerBuilder loader(ViaPlatformLoader loader) { + this.loader = loader; + return this; + } + + public ViaManagerBuilder commandHandler(ViaCommandHandler commandHandler) { + this.commandHandler = commandHandler; + return this; + } + + public ViaManager build() { + return new ViaManager(platform, injector, commandHandler, loader); + } + } } diff --git a/common/src/main/java/us/myles/ViaVersion/api/entities/Entity1_10Types.java b/common/src/main/java/us/myles/ViaVersion/api/entities/Entity1_10Types.java index 618e53d9f..d2ca736a5 100644 --- a/common/src/main/java/us/myles/ViaVersion/api/entities/Entity1_10Types.java +++ b/common/src/main/java/us/myles/ViaVersion/api/entities/Entity1_10Types.java @@ -1,7 +1,5 @@ package us.myles.ViaVersion.api.entities; -import lombok.AllArgsConstructor; -import lombok.Getter; import us.myles.ViaVersion.api.Via; import java.util.HashMap; @@ -27,8 +25,6 @@ public class Entity1_10Types { return type.get(); } - @AllArgsConstructor - @Getter public enum EntityType implements us.myles.ViaVersion.api.entities.EntityType { ENTITY(-1), DROPPED_ITEM(1, ENTITY), @@ -126,6 +122,11 @@ public class Entity1_10Types { this.parent = null; } + EntityType(int id, EntityType parent) { + this.id = id; + this.parent = parent; + } + static { for (EntityType type : EntityType.values()) { TYPES.put(type.id, type); @@ -137,10 +138,18 @@ public class Entity1_10Types { return Optional.empty(); return Optional.ofNullable(TYPES.get(id)); } + + @Override + public int getId() { + return id; + } + + @Override + public EntityType getParent() { + return parent; + } } - @AllArgsConstructor - @Getter public enum ObjectType implements us.myles.ViaVersion.api.entities.ObjectType { BOAT(1, EntityType.BOAT), ITEM(2, EntityType.DROPPED_ITEM), @@ -179,6 +188,21 @@ public class Entity1_10Types { } } + ObjectType(int id, EntityType type) { + this.id = id; + this.type = type; + } + + @Override + public int getId() { + return id; + } + + @Override + public EntityType getType() { + return type; + } + public static Optional findById(int id) { if (id == -1) return Optional.empty(); diff --git a/common/src/main/java/us/myles/ViaVersion/api/entities/Entity1_11Types.java b/common/src/main/java/us/myles/ViaVersion/api/entities/Entity1_11Types.java index de51bc7ea..c6599aac9 100644 --- a/common/src/main/java/us/myles/ViaVersion/api/entities/Entity1_11Types.java +++ b/common/src/main/java/us/myles/ViaVersion/api/entities/Entity1_11Types.java @@ -1,7 +1,5 @@ package us.myles.ViaVersion.api.entities; -import lombok.AllArgsConstructor; -import lombok.Getter; import us.myles.ViaVersion.api.Via; import java.util.HashMap; @@ -27,8 +25,6 @@ public class Entity1_11Types { return type.get(); } - @AllArgsConstructor - @Getter public enum EntityType implements us.myles.ViaVersion.api.entities.EntityType { ENTITY(-1), DROPPED_ITEM(1, ENTITY), @@ -154,6 +150,21 @@ public class Entity1_11Types { this.parent = null; } + EntityType(int id, EntityType parent) { + this.id = id; + this.parent = parent; + } + + @Override + public int getId() { + return id; + } + + @Override + public EntityType getParent() { + return parent; + } + static { for (EntityType type : EntityType.values()) { TYPES.put(type.id, type); @@ -167,8 +178,6 @@ public class Entity1_11Types { } } - @AllArgsConstructor - @Getter public enum ObjectType implements us.myles.ViaVersion.api.entities.ObjectType { BOAT(1, EntityType.BOAT), ITEM(2, EntityType.DROPPED_ITEM), @@ -209,6 +218,21 @@ public class Entity1_11Types { } } + ObjectType(int id, EntityType type) { + this.id = id; + this.type = type; + } + + @Override + public int getId() { + return id; + } + + @Override + public EntityType getType() { + return type; + } + public static Optional findById(int id) { if (id == -1) return Optional.empty(); diff --git a/common/src/main/java/us/myles/ViaVersion/api/entities/Entity1_12Types.java b/common/src/main/java/us/myles/ViaVersion/api/entities/Entity1_12Types.java index d6e974ead..37c454f15 100644 --- a/common/src/main/java/us/myles/ViaVersion/api/entities/Entity1_12Types.java +++ b/common/src/main/java/us/myles/ViaVersion/api/entities/Entity1_12Types.java @@ -10,8 +10,6 @@ package us.myles.ViaVersion.api.entities; -import lombok.AllArgsConstructor; -import lombok.Getter; import us.myles.ViaVersion.api.Via; import java.util.HashMap; @@ -37,8 +35,6 @@ public class Entity1_12Types { return type.get(); } - @AllArgsConstructor - @Getter public enum EntityType implements us.myles.ViaVersion.api.entities.EntityType { ENTITY(-1), DROPPED_ITEM(1, ENTITY), @@ -167,6 +163,21 @@ public class Entity1_12Types { this.parent = null; } + EntityType(int id, EntityType parent) { + this.id = id; + this.parent = parent; + } + + @Override + public int getId() { + return id; + } + + @Override + public EntityType getParent() { + return parent; + } + static { for (EntityType type : EntityType.values()) { TYPES.put(type.id, type); @@ -180,8 +191,6 @@ public class Entity1_12Types { } } - @AllArgsConstructor - @Getter public enum ObjectType implements us.myles.ViaVersion.api.entities.ObjectType { BOAT(1, EntityType.BOAT), ITEM(2, EntityType.DROPPED_ITEM), @@ -222,6 +231,21 @@ public class Entity1_12Types { } } + ObjectType(int id, EntityType type) { + this.id = id; + this.type = type; + } + + @Override + public int getId() { + return id; + } + + @Override + public EntityType getType() { + return type; + } + public static Optional findById(int id) { if (id == -1) return Optional.empty(); diff --git a/common/src/main/java/us/myles/ViaVersion/api/entities/Entity1_13Types.java b/common/src/main/java/us/myles/ViaVersion/api/entities/Entity1_13Types.java index 252a45c1d..591918921 100644 --- a/common/src/main/java/us/myles/ViaVersion/api/entities/Entity1_13Types.java +++ b/common/src/main/java/us/myles/ViaVersion/api/entities/Entity1_13Types.java @@ -1,7 +1,5 @@ package us.myles.ViaVersion.api.entities; -import lombok.AllArgsConstructor; -import lombok.Getter; import us.myles.ViaVersion.api.Via; import java.util.HashMap; @@ -27,8 +25,6 @@ public class Entity1_13Types { return type.get(); } - @AllArgsConstructor - @Getter public enum EntityType implements us.myles.ViaVersion.api.entities.EntityType { // Auto generated @@ -209,6 +205,21 @@ public class Entity1_13Types { this.parent = null; } + EntityType(int id, EntityType parent) { + this.id = id; + this.parent = parent; + } + + @Override + public int getId() { + return id; + } + + @Override + public EntityType getParent() { + return parent; + } + static { for (EntityType type : EntityType.values()) { TYPES.put(type.id, type); @@ -222,8 +233,6 @@ public class Entity1_13Types { } } - @AllArgsConstructor - @Getter public enum ObjectType implements us.myles.ViaVersion.api.entities.ObjectType { BOAT(1, EntityType.BOAT), ITEM(2, EntityType.ITEM), @@ -265,6 +274,21 @@ public class Entity1_13Types { } } + ObjectType(int id, EntityType type) { + this.id = id; + this.type = type; + } + + @Override + public int getId() { + return id; + } + + @Override + public EntityType getType() { + return type; + } + public static Optional findById(int id) { if (id == -1) return Optional.empty(); diff --git a/common/src/main/java/us/myles/ViaVersion/api/entities/Entity1_14Types.java b/common/src/main/java/us/myles/ViaVersion/api/entities/Entity1_14Types.java index 6fe30035d..6b7fe2059 100644 --- a/common/src/main/java/us/myles/ViaVersion/api/entities/Entity1_14Types.java +++ b/common/src/main/java/us/myles/ViaVersion/api/entities/Entity1_14Types.java @@ -1,7 +1,5 @@ package us.myles.ViaVersion.api.entities; -import lombok.AllArgsConstructor; -import lombok.Getter; import us.myles.ViaVersion.api.Via; import java.util.HashMap; @@ -22,8 +20,6 @@ public class Entity1_14Types { return type.get(); } - @AllArgsConstructor - @Getter public enum EntityType implements us.myles.ViaVersion.api.entities.EntityType { // Auto generated @@ -211,6 +207,21 @@ public class Entity1_14Types { this.parent = null; } + EntityType(int id, EntityType parent) { + this.id = id; + this.parent = parent; + } + + @Override + public int getId() { + return id; + } + + @Override + public EntityType getParent() { + return parent; + } + static { for (EntityType type : EntityType.values()) { TYPES.put(type.id, type); diff --git a/common/src/main/java/us/myles/ViaVersion/api/entities/Entity1_15Types.java b/common/src/main/java/us/myles/ViaVersion/api/entities/Entity1_15Types.java index b549f0976..0a54b4139 100644 --- a/common/src/main/java/us/myles/ViaVersion/api/entities/Entity1_15Types.java +++ b/common/src/main/java/us/myles/ViaVersion/api/entities/Entity1_15Types.java @@ -1,7 +1,5 @@ package us.myles.ViaVersion.api.entities; -import lombok.AllArgsConstructor; -import lombok.Getter; import us.myles.ViaVersion.api.Via; import java.util.HashMap; @@ -22,9 +20,6 @@ public class Entity1_15Types { return type.get(); } - - @AllArgsConstructor - @Getter public enum EntityType implements us.myles.ViaVersion.api.entities.EntityType { ENTITY(-1), @@ -211,6 +206,21 @@ public class Entity1_15Types { this.parent = null; } + EntityType(int id, EntityType parent) { + this.id = id; + this.parent = parent; + } + + @Override + public int getId() { + return id; + } + + @Override + public EntityType getParent() { + return parent; + } + static { for (EntityType type : EntityType.values()) { TYPES.put(type.id, type); diff --git a/common/src/main/java/us/myles/ViaVersion/api/entities/Entity1_16Types.java b/common/src/main/java/us/myles/ViaVersion/api/entities/Entity1_16Types.java index 62a34a36d..68ea425ea 100644 --- a/common/src/main/java/us/myles/ViaVersion/api/entities/Entity1_16Types.java +++ b/common/src/main/java/us/myles/ViaVersion/api/entities/Entity1_16Types.java @@ -1,7 +1,5 @@ package us.myles.ViaVersion.api.entities; -import lombok.AllArgsConstructor; -import lombok.Getter; import us.myles.ViaVersion.api.Via; import java.util.HashMap; @@ -22,9 +20,6 @@ public class Entity1_16Types { return type.get(); } - - @AllArgsConstructor - @Getter public enum EntityType implements us.myles.ViaVersion.api.entities.EntityType { ENTITY(-1), @@ -216,6 +211,21 @@ public class Entity1_16Types { this.parent = null; } + EntityType(int id, EntityType parent) { + this.id = id; + this.parent = parent; + } + + @Override + public int getId() { + return id; + } + + @Override + public EntityType getParent() { + return parent; + } + static { for (EntityType type : EntityType.values()) { TYPES.put(type.id, type); diff --git a/common/src/main/java/us/myles/ViaVersion/api/minecraft/metadata/types/MetaType1_12.java b/common/src/main/java/us/myles/ViaVersion/api/minecraft/metadata/types/MetaType1_12.java index 9d480443e..a44369621 100644 --- a/common/src/main/java/us/myles/ViaVersion/api/minecraft/metadata/types/MetaType1_12.java +++ b/common/src/main/java/us/myles/ViaVersion/api/minecraft/metadata/types/MetaType1_12.java @@ -1,12 +1,8 @@ package us.myles.ViaVersion.api.minecraft.metadata.types; -import lombok.Getter; -import lombok.RequiredArgsConstructor; import us.myles.ViaVersion.api.minecraft.metadata.MetaType; import us.myles.ViaVersion.api.type.Type; -@RequiredArgsConstructor -@Getter public enum MetaType1_12 implements MetaType { Byte(0, Type.BYTE), VarInt(1, Type.VAR_INT), @@ -27,8 +23,22 @@ public enum MetaType1_12 implements MetaType { private final int typeID; private final Type type; + MetaType1_12(int typeID, Type type) { + this.typeID = typeID; + this.type = type; + } + public static MetaType1_12 byId(int id) { return values()[id]; } + @Override + public int getTypeID() { + return typeID; + } + + @Override + public Type getType() { + return type; + } } diff --git a/common/src/main/java/us/myles/ViaVersion/api/minecraft/metadata/types/MetaType1_13.java b/common/src/main/java/us/myles/ViaVersion/api/minecraft/metadata/types/MetaType1_13.java index d3594150f..eddf6af9a 100644 --- a/common/src/main/java/us/myles/ViaVersion/api/minecraft/metadata/types/MetaType1_13.java +++ b/common/src/main/java/us/myles/ViaVersion/api/minecraft/metadata/types/MetaType1_13.java @@ -1,13 +1,9 @@ package us.myles.ViaVersion.api.minecraft.metadata.types; -import lombok.Getter; -import lombok.RequiredArgsConstructor; import us.myles.ViaVersion.api.minecraft.metadata.MetaType; import us.myles.ViaVersion.api.type.Type; import us.myles.ViaVersion.api.type.types.version.Types1_13; -@RequiredArgsConstructor -@Getter public enum MetaType1_13 implements MetaType { Byte(0, Type.BYTE), VarInt(1, Type.VAR_INT), @@ -30,8 +26,22 @@ public enum MetaType1_13 implements MetaType { private final int typeID; private final Type type; + MetaType1_13(int typeID, Type type) { + this.typeID = typeID; + this.type = type; + } + public static MetaType1_13 byId(int id) { return values()[id]; } + @Override + public int getTypeID() { + return typeID; + } + + @Override + public Type getType() { + return type; + } } diff --git a/common/src/main/java/us/myles/ViaVersion/api/minecraft/metadata/types/MetaType1_13_2.java b/common/src/main/java/us/myles/ViaVersion/api/minecraft/metadata/types/MetaType1_13_2.java index e1b9fefa4..a5f3da767 100644 --- a/common/src/main/java/us/myles/ViaVersion/api/minecraft/metadata/types/MetaType1_13_2.java +++ b/common/src/main/java/us/myles/ViaVersion/api/minecraft/metadata/types/MetaType1_13_2.java @@ -1,13 +1,9 @@ package us.myles.ViaVersion.api.minecraft.metadata.types; -import lombok.Getter; -import lombok.RequiredArgsConstructor; import us.myles.ViaVersion.api.minecraft.metadata.MetaType; import us.myles.ViaVersion.api.type.Type; import us.myles.ViaVersion.api.type.types.version.Types1_13_2; -@RequiredArgsConstructor -@Getter public enum MetaType1_13_2 implements MetaType { Byte(0, Type.BYTE), VarInt(1, Type.VAR_INT), @@ -30,8 +26,22 @@ public enum MetaType1_13_2 implements MetaType { private final int typeID; private final Type type; + MetaType1_13_2(int typeID, Type type) { + this.typeID = typeID; + this.type = type; + } + public static MetaType1_13_2 byId(int id) { return values()[id]; } + @Override + public int getTypeID() { + return typeID; + } + + @Override + public Type getType() { + return type; + } } diff --git a/common/src/main/java/us/myles/ViaVersion/api/minecraft/metadata/types/MetaType1_14.java b/common/src/main/java/us/myles/ViaVersion/api/minecraft/metadata/types/MetaType1_14.java index e268c6555..94265618b 100644 --- a/common/src/main/java/us/myles/ViaVersion/api/minecraft/metadata/types/MetaType1_14.java +++ b/common/src/main/java/us/myles/ViaVersion/api/minecraft/metadata/types/MetaType1_14.java @@ -1,13 +1,9 @@ package us.myles.ViaVersion.api.minecraft.metadata.types; -import lombok.Getter; -import lombok.RequiredArgsConstructor; import us.myles.ViaVersion.api.minecraft.metadata.MetaType; import us.myles.ViaVersion.api.type.Type; import us.myles.ViaVersion.api.type.types.version.Types1_14; -@RequiredArgsConstructor -@Getter public enum MetaType1_14 implements MetaType { Byte(0, Type.BYTE), VarInt(1, Type.VAR_INT), @@ -33,8 +29,22 @@ public enum MetaType1_14 implements MetaType { private final int typeID; private final Type type; + MetaType1_14(int typeID, Type type) { + this.typeID = typeID; + this.type = type; + } + public static MetaType1_14 byId(int id) { return values()[id]; } + @Override + public int getTypeID() { + return typeID; + } + + @Override + public Type getType() { + return type; + } } diff --git a/common/src/main/java/us/myles/ViaVersion/api/minecraft/metadata/types/MetaType1_8.java b/common/src/main/java/us/myles/ViaVersion/api/minecraft/metadata/types/MetaType1_8.java index 7d75b39fe..44808806c 100644 --- a/common/src/main/java/us/myles/ViaVersion/api/minecraft/metadata/types/MetaType1_8.java +++ b/common/src/main/java/us/myles/ViaVersion/api/minecraft/metadata/types/MetaType1_8.java @@ -1,12 +1,8 @@ package us.myles.ViaVersion.api.minecraft.metadata.types; -import lombok.Getter; -import lombok.RequiredArgsConstructor; import us.myles.ViaVersion.api.minecraft.metadata.MetaType; import us.myles.ViaVersion.api.type.Type; -@RequiredArgsConstructor -@Getter public enum MetaType1_8 implements MetaType { Byte(0, Type.BYTE), Short(1, Type.SHORT), @@ -21,7 +17,22 @@ public enum MetaType1_8 implements MetaType { private final int typeID; private final Type type; + MetaType1_8(int typeID, Type type) { + this.typeID = typeID; + this.type = type; + } + public static MetaType1_8 byId(int id) { return values()[id]; } + + @Override + public int getTypeID() { + return typeID; + } + + @Override + public Type getType() { + return type; + } } diff --git a/common/src/main/java/us/myles/ViaVersion/api/minecraft/metadata/types/MetaType1_9.java b/common/src/main/java/us/myles/ViaVersion/api/minecraft/metadata/types/MetaType1_9.java index 30be6bef2..ff336cd89 100644 --- a/common/src/main/java/us/myles/ViaVersion/api/minecraft/metadata/types/MetaType1_9.java +++ b/common/src/main/java/us/myles/ViaVersion/api/minecraft/metadata/types/MetaType1_9.java @@ -1,12 +1,8 @@ package us.myles.ViaVersion.api.minecraft.metadata.types; -import lombok.Getter; -import lombok.RequiredArgsConstructor; import us.myles.ViaVersion.api.minecraft.metadata.MetaType; import us.myles.ViaVersion.api.type.Type; -@RequiredArgsConstructor -@Getter public enum MetaType1_9 implements MetaType { Byte(0, Type.BYTE), VarInt(1, Type.VAR_INT), @@ -26,8 +22,22 @@ public enum MetaType1_9 implements MetaType { private final int typeID; private final Type type; + MetaType1_9(int typeID, Type type) { + this.typeID = typeID; + this.type = type; + } + public static MetaType1_9 byId(int id) { return values()[id]; } + @Override + public int getTypeID() { + return typeID; + } + + @Override + public Type getType() { + return type; + } } diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_14to1_13_2/storage/EntityTracker1_14.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_14to1_13_2/storage/EntityTracker1_14.java index 8223d3290..a98f15ce0 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_14to1_13_2/storage/EntityTracker1_14.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_14to1_13_2/storage/EntityTracker1_14.java @@ -1,7 +1,5 @@ package us.myles.ViaVersion.protocols.protocol1_14to1_13_2.storage; -import lombok.Getter; -import lombok.Setter; import us.myles.ViaVersion.api.PacketWrapper; import us.myles.ViaVersion.api.data.UserConnection; import us.myles.ViaVersion.api.entities.Entity1_14Types.EntityType; @@ -18,14 +16,8 @@ public class EntityTracker1_14 extends EntityTracker { // 0x1 = sleeping, 0x2 = riptide private final Map sleepingAndRiptideData = new ConcurrentHashMap<>(); private final Map playerEntityFlags = new ConcurrentHashMap<>(); - @Getter - @Setter private int latestTradeWindowId; - @Getter - @Setter private boolean forceSendCenterChunk = true; - @Getter - @Setter private int chunkCenterX, chunkCenterZ; public EntityTracker1_14(UserConnection user) { @@ -101,4 +93,36 @@ public class EntityTracker1_14 extends EntityTracker { public void setEntityFlags(int player, byte data) { playerEntityFlags.put(player, data); } + + public int getLatestTradeWindowId() { + return latestTradeWindowId; + } + + public void setLatestTradeWindowId(int latestTradeWindowId) { + this.latestTradeWindowId = latestTradeWindowId; + } + + public boolean isForceSendCenterChunk() { + return forceSendCenterChunk; + } + + public void setForceSendCenterChunk(boolean forceSendCenterChunk) { + this.forceSendCenterChunk = forceSendCenterChunk; + } + + public int getChunkCenterX() { + return chunkCenterX; + } + + public void setChunkCenterX(int chunkCenterX) { + this.chunkCenterX = chunkCenterX; + } + + public int getChunkCenterZ() { + return chunkCenterZ; + } + + public void setChunkCenterZ(int chunkCenterZ) { + this.chunkCenterZ = chunkCenterZ; + } } diff --git a/common/src/main/java/us/myles/ViaVersion/util/ConcurrentList.java b/common/src/main/java/us/myles/ViaVersion/util/ConcurrentList.java index 524b9145f..7cfa8f15e 100644 --- a/common/src/main/java/us/myles/ViaVersion/util/ConcurrentList.java +++ b/common/src/main/java/us/myles/ViaVersion/util/ConcurrentList.java @@ -1,9 +1,13 @@ package us.myles.ViaVersion.util; -import lombok.SneakyThrows; - import java.lang.reflect.Field; -import java.util.*; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; /** * Created by wea_ondara licensed under MIT @@ -54,16 +58,19 @@ public class ConcurrentList extends ArrayList { } @Override - @SneakyThrows public Object clone() { synchronized (lock) { - ConcurrentList clist = (ConcurrentList) super.clone(); - clist.modCount = 0; - Field f = ArrayList.class.getDeclaredField("elementData"); - f.setAccessible(true); - f.set(clist, Arrays.copyOf((Object[]) f.get(this), this.size())); + try { + ConcurrentList clist = (ConcurrentList) super.clone(); + clist.modCount = 0; + Field f = ArrayList.class.getDeclaredField("elementData"); + f.setAccessible(true); + f.set(clist, Arrays.copyOf((Object[]) f.get(this), this.size())); - return clist; + return clist; + } catch (ReflectiveOperationException e) { + throw new RuntimeException(); + } } } diff --git a/pom.xml b/pom.xml index ddb54884d..404fd2fb1 100644 --- a/pom.xml +++ b/pom.xml @@ -73,14 +73,6 @@ - - - org.projectlombok - lombok - 1.18.4 - provided - - org.javassist diff --git a/sponge/pom.xml b/sponge/pom.xml index 2fce07c34..ba7cf629a 100644 --- a/sponge/pom.xml +++ b/sponge/pom.xml @@ -30,8 +30,7 @@ - lombok.launch.AnnotationProcessorHider$AnnotationProcessor - + lombok.launch.AnnotationProcessorHider$AnnotationProcessor @@ -52,6 +51,14 @@ + + + org.projectlombok + lombok + 1.18.12 + provided + + us.myles diff --git a/sponge/src/main/java/us/myles/ViaVersion/sponge/platform/SpongeBossBar.java b/sponge/src/main/java/us/myles/ViaVersion/sponge/platform/SpongeBossBar.java index df03b6d31..3f0930ba4 100644 --- a/sponge/src/main/java/us/myles/ViaVersion/sponge/platform/SpongeBossBar.java +++ b/sponge/src/main/java/us/myles/ViaVersion/sponge/platform/SpongeBossBar.java @@ -1,13 +1,11 @@ package us.myles.ViaVersion.sponge.platform; -import lombok.Getter; import org.spongepowered.api.entity.living.player.Player; import us.myles.ViaVersion.api.boss.BossBar; import us.myles.ViaVersion.api.boss.BossColor; import us.myles.ViaVersion.api.boss.BossStyle; import us.myles.ViaVersion.boss.CommonBoss; -@Getter public class SpongeBossBar extends CommonBoss { public SpongeBossBar(String title, float health, BossColor color, BossStyle style) { diff --git a/velocity/src/main/java/us/myles/ViaVersion/velocity/storage/VelocityStorage.java b/velocity/src/main/java/us/myles/ViaVersion/velocity/storage/VelocityStorage.java index cc7284f12..9d43f3a1e 100644 --- a/velocity/src/main/java/us/myles/ViaVersion/velocity/storage/VelocityStorage.java +++ b/velocity/src/main/java/us/myles/ViaVersion/velocity/storage/VelocityStorage.java @@ -1,7 +1,6 @@ package us.myles.ViaVersion.velocity.storage; import com.velocitypowered.api.proxy.Player; -import lombok.EqualsAndHashCode; import us.myles.ViaVersion.api.data.StoredObject; import us.myles.ViaVersion.api.data.UserConnection; import us.myles.ViaVersion.util.ReflectionUtil; @@ -9,9 +8,9 @@ import us.myles.ViaVersion.util.ReflectionUtil; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.List; +import java.util.Objects; import java.util.UUID; -@EqualsAndHashCode(callSuper = true) public class VelocityStorage extends StoredObject { private final Player player; private String currentServer; @@ -72,4 +71,22 @@ public class VelocityStorage extends StoredObject { public List getCachedBossbar() { return cachedBossbar; } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + VelocityStorage that = (VelocityStorage) o; + if (!Objects.equals(player, that.player)) return false; + if (!Objects.equals(currentServer, that.currentServer)) return false; + return Objects.equals(cachedBossbar, that.cachedBossbar); + } + + @Override + public int hashCode() { + int result = player != null ? player.hashCode() : 0; + result = 31 * result + (currentServer != null ? currentServer.hashCode() : 0); + result = 31 * result + (cachedBossbar != null ? cachedBossbar.hashCode() : 0); + return result; + } } From 886ac734f90cfbfcebc9d9b35b3f9aa2ffb1342a Mon Sep 17 00:00:00 2001 From: KennyTV Date: Thu, 23 Apr 2020 21:09:41 +0200 Subject: [PATCH 3/8] Add null check to channel close --- .../myles/ViaVersion/api/platform/ViaConnectionManager.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/common/src/main/java/us/myles/ViaVersion/api/platform/ViaConnectionManager.java b/common/src/main/java/us/myles/ViaVersion/api/platform/ViaConnectionManager.java index 77ac1b6e1..f44fb777e 100644 --- a/common/src/main/java/us/myles/ViaVersion/api/platform/ViaConnectionManager.java +++ b/common/src/main/java/us/myles/ViaVersion/api/platform/ViaConnectionManager.java @@ -20,7 +20,9 @@ public class ViaConnectionManager { connections.add(connection); clients.put(id, connection); - connection.getChannel().closeFuture().addListener((ChannelFutureListener) future -> onDisconnect(connection)); + if (connection.getChannel() != null) { + connection.getChannel().closeFuture().addListener((ChannelFutureListener) future -> onDisconnect(connection)); + } } public void onDisconnect(UserConnection connection) { From 32826467d3d1f7928f375dbc54f760da7e633b92 Mon Sep 17 00:00:00 2001 From: KennyTV Date: Thu, 23 Apr 2020 21:42:08 +0200 Subject: [PATCH 4/8] Wrap reflectiveoperationexception in concurrentlist clone --- .../src/main/java/us/myles/ViaVersion/util/ConcurrentList.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/src/main/java/us/myles/ViaVersion/util/ConcurrentList.java b/common/src/main/java/us/myles/ViaVersion/util/ConcurrentList.java index 7cfa8f15e..ea08e5edf 100644 --- a/common/src/main/java/us/myles/ViaVersion/util/ConcurrentList.java +++ b/common/src/main/java/us/myles/ViaVersion/util/ConcurrentList.java @@ -69,7 +69,7 @@ public class ConcurrentList extends ArrayList { return clist; } catch (ReflectiveOperationException e) { - throw new RuntimeException(); + throw new RuntimeException(e); } } } From 4b9a15b0033db5112a0d9932fb013cde30a65d02 Mon Sep 17 00:00:00 2001 From: KennyTV Date: Fri, 24 Apr 2020 11:39:11 +0200 Subject: [PATCH 5/8] Some javadoc changes --- .../main/java/us/myles/ViaVersion/ViaManager.java | 7 +++++++ .../src/main/java/us/myles/ViaVersion/api/Via.java | 1 - .../main/java/us/myles/ViaVersion/api/ViaAPI.java | 12 ++++++------ .../api/platform/ViaConnectionManager.java | 9 +++++++++ 4 files changed, 22 insertions(+), 7 deletions(-) diff --git a/common/src/main/java/us/myles/ViaVersion/ViaManager.java b/common/src/main/java/us/myles/ViaVersion/ViaManager.java index c93b93856..370885753 100644 --- a/common/src/main/java/us/myles/ViaVersion/ViaManager.java +++ b/common/src/main/java/us/myles/ViaVersion/ViaManager.java @@ -2,6 +2,7 @@ package us.myles.ViaVersion; import us.myles.ViaVersion.api.Via; import us.myles.ViaVersion.api.data.UserConnection; +import us.myles.ViaVersion.api.platform.ViaConnectionManager; import us.myles.ViaVersion.api.platform.ViaInjector; import us.myles.ViaVersion.api.platform.ViaPlatform; import us.myles.ViaVersion.api.platform.ViaPlatformLoader; @@ -130,6 +131,9 @@ public class ViaManager { return platform.getConnectionManager().getConnectedClients(); } + /** + * @see ViaConnectionManager#isClientConnected(UUID) + */ public boolean isClientConnected(UUID player) { return platform.getConnectionManager().isClientConnected(player); } @@ -176,6 +180,9 @@ public class ViaManager { return subPlatforms; } + /** + * @see ViaConnectionManager#getConnectedClient(UUID) + */ public UserConnection getConnection(UUID playerUUID) { return platform.getConnectionManager().getConnectedClient(playerUUID); } diff --git a/common/src/main/java/us/myles/ViaVersion/api/Via.java b/common/src/main/java/us/myles/ViaVersion/api/Via.java index 6cef5663a..1edd82b7c 100644 --- a/common/src/main/java/us/myles/ViaVersion/api/Via.java +++ b/common/src/main/java/us/myles/ViaVersion/api/Via.java @@ -7,7 +7,6 @@ import us.myles.ViaVersion.api.platform.ViaPlatform; public class Via { private static ViaPlatform platform; private static ViaManager manager; - private static boolean cacheJsonMappings; /** * Register the ViaManager associated with the platform. diff --git a/common/src/main/java/us/myles/ViaVersion/api/ViaAPI.java b/common/src/main/java/us/myles/ViaVersion/api/ViaAPI.java index 52ef3ebdb..b5a469953 100644 --- a/common/src/main/java/us/myles/ViaVersion/api/ViaAPI.java +++ b/common/src/main/java/us/myles/ViaVersion/api/ViaAPI.java @@ -38,8 +38,8 @@ public interface ViaAPI { * * @param playerUUID UUID of a player * @return true if Via has a cached userconnection for this player - * @deprecated as of 0.9.9, because all players are ported use {@link #getPlayerVersion(UUID)}, - * or use {@link #isInjected(UUID)} + * @deprecated use {@link #isInjected(UUID)} + * @see #isInjected(UUID) */ @Deprecated default boolean isPorted(UUID playerUUID) { @@ -66,18 +66,18 @@ public interface ViaAPI { * * @param player Platform player object, eg. Bukkit this is Player * @param packet The packet, you need a VarInt ID then the packet contents. - * @throws IllegalArgumentException If not on 1.9 throws IllegalArg + * @throws IllegalArgumentException if the player is not injected by Via */ - void sendRawPacket(T player, ByteBuf packet) throws IllegalArgumentException; + void sendRawPacket(T player, ByteBuf packet); /** * Send a raw packet to the player (Use new IDs) * * @param uuid The uuid from the player to send packet * @param packet The packet, you need a VarInt ID then the packet contents. - * @throws IllegalArgumentException If not on 1.9 throws IllegalArg + * @throws IllegalArgumentException if the player is not injected by Via */ - void sendRawPacket(UUID uuid, ByteBuf packet) throws IllegalArgumentException; + void sendRawPacket(UUID uuid, ByteBuf packet); /** * Create a new bossbar instance diff --git a/common/src/main/java/us/myles/ViaVersion/api/platform/ViaConnectionManager.java b/common/src/main/java/us/myles/ViaVersion/api/platform/ViaConnectionManager.java index f44fb777e..c73eb0e15 100644 --- a/common/src/main/java/us/myles/ViaVersion/api/platform/ViaConnectionManager.java +++ b/common/src/main/java/us/myles/ViaVersion/api/platform/ViaConnectionManager.java @@ -47,6 +47,9 @@ public class ViaConnectionManager { * Returns null when there isn't a server or connection was not found * When ViaVersion is reloaded, this method may not return some players. * May not return ProtocolSupport players. + *

+ * Note that connections are removed as soon as their channel is closed, + * so avoid using this method during player quits for example. */ public UserConnection getConnectedClient(UUID clientIdentifier) { return clients.get(clientIdentifier); @@ -63,6 +66,12 @@ public class ViaConnectionManager { return Collections.unmodifiableSet(connections); } + /** + * Returns if Via injected into this player connection. + * + * @param playerId player uuid + * @return true if the player is handled by Via + */ public boolean isClientConnected(UUID playerId) { return clients.containsKey(playerId); } From e4bac5f81acfbe0a5986519c0b2976525d710ed7 Mon Sep 17 00:00:00 2001 From: KennyTV Date: Fri, 24 Apr 2020 13:27:29 +0200 Subject: [PATCH 6/8] Improve shutdown of executor loader and mappings cache Previously, the shutdown check would only happen once all futures were removed, as in a player joined that had to check the remaining protocols. Now, the check will be done regularly once the plugin has fully been enabled and has the option to delay the shutdown until set on again (i.e. with ViaBackwards) --- .../java/us/myles/ViaVersion/ViaManager.java | 8 +++++ .../api/data/MappingDataLoader.java | 2 ++ .../api/protocol/ProtocolRegistry.java | 35 +++++++++++++++---- 3 files changed, 38 insertions(+), 7 deletions(-) diff --git a/common/src/main/java/us/myles/ViaVersion/ViaManager.java b/common/src/main/java/us/myles/ViaVersion/ViaManager.java index 370885753..4b901cba0 100644 --- a/common/src/main/java/us/myles/ViaVersion/ViaManager.java +++ b/common/src/main/java/us/myles/ViaVersion/ViaManager.java @@ -2,6 +2,7 @@ package us.myles.ViaVersion; import us.myles.ViaVersion.api.Via; import us.myles.ViaVersion.api.data.UserConnection; +import us.myles.ViaVersion.api.platform.TaskId; import us.myles.ViaVersion.api.platform.ViaConnectionManager; import us.myles.ViaVersion.api.platform.ViaInjector; import us.myles.ViaVersion.api.platform.ViaPlatform; @@ -27,6 +28,7 @@ public class ViaManager { private final ViaCommandHandler commandHandler; private final ViaPlatformLoader loader; private final Set subPlatforms = new HashSet<>(); + private TaskId mappingLoadingTask; private boolean debug; public ViaManager(ViaPlatform platform, ViaInjector injector, ViaCommandHandler commandHandler, ViaPlatformLoader loader) { @@ -86,6 +88,12 @@ public class ViaManager { // Load Platform loader.load(); // Common tasks + mappingLoadingTask = Via.getPlatform().runRepeatingSync(() -> { + if (ProtocolRegistry.checkForMappingCompletion()) { + platform.cancelTask(mappingLoadingTask); + mappingLoadingTask = null; + } + }, 10L); if (ProtocolRegistry.SERVER_PROTOCOL < ProtocolVersion.v1_9.getId()) { if (Via.getConfig().isSimulatePlayerTick()) { Via.getPlatform().runRepeatingSync(new ViaIdleThread(), 1L); diff --git a/common/src/main/java/us/myles/ViaVersion/api/data/MappingDataLoader.java b/common/src/main/java/us/myles/ViaVersion/api/data/MappingDataLoader.java index e2371aebf..651bcc2d8 100644 --- a/common/src/main/java/us/myles/ViaVersion/api/data/MappingDataLoader.java +++ b/common/src/main/java/us/myles/ViaVersion/api/data/MappingDataLoader.java @@ -6,6 +6,7 @@ import com.google.gson.JsonIOException; import com.google.gson.JsonObject; import com.google.gson.JsonSyntaxException; import us.myles.ViaVersion.api.Via; +import us.myles.ViaVersion.api.protocol.ProtocolRegistry; import us.myles.ViaVersion.util.GsonUtil; import java.io.File; @@ -33,6 +34,7 @@ public class MappingDataLoader { public static void enableMappingsCache() { cacheJsonMappings = true; + ProtocolRegistry.setKeepExecutorLoaded(true); } /** diff --git a/common/src/main/java/us/myles/ViaVersion/api/protocol/ProtocolRegistry.java b/common/src/main/java/us/myles/ViaVersion/api/protocol/ProtocolRegistry.java index 184d2526f..29111251b 100644 --- a/common/src/main/java/us/myles/ViaVersion/api/protocol/ProtocolRegistry.java +++ b/common/src/main/java/us/myles/ViaVersion/api/protocol/ProtocolRegistry.java @@ -61,6 +61,7 @@ public class ProtocolRegistry { private static Map, CompletableFuture> mappingLoaderFutures = new HashMap<>(); private static ThreadPoolExecutor mappingLoaderExecutor; private static boolean mappingsLoaded; + private static boolean keepExecutorLoaded; static { mappingLoaderExecutor = new ThreadPoolExecutor(5, 16, 45L, TimeUnit.SECONDS, new SynchronousQueue<>()); @@ -70,11 +71,10 @@ public class ProtocolRegistry { registerBaseProtocol(BASE_PROTOCOL, Range.lessThan(Integer.MIN_VALUE)); registerBaseProtocol(new BaseProtocol1_7(), Range.all()); - // Register built in protocols registerProtocol(new Protocol1_9To1_8(), ProtocolVersion.v1_9, ProtocolVersion.v1_8); registerProtocol(new Protocol1_9_1To1_9(), Arrays.asList(ProtocolVersion.v1_9_1.getId(), ProtocolVersion.v1_9_2.getId()), ProtocolVersion.v1_9.getId()); registerProtocol(new Protocol1_9_3To1_9_1_2(), ProtocolVersion.v1_9_3, ProtocolVersion.v1_9_2); - // Only supported for 1.9.4 server to 1.9 (nothing else) + registerProtocol(new Protocol1_9To1_9_1(), ProtocolVersion.v1_9, ProtocolVersion.v1_9_2); registerProtocol(new Protocol1_9_1_2To1_9_3_4(), Arrays.asList(ProtocolVersion.v1_9_1.getId(), ProtocolVersion.v1_9_2.getId()), ProtocolVersion.v1_9_3.getId()); registerProtocol(new Protocol1_10To1_9_3_4(), ProtocolVersion.v1_10, ProtocolVersion.v1_9_3); @@ -320,15 +320,26 @@ public class ProtocolRegistry { if (future == null) return; future.get(); + } + /** + * Shuts down the executor and uncaches mappings if all futures have been completed. + * + * @return true if the executor has now been shut down + */ + public static boolean checkForMappingCompletion() { synchronized (MAPPING_LOADER_LOCK) { - if (mappingsLoaded) return; + if (mappingsLoaded || keepExecutorLoaded) return false; - // Remove only after execution to block other potential threads - mappingLoaderFutures.remove(protocolClass); - if (mappingLoaderFutures.isEmpty()) { - shutdownLoaderExecutor(); + for (CompletableFuture future : mappingLoaderFutures.values()) { + // Return if any future hasn't completed yet + if (!future.isDone()) { + return false; + } } + + shutdownLoaderExecutor(); + return true; } } @@ -336,6 +347,7 @@ public class ProtocolRegistry { mappingsLoaded = true; mappingLoaderExecutor.shutdown(); mappingLoaderExecutor = null; + mappingLoaderFutures.clear(); mappingLoaderFutures = null; if (MappingDataLoader.isCacheJsonMappings()) { MappingDataLoader.getMappingsCache().clear(); @@ -355,4 +367,13 @@ public class ProtocolRegistry { return mappingLoaderFutures.get(protocolClass); } } + + /** + * If set to true, the executor and mappings will stay loaded, even if all current futures have been completed. + * + * @param keepExecutorLoaded whether to keep the executor and mappings loaded, even if all current futures have been completed + */ + public static void setKeepExecutorLoaded(boolean keepExecutorLoaded) { + ProtocolRegistry.keepExecutorLoaded = keepExecutorLoaded; + } } From 24ebb77860145a6987f2f8e61e1982f94323b059 Mon Sep 17 00:00:00 2001 From: KennyTV Date: Fri, 24 Apr 2020 13:48:22 +0200 Subject: [PATCH 7/8] Directly add dependent futures to the list instead of waiting for the extra boolean --- .../api/data/MappingDataLoader.java | 2 -- .../api/protocol/ProtocolRegistry.java | 19 ++++++++----------- 2 files changed, 8 insertions(+), 13 deletions(-) diff --git a/common/src/main/java/us/myles/ViaVersion/api/data/MappingDataLoader.java b/common/src/main/java/us/myles/ViaVersion/api/data/MappingDataLoader.java index 651bcc2d8..e2371aebf 100644 --- a/common/src/main/java/us/myles/ViaVersion/api/data/MappingDataLoader.java +++ b/common/src/main/java/us/myles/ViaVersion/api/data/MappingDataLoader.java @@ -6,7 +6,6 @@ import com.google.gson.JsonIOException; import com.google.gson.JsonObject; import com.google.gson.JsonSyntaxException; import us.myles.ViaVersion.api.Via; -import us.myles.ViaVersion.api.protocol.ProtocolRegistry; import us.myles.ViaVersion.util.GsonUtil; import java.io.File; @@ -34,7 +33,6 @@ public class MappingDataLoader { public static void enableMappingsCache() { cacheJsonMappings = true; - ProtocolRegistry.setKeepExecutorLoaded(true); } /** diff --git a/common/src/main/java/us/myles/ViaVersion/api/protocol/ProtocolRegistry.java b/common/src/main/java/us/myles/ViaVersion/api/protocol/ProtocolRegistry.java index 29111251b..3ae565322 100644 --- a/common/src/main/java/us/myles/ViaVersion/api/protocol/ProtocolRegistry.java +++ b/common/src/main/java/us/myles/ViaVersion/api/protocol/ProtocolRegistry.java @@ -61,7 +61,6 @@ public class ProtocolRegistry { private static Map, CompletableFuture> mappingLoaderFutures = new HashMap<>(); private static ThreadPoolExecutor mappingLoaderExecutor; private static boolean mappingsLoaded; - private static boolean keepExecutorLoaded; static { mappingLoaderExecutor = new ThreadPoolExecutor(5, 16, 45L, TimeUnit.SECONDS, new SynchronousQueue<>()); @@ -329,7 +328,7 @@ public class ProtocolRegistry { */ public static boolean checkForMappingCompletion() { synchronized (MAPPING_LOADER_LOCK) { - if (mappingsLoaded || keepExecutorLoaded) return false; + if (mappingsLoaded) return false; for (CompletableFuture future : mappingLoaderFutures.values()) { // Return if any future hasn't completed yet @@ -361,19 +360,17 @@ public class ProtocolRegistry { } } + public static void addMappingLoaderFuture(Class protocolClass, Class dependsOn, Runnable runnable) { + synchronized (MAPPING_LOADER_LOCK) { + CompletableFuture future = getMappingLoaderFuture(dependsOn).whenCompleteAsync((v, throwable) -> runnable.run(), mappingLoaderExecutor); + mappingLoaderFutures.put(protocolClass, future); + } + } + public static CompletableFuture getMappingLoaderFuture(Class protocolClass) { synchronized (MAPPING_LOADER_LOCK) { if (mappingsLoaded) return null; return mappingLoaderFutures.get(protocolClass); } } - - /** - * If set to true, the executor and mappings will stay loaded, even if all current futures have been completed. - * - * @param keepExecutorLoaded whether to keep the executor and mappings loaded, even if all current futures have been completed - */ - public static void setKeepExecutorLoaded(boolean keepExecutorLoaded) { - ProtocolRegistry.keepExecutorLoaded = keepExecutorLoaded; - } } From d33482e200342d26f99b0959206405116b2a8509 Mon Sep 17 00:00:00 2001 From: KennyTV Date: Sat, 25 Apr 2020 11:56:20 +0200 Subject: [PATCH 8/8] Remove lombok at last --- sponge/pom.xml | 18 +++++------------- 1 file changed, 5 insertions(+), 13 deletions(-) diff --git a/sponge/pom.xml b/sponge/pom.xml index ba7cf629a..1cde212ce 100644 --- a/sponge/pom.xml +++ b/sponge/pom.xml @@ -23,15 +23,15 @@ + org.apache.maven.plugins maven-compiler-plugin - 3.6.0 + 3.8.1 - - - lombok.launch.AnnotationProcessorHider$AnnotationProcessor - + + -proc:none + @@ -51,14 +51,6 @@ - - - org.projectlombok - lombok - 1.18.12 - provided - - us.myles