Постоянное обновление позиции у пешехода. plugin-sdk.

ImmortalDev

Участник
Автор темы
90
50
Всем привет, снова.
У меня есть код, взятый из примеров работы с plugin-sdk, который спавнит пешехода. Я его немного переделал, но проблема конкретно не в этом.
Вот код:

C++:
float* coordinates = (*(DWORD*)0xB6F5F0) ? (float*)(*(DWORD*)(*(DWORD*)0xB6F5F0 + 0x14) + 0x30) : NULL;


void spawncPed()//(float* car_data)
{
            static int keyPressTime = 0;
            Events::gameProcessEvent += []{//&car_data] {
                if (FindPlayerPed() && KeyPressed(VK_F9) && CTimer::m_snTimeInMilliseconds - keyPressTime > 500) {
                    #ifdef GTASA
                        keyPressTime = CTimer::m_snTimeInMilliseconds;
                        int modelID = pedModelIds[rand() % 250];
                        CStreaming::RequestModel(modelID, 0);
                        CStreaming::LoadAllRequestedModels(false);
                        CPed *ped = new CCivilianPed(CPopulation::IsFemale(modelID) ? PED_TYPE_CIVFEMALE : PED_TYPE_CIVMALE, modelID);
                        if (ped) {
                            ped->SetPosn(coordinates[0], coordinates[1], coordinates[2]);
                            ped->SetOrientation(0.0f, 0.0f, 0.0f);
                            CWorld::Add(ped);
                            /*ped->PositionAnyPedOutOfCollision();
                            ped->m_pIntelligence->m_TaskMgr.SetTask(new CTaskComplexWanderStandard(4, rand() % 8, true), 4, false);*/
                        }
                        while(true) // Вот тут проблема
                        {
                            //ped->SetOrientation(0.0f, 0.0f, 0.0f);
                            ped->SetPosn(coordinates[0], coordinates[1], coordinates[2]);
                            ped->UpdatePosition();
                            Sleep(1000);
                        }
                    #else
                        CHud::SetHelpMessage(L"Not done yet!", true, false);
                    #endif
                }
        };
}

Так вот, я хочу постоянно обновлять позицию педа, чтоб она была равна текущей позиции игрока. Педа он спавнит, все ок, но вот при попытке создать бесконечный цикл, в котором будет постоянно обновляться его координаты, игра тупо крашится и ничего не работает.
Внятной документации по plugin-sdk я не нашел, приходиться изучать все самому методом тыка, но сейчас, нужна помощь знающих людей, ибо я уже не знаю что делать.
 
Решение
Тебе нельзя такие циклы использовать ибо они вызываются в основном потоке игры и по этому у тебя происходит зависание. Тебе как раз надо просто в основном потоке игры использовать таймеры вместо задержки для обновления позиции gameProcessEvent, что и есть основным потоком игры грубо говоря. Создавать для такого отдельный поток не рекомендую вообще.

Dark_Knight

Me, me and me.
Друг
4,062
2,077
Тебе нельзя такие циклы использовать ибо они вызываются в основном потоке игры и по этому у тебя происходит зависание. Тебе как раз надо просто в основном потоке игры использовать таймеры вместо задержки для обновления позиции gameProcessEvent, что и есть основным потоком игры грубо говоря. Создавать для такого отдельный поток не рекомендую вообще.
 
Последнее редактирование:
  • Нравится
Реакции: ImmortalDev

ImmortalDev

Участник
Автор темы
90
50
Тебе нельзя такие циклы использовать ибо они вызываются в основном потоке игры и по этому у тебя происходит зависание. Тебе как раз надо просто в основном потоке игры использовать таймеры вместо задержки для обновления позиции gameProcessEvent есть основным потоком игры грубо говоря. Создавать для такого отдельный поток не рекомендую вообще
большое спасибо тебе, пойду дальше разбираться, если что отпишу сюда же

Тебе нельзя такие циклы использовать ибо они вызываются в основном потоке игры и по этому у тебя происходит зависание. Тебе как раз надо просто в основном потоке игры использовать таймеры вместо задержки для обновления позиции gameProcessEvent, что и есть основным потоком игры грубо говоря. Создавать для такого отдельный поток не рекомендую вообще.
Не совсем вкурил, так. Вместо задержки Sleep я должен использовать таймеры.
Вместо цикла, для обновления позиции, я использую gameProcessEvent.
Правильно?
То есть, это должно выглядить как то так?
C++:
Events::gameProcessEvent += [&ped]
{
                            
    ped->SetPosn(coordinates[0], coordinates[1], coordinates[2]);
    ped->UpdatePosition();
    //вместо задержки СTimer
};
 
