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

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


Сообщения - kenking

Страницы: 1 ... 13 14 [15] 16
211
Моды / Re: D3D8 мод для GTA VC.
« : Август 24, 2016, 07:43:05 am »
По поводу функции прицепа, такой насколько я знаю в вайсе нет, получается она есть только у меня, если будет время, вытащу код отдельно, а на сайте выложу мод прицепа.
Было бы отлично. Будем ждать.

212
Моды / Re: D3D8 мод для GTA VC.
« : Август 23, 2016, 08:20:40 am »
Цитировать
Вытаскивать отдельно код с прицепом я не стал, так как в моде много чего еще похожего, и позднее можно будет все потестировать. Если интересно, могу описать алгоритм, чтобы каждый мог повторить сам, может даже лучше. Вот математическая модель, которую я придумал, описывающая горизонтальное и вертикальное положение прицепа при движении тягача
Буду ждать выхода мода. Интересно протестировать. Хотя больший интерес представляет сам код реализации. Интересное решение. Я думал, что в .exe была найдена функция подобная функции в SA для цепляния транспорта.

213
Моды / Re: D3D8 мод для GTA VC.
« : Август 20, 2016, 01:23:37 pm »
Паровозик.
http://youtu.be/8k99E13_1mU
Можно раскрыть секрет цепляния авто друг к другу? Можно ли будет реализовать таким способом полноценную работу тягача и прицепа (полуприцепа) для транспорта игрока и транспорта в трафике в VC?

214
Понятно. Спасибо.

Решил переписать свой скрипт "Дизель" на С++
{$CLEO .cs}
0000:
const
   AVTO = 0@          // авто
   MODEL_AVTO = 1@    // модель авто
   CLASS_AVTO = 2@    // класс авто
   STRUCT_AVTO = 3@   // структура авто                         
   ENGINE_TYPE = 4@   // тип двигателя
   EXHAUST = 5@       // тип выхлопа
   PARTICLE_1 = 6@    // эффект_1
   PARTICLE_2 = 7@    // эффект_2
   DOUBLE = 8@        // вспомогательная переменная
   X_1 = 9@           // координата Х_1
   Y_1 = 10@          // координата Y_1
   Z_1 = 11@          // координата Z_1
   X_2 = 12@          // координата Х_2
end

var
   X_1: Float
   X_2: Float
end

while true
    wait 0
    if
      Player.Defined($PLAYER_CHAR)
    then
        if 
          actor.Driving($PLAYER_ACTOR)
        then
            03C0: AVTO = actor $PLAYER_ACTOR car // транспорт игрока
            if
              01C1: car AVTO stopped // транспорт стоит
            then
                if 
                  00E1: key_pressed 0 16
                then 
                    0441: MODEL_AVTO = car AVTO model   // модель транспорта
                    08EC: CLASS_AVTO = car AVTO type   // класс транспорта
                    if and
                      0A01: model MODEL_AVTO car // транспорт = авто
                      04A4: CLASS_AVTO == 4  // @ == any // класс авто worker
                    then
                        0A97: STRUCT_AVTO = car AVTO struct // структура авто
                        STRUCT_AVTO += 0x384
                        0A8D: STRUCT_AVTO = read_memory STRUCT_AVTO size 4 virtual_protect 0 // получили указатель на handling-структуру
                        STRUCT_AVTO += 0x75
                        0A8D: ENGINE_TYPE = read_memory STRUCT_AVTO size 1 virtual_protect 0 // получили тип двигателя
                        if
                          ENGINE_TYPE == 68 // тип двигателя = дизель
                        then 
                            MODEL_AVTO *= 4
                            MODEL_AVTO += 0xA9B0C8
                            0A8D: STRUCT_AVTO = read_memory MODEL_AVTO size 4 virtual_protect 0 // CModel
                            STRUCT_AVTO += 0x5C                                       
                            0A8D: STRUCT_AVTO = read_memory STRUCT_AVTO size 4 virtual_protect 0 // vehicle struct
                            STRUCT_AVTO += 0x48
                            0A8D: X_1 = read_memory STRUCT_AVTO size 4 virtual_protect 0 // X_1
                            STRUCT_AVTO += 4
                            0A8D: Y_1 = read_memory STRUCT_AVTO size 4 virtual_protect 0 // Y_1
                            STRUCT_AVTO += 4
                            0A8D: Z_1 = read_memory STRUCT_AVTO size 4 virtual_protect 0 // Z_1
                            //---определение второго глушителя---
                            0A97: STRUCT_AVTO = car AVTO struct
                            STRUCT_AVTO += 0x384
                            0A8D: STRUCT_AVTO = read_memory STRUCT_AVTO size 4 virtual_protect 0
                            STRUCT_AVTO += 0xCC
                            0A8D: EXHAUST = read_memory STRUCT_AVTO size 4 virtual_protect 0
                            if
                              08B7: test EXHAUST bit 13
                            then
                                DOUBLE = 2
                                X_2 = X_1
                                X_2 *= -1.0
                            else
                                DOUBLE = 1
                            end
                            //----------------------------------
                            066C: PARTICLE_1 = attach_particle "riot_smoke" to_car AVTO with_offset X_1 Y_1 Z_1 rotation 0.0 0.0 0.0 flag 1
                            064C: make_particle PARTICLE_1 visible
                            if
                              DOUBLE == 2
                            then
                                066C: PARTICLE_2 = attach_particle "riot_smoke" to_car AVTO with_offset X_2 Y_1 Z_1 rotation 0.0 0.0 0.0 flag 1
                                064C: make_particle PARTICLE_2 visible
                            end
                            wait 500
                            0650: destroy_particle PARTICLE_1
                            if
                              DOUBLE == 2
                            then
                                0650: destroy_particle PARTICLE_2
                            end
                        end     
                    end     
                end
            end
        end
    end
