Как найти радиус блока

Блок-регион это блок Маппета, позволяющий добавлять триггеры на входе или выходе игрока из определённого региона, настраиваемого посредством блока. Также, его можно использовать чтобы не пускать игроков в определённый регион. Блоки-регионы могут быть использованы для множества вещей:

  • Начать арену когда игрок заходит на середину этой самой арены
  • Завершить квест посредством входа в регион
  • Активация смертельных ловушек с задержкой
  • Активация сцен из Блокбастера при входе в регион и т.д.

Вы можете взять блок-регион во вкладке Маппета в режиме творчества.

Блок-регион

Нахождение блока-региона

Так как блоки-регионы это невидимые нетвёрдые блоки, найти их при создании карты может быть достаточно сложно. Однако, вы всегда сможете увидеть позицию блоков-регионов (фиолетовых кубов) при включении экрана отладки на F3. Кроме того, на экране отладки показывается ещё и пространство региона.

Эта опция работает исключительно в режиме творчества.

Настройка

Дабы начать настройку блока-региона, поставьте его где-либо в мире и кликните по нему правой кнопкой мыши. Вы увидите следующий экран:

Панель редактирования блоков-регионов

Проходимый

При отключении, этот параметр делает для игрока невозможным проход через регион. Игрок будет телепортирован на последнюю позицию вне региона. Выражение при активации позволяет контролировать могут ли игроки пройти или нет (любое выражение, равняющееся 0, отключит телепортацию).

Кроме того, при отключении этого параметра триггеры на входе и выходе, а также задержка триггера использоваться не будут.

Примечание: на момент альфы эта опция иногда приводит к телепортации игрока за пределы региона. Это баг.

Выражение при активации

Выражение при активации позволяет указать выражение, позволяющее активировать исполнение триггеров если итоговое значение является ненулевым, или попросту не пустым.

Задержка триггера

Задержка триггера позволяет задержать исполнение триггера, выполянемого на входе игроком в регоин на заданное количество тиков (в секунде 20 тиков). На триггер, исполняемый на выходе игрока из региона, это никак не повлияет. Он будет исполнен мгновенно после выхода игрока из региона.

Эта опция не работает при выключеном параметре «Проходимый».

Форма

Формы компонентов позволяют настроить форму региона. Вы можете переключаться между формами кликом левой или правой кнопки мыши на кнопку под текстом Форма. на данный момент, блок-регион поддерживает следующие формы:

  • Куб
  • Сфера
  • Цилиндр

Каждая из этих форм говорит сама за себя и свойства у них достаточно похожие. В частности, у всех них есть свойство смещения по XYZ, которое позволяет вам смещать регион на определённое количество блоков. Это должно позволить вам спрятать блоки-регионы за стенами или под землёй, в то время как сами регионы будут находиться на желаемых вами местах.

Радиус

Радиус куба позволяет вам задать размер региона по осям X, Y и Z. Помните, что полный размер куба вдвое больше указываемых вами значений.

Радиус и высота

Радиус и высота цилиндра позволяют вам менять горизонтальный радиус цилиндра вместе с его высотой соответственно. Как и с размером куба, как радиус, так и высота просчитываются относительно точки смещения, так что их значения тоже составляют лишь половину.

Радиус эллипсоида

Радиус сферы эллписоида позволяет вам менять горизонтальный и вертикальный радиус сферы соответственно. Как и с размером куба, оба радиуса просчитываются относительно точки смещения, так что их значения тоже составляют лишь половину.

Скрыть объявление

В преддверии глобального обновления, мы проводим исследования, которые помогут нам сделать опыт пользования форумом ещё удобнее. Помогите нам, примите участие!
Статус темы:

Закрыта.
  1. Привет всем, допустим у меня имеется начальная точка (локация) это маяк, и от неё мне нужно получить допустим круг из 4 блоков, и если в этот «диск» войдут игроки, точка будет захвачена, как мне получить определенный радиус от блока и заменять эти блоки во время захвата точки?


  2. NoooobKa

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

    Баллы:
    76
    Имя в Minecraft:
    NoooobKa

    Так квадратный диск или ровный куб? Как вариант рунейблом проверять все точки на наличие игроков getNearbyEntities , если такие имеются то получаешь нужный тебе блок от твоего блока со сдвигом(getRelative(int modX, int modY, int modZ))


  3. NoooobKa

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

    Баллы:
    76
    Имя в Minecraft:
    NoooobKa

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


  4. 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();
    }

  5. Gru2303

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

    Баллы:
    76
    Имя в Minecraft:
    Gru2303

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

    Я пробовал вот так делать, але это херня какая то:


    for (double x = -radius<= radiusx++) {
                for (
    double z = -radius<= radiusz++) {
                    if ((
    x*x)+(z*z) <= radius*radius) {
                        
    // todo
                    
    }
                }
            }



  6. 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

Статус темы:

Закрыта.

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


Rubukkit - свой сервер Minecraft

Вообщем, есть задача найти в мире (в пределах радиуса 50к блоков от нулевых координат) игрока (его дом(место обитания)), или определенный блок, Используя все доступные средства OC, CX (и других стандартных индустриальных модов, которые указанны в спойлере), без «креативных» предметов типа «дебаг карты» и без накрутки стандартных конфигов, то-есть только честная игра в режиме выживания.

Суть в том, что бы вычислить месторасположение дома(базы) некого игрока который редко выходит с базы и львиную долю времени проводит у себя на базе, или например координаты блока который предположительно может быть установлен только игроком, что собственно уже говорит о том что тут есть или был игрок.

Всё это касается приватного сервера, на котором игроков всего два, я и ещё один.

Понимаю что в реальности это очень сложно и решил написать об этом здесь, возможно кто-то подскажет хороший вариант реализации данного «замысла».
 

Достаточно каким-то методом вычислить расстояние до искомой цели с двух разных точек и уже можно при помощи не хитрих манипуляций вычислить координаты искомой целы, но увы… я пока не придумал как можно получить расстояние до искомой цели, что собственно и не странно, потому что если бы такая задача была легко реализуемая, то на публичных серверах она была бы слишком «читерной».
Но всё же очень интересная задача найти что-то или кого-то в огромном мире майна(радиусе 50к)
Есть вариант поиска роботом который перемещается по карте начиная от нулевых координат до заданного радиуса по спирале и с некоторой периодичностью сканирует пространство улучшением «Радар» из CX, на наличие игрока, но сами понимаете на сколько это не легко выполнимая задача с учетом стандартного радиуса радара в 8 блоков, оффлайна игрока и времени требуемого для выполнение этой процедуры. Прям какой-то брут-форс по миру майна…

Собственно ожидаю, любых размышлений, вариантов и предложений на эту тему

Некоторые подробности о модах которые можно задействовать:

Версия игры — 1.12.2
Версия OC — 1.7.0.20
Версия CX — 1.6.5
Также в наличии такие моды:
OpenGlasses
ComputerCraft
AE2
IC2
Forestry
Всё конфиги дефолтные!

Если вдруг возник вопрос зачем это мне, то ответ: только фан…


Изменено 30 октября, 2017 пользователем Гость

  • #1

Как можно реализовать проверку на блок в радиусе игрока, в определенном ивенте?

  • #3

Да я просто с одним человеком говорил на эту тему, он предложил спросить, вдруг поинтересней будут идеи.

  • #4

Будем считать, что тебе уже дали идею насчет AABB (чисто моё предположение).
Имея AABB вокруг блока (тайла?), делаем примерно следующее, надеюсь поймешь логику:

Entity[] entities = myAABB.getEntitiesOfClass(EntityPlayer.class);

