Уроки моддинга
GTA Script GeneratorЗадать вопрос
  • О сайте
    • Проекту помогали
  • GTA SA, VC, III (PC, Classic)
    • Раздел 01. Основы
      • Общие сведения об уроках и минимальный набор программ
      • Установка Sanny Builder. Базовые настройки
      • Синтаксис, комментарии, опкоды, команды. Ключевые слова
      • Типы данных. Литералы. Константы
      • Типы проектов
      • Переменные. Операторы
      • 00012. Редактирование main.scm. Переменные (Часть 3)
      • 000175. Трюк с локальными массивами
      • 00073. Переменные, как члены класса. Коментарии в поиске опкодов. Макросы
      • 00017. Условия в Sanny Builder (Часть 1)
      • 00018. Условия в Sanny Builder (Часть 2)
      • 00019. Условия в Sanny Builder (Часть 3)
      • 000181. Условия в Sanny Builder (Часть 4)
      • 00045. Циклы (Часть 1 - while)
      • 00047. Циклы ( Часть 2 - for )
      • 00049. Циклы ( Часть 3 - repeat ). Вложенные циклы
      • 00087. Таблицы переходов
      • 00059. Подключение текстовых файлов, scm-функции
      • 000155. Использование SCM-функций (опкод 0AB1)
      • 000162. Используем scm-функции в качестве проверок
      • Координаты. Угол. Получение координат и угла Z
      • 000154. Вся правда о wait 0
    • Раздел 02. CLEO
      • Текст
        • 000158. Динамическая GXT-таблица или виртуальные GXT-записи
        • 00033. Работа с текстом
      • Игрок
        • 00021. Одежда СЖ
      • Транспорт
        • 00026. Создание транспорта
        • 000115. Работа с грузовиками и прицепами
        • 000172. Эктра-части автомобилей
        • 00042. Всё о поездах
        • 00080. Тюнинг транспорта, работа с компонентами тюнинга
        • 00029. Транспорт и команды, свойственны ему
        • 00046. Плавающие и лётные средства передвижения
        • 00082. Работа с частями автомобиля
      • Актёры
        • 000152. Заставляем актёра говорить. Аудио-таблицы
        • 000177. Трюк со специальными актёрами
        • 00020. Типы пешеходов, номера банд и отношение между ними
        • 00024. Модель. Создание актёра
        • 00028. Актёры и команды, свойственны им. Команды для игрока
        • 00056. Специальные актёры
        • 00060. События актёров
        • 00084. Модели поведения актёров
      • Объекты
        • 00030. Объекты и команды, свойственны им
        • 00025. Создание объекта
        • 000142. Метание объектов
      • 00027. Пикапы
      • 00031. Маркеры и сферы
      • 000122. Типы чекпоинтов, маркеров. Детальный обзор
      • 00055. Cleo. Основные понятия, отличия от main'а, простые примеры
      • 00061. Cleo-миссии
      • 00064. Работа со стартерами ( Cleo - Часть 1 )
      • 00065. Работа со стартерами ( Cleo - Часть 2 )
      • 00083. Запуск другого потока с Cleo-скрипта
      • 00079. Немного о глобальных CLEO-переменных
      • 00066. Работа со стартерами ( Дополнительные условия )
      • 000137. Группы в GTA San Andreas
      • 00098. Последовательность в анимации
      • 000120. Пути пешеходов и анимационные пути
      • 000178. RRR-файлы в GTA SA. Как их делать и использовать-
      • 000180. Длинные последовательности в анимации
      • 00022. Типы зон. Аудио-зоны
      • 00023. Работа с клавишами. Делаем сохранение
      • 00037. Анимация. Основные команды и примеры их использования
      • 00041. Работа с интерьерами
      • 00036. Катсцены и всё, что необходимо для примитивного видеоролика
      • 000174. Снова статистика игрока
      • 00040. Как создать свой чит-
      • 00090. Работа с гаражами
      • 000176. Выделение памяти
      • 00076. Статистика игрока
      • 00094. Пропуск видеороликов
      • 00072. Работа со светом. Прожектор
      • 00092. Работа с файлами ( форматированное чтение )
      • 00093. Работа с файлами ( Дозапись )
      • 00071. Визуальные эффекты в GTA San Andreas
      • 00069. Взрывы и всё, что связано с огнём.
      • 00086. Движения объектов и эффектов
      • 00068. Использование RC
      • 00067. Использование турелей
      • 00057. Работа с INI-файлами ( запись и считывание )
      • 00044. Работа с панелями ( таблицами )
      • 00043. Работа с аудио
      • 00038. Рисование на экране (Часть 1 - Текст)
      • 00039. Рисование на экране (Часть 2 - Текстуры)
    • Раздел 03. MAIN.SCM
      • 0009. Редактирование main.scm. Потоки и опкоды (Часть 1)
      • 00014. Редактирование main.scm. Потоки и опкоды (Часть 2)
      • 00013. Редактирование main.scm. Потоки и опкоды (Часть 3)
      • 00062. Работа со стартерами ( MAIN.SCM - Часть 1 )
      • 00063. Работа со стартерами ( MAIN.SCM - Часть 2 )
      • 00054. Внешние скрипты в main.scm
      • 00050. Статус-тексты
      • 00053. Таймеры
      • 00035. Делаем простую миссию
    • Раздел 04. Разное
      • 00088. Интересные опкоды (Часть 1)
      • 00089. Интересные опкоды (Часть 2)
      • Интересное в скриптинге
      • 000167. Интересное в скриптинге. Часть 2
      • 00081. Защита скриптов, снятие слабой защиты
      • 000157. Защита скриптов,снятие её + Подробнее об $NOSOURCE
      • 000121. Варианты использования main.scm
      • 000179. Избавляемся от "ёлочек"
      • 000171. Контроль за перемещениями мыши
      • 000182. Колода карт в GTA San Andreas
      • Работа с магазинами
      • 00091. Создания собственных классов и кейвордов
      • 00085. Работа с битами переменных
      • 00051. Работа с HEX. HEX-буфер
      • 00097. Написания DLL библиотек и использование их с скриптах
    • Раздел 05. Игровая память
      • 00058. Работа с игровой памятью (Часть 1- статические адреса)
      • 00074. Динамические адреса памяти. ( Часть 1 - структура актёра )
      • 00075. Динамические адреса памяти. ( Часть 2 - структура автомобиля )
      • 00077. Динамические адреса памяти. ( Часть 3 - структура объекта )
      • 00096. Игровая память. Динамические адреса (структура weapon.dat)
    • Раздел 06. Алгоритмы и примеры
      • 000153. Пример полноценной миссии "Ограбление"
      • 00095. Как сделать нервометр-
      • 00052. Пример полноценной миссии "Взрывчатка"
      • 000114. Делаем спидометр!
      • 000161. Очень длинные миссии в main.scm
      • 000112. Делаем графическое меню
      • 000113. Делаем гоночную миссию ( SARMC v0.9 )
      • 000133. Делаем диалоги в миссиях
      • 00032. Делаем простой скрипт (приходим к точке и убиваем нужную цель)
    • Раздел 07. Plugin SDK (SA)
      • Простейший плагин
      • Работа с массивами объектов
      • Рисуем
      • Короны
      • Класс шрифта (CFont)
    • Раздел 08. Руководство по программам
      • Руководство по использованию программы GTA-SA Crazy IMG Editor
      • Руководство по использованию программы Ped Editor
      • Руководство по использованию программы Rus2gxtCoder
      • Руководство по использованию программы FXT Editor
      • Руководство по использованию программы GTA Animation Manager
      • Руководство по использованию программы TXD Workshop
      • Руководство по использованию программы GTA GXT Editor
      • Руководство по использованию Map Editor
      • Руководство по использованию программы MapCleaner
  • GTA 4 (PC)
    • Раздел 01. ScriptHookDotNet
      • Всё, что необходимо перед началом скриптинга GTA 4
      • Создание проекта и его открытие
      • Наш первый скрипт. Необходимые условия его написания
      • 000102. Метки и прыжки
      • 00034. Что такое Blip- Основные комадны
      • 000107. Обзор класса GAME
      • 000108. Обзор класса PLAYER(Часть 1)
      • 000109. Обзор класса PLAYER(Часть 2)
      • 000110. Обзор класса PLAYER(Часть 3)
      • 000111. Vector - Что это такое и с чем его едят
      • 000116. Обзор класса World
      • 000117. Обзор класса Model
      • 000118. Обзор класса Vehicles
      • 000119. Обзор класса Ped
      • 000126. Pickup в GTA 4
      • 000127. Обзор класса Group
      • 000141. Списки в c#. Запуск нескольких скритов в GTA 4
  • Программирование
    • C#
      • 000103. Типы данных в C#. Базовые операции над ними.
      • 000104. Блочные конструкции. Условия
      • 000105. Блочные конструкции. Циклы
      • 000106. Массивы и структуры
      • 000123. Блочные конструкции. Перечисления
      • 000124. Блочные конструкции. Оператор управдения swith
      • 000125. Блочные конструкции. Цикл foreach
      • 000128. Как делать функции c#- Часть 1
      • 000129. Как делать функции c#- Часть 2
      • 000130. Альтернативные условия
      • 000131. Как делать функции c#- Часть 3
      • 000132. ООП в c# Часть 1
      • 000135. ООП в c# Часть 2 - Полиморфизм
      • 000136. Как делать функции c#- Часть 4
      • 000138. Детальнее о static
      • 000139. Блочные конструкции. Исключения
      • 000140. Делегаты и события в c#
      • 000143. Знакомство с формами
      • 000144. Панель элементов
      • 000149. Кнопки, Текст-боксы и метки
      • 000151. Запуск другой формы из основной, ListBox, MenuStrip
      • 000160. Сериализация и десериализация XML в c#
      • 000163. Консоль. Основные команды
      • 000165. Цикл foreach для своих классов
      • 000168. Перегрузка операторов в c#
      • 000169. Анонимные и динамические типы в c#
      • 000170. Анонимные функции и лямбда-выражения в c#
      • 000173. C# введение в Linq
      • 00048. Детальнее о ref, out и checked
      • 000150. Подключаем dll-библиотеку, работа с файлами
    • C++
      • Выбор среды компилирования, типы данных, первая программа
      • Математика, адреса данных
  • Полезные ссылки
    • Уроки от Vital (видео)
    • База опкодов (SBL)
    • Сайт Sanny Builder
    • Сайт CLEO
  • На удаление
    • Раздел 99. Старые уроки
      • 00010. Управление Sanny Builder и её особенности
      • 0000. Всё, что необходимо перед началом скриптинга
      • 000156. Вступление в скриптинг GTA 3