end 

Возникли вопросы:
1) Не нашёл в sdk замены
01C1: car AVTO stoppedПосмотрел опкод в базе и нашёл функцию
.text:004861F0     CScriptEngine__isVehicleStopped proc nearДобавил в CVehicle
Код: C++
  1. //CVehicle.h
  2. bool CVehicle::IsStopped();
  3. //CVehicle.cpp
  4. // Converted from thiscall bool CVehicle::IsStopped(void) 0x4861F0
  5. bool CVehicle::IsStopped()
  6. {
  7.   return ((bool(__cdecl *)(CVehicle*))0x4861F0)(this);
  8. }
Ну и вроде как этот вопрос решился.
2) Не нашёл в sdk замены (нашёл только перечисление ePadButton)
00E1: key_pressed 0 16В базе нашёл функцию
.text:00485B10     _CScriptThread__getPlayerKeyState proc nearТолько куда и как её добавить в sdk не разобрался.
3) Не могу понять как считать значение m_nEngineType из cTransmission.h
4) Также не понятно как проверить наличие второго глушителя у модели
m_bDoubleExhaust из tHandlingData.h

5) Работу с партициклами в sdk я тоже не нашёл
066C: PARTICLE_1 = attach_particle "riot_smoke" to_car AVTO with_offset X_1 Y_1 Z_1 rotation 0.0 0.0 0.0 flag 1
064C: make_particle PARTICLE_1 visible
0650: destroy_particle PARTICLE_1
Пока набросал примерный код без учёта непонятных моментов. Создание партицикла заменил на создание короны.
Код: C++
  1. #include <plugin.h>
  2. #include "game_sa\common.h"
  3. #include "game_sa\CTimer.h"
  4. #include "game_sa\CModelInfo.h"
  5. #include "game_sa\CVehicle.h"
  6. #include "game_sa\tHandlingData.h"
  7. #include "game_sa\CCoronas.h"
  8.  
  9. using namespace plugin;
  10.  
  11. class Diesel {
  12. public:
  13.     Diesel() {
  14.     static bool m_currentState = true;
  15.     static unsigned int m_nLastTimeWhenAnyActionWasEnabled = 0;
  16.     static tHandlingData *hanlData;
  17.  
  18.         Events::gameProcessEvent += [] {
  19.             CVehicle *vehicle = FindPlayerVehicle(-1, false);
  20.             if (vehicle && vehicle->m_dwVehicleClass == VEHICLE_AUTOMOBILE && vehicle->IsStopped() && KeyPressed(87) && m_currentState) {
  21.                 CVehicleModelInfo *vehModel = reinterpret_cast<CVehicleModelInfo *>(CModelInfo::ms_modelInfoPtrs[vehicle->m_wModelIndex]);
  22.                 hanlData = vehicle->m_pHandlingData;
  23.                 if (vehModel->m_nClass == 4 && hanlData->m_transmissionData.m_nEngineType == 68) {
  24.                     m_currentState = false;
  25.                     m_nLastTimeWhenAnyActionWasEnabled = CTimer::m_snTimeInMilliseconds;
  26.                 }
  27.             } else if (!m_currentState) {
  28.                        if (CTimer::m_snTimeInMilliseconds < (m_nLastTimeWhenAnyActionWasEnabled + 2000)) {
  29.                            CVector posn = reinterpret_cast<CVehicleModelInfo *>(CModelInfo::ms_modelInfoPtrs[vehicle->m_wModelIndex])->m_pVehicleStruct->m_avDummyPosn[6];
  30.                            CCoronas::RegisterCorona(reinterpret_cast<unsigned int>(vehicle) + 50 + 6 + 0, vehicle, 255, 128, 0, 255, posn, 0.3f, 150.0f, CORONATYPE_SHINYSTAR, 0, false, false, 0, 0.0f, false, 0.5f, 0, 50.0f, false, true);
  31.                                if (hanlData->m_bDoubleExhaust) {
  32.                                    posn.x *= -1.0f;
  33.                                    CCoronas::RegisterCorona(reinterpret_cast<unsigned int>(vehicle) + 50 + 6 + 1, vehicle, 255, 128, 0, 255, posn, 0.3f, 150.0f, CORONATYPE_SHINYSTAR, 0, false, false, 0, 0.0f, false, 0.5f, 0, 50.0f, false, true);
  34.                                }
  35.                        } else
  36.                              m_currentState = true;
  37.               }
  38.         };
  39.     }
  40. } example;

