Просмотр сообщений

В этом разделе можно просмотреть все сообщения, сделанные этим пользователем.


Сообщения - kenking

Страницы: [1] 2 3 ... 14
1
Общие вопросы / Re: Экстры транспорта
« : Июль 12, 2019, 03:15:47 pm »
Цитировать
Но обратный вариант слотов 1f103432 проблем не выявил, рекомендую его. Возможно перестановкой я намного снизил вероятность появления пустышки, хорошо если бы исключил, но пока она мне не попалась.
Прописывать постоянные экстры в первый слот, а необязательные дополнительные во второй или наоборот - это без разницы. Если попадается пустышка в слоте с обязательным нахождением одной из первых двух экстр, то пропиши вместо f первую экстру на эту позицию 11103432.

Цитировать
В дополнение скажу, что есть еще такой момент. Например нужно создать исключительную машину без экстры или с 6 экстрой, это можно сделать принудительно скриптом/кодом даже при 4fff, но кажется сбивается правило 4fff и в трафике начинают ездить пустышки, с этим надо быть осторожнее.
Надо перед установкой экстры на создаваемую машину, считать значение переменной (два значения) CVehicleModelInfo::ms_compsToUse[2]. Установить свой вариант экстры на модель, создать машину и записать в эту переменную значение, которое там было. Думаю это решит вопрос.

2
Общие вопросы / Re: Экстры транспорта
« : Июль 12, 2019, 10:03:58 am »
Проверил сейчас на модели caddy. У неё 3 экстры слева, 3 справа. Очень удобно для тестов. Для "чистоты" тестов написал код, выводящий на экран номера экстр в слотах на транспорте возле игрока и спаунил эту модель.
Действительно, при настройке 1f10 не получается всегда нужного сочетания. Думаю, что дело в том, что во второй слот при такой настройке выбирается экстра выборочно из всех имеющихся вариантов (включая отсутствие второй экстры), поскольку не задан конкретный режим для второго слота.
Значит надо задать для второго слота своё правило.
Исходя из этого:
1) 35431f10 экстра 3 здесь получается исключается, можно её прописать во второй слот вместо любой из 4-6 или в первый, тогда получается настройка как для второго варианта
2) 35431210 прям идеальная настройка для этого варианта
3) здесь - да вариант 4fff для 5 экстр, либо изменять функцию, если 6 экстра какие-либо мелкие детальки или, например, груз в кузов, то можно эту экстру закинуть во второй слот с типом рандомного появления
3ff54fff - правда такой вариант я не тестировал

3
Общие вопросы / Re: Экстры транспорта
« : Июль 11, 2019, 12:53:29 pm »
Цитировать
По моим тестам получается, что экстру 1 в трафике не увидеть.
Надо поменять расклад экстр в наборе 30123345 на такой 31203345, экстра 1 должна появиться.

Цитировать
Выложу сюда результаты своих многочисленных тестов для вайса
В остальном всё соответствует и моим тестам.

Цитировать
Тип 4 (Comprules 4fff) - 1, 2, 3, 4, 5. Никогда не проявляется экстра 6.
В самой функции такое ограничение для этого типа.

4
Код: C++
  1. #include "plugin.h"
  2. #include "CMessages.h"
  3. #include "CWorld.h"
  4. #include "extensions\ScriptCommands.h"
  5. #include "eScriptCommands.h"
  6. #include "extensions\KeyCheck.h"
  7.  
  8. using namespace plugin;
  9.  
  10. class Test {
  11. public:
  12.     Test() {
  13.  
  14.         Events::gameProcessEvent += [] {
  15.             CPed *player = FindPlayerPed();
  16.             if (player) {
  17.                 CVector point = { 241.6f, -1283.0f, 10.9f };
  18.                 if (Command<COMMAND_LOCATE_PLAYER_ANY_MEANS_3D>(CWorld::PlayerInFocus, point.x, point.y, point.z, 2.0, 2.0, 2.0))
  19.                     CMessages::AddMessageJumpQ(L"Yes", 1000, 1);
  20.                 //
  21.                 static int sphere;
  22.                 KeyCheck::Update();
  23.                 if (KeyCheck::CheckWithDelay('M', 2000)) {
  24.                     CVector pos = FindPlayerPed()->TransformFromObjectSpace(CVector(0.0f, 5.0f, 0.0f));
  25.                     Command<COMMAND_ADD_SPHERE>(pos.x, pos.y, pos.z, 2.0, &sphere);
  26.                     CMessages::AddMessageJumpQ(L"Create", 2000, 1);
  27.                 }
  28.                 if (KeyCheck::CheckWithDelay('N', 2000)) {
  29.                     Command<COMMAND_REMOVE_SPHERE>(sphere);
  30.                     CMessages::AddMessageJumpQ(L"Delete", 2000, 1);
  31.                 }
  32.             }
  33.         };
  34.     }
  35. } test;

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

