[Решено] Задержка между сообщениями в PlayerPickupItemEvent

_Timoxa_

Активный участник
Пользователь
Баллы
76
Имя в Minecraft
T1MOX4
Доброй ночи.
Я только начал разбираться в яве, и сам не смог в этом разобраться.
Суть проблемы:
В плагине NoFlyPvP нет задержки между сообщениями когда игрок с режимом полёта подходит к лежащему на земле предмету, и идет лишний спам в чате.
Как мне добавить задержку между сообщениями допустим в 3 секунды ?

PHP:
@EventHandler
  public void onPlayerPickupItem(PlayerPickupItemEvent event)
  {
    if ((event.getPlayer().getAllowFlight()) && (Settings.pickUpItemBlocked()) && (!event.getPlayer().hasPermission("noflypvp.exempt.pickupitem")))
    {
      String warningMsg = Settings.getPickUpItemWarningMsg();
      String disableMsg = Settings.getPickUpItemDisableMsg();
      if ((warningMsg != "") && (warningMsg.length() > 0)) {
        noflypvp.sendMsg(event.getPlayer(), "PickUpItemWarning", warningMsg);
      }
      if ((disableMsg != "") && (disableMsg.length() > 0)) {
        noflypvp.sendMsg(event.getPlayer(), "PickUpItemDisable", disableMsg);
      }
      event.getPlayer().updateInventory();
      event.setCancelled(true);
    }
  }
 
Доброй ночи.
Я только начал разбираться в яве, и сам не смог в этом разобраться.
Суть проблемы:
В плагине NoFlyPvP нет задержки между сообщениями когда игрок с режимом полёта подходит к лежащему на земле предмету, и идет лишний спам в чате.
Как мне добавить задержку между сообщениями допустим в 3 секунды ?

PHP:
@EventHandler
  public void onPlayerPickupItem(PlayerPickupItemEvent event)
  {
    if ((event.getPlayer().getAllowFlight()) && (Settings.pickUpItemBlocked()) && (!event.getPlayer().hasPermission("noflypvp.exempt.pickupitem")))
    {
      String warningMsg = Settings.getPickUpItemWarningMsg();
      String disableMsg = Settings.getPickUpItemDisableMsg();
      if ((warningMsg != "") && (warningMsg.length() > 0)) {
        noflypvp.sendMsg(event.getPlayer(), "PickUpItemWarning", warningMsg);
      }
      if ((disableMsg != "") && (disableMsg.length() > 0)) {
        noflypvp.sendMsg(event.getPlayer(), "PickUpItemDisable", disableMsg);
      }
      event.getPlayer().updateInventory();
      event.setCancelled(true);
    }
  }
Как вариант это сообщение можно выводить на титл, а если с сообщением то делаем так:
Во время эвента добавляем игрока в хэшмап и в onEnable сделать шедулер который будет отправлять сообщение игрокам в хэшмапе, а затем их удалять от туда.

Возможно это говнокод и есть варианты лучше, но это то что пришло мне в голову
 
Как вариант это сообщение можно выводить на титл, а если с сообщением то делаем так:
Во время эвента добавляем игрока в хэшмап и в onEnable сделать шедулер который будет отправлять сообщение игрокам в хэшмапе, а затем их удалять от туда.

Возможно это говнокод и есть варианты лучше, но это то что пришло мне в голову
Спасибо.
Желательно бы написать хоть примерно что да как, так как я совсем не знаю функций баккита :)
 
Вот пример класса с отправкой сообщений с задержкой:
Java:
import java.util.concurrent.TimeUnit;

import org.bukkit.command.CommandSender;

import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder;

public final class LatencyMessageSender
{
    private final Cache<CommandSender, Object> cache;

    public LatencyMessageSender(long latency)
    {
        this.cache = CacheBuilder.newBuilder().weakKeys().expireAfterWrite(latency, TimeUnit.SECONDS).build();
    }

    public boolean sendMessage(CommandSender sender, String message)
    {
        if (this.cache.getIfPresent(sender) != null)
            return false;

        sender.sendMessage(message);
        this.cache.put(sender, new Object());
        return true;
    }
}
 
Вот пример класса с отправкой сообщений с задержкой:
Java:
import java.util.concurrent.TimeUnit;

import org.bukkit.command.CommandSender;

import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder;

public final class LatencyMessageSender
{
    private final Cache<CommandSender, Object> cache;

    public LatencyMessageSender(long latency)
    {
        this.cache = CacheBuilder.newBuilder().weakKeys().expireAfterWrite(latency, TimeUnit.SECONDS).build();
    }

    public boolean sendMessage(CommandSender sender, String message)
    {
        if (this.cache.getIfPresent(sender) != null)
            return false;

        sender.sendMessage(message);
        this.cache.put(sender, new Object());
        return true;
    }
}
Лол, я даже не знал о таких классах :/
Я бы сделал через new Thread...Thread.sleep
 
В общем-то можно, но я о таких даже не знал)
Я тоже раньше не знал, но, когда пару раз столкнулся с подобными необычными штуками, заинтересовался и решил ознакомиться с содержимым нескольких библиотек. Теперь вот пользуюсь. :)
 
Всем спасибо, я попытался сделать задержку, но я такой рукопоп что полезли ошибки из других мест.
В общем я забил на это и нашел аналог
http://rubukkit.org/threads/admn-se...kontrol-tvorcheskogo-rezhima-1-7-1-11.106125/

Но все же мне было интересно почитать разные способы реализации задержки отправки сообщений.
 
Всем спасибо, я попытался сделать задержку, но я такой рукопоп что полезли ошибки из других мест.
В общем я забил на это и нашел аналог
http://rubukkit.org/threads/admn-se...kontrol-tvorcheskogo-rezhima-1-7-1-11.106125/

Но все же мне было интересно почитать разные способы реализации задержки отправки сообщений.
Да оно все сводится к мапе с часиками, только в разных обертках. Ну или глобальной переменной для общего интервала всем игрокам.
 
Назад
Верх