Просьба прояснить эти вопросы.
6) Ещё в sdk есть перечисление eCommandName. Как можно использовать в написании плагина?


UPD:
С вопросами 3 и 4 разобрался, эти вопросы снимаются.
Код подредактировал.

Остальные вопросы всё ещё неразрешимы пока. Просьба помочь разобраться.

215
Я с новой порцией вопросов.
1) Почитал про классы в С++. Написано:
Код: C++
  1. // объявление классов в С++
  2. class /*имя класса*/
  3. {
  4.   private:
  5.   /* список свойств и методов для использования внутри класса */
  6.   public:
  7.   /* список методов доступных другим функциям и объектам программы */
  8.   protected:
  9.   /*список средств, доступных при наследовании*/
  10. };

В примерах sdk в конце класса перед ; ставится ещё слово (здесь, например, playerTest, в других примерах другое, при этом я заметил, что с названием класса оно вообще может не совпадать). Для чего это слово?
Код: C++
  1. class PlayerTest {
  2. public:
  3.         PlayerTest() {
  4.                
  5.         }
  6. } playerTest;

2) Имеет ли значение в какой процесс "вклиниваться"?
3) Имеет ли значение каким способом это делать? Так
Код: C++
  1. Events::gameProcessEvent += [] {
  2.                        
  3. };
или так
Код: C++
  1. OpenDoorExample() {
  2.     Events::gameProcessEvent.Add(Process);
  3. }

4) Как я понял, если надо, чтобы два действия обрабатывались одновременно, надо "вклиниваться" в два разных процесса?
5) Как в плагине проверить $ONMISSION == 0

216
Цитировать
Добавь
Код: C++
  1. Call<NoRet, 0x486B00, CVector const&, CEntity *>(trailer->GetPosition(), trailer);
Теперь нормально, спасибо!

Цитировать
trailer->m_nStatus = 4; // что это за статус - без понятия
Проверил, с значениями 0-2 прицеп становится поверх тягача, 3 тоже, что и 4 получился результат.

Цитировать
Добавляй в проект твоего плагина.
Упс.. а я добавил в \plugin_sa\game_sa да ещё и коммит сделал...  поторопился... Убрать из \plugin_sa\game_sa и сделать новый коммит или ты сам исправишь?

217
Цитировать
KeyCheck.h
KeyCheck.cpp
Добавил в \plugin_sa\game_sa или надо было в другое место добавлять?

Цитировать
По поводу скрипта Дениса:
Я бы вообще переделал обработку набора числа.
В C++ можно сделать всё намного "чище".
Ну да, так лучше, чем в моём варианте.  :)

Цитировать
Вот что получилось:
Класс! Спасибо за пример и пояснения! Есть один момент - при повторном спауне первый тягач благополучно удаляется, а вот первый прицеп нет и получается ко второму тягачу цепляются два прицепа, через некоторое время они взрываются. Для прицепа нужен RemoveReferences. Как добавить?

И ещё сразу по прицепам есть вопрос - можно ли в трафике в процессе создания транспорта проверить, если модель определённого ID (тягач), то цеплять к нему прицеп. Цеплять не на весь транспорт с таким ID, а выборочно, ну скажем через определённое время? Цеплять разные прицепы?


218
Спасибо за очередной пример и пояснения!