Powered by GitBook
On this page

Was this helpful?

  1. GTA SA, VC, III (PC, Classic)
  2. Раздел 04. Разное

Работа с магазинами

В этом уроке мы будем учится работать с файлом "shopping.dat" и рассмотрим основные опкоды для работы с ним.

Привет, друзья! Наконец-то нашел время написать новый урок. На очереди у нас обзор опкодов для работы с файлом "shopping.dat". Прежде чем приступить к написанию скриптов по этой теме, сначала разберёмся с форматом данного файла, так как опкоды во многом зависят от данных, которые находятся внутри.

Внутри файла есть две основные секции (в начале идёт название "section"): prices и shops. В первой секции идёт описание товаров (предметов), а во второй — описание магазинов, в которых и будут эти товары.

Секция "prices"

Секция "prices" дополнительно разделена на типы, используя тоже ключевое слово "section". Эти типы группируют товары по определённому признаку. По умолчанию используются 6 типов: "CarMods", "Clothes", "Haircuts", "Tattoos", "Food" и "Weapons". Есть ещё 3 пустые секции, которые не используются в игре ("Furniture", "Gifts" и "Property").

Формат каждого типа отличается по своей структуре. Давайте разбираться с тем, что есть. Каждый тип гарантировано имеет 7 параметров:

Параметр
Количество
Описание

name

1

Идентификатор предмета

nametag

1

GXT-имя предмета

stats to change

4

На какие характеристики игрока будет влиять покупка (используется не всегда)

price

1

Цена товара

Идентификатор предмета — это уникальное имя. Его мы запомним, так как чуть ниже он будет упомянут. Отдельное внимание нужно обратить на характеристики. Они описаны четырьмя параметрами, но влиять можно только на два стата.

Характеристики описаны в следующей последовательности:

ИМЯ_СТАТА_1 ЗНАЧЕНИЕ_СТАТА_1 ИМЯ_СТАТА_2 ЗНАЧЕНИЕ_СТАТА_2

Вот таблица статов, которые можно использовать:

Характеристика
Описание

fat

Влияет на вес Карла

health

Влияет на здоровье Карла

calories

Влияет на вес и здоровье Карла

stamina

Влияет на выносливость Карла

respect

Влияет на уважение Карла

sexy

Влияет на привлекательность Карла

Значение стата указывается числом. Если покупка не влияет на характеристику, то используется 0. Если влияет, то положительное число будет увеличивать характеристику, а отрицательное — уменьшать (значения от -128 до 127). Если стат вообще не нужно использовать, то достаточно поставить символ - (вместо имени и значения). Пример:

