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

Да вроде такое как-то можно сделать. У LMS такое есть, Taras говорил, что делал такоеПока никак. Player.sendBlock не поддерживает BlockState. Т.е. текст с таблички персонально игроку не передашь. Разве что сделать наоброт: всем кроме нужно игрока передавать пустую табличку
Вообще проще воспользоваться картами. Там можно легко организовать для каждого игрока свою картинку.
Ох, костыли. Придётся использовать ихКстати, вот тебе и тема на bukkit: http://forums.bukkit.org/threads/protocollib-packets-sign-modification.129349/
Отлично!Случайно наткнулся, возможно не то что нужно, ну хотя бы подталкнет в нужном направлении.
http://dev.bukkit.org/server-mods/individual-signs
Случайно наткнулся, возможно не то что нужно, ну хотя бы подталкнет в нужном направлении.
http://dev.bukkit.org/server-mods/individual-signs

Я её не открывал, потому что судя по тому посту, сыль была на тему, где идет обсуждение плагиностроения, а так как я от этого далек, и тема явно на английском, я её проигнорировал. Почитал эту тему и пошел смотреть новые плагины, и на примерно 3-4 странице наткнулся на этот плагинВ той теме, что я приводил есть ссылка на этот плагин![]()

Я тоже его встречал, но не обратил вниманияВ той теме, что я приводил есть ссылка на этот плагин![]()

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;
}
}
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);
}
}
Что я уже сделал, потом долго думал, почему текст пропадалЛучше всего использовать ProtocolLib. он позволяет отлавливать пакеты и изменять их. А дальше все логично - если отправляется наша табличка - подменяем на ней текст по шаблону. Тогда игроку лишь нужно отправить инфу об обновлении блока.
Второй способ - без ProtocolLib, но он будет привязан к версии MC. Суть в том, чтобы каждый раз вручную генерировать пакет 0x82 и отсылать игроку.
На самом деле мне приходилось это делать через рефлексии, примерно вот так:
Требуется взять EntityPlayer с помощью метода getHandle у CraftPlayerJava: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); } }
Затем берем playerConnection у игрока
Подготавливаем пакет (конструктор позволяет создать со всеми полями)
http://mc.kev009.com/Protocol#Update_Sign_.280x82.29
Отправляем пакет методом sendPacket