[JAVA] Messaging bungee->spigot

Kenda

Architecte en herbe
16 Juillet 2016
314
1
2
125
32
www.youtube.com
Bonjour,

je fais un système de messaging entre spigot et bungee, mais je rencontre un petit problème.

J'ai un serveur "Lobby", qui envoie un message à "Bungeecord". (La c'est ok)
J'ai bungeecord qui envoie un message à "Runner" (la ça marche pas)

J'ai remarqué qu'il fallait qu'un joueur soit obligatoirement connecté sur "Runner" pour que le messaging passe. Est-il possible de bypass ce système ? (Par exemple si un joueur est seul)
Merci


Des extraits du code qui doit se faire entre Bungee et "Runner"
Java:
//dans le messaging receive bungee
if (queueManager.addPlayerToWaiting(player)) {
                    player.sendMessage(new TextComponent(Messages.getMessage("add_player_to_queue", "%number%", String.valueOf(queueManager.getPositionInQueue(player)))));
                    BungeeSender.sendMessaging("RequestMapAvailableRunner");
                    break;
                }


public class BungeeSender {

public static void sendMessaging(String channel, String... args) {
ByteArrayDataOutput out = ByteStreams.newDataOutput();
out.writeUTF(channel);
if (args.length > 0)
Arrays.stream(args).forEach(out::writeUTF);
for(ServerInfo si : ProxyServer.getInstance().getServers().values())
si.sendData("BungeeCord", out.toByteArray());
    }
}


Java:
public class Messaging implements PluginMessageListener {

//Marche uniquement si un joueur est connecté sur le serveur
    @Override
    public void onPluginMessageReceived(String tag, Player player, byte[] bytes) {

        System.out.println("je passe ici");
        if(!tag.equals("BungeeCord"))
            return;

        ByteArrayDataInput in = ByteStreams.newDataInput(bytes);
        String channel = in.readUTF();

        if(channel.equalsIgnoreCase("RequestMapAvailableRunner"))
        {
            System.out.println("Je receive la request map");
        }
    }
}
 
Bonjour,

Non, BungeeCord ne permet pas d'envoyer de message à des serveurs sans aucun joueur. Il faudrait gérer toi-même le flux :
Java:
// FIXME: authentification (SSL peut faire le taff)

// NOTE: Java encode les chaînes en CESU-8 modifié.
//  Si tu veux te utiliser des langages non-JVM, il faudra mettre le PrintWriter en UTF-8.


// maître/contrôleur
public record Replica(Socket sock, BufferedInputStream input, PrintWriter output) {}
public static void main(String[] args) {
    ServerSocket server = new ServerSocket(port);
    serverSocket.setSoTimeout(20);
    
    List<Socket> replicas = new ArrayList<>();
    
    while(true) {
        try {
            // `accept` bloque jusqu'à une connexion entrante ou après 20 ms (SO_TIMEOUT),
            // les serveurs tournent à 40 Hz = 25 ms/tick donc pas déconnant de dormir un peu
            // pour éviter d'avoir un CPU à 100% sur une boucle infinie trop rapide
            Socket replica = server.accept();
            
            BufferedInputStream in = new BufferedInputStream(replica.getInputStream());
            PrintWriter out = new PrintWriter(replica.getOutputStream());
            replicas.add(new Replica(replica, in, out));
        }
        catch(InterruptedIOException ignored) {}
        
        // Comment vont mes réplicas favoris ?
        for(Replica replica : replicas) {
            while(replica.input.available() > 0) {
                String line = replica.input.readLine();
                System.out.println(line);
                // ...
            }
        }
    }
}

// esclave/réplica
public static void main(String[] args) {
    Socket sock = new Socket("127.0.0.1", port);
    PrinWriter out = new PrintWriter(sock.getOutputStream());
    out.println("Hello");
    out.flush();
    sock.close();
}

Pour encoder les messages c'est à peu près la même chose ;
https://stackoverflow.com/a/5680427

Cordialement,
ShE3py