ИМЯ_СТАТА_1 ЗНАЧЕНИЕ_СТАТА_1 - -
respect 0 sexy 0
respect 0 - -

× Примечание: Многие секции содержат статы для изменения, но в реальности только некторые из них действительно их изменяют. Остальные чисто декоративные и никак не реагируют при покупке.

Это основные параметры. Некоторые секции имеют в своём формате дополнительные параметры (extra; встречаются в секицях "тату", "причёски" и "одежда"). Они представлены в виде целых чисел или строк (в скрипте строки конвертируются в число алгоритмом CRC).

Секция "shops"

С товарами разобрались. Перейдём к магазинам. Структура этой секции проще. Она содержит в себе другие секции, которые описывают магазины. Общая структура такова:

section NAME
 type TYPE
 item ID
end

Имя секции (NAME) — уникальный идентификатор. Это имя используется в одном из опкодов, поэтому запомним его. Далее "type" — это слово указывает, какие товары будут использованы из секции "prices". Имя типа совпадает с именем секции, которые я описывал ранее. Далее идут предметы (по одному на строку). После слова "item" пишется уникальный идентификатор предмета.

Практика

С теорией мы кое-как разобрались. Давайте теперь посмотрим на опкоды, которые используются для работы с файлом "shopping.dat". Сначала идёт загрузка цен и магазинов:

075E: load_shopping_data_PRICES_subsection "ammun1" 
075D: load_shopping_data_SHOPS_subsection "Weapons"

Обратите внимание, что названия опкодов неправильные (на момент написания статьи)! Опкод 075E загружает информацию о магазинах, а 075D — о ценах. Я не увидел разницы в порядке их загрузки. Рекомендую использовать именно представленный мной порядок, именно так их использовали разработчики.

Здесь: "ammun1" - имя (идентификатор) магазина "Weapons" - тип (группа) цен

Как только работа с магазинами завершена, нам нужно выгрузить из памяти эту информацию, используя опкод:

087C: release_shopping_data

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

07B0: get_active_shop_name_to s$CURRENT_SHOP_ID

Изначально я думал, что этот опкод получает имя интерьера, но оказалось совсем другое :)

Здесь: s$CURRENT_SHOP_ID - переменная, в которую будет записан ID (имя) загруженного магазина. Возвращает пустую строку, если ничего не загружено.

Давайте посмотрим, что можно сделать после загрузки! Первым на очереди станет опкод:

075F: store_shopping_data_entries_number_to $MAX_ITEMS_COUNT

