Хостинг серверов Minecraft playvds.com
  1. Вы находитесь в русском сообществе Bukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на русский язык плагины наших собратьев из других стран.
    Dismiss Notice

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

Discussion in 'Разработка плагинов для новичков' started by Henry436, Feb 1, 2017.

Thread Status:
Not open for further replies.
  1. Автор темы
    Henry436

    Henry436 Новичок

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

    Code:
    @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 взять другой (например, на один блок выше), всё ставится замечательно. Но мне надо, чтобы ставился именно этот блок. Что не так-то?

    Костыли вроде "поставить блок, затем добавить его в инвентарь" или через таймер не предлагать
     
  2. Хостинг MineCraft
    <
  3. Blc_Dragon

    Blc_Dragon Активный участник Пользователь

    Trophy Points:
    76
    Имя в Minecraft:
    Blc_Dragon
    ЕЕ, говнокод

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

    почему оно у тебя не пашет вообще хз
     
  4. Mabus

    Mabus Активный участник Пользователь

    Trophy Points:
    76
    Skype:
    chervanenko
    Имя в Minecraft:
    Chervanenko
    Попробуй сначала отменить, а потом уже кастовать. Колдун. =)))))[DOUBLEPOST=1485941136,1485941106][/DOUBLEPOST]event.setCancelled(true); пиши в начале твоего "обработчика"
     
  5. Автор темы
    Henry436

    Henry436 Новичок

    Trophy Points:
    16
    Я уже по-всякому пробовал. Думал, мб ссылка где-то на блок сохраняется. Сейчас мне уже плевать на код, лишь бы работал
    Не помогает[DOUBLEPOST=1485941623,1485941374][/DOUBLEPOST]Вот так работает (на 1 блок выше):

    Code:
    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);
    А так - нет:

    Code:
    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?
     
  6. Mabus

    Mabus Активный участник Пользователь

    Trophy Points:
    76
    Skype:
    chervanenko
    Имя в Minecraft:
    Chervanenko
    Code:
    @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());
    }
    так не катит?
     
  7. Автор темы
    Henry436

    Henry436 Новичок

    Trophy Points:
    16
    Нет
     
  8. Mabus

    Mabus Активный участник Пользователь

    Trophy Points:
    76
    Skype:
    chervanenko
    Имя в Minecraft:
    Chervanenko
    Тогда я тоже хз. =))) Зря от таймера отказываешься, его можено разово после одного тика пускануть и будет ингейм усё ок.
     
  9. Автор темы
    Henry436

    Henry436 Новичок

    Trophy Points:
    16
    Сейчас мне хотя бы понять, какого чёрта я не могу в эвенте сетать этот же блок
    Если я правильно понимаю, сервер прежде чем ставить блок, просто пускает эвент и ставит, если он не отменён. Что же тогда помешать может сетнуть его?[DOUBLEPOST=1485942541,1485942496][/DOUBLEPOST]Если не будет другого способа починить это, то придётся таском делать, но это дико костыльно ([DOUBLEPOST=1485942584][/DOUBLEPOST]Ядро Thermos последней версии, если это о чём-то говорит
     
  10. Mabus

    Mabus Активный участник Пользователь

    Trophy Points:
    76
    Skype:
    chervanenko
    Имя в Minecraft:
    Chervanenko
    может кто-то после того как ты его делаешь убирает... как знать. =)))
     
  11. Автор темы
    Henry436

    Henry436 Новичок

    Trophy Points:
    16
    Ну да, может быть во время пуска эвента сервер блокирует доступ к этому блоку, но мб есть способ обойти это?
     
  12. Blc_Dragon

    Blc_Dragon Активный участник Пользователь

    Trophy Points:
    76
    Имя в Minecraft:
    Blc_Dragon
    Не фонтан, но хотя бы работает
    Code:
    @EventHandler(priority=EventPriority.MONITOR)
    public void onPlace(BlockPlaceEvent e)    {
        e.getPlayer().getInventory().setItem(e.getPlayer().getInventory().getHeldItemSlot(), e.getPlayer().getInventory().getItemInMainHand().clone());
    }
     
  13. Mabus

    Mabus Активный участник Пользователь

    Trophy Points:
    76
    Skype:
    chervanenko
    Имя в Minecraft:
    Chervanenko
    Грац, чуваку с анимешной авой. Обожаю код в одну строку. =))) Так бы всё работало.... Эх мечты, мечты......
     
  14. Blc_Dragon

    Blc_Dragon Активный участник Пользователь

    Trophy Points:
    76
    Имя в Minecraft:
    Blc_Dragon
    обожаю короткий код.

    идеальная программа - это открывающая скобка, список подпрограмм и закрывающаяся скобка. (c) какой то чувак.
     
  15. Автор темы
    Henry436

    Henry436 Новичок

    Trophy Points:
    16
    Спасибо. Других вариантов походу нет, ладно...
    Другой вопрос - как сделать, чтобы блок ломался, как в креативе, а не просто исчезал, как происходит при работе такого кода:
    Code:
    if(event.getAction()==Action.LEFT_CLICK_BLOCK){
        event.setCancelled(true);
        event.getClickedBlock().setType(Material.AIR);
    }
    [DOUBLEPOST=1485945634,1485945603][/DOUBLEPOST]То есть чтобы звук был и частицы, но дропа не было
     
Thread Status:
Not open for further replies.

Share This Page