2016-06-26 8 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 блока. Данные отправляются на сервер, но сервер понимает, что этот игрок слишком далеко, так что удар просто не отмечен как хит, и событие никогда не вызывается.

  • Если игрок был поражен, то это заставило бы сервер подумать, что он был в 3, 0, 0, хотя он переместился на 0, 0, 0. Так что скажем, что удар игрока равен 6, 0 , 0, что заставило бы сервер подумать, что хит в порядке (потому что он думает, что у другого игрока есть 3, 0, 0), но когда он собирается отправить информацию в ваш плагин, игрок, попавший, наконец, получает свое местоположение обновляется, а затем это местоположение отправляется в ваш плагин вместо исходного местоположения, которое фактически позволяет вызвать событие.

Опять же, я не провел много исследований, так что это то, о чем я думаю, может быть, я ошибаюсь, может быть, нет.

0

Если выполнено одно из следующих действий; сервер, удары игрока или поврежденный проигрыватель имеют задержку, это повлияет на удаленные расстояния. Я провел тесты. Много тестов.

+0

Отлично, вы поняли это! Возможно, вы могли бы отметить это как принятое для дальнейшего использования? – ItzBenteThePig