Помогите Работа с BukkitRunnable

Hittcliff

Активный участник
Пользователь
Баллы
66
Имя в Minecraft
Relion128
Мне нужно дабы код:

Код:
                    if (b.getX() > valueX[rec] && b.getX() < valueXX[rec]) {
                        if (b.getY() > valueY[rec] && b.getY() < valueYY[rec]) {
                            if (b.getZ() > valueZ[rec] && b.getZ() < valueZZ[rec]) {

                                tested(event, array[rec]);
                            }
                        }
                        rec++;
                    }

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



Код:
        int timer = Integer.parseInt(getConfig().getString("array.time")) * 20;

        new BukkitRunnable() {

            int rec = 0;
            int rec3 = Integer.parseInt(getConfig().getString("array.value"));

            List<String> list = config.getStringList("array.dir");
            String[] array = list.toArray(new String[0]);

            @Override
            public void run() {

                if (rec == rec3 || rec > rec3) {

                    rec = 0;
                } else {

                    // Позиция 1
                    int[] valueX = new int[rec3];
                    valueX[rec] = Integer.parseInt(getConfig().getString("swarp." + array[rec] + ".x: " + "pos1"));

                    int[] valueY = new int[rec3];
                    valueY[rec] = Integer.parseInt(getConfig().getString("swarp." + array[rec] + ".y: " + "pos1"));

                    int[] valueZ = new int[rec3];
                    valueZ[rec] = Integer.parseInt(getConfig().getString("swarp." + array[rec] + ".z: " + "pos1"));

                    // Позиция 2
                    int[] valueXX = new int[rec3];
                    valueXX[rec] = Integer.parseInt(getConfig().getString("swarp." + array[rec] + ".x: " + "pos2"));

                    int[] valueYY = new int[rec3];
                    valueYY[rec] = Integer.parseInt(getConfig().getString("swarp." + array[rec] + ".y: " + "pos2"));

                    int[] valueZZ = new int[rec3];
                    valueZZ[rec] = Integer.parseInt(getConfig().getString("swarp." + array[rec] + ".z: " + "pos2"));
                    Location b = player.getLocation();

                    if (b.getX() > valueX[rec] && b.getX() < valueXX[rec]) { //От сюда
                        if (b.getY() > valueY[rec] && b.getY() < valueYY[rec]) {
                            if (b.getZ() > valueZ[rec] && b.getZ() < valueZZ[rec]) {

                                tested(event, array[rec]);
                            }
                        }
                        rec++;
                    } //До сюда нужно делать задержку, дабы он работал с другой задержкой... Эта работает раз в 60 секунд..
                }
            }
        }.runTaskTimer(this, 0L, timer); //Эта допустим работает раз в 3 секунды..
Я пытался делить на классы, но суть такова, что код выше в любом случае обращается каждые 3 секунды, хотя мне нужно чтобы он делал это с задержкой в 60 секунд.


Для примера tested к которому обращается код выше:

Код:
 public void tested(PlayerJoinEvent event, String vois) {
        Player player = event.getPlayer();
        player.sendMessage(ChatColor.BLUE + "[DCore]: Вы на территорий: " + vois);
    }

Ах да, почему я просто не укажу основному циклу 60 секунд? Да просто потому, что он каждые 3 секунды ищет игрока, и если находит то должен выполнять действие с задержкой, например запускается песня, и дабы это песня каждые 3 секунды снова - снова - снова не включалась, нужно чтобы была задержка в цикле.
 
Ну вот то что ты не знаешь это видно
Если он их хоть чуть чуть знает, то может поймет мой код🙂
С приватами, что то типо этого: https://hastebin.com/qajivimipa.java
Спасибо большое. Тему пока не закрывайте, но судя по коду который мне скинул Cookie1337 он вроде как подходит. Я чуть попозже попробую с ним разобраться, если чего напишу.
 
