Карта высот SA-MP
#1

Опять мне нечего делать по ночам и я продолжаю изобретать концепты скриптов для любимого мультиплеера.
В общем Anti-airbreak

Quote:

Dr.Psycho (00:48:41 14/01/2010)
хм
Dr.Psycho (00:48:43 14/01/2010)
как ты думаешь
Dr.Psycho (00:48:49 14/01/2010)
реально составить карту высот для SA-MP
Продавец кошмаров (00:49:05 14/01/2010)
типа
--- (00:49:15 14/01/2010)
на каждый x+y чтобы узнать z?
Dr.Psycho (00:49:18 14/01/2010)
типа анти айрбрейк нехуевый
Dr.Psycho (00:49:23 14/01/2010)
да
--- (00:49:27 14/01/2010)
заебешься
--- (00:49:33 14/01/2010)
если это вообще возможно сделать
Dr.Psycho (00:49:37 14/01/2010)
это возможно
--- (00:49:40 14/01/2010)
слишком глобально
Dr.Psycho (00:49:40 14/01/2010)
теоретически
Dr.Psycho (00:49:48 14/01/2010)
но можно ведь..хз
--- (00:49:57 14/01/2010)
человек 1000 найди кто это будет делать
--- (00:50:15 14/01/2010)
помоему все id объектов проверить и расписать какой из них что намного легче
Dr.Psycho (00:50:20 14/01/2010)
зачем все эти извращения?
--- (00:50:32 14/01/2010)
чтобы было реально сделать
Dr.Psycho (00:50:40 14/01/2010)
а вот нихуя
Dr.Psycho (00:50:48 14/01/2010)
делаешь короче
Dr.Psycho (00:50:50 14/01/2010)
тачку
Dr.Psycho (00:50:53 14/01/2010)
в воздухе
Dr.Psycho (00:51:00 14/01/2010)
она падает
Dr.Psycho (00:51:14 14/01/2010)
а ты замеряешь в какое время она будет стремительно терять z координату
Dr.Psycho (00:51:26 14/01/2010)
и когда эта стремительность пропадёт
Dr.Psycho (00:51:42 14/01/2010)
то всё
--- (00:51:56 14/01/2010)
проще летать по мапе и самостоятельно проверять
--- (00:51:58 14/01/2010)
нааамного
Dr.Psycho (00:52:00 14/01/2010)
замерять координату и писать её в файл
Dr.Psycho (00:52:06 14/01/2010)
ну можно обьехать весь са
Dr.Psycho (00:52:13 14/01/2010)
но на это уйдёт.. гм дохуя времени
--- (00:52:20 14/01/2010)
так уйдет больше
Dr.Psycho (00:52:24 14/01/2010)
но процесс можно автоматизировать
--- (00:52:34 14/01/2010)
придумай как и потом поговорим
Dr.Psycho (00:52:40 14/01/2010)
просто
Dr.Psycho (00:52:44 14/01/2010)
за месяц
Dr.Psycho (00:52:47 14/01/2010)
на паблике большом
Dr.Psycho (00:52:53 14/01/2010)
замерять все передвижения игроков
Dr.Psycho (00:53:00 14/01/2010)
и их высоты
Dr.Psycho (00:53:04 14/01/2010)
потом написать скрипт
Dr.Psycho (00:53:11 14/01/2010)
который убирает повторы среди этих высот
Dr.Psycho (00:53:15 14/01/2010)
и всё..
Dr.Psycho (00:53:17 14/01/2010)
готово

Кто что думает по этому поводу? Выгодно ли делать anti-airbreak, основываясь на карте высот?
Reply
#2

Ну для карт высот есть плагин http://forum.sa-mp.com/index.php?topic=145196.0 жрет только много
Reply
#3

Kye замутил сам такой плагин. Как я понял, там просто у него есть список Z координат с шагом в 1 метр в XY стороны. В ОЗУ эта база ~ 70 Мб занимает. Попробуйте грубо подсчитать примерно 6000 кв.м. * 6000 кв.м. = 36000000 точек, допустим для каждой нужно по 2 байта. 36000000 *2 = 72000000 ~ 70 Мб. Но это я говорю, потому что не знаю, плагин не юзал, не смотрел его работу и коды..

-- немного позже --
Повозился я с ботами, от них толку нет в составлении каких-то карт, они даж с высоты не падают сами

