NodeWorld

Portails faits par les scripts

Depuis SDK 0.2.1

Un portail du monde emmène chaque joueur de la salle vers un autre monde. Seuls les scripts du monde sur le serveur font les portails, avec Portals.Spawn, Portals.Update et Portals.Despawn : sur l'appareil d'un joueur, ces appels renvoient false. Le script d'un joueur qui veut un portail envoie un événement réseau au même script sur le serveur, qui l'ouvre.

Ouvrir un portail sur le serveur

csharp
using NodeWorld.Flux;

public class HomePortal : FluxScript
{
    public string targetServer = "";       // identifiant du serveur du monde visé
    public string targetWorld = "HomeWorld";

    protected override void Start()
    {
        if (!World.isServer) return;
        Portals.Spawn("home", new PortalOptions
        {
            targetServer = targetServer,
            targetWorld = targetWorld,
            instanceCode = "",               // vide : l'API centrale choisit l'instance
            label = "Home",                  // vide : le nom du monde visé
            position = transform.position,
            rotation = transform.rotation,
        });
    }

    protected override void OnDestroy()
    {
        if (World.isServer) Portals.Despawn("home");
    }
}
  • L'identifiant du portail ("home") est celui du monde, unique dans la salle. Spawn renvoie false si le serveur l'a refusé (une cible vide, un identifiant déjà pris).
  • Portals.Update le déplace ou change où il mène ; Portals.Despawn le ferme.
  • Les portails d'un monde n'expirent pas ; ils se ferment avec la salle, ou quand le script les ferme.

Un portail demandé par un joueur

Envoie un événement réseau au serveur avec NetworkEventTarget.Server : il lance OnNetworkEvent du même script, sur le même objet, sur le serveur, avec l'identifiant du joueur qui l'a envoyé. L'objet a besoin d'un identifiant réseau (son composant FL# Script), et le script doit tourner sur le serveur (pas [ClientOnly]).

csharp
public class PortalKiosk : FluxScript
{
    public string targetServer = "";
    public string targetWorld = "HomeWorld";

    protected override void Start()
    {
        if (!World.isServer) Interaction.SetInteractable(gameObject, true);
    }

    // Sur l'appareil du joueur : demande au serveur.
    protected override void OnInteract() => SendNetworkEvent(NetworkEventTarget.Server, "Open");

    // Sur le serveur : ouvre le portail devant la borne.
    protected override void OnNetworkEvent(string name, NetReader arguments, int senderId)
    {
        if (!World.isServer || name != "Open") return;
        Portals.Spawn("kiosk", new PortalOptions
        {
            targetServer = targetServer,
            targetWorld = targetWorld,
            position = transform.position + transform.forward * 2f,
            rotation = transform.rotation,
        });
    }
}

Un événement vers NetworkEventTarget.Server n'atteint que le serveur : ni le joueur qui l'envoie ni les autres joueurs ne le lancent. Il compte dans les 120 messages par seconde que chaque joueur peut envoyer au réseau des scripts.