 |

09.02.2022, 15:22
|
|
Познающий
Регистрация: 02.12.2019
Сообщений: 86
С нами:
3393864
Репутация:
23
|
|
Всем привет, снова.
У меня есть код, взятый из примеров работы с 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 я не нашел, приходиться изучать все самому методом тыка, но сейчас, нужна помощь знающих людей, ибо я уже не знаю что делать.
|
|
|

09.02.2022, 17:27
|
|
Флудер
Регистрация: 18.03.2013
Сообщений: 4,080
С нами:
6921957
Репутация:
183
|
|
Тебе нельзя такие циклы использовать ибо они вызываются в основном потоке игры и по этому у тебя происходит зависание. Тебе как раз надо просто в основном потоке игры использовать таймеры вместо задержки для обновления позиции gameProcessEvent, что и есть основным потоком игры грубо говоря. Создавать для такого отдельный поток не рекомендую вообще.
|
|
|

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

09.02.2022, 22:19
|
|
Флудер
Регистрация: 18.03.2013
Сообщений: 4,080
С нами:
6921957
Репутация:
183
|
|
Да. За CTimer я хз, не работал с ним, но я не вижу тут проверки на указатель и тебе все это можно в общей функе делать. Нет смысла разный код пихать в один и тот же элемент. Хотя кому как удобней)
|
|
|

09.02.2022, 22:25
|
|
Познающий
Регистрация: 02.12.2019
Сообщений: 86
С нами:
3393864
Репутация:
23
|
|
Сообщение от Dark_Knight
Да. За 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За наводку, видел бы ты радость на моем лице сейчас)
|
|
|

10.02.2022, 20:46
|
|
Флудер
Регистрация: 18.03.2013
Сообщений: 4,080
С нами:
6921957
Репутация:
183
|
|
Самое интересное в том, что это все можно в одну функцию запихать и не мучатся . Если мне еще не показалось, то тут еще у тебя утечка памяти.
|
|
|

10.02.2022, 21:07
|
|
Познающий
Регистрация: 02.12.2019
Сообщений: 86
С нами:
3393864
Репутация:
23
|
|
Сообщение от Dark_Knight
Самое интересное в том, что это все можно в одну функцию запихать и не мучатся . Если мне еще не показалось, то тут еще у тебя утечка памяти.
Та я там велосипедов кучу изобрел, пока еще не силен в этом, но буду разбираться.
Благо, написал все таки рабочий вариант.
а тебе +rep
|
|
|
|
 |
Предыдущая тема
Следующая тема
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|