Minecraft / Bukkit - 延迟如何影响命中距离?

时间:2016-06-26 15:09:25

标签: minecraft bukkit latency

在我尝试制作一个反热插件的冒险中,我意识到我需要更多的知识与延迟以及Minecraft客户端和服务器的行为方式有关。我正在开发的当前插件正在处理覆盖范围。我必须考虑的一个因素是确定远程打击是由于滞后还是客户造成的。

我已经想过几种方法来检测滞后/高ping,以确保远程命中是由于客户端而不是滞后。我的问题是,谁必须“落后”才能实现远程打击呢?打人;被击中的人;还是服务器?
当我说服务器时,如果主机的互联网速度变慢而服务器程序运行缓慢,它会有所作为吗?这会影响命中注册的方式(这会导致命中吗?)

如果重要,我确定点击之间距离的设置只是一个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));
  }
}

3 个答案:

答案 0 :(得分:0)

我没有进行过任何测试,也没有做过那么多的研究,但是我的直觉告诉我,被击中的玩家是唯一一个可能因滞后而导致远击的玩家,这里有#s为什么我这么认为:

  • 如果服务器滞后,玩家仍会在同一时间发送信息,当服务器最终收到时,它会同时发生,因此看起来不会错误< / p>

  • 如果玩家击球时滞后,这意味着他可以击中另一名玩家,距离(根据玩家客户)只有3个区块。数据被发送到服务器,但服务器意识到该玩家距离太远,因此命中不会被标记为命中,并且永远不会调用该事件。

  • 如果被击中的玩家迟滞,那么即使他移动到0,0,0也会让服务器认为他是3,0,0。所以让我们说玩家击中是在6,0,0,这将使服务器认为命中是正常的(因为它认为其他玩家是在3,0,0),但是当它将要发送信息到你的插件,被击中的玩家最终会更新他的位置,然后该位置将被发送到您的插件,而不是实际让该事件被调用的初始位置。

同样,我还没有做过多少研究,所以这就是我的想法,也许我错了,也许不是。

答案 1 :(得分:0)

如果有以下任何一种情况;服务器,玩家击中或玩家受损有延迟,它会影响命中距离。我跑了测试。很多测试。

答案 2 :(得分:0)

server explenation

想象一下知道2名玩家坐标的服务器 示例:

Plant A[0, 64, 0]  
Laptop User[5, 64, 0]

但是当工厂A移动时,需要花费几毫秒时间向服务器说“嘿我向北移动了一个街区”然后又花了几毫秒再向笔记本电脑用户说'嘿,工厂A移动了一点' 。
现在,您可以想象当工厂A连接速度较慢时会发生什么,以及当笔记本电脑用户连接速度缓慢时会发生什么:)