Вощем, чтобы с помощью мультика составить любую карту координат поверхности, нужно каждую XY точку тестировать самим игроком. Только вручную бегать не надо. Нужен скриптик, который будет ставить игрока в нужную XY точку на большой высоте и потом с помощью SetPlayerVelocity посильней бить игрока о поверхность внизу. В колбэке смерти игрока, заморозить труп, взять Z от трупа, записывать куда хотите и запускать новую точку для падения игрока. XY шаг мона и побольше чем метр взять, все зависит от того какая точность нужна (: времени канеш уйдет немало

Если шаг 1 метр и макс размер карты 6км * 6км, то получится примерно 36 млн. точек Z, если хранить значение как Float, то получится 144 млн. байт (~140 Мб). Если хранить как целое число, потеряем точность до 1 метра (как у Kye), примерно 70 Мб получится, если брать 2 байтовые числа.

Возможны и более умные варианты, например объехать всю сушу вдоль берега, запоминая XY края суши. Потом каким-то способом просканировать только все XY точку на суше, т.к. на воде координата всего одна. Есь еще спорные моменты с тонелями, и с объектами, которые закрывают землю.

Можно полазить по data файлам игры и подчерпунть нужную инфу. Если Нужное найдется, можно сделать фс, который хранит все нужные данные и имеет public функции для обращения из других скриптов. К примеру, если фс для определния Z координат не нужен, его мона отключить.. и т.д. и т.п.
Reply
#4

есь небольшой, но весьма неточный способ определния координаты Z для какой-то XY точки - телепортировать игрока под землю, игра сама потом ставит игрока в точку земли. Правдо разнос бывает сильным.
Reply
#5

Он возвращает его на ближайший путь пешеходов.
Reply
#6

Есть еще SetPlayerPosFindZ, правда, просканировать карту ей можно только с помошью самого игрока, для ботов она не работает. Я подозреваю, что SetPlayerPosFindZ, скорее всего, использует механизм игры и, видимо, поэтому Kye решил создать карту высот заново и по-своему.
Reply
#7

Мне ещё кажется что SetPlayerPosFindZ учитывает интерьеры (если там сделаешь Z 9999 и попадётся интерьер, то установит позицию интерьера.
Reply
#8

Я проверил эту функцию полностью - она работает везде, и в интерьерах. Она помещает на любой уровень пола, даже в одно точке XY, смотря какое Z указать. К примеру, если стоять на мосту и Z указать чуть меньше текущего Z игрока, то игрока к примеру в воду поместят, или на пол, который ниже уровня моста.
Reply
#9

Такая фигня этот его плагин, лучше бы использовал геометрию SA, и нормально бы определял Z координату наивысшей точки для любой пары X,Y, с учётом динамически созданных объектов и интерьеров. Мы с ним когда то уже обсуждали эту тему и он привёл причину, по которой он не может этого сделать, собственно проблема в том, что карта подгружается и просчитывается только вблизи игрока, но что мешает вызвать просчёт в других координатах он не сказал
Reply
#10

он ещё выложил карту с цветами(ярко зелёный - самая высокая точка)...
что если открывать эту картинку и по цветам на картинке определять высоту?
Reply
#11

Quote:
Originally Posted by [JIeXa
]
он ещё выложил карту с цветами(ярко зелёный - самая высокая точка)...
что если открывать эту картинку и по цветам на картинке определять высоту?
А нах? Если есть плагин, который позволяет определить Z для любых целых X,Y. С таким качеством, с которым он выложил эту картинку, она подойдёт только для аннонса новости Слишком маленькое разрешение, шоб по ней более менее точно определять.
Тем более есть режим низкого потребления памяти для этого плагина, но тогда с меньшей точностью будут определяться координаты.
Reply
#12

зачем тебе цвета на картинке, если бинарник со значениями рядом

Quote:
Originally Posted by DarkByte
Такая фигня этот его плагин, лучше бы использовал геометрию SA, и нормально бы определял Z координату наивысшей точки для любой пары X,Y, с учётом динамически созданных объектов и интерьеров. Мы с ним когда то уже обсуждали эту тему и он привёл причину, по которой он не может этого сделать, собственно проблема в том, что карта подгружается и просчитывается только вблизи игрока, но что мешает вызвать просчёт в других координатах он не сказал
Мне стало интересно про этот механизм игровой. Спору нет, что Kye предложил рабочее решение. Но какими средствами это выполнено! (: нужно узнать что-то про механизм, или чтобы сделать легковесную альтернативу, придется использовать чтение с файла, но это тоже не совсем ОНО.
Reply
#13

Quote:
Originally Posted by MX_Master
Мне стало интересно про этот механизм игровой. Спору нет, что Kye предложил рабочее решение. Но какими средствами это выполнено! (: нужно узнать что-то про механизм, или чтобы сделать легковесную альтернативу, придется использовать чтение с файла, но это тоже не совсем ОНО.
Ну вообще, тебе как минимум нужно знать устройство файлов ipl ide и col, но я бы не сказал что парсинг всех нужных файлов будет лучшим решением, чем предложил Kye. лучше было бы построить один полигон всей поверхности SA, в памяти он будет занимать гораздо меньше, чем в случае с Kyeвой картой, где 36млн точек.
Reply
#14

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

Думаю, формат IPLок не так сложен, раз под СА создают редакторы карт. Надо глянуть и найти логику. Человеки же придумали (:
Reply
#15

ну если бы kye предоставил картинку разрешением 1900x1600, то думаю это заняло бы куда меньше памяти чем хэш...
Reply
#16

Quote:
Originally Posted by MX_Master
Опять же, смотря какая точность нужна, т.е. в некоторых прямых местах будет меньше вершинок, но где-то в городах их будет немало. Все упирается в точность. Плюс еще такой момент, в каких-то местах есть несколько уровней поверхности - мосты, балконы, казырьки, тоннели, бункеры и все подземные и надземные сооружения в 0 интерьере. Про другие интерьеры пока умолчим.

Думаю, формат IPLок не так сложен, раз под СА создают редакторы карт. Надо глянуть и найти логику. Человеки же придумали (:
Полигон только из наивысших точек, в GTA очень много прямых линий

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

Quote:
Originally Posted by [JIeXa
]
ну если бы kye предоставил картинку разрешением 1900x1600, то думаю это заняло бы куда меньше памяти чем хэш...
Предложил там ещё одну идею ему, она уже получше чем полигон, да и вообще она довольно проста как в реализации, так и в использовании, при этом плагин будет кушать минимум памяти
Reply
#17

Чтение с файла это наверно самый первый вариант, который пришел в голову Kye. Но по своим соображениям, он сделал иначе.
Reply
#18

Quote:
Originally Posted by [JIeXa
]
ну если бы kye предоставил картинку разрешением 1900x1600, то думаю это заняло бы куда меньше памяти чем хэш...
Для того, чтобы нормально определять координату Z с точностью до целых X,Y, как это сделано сейчас, потребуется картинка не меньше 6000х6000px, которая в памяти будет занимать даже больше, а весить будет в зависимости от сжатия (без сжатия в 4 раза больше от текущего размера).
Quote:
Originally Posted by MX_Master
Чтение с файла это наверно самый первый вариант, который пришел в голову Kye. Но по своим соображениям, он сделал иначе.
Врядли он его вообще рассматривал, считая что это медленный вариант, но не стоит этот метод недооценивать, ведь mysql же не тормозит и работает с гигантскими объёмами данных очень быстро, а принцип тот же и памяти не кушает много, все данные хранятся в файлах, в памяти только данные, которые необходимы для текущей операции выборки. Вообще, жёсткий диск не в состоянии физически прочитать 1 байт, он читает кластерами, это уже потом ОСь вырезает нужный байт из набора (1024 обычно) и отдаёт программе, но кроме этого, у жёсткого диска имеется ещё и внутренний кеш, который активно используется. Например если система запросила прочитать указанный клайстер, то жёсткий диск может, как бэ предугадывая действия программы, прочитать и отложить себе в кеш несколько следующих клайстеров и когда программа обратится за следующей порцией данных, они уже будут считанные не с "блина" жёсткого диска, а из его кеша. Плюс сама ОСь выделяет часть оперативной памяти под кеширование файлов часто читаемых с диска

В общем я к чему, применимо к данной задаче, чтение из файла будет так же быстро, как и чтение из памяти
Яб это написал в англоязычной теме, но лень переводить, да и следующий экзамен не по английскому, а по теории вероятностей D:
Reply
#19

В общем сделал версию NOCACHE, которая не хавает оперативу и работает так же быстро
Скачать сорцы и измёнённые файлы можно по ссылке MapAndreas_v1_0_beta_NOCACHE.ZIP
Обновил файлы: инклуд для павно, тестовый скрипт, скомпиленные плагины для винды и никсов.
В архиве нету самого файла карты (SAfull.hmap), его можно взять из оригинально архива (28.2мб).
Reply
#20

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


Кстати я тут подумал.. ведь можно вместо плагина который жрёт 70 мегабайт.. создать бота. Помещать бота в определённый участок и находить для него координату Z. Прокатит, не?
Reply


Forum Jump:


Users browsing this thread: 2 Guest(s)