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

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


Сообщения - xanser

Страницы: [1] 2 3 ... 34
1
Скриптинг / Re: CLEO: Скрипт Ходьбы
« : Август 25, 2018, 08:20:19 am »
Уточнение: кроме игровых кнопок газ/тормоз/стрельба... присутствуют и прямые клавиатурные A,B,С...Alt, Shift..., даже Ж,Э,Ю,Ъ. Вот мое описание:
Код: C++
  1. struct CKeyState {
  2.         WORD F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12; // 0-11 (12)
  3.         WORD _13_44[32]; // 12-43 (32)
  4.         WORD Space, _46, _47, _48, _49, _50, _51, Quote, _53, _54, _55, _56, Less, Minus, More, Point; // 44-59 (16)
  5.         WORD Key0, Key1, Key2, Key3, Key4, Key5, Key6, Key7, Key8, Key9; // 60-69 (10)
  6.         WORD _71, DoublePoint, _73, Plus, _75, _76, _77; // 70-76 (7)
  7.         WORD A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z; // 77-102 (26)
  8.         WORD LBrace, Slash, RBrace, _107, _108, Wave; // 103-108 (6)
  9.         WORD _110_196[87], RusЁ, _198_237[40], RusБ, _239_242[4], RusЖ, _244_257[14], RusХ, _259_262[4], RusЪ, _264, _265, RusЭ, RusЮ, _268; // 109-267 (159)
  10.         WORD Esc, Insert, Del, Home, End, PgUp, PgDown, Up, Down, Left, Right, Scroll, Pause, NumLock, Div, Mul, Sub, Add, Enter, Decimal; // 268-287 (20)
  11.         WORD Num1, Num2, Num3, Num4, Num5, Num6, Num7, Num8, Num9, Num0; // 288-297 (10)
  12.         WORD Back, Tab, CapsLock, Extenter, LShift, RShift, Shift, LCtrl, RCtrl, LAlt, RAlt, LWin, RWin, Apps; // 298-311 (14)
  13. };
  14. auto Keys = (CKeyState *)0x864A00;
  15.  

Таким образом, в скрипте присутствует Alt по адресу: 0x864A00 + 0x266 = 0x864C66. Можно обращаться так:

Код: C++
  1. static bool _KeyPressed(DWORD key) {
  2.         return (*(WORD *)key == 0xFF);
  3. #define KeyPressed(a) _KeyPressed((DWORD)&Keys->a)
  4. }
  5. //...
  6. if (KeyPressed(LAlt)) {} // нажат Alt
  7. if (KeyPressed(W)) {} // нажата W
  8. if (KeyPressed(RusЪ)) {} // нажат твердый знак в русской раскладке
  9.  

2
Скриптинг / Re: CLEO: Скрипт Ходьбы
« : Август 23, 2018, 11:14:53 am »
Адрес 0x7DBCB0 содержит состояния нажатий игровых клавиш. Если описать в виде класса, то будет как-то так:
Код: C++
  1. class CPad {
  2. public:
  3.         /*0x000*/       WORD Button0;
  4.         /*0x002*/       WORD Button1;
  5.         /*0x004*/       BYTE TurretHorizontal;
  6.         /*0x005*/       BYTE TurretHorizontal_isLeft;
  7.         /*0x006*/       BYTE TurretVertical;
  8.         /*0x007*/       BYTE TurretVertical_isDown;
  9.         /*0x008*/       WORD Action_NextRadio;
  10.         /*0x00A*/       WORD PrevWeapon_LookLeft;
  11.         /*0x00C*/       WORD Aim_HandBrake;
  12.         /*0x00E*/       WORD NextWeapon_LookRight;
  13.         /*0x010*/       WORD Forward;
  14.         /*0x012*/       WORD Backward;
  15.         /*0x014*/       WORD Left;
  16.         /*0x016*/       WORD Right;
  17.         /*0x018*/       WORD UsedToExitCertainModes;
  18.         /*0x01A*/       WORD ChangeCameraView;
  19.         /*0x01C*/       WORD Jump_BrakeReverse;
  20.         /*0x01E*/       WORD EnterExitVehicle;
  21.         /*0x020*/       WORD Sprint_Gas;
  22.         /*0x022*/       WORD Fire;
  23.         /*0x024*/       WORD Crouch_Horn;
  24.         /*0x026*/       WORD LookBehind_Submission;
  25.         /*0x028*/       WORD Button20;
  26.         /*0x02A*/
  27. };
  28.  
  29. auto GameKeys = (CPad *)0x7DBCB0;

