1. Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.
    Скрыть объявление
Скрыть объявление
В преддверии глобального обновления, мы проводим исследования, которые помогут нам сделать опыт пользования форумом ещё удобнее. Помогите нам, примите участие!

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

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

Статус темы:
Закрыта.
  1. Автор темы
    Phizzle

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

    Баллы:
    66
    Имя в Minecraft:
    Phizzle
    Привет всем, допустим у меня имеется начальная точка (локация) это маяк, и от неё мне нужно получить допустим круг из 4 блоков, и если в этот "диск" войдут игроки, точка будет захвачена, как мне получить определенный радиус от блока и заменять эти блоки во время захвата точки?
     
  2. alexandrage

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

    Баллы:
    173
    Учить геометрию.
     
  3. Автор темы
    Phizzle

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

    Баллы:
    66
    Имя в Minecraft:
    Phizzle
    понимаю
     
  4. NoooobKa

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

    Баллы:
    76
    Имя в Minecraft:
    NoooobKa
    Так квадратный диск или ровный куб? Как вариант рунейблом проверять все точки на наличие игроков getNearbyEntities , если такие имеются то получаешь нужный тебе блок от твоего блока со сдвигом(getRelative(int modX, int modY, int modZ))
     
  5. Автор темы
    Phizzle

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

    Баллы:
    66
    Имя в Minecraft:
    Phizzle
    upload_2020-6-17_13-52-40.png
    или https://imgur.com/a/euSZ7Zf
     
  6. NoooobKa

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

    Баллы:
    76
    Имя в Minecraft:
    NoooobKa
    Ну как я и предложил вариант:
    1) Т.к у тебя имеется начальная/начальные точки, значит ты можешь получать энтитей в радиусе от этой точки.
    2) Сделай уровнение фигуры из блоков которые должны меняться. Тут пришла идея в голову, брать циклом квадрат блоков, и чекать их на радиус от центра, должно получится что-то типо *диска*, но это не точно, хз тут как поступить думай сам.
    Если игроков в локе получили, и придумали уравнение. Остается только придумать условия
     
  7. kefavova

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

    Баллы:
    76
    Имя в Minecraft:
    Afek
    Надо уметь пользоваться интернетом: 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();
    }
     
  8. Gru2303

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

    Баллы:
    76
    Имя в Minecraft:
    Gru2303
    А почему ты не подскажешь если все мы здесь глупые?

    Я пробовал вот так делать, але это херня какая то:
    PHP:
    for (double x = -radius<= radiusx++) {
                for (
    double z = -radius<= radiusz++) {
                    if ((
    x*x)+(z*z) <= radius*radius) {
                        
    // todo
                    
    }
                }
            }
     
  9. NoooobKa

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

    Баллы:
    76
    Имя в Minecraft:
    NoooobKa
    Готовый код сферы из гугла
    Код:
    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
     
Статус темы:
Закрыта.

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