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

JolyHoska

Активный участник
Пользователь
Баллы
76
Имя в Minecraft
JolyNoska
Все привет! У меня такая проблема, что очень плохо работает блоки сетятся он текстуры не видно. Но когда перезаходишь, все нормально, но сетятся только нижний слой из Schematic, использую BukkitAPI 1.7.9 Thread() Пишу плагин на постройку дома: Вот код
Java:
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();
            }
        }
 
Код:
new Thread( new Runnable() {
    @Override
    public void run() {
    }
}).start();
 
Нет, криво работает. Я заменял Thread на BukkitRunnable(), но тогда строит постройку сразу, а мне надо чтобы по блоку и по порядку
 
В консоли нет ошибок
И да почему-то сервер создает новый класс: Сore$1 Build$1 и т д
 
В консоли нет ошибок
И да почему-то сервер создает новый класс: Сore$1 Build$1 и т д
Делай вот так и не создаст.

Java:
public class Scheduler extends Thread {
    Main plugin;

    Scheduler(Main plugin) {
        this.plugin = plugin;
    }

    @Override
    public void run() {
        /* TODO */
    }
}
Java:
import org.bukkit.scheduler.BukkitRunnable;

public class Scheduler extends BukkitRunnable {
    Main plugin;

    Scheduler(Main plugin) {
        this.plugin = plugin;
    }

    @Override
    public void run() {
        /* TODO */
    }
}
 
Если нужно просто ставить какое-то количество блоков за тик, то можно сделать шедулер, в котором x, y и z (ну и другие локальные переменные при необходимости) будут являться полями, а само выполнение будет прерываться при прохождении лимита (и возобновляться ядром с некоторой периодичностью).
Ну и ещё нужно не забыть прибить шедулер, когда всё закончится.
Java:
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. Хотя этот метод нужно доработать, например, сделать переход на нужный цикл при возобновлении работы, но это несложно.
 
Последнее редактирование:
Да можно и потоком, как у тс, только установка блоков должна делегироваться в ближайший тик основного потока через Bukkit.getScheduler().runTask(...).
 
Нет Scheduler не работает, я пробовал, Вообще я уже решил проблему. У меня было ядро на сервере Spigot, я поставил CraftBukkit и все заработало)
 
Нельзя изменять мир из других потоков. Действия с ним должны происходить только в главном потоке сервера. Если задание большое, разбейте его выполнение на несколько тиков, используя Scheduler.
:good:
 
Назад
Верх