Войти или зарегистрироваться

Не работает setType

  • Автор темы Автор темы aceJKE
  • Дата начала Дата начала

aceJKE

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

Обнаружил поздно ночью и небыло времени заисследовать.
 
Во-первых использовал 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, то это, похоже, провоцирует обновление чанка и пакет(ы) отправляются игроку.

Обнаружил поздно ночью и небыло времени заисследовать.
Ну тогда просто отправлять обновление блока, вместе с обновлением типа. Но на самом деле, первый раз о таком слышу. Всегда сервер все делал за тебя.
 
Ну тогда просто отправлять обновление блока, вместе с обновлением типа. Но на самом деле, первый раз о таком слышу. Всегда сервер все делал за тебя.
Я сам не ожидал такого поворота.
И зачем пытаться дать ответ, если я его уже дал .-.
 
Последнее редактирование:
Имею точно такую же проблему
Код:
  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))
блок не ставится но когда проверяю что за блок в том месте, то пишет что тот что и должен быть, но на деле просто воздух
 
Главный поток/BukkitScheduler
Так и последний треш - мобы работать перстали, даже ручная отправка пакета PacketPlayOutBlockChange не работает .-.
 
Назад
Верх