Вопрос Как в майнкрафте игрок ложиться спать?

q20w26a

Разработчик
Пользователь
Я вот хочу узнать как это происходит. По сути, должен отправляться пакет EntityMetadataPacket с позой Sleeping, ну и больше я ничего не знаю. Декомпилировал сервер, посмотрел - в блоке кровати ни слова про пакеты, в EntityHuman нашел EntityMetadataPacket, а самого класса пакета нет нигде. Как происходит сон?
 

asASTRA

Пользователь
Вот что-то нашел.
 

q20w26a

Разработчик
Пользователь
Спасибо, но это немного не то.
Как я понял, информация о том, спит ли игрок, хранится в DataWatcher'е. А потом EntityMetadataPacket отправляет все это на клиент. Ладно...
 

CarryLove

Пользователь
Спасибо, но это немного не то.
Как я понял, информация о том, спит ли игрок, хранится в DataWatcher'е. А потом EntityMetadataPacket отправляет все это на клиент. Ладно...
вероятно тебе это сможет помочь. https://bukkit.org/threads/checking-for-bed-sleep-and-night-passing.12378/
Авто объединение сообщений:

Ну и вот это...
Screenshot_4.pngScreenshot_5.png
Авто объединение сообщений:

Вот пример кода:
Java:
@EventHandler(ignoreCancelled = true)
public void onBedEnter(final PlayerBedEnterEvent event) {
    if (event.getBedEnterResult() != PlayerBedEnterEvent.BedEnterResult.OK) return;
    if (Checker.SKIPPING_WORLDS.contains(event.getPlayer().getWorld())) return;
    if (Checker.isVanished(event.getPlayer())) return;

    Bukkit.getScheduler().runTaskLater(Harbor.getHarbor(), () -> {
        final UUID playerUuid = event.getPlayer().getUniqueId();
        if (!(TimeUnit.MILLISECONDS.toSeconds(System.currentTimeMillis() - getCooldown(playerUuid)) >
                Config.getInteger("messages.chat.message-cooldown"))) return;

        Messages.sendWorldChatMessage(event.getBed().getWorld(),
                Config.getString("messages.chat.player-sleeping")
                        .replace("[player]", event.getPlayer().getName())
                        .replace("[displayname]", event.getPlayer().getDisplayName()));
        COOLDOWNS.put(playerUuid, System.currentTimeMillis());
    }, 1);
}
// ещё пример
@EventHandler
public void onSleep(PlayerBedEnterEvent bee) {

  Player p = bee.getPlayer();

  Game g = BedwarsRel.getInstance().getGameManager().getGameOfPlayer(p);
  if (g == null) {
    return;
  }

  if (g.getState() == GameState.STOPPED) {
    return;
  }

  bee.setCancelled(true);
}
// и ещё
public void OnPlayerBedEnterEvent(PlayerBedEnterEvent event) {
    
    Resident resident = CivGlobal.getResident(event.getPlayer().getName());

    if (resident == null) {
        event.setCancelled(true);
        return;
    }
            
    coord.setFromLocation(event.getPlayer().getLocation());
    Camp camp = CivGlobal.getCampFromChunk(coord);
    if (camp != null) {
        if (!camp.hasMember(event.getPlayer().getName())) {
            CivMessage.sendError(event.getPlayer(), "You cannot sleep in a camp you do not belong to.");
            event.setCancelled(true);
            return;
        }
    }       
}
// ну тут и говорить нечего
@EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true)
public void onBedEnter(final PlayerBedEnterEvent event) {
  cancel(
      event,
      true,
      event.getPlayer().getWorld(),
      match.getPlayer(event.getPlayer()),
      TranslatableComponent.of("match.disabled.bed"));
}
// ...
@EventHandler(priority = EventPriority.LOW)
public void onPlayerBedEnter(final PlayerBedEnterEvent e) {
    if (DEBUG) {
        plugin.getLogger().info(e.getEventName());
    }
    // Check world
    if (inWorld(e.getPlayer())) {
        if (actionAllowed(e.getPlayer(),e.getBed().getLocation(), SettingsFlag.BED)) {
            return;
        }
        // Not allowed
        Util.sendMessage(e.getPlayer(), ChatColor.RED + plugin.myLocale(e.getPlayer().getUniqueId()).islandProtected);
        e.setCancelled(true);
    }
}
 

q20w26a

Разработчик
Пользователь
Нет, это совсем не то. Мне сказали что нужно было отправлять какой-то пакет (какой именно я уже не помню) с координатами кровати. Интересно, но все проверки происходят на клиенте, поэтому если кому вздумается сделать сон без кроватей -- делать кровать вам все равно придется, но скорее всего фейковую.
 

Marvin724

Пользователь
Нет, это совсем не то. Мне сказали что нужно было отправлять какой-то пакет (какой именно я уже не помню) с координатами кровати. Интересно, но все проверки происходят на клиенте, поэтому если кому вздумается сделать сон без кроватей -- делать кровать вам все равно придется, но скорее всего фейковую.
Как я понял, пакет использования кровати к версии 1.14 был удалён. возможно, это чем-то поможет
https://www.spigotmc.org/threads/how-can-i-make-a-fake-player-sleep.371318/#post-3391128

Да, клиент очень на многое влияет. Хотел сделать луч маяка, но для этого нужен блок...

offtop
 

Phantomchik

Модератор
Пользователь
Вы нашли ответ на свой вопрос? Если да, то пожалуйста, выберите лучший ответ и пометьте тему как решённую.
 

Комнаты в чате

Верх Низ