Помогите Получение радиуса от блока

Статус
Закрыто для дальнейших ответов.

Phizzle

Активный участник
Пользователь
Баллы
66
Имя в Minecraft
Phizzle
Привет всем, допустим у меня имеется начальная точка (локация) это маяк, и от неё мне нужно получить допустим круг из 4 блоков, и если в этот "диск" войдут игроки, точка будет захвачена, как мне получить определенный радиус от блока и заменять эти блоки во время захвата точки?
 
Так квадратный диск или ровный куб? Как вариант рунейблом проверять все точки на наличие игроков getNearbyEntities , если такие имеются то получаешь нужный тебе блок от твоего блока со сдвигом(getRelative(int modX, int modY, int modZ))
 
Ну как я и предложил вариант:
1) Т.к у тебя имеется начальная/начальные точки, значит ты можешь получать энтитей в радиусе от этой точки.
2) Сделай уровнение фигуры из блоков которые должны меняться. Тут пришла идея в голову, брать циклом квадрат блоков, и чекать их на радиус от центра, должно получится что-то типо *диска*, но это не точно, хз тут как поступить думай сам.
Если игроков в локе получили, и придумали уравнение. Остается только придумать условия
 
Надо уметь пользоваться интернетом: https://www.spigotmc.org/threads/lib-sphere.48069/
Или же знать математику:
Код:
for (int i = 0; i < 360; i++) {
  int x = block.getX() + Math.sin((double) i) * radius;
  int z = block.getZ() + Math.cos((double) i) * radius;
  Location location = new Location(block.getWorld(), x, block.getY(), z);
  Block blockaround = location.getBlock();
}
 
Еще один "гений" решил умом блеснуть :D

А почему ты не подскажешь если все мы здесь глупые?

Я пробовал вот так делать, але это херня какая то:
PHP:
for (double x = -radius; x <= radius; x++) {
            for (double z = -radius; z <= radius; z++) {
                if ((x*x)+(z*z) <= radius*radius) {
                    // todo
                }
            }
        }
 
Готовый код сферы из гугла
Код:
public class Sphere {//TODO annotations
    private ArrayList<Block> sphere = new ArrayList<Block>();
    private Location center;
    private int radius;
  
    public Sphere(Location center, int radius) {
        this.center = center;
        this.radius = radius;
        for(int X = -radius; X < radius; X++) {
            for(int Y = -radius; Y < radius; Y++) {
                for(int Z = -radius; Z < radius; Z++) {
                    if(Math.sqrt((X * X) + (Y * Y) + (Z * Z)) <= radius) {
                        Block block = center.getWorld().getBlockAt(X + center.getBlockX(), Y + center.getBlockY(), Z + center.getBlockZ());
                        sphere.add(block);
                    }
                }
            }
        }
    }
  
    public Location getCenter() {
        return center;
    }
  
    public int getRadius() {
        return radius;
    }
  
    public ArrayList<Block> getBlocks() {
        return sphere;
    }
  
    private boolean isInside(int X, int Y, int Z) {
        return Math.sqrt((X * X) + (Y * Y) + (Z * Z)) <= radius;
    }
  
    public boolean overlaps(Sphere other) {
        for (Block block : other.getBlocks())
            if (contains(block.getLocation()))
                    return true;
        return false;
    }
  
    public boolean contains(Location loc) {
        return isInside(loc.getBlockX(), loc.getBlockY(), loc.getBlockZ());
    }
}
Чтобы получить круг нужно просто убрать цикл по Y
 
Статус
Закрыто для дальнейших ответов.
Назад
Верх