Последнее редактирование:

Dark_Knight

Me, me and me.
Друг
4,062
2,077
Да. За CTimer я хз, не работал с ним, но я не вижу тут проверки на указатель и тебе все это можно в общей функе делать. Нет смысла разный код пихать в один и тот же элемент. Хотя кому как удобней)
 
  • Нравится
Реакции: ImmortalDev

ImmortalDev

Участник
Автор темы
90
50
Да. За CTimer я хз, не работал с ним, но я не вижу тут проверки на указатель и тебе все это можно в общей функе делать. Нет смысла разный код пихать в один и тот же элемент. Хотя кому как удобней)
Спасибо. Кажется, все понял. Пойду писать, проверять, заодно с CTimer получше познакомлюсь.
Проверку на указатель сделаю, само собой

C++:
static int timm = 500;
Events::gameProcessEvent += [&ped]
{
      if(FindPlayerPed())
      {
           if(ped){
                 ped->SetOrientation(0.0f, 0.0f, 0.0f);
                 ped->SetPosn(coordinates[0], coordinates[1], coordinates[2]);
                 //ped->UpdatePosition();
                 timm = CTimer::m_snTimeInMilliseconds;
                 //Sleep(50);
          }
      }
};

Написал такой вот код, но все равно крашит. Что тут не так?

Сейчас кину полный код:

C++:
void spawncPed()//(float* car_data)
{
            static int keyPressTime = 0;
            //static int timm = 0;
            Events::gameProcessEvent += []{//&car_data] {
                if (FindPlayerPed() && KeyPressed(VK_F9) && CTimer::m_snTimeInMilliseconds - keyPressTime > 500) {
                    #ifdef GTASA
                        keyPressTime = CTimer::m_snTimeInMilliseconds;
                        int modelID = pedModelIds[rand() % 250];
                        CStreaming::RequestModel(modelID, 0);
                        CStreaming::LoadAllRequestedModels(false);
                        CPed *ped = new CCivilianPed(CPopulation::IsFemale(modelID) ? PED_TYPE_CIVFEMALE : PED_TYPE_CIVMALE, modelID);
                        if (ped) {
                            ped->SetPosn(coordinates[0], coordinates[1], coordinates[2]);
                            ped->SetOrientation(0.0f, 0.0f, 0.0f);
                            CWorld::Add(ped);
                            /*ped->SetPosn(coordinates[0], coordinates[1], coordinates[2]);
                            ped->UpdatePosition();
                            CTimer::m_snTimeInMilliseconds - timm > 500;
                            timm = CTimer::m_snTimeInMilliseconds;*/
                            /*ped->PositionAnyPedOutOfCollision();
                            ped->m_pIntelligence->m_TaskMgr.SetTask(new CTaskComplexWanderStandard(4, rand() % 8, true), 4, false);*/
                        }

                        static int timm = 500;
                        Events::gameProcessEvent += [&ped]
                        {
                            if(FindPlayerPed())
                            {
                                if(ped){
                                    ped->SetOrientation(0.0f, 0.0f, 0.0f);
                                    ped->SetPosn(coordinates[0], coordinates[1], coordinates[2]);
                                    //ped->UpdatePosition();
                                    timm = CTimer::m_snTimeInMilliseconds;

                                    //Sleep(50);
                                }
                            }
                        };
                    #else
                        CHud::SetHelpMessage(L"Not done yet!", true, false);
                    #endif
                }
        };
}

Хорошо, я решил сделать так. В одном gameProcessEvent, я создаю педа и в нем же постоянно обновляю его позицию.
Только вот незадача, gameProcessEvent это цикл, значит педов будет создаваться дофига и это крашнет игру.
А вне gameProcessEvent создать невозможно, тоже крашнет.
Как быть?
Нужна наводка, пожалуйста, дальше сам разберусь

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

Всё! Я всё решил, сам разобрался))
Кароче, сPed *ped объявил глобальной переменной, в одной функции создавал самого педа, в другой функции я синхронизировал его с игроком.
После этого, просто
C++:
plugin::Events::gameProcessEvent.Add(spawncped);
plugin::Events::gameProcessEvent.Add(sync);
Для обеих функций)))
Спасибо

Dark_Knight

За наводку, видел бы ты радость на моем лице сейчас)
 
Последнее редактирование:

ImmortalDev

Участник
Автор темы
90
50
Самое интересное в том, что это все можно в одну функцию запихать и не мучатся . Если мне еще не показалось, то тут еще у тебя утечка памяти.
Та я там велосипедов кучу изобрел, пока еще не силен в этом, но буду разбираться.
Благо, написал все таки рабочий вариант.
а тебе +rep