Цитировать
Мне нужна именно функция таймер, например, передаешь 1000 мс, получаешь задержку в 1 сек, пробовал через рекурсии не выходит.
Задержку по времени между выполнением действий в теме была показана ранее на примере нажатия клавиши. Вот такой пример. Загрузка модели и создание педа вынесены в отдельные функции.
Код: C++
  1. #include "plugin.h"
  2. #include "CMessages.h"
  3. #include "CWorld.h"
  4. #include "CStreaming.h"
  5. #include "CTimer.h"
  6. #include "ePedModel.h"
  7. #include "ePedType.h"
  8. #include "CCivilianPed.h"
  9.  
  10. using namespace plugin;
  11.  
  12. class Test {
  13. public:
  14.     static bool LoadModel(int model) {
  15.         unsigned char oldFlags = CStreaming::ms_aInfoForModel[model].m_nFlags;
  16.         CStreaming::RequestModel(model, GAME_REQUIRED);
  17.         CStreaming::LoadAllRequestedModels(false);
  18.         if (CStreaming::ms_aInfoForModel[model].m_nLoadState == LOADSTATE_LOADED) {
  19.             if (!(oldFlags & GAME_REQUIRED)) {
  20.                 CStreaming::SetModelIsDeletable(model);
  21.                 CStreaming::SetModelTxdIsDeletable(model);
  22.             }
  23.             return true;
  24.         }
  25.         return false;
  26.     }
  27.  
  28.     static CPed *CreatePed(ePedType pedType, unsigned int modelIndex) {
  29.         CPed *ped = nullptr;
  30.         if (LoadModel(modelIndex)) {
  31.             ped = new CCivilianPed(pedType, modelIndex);
  32.             if (ped) {
  33.                 ped->SetPosition(FindPlayerPed()->TransformFromObjectSpace(CVector(0.0f, 2.0f, 0.0f)));
  34.                 CWorld::Add(ped);
  35.             }
  36.         }
  37.         return ped;
  38.     }
  39.  
  40.     Test() {
  41.         static int keyPressTime = 0;
  42.  
  43.         Events::gameProcessEvent += [] {
  44.             CPed *player = FindPlayerPed();
  45.             if (player) {
  46.                 if (KeyPressed('M') && CTimer::m_snTimeInMilliseconds > (keyPressTime + 5000)) {
  47.                     keyPressTime = CTimer::m_snTimeInMilliseconds;
  48.                     CPed *ped = CreatePed(PEDTYPE_CIVFEMALE, MODEL_HFYST);
  49.                     if (ped)
  50.                         CMessages::AddMessageJumpQ(L"CreatePed", 1000, 0);;
  51.                 }
  52.             }
  53.         };
  54.     }
  55. } test;

Как я уже писал ранее, по работе с lua ничего подсказать не могу.
Зачем ты смешиваешь код lua и плагин? Что такого можно сделать в lua, чего нельзя сделать в плагине? Хотя в lua я не разбираюсь, может чего и можно.

6
Общие вопросы / Re: Части Тела
« : Июнь 28, 2019, 10:55:35 am »
Цитировать
но базы под gta3 у меня нет

http://public.sannybuilder.com/gtasa_exe_idb/gta_3/

7
Общие вопросы / Re: Экстры транспорта
« : Июнь 21, 2019, 10:26:59 am »
Цитировать
Интересует такой вопрос - у экстр почему-то отключен хром, даже если присутствует в модели.
Есть такое дело. Причину не разбирал.

Инфа по экстрам https://gta.com.ua/forum/index.php?showtopic=4952

Код переписанной функции ChooseComponent https://github.com/kenkingGitHub/GTA-Projects/blob/master/VC_NewChooseComponent/VC_NewChooseComponent.cpp

8
Цитировать
Скажите, пожалуйста, у вас есть список типа для каждого педа
\GTA Vice City\data\default.ide раздел peds Default pedtype