Цитировать
CModelInfo::IsVehicleModelType возвращает boolean (true/false), зачем переводить его в VehicleModelInfo, и сравнивать с -1 и 6 - непонятно.
После перевода получается тип модели (0=car, 9=bike, 11=trailer и т.д.). А если модель не является транспортом или вообще нет такой модели, то получается значение -1, а 6 - это модель типа train. Вот я и проверяю, что набранное число - это ID модели транспорта и при этом не является моделью train. Потому как, если модель train, то происходит вылет игры. По другому я не придумал, как проверить. Денис проверял, что модель есть (в моём коде сравнение с -1) и она является любой из моделей, кроме train (в моём коде сравнение с 6). Так-то плагин в работе я проверил, всё работает. Просто по самому коду - может, где-то можно, что-то оптимизировать?
                if
                07DE: model SUM exists // versionB
            then
                0AA7: call_function 0x4C5AA0 num_params 1 pop 1 SUM 9@ // isModelCar
                0AA7: call_function 0x4C5B60 num_params 1 pop 1 SUM 10@ // isModelBike
                0AA7: call_function 0x4C5C20 num_params 1 pop 1 SUM 11@ // isModelBmx
                0AA7: call_function 0x4C5BF0 num_params 1 pop 1 SUM 12@ // isModelQuad
                0AA7: call_function 0x4C5C50 num_params 1 pop 1 SUM 13@ // isModelTrailer
                0AA7: call_function 0x4C5BC0 num_params 1 pop 1 SUM 14@ // isModelMTruck
                if or
                    081E:   model SUM boat
                    081F:   model SUM plane
                    0820:   model SUM heli
                    9@ == True
                then
                    0ADD: spawn_car_with_model SUM at_player_location
                else
                    if or
                        10@ == 8766721 // True
                        11@ == 8766721 // True
                        12@ == 8766721 // True
                        13@ == 8766721 // True
                        14@ == True
                    then
                        0ADD: spawn_car_with_model SUM at_player_location
                    end
                end
            end


UPD:
Что-то я действительно намудрил.  :)
CModelInfo::IsVehicleModelType(sum) как раз и вернёт тип модели (0=car, 9=bike, 11=trailer и т.д.). А если модель не является транспортом или вообще нет такой модели, то получается значение -1.
Вот так надо:
Код: C++
  1. if (CModelInfo::IsVehicleModelType(sum) != -1 && CModelInfo::IsVehicleModelType(sum) != 6)

219
В этом примере процессы обработки нажатия клавиш и открытия/закрытия компонентов разделены.
Круто! Спасибо за пример.

Вопросы:
1) Названия классов могут совпадать в разных плагинах? Никакого конфликта не будет? Или всё, что делается в одном плагине остальных никак не касается?
2) В конце кода это зачем?
Код: C++
  1. int DoorsExample::componentByDoorId[6] = { CAR_BONNET, CAR_BOOT, CAR_DOOR_LF, CAR_DOOR_RF, CAR_DOOR_LR, CAR_DOOR_RR };
  2. int DoorsExample::m_nLastTimeWhenAnyActionWasEnabled = 0;
  3. VehicleExtendedData<DoorsExample::VehicleDoors> DoorsExample::VehDoors;
3) В примере спаунера транспорта https://github.com/DK22Pac/plugin-sdk/blob/master/examples/SA_VehicleSpawner/Main.cpp при вызове модели типа train происходит вылет игры. Видимо эта функция не предназначена для работы с таким типом транспорта.

Прошло две недели с начала моего обучения, пора показать первый результат. Переписал скрипт Дениса Car Spawner 3 на С++. Посмотри пожалуйста. Можно ли, что-то улучшить, оптимизировать?
Код клео
{$CLEO}  // 0 - 48 , 9 -57
var
    0@: array 5 of Integer  // digits     0 1 2 3 4
    17@: Integer             // index
    6@: Integer             // current_digit
    7@: Integer             // SUM
    8@: Integer             // KEY_HOLD
    15@: Integer             // KEY
end
const
    DIGIT = 0@
    i = 17@
    CURRENT_DIGIT = 6@
    SUM = 7@
    KEY_HOLD = 8@
    KEY = 15@
