首页 > 解决方案 > Bukkit / Spigot MC (Java) 中是否有一个实现的功能可以让我让玩家 ping 服务器?

问题描述

我目前正在尝试为我的 Streamer 朋友想要运行的服务器编写 Minecraft 插件。我需要的是以下内容:

我需要一个函数或方法来让玩家 ping 服务器。这样玩家/ping就可以在聊天框中输入内容并从服务器获得类似于以下内容的响应[Server]: Your current Ping is 62ms.

我查看了 Bukkit 文档,例如http://docs.codelanx.com/Bukkit/1.7.10/http://bukkit.luricos.de/api/1.7.9-R0.2/,但我不能找不到适合我需要的东西。

我的插件.yml:

name: Beginning
version: ${project.version}
main: de.nightcore.beginning.Main
api-version: 1.16

commands:
  date:
    description: Shows the current time and Date
  ping:
    description: Gives the Player its current ping to the server

我的主要课程:

package de.nightcore.beginning;

import de.nightcore.beginning.commands.DateCommand;
import de.nightcore.beginning.commands.PingCommand;
import de.nightcore.beginning.listeners.JoinListener;
import de.nightcore.beginning.listeners.QuitListener;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.plugin.PluginManager;
import org.bukkit.plugin.java.JavaPlugin;

public final class Main extends JavaPlugin {

    @Override
    public void onEnable()
    {
        Bukkit.getLogger().fine("Plugin wird geladen!");

        listenerRegistration();
        commandRegistration();
    }

    @Override
    public void onDisable()
    {
        Bukkit.getLogger().fine("Plugin wird beendet!");
    }

    public static String getPrefix()
    {
        return ChatColor.DARK_GRAY + "[" + ChatColor.GOLD + "Server" + ChatColor.DARK_GRAY + "] " + ChatColor.WHITE;
    }

    private void listenerRegistration()
    {
        PluginManager pluginManager = Bukkit.getPluginManager();
        pluginManager.registerEvents(new JoinListener(), this);
        pluginManager.registerEvents(new QuitListener(), this);
    }

    private void commandRegistration()
    {
        getCommand("date").setExecutor(new DateCommand());
        getCommand("ping").setExecutor(new PingCommand());
    }
}

最后是我的 PingCommand 类:

package de.nightcore.beginning.commands;

import org.bukkit.Server;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.*;

//TODO: Ping Command / Command that provides Connection Info

public class PingCommand implements CommandExecutor {

    @Override
    public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
        Player player = sender.getServer().getPlayer("%UUID%"); ;
        Server server = sender.getServer();

        //Source Code to provide information about the players current ping

        return false;
    }
}

标签: javapluginsserverminecraftbukkit

解决方案


您需要将 Player 转换为 CraftPlayer,然后使用 CraftPlayer#getHandler() 获取 EntityPlayer,您可以在其中将玩家 ping 作为 int 值返回。

((CraftPlayer) player).getHandle().ping;

您还需要添加 spigot 依赖项(API 似乎没有包含它)。

<dependency>
    <groupId>org.spigotmc</groupId>
    <artifactId>spigot</artifactId>
    <version>LATEST</version>
    <scope>provided</scope>
</dependency>

推荐阅读