Помогите Бесконечный блок в инвентаре

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

Henry436

Новичок
Баллы
16
Пытаюсь сделать подобие креатив-режима, чтобы при установке блока он ставился, но в инвентаре не пропадал

Код:
@EventHandler(priority=EventPriority.MONITOR)
public void onPlace(BlockPlaceEvent event)
{
    World spawn = Bukkit.getWorld(event.getPlayer().getWorld().getName());
    Player p = event.getPlayer();
    Block block = event.getBlockPlaced();
    Block newblock = spawn.getBlockAt(block.getLocation());
    newblock.setType(block.getType());
    event.setCancelled(true);
}

Работает не так, как нужно. Эвент отменяется, но блок не ставится.
Однако если Location взять другой (например, на один блок выше), всё ставится замечательно. Но мне надо, чтобы ставился именно этот блок. Что не так-то?

Костыли вроде "поставить блок, затем добавить его в инвентарь" или через таймер не предлагать
 
ЕЕ, говнокод

просто World spawn = event.getPlayer().getWorld() уже не?
зачем вообще работать с миром, когда можно просто location.getBlock() ?

почему оно у тебя не пашет вообще хз
 
Попробуй сначала отменить, а потом уже кастовать. Колдун. =)))))
event.setCancelled(true); пиши в начале твоего "обработчика"
 
просто World spawn = event.getPlayer().getWorld() уже не?
зачем вообще работать с миром, когда можно просто location.getBlock() ?
Я уже по-всякому пробовал. Думал, мб ссылка где-то на блок сохраняется. Сейчас мне уже плевать на код, лишь бы работал
event.setCancelled(true); пиши в начале твоего "обработчика"
Не помогает
Вот так работает (на 1 блок выше):

Код:
int x=event.getBlockPlaced().getX();
int y=event.getBlockPlaced().getY();
int z=event.getBlockPlaced().getZ();
event.setCancelled(true);
Location loc = new Location(event.getPlayer().getWorld(), x, y+1, z);
loc.getBlock().setType(Material.CHEST);

А так - нет:

Код:
int x=event.getBlockPlaced().getX();
int y=event.getBlockPlaced().getY();
int z=event.getBlockPlaced().getZ();
event.setCancelled(true);
Location loc = new Location(event.getPlayer().getWorld(), x, y, z);
loc.getBlock().setType(Material.CHEST);

WTF?
 
Код:
@EventHandler(priority=EventPriority.MONITOR)
public void onPlace(BlockPlaceEvent event)
{
    World spawn = Bukkit.getWorld(event.getPlayer().getWorld().getName());
    Player p = event.getPlayer();
    Block block = event.getBlockPlaced();
    event.setCancelled(true);
    Block newblock = spawn.getBlockAt(block.getLocation());
    newblock.setType(block.getType());
}
так не катит?
 
Код:
@EventHandler(priority=EventPriority.MONITOR)
public void onPlace(BlockPlaceEvent event)
{
    World spawn = Bukkit.getWorld(event.getPlayer().getWorld().getName());
    Player p = event.getPlayer();
    Block block = event.getBlockPlaced();
    event.setCancelled(true);
    Block newblock = spawn.getBlockAt(block.getLocation());
    newblock.setType(block.getType());
}
так не катит?
Нет
 
Тогда я тоже хз. =))) Зря от таймера отказываешься, его можено разово после одного тика пускануть и будет ингейм усё ок.
 
Сейчас мне хотя бы понять, какого чёрта я не могу в эвенте сетать этот же блок
Если я правильно понимаю, сервер прежде чем ставить блок, просто пускает эвент и ставит, если он не отменён. Что же тогда помешать может сетнуть его?
Если не будет другого способа починить это, то придётся таском делать, но это дико костыльно (
Ядро Thermos последней версии, если это о чём-то говорит
 
может кто-то после того как ты его делаешь убирает... как знать. =)))
 
Ну да, может быть во время пуска эвента сервер блокирует доступ к этому блоку, но мб есть способ обойти это?
 
Не фонтан, но хотя бы работает
Java:
@EventHandler(priority=EventPriority.MONITOR)
public void onPlace(BlockPlaceEvent e)    {
    e.getPlayer().getInventory().setItem(e.getPlayer().getInventory().getHeldItemSlot(), e.getPlayer().getInventory().getItemInMainHand().clone());
}
 
Грац, чуваку с анимешной авой. Обожаю код в одну строку. =))) Так бы всё работало.... Эх мечты, мечты......
 
Грац, чуваку с анимешной авой. Обожаю код в одну строку. =))) Так бы всё работало.... Эх мечты, мечты......
обожаю короткий код.

идеальная программа - это открывающая скобка, список подпрограмм и закрывающаяся скобка. (c) какой то чувак.
 
Не фонтан, но хотя бы работает
Java:
@EventHandler(priority=EventPriority.MONITOR)
public void onPlace(BlockPlaceEvent e)    {
    e.getPlayer().getInventory().setItem(e.getPlayer().getInventory().getHeldItemSlot(), e.getPlayer().getInventory().getItemInMainHand().clone());
}
Спасибо. Других вариантов походу нет, ладно...
Другой вопрос - как сделать, чтобы блок ломался, как в креативе, а не просто исчезал, как происходит при работе такого кода:
Код:
if(event.getAction()==Action.LEFT_CLICK_BLOCK){
    event.setCancelled(true);
    event.getClickedBlock().setType(Material.AIR);
}

То есть чтобы звук был и частицы, но дропа не было
 
Статус
Закрыто для дальнейших ответов.
Назад
Верх