Дальше проверяется, нажата ли каждая кнопка Forward, Backward, Left, Right. Нажатие дает значение 255 в переменные 10@, 11@, 12@, 13@. Но что удивительно, если снизить значение до 85 как в скрипте, то скорость анимации и ее влияние снизятся, что преобразует бег в подобие ходьбы (не путать с настоящей анимацией хотьбы). Я предпочитаю значение 170.
Еще в скрипте присутствует какая-то замена адресов, возможно что-то связанное с прицелом на правую кнопку, активирующую хотьбу, в это я не вникал. Мой код, аналогичный этому выглядит так:

Код: C++
  1. static void WalkProcess() {
  2.         if (Mouse->Right) {
  3.                 WalkSpeed = min(255, max(170, WalkSpeed - 1));
  4.                 if (GameKeys->Forward)  Patch((DWORD)&GameKeys->Forward, (BYTE)WalkSpeed);
  5.                 if (GameKeys->Backward) Patch((DWORD)&GameKeys->Backward, (BYTE)WalkSpeed);
  6.                 if (GameKeys->Left)     Patch((DWORD)&GameKeys->Left, (BYTE)WalkSpeed);
  7.                 if (GameKeys->Right)    Patch((DWORD)&GameKeys->Right, (BYTE)WalkSpeed);
  8.         }
  9.                 else
  10.                         WalkSpeed = 255;
  11. }

Здесь плавное снижение бега 255 до хотьбы 170 при нажатии на правую кнопку, чтобы анимация не дернулась. Прицел я не проверяю, когда игрок целится, он и так не может ни бежать, ни ходить.
По мышке:

Код: C++
  1. struct CMouseState {
  2.         BYTE    Left;
  3.         BYTE    Right;
  4.         BYTE    Middle;
  5.         BYTE    WheelUp;
  6.         BYTE    WheelDown;
  7.         char    _[3];
  8.         float   X;
  9.         float   Y;
  10. };
  11.  
  12. auto Mouse = (CMouseState *)0x7DD860;

3
Общие вопросы / Re: Помощь с CLEO
« : Март 16, 2018, 07:58:55 am »
Вклинюсь тоже, тема должна быть полезна и другим участникам форума, а она звучит как "я придумываю все подряд, а shaggy ищет решение", и получается по сути тема одного человека непонятно какой направленности. Особой пользы от темы нет, можно общаться напрямую другими способами.

Согласен с тем, что на сайте мало интересных уроков, то, что есть, дает стартовый толчок, дальше по идее только самому копать и копать. Те, кто как-то разобрались, уходят в тень делать свои моды (к коим и себя причисляю), аудитория катастрофически мала.

По IDA в рамках данного форума особо сказать нечего. Есть базы, в них есть закладка Structures, где можно посмотреть, что разобрано. Есть Alt-X на любой переменной или функции, где можно посмотреть все вызовы. Есть псевдокод на F5, который не всегда верно, но понятнее показывает происходящее, чем ассемблерный. Этого должно хватить, чтобы начать разбираться.

4
Идеи / Re: Рендер тени в Vice City
« : Февраль 26, 2018, 04:43:01 pm »
Ошибка и после ареста, и после "потрачено", что-то там с анимацией нарушается, судя по адресу. Это же не готовый мод, как сказал сам автор:
Получилось довольно криво, но как-то работает, пока что понятия не имею, как это сделать нормально.

5
Общие вопросы / Re: След от лодки на воде
« : Февраль 26, 2018, 12:43:05 pm »
Вот высота следа 0x5BE31D = 5.9699998

6
Программирование / Re: Звуки тачек
« : Февраль 19, 2018, 07:27:01 am »
Смотри ссылку на этот адрес (клавиша X на адресе), на него ссылается функция 0x5F20B0 CAudioManager::ProcessVehicleEngine
Разжую подробнее на всякий случай... То что ты показываешь 0x115 это 277 - первый звук, см. выше пример таблицы. Следующие 110 * 7 dword-значений - это остальные звуки и частоты.
Во вложении таблица всех звуков, достаточно поменять строчки по соответствующим адресам, чтобы взять звуки с другого авто.

