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

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

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

  1. Reality_SC

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

    Баллы:
    123
    Имя в Minecraft:
    Reality_SC
    Несколько замечаний.
    1. Хотелось бы обратить внимание на все эти беспорядочные связи точки и двоеточия. Это очень трудно читать и поведение/структура конфига становится неочевидной.
    Постарайся следовать простым правилам именования секций/ключей: "abc.def.xyz". И лучше без пробелов. Примеры выше превратятся из
    "swarp.vois.x:_pos1" в "swarp.vois.x1" и
    ".swarp..vois.sound:" в "swarp.void.sound".

    2. Не нужно пользоваться конфигов внутри таймеров. Даже если это можно себе позволить по ряду причин:
    • события (player join event) и таймеры, в которых производятся манипуляции с конфигом, запускаются относительно редко
    • реализация конфига представляет собой точно такой же ассоциативный массив (Map) и обращение к нему по факту не приводит к чтению/записи на диск
    это всё равно будет очень плохим вариантом по следующим причинам:
    • влияние плагина на быстродействие сервера в большой степени будет полагаться на правильную настройку таймеров
    • нельзя полагаться на чужую реализацию интерфейсов — она может быть в любой момент изменена и её поведение не очевидным образом скажется на работе сервера
    • это совершенно неправильно с точки зрения архитектуры — фактически ты пытаешься пользоваться интерфейсом к файлам для того, чтобы хранить данные в оперативной памяти.
    Я бы посоветовал тебе попробовать разобраться в том, как работает код, который я ранее скидывал (тот его кусок, который относится к чтению и сохранению кубоидов).

    3. Запись вида rec == rec3 || rec > rec3 на самом деле представляет собой rec >= rec3.

    4. Код BukkitRunnable внутри обработчика события public void OnJoin(PlayerJoinEvent event) выполняется раз в секунду (кроме случая rec == rec3, тогда чтобы перейти с 3 до 0 записи нужно 2 секунды) и отменяется, когда игрок попал в зону. При отмене запускается другой таймер, который отсчитывает sound-time раз по 1 секунде.
    На самом деле это равно sound-time секунд и тебе вообще не нужен таймер для этого (нужно только отложенное одноразовое действие, scheduler.runTaskLater, точно не помню название метода).

    5. Если игрок выйдет из игры, то таймер никогда не отменится. В каждый момент времени на него всё равно будет повешан или проверяющий (да), или играющий таймер (вообще нет), который будет забивать своим выполнением тики главного цикла и память сервера. BukkitRunnable будет хранить ссылку на event, в котором хранится ссылка на игрока. Если игрок перезайдёт, ему будет создан новый экземпляр Player.
    Это, мягко говоря, оставляет возможности для ддоса сервера входом и выходом игроков.

    Возможно, можно ещё что-то найти, я очень бегло посмотрел.
     
  2. Reality_SC

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

    Баллы:
    123
    Имя в Minecraft:
    Reality_SC
    Вот, сделал ещё правки в том коде, который скидывал ранее.
    Убрал lombok, чтобы он не мешал.
    Добавил много комментариев, кое что упростил.
    Если будут вопросы, спрашивай.
    Сейчас оно всё должно работать, только вопрос с этим огромнейшим методом "обработки команд".
     

    Вложения:

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

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

    Баллы:
    66
    Имя в Minecraft:
    Relion128
    Так сейчас загрузил открыл как проект Maven, сначала ошибка при компиле, потом разобрался что к чему (просто он пытался собирать проект используя JRE я переключил JDK) далее всё собрал и понял что ты сменил некоторые момент чтения из конфига, это я понял и всё поправил в конфах теперь пашет нормально.. но меня раздражает что в IDE в скриптах подсвечивает мол ошибка кода это не мешает сборке но для работы с плагином мешает, как сделать чтобы он перестал жаловать на эти ошибки. IDE Eclipse.
     
  4. Reality_SC

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

    Баллы:
    123
    Имя в Minecraft:
    Reality_SC
    На какие именно ошибки он ругается, накидай плиз скринов под спойлер?
     
  5. Автор темы
    Hittcliff

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

    Баллы:
    66
    Имя в Minecraft:
    Relion128
    Код:
      
     private final MovingPlayersCatcher catcher = new MovingPlayersCatcher();
        /**
         * Ассоциативный массив, хранщий пары [Название зоны; Зона]
         */
        private final Map<String, Area> areas = new HashMap<>();
    
        /**
         * Ассоциативный массив, хранящий пары [Игрок; Зона, в которой он находится]
         */
        private final Map<Player, Area> playersPerAreas = new HashMap<>();
    
    getServer().getPluginManager().registerEvents(catcher, this);
    processMovedPlayers(catcher.getMovedPlayersAsync());
    
       playersPerAreas.clear();
            areas.clear();
    
    
                Area area = new Area(name,
                        body.getInt("x: pos1"), body.getInt("y: pos1"), body.getInt("z: pos1"),
                        body.getInt("x: pos2"), body.getInt("y: pos2"), body.getInt("z: pos2"),
                        body.getString("category"),
                        body.getString("sound"),
                        body.getInt("soundDuration"),
                        body.getDouble("soundVolume"));
                areas.put(name, area);
    
    for (Map.Entry<String, Area> entry : areas.entrySet()) {
    
    Area area = entry.getValue();
    
                Area previous = playersPerAreas.get(player);
                Optional<Area> optional = searchAreaByPlayerLocation(player.getLocation());
    
                    Area current = optional.get();
                    playersPerAreas.put(player, current);
    
        private Optional<Area> searchAreaByPlayerLocation(Location loc) {
            return areas.values().stream()
    
        private void onPlayerEnteringArea(Player player, Area area) {
    
                    if (player.isOnline() && Objects.equals(playersPerAreas.get(player), area)) {
    
        public void playSoundForPlayer(Player player, Area area) {
     

    Вложения:

  6. Reality_SC

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

    Баллы:
    123
    Имя в Minecraft:
    Reality_SC
    Я бы убедился, что файлы классов Area и MovingPlayersCatcher лежат в одной папке с файлом главного класса, и что во всех классах правильно прописаны package и import-ы.
     
  7. Автор темы
    Hittcliff

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

    Баллы:
    66
    Имя в Minecraft:
    Relion128
    Я не знаю, я открыл в IDE проект как Maven, далее -> Maven Clean, для сборки -> Maven Build. Ошибки образовались изначально, я просто распаковал ваш архив, далее открыл его как проект и ошибки.

    Как бы он работает и собирается проект, но в игре не пойму как он запускается, раз через раз, конфиги имеют такую структуру:

    swarp:
    Boss:
    'x: pos1': -214
    'y: pos1': 40
    'z: pos1': 44
    'x: pos2': -194
    'y: pos2': 44
    'z: pos2': 63
    sound: piano.music
    category: master
    sound-time: 255
    sound-volume: 1.0

    он будет работать, но если создать новый он его просто не ест и никак не воспринимает... не знаю даже почему, весь код перерыскал... сначала понял что проблема была в том, что скрипт который отвечает за добавление данных в конфиги создавал их используя String т.е в конфигах были скобки и в них значение, я специально убрал все скобки с координат, и он заработает если сотню раз перезапустить и перезайти.. не знаю, сейчас голова не варит, завтра попробую посмотреть чего там именно с area классом, а так-же глянуть как он читает файлы.. я понял по вашим комментариям что к чему, за что спасибо.
     
  8. hyndorik

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

    Баллы:
    98
    Имя в Minecraft:
    hyndo
    Иди яву учи, тебе уже кучу готовых примеров кинули а ты чет тугодум какой то
     
  9. Reality_SC

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

    Баллы:
    123
    Имя в Minecraft:
    Reality_SC
    Автору, в личной переписке нельзя прицеплять.

    p.s. ничего интересного.
     

    Вложения:

    • hittcliff_3.zip
      Размер файла:
      109,9 КБ
      Просмотров:
      10

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