Redes con proxy 5.46.0
Cuando un servidor funciona detrás de VanillaGate, los plugins pueden ver toda la red, mover jugadores entre servidores y enviar mensajes a plugins de otros servidores.
use pocketmine\network\proxy\ProxyNetwork;
$net = $this->getServer()->getProxyNetwork(); // null si el servidor no está detrás de un proxyAPI: Server::getProxyNetwork(), ProxyNetwork, PlayerProxyTransferEvent, ProxyMessageReceiveEvent.
La red
El proxy envía el estado de los demás servidores aproximadamente una vez por segundo, así que estos datos pueden tener un pequeño retraso.
| Método | Devuelve |
|---|---|
isConnected() | Si el enlace con el proxy está activo ahora mismo. |
getServerName() | El nombre de este servidor en el proxy. |
getServers() / getGroups() | Nombres de todos los servidores / grupos. |
isServerOnline($server) | Si ese servidor está enlazado. |
isNetworkTarget($name) | Si un nombre es un servidor o un grupo. |
getGlobalPlayerCount() | Jugadores en toda la red. |
getServerPlayerCount($server) | Jugadores en un servidor. |
getOnlinePlayers() | Nombre de jugador → nombre de servidor ("" mientras cambia de servidor). |
findPlayer($name) | Servidor de un jugador (sin distinguir mayúsculas), o null. |
Mover jugadores
// Un jugador de este servidor. Estilo: STYLE_DIMENSION, STYLE_SEAMLESS, STYLE_CINEMATIC, o "" para el del proxy.
$net->transfer($player, "survival", ProxyNetwork::STYLE_SEAMLESS);
// Al lobby (los grupos de respaldo del proxy)
$net->transfer($player, ProxyNetwork::TARGET_HUB);
// Cualquier jugador de la red, o todos con "*"
$net->sendPlayer("Steve", "minigames");transfer() devuelve false si el cambio se canceló o el jugador no llegó a través del proxy. Player::transfer() con el nombre de un servidor de la red hace lo mismo.
Impedir o redirigir un cambio
PlayerProxyTransferEvent se lanza antes de un cambio pedido en este servidor (/server, /hub, transfer()), y cuando un cambio pedido desde otro sitio (/send, otro servidor, la API de administración) está a punto de llevarse al jugador.
use pocketmine\event\player\PlayerProxyTransferEvent;
public function onTransfer(PlayerProxyTransferEvent $event) : void{
if($this->isInCombat($event->getPlayer())){
$event->cancel();
$event->getPlayer()->sendMessage("No puedes salir en mitad de un combate.");
}
}setTarget() y setStyle() cambian un movimiento local; en los pedidos desde otro sitio setTarget() no tiene efecto. El evento no se lanza cuando el servidor se apaga y sus jugadores se envían al lobby.
Mensajes entre servidores
// A todos los demás servidores (o indica el nombre de un servidor como tercer argumento)
$net->sendMessage("myplugin:sync", json_encode(["balance" => 10]));use pocketmine\event\server\ProxyMessageReceiveEvent;
public function onMessage(ProxyMessageReceiveEvent $event) : void{
if($event->getChannel() === "myplugin:sync"){
$data = json_decode($event->getData(), true);
// $event->getSourceServer() es el servidor que lo envió
}
}Usa un nombre de canal con el nombre de tu plugin como prefijo. broadcastAlert($message) muestra un mensaje en todos los servidores.
