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

Помогите Как работает радиус getNearbyEntities

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

  1. xDark

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

    Баллы:
    96
    Stream API только начиная с Java 8.
    луп через все чанки = фриз сервера (Причем большой фриз)
    Только перед отгрузкой чанка придется УБИТЬ абсолютно всех ентити в этом чанке если он загружен, т.к. это не безопасно выгружать чанк, который используется
     
  2. Автор темы
    Exception_Prototype

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

    Баллы:
    96
    А что же делать, если в нём живность из customnps?
     
  3. xDark

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

    Баллы:
    96
    Респавнить заново при загрузке чанка и убивать при отгрузке.
     
  4. Автор темы
    Exception_Prototype

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

    Баллы:
    96
    Stream API только начиная с Java 8. - это понятно, но каждому такому stream должна быть старая замена в виде for в данном случае она имеется?
     
  5. xDark

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

    Баллы:
    96
    Ты видимо не понимаешь
    stream(), filter(), и т.д. ТОЛЬКО начиная с Java 8.
    В джаве 7 этого нет.
    А вообще уже есть бета версии JDK 9, попробую - ка ее.
     
  6. Автор темы
    Exception_Prototype

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

    Баллы:
    96
    Да я понял)
    Я имею ввиду, что если у нас java8, то существует подобный способ и для java7.
    К примеру: //Если что это JavaFX приложение.
    Код:
            //Java 7
            stage.setOnHidden(new EventHandler<WindowEvent>() {
                @Override
                public void handle(WindowEvent we) {
                    if (FXMLController.getTimer() != null) {
                        FXMLController.getTimer().cancel();
                    }
                }
            });
            //Java 8
    //        stage.setOnHidden((WindowEvent we) -> {
    //            if (FXMLController.getTimer() != null) {
    //                FXMLController.getTimer().cancel();
    //            }
    //        });
    
    Для всех новых stream есть ПОХОЖАЯ реализация на более старых версиях.
     
  7. xDark

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

    Баллы:
    96
    Comparator
     
  8. Автор темы
    Exception_Prototype

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

    Баллы:
    96
    Если сервер сам при загрузке чанка (прогруженным игроком) спавнит живность в том чанке, то получается, когда чанк выгружается он так же так всю живность убивает? Это так работает?

    Если я возьму не загруженный чанк, то как реализовать вашу подсказку? Как заспарвнить в нём живность сделать всё что мне нужно с ней, а далее правильно выгрузить без потерь данных но с удалённой живностью.
     
  9. xDark

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

    Баллы:
    96
    chunk.load();
     
  10. Автор темы
    Exception_Prototype

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

    Баллы:
    96
    Перечитайте пожалуйста моё предыдущие сообщение, я его дописал.
     
  11. xDark

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

    Баллы:
    96
    chunk.unload(true);
    https://hub.spigotmc.org/javadocs/spigot/org/bukkit/Chunk.html
     
  12. Автор темы
    Exception_Prototype

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

    Баллы:
    96
    Окей. Идём дальше.
    1. Как загружать и выгружать в ручную чанки я понял. Так же понял, как это делать безопасно.
    2. "луп через все чанки = фриз сервера (Причем большой фриз)" - я имел ввиду, что если при получении всех чанков я найду с помощью
    Код:
    chunk.isLoaded();
    не загруженный чанк и именно его занесу куда то в лист и потом вручную загружу. Ваше сообщение про фриз "луп" - что это значит?
    3.
    Код:
    ArrayList<Chunk> chunks = Bukkit.getWorld("kek").getChunks().stream()
    .filter((chunk) -> {
    return !chunk.isLoaded();
    }).map((chunk) -> {
    return (Chunk) chunk;
    }).collect(Collectors.toCollection(ArrayList::new));
    
    Что вы хотели донести до меня этим кодом? Занести в лист загруженные или не загруженные чанки?
    Если не трудно, то объясните пожалуйста.
    Я просто не особо понимаю систему stream().
    4. Подобную операцию планируется делать раз в неделю для удаления баганых entity в мире (пули и пару предметов из flans и customnps), но если это сделать в отдельном потоке, чтобы из этого потока можно было так же взаимодействовать с чанками, то как лучше это реализовать?
    5. API увидел, ознакомлюсь. Спасибо.
     
  13. xDark

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

    Баллы:
    96
    Это - список, который "создается" не через луп, тем самым, нагрузка меньше
    И в этом листе будут только не загруженные чанки.
     
  14. Автор темы
    Exception_Prototype

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

    Баллы:
    96
    Хорошо, тогда план действий:
    1. Получаю все чанки.
    2. НЕ загруженные чанки сохраняю в отдельном листе, с загруженными делаю сразу всё что нужно.
    3. Все не загруженные чанки ПО очереди гружу, делаю всё что мне нужно с entity внутри, после чего безопасно с сохранением выгружаю.
    Я ничего не забыл? Что скажите про отдельный поток? Как лучше реализовать?
     
  15. xDark

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

    Баллы:
    96
    Executor
     
  16. alexandrage

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

    Баллы:
    173
    Да просто загружай чанки
    Ничего подобного, ентити и тайлы пишутся в чанк.
     
  17. xDark

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

    Баллы:
    96
    Мммм странно... У меня всегда деспаунились... пойду смотреть где я косячил..
     
  18. Автор темы
    Exception_Prototype

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

    Баллы:
    96
    С "Executor" я имел дело только разве что команды правильно направлять (на нужные классы), а как Executor относится к потоком. Я этого не знаю. Или вы это не для потоков написали?

    Нашёл вот такой метод https://hub.spigotmc.org/javadocs/spigot/org/bukkit/World.html#getEntitiesByClass(java.lang.Class)
    В нём сказано, что можно получить с мира всех указанных entity. И там и другие методы были, которые получали всю живность, но они ведь получают её только с прогруженных чанков ?

    Я правда ещё не успел посмотреть, но есть ли похожий метод в Chunk классе, но было бы здорово получить сразу всех нужных мне entity, а не проверять каждого на нужный мне тип.
     
  19. alexandrage

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

    Баллы:
    173
    Вот то что в чанк пишется http://pastebin.com/dVZAazbd
     
  20. Автор темы
    Exception_Prototype

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

    Баллы:
    96
    Нашёл вот такой метод https://hub.spigotmc.org/javadocs/spigot/org/bukkit/World.html#getEntitiesByClass(java.lang.Class)

    ArrayList<Chunk> chunks = Bukkit.getWorld("kek").getChunks()
    А чего то я не наблюдаю метода getChunks(); Эм.
    Так всё же, как получить все чанки в мире?
     

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