1. Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.
    Скрыть объявление
Скрыть объявление
В преддверии глобального обновления, мы проводим исследования, которые помогут нам сделать опыт пользования форумом ещё удобнее. Помогите нам, примите участие!

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

Тема в разделе "Разработка плагинов для новичков", создана пользователем Hittcliff, 6 янв 2018.

  1. Автор темы
    Hittcliff

    Hittcliff Активный участник Пользователь

    Баллы:
    66
    Имя в Minecraft:
    Relion128
    Спасибо большое. Тему пока не закрывайте, но судя по коду который мне скинул Cookie1337 он вроде как подходит. Я чуть попозже попробую с ним разобраться, если чего напишу.
     
  2. Cookie1337

    Cookie1337 Активный участник Пользователь

    Баллы:
    66
    Почему? Тебе не нравится реализация? Предложи свою или раскритикуй эту!
     
  3. Reality_SC

    Reality_SC Старожил Пользователь

    Баллы:
    123
    Имя в Minecraft:
    Reality_SC
    С конфигом тут всё более менее терпимо, нужно сосредоточиться на более приоритетных изменениях.
    Можно было заодно заменить ".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 — лучше вынести в отдельный приватный метод, чтобы избежать повторения кода.
    И это чтобы придраться, сам же попросил :)
    Единственный относительно серъёзный вопрос к твоему коду — ты не показал, как этим пользоваться :)
     
    Последнее редактирование: 7 янв 2018
  4. Автор темы
    Hittcliff

    Hittcliff Активный участник Пользователь

    Баллы:
    66
    Имя в Minecraft:
    Relion128
    Это чуть позже скажу как более менее сделаю всё стабильно. Один вопрос, ссылку на скрипт который мне давали я про https://hastebin.com/qajivimipa.java там указан статичный класс, и внутри этого статичного класса создаётся " public long" суть такова, что конфиги не будут работать в статичном классе.. и разумеется изменить на данные из конфига не получится. Чего мне сделать!?
     
  5. Cookie1337

    Cookie1337 Активный участник Пользователь

    Баллы:
    66
    Нуу, 1, 3, 4 сделано чтобы было больш понятно. Со вторым у меня всегда проблема. 7 и 8, но ведь..., разницы то нет:) Единственные две вещи, которые требуют немедленного фикса это 5(Критикал) и 6(Надо переделать чуть чуть)
    А пользоваться этим, можно как готовым листенером для приватов.
     
  6. Reality_SC

    Reality_SC Старожил Пользователь

    Баллы:
    123
    Имя в Minecraft:
    Reality_SC
    Тебе нужно написать два метода -- суть сериализация и десериализация коллекции зон в/из конфига. Не нужно делать их внутри класса Area, пусть это будут методы твоего главного класса, тогда нет никакой проблемы с тем, что экземпляры Area не имеют ссылки на нестатичный контент.

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

    Cookie1337 Активный участник Пользователь

    Баллы:
    66
    https://hastebin.com/axinopuhor.java я конечно не знаю, но мне кажется что код по всем законам жанра выглядит сложнее для восприятия?)
     
  8. Автор темы
    Hittcliff

    Hittcliff Активный участник Пользователь

    Баллы:
    66
    Имя в Minecraft:
    Relion128
    Код:
    [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

    Для проверки скриптов создал новые классы, и временно назначил главным новый скрипт в котором и проверял скрипты из ссылок выше. У обоих ошибка одна и та-же...
     
  9. Cookie1337

    Cookie1337 Активный участник Пользователь

    Баллы:
    66
    plugin.yml не правильный
    Это пример так то, тебе надо создать Main класс, и сделать в нем подгрузку приватов, после чего регистрировать листенер для приватов.
     
  10. Reality_SC

    Reality_SC Старожил Пользователь

    Баллы:
    123
    Имя в Minecraft:
    Reality_SC
    Совсем уже обленился :) человеку-то объяснить не забудь, что надо юзать lombok.
    Раз пошла такая пьянка, почему бы не задекларировать свой FunctionalInterface?)) PlayerAreaConsumer, например :)
     
  11. Автор темы
    Hittcliff

    Hittcliff Активный участник Пользователь

    Баллы:
    66
    Имя в Minecraft:
    Relion128
    Код:
    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());
            }
        }
    }
     
  12. Cookie1337

    Cookie1337 Активный участник Пользователь

    Баллы:
    66
    Не, зачем, если есть BiConsumer?))00(Код должен быть минимально прост и быстр, чтобы разработчик мог выйти и попить чая к примеру)
     
  13. Reality_SC

    Reality_SC Старожил Пользователь

    Баллы:
    123
    Имя в Minecraft:
    Reality_SC
    Чтобы он, выйдя и попив чаю, не потерял логику из головы — а в этом лучше помогут не (T t, U u), а (Player player, Area area) :) Извиняюсь, это всё издержки кровавого.
    Главный класс плагина должен наследоваться от JavaPlugin, иначе никак. Класс, расширяющий Listener, по нашим оторванным от жизни обсуждениям должен жить где-то рядом.
     
  14. Reality_SC

    Reality_SC Старожил Пользователь

    Баллы:
    123
    Имя в Minecraft:
    Reality_SC
    Слушай, может скинешь весь код целиком, можно в .zip. Можно в ЛС, если не хочешь публично.
     
  15. Автор темы
    Hittcliff

    Hittcliff Активный участник Пользователь

    Баллы:
    66
    Имя в Minecraft:
    Relion128
    Фул в ЛС кинул.
     
  16. Exception_Prototype

    Exception_Prototype Активный участник Пользователь

    Баллы:
    96
    Раунд!)
     
  17. Exception_Prototype

    Exception_Prototype Активный участник Пользователь

    Баллы:
    96
    Могу тоже глянуть, если хочешь.
     
  18. Автор темы
    Hittcliff

    Hittcliff Активный участник Пользователь

    Баллы:
    66
    Имя в Minecraft:
    Relion128
  19. Reality_SC

    Reality_SC Старожил Пользователь

    Баллы:
    123
    Имя в Minecraft:
    Reality_SC
    А можно попросить в нагрузку plugin.yml и ru.digital.other.commands, а то с импортом беда, я не смогу собрать.
     
  20. Автор темы
    Hittcliff

    Hittcliff Активный участник Пользователь

    Баллы:
    66
    Имя в Minecraft:
    Relion128

Поделиться этой страницей