[Решено] Disguise Block

  • Автор темы Автор темы CoolBoy
  • Дата начала Дата начала
Статус
Закрыто для дальнейших ответов.

CoolBoy

Активный участник
Пользователь
Баллы
96
Имя в Minecraft
Xezard
Здравствуйте, уважаемые форумчане.

Назрел вопрос.

Цель:
При попадании "projectile" по блоку, я должен заменять его на любую цветную шерсть на 5-10 секунд, после - возвращать старый блок назад.

Насколько я знаю, это можно сделать несколькими методами.

Я переговорил с одним человеком и он посоветовал мне делать это через мапу. (Заносить старый блок в мапу, менять его на шерсть, затем заменять шерсть, взяв из мапы старый блок.)
Сложность в следующем:
Что делать, если я попал "projectil"'ом в рамку, табличку, картину или цветочный горшок?

Я же предложил использовать для этого пакет - PacketPlayOutBlockChange.

Собственно, каким способом можно выполнить мою задачу как можно проще и удобнее?

И как должен выглядить мой код?
 
Последнее редактирование:
Не надо себе забивать голову всякими пакетами. Bukkit все делает за вас.
Я бы тоже посоветовал через мапу.

Собственно, советую использовать мапу.)
 
Не надо себе забивать голову всякими пакетами. Bukkit все делает за вас.
Я бы тоже посоветовал через мапу.

Собственно, советую использовать мапу.)
Пакетами удобнее. Ведь мне не придётся хранить блок в который я попал. Просто посылаю пакет, и блок волшебным образом возвращается.
К тому же, не будет конфликтов с цветочными горшками, картинами, рамками, табличками и т.д.
 
Последнее редактирование:
Пакетами удобнее. Ведь мне не придётся хранить блок в который я попал. Просто дестрою пакет, и блок волшебным образом возвращается.
Насколько я знаю, вам придется отправить два пакета, чтобы сначала сменить материал блока на шерсть, а потом вернуть его в исходное состояние. Это не так? Что значит "дестрою пакет"?
 
Насколько я знаю, вам придется отправить два пакета, чтобы сначала сменить материал блока на шерсть, а потом вернуть его в исходное состояние. Это не так? Что значит "дестрою пакет"?
Ну вообще-то я об этом и сказал.
Дестрою - уничтожаю. Destroy же.
Сорян за сленг)
 
Последнее редактирование:
Чтобы вернуть исходный блок - достаточно обрубить пакет, который отправляет клиенту шерсть. Разве нет?
Пакет это не сокет, или что-то в этом роде. Сервер отправляет пакет клиенту, тот его обрабатывает, что-то изменяет для себя и пакет уходит в мусор.
 
Пакет это не сокет, или что-то в этом роде. Сервер отправляет пакет клиенту, тот его обрабатывает, что-то изменяет для себя и пакет уходит в мусор.
Я так не считаю. Поэтому и хочу услышать мнение "экспертов".
https://www.spigotmc.org/threads/tutorial-quick-method-for-more-efficient-block-disguising.102606/
 
Здравствуйте, уважаемые форумчане.

Назрел вопрос.

Цель:
При попадании "projectile" по блоку, я должен заменять его на любую цветную шерсть на 5-10 секунд, после - возвращать старый блок назад.

Насколько я знаю, это можно сделать несколькими методами.

Я переговорил с одним человеком и он посоветовал мне делать это через мапу. (Заносить старый блок в мапу, менять его на шерсть, затем заменять шерсть, взяв из мапы старый блок.)
Сложность в следующем:
Что делать, если я попал "projectil"'ом в рамку, табличку, картину или цветочный горшок?

Я же предложил использовать для этого пакет - PacketPlayOutBlockChange.

Собственно, каким способом можно выполнить мою задачу как можно проще и удобнее?

И как должен выглядить мой код?
Есть sendBlockChange()
 
Да, в той теме что я скинул один пользователь расписал метод sendBlockChange()
Но, каким образом мне делать это лишь на 5-6 секунд, а потом возвращать старый блок? Пример кода желательно.
 
Да, в той теме что я скинул один пользователь расписал метод sendBlockChange()
Но, каким образом мне делать это лишь на 5-6 секунд, а потом возвращать старый блок? Пример кода желательно.
Код:
Block b;
p.sendBlockChange(b.getLocation(), Material.???, data);
Bukkit.getScheluder().runTaskLater(plugin, () -> p.sendBlockChange(b.getLocation(), b.getType(), b.getData()), 5*20);
 
Код:
Block b;
p.sendBlockChange(b.getLocation(), Material.???, data);
Bukkit.getScheluder().runTaskLater(plugin, () -> p.sendBlockChange(b.getLocation(), b.getType(), b.getData()), 5*20);
Тогда ещё вопрос - этот блок не увидят другие игроки, верно?
Получается, нужно будет сначала:
Player players = Bukkit.getOnlinePlayers();
А потом уже
players.sendBlockChange(b.getLocation(), Material.Wool 2);
Bukkit.getScheluder().runTaskLater(plugin, () -> players.sendBlockChange(b.getLocation(), b.getType(), b.getData()), 5*20);
Верно?
 
Тогда ещё вопрос - этот блок не увидят другие игроки верно?
Получается, нужно будет сначала:
Player players = Bukkit.getOnlinePlayers();
А потом уже
p.sendBlockChange(b.getLocation(), Material.Wool 2);
Bukkit.getScheluder().runTaskLater(plugin, () -> p.sendBlockChange(b.getLocation(), b.getType(), b.getData()), 5*20);
Верно?
Быстро вы забыли про свои "длинные" пакеты.))
 
Тогда ещё вопрос - этот блок не увидят другие игроки, верно?
Получается, нужно будет сначала:
Player players = Bukkit.getOnlinePlayers();
А потом уже
players.sendBlockChange(b.getLocation(), Material.Wool 2);
Bukkit.getScheluder().runTaskLater(plugin, () -> players.sendBlockChange(b.getLocation(), b.getType(), b.getData()), 5*20);
Верно?
Перебирать список игроков можно циклом for(:) или через новый Stream API.
 
Быстро вы забыли про свои "длинные" пакеты.))
Посмотрите на реализацию метода sendBlockChange(), а потом пишите. Там используется тот же пакет.
Перебирать список игроков можно циклом for:)) или через новый Stream API.
Можно чуточку подробнее?)
Про StreamAPI.
 
Хах. Не надо на меня гнать)
Я вам с самого начала сказал, что Bukkit делает все за вас.
В любом случае метод реализуется с помощью пакета и реализуй я это через пакет ничего бы страшного не случилось. В той же теме ТС приводит свой "альтернативный" код этому методу.
 
Статус
Закрыто для дальнейших ответов.
Назад
Верх