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

Posted

技术标签:

【中文标题】如何从另一个通过 Bungeecord 运行的 Paper Spigot 服务器获取玩家数量【英文标题】:How to get the playercount from another Paper Spigot server running through Bungeecord 【发布时间】:2020-02-24 17:37:16 【问题描述】:

我目前正在为 Bukkit (Paper Spigot) 开发一个充当队列的插件。此插件在队列服务器中运行,然后当正确服务器的玩家数量少于设定数量时,它将将玩家带到正确的服务器。我需要从正确的服务器获取 playercount 并在我的队列插件的代码中使用它。我找到了有关如何使用 Bukkit 的消息传递通道执行此操作的示例,但这需要玩家(我认为)并且我并不完全理解它,即使我已经阅读了许多其他文章和 *** 帖子,因为这些人中的大多数人的问题略有不同.我也听过其他人谈论套接字,但我不确定它们是如何工作的。我可以在适当的服务器或 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,以确保它运行良好并正确同步。我建议您查看 redis 并为正在排队等待的服务器创建心跳任务以检查玩家数量。作为旁注,我建议您不要将整个 org.bukkit.Player 对象存储在 ArrayList 中,使用播放器 UUID(或在本例中)名称是更好的选择。 嘿胡里奥。谢谢回复。如果我在正确服务器的插件中创建 Jedis 对象,并且在队列服务器中具有相同的端口和 ip,这是否意味着它们会同步?还是我错过了什么?现在会试试这个。埃德 是的,使用 Jedis 通过服务器进行通信将比尝试通过消息传递通道发送数据更快、更容易。 你好,Julio,很抱歉浪费了你更多的时间!您能否将我链接到 Jedis/Redis 的一个很好的解释或合理详细地解释如何做到这一点。我肯定错过了什么。我已经编辑了我的问题,所以请在那里查看我尝试过的内容。再次感谢 Ed 为了运行 redis,你需要实际安装它。如果您在 VPS/专用服务器上,我相信您只需输入 pip install redis-cli 即可获得 【参考方案1】:

我做了什么: 安装 Redis (https://github.com/MicrosoftArchive/redis/releases) 使用诸如https://www.tutorialspoint.com/redis/redis_java.htm 之类的指南来编写代码。 祝所有尝试这个的人好运! 玩得开心,我希望你能解决!

【讨论】:

以上是关于如何从另一个通过 Bungeecord 运行的 Paper Spigot 服务器获取玩家数量的主要内容,如果未能解决你的问题,请参考以下文章

java bStats的Metrics类(Bungeecord)

如何通过 laravel 应用程序使用数字海洋服务器从另一台服务器在远程服务器上运行脚本文件

如何编写一个从另一个 Bamboo 计划获取内部版本号的新 Bamboo 计划?

如何将 python 函数从另一个文件导入 django 视图

我可以使用 `fetch` 从另一个运行 JS 脚本吗?

在运行时从另一个 AppDomain 调试动态加载的 DLL