diff --git a/src/main/java/org/adde0109/ambassador/Ambassador.java b/src/main/java/org/adde0109/ambassador/Ambassador.java index d3748fd..6bda7e9 100644 --- a/src/main/java/org/adde0109/ambassador/Ambassador.java +++ b/src/main/java/org/adde0109/ambassador/Ambassador.java @@ -1,5 +1,7 @@ package org.adde0109.ambassador; +import com.google.common.collect.ArrayListMultimap; +import com.google.common.collect.ListMultimap; import com.google.inject.Inject; import com.velocitypowered.api.event.PostOrder; import com.velocitypowered.api.event.Subscribe; @@ -14,8 +16,10 @@ import java.lang.reflect.Field; import java.lang.reflect.Method; import java.nio.file.Files; import java.util.HashMap; +import java.util.List; import java.util.Map; +import com.velocitypowered.api.proxy.messages.ChannelIdentifier; import com.velocitypowered.api.proxy.server.RegisteredServer; import com.velocitypowered.proxy.VelocityServer; import com.velocitypowered.proxy.connection.MinecraftConnection; @@ -60,6 +64,15 @@ public class Ambassador { public AmbassadorConfig config; private static final MapWithExpiration TEMPORARY_FORCED = new MapWithExpiration<>(); + private static final ListMultimap PLAYER_REGISTERED_CHANNELS = ArrayListMultimap.create(); + + public List getPlayerRegisteredChannels(String username) { + return PLAYER_REGISTERED_CHANNELS.get(username); + } + + public void removePlayerRegisteredChannels(String username) { + PLAYER_REGISTERED_CHANNELS.removeAll(username); + } private static Ambassador instance; public static Ambassador getInstance() { diff --git a/src/main/java/org/adde0109/ambassador/forge/VelocityForgeClientConnectionPhase.java b/src/main/java/org/adde0109/ambassador/forge/VelocityForgeClientConnectionPhase.java index 6b065c8..2ee2fe2 100644 --- a/src/main/java/org/adde0109/ambassador/forge/VelocityForgeClientConnectionPhase.java +++ b/src/main/java/org/adde0109/ambassador/forge/VelocityForgeClientConnectionPhase.java @@ -198,8 +198,8 @@ public enum VelocityForgeClientConnectionPhase implements ClientConnectionPhase if (player.getModInfo().get().getMods().stream().anyMatch((mod -> mod.getId().equals("clientresetpacket")))) { return ClientResetType.CRP; } else if (Ambassador.getInstance().config.getServerSwitchCancellationTime() >= 0 && - player.getModInfo().get().getMods().stream().anyMatch((mod -> mod.getId().equals("serverredirect") - || mod.getId().equals("srvredirect:red"))) + (player.getModInfo().get().getMods().stream().anyMatch((mod -> mod.getId().equals("serverredirect"))) + || Ambassador.getInstance().getPlayerRegisteredChannels(player.getUsername()).stream().anyMatch(identifier -> identifier.getId().equals("srvredirect:red"))) && player.getVirtualHost().isPresent()) { return ClientResetType.SR; } diff --git a/src/main/java/org/adde0109/ambassador/velocity/VelocityEventHandler.java b/src/main/java/org/adde0109/ambassador/velocity/VelocityEventHandler.java index ac5301f..5fc6fea 100644 --- a/src/main/java/org/adde0109/ambassador/velocity/VelocityEventHandler.java +++ b/src/main/java/org/adde0109/ambassador/velocity/VelocityEventHandler.java @@ -3,6 +3,7 @@ package org.adde0109.ambassador.velocity; import com.velocitypowered.api.event.Continuation; import com.velocitypowered.api.event.PostOrder; import com.velocitypowered.api.event.Subscribe; +import com.velocitypowered.api.event.connection.DisconnectEvent; import com.velocitypowered.api.event.connection.PostLoginEvent; import com.velocitypowered.api.event.player.*; import com.velocitypowered.api.proxy.server.RegisteredServer; @@ -68,9 +69,13 @@ public class VelocityEventHandler { if (!(player.getConnection().getType() instanceof ForgeFMLConnectionType)) { return; } + // Do not overwrite the mod info stored by the proxy or the server redirect based on Client Reset Packet will stop working + /* player.setModInfo(new ModInfo("Channels", event.getChannels().stream().map((id) -> { return new ModInfo.Mod(id.getId(), ""); }).toList())); + */ + Ambassador.getInstance().getPlayerRegisteredChannels(player.getUsername()).addAll(event.getChannels()); VelocityForgeClientConnectionPhase clientPhase = (VelocityForgeClientConnectionPhase) player.getPhase(); //If reset typ is still unknown, set it! @@ -79,4 +84,10 @@ public class VelocityEventHandler { } } + // fixme remove unregistered channels when player channel unregister event is fired (that event does not exist?!) + + @Subscribe + public void onPlayerDisconnectEvent(DisconnectEvent event) { + Ambassador.getInstance().removePlayerRegisteredChannels(event.getPlayer().getUsername()); + } }