end
CURRENT_DIGIT = 1
while true
    wait 0
    if or
        not player.Defined($PLAYER_CHAR)
        $ONMISSION <> 0
    then   
        CURRENT_DIGIT = 1
        SUM = 0
        KEY_HOLD = False
        for i = 0 to 4
            0006: DIGIT[i] = 0 
        end
        continue
    end
    if
        8AB0: not key_pressed 2
    then
        if and
            SUM > 0
            SUM < 19010
        then
            if
                07DE: model SUM exists // versionB
            then
                0AA7: call_function 0x4C5AA0 num_params 1 pop 1 SUM 9@ // isModelCar
                0AA7: call_function 0x4C5B60 num_params 1 pop 1 SUM 10@ // isModelBike
                0AA7: call_function 0x4C5C20 num_params 1 pop 1 SUM 11@ // isModelBmx
                0AA7: call_function 0x4C5BF0 num_params 1 pop 1 SUM 12@ // isModelQuad
                0AA7: call_function 0x4C5C50 num_params 1 pop 1 SUM 13@ // isModelTrailer
                0AA7: call_function 0x4C5BC0 num_params 1 pop 1 SUM 14@ // isModelMTruck
                if or
                    081E:   model SUM boat
                    081F:   model SUM plane
                    0820:   model SUM heli
                    9@ == True
                then
                    0ADD: spawn_car_with_model SUM at_player_location
                else
                    if or
                        10@ == 8766721 // True
                        11@ == 8766721 // True
                        12@ == 8766721 // True
                        13@ == 8766721 // True
                        14@ == True
                    then
                        0ADD: spawn_car_with_model SUM at_player_location
                    end
                end
            end
        end
        CURRENT_DIGIT = 1
        SUM = 0
        KEY_HOLD = False
        for i = 0 to 4
            0006: DIGIT[i] = 0 
        end
        continue
    end    // key pressed 2
    if
        KEY_HOLD == False
    then
        if
            0AB0: key_pressed 8
        then
            KEY_HOLD = True
            if
                CURRENT_DIGIT > 1
            then
                CURRENT_DIGIT /= 10
                008F: 16@ = integer CURRENT_DIGIT to_float
                0AEF: 16@ = log 16@ base 10.0 //all floats
                SUM = 0
                0092: 16@ = float 16@ to_integer
                16@ -= 1
                for i = 0 to 16@
                    0016: DIGIT[i] /= 10
                    005A: SUM += DIGIT[i] // (int)
                end
            end
        else
            if
                SUM >= 19010
            then
                continue
            end
            KEY = 48
            for i = 0 to 9
                if
                    0AB0: key_pressed KEY
                then
                    008F: 16@ = integer CURRENT_DIGIT to_float
                    0AEF: 16@ = log 16@ base 10.0 //all floats
                    SUM = 0
                    0092: 16@ = float 16@ to_integer
                    0085: DIGIT[16@] = i   // int
                    for i = 0 to 16@
                        if
                            001D:   16@ > i // (int)
                        then
                            0012: DIGIT[i] *= 10
                        end
                        005A: SUM += DIGIT[i] // (int)
                    end
                    CURRENT_DIGIT *= 10
                    KEY_HOLD = True
                    break
                end
                KEY += 1
            end
        end
    else  //  KEY_HOLD == True
        if and
            8AB0: not key_pressed 48
            8AB0: not key_pressed 49
            8AB0: not key_pressed 50
            8AB0: not key_pressed 51
            8AB0: not key_pressed 52
        then
            if and
                8AB0: not key_pressed 53
                8AB0: not key_pressed 54
                8AB0: not key_pressed 55
                8AB0: not key_pressed 56
                8AB0: not key_pressed 57
                8AB0: not key_pressed 8
            then
                KEY_HOLD = False
            end
        end
    end  // KEY_HOLD == False
    if
        CURRENT_DIGIT > 1
    then
        03F0: enable_text_draw 1
        045A: draw_text_1number 320.0 240.0 GXT 'NUMBER' number SUM
    end
end

