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

Помогите Не работает new Thread() {

Тема в разделе "Разработка плагинов для новичков", создана пользователем JolyHoska, 26 июн 2017.

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

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

    Баллы:
    61
    Имя в Minecraft:
    JolyHohol
    Все привет! У меня такая проблема, что очень плохо работает блоки сетятся он текстуры не видно. Но когда перезаходишь, все нормально, но сетятся только нижний слой из Schematic, использую BukkitAPI 1.7.9 Thread() Пишу плагин на постройку дома: Вот код
    Код:
    public class Build{
        public static void build(Location loc, Chest chest, String fileName, Core c){
            File file = new File("plugins/WorldEdit/schematics/" + fileName + ".schematic");
            SchematicFormat format = SchematicFormat.getFormat(file);
                try {
                    CuboidClipboard cc = format.load(file);
                    int rotate = (getD(chest.getFacing()) - getD(cc.getOffset())) * 90;
                    if(rotate < 0)     rotate += 360;
    
                    Location origin = loc.clone().add(
                            cc.getOffset().getBlockX(),
                            cc.getOffset().getBlockY(),
                            cc.getOffset().getBlockZ());
                    new Thread() {
                        @SuppressWarnings("deprecation")
                        public void run() {
                            for (int y = 0, ly = cc.getHeight(); y < ly; y++) {
                                for (int x = 0, lx = cc.getWidth(); x < lx; x++) {
                                    for (int z = 0, lz = cc.getLength(); z < lz; z++) {
                                        BaseBlock b = cc.getPoint(new Vector(x, y, z));
                                        Location l = origin.clone().add(x, y, z);
                                        l.getBlock().setTypeIdAndData(b.getType(), (byte) b.getData(), false);
                                     
                                        if (b.getType() != 0) {
                                            origin.getWorld().playEffect(l, Effect.STEP_SOUND, 1);
                                            try { Thread.sleep(1000); }
                                            catch (InterruptedException e) { e.printStackTrace();
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }.start();
                } catch (IOException | DataException e) {
                    e.printStackTrace();
                }
            }
     
  2. Хостинг MineCraft
    <
  3. slavik123123123

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

    Баллы:
    143
    Имя в Minecraft:
    Leymooooooooooo
    Код:
    new Thread( new Runnable() {
        @Override
        public void run() {
        }
    }).start();
     
  4. Автор темы
    JolyHoska

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

    Баллы:
    61
    Имя в Minecraft:
    JolyHohol
    Нет, криво работает. Я заменял Thread на BukkitRunnable(), но тогда строит постройку сразу, а мне надо чтобы по блоку и по порядку
     
  5. xDark

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

    Баллы:
    96
    Skype:
    ailyashevich
    Имя в Minecraft:
    xDark
    А ты в консоль посмотри
     
  6. Автор темы
    JolyHoska

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

    Баллы:
    61
    Имя в Minecraft:
    JolyHohol
    В консоли нет ошибок[DOUBLEPOST=1498465632,1498465194][/DOUBLEPOST]И да почему-то сервер создает новый класс: Сore$1 Build$1 и т д
     
  7. Типа админ:D

    Типа админ:D Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    B1ruk
    Это компилятор делает
     
  8. alexandrage

    alexandrage Администратор

    Баллы:
    173
    Skype:
    alexandr0116
    Делай вот так и не создаст.

    Код:
    
    public class Scheduler extends Thread {
        Main plugin;
    
        Scheduler(Main plugin) {
            this.plugin = plugin;
        }
    
        @Override
        public void run() {
            /* TODO */
        }
    }
    Код:
    import org.bukkit.scheduler.BukkitRunnable;
    
    public class Scheduler extends BukkitRunnable {
        Main plugin;
    
        Scheduler(Main plugin) {
            this.plugin = plugin;
        }
    
        @Override
        public void run() {
            /* TODO */
        }
    }
     
  9. gamerforEA

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

    Баллы:
    143
    Skype:
    sk2000sk1
    Имя в Minecraft:
    gamerforEA_MCPC
    Если нужно просто ставить какое-то количество блоков за тик, то можно сделать шедулер, в котором x, y и z (ну и другие локальные переменные при необходимости) будут являться полями, а само выполнение будет прерываться при прохождении лимита (и возобновляться ядром с некоторой периодичностью).
    Ну и ещё нужно не забыть прибить шедулер, когда всё закончится.
    Код:
    public void run() {
       int counter = 0;
       for (;this.x<maxX;this.x++) {
          // Такие же циклы с Y и Z
          setBlock(this.x, this.y, this.z);
          playSound(...);
          if (++counter > MAX_BLOCK_PER_TICK) {
            return;
          }
       }
    }
    UPD. Хотя этот метод нужно доработать, например, сделать переход на нужный цикл при возобновлении работы, но это несложно.
     
    Последнее редактирование: 26 июн 2017
  10. Reality_SC

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

    Баллы:
    123
    Имя в Minecraft:
    Reality_SC
    Да можно и потоком, как у тс, только установка блоков должна делегироваться в ближайший тик основного потока через Bukkit.getScheduler().runTask(...).
     
  11. Автор темы
    JolyHoska

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

    Баллы:
    61
    Имя в Minecraft:
    JolyHohol
    Нет Scheduler не работает, я пробовал, Вообще я уже решил проблему. У меня было ядро на сервере Spigot, я поставил CraftBukkit и все заработало)
     
  12. GoodCoder

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

    Баллы:
    76
    Нельзя изменять мир из других потоков. Действия с ним должны происходить только в главном потоке сервера. Если задание большое, разбейте его выполнение на несколько тиков, используя Scheduler.
     
  13. alexandrage

    alexandrage Администратор

    Баллы:
    173
    Skype:
    alexandr0116
    :good:
     

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