Помогите Убрать стандартный эффект эндер сундука

Статус
Закрыто для дальнейших ответов.

Alex555333222

Активный участник
Пользователь
Баллы
66
Помогите пожалуйста, как можно убрать стандартный эффект эндер сундука, например пишу плагин на донат кейсы, выдаю себе командой сундук с определенным названием и описанием. Далее когда его ставлю координаты его записываются в файл. Затем при нажатии на эндер сундук, который находится в определенных координатах, выходит GUI и там уже показывается сам рандом.
1)Так вот начал реализовывать, выдаю сундук, ставлю его, а там стандартные частицы вокруг летают и немного подсвечивается он. Как можно это все эффекты убрать? (при том что я в будущем хочу сделать там свои эффекты).
2)Как поставить свои эффекты? =) Взрыв фейерверка интересует.
3) И вообще нормальная ли логика получается у подобного кейса?
 
Можно отменять клик на сундук, и пакетами его открывать.
 
Можно отменять клик на сундук, и пакетами его открывать.
Что означает пакетами открывать, и как это вообще работает. И как это с эффектами связано, пока я не понимаю. Я ток новичок в этом деле, плохо разбираюсь.
 
Не эффект открытия сундука я хочу убрать, а эффект летающих фиолетовых частичек (как у эндерменов) от сундука и свет который он излучает
 
Вы можете отправить пакет PacketPlayOutBlockAction игроку, чтобы они увидели, что грудь открыта или закрыта. Этот пакет используется для отображения частиц заметки, перемещений поршня и изменений состояния грудной клетки.

Вам нужно будет создать BlockPosition и получить Block NMS (тип блока minecraft, в данном случае сундук), а также предоставить два байта данных. Первый байт не используется в случае анимации сундука, а второй байт представляет собой изменение состояния сундука, 0 для закрытия и 1 для открытия сундука. Ниже ваш метод переписан, чтобы также показать соответствующую анимацию.

PHP:
@SuppressWarnings("deprecation")
public static void changeChestState(Location loc, boolean open) {
    byte dataByte = (open) ? (byte) 1 : 0; // The byte of data used for the note and animation packet (1 if true, 0 if false)
    for (Player player : Bukkit.getOnlinePlayers()) {
        player.playNote(loc, (byte) 1, dataByte); // Play the sound
        BlockPosition position = new BlockPosition(loc.getBlockX(), loc.getBlockY(), loc.getBlockZ()); // Create the block position using loc
        // Instantiate animation packet, get NMS Block using getById() and loc.getBlock() (deprecated), the server version may vary
        PacketPlayOutBlockAction blockActionPacket = new PacketPlayOutBlockAction(position, net.minecraft.server.v1_8_R3.Block.getById(loc.getBlock().getTypeId()), (byte) 1, dataByte);
        ((CraftPlayer) player).getHandle().playerConnection.sendPacket(blockActionPacket); // Send animation packet to CraftPlayer
    }
}

PS: Автор не я.
 
Ребята, вы вообще не читаете тему ТС.
Ему нужно убрать партиклы и свечение блока от эндерсундука.
 
Тогда проще юзать обычный сундук.
Или блок камня, чего уж тут.
Помогите пожалуйста, как можно убрать стандартный эффект эндер сундука, например пишу плагин на донат кейсы, выдаю себе командой сундук с определенным названием и описанием. Далее когда его ставлю координаты его записываются в файл. Затем при нажатии на эндер сундук, который находится в определенных координатах, выходит GUI и там уже показывается сам рандом.
1)Так вот начал реализовывать, выдаю сундук, ставлю его, а там стандартные частицы вокруг летают и немного подсвечивается он. Как можно это все эффекты убрать? (при том что я в будущем хочу сделать там свои эффекты).
2)Как поставить свои эффекты? =) Взрыв фейерверка интересует.
3) И вообще нормальная ли логика получается у подобного кейса?
Взрыв фейерверка -- не один эффект, нужно спавнить фейерверк, чтобы использовать его частицы.
Используйте виртуальный блок, не устанавливая его, просто отправьте игроку новый блок, тогда сервер не будет спавнить частицы вокруг сундука, потому что для сервера это будет не сундук.
 
Или блок камня, чего уж тут.

Взрыв фейерверка -- не один эффект, нужно спавнить фейерверк, чтобы использовать его частицы.
Используйте виртуальный блок, не устанавливая его, просто отправьте игроку новый блок, тогда сервер не будет спавнить частицы вокруг сундука, потому что для сервера это будет не сундук.
Можно маленький пример подобной реализации
 
