- Баллы
- 76
- Имя в Minecraft
- OJIEKCAHDP
Как открыть игроку табличку с уже набранным текстом, знаю, что можно через пакет, но там пустая табличка, подскажите пожалуйста 

Последнее редактирование:
Следуйте инструкциям в видео ниже, чтобы узнать, как установить наш сайт как веб-приложение на главный экран вашего устройства.
Примечание: Эта функция может быть недоступна в некоторых браузерах.

Как открыть игроку табличку с уже набранным текстом, знаю, что можно через пакет, но там пустая табличка, подскажите пожалуйста![]()
Да, спасибо конечно, но я не хочу качать 2 плагина, которые будут использоваться раз в год и то лишь мелкая их часть. Мне нужен вариант без прочих плагинов.
Как не пытался разобраться - ничего, тем более если отсылать пакет с табличкой, то SignChangeEvent не видит её.
Раз решил идти в протоколы сам - будь готов изучать всё вручную. Для отправки текста в табличке тебе нужно сначала отправить на клиент блок с этой самой табличкой с текстом. По ссылке, которую тебе отправили, это и делают - за тобой остается адаптировать код без PL.Да, спасибо конечно, но я не хочу качать 2 плагина, которые будут использоваться раз в год и то лишь мелкая их часть. Мне нужен вариант без прочих плагинов.
А кто тебе сказал устанавливать какие-то плагины? В треде написан исходный код того, что тебе нужно, достаточно просто изучить его и сделать что-то подобное.Да, спасибо конечно, но я не хочу качать 2 плагина, которые будут использоваться раз в год и то лишь мелкая их часть. Мне нужен вариант без прочих плагинов.
public void open(Player player) {
Objects.requireNonNull(player, "player");
if (!player.isOnline()) {
return;
}
Location location = player.getLocation();
this.position = new BlockPosition(location.getBlockX(), location.getBlockY() + (255 - location.getBlockY()), location.getBlockZ());
player.sendBlockChange(this.position.toLocation(location.getWorld()), Material.OAK_SIGN.createBlockData());
PacketContainer openSign = ProtocolLibrary.getProtocolManager().createPacket(PacketType.Play.Server.OPEN_SIGN_EDITOR);
PacketContainer signData = ProtocolLibrary.getProtocolManager().createPacket(PacketType.Play.Server.TILE_ENTITY_DATA);
openSign.getBlockPositionModifier().write(0, this.position);
NbtCompound signNBT = (NbtCompound) signData.getNbtModifier().read(0);
for (int line = 0; line < SIGN_LINES; line++) {
signNBT.put("Text" + (line + 1), this.text.size() > line ? String.format(NBT_FORMAT, color(this.text.get(line))) : "");
}
signNBT.put("x", this.position.getX());
signNBT.put("y", this.position.getY());
signNBT.put("z", this.position.getZ());
signNBT.put("id", NBT_BLOCK_ID);
signData.getBlockPositionModifier().write(0, this.position);
signData.getIntegers().write(0, ACTION_INDEX);
signData.getNbtModifier().write(0, signNBT);
try {
ProtocolLibrary.getProtocolManager().sendServerPacket(player, signData);
ProtocolLibrary.getProtocolManager().sendServerPacket(player, openSign);
} catch (InvocationTargetException exception) {
exception.printStackTrace();
}
inputs.put(player, this);
}
постоянно вижу эти бессмысленые проверки isOnline(). Это метод из оффлайн плеера (интерфейс Player просто наследует его), и он для него и создан и работает так:!player.isOnline()
А в чем проблема то, лол? Если запуск в асинхроне, или вовсе отложен, то проверка позволит не делать лишнего просчета.постоянно вижу эти бессмысленые проверки isOnline(). Это метод из оффлайн плеера (интерфейс Player просто наследует его), и он для него и создан и работает так:
Bukkit.getPlayer(uuid) != null
Из чего следует, что если игрок оффлайн, то в мапе игроков его нет, т. е. он null. Другое дело, если передаете оффлайн плеера
Итераций нет - там самая обычная мапа <UUID, EntityPlayer>.лишняя итерация по игрокам. гет игрока тогда уж лучше делать в этом самом потоке. но, да. так то верно, прогадал. но часто встречал плагинах, где этот метод юзается в основном потоке не единожды