в sdk есть enum ePedType
https://github.com/DK22Pac/plugin-sdk/blob/master/plugin_vc/game_vc/ePedType.h

9
К сожалению, по работе с lua скриптами ничего подсказать не могу.

10
Для нормального открытия дверей автобусов и микроавтобусов есть скрипты.

При желании можешь адаптировать модели под работу этих скриптов.
Cсылки на скрипты:
https://gta.com.ua/file_details.phtml?id=3136
https://gta.com.ua/file_details.phtml?id=3104

11
Цитировать
Не думал, что маркер, это int.  Предполагал,  что мы должны передать  структуру.
Это ID маркера.

Цитировать
Конечно, как всегда столкнулся с трудностями,  как использовать скриптовую команду в качестве проверки?
Цитировать
Так же интересная ситуация с выводом целых чисел на экран, они не выводится.
Цитировать
Разобрался с проверками.
Цитировать
Только не получается дать оружие игроку через скриптовую команду.
Код: C++
  1. #include "plugin.h"
  2. #include "extensions\KeyCheck.h"
  3. #include "CMessages.h"
  4. #include "extensions\ScriptCommands.h"
  5. #include "eScriptCommands.h"
  6. #include "CWorld.h"
  7. #include "eWeaponModel.h"
  8. #include "eWeaponType.h"
  9. #include "CStreaming.h"
  10.  
  11. using namespace plugin;
  12.  
  13. class Test {
  14. public:
  15.     static int m_test;
  16.  
  17.     Test() {
  18.         Events::gameProcessEvent += [] {
  19.             CPed *player = FindPlayerPed();
  20.             KeyCheck::Update();
  21.             if (KeyCheck::CheckWithDelay('B', 1000)) {
  22.                 static char message[256];
  23.                 snprintf(message, 256, "test = %d", m_test);
  24.                 CMessages::AddMessageJumpQ(message, 1000, false);
  25.             }
  26.             if (player) {
  27.                 if (KeyCheck::CheckWithDelay('N', 1000)) {
  28.                     //if (player->m_bInVehicle)
  29.                     if (Command<COMMAND_IS_PLAYER_IN_ANY_CAR>(CWorld::PlayerInFocus))
  30.                         CMessages::AddMessageJumpQ(L"in car", 1000, 0);
  31.                     else
  32.                         CMessages::AddMessageJumpQ(L"not in car", 1000, 0);
  33.                 }
  34.                 if (KeyCheck::CheckWithDelay('M', 1000)) {
  35.                     //CWorld::Players[CWorld::PlayerInFocus].m_nMoney += 1000;
  36.                     Command <COMMAND_ADD_SCORE>(CWorld::PlayerInFocus, 1000);
  37.  
  38.                     /*CStreaming::RequestModel(MODEL_COLT45, 2);
  39.                     CStreaming::LoadAllRequestedModels(false);
  40.                     player->GiveWeapon(WEAPONTYPE_PISTOL, 100, true);
  41.                     player->SetCurrentWeapon(WEAPONTYPE_PISTOL);
  42.                     CStreaming::SetModelIsDeletable(MODEL_COLT45);*/
  43.                     Command<COMMAND_REQUEST_MODEL>(MODEL_COLT45, 2);
  44.                     Command<COMMAND_LOAD_ALL_MODELS_NOW>(false);
  45.                     if (Command<COMMAND_HAS_MODEL_LOADED>(MODEL_COLT45)) {
  46.                         Command<COMMAND_GIVE_WEAPON_TO_PLAYER>(CWorld::PlayerInFocus, WEAPONTYPE_PISTOL, 100, true);
  47.                         Command<COMMAND_SET_CURRENT_PLAYER_WEAPON>(CWorld::PlayerInFocus, WEAPONTYPE_PISTOL);
  48.                         Command<COMMAND_MARK_MODEL_AS_NO_LONGER_NEEDED>(MODEL_COLT45);
  49.                     }
  50.                 }
  51.             }
  52.         };
  53.     }
  54. } test;
  55.  
  56. int Test::m_test = 3;

Цитировать
Это очень удобно использовать скриптовые команды.
Скриптовые команды надо использовать в случае отсутствия в sdk нужных функций и классов (ну для тестов ещё, чтобы поучиться). В остальном надо писать код с  разобранными функциями. В примере такой альтернативный код закомментирован.
Пример с оружием есть в sdk, ты же уже про это спрашивал.