Он получает количество товаров, которые есть в магазине. В нашем случае туда будет записано число 16 (это по умолчанию). Запомним переменную $MAX_ITEMS_COUNT и идём дальше:

0760: store_shopping_data_index 0 textureCRC_to $ITEM

Этот опкод позволяет сохранить идентификатор предмета за указанным индексом. Не обращайте внимания на описание; "textureCRC_to" не соответствует действительности (надеюсь, что это скоро исправят).

Здесь: 0 - индекс $ITEM - сохраняется идентификатор предмета

Индекс — это номер в списке товаров в текущем магазине. Диапазон варьируется в зависимости от количества товаров. Максимальный индекс мы можем получить, отняв единицу от количества товаров (опкод 075F). Таким образом мы можем перебрать весь список товаров, используя этот код:

0A8F: $MAX_INDEX = $MAX_ITEMS_COUNT - 1 // int
for $CURRENT_INDEX = 0 TO $MAX_INDEX 
 0760: store_shopping_data_index $CURRENT_INDEX textureCRC_to $ITEM 
 // ...
end

× Примечание: в этом уроке я использую цикл для рисования меню, но это делать не обязательно.

Дальше идут опкоды, которые позволяют извлечь информацию о предмете:

0761: get_shopping_item_with_textureCRC $ITEM price_to $PPRICE
078C: get_shopping_item_with_textureCRC $ITEM nametag_to s$GXT

Опкод 0761 получает цену предмета, а 075F — GXT-ключ с названием товара. Давайте напишем небольшой скрипт, который будет выводить информацию о товаре:

// ...
075E: load_shopping_data_PRICES_subsection "ammun1" 
075D: load_shopping_data_SHOPS_subsection "Weapons"
075F: store_shopping_data_entries_number_to $MAX_ITEMS_COUNT
0A8F: $MAX_INDEX = $MAX_ITEMS_COUNT - 1 // int
03F0: enable_text_draw 1
while true
wait 0
if
00E1: player 0 pressed_key 15 // k~~VEHICLE_ENTER_EXIT
then
jump @end
end
0@ = 20.0
for $CURRENT_INDEX = 0 TO $MAX_INDEX
0760: store_shopping_data_index $CURRENT_INDEX textureCRC_to $ITEM
0761: get_shopping_item_with_textureCRC $ITEM price_to $PPRICE
078C: get_shopping_item_with_textureCRC $ITEM nametag_to s$GXT
038E: draw_box_position 320.0 224.0 size 640.0 448.0 RGBA 0 0 0 16
0343: set_text_draw_linewidth 640.0
033E: set_draw_text_position 20.0 0@ GXT s$GXT
0343: set_text_draw_linewidth 640.0
045A: draw_text_1number 320.0 0@ GXT 'DOLLAR' number $PPRICE
0@ += 16.0
end
end
:end
087C: release_shopping_data
// ...

Результат:

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

08C8: set_shopping_item_with_textureCRC $ITEM price_to 16000
08C9: reset_shopping_item $ITEM price

Опкод 08C8 устанавливает новую цену на выбранный товар, независимо от настроек в файле. Его можно использовать вне цикла; как только новая цена задана, она используется постоянно. Опкод 08C9, должно быть, сбрасывает цену по умолчанию, однако у меня никакой реакции не происходило (он встречается только в скрипте гардероба). Следует отметить, что новая цена не сохраняется навсегда. Как только мы используем опкод "087C", товары вновь будут иметь старые цены.

Далее рассмотрим опкод, который получает данные об экстра параметре:

0783: get_shopping_item_with_textureCRC $ITEM flag 0 store_to $EXTRA1

Мы можем получить данные об экстра параметре в любой секции, даже если она не содержит экстр. Если параметра нет, то в переменную $EXTRA1 будет записано число 0.

Здесь: 0 - номер экстра параметра $EXTRA1 - переменная, в которую будет записано значение этого параметра

