- Баллы
- 11
- Имя в Minecraft
- Begginer1567
Как сделать задержку перед телепортаций? Возможно ли как то использовать телепортацию из EssentialsX
Следуйте инструкциям в видео ниже, чтобы узнать, как установить наш сайт как веб-приложение на главный экран вашего устройства.
Примечание: Эта функция может быть недоступна в некоторых браузерах.
Bukkit.getScheduler().scheduleSyncDelayedTask(plugin, () -> { } , 1 * 20);
//1 * 20 - Задержка будет 1 секунду
//Plugin - создаешь конструктор (если юзаешь в мейне, тогда this)
//{} - действие
new BukkitRunnable() {new BukkitRunnable() {
public void run() {
bla bla
}.runTaskLater(plugin, 100L);
}
Ошибку скинь, у тебя наверное myloc1 или plugin null.new BukkitRunnable() {
public void run() {
p.teleport(myloc1);
}.runTaskLater(plugin, 100L);
}
ошибка
Задержка задаётся в тиках. 20 тиков = 1 сек. Соответственно 100 тиков = 5 сек.Упс, я тупой, ошибки нет, проблема теперь в том что я не могу понять сколько в секундах задерка. 100L = 3 секунды?
А можно ли как то отменить это действие если человека ударят?Задержка задаётся в тиках. 20 тиков = 1 сек. Соответственно 100 тиков = 5 сек.
Проверяй ивент дамага и останавливай шедулер.А можно ли как то отменить это действие если человека ударят?
if (tp.contains(p)) {
p.sendMessage(ChatColor.DARK_RED + "Вы уже телепортируетесь!");
return true;
}
p.sendMessage(ChatColor.GREEN + "Телепортация начнётся через 3 секунды!");
tp.add(p);
new BukkitRunnable() {
public void run() {
if (tp.contains(p)) {
tp.remove(p);
p.teleport(tpLoc);
}
}
}.runTaskLater(Main.instance, 60L);
@EventHandler
public void damage(EntityDamageEvent e) {
if (e.getEntity() instanceof Player) {
Player p = (Player) e.getEntity();
if (tp.contains(p)) {
tp.remove(p);
p.sendMessage("§c§lВас ударили, тп отменено!");
}
}
}
Каким образом его отменить? Я просто вообще не когда до этого с ними не работал.Проверяй ивент дамага и останавливай шедулер.
/*могут быть проблемы с удалением из мапы из другого потока, но здесь ты сам.
Можешь тыкнуть вместо HashMap -> ConcurrentHashMap,
но это будет такое себе решение. Смотри код Эссеншелса, там вроде норм сделано.*/
private static final Map<String, BukkitTask> map = new HashMap<>();
/**
* Телепортируем игрока p на локацию to с задержкой delay
*
* @param p игрок
* @param to локация, куда телепотируем
* @param delay задержка на телепортацию
*/
public void tp(Player p, Location to, long delay) {
//к примеру ты вызываешь метод
p.sendMessage(ChatColor.GREEN + "Телепортация начнётся через " + (delay / 20) + " секунд!");
map.put(p.getName(), Bukkit.getScheduler().runTaskLater(this, () -> { //this - plugin
p.teleport(to);
p.sendMessage(ChatColor.DARK_RED + "Вы уже телепортируетесь!");
map.remove(p.getName());
}, delay));
}
@EventHandler(ignoreCancelled = true)
public void damage(EntityDamageByEntityEvent event) {
if (event.getEntity() instanceof Player) {
final Player player = (Player) event.getEntity();
final BukkitTask task = map.remove(player.getName());
if (task != null && task.getTaskId() != -1) {
player.sendMessage("Ваша телепортиация отменена, вы получили урон.");
task.cancel();
}
}
}
Ты таймер удаляешь из листа, но сам таймер не отменяешь, соответственно телепортация по факту не отменена.Меня ударили - результата 0 я всё ещё тпхаюсь.
IEssentials ess = (IEssentials) Bukkit.getServer().getPluginManager().getPlugin("Essentials");Возможно ли как то использовать телепортацию из EssentialsX
При таком использовании задержка из конфига эссентиалс будет работать?IEssentials ess = (IEssentials) Bukkit.getServer().getPluginManager().getPlugin("Essentials");
Trade charge = new Trade("home", ess);
User user = ess.getUser(player);
user.getTeleport().teleport(location, charge, TeleportCause.COMMAND);
Агась. Я так юзаю на кастомный телепорт.При таком использовании задержка из конфига эссентиалс будет работать?