如何通过 Bungeecord 从另一个 Paper Spigot 服务器 运行 获取玩家数量

How to get the playercount from another Paper Spigot server running through Bungeecord

我目前正在为 Bukkit(Paper Spigot)开发一个用作队列的插件。这个插件在队列服务器中的 运行 中,当适当的服务器少于设定数量的玩家时,它将把玩家带到适当的服务器。我需要从适当的服务器获取播放器计数,并在我的队列插件的代码中使用它。我找到了有关如何使用 Bukkit 的消息传递渠道执行此操作的示例,但这需要玩家(我认为)并且我并不完全理解它,即使我已经阅读了许多其他文章和 Whosebug 帖子,因为这些人中的大多数人遇到的问题略有不同.我也听过其他人谈论套接字,但我不确定它们是如何工作的。我可以在适当的服务器或 Bungeecord 服务器中使用 运行 第二个插件。我只需要知道要写什么代码,写在哪里!或者至少是一个有用的工作系统示例。

到目前为止,这是我的代码:

package com.Package;

import org.bukkit.Bukkit;
//import org.bukkit.command.Command;
//import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.plugin.java.JavaPlugin;
import org.bukkit.plugin.messaging.PluginMessageListener;
import com.google.common.io.ByteArrayDataInput;
import com.google.common.io.ByteArrayDataOutput;
import com.google.common.io.ByteStreams;
import java.util.ArrayList;
import java.util.logging.Logger;

public class AnarchyQueue extends JavaPlugin implements PluginMessageListener {
    ArrayList<Player> players = new ArrayList<Player>();
    Boolean isListening = false;
    int playerNumber = 0;
    @Override
    public void onEnable() {
        getServer().getMessenger().registerOutgoingPluginChannel(this, "BungeeCord");
        getServer().getMessenger().registerIncomingPluginChannel(this, "BungeeCord", this);
        Bukkit.getScheduler().scheduleSyncRepeatingTask(this, new Runnable() {
            public void run() {
                getCount();
                log(Integer.toString(playerNumber));
            }
        }, 200L, 200L);
    }
    @Override
    public void onDisable() {

    }
    private void log(String str)
    {
        Logger.getLogger("Minecraft").info(str);
    }
    public void onPlayerJoin(PlayerJoinEvent event)
    {
        players.add(event.getPlayer());
    }
    /*public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
        if (command.getName().equalsIgnoreCase("players")) {
            if (!(sender instanceof Player)) {
                sender.sendMessage("You must be in game!");
                return true;
            }
            else {
                getCount();
            }
        }
        return true;   
    }*/
    private void getCount() {   
        ByteArrayDataOutput out = ByteStreams.newDataOutput();
        out.writeUTF("PlayerCount");
        out.writeUTF("anarchy");
        Player player = Bukkit.getPlayerExact("Ed_Silver");
        player.sendPluginMessage(this, "BungeeCord", out.toByteArray());
        isListening=true;
    }
    @Override
    public void onPluginMessageReceived(String channel, Player player, byte[] message) {
        if (channel.equals("BungeeCord")) {
            ByteArrayDataInput in = ByteStreams.newDataInput(message);
            String subchannel = in.readUTF();
            if (subchannel.equals("PlayerCount") && isListening) {
                int playerCount = in.readInt();
                playerNumber = playerCount;
                isListening=false;
            }
        }
    }
}

我知道这段代码在很多方面都有问题,我并不是真的想修复它 - 我只是想要一种方法来完成我正在做的事情,我稍后会解决其余的问题。 (提供代码,因为如果人们认为您没有尝试过,他们往往会变得很生气 :) !)

欢迎询问更多详情等...

提前致谢, 爱德华


--编辑--

我找到了 Jedis 并一直在试验。如果有人能向我解释绝地武士,那就太好了。 这是我到目前为止发现的:

public static void main(String[] args) {// priOnEnable() {
        //Connecting to Redis server on localhost 
        Jedis jedis = new Jedis("localhost"); 
        System.out.println("Connection to server sucessfully"); 
        //check whether server is running or not 
        System.out.println("Server is running: "+jedis.ping());
    }

但是这会出错。我相信我需要成为 运行 其他人来管理 Redis 或其他东西。

再次感谢,

爱德华

我做了什么: 已安装的 Redis (https://github.com/MicrosoftArchive/redis/releases) 使用 https://www.tutorialspoint.com/redis/redis_java.htm 等指南来编写代码。 祝所有尝试此操作的人好运! 玩得开心,我希望你能成功!