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

Не работает setType

Тема в разделе "Разработка плагинов для новичков", создана пользователем aceJKE, 11 янв 2016.

  1. Автор темы
    aceJKE

    aceJKE Старожил Пользователь

    Баллы:
    123
    Есть список локаций, на которые нужно поставить всеми любимый алмазный блок, все локации валидны, из метода приходит true, говоря об успешном завершении метода, но блок не выставляется.
    Ядро: CraftBukkit version git-Spigot-5f38d38-18fdd24 (MC: 1.8.8) (Implementing API version 1.8.8-RO.1-SNAPSHOT)
    Помогайте знатоки :rolleyes:
    Код:
            for (Location loc : locations)
            {
                boolean success = loc.getBlock().setTypeId(Material.DIAMOND_BLOCK.getId());
                System.out.println(loc.toString() + " is success " + success);
            }
     
  2. Хостинг MineCraft
    <
  3. kirill2011s

    kirill2011s Старожил Пользователь

    Баллы:
    103
    Используй setType.
     
  4. Автор темы
    aceJKE

    aceJKE Старожил Пользователь

    Баллы:
    123
    Во-первых использовал setTypeId, что бы вытащить boolean, а не void.
    Во-вторых, если заглянуть в реализацию, то можно увидеть:

    Код:
      public void setType(org.bukkit.Material type) {
        setType(type, true);
      }
    
      public void setType(org.bukkit.Material type, boolean applyPhysics)
      {
        setTypeId(type.getId(), applyPhysics);
      }
    
      public boolean setTypeId(int type, boolean applyPhysics) {
        net.minecraft.server.v1_8_R3.Block block = getNMSBlock(type);
        return setTypeIdAndData(type, (byte)block.toLegacyData(block.getBlockData()), applyPhysics);
      }
    
    ...
    Хотя от безысходности перепробывал все методы...

    В-третьих, не знаю как этот работает у других, но как оказалось проблема в пакетах отправляемых сервером.
    Мое предположение, что происходит и немного новых выявленных фактов - если установить блок любым методом, то никаких пакетов сервер не отправит, если тут же заспавнить entity, то это, похоже, провоцирует обновление чанка и пакет(ы) отправляются игроку.

    Обнаружил поздно ночью и небыло времени заисследовать.
     
  5. kirill2011s

    kirill2011s Старожил Пользователь

    Баллы:
    103
    Ну тогда просто отправлять обновление блока, вместе с обновлением типа. Но на самом деле, первый раз о таком слышу. Всегда сервер все делал за тебя.
     
  6. Автор темы
    aceJKE

    aceJKE Старожил Пользователь

    Баллы:
    123
    Я сам не ожидал такого поворота.
    И зачем пытаться дать ответ, если я его уже дал .-.
     
    Последнее редактирование: 12 янв 2016
  7. dnebik

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

    Баллы:
    66
    Имя в Minecraft:
    dnebik
    Имею точно такую же проблему
    Код:
      public void onBlockBreack(final BlockBreakEvent e)
      {
        final Player p = e.getPlayer();
        Random rand = new Random();
        if (!e.getPlayer().getLocation().getWorld().getName().equals("Flat"))
        {
            if (p.getGameMode() == GameMode.SURVIVAL)
            {
                boolean fie = false;
                for (final String i : Bconfig.getConfigurationSection("Break").getKeys(false))
                {
                    if(e.getBlock().getType().toString().equals(i))
                    {
                        final Location loc = e.getBlock().getLocation();
                        for (String g : Bconfig.getConfigurationSection("Break." + i).getKeys(false))
                        {
                            if (g.equals("to"))
                            {
                                Location l = e.getBlock().getLocation();
                                String mat = Bconfig.getString("Break." + i + ".to");
                                loc.getBlock().setType(Material.valueOf(mat));
                            }
                        }
                        getServer().getScheduler().runTaskLater(this, new Runnable()
                        {
                          public void run() {
                            loc.getBlock().setType(Material.valueOf(i));
                          }
                        }
                        , (Bconfig.getInt("Break." + i + ".delay")) + rand.nextInt(Bconfig.getInt("Break." + i + ".delay") * 100));
                        fie = true;
                        break;
                    }
                }
                if (fie == false)
                    e.setCancelled(true);
            }
        }
        else
        if (e.getBlock().getType() == Material.SMOOTH_BRICK)
        {
            e.setCancelled(true);
        }
      }
    При том что после шедуля блок ставится а куда бы я ни пихнул замену блока после цыкла
    Код:
     for (final String i : Bconfig.getConfigurationSection("Break").getKeys(false))
    блок не ставится но когда проверяю что за блок в том месте, то пишет что тот что и должен быть, но на деле просто воздух
     
  8. kirill2011s

    kirill2011s Старожил Пользователь

    Баллы:
    103
  9. Автор темы
    aceJKE

    aceJKE Старожил Пользователь

    Баллы:
    123
    Главный поток/BukkitScheduler[DOUBLEPOST=1452795315,1452794255][/DOUBLEPOST]Так и последний треш - мобы работать перстали, даже ручная отправка пакета PacketPlayOutBlockChange не работает .-.
     
  10. dnebik

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

    Баллы:
    66
    Имя в Minecraft:
    dnebik
    .-. я таки не понял это исправимо или нет? просто даже если перезайти на сервер, то там все так же пустенько...
    ибо getChunk().unload(); getChunk().load(); не помогает[DOUBLEPOST=1452801310,1452800712][/DOUBLEPOST]
    Там баг с BlockPistonExtendEvent
     

Поделиться этой страницей