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

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

Discussion in 'Разработка плагинов для новичков' started by LuckyZeeRo, Mar 31, 2017.

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

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

    Trophy Points:
    76
    Skype:
    luckyzeero
    Имя в Minecraft:
    LuckyZeeRo_
    Здравствуйте, такой на первый взгляд типичный и тупой вопрос, но я столкнулся с его проблемой. Я сделал телепортацию игрока на место спавна в отдельный мир, если он заходит впервые (проверка по бд).
    В чем же проблема... Когда игрок первый раз авторизируется, у него сначала пару секунд стоит загрузка одного мира, а потом его аж перекидает на второй, тоесть как бы такая задержка секунд 3-4 (Это если более менее комп норм), что не очень приемлемо. Как это оптимизировать или задать сразу же точку спавна туда куда надо, если игрок заходит первый раз?
    Code:
    // 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_ Участник Пользователь

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    Trophy Points:
    6
    Имя в Minecraft:
    SecDet
    spawnpoint - Perfect!
     

Share This Page