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

LuckyZeeRo

Активный участник
Пользователь
Баллы
96
Имя в Minecraft
i0xHeX
Здравствуйте, такой на первый взгляд типичный и тупой вопрос, но я столкнулся с его проблемой. Я сделал телепортацию игрока на место спавна в отдельный мир, если он заходит впервые (проверка по бд).
В чем же проблема... Когда игрок первый раз авторизируется, у него сначала пару секунд стоит загрузка одного мира, а потом его аж перекидает на второй, тоесть как бы такая задержка секунд 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());
     }
}
 
Юзать PlayerJoinEvent пробовал?
И @EventHandler не забыл? Просто в коде он отсутствует
И проверка перед телепортом выглядит странно...
JavaScript:
if (world != null) e.getPlayer().teleport(world.getSpawnLocation());
 
Просто поставь мир по умолчанию spawn
 
Юзать PlayerJoinEvent пробовал?
И @EventHandler не забыл? Просто в коде он отсутствует
И проверка перед телепортом выглядит странно...
JavaScript:
if (world != null) e.getPlayer().teleport(world.getSpawnLocation());
Упс, я как раз PlayerJoinEvent юзал, ошибся. Думаю, может быть PlayerLoginEvent обработает чуток ранее чем игрок уже телепортируется на стандарт.
Почему странно? Если мира не существует, то не телепортировать. Я иногда на локалку ставлю тестировать, а там нету мультимиров, мне там и не надо телепортация.
Просто поставь мир по умолчанию spawn
В проперти сервера? Тогда собьются все профили игроков, и начнется заполнение ими в мире spawn. Переносить муторно, тем более координаты и т.п. пострадают. А если вдруг резко опять нужно будет сменить спавн, или сделать разные миры спавна для разных категорий людей?
 
Во-первых, вынеси все возможные переменные из метода:
1) World world = Bukkit.getServer().getWorld("spawn"); сделай глобальной.
2) Location spawnLocation = world.getSpawnLocation(); тоже глобально.
Во-вторых, зачем проверять, не заходил ли игрок на сервер ранее через базу?Почему бы не сделать вот так?
Java:
if(!event.getPlayer().hasPlayedBefore())
В итоге, получится что-то вроде этого:
Java:
@EventHandler(priority = EventPriority.HIGHEST)
private void onPlayerJoin(PlayerJoinEvent event) {
    if (!event.getPlayer().hasPlayedBefore())
        event.getPlayer().teleport(respawnLocation);
}
 
Во-вторых, зачем проверять, не заходил ли игрок на сервер ранее через базу?Почему бы не сделать вот так?
Java:
if(!event.getPlayer().hasPlayedBefore())
В итоге, получится что-то вроде этого:
Java:
@EventHandler(priority = EventPriority.HIGHEST)
private void onPlayerJoin(PlayerJoinEvent event) {
    if (!event.getPlayer().hasPlayedBefore())
        event.getPlayer().teleport(respawnLocation);
}
Потому что это плагин авторизации, и мне нужно и удобнее / быстрее проверить, зарегистрирован ли он.
Во-первых, вынеси все возможные переменные из метода:
1) World world = Bukkit.getServer().getWorld("spawn"); сделай глобальной.
2) Location spawnLocation = world.getSpawnLocation(); тоже глобально.
Во-вторых, зачем проверять, не заходил ли игрок на сервер ранее через базу?Почему бы не сделать вот так?
Java:
if(!event.getPlayer().hasPlayedBefore())
В итоге, получится что-то вроде этого:
Java:
@EventHandler(priority = EventPriority.HIGHEST)
private void onPlayerJoin(PlayerJoinEvent event) {
    if (!event.getPlayer().hasPlayedBefore())
        event.getPlayer().teleport(respawnLocation);
}
Через login event может сработать? Если там проверять по Highest и обрабатывать только если Result.ALLOW
 
Потому что это плагин авторизации, и мне нужно и удобнее / быстрее проверить, зарегистрирован ли он.

Через login event может сработать? Если там проверять по Highest и обрабатывать только если Result.ALLOW
Через login вряд ли, так как он срабатывает в момент загрузки, то есть когда скрин зарисован фоном.
 
Но как бы игрока уже можно взять с этого события
Игрока конечно можно, но я не уверен, что он уже есть в мире.Но такое лучше проверять экспериментальным путём, нежели сидеть тут и ванговать.
 
Игрока конечно можно, но я не уверен, что он уже есть в мире.Но такое лучше проверять экспериментальным путём, нежели сидеть тут и ванговать.
Да я вот взялся полностью переписывать свой плаг авторизации, уменьшить немного говнокода и оптимизировать работу, да и походу решил тут спросить, стоит ли так делать, дабы лишнее время не тратить.
 
Да я вот взялся полностью переписывать свой плаг авторизации, уменьшить немного говнокода и оптимизировать работу, да и походу решил тут спросить, стоит ли так делать, дабы лишнее время не тратить.
Я всё же, склоняюсь к тому, что наибольшее количество времени занимает обращение к бд.
 
Я всё же, склоняюсь к тому, что наибольшее количество времени занимает обращение к бд.
Да нет, там 10-30 милисекунд чтение. Плюс я сделал PreparedStatement, что еще ускоряет время вдвое практически. Суть в скорости прогрузки мира. Видно, что сначала один мир прогружается, только появляется черное окно - тут же идет телепортация в другой мир, опять прогрузка. Вроде как бы и не сильный минус, но все же, первое впечатление игрока - важная штука.
 
10 мс - это очень много. Чтобы было 20 TPS, каждый тик должен длиться не более 50 мс. Когда у вас будет большой онлайн, игроки будут часто заходить/выходить, так что работа с БД начнёт доставлять некоторые неудобства.
 
10 мс - это очень много. Чтобы было 20 TPS, каждый тик должен длиться не более 50 мс. Когда у вас будет большой онлайн, игроки будут часто заходить/выходить, так что работа с БД начнёт доставлять некоторые неудобства.
И тут на помощь приходит редис сервер).
 
Redis - это замечательно, вот только я ни разу не видел, чтобы кто-то его применял для MC.
 
spawnpoint - Perfect!
 
Назад
Верх