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

Не работает setType

Discussion in 'Разработка плагинов для новичков' started by aceJKE, Jan 11, 2016.

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

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

    Trophy Points:
    123
    Есть список локаций, на которые нужно поставить всеми любимый алмазный блок, все локации валидны, из метода приходит true, говоря об успешном завершении метода, но блок не выставляется.
    Ядро: CraftBukkit version git-Spigot-5f38d38-18fdd24 (MC: 1.8.8) (Implementing API version 1.8.8-RO.1-SNAPSHOT)
    Помогайте знатоки :rolleyes:
    Code:
            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 Старожил Пользователь

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

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

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

    Code:
      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 Старожил Пользователь

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

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

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

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

    Trophy Points:
    66
    Имя в Minecraft:
    dnebik
    Имею точно такую же проблему
    Code:
      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);
        }
      }
    При том что после шедуля блок ставится а куда бы я ни пихнул замену блока после цыкла
    Code:
     for (final String i : Bconfig.getConfigurationSection("Break").getKeys(false))
    блок не ставится но когда проверяю что за блок в том месте, то пишет что тот что и должен быть, но на деле просто воздух
     
  8. kirill2011s

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

    Trophy Points:
    103
  9. Автор темы
    aceJKE

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

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

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

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

Share This Page