PDA

Просмотр полной версии : [Include] zvehcomp - дополнительные функции для компонентов транспорта



ziggi
18.01.2016, 22:16
zvehcomp
GitHub (https://github.com/Open-GTO/zvehcomp)

Описание

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

Пример использования

Получить список всех доступных компонентов для модели транспорта с ID 400:

new
compatible_types[ZVEH_MAX_COMPONENT_TYPES],
compatible_types_count;

GetVehicleCompatibleTypes(400, compatible_types, compatible_types_count);

for (new i = 0; i < compatible_types_count; i++) {
printf("%d", compatible_types[i]);
}


Функции

GetVehicleComponentTypeId(name[]);
GetVehicleComponentTypeName(type, name[], size = sizeof(name));
GetVehicleCompatibleTypes(model, array[ZVEH_MAX_COMPONENT_TYPES], &array_size);
GetVehicleComponentName(componentid, cname[], size = sizeof(cname));
GetVehicleCompatibleUpgrades(model, array[ZVEH_MAX_COMPONENTS], &array_size);
IsVehicleUpgradeCompatible(model, componentid);

GetVehicleComponentTypeId(name[])

Получает ID типа (https://github.com/Open-GTO/zvehcomp/wiki/Типы-компонентов) компонента по его названию.

Параметры:

name[] - массив с именем типа компонента, который нужно найти

Возвращает:

ID типа компонента
INVALID_COMPONENT_ID в случае, если тип не найден


GetVehicleComponentTypeName(type, name[], size = sizeof(name))

Получает название типа компонента по его ID.

Параметры:

type - ID типа компонента
name[] - массив для записи имени типа компонента
size - размер name

Возвращает:

Количество символов у названия типа в случае, если тип найден
0 в случае, если тип не найден


GetVehicleCompatibleTypes(model, array[ZVEH_MAX_COMPONENT_TYPES], &array_size)

Получает список совместимых типов компонентов по модели транспорта.

Параметры:

model - ID модели транспорта
array[ZVEH_MAX_COMPONENT_TYPES] - массив для записи совместимых типов компонентов
array_size - количество элементов, записанных в массив

Возвращает:

1 в случае, если совместимые типы найдены и записаны в массив
0 в случае, если совместимых типов не найдено


GetVehicleComponentName(componentid, cname[], size = sizeof(cname))

Получает название компонента (https://github.com/Open-GTO/zvehcomp/wiki/Компоненты) по его ID.

Параметры:

componentid - ID компонента
cname[] - массив для записи имени компонента
size - размер cname

Возвращает:

Количество символов у названия компонента в случае, если компонент найден
0 в случае, если тип не найден


GetVehicleCompatibleUpgrades(model, array[ZVEH_MAX_COMPONENTS], &array_size)

Получает список совместимых компонентов (https://github.com/Open-GTO/zvehcomp/wiki/Совместимые-компоненты) по модели транспорта.

Параметры:

model - ID модели транспорта
array[ZVEH_MAX_COMPONENTS] - массив для записи совместимых компонентов
array_size - количество элементов, записанных в массив

Возвращает:

1 в случае, если совместимые типы записаны в массив
0 в случае ошибки


IsVehicleUpgradeCompatible(model, componentid)

Проверяет совместимость компонента и модели транспорта.

Параметры:

model - ID модели транспорта
componentid - ID компонента

Возвращает:

1 в случае, если данный компонент можно установить на указанную модель транспорта
0 в случае, если данный компонент нельзя установить на указанную модель транспорта


Константы

ZVEH_INVALID_COMPONENT_ID (255)
ZVEH_MAX_COMPONENTS (48)
ZVEH_MAX_COMPONENT_NAME (64)
ZVEH_MAX_COMPONENT_TYPES (14)
ZVEH_MAX_COMPONENT_TYPE_NAME (16)

ZVEH_INVALID_COMPONENT_ID

Недействительный ID компонента (равен 255).

ZVEH_MAX_COMPONENTS

Максимальное число компонентов у одной модели транспорта (равен 48).

ZVEH_MAX_COMPONENT_NAME

Максимальная длина имени компонента (равна 64).

ZVEH_MAX_COMPONENT_TYPES

Максимальное число типов компонентов (равен 14).

ZVEH_MAX_COMPONENT_TYPE_NAME

Максимальная длина имени типа компонента (равна 16).

Полезные ссылки


Документация (https://github.com/Open-GTO/zvehcomp/wiki/Документация)
Типы компонентов (https://github.com/Open-GTO/zvehcomp/wiki/Типы-компонентов)
Компоненты (https://github.com/Open-GTO/zvehcomp/wiki/Компоненты)
Совместимые компоненты (https://github.com/Open-GTO/zvehcomp/wiki/Совместимые-компоненты)


Благодарности


JernejL и Y_Less, за массив компонентов (https://github.com/ziggi/sa-mp-fixes/blob/master/fixes.inc#L2254) и метод работы с ним (https://github.com/ziggi/sa-mp-fixes/blob/master/fixes.inc#L4475)
AirKit, за названия компонентов (https://github.com/Open-GTO/zvehcomp/wiki/Компоненты)


Скачать


Последняя версия архивом: https://github.com/Open-GTO/zvehcomp/releases
Посмотреть не скачивая: https://github.com/Open-GTO/zvehcomp/blob/master/zvehcomp.inc

Daniel_Cortez
18.01.2016, 23:18
Используется заранее сгенерированный массив данных, что положительно сказывается на производительности.
Каким образом этот массив генерировался, если не секрет?




GetComponentTypeId(name[])

Получает ID типа (http://wiki.sa-mp.com/wiki/Componentslots) компонента по его имени.

Параметры:

name[] - массив с именем типа компонента, который нужно найти


Можно примеры таких имён? Чтобы не копировать сюда строки из инклуда, можно было бы сделать здесь ссылку прямиком на массив допустимых имён (https://github.com/Open-GTO/zvehcomp/blob/master/zvehcomp.inc#L30).
С именами в других функциях то же самое.




#pragma library z_vehicle_component
Что это делает в инклуде?


По поводу названий макросов (INVALID_COMPONENT_ID, MAX_COMPONENTS, etc.), компоненты могут быть не только у машины, но и ещё у чего-нибудь в каких-то системах в моде.
Отсюда вероятность, что такие названия в моде уже могут использоваться. Чтобы перестраховаться от этого, можно добавить к названиям макросов префикс, уникальный для твоего инклуда - "ZVEH_", например.
Т.е. получится ZVEH_MAX_COMPONENTS, ZVEH_MAX_COMPONENT_NAME, ZVEH_INVALID_COMPONENT_ID, etc.


kthx

ziggi
18.01.2016, 23:39
Каким образом этот массив генерировался, если не секрет?

Взял алгоритм (https://github.com/ziggi/sa-mp-fixes/blob/master/fixes.inc#L4475) и массив (https://github.com/ziggi/sa-mp-fixes/blob/master/fixes.inc#L2254) из fixes.inc:


for (new componentid = 1000; componentid <= 1191; componentid++) {
if (gVehicleMods[(modelid - 400) * 6 + (componentid - 1000 >>> 5)] & 1 << (componentid - 1000 & 0b00011111)) {
// этот компонент совместим, добавить
}
}




Можно примеры таких имён? Чтобы не копировать сюда строки из инклуда, можно было бы сделать здесь ссылку прямиком на массив допустимых имён (https://github.com/Open-GTO/zvehcomp/blob/master/zvehcomp.inc#L30).
С именами в других функциях то же самое.

Да, так будет удобнее, добавил.


Что это делает в инклуде?

Всегда писал, даже не задумывался о необходимости, уберу.


По поводу названий макросов (INVALID_COMPONENT_ID, MAX_COMPONENTS, etc.), компоненты могут быть не только у машины, но и ещё у чего-нибудь в каких-то системах в моде.
Отсюда вероятность, что такие названия в моде уже могут использоваться. Чтобы перестраховаться от этого, можно добавить к названиям макросов префикс, уникальный для твоего инклуда - "ZVEH_", например.
Т.е. получится ZVEH_MAX_COMPONENTS, ZVEH_MAX_COMPONENT_NAME, ZVEH_INVALID_COMPONENT_ID, etc.

Согласен, исправлю.

Daniel_Cortez
19.01.2016, 08:05
Взял алгоритм (https://github.com/ziggi/sa-mp-fixes/blob/master/fixes.inc#L4475) и массив (https://github.com/ziggi/sa-mp-fixes/blob/master/fixes.inc#L2254) из fixes.inc:


for (new componentid = 1000; componentid <= 1191; componentid++) {
if (gVehicleMods[(modelid - 400) * 6 + (componentid - 1000 >>> 5)] & 1 << (componentid - 1000 & 0b00011111)) {
// этот компонент совместим, добавить
}
}

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



Да, так будет удобнее, добавил.

Всегда писал, даже не задумывался о необходимости, уберу.

Согласен, исправлю.
Если честно, я ожидал, что на этом опять начнётся какой-то спор.
Радует, что есть люди, которые могут прислушиваться к чужим советам, если в них есть логика, а не слепо отвергать всё подряд, апеллируя тем, что каждый имеет право кодить, как ему вздумается (ИМХО, это уже само по себе признание своей некомпетентности, как скриптера, ведь единственный аргумент таких людей в том, что они могут постить любой говнокод только потому, что это не запрещено законом).

ziggi
19.01.2016, 11:38
В таком случае следовало бы указать ссылку на fixes.inc в комментариях к коду (и, желательно, автора того фикса, который составил таблицу компонентов и алгоритм поиска), не то это будет равноценно плагиату.

Добавил. И в тему тоже.


Если честно, я ожидал, что на этом опять начнётся какой-то спор.
Радует, что есть люди, которые могут прислушиваться к чужим советам, если в них есть логика, а не слепо отвергать всё подряд, апеллируя тем, что каждый имеет право кодить, как ему вздумается (ИМХО, это уже само по себе признание своей некомпетентности, как скриптера, т.к. единственный аргумент таких людей в том, что они могут постить любой говнокод только потому, что это не запрещено законом).

Все мы учимся, нет ничего зазорного в признании своей ошибки.

UPD: Оформил информацию о компонентах и их типах в удобные таблицы на GitHub Wiki (https://github.com/Open-GTO/zvehcomp/wiki).

SliM
20.01.2016, 06:25
Это большой труд, спасибо, мне это нужно! Никогда бы не переборол свою лень и не написал такое, мне лень это сделать даже на всем готовом. Вы избавили меня от этой работы.

Fantom
20.01.2016, 10:33
https://pp.vk.me/c616028/v616028930/11da1/WPCFh5LPu1k.jpg

Daniel_Cortez
20.01.2016, 19:45
Забыл сказать вчера, функции, по хорошему, тоже следовало бы переименовать - по той же причине, что и макросы.
Инклуд специализируется на компонентах транспорта и уже есть функции GetVehicleCompatibleUpgrades и IsVehicleUpgradeCompatible, поэтому логично было бы оставить их названия, как есть, и добавить в названия других функций "Vehicle", т.е. GetComponentTypeId -> GetVehicleComponentTypeId, etc. Этого вполне должно хватить, чтобы уточнить названия, сделать их не такими общими и расплывчатыми.

Ещё одно предложение: убрать отдельный файл с лицензией, перенеся текст в инклуд в виде многострочного комментария. Не придётся искать лицензию, если кто-то забудет скопировать файл LICENSE вместе с инклудом.

ziggi
20.01.2016, 22:04
Забыл сказать вчера, функции, по хорошему, тоже следовало бы переименовать - по той же причине, что и макросы.
Инклуд специализируется на компонентах транспорта и уже есть функции GetVehicleCompatibleUpgrades и IsVehicleUpgradeCompatible, поэтому логично было бы оставить их названия, как есть, и добавить в названия других функций "Vehicle", т.е. GetComponentTypeId -> GetVehicleComponentTypeId, etc. Этого вполне должно хватить, чтобы уточнить названия, сделать их не такими общими и расплывчатыми.

Даже не знаю, почему сразу так не назвал. Исправил.


Ещё одно предложение: убрать отдельный файл с лицензией, перенеся текст в инклуд в виде многострочного комментария. Не придётся искать лицензию, если кто-то забудет скопировать файл LICENSE вместе с инклудом.

Добавил информацию о лицензии в .inc файл, но файл LICENSE всё же лучше оставить (рекомендации GitHub).

ziggi
15.12.2017, 19:34
Обновлено, добавлены универсальные компоненты. Спасибо Альберту Миронову.

Kovshevoy
18.11.2018, 23:17
const корректность бы подправить

ziggi
19.11.2018, 00:31
const корректность бы подправить

Поправил, спасибо.

DeimoS
29.07.2019, 08:35
Две простенькие функции, позволяющие получить "партнёра" для боковой юбки.
То бишь, передаёте в GetVehicleSideskirtRight ID левой боковой юбки и функция выдаст ID правой боковой юбки того же класса.
GetVehicleSideskirtLeft делает то же самое, только возвращает левую боковую юбку при указании правой.

stock GetVehicleSideskirtRight(componentid)
{
switch(componentid)
{
case 1017:// Left Sideskirt
return 1007;// Right Sideskirt

case 1027:// Left Alien Sideskirt "Sultan"
return 1026;// Right Alien Sideskirt "Sultan"

case 1030:// Left X-Flow Sideskirt "Sultan"
return 1031;// Right X-Flow Sideskirt "Sultan"

case 1040:// Left Alien Sideskirt "Elegy"
return 1036;// Right Alien Sideskirt "Elegy"

case 1039:// Left X-Flow Sideskirt "Elegy"
return 1041;// Right X-Flow Sideskirt "Elegy"

case 1099:// Left Chrome Sideskirt "Broadway"
return 1042;// Right Chrome Sideskirt "Broadway"

case 1051:// Left Alien Sideskirt "Flash"
return 1047;// Right Alien Sideskirt "Flash"

case 1052:// Left X-Flow Sideskirt "Flash"
return 1048;// Right X-Flow Sideskirt "Flash"

case 1062:// Left Alien Sideskirt "Stratum"
return 1056;// Right Alien Sideskirt "Stratum"

case 1063:// Left X-Flow Sideskirt "Stratum"
return 1057;// Right X-Flow Sideskirt "Stratum"

case 1071:// Left Alien Sideskirt "Jester"
return 1069;// Right Alien Sideskirt "Jester"

case 1072:// Left X-Flow Sideskirt "Jester"
return 1070;// Right X-Flow Sideskirt "Jester"

case 1094:// Left Alien Sideskirt "Uranus"
return 1090;// Right Alien Sideskirt "Uranus"

case 1093:// Left X-Flow Sideskirt "Uranus"
return 1095;// Right X-Flow Sideskirt "Uranus"

case 1101:// Left "Chrome Flames" Sideskirt "Remington"
return 1122;// Right "Chrome Flames" Sideskirt "Remington"

case 1102:// Left "Chrome Strip" Sideskirt "Savanna"
return 1133;// Right "Chrome Strip" Sideskirt "Savanna"

case 1124:// Left "Chrome Arches" Sideskirt "Remington"
return 1106;// Right "Chrome Arches" Sideskirt "Remington"

case 1107:// Left "Chrome Strip" Sideskirt "Blade"
return 1108;// Right "Chrome Strip" Sideskirt "Blade"

case 1120:// Left "Chrome Trim" Sideskirt "Slamvan"
return 1118;// Right "Chrome Trim" Sideskirt "Slamvan"

case 1121:// Left "Wheelcovers" Sideskirt "Slamvan"
return 1119;// Right "Wheelcovers" Sideskirt "Slamvan"

case 1137:// Left "Chrome Strip" Sideskirt "Tornado"
return 1134;// Right "Chrome Strip" Sideskirt "Tornado"
}
return 0;
}

stock GetVehicleSideskirtLeft(componentid)
{
switch(componentid)
{
case 1007:// Right Sideskirt
return 1017;// Left Sideskirt

case 1026:// Right Alien Sideskirt "Sultan"
return 1027;// Left Alien Sideskirt "Sultan"

case 1031:// Right X-Flow Sideskirt "Sultan"
return 1030;// Left X-Flow Sideskirt "Sultan"

case 1036:// Right Alien Sideskirt "Elegy"
return 1040;// Left Alien Sideskirt "Elegy"

case 1041:// Right X-Flow Sideskirt "Elegy"
return 1039;// Left X-Flow Sideskirt "Elegy"

case 1042:// Right Chrome Sideskirt "Broadway"
return 1099;// Left Chrome Sideskirt "Broadway"

case 1047:// Right Alien Sideskirt "Flash"
return 1051;// Left Alien Sideskirt "Flash"

case 1048:// Right X-Flow Sideskirt "Flash"
return 1052;// Left X-Flow Sideskirt "Flash"

case 1056:// Right Alien Sideskirt "Stratum"
return 1062;// Left Alien Sideskirt "Stratum"

case 1057:// Right X-Flow Sideskirt "Stratum"
return 1063;// Left X-Flow Sideskirt "Stratum"

case 1069:// Right Alien Sideskirt "Jester"
return 1071;// Left Alien Sideskirt "Jester"

case 1070:// Right X-Flow Sideskirt "Jester"
return 1072;// Left X-Flow Sideskirt "Jester"

case 1090:// Right Alien Sideskirt "Uranus"
return 1094;// Left Alien Sideskirt "Uranus"

case 1095:// Right X-Flow Sideskirt "Uranus"
return 1093;// Left X-Flow Sideskirt "Uranus"

case 1122:// Right "Chrome Flames" Sideskirt "Remington"
return 1101;// Left "Chrome Flames" Sideskirt "Remington"

case 1133:// Right "Chrome Strip" Sideskirt "Savanna"
return 1102;// Left "Chrome Strip" Sideskirt "Savanna"

case 1106:// Right "Chrome Arches" Sideskirt "Remington"
return 1124;// Left "Chrome Arches" Sideskirt "Remington"

case 1108:// Right "Chrome Strip" Sideskirt "Blade"
return 1107;// Left "Chrome Strip" Sideskirt "Blade"

case 1118:// Right "Chrome Trim" Sideskirt "Slamvan"
return 1120;// Left "Chrome Trim" Sideskirt "Slamvan"

case 1119:// Right "Wheelcovers" Sideskirt "Slamvan"
return 1121;// Left "Wheelcovers" Sideskirt "Slamvan"

case 1134:// Right "Chrome Strip" Sideskirt "Tornado"
return 1137;// Left "Chrome Strip" Sideskirt "Tornado"
}
return 0;
}
Может пригодится, если вы хотите сделать аналог тюнинга из сингла, когда нельзя поставить разные боковые юбки.