69 lines
2.4 KiB
Java
69 lines
2.4 KiB
Java
package tc.oc.commons.bungee.listeners;
|
|
|
|
import java.util.Objects;
|
|
import java.util.concurrent.ExecutorService;
|
|
import java.util.logging.Logger;
|
|
import javax.inject.Inject;
|
|
|
|
import net.md_5.bungee.api.ProxyServer;
|
|
import net.md_5.bungee.api.connection.ProxiedPlayer;
|
|
import tc.oc.api.docs.Server;
|
|
import tc.oc.api.docs.virtual.ServerDoc;
|
|
import tc.oc.api.message.MessageListener;
|
|
import tc.oc.api.message.MessageService;
|
|
import tc.oc.api.message.types.PlayerTeleportRequest;
|
|
import tc.oc.api.model.ModelSync;
|
|
import tc.oc.commons.bungee.servers.ServerTracker;
|
|
import tc.oc.commons.core.logging.Loggers;
|
|
import tc.oc.commons.core.plugin.PluginFacet;
|
|
|
|
/**
|
|
* Handles remote teleport requests for players on servers that are not running Commons
|
|
*/
|
|
public class TeleportListener implements MessageListener, PluginFacet {
|
|
|
|
private final ProxyServer proxy;
|
|
private final Logger logger;
|
|
private final ServerTracker serverTracker;
|
|
private final MessageService primaryQueue;
|
|
private final ExecutorService executor;
|
|
|
|
@Inject TeleportListener(Loggers loggers, ProxyServer proxy, ServerTracker serverTracker, MessageService primaryQueue, @ModelSync ExecutorService executor) {
|
|
this.proxy = proxy;
|
|
this.executor = executor;
|
|
this.logger = loggers.get(getClass());
|
|
this.serverTracker = serverTracker;
|
|
this.primaryQueue = primaryQueue;
|
|
}
|
|
|
|
@Override
|
|
public void enable() {
|
|
primaryQueue.subscribe(this, executor);
|
|
primaryQueue.bind(PlayerTeleportRequest.class);
|
|
}
|
|
|
|
@Override
|
|
public void disable() {
|
|
primaryQueue.unsubscribe(this);
|
|
}
|
|
|
|
@HandleMessage
|
|
public void onTeleport(PlayerTeleportRequest message) {
|
|
final ProxiedPlayer player = proxy.getPlayer(message.player_uuid);
|
|
if(player == null) return;
|
|
|
|
serverTracker.serverInfo(message.target_server()).ifPresent(targetServerInfo -> {
|
|
final Server server = serverTracker.byPlayer(player);
|
|
if(server.role() == ServerDoc.Role.LOBBY || server.role() == ServerDoc.Role.PGM) {
|
|
// If Bukkit server is running Commons, let it handle the teleport
|
|
return;
|
|
}
|
|
|
|
if(!Objects.equals(player.getServer().getInfo(), targetServerInfo)) {
|
|
logger.info("Remote teleporting " + player.getName() + " to " + targetServerInfo.getName() + ":" + message.target_player_uuid);
|
|
player.connect(targetServerInfo);
|
|
}
|
|
});
|
|
}
|
|
}
|