Хостинг серверов Minecraft playvds.com
  1. Вы находитесь в русском сообществе Bukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на русский язык плагины наших собратьев из других стран.
    Скрыть объявление

Помогите Изменение места спавна новых игроков

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

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

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

    Баллы:
    76
    Skype:
    luckyzeero
    Имя в Minecraft:
    LuckyZeeRo_
    Здравствуйте, такой на первый взгляд типичный и тупой вопрос, но я столкнулся с его проблемой. Я сделал телепортацию игрока на место спавна в отдельный мир, если он заходит впервые (проверка по бд).
    В чем же проблема... Когда игрок первый раз авторизируется, у него сначала пару секунд стоит загрузка одного мира, а потом его аж перекидает на второй, тоесть как бы такая задержка секунд 3-4 (Это если более менее комп норм), что не очень приемлемо. Как это оптимизировать или задать сразу же точку спавна туда куда надо, если игрок заходит первый раз?
    Код:
    // If new player
    public void onLogin(PlayerLoginEvent e) {
         if (!DataManager.isRegistered(e.getPlayer().getName())) {
              World world = Bukkit.getServer().getWorld("spawn");
              if (world != null) e.getPlayer().teleport(world.getSpawnLocation());
         }
    }
     
  2. Хостинг MineCraft
    <
  3. _MasterCapeXD_

    _MasterCapeXD_ Участник Пользователь

    Баллы:
    31
    Имя в Minecraft:
    _MasterCapeXD_
    Юзать PlayerJoinEvent пробовал?[DOUBLEPOST=1490942981,1490942904][/DOUBLEPOST]И @EventHandler не забыл? Просто в коде он отсутствует[DOUBLEPOST=1490943142][/DOUBLEPOST]И проверка перед телепортом выглядит странно...
    Код:
    if (world != null) e.getPlayer().teleport(world.getSpawnLocation());
     
  4. XjCyan1de

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

    Баллы:
    76
    Имя в Minecraft:
    XjCyan1de
    Просто поставь мир по умолчанию spawn
     
  5. Автор темы
    LuckyZeeRo

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

    Баллы:
    76
    Skype:
    luckyzeero
    Имя в Minecraft:
    LuckyZeeRo_
    Упс, я как раз PlayerJoinEvent юзал, ошибся. Думаю, может быть PlayerLoginEvent обработает чуток ранее чем игрок уже телепортируется на стандарт.
    Почему странно? Если мира не существует, то не телепортировать. Я иногда на локалку ставлю тестировать, а там нету мультимиров, мне там и не надо телепортация.[DOUBLEPOST=1490946444][/DOUBLEPOST]
    В проперти сервера? Тогда собьются все профили игроков, и начнется заполнение ими в мире spawn. Переносить муторно, тем более координаты и т.п. пострадают. А если вдруг резко опять нужно будет сменить спавн, или сделать разные миры спавна для разных категорий людей?
     
  6. AtomicInteger

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

    Баллы:
    46
    Во-первых, вынеси все возможные переменные из метода:
    1) World world = Bukkit.getServer().getWorld("spawn"); сделай глобальной.
    2) Location spawnLocation = world.getSpawnLocation(); тоже глобально.
    Во-вторых, зачем проверять, не заходил ли игрок на сервер ранее через базу?Почему бы не сделать вот так?
    Код:
    if(!event.getPlayer().hasPlayedBefore())
    В итоге, получится что-то вроде этого:
    Код:
    @EventHandler(priority = EventPriority.HIGHEST)
    private void onPlayerJoin(PlayerJoinEvent event) {
        if (!event.getPlayer().hasPlayedBefore())
            event.getPlayer().teleport(respawnLocation);
    }
     
  7. Автор темы
    LuckyZeeRo

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

    Баллы:
    76
    Skype:
    luckyzeero
    Имя в Minecraft:
    LuckyZeeRo_
    Потому что это плагин авторизации, и мне нужно и удобнее / быстрее проверить, зарегистрирован ли он.[DOUBLEPOST=1490998153,1490998033][/DOUBLEPOST]
    Через login event может сработать? Если там проверять по Highest и обрабатывать только если Result.ALLOW
     
  8. AtomicInteger

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

    Баллы:
    46
    Через login вряд ли, так как он срабатывает в момент загрузки, то есть когда скрин зарисован фоном.
     
  9. Автор темы
    LuckyZeeRo

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

    Баллы:
    76
    Skype:
    luckyzeero
    Имя в Minecraft:
    LuckyZeeRo_
    Но как бы игрока уже можно взять с этого события
     
  10. AtomicInteger

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

    Баллы:
    46
    Игрока конечно можно, но я не уверен, что он уже есть в мире.Но такое лучше проверять экспериментальным путём, нежели сидеть тут и ванговать.
     
  11. Автор темы
    LuckyZeeRo

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

    Баллы:
    76
    Skype:
    luckyzeero
    Имя в Minecraft:
    LuckyZeeRo_
    Да я вот взялся полностью переписывать свой плаг авторизации, уменьшить немного говнокода и оптимизировать работу, да и походу решил тут спросить, стоит ли так делать, дабы лишнее время не тратить.
     
  12. AtomicInteger

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

    Баллы:
    46
    Я всё же, склоняюсь к тому, что наибольшее количество времени занимает обращение к бд.
     
  13. Автор темы
    LuckyZeeRo

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

    Баллы:
    76
    Skype:
    luckyzeero
    Имя в Minecraft:
    LuckyZeeRo_
    Да нет, там 10-30 милисекунд чтение. Плюс я сделал PreparedStatement, что еще ускоряет время вдвое практически. Суть в скорости прогрузки мира. Видно, что сначала один мир прогружается, только появляется черное окно - тут же идет телепортация в другой мир, опять прогрузка. Вроде как бы и не сильный минус, но все же, первое впечатление игрока - важная штука.
     
  14. gamerforEA

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

    Баллы:
    143
    Skype:
    sk2000sk1
    Имя в Minecraft:
    gamerforEA_MCPC
    10 мс - это очень много. Чтобы было 20 TPS, каждый тик должен длиться не более 50 мс. Когда у вас будет большой онлайн, игроки будут часто заходить/выходить, так что работа с БД начнёт доставлять некоторые неудобства.
     
  15. alexandrage

    alexandrage Администратор

    Баллы:
    173
    Skype:
    alexandr0116
    И тут на помощь приходит редис сервер).
     
  16. gamerforEA

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

    Баллы:
    143
    Skype:
    sk2000sk1
    Имя в Minecraft:
    gamerforEA_MCPC
    Redis - это замечательно, вот только я ни разу не видел, чтобы кто-то его применял для MC.
     
  17. SecDet

    SecDet Новичок Пользователь

    Баллы:
    6
    Имя в Minecraft:
    SecDet
    spawnpoint - Perfect!
     

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