Код: C++
  1. #include <plugin.h>
  2. #include "game_sa\common.h"
  3. #include "game_sa\CFont.h"
  4. #include "game_sa\CText.h"
  5. #include "game_sa\CCheat.h"
  6. #include "game_sa\eModelID.h"
  7. #include "game_sa\CModelInfo.h"
  8.  
  9. // originally made by Den_spb
  10.  
  11. using namespace plugin;
  12.  
  13. class MoreVehiclesSpawner {
  14. public:
  15.     MoreVehiclesSpawner() {
  16.     static int digits[] = { 0, 0, 0, 0, 0 };
  17.     static int current_digit = 1;
  18.     static unsigned int sum = 0;
  19.     static bool key_hold = false;
  20.     static int key = 48;
  21.     static int i_16 = 0;
  22.     static float f_16 = 0.0f;
  23.  
  24.         Events::drawingEvent += [] {
  25.             CPed *playa = FindPlayerPed();
  26.             if (playa && playa->IsAlive()) {
  27.                 if (KeyPressed(2)) {
  28.                     // вывод на экран
  29.                     if (current_digit > 1) {
  30.                         CFont::SetScale(0.5f, 1.0f);
  31.                         CFont::SetColor(CRGBA(255, 255, 255, 255));
  32.                         CFont::SetAlignment(ALIGN_LEFT);
  33.                         CFont::SetOutlinePosition(1);
  34.                         CFont::SetDropColor(CRGBA(0, 0, 0, 255));
  35.                         CFont::SetBackground(false, false);
  36.                         CFont::SetFontStyle(FONT_SUBTITLES);
  37.                         CFont::SetProp(true);
  38.                         CFont::SetWrapx(600.0f);
  39.                         char text[16];
  40.                         sprintf(text, "%d", sum);
  41.                         CFont::PrintString(300.0f, 10.0f, text);
  42.                     }
  43.                     if (key_hold == false) {
  44.                         // корректировка цифр
  45.                         if (KeyPressed(8)) {
  46.                             key_hold = true;
  47.                             if (current_digit > 1) {
  48.                                 current_digit /= 10;
  49.                                 f_16 = log10(static_cast<float>(current_digit));
  50.                                 sum = 0;
  51.                                 i_16 = static_cast<int>(f_16);
  52.                                 i_16 -= 1;
  53.                                 for (int i = 0; i <= i_16; i++) {
  54.                                     digits[i] /= 10;
  55.                                     sum += digits[i];
  56.                                 }
  57.                             }
  58.                         }
  59.                         // набор цифр
  60.                         else {
  61.                             if (sum >= 19010) {
  62.                                 sum = 0;
  63.                                 current_digit = 1;
  64.                                 key_hold = false;
  65.                                 for (int i = 0; i <= 4; i++) {
  66.                                     digits[i] = 0;
  67.                                 }
  68.                             }
  69.                             key = 48;
  70.                             for (int i = 0; i <= 9; i++) {
  71.                                 if (KeyPressed(key)) {
  72.                                     f_16 = log10(static_cast<float>(current_digit));
  73.                                     sum = 0;
  74.                                     i_16 = static_cast<int>(f_16);
  75.                                     digits[i_16] = i;
  76.                                     for (int i = 0; i <= i_16; i++) {
  77.                                         if (i_16 > i)
  78.                                             digits[i] *= 10;
  79.                                         sum += digits[i];
  80.                                     }
  81.                                     current_digit *= 10;
  82.                                     key_hold = true;
  83.                                     break;
  84.                                 }
  85.                                 key++;
  86.                             }
  87.                         }
  88.                     }
  89.                     else {
  90.                         if (!KeyPressed(8) && !KeyPressed(48) && !KeyPressed(49)
  91.                             && !KeyPressed(50) && !KeyPressed(51) && !KeyPressed(52)
  92.                             && !KeyPressed(53) && !KeyPressed(54) && !KeyPressed(55)
  93.                             && !KeyPressed(56) && !KeyPressed(57))
  94.                             key_hold = false;
  95.                     }
  96.                 }
  97.                 // спавн транспорта
  98.                 else {
  99.                     if (sum > 0 && sum < 19010) {
  100.                         CVehicleModelInfo *typModel = reinterpret_cast<CVehicleModelInfo *>(CModelInfo::IsVehicleModelType(sum));
  101.                         if (reinterpret_cast<int>(typModel) != -1
  102.                             && reinterpret_cast<int>(typModel) != 6)
  103.                             CCheat::VehicleCheat(sum);
  104.                     }
  105.                                                
  106.                     sum = 0;
  107.                     current_digit = 1;
  108.                     key_hold = false;
  109.                     for (int i = 0; i <= 4; i++) {
  110.                         digits[i] = 0;
  111.                     }
  112.                 }
  113.             }
  114.         };
  115.     }
  116. } moreVehiclesSpawner;
  117.  
   

220
kenking, покажу позже.
Хорошо. Ещё интересует создание спецактёра. Там же отличается (в клео по-крайне мере) загрузка модели, создание актёра, выгрузка модели и т.д. Также интересна установка (и удаление) деталей тюнинга на транспорт. Такие примеры были бы тоже кстати. 

Ultimate ASI Loader
Спасибо.

221
1)
Цитировать
Можно было бы вообще разделить процессы открытия/закрытия и обработки клавиш (чтобы эти процессы выполнялись одновременно).
Т.е. нажал клавишу, дверь открывается\закрывается и в это же время нажал другую клавишу и одновременно пошло открытие\закрытие другой двери? И т.д. Можно это показать для этого же примера? (SA_OpenDoorExample) https://github.com/DK22Pac/plugin-sdk/blob/master/examples/SA_OpenDoorExample/Main.cpp

2) Какой загрузчик asi использовать для VC, чтобы скрипты загружались не из корневого каталога, а из \scripts ?

3) Будет ли в плагине VC реализован поиск компонента по имени?
Код: C++
  1. RwFrame *component = CClumpModelInfo::GetFrameFromName(automobile->m_pRwClump, "bonnet_dummy");

222
Цитировать
CCheat я особо не разбирал.
В sdk была только функция VehicleChear для спавна авто.
А добавил-то я правильно?


223
Цитировать
Можешь показать свой код в клео?

Я немного ввел тебя в заблуждение, прошу прощения. Дело в том, что при вызове RwFrameScale я масштабировал все компоненты в том числе и chassis_dummy в который вложены подвижные компоненты (двери, капот и багажник). Так вот в этом случае масштаб сохраняется при вращении этих компонентов, а если вызывать RwFrameScale отдельно для вращающегося компонента, то при вращении масшаб сбрасывается в стандартный. Вывод - для таких компонентов надо масштабировать parent. Вот код клео:
{$CLEO .cs}
20@ = 0.5 // X
21@ = 0.5 // Y
22@ = 0.5 // Z