Максимальное количество экстр: 2 (значения 0 и 1 соответственно). Для типа "Weapons" нет таких параметров но, к моему удивлению, опкод достал данные об экстрах (при 0). Изначально я подумал, что это количество патронов, так как оно присутствует в секции, но результат был совсем другим: были числа, но они не соответствовали моим догадкам (ниже будет пример)!

Следующий опкод осуществляет покупку предмета:

0790: charge_money_for_shopping_item_with_textureCRC $ITEM

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

× ВАЖНО: Необходимо убедиться, что модель купленого оружия загружена! Если этого не сделать, то при выстреле будет происходить вылет! Лучше загрузить все модели до загрузки магазинов и цен.

И последний опкод, который входит в "основную обойму":

0942: item_with_textureCRC $ITEM is_clothing

Эта проверка возвращает "true" в том случае, если предмет был когда-либо куплен опкодом 0790. Информация о покупке хранится всегда; в сейв-файле (или main.scm, точно не скажу).

Давайте рассмотрим пример с выбором предмета и его покупкой:

// ...
// загружаем модели оружия
075E: load_shopping_data_PRICES_subsection "ammun1"
075D: load_shopping_data_SHOPS_subsection "Weapons"
075F: store_shopping_data_entries_number_to $MAX_ITEMS_COUNT
0A8F: $MAX_INDEX = $MAX_ITEMS_COUNT - 1 // int
03F0: enable_text_draw 1
32@ = 0
while true
wait 0
if
00E1: player 0 pressed_key 15 // k~~VEHICLE_ENTER_EXIT
then
jump @end
end
if and
32@ > 150
0AB0: key_pressed 38 // up
then
5@ -= 1
32@ = 0
if
8029: not 5@ >= 0
then
008B: 5@ = $MAX_INDEX // (int)
end
end
if and
32@ > 150
0AB0: key_pressed 40 // down
then
5@ += 1
32@ = 0
if
001F: 5@ > $MAX_INDEX // (int)
then
5@ = 0
end
end
0@ = 20.0
for $CURRENT_INDEX = 0 TO $MAX_INDEX
0760: store_shopping_data_index $CURRENT_INDEX textureCRC_to $ITEM
0761: get_shopping_item_with_textureCRC $ITEM price_to $PPRICE
078C: get_shopping_item_with_textureCRC $ITEM nametag_to s$GXT
0783: get_shopping_item_with_textureCRC $ITEM flag 0 store_to $EXTRA1
0783: get_shopping_item_with_textureCRC $ITEM flag 1 store_to $EXTRA2
038E: draw_box_position 320.0 224.0 size 640.0 448.0 RGBA 0 0 0 16
if
0942: item_with_textureCRC $ITEM is_clothing
then
0343: set_text_draw_linewidth 640.0
045A: draw_text_1number 5.0 0@ GXT 'DOLLAR' number 1
end
if
07D6: 5@ == $CURRENT_INDEX // @ == $ (int)
then
0340: set_text_draw_RGBA 0 255 0 255
if
00E1: player 0 pressed_key 16 // k~~PED_SPRINT
then
0790: charge_money_for_shopping_item_with_textureCRC $ITEM
08C9: reset_shopping_item $ITEM price
end
end
0343: set_text_draw_linewidth 640.0
033E: set_draw_text_position 20.0 0@ GXT s$GXT
0343: set_text_draw_linewidth 640.0
045A: draw_text_1number 320.0 0@ GXT 'DOLLAR' number $PPRICE
0343: set_text_draw_linewidth 640.0
045A: draw_text_1number 460.0 0@ GXT 'DOLLAR' number $EXTRA1
0343: set_text_draw_linewidth 640.0
045A: draw_text_1number 500.0 0@ GXT 'DOLLAR' number $EXTRA2
0@ += 16.0
end
end
:end
087C: release_shopping_data
// выгружаем модели оружия
// ...

Результат:

Похожим способом делается покупка для остальных магазинов. Это вся базовая информация, которая у меня есть.

Previous000182. Колода карт в GTA San AndreasNext00091. Создания собственных классов и кейвордов

Last updated 3 years ago

Was this helpful?

title
title