SA:MP Single ASI Map Markers - Свои метки на карте

Haskor

Новичок
Автор темы
4
1
Версия SA-MP
  1. Любая
MapMarkers
Свои метки на карте GTA San Andreas и SA-MP: любая стандартная иконка, редактирование прямо в игре, сохранение между запусками.

banner_1200x400.png

Это обычный .asi, который цепляется к самой игре. Ни CLEO-скриптов, ни SAMPFUNCS, ни MoonLoader не требуется, поэтому версия SA-MP значения не имеет.


Меню плагина:
Menu.png



Установка метки на карте:

Adding.png



Слои коллекционных предметов:
Map Layers.png



Что умеет

  • Меню прямо в игре (по умолчанию — клавиша Home): добавление, редактирование и удаление меток.
  • Три способа поставить метку:
    • на своей текущей позиции;
    • по введённым вручную координатам X / Y / Z;
    • прямо с карты — открываете карту паузы, ставите обычный вейпоинт мышкой и жмёте Insert. Метка появляется на карте сразу, выходить из меню не нужно.
  • Любая из 64 стандартных иконок радара — дом, аммунация, больница, казино, гараж, спрей, вопросительный знак, waypoint и все остальные. Листаются стрелками, иконка на радаре меняется сразу.
  • Превью иконки прямо в меню: справа от строки рисуется настоящая текстура радара, поэтому видно, как метка будет выглядеть, ещё до её создания.
  • Настройка каждой метки: размер блипа (1–5), режим показа (иконка на карте / столб в мире / и то и другое) и цвет — для меток без иконки.
  • Удаление: последней поставленной метки одним пунктом (в строке видно её имя и иконку), любой отдельной метки из её карточки, либо всех сразу с подтверждением.
  • Автосохранение в MapMarkers.ini рядом с gta_sa.exe после каждого изменения — метки восстанавливаются при следующем запуске.
  • Сторож: если игра сбросила массив блипов (загрузка, реконнект, смена мира), метки восстанавливаются сами раз в секунду.
  • Слои карты — целые категории объектов одним переключателем, см. отдельный раздел ниже.
  • Лог MapMarkers.log: видно версию, какие хуки встали и что реально произошло, если что-то пошло не так.



Слои карты (граффити, подковы, ракушки, фото и не только)

Пункт Map layers... открывает подменю, где каждая категория включается отдельно, а строка All layers переключает сразу все. Цвет слоя показан квадратиком справа, а счётчик говорит, сколько предметов этой категории ещё осталось в вашем сохранении.

  • Граффити — фиолетовый — 100 тегов в Лос-Сантосе, которые ещё не закрашены
  • Подковы — жёлтый — 50 подков в Лас-Вентурасе
  • Ракушки — белый — 50 ракушек, в основном под водой
  • Фото — синий — 50 точек для снимков в Сан-Фиерро
  • Трюковые прыжки — оранжевый — невыполненные уникальные прыжки
  • Оружие — красный — пикапы оружия по карте
  • Аптечки и броня — зелёный
  • Деньги и взятки — янтарный — деньги, кейсы, полицейские звёзды

Координаты нигде не захардкожены. Плагин читает их прямо из памяти игры каждые две секунды: пикапы — из массива пикапов, граффити — из менеджера тегов, прыжки — из их пула. Побочный эффект самый приятный: собранное исчезает с карты само. Подобрали подкову — её метка пропала, закрасили тег — тоже. Ничего чистить руками не нужно.

В GTA SA на всю игру всего 175 слотов блипов — это ограничение самой игры, а не плагина. Только коллекционных предметов на чистом сохранении около 250, плюс ваши собственные метки, плюс иконки сервера в SA-MP.

Поэтому слои работают с бюджетом (по умолчанию 120 блипов): если включённые категории просят больше, показываются ближайшие к вам точки, а меню честно пишет об этом строкой вида Radar limit: 120 of 214 shown, nearest first. Список пересобирается каждые две секунды, так что при движении подтягиваются точки нового района.

Ваши собственные метки ставятся раньше слоёв и слоты никогда не теряют. Бюджет меняется в ini параметром layers_limit.



Управление

Меню управляется цифровым блоком, чтобы клавиши не конфликтовали ни с чатом SA-MP, ни с управлением персонажем. NumLock должен быть включён.