Можно маленький пример подобной реализации
Нам нужен вот этот метод -> sendBlockChange(Location loc, Material material, byte data) у Player'а
Или его родственник -> sendBlockChange(Location loc, BlockData block).
Далее что нужно сделать словами.
При вызове события установки блока (BlockPlaceEvent), мы проверяем, что ставим ->getItemInHand(), оно должно совпадать с требуемым сундуком. Если всё совпало и событие не отменено другим плагином (мы же не хотим бить чужие защищённые области?), отменяем событие, уменьшаем количество предметов в руке игрока/уничтожаем последний предмет.
Далее, устанавливаем обычный сундук туда, куда пытался поставить его игрок, не забываем его залочить (выставить поле Lock), а также изменить, например, имя, чтобы идентифицировать позже этот сундук. Это действие опционально, можно не ставить ничего, тогда ничего ни для кого не будет.
Далее вызываем один из верхних методов, но в качестве типа используем уже сундук края. Этот метод нужно вызвать для всех игроков, которые должны увидеть сундук края, если не хотим, чтобы видели вообще все игроки, кроме установившего, то можно или отправить остальным воздух, или ничего не отправлять, если предыдущий пункт был опущен.
Теперь нужно запавнить фейерверк в точке сундука, прописать ему нужные характеристики, после чего взорвать его на месте -> detonate(). Если есть желание повторять эффект множество раз, то следует использовать шедулеры (можно и без них, но для начала сойдёт).
Теперь нужно по событию определить, PlayerInteractEvent нажал ли игрок по нашей пустоте/сундуку/чему_там_нужно. Определив то, что нужно, убирайте блок, эффект, игрока и открывайте ваш GUI.
 
Нам нужен вот этот метод -> sendBlockChange(Location loc, Material material, byte data) у Player'а
Или его родственник -> sendBlockChange(Location loc, BlockData block).
Далее что нужно сделать словами.
При вызове события установки блока (BlockPlaceEvent), мы проверяем, что ставим ->getItemInHand(), оно должно совпадать с требуемым сундуком. Если всё совпало и событие не отменено другим плагином (мы же не хотим бить чужие защищённые области?), отменяем событие, уменьшаем количество предметов в руке игрока/уничтожаем последний предмет.
Далее, устанавливаем обычный сундук туда, куда пытался поставить его игрок, не забываем его залочить (выставить поле Lock), а также изменить, например, имя, чтобы идентифицировать позже этот сундук. Это действие опционально, можно не ставить ничего, тогда ничего ни для кого не будет.
Далее вызываем один из верхних методов, но в качестве типа используем уже сундук края. Этот метод нужно вызвать для всех игроков, которые должны увидеть сундук края, если не хотим, чтобы видели вообще все игроки, кроме установившего, то можно или отправить остальным воздух, или ничего не отправлять, если предыдущий пункт был опущен.
Теперь нужно запавнить фейерверк в точке сундука, прописать ему нужные характеристики, после чего взорвать его на месте -> detonate(). Если есть желание повторять эффект множество раз, то следует использовать шедулеры (можно и без них, но для начала сойдёт).
Теперь нужно по событию определить, PlayerInteractEvent нажал ли игрок по нашей пустоте/сундуку/чему_там_нужно. Определив то, что нужно, убирайте блок, эффект, игрока и открывайте ваш GUI.

@SuppressWarnings("deprecation")
@EventHandler
public void setEnder (BlockPlaceEvent e) {
Player p = e.getPlayer();
if (p.getInventory().getItemInHand().getType() != Material.ENDER_CHEST || e.isCancelled()) return;
//e.setCancelled(true);
p.getInventory().getItemInHand().setAmount(p.getInventory().getItemInHand().getAmount() - 1);
e.getBlock().setType(Material.CHEST);
p.sendBlockChange(e.getBlock().getLocation(), Material.ENDER_CHEST, (byte)0);

}
Примерно такое получилось.

sendBlockChange вообще не работает при тестах.

sendBlockChange(Location loc, BlockData block). такой метод эклипс вообще не знает (с такими параметрами).

Если писать e.setCancelled(true), то вообще никакие действия не работают, с установкой блоков.

e.getBlock().setType(Material.CHEST), этой строчкой вызывается ошибка в консоле, и не понятно как это влияет на процесс, хотя блок меняется. Вот ошибка: Block at 58,67,47 is CHEST but has net.minecraft.server.v1_8_R1.TileEntityEnderChest@7981090. Bukkit will attempt to fix this, but there may be additional damage that we cannot recover.

Как заспавнить фейерверк вообще не понятно, пытался взять блок, взять локацию, нет методов там.

Можно ли вообще небольшой пример реализации, как это пишется вообще. Уже ничего не помогает.
 
Ну так проблема то не решилась, альтернатив нет что ли. Ответ то по вопросу начальному получается так и не получен.
Тебе кинули ответ. Самый оптимальный вариант - переезд на новую версию, если хочешь на динозавре сидеть - юзай обычный сундук.
 
Тебе кинули ответ. Самый оптимальный вариант - переезд на новую версию, если хочешь на динозавре сидеть - юзай обычный сундук.
С каких пор 1.8 динозавр =) Люди до сих пор на 1.5.2 сидят. А про спавн фейерверка что можете посоветовать.
 
Статус
Закрыто для дальнейших ответов.
Назад
Верх