Войти или зарегистрироваться
  • Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.

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

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

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

Вообще проще воспользоваться картами. Там можно легко организовать для каждого игрока свою картинку.
Да вроде такое как-то можно сделать. У LMS такое есть, Taras говорил, что делал такое
 
Ну... Давай порассуждаем.
Есть методы, которые позволяют отправлять игроку "файльшивые данные":

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/
 
В той теме, что я приводил есть ссылка на этот плагин :)
Я её не открывал, потому что судя по тому посту, сыль была на тему, где идет обсуждение плагиностроения, а так как я от этого далек, и тема явно на английском, я её проигнорировал. Почитал эту тему и пошел смотреть новые плагины, и на примерно 3-4 странице наткнулся на этот плагин :)
 
В той теме, что я приводил есть ссылка на этот плагин :)
Я тоже его встречал, но не обратил внимания :)

Вот над чем думал:
Стоят 5 табличек с никами. И надо, чтобы на табличке с ником игрока на другой строке высветилось "Ты".
И допёр вот до чего:
Java:
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;
                                }
                            }
 
Лучше всего использовать ProtocolLib. он позволяет отлавливать пакеты и изменять их. А дальше все логично - если отправляется наша табличка - подменяем на ней текст по шаблону. Тогда игроку лишь нужно отправить инфу об обновлении блока.

Второй способ - без ProtocolLib, но он будет привязан к версии MC. Суть в том, чтобы каждый раз вручную генерировать пакет 0x82 и отсылать игроку.
На самом деле мне приходилось это делать через рефлексии, примерно вот так:
Java:
            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
 
Лучше всего использовать ProtocolLib. он позволяет отлавливать пакеты и изменять их. А дальше все логично - если отправляется наша табличка - подменяем на ней текст по шаблону. Тогда игроку лишь нужно отправить инфу об обновлении блока.

Второй способ - без ProtocolLib, но он будет привязан к версии MC. Суть в том, чтобы каждый раз вручную генерировать пакет 0x82 и отсылать игроку.
На самом деле мне приходилось это делать через рефлексии, примерно вот так:
Java:
            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
Что я уже сделал, потом долго думал, почему текст пропадал
 

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

Назад
Верх