在我尝试制作一个反热插件的冒险中,我意识到我需要更多的知识与延迟以及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));
}
}
答案 0 :(得分:0)
我没有进行过任何测试,也没有做过那么多的研究,但是我的直觉告诉我,被击中的玩家是唯一一个可能因滞后而导致远击的玩家,这里有#s为什么我这么认为:
如果服务器滞后,玩家仍会在同一时间发送信息,当服务器最终收到时,它会同时发生,因此看起来不会错误< / p>
如果玩家击球时滞后,这意味着他可以击中另一名玩家,距离(根据玩家客户)只有3个区块。数据被发送到服务器,但服务器意识到该玩家距离太远,因此命中不会被标记为命中,并且永远不会调用该事件。
如果被击中的玩家迟滞,那么即使他移动到0,0,0也会让服务器认为他是3,0,0。所以让我们说玩家击中是在6,0,0,这将使服务器认为命中是正常的(因为它认为其他玩家是在3,0,0),但是当它将要发送信息到你的插件,被击中的玩家最终会更新他的位置,然后该位置将被发送到您的插件,而不是实际让该事件被调用的初始位置。
同样,我还没有做过多少研究,所以这就是我的想法,也许我错了,也许不是。
答案 1 :(得分:0)
如果有以下任何一种情况;服务器,玩家击中或玩家受损有延迟,它会影响命中距离。我跑了测试。很多测试。
答案 2 :(得分:0)