12
Идеи / Re: Смена текстур транспорта
« : Июнь 05, 2019, 02:47:13 pm »
Вот небольшой пример - показывает, как динамически менять текстуры транспорта.
По нажатию на Z транспорт игрока будет использовать текстуру waterclear256 (0x77FA58).
А как сделать, чтобы текстура заменялась не на всех материалах, а только на одном нужном, например, с названием remap?
Самостоятельно разобрать не получилось.  >:(

13
Цитировать
Как использовать эту скриптовую команду?
Скриптовая команда - это опкод, смотришь в eScriptCommands какому номеру опкода соответствует эта команда. Открываешь поиск опкодов в SB, находишь нужный опкод: 0162: tie_marker $2344 to_actor $2320 4 2
Смотришь параметры этого опкода.
Код: C++
  1. #include "plugin.h"
  2. #include "extensions\KeyCheck.h"
  3. #include "extensions\ScriptCommands.h"
  4. #include "eScriptCommands.h"
  5.  
  6. using namespace plugin;
  7.  
  8. class Test {
  9. public:
  10.     static int blip;
  11.    
  12.     Test() {
  13.         Events::gameProcessEvent += [] {
  14.             CPed *player = FindPlayerPed();
  15.             KeyCheck::Update();
  16.             if (player && KeyCheck::CheckWithDelay('M', 1000))
  17.                 Command<COMMAND_ADD_BLIP_FOR_CHAR_OLD>(CPools::GetPedRef(player), 4, 2, &blip);
  18.             if (player && KeyCheck::CheckWithDelay('N', 1000))
  19.                 Command<COMMAND_REMOVE_BLIP>(blip);
  20.         };
  21.     }
  22. } test;
  23.  
  24. int Test::blip;

14
Цитировать
Иногда явного  эффекта от функции нет.  Например, что даёт  функция
ped->SetObjectiveTimer(60000);
 Да это таймер,  но никакой задержка  вы действиях педа не наблюдается.
Задержки и не должно быть. По-идеи это установка максимального времени на какое-то действие педа (как я это понимаю).

Цитировать
Скажите пожалуйста, когда завершится работа над  sdk plugin?  чтобы можно было  приступить к   документации всех функций,   тогда новичкам будет легче освоится.
Думаю, что ещё несколько лет.

Цитировать
Допустим, CLEO которая является хуком  знаю,  где посмотреть ее исходник на с++. Может  это поможет разобраться?  Посоветуйте, пожалуйста, книгу,  которая помогла вам стать  таким крутым специалистом??
Я учусь разбираться в классах игры также, как и ты и крутым специалистом себя не считаю. В некоторых случаях, чтобы ответить на твой вопрос, мне приходится самому его сначала разобрать. Никакой такой книги я не знаю. Мне помогли подсказки и советы DK и других пользователей, которые они писали в этой теме, в целом на этом форуме и других форумах.

Вот немного пояснений, которые я для себя сохранил:
Цитировать
Если есть IDA и idb-база, то для "распутывания ниточек" можно использовать такие приёмы:

Как определить, откуда вызывается данная функция?
1.Открываем код функции в основной вкладке.
2.Далее выбираем в меню пункт View - Open Subviews - Function calls - список Caller.

Как определить, откуда происходит обращение к данному адресу?
1.Вставляем курсор между буквами названия адреса. Например здесь
Code:

.data:00B7CB84 _currentTime dd ? ; DATA XREF: _sub_406E50r

вставляем курсор между любыми буквами _currentTime.
2.Жмём X. Открывается список ссылок на данный адрес.


Очень часто случается такое, что декомпилятор (hex-rays) выдаёт ошибку "switch analysis failed".
Случается это в функциях, где используется конструкция switch.
Случается это потому что (моё предположение) разные версии декомпилятора по-разному работают с этой
конструкцией.
В официальных доках рекомендуют вручную настроить эту конструкцию, но есть более простое решение:
пересобрать функцию.
Для этого надо преобразовать функцию в обычные данные, преобразовать данные в код, и создать функцию.

1. Нажимаем U на названии функции (Undefine function).
2. Нажимаем C на первом байте (Code)
3. Нажимаем P (Create function).

В exe есть 2 основных типа адресов - data и text (есть и другие типы). Если проводить аналогию со
скриптами, то адреса типа data можно сравнить с глобальными переменными - в них хранятся различные
значения (например, 0xB7CB84 - [dword] Глобальный таймер в ms, 0x8D2530 - [float] Плотность движения
пешеходов). В ходе игры отдельные процедуры exe читают эти значения или записывают в эти адреса новые
значения. Эти адреса (не все) можно читать/перезаписывать и в скрипте с помощью опкодов 0A8C/0A8D.
Назначение некоторых часто употребляемых data-адресов, а также смещений в структурах можно найти тут:
http://gtamodding.ru...еса_Памяти_(SA)
Что касается адресов типа text, то в них записаны отдельные команды, из которых в свою очередь
состоят процедуры exe. Сами по себе значения этих адресов во время игры не меняются, но их, как и
адреса data, можно (не все) менять скриптом - в этом случае в опкодах 0A8C/0A8D следует ставить
значение параметра virtual protect, равное 1. Понятно, что в случае изменения значения text-адреса,
процедура, которой он принадлежит, станет работать уже по новому алгоритму.
Для поиска нужных адресов и процедур незаменима idb-база от listener. Открыть её можно с помощью
IDA 5. В окне программы есть несколько вкладок, которые представляют код exe в различном виде.
Основные из них: "IDA View-A" - основной вид. Если текущий участок exe состоит из адресов типа data,
то они отображаются в виде списка, а если текущий участок является какой-то
процедурой (text-адреса), то она отобразится в виде блок-схемы. "Hex View-A" - побайтовое отображение
кода. Многие data-адреса и процедуры в базе проименованы, при активной вкладке "IDA View-A" можно
осуществлять их поиск по названию (Search - Text).
Есть ещё полезная вкладка Functions - список всех процедур exe. Если эта вкладка активна, то можно
осуществить поиск процедуры по названию (Search). Например, осуществив поиск по слову train, можно
найти процедуры, имеющие отношение к поездам. При щелчке по названию процедуры, активируется вкладка
"IDA View-A" и появится блок-схема этой процедуры, по которой можно исследовать, как она
работает (какие процедуры вызывает, со значениями каких адресов оперирует и т.д.).



15
Напишу пожалуй здесь. Вопрос касается структуры (класса) CompressedVector. Во всех базах:
Код: C++
  1. struct CompressedVector
  2. {
  3.   __int16 x;
  4.   __int16 y;
  5.   __int16 z;
  6. };

И только (теперь и в моей базе для 1.0 так) в базе для GTA3 1.1, которую скинули на форуме SB: https://sannybuilder.com/forums/viewtopic.php?pid=27306#p27306

Код: C++
  1. struct CompressedVector
  2. {
  3.   CVector m_vecPoint;
  4. };

Разбирал функции для GTA3, где используется CompressedVector и получается правильный вариант второй.

Например часть псевдокода функции CCollision::ProcessVerticalLineTriangle при первом варианте:
Код: C++
  1. v7 = &verts[2 * tri->m_nVertA];
  2. v33 = *(float *)&v7->x;
  3. v34 = *(float *)&v7->z;
  4. v35 = *(float *)&v7[1].y;
  5. v8 = &verts[2 * tri->m_nVertB];
  6. v36 = *(float *)&v8->x;
  7. v37 = *(float *)&v8->z;
  8. v38 = *(float *)&v8[1].y;
  9. v9 = &verts[2 * tri->m_nVertC];
  10. v39 = *(float *)&v9->x;
  11. v40 = *(float *)&v9->z;
  12. v41 = *(float *)&v9[1].y;
  13. v10 = *(float *)&colLine->m_vStart.x;

Явно что-то не то...
 
И эта же часть этой же функции при втором варианте:
Код: C++
  1. v7 = &verts[tri->m_nVertA];
  2. v32 = v7->m_vecPoint.x;
  3. v33 = v7->m_vecPoint.y;
  4. v34 = v7->m_vecPoint.z;
  5. v8 = &verts[tri->m_nVertB];
  6. v35 = v8->m_vecPoint.x;
  7. v36 = v8->m_vecPoint.y;
  8. v37 = v8->m_vecPoint.z;
  9. v9 = &verts[tri->m_nVertC];
  10. v38 = v9->m_vecPoint.x;
  11. v39 = v9->m_vecPoint.y;
  12. v40 = v9->m_vecPoint.z;
  13. v10 = colLine->m_vStart.x;

И в других функциях, где используется CompressedVector, такая же ситуация.

Кто-нибудь ещё разбирал этот вопрос? Что скажите?

Страницы: [1] 2 3 ... 14