2016-04-04 14 views
1

Bir tepkime testi için bir oyuncunun tam pingini bilmek zorundayım. Bunun için Eylemciler kullanın: ping tek yön olup olmadığını bilmekTek yön veya geri ping işlemi

public int pingPlayer(Player p) { 
    try { 
     String bukkitversion = Bukkit.getServer().getClass().getPackage().getName().substring(23); 
     Class<?> craftPlayer = Class.forName("org.bukkit.craftbukkit." + bukkitversion + ".entity.CraftPlayer"); 
     Object handle = craftPlayer.getMethod("getHandle").invoke(p); 
     Integer ping = (Integer) handle.getClass().getDeclaredField("ping").get(handle); 
     return ping.intValue(); 
    } catch (ClassNotFoundException | IllegalAccessException | IllegalArgumentException | InvocationTargetException | NoSuchMethodException | SecurityException | NoSuchFieldException e) { 
     return -1; 
    } 
} 

Ama şimdi yok [Sunucu -> Oyuncu] veya iki yol [Sunucu -> Oyuncu -> Sunucu]

Bir şey biliyor mu, tam olarak bu nasıl çalışır?

+0

Pingler gidiş-dönüş o Bukkit aynı olduğunu – Michael

+0

Tabii nelerdir? –

+0

@NicolaUetz ping nasıl çalışır. Bu yolculuk sürdüğü zamanı sayar (Bu gibi bir şey bana XD alıntılama). Ayrıca sadece int ping = ((CraftPlayer) p) .getHandle(). PlayerConnection.player.ping; 'Burada yansıma gereği yoktur. – Lightspeed360

cevap

0

Bir tepki testi arıyorsanız, şu anki saati System.getCurrentTimeMillis(); içinde saklamayı deneyin. Daha sonra, rastgele bir süre sonra (muhtemelen Runnable sunucunun donmasını engellemek için) bir şey yapın ve eylemi gerçekleştirdiklerinde, farklı bir yöntem almak için aynı yöntemi kullanın. İki sayıyı çıkarın, farkı (saniye cinsinden) fark etmek için 1000'e bölün.

Örnek:

// stuff before reaction test Long timeStart = System.getCurrentTimeMillis(); // first time // runnable, action, etc. (what you are testing the reaction time for) Long timeEnd = System.getCurrentTimeMillis(); // second time Long timeDifference = timeEnd - timeStart; // difference in time Integer timeInSeconds = timeDifference/1000; // difference in time (in seconds) player.sendMessage("Your time was " + timeInSeconds.toString() + " seconds!"); // send message to player