fix: cache registered channels separately to prevent mod list from being overwritten
This commit is contained in:
parent
fbf12f90e7
commit
016f3ad029
|
|
@ -1,5 +1,7 @@
|
||||||
package org.adde0109.ambassador;
|
package org.adde0109.ambassador;
|
||||||
|
|
||||||
|
import com.google.common.collect.ArrayListMultimap;
|
||||||
|
import com.google.common.collect.ListMultimap;
|
||||||
import com.google.inject.Inject;
|
import com.google.inject.Inject;
|
||||||
import com.velocitypowered.api.event.PostOrder;
|
import com.velocitypowered.api.event.PostOrder;
|
||||||
import com.velocitypowered.api.event.Subscribe;
|
import com.velocitypowered.api.event.Subscribe;
|
||||||
|
|
@ -14,8 +16,10 @@ import java.lang.reflect.Field;
|
||||||
import java.lang.reflect.Method;
|
import java.lang.reflect.Method;
|
||||||
import java.nio.file.Files;
|
import java.nio.file.Files;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
|
import com.velocitypowered.api.proxy.messages.ChannelIdentifier;
|
||||||
import com.velocitypowered.api.proxy.server.RegisteredServer;
|
import com.velocitypowered.api.proxy.server.RegisteredServer;
|
||||||
import com.velocitypowered.proxy.VelocityServer;
|
import com.velocitypowered.proxy.VelocityServer;
|
||||||
import com.velocitypowered.proxy.connection.MinecraftConnection;
|
import com.velocitypowered.proxy.connection.MinecraftConnection;
|
||||||
|
|
@ -60,6 +64,15 @@ public class Ambassador {
|
||||||
public AmbassadorConfig config;
|
public AmbassadorConfig config;
|
||||||
|
|
||||||
private static final MapWithExpiration<String, RegisteredServer> TEMPORARY_FORCED = new MapWithExpiration<>();
|
private static final MapWithExpiration<String, RegisteredServer> TEMPORARY_FORCED = new MapWithExpiration<>();
|
||||||
|
private static final ListMultimap<String, ChannelIdentifier> PLAYER_REGISTERED_CHANNELS = ArrayListMultimap.create();
|
||||||
|
|
||||||
|
public List<ChannelIdentifier> getPlayerRegisteredChannels(String username) {
|
||||||
|
return PLAYER_REGISTERED_CHANNELS.get(username);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void removePlayerRegisteredChannels(String username) {
|
||||||
|
PLAYER_REGISTERED_CHANNELS.removeAll(username);
|
||||||
|
}
|
||||||
|
|
||||||
private static Ambassador instance;
|
private static Ambassador instance;
|
||||||
public static Ambassador getInstance() {
|
public static Ambassador getInstance() {
|
||||||
|
|
|
||||||
|
|
@ -198,8 +198,8 @@ public enum VelocityForgeClientConnectionPhase implements ClientConnectionPhase
|
||||||
if (player.getModInfo().get().getMods().stream().anyMatch((mod -> mod.getId().equals("clientresetpacket")))) {
|
if (player.getModInfo().get().getMods().stream().anyMatch((mod -> mod.getId().equals("clientresetpacket")))) {
|
||||||
return ClientResetType.CRP;
|
return ClientResetType.CRP;
|
||||||
} else if (Ambassador.getInstance().config.getServerSwitchCancellationTime() >= 0 &&
|
} else if (Ambassador.getInstance().config.getServerSwitchCancellationTime() >= 0 &&
|
||||||
player.getModInfo().get().getMods().stream().anyMatch((mod -> mod.getId().equals("serverredirect")
|
(player.getModInfo().get().getMods().stream().anyMatch((mod -> mod.getId().equals("serverredirect")))
|
||||||
|| mod.getId().equals("srvredirect:red")))
|
|| Ambassador.getInstance().getPlayerRegisteredChannels(player.getUsername()).stream().anyMatch(identifier -> identifier.getId().equals("srvredirect:red")))
|
||||||
&& player.getVirtualHost().isPresent()) {
|
&& player.getVirtualHost().isPresent()) {
|
||||||
return ClientResetType.SR;
|
return ClientResetType.SR;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,7 @@ package org.adde0109.ambassador.velocity;
|
||||||
import com.velocitypowered.api.event.Continuation;
|
import com.velocitypowered.api.event.Continuation;
|
||||||
import com.velocitypowered.api.event.PostOrder;
|
import com.velocitypowered.api.event.PostOrder;
|
||||||
import com.velocitypowered.api.event.Subscribe;
|
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.connection.PostLoginEvent;
|
||||||
import com.velocitypowered.api.event.player.*;
|
import com.velocitypowered.api.event.player.*;
|
||||||
import com.velocitypowered.api.proxy.server.RegisteredServer;
|
import com.velocitypowered.api.proxy.server.RegisteredServer;
|
||||||
|
|
@ -68,9 +69,13 @@ public class VelocityEventHandler {
|
||||||
if (!(player.getConnection().getType() instanceof ForgeFMLConnectionType)) {
|
if (!(player.getConnection().getType() instanceof ForgeFMLConnectionType)) {
|
||||||
return;
|
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) -> {
|
player.setModInfo(new ModInfo("Channels", event.getChannels().stream().map((id) -> {
|
||||||
return new ModInfo.Mod(id.getId(), "");
|
return new ModInfo.Mod(id.getId(), "");
|
||||||
}).toList()));
|
}).toList()));
|
||||||
|
*/
|
||||||
|
Ambassador.getInstance().getPlayerRegisteredChannels(player.getUsername()).addAll(event.getChannels());
|
||||||
|
|
||||||
VelocityForgeClientConnectionPhase clientPhase = (VelocityForgeClientConnectionPhase) player.getPhase();
|
VelocityForgeClientConnectionPhase clientPhase = (VelocityForgeClientConnectionPhase) player.getPhase();
|
||||||
//If reset typ is still unknown, set it!
|
//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());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user