如何通过 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 等指南来编写代码。
祝所有尝试此操作的人好运!
玩得开心,我希望你能成功!
我目前正在为 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 等指南来编写代码。 祝所有尝试此操作的人好运! 玩得开心,我希望你能成功!