1. Этот сайт использует файлы cookie. Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie. Узнать больше.
  2. Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.
    Скрыть объявление
Скрыть объявление
В преддверии глобального обновления, мы проводим исследования, которые помогут нам сделать опыт пользования форумом ещё удобнее. Помогите нам, примите участие!

Помогите Отображение текста определённому игроку

Тема в разделе "Разработка плагинов для новичков", создана пользователем Den_Abr, 15 фев 2013.

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

    Den_Abr Старожил Девелопер Пользователь

    Баллы:
    173
    Skype:
    Den_Abr
    Имя в Minecraft:
    Den_Abr
    Как показывать текст на табличке отдельным игрокам, а не всему серверу?
     
  2. fromgate

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

    Баллы:
    173
    Имя в Minecraft:
    fromgate
    Пока никак. Player.sendBlock не поддерживает BlockState. Т.е. текст с таблички персонально игроку не передашь. Разве что сделать наоброт: всем кроме нужно игрока передавать пустую табличку ;)

    Вообще проще воспользоваться картами. Там можно легко организовать для каждого игрока свою картинку.
     
  3. Автор темы
    Den_Abr

    Den_Abr Старожил Девелопер Пользователь

    Баллы:
    173
    Skype:
    Den_Abr
    Имя в Minecraft:
    Den_Abr
    Да вроде такое как-то можно сделать. У LMS такое есть, Taras говорил, что делал такое
     
    Alisher-98 нравится это.
  4. fromgate

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

    Баллы:
    173
    Имя в Minecraft:
    fromgate
    Ну... Давай порассуждаем.
    Есть методы, которые позволяют отправлять игроку "файльшивые данные":

    Player.sendBlockChange (Location loc, Material material, byte data)
    Player.sendBlockChange (Location loc, int material, byte data)

    Эти два метода позволяют отправлять игроку "фальшивый" блок в определенной локации. При этом у блока могут быть указаны только тип (id) и data. Т.е. ни о каком тексте речи быть не может. Т.е. можно отправить знак прикрепленный к примеру к южной стенке, но он будет пустой - без текста.

    Есть ещё метод:
    Player.sendChunkChange (Location loc, int sx, int sy, int sz, byte[] data)
    Этот метод посылает "массив" фальшивых блоков, я сомневаюсь, что он поддерживает текст.

    Так что таким, простым методом, такого эффекта не добиться.

    Тогда можно попытаться подойти со стороны craftbukkit и отправки пакетов. Отправлять игроку пакет об изменении текста знака с фальшивой информацией.

    Кстати, вот тебе и тема на bukkit: http://forums.bukkit.org/threads/protocollib-packets-sign-modification.129349/
     
    Den_Abr нравится это.
  5. Автор темы
    Den_Abr

    Den_Abr Старожил Девелопер Пользователь

    Баллы:
    173
    Skype:
    Den_Abr
    Имя в Minecraft:
    Den_Abr
  6. Sgy-x2

    Sgy-x2 Старожил Пользователь

    Баллы:
    123
    fromgate и Den_Abr нравится это.
  7. Автор темы
    Den_Abr

    Den_Abr Старожил Девелопер Пользователь

    Баллы:
    173
    Skype:
    Den_Abr
    Имя в Minecraft:
    Den_Abr
    Отлично!
     
    ВремяПриключений нравится это.
  8. fromgate

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

    Баллы:
    173
    Имя в Minecraft:
    fromgate
    В той теме, что я приводил есть ссылка на этот плагин :)
     
  9. Sgy-x2

    Sgy-x2 Старожил Пользователь

    Баллы:
    123
    Я её не открывал, потому что судя по тому посту, сыль была на тему, где идет обсуждение плагиностроения, а так как я от этого далек, и тема явно на английском, я её проигнорировал. Почитал эту тему и пошел смотреть новые плагины, и на примерно 3-4 странице наткнулся на этот плагин :)
     
  10. Автор темы
    Den_Abr

    Den_Abr Старожил Девелопер Пользователь

    Баллы:
    173
    Skype:
    Den_Abr
    Имя в Minecraft:
    Den_Abr
    Я тоже его встречал, но не обратил внимания :)

    Вот над чем думал:
    Стоят 5 табличек с никами. И надо, чтобы на табличке с ником игрока на другой строке высветилось "Ты".
    И допёр вот до чего:
    Код:
    if(sign.getLine(1).equals(p.getName())) {
                                    String[] lin = sign.getLines();
                                    lin[0] = "ТЫ!";
                                    PacketContainer result = protocolManager.createPacket(0x82);
                                    try {
                                        result.getSpecificModifier(int.class).write(0, sign.getX());
                                        result.getSpecificModifier(int.class).write(1, sign.getY());
                                        result.getSpecificModifier(int.class).write(2, sign.getZ());
                                        result.getStringArrays().write(0, lin);
                                        protocolManager.sendServerPacket(p, result);
                                    } catch (Exception ex) {
                                        ex.printStackTrace();
                                        return;
                                    }
                                }
     
  11. DPOH-VAR

    DPOH-VAR Старожил Пользователь

    Баллы:
    153
    Skype:
    dpohvar
    Лучше всего использовать ProtocolLib. он позволяет отлавливать пакеты и изменять их. А дальше все логично - если отправляется наша табличка - подменяем на ней текст по шаблону. Тогда игроку лишь нужно отправить инфу об обновлении блока.

    Второй способ - без ProtocolLib, но он будет привязан к версии MC. Суть в том, чтобы каждый раз вручную генерировать пакет 0x82 и отсылать игроку.
    На самом деле мне приходилось это делать через рефлексии, примерно вот так:
    Код:
                for (Player p : block.getWorld().getPlayers()) {
                    if (p.getLocation().distance(block.getLocation()) < maxDist) {
                        Object packet = callMethod(tile, "getUpdatePacket", new Class[0]);
                        Object mPlayer = callMethod(p, "getHandle", noInput);
                        Object connection = getField(mPlayer,classEntityPlayer,"playerConnection");
                        callMethod(connection, "sendPacket", onePacketClass, packet);
                    }
                }
    Требуется взять EntityPlayer с помощью метода getHandle у CraftPlayer
    Затем берем playerConnection у игрока
    Подготавливаем пакет (конструктор позволяет создать со всеми полями)
    http://mc.kev009.com/Protocol#Update_Sign_.280x82.29
    Отправляем пакет методом sendPacket
     
    fromgate нравится это.
  12. Автор темы
    Den_Abr

    Den_Abr Старожил Девелопер Пользователь

    Баллы:
    173
    Skype:
    Den_Abr
    Имя в Minecraft:
    Den_Abr
    Что я уже сделал, потом долго думал, почему текст пропадал
     

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