Skip to content

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.

php
use pocketmine\network\proxy\ProxyNetwork;

$net = $this->getServer()->getProxyNetwork(); // null si el servidor no está detrás de un proxy

API: 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étodoDevuelve
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 ​

php
// 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.

php
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 ​

php
// A todos los demás servidores (o indica el nombre de un servidor como tercer argumento)
$net->sendMessage("myplugin:sync", json_encode(["balance" => 10]));
php
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.

VanillaMine es un fork de PocketMine-MP mantenido por Luxury Nodes. Sin relación con el equipo de PMMP ni con Mojang.