2016-06-26 49 views
0

在我嘗試製作反轉熱插件的冒險中,我意識到我需要更多的知識來處理延遲以及Minecraft客戶端和服務器如何操作。我正在開發的當前插件正在處理覆蓋範圍。我必須考慮的一個因素是確定是否因滯後或客戶而造成重大影響。Minecraft/Bukkit - 延遲如何影響命中距離?

我想過一些方法來檢測滯後/高平,以確保遠的命中是由於客戶而不是滯後。我的問題是,誰必須「滯後」纔會發生相當程度的滯後?打人者;被擊中的人;或服務器?
當我說服務器時,如果主機的網速變慢,服務器程序運行緩慢,它會有所作爲嗎?這會影響命中的註冊方式嗎(這會造成很大的命中)嗎?

如果它的事項,我的設置,以確定命中之間的距離僅僅是一個onPlayerHit事件處理程序:

public void onPlayerHit(EntityDamageByEntityEvent event) { 
 

 
    // make sure they are all players 
 
    if (!(event.getEntity() instanceof Player) | !(event.getDamager() instanceof Player)) 
 
    return; 
 

 
    // get the event's players 
 
    Player damaged = (Player) event.getEntity(); 
 
    Player damager = (Player) event.getDamager(); 
 

 
    // get the locations 
 
    Location damagedLocation = damaged.getLocation(); 
 
    Location damagerLocation = damager.getLocation(); 
 

 
    // calculate the distance 
 
    double distance = damagedLocation.distance(damagerLocation); 
 

 
    // broadcast it to everyone 
 
    for (Player p: Bukkit.getOnlinePlayers()) { 
 
    p.sendMessage(ChatColor.translateAlternateColorCodes('&', "&f" + damager.getDisplayName() + "&3 has just damaged &f" + damaged.getDisplayName() + "&3 from a distance of &4" + distance)); 
 
    } 
 
}

回答

0

我沒有跑任何測試,或做了這麼多的研究,但我的直覺告訴我,被擊中的球員是唯一一個可能會因爲滯後而造成很大打擊的球員,這就是我爲什麼這麼認爲的原因:

  • 如果服務器滯後,玩家仍然會在同一時間發送信息,並且當服務器最終收到信息時,它會在同一時間,因此它似乎不會出錯

  • 如果玩家的擊球時間滯後,那就意味着他可以擊中另一個玩家,距離(根據玩家客戶)只有3個街區。數據被髮送到服務器,但服務器意識到該玩家距離太遠,所以命中不會被標記爲命中,並且事件永遠不會被調用。

  • 如果被擊中的玩家滯後,那麼即使他移動到0,0,0,服務器也會認爲他在3,0,0。所以我們假設玩家擊中的是6,0 ,0,這將使服務器認爲命中是好的(因爲它認爲其他玩家在3,0,0),但是當它要將信息發送到你的插件時,被擊中的玩家最終得到他的位置更新,然後該位置被髮送到您的插件,而不是實際讓事件被調用的初始位置。

再一次,我沒有做太多的研究,所以這就是我的想法,也許我錯了,也許不是。

0

如果有以下任何一項;服務器,玩家擊球或損壞的球員都有延遲,這會影響命中距離。我跑了測試。大量的測試。

+0

太棒了你明白了!也許你可以將此標記爲可接受的進一步參考? – ItzBenteThePig