for (Entity e : entities) {
    float x = e.getX()-myX;
    float y = e.getY()-myY;
    float z = e.getZ()-myZ;
    float length = Math.sqrt(x*x + y*y + z*z);
    float radii = 5f;
    if (length <= radii) {
        sphere.addEntity(e); //удовлетворяет условиям - сущность подходит
    }
}

Этот код пикает всех полученных игроков из бокса в радиусе сферы.
Можно сделать с окружностью, убрав ось Y.

  • #5

Ты не понял чуток.Нужно проверить, есть ли блок в радиусе.

for(int i < -5; i < 4; i++){
    if(player.worldObj.getBlock(player.posX + i, player.posY + i, player.posZ + i) == Your_Block){
        //Если в радиусе 5 блоков от игрока есть твой блок - выполняем что-то.
    }
}

  • #6

Окей. Я исходил из того, что вызовет наименьшую нагрузку.
Алсо, у тебя в примере просто диагональ проверяется.

Код от игрока:

int pX = player.posX;
int pY = player.posY;
int pZ = player.posZ;
int radii = 5;
for (int x = -radii; x < radii; x++)
  for (int y = -radii; y < radii; y++)
    for (int z = -radii; z < radii; z++) {
      int tx = x-pX;
      int ty = y-pY;
      int tz = z-pZ;
      double len = Math.sqrt(tx*tx + ty*ty + tz*tz);
      if (len <= radii) {
        //Если в радиусе 5 блоков от игрока есть твой блок - выполняем что-то.
      }
}

Так сойдет? Подобная проверка в любом случае лучше чем проверка на бокс. Если не вызывается каждый тик, конечно.

  • #7

Ой, а я сначала думал-думал, может не надо три цикла, а оказывается — надо.

  • #8

Что-то как-то у меня ругается на  player, не подскажете, что добавить?

  • #9

Нужна переменная/агрумент игрока. Впиши вместо плаер

I’m trying to make a custom crafting system, but I’m not sure how to test for blocks within a radius of players, not command blocks. Specifically, I’m attempting to test if there is a dropper within ten blocks of a player at any given time and any given place in the world. Is there a way to do this?

Fabian Röling's user avatar

asked Jun 23, 2015 at 23:59

vex's user avatar

7

This can be done via the /fill command within /execute.

/execute @a ~ ~ ~ fill ~10 ~10 ~10 ~-10 ~-10 ~-10 pumpkin 0 replace dropper 1

/execute @a ~ ~ ~ fill ~10 ~10 ~10 ~-10 ~-10 ~-10 dropper 1 replace pumpkin 0

You don’t have to use a pumpkin, any unused block will do.
Put these two commands separately on a fill clock and run a comparator out from either of the two command blocks with the commands in them. Whenever any player is within 10 blocks (including diagonals, unfortunately) of a dropper with the data value of 1 (was that facing down? I can’t remember), the comparator will turn on. Whenever they move out of range, it will turn off. That’s currently the closest you can get to what you asked.

Community's user avatar

answered Jul 19, 2015 at 9:03

LyricLy's user avatar

2

Here’s another idea:

If the droppers are not crafted by the player himself, you could simply spawn an armor stand at every dropper and then use /execute @p[...] ~ ~ ~ /testfor @e[type=ArmorStand,...]

If the player can craft the droppers, you could replace every dropper in the player’s inventory with an armor stand named «Dropper» and all the attributes you want. When it is placed, it automatically executes the setblock command to spawn the dropper. The armor stands should be invisible of course.

You can also do nested execute commands to avoid the problem with the command block’s radius.

Ben's user avatar

Ben

40.8k66 gold badges190 silver badges309 bronze badges

answered Sep 9, 2015 at 23:48

Frostbite1003's user avatar

You must log in to answer this question.

Not the answer you’re looking for? Browse other questions tagged

.

Понравилась статья? Поделить с друзьями:
  • Как составить анкету об автомобилях
  • Как найти все образы преобразования
  • Как найти массу шарика формула
  • Как найти относительную высоту на плане
  • Как составить график работы сотрудников в выходные дни