while true
wait 0
    if
      Player.Defined($PLAYER_CHAR)
    then
        if and
          Actor.Driving($PLAYER_ACTOR)
          0AB0: key_pressed 53
        then
            03C0: 0@ = actor $PLAYER_ACTOR car
            0A97: 0@ = car 0@ struct
            0A8E: 0@ = 0@ + 0x18
            0A8D: 0@ = read_memory 0@ size 4 virtual_protect 0
            0AA7: call_function 0x4C5400 num_params 2 pop 2 _nodename "chassis_dummy" _rwObject 0@ _store_to 1@
            if
              1@ > 0
            then
                0AA5: call {RwFrameScale} 0x7F0ED0 num_params 3 pop 3 _combine 1 _v 20@v _frame 1@
            end
            repeat
              wait 0
            until 8AB0: not key_pressed 53
        end
    end
end       



Как правильно вызвать RwFrameScale в плагине?
Код: C++
  1. RwFrameScale(automobile->m_aCarNodes[CAR_CHASSIS], &scale, rwCOMBINEPRECONCAT);
Тот вариант, что я написал похоже неверный, поскольку вложенные компоненты не масштабируются вместе с CAR_CHASSIS, как в случае с клео. Происходит ровно тоже, что при вызове RwMatrixScale.



Цитировать
Находишь gxt-ключ названия в структуре модели транспорта (CVehicleModelInfo) и переводишь его в текст (CText::Get(char* ключ))
Спасибо.

UPD:В базе есть такой адрес:
.text:0043A570     _cheatSpawnTankerTruck proc nearВ sdk ты его не добавил? Я во всяком случае в CCheat его не нашёл. Ведь по-идеи он там должен быть? Или в других файлах? Попробовал туда добавить так:
Код: C++
  1. #include "CCheat.h"
  2.  
  3. char *CCheat::m_CheatString = (char *)0x969110;
  4.  
  5. CVehicle *CCheat::VehicleCheat(int vehicleId) {
  6.     return ((CVehicle *(__cdecl *)(int))0x43A0B0)(vehicleId);
  7. }
  8.  
  9. CVehicle *CCheat::TankerTruck() {
  10.         return ((CVehicle *(__cdecl *)())0x43A570)();
  11. }
Код: C++
  1. #pragma once
  2. #include "plbase/PluginBase_SA.h"
  3.  
  4. class PLUGIN_API CCheat {
  5. public:
  6.     // static char m_CheatString[30]
  7.     static char *m_CheatString;
  8.  
  9.     static class CVehicle *VehicleCheat(int vehicleId);
  10.         static class CVehicle *TankerTruck();
  11. };

Верно ли?
Ну по крайне мере вызывается правильно, бензовоз с прицепом спунятся.

Давно задаюсь вопросом - можно ли переписать эту функцию так, чтобы считывать пары ID тягача и ID прицепа из текстового файла (ну в крайнем случае в сам плагин набрать это сочетание, ну лучше считывать из текстового файла) и потом аналогичным образом спаунить другие тягачи с прицепами, ведь нормального спаунера авто с прицепами так и не сделали.

UPD2:
 :D Вот:

Код: C++
  1. if (automobile->m_aCarNodes[CAR_CHASSIS]) {
  2.    if (automobile->m_aCarNodes[CAR_DOOR_LF])
  3.       RwFrameAddChild(automobile->m_aCarNodes[CAR_CHASSIS], automobile->m_aCarNodes[CAR_DOOR_LF]);
  4.                
  5.    RwV3d scale = { 0.5f, 0.5f, 0.5f };
  6.    RwFrameScale(automobile->m_aCarNodes[CAR_CHASSIS], &scale, rwCOMBINEREPLACE);
  7. }

224
Дмитрий, ты волшебник.  ;)

Спасибо за очередные примеры и пояснения. Чем больше будет примеров, тем быстрей я освоюсь в написании плагинов. За ссылки на уроки тоже спасибо. Я сейчас читаю книгу
Прохоренок Н.А. Программирование на С++ в Visual Studio 2010 Express (2010) и дополнительный материал будет кстати.

По примерам:
с первым примером разобрался, всё нормально. Для теста написал небольшой код, глянь верно ли? Можно, что-то оптимизировать? Хотел ещё вывести скорость авто, но что-то не вышло, вот это CVector GetSpeed(CVector direction) оно или нет? С вектором не понял, как работать. Также не понятно, как вывести название транспорта. Пожалуйста пример.
#include <plugin.h>
#include "game_sa\common.h"
#include "game_sa\CFont.h"

using namespace plugin;