Ты бы ему конфиг исправил, чтобы нормально хранилось.
С конфигом тут всё более менее терпимо, нужно сосредоточиться на более приоритетных изменениях.
Во всю суть происходящего вчитываться пока что не буду(позже), но вот это поправлю сейчас: ...
Можно было заодно заменить ".x: " + "pos1" на ".x: pos1", но это тоже, чисто придраться 🙂
Тебе не нравится реализация? Предложи свою или раскритикуй эту!
1. ArrayList<Area> area — лучше использовать интерфейс (можно даже Collection), чтобы не завязываться на имплементацию.
2. isOnPrivate — с точки зрения англ. языка, правильно будет isInPrivate.
3. (x > area.x1) && (x < area.x2) ... — избыточные скобки.
4. Оба метода isOnPrivate логичнее расположить в классе Area — привет от ООП.
5. .get();; — пропустил вторую точку с запятой 🙂
6. .get() у Optional<Area> выкинет исключение, если элемента нет. И привет, плагин выключен. Следует использовать orElse(null), либо ловить исключение в точке вызова метода.
7. public void onJoin(PlayerJoinEvent e) { ... } — не используй присвоение внутри if-а, вычисли значение отдельно, сравни его отдельно. Это, конечно, не C++, где if (abc = 12) вполне себе нормальная конструкция, но некоторые правила стоит соблюдать.
8. Вызов isOnPrivate, сравнение результата, вызов enterArea — лучше вынести в отдельный приватный метод, чтобы избежать повторения кода.
И это чтобы придраться, сам же попросил 🙂
Единственный относительно серъёзный вопрос к твоему коду — ты не показал, как этим пользоваться 🙂
 
Последнее редактирование:
С конфигом тут всё более менее терпимо, нужно сосредоточиться на более приоритетных изменениях.
Можно было заодно заменить ".x: " + "pos1" на ".x: pos1", но это тоже, чисто придраться 🙂

1. ArrayList<Area> area — лучше использовать интерфейс (можно даже Collection), чтобы не завязываться на имплементацию.
2. isOnPrivate — с точки зрения англ. языка, правильно будет isInPrivate.
3. (x > area.x1) && (x < area.x2) ... — избыточные скобки.
4. Оба метода isOnPrivate логичнее расположить в классе Area — привет от ООП.
5. .get();; — пропустил вторую точку с запятой 🙂
6. .get() у Optional<Area> выкинет исключение, если элемента нет. И привет, плагин выключен. Следует использовать orElse(null), либо ловить исключение в точке вызова метода.
7. public void onJoin(PlayerJoinEvent e) { ... } — не используй присвоение внутри if-а, вычисли значение отдельно, сравни его отдельно. Это, конечно, не C++, где if (abc = 12) вполне себе нормальная конструкция, но некоторые правила стоит соблюдать.
8. Вызов isOnPrivate, сравнение результата, вызов enterArea — лучше вынести в отдельный приватный метод, чтобы избежать повторения кода.
И это чтобы придраться, сам же попросил 🙂
Единственный относительно серъёзный вопрос к твоему коду — ты не показал, как этим пользоваться 🙂
Это чуть позже скажу как более менее сделаю всё стабильно. Один вопрос, ссылку на скрипт который мне давали я про https://hastebin.com/qajivimipa.java там указан статичный класс, и внутри этого статичного класса создаётся " public long" суть такова, что конфиги не будут работать в статичном классе.. и разумеется изменить на данные из конфига не получится. Чего мне сделать!?
 
Нуу, 1, 3, 4 сделано чтобы было больш понятно. Со вторым у меня всегда проблема. 7 и 8, но ведь..., разницы то нет🙂 Единственные две вещи, которые требуют немедленного фикса это 5(Критикал) и 6(Надо переделать чуть чуть)
А пользоваться этим, можно как готовым листенером для приватов.
 
указан статичный класс, и внутри этого статичного класса создаётся " public long" суть такова, что конфиги не будут работать в статичном классе.. и разумеется изменить на данные из конфига не получится. Чего мне сделать!?
Тебе нужно написать два метода -- суть сериализация и десериализация коллекции зон в/из конфига. Не нужно делать их внутри класса Area, пусть это будут методы твоего главного класса, тогда нет никакой проблемы с тем, что экземпляры Area не имеют ссылки на нестатичный контент.

Например, у тебя в классе Main:
public void saveAreas() { ... }
и
public void reloadAreas() { ... };
внутри них смело пользуйся конфигом и коллекцией зон (будь то Set<Area>, Map<Area> или что угодно).
 
Тебе нужно написать два метода -- суть сериализация и десериализация коллекции зон в/из конфига. Не нужно делать их внутри класса Area, пусть это будут методы твоего главного класса, тогда нет никакой проблемы с тем, что экземпляры Area не имеют ссылки на нестатичный контент.