7
Программирование / Re: Расширение классов
« : Январь 16, 2018, 04:24:02 am »
Последний вопрос - функция Get() получает объект перебором всех существующих, пока не найдет совпадение, или сразу выхватывает нужного?

8
Программирование / Re: Расширение классов
« : Январь 12, 2018, 11:42:35 am »
Может захочется еще что-то расширить кроме машин, например CPed, допустим добавить "голод". Да и просто понимать, как сделано, может где еще пригодится. Форум-то для того и нужен, чтобы научиться, а не только брать чужое. Если будет желание, опиши хотя бы последовательность действий, хотя и за твой пример уже спасибо.

9
Программирование / Re: Расширение классов
« : Январь 10, 2018, 04:22:39 am »
Мне интересен сам используемый прием. Поэтому хотелось пошагово на простом примере сначала понять суть, за счет чего происходит "прикрепление", и какой синтаксис должен быть от начала до конца. Если смотреть пример по CVehicle, там код не полностью приведен в сообщении, для меня остались пробелы в таких местах:
Код: C++
  1. VehicleComponents(CVehicle *) { // Конструктор этого класса будет вызван при вызове конструктора транспорта (CVehicle::CVehicle)
Не очень понятно, почему происходит вызов нового конструктора при вызове стандартного CVehicle::CVehicle
Код: C++
  1. static VehicleExtendedData<VehicleComponents> vehComps;
Не описано, что такое VehicleExtendedData
Код: C++
  1. vehComps.Get(vehicle).m_pDoorLF
Как выглядит функция Get() ?
Видимо ответы в самом sdk, но так тяжело изучать что-то, копая чужой код. Вот и хотелось на отвлеченном примере понять сам принцип, а потом уже идти от простого к сложному.

10
Программирование / Расширение классов
« : Январь 06, 2018, 05:10:43 pm »
В этом посте DK показывал пример, как расширить класс, "прикрепив" к нему дополнительные атрибуты. Насколько я понял, существующие пулы при этом не расширяются.
Код: C++
  1.     #include <plugin.h>
  2.      
  3.     using namespace plugin;
  4.      
  5.     class VehicleExtendedExample {
  6.     public:
  7.         class VehicleComponents { // Класс, который представляет наши данные (можно сказать, что эти данные "прикрепляются" к структуре транспорта)
  8.         public:
  9.             RwFrame *m_pDoorLF;
  10.             RwFrame *m_pDoorRF;
  11.             RwFrame *m_pDoorLR;
  12.             RwFrame *m_pDoorRR;
  13.      
  14.             VehicleComponents(CVehicle *) { // Конструктор этого класса будет вызван при вызове конструктора транспорта (CVehicle::CVehicle)
  15.                 m_pDoorLF = m_pDoorRF = m_pDoorLR = m_pDoorRR = nullptr; // устанавливаем все указатели в 0
  16.             }
  17.         };
  18.      
  19.         VehicleExtendedExample() {
  20.             static VehicleExtendedData<VehicleComponents> vehComps; // Создаем экземпляр нашего расширения. vehComps - это переменная, через которую мы будем
  21.                                                                     // обращаться к нашим данным (используя метод Get(CVehicle *транспорт) )
  22.      
  23.             Events::vehicleSetModelEvent += [](CVehicle *vehicle, int modelIndex) { // Выполняем нашу функцию, когда игра устанавливает модель транспорту
  24.                 if (vehicle->m_pRwClump) { // Если создан графический обьект модели (RpClump)
  25.                     vehComps.Get(vehicle).m_pDoorLF = CClumpModelInfo::GetFrameFromName(vehicle->m_pRwClump, "door_lf_dummy"); // Находим компоненты в иерархии
  26.                     vehComps.Get(vehicle).m_pDoorRF = CClumpModelInfo::GetFrameFromName(vehicle->m_pRwClump, "door_rf_dummy"); // и записываем их в наш класс
  27.                     vehComps.Get(vehicle).m_pDoorLR = CClumpModelInfo::GetFrameFromName(vehicle->m_pRwClump, "door_lr_dummy");
  28.                     vehComps.Get(vehicle).m_pDoorRR = CClumpModelInfo::GetFrameFromName(vehicle->m_pRwClump, "door_rr_dummy");
  29.                 }
  30.                 else // иначе устанавливаём всё в 0
  31.                     vehComps.Get(vehicle).m_pDoorLF = vehComps.Get(vehicle).m_pDoorRF = vehComps.Get(vehicle).m_pDoorLR = vehComps.Get(vehicle).m_pDoorRR = nullptr;
  32.             };
  33.      
  34.             Events::vehicleRenderEvent += [](CVehicle *vehicle) { // Выполняем нашу функцию, когда игра рендерит транспорт
  35.                 if (vehComps.Get(vehicle).m_pDoorLF)
  36.                     vehComps.Get(vehicle).m_pDoorLF->modelling.pos.z = 1.0f; // Сдвигаем компонент вверх
  37.                 if (vehComps.Get(vehicle).m_pDoorRF)
  38.                     vehComps.Get(vehicle).m_pDoorRF->modelling.pos.z = 1.0f;
  39.                 if (vehComps.Get(vehicle).m_pDoorLR)
  40.                     vehComps.Get(vehicle).m_pDoorLR->modelling.pos.z = 1.0f;
  41.                 if (vehComps.Get(vehicle).m_pDoorRR)
  42.                     vehComps.Get(vehicle).m_pDoorRR->modelling.pos.z = 1.0f;
  43.             };
  44.         }
  45.     } vehicleExtendedExample;

DK, можешь на простом примере показать общий принцип расширения классов через прикрепление новых атрибутов. К примеру, есть условный класс
Код: C++
  1. class CVector {
  2. public:
  3.     float x;
  4.     float y;
  5.     CVector();
  6. } vector2d[100];

И есть, например, пул таких координат по определенному адресу памяти, где идет по порядку vector2d[0].x, veсtor2d[0].y, vector2d[1].x, veсtor2d[1].y, vector2d[2].x, veсtor2d[2].y...
Как к этому классу "прикрепить" еще свою координату float z, чтобы обращаться уже к vector2d.x, vector2d.y, vector3d.Get(vector2d).z и не повредить существующий пул. Пример не связан с игрой.

11
Идеи / Re: Отражения воды
« : Декабрь 27, 2017, 05:45:25 am »
Первые 4 параметры как-то не улучшают воду, ухудшается плавность перехода прозрачной воду в непрозрачную, мне кажется дефолтный вариант самый оптимальный. Остальные параметры по указанной ссылке использовались.

12
Хотел перенести на основу plugin-sdk, но не вышло пока. Вот эти строчки не знаю, как реализовать
05E7: 2@ = car 0@ struct
05E3: call_method 0x59E590 struct 2@ params 1 pop 0 1@
Вроде это самое простое, у меня так, на plugin-sdk по аналогии.
Код: C++
  1. void CAutomobile::SetModelIndex(int id) {
  2.         ((void(__thiscall *)(CAutomobile *, int))0x59E590)(this, id);
  3. }
  4.  
  5. ((CAutomobile *)(PlayerPed->Vehicle))->SetModelIndex(149);

13
Общие вопросы / Зеркальное отражение модели
« : Октябрь 27, 2017, 06:37:16 pm »
Есть ли способ поставить на карту модель в зеркальном отражении, например по-хитрому задав углы поворота. Актуально для симметричных моделей, например ворот, чтобы не моделить отраженный аналог.

14
Идеи / Re: Смена текстур транспорта
« : Октябрь 24, 2017, 05:19:26 am »
Радует, что это возможно. Спасибо за код, буду разбираться.

15
Идеи / Re: Смена текстур транспорта
« : Октябрь 19, 2017, 04:21:50 am »
Может тогда поэкспериментировать пока на спец. актерах с id 109-129, посоздавать одновременно на один номер разные модели или текстуры. Как поведет себя игра, создаст разных или одинаковых, и что нужно, чтобы происходила смена. Между миссиями это же как-то происходит. Возможно придется удалить созданные модели, чтобы появилась новая, тогда это поставит крест на всей задумке. А может достаточно поменять какой-то флаг или что-то переинициализировать.

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