Код:
Home              открыть / закрыть меню
Insert            поставить метку на вейпоинт карты (работает и в меню карты)
Num8 / Num2       вверх / вниз
Num4 / Num6       изменить значение (иконка, размер, режим показа, цвет)
Num5              выбрать
Num0              назад / закрыть
End               удалить последнюю метку (по умолчанию выключено)

верхний ряд цифр, "-", ".", Backspace — ввод координат

Если удобнее стрелки и Enter — включается параметром arrow_keys=1 в ini. Учтите: игра их не блокирует, поэтому персонаж будет двигаться, пока вы листаете меню.

Клавиши читаются глобально, поэтому Home, Insert и End сработают и во время набора сообщения в чате SA-MP, где они обычно двигают курсор по строке. Именно поэтому End (он удаляет метку) по умолчанию отключён. Любую клавишу можно переназначить или выключить в ini.

  1. Нажмите Esc, откройте Map.
  2. Кликните по карте — ставится обычный вейпоинт, как всегда.
  3. Нажмите Insert. Ровно под иконкой вейпоинта появится постоянная метка с текущей иконкой по умолчанию, а внизу — зелёная строка с координатами.
Вейпоинт при этом остаётся на месте: можно сразу перенести его и поставить следующую метку.

Такие метки создаются в режиме «только иконка на карте», без столба в мире. Причина простая: клик по карте не несёт высоты, игра всегда записывает вейпоинту нулевой Z, и столб оказался бы под землёй. Режим и координаты потом правятся в карточке метки.



Требования и установка

  • gta_sa.exe версии 1.0 US (14 383 616 байт) — та же, что нужна SA-MP. На других версиях (1.01, 3.0, оригинальная стимовская) плагин пишет причину в лог, выключается и не трогает память игры вообще.
  • Любой ASI-загрузчик: CLEO, Ultimate ASI Loader (vorbisFile.dll / d3d9.dll), загрузчик из ModLoader — что стоит, то и подойдёт.

  1. Скопировать MapMarkers.asi в папку с gta_sa.exe.
  2. Запустить игру — плагин сам создаст MapMarkers.ini и MapMarkers.log рядом.
  3. Нажать Home. В заголовке меню видна версия — по ней всегда понятно, какая сборка загрузилась.

Создаётся сам, правится в блокноте. Пункт меню Reload from MapMarkers.ini применяет файл без перезапуска игры.

Код:
[settings]
version=2             ; версия формата, не трогать
menu_key=36           ; клавиша меню, VK-код (36 = Home, 118 = F7)
delete_last_key=0     ; удалить последнюю метку, 0 = выключено, 35 = End
map_marker_key=45     ; метка по вейпоинту карты, 45 = Insert, 0 = выключено
arrow_keys=0          ; 1 — разрешить стрелки / Enter / Backspace

; оформление меню в координатах 640x448, игра сама масштабирует под разрешение
font_scale_x=0.30     ; ширина шрифта
font_scale_y=0.80     ; высота шрифта
line_height=16.0      ; расстояние между строками
panel_x=30.0
panel_y=60.0
panel_width=380.0

; иконка по умолчанию для новых меток (41 = waypoint)
default_icon=41

; слои карты (1 = показывать)
layer_tags=0
layer_horseshoes=0
layer_oysters=0
layer_snapshots=0
layer_stunt_jumps=0
layer_weapons=0
layer_health=0
layer_money=0
layers_limit=120      ; бюджет блипов для слоёв, побеждают ближайшие точки
layers_display=2      ; 1 — столб в мире, 2 — иконка на карте, 3 — и то и то

[markers]
; название|X|Y|Z|иконка|размер(1-5)|показ(1-3)|цвет RRGGBBAA
Home|2495.000|-1687.000|13.500|32|2|3|FF0000FF
Ammu-Nation|2159.000|943.000|10.800|6|2|2|FF0000FF

Если текст меню кажется слишком крупным, мелким или строки наезжают друг на друга — правьте font_scale_x, font_scale_y и line_height.

Названия меток лучше писать латиницей: кириллицу шрифт игры покажет правильно только на русифицированных сборках.

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

Номера взяты из таблицы имён текстур внутри самого gta_sa.exe, поэтому совпадают с игрой один в один. Иконка 0 рисует цветной квадрат вместо картинки, иконка 1 пустая и пропускается при листании.

