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

Помогите Разделение всего мира на сектора

Тема в разделе "Разработка плагинов для новичков", создана пользователем VulGAR Power, 4 мар 2022.

  1. Автор темы
    VulGAR Power

    VulGAR Power Новичок Пользователь

    Баллы:
    11
    Всем привет. Хотел бы задать вопрос не про что-то конкретное, а узнать какие-то способы сделать то, что я хочу.

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

    У меня приходит мысль только одна - сделать базу данных, где бы хранилось название конкретного тайла и его 6 точек (полигональный регион в форме шестиугольника, поэтому точек 6), после чего как-то высчитывать какой из тех тайлов ближайший и уже приватить его и передавать игроку. По идее, для этого также нужно создать какую-то функцию, которая поделит мир на такие шестиугольники. Думаю по моему тексту уже понятно, что с базами данных я еще не работал и буду только учиться.

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

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

    Баллы:
    96
    Имя в Minecraft:
    NuaN
    Насчет этого вопроса я бы вывел формулу, которая, возможно, будет привязываться к чанкам и по ним определять нужный шестиугольник. Потому что поделить весь мир можно и заранее на шестиугольники, но это будет не совсем универсальный способ. Вдруг захочешь поменять что-то, потом будет сложно.

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

    Например, чанк высчитать так можно. С ним намного проще, т.к. он квадратный. А вот с сотами нужно поискать какие-то формулы.
     
  3. Автор темы
    VulGAR Power

    VulGAR Power Новичок Пользователь

    Баллы:
    11
    Понял, спасибо, буду думать
     
  4. Reality_SC

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

    Баллы:
    123
    Имя в Minecraft:
    Reality_SC
    Поскольку в целом картина повторяющаяся, можно нарисовать в пеинте минимальную ячейку из пиксель = чанк, разных цветов, и использовать её как "шаблон". Шаблон на мир уже ложится прямоугольником.
    Найти коорды прямоугольника в мире легко: chunkX / cellSizeX, chunkZ / cellSizeZ.
    Найти корды чанка внутри ячейки-шаблона тоже легко: chunkX % cellSizeX, chunkZ % cellSizeZ.
    Затем смотришь по картинке условно цвет пикселя -- это ID чанка в шаблоне.
    Ещё нужна будет таблица соответствия ID чанков в шаблоне с ID их же на соседних прямоугольниках, чтобы можно было объединять в одну область сквозь границы. Но это не сложно. Соседей условно 8 (4 в стороны и 4 по диагонали), оно должно быть в соответствии с картинкой. Но и картинку и эти списки можно вынести в конфиг тогда будет супер конфигурируемо, вообще весь мир условно любым узором замостить можно.
     
  5. Автор темы
    VulGAR Power

    VulGAR Power Новичок Пользователь

    Баллы:
    11
    Спасибо, по-тихоньку разбираться буду, пока понятно только первое предложение, если честно)
     
  6. Автор темы
    VulGAR Power

    VulGAR Power Новичок Пользователь

    Баллы:
    11
    А как вам идея сделать список чанков? Придумать какую-то логику, по типу - каждый десятый чанк - центр шестигоульника. После чего находить ближайший чанк к чанку, на котором стоит игрок и уже от него строить точки шестиугольника.

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

    Что думаете?
     
  7. Reality_SC

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

    Баллы:
    123
    Имя в Minecraft:
    Reality_SC
    Условно такую ))
    upload_2022-3-5_19-3-28.png
    Плюс описание ID зон: синий = 1, красный = 2, голубой = 3, зелёный = 4.
    Один пиксель на картинке = 1 чанк, вид сверху.

    При наложении на координаты мира это начинает выглядеть как-то так.
    upload_2022-3-5_19-7-52.png


    Дальше, предположим что есть игрок, он где-то тут:
    upload_2022-3-5_19-10-48.png

    Тебе что нужно, заприватить за ним зелёную область, так?

    Берем его location.
    Из него получаем координаты чанка chunkX и chunkZ.

    Размер моей условной картинки 40 x 34 пикселя.

    Смотрим, в какую картинку попадает игрок.
    pictureX = chunkX / pictureSizeX;
    pictureZ = chunkZ / pictureSizeZ;
    (может быть это и не надо)

    И на какой пиксель внутри этой картинки:
    pixelX = chunkX % pictureSizeX;
    pixelZ = chunkZ % pictureSizeZ;

    Берём цвет пикселя. А дальше просто окружаем всё что залито одним цветом.

    Можно картинку рисовать исходя из пиксель = блок, а не пиксель = чанк. Без разницы.
     
  8. Kirpich

    Kirpich Новичок Пользователь

    Баллы:
    6
    Ого, а это очень интересно. А как связаны картинка и мир в майнкрафте? Как их связать?
    Да и как выбрать все чанки одного цвета тоже не понятно.
     
  9. Reality_SC

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

    Баллы:
    123
    Имя в Minecraft:
    Reality_SC
    Ну как, только своими же условностями и предположениями.
    Например, 1 пиксель = 1 чанк или 1 блок. Картинка с координатами 0; 0 начинается в мире в координатах 0; 0. Координаты X и Z в мире совпадают с высотой и шириной картинки соответственно.
    Этого уже достаточно, чтобы собрать нужные формулы (то, что выше).

    Тут как минимум два варианта.
    Первый -- если у тебя резанные краями картинки чанки покрашены в один цвет. Тогда нужно просто собрать в памяти картинку 3 x 3. Рассматривать в центре картинку как будь-то бы она это та, где стоит игрок. Дальше уже применить какой-нибудь алгоритм для заливки одного цвета.
    Второй это если рваные куски красить в разные цвета. Тогда, условно, игрок стоит на фиолетовом отрезке, который уходит "влево" за край картнки, и у тебя есть в конфиге список соответствия, типа его край с другой стороны это бордовый.
    В общем, сделать можно просто тонной разных способов. Но они не супер простые, конечно-же.
    Зато если ТС сделает или кто-то -- плюс в ему в карму :)
     
  10. Автор темы
    VulGAR Power

    VulGAR Power Новичок Пользователь

    Баллы:
    11
    Способ крутой, но довольно запарный.
    А можно например на спавне сделать шестиугольник, от которого и будут строиться все остальные?
    Может быть какая-то формула, как писали выше. Прописываешь команду, она берет твои координаты, как-то с ними шаманит, после чего получаются точки. Это было бы очень круто.

    По идее же можно как-то высчитать ближайшую точку кратную какому-то числу? Пусть у нас первая точка например по x на 0, а вторая на x 36, в таком случае каждые 36 блоков у нас вторая точка.

    Я еще конечно сам подумаю, просто вдруг кто-то с таким сталкивался и может мне подсказать.
     
  11. Dymeth

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

    Баллы:
    98
    Имя в Minecraft:
    Dymeth
    Для решения данной задачи определенно придётся что-то курить. Например:
    https://habr.com/ru/post/319644/
    https://gamedev.ru/pages/help/articles/geksagon_grid_generation

    Выше предложили альтернативное "решение в лоб". Сработать должно, хотя я бы так не делал - это ж каких размеров картинка будет )
    Но, конечно, на безрыбье и рак раб.

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

    Если принципиально шестиугольники нужны - отстрой в мире три рядом стоящих шестиугольника разными цветами и заскринь. Это даст понимание о размере или форме. Я попробую накидать алгоритм/формулу конвертации координат в мире в координаты шестиугольника и обратно.
     
    Последнее редактирование: 7 мар 2022
  12. Автор темы
    VulGAR Power

    VulGAR Power Новичок Пользователь

    Баллы:
    11
    Спасибо огромное за помощь, просто я хотел бы спросить о том, что писал выше.

    Весь мир у нас представляет по сути гексагоны. Могу ли я сделать один такой на координатах (0;0), и высчитать какая точка где находится?

    [​IMG]

    Представим даже так, понятное дело это очень маленькая область, но если работает так, как я думаю, то это неважно. Пусть у нас самая левая точка сбоку - 1, все остальные точки идут по часовой стрелке.

    Стало быть z (ось, которая идет вверх, пусть будет z) первой точки каждого гексагона будет кратно 2. То есть первый гексагон у нас 2, следующий 4 и так далее. Ровно также можно высчитать и x этой точки, он всегда кратен 4, ну, скорее всего, судя по рисунку. В таком случае каждые 4 блока по x у нас будет эта точка.

    Дак вот, у нас есть размеры гекса. Значит мы можем брать x и z игрока. Пусть игрок будет находится на кордах (521,305). Чтобы найти x для первой точки мы берем 521 делим с остатком на 4(через столько блоков у нас эта точка повторяется), у нас получается 1, далее вычитаем из 521 это число, получится 520. Это и есть x первой точки.

    По такой же логике находим z. 305 делим на 2, получается 1, вычитаем из 305, получается 304. Это z первой точки. Стало быть первая точка у нас на координатах (520;304). 520 кратно 4, а 304 кратно двум. По идее все верно.

    Было бы очень хорошо, если бы было все так просто. Дальше можно просто взять все эти точки, которые высчитываются ровно также и составить по ним полигональный регион. Тем более, что точек всего 6. Да и работало бы в таком случае все как надо - все гексагоны соединяются друг с другом и нет проплешин.
     
  13. Reality_SC

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

    Баллы:
    123
    Имя в Minecraft:
    Reality_SC
    Последнее редактирование: 9 мар 2022

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