Например, у тебя в классе Main:
public void saveAreas() { ... }
и
public void reloadAreas() { ... };
внутри них смело пользуйся конфигом и коллекцией зон (будь то Set<Area>, Map<Area> или что угодно).
Код:
[18:55:42] [Server thread/ERROR]: Could not load 'plugins\DCore.jar' in folder 'plugins'
org.bukkit.plugin.InvalidPluginException: main class `ru.digital.come.copy_main' does not extend JavaPlugin
    at org.bukkit.plugin.java.PluginClassLoader.<init>(PluginClassLoader.java:73) ~[spigot-1.10-R0.1-SNAPSHOT-latest.jar:git-Spigot-c3e4052-1953f52]
    at org.bukkit.plugin.java.JavaPluginLoader.loadPlugin(JavaPluginLoader.java:131) ~[spigot-1.10-R0.1-SNAPSHOT-latest.jar:git-Spigot-c3e4052-1953f52]
    at org.bukkit.plugin.SimplePluginManager.loadPlugin(SimplePluginManager.java:329) ~[spigot-1.10-R0.1-SNAPSHOT-latest.jar:git-Spigot-c3e4052-1953f52]
    at org.bukkit.plugin.SimplePluginManager.loadPlugins(SimplePluginManager.java:251) [spigot-1.10-R0.1-SNAPSHOT-latest.jar:git-Spigot-c3e4052-1953f52]
    at org.bukkit.craftbukkit.v1_10_R1.CraftServer.loadPlugins(CraftServer.java:297) [spigot-1.10-R0.1-SNAPSHOT-latest.jar:git-Spigot-c3e4052-1953f52]
    at org.bukkit.craftbukkit.v1_10_R1.CraftServer.reload(CraftServer.java:744) [spigot-1.10-R0.1-SNAPSHOT-latest.jar:git-Spigot-c3e4052-1953f52]
    at org.bukkit.Bukkit.reload(Bukkit.java:539) [spigot-1.10-R0.1-SNAPSHOT-latest.jar:git-Spigot-c3e4052-1953f52]
    at org.bukkit.command.defaults.ReloadCommand.execute(ReloadCommand.java:25) [spigot-1.10-R0.1-SNAPSHOT-latest.jar:git-Spigot-c3e4052-1953f52]
    at org.bukkit.command.SimpleCommandMap.dispatch(SimpleCommandMap.java:141) [spigot-1.10-R0.1-SNAPSHOT-latest.jar:git-Spigot-c3e4052-1953f52]
    at org.bukkit.craftbukkit.v1_10_R1.CraftServer.dispatchCommand(CraftServer.java:646) [spigot-1.10-R0.1-SNAPSHOT-latest.jar:git-Spigot-c3e4052-1953f52]
    at org.bukkit.craftbukkit.v1_10_R1.CraftServer.dispatchServerCommand(CraftServer.java:632) [spigot-1.10-R0.1-SNAPSHOT-latest.jar:git-Spigot-c3e4052-1953f52]
    at net.minecraft.server.v1_10_R1.DedicatedServer.aL(DedicatedServer.java:437) [spigot-1.10-R0.1-SNAPSHOT-latest.jar:git-Spigot-c3e4052-1953f52]
    at net.minecraft.server.v1_10_R1.DedicatedServer.D(DedicatedServer.java:400) [spigot-1.10-R0.1-SNAPSHOT-latest.jar:git-Spigot-c3e4052-1953f52]
    at net.minecraft.server.v1_10_R1.MinecraftServer.C(MinecraftServer.java:672) [spigot-1.10-R0.1-SNAPSHOT-latest.jar:git-Spigot-c3e4052-1953f52]
    at net.minecraft.server.v1_10_R1.MinecraftServer.run(MinecraftServer.java:571) [spigot-1.10-R0.1-SNAPSHOT-latest.jar:git-Spigot-c3e4052-1953f52]
    at java.base/java.lang.Thread.run(Unknown Source) [?:?]
Caused by: java.lang.ClassCastException: class ru.digital.come.copy_main
    at java.base/java.lang.Class.asSubclass(Unknown Source) ~[?:?]
    at org.bukkit.plugin.java.PluginClassLoader.<init>(PluginClassLoader.java:71) ~[spigot-1.10-R0.1-SNAPSHOT-latest.jar:git-Spigot-c3e4052-1953f52]
    ... 15 more

Это по двум ссылкам т.е:
https://hastebin.com/imamokiguw.java
https://hastebin.com/axinopuhor.java

Для проверки скриптов создал новые классы, и временно назначил главным новый скрипт в котором и проверял скрипты из ссылок выше. У обоих ошибка одна и та-же...
 
plugin.yml не правильный
Это пример так то, тебе надо создать Main класс, и сделать в нем подгрузку приватов, после чего регистрировать листенер для приватов.
 
https://hastebin.com/axinopuhor.java я конечно не знаю, но мне кажется что код по всем законам жанра выглядит сложнее для восприятия?)
@FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true)
Совсем уже обленился 🙂 человеку-то объяснить не забудь, что надо юзать lombok.
BiConsumer<Player, Area> consumer
Раз пошла такая пьянка, почему бы не задекларировать свой FunctionalInterface?)) PlayerAreaConsumer, например 🙂
 
plugin.yml не правильный
Код:
name: DCore
main: ru.digital.come.mains
version: 1.1
authors:
description:
commands:
 dcore:
  usage: /dcore menu show

И класс mains,
Код:
package ru.digital.come;

import org.bukkit.Location;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.event.player.PlayerMoveEvent;

import java.util.Collection;
import java.util.function.BiConsumer;

public class mains implements Listener {
    private Collection<Area> areas;
    private BiConsumer<Player, Area> consumer;

    public mains(Collection<Area> areas, BiConsumer<Player, Area> consumer) {
        this.areas = areas;
        this.consumer = consumer;
    }


    public Area searchArea(Location loc) {
        return areas.stream().filter(area -> area.isInPrivate(loc)).findAny().orElse(null);
    }

    @EventHandler
    public void onMove(PlayerMoveEvent e) {
        Area currentArea = searchArea(e.getTo());
        if(currentArea == null) {
            return;
        }

        if(!currentArea.isInPrivate(e.getFrom())) {
            consumer.accept(e.getPlayer(), currentArea);
        }
    }

    @EventHandler
    public void onJoin(PlayerJoinEvent e) {
        Area currentArea = searchArea(e.getPlayer().getLocation());
        if(currentArea != null) {
            consumer.accept(e.getPlayer(), currentArea);
        }
    }


    /**
     * Одно из заведомых условий: x2 > x1, y2 > y1, z2 > z1
     * immutable
     */
    public static class Area {
        String name;
        long x1;
        long y1;
        long z1;
        long x2;
        long y2;
        long z2;
        String sound;
        String category;
        int soundDuration;
        double soundVolume;

        public boolean isInPrivate(long x, long y, long z) {
            return x > x1 && x < x2 && y > y1 && y < y2 && z > z1 && z < z2;
        }

        public boolean isInPrivate(Location loc) {
            return isInPrivate(loc.getBlockX(), loc.getBlockY(), loc.getBlockZ());
        }
    }
}
 
Совсем уже обленился 🙂

Раз пошла такая пьянка, почему бы не задекларировать свой FunctionalInterface?)) PlayerAreaComsumer, например 🙂
Не, зачем, если есть BiConsumer?))00(Код должен быть минимально прост и быстр, чтобы разработчик мог выйти и попить чая к примеру)
 
Не, зачем, если есть BiConsumer?))00(Код должен быть минимально прост и быстр, чтобы разработчик мог выйти и попить чая к примеру)
Чтобы он, выйдя и попив чаю, не потерял логику из головы — а в этом лучше помогут не (T t, U u), а (Player player, Area area) 🙂 Извиняюсь, это всё издержки кровавого.
Главный класс плагина должен наследоваться от JavaPlugin, иначе никак. Класс, расширяющий Listener, по нашим оторванным от жизни обсуждениям должен жить где-то рядом.
 
Слушай, может скинешь весь код целиком, можно в .zip. Можно в ЛС, если не хочешь публично.
 
С конфигом тут всё более менее терпимо, нужно сосредоточиться на более приоритетных изменениях.
Можно было заодно заменить ".x: " + "pos1" на ".x: pos1", но это тоже, чисто придраться 🙂

1. ArrayList<Area> area — лучше использовать интерфейс (можно даже Collection), чтобы не завязываться на имплементацию.
2. isOnPrivate — с точки зрения англ. языка, правильно будет isInPrivate.
3. (x > area.x1) && (x < area.x2) ... — избыточные скобки.
4. Оба метода isOnPrivate логичнее расположить в классе Area — привет от ООП.
5. .get();; — пропустил вторую точку с запятой 🙂
6. .get() у Optional<Area> выкинет исключение, если элемента нет. И привет, плагин выключен. Следует использовать orElse(null), либо ловить исключение в точке вызова метода.
7. public void onJoin(PlayerJoinEvent e) { ... } — не используй присвоение внутри if-а, вычисли значение отдельно, сравни его отдельно. Это, конечно, не C++, где if (abc = 12) вполне себе нормальная конструкция, но некоторые правила стоит соблюдать.
8. Вызов isOnPrivate, сравнение результата, вызов enterArea — лучше вынести в отдельный приватный метод, чтобы избежать повторения кода.
И это чтобы придраться, сам же попросил 🙂
Единственный относительно серъёзный вопрос к твоему коду — ты не показал, как этим пользоваться 🙂
Раунд!)
 
А можно попросить в нагрузку plugin.yml и ru.digital.other.commands, а то с импортом беда, я не смогу собрать.
 
Назад
Верх