Код:
 0  без иконки (цветной блип)   32  дом красный
 1  (не используется)           33  клетчатый флаг (гонка)
 2  centre                      34  RYDER
 3  стрелка                     35  дискета (сохранение)
 4  север                       36  автошкола
 5  самолёт (аэропорт)          37  вопросительный знак
 6  Ammu-Nation                 38  SWEET
 7  парикмахерская              39  тату-салон
 8  BIGSMOKE                    40  THETRUTH
 9  якорь (порт)                41  waypoint
10  Burger Shot                 42  ранчо Торено
11  бульдозер                   43  триады
12  CATALINAPINK                44  казино триад
13  CESARVIAPANDO               45  футболка (одежда)
14  Cluckin' Bell               46  WOOZIE
15  CJ                          47  ZERO
16  CRASH1                      48  свидание: диско
17  закусочная                  49  свидание: бар
18  emmetGun                    50  свидание: еда
19  атака врага                 51  грузовик
20  огонь                       52  доллар
21  сердце (подружка)           53  флаг
22  больница                    54  спортзал
23  LocoSyndicate               55  гараж (штрафстоянка)
24  MADDOG                      56  фонарь
25  казино мафии                57  взлётная полоса
26  MCSTRAP                     58  Ballas
27  TransFender                 59  Vagos
28  OGLOC                       60  Grove
29  пиццерия                    61  Aztecas
30  полиция                     62  Rifa
31  дом зелёный                 63  Pay'n'Spray



Скачать

  • Готовый .asi — во вложении к теме.
  • Исходники и релизы: github
  • Лицензия: MIT — делайте что угодно, лишь бы сохранялось упоминание авторства.

  • Плагин перехватывает вызов CHud::Draw и сначала вызывает то, что там было раньше — поэтому другие ASI, зацепившиеся за то же место, продолжают работать. Меню рисуется шрифтом самой игры.
  • Метки — это обычные координатные блипы игры, те же, что использует сама GTA. Поэтому они видны и на радаре, и на карте паузы, и работают на любом сервере.
  • Превью иконок — это настоящая текстура блипа из массива иконок радара, а не отдельная картинка.
  • Меню паузы рисуется из трёх разных мест игрового цикла, и перехвачены все три — иначе клавиша на карте срабатывала бы не всегда.
  • Перед тем как что-то патчить, плагин сверяет шесть сигнатур кода с exe. Не совпало — пишет причину в лог и не трогает память.
  • Вся покадровая работа обёрнута в обработчик исключений: при неожиданной ошибке плагин выключает сам себя, пишет код ошибки в лог, а игра продолжает работать.

Нужны Visual Studio Build Tools с компонентом «Разработка классических приложений на C++». Внешних зависимостей нет — ни plugin-sdk, ни DirectX SDK, только Windows SDK.

Код:
build.bat

Скрипт сам найдёт компилятор, соберёт 32-битную DLL и положит результат в build\MapMarkers.asi.



Известные ограничения

  • Лимит — 120 своих меток: в массиве радара GTA SA всего 175 слотов на всю игру, и слои со своими метками делят один и тот же запас.
  • Команд в чат (/marker) намеренно нет: перехват чата SA-MP требует привязки к конкретной версии клиента (0.3.7 R1–R4, 0.3DL), а меню работает с любой.
  • Модели пикапов для слоёв оружия, аптечек и денег покрывают распространённые варианты — какой-нибудь редкий пикап в слой может не попасть. Четыре коллекционных слоя и прыжки используют проверенные идентификаторы.
  • Это ASI-мод, который патчит память игры. На серверах со строгим анти-читом любые ASI могут считаться нарушением — смотрите правила сервера.



Если что-то не работает

Рядом с gta_sa.exe появляется MapMarkers.log, по нему сразу видно причину:

Код:
MapMarkers <версия> ready.            плагин запустился, версия совпадает с меню
GTA San Andreas 1.0 US not found      не та версия exe, память не тронута
Hook: 0x0053E4FF -> ...               основной хук встал
Pause menu hooks installed: 3 of 3    Insert будет работать внутри карты
Waypoint marker: X Y, icon N          метка по вейпоинту создана
Waypoint marker: no waypoint          вейпоинт на карте не поставлен
Exception 0x...                       плагин выключил сам себя, игра работает

285203-b38d2059159982fc4b1cc7d91d58856c.png
 

Вложения

  • MapMarkers.asi
    196 KB · Просмотры: 1