ProjectAres/Commons/bungee/src/main/java/tc/oc/commons/bungee/listeners/TeleportListener.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);
}
});
}
}