class VehicleGetPosition {
public:

VehicleGetPosition() {
Events::drawingEvent += [] {
CVehicle *vehicle = FindPlayerVehicle(-1, false);
if (vehicle) {
// Настраивем вывод текста
CFont::SetScale(0.5f, 1.0f);
CFont::SetColor(CRGBA(255, 255, 255, 255));
CFont::SetAlignment(ALIGN_LEFT);
CFont::SetOutlinePosition(1);
CFont::SetDropColor(CRGBA(0, 0, 0, 255));
CFont::SetBackground(false, false);
CFont::SetFontStyle(FONT_SUBTITLES);
CFont::SetProp(true);
CFont::SetWrapx(600.0f);
CVector vspeed = vehicle->m_vLinearVelocity;
float speed = sqrt(vspeed.x*vspeed.x + vspeed.y*vspeed.y + vspeed.z*vspeed.z);
speed *= 180;
float vhealth = vehicle->m_fHealth;
float vmass = vehicle->m_fMass;
CVector posn = vehicle->GetPosition();
char t_speed[16];
char t_health[16];
char t_vmass[16];
char t_posnx[16];
char t_posny[16];
char t_posnz[16];
sprintf(t_speed, "speed %.0f km/h", speed);
sprintf(t_health, "health %.0f \%\%", vhealth/10.0f);
sprintf(t_vmass, "massa %.1f kg", vmass);
sprintf(t_posnx, "posn x %.2f", posn.x);
sprintf(t_posny, "posn y %.2f", posn.y);
sprintf(t_posnz, "posn z %.2f", posn.z);
CFont::PrintString(5.0f, 5.0f, t_speed);
CFont::PrintString(5.0f, 25.0f, t_health);
CFont::PrintString(5.0f, 45.0f, t_vmass);
CFont::PrintString(5.0f, 65.0f, t_posnx);
CFont::PrintString(5.0f, 85.0f, t_posny);
CFont::PrintString(5.0f, 105.0f, t_posnz);
}
};
}
} vehicleGetPosition;


во втором примере пишет
Цитировать
namespase "plugin::Events" не содержит члена "vehicleSetModelEvent"

Цитировать
Пример вызова
Спасибо, теперь ясно. Но есть одно но - при RwMatrixScale если вращать компонент, например дверь, то она принимает стандартный размер. В клео я поэтому вызывал RwFrameScale - тогда компонент при вращении остаётся запланированного масштаба. По примеру попробовал вызвать RwFrameScale так:
RwFrameScale(automobile->m_aCarNodes[CAR_DOOR_LR], &scale, rwCOMBINEPRECONCAT);Не знаю правильно или нет, но компонент масштабируется, но при вращении опять становится стандартного размера. А при rwCOMBINEREPLACE так и вовсе оказывается в центре модели (как и при вращении с этим параметром после RwMatrixScale). В клео нормально работало, что я делаю не так?

UPD:
    RwV3d savedPosn = automobile->m_aCarNodes[CAR_DOOR_LF]->modelling.pos;
    RwV3d scale = { 2.0f, 2.0f, 2.0f };
    RwMatrixScale(&automobile->m_aCarNodes[CAR_DOOR_LF]->modelling, &scale, rwCOMBINEREPLACE);
    automobile->m_aCarNodes[CAR_DOOR_LF]->modelling.pos = savedPosn;
Можно, как ты написал до этого:
RwV3d scale = { 2.0f, 2.0f, 2.0f };
RwMatrixScale(&automobile->m_aCarNodes[CAR_DOOR_LR]->modelling, &scale, rwCOMBINEPRECONCAT);
только combine поменять на rwCOMBINEPRECONCAT

Но всё равно в обоих вариантах после вращения масштабирование сбрасывается в стандарт.


UPD2:
Обновил sdk, пересобрал плагин, теперь
Цитировать
пример, показывает как использовать VehicleExtendedData.
работает.

А практически для чего например можно это использовать в плагине?

UPD3:Со скоростью "разобрался" так:
CVector vspeed = vehicle->m_vLinearVelocity;
float speed = sqrt(vspeed.x*vspeed.x + vspeed.y*vspeed.y + vspeed.z*vspeed.z);
speed *= 180;
Верно?


225
Цитировать
Эта функция уже есть в sdk.
Это я для примера. А как её правильно вызывать? Для клео ты мне тогда объяснял, теперь, что-то не пойму здесь как надо.

Цитировать
Если у тебя есть указатель на RwFrame, используй оператор -> для доступа к членам структуры:
А название компонента, как прочитать? В клео по смещению + 172 читалось имя компонента. Я делал скрипт для дверей автобусов, там в модель добавлялись вспомогательные компоненты и их названия были величины углов, на которые нужно вращать двери (у разных моделей разные значения), потом я считывал название этого компонента (child, next) и переводил из string в float, получал значение угла вращения.

Цитировать
Тогда, возможно, выложу исходники на github.
Было бы здорово!

Страницы: 1 ... 13 14 [15] 16