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

Стартап [WIP] Code Snippets - Полезные куски кода и некоторые неочевидные вещи. [+ Ликбез]

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

  1. Blc_Dragon

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

    Баллы:
    76
    топ аргументы, а то, что замена строки гораздо дольше, чем замена символа, всем почему то пофиг


    Обращаться во множественном числе ко мне не надо. если Вы хотели показать свою вежливость, то в этом случае обращения пишутся с большой буквы


    (Ни разу не сталкивался с подобным, поэтому не думал об этом.)
    Окес, терь буду юзать (ибо стало понятно зачем), но вот разница в 10-15 раз все еще удручает.
     
    Последнее редактирование: 13 май 2017
  2. Shevchik

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

    Баллы:
    173
    Имя в Minecraft:
    _Shevchik_
    Ты запускал несколько раз заново. Что говорит о полном непонимании что такое JIT и как он работает. Ищи статье на хабре по бенчмаркингу в JVM и Java.
     
  3. Blc_Dragon

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

    Баллы:
    76
    Хочется сказать тебе тоже самое.


    (ща бы затупить и поставить в цикл строку data=data.replace();, хотя это все еще никак не меняет скорости его выполнения.)
     
    Последнее редактирование: 13 май 2017
  4. xDark

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

    Баллы:
    96
    while (true) {
    ....
    Thread.sleep(5000L);
    }
     
  5. Blc_Dragon

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

    Баллы:
    76
    это к чему?
     
  6. slavik123123123

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

    Баллы:
    143
    Имя в Minecraft:
    Leymooo
    Тебе до его знаний очень далеко)
     
  7. xDark

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

    Баллы:
    96
    жизненно
     
  8. Shevchik

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

    Баллы:
    173
    Имя в Minecraft:
    _Shevchik_
    Данный бенчмарк всё ещё неправильный, ибо OSR, и не учтён прогрев (банально если свапнуть местами цикл с реплейсом и цикл с translate получатся другие результаты). Короче используй JMH для бенчей, и будет тебе счастье. И результаты кстати примерно одинаковыми получатся (на java8, на java7 с replace всё будет плохо).

    P.S. И при всём при этом на результаты на самом деле наплевать, ибо кроме крайних случаев - транслейт кодов выполняется один раз при инициализации сообщения. (Да и простой реплейс - некорректный способ трансляции колор кодов, но я об этом уже говорил. А что самое забавное - технически способ трансляции в спайготе тоже неправильный, ибо не учитывает суррогатные пары юникода, и хоть это и работает в теекущий момент, расширение таблицы цветовых кодов в некоторых случаях выстрелит в ногу).
    А по теме - пожалуй стоит упомянуть некоторые странности с PlayerInteractEvent.
    Дело в том что у этого эвента очень неочевидное поведение с точки зрения состояния отменённости.
    Почти каждый наверняка сталкивался что если игнорировать отменённые эвенты, то в некоторых случаях PlayerInteract эвент будет считаться отменённым, но само действие выполнится, но если при этом его отменить, то действие не выполнится, что вызывает много вопросов по типу какого хера. А всё на самом деле просто. Если посмотреть в исходники, то можно увидеть что вот так определён PlayerInteractEvent::isCancelled:
    Код:
    public boolean isCancelled() {
         return this.useInteractedBlock() == Event.Result.DENY;
    }
    а вот так PlayerInteractEvent::setCancelled:
    Код:
    public void setCancelled(final boolean cancel) {
         this.setUseInteractedBlock(cancel ? Event.Result.DENY : ((this.useInteractedBlock() == Event.Result.DENY) ? Event.Result.DEFAULT : this.useInteractedBlock()));
         this.setUseItemInHand(cancel ? Event.Result.DENY : ((this.useItemInHand() == Event.Result.DENY) ? Event.Result.DEFAULT : this.useItemInHand()));
    }
    Таким образом видно что для того чтобы эвент считался отменённым, достаточно чтобы не было взаимодействия с блоком (то бишь тыкаье воздуха даже с итемом руке считается отменённым сразу, даже если итем всё равно заюзается (что кстати нехило доставляло тем кто пытался запретить использовать некоторые потионы скажем)), а вот сама отмена и отменяет взаимодействие с блоком, и использование итема.
     
    Последнее редактирование: 14 май 2017
  9. Автор темы
    OsipXD

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

    Баллы:
    173
    Skype:
    osip.fatkullin
    Имя в Minecraft:
    OsipXD
    Спасибо, добавил в шапку.
     
  10. Dereku

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

    Баллы:
    173
    Skype:
    derek_unavailable
    Имя в Minecraft:
    _Dereku
    О войне с tacc и replace:
    Код:
    Benchmark                         Mode   Cnt  Score      Error    Units
    QuestionResolver.NCstringReplace  avgt   50   207,018    ± 0,418  ns/op
    QuestionResolver.NCtacc           avgt   50   486,524    ± 0,784  ns/op
    QuestionResolver.stringReplace    avgt   50   796,546    ± 1,559  ns/op
    QuestionResolver.tacc             avgt   50   2193,245   ± 3,228  ns/op
    С префиксом NC - без цвета.

    Полный лог, исходник.

    Алярма: Результат этого бенча не говорит о том, что надо выкинуть tacc к чертям и не использовать его вовсе, я просто показал что быстрее. Только считать надо не наносекунды. И не читать конфиг в событиях попутно используя replace по всякому поводу.
     
    Последнее редактирование: 14 май 2017
  11. Jampire

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

    Баллы:
    173
    Skype:
    jampire-h
    Имя в Minecraft:
    Jampire
    почему все забывают что реплейс & на параграф это изначально не верный способ колоризации? ведь это вызовет ошибки парсинга в некоторых случаях и полностью сделает символ & бесполезным.

    более сложный регекс который работает по функциональности на уровне tacc будет работать медленнее
     
  12. Dereku

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

    Баллы:
    173
    Skype:
    derek_unavailable
    Имя в Minecraft:
    _Dereku
    Потому что короче и "удобнее". Но вообще сам ручками-ножками за tacc.
     
  13. alexandrage

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

    Баллы:
    173
    Столько срача в измерение наносекунт. Типичный рубакит.
     
  14. Dereku

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

    Баллы:
    173
    Skype:
    derek_unavailable
    Имя в Minecraft:
    _Dereku
    Спасибо что написал своё мнение об этом :good:
     
  15. Larin

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

    Баллы:
    103
    Мерят наносекунды, ведь сервер лагает из-за tacc, а не из-за того, что ты говнокодер.

    Вообще не представляю, сколько МБ данных надо конвертировать через tacc, что-бы это было хоть как-то заметно.
     
  16. Exception_Prototype

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

    Баллы:
    96
  17. Автор темы
    OsipXD

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

    Баллы:
    173
    Skype:
    osip.fatkullin
    Имя в Minecraft:
    OsipXD
    Ликбез: Отладка плагина (Удаленная отладка)
    Это немного не в тему топика, но половина проблем, которые пишутся сюда решились бы если бы люди знали об отладке.
    Отладчики есть в любой IDE. Они позволяют вам пройти по коду по шагам и посмотреть что делает ваша программа на каждом шаге, и соответствует ли это вашим ожиданиям. При этом вам не нужно захламлять код выводом промежуточных отладочных сообщений и не получится такой ситуации, когда вы забыли убрать сообщения об отладке из кода и из-за этого на сервере плагин спамит ненужной (а зачастую совершенно неинформативной, простите за каламбур) информацией.
    Подробнее об отладке:
    - Debugging Your First Java Application [EN]
    - Отладчик IntelliJ IDEA
    Эти инструкции приведены для ознакомления с отладкой, поэтому не имеет большого значения, что они для IntelliJ IDEA. В остальных IDE отладчики имеют схожий функционал, за небольшими исключениями.

    Люди, которые не пользуются отладкой при разработке делятся на две категории:

    1. Те кто не знают об отладке вообще (а что так можно было?);
    2. И те кто не знают как отлаживать плагин, который запускается не у вас внутри IDE, а на сервере (удаленная отладка/Remote Debug).
    Первые неизбежно попадают во вторую группу после того как понимают, что отладка это круто. Цель этого поста - кратко рассказать об удалённой отладке, то есть как отлаживать Java приложения, которые запускаются вне IDE.

    Самый простой способ (не могу не прорекламировать) - это использовать Gradle + BukkitGradle (пример и инструкция по ссылке).

    Второй способ.
    Всё будет, опять же, показываться на примере IDEA, но в остальных IDE всё делается по аналогии.
    Краткая инструкция:

    1. Run -> Edit Configurations...
    2. Нажать "+" в левом верхнем углу (или Alt + Insert)
    3. Выбрать "Remote" в появившемся списке
    4. Ввести необходимые настройки:
      [​IMG]
      Галочка "Single instance only" говорит о том, что одновременно может быть запущена только одна копия отладчика (больше не имеет смысла, да и не получится).
      Так же вам может понадобиться изменить Host и Port, если сервер запускается не на локальной машине.
    5. Нужно добавить опцию JVM (которая обведена на скриншоте) в ваш скрипт запуска сервера или в переменную среды JAVA_OPTS.
    6. Нажать "OK" для сохранения
    suspend
    Если значение параметра равно y, виртуальная машина будет ждать подключения приложения-отладчика. Этот параметр удобно использовать для проверки правильности настройки подключения из IDE.​

    server

    Если значение этого параметра равно y, запускаемое приложение ожидает подключения приложения-отладчика, то есть работает как сервер. В противном случае оно подключается к приложению-отладчику по заданному адресу (нам понадобится только значение y).​

    address

    Адрес для подключения. В нашем случае, когда server установлено в y, этот параметр указывает к какому порту ожидается подключение.​

    После этого запустите сервер и, когда он запустится, можете начинать отладку:
    [​IMG]

    Дополнительные материалы:
    - Attach Intellij-IDEA debugger to a running java process [EN]
     
  18. Dereku

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

    Баллы:
    173
    Skype:
    derek_unavailable
    Имя в Minecraft:
    _Dereku
    Определение версии nms почти без проблем или "для тех, кто столкнулся с какулей от md_5 при определении версии nms из версии сервера":

    Java 8 Stream:
    Код:
    public static String getNmsVersion() {
        String nmsPackage = "net.minecraft.server";
        String pckg = Arrays.stream(Package.getPackages())
                .filter(pk -> pk.getName().startsWith(nmsPackage))
                .map(pk -> pk.getName()).findFirst().orElse(null);
    
        if (pckg == null) {
            throw new RuntimeException("Failed to recognize nms version");
        }
    
        return pckg.substring(nmsPackage.length() + 1);
    }
    Java 7:
    Код:
    public static String getNmsVersion() {
        String nmsPackage = "net.minecraft.server";
        for (Package pack : Package.getPackages()) {
            if (pack.getName().startsWith(nmsPackage)) {
                return pack.getName().substring(nmsPackage.length() + 1);
            }
        }
        throw new RuntimeException("Failed to recognize nms version");
    }
    xDark:
    Код:
    public static String getNmsVersion() {
        return Bukkit.getServer().getClass().getPackage().getName()
                .replace("org.bukkit.craftbukkit", "");
    }
     
    Последнее редактирование: 8 июн 2017
  19. CraftCoder

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

    Баллы:
    108
    Имя в Minecraft:
    CraftCoderr
    Лооол. Рили такая есть проблема? Пока с таким не сталкивался....
     
  20. Dereku

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

    Баллы:
    173
    Skype:
    derek_unavailable
    Имя в Minecraft:
    _Dereku
    1.12-pre6.
     

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