java - 如何在 spigot 1.16.4 中获取玩家的 ping

标签 java reflection minecraft ping

我尝试以多种方式使用 java 反射来获取玩家的 ping 值。但在 100% 时,它返回 0ms。

我找了很久,所以...有人可以帮助我吗?

尝试 1:

    public static int getPing(Player p) {

       try {

           Object craftPlayer = (CraftPlayer) p;
           return (int) craftPlayer.getClass().getField("ping").get(craftPlayer);

       } catch (IllegalArgumentException | IllegalAccessException | NoSuchFieldException | 
       SecurityException e) {
           throw new Error(e);
       }

    }

尝试2:

    public static int getPing(Player p) {

       EntityPlayer player = ((CraftPlayer) p).getHandle();
       return player.ping;

    }
    

尝试 3:

    int ping = 0;
    Class<?>[] parameterTypes = null;
        
    Class<CraftPlayer> metadata = CraftPlayer.class;
    Method[] methods = metadata.getDeclaredMethods();
    for(Method method : methods) {  
        if(method.getName().equalsIgnoreCase("getHandle")) {
            parameterTypes = method.getParameterTypes();
        }
    }
        
    try {

        Object entityPlayer = p.getClass().getDeclaredMethod("getHandle", 
        parameterTypes).invoke((CraftPlayer) p);
        ping = (int) entityPlayer.getClass().getDeclaredField("ping").get(entityPlayer);

    } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException
                | NoSuchMethodException | SecurityException | NoSuchFieldException e) {
            e.printStackTrace();
        }

尝试 4:

        int ping = 0;
        
        try {

            Object entityPlayer = p.getClass().getMethod("getHandle").invoke(p);
            ping = entityPlayer.getClass().getField("ping").getInt(entityPlayer);

        } catch (IllegalArgumentException | IllegalAccessException | NoSuchFieldException | 
        SecurityException e) {
            e.printStackTrace();
        }

还有另外 3 个...(与此类似或绝对不适合使用)

我正在 VPS 托管的 1.16.4 PaperMC 服务器上测试我的插件。

也许在专用机器上会有所不同。

我尝试使用这样的“紧凑”代码:

int ping = ((CraftPlayer) p).getHandle().ping;

...但它再次返回 0ms。

请注意,我是一个真正的 Java 新手。我正在练习提高自己的水平。

我不是在寻找最终的解决方案,而是在我的方法可行的情况下寻找答案。如果没有,这是一个好方法。

最佳答案

终于成功了。

问题是我的 FAI:几天前,我为 UDP/TCP 打开了 25565 端口,并且还更改了其他参数。

自从我关闭所有这些选项后,我的 ping 值神奇地回到了 8-12 毫秒。

感谢 kahveci 的编辑建议,对于给您带来的不便,我们深表歉意。

关于java - 如何在 spigot 1.16.4 中获取玩家的 ping,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64988636/

相关文章:

docker - 使用docker在Heroku上插入

java - 在另一个类中使用一个类的实例是否算作依赖或关联?

java - 如何让struts2只在POST上验证

ios - 从泛型方法接收参数

c# - 递归迭代对象的属性

Kotlin 对象作为 spigot 的注入(inject)点

java - 让我的世界玩家看向点

java - 加载页面时 Thymeleaf View 错误

java - Maven 构建未在 Jenkins 上安排

c# - "safe"是如何将匿名类型和反射放在一起的?